diff --git a/.Makefile.lint b/.Makefile.lint
index db7beb8b71b8c1c6fc848d2a38c54b179fb0a26b..4d510d832410a3d5695edb1aa766807b28ecd71a 100644
--- a/.Makefile.lint
+++ b/.Makefile.lint
@@ -6,9 +6,6 @@ ML_LINT_KO+=src/kernel_internals/parsing/lexerhack.ml
 ML_LINT_KO+=src/kernel_internals/parsing/logic_preprocess.mli
 ML_LINT_KO+=src/kernel_internals/runtime/boot.ml
 ML_LINT_KO+=src/kernel_internals/runtime/machdeps.ml
-ML_LINT_KO+=src/kernel_internals/runtime/messages.ml
-ML_LINT_KO+=src/kernel_internals/runtime/messages.mli
-ML_LINT_KO+=src/kernel_internals/runtime/special_hooks.ml
 ML_LINT_KO+=src/kernel_internals/typing/allocates.ml
 ML_LINT_KO+=src/kernel_internals/typing/frontc.mli
 ML_LINT_KO+=src/kernel_internals/typing/infer_annotations.ml
@@ -19,8 +16,6 @@ ML_LINT_KO+=src/kernel_internals/typing/unroll_loops.ml
 ML_LINT_KO+=src/kernel_internals/typing/unroll_loops.mli
 ML_LINT_KO+=src/kernel_services/abstract_interp/abstract_interp.ml
 ML_LINT_KO+=src/kernel_services/abstract_interp/abstract_interp.mli
-ML_LINT_KO+=src/kernel_services/abstract_interp/base.ml
-ML_LINT_KO+=src/kernel_services/abstract_interp/base.mli
 ML_LINT_KO+=src/kernel_services/abstract_interp/fval.mli
 ML_LINT_KO+=src/kernel_services/abstract_interp/int_Base.ml
 ML_LINT_KO+=src/kernel_services/abstract_interp/int_Base.mli
@@ -52,8 +47,6 @@ ML_LINT_KO+=src/kernel_services/analysis/dataflow2.mli
 ML_LINT_KO+=src/kernel_services/analysis/dataflows.ml
 ML_LINT_KO+=src/kernel_services/analysis/dataflows.mli
 ML_LINT_KO+=src/kernel_services/analysis/dominators.ml
-ML_LINT_KO+=src/kernel_services/analysis/interpreted_automata.ml
-ML_LINT_KO+=src/kernel_services/analysis/interpreted_automata.mli
 ML_LINT_KO+=src/kernel_services/analysis/logic_interp.ml
 ML_LINT_KO+=src/kernel_services/analysis/loop.ml
 ML_LINT_KO+=src/kernel_services/analysis/ordered_stmt.ml
@@ -71,13 +64,8 @@ ML_LINT_KO+=src/kernel_services/ast_data/ast.mli
 ML_LINT_KO+=src/kernel_services/ast_data/kernel_function.ml
 ML_LINT_KO+=src/kernel_services/ast_data/kernel_function.mli
 ML_LINT_KO+=src/kernel_services/ast_data/property_status.mli
-ML_LINT_KO+=src/kernel_services/ast_queries/ast_info.ml
-ML_LINT_KO+=src/kernel_services/ast_queries/ast_info.mli
-ML_LINT_KO+=src/kernel_services/ast_queries/cil_const.ml
-ML_LINT_KO+=src/kernel_services/ast_queries/cil_const.mli
 ML_LINT_KO+=src/kernel_services/ast_queries/cil_datatype.mli
 ML_LINT_KO+=src/kernel_services/ast_queries/cil_state_builder.mli
-ML_LINT_KO+=src/kernel_services/ast_queries/file.mli
 ML_LINT_KO+=src/kernel_services/ast_queries/logic_const.mli
 ML_LINT_KO+=src/kernel_services/ast_transformations/clone.ml
 ML_LINT_KO+=src/kernel_services/ast_transformations/clone.mli
@@ -101,8 +89,6 @@ 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/visitors/cabsvisit.ml
 ML_LINT_KO+=src/kernel_services/visitors/cabsvisit.mli
-ML_LINT_KO+=src/kernel_services/visitors/visitor.ml
-ML_LINT_KO+=src/kernel_services/visitors/visitor.mli
 ML_LINT_KO+=src/libraries/datatype/datatype.ml
 ML_LINT_KO+=src/libraries/datatype/datatype.mli
 ML_LINT_KO+=src/libraries/datatype/descr.ml
@@ -168,9 +154,6 @@ ML_LINT_KO+=src/plugins/aorai/logic_simplification.ml
 ML_LINT_KO+=src/plugins/aorai/logic_simplification.mli
 ML_LINT_KO+=src/plugins/aorai/ltl_output.ml
 ML_LINT_KO+=src/plugins/aorai/path_analysis.ml
-ML_LINT_KO+=src/plugins/aorai/promelaast.mli
-ML_LINT_KO+=src/plugins/aorai/promelaoutput.ml
-ML_LINT_KO+=src/plugins/aorai/promelaoutput.mli
 ML_LINT_KO+=src/plugins/aorai/utils_parser.ml
 ML_LINT_KO+=src/plugins/callgraph/callgraph_api.mli
 ML_LINT_KO+=src/plugins/callgraph/cg.ml
@@ -194,7 +177,6 @@ ML_LINT_KO+=src/plugins/gui/analyses_manager.ml
 ML_LINT_KO+=src/plugins/gui/book_manager.ml
 ML_LINT_KO+=src/plugins/gui/book_manager.mli
 ML_LINT_KO+=src/plugins/gui/design.mli
-ML_LINT_KO+=src/plugins/gui/filetree.mli
 ML_LINT_KO+=src/plugins/gui/gtk_form.ml
 ML_LINT_KO+=src/plugins/gui/gtk_form.mli
 ML_LINT_KO+=src/plugins/gui/gui_printers.ml
@@ -238,8 +220,6 @@ ML_LINT_KO+=src/plugins/inout/register.ml
 ML_LINT_KO+=src/plugins/loop_analysis/region_analysis.ml
 ML_LINT_KO+=src/plugins/loop_analysis/region_analysis_stmt.ml
 ML_LINT_KO+=src/plugins/metrics/metrics_acsl.ml
-ML_LINT_KO+=src/plugins/metrics/metrics_base.ml
-ML_LINT_KO+=src/plugins/metrics/metrics_base.mli
 ML_LINT_KO+=src/plugins/metrics/metrics_cabs.ml
 ML_LINT_KO+=src/plugins/metrics/metrics_cilast.mli
 ML_LINT_KO+=src/plugins/metrics/metrics_coverage.ml
@@ -315,8 +295,6 @@ ML_LINT_KO+=src/plugins/studia/studia_gui.ml
 ML_LINT_KO+=src/plugins/studia/studia_gui.mli
 ML_LINT_KO+=src/plugins/users/users_register.ml
 ML_LINT_KO+=src/plugins/value_types/cilE.mli
-ML_LINT_KO+=src/plugins/value_types/cvalue.ml
-ML_LINT_KO+=src/plugins/value_types/cvalue.mli
 ML_LINT_KO+=src/plugins/value_types/function_Froms.ml
 ML_LINT_KO+=src/plugins/value_types/function_Froms.mli
 ML_LINT_KO+=src/plugins/value_types/inout_type.ml
@@ -324,20 +302,3 @@ ML_LINT_KO+=src/plugins/value_types/precise_locs.ml
 ML_LINT_KO+=src/plugins/value_types/value_types.ml
 ML_LINT_KO+=src/plugins/value_types/value_types.mli
 ML_LINT_KO+=src/plugins/value_types/widen_type.ml
-ML_LINT_KO+=src/plugins/variadic/classify.ml
-ML_LINT_KO+=src/plugins/variadic/environment.ml
-ML_LINT_KO+=src/plugins/variadic/extends.ml
-ML_LINT_KO+=src/plugins/variadic/extends.mli
-ML_LINT_KO+=src/plugins/variadic/format_parser.ml
-ML_LINT_KO+=src/plugins/variadic/format_parser.mli
-ML_LINT_KO+=src/plugins/variadic/format_pprint.ml
-ML_LINT_KO+=src/plugins/variadic/format_string.ml
-ML_LINT_KO+=src/plugins/variadic/format_typer.ml
-ML_LINT_KO+=src/plugins/variadic/format_typer.mli
-ML_LINT_KO+=src/plugins/variadic/format_types.mli
-ML_LINT_KO+=src/plugins/variadic/generic.ml
-ML_LINT_KO+=src/plugins/variadic/options.ml
-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
diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs
new file mode 100644
index 0000000000000000000000000000000000000000..7080108ab7ad6a1e964db35348c76ff21a9352bc
--- /dev/null
+++ b/.git-blame-ignore-revs
@@ -0,0 +1,25 @@
+0d64e4bf54395541f410a389be094baf47b7861a
+0fc9094d8a7133f76295955a661fc24f51d276fd
+12caab47125da12c1aaa7a8b5b3af26e5b40fcf6
+166796b37aa9c0bd19da353e62a65dc98d25470b
+1cec870fb83b726a1362a41ef8ebfa71423fc7d8
+2467fec178efe269231972f68e7f2c08fdec122c
+2f10c9d25fc4ca48edce8248a799d1e6164e8a69
+3b6d99bd1c08434fed8f4bb3d6d66a051785980d
+41c3d54cdbb85152a8192c396c7506cd078e3f2f
+4691c9c7b01d6985a36d23166145c137935f28b8
+524e43b632d3f4a6f4ab14393878365e9bf33d37
+54bb4ac66f3e3794d31b8ca9c05b728074dddd0f
+677941ae40e72728ffdb8493fb171d36fe38d239
+705b7c9a8683a2c0314176cccf9afe626be1f13a
+791ce7463b6891e74fff844ecf53ec398f119c8d
+7a0c12c6d4e02ef72a29267037a61a9efbd4dd87
+7da89554af46f144c8dc6c24abed036d8974eae8
+83f089114760ca1856b06bde724a74efc84b81d6
+91d9f893d08da68a3540da569db954e12106e156
+a194cc7610116743c882a0381c1443ea0b4543e1
+abe63e6907843943f998e1fbd42215fb99fd09ee
+bdb7c0c96007d10e0d0ef64a7de394ed0432acd1
+dbfeaee3e71ea4b36aa42d7a4e9dd3f54a9696d8
+dda0510ea1384860c002b26bc4986eae1dc60cc8
+e1b60790e0e28fbbd63f20413da3833a1870cc6e
diff --git a/.gitignore b/.gitignore
index f70695811c0f651d6a4778532dd98452434aba6d..471cf458ebcfc963f009e8f5186f37835e819c21 100644
--- a/.gitignore
+++ b/.gitignore
@@ -31,6 +31,7 @@ autom4te.cache
 /config.log
 /config.status
 /frama-c-*.tar.gz
+/distributed
 /.log.autoconf
 /.Makefile.user
 /ocamlgraph/
@@ -48,6 +49,7 @@ autom4te.cache
 /tests/crowbar/mutable
 /tests/crowbar/output-*
 /tests/crowbar/test_ghost_cfg
+/tests/fc_script/compile_commands.json
 /tests/journal/intra.byte
 /tests/misc/my_visitor_plugin/my_visitor.opt
 /tests/misc/my_visitor.sav
@@ -94,8 +96,10 @@ autom4te.cache
 /doc/aorai/frama-c-aorai-example.tgz
 /doc/aorai/frama-c-aorai-example
 /doc/aorai/main.pdf
+/doc/aorai/ya_file.tex
 /doc/aorai/basic_ya.tex
 /doc/aorai/extended_ya.tex
+/doc/aorai/ya_variables.tex
 
 /doc/code/print_api/*.html
 /doc/code/print_api/*.dot
@@ -186,7 +190,6 @@ Makefile.plugin.generated
 /src/libraries/utils/json.ml
 /src/kernel_internals/runtime/toplevel_boot.ml
 /src/kernel_internals/runtime/fc_config.ml
-/src/kernel_internals/runtime/frama_c_config.ml
 /src/kernel_internals/parsing/logic_lexer.ml
 /src/kernel_internals/parsing/logic_parser.ml
 /src/kernel_internals/parsing/logic_parser.mli
@@ -195,14 +198,15 @@ Makefile.plugin.generated
 /src/kernel_internals/parsing/cparser.ml
 /src/kernel_internals/parsing/cparser.mli
 /src/libraries/stdlib/transitioning.ml
-/src/plugins/gui/dgraph.ml
-/src/plugins/gui/dgraph.mli
+/src/plugins/callgraph/cg_viewer.ml
+/src/plugins/gui/debug_manager.ml
 /src/plugins/gui/dgraph_helper.ml
 /src/plugins/gui/GSourceView.ml
 /src/plugins/gui/GSourceView.mli
 /src/plugins/gui/GSourceView2.ml
 /src/plugins/gui/GSourceView2.mli
 /src/plugins/gui/gtk_compat.ml
+/src/plugins/markdown-report/META
 
 # generated tar.gz files
 
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index b86b0826b80d70a8319d3501b2ee27e4aaea8c5c..1587d00f7d5782ba549b9d43e82e62c2fd045e21 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -228,3 +228,15 @@ make_public:
   - nix
   only:
   - schedules
+
+make_public_meta:
+  stage: make_public
+  script:
+   - echo "$FRAMA_C_PUBLIC_SSH_PRIVATE_KEY" | nix run -f channel:nixos-19.03 coreutils --command base64 -d > nix/frama-c-public/id_ed25519
+   - nix run -f channel:nixos-19.03 coreutils --command chmod 400 nix/frama-c-public/id_ed25519
+   - GIT_SSH=$PWD/nix/frama-c-public/ssh.sh nix run -f channel:nixos-19.03 openssh --command git clone git@git.frama-c.com:frama-c/meta.git nix/frama-c-public/meta
+   - GIT_SSH=$PWD/nix/frama-c-public/ssh.sh nix run -f channel:nixos-19.03 openssh --command git -C nix/frama-c-public/meta push git@git.frama-c.com:pub/meta origin/master:refs/heads/master
+  tags:
+  - nix
+  only:
+  - schedules
diff --git a/.gitlab/issue_templates/bug_report.md b/.gitlab/issue_templates/bug_report.md
index b01c0a798eea16182a8c10988dd03d4c870a5e32..62e77a15383c43c4c96ceec40c053eff506b9dd3 100644
--- a/.gitlab/issue_templates/bug_report.md
+++ b/.gitlab/issue_templates/bug_report.md
@@ -5,7 +5,8 @@ Please directly edit it inline to provide the required information.
 Before submitting the issue, please confirm (by adding a X in the [ ]):
 
 - [ ] the issue has not yet been reported on [Gitlab](https://git.frama-c.com/pub/frama-c/issues);
-- [ ] the issue has not yet been reported on our [BTS](https://bts.frama-c.com);
+- [ ] the issue has not yet been reported on our old
+  [BTS](https://bts.frama-c.com) (*note: the old BTS is deprecated*);
 - [ ] you installed Frama-C as prescribed in the [instructions](INSTALL.md).
 
 # Contextual information
diff --git a/ALL_VERSIONS b/ALL_VERSIONS
index 6f60aa58c52031931854e1eac39f5c8ed2b9f840..3b89335846656be9b460942dd746ce0cfb03a7a9 100644
--- a/ALL_VERSIONS
+++ b/ALL_VERSIONS
@@ -1,5 +1,6 @@
 Version number			Date of release		Notes
 ==============			===============		=====
+22.0 (Titanium)                 2020, November 17
 21.1 (Scandium)                 2020, June 25           Bugs fixed
 21.0 (Scandium)                 2020, June 11
 20.0 (Calcium)                  2019, December 4
diff --git a/Changelog b/Changelog
index 5326327f7637c3218fe950b04bc7c201466eab6b..4fed392166bf0e922c5967f62462581351c67bf6 100644
--- a/Changelog
+++ b/Changelog
@@ -17,8 +17,39 @@
 Open Source Release <next-release>
 ##################################
 
+o!  Kernel    [2021-01-15] Make cfields list optional. None means undefined,
+              empty struct allowed only in specific machdeps.
+              removed cdefined field
+-*  RTE       [2021-01-13] remove spurious assert when comparing function
+              pointer to NULL (fixes #@940)
+-   Kernel    [2021-01-12] set default machdep to x86_64; allow setting machdep
+              via environment variable FRAMAC_MACHDEP.
+-   Kernel    [2021-01-08] allow -add-symbolic-path to survive saves/loads and
+              invert argument order (path:name).
+-   Libc      [2020-12-02] remove obsolete attribute FRAMA_C_MODEL in the libc.
+              Fixes #@877.
+-*  Logic     [2020-11-30] assigns clause can't mention const locations
+              anymore. Fixes #@855.
+o   Kernel    [2020-11-27] Extract builtin-related functions from module Cil
+              to module Cil_builtins. Code can be updated using
+              `bin/migration_scripts/titanium2vanadium.sh`.
+-   Metrics   [2020-10-27] Add json output in addition to text and html.
+
+###################################
+Open Source Release 22.0 (Titanium)
+###################################
+
+-   MdR       [2020-10-19] Update Sarif output to 2.1.0 + prettier URI
+-   Dev       [2020-10-20] Support for OCamlGraph 2.0.0
+-   ACSL      [2020-10-16] Allows for axiomatic blocks-like extensions
+-   Variadic  [2020-10-14] Don't print generated function name but print
+              original name and a comment with the generated name so that the
+              printed code is compilable.
+-   Aorai     [2020-10-13] Ya automata can set auxiliary variables during a
+              transition, and use such variables in subsequent guards.
 -   Kernel    [2020-10-09] Add option -print-config-json, to output Frama-C
               configuration data in JSON format.
+-   Logic     [2020-10-14] '\from' now accepts '&v' expressions
 -   Metrics   [2020-10-01] Distinguish between undefined but specified functions
               and functions with neither definition nor specification.
 -*  Eva       [2020-09-28] Improved string builtins on wide strings: crash fixed,
@@ -39,6 +70,7 @@ Open Source Release <next-release>
               option) on loops with several exit conditions, conditions using
               equality operators, temporary variables introduced by the Frama-C
               normalization or goto statements.
+-!  Kernel    [2020-07-21] OCaml version greater than or equal to 4.08.1 required.
 -   Eva       [2020-05-29] New builtins for trigonometric functions acos, asin
               and atan (and their single-precision version acosf, asinf, atanf).
 -   Kernel    [2020-05-28] Support for C11's _Thread_local storage specifier
diff --git a/INSTALL.md b/INSTALL.md
index 14134ca017f529a047acd96fa1ca579431489928..3c1fa7bd5a90db25ac95b2e0d7ea1f00ce722f6b 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -7,7 +7,7 @@
         - [Installing Frama-C from opam repository](#installing-frama-c-from-opam-repository)
         - [Installing Custom Versions of Frama-C](#installing-custom-versions-of-frama-c)
         - [Installing Frama-C on Windows via WSL](#installing-frama-c-on-windows-via-wsl)
-        - [Installing Frama-C on macOS](#installing-frama-c-on-mac-os)
+        - [Installing Frama-C on macOS](#installing-frama-c-on-macos)
     - [Installing Frama-C via your Linux distribution (Debian/Ubuntu/Fedora)](#installing-frama-c-via-your-linux-distribution-debianubuntufedora)
     - [Compiling from source](#compiling-from-source)
         - [Quick Start](#quick-start)
@@ -92,7 +92,7 @@ why3 config --detect
 ### Reference configuration
 
 See file [reference-configuration.md](reference-configuration.md)
-for a set of packages that is known to work with Frama-C 21 (Scandium).
+for a set of packages that is known to work with Frama-C 22 (Titanium).
 
 ### Installing Custom Versions of Frama-C
 
@@ -129,7 +129,7 @@ following tools:
 #### Prerequisites: WSL + a Linux distribution
 
 For enabling WSL on Windows, you may follow these instructions
-(we tested with Ubuntu 18.04 LTS;
+(we tested with Ubuntu 20.04 LTS;
 other distributions/versions should also work,
 but the instructions below may require some modifications).
 
@@ -158,7 +158,7 @@ Move to your user directory, download the distribution and install it:
 
 ```
 cd C:\Users\<Your User Directory>
-Invoke-WebRequest -Uri https://aka.ms/wsl-ubuntu-1804 -OutFile Ubuntu.appx -UseBasicParsing
+Invoke-WebRequest -Uri https://aka.ms/wslubuntu2004 -OutFile Ubuntu.appx -UseBasicParsing
 Add-AppxPackage .\Ubuntu.appx
 ```
 
@@ -171,16 +171,15 @@ For installing opam, some packages are required. The following commands can be
 run to update the system and install those packages:
 
 ```
-sudo add-apt-repository -y ppa:avsm/ppa # unnecessary for Ubuntu 20.04
 sudo apt update
 sudo apt upgrade
-sudo apt install make m4 gcc opam
+sudo apt install make m4 gcc opam yaru-theme-gtk yaru-theme-icon
 ```
 
 Then opam can be set up using these commands:
 
 ```
-opam init --disable-sandboxing -c 4.05.0 --shell-setup
+opam init --disable-sandboxing --shell-setup
 eval $(opam env)
 opam install -y depext
 ```
@@ -415,7 +414,7 @@ available:
 
 - `frama-c`
 - `frama-c-gui`       if available
-- `frama-c-config`    displays Frama-C configuration paths
+- `frama-c-config`    lightweight wrapper used to display configuration paths
 - `frama-c.byte`      bytecode version of frama-c
 - `frama-c-gui.byte`  bytecode version of frama-c-gui, if available
 - `ptests.opt`        testing tool for Frama-c
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..2d5b4c3b2ab3c215e22267ff04e2662d49d3ce5d
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,8 @@
+Most sources are LGPLv2.1, with some isolated exceptions for
+external libraries modified for Frama-C (BSD, QPL) in src/libraries
+
+Each source file contains its own header. See the licenses directory for the
+complete text of each license.
+
+Documentation is licensed under CC-BY-SA 4.0. See doc/LICENSE for more
+information
diff --git a/Makefile.generating b/Makefile.generating
index e55a39ff38ce2e325850aa68aff2c11074ca1a24..256316a60ebf16ac0ff22ab2aed6ca96fc187d74 100644
--- a/Makefile.generating
+++ b/Makefile.generating
@@ -134,28 +134,28 @@ src/libraries/stdlib/transitioning.ml: \
 	cat $< > $@
 	$(CHMOD_RO) $@
 
-##################
-# Frama-C-config #
-##################
-
-src/kernel_internals/runtime/frama_c_config.ml: src/kernel_internals/runtime/fc_config.ml \
-	src/kernel_internals/runtime/frama_c_config.ml.in Makefile.generating
-	$(PRINT_MAKING) $@
+ifeq ($(HAS_DGRAPH),yes)
+  DGRAPHFILES:=debug_manager
+  GENERATED+=src/plugins/gui/debug_manager.ml
+  ifeq ($(HAS_OCAMLGRAPH_2), yes)
+	DGRAPH_MODULE=Graph_gtk
+	DGRAPH_ERROR=Graph_gtk.DGraphMake.DotError
+  else
+	DGRAPH_MODULE=Dgraph
+	DGRAPH_ERROR=Dgraph.DGraphModel.DotError
+  endif
+  src/plugins/gui/debug_manager.ml \
+  src/plugins/gui/dgraph_helper.ml \
+  src/plugins/callgraph/cg_viewer.ml: %.ml: %.yes.ml Makefile.generating share/Makefile.config
 	$(RM) $@
-	$(ECHO) "module Filepath = struct let add_symbolic_dir _ _ = () end" >> $@
-	$(ECHO) "module Fc_config = struct" >> $@
-	$(CAT) src/kernel_internals/runtime/fc_config.ml >> $@
-	$(ECHO) "end" >> $@
-	$(CAT) src/kernel_internals/runtime/frama_c_config.ml.in >> $@
+	$(SED) -e 's/DGRAPH_MODULE/$(DGRAPH_MODULE)/g' \
+               -e 's/DGRAPH_ERROR/$(DGRAPH_ERROR)/g' $< > $@
 	$(CHMOD_RO) $@
-
-GENERATED+= src/kernel_internals/runtime/frama_c_config.ml
-
-bin/fc-config$(EXE): src/kernel_internals/runtime/frama_c_config.ml
-ifeq ($(OCAMLBEST),opt)
-	$(OCAMLOPT) str.cmxa $< -o $@
 else
-	$(OCAMLC) str.cma $< -o $@
+  DGRAPHFILES:=
+  src/plugins/gui/dgraph_helper.ml: src/plugins/gui/dgraph_helper.no.ml Makefile.generating share/Makefile.config
+	$(CP) $< $@
+	$(CHMOD_RO) $@
 endif
 
 # Merlin #
diff --git a/README.md b/README.md
index 4b20d94defc07275ea45fb38e4c7b8ca934af96e..afae47f12d44ad2c2cefc5b26cfe7f5034592ec3 100644
--- a/README.md
+++ b/README.md
@@ -96,7 +96,7 @@ via the GUI:
 ## Further reference
 
 - Links to user and developer manuals, Frama-C archives,
-  and plug-in manuals are available at <br> http://frama-c.com/download.html
+  and plug-in manuals are available at <br> http://frama-c.com/html/get-frama-c.html
 
 - [StackOverflow](http://stackoverflow.com/questions/tagged/frama-c) has several
   questions with the `frama-c` tag, which is monitored by several members of the
@@ -110,9 +110,10 @@ via the GUI:
   the [issues tracking system](https://git.frama-c.com/pub/frama-c/issues),
   for reporting bugs.
 
-- The [Frama-C wiki](https://bts.frama-c.com/dokuwiki/doku.php?id=mantis:frama-c:start)
-  has some useful information, although it is not entirely up-to-date.
+- The [Frama-C documentation page](https://frama-c.com/html/documentation.html)
+  contains links to all manuals and plugins description, as well as tutorials, courses
+	and more.
 
-- The [Frama-C blog](http://pub.frama-c.com/blog) has several posts about
+- The [Frama-C blog](http://frama-c.com/blog) has several posts about
   new developments of Frama-C, as well as general discussions about the C
   language, undefined behavior, floating-point computations, etc.
diff --git a/VERSION b/VERSION
index d22a678d5a1453d0dea85f01e751014c8a59254b..bea63543b9e4caed8487b7aa9c906c4e5fe3aab5 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-21.1+dev
+22.0+dev
\ No newline at end of file
diff --git a/VERSION_CODENAME b/VERSION_CODENAME
index 44c9941f42e4a3a7ebcff70cab37d13b0bd1ba62..766f8e3f20ca4f4e89534e0b2cb7fab0c117ae31 100644
--- a/VERSION_CODENAME
+++ b/VERSION_CODENAME
@@ -1 +1 @@
-Scandium
+Titanium
\ No newline at end of file
diff --git a/bin/build-src-distrib.sh b/bin/build-src-distrib.sh
index 272eb1caf79a83e93b09e0c8e75e8cf9559839bc..003db5f0f80ba222d5681d98f80449198de48830 100755
--- a/bin/build-src-distrib.sh
+++ b/bin/build-src-distrib.sh
@@ -2,22 +2,552 @@
 
 set -u
 
+# Search "BEGIN SCRIPT" to skip functions
+
+# Set it to "no" in order to really execute the commands.
+# Otherwise, they are only printed.
+DEBUG=no
+
+# Set variable VERBOSE_MAKE_DOC to see all latex messages during manuals build
+
 # Executing this script requires bash 4.0 or higher
 # (special use of the 'case' construct)
 if test `echo $BASH_VERSION | sed "s/\([0-9]\).*/\1/" ` -lt 4; then
-  echo "bash version >= 4 is required."
-  exit 99
+    echo "bash version >= 4 is required."
+    exit 99
 fi
 
 # git-lfs needs to be installed
 if ! command -v git-lfs >/dev/null 2>/dev/null; then
-  echo "git-lfs is required"
-  exit 99
+    echo "git-lfs is required"
+    exit 99
 fi
 
-# Set it to "no" in order to really execute the commands.
-# Otherwise, they are only printed.
-DEBUG=no
+# rgrep needs to be installed
+if ! command -v rgrep --version >/dev/null 2>/dev/null; then
+    echo "rgrep is required"
+    exit 99
+fi
+
+function run {
+    cmd=$1
+    echo "$cmd"
+    if test "$DEBUG" == "no"; then
+        sh -c "$cmd" || { echo "Aborting step ${STEP}."; exit "${STEP}"; }
+    fi
+}
+
+function step {
+    STEP=$1
+    echo
+    echo "Step $1: $2"
+}
+
+# find_repository_DIRECTORY_BRANCH path url
+# - path: path to the directory
+# - url: URL of the repository
+# Checks:
+# - master branch
+# Sets:
+# DIRECTORY: path to the directory
+function find_repository_DIRECTORY_BRANCH {
+    name=$1
+    url=$2
+    if test \! -d $name/.git ; then
+        echo "### WARNING: $name/.git directory not found; do you want to clone it? (y/n)"
+        read CHOICE
+        case "${CHOICE}" in
+            "Y"|"y")
+                run "git clone $url $name"
+                ;;
+            *)
+                echo "The $url repository must be linked at $name (clone or symbolic link)"
+                exit 1
+                ;&
+        esac
+    fi
+    DIRECTORY=$name
+    BRANCH=`git --git-dir=$name/.git rev-parse --abbrev-ref HEAD`
+    if [ "$BRANCH" != "master" ]; then
+        echo "### WARNING: $name repository is on branch $BRANCH"
+        proceed_anyway "Reset the branch to 'master', then run the script again."
+    fi
+}
+
+# proceed_anyway message
+# - message: text to display if we have to stop
+# Ask if the user wants to continue and display the message if not (then exit)
+function proceed_anyway {
+    message=$1
+    echo "Proceed anyway? [y/N]"
+    read CHOICE
+    case "${CHOICE}" in
+        "Y"|"y")
+            ;;
+        *)
+            echo "$message"
+            exit 1
+    esac
+}
+
+function look_for_uncommited_changes {
+    run "git update-index --refresh"
+    if ! git diff-index HEAD --; then
+        echo ""
+        echo "### WARNING: uncommitted git changes will be discarded when creating archive!"
+        proceed_anyway "Stash or commit local changes, then run the script again."
+    fi
+}
+
+function look_for_frama_c_dev {
+    rgrep -i "frama-c+dev" src &> /dev/null
+    if [ "$?" == "0" ]; then
+        echo "### WARNING: Remaining frama-c+dev occurrences in 'src'"
+        proceed_anyway "Update API, then run the script again"
+    fi
+}
+
+function assert_build_dir {
+    if test \! -d "$BUILD_DIR" ; then
+        echo "ERROR: $BUILD_DIR does not exist, possibly removed by another step"
+        exit 1
+    fi
+}
+
+function assert_out_dir {
+    if test \! -d "$OUT_DIR" ; then
+        echo "ERROR: $OUT_DIR does not exist, possibly removed by another step"
+        exit 1
+    fi
+}
+
+# diff_validation repository file
+# - repository: target repository
+# - file: target file
+# Ask for user validation before staging changes in [file] on the [repository].
+# Stops the script if the user refuses the changes
+function diff_validation {
+    repo=$1
+    file=$2
+    run "git -C $repo diff $file"
+    echo
+    echo "Is the above diff correct for $file? [y/N]"
+    read CHOICE
+    case "${CHOICE}" in
+        "Y"|"y")
+            ;;
+        *)
+            echo "Something went wrong, you may want to clean $repo"
+            exit 1
+    esac
+    run "git -C $repo add $file"
+}
+
+# Manuals choice
+
+function get_MANUAL_NAME {
+    case "$1" in
+        "user") MANUAL_NAME="Frama-C user manual" ;;
+        "plugin-dev") MANUAL_NAME="Frama-C plug-in development guide" ;;
+        "api") MANUAL_NAME="Frama-C API bundle" ;;
+        "acsl-1") MANUAL_NAME="ACSL manual" ;;
+        "acsl-impl") MANUAL_NAME="ACSL implementation" ;;
+        "aorai") MANUAL_NAME="Aorai manual" ;;
+        "e-acsl-1") MANUAL_NAME="E-ACSL reference" ;;
+        "e-acsl-impl") MANUAL_NAME="E-ACSL implementation" ;;
+        "e-acsl-man") MANUAL_NAME="E-ACSL manual" ;;
+        "eva") MANUAL_NAME="EVA manual" ;;
+        "metrics") MANUAL_NAME="Metrics manual" ;;
+        "rte") MANUAL_NAME="RTE manual" ;;
+        "wp") MANUAL_NAME="WP manual" ;;
+        *) MANUAL_NAME="Not a manual identifier: $1" ;;
+    esac
+}
+
+function check_manual {
+    value=$1
+    if [[ ! " ${AVAILABLE_MANUALS[@]} " =~ " ${value} " ]]; then
+        echo "### ERROR: in $INCLUDED_MANUALS_CONFIG: $value is not a valid manual identifier"
+        exit 1
+    fi
+}
+
+function show_generated_manuals {
+    echo
+    echo "The following manuals will be included."
+    for i in ${INCLUDED_MANUALS[@]}; do
+        get_MANUAL_NAME $i
+        echo "- $MANUAL_NAME"
+    done
+    echo
+}
+
+function create_manuals_config {
+    echo -n > $INCLUDED_MANUALS_CONFIG
+    for i in ${AVAILABLE_MANUALS[@]}; do
+        get_MANUAL_NAME $i
+        echo "Include $MANUAL_NAME? [y/N]"
+        read CHOICE
+        case "${CHOICE}" in
+            "Y"|"y")
+                echo $i >> $INCLUDED_MANUALS_CONFIG ;;
+            *) ;;
+        esac
+    done
+}
+
+function check_manual_path_MUST_ADD {
+    MUST_ADD="no"
+    for i in ${INCLUDED_MANUALS[@]}; do
+        if [[ $1 == "$i"* ]]; then
+            MUST_ADD="yes"
+        fi
+    done
+}
+
+# WIKI generation
+
+function fill_wiki {
+    PAGE_NAME=Frama-C-${FRAMAC_VERSION_AND_CODENAME}.md
+    WIKI_PAGE=$WIKI_DIR/$PAGE_NAME
+    run "mkdir -p $WIKI_DIR/manuals"
+    run "sed -i -e '/<!-- LAST RELEASE -->/a \
+- [${FRAMAC_VERSION} (${FRAMAC_VERSION_CODENAME})](Frama-C-${FRAMAC_VERSION_AND_CODENAME})' $WIKI_DIR/Home.md"
+    if test "$FINAL_RELEASE" = "yes"; then
+        release_type="FINAL"
+    else
+        release_type="BETA"
+    fi
+    run "sed -i -e '/<!-- LAST ${release_type} RELEASE -->/a \
+- [${FRAMAC_VERSION} (${FRAMAC_VERSION_CODENAME})](Frama-C-${FRAMAC_VERSION_AND_CODENAME})' $WIKI_DIR/_sidebar.md"
+    echo "# Frama-C release ${FRAMAC_VERSION} (${FRAMAC_VERSION_CODENAME})" > $WIKI_PAGE
+    echo "## Sources" >> $WIKI_PAGE
+    run "cp $OUT_DIR/$TARGZ_FILENAME $WIKI_DIR/downloads"
+    run "git -C $WIKI_DIR add downloads/$TARGZ_FILENAME"
+    echo " - [$TARGZ_FILENAME](downloads/$TARGZ_FILENAME)" >> $WIKI_PAGE
+    echo "" >> $WIKI_PAGE
+    echo "## Manuals" >> $WIKI_PAGE
+    for fpath in $OUT_DIR/manuals/* ; do
+        f=$(basename $fpath)
+        check_manual_path_MUST_ADD $f
+        if [[ $MUST_ADD == "yes" ]]; then
+            f_no_ext=${f%.*}
+            f_no_pdf_ext="${f%.pdf}"
+            echo "- [${f_no_pdf_ext%-${FRAMAC_VERSION_AND_CODENAME}}](manuals/$f)" >> $WIKI_PAGE
+            run "cp $fpath $WIKI_DIR/manuals/"
+            run "git -C $WIKI_DIR add manuals/$f"
+        fi
+    done
+    echo "" >> $WIKI_PAGE
+    echo "## Main changes" >> $WIKI_PAGE
+    sed 's/\(\#.*\)/##\1/' $CHANGES >> $WIKI_PAGE
+    run "git -C $WIKI_DIR add $PAGE_NAME"
+    diff_validation $WIKI_DIR "Home.md"
+    diff_validation $WIKI_DIR "_sidebar.md"
+}
+
+# WEBSITE pages generation
+
+function add_install_page {
+    INSTALL_WEBPAGE=html/installations/$FRAMAC_VERSION_CODENAME_LOWER.md
+    INSTALL_WEBPAGE_PATH=$WEBSITE_DIR/$INSTALL_WEBPAGE
+    echo "---" > $INSTALL_WEBPAGE_PATH
+    echo "layout: doc_page" >> $INSTALL_WEBPAGE_PATH
+    echo "title: Installation instructions for $FRAMAC_VERSION_CODENAME" >> $INSTALL_WEBPAGE_PATH
+    echo "---" >> $INSTALL_WEBPAGE_PATH
+    echo >> $INSTALL_WEBPAGE_PATH
+    cat ./INSTALL.md >> $INSTALL_WEBPAGE_PATH
+
+    run "git -C $WEBSITE_DIR add $INSTALL_WEBPAGE"
+}
+
+function add_event_page {
+    EVENT_WEBPAGE=_events/framac-$FRAMAC_VERSION.md
+    EVENT_WEBPAGE_PATH=$WEBSITE_DIR/$EVENT_WEBPAGE
+
+    if [ "$VERSION_MINOR" != 0 ]; then
+        PREVIOUS=$VERSION_MAJOR
+    else
+        PREVIOUS=$(( $VERSION_MAJOR-1 ))
+    fi
+    PREVIOUS_NAME=$(git show $PREVIOUS.0:VERSION_CODENAME)
+
+    TEXTUAL_VERSION="Frama-C $FRAMAC_VERSION ($FRAMAC_VERSION_CODENAME)"
+    TEXTUAL_PREVIOUS="Frama-C $PREVIOUS ($PREVIOUS_NAME)"
+
+    echo "---" > $EVENT_WEBPAGE_PATH
+    echo "layout: default" >> $EVENT_WEBPAGE_PATH
+    echo "date: $(date +\"%d-%m-%Y\")" >> $EVENT_WEBPAGE_PATH
+    echo "event: $TEXTUAL_VERSION" >> $EVENT_WEBPAGE_PATH
+    echo -n "title: " >> $EVENT_WEBPAGE_PATH
+    if [ "$FINAL_RELEASE" = "no" ]; then
+        echo -n "Beta release " >> $EVENT_WEBPAGE_PATH
+    else
+        echo -n "Release " >> $EVENT_WEBPAGE_PATH
+    fi
+    echo "of $TEXTUAL_VERSION" >> $EVENT_WEBPAGE_PATH
+    VERSION_PAGE="/fc-versions/$FRAMAC_VERSION_CODENAME_LOWER.html"
+    echo "link: $VERSION_PAGE" >> $EVENT_WEBPAGE_PATH
+    echo "---" >> $EVENT_WEBPAGE_PATH
+    echo >> $EVENT_WEBPAGE_PATH
+    echo "$TEXTUAL_VERSION is out. Download it [here]($VERSION_PAGE)." >> $EVENT_WEBPAGE_PATH
+    echo >> $EVENT_WEBPAGE_PATH
+    echo "Main changes with respect to $TEXTUAL_PREVIOUS include:" >> $EVENT_WEBPAGE_PATH
+    echo >> $EVENT_WEBPAGE_PATH
+    sed 's/\(\#.*\)/###\1/' $CHANGES >> $EVENT_WEBPAGE_PATH
+
+    run "git -C $WEBSITE_DIR add $EVENT_WEBPAGE"
+}
+
+function add_version_page {
+    VERSION_WEBPAGE="_fc-versions/$FRAMAC_VERSION_CODENAME_LOWER.md"
+    VERSION_WEBPAGE_PATH=$WEBSITE_DIR/$VERSION_WEBPAGE
+    ACSL_VERSION=$(ls $OUT_DIR/manuals | sed -n 's/^acsl-1.\([0-9][0-9]\).pdf/\1/p')
+    echo "---" > $VERSION_WEBPAGE_PATH
+    echo "layout: version" >> $VERSION_WEBPAGE_PATH
+    echo "number: $VERSION_MAJOR" >> $VERSION_WEBPAGE_PATH
+    echo "name: $FRAMAC_VERSION_CODENAME" >> $VERSION_WEBPAGE_PATH
+    if [ "$FINAL_RELEASE" = "no" ]; then
+        echo "beta: true" >> $VERSION_WEBPAGE_PATH
+    else
+        echo "acsl: $ACSL_VERSION" >> $VERSION_WEBPAGE_PATH
+    fi
+    echo "releases:" >> $VERSION_WEBPAGE_PATH
+    echo "  - number: $VERSION_MINOR" >> $VERSION_WEBPAGE_PATH
+    echo "    categories:" >> $VERSION_WEBPAGE_PATH
+    echo "    - name: Frama-C v$FRAMAC_VERSION $FRAMAC_VERSION_CODENAME" >> $VERSION_WEBPAGE_PATH
+    echo "      files:" >> $VERSION_WEBPAGE_PATH
+    echo "      - name: Source distribution" >> $VERSION_WEBPAGE_PATH
+    echo "        link: /download/$TARGZ_FILENAME" >> $VERSION_WEBPAGE_PATH
+    echo "        help: Compilation instructions" >> $VERSION_WEBPAGE_PATH
+    echo "        help_link: /html/installations/$FRAMAC_VERSION_CODENAME_LOWER.html" >> $VERSION_WEBPAGE_PATH
+    check_manual_path_MUST_ADD "user"
+    if [[ $MUST_ADD == "yes" ]]; then
+        echo "      - name: User manual" >> $VERSION_WEBPAGE_PATH
+        echo "        link: /download/user-manual-$FRAMAC_VERSION_AND_CODENAME.pdf" >> $VERSION_WEBPAGE_PATH
+    fi
+    check_manual_path_MUST_ADD "plugin-dev"
+    if [[ $MUST_ADD == "yes" ]]; then
+        echo "      - name: Plug-in development guide" >> $VERSION_WEBPAGE_PATH
+        echo "        link: /download/plugin-development-guide-$FRAMAC_VERSION_AND_CODENAME.pdf" >> $VERSION_WEBPAGE_PATH
+        echo "        help: Hello plug-in tutorial archive" >> $VERSION_WEBPAGE_PATH
+        echo "        help_link: /download/hello-$FRAMAC_VERSION_AND_CODENAME.tar.gz" >> $VERSION_WEBPAGE_PATH
+    fi
+    check_manual_path_MUST_ADD "api"
+    if [[ $MUST_ADD == "yes" ]]; then
+        echo "      - name: API Documentation" >> $VERSION_WEBPAGE_PATH
+        echo "        link: /download/frama-c-$FRAMAC_VERSION_AND_CODENAME-api.tar.gz" >> $VERSION_WEBPAGE_PATH
+    fi
+    check_manual_path_MUST_ADD "acsl-impl"
+    if [[ $MUST_ADD == "yes" ]]; then
+        echo "      - name: ACSL 1.$ACSL_VERSION ($FRAMAC_VERSION_CODENAME implementation)" >> $VERSION_WEBPAGE_PATH
+        echo "        link: /download/acsl-implementation-$FRAMAC_VERSION_AND_CODENAME.pdf" >> $VERSION_WEBPAGE_PATH
+    fi
+    echo "    - name: Plug-in Manuals" >> $VERSION_WEBPAGE_PATH
+    echo "      sort: true" >> $VERSION_WEBPAGE_PATH
+    echo "      files:" >> $VERSION_WEBPAGE_PATH
+    check_manual_path_MUST_ADD "aorai"
+    if [[ $MUST_ADD == "yes" ]]; then
+        echo "      - name: Aoraï manual" >> $VERSION_WEBPAGE_PATH
+        echo "        link: /download/aorai-manual-$FRAMAC_VERSION_AND_CODENAME.pdf" >> $VERSION_WEBPAGE_PATH
+        echo "        help: Aoraï example" >> $VERSION_WEBPAGE_PATH
+        echo "        help_link: /download/aorai-example-$FRAMAC_VERSION_AND_CODENAME.tgz" >> $VERSION_WEBPAGE_PATH
+    fi
+    check_manual_path_MUST_ADD "metrics"
+    if [[ $MUST_ADD == "yes" ]]; then
+        echo "      - name: Metrics manual" >> $VERSION_WEBPAGE_PATH
+        echo "        link: /download/metrics-manual-$FRAMAC_VERSION_AND_CODENAME.pdf" >> $VERSION_WEBPAGE_PATH
+    fi
+    check_manual_path_MUST_ADD "rte"
+    if [[ $MUST_ADD == "yes" ]]; then
+        echo "      - name: Rte manual" >> $VERSION_WEBPAGE_PATH
+        echo "        link: /download/rte-manual-$FRAMAC_VERSION_AND_CODENAME.pdf" >> $VERSION_WEBPAGE_PATH
+    fi
+    check_manual_path_MUST_ADD "eva"
+    if [[ $MUST_ADD == "yes" ]]; then
+        echo "      - name: Eva manual" >> $VERSION_WEBPAGE_PATH
+        echo "        link: /download/eva-manual-$FRAMAC_VERSION_AND_CODENAME.pdf" >> $VERSION_WEBPAGE_PATH
+    fi
+    check_manual_path_MUST_ADD "wp"
+    if [[ $MUST_ADD == "yes" ]]; then
+        echo "      - name: WP manual" >> $VERSION_WEBPAGE_PATH
+        echo "        link: /download/wp-manual-$FRAMAC_VERSION_AND_CODENAME.pdf" >> $VERSION_WEBPAGE_PATH
+    fi
+    check_manual_path_MUST_ADD "e-acsl-man"
+    if [[ $MUST_ADD == "yes" ]]; then
+        echo "      - name: E-ACSL manual" >> $VERSION_WEBPAGE_PATH
+        echo "        link: /download/e-acsl/e-acsl-manual-$FRAMAC_VERSION_AND_CODENAME.pdf" >> $VERSION_WEBPAGE_PATH
+    fi
+    echo "---" >> $VERSION_WEBPAGE_PATH
+
+    run "git -C $WEBSITE_DIR add $VERSION_WEBPAGE"
+}
+
+function add_downloads {
+    DOWNLOAD_DIR="$WEBSITE_DIR/download"
+    DOWNLOAD_PATH="download"
+    for fpath in $OUT_DIR/manuals/* ; do
+        f=$(basename $fpath)
+        f_no_ext=${f%.*}
+
+        check_manual_path_MUST_ADD $f
+        if [[ $MUST_ADD == "yes" ]]; then
+            if [[ $f_no_ext =~ ^e-acsl.*$ ]]; then
+                BASE="e-acsl/$f"
+            else
+                BASE="$f"
+            fi
+
+            if   [[ $f_no_ext =~ ^(e-)?acsl-[0-9].[0-9][0-9]$ ]]; then
+                REPL=$(echo $BASE | sed -e "s/-[0-9].[0-9][0-9]//")
+            elif [[ $f_no_ext =~ ^e-acsl-* ]]; then
+                REPL=$(echo $BASE | sed -e "s/-$FRAMAC_VERSION_AND_CODENAME//")
+            else
+                REPL=$(echo $BASE | sed -e "s/\(.*\)-$FRAMAC_VERSION_AND_CODENAME/frama-c-\1/")
+            fi
+
+            run "cp $fpath $DOWNLOAD_DIR/$BASE"
+            run "git -C $WEBSITE_DIR add $DOWNLOAD_PATH/$BASE"
+
+            # we change generic files ONLY for FINAL release
+            if test "$FINAL_RELEASE" = "yes"; then
+                run "cp $fpath $DOWNLOAD_DIR/$REPL"
+                run "git -C $WEBSITE_DIR add $DOWNLOAD_PATH/$REPL"
+            fi
+        fi
+    done
+
+    # Particular case for the value analysis manual:
+    EVA_FILE="$OUT_DIR/manuals/eva-manual-$FRAMAC_VERSION_AND_CODENAME.pdf"
+    VALUE_PATH="$DOWNLOAD_DIR/frama-c-value-analysis.pdf"
+    VALUE_GIT_PATH="$DOWNLOAD_PATH/frama-c-value-analysis.pdf"
+    # we change generic files ONLY for FINAL release
+    if test "$FINAL_RELEASE" = "yes"; then
+        run "cp $EVA_FILE $VALUE_PATH"
+        run "git -C $WEBSITE_DIR add $VALUE_GIT_PATH"
+    fi
+
+    # Examples:
+    HELLO="hello-$FRAMAC_VERSION_AND_CODENAME.tar.gz"
+    check_manual_path_MUST_ADD "plugin-dev"
+    if [[ $MUST_ADD == "yes" ]]; then
+        run "cp $OUT_DIR/$HELLO $DOWNLOAD_DIR"
+        run "git -C $WEBSITE_DIR add $DOWNLOAD_PATH/$HELLO"
+        # we change generic files ONLY for FINAL release
+        if test "$FINAL_RELEASE" = "yes"; then
+            run "cp $OUT_DIR/$HELLO $DOWNLOAD_DIR"
+            run "git -C $WEBSITE_DIR add $DOWNLOAD_PATH/hello.tar.gz"
+        fi
+    fi
+
+    # Source distribution:
+    run "cp $OUT_DIR/$TARGZ_FILENAME $DOWNLOAD_DIR"
+    run "git -C $WEBSITE_DIR add $DOWNLOAD_PATH/$TARGZ_FILENAME"
+
+    # API
+    run "cp $OUT_DIR/frama-c-api.tar.gz $DOWNLOAD_DIR/frama-c-api-$FRAMAC_VERSION_AND_CODENAME.tar.gz"
+    run "git -C $WEBSITE_DIR add $DOWNLOAD_PATH/frama-c-api-$FRAMAC_VERSION_AND_CODENAME.tar.gz"
+}
+
+function fill_website {
+    add_install_page
+    add_event_page
+    add_version_page
+    add_downloads
+}
+
+# Commit changes
+
+function create_website_branch {
+    if test "$FINAL_RELEASE" = "yes"; then
+        BRANCH_NAME="release/stable-$FRAMAC_VERSION-$FRAMAC_VERSION_CODENAME_LOWER"
+    else
+        BRANCH_NAME="release/beta-$FRAMAC_VERSION-$FRAMAC_VERSION_CODENAME_LOWER"
+    fi
+    # Chech whether release/<release> exists on the website
+    git -C $WEBSITE_DIR show-ref --verify --quiet refs/heads/$BRANCH_NAME
+    if [[ "$?" == "0" ]]; then
+        echo "### Warning: branch $BRANCH_NAME already exists in $WEBSITE_DIR"
+        echo "The script will ERASE this branch"
+        proceed_anyway "Rename or erase the branch, then run the script again."
+        run "git -C $WEBSITE_DIR branch -D $BRANCH_NAME"
+    fi
+
+    # Set release/<release> and displays changes to be committed
+    run "git -C $WEBSITE_DIR checkout --quiet -b $BRANCH_NAME"
+    run "git -C $WEBSITE_DIR status"
+
+    echo "Commit locally the previous changes on $WEBSITE_DIR:$BRANCH_NAME? [y/N]"
+    read CHOICE
+    case "${CHOICE}" in
+        "Y"|"y")
+            ;;
+        *)
+            echo "Abort website branch creation, reset to master."
+            run "git -C $WEBSITE_DIR checkout master"
+            exit 1
+    esac
+    run "git -C $WEBSITE_DIR commit -m \"Prepare pages for the release of Frama-C $FRAMAC_VERSION\""
+}
+
+function commit_wiki {
+    run "git -C $WIKI_DIR status"
+
+    echo "Commit locally the previous changes on $WIKI_DIR? [y/N]"
+    read CHOICE
+    case "${CHOICE}" in
+        "Y"|"y")
+            ;;
+        *)
+            echo "Abort wiki update."
+            exit 1
+    esac
+    run "git -C $WIKI_DIR commit -m \"Prepare pages for the release of Frama-C $FRAMAC_VERSION\""
+}
+
+
+function propagate_changes {
+    create_website_branch
+    commit_wiki
+}
+
+function last_step_validation {
+    # if test "$FRAMAC_VERSION" != "$FRAMAC_TAG"; then
+    #     echo "To go further, the last commit must be tagged with the right version"
+    #     exit 1
+    # fi
+    echo "
+    This step will:
+
+      - ask for a validation of the changes to website
+      - create a NEW branch on for the website
+
+      - ask for a validation of the changes to wiki
+      - commit changes to the wiki MASTER branch
+
+    If you want to perform some additional checks it is probably time to stop.
+
+    Generated files are available in: $OUT_DIR.
+    "
+    echo -n "If you are ready to continue, type exactly \"RELEASE\": "
+    read CHOICE
+    case "${CHOICE}" in
+        "RELEASE")
+            ;;
+        *)
+            echo "Aborting"
+            exit 1
+    esac
+}
+
+
+# BEGIN SCRIPT
+GITLAB_FRAMA_C_PUBLIC="git@git.frama-c.com:pub"
+GITLAB_WIKI="$GITLAB_FRAMA_C_PUBLIC/frama-c.wiki.git"
+GITLAB_WEBSITE="$GITLAB_FRAMA_C_PUBLIC/pub.frama-c.com.git"
+GITLAB_ACSL="git@github.com:acsl-language/acsl.git"
+GITLAB_FRAMA_C_PRIVATE="git@git.frama-c.com:frama-c/frama-c.git"
+
 if test \! -e .git ; then
     echo "ERROR: .git directory not found"
     echo "This script must be run at the root of a Frama-C repository"
@@ -30,143 +560,142 @@ if test \! -f VERSION ; then
     echo "This script must be run at the root of a Frama-C repository"
     exit 1
 fi
+
 FRAMAC_VERSION=$(cat VERSION)
 FRAMAC_TAG=$(git describe --tag)
 FRAMAC_VERSION_CODENAME=$(cat VERSION_CODENAME)
+FRAMAC_VERSION_CODENAME_LOWER=$(echo "$FRAMAC_VERSION_CODENAME" | tr '[:upper:]' '[:lower:]')
 FRAMAC_VERSION_AND_CODENAME="${FRAMAC_VERSION}-${FRAMAC_VERSION_CODENAME}"
 TARGZ_FILENAME=frama-c-${FRAMAC_VERSION_AND_CODENAME}.tar.gz
 
 VERSION_MODIFIER=$(cat VERSION | sed -e s/[0-9.]*\\\(.*\\\)/\\1/)
+VERSION_MAJOR=$(cat VERSION | sed -e s/\\\([0-9]*\\\).[0-9]*.*/\\1/)
+VERSION_MINOR=$(cat VERSION | sed -e s/[0-9]*.\\\([0-9]*\\\).*/\\1/)
 
 if test -n "$VERSION_MODIFIER"; then FINAL_RELEASE=no; else FINAL_RELEASE=yes; fi
+if [ "$VERSION_MODIFIER" == "+dev" ]; then
+    echo "### WARNING: The VERSION is a development version"
+    proceed_anyway "Update VERSION and run the script again"
+fi
 
 if test "$FRAMAC_VERSION" != "$FRAMAC_TAG"; then
-    echo "WARNING: The current commit is not tagged with the current version:"
+    echo "### WARNING: The current commit is not tagged with the current version:"
     echo "Frama-C Version: $FRAMAC_VERSION"
     echo "Frama-C Tag    : $FRAMAC_TAG"
 fi
 
-run () {
-  cmd=$1
-  echo "$cmd"
-  if test "$DEBUG" == "no"; then
-    sh -c "$cmd" || { echo "Aborting step ${STEP}."; exit "${STEP}"; }
-  fi
-}
+# Find specific repositories
 
-GITLAB_DIR=./pub-frama-c
-GITLAB_GIT="git@git.frama-c.com:pub/frama-c.git"
+find_repository_DIRECTORY_BRANCH "./frama-c.wiki" $GITLAB_WIKI
+WIKI_DIR=$DIRECTORY
+WIKI_BRANCH=$BRANCH
 
-if test ! -d $GITLAB_DIR/.git; then
-    echo "WARNING: $GITLAB_DIR/.git directory not found; do you want to clone it? (y/n)"
-    read CHOICE
-    case "${CHOICE}" in
-        "Y"|"y")
-            run "git clone $GITLAB_GIT $GITLAB_DIR"
-            ;;
-        *)
-            echo "gitlab's public Frama-C project must be linked at $GITLAB_DIR \
-                 (clone or symbolic link)"
-            exit 1
-            ;&
-    esac
-fi
-GITLAB_BRANCH=$(git --git-dir=$GITLAB_DIR/.git rev-parse --abbrev-ref HEAD)
-if test "$FRAMAC_BRANCH" != "$GITLAB_BRANCH"; then
-    echo "WARNING: switching pub-frama-c to current branch $FRAMAC_BRANCH"
-    run "git -C $GITLAB_DIR checkout -b $FRAMAC_BRANCH"
-fi
-GITLAB_WIKI_GIT="git@git.frama-c.com:pub/frama-c.wiki"
-GITLAB_WIKI=./frama-c.wiki
-if test ! -d $GITLAB_WIKI/.git; then
-    echo "WARNING: $GITLAB_WIKI/.git directory not found; do you want to clone it? (y/n)"
-    read CHOICE
-    case "${CHOICE}" in
-        "Y"|"y")
-            run "git clone $GITLAB_WIKI_GIT"
-            ;;
-        *)
-            echo "pub/frama-c wiki must be linked at $GITLAB_WIKI \
-                 (clone or symbolic link)"
-            exit 1
-            ;&
-    esac
-fi
-GITLAB_WIKI_BRANCH=$(git --git-dir=$GITLAB_WIKI/.git rev-parse --abbrev-ref HEAD)
+find_repository_DIRECTORY_BRANCH "./website" $GITLAB_WEBSITE
+WEBSITE_DIR=$DIRECTORY
+WEBSITE_BRANCH=$BRANCH
 
-if test "$GITLAB_WIKI_BRANCH" != "master"; then
-    echo "WARNING: pub/frama-c's wiki is not on the master branch";
-fi
+find_repository_DIRECTORY_BRANCH "./doc/acsl" $GITLAB_ACSL
+ACSL_DIR=$DIRECTORY
 
-ACSL_GIT="git@gitlab.com:acsl-language/acsl.git"
-ACSL_DIR="./doc/acsl"
-if test \! -d $ACSL_DIR/.git ; then
-    echo "WARNING: $ACSL_DIR/.git directory not found; do you want to clone it? (y/n)"
+CHANGES="./main_changes.md"
+if test \! -f $CHANGES ; then
+    echo "### WARNING: The $CHANGES file is missing"
+    echo "Do you want to create an empty one? [y/N]"
     read CHOICE
     case "${CHOICE}" in
         "Y"|"y")
-            pushd "./doc"
-            run "git clone $ACSL_GIT"
-            popd
-            ;;
+            touch $CHANGES;;
         *)
-            echo "The Github ACSL repository must be linked at $ACSL_DIR (clone or symbolic link)"
+            echo "Create a changes file and run the script again"
             exit 1
-            ;&
     esac
 fi
 
+AVAILABLE_MANUALS=("user" "api" "plugin-dev" "acsl-1" "acsl-impl" "aorai" "e-acsl-1" "e-acsl-man" "e-acsl-impl" "eva" "metrics" "rte" "wp")
+INCLUDED_MANUALS_CONFIG="./included_manuals"
+INCLUDED_MANUALS=()
 
+if test "$FINAL_RELEASE" = "yes"; then
+    # In final release mode, all manuals must be distributed
+    for i in ${AVAILABLE_MANUALS[@]}; do
+        INCLUDED_MANUALS+=($i)
+    done
+else
+    if test \! -f $INCLUDED_MANUALS_CONFIG ; then
+        echo "### WARNING: The $INCLUDED_MANUALS_CONFIG file is missing"
+        echo "Do you want to create one? [y/N]"
+        read CHOICE
+        case "${CHOICE}" in
+            "Y"|"y")
+                create_manuals_config
+                for i in $(cat $INCLUDED_MANUALS_CONFIG); do
+                    check_manual $i
+                    INCLUDED_MANUALS+=($i)
+                done
+                ;;
+            *)
+                echo "NO manuals will be included"
+                ;;
+        esac
+    else
+        for i in $(cat $INCLUDED_MANUALS_CONFIG); do
+            check_manual $i
+            INCLUDED_MANUALS+=($i)
+        done
+    fi
+fi
 
 MANUALS_DIR="./doc/manuals"
 
-# push on frama-c.com only for final releases
-if test "$FINAL_RELEASE" = "yes"; then
-WEBSITE_DIR="./website"
-if test \! -d $WEBSITE_DIR/.git ; then
-    echo "ERROR: $WEBSITE_DIR/.git directory not found"
-    echo "The Frama-C website repository must be linked at $WEBSITE_DIR (clone or symbolic link)"
-    exit 1
+FILTER=""
+if [ -z ${VERBOSE_MAKE_DOC+x} ]; then
+    if command -v texfot --version >/dev/null 2>/dev/null; then
+        FILTER="texfot --ignore '(Warning|Overfull|Underfull|Version)'"
+    fi
 fi
-WEBSITE_BRANCH=`git --git-dir=$WEBSITE_DIR/.git rev-parse --abbrev-ref HEAD`
-fi # FINAL_RELEASE == yes
 
 BUILD_DIR_ROOT="/tmp/release"
 BUILD_DIR="$BUILD_DIR_ROOT/frama-c"
 
-echo "Frama-C Version         : $FRAMAC_VERSION"
-echo "Frama-C Branch          : $FRAMAC_BRANCH"
-echo "Final release           : $FINAL_RELEASE"
-echo "pub/frama-c dir         : $GITLAB_DIR"
-echo "pub/frama-c branch      : $GITLAB_BRANCH"
-echo "pub/frama-c wiki        : $GITLAB_WIKI"
-echo "Manuals Dir             : $MANUALS_DIR"
-if test "$FINAL_RELEASE" = "yes"; then
-echo "Website Dir             : $WEBSITE_DIR"
-echo "Website Branch          : $WEBSITE_BRANCH"
-else
-echo "Intermediate release: website not updated"
-fi
-echo "Build Dir      : $BUILD_DIR"
+OUT_DIR="./distributed"
 
-DOWNLOAD_DIR="www/download"
+echo "############################# Frama-C Info ##############################"
+echo ""
+echo "Frama-C Version      : $FRAMAC_VERSION"
+echo "Final release        : $FINAL_RELEASE"
+echo "Frama-C Branch       : $FRAMAC_BRANCH"
+echo "Frama-C Wiki Dir     : $WIKI_DIR"
+echo "Website Dir          : $WEBSITE_DIR"
+echo "Changes file         : $CHANGES"
+echo "Build Dir            : $BUILD_DIR"
+echo "Output Dir           : $OUT_DIR"
+echo ""
+echo "############################# Manuals      ##############################"
+echo ""
+echo "Manuals Dir          : $MANUALS_DIR"
+echo "ACSL Dir             : $ACSL_DIR"
+show_generated_manuals
 
-step () {
-  STEP=$1
-  echo
-  echo "Step $1: $2"
-}
+echo "#########################################################################"
 
 export LC_CTYPE=en_US.UTF-8
 
-echo -n "Steps are:
+echo -n "
+Steps are:
+
   N) previous information is wrong, STOP the script
-  0) compile PDF manuals (will ERASE $MANUALS_DIR!)
-  1) reset local copy of target repositories
+  0) ERASE $OUT_DIR
+  1) compile PDF manuals (will ERASE $MANUALS_DIR!)
   2) build the source distribution
   3) build API bundle
   4) build documentation companions
-  5) copy and stage locally the distributed manuals
+  5) clean $BUILD_DIR
+  6) prepare wiki (will RESET HARD $WIKI_DIR:$WIKI_BRANCH)
+  7) prepare website (will RESET HARD $WEBSITE_DIR:$WEBSITE_BRANCH)
+  8) check generated distribution
+  9) generate opam file
+  10) commit changes
+
 Start at which step? (default is N, which cancels everything)
 - If this is the first time running this script, start at 0
 - Otherwise, start at the latest step before failure
@@ -174,157 +703,100 @@ Start at which step? (default is N, which cancels everything)
 read STEP
 
 case "${STEP}" in
-  ""|"N")
-    echo "Exiting without doing anything.";
-    exit 0;
-    ;&
-  0)
-      step 0 "COMPILING PDF MANUALS"
-      run "rm -rf $MANUALS_DIR"
-      run "mkdir -p $MANUALS_DIR"
-      run "doc/build-manuals.sh"
-    ;&
-  1)
-    run "git -C $GITLAB_DIR reset --hard"
-    run "git -C $GITLAB_WIKI reset --hard"
-    if test "$FINAL_RELEASE" = "yes"; then
-       run "git -C $WEBSITE_DIR reset --hard"
-    fi
-    ;&
-  2)
-    step 2 "BUILDING THE SOURCE DISTRIBUTION"
-    # WARNING! MUST RUN git update-index BEFORE git diff-index!
-    # See: https://stackoverflow.com/questions/36367190/git-diff-files-output-changes-after-git-status
-    run "git update-index --refresh"
-    if ! git diff-index HEAD --; then
-        echo ""
-        echo "### WARNING: uncommitted git changes will be discarded when creating archive!"
-        echo "Proceed anyway? [y/N]"
-        read CHOICE
-        case "${CHOICE}" in
-            "Y"|"y")
-                ;;
-            *)
-                echo "Stash or commit local changes, then run the script again."
-                exit 1
-        esac
-    fi
-    run "mkdir -p $BUILD_DIR_ROOT"
-    run "rm -rf $BUILD_DIR"
-    run "git worktree add -f --detach $BUILD_DIR $FRAMAC_BRANCH"
-    run "cd $BUILD_DIR; autoconf"
-    run "cd $BUILD_DIR; ./configure"
-    run "cd $BUILD_DIR; make -j OPEN_SOURCE=yes src-distrib"
-    # sanity check: markdown-report must be distributed
-    run "tar tf $BUILD_DIR/$TARGZ_FILENAME | grep -q src/plugins/markdown-report"
-    # populate release assets in wiki
-    run "mkdir -p $GITLAB_WIKI/downloads"
-    run "cp $BUILD_DIR/$TARGZ_FILENAME $GITLAB_WIKI/downloads/"
-    if test "$FINAL_RELEASE" = "yes"; then
-        SPEC_FILE="$DOWNLOAD_DIR/$TARGZ_FILENAME"
-        run "rm -f $WEBSITE_DIR/$SPEC_FILE"
-        run "cp $BUILD_DIR/$TARGZ_FILENAME $WEBSITE_DIR/$SPEC_FILE"
-        run "git -C $WEBSITE_DIR add $SPEC_FILE"
-        run "cp Changelog $WEBSITE_DIR/src/last-release/Changelog"
-        run "cp src/plugins/wp/Changelog $WEBSITE_DIR/src/wpChangelog"
-        run "cp src/plugins/wp/Changelog $WEBSITE_DIR/src/last-release/wpChangelog"
-        run "cp src/plugins/e-acsl/doc/Changelog $WEBSITE_DIR/src/eacslChangelog"
-        run "cp src/plugins/e-acsl/doc/Changelog $WEBSITE_DIR/src/last-release/eacslChangelog"
-    fi
-    ;&
-  3)
-    #note: this step may fail if step 4 was performed,
-    #      because it will erase BUILD_DIR
-    step 3 "BUILDING THE API BUNDLE"
-    if test \! -d "$BUILD_DIR" ; then
-        echo "ERROR: $BUILD_DIR does not exist, possibly removed by another step"
-        exit 1
-    fi
-    run "cd $BUILD_DIR; make -j doc-distrib"
-    if test "$FINAL_RELEASE" = "yes"; then
-        SPEC_FILE="$DOWNLOAD_DIR/frama-c-${FRAMAC_VERSION_AND_CODENAME}-api.tar.gz"
-        run "rm -f $WEBSITE_DIR/$SPEC_FILE"
-        run "cp $BUILD_DIR/frama-c-api.tar.gz $WEBSITE_DIR/$SPEC_FILE"
-        run "git -C $WEBSITE_DIR add $SPEC_FILE"
-    fi
-    ;&
-  4)
-    step 4 "BUILDING THE DOCUMENTATION COMPANIONS"
-    if test \! -d "$BUILD_DIR" ; then
-        echo "ERROR: $BUILD_DIR does not exist, possibly removed by another step"
-        exit 1
-    fi
-    run "cd $BUILD_DIR; make -j doc-companions"
-    if test "$FINAL_RELEASE" = "yes"; then
-        SPEC_FILE="$DOWNLOAD_DIR/hello-${FRAMAC_VERSION_AND_CODENAME}.tar.gz"
-        RELE_FILE="$DOWNLOAD_DIR/hello.tar.gz"
-        run "rm -f $WEBSITE_DIR/$SPEC_FILE $WEBSITE_DIR/$RELE_FILE"
-        run "cp $BUILD_DIR/hello-${FRAMAC_VERSION_AND_CODENAME}.tar.gz $WEBSITE_DIR/$SPEC_FILE"
-        run "git -C $WEBSITE_DIR add $SPEC_FILE"
-        run "ln -s hello-${FRAMAC_VERSION_AND_CODENAME}.tar.gz $WEBSITE_DIR/$RELE_FILE";
-        run "git -C $WEBSITE_DIR add $RELE_FILE"
+    ""|"N")
+        echo "Exiting without doing anything.";
+        exit 0;
+        ;&
+    0)
+        step 0 "PREPARE DISTRIBUTION DIRECTORY"
+        run "rm -rf $OUT_DIR"
+        run "mkdir -p $OUT_DIR"
+        ;&
+
+    1)
+        step 1 "COMPILING PDF MANUALS"
+        run "rm -rf $MANUALS_DIR"
+        run "mkdir -p $MANUALS_DIR"
+        run "$FILTER doc/build-manuals.sh"
+        run "rm -rf $OUT_DIR/manuals"
+        run "mkdir -p $OUT_DIR/manuals"
+        run "cp $MANUALS_DIR/* $OUT_DIR/manuals"
+        ;&
+    2)
+        step 2 "BUILDING THE SOURCE DISTRIBUTION"
+        look_for_uncommited_changes
+        look_for_frama_c_dev
+        run "mkdir -p $BUILD_DIR_ROOT"
+        run "rm -rf $BUILD_DIR"
+        run "git worktree add -f --detach $BUILD_DIR $FRAMAC_BRANCH"
+        run "cd $BUILD_DIR; autoconf"
+        run "cd $BUILD_DIR; ./configure"
+        run "cd $BUILD_DIR; make -j OPEN_SOURCE=yes src-distrib"
+        # sanity check: markdown-report must be distributed
+        run "tar tf $BUILD_DIR/$TARGZ_FILENAME | grep -q src/plugins/markdown-report"
+        run "cp $BUILD_DIR/$TARGZ_FILENAME $OUT_DIR"
+        ;&
+    3)
+        step 3 "BUILDING THE API BUNDLE"
+        assert_build_dir
+        run "cd $BUILD_DIR; make -j doc-distrib"
+        run "cp $BUILD_DIR/frama-c-api.tar.gz $OUT_DIR"
+        ;&
+    4)
+        step 4 "BUILDING THE DOCUMENTATION COMPANIONS"
+        assert_build_dir
+        run "cd $BUILD_DIR; make -j doc-companions"
+        run "cp $BUILD_DIR/hello-${FRAMAC_VERSION_AND_CODENAME}.tar.gz $OUT_DIR"
+        ;&
+    5)
+        step 5 "CLEAN $BUILD_DIR"
         run "rm -rf $BUILD_DIR"
         run "git worktree prune"
-    fi
-    ;&
-  5)
-    step 5 "COPYING AND STAGING THE DISTRIBUTED MANUALS"
-      PAGE_NAME=Frama-C-${FRAMAC_VERSION_AND_CODENAME}.md
-      WIKI_PAGE=$GITLAB_WIKI/$PAGE_NAME
-      run "mkdir -p $GITLAB_WIKI/manuals"
-      run "sed -i -e '/<!-- LAST RELEASE -->/a \
-- [${FRAMAC_VERSION} (${FRAMAC_VERSION_CODENAME})](Frama-C-${FRAMAC_VERSION_AND_CODENAME})' $GITLAB_WIKI/Home.md"
-      if test "$FINAL_RELEASE" = "yes"; then
-          release_type="FINAL"
-      else
-          release_type="BETA"
-      fi
-      run "sed -i -e '/<!-- LAST ${release_type} RELEASE -->/a \
-- [${FRAMAC_VERSION} (${FRAMAC_VERSION_CODENAME})](Frama-C-${FRAMAC_VERSION_AND_CODENAME})' $GITLAB_WIKI/_sidebar.md"
-      echo "# Frama-C release ${FRAMAC_VERSION} (${FRAMAC_VERSION_CODENAME})" > $WIKI_PAGE
-      echo "## Sources" >> $WIKI_PAGE
-      echo " - [$TARGZ_FILENAME](downloads/$TARGZ_FILENAME)" >> $WIKI_PAGE
-      echo "" >> $WIKI_PAGE
-      echo "## Manuals" >> $WIKI_PAGE
-      for fpath in $MANUALS_DIR/*; do
-          f=$(basename $fpath)
-          f_no_ext=${f%.*}
-          # E-ACSL-related files are stored in subdirectory e-acsl
-          if [[ $f_no_ext =~ ^e-acsl.*$ ]]; then
-              destdir="$WEBSITE_DIR/$DOWNLOAD_DIR/e-acsl"
-          else
-              destdir="$WEBSITE_DIR/$DOWNLOAD_DIR"
-          fi
-          if [[ -L $fpath ]]; then
-              # symbolic links are copied to the website and prepended with 'frama-c-'
-              # (except for acsl.pdf, which is copied as is)
-              if [[ $f_no_ext =~ ^(e-)?acsl$ ]]; then
-                  ln="$f"
-              else
-                  ln="frama-c-$f"
-              fi
-              run "rm -f $destdir/$ln"
-              run "cp -P $fpath $destdir/$ln"
-              run "git -C $destdir add $ln"
-          else
-              # non-symbolic links are copied as-is to the website, and also to
-              # the Gitlab wiki, where they are also added as links
-              f_no_pdf_ext="${f%.pdf}"
-              echo "- [${f_no_pdf_ext%-${FRAMAC_VERSION_AND_CODENAME}}](manuals/$f)" >> $WIKI_PAGE
-              run "cp $fpath $GITLAB_WIKI/manuals/"
-              run "git -C $GITLAB_WIKI add manuals/$f"
-              run "cp $fpath $destdir/$f"
-              run "git -C $destdir add $f"
-          fi
-      done
-
-    run "git -C $GITLAB_WIKI add $PAGE_NAME"
-    ;;
-  *)
-    echo "Bad entry: ${STEP}"
-    echo "Exiting without doing anything.";
-    exit 31
-    ;;
+        ;&
+    6)
+        step 6 "PREPARE WIKI"
+        assert_out_dir
+        run "git -C $WIKI_DIR reset --hard"
+        fill_wiki
+        ;&
+    7)
+        step 7 "PREPARE WEBSITE"
+        assert_out_dir
+        run "git -C $WEBSITE_DIR reset --hard"
+        fill_website
+        ;&
+    8)
+        step 8 "CHECK GENERATED DISTRIBUTION"
+        assert_out_dir
+        TEST_DIR="$BUILD_DIR_ROOT/frama-c-$FRAMAC_VERSION-$FRAMAC_VERSION_CODENAME"
+        run "mkdir -p $BUILD_DIR_ROOT"
+        run "rm -rf $TEST_DIR"
+        run "cp $OUT_DIR/$TARGZ_FILENAME $BUILD_DIR_ROOT"
+        run "cd $BUILD_DIR_ROOT ; tar xzf $TARGZ_FILENAME"
+        run "./doc/release/checktar.sh $TEST_DIR"
+        run "cd $TEST_DIR ; ./configure && make -j && make tests PTESTS_OPTS=\"-error-code\""
+        run "rm -rf $TEST_DIR"
+        ;&
+    9)
+        step 9 "GENERATE OPAM FILE"
+        assert_out_dir
+        run "cp opam/opam $OUT_DIR/opam"
+        echo >> "$OUT_DIR/opam"
+        echo "url {" >> "$OUT_DIR/opam"
+        echo "  src: \"https://git.frama-c.com/pub/frama-c/-/wikis/downloads/$TARGZ_FILENAME\"" >> "$OUT_DIR/opam"
+        echo "  checksum: \"md5=$(md5sum $OUT_DIR/$TARGZ_FILENAME | cut -d" " -f1)\"" >> "$OUT_DIR/opam"
+        echo "}" >> "$OUT_DIR/opam"
+        ;&
+    10)
+        step 10 "COMMIT CHANGES"
+        last_step_validation
+        propagate_changes
+        ;;
+    *)
+        echo "Bad entry: ${STEP}"
+        echo "Exiting without doing anything.";
+        exit 31
+        ;;
 esac
 
 exit 0
diff --git a/bin/check-reference-configuration.sh b/bin/check-reference-configuration.sh
index 2e18397b47adcaf77edd010754e5fbae320695f8..4117369c5cc42c2636304444ef52e86daf245e73 100755
--- a/bin/check-reference-configuration.sh
+++ b/bin/check-reference-configuration.sh
@@ -76,5 +76,5 @@ if [ $has_any_diffs -ne 0 ]; then
     echo "    opam switch create ${working_ocaml}"
     echo "    opam install depext"
     echo "    opam depext --install$all_packages"
-    echo "    rm -f ~/.why3.conf && why3 config --full-config"
+    echo "    rm -f ~/.why3.conf && why3 config --detect"
 fi
diff --git a/bin/check_newline.sh b/bin/check_newline.sh
new file mode 100755
index 0000000000000000000000000000000000000000..c91311fb289d58b137e6167095295332823ce8df
--- /dev/null
+++ b/bin/check_newline.sh
@@ -0,0 +1,37 @@
+#!/bin/bash -e
+
+# $1: file containing the list of files to check
+# prints a warning for each file not finishing with a newline,
+# unless it is one of a few well-known exceptions (e.g. VERSION).
+# Note: requires the 'file' command-line tool to check which files are text.
+
+if [ $# -lt 1 ]; then
+    echo "usage: $0 file_list.txt"
+    exit 2
+fi
+
+is_likely_text_file() {
+    case $(file -b --mime-type - < "$1") in
+        (text/*) echo "1"
+    esac
+}
+
+errors=0
+
+IFS=''
+file -f "$1" --mime | grep '\btext' | cut -d: -f1 |
+while read file
+do
+    if [ -n "$(is_likely_text_file "$file")" ]; then
+        x=$(tail -c 1 "$file")
+        if [ "$x" != "" -a "$file" != "VERSION" -a "$file" != "VERSION_CODENAME" ]; then
+            echo "error: no newline at end of file: $file"
+            errors=$((errors+1))
+        fi
+    fi
+done
+
+if [ $errors -gt 0 ]; then
+    echo "Found $error(s) files with errors."
+    exit 0
+fi
diff --git a/bin/frama-c-config b/bin/frama-c-config
index 27af8373ccab00893ee9a302a1204d943a858720..fb19e40f4764c2c8ab2c86b474a9e0b72396f38c 100755
--- a/bin/frama-c-config
+++ b/bin/frama-c-config
@@ -21,7 +21,4 @@
 #                                                                        #
 ##########################################################################
 
-
-. $(dirname $0)/local_export.sh
-
-exec $BINDIR/frama-c -no-autoload-plugins "$@"
+exec $(dirname $0)/frama-c -no-autoload-plugins "$@"
diff --git a/bin/frama-c.debug b/bin/frama-c.debug
index 39667bbb3b51dce581215eab1876f0450075fe6c..2e110a0af4c4b7271aedf426e33d55f6bbc1652e 100755
--- a/bin/frama-c.debug
+++ b/bin/frama-c.debug
@@ -33,7 +33,6 @@ fi
 
 OCAML_VERSION=$(ocamlc -version)
 case $OCAML_VERSION in
-4.05*|4.06*|4.07*) DYNLINK='load_printer "dynlink.cma"';;
 4.08*)
     echo "impossible to load dynlink in ocamldebug for version $OCAML_VERSION";
     echo "pretty-printers will not be loaded";
diff --git a/bin/migration_scripts/titanium2vanadium.sh b/bin/migration_scripts/titanium2vanadium.sh
new file mode 100755
index 0000000000000000000000000000000000000000..1a6483bd3df8e0baad95ad670e172adc0b27dc6e
--- /dev/null
+++ b/bin/migration_scripts/titanium2vanadium.sh
@@ -0,0 +1,184 @@
+#!/bin/bash
+##########################################################################
+#                                                                        #
+#  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).            #
+#                                                                        #
+##########################################################################
+
+#
+# Converts a Frama-C plugin from Frama-C 22 Titanium to Frama-C 23 Vanadium,
+# on a best-efforts basis (no guarantee that the result is fully compatible).
+#
+# known missing features:
+# - doesn't follow symbolic links to directories
+
+DIR=
+
+# verbose on by default
+VERBOSE="v"
+
+# test once if sed supports -i (BSD/macOS does not)
+SED_HAS_I=$(sed --help 2>/dev/null | grep '\-i' 2>/dev/null)
+
+# [sedi file expressions] runs 'sed -i expressions' on the specified file;
+# if '-i' is not supported, creates a temporary file and overwrites the
+# original, like '-i' does.
+sedi ()
+{
+  file="$1"
+  shift
+  if [ -n "$SED_HAS_I" ]; then
+    sed -i "$@" "$file"
+  else
+    # option '-i' is not recognized by sed: use a tmp file
+    new_temp=`mktemp /tmp/frama-c.XXXXXXX` || exit 1
+    sed "$@" "$file" > "$new_temp"
+    mv -f "$new_temp" "$file"
+  fi
+}
+
+dirs ()
+{
+  if [ -z "$DIR" ]; then
+    DIR=.
+  fi
+}
+
+# [safe_goto d1 d2 cmd] goes to d1, runs cmd, and returns to d2
+safe_goto ()
+{
+  dir="$1"
+  cd "$dir"
+  $3
+  cd "$2"
+}
+
+goto ()
+{
+  if [ -d "$1" ]; then
+    safe_goto "$1" "$2" "$3"
+  else
+    echo "Directory '$1' does not exist. Omitted."
+  fi
+}
+
+process_file ()
+{
+  file="$1"
+  if [ "$VERBOSE" ]; then
+    echo "Processing file $file"
+  fi
+  sedi "$file" \
+   -e 's/Cil\.Frama_c_builtins/Cil_builtins.Frama_c_builtins/g' \
+   -e 's/Cil\.is_builtin/Cil_builtins.is_builtin/g' \
+   -e 's/Cil\.is_unused_builtin/Cil_builtins.is_unused_builtin/g' \
+   -e 's/Cil\.is_special_builtin/Cil_builtins.is_special_builtin/g' \
+   -e 's/Cil\.add_special_builtin/Cil_builtins.add_special_builtin/g' \
+   -e 's/Cil\.add_special_builtin_family/Cil_builtins.add_special_builtin_family/g' \
+   -e 's/Cil\.init_builtins/Cil_builtins.init_builtins/g' \
+   -e 's/Cil\.Builtin_functions/Cil_builtins.Builtin_functions/g' \
+   -e 's/Cil\.builtinLoc/Cil_builtins.builtinLoc/g' \
+   -e 's/Extlib\.list_of_opt/Option.to_list/g' \
+   -e 's/Extlib\.opt_conv /Option.value ~default:/g' \
+   -e 's/Extlib\.may_map ~dft:\([^ ]*\) /Option.fold ~none:\1 ~some:/g' \
+   -e 's/Extlib\.may_map /Option.fold ~some:/g' \
+   -e 's/~dft:/~none:/g' \
+   -e 's/Extlib\.may /Option.iter /g' \
+   -e 's/Extlib\.opt_map/Option.map/g' \
+   -e 's/Extlib\.has_some/Option.is_some/g' \
+   -e 's/Extlib\.opt_bind/Option.bind/g' \
+   -e 's/Extlib\.the \([^~]\)/Option.get \1/g' \
+   -e 's/Extlib\.opt_equal/Option.equal/g' \
+   -e 's/Extlib\.opt_compare/Option.compare/g' \
+   -e 's/Extlib\.array_exists/Array.exists/g'
+}
+
+apply_one_dir ()
+{
+  if [ "$VERBOSE" ]; then
+    echo "Processing directory `pwd`"
+  fi
+  for f in $(find . -maxdepth 1 -type f -name "*.ml*" 2> /dev/null); do
+    process_file "$f"
+  done
+}
+
+apply_recursively ()
+{
+    apply_one_dir
+    while IFS= read -r -d $'\0' d; do
+        if [ "$d" = "." ]; then
+            continue
+        fi
+        safe_goto "$d" .. apply_recursively
+    done < <(find . -maxdepth 1 -type d -print0)
+}
+
+applying_to_list ()
+{
+  dirs
+  tmpdir=`pwd`
+  for d in $DIR; do
+    goto "$d" "$tmpdir" "$1"
+  done
+}
+
+help ()
+{
+  echo "Usage: $0 [options | directories]
+
+Options are:
+  -r | --recursive       Check subdirectories recursively
+  -h | --help            Display help message
+  -q | --quiet           Quiet mode (i.e. non-verbose mode)
+  -v | --verbose         Verbose mode (default)"
+  exit 0
+}
+
+error ()
+{
+  echo "$1.
+Do \"$0 -h\" for help."
+  exit 1
+}
+
+FN="apply_one_dir"
+
+parse_arg ()
+{
+  case $1 in
+    -r | --recursive)     FN="apply_recursively";;
+    -h | -help      )     help; exit 0;;
+    -q | --quiet    )     VERBOSE=;;
+    -v | --verbose  )     VERBOSE="v";;
+    -* )                  error "Invalid option $1";;
+    * )                   DIR="$DIR $1";;
+  esac
+}
+
+cmd_line ()
+{
+  for s in "$@"; do
+    parse_arg "$s"
+  done
+  applying_to_list $FN
+}
+
+cmd_line "$@"
+exit 0
diff --git a/bin/update_api_doc.sh b/bin/update_api_doc.sh
index 164a4d95714b6c60b04a6eeb9152d216d313255e..80313ff753fa109745439f24d9dd21e856834089 100755
--- a/bin/update_api_doc.sh
+++ b/bin/update_api_doc.sh
@@ -7,5 +7,5 @@ if test -z "$next"; then
   echo "\$ ./bin/update_api_doc.sh <NEXT>"
   echo "See the Release Management Documentation for an example."
 else
-  find src -name '*.ml*' -exec sed -i -e "s/Frama-C+dev/${next}/g" '{}' ';'
+  find src -name '*.ml*' -exec sed -i -e "s/Frama-C+dev/${next}/gI" '{}' ';'
 fi
diff --git a/devel_tools/docker/frama-c.18.0/Dockerfile b/devel_tools/docker/frama-c.18.0/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..d3582aa0d4361c90c73a31c39b5023c741386973
--- /dev/null
+++ b/devel_tools/docker/frama-c.18.0/Dockerfile
@@ -0,0 +1,63 @@
+FROM debian:buster 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.05.0 -y
+
+# "RUN eval $(opam env)" does not work, so we manually set its variables
+ENV OPAM_SWITCH_PREFIX "/root/.opam/ocaml-base-compiler.4.05.0"
+ENV CAML_LD_LIBRARY_PATH "/root/.opam/ocaml-base-compiler.4.05.0/lib/stublibs:/root/.opam/ocaml-base-compiler.4.05.0/lib/ocaml/stublibs:/root/.opam/ocaml-base-compiler.4.05.0/lib/ocaml"
+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 && opam install depext -y
+
+# Install packages from reference configuration
+RUN apt-get update && opam update -y && opam depext --install -y --verbose \
+    alt-ergo.1.30 \
+    apron.20160125 \
+    conf-graphviz.0.1 \
+    mlgmpidl.1.2.7 \
+    ocamlfind.1.8.0 \
+    ocamlgraph.1.8.8 \
+    why3.0.88.3 \
+    yojson.1.4.1 \
+    zarith.1.7 \
+    && rm -rf /var/lib/apt/lists/*
+
+RUN why3 config --detect-provers
+
+# with_source: keep Frama-C sources
+ARG with_source=no
+
+RUN cd /root && \
+    wget http://frama-c.com/download/frama-c-18.0-Argon.tar.gz && \
+    tar xvf frama-c-*.tar.gz && \
+    (cd frama-c-* && \
+        ./configure --disable-gui && \
+        make -j && \
+        make install \
+    ) && \
+    rm -f frama-c-*.tar.gz && \
+    [ "${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.19.1/Dockerfile b/devel_tools/docker/frama-c.19.1/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..b3c7d6d97ece64c7186580f0c5937066179943a8
--- /dev/null
+++ b/devel_tools/docker/frama-c.19.1/Dockerfile
@@ -0,0 +1,63 @@
+FROM debian:buster 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.05.0 -y
+
+# "RUN eval $(opam env)" does not work, so we manually set its variables
+ENV OPAM_SWITCH_PREFIX "/root/.opam/ocaml-base-compiler.4.05.0"
+ENV CAML_LD_LIBRARY_PATH "/root/.opam/ocaml-base-compiler.4.05.0/lib/stublibs:/root/.opam/ocaml-base-compiler.4.05.0/lib/ocaml/stublibs:/root/.opam/ocaml-base-compiler.4.05.0/lib/ocaml"
+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 && opam install depext -y
+
+# Install packages from reference configuration
+RUN apt-get update && opam update -y && opam depext --install -y --verbose \
+    alt-ergo-free.2.0.0 \
+    apron.20160125 \
+    conf-graphviz.0.1 \
+    mlgmpidl.1.2.9 \
+    ocamlfind.1.8.0 \
+    ocamlgraph.1.8.8 \
+    why3.1.2.0 \
+    yojson.1.4.1 \
+    zarith.1.7 \
+    && rm -rf /var/lib/apt/lists/*
+
+RUN why3 config --detect-provers
+
+# with_source: keep Frama-C sources
+ARG with_source=no
+
+RUN cd /root && \
+    wget http://frama-c.com/download/frama-c-19.1-Potassium.tar.gz && \
+    tar xvf frama-c-*.tar.gz && \
+    (cd frama-c-* && \
+        ./configure --disable-gui && \
+        make -j && \
+        make install \
+    ) && \
+    rm -f frama-c-*.tar.gz && \
+    [ "${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.20.0/Dockerfile b/devel_tools/docker/frama-c.20.0/Dockerfile
index 2d818583f3db34bbf17cbdbf387b751cedf7f35f..4f4927b98e810437cfb460d79b96f575775e6a3d 100644
--- a/devel_tools/docker/frama-c.20.0/Dockerfile
+++ b/devel_tools/docker/frama-c.20.0/Dockerfile
@@ -1,4 +1,4 @@
-FROM debian:sid as base
+FROM debian:buster as base
 
 # Install non-OCaml dependencies + opam
 RUN apt-get update && apt-get install -y \
@@ -58,7 +58,6 @@ RUN if [ "${with_test}" != "no" ]; then \
            conf-time.1 \
            --verbose \
         && \
-        apt-get install python -y && \
         rm -rf /var/lib/apt/lists/* && \
         cd /root/frama-c-* && \
         make tests; \
diff --git a/devel_tools/docker/frama-c.21.0/Dockerfile b/devel_tools/docker/frama-c.21.0/Dockerfile
index 131400581b5a4e349737d245f68ef366237fd89e..443601c70b177f1768639d02c9148d8f6a477eab 100644
--- a/devel_tools/docker/frama-c.21.0/Dockerfile
+++ b/devel_tools/docker/frama-c.21.0/Dockerfile
@@ -1,4 +1,4 @@
-FROM debian:sid as base
+FROM debian:buster as base
 
 # Install non-OCaml dependencies + opam
 RUN apt-get update && apt-get install -y \
diff --git a/devel_tools/docker/frama-c.21.1/Dockerfile b/devel_tools/docker/frama-c.21.1/Dockerfile
index 661e982c76eec496bf58ae484f32f852a7ef4219..90a6e92fe6b801296c1f53d608aac5cd16a4171a 100644
--- a/devel_tools/docker/frama-c.21.1/Dockerfile
+++ b/devel_tools/docker/frama-c.21.1/Dockerfile
@@ -1,4 +1,4 @@
-FROM debian:sid as base
+FROM debian:buster as base
 
 # Install non-OCaml dependencies + opam
 RUN apt-get update && apt-get install -y \
diff --git a/devel_tools/docker/frama-c.22.0/Dockerfile b/devel_tools/docker/frama-c.22.0/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..d1e25df7a9d7df30b4b0cba10fccfc169a3dec7f
--- /dev/null
+++ b/devel_tools/docker/frama-c.22.0/Dockerfile
@@ -0,0 +1,66 @@
+FROM debian:buster 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
+# Note: Python and time packages are only required for tests, but if so,
+# they need to be present before running './configure'
+RUN apt-get update && opam update -y && opam depext --install -y --verbose \
+    alt-ergo.2.2.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.3 \
+    yojson.1.7.0 \
+    zarith.1.9.1 \
+    zmq.5.1.3 \
+    conf-python-3.1.0.0 \
+    conf-time.1 \
+    && rm -rf /var/lib/apt/lists/*
+
+RUN why3 config --detect
+
+# with_source: keep Frama-C sources
+ARG with_source=no
+
+RUN cd /root && \
+    wget http://frama-c.com/download/frama-c-22.0-Titanium.tar.gz && \
+    tar xvf frama-c-*.tar.gz && \
+    (cd frama-c-* && \
+        ./configure --disable-gui && \
+        make -j && \
+        make install \
+    ) && \
+    rm -f frama-c-*.tar.gz && \
+    ([ "${with_source}" != "no" ] || rm -rf frama-c-*)
+
+# with_test: run Frama-C tests; requires "with_source=yes"
+ARG with_test=no
+
+# run general tests, then test that WP can see external provers
+RUN if [ "${with_test}" != "no" ]; then \
+        cd /root/frama-c-* && \
+        make tests PTESTS_OPTS=-error-code && \
+        (cd src/plugins/wp/tests/ && \
+         frama-c -wp wp_gallery/binary-multiplication-without-overflow.c \
+         -wp-prover alt-ergo,cvc4); \
+    fi
diff --git a/devel_tools/docker/frama-c.custom/Dockerfile b/devel_tools/docker/frama-c.custom/Dockerfile
index c742082bbd45bb69371125d868de56357da68e84..4eb330c4d69c7dfb1134868b877f2d761193a77c 100644
--- a/devel_tools/docker/frama-c.custom/Dockerfile
+++ b/devel_tools/docker/frama-c.custom/Dockerfile
@@ -2,7 +2,6 @@ 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/*
@@ -19,21 +18,30 @@ 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
+# Note: Python and time packages are only required for tests, but if so,
+# they need to be present before running './configure'
 RUN apt-get update && opam update -y && opam depext --install -y --verbose \
-    alt-ergo.2.0.0 \
+    alt-ergo.2.2.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 \
+    why3.1.3.3 \
     yojson.1.7.0 \
     zarith.1.9.1 \
     zmq.5.1.3 \
+    conf-python-3.1.0.0 \
+    conf-time.1 \
     && rm -rf /var/lib/apt/lists/*
 
-RUN why3 config --full-config
+# Note: Debian's CVC is too recent for Why3, so we do not install the Debian
+# package; instead, we download its binary and add it to a directory in PATH.
+RUN wget https://github.com/CVC4/CVC4/releases/download/1.7/cvc4-1.7-x86_64-linux-opt -O /usr/local/bin/cvc4
+RUN chmod a+x /usr/local/bin/cvc4
+
+RUN why3 config --detect
 
 # with_source: keep Frama-C sources
 ARG with_source=no
@@ -52,14 +60,11 @@ RUN cd /root && \
 # with_test: run Frama-C tests; requires "with_source=yes"
 ARG with_test=no
 
+# run general tests, then test that WP can see external provers
 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; \
+        make tests PTESTS_OPTS=-error-code && \
+        (cd src/plugins/wp/tests/ && \
+         frama-c -wp wp_gallery/binary-multiplication-without-overflow.c \
+         -wp-prover alt-ergo,cvc4); \
     fi
diff --git a/devel_tools/docker/frama-c.dev/Dockerfile b/devel_tools/docker/frama-c.dev/Dockerfile
index 67acc324b1438531ddb3f5e66a162f9004d8e6bf..bdd95a3d5de09857476f68b4fd01def1cdc6b9a2 100644
--- a/devel_tools/docker/frama-c.dev/Dockerfile
+++ b/devel_tools/docker/frama-c.dev/Dockerfile
@@ -2,7 +2,6 @@ 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/*
@@ -19,6 +18,8 @@ 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
+# Note: Python and time packages are only required for tests, but if so,
+# they need to be present before running './configure'
 RUN apt-get update && opam update -y && opam depext --install -y --verbose \
     alt-ergo.2.2.0 \
     apron.v0.9.12 \
@@ -31,8 +32,15 @@ RUN apt-get update && opam update -y && opam depext --install -y --verbose \
     yojson.1.7.0 \
     zarith.1.9.1 \
     zmq.5.1.3 \
+    conf-python-3.1.0.0 \
+    conf-time.1 \
     && rm -rf /var/lib/apt/lists/*
 
+# Note: Debian's CVC is too recent for Why3, so we do not install the Debian
+# package; instead, we download its binary and add it to a directory in PATH.
+RUN wget https://github.com/CVC4/CVC4/releases/download/1.7/cvc4-1.7-x86_64-linux-opt -O /usr/local/bin/cvc4
+RUN chmod a+x /usr/local/bin/cvc4
+
 RUN why3 config --detect
 
 # with_source: keep Frama-C sources
@@ -45,22 +53,15 @@ RUN cd /root && \
         make -j && \
         make install \
     ) && \
-    [ "${with_source}" != "no" ] || rm -rf frama-c
+    ([ "${with_source}" != "no" ] || rm -rf frama-c)
 
 # with_test: run Frama-C tests; requires "with_source=yes"
 ARG with_test=no
 
 # run general tests, then test that WP can see external provers
 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 && \
+        make tests PTESTS_OPTS=-error-code && \
         (cd src/plugins/wp/tests/ && \
          frama-c -wp wp_gallery/binary-multiplication-without-overflow.c \
          -wp-prover alt-ergo,cvc4); \
diff --git a/devel_tools/git-hooks/pre-commit b/devel_tools/git-hooks/pre-commit
index d444779a23156ab969227415792b622e0c9766a1..fec935b5fc0ca5d771f4b43bbd2a137789f76287 100755
--- a/devel_tools/git-hooks/pre-commit
+++ b/devel_tools/git-hooks/pre-commit
@@ -17,6 +17,6 @@ else
 fi
 
 MANUAL_ML_FILES=\
-$(git diff-index --name-only $against | \
+$(git diff-index --name-only --diff-filter d $against | \
     grep -e '^src/.*\.mli\?$' | tr '\n' ' ') \
 make ${MAKELEVEL} lint
diff --git a/doc/MakeLaTeXModern b/doc/MakeLaTeXModern
index d1b204a14b1ea83265f8686f43d31cfa3f116629..71107267b78246501afda730da7418313338c647 100644
--- a/doc/MakeLaTeXModern
+++ b/doc/MakeLaTeXModern
@@ -1,24 +1,31 @@
-FRAMAC_MODERN=frama-c-book.cls frama-c-cover.pdf frama-c-left.pdf frama-c-right.pdf
+FRAMAC_DOC_ROOT_DIR?=..
+FRAMAC_MODERN=frama-c-book.cls frama-c-cover.pdf frama-c-left.pdf frama-c-right.pdf frama-c-affiliation.tex
 
-frama-c-book.cls: ../frama-c-book.cls
+frama-c-book.cls: $(FRAMAC_DOC_ROOT_DIR)/frama-c-book.cls
 	@rm -f $@
 	@cp $< .
 	@chmod a-w $@
 	@echo "import $<"
 
-frama-c-cover.pdf: ../frama-c-cover.pdf
+frama-c-cover.pdf: $(FRAMAC_DOC_ROOT_DIR)/frama-c-cover.pdf
 	@rm -f $@
 	@cp $< .
 	@chmod a-w $@
 	@echo "import $<"
 
-frama-c-right.pdf: ../frama-c-right.pdf
+frama-c-right.pdf: $(FRAMAC_DOC_ROOT_DIR)/frama-c-right.pdf
 	@rm -f $@
 	@cp $< .
 	@chmod a-w $@
 	@echo "import $<"
 
-frama-c-left.pdf: ../frama-c-left.pdf
+frama-c-left.pdf: $(FRAMAC_DOC_ROOT_DIR)/frama-c-left.pdf
+	@rm -f $@
+	@cp $< .
+	@chmod a-w $@
+	@echo "import $<"
+
+frama-c-affiliation.tex: $(FRAMAC_DOC_ROOT_DIR)/frama-c-affiliation.tex
 	@rm -f $@
 	@cp $< .
 	@chmod a-w $@
diff --git a/doc/aorai/Makefile b/doc/aorai/Makefile
index 64dd2da0479967a0679830c4985166a1959610db..515b0938ec06b9de1bd34f5ad8c4e9f97b161cca 100644
--- a/doc/aorai/Makefile
+++ b/doc/aorai/Makefile
@@ -8,7 +8,7 @@ EXAMPLES=example.c example.ltl example.ya \
          example_loop2.c example_loop2.ya \
          README
 
-BNF=basic_ya.bnf extended_ya.bnf
+BNF=ya_file.bnf basic_ya.bnf extended_ya.bnf ya_variables.bnf
 
 all: main.pdf $(ARCHIVENAME).tgz
 
diff --git a/doc/aorai/basic_ya.bnf b/doc/aorai/basic_ya.bnf
index 21b3cc3a25c58b3a069538552dd1d7077f6dfdb3..9da28d4afa31e5b6a7be47300ffcf17451f45faa 100644
--- a/doc/aorai/basic_ya.bnf
+++ b/doc/aorai/basic_ya.bnf
@@ -6,7 +6,7 @@ condition ::= 'CALL''('id')' | 'RETURN''('id')' ;
       | condition '||' condition ;
       | '(' condition ')' | relation
 \\
-relation ::= expr relop expr | expr;
+relation ::= expr relop expr;
 \\
 relop ::= '<' | '<=' | '==' | '!=' | '>=' | '>' 
 \\
@@ -19,4 +19,4 @@ cst ::= integer;
 lval ::= id'('')''.'id | id'('')''.''\result' | id ;
       | lval'.'id | lval'->'id ;
       | lval'['expr']' | '*'lval
-\end{syntax}
\ No newline at end of file
+\end{syntax}
diff --git a/doc/aorai/extended_ya.bnf b/doc/aorai/extended_ya.bnf
index 14492022ac0f8486df07617d767f4378f3ee12b7..544d7077f669e8fdf95eb6f97fc60724f007f3f2 100644
--- a/doc/aorai/extended_ya.bnf
+++ b/doc/aorai/extended_ya.bnf
@@ -1,9 +1,10 @@
 \begin{syntax}
 guard ::= seq-elt
 \\
-seq-elt ::= basic-elt repetition
+seq-elt ::= condition
+         |  basic-elt repetition
 \\
-basic-elt ::= condition | '[' non-empty-seq ']' 
+basic-elt ::= '[' non-empty-seq ']' 
            | id pre-cond '(' seq ')' post-cond
 \\
 seq ::= epsilon | non-empty-seq
@@ -17,4 +18,4 @@ repetition ::= epsilon | '+' | '*' | '?';
 pre-cond ::= epsilon | '::' id | '{{' condition '}}'
 \\
 post-cond ::= epsilon | '{{' condition '}}';
-\end{syntax}
\ No newline at end of file
+\end{syntax}
diff --git a/doc/aorai/main.tex b/doc/aorai/main.tex
index 85c46c98adfde48955bbbde37718555a928377b5..dd5b5a23d78f059b1482471f9d6ea2cb1a2614ac 100644
--- a/doc/aorai/main.tex
+++ b/doc/aorai/main.tex
@@ -14,7 +14,7 @@
 \definecolor{gris}{rgb}{0.95,0.95,0.95}
 \definecolor{GrisClair}{rgb}{0.98,0.98,0.98}
 \usepackage[leftbars]{changebar}
-
+\usepackage{courier}
 \input{macros}
 
 %\setboolean{extension}{true}
@@ -36,12 +36,16 @@
 }
 
 \lstdefinelanguage{ya}{
-  alsoletter={\\,\%},
-  morekeywords={CALL,RETURN,COR,return,true,false,transitions,\\result},
+  alsoletter={\\,\%,\$},
+  morekeywords={CALL,RETURN,COR,return,true,false,transitions,\\result,other},
   keywordsprefix={\%},
 }
 
-\lstloadlanguages{[ANSI]C,[Objective]Caml,csh,ACSL}
+\lstloadlanguages{[ANSI]C,[Objective]Caml,csh,ACSL,ya}
+\lstset{
+basicstyle=\ttfamily,
+keywordstyle=\bfseries,
+}
 
 \title{\aorai\ Plugin Tutorial\\\textit{\normalsize (A.k.a. LTL to ACSL)}}
 \author{Nicolas Stouls and Virgile Prevosto\\
@@ -332,35 +336,27 @@ For compatibility reasons, other syntaxes, like LTL or PROMELA, are supported.
 
 \section{YA}
 \label{sec:ya}
+\lstset{language=ya}
 \subsection{YA file}\label{sec:ya-file}
-The description of the automaton can be done in more than one way, but we
-recommend to follow the guidelines explained below:
-\begin{itemize}
-\item Initial states of automaton are specified using the
-\emph{\%init} keyword followed by a comma-separated list
-containing the states' name:
-\begin{lstlisting}[language=ya]
-%init: S1, S2, ..., Sn;
-\end{lstlisting}
-\item Acceptance states are specified using the \emph{\%accept} keyword 
-followed by a comma separated list containing the states' name
-\begin{lstlisting}[language=ya]
-%accept: S1, S2, ..., Sn;
-\end{lstlisting}
-\begin{new}
-\item Reject states are specified using the \emph{\%reject} keyword,
-followed by a comma separated list containing the states' name
-\begin{lstlisting}[language=ya]
-%reject: S1, S2, ..., Sn;
-\end{lstlisting}
-\end{new}
-\item If the automaton is supposed to be deterministic, this can be 
-      specified using the following directive:
-\begin{lstlisting}[language=ya]
-%deterministic;
-\end{lstlisting}
+A YA file follows the grammar described in Fig.~\ref{ya-file}.
+\begin{figure}[htb]
+\input{ya_file.tex}
+\caption{Structure of a YA file}\label{ya-file}
+\end{figure}
+The directives specify the initial and accepting state(s). There must be at
+least one initial state (exactly one if the automaton is supposed to be
+deterministic. All initial and accepting state must appear in the list of
+states afterwards.
+
+A state is simply described by its name and the list of transitions
+starting from this state with their guard. The specific \lstinline|other|
+guard indicates that this transition is taken if none of the other ones
+can be taken. If it appears, it must be last in the list of transitions.
+
+Conditions that can occur in guards are described in the next section.
+
 \begin{new}
-\item By default, \aorai considers that all functions calls and returns trigger
+By default, \aorai considers that all functions calls and returns trigger
 a transition of the automaton. In order to have transitions only for the 
 functions that explicitly appear in the description of the automaton, the
 following directive must be used:
@@ -368,26 +364,6 @@ following directive must be used:
 %explicit transitions;
 \end{lstlisting}
 \end{new}
-\item States and transitions are described by sets of the following form
-\begin{lstlisting}[language=ya]
-  state: { condition_1 } -> new_state_1
-       | { condition_2 } -> new_state_2
-       | { condition_n } -> new_state_n
-       ;
-\end{lstlisting}
-A condition which is always true can be omitted along with its surrounding
-braces:
-\begin{lstlisting}
- state: -> new_state;
-\end{lstlisting}
-In addition, the last transition can have the following form:
-\begin{lstlisting}
- state: ...
-      other -> new_state
-\end{lstlisting}
-indicating that this transition is crossed if and only if none of the
-preceding transitions is activated.
-\end{itemize}
 
 \subsection{Basic YA guards}\label{sec:basic-ya-guards}
 The syntax for basic YA conditions is described in
@@ -491,7 +467,7 @@ most common patterns:
 \item \lstinline|{,e}| is equivalent to \lstinline|{0,e}|
 \end{itemize}
 
-Note that a repetition modifier that allows to have a non-fixed number of
+Note that a repetition modifier that allows a non-fixed number of
 repetitions prevents the automaton to be \lstinline|%deterministic|.
 
 \lstinline|id(seq)| indicates that we have a \lstinline|CALL(id)| event,
@@ -531,36 +507,72 @@ S0: { main::bhv() } -> Sf
 Sf: -> Sf;
 \end{lstlisting}
 
-\begin{new}
-\subsubsection{Sharing values}
+\subsubsection{YA variables}
 Extended guards do not allow to specify relations between the parameters of
-distinct, non-nested calls. For instance, we cannot specify that a call to
-\texttt{fopen(f)} must be followed by a call to \texttt{fclose(f)} with the same
-\texttt{f} in both cases. In order to do that, it is possible to parameterize
-the description of the automaton by directives of the following form:
-\begin{lstlisting}[language=ya]
-%parameter: decl;
-\end{lstlisting}
-where \texttt{decl} is an ACSL declaration. The parameter declared that way will
-be treated as an existentially-quantified variable across the automaton.
-For instance, in order to check whether a call to \texttt{fopen} is always
-matched by a call to \texttt{fclose}, we can use the following automaton:
+distinct, non-nested calls. In order to be more flexible, it is possible to declare
+variables in a Ya file, to assign them values when crossing a transition, and to use
+them in guards. The syntax for that is described in Fig.~\ref{fig:ya-variables}.
+\begin{figure}[htb]
+\input{ya_variables.tex}
+\caption{Syntax for declaring and using YA variables}
+\label{fig:ya-variables}
+\end{figure}
+
+Only \lstinline|char|, \lstinline|int|, \lstinline|long| variables are currently
+supported. Furthermore, variables can only be introduced in deterministic automata,
+which do not use extended guards.
+
+A variable \lstinline|$x| %$
+must have been declared in the directives of the file to be used in a guard. Furthermore
+if it is used in a transition starting from state \lstinline|S|, then all possible paths
+from the initial state to \lstinline|S| must contain at least one assignment to \lstinline|$x|.
+Note that assignments are performed sequentially, so that if
+\lstinline|$x| has already been assigned in a given sequence of actions, it can automatically
+be used in subsequent assignments (on the other hand, since conditions are evaluated
+before actions, it must have been initialized elsewhere if it were to be used in the
+condition part of the guard.
+
+in the right hand side of an action, it is possible to refer to the value of a formal
+parameter of \lstinline|f| when the transition is triggered over a \lstinline|CALL|
+to \lstinline|f| and to its return value when hangling a \lstinline|RETURN| event,
+as described in section~\ref{sec:basic-ya-guards} for conditions.
+
+An example of YA automaton with variables is given below. It uses variables \lstinline|$x| and
+\lstinline|$y| that are updated when calling \lstinline|f| and returning from \lstinline|i|,
+while \lstinline|$x| is used when calling \lstinline|h|.%$
 
 \begin{lstlisting}[language=ya]
-%init: S0;
-%accept: Sf;
-%reject: S1;
-%parameter: FILE* f;
-%explicit transitions;
+%init:		a;
+%accept:	i;
+%deterministic;
+
+$x : int;
+$y : int;
 
-S0: { fopen(){\result==f}; } -> S1;
-  | -> S0;
+a : { CALL(main) } -> b;
 
-S1: { fclose{stream==f}(); } -> Sf
+b :
+  { CALL(f) } $x:=f().x; $y := $x; -> c
+| { CALL(g) } -> d
+;
 
-Sf: -> Sf
+c : { RETURN(f) } -> e;
+
+d : { RETURN(g) } -> g;
+
+e :
+  { CALL(h) && $x > 0 } -> f
+| { RETURN(main) } -> i
+;
+
+f : { RETURN(h) } -> g;
+
+g : { CALL(i) } -> h;
+
+h : { RETURN(i) } $y := 0; $x := 1; -> e;
+
+i : -> i;
 \end{lstlisting}
-\end{new}
 
 \section{LTL}
 \label{sec:ltl}
@@ -1225,6 +1237,16 @@ The plug-in is composed of three parts:
 
 
 \section{Recent updates}
+\subsection{Frama-C+dev}
+\begin{itemize}
+\item update syntax for YA sequence to avoid ambiguities with
+ \texttt{+} and \texttt{*} repetition operators
+\end{itemize}
+\subsection{Frama-C Titanium}
+\begin{itemize}
+\item Various bug fixes
+\item Introduction of YA variables
+\end{itemize}
 \subsection{Frama-C Aluminium}
 \begin{itemize}
 \item Generated functions now have a body in addition to a specification
diff --git a/doc/aorai/transf.mll b/doc/aorai/transf.mll
index 475b11df4f16554aa2b58e396ea391aa2295a336..b063bc1459d07b1f8894465de6deb1f73a17ec2d 100644
--- a/doc/aorai/transf.mll
+++ b/doc/aorai/transf.mll
@@ -17,9 +17,10 @@
 
   let make_keyword () =
     let keyword = Buffer.contents full_kw in
+    let sep = if String.contains keyword '$' then '|' else '$' in
     print_string "\\addspace";
     Printf.printf
-      "\\lstinline$%s$" keyword;
+      "\\lstinline%c%s%c" sep keyword sep;
     print_string "\\spacetrue";
     Buffer.clear full_kw
 }
diff --git a/doc/aorai/ya_file.bnf b/doc/aorai/ya_file.bnf
new file mode 100644
index 0000000000000000000000000000000000000000..fccc7ad491d8998b546912be74f24e51799979d9
--- /dev/null
+++ b/doc/aorai/ya_file.bnf
@@ -0,0 +1,16 @@
+\begin{syntax}
+file ::= directive* state+;
+\\
+directive ::= '%init' ':' id+ ';'; name of initial state(s)
+  | '%accept' ':' id+ ';'; name of accepting state(s)
+  | '%deterministic' ';' ; deterministic automaton
+\\
+state ::= id ':' transition;
+          ('|' transition)* ';'; state name and transitions from state
+\\
+transition ::= guard '->' id; guard and end state of the transition
+            |  '->' id; transition that is always taken
+            | 'other' '->' id; default transition. must appear last
+\\
+guard ::= '{' condition '}'
+\end{syntax}
diff --git a/doc/aorai/ya_variables.bnf b/doc/aorai/ya_variables.bnf
new file mode 100644
index 0000000000000000000000000000000000000000..866fa127a0deb1230e807243b1de70d1f1b4bcfc
--- /dev/null
+++ b/doc/aorai/ya_variables.bnf
@@ -0,0 +1,11 @@
+\begin{syntax}
+directive ::= ... | '$' id ':' type
+\\
+type::= 'char' | 'int' | 'long'
+\\
+guard ::= '{' condition '}' action*
+\\
+action ::= '$' id ':=' lval ';'
+\\
+lval ::= ... | '$'id
+\end{syntax}
diff --git a/doc/build-manuals.sh b/doc/build-manuals.sh
index 725ae1c670b36d9f33b091d199cb851cfd55c332..353f2a43d2922800c2c49054163491b92f712242 100755
--- a/doc/build-manuals.sh
+++ b/doc/build-manuals.sh
@@ -39,14 +39,20 @@ fi
 build () {
 
     echo "##### Building $1"
-    make -C $(dirname $1) $(basename $1) || \
-         (echo "######### $1 failed" ; exit 1)
-    echo "##### $1 done"
+    set +e
+    make -C $(dirname $1) $(basename $1)
+    ret=$?
+    if [ $ret -eq 0 ]; then
+        echo "##### $1 done"
+    else
+        echo "######### $1 failed"
+        exit 1
+    fi
     # extract extension, add suffix, re-append extension
     MANUAL=${2%.*}-$3.${2##*.}
     cp -f $1 manuals/$MANUAL
     echo "##### $MANUAL copied"
-    ln -srf manuals/$MANUAL manuals/$2
+    
 }
 
 EACSL_DOC=../src/plugins/e-acsl/doc
diff --git a/doc/code/style.css b/doc/code/style.css
index 01d4b3f65529a76b83755e01adacb1a47b1f99bd..ad650ef54ef6ce3eb1506bb411d42ec244436726 100644
--- a/doc/code/style.css
+++ b/doc/code/style.css
@@ -161,4 +161,4 @@ div.sig_block {margin-left: 2em}
 li { margin-left: 2em }
 .copyright { margin-top: 5mm; font-size:10px; padding-top: 2mm; border-top: thin solid #404040; }
 .copyright a:visited { color:darkred }
-.copyright a:link { color:darkred }
\ No newline at end of file
+.copyright a:link { color:darkred }
diff --git a/doc/developer/.gitignore b/doc/developer/.gitignore
index 467e4f7ba1e8c3035d4eb5cb489cf74b3cacbbae..a8469496d265792a2f0949dad390b0c1dc398303 100644
--- a/doc/developer/.gitignore
+++ b/doc/developer/.gitignore
@@ -3,6 +3,7 @@
 /frama-c-cover.pdf
 /frama-c-left.pdf
 /frama-c-right.pdf
+/frama-c-affiliation.tex
 /hello_world/
 /tutorial/viewcfg/generated/
 /tutorial/hello/generated/
diff --git a/doc/developer/advance.tex b/doc/developer/advance.tex
index ec3495ce12299cdb96f841ccb62814c8e44611b2..46a1057737aee0784ef9a33be4713f9d08b46553 100644
--- a/doc/developer/advance.tex
+++ b/doc/developer/advance.tex
@@ -494,12 +494,10 @@ Section~\ref{tut2:hello}). Each variable set in this example has to be set
 by any plug-in.
 \codeidx{Makefile.dynamic}
 \codeidx{FRAMAC\_SHARE}
-\codeidx{FRAMAC\_LIBDIR}
 \codeidx{PLUGIN\_CMO}
 \codeidx{PLUGIN\_NAME}
 \makefileinput{./tutorial/hello/generated/makefile_multiple/Makefile}
-\texttt{FRAMAC\_SHARE} must be set to the \framac share directory while
-\texttt{FRAMAC\_LIBDIR} must be set to the \framac lib directory.
+\texttt{FRAMAC\_SHARE} must be set to the \framac share directory.
 \texttt{PLUGIN\_NAME} is the capitalized name of your plug-in while
 \texttt{PLUGIN\_CMO} is the list of the files $.cmo$ generated from your \caml
 sources.
@@ -596,18 +594,19 @@ otherwise.
 
 \codeidx{clean-install}
 \codeidx{install}
-In addition, if a plug-in wishes to install custom files to
-\texttt{FRAMAC\_LIBDIR} through the \texttt{install::} target,
-this target must depend on \texttt{clean-install}. 
-Indeed, \framac's main \texttt{Makefile} removes
-all existing files in this directory before performing a fresh installation,
-in order to avoid potential interference with an obsolete (and usually
-incompatible) module from a previous installation. Adding the dependency thus
-ensures that the removal will take place before any new file has been installed
-in the directory.
-
-\begin{example} If a plug-in wants to install \texttt{external/my\_lib.cm*}
-in addition to the normal plugin files, it should use the following code:
+In addition, if a plug-in wishes to install custom files through the
+\texttt{install::} target, this target must depend on \texttt{clean-install}.
+Indeed, \framac's main \texttt{Makefile} needs to remove all existing files
+before performing a fresh installation, in order to avoid potential interference
+with an obsolete (and usually incompatible) module from a previous installation.
+Adding the dependency thus ensures that the removal will take place before any
+new file has been installed.
+
+\begin{example} If a plug-in wants to install \texttt{external/my\_lib.cm*} in
+  addition to the normal plugin files, it should use the following code:
+  \footnote{Note that the variable \texttt{FRAMAC\_LIBDIR} is automatically set
+    in the \framac \texttt{Makefile} to the value provided by the command
+    \texttt{frama-c-config -print-libpath}.\codeidx{FRAMAC\_LIBDIR}}
 \begin{makefilecode}
 install:: clean-install
         $(PRINT_INSTALL) "My beautiful library"
@@ -1072,8 +1071,8 @@ the sequence above is read in order and defines a configuration level
   \texttt{CMD}\nscodeidx{Test!Directive}{CMD} is the last
   \texttt{CMD} directive of the preceding configuration level.
 \item \texttt{LOG} adds a file to be compared against an oracle in the
-  next \texttt{OPT} directive. Several files can be monitored from a single
-  \texttt{OPT} directive, through several \texttt{LOG} directives. 
+  next \texttt{OPT} or \texttt{STDOPT} directive. Several files can be monitored from a single
+  \texttt{OPT}/\texttt{STDOPT} directive, through several \texttt{LOG} directives. 
   These files must be generated in the result
   directory of the corresponding suite (and potentially alternative
   configuration).
@@ -3257,7 +3256,7 @@ their execution order.
   plug-in are determined during this stage.
 
 \item \textbf{The Exiting Stage:} this step is reserved for commands
-  that makes \framac exit before starting any analysis at all, such as
+  that make \framac exit before starting any analysis at all, such as
   printing help information:
   \begin{enumerate}[(a)]
 
@@ -3312,7 +3311,7 @@ their execution order.
   \begin{enumerate}[(a)]
   \item first, the command line options registered for the
     \texttt{Cmdline.Configuring}\sscodeidxdef{Cmdline}{stage}{Configuring} stage
-    are treated. Command line parameters that do not begin by an hyphen
+    are treated. Command line parameters that do not begin by a hyphen
     (character \texttt{'-'}) are \emph{not} options and are treated as
     \textsf{C} files. Thus they are added to the list of files to be
     preprocessed or parsed for building the \texttt{AST} (on demand);
@@ -3326,7 +3325,7 @@ their execution order.
   according to those indicated on the command line. More precisely:
 
   \begin{enumerate}[(a)]
-  \item first, each argument of the command line which does not begin by an
+  \item first, each argument of the command line which does not begin by a
     hyphen (character \texttt{'-'}) is registered for later analysis;
   \item then, the hooks registered through
     \texttt{Cmdline.run\_after\_setting\_files}
@@ -3900,7 +3899,6 @@ division in the program, stating that the divisor is not zero:
 \sscodeidx{Cil\_types}{binop}{Mod}
 \scodeidx{Logic\_utils}{expr\_to\_term}
 \scodeidx{Logic\_const}{prel}
-\scodeidx{Extlib}{the}
 \sscodeidx{Cil}{cilVisitor}{get\_filling\_actions}
 \sscodeidx{Cil}{visitAction}{DoChildren}
 \scodeidx{File}{create\_project\_from\_visitor}
diff --git a/doc/developer/changes.tex b/doc/developer/changes.tex
index 2230467a8ad62f1b5512330c647279b02c6a2b70..66ae55f2ea703e44e2d8a4e80ab62421c1b997ce 100644
--- a/doc/developer/changes.tex
+++ b/doc/developer/changes.tex
@@ -5,7 +5,7 @@
 This chapter summarizes the major changes in this documentation between each
 \framac release, from newest to oldest.
 
-\section*{Frama-C+dev}
+\section*{22.0 Titanium}
 \begin{itemize}
 \item \textbf{Testing}: Document new directives \texttt{TIMEOUT} and
 \texttt{NOFRAMAC}
diff --git a/doc/developer/developer.tex b/doc/developer/developer.tex
index a8551f1f9cba789e688fbcb579b579f7bec66fbf..bfbcff35c7c874f3c1f4c29b8f560be6bd19c43f 100644
--- a/doc/developer/developer.tex
+++ b/doc/developer/developer.tex
@@ -29,6 +29,7 @@
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 \input{./macros.sty}
+\input{./frama-c-affiliation.tex}
 \makeindex
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -47,7 +48,7 @@
 \author{Julien~Signoles with Thibaud~Antignac, Loïc~Correnson, Matthieu~Lemerre
 and Virgile~Prevosto}
 \begin{center}
-CEA LIST, Software Security Laboratory, Saclay,F-91191
+  \fcaffiliationen
 \end{center}
 \vfill
 \begin{flushleft}
diff --git a/doc/developer/examples/syntactic_check.ml b/doc/developer/examples/syntactic_check.ml
index 74c141bde198eb34d54e978d903d87f3237b3746..f99b0921fc07f060eabba009751658119adab29b 100644
--- a/doc/developer/examples/syntactic_check.ml
+++ b/doc/developer/examples/syntactic_check.ml
@@ -43,7 +43,7 @@ class non_zero_divisor prj = object (self)
       | Kglobal -> assert false
       | Kstmt s -> s
     in
-    let kf = Extlib.the self#current_kf in
+    let kf = Option.get self#current_kf in
     (* The above statement and function are related to the original project. We
        need to attach the new assertion to the corresponding statement and
        function of the new project. Cil provides functions to convert a
diff --git a/doc/developer/hello_world/Makefile b/doc/developer/hello_world/Makefile
index ba65abf50aa48da55aac2ab8cf613c3c51989eab..47732363b835d3e3e579a6d5227467d31b4f2377 100644
--- a/doc/developer/hello_world/Makefile
+++ b/doc/developer/hello_world/Makefile
@@ -18,7 +18,6 @@
 # before any use of this makefile
 
 FRAMAC_SHARE  	:=$(shell frama-c-config -print-share-path)
-FRAMAC_LIBDIR 	:=$(shell frama-c-config -print-libpath)
 PLUGIN_NAME	= Hello
 PLUGIN_CMO	= hello_world
 include $(FRAMAC_SHARE)/Makefile.dynamic
diff --git a/doc/developer/tutorial.tex b/doc/developer/tutorial.tex
index 41f0ab59f75a21fd766ae41311100626c8a40d89..fa627601a68dcf5bf21d649ff493b4f1000290ff 100644
--- a/doc/developer/tutorial.tex
+++ b/doc/developer/tutorial.tex
@@ -409,7 +409,6 @@ We write a simple \texttt{./Makefile} for our
 \listingname{./Makefile}
 \codeidx{Makefile.dynamic}
 \codeidx{FRAMAC\_SHARE}
-\codeidx{FRAMAC\_LIBDIR}
 \codeidx{PLUGIN\_CMO}
 \codeidx{PLUGIN\_NAME}
 \makefileinput{./tutorial/hello/generated/makefile_single/Makefile}
@@ -447,9 +446,9 @@ compiled files are copied into a \texttt{top} (for {\em top-level}) subdirectory
 The module can then be loaded and executed by using
 \texttt{frama-c -load-module top/Hello}.
 
-Then run \texttt{make install} to install the plug-in (you need to
-have write access to the \texttt{\$(FRAMAC\_LIBDIR)/plugins}
-directory\codeidx{FRAMAC\_LIBDIR}).
+Then run \texttt{make install} to install the plug-in (you need to have write
+access to the \texttt{plugins} directory, located at the path given by the
+command \texttt{frama-c-config -print-libpath}).
 
 Just launch \texttt{frama-c} (without any option): the \texttt{Hello}
 plug-in is now always loaded, without the need to pass other options to
@@ -467,7 +466,6 @@ file names, in the correct \ocaml build order.
 \listingname{./Makefile}
 \codeidx{Makefile.dynamic}
 \codeidx{FRAMAC\_SHARE}
-\codeidx{FRAMAC\_LIBDIR}
 \codeidx{PLUGIN\_CMO}
 \codeidx{PLUGIN\_NAME}
 \makefileinput{./tutorial/hello/generated/makefile_multiple/Makefile}
@@ -517,7 +515,6 @@ subdirectory of \texttt{.tests/} where the plug-in's tests will be located:
 \listingname{./Makefile}
 \codeidx{Makefile.dynamic}
 \codeidx{FRAMAC\_SHARE}
-\codeidx{FRAMAC\_LIBDIR}
 \codeidx{PLUGIN\_CMO}
 \codeidx{PLUGIN\_NAME}
 \codeidx{PLUGIN\_TESTS\_DIRS}
@@ -1073,7 +1070,6 @@ configuration options.
 \listingname{Makefile}
 \codeidx{Makefile.dynamic}
 \codeidx{FRAMAC\_SHARE}
-\codeidx{FRAMAC\_LIBDIR}
 \codeidx{PLUGIN\_CMO}
 \codeidx{PLUGIN\_GUI\_CMO}
 \codeidx{PLUGIN\_NAME}
diff --git a/doc/developer/tutorial/hello/src/Makefile.multiple-files b/doc/developer/tutorial/hello/src/Makefile.multiple-files
index 494fc9521ce9966f01b81377159a66e1231fffa4..4e97b5ed2dddd86b660daadfbd6a5dd9c70232b4 100644
--- a/doc/developer/tutorial/hello/src/Makefile.multiple-files
+++ b/doc/developer/tutorial/hello/src/Makefile.multiple-files
@@ -1,5 +1,4 @@
 FRAMAC_SHARE := $(shell frama-c-config -print-share-path)
-FRAMAC_LIBDIR := $(shell frama-c-config -print-libpath)
 PLUGIN_NAME = Hello
 PLUGIN_CMO = hello_options hello_print hello_run
 include $(FRAMAC_SHARE)/Makefile.dynamic
diff --git a/doc/developer/tutorial/hello/src/Makefile.single-file b/doc/developer/tutorial/hello/src/Makefile.single-file
index 0f17e871c43a0bdfa3fd6cdc7b4d7e93a45eb259..9b1b558bcba37d7831e1fee860903bef0e7bef1d 100644
--- a/doc/developer/tutorial/hello/src/Makefile.single-file
+++ b/doc/developer/tutorial/hello/src/Makefile.single-file
@@ -1,5 +1,4 @@
 FRAMAC_SHARE := $(shell frama-c-config -print-share-path)
-FRAMAC_LIBDIR := $(shell frama-c-config -print-libpath)
 PLUGIN_NAME = Hello
 PLUGIN_CMO = hello_world
 include $(FRAMAC_SHARE)/Makefile.dynamic
diff --git a/doc/developer/tutorial/hello/src/Makefile.test b/doc/developer/tutorial/hello/src/Makefile.test
index 2c292d74734595910d4627a1ca90db7a924d3f96..2ab6fb6a70cbd4d1e697ebe0d65248dddc3028ab 100644
--- a/doc/developer/tutorial/hello/src/Makefile.test
+++ b/doc/developer/tutorial/hello/src/Makefile.test
@@ -1,5 +1,4 @@
 FRAMAC_SHARE := $(shell frama-c-config -print-share-path)
-FRAMAC_LIBDIR := $(shell frama-c-config -print-libpath)
 PLUGIN_NAME = Hello
 PLUGIN_CMO = hello_options hello_print hello_run
 PLUGIN_TESTS_DIRS := hello
diff --git a/doc/developer/tutorial/viewcfg/src/Makefile.split b/doc/developer/tutorial/viewcfg/src/Makefile.split
index ccb89969c17d663bca919c27473601c7d0061808..ee56b8cad49061542f416bac73f901bb8ce4c325 100644
--- a/doc/developer/tutorial/viewcfg/src/Makefile.split
+++ b/doc/developer/tutorial/viewcfg/src/Makefile.split
@@ -1,5 +1,4 @@
 FRAMAC_SHARE := $(shell frama-c-config -print-share-path)
-FRAMAC_LIBDIR := $(shell frama-c-config -print-libpath)
 PLUGIN_NAME = ViewCfg
 PLUGIN_CMO =  cfg_options cfg_core cfg_register
 PLUGIN_GUI_CMO =  cfg_gui
diff --git a/doc/frama-c-affiliation.tex b/doc/frama-c-affiliation.tex
new file mode 100644
index 0000000000000000000000000000000000000000..5edc07ee737f93b44d0d67a832cbbd818a8f5685
--- /dev/null
+++ b/doc/frama-c-affiliation.tex
@@ -0,0 +1,2 @@
+\newcommand{\fcaffiliationen}{CEA-List, Université Paris-Saclay\\ Software Safety and Security Lab\xspace}
+\newcommand{\fcaffiliationfr}{CEA-List, Université Paris-Saclay\\ Laboratoire de Sûreté et Sécurité des Logiciels\xspace}
diff --git a/doc/frama-c-book.cls b/doc/frama-c-book.cls
index 5cd0cc0e7df22fc2ffaaca2923abbf0e6a3c3266..159783c66b38ec3bd23193d4ff238bbefe8e0a46 100644
--- a/doc/frama-c-book.cls
+++ b/doc/frama-c-book.cls
@@ -19,6 +19,7 @@ prefix=framacbook@,
 \DeclareVoidOption{web}{\PassOptionsToPackage{colorlinks,urlcolor=blue}{hyperref}}
 \DeclareVoidOption{paper}{\PassOptionsToPackage{pdfborder=0 0 0}{hyperref}}
 \DeclareStringOption[{version=4.0,modifier=by-sa}]{license}
+\DeclareStringOption[english]{lang}
 \DeclareDefaultOption{\PassOptionsToClass{\CurrentOption}{report}}
 \PassOptionsToClass{a4paper,11pt,twoside,openright}{report}
 
@@ -26,10 +27,13 @@ prefix=framacbook@,
 
 \LoadClass{report}
 
+\PassOptionsToPackage{\framacbook@lang}{babel}
+
 \ifthenelse{\equal{\framacbook@license}{no}}{\useccfalse}{}
 \ifusecc
   \PassOptionsToPackage{\framacbook@license}{doclicense}
 \fi
+\RequirePackage{babel}
 \RequirePackage{fullpage}
 \RequirePackage{lmodern}
 \RequirePackage[T1]{fontenc}
diff --git a/doc/metrics/.gitignore b/doc/metrics/.gitignore
index b090424f9881164cba1a32e5044ef1b1363f77a4..06c1c792c58efdabbee5c308a8da223fa4e5e78d 100644
--- a/doc/metrics/.gitignore
+++ b/doc/metrics/.gitignore
@@ -2,4 +2,5 @@
 /frama-c-cover.pdf
 /frama-c-left.pdf
 /frama-c-right.pdf
+/frama-c-affiliation.tex
 /metrics.pdf
diff --git a/doc/metrics/metrics.tex b/doc/metrics/metrics.tex
index 37139b90cc2c5c8847cde229f7ebf47b3c51824b..11b1f4ada005edcff0f2e4660c999e36440640df 100644
--- a/doc/metrics/metrics.tex
+++ b/doc/metrics/metrics.tex
@@ -3,6 +3,7 @@
 \usepackage{amsmath}
 \newcommand{\framacversion}%
            {\input{../../VERSION} (\input{../../VERSION_CODENAME}\unskip)}
+\input{./frama-c-affiliation.tex}
 
 \begin{document}
 \coverpage{Metrics}
@@ -15,7 +16,7 @@
 \title{Frama-C's metrics plug-in}{\framacversion}
 \author{Richard Bonichon \& Boris Yakobowski}
 \begin{tabular}{l}
-CEA LIST, Software Reliability Laboratory, Saclay, F-91191 \\
+  \fcaffiliationen
 \end{tabular}
 \vfill
 \begin{flushleft}
diff --git a/doc/pdg/.gitignore b/doc/pdg/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..e9b8c33454088763484eba5e7f1613510710dbf6
--- /dev/null
+++ b/doc/pdg/.gitignore
@@ -0,0 +1,7 @@
+biblio.bib
+frama-c-book.cls
+frama-c-cover.pdf
+frama-c-left.pdf
+frama-c-right.pdf
+frama-c-affiliation.tex
+main.pdf
diff --git a/doc/pdg/Makefile b/doc/pdg/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..de8bc6307421bec04bd8fab929978e1191a8f78e
--- /dev/null
+++ b/doc/pdg/Makefile
@@ -0,0 +1,70 @@
+.PHONY: all clean
+
+all: main.pdf
+
+GENERATED=biblio.bib
+GENERATED+=frama-c-book.cls frama-c-cover.pdf frama-c-left.pdf frama-c-right.pdf
+include ../MakeLaTeXModern
+
+DWNLDDIR=../manuals
+DOCNAME=pdg-documentation-fr.pdf
+TEST_DIR=../../tests/pdg/
+
+BIB_FILE = ../slicing/bib-slicing.bib
+main.bbl : $(BIB_FILE)
+	@echo "=== Fichier .bib plus récent -> effacement du .bbl"
+	rm -f $(SRC).bbl
+
+main.pdf: $(FRAMAC_MODERN) $(BIB_FILE) \
+	main.tex pdg.tex macros_pdg.tex \
+	intro.tex conclusion.tex \
+	data.tex ctrl.tex calls.tex utilisation.tex mark.tex impact.tex \
+	../images/cealistlogo.jpg \
+	exple-call.c call-f.pdf call-g.pdf \
+	ctrl-dpds.pdf ex-goto.pdf goto.pdf pdg-call.pdf
+
+###############################################################################
+
+GENERATED+=call-f.fig call-g.fig
+%.fig : %.dot
+	dot -Tfig $< > $@
+
+GENERATED+=call-f.pdf call-g.pdf
+%.pdf : %.fig
+	fig2dev -L pdf $< $@
+
+GENERATED+=call-f.dot call-g.dot
+call-%.dot : $(TEST_DIR)/call.%.dot
+	cp $< $@
+
+call-%.dot :
+	@echo
+	@echo "ERROR : $@ not found : you should run PDG tests to have it"
+	@echo "  Run : cd ../.. ; make pdg_tests ; cd - "
+	@echo
+	exit 1
+
+GENERATED+=exple-call.c
+exple-%.c : $(TEST_DIR)/%.c
+	sed "1,/BDOC/d" $< > $@
+
+###############################################################################
+
+%.pdf: %.tex
+	pdflatex $*
+	bibtex $*
+	pdflatex $*
+	pdflatex $*
+
+install: main.pdf
+	@echo "copying main.pdf    in $(DWNLDDIR)/$(DOCNAME)"
+	@rm -f "$(DWNLDDIR)/$(DOCNAME)"
+	@cp main.pdf "$(DWNLDDIR)/$(DOCNAME)"
+
+clean:
+	rm -rf *~ *.aux *.log *.nav *.out *.snm *.toc *.lof *.pp *.bnf \
+		*.haux  *.hbbl *.htoc \
+                *.cb *.cb2 *.cm? *.bbl *.blg *.idx *.ind *.ilg \
+		$(GENERATED)
+
+###############################################################################
diff --git a/doc/pdg/calls.tex b/doc/pdg/calls.tex
new file mode 100644
index 0000000000000000000000000000000000000000..f50ff876f08f1daceddb482f80f1e291fd2892bd
--- /dev/null
+++ b/doc/pdg/calls.tex
@@ -0,0 +1,209 @@
+\chapter{Dépendances interprocédurales}\label{sec-intro-call}
+
+On a vu qu'un PDG est associé à une fonction.
+La question se pose donc de savoir
+comment calculer des dépendances interprocédurales, c'est-à-dire comment mettre
+en relation les appels de fonctions et les dépendances des fonctions appelées.
+
+Nous allons tout d'abord voir qu'un appel de fonction
+est représenté par plusieurs éléments dans le PDG (\S\ref{sec-call}).
+Puis, nous allons voir que pour mettre en relation des appels et les fonctions
+appelées, ils faut ajouter d'autres éléments à chaque fonction
+(\S\ref{sec-fct-inout}).
+
+\section{Appels de fonction}\label{sec-call}
+
+L'instruction contenant l'appel est représentée par plusieurs
+éléments dans le graphe de dépendances
+afin de pouvoir plus précisément mettre en relation les appels aux
+fonctions appelées.
+
+Les éléments créés sont les suivants~:
+\begin{itemize}
+\item un élément pour chaque paramètre de la fonction appelée;
+  les dépendances sont crées par une simulation
+  de l'affectation des arguments d'appel dans les paramètres formels,
+\item un élément représentant le contrôle du point d'entrée de la fonction
+  appelée (un peu comme si l'appel était dans un bloc et que ce noeud
+  représentait ce bloc),
+\item un élément pour chaque sortie, dépendant des entrées correspondantes.
+\end{itemize}
+
+Pour ne pas avoir à calculer les flots de données de toutes les fonctions de
+l'application, il a été décidé d'utiliser les dépendances ({\it from})
+calculées indépendamment par \ppc.
+La liste des entrées et des sorties, ainsi que les dépendances entre les unes et
+les autres sont extraites des spécifications des fonctions appelées, et non de
+leur PDG\footnote{c'est peut-être un problème
+si on fait de la coupure de branche, car les dépendances peuvent être réduites
+par une telle spécialisation.}.
+Ceci est vrai également pour les
+fonctions dont le code est absent de l'application étudiée
+car cela permet d'être cohérent avec les autres analyses.
+Cela permettra en particulier, d'utiliser d'éventuelles propriétés
+fournies par la suite par l'utilisateur.
+
+\begin{exemple}
+\begin{tabular}{m{0.35\textwidth} m{0.6\textwidth}}
+\begin{verbatim}
+struct {int a;
+        int b; } G;
+
+/*@ assigns \result {a},
+            G.a {G, a} */
+int g (int a);
+
+int f (int x, int y) {
+  G.b = x;
+  x = g (x+y);
+  return x + G.b;
+}
+\end{verbatim}
+&
+Ici, pour représenter l'appel à \verbtt{g} dans \verbtt{f} dans le PDG,
+on va avoir~:
+\begin{itemize}
+  \item un élément représentant le point d'entrée dans \verbtt{g},
+  \item un élément $e_1$ pour représenter \verbtt{a = x+y},
+    c'est-à-dire l'affectation de l'argument de l'appel
+    dans le paramètre formel de \verbtt{g},
+  \item un élément $e_2$ pour calculer la valeur de retour de \verbtt{g},
+    qui dépend de la valeur de $e_1$
+    (utilisation de la spécification de $g$),
+
+\item et enfin, un élément $e_3$ qui représente la seconde sortie de \verbtt{g}~:
+\verbtt{G.a} qui dépend du paramètre \verbtt{a} et donc de $e_1$
+    et de des éléments $\{ e_G \}$
+    correspondant à
+    la valeur de $G$ avant l'appel
+(selon la spécification de $g$).
+\end{itemize}
+\end{tabular}
+\end{exemple}
+
+On note que, contrairement à ce qui était fait dans la version précédente,
+on ne crée par d'élément pour l'entrée implicite $G$ de $g$ dans $f$.
+Cela permet d'améliorer la précision des dépendances lorsque
+l'ajout d'un tel noeud conduisait au regroupement de plusieurs données.
+
+Ainsi, dans l'exemple précédent, on ne crée pas d'élément pour
+représenter la valeur de $G$ avant l'appel, même si l'élément $e_3$ en dépend,
+et on conserve donc l'information que $G.b$ ne dépend que de l'affectation
+précédent l'appel.
+
+
+\section{Entrées/sorties d'une fonction}\label{sec-fct-inout}
+
+Pour relier un appel de fonction au PDG de la fonction appelée,
+il faut ajouter des éléments représentant ses entrées/sorties,
+c'est-à-dire~:
+
+\begin{itemize}
+  \item un élément correspondant au point de contrôle d'entrée
+dans la fonction,
+\item deux éléments pour chaque paramètre (cf. \S\ref{sec-decl-param}),
+\item un élément pour les entrées implicites (cf. \S\ref{sec-impl-in}),
+\item un élément pour la sortie de la fonction si celle-ci retourne
+  quelque chose.
+\end{itemize}
+
+On note que, contrairement à ce qui était fait dans la version précédente,
+on ne crée par d'élément pour les sorties implicites de la fonction.
+Cela permet d'améliorer la précision des dépendances lorsque
+l'ajout d'un tel noeud conduisait au regroupement de plusieurs données.
+
+C'est par exemple le cas lorsqu'une fonction calcule $G.a$,
+puis $G.a.x$ car un élément de sortie regrouperait les deux alors que
+si par la suite on s'intéresse juste à $G.a.x$ à la sortie de la fonction,
+le fait de ne pas avoir créé cet élément permet de retrouver l'information plus
+précise.
+
+\subsection{Entrées implicites}\label{sec-impl-in}
+
+Au cours du calcul du PDG, on mémorise l'utilisation des données
+qui ne sont pas préalablement définies.
+Cela permet par la suite que créer des éléments pour ces entrées dites
+implicites. On ne crée pas d'élément pour les variables locales non
+initialisées, mais un message d'avertissement est émis.
+Il est possible que ce soit une fausse alerte dans le cas où l'initialisation
+est faite dans une branche dont la condition est forcement vrai à chaque
+exécution où l'on passe par la suite par l'utilisation.
+
+Diverses stratégies de regroupement de ces entrées peuvent être utilisées.
+A ce jour, l'outil construit tous les éléments lui permettant d'avoir une
+meilleure précision. C'est-à-dire que deux éléments peuvent représenter les
+données qui ont une intersection.
+
+\subsection{Déclaration des paramètres formels}\label{sec-decl-param}
+
+En plus de l'élément représentant la valeur des paramètres,
+on crée un second élément qui représente sa déclaration,
+le premier dépendant du second.
+
+Cette représentation peut permettre d'avoir une meilleure précision
+dans le cas où certains calcul ne dépendent pas de la valeur du
+paramètre, mais uniquement de sa déclaration.
+
+\begin{exemple}
+\begin{tabular}{m{5cm} m{\linewidth - 6cm}}
+\begin{verbatim}
+int g (int a) {
+  G = 2 * a;
+  a = calcul_a ();
+  return a;
+}
+int f (void) {
+  int x = calcul_x ();
+  return g (x);
+}
+\end{verbatim}
+&
+On voit que la valeur de retour de \verbtt{g} ne nécessite pas la valeur initiale
+de \verbtt{a}, mais seulement sa déclaration. La valeur de retour de \verbtt{f}
+ne dépend donc pas de l'appel à \verbtt{calcul\_x}.
+\end{tabular}
+\end{exemple}
+
+Ce point n'est pas encore implémenté dans la version actuelle,
+car dans des cas plus complexe, il est délicat de savoir ce qu'il faut
+garder dans la fonction appelante. Le plus simple serait sans doute
+de transformer le paramètre formel en une variable locale,
+mais le filtrage permet à l'heure actuelle de garder ou d'effacer des
+éléments existants, mais pas d'effectuer des transformations de code...
+
+\section{Fonctions à nombre d'arguments variable}
+
+Pour l'instant, on ne calcule pas le PDG des fonctions à nombre
+d'arguments variable, c'est-à-dire que pour le reste de l'application,
+tout se passe comme si on n'avait pas le code source de ces fonctions.\\
+
+En revanche, les appels à de telles fonctions sont gérées de manière semblable à
+ce qui est fait pour les autres appels, c'est-à-dire~:
+\begin{itemize}
+  \item création d'un noeud d'entrée pour chaque argument d'appel,
+    (il y en a donc éventuellement plus que que paramètres formels dans le
+    déclaration de la fonction appelée)
+  \item utilisation des informations {\it from} pour créer les éventuelles
+    entrées implicites, les sorties, et les liens de dépendance.
+\end{itemize}
+
+\section{Exemple}
+
+\begin{exemple}
+
+\lstinputlisting[language=c]{exple-call.c}
+\end{exemple}
+
+Graphe de la fonction \verbtt{f}: \\
+
+\includegraphics[width=0.6\textwidth]{call-f}
+\\
+
+\clearpage
+
+Graphe de la fonction \verbtt{g}: \\
+
+\includegraphics[width=1\textwidth]{call-g}
+\\
+
+Les graphes sont ceux qui sont effectivement produits par l'outil.
diff --git a/doc/pdg/conclusion.tex b/doc/pdg/conclusion.tex
new file mode 100644
index 0000000000000000000000000000000000000000..646d2642d4a8a9dcebc3c31aa079b976331333a9
--- /dev/null
+++ b/doc/pdg/conclusion.tex
@@ -0,0 +1,22 @@
+\chapter{Conclusion}
+
+La version actuelle de ce greffon semble fonctionner.
+Elle est utilisée par les greffons {\sc Security}, {\sc Sparecode} et
+{\sc Slicing}. Ces résultats peuvent également être visualisés
+graphiquement en utilisant la fonction d'exportation
+au format {\tt .dot}.\\
+
+D'autres information relatives au développement peuvent être trouvées dans la documentation du code dont un point d'entrée
+est~:
+
+\centerline{\tt doc/code/pdg/index.html}
+
+\section{Limitations}
+
+Les fonctions ayant un nombre d'arguments variable 
+ne sont pas traitées (mais les appels à de telles fonctions sont gérés).
+
+Par ailleurs, les calculs se basant sur l'analyse de valeur,
+et sur le calcul des dépendances fonctionnelles (\from)
+il hérite des limitations de ces modules.
+
diff --git a/doc/pdg/ctrl-dpds.fig b/doc/pdg/ctrl-dpds.fig
new file mode 100644
index 0000000000000000000000000000000000000000..d41477b617f390b1c3fb6fc1f10e5ea6da28a72b
--- /dev/null
+++ b/doc/pdg/ctrl-dpds.fig
@@ -0,0 +1,106 @@
+#FIG 3.2
+Portrait
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+0 32 #ffffff
+6 4410 2610 5355 3195
+2 3 0 1 32 32 0 -1 20 0.000 0 0 0 0 0 5
+	 4417 2645 5314 2645 5314 3165 4417 3165 4417 2645
+2 3 0 1 0 0 0 0 -1 0.000 0 0 0 0 0 5
+	 4417 2645 5314 2645 5314 3165 4417 3165 4417 2645
+4 1 0 0 0 16 17 0.0000 6 180 810 4866 2976 START\001
+-6
+6 5715 6210 6120 6795
+2 3 0 1 32 32 0 -1 20 0.000 0 0 0 0 0 5
+	 5728 6236 6082 6236 6082 6755 5728 6755 5728 6236
+2 3 0 1 0 0 0 0 -1 0.000 0 0 0 0 0 5
+	 5728 6236 6082 6236 6082 6755 5728 6755 5728 6236
+4 1 0 0 0 16 17 0.0000 6 180 165 5905 6566 B\001
+-6
+6 7470 4860 7965 5445
+2 3 0 1 32 32 0 -1 20 0.000 0 0 0 0 0 5
+	 7488 4889 7960 4889 7960 5409 7488 5409 7488 4889
+2 3 0 1 0 0 0 0 -1 0.000 0 0 0 0 0 5
+	 7488 4889 7960 4889 7960 5409 7488 5409 7488 4889
+4 1 0 0 0 16 17 0.0000 6 180 300 7724 5220 S2\001
+-6
+6 5715 4860 6120 5445
+2 3 0 1 32 32 0 -1 20 0.000 0 0 0 0 0 5
+	 5740 4889 6094 4889 6094 5409 5740 5409 5740 4889
+2 3 0 1 0 0 0 0 -1 0.000 0 0 0 0 0 5
+	 5740 4889 6094 4889 6094 5409 5740 5409 5740 4889
+4 1 0 0 0 16 17 0.0000 6 180 150 5917 5220 Z\001
+-6
+6 4725 5715 5220 6255
+2 3 0 1 32 32 0 -1 20 0.000 0 0 0 0 0 5
+	 4748 5716 5220 5716 5220 6236 4748 6236 4748 5716
+2 3 0 1 0 0 0 0 -1 0.000 0 0 0 0 0 5
+	 4748 5716 5220 5716 5220 6236 4748 6236 4748 5716
+4 1 0 0 0 16 17 0.0000 6 180 285 4984 6047 Z1\001
+-6
+6 6435 5715 6975 6255
+2 3 0 1 32 32 0 -1 20 0.000 0 0 0 0 0 5
+	 6472 5716 6968 5716 6968 6236 6472 6236 6472 5716
+2 3 0 1 0 0 0 0 -1 0.000 0 0 0 0 0 5
+	 6472 5716 6968 5716 6968 6236 6472 6236 6472 5716
+4 1 0 0 0 16 17 0.0000 6 180 285 6720 6047 Z2\001
+-6
+6 4455 7155 5220 7740
+2 3 0 1 32 32 0 -1 20 0.000 0 0 0 0 0 5
+	 4464 7181 5196 7181 5196 7700 4464 7700 4464 7181
+2 3 0 1 0 0 0 0 -1 0.000 0 0 0 0 0 5
+	 4464 7181 5196 7181 5196 7700 4464 7700 4464 7181
+4 1 0 0 0 16 17 0.0000 6 180 675 4830 7511 STOP\001
+-6
+6 6480 3375 6885 3960
+2 3 0 1 32 32 0 -1 20 0.000 0 0 0 0 0 5
+	 6519 3401 6874 3401 6874 3921 6519 3921 6519 3401
+2 3 0 1 0 0 0 0 -1 0.000 0 0 0 0 0 5
+	 6519 3401 6874 3401 6874 3921 6519 3921 6519 3401
+4 1 0 0 0 16 17 0.0000 6 180 165 6696 3732 A\001
+-6
+6 4725 4185 5220 4725
+2 3 0 1 32 32 0 -1 20 0.000 0 0 0 0 0 5
+	 4745 4204 5194 4204 5194 4724 4745 4724 4745 4204
+2 3 0 1 0 0 0 0 -1 0.000 0 0 0 0 0 5
+	 4745 4204 5194 4204 5194 4724 4745 4724 4745 4204
+4 1 0 0 0 16 17 0.0000 6 180 300 4970 4535 S1\001
+-6
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 5310 2925 6345 2925 6705 3420
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 4500 3150 4275 5445 4680 7200
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 6525 3600 5175 3600 4950 4185
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 6885 3600 7245 3600 7650 4905
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 5175 4455 5625 4455 5895 4905
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 5760 5175 5310 5175 4950 5715
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 6075 5175 6480 5175 6750 5715
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 4950 6210 4995 6390 5715 6615
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 6750 6210 6705 6390 6075 6615
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 7650 5400 7650 6300 5175 7425
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 5850 6750 5850 6975 5175 7290
diff --git a/doc/pdg/ctrl.tex b/doc/pdg/ctrl.tex
new file mode 100644
index 0000000000000000000000000000000000000000..a5bbd5d16174dd5e11243856d77c73963b2301ec
--- /dev/null
+++ b/doc/pdg/ctrl.tex
@@ -0,0 +1,747 @@
+\newcommand{\text}[1]{\mbox{#1}}
+\newcommand{\impl}{\Rightarrow}
+\newcommand{\et}{\wedge}
+\newcommand{\ou}{\vee}
+\newcommand{\define}{\Leftrightarrow{def}}
+\newcommand{\mssi}{\Leftrightarrow}
+
+\newcommand{\llb}{\llbracket}
+\newcommand{\ch}[1]{[#1]}
+\newcommand{\mch}[1]{[#1[}
+\newcommand{\allch}[1]{\llb #1] }
+\newcommand{\allmch}[1]{\llb #1[}
+
+\newcommand{\n}[1]{\ensuremath{\mathfrak{#1}}}
+\newcommand{\nE}{\n{E}}
+\renewcommand{\P}[1]{\ensuremath{\mathit{P}(\n{#1})}}
+\newcommand{\D}[2]{\ensuremath{\mathit{D}(\n{#1},\n{#2})}}
+\newcommand{\Pd}[1]{\ensuremath{\mathit{Pd}(\n{#1})}}
+\newcommand{\Pdi}[1]{\ensuremath{\mathit{Pd}^{\infty}(\n{#1})}}
+\newcommand{\Pda}[1]{\ensuremath{\mathit{Pd}^{+}(\n{#1})}}
+\newcommand{\dpdc}[1]{\ensuremath{\mathit{DpdC}(\n{#1})}}
+\newcommand{\codpdc}[1]{\ensuremath{\mathit{CoDpdC}(\n{#1})}}
+\renewcommand{\succ}[1]{\ensuremath{\mathit{Succ}(\n{#1})}}
+\newcommand{\succl}[1]{\ensuremath{\mathit{Succ_{L}}(\n{#1})}}
+
+\newcommand{\ssi}{si et seulement si }
+
+\chapter{Dépendances de contrôle}\label{sec-cdg}
+
+\section{Introduction}
+
+Intuitivement, un noeud \n{n} du PDG a une dépendance de contrôle sur un noeud
+\n{c}
+si le fait d'exécuter \n{n} dépend du résultat de l'exécution de \n{c}.
+Typiquement, \n{c} est un noeud qui a plusieurs successeurs, comme un {\sc if} par
+exemple,
+et en fonction de la branche qui est choisie, \n{n} est exécuté ou non.
+
+Nous allons voir qu'il existe de nombreuses façons de calculer ces
+dépendances de contrôle, mais que nous avons du les adapter car
+elle ne correspondent pas exactement à ce que l'on souhaitait faire.
+Le principal problème est que
+nous nous proposons d'analyser correctement
+toute fonction, même en présence de sauts quelconques, voire de boucles
+infinies; ce qui, comme nous allons le voir,
+pose des problèmes particuliers au niveau des dépendances de contrôle.
+
+\section{Etat de l'art}
+
+Commençons tout d'abord par rappeler quelques définitions
+et rapporter les résultats que l'on trouve dans la littérature.
+
+\subsection{CFG}
+
+Le \indexdef{graphe de flot de contrôle} est un graphe orienté qui définit l'ordre
+d'exécution des instructions. Un noeud \n{a} est connecté à un noeud \n{b}
+si l'instruction \n{b} peut suivre immédiatement
+l'instruction \n{a} dans une trace l'exécution.
+On dit que \n{b} est un \indexdef{successeur} de \n{a}.
+On représente l'ensemble des successeurs d'un noeud \n{a} par $\succ{a}$.
+On dit aussi que \n{a} est un \indexdef{prédécesseur} de \n{b}.\\
+
+Un noeud est considéré comme une entrée dans le CFG s'il n'a pas de prédécesseur.
+Il est généralement considéré qu'il y a un unique noeud d'entrée,
+et que tous les noeuds du CFG sont atteignables depuis ce point d'entrée.
+Cette hypothèse semble raisonnable car on s'intéresse au CFG d'une fonction
+qui a bien un seul point d'entrée, et les instructions non atteignables depuis
+le point d'entrée sont du
+code mort que l'on peut donc ignorer dans les analyses.\\
+
+Un noeud est considéré comme une sortie du CFG s'il n'a pas de successeur.
+Son unicité et son accessibilité sont discutées plus loin.
+
+
+\subsection{Postdominateurs}
+
+La plupart des algorithmes de calcul des dépendances de contrôle
+se basent
+sur un CFG dans lequel sont ajoutés deux noeuds spéciaux {\sc start} et
+{\sc stop} (on notera \nE{} ce dernier),
+et sur la notion de  \indexdef{postdominateur} dont une définition est
+la suivante~:
+
+\begin{definition}{postdominateur}
+  Une instruction \n{a} est {\bf postdominée} par une instruction \n{b}
+  (\n{b} est un {\bf postdominateur} de \n{a})
+  si tous les chemins qui vont de \n{a} au noeud \nE{} contiennent \n{b}.
+\end{definition}
+
+En d'autres termes, si on passe par l'instruction \n{a},
+on passe forcement par tous ses postdominateurs avant de sortir.
+Ou encore,
+toutes les traces partant de \n{a} et allant à \nE{} passent par \n{b}.\\
+
+
+Certains auteurs définissent également
+le \indextxtdef{premier postdominateur}{postdominateur!premier}
+(appelé aussi \indextxtdef{postdominateur immédiat}{postdominateur!immédiat})
+de la façon suivante~:
+
+\begin{definition}{premier postdominateur}
+  \n{b} est le premier postdominateur de \n{a} \ssi~:
+\begin{itemize}
+  \item \n{b} postdomine \n{a},
+  \item et \n{b} est postdominé par tous les autres postdominateurs de \n{a}.
+\end{itemize}
+\n{b} est donc unique.
+\end{definition}
+
+Cela permet de construire un arbre (appelé PDT pour {\it Post-Dominator Tree})
+représentant cette relation dans lequel les noeuds sont les mêmes que
+ceux du CFG et le père de chaque noeud est son premier postdominateur.\\
+
+L'ensemble des postdominateurs d'un noeud \n{a} est donné par~:
+$$
+\Pd{a} = \{a\} \bigcup \bigcap_{s \in \succ{a}} \Pd{s}
+$$
+qui traduit le fait que \n{b} postdomine \n{a} \ssi $\n{b} = \n{a}$
+ou \n{b} postdomine tous les successeurs de \n{a}.
+La méthode de calcul consiste à initialiser tous les ensembles à $\top$,
+et à itérer jusqu'à stabilisation.
+La fonction étant décroissante, la convergence est assurée.\\
+
+
+La notion classique de postdominateurs suppose que le CFG ait un point unique de
+sortie \nE,
+et que celui-ci soit atteignable depuis tous les autres points du graphe.
+Si ce n'est pas le cas, à la fin de ce calcul,
+pour les \n{a} n'ayant pas de chemin vers \nE, on a~: $\Pd{a} = \top$.\\
+
+
+\subsection{Dépendances de contrôle}
+
+Intuitivement, on dit qu'une instruction \n{a} a une \indextxtdef{dépendance de
+contrôle}{dépendance!contrôle} sur une instruction \n{c}
+si, en fonction du choix que l'on fait en \n{c}, on passe ou non en \n{a}.
+Cela suppose donc qu'il y ait un choix à faire en \n{c},
+c'est-à-dire que le noeud correspondant dans le CFG
+ait plusieurs successeurs.\\
+
+Les dépendances de contrôle sont définies par \cite{Ferrante87}
+de la façon suivante~:
+
+\begin{definition}{dépendances de contrôle selon \cite{Ferrante87}}
+  Pour deux noeuds \n{a} et \n{b} du CFG, \n{b} dépend de \n{a} ssi~:
+\begin{itemize}
+  \item il existe un chemin P de \n{a} a \n{b}
+    tel que tout noeud Z de P, différent de \n{a} et de \n{b}, est postdominé
+    par \n{b},
+  \item et \n{a} n'est pas postdominé par \n{b}.
+\end{itemize}
+\end{definition}
+
+Ce qui signifie que~:
+\begin{itemize}
+  \item plusieurs chemins partent de \n{a},
+  \item qu'il existe un chemin qui passe par \n{b},
+  \item et qu'il existe aussi un chemin qui ne passe pas par \n{b}
+    (sinon, \n{a} serait postdominé par \n{b}).
+\end{itemize}
+
+Ce qui conduit à une autre
+définition, équivalente à la précédente~:
+
+\begin{definition}{dépendance de contrôle}
+  Une instruction \n{b} a une {\bf dépendance de contrôle} vis à vis de \n{a} si~:
+\begin{itemize}
+  \item \n{b} postdomine certains successeurs de \n{a},
+  \item \n{b} ne postdomine pas tous les successeurs de \n{a}.
+\end{itemize}
+\end{definition}
+
+Pour calculer le CDG, l'algorithme de référence est le suivant~:
+
+\begin{algo}{calcul du CDG selon \cite{Ferrante87}}
+\begin{itemize}
+\item soit ACFG le CFG (+ START et {\sc stop}) dans lequel sont ajoutés~:
+  \begin{itemize}
+    \item un noeud ENTRY,
+    \item une arrête (ENTRY,START),
+    \item une arrête (ENTRY,
+      {\sc stop}),
+  \end{itemize}
+\item soit S l'ensemble des arrêtes (\n{a},\n{b}) de ACFG
+  telles que \n{b} ne postdomine pas \n{a}, \\
+  (c'est-à-dire les arrêtes partant des noeuds \n{a} qui ont plusieurs successeurs)
+\item soit \n{l} le plus petit ancêtre commun à \n{a} et \n{b} dans PDT\\
+  (on peut montrer que soit \n{l}=\n{a}, soit \n{l} est le père de \n{a} dans PDT)
+  \begin{itemize}
+    \item si \n{l} est le père de \n{a} dans PDT, tous les noeuds du PDT sur le chemin
+      entre \n{l} et \n{b} (\n{b} compris, mais pas \n{l}) dépendent de \n{a},
+    \item si \n{l} = \n{a}, tous les noeuds du PDT sur le chemin
+      entre \n{a} et \n{b} (\n{a} et \n{b} compris) dépendent de \n{a}.
+  \end{itemize}
+\end{itemize}
+En fait, il est plus simple de dire que  tous les noeuds du PDT sur le chemin
+entre \n{b} et le père de \n{a} (\n{b} compris, mais pas le père de \n{a}) dépendent de
+\n{a}.
+\end{algo}
+
+La relation de dépendance étant transitive, on peut choisir de calculer
+uniquement les dépendances directes ou d'inclure les dépendances indirectes.
+
+\begin{exemple}
+\begin{tabular}{m{8cm}m{4cm}}
+  Dans le CFG ci-contre, \n{b} a bien une dépendance de contrôle sur \n{a}.
+  On remarque que, par contre, Z1 ou Z2 ne dépendent pas directement de \n{a},
+  car ils ne postdominent pas S2. En revanche, il y a néanmoins une dépendance
+  indirecte, comme on pouvait s'y attendre, car Z dépend de \n{a}, et Z1 et Z2
+  dépendent de Z.
+&
+\includegraphics[width=0.3\textwidth]{ctrl-dpds}
+\end{tabular}
+\end{exemple}
+
+En fait, \n{a} dépend directement de c si
+\n{a} est forcement atteint si on passe par l'un des successeurs de c,
+mais il y a des chemins qui partent de c et qui ne passe pas pas \n{a}.
+
+\subsection{Cas particuliers}
+
+Ce qui a été présenté ci-dessus s'applique bien à des programmes bien
+structurés, mais nécessite des adaptations si on s'intéresse~:
+
+\begin{itemize}
+  \item aux instructions qui modifie le flot de contrôle telles que les sauts,
+  \item aux CFG qui contiennent des noeuds pour lesquels il n'y a pas de chemin
+    vers le noeud de sortie.
+\end{itemize}
+
+Nous allons étudier plus précisément ces deux points ci-dessous.
+
+\section{Nos définitions}
+
+\subsection{Chemins}
+
+Dans ce qui suit, on utilise beaucoup la notion de \indexdef{chemin}~:
+un chemin est une liste de noeuds du CFG telle que si deux noeuds \n{a} et \n{b}
+se suivent dans la liste, \n{b} est un successeur de \n{a}.
+Nous appelons \indexdef{trace} un chemin qui se termine par un noeud
+n'ayant pas de successeur, ou un chemin qui est infini.
+
+On définit quelques notations pour désigner les chemins~:
+\begin{itemize}
+  \item $\ch{a, b}$  un chemin allant de \n{a} à \n{b}
+  \item $\mch{a, b}$ une trace partant de \n{a} et passant par \n{b}
+  \item $\mch{a, -}$ une trace partant de \n{a},
+  \item $\ch{a, b, c}$ un chemin allant de \n{a} à \n{c} en passant par \n{b},
+  \item $\ch{a;s, b}$
+    un chemin allant de \n{a} à \n{b} en passant par $\n{s} \in \succ{a}$,
+  \item $\mch{a, \neg b}$
+    une trace partant de \n{a} et ne passant pas par \n{b},
+\end{itemize}
+et des ensembles de chemins :
+\begin{itemize}
+  \item $\allmch{a, -}$ toutes les traces partant de \n{a},
+  \item $\allmch{a, b}$ toutes les traces partant de \n{a} et passant
+    par \n{b},
+  \item ...
+\end{itemize}
+
+On dit qu'un noeud appartient à un chemin, et on écrit - un peu abusivement -
+$\n{x} \in \ch{a, b}$ si \n{x} apparaît au moins une fois
+dans la liste qui décrit le chemin.
+
+\subsection{Postdominateurs}
+
+Avec les notations ci-dessus,
+on peut définir \Pd{a} l'ensemble des postdominateurs de \n{a},
+de la façon suivante~:
+$$
+  \n{b} \in \Pd{a} \define \forall t \in \allch{a, \nE}, \n{b} \in t
+$$
+
+On remarque que si on applique la définition ci-dessus à un CFG
+qui contient des noeuds tels qu'il n'y a pas de chemin vers la sortie,
+on a ~:
+$$
+\forall \n{a}, \allch{a, \nE} = \emptyset \impl \forall \n{b}, \n{b} \in \Pd{a}
+$$
+c'est-à-dire que l'on considère que de tels noeuds sont postdominés par tous les
+autres, ce qui n'est pas très intéressant en terme de trace d'exécution~!\\
+
+Dans ce qui suit, on note \P{a} l'ensemble des noeuds qui sont forcement
+atteints quand on passe par \n{a},
+et nous laisserons volontairement cette notion
+un peu floue pour l'instant. Sa définition sera précisée en \S\ref{sec-pda}.
+
+\subsection{Dépendances de contrôle} \label{sec-dpdc-if}
+
+On définit \D{c}{s} comme
+l'ensemble des noeuds qui sont forcement atteints si on passe par
+\n{s}, mais pas forcement si on passe par \n{c}.
+Plus formellement~:
+$$
+\D{c}{s} = \P{s} - \P{c}
+$$
+Par exemple, dans une séquence simple, si \n{c} représente un
+\verbtt{if} et \n{s} la première instruction de l'une des branche, \D{c}{s}
+donne les instructions de cette branche qui dépendent de la condition.\\
+
+On définit alors $\dpdc{a}$,
+l'ensemble des dépendances de contrôle de \n{a}, par~:
+$$
+\n{c} \in \dpdc{a} \define \n{a} \in \bigcup_{ \n{s} \in \succ{c}} \D{c}{s}
+$$
+Il est sans doute plus naturel de définir \codpdc{c},
+l'ensemble des co-dépendances de contrôle de \n{c},
+comme l'ensemble des noeuds ayant une dépendance de contrôle sur \n{c},
+c'est-à-dire~:
+$$
+  \n{a} \in \codpdc{c} \define \n{c} \in \dpdc{a}
+$$
+On a alors~:
+$$
+\codpdc{c} = \bigcup_{ \n{s} \in \succ{c}}  \D{c}{s}
+$$
+
+
+On remarque que cette définition ne suppose pas que \n{c} ait plusieurs
+successeurs, mais si \n{c} n'a qu'un successeur \n{s}~:
+$$
+\succ{c} = \{ \n{s} \} \impl
+\codpdc{c} = \{\n{x} | (\exists t \in \allmch{c, -}, \n{x} \notin t)
+\et (\forall t \in \allmch{s, -}, \n{x} \in t) \}
+$$
+or, comme \n{c} n'a qu'un successeur~:
+$$
+\forall t \in \allmch{c, -}, t = \mch{c; s, -}
+$$
+donc~:
+$$
+\forall t_s \in \allmch{s, -}, \n{x} \in t_s
+\impl \forall t_c \in \allmch{c, -}, \n{x} \in t_c
+$$
+$$
+\forall t_s \in \allmch{s, -}, \n{x} \in t_s
+\impl \nexists t_c \in \allmch{c, -}, \n{x} \notin t_c
+$$
+et donc, finalement~:
+$$
+\succ{c} = \{ \n{s} \} \impl \codpdc{c} = \{\}
+$$
+Donc, un noeud n'ayant qu'un seul successeur ne peut pas être une dépendance de
+contrôle. {\bf Attention}~: ceci n'est pas vrai pour les saut inconditionnels,
+car ceux-ci donne lieu à un traitement spécial décrit en \S\ref{sec-goto}.
+
+
+\section{Les sauts inconditionnels}\label{sec-goto}
+
+\subsection{Présentation du problème}
+
+Comme on l'a vu,
+la définitions précédente des dépendances de contrôle conduit à
+ne construire des dépendances que sur les noeuds ayant plusieurs successeurs,
+c'est-à-dire ceux qui présente une forme de choix dans le CFG.
+Or certaines instructions n'ayant qu'un successeur
+peuvent aussi, par leur présence, modifier le flot de contrôle.
+En C, c'est le cas par exemple des \verbtt{goto} explicites,
+mais aussi des  \verbtt{break}, \verbtt{continue} ou \verbtt{return}.
+Dans CIL, c'est aussi le cas des boucles puisqu'elles sont toutes transformées
+en \verbtt{while(1)}.
+
+Lorsque l'on souhaite utiliser le CDG pour calculer une réduction,
+on aimerait
+qu'il contienne également les liens nécessaires sur ces instructions
+afin de déterminer si elles peuvent être supprimées,
+ou si elles doivent être présentes dans le programme réduit.\\
+
+L'exemple simple suivant, tiré de \cite{Choi94}, met en évidence ce problème~:
+
+\begin{exemple}
+\begin{tabular}{m{4cm}m{5cm}}
+\begin{clisting}
+1 : <entry>
+2 : if (Q) goto 5;
+3 : x = 4;
+4 : goto 6;
+5 : x = 5;
+6 : y = x;
+7 : <exit>
+\end{clisting}
+&
+\includegraphics[width=0.5\textwidth]{ex-goto}
+\end{tabular}
+
+\begin{tabular}{p{5cm} p{7cm}}
+Réduction (fausse) \\
+par rapport à <y,7>~:
+\begin{clisting}
+1 : <entry>
+2 : if (Q) goto 5;
+3 : x = 4;
+
+5 : x = 5;
+6 : y = x;
+7 : <exit>
+\end{clisting}
+&
+On voit que dans le graphe de dépendances (PDG), personne ne dépend de 4,
+et la réduction de ce programme par rapport au noeud 6 donne le résultat
+erroné ci-contre qui donne \verbtt{y=5} même lorsque $Q$ est faux.
+\end{tabular}
+\end{exemple}
+
+\subsection{Etat de l'art}
+
+La plupart des solutions proposées pour résoudre ce problème
+utilisent la notion de \indexdef{successeur lexical} (sous différents noms).
+
+\begin{definition}{successeur lexical immédiat  selon \cite{agrawal94slicing}}
+A statement, S', is said to be {\bf the immediate lexical successor}
+of a statement, S, in a program, if deleting S from the program
+will cause the control to pass to S'
+whenever it reaches the corresponding location in the new program.
+
+If is a compound statement,
+such as an If or a While statement, delleting means
+delleting it allong with the statements that constitute its body.\\
+\end{definition}
+
+\cite{Choi94} présente une méthode qui ajoute un pseudo-lien dans le CFG
+entre les \verbtt{goto} et leur successeur lexical immédiat,
+et qui se sert de ce CFG modifié pour calculer les dépendances
+de contrôle selon la méthode classique.
+En fait, c'est un peu comme s'il remplaçait les \verb!goto L;!
+par \verbtt{if (1) goto L;} pour mettre en évidence le chemin
+qui apparaît dans le CFG si on supprime l'instruction.\\
+
+
+\cite{agrawal94slicing} donne un algorithme qui permet de traiter
+les \verbtt{goto} après un \slicing{} "normal".
+Il s'agit, pour chaque \verbtt{goto} (G) non visible,
+de déterminer si son premier postdominateur
+présent dans la réduction est différent du premier successeur lexical.
+Si c'est le cas, il faut rentre (G) visible ainsi que toutes ses dépendances.
+Ceci donne les mêmes résultats que l'algorithme précédent,
+mais il permet de ne modifier ni le CFG, ni le PDT.
+Par contre, le calcul doit être fait pour chaque réduction.\\
+
+\cite{harman98new} propose un algorithme qui donne des résultats
+plus précis que les deux précédents dans certains cas.\\
+
+Enfin, \cite{kumar02better} présente un algorithme qui prend
+en compte le problème spécifique des \verbtt{switch} et donne
+également de meilleurs résultats sur certains exemples.
+
+\subsection{Discussion}\label{sec-dpdc-goto}
+
+Dans un premier temps, l'algorithme de \cite{Choi94} semble simple à
+implémenter, mais il nous oblige à calculer un nouveau CFG et le PDT
+correspondant, ce que nous ne souhaitons pas faire car ces informations sont
+utilisées par différents modules de l'outil.
+Par ailleurs, l'algorithme de \cite{agrawal94slicing}
+est à appliquer à chaque nouvelle réduction, ce qui n'est pas très intéressant
+dans un environnement interactif, d'autant plus que l'on peut vouloir utiliser
+les dépendances de contrôle pour autre chose que le \slicing.\\
+
+Voyons donc plus précisément ce que l'on veut obtenir~:
+
+\begin{monenv}{Le problème}
+  \begin{tabularx}{\linewidth}{p{2cm}X}
+  \begin{center}
+    \includegraphics[width=1.5cm]{goto}
+  \end{center}
+&
+\begin{itemize}
+\item soit un programme P,
+\item soit \n{g} un noeud du CFG de P correspondant à un  \verbtt{goto},
+\item soit \n{l} le noeud correspondant au successeur de \n{g} (label du \verbtt{goto}),
+\item soit P', le programme P dans lequel on remplace le \verbtt{goto}
+par un ';' (NOP),
+\item soit \n{g}' le noeud correspondant dans le CFG de P',
+\item soit \n{s} le successeur lexical de \n{g}.
+\end{itemize}
+\bigskip
+On veut qu'un noeud \n{a} ait une dépendance de contrôle sur \n{g}
+\ssi \n{a} postdomine soit \n{g}, soit \n{s}, mais pas les deux.
+\end{tabularx}
+\end{monenv}
+Examinons les différents cas~:
+\begin{enumerate}
+  \item si \n{s}=\n{l}, cela signifie que le \verbtt{goto} ne sert à rien,
+    personne ne dépend donc de \n{g},
+  \item si \n{l} postdomine \n{s}, \n{s} dépend de \n{g}, ainsi que tous les postdominateurs
+    de \n{s} qui ne postdomine pas \n{l},
+  \item si \n{l} ne postdomine pas \n{s}, 
+  tous les \n{a} qui postdominent \n{s}, mais pas \n{l} ou l'inverse, dépendent de \n{g}.
+\end{enumerate}
+
+Donc, de manière générale, on peut calculer~:
+$$
+  \codpdc{g} = (\P{s} \cup \P{l}) - (\P{s} \cap \P{l})
+$$
+ce qui nous donne bien les noeuds atteints par l'une ou l'autre des branches,
+mais pas par les deux.
+
+On peut d'ailleurs montrer qu'on obtient la même chose que si on calcule \codpdc{g^*}
+sur CFG$^*$ où CFG$^*$ est le CFG dans lequel le noeud \n{g} est remplacé par un
+noeud \n{g^*} correspondant à une instruction
+\verbtt{if (true) goto L;}\\
+
+
+
+\section{Boucle infinie et exit}
+
+Comme on l'a vu,
+la plupart des définitions de dépendance de contrôle se basent
+sur le CFG, la notion de postdominateurs, et utilisent l'hypothèse
+que le CFG a un unique noeud de sortie \nE{} atteignable depuis tous les
+autres points du graphe. Or, comme l'explique très bien \cite{ranganath04new},
+cette hypothèse ne tient plus dans les programmes contenant
+des boucles infinies ou des \verbtt{exit} (ou même des exceptions,
+mais pour le langage C, nous n'avons pas le problème).
+Cet article présente également avec beaucoup de détails 
+différents types de dépendances et des algorithmes pour les calculer,
+mais il s'avère probablement trop complexe pour ce que l'on souhaite faire.\\
+
+Le fait qu'une fonction n'atteigne pas forcement un point de sortie pose deux
+problèmes différents~:
+\begin{itemize}
+  \item la préservation de la non-terminaison,
+  \item le calcul des dépendances de contrôle pour les instructions
+    n'ayant pas de chemin vers la sortie.
+\end{itemize}
+
+\subsection{Préservation de la non-terminaison}
+
+La question qui se pose est de savoir s'il faut ajouter des dépendances de
+contrôle sur les instructions qui, potentiellement, ne terminent pas.
+
+\begin{exemple}
+    \begin{tabular}{p{4.5cm}p{\linewidth-5.5cm}}
+\begin{clisting}
+while (f(x) > 0) x++;
+L: y = 3;
+\end{clisting}
+&
+Si l'on s'intéresse au calcul de {\tt y} en {\tt L}, on peut se demander si
+cette instruction a une dépendance de contrôle sur la boucle,
+car si dans certains cas, la boucle ne termine pas,
+{\tt L} n'est pas atteint le même nombre de fois
+dans le programme source P, et dans le programme P' dans lequel la boucle est
+remplacée par un NOP.
+
+\end{tabular}
+\end{exemple}
+
+Pour prendre en compte ce type de problème et permettre d'effectuer par la suite
+des analyses sensibles à la non-terminaison ({\it non-terminaison sensitive}),
+il faut ajouter des dépendances à toutes les instructions qui suivent
+une construction qui peut ne pas terminer comme un appel de fonction,
+ou une boucle dont on ne sait pas déterminer la terminaison.
+Dans l'absolu, il faudrait aussi s'intéresser aux autres instructions qui ont
+une terminaison anormale (\verbtt{Segmentation Fault} par exemple) mais il semble
+raisonnable de considérer que ces instructions ne sont jamais présentes exprès,
+et que leur absence doit être vérifiée par ailleurs.
+
+\subsection{Postdominateurs généralisés}
+
+\subsubsection{Définition}
+
+En cas de boucle infinie, le CFG contient des noeuds pour lesquels
+il n'existe pas de chemin vers la sortie.
+Or, pour un tel noeud \n{a},
+les postdominateurs tels que définis plus haut me peuvent pas être utilisé
+pour déterminer les dépendances de contrôle.
+En effet, on ne peut pas parler des instructions qui vont être
+forcement exécutées entre \n{a} et \nE{} car il n'existe pas de telles traces.\\
+
+La plupart des travaux existants travaillent dans ce cas sur un CFG augmenté
+dans lequel le noeud \nE{} est ajouté, ainsi que des arrêtes pour le rendre
+accessible. Outre le fait que certaines analyses n'aient pas besoin de cette
+hypothèse, et qu'une telle modification vienne ``polluer'' le CFG,
+il semble difficile (impossible ?) de ne pas ajouter
+de dépendances parasites dans le cas des boucles infinies.\\
+
+Pourtant, même si \n{a} est dans une boucle infinie,
+on a intuitivement une notion de postdominateurs. On aimerait bien dire
+qu'une instruction \n{b} postdomine une instruction \n{a} \ssi \n{b} appartient
+à tous les chemins {\bf partant de \n{a}}, c'est-à-dire~:
+
+\begin{definition}{postdominateurs généralisés}
+$$ \n{b} \in \Pdi{a} \define \forall t \in \allmch{a, -}, \n{b} \in t $$
+\end{definition}
+
+
+On ne considère donc plus uniquement les chemins qui atteignent la sortie,
+mais toutes les traces d'exécution possible.
+
+
+\subsubsection{Méthode de calcul}
+
+
+Intuitivement, si on souhaite connaître tous les noeuds qui ont b comme
+postdominateurs en considérant tous les chemins,
+on peut calculer les ensembles suivants~:
+$$
+E_b (a) = \left\{
+\begin{array}{ll}
+  {b} & \text{si } b = a\\
+  \bigcap_{s \in \succ{a}} E_b(s) & \text{sinon.}
+\end{array}\right.
+$$
+en partant d'ensembles initialement vides.
+Ce calcul termine car il est croissant.
+
+A la fin du calcul, on a :
+$$
+  \forall b, E_a (b) = \{ a \} \vee E_a (b) = \bot
+$$
+et $E_a (b) = \{ a \}$ veut bien dire que $a$ est dans tous les chemins entre
+$b$ et $a$.\\
+
+On peut faire ce calcul pour tous les points du CFG, et faire l'union de tous
+les résultats obtenus~:
+$$
+\Pdi(a) = \bigcup_{b \in CFG} E_b(a)
+$$
+Bien sûr, ce n'est pas la manière la plus efficace de faire le calcul,
+mais on voit trivialement que c'est le résultat que l'on souhaite obtenir.\\
+
+Il suffit maintenant de trouver un calcul équivalent,
+moins coûteux, mais qui termine néanmoins...
+
+En fait, il suffit de faire directement
+l'union des résultats au fur et à mesure du calcul,
+mais comment prouver la terminaison~?
+
+\subsubsection{Discussion}
+
+On remarque que cette définition ne donne pas
+les mêmes postdominateurs que précédemment
+dès qu'il y a une boucle dans le CFG, même qui la sortie \nE{} est accessible
+depuis tous les noeuds,
+car il existe alors un chemin possible qui consiste à boucler indéfiniment.
+Par conséquent, les instructions situées après la boucle ne postdomine pas les
+instructions de la boucle puisqu'il existe un chemin pour lequel on y passe pas.
+Cela traduit le fait que l'exécution de ces instructions dépend du fait que la
+boucle termine...
+
+Si on utilise cette définition des postdominateurs pour calculer des dépendances
+de contrôle, on va donc ajouter des liens entre la boucle et tout ce qui suit.
+Ces nouvelles dépendances traduisent la possible non-terminaison de la boucle,
+et peuvent donc servir dans le cadre d'une analyse préservant la non-terminaison
+comme on l'a vu précédemment.
+Mais on ne souhaite pas nécessairement ajouter toutes ces dépendances,
+car en pratique, on peut montrer par ailleurs que la plupart des boucles
+d'un programme terminent.
+
+\subsection{Postdominateurs augmentés}\label{sec-pda}
+
+On peut essayer de faire un mélange des postdominateurs classiques et des
+postdominateurs généralisés en supposant que toutes les boucles ayant une
+sortie se terminent (attention : on considère pour l'instant qu'il y a un chemin
+possible entre cette sortie et \nE), mais en considérant néanmoins
+les traces infinies dans les cas où une boucle n'a pas de sortie.
+
+\begin{definition}{postdominateurs augmentés}
+$$
+\Pda{a} = \left\{
+\begin{array}{ll}
+\{ b | \forall t \in \allmch{a, -}, b \in t \}
+  & \text{si } \allch{a, \nE} = \{\}\\
+\{ b | \forall t \in \allmch{a, \nE}, b \in t \}
+  & \text{sinon.}
+\end{array}\right.
+$$
+\end{definition}
+
+
+\subsubsection{Méthode de calcul}
+
+\newcommand{\ToRet}[1]{\ensuremath{\mathit{ToRet}(\n{#1})}}
+
+Pour faire ce calcul, il faut être capable de distinguer les chemins qui mènent
+à \nE{} des autres.
+On note \ToRet{a} la propriété qui dit que \n{a} a un chemin vers \nE.
+
+Après un calcul classique des postdominateurs (en partant de \nE),
+les postdominateurs des noeuds tels que  \ToRet{a} sont établis.
+Reste à calculer l'information pour les autres noeuds, c'est-à-dire ceux qui
+ont les postdominateurs à $\top$.
+
+Pour ceux-là, on fait un calcul similaire~:
+$$
+\Pda{x} = \{\n{x}\} \bigcup \bigcap^a_{s \in \succ{x}} \Pda{s}
+$$
+en redéfinissant simplement l'intersection utilisée de la façon suivante~:
+$$
+\Pda{a} \cap^a \Pda{b} =  \left\{
+\begin{array}{ll}
+  \Pda{a} \cap \Pda{b} & \text{si } \ToRet{a} = \ToRet{b}\\
+  \Pda{a}              & \text{si } \ToRet{a} \et \neg\ToRet{b}\\
+  \Pda{b}              & \text{si } \neg\ToRet{a} \et \ToRet{b}\\
+\end{array}\right.
+$$
+
+
+\subsubsection{Discussion}
+
+On remarque qu'avec cette définition, il existe des noeuds \n{a} tels que~:
+$$
+\succ{a} = \{\n{s1}, \n{s2}\} \et \Pda{a} \neq \Pda{s1} \cap \Pda{s2}
+$$
+dans le cas où on atteint la sortie à partir de l'un des successeurs, mais pas
+de l'autre.
+
+Par exemple, si on considère un noeud \n{c} correspondant à un {\sc IF}
+dont l'une des branche est une boucle infinie et que l'autre permet d'atteindre
+la sortie, la boucle infinie dépendra de \n{c}, alors que l'accès à la sortie
+n'en dépendra pas.
+
+
+\section{En résumé}
+
+Pour calculer les dépendances de contrôle, on commence donc par calculer les
+postdominateurs augmentés définis en \S\ref{sec-pda}.
+Puis, pour chaque saut, on calcule ses co-dépendances de contrôle de la façon
+suivante~:
+
+\begin{itemize}
+  \item pour un {\sc IF},
+    on applique la définition donné en \S\ref{sec-dpdc-if},
+    c'est-à-dire~:
+$$
+\codpdc{c} = \bigcup_{ \n{s} \in \succ{c}} \Pda{s} - \Pda{c}
+$$
+
+  \item pour un saut inconditionnel (\verbtt{goto}, \verbtt{break}, etc),
+    comme mentionné en \S\ref{sec-dpdc-goto}, on calcule~:
+$$
+\codpdc{g} = (\Pda{s} \cup \Pda{l}) - (\Pda{s} \cap \Pda{l})
+\text{  où } \left\{\begin{array}{l}
+\n{s} = \succl{g} \\
+\n{l} = \succ{g}
+\end{array}\right.
+$$
+Si on considère \n{s} et \n{l} comme deux pseudo-successeurs de \n{g},
+les pseudo-postdominateurs de \n{g} sont donnés par
+$(\Pda{s} \cap \Pda{l})$, et on retrouve bien la formule précédente.
+
+  \item pour les boucles, comme dans CIL, elles sont toutes infinies,
+on traite la séquence \verbtt{while(1) S;}
+comme si on avait \verbtt{L : S; goto L;}
+
+\end{itemize}
diff --git a/doc/pdg/data.tex b/doc/pdg/data.tex
new file mode 100644
index 0000000000000000000000000000000000000000..4cee0f9f7a085c2caeccefe1d805e5b3cca092cc
--- /dev/null
+++ b/doc/pdg/data.tex
@@ -0,0 +1,138 @@
+\chapter{Dépendances liées aux données}
+
+Le calcul de dépendances de données et d'adresse consiste principalement
+à retrouver les éléments de flot correspondant aux données utilisées dans les
+expressions.
+Mais comme les données peuvent être incluses les unes dans les
+autres, il ne suffit pas de retrouver les éléments de flot qui calculent
+exactement ces données, mais aussi ceux qui ont une intersection possible.
+
+Par exemple, dans la séquence~:\\
+  \centerline{\verbtt{d = d0; x = d.a;}}
+
+il faut être capable de voir que \verbtt{x} dépend de \verbtt{d0}.
+
+Autre exemple~: dans la séquence~:\\
+\centerline{\verbtt{d0.a = a; d0.b = b; d = d0;}}
+
+il faut voir que \verbtt{d} dépend éventuellement de la valeur initiale de \verbtt{d0}
+(si \verbtt{d0} contient d'autres champs que \verbtt{.a} et \verbtt{.b}), mais aussi
+de \verbtt{a}, et de \verbtt{b}.\\
+
+\section{Recherche arrière}
+
+Le premier calcul mis en {\oe}uvre procédait par recherche en arrière
+des éléments de la table ayant une intersection avec les données présentes en
+partie droite de l'instruction. Mais cette recherche était compliquée en cas de
+dépendances partielles comme dans le second exemple ci-dessus. Cette solution a
+donc été abandonnée.
+
+\section{Propagation avant d'un état}\label{sec-propagation-etat}
+
+La méthode finalement choisie pour calculer ces dépendances
+consiste à propager en avant, par une analyse du type flot de données,
+un \indexdef{état des données}
+qui contient pour chaque donnée, une liste de liens vers les éléments
+du graphe qui ont permis de déterminer sa valeur en ce point.
+
+Cet état doit avoir les propriétés suivantes~:
+\begin{itemize}
+\item on veut pouvoir associer un nouveau noeud à une donnée
+en précisant s'il faut faire l'union avec l'ensemble précédemment stocké.
+Par exemple~;
+\begin{itemize}
+\item pour l'instruction \verbtt{x = 3;} on construit un nouvel élément
+dans le PDG, et on mémorise dans l'état que \verbtt{x} est maintenant associé
+à cet élément. L'ancienne association est perdue.
+\item  pour l'instruction \verbtt{*p = 3;} si \verbtt{p} peut pointer sur \verbtt{x},
+il faut mémoriser que  \verbtt{x} peut être défini par l'élément du PDG
+correspondant, mais comme ce n'est pas sûr, il faut faire l'union avec
+ce qui était précédemment stocké pour \verbtt{x}.
+\end{itemize}
+\item lorsque l'on demande l'ensemble associé à une donnée,
+le résultat doit contenir au moins ce qu'on a stocké
+(il peut contenir plus d'élément en cas de perte de précision),
+\item la consultation ne doit pas modifier l'état,
+\item il faut savoir faire l'union de deux états.
+\end{itemize}
+
+La structure de donnée du module \verbtt{Lmap} de \ppc correspond à ces critères,
+et peut donc être utilisée pour ce calcul.\\
+
+\section{Propagation arrière d'un état}
+
+Une autre solution aurait pu être de propager en arrière
+un état contenant les utilisations
+de variables, et mettre à jour le graphe en rencontrant la définition.
+Le coût de ce calcul semble être le même que le précèdent,
+mais la propagation avant nous permet d'avoir, à chaque point de programme,
+un état donnant la correspondance entre une donnée et les éléments du graphe,
+même si cette donnée n'est pas utilisée à ce point.
+Cette information nous permet par la suite de définir des critères
+de \slicing moins restrictifs.
+
+\section{Traitement de l'affectation}
+
+Le principe de l'algorithme du traitement d'une affectation
+\verbtt{lval = exp;} est donc le suivant~:
+
+\begin{itemize}
+\item recherche des données $\{d_v\}$
+utilisées dans \verbtt{exp} à l'aide des résultats de l'analyse d'alias préalable,
+\item calcul de {\it dpdv},
+c'est-à-dire l'union des ensembles associées à ces données $d_v$ dans l'état,
+\item recherche des données $\{d_a\}$
+utilisées pour calculer l'adresse de {\it lval},
+\item calcul de {\it dpda}
+c'est-à-dire l'union des ensembles associées à ces données $d_a$ dans l'état,
+\item recherche de l'élément $e$
+correspondant à cette instruction dans le graphe,
+      et création de cet élément s'il n'existe pas,
+\item ajout des dépendances {\it dpdv} et  {\it dpda} à $e$,
+\item recherche des données $\{d_x\}$
+potentiellement modifiées par cette affectation,
+\item calcul du nouvel état (après l'instruction)
+en ajoutant dans l'ancien état un lien entre les $\{d_x\}$ et $e$.
+\end{itemize}
+
+\section{Déclarations}
+
+Les déclarations de variable doivent être traitées séparément
+des valeurs, car on peut parfois dépendre de l'adresse d'une variable
+sans dépendre de ce qu'elle contient.
+
+C'est par exemple le cas lorsque la variable apparaît à gauche
+d'une affectation (\verbtt{x = 3;})
+ou encore quand on n'utilise que son adresse (\verbtt{p = \&x;}).
+
+On garde donc une table qui permet de retrouver les éléments
+du graphe de dépendances qui correspondent aux déclarations.
+
+
+\section{Calcul de conditions}
+
+Les noeuds du graphe de dépendances représentant
+les calculs de condition des \verbtt{if} ou \verbtt{switch}
+ont des dépendances de donnée sur les données utilisées.
+
+\section{Dépendances de donnée dans les boucles}
+
+Pour les boucles {\it explicites}, il suffirait d'effectuer deux tours
+de la boucle pour obtenir toutes les dépendances de donnée car le premier
+capture les dépendances avec les données provenant d'avant la boucle,
+ou interne à un tour, et le second capture les dépendances entre un tour et le
+suivant.
+
+Mais comme les boucles peuvent être introduites par la présence de sauts
+quelconques,
+le plus simple est dans un premier temps d'itérer jusqu'à obtenir un point fixe
+sur l'état des données. Il faut noter que les noeuds ne sont créés que lors de la
+première itération, les suivantes n'ajoutant que de nouvelles dépendances entre
+ces noeuds. Le nombre de noeuds étant fini (de l'ordre de grandeur du nombre
+d'instruction de la fonction), l'atteignabilité du point fixe est
+garantie.
+
+\section{Appels de fonction}
+
+Le traitement des appels de fonction est présenté
+dans le chapitre \ref{sec-intro-call}
diff --git a/doc/pdg/ex-goto.fig b/doc/pdg/ex-goto.fig
new file mode 100644
index 0000000000000000000000000000000000000000..aa846c27d6b2dfef2503555170d7640267570887
--- /dev/null
+++ b/doc/pdg/ex-goto.fig
@@ -0,0 +1,113 @@
+#FIG 3.2
+Landscape
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+6 3195 2160 8010 5130
+6 3195 2385 4950 4950
+6 3195 2385 3780 2790
+1 1 0 1 0 7 50 -1 -1 0.000 1 0.0000 3465 2565 270 180 3465 2565 3735 2745
+4 1 0 50 -1 0 12 0.0000 4 150 390 3465 2610 entry\001
+-6
+6 3195 3105 3780 3510
+1 1 0 1 0 7 50 -1 -1 0.000 1 0.0000 3465 3285 270 180 3465 3285 3735 3465
+4 1 0 50 -1 0 12 0.0000 4 135 90 3465 3330 2\001
+-6
+6 3195 3825 3780 4230
+1 1 0 1 0 7 50 -1 -1 0.000 1 0.0000 3465 4005 270 180 3465 4005 3735 4185
+4 1 0 50 -1 0 12 0.0000 4 135 90 3465 4050 5\001
+-6
+6 4365 3105 4950 3510
+1 1 0 1 0 7 50 -1 -1 0.000 1 0.0000 4635 3285 270 180 4635 3285 4905 3465
+4 1 0 50 -1 0 12 0.0000 4 135 90 4635 3330 3\001
+-6
+6 4365 3825 4950 4230
+6 4590 3915 4680 4050
+4 1 0 50 -1 0 12 0.0000 4 135 90 4635 4050 4\001
+-6
+1 1 0 1 0 7 50 -1 -1 0.000 1 0.0000 4635 4005 270 180 4635 4005 4905 4185
+-6
+6 3195 4545 3780 4950
+1 1 0 1 0 7 50 -1 -1 0.000 1 0.0000 3465 4725 270 180 3465 4725 3735 4905
+4 1 0 50 -1 0 12 0.0000 4 135 90 3465 4770 6\001
+-6
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 3465 2745 3465 3105
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 3465 3465 3465 3825
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 3465 4185 3465 4545
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 4635 3465 4635 3825
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 3735 3285 4365 3285
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 4545 4185 3735 4725
+-6
+6 5715 2385 7470 4950
+6 5715 2385 6300 2790
+1 1 0 1 0 7 50 -1 -1 0.000 1 0.0000 5985 2565 270 180 5985 2565 6255 2745
+4 1 0 50 -1 0 12 0.0000 4 150 390 5985 2610 entry\001
+-6
+6 5715 3105 6300 3510
+1 1 0 1 0 7 50 -1 -1 0.000 1 0.0000 5985 3285 270 180 5985 3285 6255 3465
+4 1 0 50 -1 0 12 0.0000 4 135 90 5985 3330 2\001
+-6
+6 5715 3825 6300 4230
+1 1 0 1 0 7 50 -1 -1 0.000 1 0.0000 5985 4005 270 180 5985 4005 6255 4185
+4 1 0 50 -1 0 12 0.0000 4 135 90 5985 4050 5\001
+-6
+6 6885 3105 7470 3510
+1 1 0 1 0 7 50 -1 -1 0.000 1 0.0000 7155 3285 270 180 7155 3285 7425 3465
+4 1 0 50 -1 0 12 0.0000 4 135 90 7155 3330 3\001
+-6
+6 5715 4545 6300 4950
+1 1 0 1 0 7 50 -1 -1 0.000 1 0.0000 5985 4725 270 180 5985 4725 6255 4905
+4 1 0 50 -1 0 12 0.0000 4 135 90 5985 4770 6\001
+-6
+6 6885 3825 7470 4230
+6 7110 3915 7200 4050
+4 1 0 50 -1 0 12 0.0000 4 135 90 7155 4050 4\001
+-6
+1 1 0 1 0 7 50 -1 -1 0.000 1 0.0000 7155 4005 270 180 7155 4005 7425 4185
+-6
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 5985 2745 5985 3105
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 5985 3465 5985 3825
+2 1 1 2 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
+	0 0 1.00 60.00 120.00
+	 5985 4185 5985 4545
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 6255 3285 6885 3285
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 6255 3285 7155 3825
+-6
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 7515 4860 7965 4860
+2 1 1 2 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
+	0 0 1.00 60.00 120.00
+	 7515 5085 7965 5085
+2 1 1 2 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
+	0 0 1.00 60.00 120.00
+	 6975 3375 6255 4725
+4 1 0 50 -1 2 12 0.0000 4 135 375 4365 2295 CFG\001
+4 1 0 50 -1 2 12 0.0000 4 135 390 6885 2295 PDG\001
+4 1 0 50 -1 2 10 0.0000 4 150 675 7065 4860 CDG edge\001
+4 1 0 50 -1 2 10 0.0000 4 150 690 7065 5085 DDG edge\001
+-6
diff --git a/doc/pdg/goto.fig b/doc/pdg/goto.fig
new file mode 100644
index 0000000000000000000000000000000000000000..ac14cc5a0d07c360da3514b4e19bb0a49bfe7832
--- /dev/null
+++ b/doc/pdg/goto.fig
@@ -0,0 +1,35 @@
+#FIG 3.2
+Portrait
+Center
+Metric
+A4
+100.000000
+Single
+-2
+1200 2
+0 32 #ffffff
+6 0 0 0 0
+1 1 0 1 32 32 0 0 20 0.000000 1 0.0 5722 1299 767 472 0 0 0 0
+1 1 0 1 0 -1 0 0 -1 0.000000 1 0.0 5722 1299 767 472 0 0 0 0
+4 1 0 0 0 16 22.762205 0.0 6 0.0 0.0 5722 1393 G\001
+-6
+6 0 0 0 0
+1 1 0 1 32 32 0 0 20 0.000000 1 0.0 5090 3622 767 472 0 0 0 0
+1 1 0 1 0 -1 0 0 -1 0.000000 1 0.0 5090 3622 767 472 0 0 0 0
+4 1 0 0 0 16 22.762205 0.0 6 0.0 0.0 5090 3716 S\001
+-6
+6 0 0 0 0
+2 1 0 1 0 0 0 0 -1 0.000000 0 0 0 1 0 4
+  0 0 3.149606 236.220472 236.220472
+	6490 1299 6962 1299 6962 5756 6490 5756 
+-6
+6 0 0 0 0
+1 1 0 1 32 32 0 0 20 0.000000 1 0.0 5722 5756 767 472 0 0 0 0
+1 1 0 1 0 -1 0 0 -1 0.000000 1 0.0 5722 5756 767 472 0 0 0 0
+4 1 0 0 0 16 22.762205 0.0 6 0.0 0.0 5722 5851 L\001
+-6
+6 0 0 0 0
+2 1 1 1 0 0 0 0 -1 12.598425 0 0 0 1 0 4
+  0 0 3.149606 236.220472 377.952756
+	5722 1771 5722 2460 5090 2460 5090 3149 
+-6
diff --git a/doc/pdg/impact.tex b/doc/pdg/impact.tex
new file mode 100644
index 0000000000000000000000000000000000000000..0913b6f62d7edd6102b9aa3f8016ed7a20b4da8d
--- /dev/null
+++ b/doc/pdg/impact.tex
@@ -0,0 +1,205 @@
+\chapter{Aide à l'analyse d'impact}\label{sec-impact}
+
+Le document \cite{baudinImpact} spécifie un outil d'aide à l'analyse d'impact
+après avoir analysé les besoins dans ce domaine.
+L'exploitation du graphe de dépendances est présenté comme étant 
+un composant important de cet outil.
+Nous reprenons ici les éléments de spécification 
+décrits dans le paragraphe 5.3 de ce document,
+auxquels nous ajoutons quelques nouveaux critères.\\
+
+
+\section{Définition d'ensembles}\label{sec-ensembles}\label{sec-defR}
+
+\newcommand{\remitem}[1]{\begin{itemize}\item #1 \end{itemize}}
+\newcommand{\warnitem}[1]{\begin{itemize}\item[$\blacktriangle$] #1
+                          \end{itemize}}
+\newcommand{\question}[1]{\begin{itemize}\item[{\bf ?}] #1 \end{itemize}}
+\newcommand{\smilitem}[1]{\begin{itemize}\item[$\smiley$] #1 \end{itemize}}
+\newcommand{\frownitem}[1]{\begin{itemize}\item[$\frownie$] #1 \end{itemize}}
+
+
+Il s'agit de définir des sous-ensembles d'instructions
+répondant à différents critères.
+
+Donnons tout d'abord quelques notations :
+\begin{itemize}
+\item S : un ensemble d'instructions,
+\item L : un point de programme,
+\item V : une zone mémoire (le V se réfère à {\bf V}ariable,
+mais il peut s'agir d'une donnée quelconque comme un champ de structure ou
+un élément de tableau),
+\end{itemize}
+
+Les ensembles sont tous relatifs à un point de programme $L$,
+et peuvent se classer en deux catégories~:
+\begin{itemize}
+\item ceux qui contiennent des instructions situées {\bf avant} $L$~: 
+ils portent un indice 0,
+\item et ceux qui contiennent des instructions situées {\bf après} $L$~:
+ils portent un indice 1.\\
+\end{itemize}
+
+\begin{description}
+\item[$R_0(S,L)$]  : sous-ensemble d'instructions de S depuis lesquelles 
+L est accessible.
+\warnitem{mais L ne postdomine pas forcement toutes les instructions de cet ensemble.} 
+
+\item[$R_{1}(S,L)$] : sous-ensemble d'instructions de S 
+qui sont (éventuellement) accessibles depuis L.
+
+\item[$R_{L0}(S,L)$] : accessibilité à un point du code.
+\remitem{il s'agit du sous-ensemble des instructions de $R_0(S,L)$
+qui conditionnent le passage en L,
+c'est-à-dire les instructions de branchement 
+et les dépendances de ces conditions de branchement.
+}
+
+%\item[$R_{L1}(S,L)$] : ?
+
+\item[$R_{V0}(S,L,V)$] : contenu d'une zone mémoire en un point du code.
+\remitem{il s'agit du critère traditionnel de \slicing,
+c'est-à-dire que cet ensemble contient les instructions de $S$ qui 
+ont une influence sur la valeur de $V$ en $L$.
+}
+
+\item[$R_{V1}(S,L,V)$] : utilisation d'une zone mémoire.
+\remitem{il s'agit du sous-ensemble des instructions de $R_{1}(S,L)$
+influencées par la valeur qu'à la zone mémoire $V$ a en $L$.}
+
+\item[$R_{DV0}(S,L,V)$] : définition de la valeur d'une variable à un point de
+programme.
+\remitem{il s'agit de l'ensemble des instructions qui {\bf définissent}
+tout ou partie de la valeur de $V$ en $L$. Ces instructions 
+sont donc nécessairement des affectations ou des appels de fonction.
+
+On note que~: $R_{DV0}(S,L,V) \subseteq R_{V0}(S,L,V)$
+}
+\warnitem{
+Il serait probablement utile d'avoir un élément spécial 
+qui indique qu'il existe 
+un ou plusieurs chemin menant à $L$ pour le(s)quel(s) 
+$V$ n'est pas entièrement défini.
+}
+
+\item[$R_{DV1}(S,L,V)$] : modification de la valeur d'une variable.
+\remitem{il s'agit de trouver les instructions $I_i$ accessibles depuis L
+qui modifient la valeur de $V$,
+et telles qu'il existe un chemin entre $L$ et $I_i$
+le long duquel $V$ n'est pas modifiée.
+Cela signifie que ces instructions sont les premières à modifier la valeur
+de $V$ sur les chemins partant de $L$.}
+\remitem{Il n'est pas sûr que cet ensemble soit très utile.
+L'ensemble $R_{P1}(S,L,V)$ ci-dessous en sans doute plus intéressant.
+}
+
+\item[$R_{P0}(S,L,V)$] : 
+portée arrière de la valeur d'une variable à un point de programme.
+\remitem{il s'agit d'un sous-ensemble de $R_{L0}(S,L)$
+contenant les instructions $I_i$ pour lesquelles la valeur de $V$
+n'a été modifiée sur aucun chemin entre le point qui précède $I_i$ et $L$.
+C'est-à-dire que la valeur de $V$ en $L$ est la même qu'avant chacune de ces
+instructions, et qu'elle n'est pas modifiée entre les deux.
+}
+
+\item[$R_{P1}(S,L,V)$] : 
+portée de la valeur d'une variable à un point de programme~.
+\remitem{il s'agit d'un sous-ensemble de $R_{1}(S,L)$
+contenant les instructions $I_i$ pour lesquelles la valeur de $V$ 
+n'a été modifiée sur aucun chemin entre $L$ et le point de programme 
+qui précède $I_i$.
+}
+
+\item[$R_{PV0}(S,L,V)$] : utilisation arrière d'une zone mémoire dans sa portée.
+\remitem{il s'agit du sous-ensemble des instructions $R_{P0}(S,L,V)$
+qui sont influencées, directement ou non, par $V$. 
+}
+
+\item[$R_{PV1}(S,L,V)$] : utilisation d'une zone mémoire dans sa portée.
+\remitem{il s'agit du sous-ensemble 
+         des instructions influencées, directement ou non, 
+         par la valeur de $V$ en $L$
+         qui sont dans la portée de cette valeur.
+
+         On a donc : $R_{PV1}(S,L,V) = R_{V1}(S,L,V) \cap R_{P1}(S,L,V)$
+        }
+
+\end{description}
+
+\begin{exemple1}
+On montre ici différents ensembles relatifs au point $L$
+et à la variable $v$~:
+\end{exemple1}
+
+\begin{center}
+\begin{scriptsize}
+\begin{tabular}{|l||c|c|c|c|c|c||c|c|c|c|c| }
+\hline
+S & $R_{0}$ & $R_{L0}$ & $R_{V0}$ & $R_{DV0}$ & $R_{P0}$ & $R_{VP0}$
+            & $R_{1}$ & $R_{V1}$ & $R_{DV1}$ & $R_{P1}$ & $R_{VP1}$ \\
+\hline
+\verb!!                      &   &   &   &   &   &   &   &   &   &   &  \\
+\verb!v = a; !               & X & X & X & X &   &   &   &   &   &   &  \\
+\verb!x = b; !               & X &   & X &   &   &   &   &   &   &   &  \\
+\verb!z = c; !               & X &   &   &   &   &   &   &   &   &   &  \\
+\verb!if (c1>v) { !          & X & X & X &   &   &   &   &   &   &   &  \\
+\verb!  z++;    !            &   &   &   &   &   &   &   &   &   &   &  \\
+\verb!  }       !            &   &   &   &   &   &   &   &   &   &   &  \\
+\verb!else {    !            &   &   &   &   &   &   &   &   &   &   &  \\
+\verb!  if (c2) !            & X & X & X &   &   &   &   &   &   &   &  \\
+\verb!    v += x; !          & X & X & X & X &   &   &   &   &   &   &  \\
+\verb!    if (c3) { !        & X & X & X &   & X &   &   &   &   &   &  \\
+\verb!      z += v; !        & X & X &   &   & X & X &   &   &   &   &  \\
+\hline
+{\tt\bf L:}
+  \verb!    y = v; !         &   &   &   &   &   &   & X & X &   & X & X \\
+\verb!       z++;   !        &   &   &   &   &   &   & X &   &   & X &   \\
+\verb!       v++; !          &   &   &   &   &   &   & X & X &   & X & X \\
+\verb!       } !             &   &   &   &   &   &   &   &   &   &   &   \\
+\verb!  z += 2*y; !          &   &   &   &   &   &   & X & X &   &   &   \\
+\verb!  }      !             &   &   &   &   &   &   &   &   &   &   &   \\
+\verb!z += x;  !             &   &   &   &   &   &   & X & X &   &   &   \\
+\verb!v = 0; !               &   &   &   &   &   &   &   &   & X &   &   \\
+\verb!!                      &   &   &   &   &   &   &   &   &   &   &   \\
+\hline
+\end{tabular}\end{scriptsize}\end{center}
+\begin{exemple2}
+\end{exemple2}
+
+La construction des ensembles ci-dessus exploite le CFG (le flot de contrôle)
+et le PDG (les dépendances).\\
+
+La construction des ensembles ci-dessous exploite en plus la sémantique du
+programme car elle utilise une contrainte $C(...v_i...)$ portant
+sur les valeurs des données en $L$~:
+
+\begin{description}
+\item[$R_{C0}(S,L,C(...v_i...))$] :
+accessibilité contrainte à un point.
+\remitem{il s'agit de déterminer l'ensemble des instructions
+qui, si elles sont présentes, rendent fausse la contrainte $C$ au point $L$.
+En fait, il s'agit de déplacer $C$ pour essayer de couper des branches.
+La condition de branchement sera alors éventuellement
+remplacée par un \verbtt{assert}.
+}
+\smilitem{Dans la séquence \verbtt{int x = 0; x=x-1; L:} pour laquelle
+on a une contrainte $x \ge 0$, il ne s'agit pas de supprimer l'instruction
+\verbtt{x=x-1;} mais bien de dire que cette branche est impossible...}
+
+\item[$R_{C1}(S,L,C(...v_i...))$] : accessibilité contrainte depuis un point.
+\remitem{il s'agit de déterminer le sous-ensemble des instructions de
+$R_{1}(S,L)$ qui ne peuvent pas être atteintes si l'état en L est tel que 
+$C$ est satisfaite.\\
+
+
+On notera que certaines instructions n'appartenant ni à $R_{L0}$, ni à $R_{1}$
+peuvent également ne pas être atteintes du fait de la contrainte.\\
+
+}
+\end{description}
+
+\section{Exploitation du graphe pour le calcul d'ensembles}
+
+La plupart des ensembles définis en \ref{sec-ensembles}
+peuvent être calculés simplement en exploitant le flot de contrôle
+et les fonction du graphe de dépendances présentées en \$\ref{sec-find}.
diff --git a/doc/pdg/intro.tex b/doc/pdg/intro.tex
new file mode 100644
index 0000000000000000000000000000000000000000..8336e2eca54b41a5e94587291088e31301e9763f
--- /dev/null
+++ b/doc/pdg/intro.tex
@@ -0,0 +1,246 @@
+\chapter{Introduction}
+
+\section{Objectif}
+
+L'objectif initial a été de réaliser un module de \slicing
+dans le cadre d'un outil généraliste d'analyse de programme (voir
+\cite{ppcSlicing}).
+Or, la plupart des réductions à effectuer se basent sur l'analyse des
+dépendances entre les données du programme.
+En effet, si l'utilisateur demande la sélection
+d'une instruction \verb!return x;!, il va falloir retrouver ce qui permet de
+calculer cette valeur de \verbtt{x} dans les instructions qui précèdent.\\
+
+Il s'agit donc de calculer le \indexdef{graphe de dépendances} d'une fonction
+(appelé \indexdef{PDG}~: {\it Program Dependence Graph} dans la littérature)
+c'est-à-dire de représenter finement les liens de
+dépendances entre les différentes instructions qui la composent.
+Le résultat ce calcul est un graphe dans lequel les sommets
+représentent les instructions,
+éventuellement décomposées en plusieurs noeuds représentant
+le calcul d'informations élémentaires.\\
+
+Dans le cadre de l'outil de \slicing,
+l'intérêt de ce calcul préalable est de pouvoir
+travailler en plusieurs passes lors de l'application des
+requêtes de réduction sans avoir à
+refaire ce calcul qui peut être lourd (alias, dépendances partielles, etc). En
+effet, même si l'on souhaite à terme calculer des réductions qui utilisent
+davantage la sémantique du programme, les réductions à l'aide des dépendances
+peuvent simplifier le problème.\\
+
+Par la suite, il a été jugé intéressant de considérer ce calcul
+comme un module à part entière car il peut avoir d'autres
+utilités comme étudier la
+propagation du flot d'information pour des analyses de sécurité, par exemple.
+
+\section{Spécifications du PDG}\label{sec-flot}
+
+Le PDG que l'on souhaite calculer comporte plusieurs types de dépendances~:
+
+\subsection{Dépendances sur la valeur des données}
+
+Les \indextxtdef{dépendances sur la valeur}{dépendance!valeur}
+d'une donnée sont les plus intuitives.
+
+\begin{exemple}
+  \begin{tabular}{m{3.5cm}m{\linewidth-4.3cm}}
+\begin{clisting}
+x = a + b;
+\end{clisting}
+&
+Ici, \verbtt{x} dépend de
+\verbtt{a} et \verbtt{b} car la valeur de \verbtt{x} après cette instruction dépend
+des valeurs de \verbtt{a} et \verbtt{b} avant.
+\end{tabular}
+\end{exemple}
+
+La question se pose néanmoins de définir la granularité à laquelle
+on s'intéresse aux données.
+L'utilisation d'autres analyses et structures de données de \ppc
+conduit à choisir la même précision
+(pour plus de détail, voir par exemple l'analyse de valeurs de \ppc).
+
+\subsection{Dépendances de calcul d'adresse}
+
+Pour les affectations, la valeur qui est écrite en mémoire dépend de la partie
+droite, mais le choix de l'adresse à laquelle on l'écrit peut également dépendre
+de variables qui apparaissent dans la partie gauche.
+
+\begin{exemple}
+\begin{tabular}{m{3.5cm}m{\linewidth-4.3cm}}
+\begin{clisting}
+*p = x;
+\end{clisting}
+&
+Ici, la valeur de la donnée modifiée dépend de \verbtt{x},
+mais le choix de la case dans laquelle on la range dépend de \verbtt{p}.
+En effet, si $p$ pointe sur $a$ ou $b$, c'est soit  \verbtt{a} soit \verbtt{b} qui
+va être modifié. 
+\end{tabular}
+\end{exemple}
+
+On parle alors de \indextxtdef{dépendances sur l'adresse}{dépendance!adresse}.
+
+\subsection{Dépendances de contrôle}
+
+Lorsqu'une donnée peut-être modifiée par plusieurs chemins d'exécution,
+elle dépend des conditions qui permettent de choisir le chemin.
+
+\begin{exemple}
+\begin{tabular}{m{3.5cm}m{\linewidth-4.3cm}}
+\begin{clisting}
+if (c) 
+  x = a;
+L :
+\end{clisting}
+& 
+La valeur de \verbtt{x} en \verbtt{L} dépend de \verbtt{a}, mais aussi de \verbtt{c}.\\
+\end{tabular}
+\end{exemple}
+
+Il s'agit d'une \indextxtdef{dépendance de contrôle}{dépendance!contrôle}.
+
+\subsection{Dépendances sur les déclarations}
+
+Lorsque des variables sont utilisées dans une instruction, celle-ci dépend de
+leurs déclarations, car si on veut la compiler, il faut que les variables
+existent.
+
+Les déclarations des variables lues (partie droite d'une affectation) sont
+considérées comme participant au calcul de la valeur.
+Les déclarations des
+variables utilisées pour déterminer la case affectée (partie gauche d'une
+affectation) sont considérées comme des dépendances sur l'adresse.
+
+\begin{exemple}
+\begin{tabular}{m{3.5cm}m{\linewidth-4.3cm}}
+\begin{clisting}
+/* 1 */ int x;
+/* 2 */ int y;
+...
+/* i */ x = 3;
+/* j */ y = 4;
+...
+/* n */ x = y;
+\end{clisting}
+&
+L'instruction (n) a une dépendance d'adresse sur la déclaration de x (1),
+et des dépendances de donnée sur l'affectation de y (j)
+et sa déclaration (2). Dans ce cas, on aurait pu se passer de de cette dernière
+dépendance car (j) dépend déjà de (2), mais ce n'est pas forcement le cas
+en présence d'alias.
+\end{tabular}
+\end{exemple}
+
+\subsection{Résumé}
+
+On voit donc qu'on distingue trois types de dépendances~:
+\begin{itemize}
+\item les calculs de valeurs,
+\item les calculs d'adresses,
+ \item le contrôle.
+\end{itemize}
+
+
+\section{État de l'art}\label{sec-lart}
+
+Voyons tout d'abord ce que dit la littérature sur ce sujet
+afin de voir les solutions qui peuvent répondre à notre besoin,
+et les points à modifier.
+
+\subsection{Origine}
+
+Les graphes de dépendances ont principalement été étudiés dans le cadre du
+\slicing{}, mais ils sont aussi utilisés dans les travaux sur la compilation.
+
+\subsection{Graphes de dépendances}
+
+\cite{Ottenstein84}, puis \cite{Ferrante87}
+introduisent la notion de PDG ({\it Program Dependence Graph}).
+Un tel graphe est utilisé pour représenter les différentes dépendances
+entre les instructions d'un programme.
+Ils l'exploitent pour calculer les instructions
+qui influencent la valeur des variables en un point.\\
+
+Cette représentation, initialement intraprocédurale, a été étendue
+à l'analyse interprocédurale dans \cite{horwitz88interprocedural} où elle
+porte le nom de SDG ({\it System Dependance Graph}).
+Elle est maintenant, à quelques variantes près,
+quasiment universellement utilisée.
+
+\subsection{Exploitation du graphe}
+
+Lorsque l'on utilise le graphe de dépendance pour faire du \slicing,
+le calcul se résume à un problème d'accessibilité à un noeud car comme le dit
+Susan Horwitz~:
+
+\begin{definition}{slicing selon \cite{horwitz88interprocedural}}
+A slice of a program with respect to program point p and variable x
+consists of a set of statements of the program that might affect
+the value of x at p.
+\end{definition}
+
+c'est-à-dire qu'il faut garder toutes les instructions correspondant à des
+noeuds du graphe pour lesquels il existe un chemin vers le noeud représentant le
+calcul de {\tt x} en {\tt p}.
+Mais le problème est que ce noeud n'existe que si {\tt x} est défini
+par l'instruction située en {\tt p}.
+
+Nous verrons que cette limitation peut être levée si l'on garde
+(ou recalcule) les structures de données utilisées
+lors de la construction du graphe.\\
+
+Le traitement des appels de fonction est souvent compliqué par le fait qu'il
+est également ramené à un problème d'accessibilité dans un graphe qui,
+cette fois, représente toute l'application. Or, dans un tel graphe,
+si on ne prend pas de précautions supplémentaires,
+on parcourt des chemins impossibles qui entrent dans une fonction
+par un appel, et sortent par un autre site d'appel.
+Ces chemins existent en effet dans le graphe,
+mais pas dans la réalité.
+
+Comme nous nous proposons de traiter ce problème de manière modulaire,
+nous devrions échapper à une partie de ce problème.
+Mais nous verrons par la suite que l'utilisation d'une analyse d'alias globale
+produit néanmoins quelques effets de bord indésirables.
+
+\subsection{Programmes non structurés}
+
+Les premiers algorithmes utilisés fonctionnent
+correctement sur des programmes structurés,
+mais produisent des résultats erronés en présence de \verbtt{goto}.
+
+Le problème vient du fait que ces instructions ne modifient pas de données~:
+il n'y a donc pas de dépendance de donnée~; et il n'y a pas
+de dépendance de contrôle non plus car dans le CFG,
+une seule branche sort du noeud pour aller vers le point de branchement.
+
+Plusieurs personnes (\cite{Choi94},  \cite{agrawal94slicing},
+\cite{harman98new},  \cite{kumar02better} entre autres)
+se sont donc intéressées
+aux sauts (\verbtt{goto}) qui brisaient la structure du programme.
+Ce point, qui nous intéresse tout particulièrement, est présenté en détail
+en \S\ref{sec-cdg}.
+
+\subsection{Pointeurs et données structurées}
+
+De nombreux articles s'intéressent aux traitements des données structurées,
+et plus encore des pointeurs. Dans le cadre de cette étude,
+nous n'avons pas exploré ces recherches étant donné que
+nous nous appuyons déjà sur une analyse d'alias précise.
+
+
+%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+\section{Plan}
+
+Les trois chapitres suivants
+exposent comment est calculé notre graphe de dépendances.
+
+Puis, nous verrons au chapitre \ref{sec-find} comment
+exploiter les informations calculées et au chapitre
+\ref{sec-mark} comment associer des informations aux éléments
+et les propager dans le graphe.
+
+
+%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/doc/pdg/macros_pdg.tex b/doc/pdg/macros_pdg.tex
new file mode 100644
index 0000000000000000000000000000000000000000..8741fa85bf26ba576ae7c68f2b2e1910dd5f3286
--- /dev/null
+++ b/doc/pdg/macros_pdg.tex
@@ -0,0 +1,130 @@
+%==============================================================================
+\usepackage{tabularx}
+\usepackage{wasysym}
+\usepackage{stmaryrd}
+
+%------------------------------------------------------------------------------
+\newcommand{\setenvclass}[2]{}
+
+\usepackage{listings}
+% TODO :
+\lstdefinestyle{clststyle}{}
+\lstnewenvironment{clisting}
+  {
+   \setenvclass{lstlisting}{clisting}
+   \lstset{language=C, style=clststyle}}
+  {}
+%-----------------------------------------------
+% Commandes pour mettre des ref dans l'index :
+\newcommand{\idb}[1]{\textbf{#1}}
+\newcommand{\indextxt}[1]{\index{#1}{\bf #1}}
+\newcommand{\indexdef}[1]{\index{#1|idb}{{\bf #1}}}
+\newcommand{\indextxtdef}[2]{\index{#2|idb}{{\bf #1}}}
+
+%-----------------------------------------------
+% quelques "mots" spéciaux
+\newcommand{\slicing}{{\it slicing}\xspace}
+\newcommand{\slicingb}{{\it slicing\ }}
+           % permet de corriger les cas où \slicing est suivi d'une {
+           % car il semble que xspace gère mal ce cas.
+\newcommand{\caml}{{\sc Ocaml}\xspace}
+\newcommand{\caveat}{{\sc Caveat}\xspace}
+\newcommand{\cil}{{\sc CIL}\xspace}
+\newcommand{\ppc}{{\sc Frama-C}\xspace}
+\newcommand{\from}{{\sc From}\xspace}
+
+\newcommand{\mylet}{\text{\it let }}
+\newcommand{\myin}{\text{\it in }}
+%------------------------------------------------------------------------------
+\newcommand{\verbtt}[1]{{\small{\tt{#1}}}}
+%------------------------------------------------------------------------------
+% Légende des figures :
+\usepackage[hang,small]{caption}
+\renewcommand{\captionfont}{\it}
+\renewcommand{\captionlabelfont}{\it \bf \small}
+%\renewcommand{\captionlabeldelim}{ : }
+%-----------------------------------------------
+% prend le nom du fichier
+% et éventuellement un facteur d'échelle (1 par défaut)
+\newcommand{\uneimage}[2][1]{
+    \includegraphics[width=(#1)\textwidth]{#2}
+}
+%--------------------------------
+\newcommand{\labcenterepsfig}[3]{
+  \begin{center}
+  \begin{figure}[hbt]
+    \centering{
+    \leavevmode
+    \uneimage{#1}
+    }
+    \caption{\label{#3} #2}
+  \end{figure}
+  \end{center}
+  }
+%------------------------------------------------------------------------------
+\newenvironment{debutenv}[1]
+  {
+    \vspace{5mm}
+    \begin{footnotesize}
+      \setenvclass{minipage}{myminipage}
+      \noindent\begin{minipage}[t]{\textwidth}
+      \fbox{\bf #1} \hrule
+    \vspace{3mm}
+  }
+  {
+    \end{minipage}
+    \end{footnotesize}
+  }
+\newenvironment{finenv}
+  {
+    \begin{footnotesize}
+      \setenvclass{minipage}{myminipage}
+    \noindent\begin{minipage}[t]{\textwidth}
+  }
+  {
+    \hrule
+    \
+    \end{minipage}
+    \end{footnotesize}
+    \vspace{5mm}
+  }
+\newenvironment{monenv}[1]
+  {\begin{debutenv}{#1}}
+  {\end{debutenv}
+   \par
+   \begin{finenv}
+   \end{finenv}}
+
+\newcounter{numexemple}
+\newcommand{\titreexemple}{%
+  \stepcounter{numexemple}{Exemple \arabic{numexemple}}}
+
+\newenvironment{exemple}
+  {\begin{monenv}{\titreexemple}}
+  {\end{monenv}}
+
+\newenvironment{exemple1}
+  {\begin{debutenv}{\titreexemple}}
+    {\end{debutenv}}
+
+\newenvironment{exemple2}
+  {\begin{finenv}}
+    {\end{finenv}}
+
+\newenvironment{astuce}
+  {\begin{monenv}{Astuce}}
+  {\end{monenv}}
+
+\newenvironment{definition}[1]
+  {\begin{monenv}{Definition (#1)}}
+  {\end{monenv}}
+
+\newenvironment{algo}[1]
+  {\begin{monenv}{Algorithme (#1)}}
+  {\end{monenv}}
+
+\newcounter{numrque}
+\newenvironment{remarque}[1]
+  {\refstepcounter{numrque}{\bf Remarque \arabic{numrque}} :\label{#1}}
+  {}
+%==============================================================================
diff --git a/doc/pdg/main.tex b/doc/pdg/main.tex
new file mode 100644
index 0000000000000000000000000000000000000000..3cf6f09d404672b752373e4173fd65c837b63ff2
--- /dev/null
+++ b/doc/pdg/main.tex
@@ -0,0 +1,28 @@
+\documentclass[a4paper,11pt,twoside,openright,web,lang=french]{frama-c-book}
+
+\input{macros_pdg.tex}
+\input{./frama-c-affiliation.tex}
+%==============================================================================
+\begin{document}
+
+\coverpage{PDG --- Documentation technique}
+
+\begin{titlepage}
+\begin{flushleft}
+\includegraphics[height=14mm]{../images/cealistlogo.jpg}
+\end{flushleft}
+\vfill
+\title{Documentation du greffon PDG}{Calcul de dépendances dans un programme C}
+\author{Anne Pacalet et Patrick Baudin}
+\begin{tabular}{l}
+  \fcaffiliationfr
+\end{tabular}
+\vfill
+\begin{flushleft}
+  \textcopyright 2007-2020 CEA LIST
+
+\end{flushleft}
+\end{titlepage}
+\input{pdg.tex}
+
+\end{document}
diff --git a/doc/pdg/mark.tex b/doc/pdg/mark.tex
new file mode 100644
index 0000000000000000000000000000000000000000..4e78cbd66eabf5fbce3835af9acfdb9a45a994cc
--- /dev/null
+++ b/doc/pdg/mark.tex
@@ -0,0 +1,159 @@
+\chapter{Marquage générique}\label{sec-mark}
+
+\section{Objectif}
+
+On souhaite pouvoir associer une information à certains éléments d'un PDG,
+propager cette information dans les dépendances de ces éléments,
+et calculer ce qu'il faut propager dans les autres PDG de l'application
+pour avoir un traitement interprocédural cohérent. \\
+
+Par exemple, l'information peut être un simple booléen qui indique si l'élément
+correspondant est visible ou non. Pour qu'un élément soit visible, il faut que
+toutes ses dépendances le soit aussi.
+On voit dans cet exemple qu'on s'intéresse dans un premier temps à une
+propagation arrière.\\
+
+Comme un PDG est associé à une fonction, la propagation s'arrête aux entrées
+de la fonction. Par ailleurs, les appels de fonction sont traités localement,
+sans descendre dans la fonction appelée.
+Pour gérer la propagation interprocédurale, les fonctions élémentaires de
+marquage doivent fournir l'information à propager aussi bien dans les fonctions
+appelées que dans les appelants.
+
+\section{Marquage générique}
+
+Le marquage pouvant être utilisé pour différents besoins,
+les marques peuvent être définies par l'utilisateur.
+Il lui suffit de définir comment en faire l'union.
+
+On utilise deux types d'union~:
+\begin{itemize}
+  \item l'une permet de faire une simple union de deux marques,
+  \item l'autre permet d'ajouter une marque à un élément de programme~:
+    elle calcule donc une nouvelle marque à partir de l'ancienne,
+    et de la marque à ajouter et fournit aussi la marque à propager dans les
+    dépendances.
+\end{itemize}
+
+\section{Propagation arrière}
+
+\subsection{Marquage intraprocédural}
+
+La propagation arrière s'effectue très simplement en suivant les dépendances,
+en ajoutant la marque propagée à la marque existante,
+et en s'arrêtant quand la marque à propager rendue par la fonction de marquage
+est $m_{\bot}$.\\
+
+En cours de propagation, lorsque l'on traite un élément correspondant à la
+sortie d'un appel de fonction, ou à une entrée de la fonction courante,
+la marque à propager ainsi que l'identifiant de l'élément sont stockés.
+A l'issu du marquage, on a donc~:
+\begin{itemize}
+  \item un ensemble de couple (entrée de la fonction, marque à propager),
+  \item une liste des appels de fonction, avec pour chacun un ensemble de
+    couples (sortie de l'appel, marque à propager).
+\end{itemize}
+
+C'est cette information qui permettra de faire la propagation interprocédurale.
+
+\subsection{Propagation interprocédurale}
+
+\subsubsection{Méthode automatique}
+
+Le module de marquage permet de faire automatiquement
+la propagation interprocédurale si on le souhaite.
+Il est utilisé de cette façon dans la détection de code mort par exemple.\\
+
+L'utilisateur peut, s'il le souhaite,
+donner des fonctions de transformation des marques~:
+\begin{itemize}
+  \item une qui est utilisée pour transformer les marques des entrées d'une
+    fonction avant la propagation dans les appelants,
+  \item une autre qui est utilisée pour transformer les marques des sorties
+    d'un appel de fonction avant propagation dans la fonction appelée.
+\end{itemize}
+Dans les cas les plus simples, ces fonctions ne font rien, et rendent
+simplement la marque qui leur est passée.
+
+\subsubsection{Méthode manuelle}
+
+Dans certains cas, il est souhaitable de gérer cette propagation à la main.
+C'est par exemple le cas dans le \slicing{} où une fonction source est associée
+à plusieurs marquages différents.\\
+
+Des fonctions aident néanmoins à retrouver les éléments à marquer dans les
+autres fonctions à partir du résultat fourni par le marquage intraprocédural.
+Ces fonctions traduisent les informations~:
+\begin{itemize}
+  \item (entrée de la fonction, marque à propager) en un ensemble d'éléments à
+    marquer dans une~- ou toutes les~- fonction(s) appelante(s),
+  \item (appel, \{(sortie de l'appel, marque à propager)\})
+    en un ensemble d'éléments à marquer dans la fonction appelée.
+\end{itemize}
+Les éléments rendu sont les nouveaux points de départ de marquages
+intraprocéduraux.
+L'utilisateur peut, comme lors de la propagation automatique,
+donner des fonctions de transformation des marques aux traductions.
+
+\subsubsection{Données non définies}
+
+Lorsque les points de départ marquage initial sont des éléments du PDG,
+toutes les propagations s'effectueront a priori sur des éléments existant.
+Mais ce n'est pas forcement le cas lorsqu'il s'agit de marquer les données
+qui n'interviennent pas dans les calculs. Par exemple~:
+
+\begin{exemple}
+  \begin{verbatim}
+int X1, X2;
+
+void f (int x) { /*@ assert X1 >= 0; */ return x + 1; }
+
+void f2 (void)  { X2 = f (2); }
+
+void main (void) { X1 = 0; X2 = 0; f2 (); }
+  \end{verbatim}
+
+  Ici, si on s'intéresse à l'assertion de \verbtt{f}, il faut sélectionner
+  \verbtt{X1} à l'entrée de \verbtt{f}, propager cette information à travers
+  \verbtt{f2} pour enfin marquer l'affectation à \verbtt{X1} dans le \verbtt{main}
+  alors que cette donnée n'apparaît pas dans les PDG de \verbtt{f} et \verbtt{f2}.
+\end{exemple}
+
+On voit donc que dans les informations fournies et calculées
+pour gérer l'interprocédural, il peut y avoir des éléments ne correspondant
+pas à des noeuds de PDG.
+
+\subsubsection{Terminaison}
+
+La terminaison du processus dépend de la définition des marques.
+C'est donc à l'utilisateur de s'assurer que celle-ci permet la stabilisation du
+marquage.
+
+\section{Propagation avant}
+
+La propagation avant n'est pas effectuée automatiquement à l'heure actuelle.
+
+La propagation intraprocédurale ne pose pas de problèmes particuliers,
+car elle est très semblable au calcul en arrière~: il suffit simplement de
+parcourir les liens de dépendance dans l'autre sens.\\
+
+La partie interprocédurale semble un peu plus délicate,
+car il n'y a aucun point de repère dans le PDG
+pour identifier les endroits à partir desquels il faut propager
+(hormis le noeud correspondant au \verbtt{return}
+pour la propagation vers les appelants et les arguments explicites pour
+la propagation dans les appels de fonction).
+
+Des fonctions supplémentaires sont donc fournies pour~:
+\begin{itemize}
+  \item trouver les noeuds d'entrées d'une fonction qui doivent être
+    sélectionnés à partir des noeuds sélectionnés dans l'appelant,
+  \item trouver les noeuds de sortie d'un appel de fonction
+    qui doivent être
+    sélectionnés à partir des noeuds sélectionnés dans la fonction appelée.
+\end{itemize}
+
+En cas d'utilisation intensive de ces fonctionnalités,
+il serait sans doute intéressant de mémoriser les liens entre les
+différents PDG (cela est également vrai pour la propagation interprocédurale
+arrière...).\\
diff --git a/doc/pdg/pdg-call.fig b/doc/pdg/pdg-call.fig
new file mode 100644
index 0000000000000000000000000000000000000000..f55a683a25f4ca4cd7ef67f8bd4c8f96db2e0eaf
--- /dev/null
+++ b/doc/pdg/pdg-call.fig
@@ -0,0 +1,151 @@
+#FIG 3.2
+Landscape
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+6 7830 3330 8820 3780
+2 3 0 1 0 7 50 -1 -1 4.000 0 0 0 0 0 7
+	 8190 3702 8301 3534 8211 3354 8010 3342 7899 3510 7989 3690
+	 8190 3702
+2 3 0 1 0 7 50 -1 -1 4.000 0 0 0 0 0 7
+	 8640 3690 8751 3522 8661 3342 8460 3330 8349 3498 8439 3678
+	 8640 3690
+4 1 0 50 -1 0 12 0.0000 4 135 150 8100 3600 f0\001
+4 1 0 50 -1 0 12 0.0000 4 135 150 8550 3600 f1\001
+-6
+6 7650 2880 8010 3150
+2 2 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 5
+	 7650 2880 8010 2880 8010 3150 7650 3150 7650 2880
+4 1 0 50 -1 0 12 0.0000 4 90 90 7830 3060 a\001
+-6
+6 8550 2880 8910 3150
+2 2 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 5
+	 8550 2880 8910 2880 8910 3150 8550 3150 8550 2880
+4 1 0 50 -1 0 12 0.0000 4 135 90 8730 3060 b\001
+-6
+6 8190 1440 8730 1980
+1 4 0 1 0 7 50 -1 -1 4.000 1 0.0000 8460 1710 180 180 8460 1890 8460 1530
+4 1 0 50 -1 0 12 0.0000 4 135 135 8460 1800 G\001
+-6
+6 8550 2340 9090 2790
+1 2 0 1 0 7 50 -1 -1 4.000 1 0.0000 8820 2565 180 135 8640 2430 9000 2700
+4 1 0 50 -1 0 12 0.0000 4 90 90 8820 2610 z\001
+-6
+6 7380 2340 8010 2790
+1 2 0 1 0 7 50 -1 -1 4.000 1 0.0000 7695 2565 225 135 7470 2430 7920 2700
+4 1 0 50 -1 0 12 0.0000 4 135 330 7740 2610 x+y \001
+-6
+6 7290 1800 7650 2250
+1 4 0 1 0 7 50 -1 -1 4.000 1 0.0000 7470 2025 135 135 7470 2160 7470 1890
+4 1 0 50 -1 0 12 0.0000 4 90 90 7470 2070 x\001
+-6
+6 7740 1800 8100 2250
+1 4 0 1 0 7 50 -1 -1 4.000 1 0.0000 7920 2025 135 135 7920 2160 7920 1890
+4 1 0 50 -1 0 12 0.0000 4 135 90 7920 2070 y\001
+-6
+6 7650 3780 8010 4230
+1 4 0 1 0 7 50 -1 -1 4.000 1 0.0000 7830 4005 135 135 7830 4140 7830 3870
+4 1 0 50 -1 0 12 0.0000 4 90 90 7830 4050 z\001
+-6
+6 4770 1620 6390 3870
+6 4860 1800 5220 2790
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 4860 1800 5220 1800 5220 2070 4860 2070 4860 1800
+2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 4860 2430 5220 2430 5040 2790 4860 2430 4860 2430
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 5040 2070 5040 2430
+4 1 0 50 -1 0 12 0.0000 4 90 90 5040 1980 a\001
+4 1 0 50 -1 0 12 0.0000 4 90 90 5040 2610 a\001
+-6
+6 5400 1800 5760 2790
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 5400 1800 5760 1800 5760 2070 5400 2070 5400 1800
+2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 5400 2430 5760 2430 5580 2790 5400 2430 5400 2430
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 5580 2070 5580 2430
+4 1 0 50 -1 0 12 0.0000 4 135 90 5580 2610 b\001
+4 1 0 50 -1 0 12 0.0000 4 135 90 5580 1980 b\001
+-6
+6 5940 2430 6300 2790
+2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 5940 2430 6300 2430 6120 2790 5940 2430 5940 2430
+4 1 0 50 -1 0 12 0.0000 4 135 135 6120 2610 G\001
+-6
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+	 6390 3870 6390 1620 4770 1620 4770 3870 6390 3870
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 6030 1620 6390 1980
+2 3 0 1 0 7 50 -1 -1 4.000 0 0 7 0 0 7
+	 5490 3780 5601 3612 5511 3432 5310 3420 5199 3588 5289 3768
+	 5490 3780
+2 3 0 1 0 7 50 -1 -1 4.000 0 0 7 0 0 7
+	 6051 3780 6162 3612 6072 3432 5871 3420 5760 3588 5850 3768
+	 6051 3780
+3 0 2 2 0 7 50 -1 -1 4.500 0 0 0 3
+	 6120 2790 6210 3240 6030 3420
+	 0.000 1.000 0.000
+3 0 2 2 0 7 50 -1 -1 4.500 0 0 0 3
+	 5580 2790 5400 3060 5940 3420
+	 0.000 1.000 0.000
+3 0 2 2 0 7 50 -1 -1 4.500 0 0 0 3
+	 6120 2790 5940 3060 5490 3420
+	 0.000 1.000 0.000
+3 0 2 2 0 7 50 -1 -1 4.500 0 0 0 3
+	 5040 2790 4950 3150 5310 3420
+	 0.000 1.000 0.000
+4 0 0 50 -1 0 12 0.0000 4 135 60 6210 1800 f\001
+4 1 0 50 -1 0 12 0.0000 4 135 90 5400 3690 0\001
+4 1 0 50 -1 0 12 0.0000 4 135 90 5940 3690 1\001
+-6
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 7830 3150 8010 3330
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 8730 3150 8640 3330
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 8820 2700 8730 2880
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 7740 2700 7830 2880
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 8370 1890 8190 3330
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 8460 1890 8460 3330
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 7560 2160 7650 2430
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 7830 2160 7740 2430
+2 4 0 1 0 7 50 -1 -1 4.000 0 0 7 0 0 5
+	 9180 3780 9180 2340 7290 2340 7290 3780 9180 3780
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 8100 3690 7920 3870
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 8550 3690 8730 4050
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 9270 1800 8820 1350
+2 4 0 1 0 7 50 -1 -1 4.000 0 0 7 0 0 5
+	 9270 4500 9270 1350 7200 1350 7200 4500 9270 4500
+4 1 0 50 -1 0 12 0.0000 4 135 90 9090 1530 g\001
+4 1 0 50 -1 14 12 0.0000 4 180 1365 8370 1170 z = f(x+y,z);\001
+4 1 0 50 -1 0 12 0.0000 4 135 1245 4050 2610 Valeurs initiales\001
+4 1 0 50 -1 0 12 0.0000 4 135 975 4050 1980 D\351clarations\001
+4 1 0 50 -1 0 12 0.0000 4 135 540 4050 3690 Sorties\001
+4 1 0 50 -1 14 12 0.0000 4 165 1890 5580 1350 T1 f (T2 a, T3 b);\001
+4 1 0 50 -1 3 12 0.0000 4 150 1845 5580 4140 \\res From a , G.a, G.b;\001
+4 1 0 50 -1 3 12 0.0000 4 150 1050 5580 4410 G From b, G;\001
diff --git a/doc/pdg/pdg.tex b/doc/pdg/pdg.tex
new file mode 100644
index 0000000000000000000000000000000000000000..92fca55150bc4bfe1a28c3e0d343fce776b66439
--- /dev/null
+++ b/doc/pdg/pdg.tex
@@ -0,0 +1,78 @@
+%===============================================================================
+% Versions
+\section*{Versions}
+
+\begin{small}
+Seules les versions Vx.0 sont des documents achevés~;
+les autres sont à considérer comme des brouillons.
+
+\begin{enumerate}
+  \item[V3.0 -] 2 novembre 2020~:
+    \begin{itemize}
+    \item Document sous licence Creative Commons
+      ``Attribution-ShareAlike 4.0 International''
+      \url{https://creativecommons.org/licenses/by/4.0/}.
+    \end{itemize}
+  \item[V2.0 -] 3 décembre 2008~:
+    \begin{itemize}
+      \item réorganisation,
+      \item mise à jour,
+      \item partie sur l'utilisation.
+    \end{itemize}
+  \item[V1.4 - ] 30 mai 2008~:
+    \begin{itemize}
+      \item ajout d'une partie sur le marquage.
+    \end{itemize}
+  \item[V1.3 - ] 22 novembre 2007~:
+    \begin{itemize}
+      \item mise à jour de la partie sur l'interprocédural.
+    \end{itemize}
+  \item[V1.2 - ] 07 novembre 2007~:
+    \begin{itemize}
+      \item mise à jour de la partie sur les dépendances de contrôle.
+    \end{itemize}
+  \item[V1.1 - ] 20 septembre 2007~:
+    \begin{itemize}
+      \item réorganisation complète,
+      \item développement de la partie sur les dépendances de contrôle,
+      \item discussion au sujet des boucles infinies.
+    \end{itemize}
+  \item[V1.0 - ] 26 juin 2007~:
+    \begin{itemize}
+      \item relecture et petites corrections.
+    \end{itemize}
+  \item[V0.2 - ] 24 mai 2007~:
+    \begin{itemize}
+      \item révision générale,
+    \end{itemize}
+  \item[V0.1 - ] 23 mars 2007~:
+    \begin{itemize}
+      \item création du module de calcul de PDG,
+      \item extraction de la documentation du PDG du rapport sur le {\it
+	slicing}.
+    \end{itemize}
+\end{enumerate}
+\end{small}
+%===============================================================================
+\cleardoublepage
+\tableofcontents
+%===============================================================================
+\cleardoublepage\input{intro.tex}
+\cleardoublepage\input{data.tex}
+\cleardoublepage\input{ctrl.tex}
+\cleardoublepage\input{calls.tex}
+\cleardoublepage\input{utilisation.tex}
+\cleardoublepage\input{mark.tex}
+\cleardoublepage\input{conclusion.tex}
+%===============================================================================
+\appendix
+%--------------------------------------
+\cleardoublepage \input{impact.tex}
+%-------------------------------------------------------------------------------
+\cleardoublepage
+\bibliographystyle{abbrvnat}
+\bibliography{../slicing/bib-slicing}
+%--------------------------------------
+\cleardoublepage
+\printindex
+%===============================================================================
diff --git a/doc/pdg/utilisation.tex b/doc/pdg/utilisation.tex
new file mode 100644
index 0000000000000000000000000000000000000000..2b0d0794efaa27389a37391b59aefbe3d298729e
--- /dev/null
+++ b/doc/pdg/utilisation.tex
@@ -0,0 +1,49 @@
+\chapter{Retrouver l'information}\label{sec-find}
+
+Jusqu'à présent, on a vu comment calculer le graphe de dépendances.
+Dans ce chapitre, nous présentons les fonctions fournies pour
+trouver des éléments du PDG suivant un certain nombre de critères.
+L'annexe \ref{sec-impact} rappelle certains objectifs initiaux
+d'une utilisation de ces fonctions pour effectuer une analyse d'impact.\\
+
+Par ailleurs, outre la manipulation d'ensemble d'éléments du PDG,
+un système de gestion et de propagation de marques est également proposé.
+Il est présenté au chapitre \ref{sec-mark}.
+
+\section{A partir de leur clé}
+
+Au cours du calcul, chaque élément du PDG est associé à une clé
+qui correspond à l'élément de programme qu'il représente (cf. {\tt
+pdgIndex.mli}).
+On peut par la suite retrouver un élément à partir de cette clé
+comme par exemple l'élément correspondant à une instruction simple,
+à un paramètre d'entrée, à une déclaration locale, etc.
+
+\section{A partir d'une zone mémoire}
+
+Grâce à l'état qui est propagé lors de la construction
+des dépendances de données (cf. \S\ref{sec-propagation-etat})
+on peut retrouver les éléments qui participent au calcul
+d'une zone mémoire à un point de programme.
+
+Cette fonction doit également vérifier si les éléments trouvés
+définissent complètement la donnée recherchée ou non,
+et si ce n'est pas le cas, indiquer la zone susceptible de ne pas être
+complètement définie au point considéré.
+
+\section{A partir de propriétés}
+
+D'autres fonctionnalités de \ppc permettent d'interpréter une propriété
+du programme et d'en extraire les zones mémoire nécessaires à son évaluation.
+Comme on sait par ailleurs trouver les éléments qui correspondent
+a une zone mémoire en un point de programme (voir ci-dessus),
+on peut ainsi trouver par exemple les éléments dont dépendent une assertion
+ou tout autre propriété.
+
+\section{En exploitant les dépendances}
+
+Après avoir retrouver des éléments dans le graphe, on veut en général exploiter
+leurs dépendances. On peut facilement retrouver les dépendances avant ou
+arrière,
+avec ou sans filtrage sur leur type (donnée, contrôle,...),
+récursivement ou non.
diff --git a/doc/release/branch.tex b/doc/release/branch.tex
index 5ee6c9b56ce577b22486f3ea5b426fbb0366e0c0..ca2cb8d1c8e44672d4243488ab1b6d6a2cb23e8c 100644
--- a/doc/release/branch.tex
+++ b/doc/release/branch.tex
@@ -21,6 +21,9 @@ $\rightarrow$ Repository $\rightarrow$ Protected Branches.
 
 \section{Creating the branch}
 
+Note that you must be member of the GitLab groups "frama-c", "dev" and have
+access to each plugin of continuous integration.
+
 Create the branch \texttt{stable/release}, where \texttt{release} is the
 element name, using the \texttt{frama-ci} tool:
 \begin{enumerate}
@@ -64,7 +67,7 @@ the issues should be tagged with the current release, or with the next one.
 
 Create headers in the Changelog(s). This is to avoid some merge conflicts,
 but also so that merge requests add information in the proper part of
-the Changelog.   
+the Changelog.
 
 \begin{itemize}
 \item Add the following in the Changelog, in \texttt{stable/element}
@@ -86,7 +89,7 @@ This should go directly below
 
 From now on, Changelog items corresponding to MR merged into \texttt{master}
 must be placed between these two banners. This should minimize conflicts when
-merging back \texttt{stable/element} into \texttt{master}
+merging back \texttt{stable/element} into \texttt{master}.
 
 \todo{Do the same thing in the manuals that contain a Changelog?}
 
diff --git a/doc/release/build.tex b/doc/release/build.tex
index 7d2cfc524726c384cdf7279618022a4ed25b2298..e3c9386b25c4516fd10187fffbc1b047d526c18a 100644
--- a/doc/release/build.tex
+++ b/doc/release/build.tex
@@ -7,9 +7,11 @@ The procedure for creating the source distribution.
 \begin{itemize}
 \item All tools needed to compile Frama-C (that you should have anyways)
 \item \texttt{bash} v4.0 or higher
+\item \texttt{rgrep}
 \item \texttt{git-lfs}
 \item GNU \texttt{parallel}
 \item a \TeX distribution
+\item (recommended) \texttt{texfot}
 \end{itemize}
 
 \section{Final checks}
@@ -33,7 +35,7 @@ The procedure for creating the source distribution.
     opam packages, including alt-ergo, why3, coq, etc.
     Use \verb+bin/check-reference-configuration.sh+ to help check if the
     configuration is ok. You can also try running
-    \verb+ptests.opt -config qualif src/plugins/wp/tests+.
+    \verb+make wp-qualif+.
   \end{itemize}
 \item Check the contents of \texttt{README.md} \todo{Should always be up to date}
 \item Check the contents of \texttt{Changelog}
@@ -235,16 +237,60 @@ website git.
 
 \expertise{release manager} Use the script
 \texttt{build-src-distrib.sh} for this purpose (\texttt{bash version
-  4} required) after cloning the following repositories
+  4} required).
+
+The script will search for the following repositories:
+
+\begin{itemize}
+  \item \texttt{./doc/acsl} (\texttt{git@github.com:acsl-language/acsl.git})
+  \item \texttt{./frama-c.wiki} (\texttt{git@git.frama-c.com:pub/frama-c.wiki.git})
+  \item \texttt{./website} (\texttt{git@git.frama-c.com:pub/pub.frama-c.com.git})
+\end{itemize}
+
+If they are not available, they can be cloned by the script.
+
+The following steps will be performed by the script:
+
 \begin{itemize}
-\item \texttt{pub-frama-c} (\texttt{git@git.frama-c.com:pub/frama-c}),
-\item \texttt{frama-c.wiki} (\texttt{git@git.frama-c.com:pub/frama-c.wiki}), and
-\item \texttt{website} (\texttt{git@git.frama-c.com:frama-c/website})
+  \item compile manuals
+  \item build source distribution
+  \item build the API bundle
+  \item build the documentation companions
+  \item update locally the wiki pages
+  \item create a new branch for the website
+  \item run some sanity checks on the source distribution
+  \item generate the \texttt{opam} file
 \end{itemize}
-in the root directory of Frama-C. The last one is only needed when creating a
-final release. Release candidates are pushed as a branch \texttt{stable/<codename>}
-and added to the \texttt{pub/frama-c} wiki.
-For \texttt{website}, a new branch should be created over \texttt{online}.
+
+In order to create "ready to deploy" wiki and website pages, a file \texttt{main\_changes.md}
+must be provided. The expected format is:
+
+\begin{lstlisting}
+# Kernel
+
+- item
+- ...
+
+# <Plugin-Name> (Prefer alphabetic order)
+
+- item
+- ...
+
+# ...
+
+\end{lstlisting}
+
+The performed sanity checks are:
+
+\begin{itemize}
+  \item verification that no non-free files are distributed,
+  \item verification that no non-free plugins are distributed,
+  \item no \texttt{/home/user} path can be found in the distribution,
+  \item the source code can be compiled and tests succeed.
+\end{itemize}
+
+Note that there are some interactive steps in the script, that ask for user
+approval before going further.
 
 Finally, ensure that locale \verb+en_US.UTF-8+ is available on your system,
 as it is used by the script to ensure a proper encoding of the generated files.
@@ -254,17 +300,21 @@ Now, run the script:
 ./bin/build-src-distrib.sh
 \end{shell}
 
+The generated files are available in the \texttt{./distributed} repository.
+After testing more extensively the distribution, the following actions should
+be performed:
+
+\begin{itemize}
+  \item push stable branch on the public repository
+  \item push stable tag on the public repository
+  \item push the local Frama-C wiki branch to the public repository
+  \item push the generated website branch
+\end{itemize}
+
 \section{Testing the Distribution}
 
 Please check that the distribution (sources and API) is OK:
 \begin{enumerate}
-\item Inspect the contents of the \texttt{tar.gz}:
-  \begin{enumerate}
-  \item Extract it to a new directory.
-  \item run \texttt{<path-to-frama-c-git-clone>/doc/release/checktar.sh}
-    (CWD must be where the tar was extracted). Fix issues and/or update
-    the script if needed.
-  \end{enumerate}
 \item check for possible path/environment leaks in the \texttt{tar.gz}:
   grep for the path where your Frama-C git directory is, e.g.
   \texttt{/home/user/git/frama-c}. It should appear nowhere in the archive.
@@ -272,8 +322,8 @@ Please check that the distribution (sources and API) is OK:
   (or check e.g. \texttt{./configure --prefix=\$PWD/build \&\& make -j \&\& make install});
 \item test the installed binaries (especially the GUI). (On Linux, OCI tests
   everything but the GUI);
-\item redo the two steps above on Windows/WSL \expertise{André/Allan}, macOS
-  \expertise{André/Loïc/Thibaud};
+\item redo the two steps above on Windows/WSL \expertise{André}\expertise{Allan},
+  macOS \expertise{André}\expertise{Loïc}\\\expertise{Thibaud};
   \begin{itemize}
   \item For instance, you can compile and test as follows:
   \item \verb+./configure --prefix="$PWD/build"+
diff --git a/doc/release/checktar.sh b/doc/release/checktar.sh
index db08047a27a1cea62a982859f3260d682f296463..66a852c693bcc02af7e3a92ea51fd9bbdef5c5e1 100755
--- a/doc/release/checktar.sh
+++ b/doc/release/checktar.sh
@@ -1,15 +1,43 @@
-#!/bin/bash -eu
+#!/usr/bin/env bash
 
-echo "To check: "
+if [[ "$1" == "" ]]; then
+    DIR="."
+else
+    DIR=${1%/}
+fi
 
-find . -name '*NE_PAS_LIVRER*'
-find . -name '*nonfree*' -o -name '*non_free*' -o -name '*non-free*'
+ERROR_CODE=0
+
+RESULT=$(find $DIR -name '*NE_PAS_LIVRER*')
+if [[ "$RESULT" != "" ]]; then
+    echo "### ERROR: The following files should not be distributed:"
+    echo $RESULT
+    ERROR_CODE=1
+fi
+
+RESULT=$(find $DIR -name '*nonfree*' -o -name '*non_free*' -o -name '*non-free*')
+if [[ "$RESULT" != "" ]]; then
+    echo "### ERROR: The following files should not be distributed:"
+    echo $RESULT
+    ERROR_CODE=1
+fi
 
 PLUGINS=( genassigns mthread volatile acsl-importer caveat-importer cfp security pathcrawler a3export )
 
 for A in ${PLUGINS[@]}
 do
-    if [ -e src/plugins/$A ]; then
-        echo "!!! Error: trying to release $A"
+    if [ -e $DIR/src/plugins/$A ]; then
+        echo "### ERROR: Trying to release plugin: $A"
+        ERROR_CODE=1
     fi
 done
+
+RESULT=$(rgrep $HOME $DIR)
+
+if [[ "$RESULT" != "" ]]; then
+    echo "### ERROR: Found some $HOME occurrences in the distribution"
+    echo $RESULT
+    ERROR_CODE=1
+fi
+
+exit $ERROR_CODE
diff --git a/doc/release/website.tex b/doc/release/website.tex
index b10cda813a798083bb2264a7e72001f29493b445..6e6b79dc3aec6550a8aebbb00c3a994bc2333011 100644
--- a/doc/release/website.tex
+++ b/doc/release/website.tex
@@ -1,4 +1,4 @@
-\chapter{The Website Stage}
+\chapter{The Web Stage}
 
 Where all our efforts goes on the web.  There are two very different
 tasks for \FramaC to go online.  Authoring the web site pages is the
@@ -8,131 +8,75 @@ be the release manager.
 
 \section{Requirements}
 
-You need the following applications:
-\begin{itemize}
-\item \texttt{pandoc}>=2.0; if your distribution has an older
-  version, you can find installation instructions at
-  \url{https://github.com/jgm/pandoc/blob/master/INSTALL.md}
-\item \texttt{tidy}
-\item \texttt{linkchecker}
-\end{itemize}
-
-\section{Authoring the Pages}
-
-The website sources are in \texttt{src}. Go to this directory.
-
-\subsection{Editing Web Pages}
+The website \texttt{README.md} provides a quick guide to locally setup
+the website.
 
-You should consult and/or improve the \texttt{README} for style
-instructions, and edit \texttt{*.prehtml} files.
+\section{Generate website}
 
-Compile the web pages with:
-\begin{shell}[gobble=2]
-  \$ make local
-\end{shell}
+Before pushing the branch to the website, it can be deployed locally but
+this is not absolutely necessary.
 
-This way, you get a snapshot of the web-site in \texttt{src},
-without any downloadable resources. You can start browsing at
-\texttt{index.html}. Note that the new news and download pages still
-need to be manually updated.
+Push the branch generated by the release script on the website repository.
 
-\subsection{Adding News}
-The news are defined in the \texttt{news.def} page. All the news
-are published in the \textsf{RSS} of \FramaC. Only the first news are
-published on the home page of the web site. The limit is marked with:
-\begin{shell}
-  <#def end-of-html-news></#def>
-\end{shell}
+You can have a look at the generated pages on \texttt{pub.frama-c.com}.
+Note however that the download links won't work as they are available only
+once the branch is merged (\texttt{download} links are handled by Git-LFS).
 
-Move it upward in order to keep only few interesting news on the
-\FramaC home page.
+Check the following pages:
 
-\section{Adding the new Release}
-
-From the build stage, the files to distributed are available in the
-\texttt{website} repository and already ready to commit (look at
-\texttt{git status}). The release manager should update the web pages
-of the \emph{download} and \emph{support} sections to make the new
-release and documentation available.
-
-The current (\emph{awkward}) procedure is as follows:
-\begin{enumerate}
-\item In case a new release of ACSL is done together with Frama-C's release;
-  \begin{itemize}
-  \item copy the ACSL manual using the ``numeric'' version
-    (\texttt{www/download/acsl\_x.y.pdf}) and add it via \texttt{git add}
-    (\texttt{git lfs} should automatically handle it, since it's a .pdf);
-  \item check that \texttt{www/download/acsl.pdf} was updated by the build script;
-%  \item update \texttt{src/download.def} (can't find where???);
-  \item update \texttt{src/acsl.prehtml}: add a new entry for the new version of ACSL
- \end{itemize}
-\item Copy the file \texttt{INSTALL.md} from Frama-C to
-  \texttt{INSTALL-NAME.md} where \texttt{NAME} is the version name of the
-  distribution.
-\item Update the \texttt{Makefile} in \texttt{src}:
+\begin{itemize}
+  \item \texttt{index.html} must display:
   \begin{itemize}
-  \item Add to variable \texttt{PAGES} the new files to export (at least
-    install-<version>.html, following the pattern already present). This will
-    create a target that will generate it from the previous .md file.
-  \item Add the previous latest version to the \texttt{DOWNLOAD\_PAGES}
-    variable for adding a specific downloading page related to that
-    previous release.
+    \item the new event,
+    \item a link to the (beta) release at the bottom.
   \end{itemize}
-\item Update also some macros of \texttt{download.def} file:
-  \begin{enumerate}
-  \item Add an entry after the \texttt{selector-previous-versions} macro.
-  \item Update macros \texttt{latest-No-Version}, \texttt{previous-version} and
-    \texttt{previous-No-Version}.
-  \item Move the definition of \texttt{download-last-version} macro
-  to a new macro \texttt{download\_NAME}, where \texttt{NAME}
-  is the version name added to \texttt{DOWNLOAD\_PAGES} variable of the
-  \texttt{Makefile}.
-  \item Update the definition of \texttt{download-last-version} macro.
-  \item Add a new \texttt{selector-download\_NAME} macro.
-  \item Add a link back to that downloading page into the \texttt{selector-download\_PREVIOUS\_NAME} macro.
-  \item Check the occurrences of references to the previous release
-  resources, and update them. A good practice is to \texttt{grep}
-  \texttt{*.prehtml} \texttt{*.def} against the name of the release.
-  You should at least update the links to reference documentation from the
-  \texttt{support.prehtml} page.
-  \end{enumerate}
-\item Build the web site:
-  \begin{shell}[gobble=4]
-    \$ make local
-    \$ make distrib
-  \end{shell}
-  You get a snapshot of the repository in the \texttt{www} directory.
-  Before going there, check for compliance with \textsf{W3C} and link
-  consistency by running:
-  \begin{shell}
-    \$ make check_link
-  \end{shell}
-  Run it and check the result, fixing broken links if necessary.
-  Go to \texttt{../www}, then open \texttt{index.html} and test the website
-  carefully, especially:
+  \item \texttt{/fc-versions/<version\_name>.html}:
   \begin{itemize}
-  \item the new Downloads page;
-  \item the previous Downloads page;
-  \item Compilation instructions;
-  \item Changelog (check parsing, for all plug-ins).
+    \item check Changelog link,
+    \item check manual links (reminder: the links are dead at this moment), it must contain \texttt{NN.N-Version}
+    \item check ACSL version.
   \end{itemize}
+  \item \texttt{/html/changelog.html\#Version-NN.N}
+  \item \texttt{/html/installations/titanium.html}
+  \item \texttt{/html/acsl.html}: check ACSL versions list
+  \item \texttt{rss.xml}: check last event
+\end{itemize}
 
-\item Commit the web site:
-  \begin{shell}
-    \$ cd ..
-    \$ # manually check that only wanted new files are present
-    \$ git add .
-    \$ git checkout -b \$RELEASE
-    \$ git commit -m "updating distrib website"
-  \end{shell}
-\end{enumerate}
+On GitLab, the following files must appear as \textbf{new} in \texttt{download}.
+Note that for beta versions, if you have not included all manuals, not all of
+them will appear:
 
-\section{Publishing}
+\begin{itemize}
+  \item \texttt{acsl-X.XX.pdf}
+  \item \texttt{acsl-implementation-NN.N-CODENAME.pdf}
+  \item \texttt{plugin-development-guide-NN.N-CODENAME.pdf}
+  \item \texttt{user-manual-NN.N-CODENAME.pdf}
+  \item \texttt{<plugin>-manual-NN.N-CODENAME.pdf}\\
+        for Aorai, EVA, Metrics, RTE and WP
+  \item \texttt{e-acsl/e-acsl-X.XX.pdf}
+  \item \texttt{e-acsl/e-acsl-implementation-NN.N-CODENAME.pdf}
+  \item \texttt{e-acsl/e-acsl-manual-NN.N-CODENAME.pdf}
+  \item \texttt{aorai-example-NN.N-CODENAME.tgz}
+  \item \texttt{frama-c-NN.N-CODENAME.tar.gz}
+  \item \texttt{frama-c-api-NN.N-CODENAME.tar.gz}
+  \item \texttt{hello-NN.N-CODENAME.tar.gz}
+\end{itemize}
 
-You have to create a merge request on the website repository that will be published when Florent
-accepts it on the online branch.
+For final release \textbf{ONLY}, the following files must appear as \textbf{modified} in \texttt{download}:
 
-\textbf{Note:} the following steps are done only after the release is live on the website.
+\begin{itemize}
+  \item \texttt{acsl.pdf}
+  \item \texttt{frama-c-acsl-implementation.pdf}
+  \item \texttt{frama-c-plugin-development-guide.pdf}
+  \item \texttt{frama-c-user-manual.pdf}
+  \item \texttt{frama-c-<plugin>-manual.pdf}\\
+        for Aorai, EVA, Metrics, RTE, \textbf{Value Analysis} and WP
+  \item \texttt{e-acsl/e-acsl.pdf}
+  \item \texttt{e-acsl/e-acsl-implementation.pdf}
+  \item \texttt{e-acsl/e-acsl-manual.pdf}
+  \item \texttt{frama-c-aorai-example.tgz}
+  \item \texttt{hello.tar.gz}
+\end{itemize}
 
 \section{Announcements}
 
@@ -152,20 +96,10 @@ You'll need a GitHub account to create a pull request on the official opam repos
 \item Clone \texttt{opam-repository}: \texttt{git clone git@github.com:ocaml/opam-repository.git}
 \item Make sure you are on \texttt{master} and your branch is up-to-date
 \item Create a new directory: \\
-  \texttt{packages/frama-c/frama-c.<version>} \\
-\item Copy the file \texttt{opam/opam} from the release
- to the opam repository clone in: \\
+  \texttt{packages/frama-c/frama-c.<version>}
+\item Copy the file \texttt{./distributed/opam} to the opam repository clone in: \\
  \texttt{packages/frama-c/frama-c.<version>/opam}
-\item Compute the MD5sum of the .tar.gz file and update the \texttt{opam} file
-with the following entry:
-\begin{verbatim}
-url {
-  src: "https://frama-c.com/download/frama-c-<version>-<version-name>.tar.gz"
-  checksum: "md5=<xxxxxx>"
-}
-\end{verbatim}
-You can provide \verb|sha256| and/or \verb|sha512| checksums as well if
-you wish.
+\item You can provide \verb|sha256| and/or \verb|sha512| checksums at the end of this file if ou wish.
 \item (optional) Check locally that everything is fine:
 \begin{verbatim}
 opam switch create local <some-ocaml-compiler-version>
@@ -203,6 +137,16 @@ commit to it.
 ({\em Non-beta only}) After pushing the tag to Gitlab, go to the Releases page
 and create a release for the tag.
 
+You should also push the wiki changes. Note that all files listed as \textbf{new}
+in the website section should appear in the wiki but:
+
+\begin{itemize}
+  \item \texttt{frama-c-api-NN.N-CODENAME.tar.gz}
+  \item \texttt{hello-NN.N-CODENAME.tar.gz}
+\end{itemize}
+
+and E-ACSL files are not in a sub-folder \texttt{e-acsl} on the wiki.
+
 \section{Updating the BTS}
 
 \expertise{Usually Julien performs this step. Soon to be obsoleted.}
@@ -218,11 +162,6 @@ already done).
 Finally have a look at each still opened task in order to see what should be
 resolved in the next release.
 
-%% \section{Update the Wiki}
-
-%% Update references of the Wiki, especially pointers to manuals of this page:
-%% \url{http://bts.frama-c.com/dokuwiki/doku.php?id=mantis:frama-c:publications}
-
 \section{Other repositories to update}
 
 Check if other Frama-C (and related) repositories need to be updated:
@@ -240,6 +179,48 @@ Just update the \texttt{VERSION} file in \texttt{master}, by adding
 \texttt{"+dev"}. Do not add any newline at the end of the
 \texttt{VERSION} file.
 
+\section{Docker image preparation}
+
+\textbf{Note:} you need access to the \texttt{framac} Docker Hub account to be able to upload the image.
+
+Make sure:
+\begin{itemize}
+  \item \texttt{devel\_tools/docker/frama-c.dev/Dockerfile}
+  \item \texttt{devel\_tools/docker/frama-c.custom/Dockerfile}
+\end{itemize}
+are up-to-date; to do so, you can do the following:
+
+\begin{lstlisting}
+cd devel_tools/docker/frama-c.custom
+<edit Dockerfile to change the base image, from debian:sid (unstable) to the
+ latest stable release>
+<copy release .tar.gz to this directory, extract and rename the directory
+ `frama-c`>
+docker build . -t fc-with-test --build-arg=with_source=yes\
+  --build-arg=with_test=yes
+\end{lstlisting}
+
+This should copy the contents of \texttt{frama-c} into the Docker image and try
+to compile Frama-C with it, then run the tests.
+
+If the local tests do not work, check that the OCaml version and package
+dependencies are all up-to-date. Remember that there are several differences
+between Debian unstable (`sid`) and stable, which may require changes to the
+\texttt{Dockerfile}.
+
+If the local tests work, then re-run Docker \textit{without} the source/tests,
+to make the image leaner:
+
+\begin{lstlisting}
+docker build . -t framac/frama-c:<VERSION>
+\end{lstlisting}
+
+Replacing \texttt{<VERSION>} with the release number, e.g. \texttt{23.0}.
+
+After building the image, upload it with \texttt{docker push framac/frama-c:<VERSION>}.
+You will need to have setup your \texttt{framac} Docker Hub account for this to work.
+
+
 %%% Local Variables:
 %%% mode: latex
 %%% TeX-master: "release"
diff --git a/doc/rte/.gitignore b/doc/rte/.gitignore
index b1a70f5efeffc6dad9d6868751dfaea6ece0b0ab..92f50e6b35d68a2b554aa3e2ff3783d0daf47760 100644
--- a/doc/rte/.gitignore
+++ b/doc/rte/.gitignore
@@ -3,4 +3,5 @@
 /frama-c-left.pdf
 /frama-c-right.pdf
 /framacversion.tex
+/frama-c-affiliation.tex
 /main.pdf
diff --git a/doc/rte/main.tex b/doc/rte/main.tex
index 1e2da4814231b171fcd0a3a4ea3ca85e90ff28ef..f1582267f5d792036d0e425fc8b69ac95780f7bf 100644
--- a/doc/rte/main.tex
+++ b/doc/rte/main.tex
@@ -4,6 +4,7 @@
            {\input{../../VERSION} (\input{../../VERSION_CODENAME}\unskip)}
 %%\usepackage{microtype}
 \input{macros_modern}
+\input{./frama-c-affiliation.tex}
 %%modern \usepackage{pslatex}
 %%modern \usepackage{a4wide}
 
@@ -60,7 +61,7 @@
 \title{Frama-C's RTE plug-in}{for Frama-C \framacversion}
 \author{Philippe Herrmann and Julien Signoles}
 \begin{tabular}{l}
-CEA LIST, Software Safety Laboratory, Saclay, F-91191 \\
+  \fcaffiliationen
 \end{tabular}
 \vfill
 \begin{flushleft}
diff --git a/doc/slicing/.gitignore b/doc/slicing/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..1913f75af091fc85fd9142f3bab9583ee9561490
--- /dev/null
+++ b/doc/slicing/.gitignore
@@ -0,0 +1,12 @@
+biblio.bib
+frama-c-book.cls
+frama-c-cover.pdf
+frama-c-left.pdf
+frama-c-right.pdf
+frama-c-affiliation.tex
+main.pdf
+call.pdf
+choose_call.pdf
+exple2.pdf
+propagation.pdf
+propagation.pdf
diff --git a/doc/slicing/Makefile b/doc/slicing/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..b09932ac72db4cf6512927e70d60debfe827927c
--- /dev/null
+++ b/doc/slicing/Makefile
@@ -0,0 +1,50 @@
+.PHONY: all clean
+
+all: main.pdf
+
+GENERATED=biblio.bib
+GENERATED+=frama-c-book.cls frama-c-cover.pdf frama-c-left.pdf frama-c-right.pdf
+include ../MakeLaTeXModern
+
+DWNLDDIR=../manuals
+DOCNAME=slicing-documentation-fr.pdf
+
+BIB_FILE = bib-slicing.bib
+main.bbl : $(BIB_FILE)
+	@echo "=== Fichier .bib plus récent -> effacement du .bbl"
+	rm -f $(SRC).bbl
+
+main.pdf: $(FRAMAC_MODERN) $(BIB_FILE) \
+	main.tex macros_slicing.tex slicing.tex \
+	intro.tex conclusion.tex \
+	fonction.tex interproc.tex interproc2.tex man.tex \
+	algo.tex interexples.tex intercmds.tex projets.tex \
+	algoH.mli algo.ml \
+	call.pdf choose_call.pdf exple2.pdf propagation.pdf propagation.pdf
+
+###############################################################################
+
+GENERATED+=call.pdf choose_call.pdf exple2.pdf propagation.pdf propagation.pdf
+%.pdf : %.fig
+	fig2dev -L pdf $< $@
+
+###############################################################################
+
+%.pdf: %.tex
+	pdflatex $*
+	bibtex $*
+	pdflatex $*
+	pdflatex $*
+
+install: main.pdf
+	@echo "copying main.pdf    in $(DWNLDDIR)/$(DOCNAME)"
+	@rm -f "$(DWNLDDIR)/$(DOCNAME)"
+	@cp main.pdf "$(DWNLDDIR)/$(DOCNAME)"
+
+clean:
+	rm -rf *~ *.aux *.log *.nav *.out *.snm *.toc *.lof *.pp *.bnf \
+		*.haux  *.hbbl *.htoc \
+                *.cb *.cb2 *.cm? *.bbl *.blg *.idx *.ind *.ilg \
+		$(GENERATED)
+
+###############################################################################
diff --git a/doc/slicing/algo.ml b/doc/slicing/algo.ml
new file mode 100644
index 0000000000000000000000000000000000000000..35755d65866f27523d34355ed7ebcfb7cb07225a
--- /dev/null
+++ b/doc/slicing/algo.ml
@@ -0,0 +1,22 @@
+(* On nomme H le module des hypothèses. *)
+module H = AlgoH ;;
+
+(* produit une nouvelle fonction spécialisée en partant de [ff]
+   en marquant l'élément [e] et toutes ses dépendances avec la marque [m]. *)
+let rec mark_rec_pdg_elem pdg stmt_elems m e ff =
+  let new_ff = add_elem_mark pdg stmt_elems m e ff in
+  let dpds = H.get_dpds e pdg in
+    List.fold_right (mark_rec_pdg_elem pdg stmt_elems m) dpds new_ff
+  (* ;; *)
+and
+(* [add_elem_mark] ajoute la marque [m] à l'instruction correspondant à
+   l'élément [e] et marque les autres éléments éventuels comme superflus. *)
+      add_elem_mark pdg stmt_elems m e ff = 
+  let stmt = H.get_stmt e stmt_elems in
+  let old_m = H.get_stmt_mark stmt ff in
+  let new_m = H.combine_mark old_m m in
+  let new_ff = H.replace_stmt_mark ff stmt new_m in
+  let elems = H.get_elems stmt stmt_elems in
+  let (_, other_elems) = List.partition (fun elem -> elem = e) elems in
+  let mark_spare_elem e ff = mark_rec_pdg_elem pdg stmt_elems H.spare_mark e ff in
+    List.fold_right mark_spare_elem other_elems new_ff
diff --git a/doc/slicing/algo.tex b/doc/slicing/algo.tex
new file mode 100644
index 0000000000000000000000000000000000000000..c27c2edc736c88d84f7aa080e80cd5feead8c087
--- /dev/null
+++ b/doc/slicing/algo.tex
@@ -0,0 +1,22 @@
+\chapter{Algorithmes}
+
+\section{Hypothèses}
+
+On se donne quelques types et fonctions de base~:\\
+
+\camlListingInput{algoH.mli}
+
+\section{Marquage d'une fonction}\label{sec-algo-mark-fct}
+
+Il s'agit de voir comment sont marquées les instructions d'une fonction
+à partir d'une requête donnant un élément du PDG et une marque.\\
+
+L'algorithme présenté ici est une version simplifiée
+de celui qui existe dans
+l'outil afin d'être plus facilement compréhensible.
+Il est très inefficace et risque de boucler car on ne teste pas
+si l'instruction à marquer contient déjà la nouvelle marque (test d'arrêt).
+
+Il s'agit de plus d'une version sans spécialisation des appels de fonction.\\
+
+\camlListingInput{algo.ml}
diff --git a/doc/slicing/algoH.mli b/doc/slicing/algoH.mli
new file mode 100644
index 0000000000000000000000000000000000000000..a514d3fedd1df4b77162a9b5d10ae67d66f29c14
--- /dev/null
+++ b/doc/slicing/algoH.mli
@@ -0,0 +1,59 @@
+(* Point de programme *)
+type t_program_point ;;
+
+(* Instruction *)
+type t_stmt ;;
+
+(* l'instruction située à un point de contrôle (après) *)
+val get_pp_stmt : t_program_point -> t_stmt ;;
+
+(* CFG : control flow graph *)
+type t_cfg ;;
+(* successeurs dans le cfg. *)
+val get_cfg_succ : t_cfg -> t_stmt -> t_stmt list ;;
+(* predecesseurs dans le cfg. *)
+val get_cfg_prev : t_cfg -> t_stmt -> t_stmt list ;;
+
+(* PDG : program dependences graph *)
+type t_pdg ;;
+(* element composant le PDG *)
+type t_elem ;;
+(* donne la liste des dépendances directes de l'élément dans le PDG *)
+val get_dpds : t_elem -> t_pdg -> t_elem list ;;
+val get_all_dpds : t_pdg -> t_elem -> t_elem list ;;
+val get_list_all_dpds : t_pdg -> t_elem list -> t_elem list ;;
+val get_list_control_dpds : t_pdg -> t_elem list -> t_elem list ;;
+val get_list_all_control_dpds : t_pdg -> t_elem list -> t_elem list ;;
+val merge :  t_elem list -> t_elem list -> t_elem list ;;
+
+val get_pp_elems : t_pdg -> t_program_point -> t_elem list ;;
+
+(* correspondance entre les instructions et les éléments du PDG *)
+type t_stmt_elems ;;
+
+(* retrouver l'instruction correspondant à un élément *)
+val get_stmt : t_elem -> t_stmt_elems -> t_stmt ;;
+(* retrouver les instructions correspondant aux éléments *)
+val get_stmts : t_elem list -> t_stmt_elems -> t_stmt list ;;
+(* retrouver les éléments correspondant à une instruction *)
+val get_elems : t_stmt -> t_stmt_elems -> t_elem list ;;
+
+type t_state 
+
+type t_data
+
+val get_state : t_program_point -> t_state ;;
+val get_defs_data : t_state -> t_data ->  t_elem list ;;
+(* type des marques *)
+type t_mark ;;
+(* la marque correspondant à mS : superflu. *)
+val spare_mark : t_mark ;;
+(* combinaison de deux marques *)
+val combine_mark : t_mark -> t_mark -> t_mark ;;
+
+(* type correspondant au marquage des instructions d'une fonction. *)
+type t_ff ;;
+(* lire la marque associée à une instruction dans le marquage *)
+val get_stmt_mark : t_stmt -> t_ff -> t_mark ;;
+(* remplacer la marque associée à une instruction dans le marquage *)
+val replace_stmt_mark : t_ff -> t_stmt -> t_mark -> t_ff ;;
diff --git a/doc/slicing/bib-slicing.bib b/doc/slicing/bib-slicing.bib
new file mode 100644
index 0000000000000000000000000000000000000000..1ecf02cac03b72ab4ba1eb123e2db5e587c5928c
--- /dev/null
+++ b/doc/slicing/bib-slicing.bib
@@ -0,0 +1,519 @@
+%--------------------------------------------
+% voir aussi : http://www.infosun.fmi.uni-passau.de/st/staff/krinke/slicing/
+% pour une énorme biblio.
+%===============================================================================
+% Nos documents :
+%--------------------------------------------
+@techreport{ CEAlocations,
+  author = "Anne Pacalet",
+  title = "Emplacements, pointeurs, et opérations associées",
+  INSTITUTION = "CEA",
+  number = "DTSI/SLA/03-49/AP",
+  month = "janvier",
+  year = "2003"
+}
+%--------------------------------------------
+@techreport{ baudinImpact,
+  author = "P. Baudin",
+  title = "Analyse d'impact~: spécification de l'outil",
+  INSTITUTION = "CEA",
+  number = "DTSI/SOL/04-187",
+  month = "juin",
+  year = "2004"
+}
+%--------------------------------------------
+@techreport{ slicingCaveat,
+  author = "A. Pacalet and P. Baudin", 
+  title = "Analyse d'impact ; L'outil de slicing",
+  INSTITUTION = "CEA",
+  number = "DTSI/SOL/05-141",
+  month = "mai",
+  year = "2005",
+  note = "(Note : {\it Il existe, en interne,  une version plus récente de ce document})."
+}
+%--------------------------------------------
+@techreport{ ppcPdg,
+  author = "A. Pacalet",
+  title = "Calcul de dépendances dans un programme C",
+  INSTITUTION = "INRIA",
+  month = "juin",
+  year = "2007",
+  note = "(Note : {\it document de travail en cours d'évolution})"
+}
+%--------------------------------------------
+@techreport{ ppcSlicing,
+  author = "A. Pacalet",
+  title = "Conception d'un outil de slicing",
+  INSTITUTION = "INRIA",
+  month = "juin",
+  year = "2007",
+  note = "(Note : {\it document de travail en cours d'évolution})"
+}
+
+%===============================================================================
+% Etat de l'art sur le slicing en 1995
+@article{ tip95survey,
+    author = "F. Tip",
+    title = "A survey of program slicing techniques",
+    journal = "Journal of programming languages",
+    volume = "3",
+    pages = "121--189",
+    year = "1995",
+    url = "http://citeseer.nj.nec.com/tip95survey.html" 
+}
+%--------------------------------------------
+@misc{wwwSlicing,
+  key = "SlicingWebLinks",
+  title = "Slicing Web Links",
+  url = "http://www.infosun.fmi.uni-passau.de/st/staff/krinke/slicing/"
+}
+%--------------------------------------------
+@inproceedings{873584,
+  author = {Andrea De Lucia and Mark Harman and Robert Hierons and Jens
+    Krinke},
+  title = {Unions of Slices Are Not Slices},
+  booktitle = {CSMR '03: Proceedings of the Seventh European Conference on
+    Software Maintenance and Reengineering},
+  year = {2003},
+  isbn = {0-7695-1902-4},
+  pages = {363},
+  publisher = {IEEE Computer Society},
+  address = {Washington, DC, USA},
+}
+%--------------------------------------------
+% Travaux de M. Ernst :
+% VDG (Value Dependance Graph) pour representer le programme 
+% afin de faciliter le slicing. Traitement de tout ANSI-C (sauf longjump)
+% Utilise une analyse d'alias (point-to, flow-insensitive ?) 
+% mais elle n'est pas détaillée.
+% Traite des structures, 
+% mais pas de précision sur le traitement des éléments de tableaux...
+% Dans l'un des articles, représentation intéressante de l'état mémoire 
+% considéré dans son ensemble  avec fonctions Lookup/Update.
+% Traitement des appels de fonctions en utilisant les "froms".
+% A LIRE plus en détail.
+@techreport{Ernst95,
+   author = {Michael D. Ernst},
+   title = {Slicing pointers and procedures (abstract)},
+   institution = {Microsoft Research},
+   number = {MSR-TR-95-23},
+   address = {Redmond, WA},
+   month = {January~13,},
+   year = {1995},
+   url = "http://pag.csail.mit.edu/~mernst/pubs/slicing-tr9523-abstract.html"
+}
+@inproceedings{177907,
+ author = {Daniel Weise and Roger F. Crew and Michael Ernst and Bjarne Steensgaard},
+ title = {Value dependence graphs: representation without taxation},
+ booktitle = {POPL '94: Proceedings of the 21st ACM SIGPLAN-SIGACT symposium on Principles of programming languages},
+ year = {1994},
+ isbn = {0-89791-636-0},
+ pages = {297--310},
+ location = {Portland, Oregon, United States},
+ url = {http://doi.acm.org/10.1145/174675.177907},
+ doi = {10.1145/174675.177907},
+ publisher = {ACM Press},
+ address = {New York, NY, USA},
+ }
+@techreport{Ernst94,
+  author = "Michael D. Ernst",
+  title = "Practical fine-grained static slicing of optimized code",
+  institution = "Microsoft Research",
+  number = "MSR-TR-94-14",
+  month = "July",
+  year = "1994",
+  address = {Redmond, WA},
+  url = "http://pag.csail.mit.edu/~mernst/pubs/slicing-tr9414-abstract.html"
+}
+%--------------------------------------------
+% notion d'intersection entre les données pour traitement 
+% des champs de structure et des éléments de tableau 
+% (traitement de a[i] pas clair)
+% Presentation d'un slicing static, 
+% mais considère que les pointeurs peuvent sont potentiellement en alias 
+% avec n'importe quoi ! En fait, leur but est de faire du slicing dynamique, 
+% ça résoud donc le problème.
+@inproceedings{ agrawal91dynamic,
+    author = "Hiralal Agrawal and Richard A. {DeMillo} and Eugene H. Spafford",
+    title = "Dynamic Slicing in the Presence of Unconstrained Pointers",
+    booktitle = "Symposium on Testing, Analysis, and Verification",
+    pages = "60--73",
+    year = "1991",
+    url = "http://citeseer.nj.nec.com/agrawal91dynamic.html" 
+}
+
+%--------------------------------------------
+% Attention : une version de 88 + version révisée de 1990
+% System dependance graph et discussion sur l'interprocedural
+@inproceedings{ horwitz88interprocedural,
+    author = "Susan Horwitz and Thomas Reps and David Binkley",
+    title = "Interprocedural slicing using dependence graphs",
+    booktitle = "Proceedings of the {ACM} {SIGPLAN} '88 Conference on Programming Language Design and Implementation",
+    journal = "SIGPLAN Notices",
+    volume = "23-7",
+    month = "June",
+    address = "Atlanta, GA",
+    pages = "35--46",
+    year = "1988",
+    url = "http://citeseer.nj.nec.com/horwitz90interprocedural.html" 
+}
+%--------------------------------------------
+% Critère original :
+% "Statements are removed if they cannot lead to satisfaction of the negation
+% of the postcondition when executed in an initial state
+% which satisfies the precondition".
+% En gros, on veux vérifier une post, et on élimine déjà les cas
+% où on arrive à voir qu'elle est déjà vérifier pour ne garder que les
+% bouts de programme o`la vérif demande plus de travail.
+% Si le programme satisfait le pré-post, la réduction est vide.
+@inproceedings{Harman2001,
+ title = {Pre/Post Conditioned Slicing},
+  author = "Mark Harman and Rob Hierons and Chris Fox and Sebastian Danicic and John Howroyd",
+ booktitle = {ICSM '01: Proceedings of the IEEE International Conference on Software Maintenance (ICSM'01)},
+ year = {2001},
+ isbn = {0-7695-1189-9},
+ pages = {138},
+ publisher = {IEEE Computer Society},
+ address = {Washington, DC, USA},
+ }
+%--------------------------------------------
+% le slicing utiliser pour confronter deux versions d'un programme.
+@article{65980,
+ author = {Susan Horwitz and Jan Prins and Thomas Reps},
+ title = {Integrating noninterfering versions of programs},
+ journal = {ACM Trans. Program. Lang. Syst.},
+ volume = {11},
+ number = {3},
+ year = {1989},
+ issn = {0164-0925},
+ pages = {345--387},
+ url = {http://doi.acm.org/10.1145/65979.65980},
+ doi = {10.1145/65979.65980},
+ publisher = {ACM Press},
+ address = {New York, NY, USA},
+ comment = {Slicing to compare two versions of a program},
+ }
+%--------------------------------------------
+@article{Ferrante87,
+ author = {Jeanne Ferrante and Karl J. Ottenstein and Joe D. Warren},
+ title = {The program dependence graph and its use in optimization},
+ journal = {ACM Trans. Program. Lang. Syst.},
+ volume = {9},
+ number = {3},
+ year = {1987},
+ issn = {0164-0925},
+ pages = {319--349},
+ url = {http://doi.acm.org/10.1145/24039.24041},
+ publisher = {ACM Press},
+ address = {New York, NY, USA},
+ comment = {Introduce the function PDG (program dependence graph)},
+ }
+%--------------------------------------------
+@inproceedings{Ottenstein84,
+ author = {Karl J. Ottenstein and Linda M. Ottenstein},
+ title = {The program dependence graph in a software development environment},
+ booktitle = {SDE 1: Proceedings of the first ACM SIGSOFT/SIGPLAN software engineering symposium on Practical software development environments},
+ year = {1984},
+ isbn = {0-89791-131-8},
+ pages = {177--184},
+ url = {http://doi.acm.org/10.1145/800020.808263},
+ publisher = {ACM Press},
+ address = {New York, NY, USA},
+ }
+%--------------------------------------------
+@inproceedings{ sinha99systemdependencegraphbased,
+    author = "Saurabh Sinha and Mary Jean Harrold and Gregg Rothermel",
+    title = "System-Dependence-Graph-Based Slicing of Programs with Arbitrary Interprocedural Control Flow",
+    booktitle = "International Conference on Software Engineering",
+    pages = "432--441",
+    year = "1999",
+    url = "http://citeseer.nj.nec.com/article/sinha98systemdependencegraphbased.html" 
+}
+
+
+%--------------------------------------------
+@misc{ reps93wisconsin,
+  author = "T. Reps",
+  title = "The wisconsin program-integration system reference manual: Release",
+  text = "T. Reps. The wisconsin program-integration system reference manual: Release
+    2.0. Technical Report Unpublished report, University of Wisconsin, Madison,
+    WI, July 1993.",
+  year = "1993",
+  url = "http://citeseer.nj.nec.com/reps93wisconsin.html" 
+}
+
+%--------------------------------------------
+@inproceedings{ lyle97using,
+  author = "J. Lyle and D. Wallace",
+  title = "Using the Unravel Program Slicing Tool to Evaluate High Integrity Software",
+  booktitle = "Proceedings of Software Quality Week",
+  month = "May",
+  year = "1997",
+  url = "http://citeseer.ist.psu.edu/lyle97using.html" 
+}
+%--------------------------------------------
+@misc{unravel, 
+  key = "Unravel",
+  title = "Unravel",
+  url = "http://www.itl.nist.gov/div897/sqg/unravel/unravel.html"
+}
+%--------------------------------------------
+@misc{CodeSurfeur, 
+  key = "CodeSurfeur",
+  title = "CodeSurfeur",
+  url = "http://www.codesurfer.com/" 
+}
+%--------------------------------------------
+@PHDTHESIS{ weiser79,
+  author = "Mark Weiser",
+  title = "Program slices: formal, psychological, and practical investigations
+    of an automatic program abstraction method.",
+  school = "University of Michigan, Ann Arbor",
+  year = "1979"
+  }
+%--------------------------------------------
+@inproceedings{weiser81,
+ author = {Mark Weiser},
+ title = {Program slicing},
+ booktitle = {ICSE '81: Proceedings of the 5th international conference on Software engineering},
+ year = {1981},
+ isbn = {0-89791-146-6},
+ pages = {439--449},
+ location = {San Diego, California, United States},
+ publisher = {IEEE Press},
+ address = {Piscataway, NJ, USA},
+ }
+%--------------------------------------------
+% A LIRE : discution sur différents types de flots de données.
+@inproceedings{ cartwright89semantics,
+    author = "R. Cartwright and M. Felleisen",
+    title = "The semantics of program dependence",
+    booktitle = "Proceedings of the {ACM} {SIGPLAN} '89 Conference on Programming Language Design and Implementation",
+    journal = "SIGPLAN Notices",
+    volume = "24-7",
+    month = "June",
+    address = "Portland, OR",
+    pages = "13--27",
+    year = "1989",
+    url = "http://citeseer.ist.psu.edu/cartwright89semantic.html" 
+}
+%--------------------------------------------
+% Bonne idée de slicing avec des Pre/Post mais ne dit pas grand chose...
+% Je ne comprend pas bien comment on peut enlever des affectations 
+% en propageant une precondition en avant...
+@inproceedings{Chung-2001,
+ author = {I. S. Chung and W. K. Lee and G. S. Yoon and Y. R. Kwon},
+ title = {Program slicing based on specification},
+ booktitle = {SAC '01: Proceedings of the 2001 ACM symposium on Applied computing},
+ year = {2001},
+ isbn = {1-58113-287-5},
+ pages = {605--609},
+ location = {Las Vegas, Nevada, United States},
+ url = {http://doi.acm.org/10.1145/372202.372784},
+ publisher = {ACM Press},
+ address = {New York, NY, USA},
+ }
+
+%--------------------------------------------
+@article{survey2005,
+ author = {Baowen Xu and Ju Qian and Xiaofang Zhang and Zhongqiang Wu and Lin Chen},
+ title = {A brief survey of program slicing},
+ journal = {SIGSOFT Softw. Eng. Notes},
+ volume = {30},
+ number = {2},
+ year = {2005},
+ issn = {0163-5948},
+ pages = {1--36},
+ url = {http://doi.acm.org/10.1145/1050849.1050865},
+ publisher = {ACM Press},
+ address = {New York, NY, USA},
+ }
+%--------------------------------------------
+% Article très clair avec une bonne introduction (def. CFG, PDG, postdom, ...)
+% Deux méthodes pour calculer un slicing en présence de GOTO.
+% Définition et preuve d'une "correct executable slice"
+@article{Choi94,
+ author = {Jong-Deok Choi and Jeanne Ferrante},
+ title = {Static slicing in the presence of goto statements},
+ journal = {ACM Trans. Program. Lang. Syst.},
+ volume = {16},
+ number = {4},
+ year = {1994},
+ issn = {0164-0925},
+ pages = {1097--1113},
+ url = {http://doi.acm.org/10.1145/183432.183438},
+ publisher = {ACM Press},
+ address = {New York, NY, USA},
+ }
+%--------------------------------------------
+% Traitement des goto après slicing normal : bonne idée.
+% On ne modifie pas les graphes de dépendances,
+% mais on sélectionne après coup les GOTO dont le 1er postdominateur sélectionné% diffère du 1er successeur lexical sélectionné.
+@inproceedings{ agrawal94slicing,
+    author = "Hiralal Agrawal",
+    title = "On Slicing Programs with Jump Statements",
+    booktitle = "{SIGPLAN} Conference on Programming Language Design and Implementation",
+    pages = "302--312",
+    year = "1994",
+    url = "http://citeseer.ist.psu.edu/agrawal94slicing.html" 
+}
+%--------------------------------------------
+% A LIRE : amélioration de agrawal94slicing
+@misc{ harman98new,
+  author = "M. Harman and S. Danicic",
+  title = "A new algorithm for slicing unstructured programs",
+  text = "Harman, M. and Danicic, S. (1998). A new algorithm for slicing unstructured
+    programs. Journal of Software Maintenance, 10(6):415-441.",
+  year = "1998",
+  url = "http://citeseer.ist.psu.edu/harman98new.html" 
+}
+%--------------------------------------------
+% A LIRE : amélioration récente (2002) du traitement des goto
+% + traitement spécifique des switch.
+@inproceedings{ kumar02better,
+    author = "Sumit Kumar and Susan Horwitz",
+    title = "Better Slicing of Programs with Jumps and Switches",
+    booktitle = "Fundamental Approaches to Software Engineering",
+    pages = "96--112",
+    year = "2002",
+    url = "http://citeseer.ist.psu.edu/kumar02better.html" 
+}
+%--------------------------------------------
+% Très bon résumé de la problématique des dépendances de contrôle.
+% Traitement des cas sans point unique de sortie
+% Slicing préservant la non-terminaison et la terminaison prématurée (exit)
+% version courte publiée à ESOP2005.
+@techreport{ ranganath04new,
+  author = "V. Ranganath and T. Amtoft and A. Banerjee and M. Dwyer and J.
+Hatcliff",
+  title = "A new foundation for control-dependence and slicing for modern
+program structures",
+  institution = "SAnToS Lab., Kansas State University",
+  number = "8",
+  year = "2004",
+  url = "citeseer.ist.psu.edu/ranganath05new.html", 
+  note = "(Note : {\it Une version courte de ce document a été publiée à ESOP'2005})."
+}
+%--------------------------------------------
+% Intéressant : à étudier plus en détail en ce qui concerne les transformations
+%  code et les problèmes que ça pose.
+@misc{ danicic-syntaxdirected,
+  author = "Sebastian Danicic and Mark Harman and Malcolm Munro and Dave Binkley and
+    Mohammed Daoudi and Lin Hu and Xingyuan Zhang",
+  title = "Syntax-Directed Amorphous Slicing",
+  url = "http://citeseer.ist.psu.edu/579941.html" 
+}
+%--------------------------------------------
+% Slicing avec transformation des instructions 
+% Règles de transformation 
+%+ détail de 2 cas d'étude (A LIRE)
+@article{harman03,
+  author = "Mark Harman, David Binkley and Sebastian Danicic",
+  title = "Amorphous Program Slicing",
+  journal = "Journal of Systems and Software",
+  volume = "68",
+  number = "1",
+  pages = "45--64",  
+  year = "2003"
+}
+%--------------------------------------------
+@inproceedings{ harman01gustt,
+    author = "Mark Harman and Lin Hu and Malcolm C. Munro and Xingyuan Zhang",
+    title = "{GUSTT}: An Amorphous Slicing System which Combines Slicing and Transformation",
+    booktitle = "Working Conference on Reverse Engineering",
+    pages = "271--280",
+    year = "2001",
+    url = "http://citeseer.ist.psu.edu/harman01gustt.html" 
+}
+%--------------------------------------------
+% 
+@misc{ daoudi-consus,
+  author = "M. Daoudi and L. Ouarbya and J. Howroyd and S. Danicic and Mark Marman
+    and Chris Fox and M. P. Ward",
+  title = "ConSUS: A Scalable Approach to Conditional Slicing",
+  year = "2002",
+  url = "http://citeseer.ist.psu.edu/daoudi02consus.html"
+}
+%--------------------------------------------
+% Intro bien intéressante : A LIRE !
+@misc{ ward2002,
+  author = "Ward, Martin",
+  title = "Program Slicing via FermaT Transformations",
+  year = "2002",
+  url = "http://citeseer.ist.psu.edu/ward02program.html" }
+%--------------------------------------------
+% Description détaillée d'un outil de slicing conditionel 
+% sur un sous ensemble 'simple' de C.
+% différence entre
+% * "Control Dependance Sensive"
+%   = suppression des instructions qui ne sont pas executées 
+%     lorsque les entrées satisfont la pré
+% * et "Control Dependance Inensive"
+  % = suppression de tout ce qui est inutile pour que le pg slicé 
+% et le programme d'origine donnent les mêmes résultats en tout point 
+% lorsque les entrées satisfont la pré 
+% (par exemple, on peut supprimer un if si on sait dans quelle branche on passe)
+
+@article{fox-consit,
+  author = "Chris Fox and Sebastian Danicic and Mark Harman and Robert M. Hierons",
+  title = "ConSIT: A Fully Automated Conditioned Program Slicer",
+  journal = "Software: Practice and Experience",
+ volume = {34}, 
+ number = {1},
+ year = {2004},
+ pages = {15--46},
+ url = {http://dx.doi.org/10.1002/spe.556}
+}
+%--------------------------------------------
+@inproceedings{Field95,
+ author = {John Field and G. Ramalingam and Frank Tip},
+ title = {Parametric program slicing},
+ booktitle = {POPL '95: Proceedings of the 22nd ACM SIGPLAN-SIGACT symposium on Principles of programming languages},
+ year = {1995},
+ isbn = {0-89791-692-1},
+ pages = {379--392},
+ address = {San Francisco, California, United States},
+ url = {http://doi.acm.org/10.1145/199448.199534},
+ publisher = {ACM Press},
+ }
+%--------------------------------------------
+@article{176473,
+ author = {David Binkley},
+ title = {Precise executable interprocedural slices},
+ journal = {ACM Lett. Program. Lang. Syst.},
+ volume = {2},
+ number = {1-4},
+ year = {1993},
+ issn = {1057-4514},
+ pages = {31--45},
+ url = {http://doi.acm.org/10.1145/176454.176473},
+ publisher = {ACM Press},
+ address = {New York, NY, USA},
+ comment = {about generating a program slice that is compilable},
+ }
+%--------------------------------------------
+@inproceedings{Comuzzi,
+ author = {Joseph J. Comuzzi and Johnson M. Hart},
+ title = {Program Slicing Using Weakest Preconditions},
+ booktitle = {FME '96: Proceedings of the Third International Symposium of Formal Methods Europe on Industrial Benefit and Advances in Formal Methods},
+ year = {1996},
+ isbn = {3-540-60973-3},
+ pages = {557--575},
+ publisher = {Springer-Verlag},
+ address = {London, UK},
+url = {http://portal.acm.org/citation.cfm?id=729684},
+ comment = {about a slicing that keeps all that impact a property ?},
+ }
+%--------------------------------------------
+@inproceedings{ fox01backward,
+  author = "C. Fox and M. Harman and R. Hierons and S. Danicic",
+ title = {Backward Conditioning: A New Program Specialisation Technique and Its Application to Program Comprehension},
+ booktitle = {IWPC '01: Proceedings of the 9th International Workshop on Program Comprehension},
+ year = {2001},
+ pages = {89--97},
+ publisher = {IEEE Computer Society},
+ address = {Washington, DC, USA},
+ url = "http://citeseer.ist.psu.edu/fox01backward.html" 
+}
+%--------------------------------------------
+%--------------------------------------------
diff --git a/doc/slicing/call.fig b/doc/slicing/call.fig
new file mode 100644
index 0000000000000000000000000000000000000000..1d2f99cf6ff2918c92c73adf0f8ae8f7379be5c6
--- /dev/null
+++ b/doc/slicing/call.fig
@@ -0,0 +1,78 @@
+#FIG 3.2
+Landscape
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+6 4320 5670 4680 6030
+1 4 0 1 0 0 50 -1 20 0.000 1 0.0000 4410 5850 45 45 4365 5850 4455 5850
+1 4 0 1 0 0 50 -1 20 0.000 1 0.0000 4590 5850 45 45 4545 5850 4635 5850
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 4500 5850 162 162 4500 5850 4635 5940
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 4500 5670 4500 6030
+-6
+6 4770 7020 5130 7380
+1 4 0 1 0 0 50 -1 20 0.000 1 0.0000 4860 7200 45 45 4815 7200 4905 7200
+1 4 0 1 0 0 50 -1 20 0.000 1 0.0000 5040 7200 45 45 4995 7200 5085 7200
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 4950 7200 162 162 4950 7200 5085 7290
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 4950 7020 4950 7380
+-6
+6 6570 5895 6930 6255
+1 4 0 1 0 0 50 -1 20 0.000 1 0.0000 6660 6075 45 45 6615 6075 6705 6075
+1 4 0 1 0 0 50 -1 20 0.000 1 0.0000 6840 6075 45 45 6795 6075 6885 6075
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 6750 6075 162 162 6750 6075 6885 6165
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 6750 5895 6750 6255
+-6
+6 7020 6570 7380 6930
+1 4 0 1 0 0 50 -1 20 0.000 1 0.0000 7110 6750 45 45 7065 6750 7155 6750
+1 4 0 1 0 0 50 -1 20 0.000 1 0.0000 7290 6750 45 45 7245 6750 7335 6750
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 7200 6750 162 162 7200 6750 7335 6840
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 7200 6570 7200 6930
+-6
+2 1 0 2 0 0 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 3.00 90.00 150.00
+	 5895 7065 6165 7065
+2 1 0 2 0 0 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 3.00 90.00 150.00
+	 7020 6480 6885 6300
+2 1 0 2 0 0 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 3.00 90.00 150.00
+	 4770 6660 4680 6480
+2 1 0 2 0 0 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 3.00 90.00 150.00
+	 5850 6165 5625 6165
+3 2 0 1 0 7 50 -1 -1 0.000 0 0 0 3
+	 7110 6750 6660 6525 6660 6075
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 0 0 3
+	 7290 6750 7290 6300 6840 6075
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 0 0 3
+	 4860 7200 4410 6525 4410 5850
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 0 0 3
+	 5040 7200 5040 6300 4590 5850
+	 0.000 -1.000 0.000
+3 2 1 1 0 7 50 -1 -1 4.000 0 0 0 3
+	 6660 6075 5130 6435 4410 5895
+	 0.000 -1.000 0.000
+3 2 1 1 0 7 50 -1 -1 4.000 0 0 0 4
+	 6840 6075 6480 5670 5175 6075 4590 5850
+	 0.000 -1.000 -1.000 0.000
+3 2 1 1 0 7 50 -1 -1 4.000 0 0 0 4
+	 5040 7200 5850 6840 6975 7200 7290 6750
+	 0.000 -1.000 -1.000 0.000
+3 2 1 1 0 0 50 -1 -1 4.000 0 0 0 4
+	 4860 7200 4950 6885 5400 6750 6120 6840
+	 0.000 -1.000 -1.000 0.000
+4 0 0 50 -1 0 12 0.0000 4 90 180 4500 7245 cs\001
+4 0 0 50 -1 0 12 0.0000 4 90 180 4050 5895 ce\001
+4 0 0 50 -1 0 12 0.0000 4 90 90 7110 6075 e\001
+4 0 0 50 -1 0 12 0.0000 4 90 90 7515 6795 s\001
+4 0 0 50 -1 0 12 0.0000 4 180 135 7470 6300 gi\001
diff --git a/doc/slicing/choose_call.fig b/doc/slicing/choose_call.fig
new file mode 100644
index 0000000000000000000000000000000000000000..de59292eb760bb2ea6504d35c5f0c95a2da5289a
--- /dev/null
+++ b/doc/slicing/choose_call.fig
@@ -0,0 +1,223 @@
+#FIG 3.2
+Landscape
+Center
+Metric
+A4      
+41.00
+Single
+-2
+1200 2
+6 6840 3510 8190 3960
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 6840 3510 8190 3510 8190 3960 6840 3960 6840 3510
+4 0 0 50 -1 0 10 0.0000 4 135 645 6930 3690 call(c) = g\001
+4 0 0 50 -1 0 10 0.0000 4 150 1110 6930 3885 /\\ add_outputs (g)\001
+-6
+6 5715 6750 6705 7065
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+	 6705 7065 6705 6750 5715 6750 5715 7065 6705 7065
+4 0 0 50 -1 0 10 0.0000 4 135 840 5805 6975 in(c) ~in(g) ?\001
+-6
+6 4050 7200 5490 7965
+2 2 0 3 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 4095 7245 5445 7245 5445 7920 4095 7920 4095 7245
+4 0 0 50 -1 0 10 0.0000 4 135 840 4230 7830 /\\ in(g)~in(c)\001
+4 0 0 50 -1 0 10 0.0000 4 135 645 4230 7425 call(c) = g\001
+4 0 0 50 -1 0 10 0.0000 4 135 1020 4230 7650 /\\ out(g)~out(c)\001
+-6
+6 5580 8010 6930 8415
+4 0 0 50 -1 0 10 0.0000 4 150 1320 5580 8145 apply missing_inputs\001
+4 0 0 50 -1 0 10 0.0000 4 150 1350 5580 8370 = modify_call_inputs\001
+-6
+6 7020 7245 8415 7920
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 7020 7245 8415 7245 8415 7920 7020 7920 7020 7245
+4 0 0 50 -1 0 10 0.0000 4 150 1245 7110 7830 /\\ missing_inputs(c)\001
+4 0 0 50 -1 0 10 0.0000 4 135 1020 7110 7650 /\\ out(g)~out(c)\001
+4 0 0 50 -1 0 10 0.0000 4 135 645 7110 7425 call(c) = g\001
+-6
+6 7245 1620 8910 2115
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 7245 1620 8910 1620 8910 2115 7245 2115 7245 1620
+4 0 0 50 -1 0 10 0.0000 4 135 405 7380 1845 call=g\001
+4 0 0 50 -1 0 10 0.0000 4 150 1365 7380 2040 /\\ missing_outputs (c)\001
+-6
+6 7875 5625 9225 6300
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 7875 5625 9225 5625 9225 6300 7875 6300 7875 5625
+4 0 0 50 -1 0 10 0.0000 4 135 645 8010 5805 call(c) = g\001
+4 0 0 50 -1 0 10 0.0000 4 150 1110 8010 6000 /\\ change_call(g2)\001
+4 0 0 50 -1 0 10 0.0000 4 135 1095 8010 6195 /\\ out(g2)~out(c)\001
+-6
+6 8685 6525 10080 7290
+4 0 0 50 -1 0 10 0.0000 4 150 885 8685 6855 missing_input\001
+4 0 0 50 -1 0 10 0.0000 4 150 1155 8685 7050 -> change_call(g2)\001
+4 0 0 50 -1 0 10 0.0000 4 135 1395 8685 7245 (pre : out(g2)~out(c))\001
+4 0 0 50 -1 0 10 0.0000 4 105 465 8685 6660 USER :\001
+-6
+6 8640 2250 10035 3015
+4 0 0 50 -1 0 10 0.0000 4 150 1035 8640 2580 missing_outputs\001
+4 0 0 50 -1 0 10 0.0000 4 150 1155 8640 2775 -> change_call(g2)\001
+4 0 0 50 -1 0 10 0.0000 4 135 1395 8640 2970 (pre : out(g2)~out(c))\001
+4 0 0 50 -1 0 10 0.0000 4 105 465 8640 2385 USER :\001
+-6
+6 7245 2520 8010 2745
+2 4 0 1 0 7 50 -1 18 0.000 0 0 7 0 0 5
+	 8010 2745 7245 2745 7245 2520 8010 2520 8010 2745
+4 0 0 50 -1 2 10 0.0000 4 105 600 7335 2700 MODE ?\001
+-6
+6 -360 1035 990 1575
+4 1 0 50 -1 0 10 0.0000 4 150 1140 315 1170 apr\350s modification\001
+4 1 0 50 -1 0 10 0.0000 4 135 1020 315 1350 du marquage de c\001
+4 1 0 50 -1 0 10 0.0000 4 135 1320 315 1530 avec sig(c) <> bottom\001
+-6
+6 -225 6300 1125 6840
+6 -225 6705 1125 6840
+4 1 0 50 -1 0 10 0.0000 4 135 1275 450 6810 pour chaque appelant\001
+-6
+4 1 0 50 -1 0 10 0.0000 4 150 1140 450 6435 apr\350s modification\001
+4 1 0 50 -1 0 10 0.0000 4 150 990 450 6615 d'une entr\351e de g\001
+-6
+6 5490 4995 6840 5715
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 5490 4995 6840 4995 6840 5715 5490 5715 5490 4995
+4 0 0 50 -1 0 10 0.0000 4 135 900 5670 5220 call(c) = None\001
+4 0 0 50 -1 0 10 0.0000 4 150 1035 5670 5415 /\\ change_call(g)\001
+4 0 0 50 -1 0 10 0.0000 4 135 1020 5670 5610 /\\ out(g)~out(c)\001
+-6
+6 2025 5220 4365 5715
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 2025 5220 4365 5220 4365 5715 2025 5715 2025 5220
+4 0 0 50 -1 0 10 0.0000 4 135 900 2115 5400 call(c) = None\001
+4 0 0 50 -1 0 10 0.0000 4 150 2115 2115 5595 /\\ add_outputs (g)+change_call(g)\001
+-6
+6 4500 5220 5490 5580
+4 0 0 50 -1 0 10 0.0000 4 150 960 4500 5535 add_outputs(g)\001
+4 0 0 50 -1 0 10 0.0000 4 135 345 4500 5355 apply\001
+-6
+6 2025 4590 3105 4860
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+	 3105 4860 3105 4590 2025 4590 2025 4860 3105 4860
+4 0 0 50 -1 0 10 0.0000 4 135 960 2070 4770 out(g)~out(c)?\001
+-6
+6 3600 3825 4770 4410
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 3600 3825 4770 3825 4770 4410 3600 4410 3600 3825
+4 0 0 50 -1 0 10 0.0000 4 135 900 3735 4050 call(c) = None\001
+4 0 0 50 -1 0 10 0.0000 4 105 720 3735 4245 /\\ NewSlice\001
+-6
+6 2250 3870 3015 4095
+2 4 0 1 0 7 50 -1 18 0.000 0 0 7 0 0 5
+	 3015 4095 2250 4095 2250 3870 3015 3870 3015 4095
+4 0 0 50 -1 2 10 0.0000 4 105 600 2340 4050 MODE ?\001
+-6
+6 2070 2880 3240 3465
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 2070 2880 3240 2880 3240 3465 2070 3465 2070 2880
+4 0 0 50 -1 0 10 0.0000 4 135 900 2205 3105 call(c) = None\001
+4 0 0 50 -1 0 10 0.0000 4 150 840 2205 3300 /\\ choose_call\001
+-6
+6 3420 3015 5805 3375
+4 0 0 50 -1 0 10 0.0000 4 135 1320 3870 3330 (pre : out(g)~out(c))\001
+4 0 0 50 -1 0 10 0.0000 4 150 2355 3420 3150 USER : choose_call -> change_call (g)\001
+-6
+1 3 0 1 0 0 50 -1 20 0.000 1 0.0000 1485 6480 64 64 1485 6480 1549 6480
+1 3 0 1 0 0 50 -1 20 0.000 1 0.0000 6210 6030 64 64 6210 6030 6274 6030
+1 3 0 1 0 0 50 -1 20 0.000 1 0.0000 2475 4275 64 64 2475 4275 2539 4275
+2 1 1 1 0 7 50 -1 -1 6.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 3240 3195 6210 3195 6210 4995
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 3105 4725 5670 4725 5670 4995
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 2025 1215 2475 1215 2475 2880
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 7200 2610 2880 2610 2880 2880
+2 1 1 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 8415 7470 8550 7470 8550 6300
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 2475 4860 2475 5220
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 2475 4095 2475 4590
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 4
+	2 1 1.00 60.00 120.00
+	 7470 3960 7470 6480 6390 6480 6390 6750
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 7470 2160 7470 2520
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 6210 5715 6210 6030
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 -450 1215 990 1215
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 6210 6030 6210 6750
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 5715 6930 4725 6930 4725 7200
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 -450 6480 1440 6480
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 2025 1890 7245 1890
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 6705 6930 7695 6930 7695 7245
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 7470 2745 7470 3510
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 4
+	2 1 1.00 60.00 120.00
+	 7695 7920 7695 8235 4725 8235 4725 7920
+2 1 1 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 8550 2115 8550 5445 6840 5445
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 2475 3465 2475 3870
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 3015 4005 3600 4005
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+	 2025 1350 2025 1080 990 1080 990 1350 2025 1350
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 1485 1350 1485 1755
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+	 2025 2025 2025 1755 990 1755 990 2025 2025 2025
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 4
+	2 1 1.00 60.00 120.00
+	 1485 2025 1485 6480 6075 6480 6075 6750
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 7875 6030 6255 6030
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 4365 5400 5490 5400
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 3600 4275 2520 4275
+4 0 0 50 -1 0 10 0.0000 4 105 345 2565 4995 NON\001
+4 0 0 50 -1 0 10 0.0000 4 105 285 3195 4545 OUI\001
+4 0 0 50 -1 0 10 0.0000 4 105 285 5400 6885 OUI\001
+4 0 0 50 -1 0 10 0.0000 4 105 345 6840 6885 NON\001
+4 0 0 50 -1 0 10 0.0000 4 150 1410 6660 2340 apply missing_outputs\001
+4 0 0 50 -1 0 10 0.0000 4 105 345 2070 1170 NON\001
+4 0 0 50 -1 0 10 0.0000 4 105 345 2070 1845 NON\001
+4 0 0 50 -1 0 10 0.0000 4 105 765 6345 2880 call <- None\001
+4 0 0 50 -1 0 10 0.0000 4 105 285 1575 1530 OUI\001
+4 1 0 50 -1 0 10 0.0000 4 135 735 1485 1260 call(c) = g ?\001
+4 1 0 50 -1 0 10 0.0000 4 135 990 1485 1935 out(g)~out(c) ?\001
+4 0 0 50 -1 0 10 0.0000 4 105 285 1575 2205 OUI\001
+4 0 0 50 -1 0 10 0.0000 4 150 1095 5895 6255 apply change_call\001
+4 0 0 50 -1 0 10 0.0000 4 105 270 2565 4500 -> g \001
+4 0 0 50 -1 0 10 0.0000 4 150 1095 2160 3645 apply choose_call\001
diff --git a/doc/slicing/conclusion.tex b/doc/slicing/conclusion.tex
new file mode 100644
index 0000000000000000000000000000000000000000..cfa67fd91a7ea5fb75899f741a5f830fab6cf888
--- /dev/null
+++ b/doc/slicing/conclusion.tex
@@ -0,0 +1,20 @@
+\chapter{Conclusion}
+
+En conclusion, on peut dire que les fonctionnalités de base de l'outil
+n'ont pas beaucoup évoluées en 2008, mais il a gagné en robustesse,
+et en précision~: ce qui était le principal objectif de l'année.\\
+
+La principale évolution concerne la gestion des annotations
+que ce soit lors de la production du résultat (que garde-t-on~?)
+que comme critère de \slicing. Ce point est encore en développement
+car il nécessite l'utilisation de fonctions externes au module
+qui n'existent pas encore.\\
+
+La boîte à outils de \slicing peut être considéré comme stable,
+même si elle peut encore évoluer pour répondre à de nouveaux besoins,
+
+L'annexe \ref{sec-projets} présente en particulier
+certains projets qui ont été évoqués,
+et dont certain pourrait éventuellement venir compléter l'outil.
+
+
diff --git a/doc/slicing/exple2.fig b/doc/slicing/exple2.fig
new file mode 100644
index 0000000000000000000000000000000000000000..063357672eaa09c8a334ddef7d364827f57d3708
--- /dev/null
+++ b/doc/slicing/exple2.fig
@@ -0,0 +1,266 @@
+#FIG 3.2
+Landscape
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+5 1 0 1 0 5 20 -1 20 0.000 0 1 0 0 2700.000 4365.000 2700 4275 2610 4365 2700 4455
+5 1 0 1 0 5 20 -1 20 0.000 0 1 0 0 3375.000 3960.000 3375 3870 3285 3960 3375 4050
+5 1 0 1 0 5 20 -1 20 0.000 0 1 0 0 3375.000 3735.000 3375 3645 3285 3735 3375 3825
+5 1 0 1 0 5 20 -1 20 0.000 0 1 0 0 3375.000 3375.000 3375 3285 3285 3375 3375 3465
+5 1 0 1 0 5 20 -1 20 0.000 0 1 0 0 3375.000 3150.000 3375 3060 3285 3150 3375 3240
+5 1 0 1 0 5 20 -1 20 0.000 0 1 0 0 3375.000 2700.000 3375 2610 3285 2700 3375 2790
+5 1 0 1 0 2 21 -1 20 0.000 0 0 0 0 3375.000 3150.000 3375 3060 3465 3150 3375 3240
+5 1 0 1 0 2 21 -1 20 0.000 0 0 0 0 3375.000 2700.000 3375 2610 3465 2700 3375 2790
+5 1 0 1 0 2 22 -1 20 0.000 0 0 0 0 2925.000 3150.000 2925 3060 3015 3150 2925 3240
+5 1 0 1 0 2 22 -1 20 0.000 0 0 0 0 2925.000 2700.000 2925 2610 3015 2700 2925 2790
+5 1 0 1 0 2 22 -1 20 0.000 0 0 0 0 3825.000 3735.000 3825 3645 3915 3735 3825 3825
+5 1 0 1 0 2 22 -1 20 0.000 0 0 0 0 3825.000 2700.000 3825 2610 3915 2700 3825 2790
+5 1 0 1 0 2 22 -1 20 0.000 0 0 0 0 3375.000 3735.000 3375 3645 3465 3735 3375 3825
+5 1 0 1 0 2 22 -1 20 0.000 0 0 0 0 3375.000 3375.000 3375 3285 3465 3375 3375 3465
+5 1 0 1 0 5 14 -1 20 0.000 0 1 0 0 2925.000 3150.000 2925 3060 2835 3150 2925 3240
+5 1 0 1 0 5 14 -1 20 0.000 0 1 0 0 3600.000 3735.000 3600 3645 3510 3735 3600 3825
+5 1 0 1 0 5 14 -1 20 0.000 0 1 0 0 3600.000 2700.000 3600 2610 3510 2700 3600 2790
+5 1 0 1 0 5 14 -1 20 0.000 0 1 0 0 3150.000 3150.000 3150 3060 3060 3150 3150 3240
+5 1 0 1 0 5 14 -1 20 0.000 0 1 0 0 3150.000 2700.000 3150 2610 3060 2700 3150 2790
+5 1 0 1 0 5 14 -1 20 0.000 0 1 0 0 2925.000 2700.000 2925 2610 2835 2700 2925 2790
+5 1 0 1 0 5 13 -1 20 0.000 0 1 0 0 675.000 3150.000 675 3060 585 3150 675 3240
+5 1 0 1 0 5 13 -1 20 0.000 0 1 0 0 900.000 3150.000 900 3060 810 3150 900 3240
+5 1 0 1 0 5 13 -1 20 0.000 0 1 0 0 1350.000 3150.000 1350 3060 1260 3150 1350 3240
+5 1 0 1 0 5 13 -1 20 0.000 0 1 0 0 1350.000 2700.000 1350 2610 1260 2700 1350 2790
+5 1 0 1 0 5 13 -1 20 0.000 0 1 0 0 900.000 2700.000 900 2610 810 2700 900 2790
+5 1 0 1 0 5 13 -1 20 0.000 0 1 0 0 675.000 2700.000 675 2610 585 2700 675 2790
+5 1 0 1 0 5 41 -1 20 0.000 0 1 0 0 2925.000 3150.000 2925 3060 2835 3150 2925 3240
+5 1 0 1 0 5 41 -1 20 0.000 0 1 0 0 2925.000 2700.000 2925 2610 2835 2700 2925 2790
+5 1 0 1 0 5 41 -1 20 0.000 0 1 0 0 3375.000 3735.000 3375 3645 3285 3735 3375 3825
+5 1 0 1 0 5 41 -1 20 0.000 0 1 0 0 3375.000 3375.000 3375 3285 3285 3375 3375 3465
+5 1 0 1 0 5 41 -1 20 0.000 0 1 0 0 3375.000 3150.000 3375 3060 3285 3150 3375 3240
+5 1 0 1 0 5 41 -1 20 0.000 0 1 0 0 3375.000 2700.000 3375 2610 3285 2700 3375 2790
+5 1 0 1 0 2 42 -1 20 0.000 0 0 0 0 3825.000 3735.000 3825 3645 3915 3735 3825 3825
+5 1 0 1 0 2 42 -1 20 0.000 0 0 0 0 3375.000 3150.000 3375 3060 3465 3150 3375 3240
+5 1 0 1 0 2 42 -1 20 0.000 0 0 0 0 3825.000 2700.000 3825 2610 3915 2700 3825 2790
+5 1 0 1 0 2 42 -1 20 0.000 0 0 0 0 3375.000 2700.000 3375 2610 3465 2700 3375 2790
+5 1 0 1 0 5 43 -1 20 0.000 0 1 0 0 675.000 3150.000 675 3060 585 3150 675 3240
+5 1 0 1 0 5 43 -1 20 0.000 0 1 0 0 1125.000 3150.000 1125 3060 1035 3150 1125 3240
+5 1 0 1 0 2 43 -1 20 0.000 0 0 0 0 1125.000 3150.000 1125 3060 1215 3150 1125 3240
+5 1 0 1 0 2 43 -1 20 0.000 0 0 0 0 1575.000 3150.000 1575 3060 1665 3150 1575 3240
+5 1 0 1 0 2 43 -1 20 0.000 0 0 0 0 1575.000 2700.000 1575 2610 1665 2700 1575 2790
+5 1 0 1 0 2 43 -1 20 0.000 0 0 0 0 1125.000 2700.000 1125 2610 1215 2700 1125 2790
+5 1 0 1 0 5 43 -1 20 0.000 0 1 0 0 1125.000 2700.000 1125 2610 1035 2700 1125 2790
+5 1 0 1 0 5 43 -1 20 0.000 0 1 0 0 675.000 2700.000 675 2610 585 2700 675 2790
+5 1 0 1 0 5 31 -1 20 0.000 0 1 0 0 3600.000 3735.000 3600 3645 3510 3735 3600 3825
+5 1 0 1 0 5 31 -1 20 0.000 0 1 0 0 3600.000 2700.000 3600 2610 3510 2700 3600 2790
+5 1 0 1 0 5 31 -1 20 0.000 0 1 0 0 3150.000 3150.000 3150 3060 3060 3150 3150 3240
+5 1 0 1 0 5 31 -1 20 0.000 0 1 0 0 3150.000 2700.000 3150 2610 3060 2700 3150 2790
+5 1 0 1 0 5 31 -1 20 0.000 0 1 0 0 900.000 3150.000 900 3060 810 3150 900 3240
+5 1 0 1 0 5 31 -1 20 0.000 0 1 0 0 1350.000 3150.000 1350 3060 1260 3150 1350 3240
+5 1 0 1 0 5 31 -1 20 0.000 0 1 0 0 900.000 2700.000 900 2610 810 2700 900 2790
+5 1 0 1 0 5 31 -1 20 0.000 0 1 0 0 1350.000 2700.000 1350 2610 1260 2700 1350 2790
+5 1 0 1 0 5 51 -1 20 0.000 0 1 0 0 4725.000 3510.000 4725 3420 4635 3510 4725 3600
+5 1 0 1 0 1 51 -1 20 0.000 0 0 0 0 4725.000 3825.000 4725 3735 4815 3825 4725 3915
+5 1 0 1 0 2 51 -1 20 0.000 0 0 0 0 4725.000 4185.000 4725 4095 4815 4185 4725 4275
+5 1 0 1 0 5 23 -1 20 0.000 0 1 0 0 1125.000 3150.000 1125 3060 1035 3150 1125 3240
+5 1 0 1 0 5 23 -1 20 0.000 0 1 0 0 1125.000 2700.000 1125 2610 1035 2700 1125 2790
+5 1 0 1 0 2 23 -1 20 0.000 0 0 0 0 1125.000 2700.000 1125 2610 1215 2700 1125 2790
+5 1 0 1 0 2 23 -1 20 0.000 0 0 0 0 1575.000 2700.000 1575 2610 1665 2700 1575 2790
+5 1 0 1 0 2 23 -1 20 0.000 0 0 0 0 1575.000 3150.000 1575 3060 1665 3150 1575 3240
+5 1 0 1 0 2 23 -1 20 0.000 0 0 0 0 675.000 2700.000 675 2610 765 2700 675 2790
+5 1 0 1 0 2 23 -1 20 0.000 0 0 0 0 675.000 3150.000 675 3060 765 3150 675 3240
+5 1 0 1 0 2 23 -1 20 0.000 0 0 0 0 1125.000 3150.000 1125 3060 1215 3150 1125 3240
+6 4500 2565 6165 3285
+5 1 0 1 0 5 15 -1 20 0.000 0 1 0 0 5400.000 3150.000 5400 3060 5310 3150 5400 3240
+5 1 0 1 0 5 15 -1 20 0.000 0 1 0 0 5400.000 2700.000 5400 2610 5310 2700 5400 2790
+5 1 0 1 0 5 15 -1 20 0.000 0 1 0 0 4950.000 2700.000 4950 2610 4860 2700 4950 2790
+5 1 0 1 0 5 40 -1 20 0.000 0 1 0 0 4950.000 3150.000 4950 3060 4860 3150 4950 3240
+5 1 0 1 0 5 40 -1 20 0.000 0 1 0 0 4950.000 2700.000 4950 2610 4860 2700 4950 2790
+5 1 0 1 0 1 42 -1 20 0.000 0 0 0 0 5850.000 3150.000 5850 3060 5940 3150 5850 3240
+5 1 0 1 0 1 42 -1 20 0.000 0 0 0 0 5850.000 2700.000 5850 2610 5940 2700 5850 2790
+5 1 0 1 0 5 30 -1 20 0.000 0 1 0 0 5400.000 3150.000 5400 3060 5310 3150 5400 3240
+5 1 0 1 0 5 30 -1 20 0.000 0 1 0 0 5400.000 2700.000 5400 2610 5310 2700 5400 2790
+6 4500 2565 6165 3285
+5 1 0 1 0 1 21 -1 20 0.000 0 0 0 0 5850.000 3150.000 5850 3060 5940 3150 5850 3240
+5 1 0 1 0 1 21 -1 20 0.000 0 0 0 0 5850.000 2700.000 5850 2610 5940 2700 5850 2790
+5 1 0 1 0 1 22 -1 20 0.000 0 0 0 0 4950.000 3150.000 4950 3060 5040 3150 4950 3240
+5 1 0 1 0 1 22 -1 20 0.000 0 0 0 0 4950.000 2700.000 4950 2610 5040 2700 4950 2790
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 5400 2700 90 90 5400 2700 5490 2700
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 5400 3150 90 90 5400 3150 5490 3150
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 4950 2700 90 90 4950 2700 5040 2700
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 4950 3150 90 90 4950 3150 5040 3150
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 5850 3150 90 90 5850 3150 5940 3150
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 5850 2700 90 90 5850 2700 5940 2700
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 4770 2700 4500 3060
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 4500 2700 6165 2700 6165 3150 4500 3150 4500 2700
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 4950 2790 4950 3060
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 5400 2790 5400 3060
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 5850 2790 5850 3060
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 5015 2768 5375 3083
+4 1 0 50 -1 0 10 0.0000 4 105 120 5130 3060 X\001
+4 1 0 50 -1 0 10 0.0000 4 105 120 5580 3060 Y\001
+4 1 0 50 -1 0 10 0.0000 4 105 75 6030 3060 g\001
+4 1 0 50 -1 0 10 0.0000 4 105 75 4590 2835 g\001
+4 1 0 50 -1 0 10 0.0000 4 75 75 4815 2655 u\001
+4 1 0 50 -1 0 10 0.0000 4 75 75 5265 2655 v\001
+4 1 0 50 -1 0 10 0.0000 4 75 120 5715 2655 w\001
+-6
+-6
+6 540 2565 1710 2835
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 675 2700 90 90 675 2700 765 2700
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 900 2700 90 90 900 2700 990 2700
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 1125 2700 90 90 1125 2700 1215 2700
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 1350 2700 90 90 1350 2700 1440 2700
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 1575 2700 90 90 1575 2700 1665 2700
+-6
+6 540 3015 1710 3285
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 675 3150 90 90 675 3150 765 3150
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 900 3150 90 90 900 3150 990 3150
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 1125 3150 90 90 1125 3150 1215 3150
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 1350 3150 90 90 1350 3150 1440 3150
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 1575 3150 90 90 1575 3150 1665 3150
+-6
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3150 3150 90 90 3150 3150 3240 3150
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3150 3375 90 90 3150 3375 3240 3375
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3600 3735 90 90 3600 3735 3690 3735
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3825 3960 90 90 3825 3960 3915 3960
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3600 3960 90 90 3600 3960 3690 3960
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3600 2700 90 90 3600 2700 3690 2700
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3825 2700 90 90 3825 2700 3915 2700
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3375 2700 90 90 3375 2700 3465 2700
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3150 2700 90 90 3150 2700 3240 2700
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 2925 2700 90 90 2925 2700 3015 2700
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3365 3730 90 90 3365 3730 3455 3730
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3815 3730 90 90 3815 3730 3905 3730
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 2935 3370 90 90 2935 3370 3025 3370
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3385 3370 90 90 3385 3370 3475 3370
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3385 3145 90 90 3385 3145 3475 3145
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 2935 3145 90 90 2935 3145 3025 3145
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3150 4365 90 90 3150 4365 3240 4365
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3600 4365 90 90 3600 4365 3690 4365
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 4050 4365 90 90 4050 4365 4140 4365
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 2700 4365 90 90 2700 4365 2790 4365
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3375 3960 90 90 3375 3960 3465 3960
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 1125 3465 90 90 1125 3465 1215 3465
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 1350 3465 90 90 1350 3465 1440 3465
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 1575 3465 90 90 1575 3465 1665 3465
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 900 3465 90 90 900 3465 990 3465
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 2483 2700 2258 3060
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 2925 2790 2925 3060
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 3150 2790 3150 3060
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 3375 2790 3375 3060
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 3375 3465 3375 3645
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 4
+	1 1 1.00 60.00 75.00
+	 3375 4050 3375 4095 3150 4095 3150 4275
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 3600 4050 3600 4275
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 4
+	1 1 1.00 60.00 75.00
+	 3825 4050 3825 4095 4050 4095 4050 4275
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 2475 3150 2700 3150 2700 3375 2475 3375 2475 3150
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 2700 3150 3510 3150 3510 3375 2700 3375 2700 3150
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 2925 3735 3150 3735 3150 3960 2925 3960 2925 3735
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 3600 2790 3600 3645
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 3825 2790 3825 3645
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 3150 3735 3960 3735 3960 3960 3150 3960 3150 3735
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 4
+	1 1 1.00 60.00 75.00
+	 3150 4095 2925 4095 2700 4095 2700 4275
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 2250 2700 4275 2700 4275 4365 2250 4365 2250 2700
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 1575 3240 1575 3375
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 1350 3240 1350 3375
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 1125 3240 1125 3375
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 1125 3240 900 3375
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 900 3240 900 3375
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 675 3240 900 3375
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 900 3240 1125 3375
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 675 3240 1125 3375
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 675 2790 675 3060
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 900 2790 900 3060
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 1125 2790 1125 3060
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 1350 2790 1350 3060
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 1575 2790 1575 3060
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 540 3150 1710 3150 1710 3465 540 3465 540 3150
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 540 3150 360 3150 360 3465 540 3465 540 3150
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 0 2700 2025 2700 2025 3825 0 3825 0 2700
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 495 2700 0 3195
+4 0 0 50 -1 0 12 0.0000 4 135 60 2295 2835 f\001
+4 1 0 50 -1 0 10 0.0000 4 105 135 2610 3105 c1\001
+4 1 0 50 -1 0 10 0.0000 4 105 135 3060 3690 c2\001
+4 1 0 50 -1 0 10 0.0000 4 105 120 3240 4275 X\001
+4 1 0 50 -1 0 10 0.0000 4 105 120 3690 4275 Y\001
+4 1 0 50 -1 0 10 0.0000 4 105 60 2790 4275 f\001
+4 1 0 50 -1 0 10 0.0000 4 105 90 4140 4275 Z\001
+4 1 0 50 -1 0 10 0.0000 4 105 75 2565 3285 g\001
+4 1 0 50 -1 0 10 0.0000 4 105 75 3060 3870 g\001
+4 1 0 50 -1 0 10 0.0000 4 75 60 2925 2565 a\001
+4 1 0 50 -1 0 10 0.0000 4 105 75 3150 2565 b\001
+4 1 0 50 -1 0 10 0.0000 4 75 60 3375 2565 c\001
+4 1 0 50 -1 0 12 0.0000 4 135 90 3600 2565 d\001
+4 1 0 50 -1 0 12 0.0000 4 90 90 3825 2565 e\001
+4 0 0 51 -1 0 10 0.0000 4 135 990 4950 3555 marque m en m1\001
+4 0 0 51 -1 0 10 0.0000 4 135 990 4950 3870 marque m en m2\001
+4 0 0 51 -1 0 10 0.0000 4 135 1185 4950 4230 marque spare en m2\001
+4 1 0 50 -1 0 10 0.0000 4 105 120 1125 3690 X\001
+4 1 0 50 -1 0 10 0.0000 4 105 120 1350 3690 Y\001
+4 1 0 50 -1 0 10 0.0000 4 105 90 1575 3690 Z\001
+4 1 0 50 -1 0 10 0.0000 4 105 120 900 3690 N\001
+4 1 0 50 -1 0 12 0.0000 4 135 60 675 2565 I\001
+4 1 0 50 -1 0 12 0.0000 4 135 75 900 2565 J\001
+4 1 0 50 -1 0 12 0.0000 4 135 135 1125 2565 K\001
+4 1 0 50 -1 0 12 0.0000 4 135 105 1350 2565 L\001
+4 1 0 50 -1 0 12 0.0000 4 135 165 1575 2565 M\001
+4 1 0 50 -1 0 12 0.0000 4 135 60 450 3375 f\001
+4 1 0 50 -1 0 12 0.7854 4 135 360 225 2925 main\001
diff --git a/doc/slicing/exple2v0.pdf b/doc/slicing/exple2v0.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..644513d26120a090ea73a3b5b14d52af292d22e0
Binary files /dev/null and b/doc/slicing/exple2v0.pdf differ
diff --git a/doc/slicing/exple2v1-1.pdf b/doc/slicing/exple2v1-1.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..7d821b6a59ed2869753f01ea0c03d2689162cc79
Binary files /dev/null and b/doc/slicing/exple2v1-1.pdf differ
diff --git a/doc/slicing/exple2v1-2.pdf b/doc/slicing/exple2v1-2.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..84850912b8f1b5f18a604e8aa30b6f562d5691cc
Binary files /dev/null and b/doc/slicing/exple2v1-2.pdf differ
diff --git a/doc/slicing/exple2v1-3.pdf b/doc/slicing/exple2v1-3.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..aad6063f1b39f90136293ba1dfe76318f0255186
Binary files /dev/null and b/doc/slicing/exple2v1-3.pdf differ
diff --git a/doc/slicing/exple2v1-4.pdf b/doc/slicing/exple2v1-4.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..9d665443e13baeaaae0d12cfe356d749a6d5508c
Binary files /dev/null and b/doc/slicing/exple2v1-4.pdf differ
diff --git a/doc/slicing/exple2v2-1.pdf b/doc/slicing/exple2v2-1.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..218a7e55a1e5d53d55a89eee9fd984ba16a9781f
Binary files /dev/null and b/doc/slicing/exple2v2-1.pdf differ
diff --git a/doc/slicing/exple2v2-2.pdf b/doc/slicing/exple2v2-2.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..4593112e2f5dc3c0af633c0a05c89400c5d4cfb1
Binary files /dev/null and b/doc/slicing/exple2v2-2.pdf differ
diff --git a/doc/slicing/exple2v2-3.pdf b/doc/slicing/exple2v2-3.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..f0b2b16294ac04bd6c2cc15493bb05a2c54fd345
Binary files /dev/null and b/doc/slicing/exple2v2-3.pdf differ
diff --git a/doc/slicing/exple2v3-1.pdf b/doc/slicing/exple2v3-1.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..f0a389d3b848397281e7ee5088d01d2e8d234b87
Binary files /dev/null and b/doc/slicing/exple2v3-1.pdf differ
diff --git a/doc/slicing/exple2v3-2.pdf b/doc/slicing/exple2v3-2.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..decf18a4c15a76cc5ffe6fc9df111e82a9a2ee69
Binary files /dev/null and b/doc/slicing/exple2v3-2.pdf differ
diff --git a/doc/slicing/exple2v3-3.pdf b/doc/slicing/exple2v3-3.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..3fe63e2bd280ed94ac8a627997c631b300fd8811
Binary files /dev/null and b/doc/slicing/exple2v3-3.pdf differ
diff --git a/doc/slicing/exple2v3-4.pdf b/doc/slicing/exple2v3-4.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..afc8e61196c714677a7d02079d33a1aae3627730
Binary files /dev/null and b/doc/slicing/exple2v3-4.pdf differ
diff --git a/doc/slicing/exple2v4-1.pdf b/doc/slicing/exple2v4-1.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..253178920e4656ccc7817d6f9cfb626885e38fbc
Binary files /dev/null and b/doc/slicing/exple2v4-1.pdf differ
diff --git a/doc/slicing/exple2v4-2.pdf b/doc/slicing/exple2v4-2.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..92ffac9208c07267c158b6552b64f44b71a08ce0
Binary files /dev/null and b/doc/slicing/exple2v4-2.pdf differ
diff --git a/doc/slicing/fonction.tex b/doc/slicing/fonction.tex
new file mode 100644
index 0000000000000000000000000000000000000000..faa7a9ae02c1e8d06a5b5906b19ea195086e4601
--- /dev/null
+++ b/doc/slicing/fonction.tex
@@ -0,0 +1,223 @@
+\chapter{Réduction d'une fonction}\label{sec-filtrage-fct}
+
+\section{Fonction spécialisée}
+
+On appelle \indextxtdef{fonction spécialisée}{fonction!spécialisée}
+la réduction d'une fonction source obtenue suite à l'application d'une ou
+plusieurs actions. Ce chapitre expose comment est représentée
+cette réduction, et comment elle est calculée.\\
+
+La réduction d'une fonction doit distinguer les instructions visibles
+de celles qui ne le sont pas.
+Une information booléenne, attachée à chaque instruction,
+devrait donc suffire à
+indiquer si celle-ci appartient ou non à la fonction spécialisée, mais
+la mise en place d'un outil de navigation incite à enrichir les informations
+calculées. On décide donc d'avoir
+une annotation plus précise du flot de données, que l'on appelle
+{\bf marquage},
+pour préciser la raison de la présence ou de l'absence d'un certain élément.
+Cela peut permettre de visualiser l'impact des instructions d'une
+fonction sur un point de programme (contrôle, données utilisées, déclaration
+nécessaires, etc.)\\
+
+Le document qui présente le calcul de PDG expose les éléments qui composent le
+graphe de dépendance. La plupart correspondent à une instruction.
+Quelques exceptions néanmoins~:
+\begin{itemize}
+\item les éléments représentant les entrées/sorties d'une fonction
+  ne sont pas associés à une instruction,
+\item le label d'une instruction est représenté par un élément en plus de ceux
+qui représentent l'instruction,
+\item un appel de fonction est représenté par plusieurs éléments.\\
+\end{itemize}
+
+Nous ne nous considérons pas, dans un premier temps,
+la spécialisation des fonctions appelées qui sera étudiée
+dans le chapitre \ref{sec-interproc}. 
+L'appel de fonction est donc simplement vu pour l'instant comme
+une instruction représentée par plusieurs éléments.
+
+
+Par contre, nous distinguons la visibilité d'un label de celle de l'instruction
+associée. Dans la suite, le label sera souvent considéré comme une instruction à
+part entière.\\
+
+On peut donc dire que
+la fonction spécialisée contient un \indexdef{marquage}
+qui fait correspondre une \indexdef{marque} 
+aux instructions et labels d'une fonction.
+
+\section{Marquage}
+
+On calcule le marquage d'une fonction en réponse à une requête.
+Celle-ci se traduit en général en terme d'éléments du PDG.\\
+
+Initialement, le marquage
+peut contenir le résultat de précédents calculs ou être
+nouvellement créé, c'est-à-dire vide.\\
+
+Le calcul élémentaire est très simple~:
+il consiste à parcourir le PDG,
+à calculer la marque pour chaque élément,
+et à l'associer à l'instruction ou au label correspondant
+en la combinant avec l'éventuelle valeur précédente.\\
+
+Une idée de l'algorithme appliqué est présenté en \ref{sec-algo-mark-fct}.
+
+
+\subsection{Passage à un point de programme}
+
+Une première requête consiste à marquer les éléments du flot
+qui servent à déterminer ce qui permet de passer
+à un point de programme.\\
+
+La marque propagée s'appelle
+\indextxtdef{marque de contrôle}{marque!de contrôle},
+et se note {\it mC}.
+% , mais on utilise une
+% \indextxtdef{marque de contrôle initiale}{marque!de contrôle initiale}
+% ($mC_0$) pour annoter le point de
+% départ de la recherche.
+% Cela permet de retrouver ce point par la suite, et de ne
+% pas sélectionner l'instruction concernée.\\
+
+Pour faire ce calcul, on propage la marque dans les dépendances de contrôle du
+point choisi, puis récursivement dans toutes les dépendances des points ainsi
+sélectionnés. Cela correspond à marquer  {\it mC} tous les éléments
+de l'ensemble $R_{L0}$.
+
+\begin{exemple}
+\begin{tabular}{l|p{8cm}}
+\begin{tabular}{>{\itshape}c c l}
+mC  && \verb!x = y+1;!\\
+  && \verb!a = 0;!\\
+  && \verb!b = 10;!\\
+  && \verb!...!\\
+mC  && \verb!if (x > 0) {!\\
+  && \verb!...!\\
+  && \verb!L: a += b;!\\
+  && \verb!...!\\
+  && \verb!}!\\
+\end{tabular}
+&
+Il s'agit ici de sélectionner ce qui contrôle le passage au point \verbtt{L}.
+Le test \verb!x>0! est donc marqué {\it mC} ainsi que le calcul de \verbtt{x}
+dont dépend ce test.
+\end{tabular}
+\end{exemple}
+
+\subsection{Valeur d'une donnée}
+
+On peut également demander à sélectionner ce qui permet de calculer une donnée
+à un point de programme.
+On peut par exemple demander à ne garder que ce qui permet de calculer l'une des
+sorties d'une fonction.\\
+
+La première étape consiste à trouver l'élément, ou les éléments,
+correspondant dans le graphe.
+Des éléments particuliers représentent les sorties de la fonction.
+Pour des calculs internes,
+on peut utiliser l'identification d'une affectation pour parler de la donnée
+affectée, ou alors
+il faut disposer de l'état utilisé lors de la construction du graphe.
+On peut alors retrouver les éléments qui ont participé au calcul en un point
+de n'importe quelle
+donnée, du moins lorsque le point considéré se trouve dans sa portée.\\
+
+La marque associée au calcul d'une donnée s'appelle
+\indextxtdef{marque de valeur}{marque!de valeur}
+et se note {\it mV}. Elle sert, comme son nom l'indique,
+à annoter les éléments qui participent au calcul
+de la valeur de la donnée demandée. \\
+
+Les données qui permettent de calculer l'adresse de la case modifiée (partie
+gauche de l'affectation)
+sont annotés par une \indextxtdef{marque d'adresse}{marque!d'adresse} ($mA$).
+Il s'agit par exemple du calcul de l'indice d'un élément de tableau ou d'un
+pointeur.\\
+
+Les éléments
+qui permettent d'atteindre le point de programme sont marqués {\it mC}.
+
+\begin{exemple}
+\begin{tabular}{m{4cm} c | m{8cm}}
+\begin{tabular}{>{\itshape}c c l}
+mCA  && \verb!x = y+1;!\\
+mV  && \verb!b = 10;!\\
+  && \verb!...!\\
+mC  && \verb!if (x > 0) {!\\
+  && \verb!...!\\
+  && \verb!L: t[x] = b;!\\
+  && \verb!...!\\
+  && \verb!}!\\
+\end{tabular}
+&&
+Il s'agit ici de sélectionner ce qui participe au calcul de l'instruction
+située au point \verbtt{L}.
+Le test \verb!x>0! est donc marqué {\it mC} ainsi que le calcul de \verbtt{x}
+dont dépend ce test. La valeur de \verbtt{b} participe au calcul de la partie
+droite et est donc marqué {\it mV}. La partie gauche dépend de
+\verbtt{x} qui doit donc avoir la marque {\it mA}. On voit donc que \verbtt{x}
+cumule deux informations et est donc marqué {\it mCA}.
+\end{tabular}
+\end{exemple}
+
+
+\subsection{Éléments superflus}
+
+On a vu que le marquage est relatif aux instructions,
+et que certaines instructions (appels de fonctions) sont représentées
+par plusieurs éléments du PDG. Si on ne souhaite pas décomposer les
+instructions (ie. spécialiser les appels de fonctions),
+il peut arriver qu'une même instruction corresponde à des éléments
+visibles et d'autres invisibles. Ces derniers, et leurs dépendances,
+sont alors marqués
+\indextxtdef{superflus}{marque!superflu} (marque $mS$).
+Certaines instructions deviennent alors visibles alors qu'elles ne sont pas
+strictement nécessaires au calcul demandé.\\
+
+\begin{exemple}
+\begin{center}
+\begin{tabular}{m{4cm}p{1cm}m{6cm}}
+\begin{verbatim}
+int G;
+int f (int x, int y) {
+  G = x + 1;
+  return y + 2;
+}
+int g (void) {
+  int a = 1;
+  int b = a+1;
+  return f (b, a);
+}
+\end{verbatim}
+&&
+Si l'utilisateur demande à sélectionner ce qui permet de calculer la valeur
+de retour de \verbtt{g}, on n'aurait en fait besoin que de la valeur de \verbtt{a},
+mais comme on ne spécialise pas \verbtt{f}, il faut aussi marquer
+l'instruction qui calcule \verbtt{b}  comme superflue.
+\end{tabular}
+\end{center}
+\end{exemple}
+
+\subsection{Marques}
+
+En résumé, les marques possibles sont les suivantes~:
+\begin{center}
+\begin{tabular}{|>{\itshape}c!{:}l|}
+  \hline
+  mV & marque de valeur \\
+  mC & marque de contrôle \\
+  mA & marque d'adresse \\
+  mS & marque pour un élément superflu\\
+  \hline
+\end{tabular}
+\end{center}
+
+Les marques $mV,mC,mA$ peuvent se superposer lorsqu'un élément participe au
+calcul pour plusieurs raisons. On notera par exemple $mVA$ la marque associée à
+un élément qui participe à la valeur et au calcul d'adresse. Par la suite,
+on appelle marque $mCAV$ toute marque de cette famille.\\
+
+La marque $mS$ est l'élément neutre de la combinaison.
diff --git a/doc/slicing/intercmds.tex b/doc/slicing/intercmds.tex
new file mode 100644
index 0000000000000000000000000000000000000000..90f9b011872dda397cdcabcda0ae73c46db484e8
--- /dev/null
+++ b/doc/slicing/intercmds.tex
@@ -0,0 +1,256 @@
+
+\chapter{Détail des actions} \label{app-actions}
+
+Ce chapitre présente une fiche signalétique pour chaque action du calcul
+interprocédurale présentées au chapitre \ref{sec-interproc}.
+Elle correspondent aux commandes telles qu'elles ont été spécifiées,
+et il peut y avoir quelques différences par rapport à ce qui a été implémenté,
+mais il s'agit de différences mineures (principalement les noms).
+Pour plus de détails, le lecteur est invité à consulter la document du code
+qui sera toujours la plus à jour.\\
+
+\newcommand{\proto}[2]{
+  \section{#1}\labact{#1}{2}
+  \centerline{\textit{#1}(#2)}
+  \bb
+  }
+\newcommand{\precond}{{\bf Précondition}}
+\newcommand{\param}{{\bf Paramètres}}
+\newcommand{\creable}{{\bf Création par l'utilisateur}}
+\newcommand{\modifiable}{{\bf Modifiable par l'utilisateur}}
+\newcommand{\generable}{{\bf Génération automatique}}
+\newcommand{\application}{{\bf Application}}
+\newcommand{\genere}{{\bf Génération}}
+\newcommand{\modifie}{{\bf Modifications}}
+
+Les indications suivantes sont données pour chaque action~:
+\begin{itemize}
+  \item \param~: indique le sens des paramètres de l'action,
+  \item \precond~: indique les conditions éventuelles de création et/ou
+    d'application,
+  \item \creable~: indique si l'utilisateur peut la créer,
+  \item \modifiable~: indique si l'utilisateur peut la modifier lorsqu'elle est
+    dans la liste d'attente,
+  \item \generable~: indique si cette action peut être générée par l'outil,
+    et précise dans quels cas,
+  \item \application~: détaille ce qu'il se passe quand cette action est
+    appliquée,
+  \item \genere~: donne la liste des actions pouvant être générées,
+  \item \modifie~: indique si une spécialisation peut être crée ou modifiée.
+\end{itemize}
+
+\proto{NewSlice}{$f_0$}
+
+\begin{itemize}
+  \item \param~: $f_0$ est la fonction source pour laquelle on souhaite créer
+    une nouvelle spécialisation.
+  \item \precond~: néant.
+  \item \creable~: oui.
+  \item \modifiable~: oui (suppression).
+  \item \generable~: oui, par \actChooseCall.
+  \item \application~: 
+    crée une nouvelle spécialisation $f_i$, initialement sans aucun marquage
+    (tout invisible).
+  \item \genere~: néant.
+  \item \modifie~: création d'une nouvelle $f_i$.
+\end{itemize}
+
+\proto{AddUserMark}{$f_i, (e,m)$}
+
+\begin{itemize}
+  \item \param~: $f_i$ est la fonction dont on veut modifier le marquage,
+    $e$ un élément à marquer, $m$ la marque à lui ajouter.
+    Différentes version de cette action peut être proposée pour faciliter la
+    désignation de $e$ et le choix de la marque $m$.
+  \item \precond~: $f_i$ doit exister et $e$ désigner un élément valide de $f$.
+  \item \creable~: oui.
+  \item \modifiable~: oui (suppression).
+  \item \generable~: non.
+  \item \application~: ajoute $m$ à la marque $m1$ de $e$ dans $f_i$
+    et propage dans les dépendances.
+  \item \genere~: $\actExamineCalls$.
+  \item \modifie~: modification de $f_i$.
+\end{itemize}
+
+\proto{ExamineCalls}{$f_i$}
+
+\begin{itemize}
+  \item \param~: $f_i$ est la fonction dont le marquage a été modifié
+    et pour laquelle il faut vérifier les appels.
+  \item \precond~: $f_i$ doit exister.
+  \item \creable~: non.
+  \item \modifiable~: non.
+  \item \generable~: oui.
+  \item \application~: 
+    vérifie la cohérence du marquage de chaque appel de fonction $c$
+    de \call(f) et également des éventuelles appels à $f_i$.
+  \item \genere~: 
+    $\actChooseCall$ et/ou $\actMissingOutputs$ si le marquage de
+    certains appels de fonction a été modifié, et $\actMissingInputs$ si
+    $f_i$ est appelée et que les entrées de certains appels sont insuffisamment
+    marquées.
+  \item \modifie~: rien.
+\end{itemize}
+
+
+\proto{ChooseCall}{$c, f_i$}
+
+\begin{itemize}
+  \item \param~: appel $c$ dans la fonction spécialisée $f_i$.
+  \item \precond~: néant.
+  \item \creable~: non.
+  \item \modifiable~: oui, elle peut être remplacée par un $\actChangeCall(c,
+    f_i, g_j)$ (voir les conditions de création de cette action).
+  \item \generable~: oui, quand le marquage de $f_i$ est modifié et que 
+    l'appel $c$ devient visible, cette action est générée pour lui
+    attribuer une fonction à appeler.
+  \item \application~: détermine la fonction à appeler en tenant compte du mode
+    de fonctionnement.
+  \item \genere~: \actChangeCall{} et éventuellement \actNewSlice{} et
+    \actAddOutputMarks{}.
+  \item \modifie~: rien.
+\end{itemize}
+
+\proto{ChangeCall}{$c, f_i, g_j$}
+
+\begin{itemize}
+  \item \param~: on considère l'appel $c$ de $f_i$, $g_j$ est la fonction à
+    appeler.
+  \item \precond~: $\Call(f_0)(c)=g_0$ et la signature de sortie de $g_j$
+    doit être compatible avec $\sigc(c, f_i)$.
+  \item \creable~: oui.
+  \item \modifiable~: oui, mais seulement s'il l'a initialement créée.
+  \item \generable~: oui, par un \actChooseCall.
+  \item \application~: $\Call(f_i)(c)=g_j$ et les marques des entrées de $g_j$
+    sont propagées dans $f_i$ ($\actModifCallInputs(c, f_i)$).
+  \item \genere~: l'action \actModifCallInputs{} est directement
+    appliquée, mais elle peut générer d'autres actions (voir
+    \refact{ModifCallInputs}{2}).
+  \item \modifie~: $f_i$.
+\end{itemize}
+
+
+\proto{MissingInputs}{$c, f_i$}
+
+\begin{itemize}
+  \item \param~: 
+    appel $c$ dans la fonction spécialisée $f_i$,
+  \item \precond~: la fonction appelée nécessite plus d'entrées que n'en calcule
+    $f_i$.
+  \item \creable~: 
+    non,
+  \item \modifiable~: 
+    oui, elle peut être remplacée par un $\actChangeCall(c, f_i, g_j)$ (voir les
+    conditions de création de cette action).
+  \item \generable~: 
+    oui, lorsque la fonction $\Call(f_i)(c) = g_j$ a été modifiée, et qu'elle
+    nécessite le marquage d'entrées qui ne le sont pas $\sigc(c,f_i)$.
+  \item \application~: équivalente à \actModifCallInputs{} ou \actChooseCall{}
+    en fonction du mode de fonctionnement.
+  \item \genere~: dépend de l'application (voir ci-dessus).
+  \item \modifie~: dépend de l'application (voir ci-dessus).
+\end{itemize}
+
+
+\proto{ModifCallInputs}{$c, f_i$}
+
+\begin{itemize}
+  \item \param~: appel $c$ dans la fonction spécialisée $f_i$.
+  \item \precond~: $\Call(f_i)(c) = g_j$
+  \item \creable~: non.
+  \item \modifiable~: non.
+  \item \generable~: oui, par l'application de \actMissingInputs{} dans certains
+    modes.
+  \item \application~: propage les marques des entrées de $g_j$ au niveau de
+    l'appel $c$ de $f_i$ et et dans le dépendances.
+  \item \genere~: 
+    $\actChooseCall$ et/ou $\actMissingOutputs$ si le marquage de
+    certains appels de fonction a été modifié, et $\actMissingInputs$ si
+    $f_i$ est appelée et que les entrées de certains appels sont insuffisamment
+    marquées.
+  \item \modifie~: $f_i$.
+\end{itemize}
+
+\proto{MissingOutputs}{$c, f_i$}
+
+\begin{itemize}
+  \item \param~: appel $c$ dans la fonction spécialisée $f_i$
+  \item \precond~: $\Call(f_i)(c) = g_j$
+  \item \creable~: non.
+  \item \modifiable~: oui, elle peut être remplacée par un 
+    $\actChangeCall(c, f_i, g_k)$ 
+    (voir les conditions de création de cette action).
+  \item \generable~: oui, lorsque le marquage de  $c$ dans $f_i$ est modifié,
+    que l'appel est attribué à $g_j$, et que les sorties de $g_j$
+    sont insuffisantes.
+  \item \application~: dépend du mode~:
+    \begin{itemize}
+      \item \actAddOutputMarks{}
+      \item ou \actChooseCall{}
+    \end{itemize}
+  \item \genere~: dépend de l'application (voir ci-dessus).
+  \item \modifie~: dépend de l'application (voir ci-dessus).
+\end{itemize}
+
+\proto{AddOutputMarks}{$f_i, \outsigf$}
+
+\begin{itemize}
+  \item \param~: $f_i$ est la fonction dont on veut modifier le marquage,
+     $\outsigf$ indique les marques qui doivent être ajouté aux sorties.
+  \item \precond~: $f_i$ doit exister et $\outsigf$ correspondre à une signature
+    des sorties de $f$.
+  \item \creable~: non.
+  \item \modifiable~: non.
+  \item \generable~: oui, par l'application de \actMissingOutputs.
+  \item \application~: 
+    les marques de $\outsigf$ sont ajoutées aux marques $m2$ des
+    sorties de $f_i$ et propagées.
+  \item \genere~: 
+    \actChooseCall{} et/ou \actMissingOutputs{} si le marquage de
+    certains appels de fonction a été modifié, et \actMissingInputs{} si
+    $f_i$ est appelée et que les entrées de certains appels sont insuffisamment
+    marquées.
+  \item \modifie~: modification de $f_i$.
+\end{itemize}
+
+\proto{CopySlice}{$f_i$}
+
+\begin{itemize}
+  \item \param~: $f_i$ est la fonction spécialisée à copier.
+  \item \precond~: $f_i$ doit exister.
+  \item \creable~: oui.
+  \item \modifiable~: oui (suppression),
+  \item \generable~: non.
+  \item \application~: 
+    crée une nouvelle spécialisation $f_j$ de $f$ dont le marquage et les appels
+    sont identiques à ceux de $f_i$.  Attention, à l'issue de cette action,
+    $f_j$ n'est pas appelée.
+  \item \genere~: non.
+  \item \modifie~: création d'une nouvelle $f_j$.
+\end{itemize}
+
+\proto{Combine}{$f_i, f_j$}
+
+\begin{itemize}
+  \item \param~: $f_i$ et $f_j$ sont les fonctions spécialisées à combiner.
+  \item \precond~: $f_i$ et $f_j$ doivent exister.
+  \item \creable~: oui.
+  \item \modifiable~: oui (suppression),
+  \item \generable~: non.
+  \item \application~: calcule une nouvelle spécialisation $f_k$
+  \item \genere~: $\actChooseCall$
+  \item \modifie~: création et calcul de $f_k$.
+\end{itemize}
+
+\proto{DeleteSlice}{$f_i$}
+
+\begin{itemize}
+  \item \param~: $f_i$ est la fonction spécialisée à supprimer.
+  \item \precond~: $f_i$ ne doit pas être appelée.
+  \item \creable~: oui.
+  \item \modifiable~: oui (suppression).
+  \item \generable~: non.
+  \item \application~: $f_i$ est supprimée.
+  \item \genere~: néant.
+  \item \modifie~: $f_i$ est supprimée.
+\end{itemize}
diff --git a/doc/slicing/interexples.tex b/doc/slicing/interexples.tex
new file mode 100644
index 0000000000000000000000000000000000000000..20c59843be629e2d487c84fdfb95b6f1bfbc875d
--- /dev/null
+++ b/doc/slicing/interexples.tex
@@ -0,0 +1,206 @@
+
+\chapter{Exemple de marquage interprocédural}
+
+Cette partie présente comment les actions élémentaires précédemment présentées
+peuvent être utilisées pour répondre à des requêtes utilisateur de plus haut
+niveau. 
+
+
+\section{Présentation de l'exemple}
+
+Nous allons voir différents exemple de marquage de l'exemple ci-dessous.
+Dans tous les cas, on considère que l'utilisateur souhaite n'avoir qu'une
+spécialisation par fonction source dans le résultat, et qu'il demande
+systématiquement la propagation de son marquage aux appelants.
+\bb
+
+Pour simplifier la présentation,
+comme on ne s'intéresse ici qu'à la propagation interprocédurale,
+on n'utilise qu'une marque élémentaire $m$ quelconque qui rend un élément
+visible et la marque \spare{} déjà mentionnée.
+
+\noindent\begin{tabular}{p{4cm}p{4.5cm}p{5cm}}
+\begin{verbatim}
+int X, Y;
+int g (int u, int v, 
+       int w) {
+  lg1: X = u;
+  lg2: Y = u + v;
+  return w;
+  }
+\end{verbatim}
+&
+\begin{verbatim}
+int Z;
+int f (int a, int b, 
+       int c, int d, 
+       int e) {
+  int r;
+  lf1: r = g (a, b, c);
+  lf2: Z = g (r, d, e);
+  return X;
+  }
+\end{verbatim}
+&
+\begin{verbatim}
+int I, J, K, L, M, N;
+int main () {
+  lm1: /* ... */
+  lm2: N = f (I, J, K, L, M);
+  lm3: /* ... */
+  }
+\end{verbatim}
+\end{tabular}
+
+\bb\centerline{\uneimage{exple2v0}}\bb
+
+La légende indique comment sont représentées les marques sur les figures
+suivantes.
+
+\section{Cas 1}
+
+Supposons tout d'abord que l'utilisateur veuille sélectionner la sortie 0
+de $f$, et voyons comment se déroule le calcul.\bb
+
+On a vu en \S\ref{sec-propagate-to-calls} que cette requête de l'utilisateur se
+traduit par la séquence d'actions élémentaires suivantes~:
+\begin{itemize}
+  \item $f_1 = \actNewSlice (f_0)$,
+  \item $\actAddOutputMarks(f_1, (out_0, m))$
+  \item ${\mathit main}_1 = \actNewSlice ({\mathit main}_0)$,
+  \item $\actChangeCall(c, {\mathit main}_1, f_1)$.
+\end{itemize}
+
+On calcule tout d'abord le marquage de $f_1$ par simple propagation~:
+
+\bb{\centerline{\uneimage{exple2v1-1}}}\bb
+
+Puis, la seconde action
+génère $\actChooseCall(c_1, f_1)$ et $\actChooseCall(c_2, f_1)$.
+
+A l'application de la première de ces nouvelles actions,
+comme il n'y a pas encore de spécialisation pour $g$, 
+on génère~:
+
+\begin{itemize}
+  \item $g_1 = \actNewSlice (g_0)$,
+  \item $\actAddOutputMarks(g_1, (out_0, m))$
+  \item $\actChangeCall(c_1, f_1, g_1)$
+\end{itemize}
+
+A l'issue de la construction de $g_1$, l'entrée $w$ a une marque $m_2$.
+L'application du \actChangeCall{}
+va donc déclencher un $\actModifCallInputs(c_1, f_1)$ qui va conduire à marquer
+l'entrée $c$ de $f_1$ comme $\spare$ (en plus de $m$ en $m_1$).
+
+\bb{\centerline{\uneimage{exple2v1-2}}}\bb
+
+L'application de $\actChooseCall(c_2, f_1)$ produit~:
+\begin{itemize}
+  \item $\actAddOutputMarks(g_1, (out_X, m))$ puisqu'on a choisi de n'avoir
+    qu'une spécialisation par fonction source,
+  \item et $\actChangeCall(c_2, f_1, g_1)$.
+\end{itemize}
+
+Comme $g_1$ est appelée en $c_1$, 
+la modification de son marquage conduit à générer $\actMissingInputs(c_1, f_1)$,
+qui, vues les options, est directement traduit par 
+$\actModifCallInputs(c_1, f_1)$.
+
+Puis, le $\actChangeCall{}$ va déclencher $\actModifCallInputs(c_2, f_1)$
+qui va marquer $e$ comme $\spare$.
+
+\bb{\centerline{\uneimage{exple2v1-3}}}\bb
+
+Finalement, il ne reste plus qu'à appliquer $\actChangeCall(c, {\mathit main}_1,
+f_1)$ qui conduit à appliquer $\actModifCallInputs(c, {\mathit main}_1)$
+et donc à propager le marquage de $f_1$ dans ${\mathit main}_1$.
+
+\bb{\centerline{\uneimage{exple2v1-4}}}
+
+
+\section{Cas 2}
+
+A partir du résultat du cas 1, l'utilisateur souhaite sélectionner le calcul de
+$Y$ dans $g_1$. \bb
+
+$\actAddUserMark(g_1, (out_Y, m))$ propage le marquage en $m_1$ à l'entrée $v$
+de $g_1$ ($u$ est déjà marquée).
+
+\bb{\centerline{\uneimage{exple2v2-1}}}\bb
+
+Puis comme $g_1$ est appelée, et qu'il manque des marques, deux actions
+$\actMissingInputs{}$ sont générées. Les options indiquent qu'elles doivent être
+traduites en $\actModifCallInputs(c_1, f_1)$ et $\actModifCallInputs(c_2, f_1)$.
+Ce qui conduit à marquer en $m_1$ les entrées $a, b, d$ de $f_1$.
+
+\bb{\centerline{\uneimage{exple2v2-2}}}\bb
+
+De même, la propagation va être effectuée dans ${\mathit main}_1$
+par l'application de $\actModifCallInputs(c, {\mathit main}_1)$.
+
+\bb{\centerline{\uneimage{exple2v2-3}}}\bb
+
+
+\section{Cas 3}
+
+Dans une nouvelle étude, l'utilisateur souhaite sélectionner le calcul de $X$
+dans $g$.
+\bb
+
+Comme dans le cas 1, cette requête se traduit par la création d'une fonction
+spécialisée $g_1$ et la propagation de son marquage à tous ses appels~:
+\begin{itemize}
+  \item $g_1 = \actNewSlice (g_0)$,
+  \item $\actAddOutputMarks(g_1, (out_X, m))$
+  \item $f_1 = \actNewSlice (f_0)$,
+  \item $\actChangeCall(c_1, f_1, g_1)$.
+  \item $\actChangeCall(c_2, f_1, g_1)$.
+  \item ${\mathit main}_1 = \actNewSlice ({\mathit main}_0)$,
+  \item $\actChangeCall(c, {\mathit main}_1, f_1)$.
+\end{itemize}
+
+On calcule tout d'abord le marquage de $g_1$~:
+
+\bb{\centerline{\uneimage{exple2v3-1}}}\bb
+
+Puis, les deux \actChangeCall{} dans $f_1$ conduisent à propager $m_1$~:
+
+\bb{\centerline{\uneimage{exple2v3-2}}}\bb
+
+La seconde propagation (lors de la modification de $c_2$)
+déclenche $\actMissingOutputs(c_1, f_1)$
+qui, au vue des options, se transforme en $\actAddOutputMarks(g_1,
+\outsigc(c_1))$. Ceci conduit à marquer $m_2$ la sortie 0 de $g_1$.
+Les $\actMissingInputs$ générés se transforme en $\actModifCallInputs(c_1, f_1)$
+et $\actModifCallInputs(c_2, f_1)$, qui propage \spare{} aux entrées $c$ et $e$ de
+$f_1$.
+
+\bb{\centerline{\uneimage{exple2v3-3}}}\bb
+
+Enfin, le $\actChangeCall(c, {\mathit main}_1, f_1)$ propage le marquage de
+$f_1$ dans ${\mathit main}_1$. On remarque que même si ce changement avait été
+effectué plus tôt, la propagation du marquage aurait été effectué grâce à des
+$\actMissingInputs$.
+
+\bb{\centerline{\uneimage{exple2v3-4}}}\bb
+
+
+\section{Cas 4}
+
+A partir du cas 3, l'utilisateur souhaite ajouter la sélection du calcul de $Y$
+dans $g_1$.\bb
+
+$\actAddUserMark(g_1, (out_Y, m))$ conduit à marquer $Y$ en $m_1$,
+puis, par propagation, $v$ en $m_1$ également~:
+
+\bb{\centerline{\uneimage{exple2v4-1}}}\bb
+
+Des actions $\actMissingInputs$ transformée en $\actModifCallInputs$ propage
+$m_1$ aux entrées $b$ et $d$ de $f_1$, puis aux entrées $J$ et $L$ de ${\mathit
+main}_1$.
+
+\bb{\centerline{\uneimage{exple2v4-2}}}\bb
+
+
+
diff --git a/doc/slicing/interproc.tex b/doc/slicing/interproc.tex
new file mode 100644
index 0000000000000000000000000000000000000000..2d5cb46481f06d5782abc08a711d743910bce9da
--- /dev/null
+++ b/doc/slicing/interproc.tex
@@ -0,0 +1,198 @@
+\newcommand{\bb}{\bigskip}
+
+\newcommand{\spare}{\ensuremath{\mathit{Spare}}}
+\newcommand{\sigc}{\ensuremath{\mathit{sig_c}}}
+\newcommand{\insigc}{\ensuremath{\mathit{inSig_c}}}
+\newcommand{\outsigc}{\ensuremath{\mathit{outSig_c}}}
+\newcommand{\sigf}{\ensuremath{\mathit{sig_f}}}
+\newcommand{\insigf}{\ensuremath{\mathit{inSig_f}}}
+\newcommand{\outsigf}{\ensuremath{\mathit{outSig_f}}}
+\newcommand{\sig}{\ensuremath{\mathit{sig}}}
+\newcommand{\true}{\ensuremath{\mathit{true}}}
+\newcommand{\false}{\ensuremath{\mathit{false}}}
+ 
+\newcommand{\imply}{\Rightarrow}
+\newcommand{\lt}{<}
+ 
+\newcommand{\inout}{\ensuremath{\mathit{InOut}}}
+\newcommand{\call}{\ensuremath{\mathit{call}}}
+\newcommand{\length}{\ensuremath{\mathit{length}}}
+\newcommand{\none}{\ensuremath{\mathit{None}}}
+ 
+ 
+\newcommand{\topm}{{\top}_m}
+\newcommand{\tops}{{\top}_s}
+\newcommand{\topc}{{\top}_c}
+\newcommand{\botm}{{\bot}_m}
+\newcommand{\bots}{{\bot}_s}
+\newcommand{\botc}{{\bot}_c}
+ 
+\newcommand{\option}[1]{\motcle{#1}{Options}{opt}{\textbf{#1}}}
+
+\newcommand{\defaction}[1]{\motcle{#1}{Actions}{act}}
+\newcommand{\labact}[2]{\index{Actions!#1}\label{sec-#1-#2}}
+\newcommand{\refact}[2]{\S\ref{sec-#1-#2}}
+%===============================================================================
+
+\chapter{Réduction interprocédurale}\label{sec-interproc}
+
+\section{Objectif}
+
+Le filtrage élémentaire vu précédemment n'est qu'un préalable à la réduction
+d'une application car lorsqu'une fonction a été réduite, il faut également
+traiter ses appels pour rester cohérent, et on peut aussi vouloir réduire les
+fonctions appelées.
+
+\subsection{Spécification du problème}
+
+Pour étendre le marquage intraprocédural
+déjà effectué à un calcul interprocédural,
+une première approche serait
+de propager le marquage à travers les appels de fonctions, mais cela conduit
+soit à un trop grand nombre de fonctions spécialisées si l'on distingue tous les
+appels, soit à trop de perte de précision si l'on en fait l'union.
+Ce problème est exposé plus en détail en \S\ref{sec-compat-sig}.
+L'objectif est donc d'obtenir un compromis acceptable et paramétrable.\\
+
+Dès lors que l'on décide de pouvoir avoir plusieurs spécialisations d'une même
+fonction source dans l'application finale,
+le mécanisme permettant d'obtenir un résultat cohérent devient relativement
+complexe. Par exemple,
+lorsqu'on s'intéresse au calcul de certaines données $d$ dans une fonction $g$, 
+on a vu au chapitre précédent comment calculer le marquage des éléments du PDG
+pour pouvoir réduire $g$. 
+Si $g$ appelle $h$, et que toutes les sorties de $h$ ne sont pas nécessaires au
+calcul de $d$ dans $g$, on peut aussi vouloir demander la spécialisation de $h$.
+Par ailleurs, si $g$ est appelée, 
+il est possible de remplacer un ou plusieurs appels par un appel
+à $g_1$. Ce traitement doit être appliqué récursivement puisque dès que l'on
+modifie le marquage d'une fonction, on peut avoir besoin également de modifier
+les fonctions appelées et appelantes.\\
+
+On décide donc de décomposer un traitement complet en différentes
+actions élémentaires parfaitement définies. Elles pourront ensuite être
+combinées automatiquement en fonction d'options de plus haut niveau.
+
+\subsection{Organisation des résultats}
+
+Le processus complet consiste à appliquer successivement 
+un certain nombre de requêtes exprimées par l'utilisateur
+afin de construire une nouvelle application.
+Nous appellerons \indexdef{projet courant} 
+l'état de cette nouvelle application à un instant donné.
+Il est composé~:
+\begin{itemize}
+  \item d'un ensemble de résultats (initialement vide)
+    sur les fonctions tels qu'ils ont été
+    présentés en \ref{sec-filtrage-fct}, c'est-à-dire de fonctions
+    spécialisées~;
+  \item et d'une liste d'actions qui sont
+encore à appliquer pour obtenir une application cohérente.
+\end{itemize}
+\bb
+
+Lorsque l'utilisateur exprime des requêtes, elles sont traduites en
+{\bf actions} qui sont rangées dans la liste des tâches en attente. 
+Les actions s'appliquent en séquence, c'est-à-dire qu'on ne peut pas appliquer
+une action si la précédente n'est pas terminée.
+L'application d'une action peut éventuellement générer de nouvelles actions.
+\bb
+
+Une action peut dans certains cas être supprimée ou modifiée~: 
+ce point est abordé en \S\ref{sec-gestion-actions}.
+\bb
+
+A la fin de l'analyse, il n'y a plus d'action à appliquer,
+et l'application résultante peut être générée.
+
+\subsection{Appel de fonction}
+
+Lors du marquage intraprocédural, on obtient les marques strictement nécessaires
+au calcul demandé. On peut en particulier en extraire les signatures des appels
+de fonction. Pour chacun d'entre eux, dès lors qu'il y a au moins un élément
+visible, il va falloir décider quelle est la fonction appelée.
+On a vu par exemple qu'on peut choisir de ne pas spécialiser les appels de
+fonction~: les entrées invisibles des appels devront alors être marqué comme
+superflus.
+
+\subsection{Propagation aux fonctions appelées}\label{sec-callee}
+
+Pour se laisser la possibilité de faire évoluer l'outil,
+  on décide d'offrir plusieurs possibilités~:
+\begin{itemize}
+\item une spécialisation par appel~: 
+pour chaque appel, on détermine les sorties
+utiles, et on génère la fonction appelée correspondante (si elle n'existe pas
+déjà),
+\item pas de spécialisation de fonction~: dès qu'on a besoin d'une des sorties
+d'une fonction, on laisse l'appel, et on a donc besoin de sélectionner tous les
+arguments d'appel,
+\item une seule spécialisation par fonction~: regroupement de toutes les 
+spécialisations nécessaires à l'application en une seule fonction,
+\item regroupement de fonctions spécialisées {\it a posteriori}, 
+à la demande de l'utilisateur.
+\end{itemize}
+
+\subsection{Propagation aux fonctions appelantes}\label{sec-caller}
+
+  Lorsqu'une fonction spécialisée a été calculée, on peut vouloir l'appeler
+  à la place de la fonction initiale, et ainsi propager la réduction.
+  Il faut pour cela pouvoir créer une requête qui désigne le point d'appel,
+  et la fonction spécialisée à utiliser. Cette requête revient à s'intéresser au
+  calcul des entrées visibles de la spécialisation au dessus du point d'appel.
+  
+  L'application d'une telle requête peut à son tour générer une demande de
+  spécialisation, éventuellement de la même fonction comme dans l'exemple
+  ci-dessous.
+
+\begin{exemple}
+La figure suivante montre un exemple de différentes étapes de la
+transformation des appels à $g$ dans $f$ par des appels à la fonction filtrée
+$g_1$, et comment on peut envisager de propager l'information.
+
+\begin{center}
+\uneimage{propagation}
+\end{center}
+
+\begin{enumerate}
+  \item calcul de la fonction $g_1$ : seule la seconde entrée est visible, les
+    sorties ne sont pas visibles;
+  \item remplacement du second appel à $g$ dans $f$ par un appel à $g_1$,
+    et sélection des éléments qui permettent de calculer l'entrée visible.
+    On voit que ce calcul nécessite de calculer la seconde sortie du premier
+    appel à $g_1$. Il faut donc calculer une seconde fonction $g_2$.
+  \item calcul de la fonction $g_2$ : elle doit avoir les mêmes éléments que
+    $g_1$ et calculer en plus sa seconde sortie. On voit ce cela nécessite la
+    visibilité de la première entrée.
+  \item sélection de ce qui permet de calculer la première entrée de $g_2$ dans
+    $f$.
+\end{enumerate}
+\end{exemple}
+
+\subsection{Sélection des appels d'une fonction}
+
+  En plus des critères de \slicing déjà vus qui consiste à sélectionner une
+  donnée à un point de programme, l'aspect interprocédural conduit à
+  définir un nouveau critère qui permet 
+  de ne garder que ce qui permet d'appeler une fonction donnée, 
+  et de calculer les contextes d'appels. 
+  La fonction peut être~:
+  \begin{itemize}
+    \item une fonction externe dont on n'a pas le code,
+    \item une fonction présente dans le code source,
+    \item une fonction issue d'un précédent filtrage,
+  \end{itemize}
+  et on peut choisir de sélectionner~:
+  \begin{itemize}
+    \item uniquement ce qui permet d'atteindre les points de programme des
+      appels à cette fonction,
+    \item ou bien également ce qui permet de calculer les entrées.
+  \end{itemize}
+
+  Ce filtrage peut par exemple être utilisé pour réduire une application
+  afin de permettre une analyse des fuites mémoire.
+  Il suffit pour cela de sélectionner les fonctions d'allocation (\verbtt{alloc},
+  \verbtt{malloc}, etc.) et la fonction de libération (\verbtt{free}).\\
+
+\input{interproc2.tex}
+
diff --git a/doc/slicing/interproc2.tex b/doc/slicing/interproc2.tex
new file mode 100644
index 0000000000000000000000000000000000000000..c7528466dabfc224453400224c3591447e8bd28a
--- /dev/null
+++ b/doc/slicing/interproc2.tex
@@ -0,0 +1,995 @@
+\section{Principe et notations}
+
+On rappelle ici les aspects du calcul intraprocédural, et diverses notations,
+qui vont être utilisées par la suite.
+On s'appuie en grande partie sur la représentation des entrées/sortie
+et des appels de fonction dans le PDG présenté dans \cite{ppcPdg}.
+
+\subsection{Marques élémentaires}
+
+On considère qu'on a un ensemble de marques élémentaires,
+non détaillées ici, muni~:
+\begin{itemize}
+  \item d'un ordre partiel ($\leq$),
+  \item d'une opération d'union ($+$),
+  \item d'un plus petit élément ($\botm$) utilisé pour marquer les éléments
+    invisibles,
+  \item et d'un plus grand élément ($\topm$) correspondant au marquage des
+    élément de la fonction source.
+\end{itemize}
+
+On considère de plus un élément appelé \spare{} tel que~:
+\begin{itemize}
+  \item $\forall m. m \neq \botm \imply m = \spare \lor \spare \leq m$
+\end{itemize}
+On a donc~:
+\begin{equation*}
+\forall m. m \neq \botm \imply m + \spare = m  
+\end{equation*}
+Cette marque est donc la plus petite qui rende un élément visible.
+Elle est utilisée pour marquer les élément dit {\it superflus}, c'est-à-dire
+ceux qui ne seraient pas nécessaire si la réduction était plus précise.
+
+\subsection{Marquage}
+
+On a vu au chapitre \ref{sec-filtrage-fct} que l'on dispose d'une procédure
+permettant de marquer une instruction et de la propager
+selon les dépendances (PDG). 
+
+Au cours de ce calcul,
+les relations de dépendances entre les entrées et les sorties des fonctions
+appelées sont données par la spécification\footnote{c'est peut-être un problème
+si on fait de la coupure de branche, car les dépendances peuvent être réduites
+par une telle spécialisation.}.\bb
+
+Dans le résultat obtenu, lorsqu'un élément de fonction $e1$ est utilisé par un
+élément de fonction $e2$, la marque $m1$ associée à $e1$ 
+est supérieure ou
+égale à la marque $m2$ associée à $e2$ car  $m1$ est l'union des marques
+de tous les éléments qui dépendent de $e1$.
+
+\subsection{Fonctions}
+
+Chaque fonction source peut être spécialisée une ou plusieurs fois. 
+Au niveau {\it intraprocédural},
+cela signifie qu'on lui attribue un certain marquage.\bb
+
+Dans la suite, on note~:
+\begin{itemize}
+  \item $f, g, h, ...$ une fonction quelconque (source ou spécialisée),
+  \item une fonction source est munie d'un indice 0~: $f_0, g_0, h_0, ...$
+  \item les fonctions spécialisées ont un autre indice~: $f_i, g_j, h_k, ...$
+    (sauf mention contraire, quand on précise l'indice, 
+    on suppose donc qu'il est différent de 0).
+\end{itemize}
+
+\subsection{Entrées/sorties}
+
+Le graphe de dépendance contient des éléments particuliers qui représentent
+les entrées et les sorties de la fonction.
+On note $\inout(f)$ l'ensemble de ces éléments pour la fonction $f$.\bb
+
+On ne précise pas de quelle fonction $f$ il s'agit, car on considère le même
+ensemble d'entrées/sorties pour toutes les spécialisations~:
+\begin{equation*}
+    \forall i. \inout(f_0) = \inout(f_i)
+\end{equation*}
+
+\subsection{Signature}
+
+On appelle {\bf signature}, et on note $\sig$, une fonction 
+qui associe une marque aux éléments d'un ensemble d'entrées/sorties.
+
+On définit $\tops$ qui représente une signature dont tous les éléments
+ont une marque $\topm$~:
+\begin{equation*}
+\sig = \tops \equiv \forall e \in dom(\sig). \sig(e) = \topm
+\end{equation*}
+et de même, $\bots$ qui représente une signature dont tous les éléments 
+ont une marque $\botm$~:
+\begin{equation*}
+\sig = \bots \equiv \forall e \in dom(\sig). \sig(e) = \botm
+\end{equation*}
+
+% A TERMINER~: il faut sans doute déjà introduire la notion de précondition dans
+% la signature, car si deux spécialisations ont la même marque pour une même
+% sortie, mais qu'elles ne se placent pas dans les mêmes conditions, il faut tenir
+% compte de la relation d'ordre sur les préconditions (implication).
+% 
+% Exemple~: si on spécialise une fonction avec une entrée $x=2$,
+% elle est plus précise qu'une spécialisation avec $x>0$,
+% par contre, elle est incomparable avec la spécialisation dans le cas $x<0$.\bb
+
+
+On définit $\sigf(f)$ la {\bf signature d'une fonction} $f$ telle que~:
+\begin{itemize}
+  \item $dom(\sigf(f)) = \inout(f)$
+  \item $\sigf(f_0) = \tops$
+  \item $\sigf(f_i)(e)$ est la marque attribuée à $e$ dans $f_i$.
+\end{itemize}
+\bb
+
+On notera parfois $\insigf(f)$ et $\outsigf(f)$ les fonctions dont le domaine
+est réduit aux entrées ou aux sorties.
+
+% La relation d'ordre sur les signatures de fonction traduit la précision
+% des spécialisations.
+% Une spécialisation est plus petite qu'une autre si elle calcule moins
+% de chose, ou si elle calcule la même chose, mais qu'elle
+% nécessite moins d'entrée (c'est possible si le choix des fonctions appelées
+% n'est pas le même).
+
+\subsection{Appel de fonction}
+
+Comme nous parlons ici de la partie interprocédurale du traitement, on
+s'intéresse principalement aux appels de fonction.  On considère que l'on sait
+identifier de manière unique un appel de fonction $c$, (par exemple par
+l'identification de la fonction appelante et un élément du PDG, ou un numéro
+d'ordre). Dans la suite, pour préciser le nom de la fonction appelée,
+on notera $c_g$ un appel à une fonction $g$.\bb
+
+On note $\call(f)$ l'ensemble des appels de fonction de $f$.
+On remarque que l'on ne précise pas la spécialisation, car~:
+\begin{equation*}
+\forall i. \call(f_i) = \call(f_0)
+\end{equation*}
+\bb
+
+Pour chaque appel de fonction $c_g$ de $f_i$, 
+le graphe de dépendance contient des éléments qui
+représentent les entrées/sorties de la fonction appelée.
+
+On définit la {\bf signature d'un appel} de fonction $c$
+dans la fonction $f_i$, et on note $\sigc(c, f_i)$,
+la fonction qui donne les marques de ces éléments dans $f_i$.
+
+\section{Calcul interprocédural}
+
+\subsection{Gestion des fonctions}
+
+Au niveau {\it intraprocédural}, une fonction spécialisée est caractérisée par
+un certain marquage de ses éléments. 
+En interprocédural, on s'intéresse à la propagation des marques aux appels
+de fonction. On se propose donc d'ajouter aux fonctions spécialisées
+une fonction $\Call$, décrite en \S\ref{sec-Call}, qui associe, à chaque appel
+de fonction, l'identification de la fonction à appeler.  L'objectif est de
+remplacer certains appels par des appels à des fonctions spécialisées.\bb
+
+La réduction d'une application consiste à construire un {\bf projet} qui
+contient une liste de fonction, initialisée à la liste des fonctions source, et
+complétée au cours de l'étude par les fonctions spécialisées calculées.
+
+L'objectif est d'obtenir un projet cohérent, tel que défini en
+\S\ref{sec-coherence}.
+
+\subsection{Appels de fonction}\label{sec-Call}
+
+On appelle $\Call(f_i)$ la fonction qui fait correspondre
+chaque appel de $f_i$ à une fonction appelée.
+$\Call(f_i)(c)$ donne donc la fonction appelée par $f_i$ pour l'appel $c$.\bb
+
+On note $\Call(f_i)(c) = \botc$ quand l'appel est invisible.
+
+Par ailleurs, $\Call(f_i)(c) = \topc$ signifie que l'appel
+n'est pas encore attribué, c'est-à-dire que l'on n'a pas encore choisi la
+fonction à appeler.\bb
+
+Si la fonction appelée est déterminée par l'accès à un pointeur de fonction,
+il n'est pris en considération dans $\Call$ que si on connaît
+statiquement la fonction appelée à partir de l'analyse de valeur. 
+Dans les autres cas, on laissera
+l'appel tel qu'il est dans la fonction source.\bb
+
+
+Les fonctions source appellent forcement des fonctions source~:
+\begin{equation*}
+\forall c \in \call(f), \exists g. \Call(f_0)(c) = g_0
+\end{equation*}
+
+Quand l'appel est attribué, il correspond forcement à une spécialisation
+de la fonction initialement appelée~:
+\begin{equation*}
+\forall c \in \call(f), \Call(f_0)(c) = g_0 
+\imply \forall f_i. (\Call(f_i)(c)  = \botc \lor \Call(f_i)(c)  = \topc 
+\lor \exists j. \Call(f_i)(c)  = g_j)
+\end{equation*}
+
+Par ailleurs, si $\Call(f_i)(c)  = g_j$
+on veut que la signature de la fonction appelée 
+$\sigf(g_j)$ soit {\it compatible}
+à la signature de l'appel $\sigc(c, f_i)$.
+Voyons maintenant ce que cela veut dire...
+
+\subsection{Problème de compatibilité des signatures}\label{sec-compat-sig}
+
+La première idée qui vient lorsque l'on souhaite propager le marquage
+aux fonctions appelées est d'appliquer les mêmes règles de propagation dans les
+dépendances que pour le calcul
+intraprocédural. Mais lorsque l'on souhaite utiliser une même fonction
+spécialisée dans différents contextes, cela conduit à avoir une trop grande
+perte de précision. On veut par exemple pouvoir marquer
+comme \spare{} les entrées qui ne sont pas réellement utilisées pour un certain
+appel, même si elles portent d'autres marques par ailleurs.
+\bb
+
+Par exemple, dans le cas suivant~:
+
+\noindent\begin{tabular}{p{5cm}p{4cm}p{4cm}}
+\begin{verbatim}
+int X, Y;
+
+void g (int x, int y) {
+  X = x; Y = y;
+  }
+\end{verbatim}
+&
+\begin{verbatim}
+
+int f_a (int x_a, 
+        int y_a) {
+  g (x_a, y_a);
+  return X;
+  }
+\end{verbatim}
+&
+\begin{verbatim}
+
+int f_b (int x_b, 
+        int y_b) {
+  g (x_b, y_b);
+  return Y;
+  }
+\end{verbatim}
+\end{tabular}
+
+si l'utilisateur demande le marquage 
+des sorties 0 de \verb$f_a$ et \verb$f_b$, et la construction d'une seule
+spécialisation pour \verb$g$, on aimerait que \verb$x_a$ et \verb$y_b$ soient
+marquées \spare{}
+
+
+\bb
+Pour obtenir un tel comportement, on décide d'étendre le marquage
+comme suit.
+
+\subsection{Couple de marques}
+
+Pour garder un maximum de précision, il faut distinguer les sélections
+réellement effectuées par l'utilisateur des marques introduites par une
+approximation.
+Pour cela, on marque chaque élément d'une spécialisation non plus par une seule
+marque, mais par un couple $<m_1, m_2>$ où~:
+\begin{itemize}
+  \item la marque $m_1$ correspond à la propagation d'une sélection par
+    l'utilisateur dans la fonction d'origine et dans ses appelants,
+    {\sc MAIS}
+    on ne la propage pas directement dans les fonctions appelées
+    car cela conduit à avoir une trop grande perte de précision.
+    Il faut noter que $m_1$ ne peut en principe pas être \spare,
+    sauf si l'utilisateur le demande explicitement.
+  \item la marque $m_2$ correspond à la propagation d'une marque $m_1$
+    d'un appelant. Donc, lorsque la sortie d'un appel a une marque $m_1$, la
+    sortie correspondante de la fonction appelée est marquée $m_2$. 
+    Par ailleurs, si une fonction a une entrée marquée 
+    $m = <m_1, m_2>$ avec $m_2 \neq \botm$, ses appelants doivent propager 
+    $m' = <m_1, \spare>$ sur l'entrée correspondante.
+    Attention, comme on le verra plus loin,
+    cela ne veut pas dire que les entrées des appelants ont la
+    marque $m'$, car il faut combiner cette marque avec les marques de
+    l'appelante.
+\end{itemize}
+\bb
+
+Du point de vue de l'utilisateur, la marque associée à un élément est l'union de
+$m_1$ et de $m_2$.
+\bb
+
+Dans l'exemple précédent, les entrées $x$ et $y$ de $g$
+seront marquées en $m_2$, et cela conduira bien à marquer $\spare{}$ les entrées
+inutiles dans $f\_a$ et $f\_b$.
+
+\subsection{Cohérence du projet} \label{sec-coherence}
+
+Avant de voir comment calculer le résultat, voyons les propriétés que doit avoir
+un marquage final pour être cohérent.
+Les éléments qui nous intéressent sont les signatures des fonctions et des
+appels.
+
+Nous ne parlons ci-dessous que des marques propagées,
+sachant qu'en plus, chacune peut contenir aussi une marque mise manuellement par
+l'utilisateur.
+
+\begin{itemize}
+  \item les marques des sorties d'un appel $(c_g, f_i)$ ne dépendent que du
+    contexte d'appel, c'est-à-dire des marques de leurs dépendances dans $f_i$.
+    Néanmoins, il semble qu'une marque $m_2$ ne puisse venir que de marques
+    $m_2$ sur les sorties de $f_i$, sauf la marque \spare{} qui peut venir 
+    d'entrées d'appels de fonction.
+  \item les marques des sorties d'une fonction spécialisée sont déterminées
+    par les marques des sorties des appels à cette fonction.
+    On ne peut avoir $m_1 \neq \botm$ que si l'utilisateur a placé
+    explicitement une marques sur la sortie. La marque $m_2$ est l'union 
+    des marques $m_1$ et $m_2$ des sorties des appels.
+  \item les marques des entrées d'une fonction sont uniquement déterminées par
+    la propagation des marques des autres éléments de la fonction.
+    Une marque $m_1$ provient nécessairement d'une sélection utilisateur dans la
+    fonction considérée ou une de ses fonctions appelées.
+  \item les marques des entrées d'un appel $(c_g, f_i)$ sont une combinaison des
+    marques des entrées de $g$ et des sorties de $(c_g, f_i)$ 
+    Si l'on remplace la fonction appelée, il faut recalculer ces
+    marques d'entrées.
+\end{itemize}
+\bb
+
+En résumé,
+considérons une entrée $e$ et une sortie $s$ d'une fonction spécialisée $g_i$,
+on note $m(e) = \sigf(g_i)(e)$, $m(s) = \sigf(g_i)(s)$.
+
+\labcenterepsfig{call}{Propagation des marques dans les appels de
+fonction}{fig-mark-call}
+
+Soit $c$ un appel quelconque à cette fonction, 
+on note $m(ce) = \sigc(c)(e)$ et $m(cs) = \sigc(c)(s)$.
+Pour avoir un projet cohérent, on doit avoir les propriétés suivantes~:
+
+
+\begin{itemize}
+  \item $m_2(s) \geq m_1(cs) + m_2(cs)$
+  \item $m_1(e) \leq m_1(ce)$
+  \item $m_2(e) \neq \botm \imply m_1(ce) \geq \spare$
+\end{itemize}
+
+Par ailleurs, si la sortie $s$ dépend de l'entrée $e$~:
+\begin{itemize}
+  \item $m_1(cs) \leq m_2(s) \leq m_2(e) \leq m_2(ce)$
+  \item $m_1(cs) \leq m_1(ce)$
+  \item $m_1(s) \leq m_1(e) \leq m_1(ce)$
+\end{itemize}
+\bb
+
+On a vu que le calcul du résultat final se décompose en actions élémentaires.
+Entre deux actions, on impose que le projet soit {\bf partiellement cohérent},
+c'est-à-dire que pour tous $\Call(f_i)(c)$~:
+\begin{itemize}
+  \item $\Call(f_i)(c) = \botc \Longleftrightarrow \sigc(c, f_i) = \bots$
+  \item $\Call(f_i)(c) = \topc$ et il doit y avoir une action en attente pour
+    attribuer l'appel,
+  \item $\Call(f_i)(c) = g_j$ et~:
+    \begin{itemize}
+      \item $g_j$ doit exister et avoir une signature compatible à l'appel,
+      ou une action de modification en attente
+	(car dans ce cas, on ne sait pas forcement évaluer la compatibilité des
+	signatures).
+      \item ou $g_j$ n'existe pas encore, mais fait l'objet d'une action de
+	construction en attente.
+    \end{itemize}
+\end{itemize}
+\bb
+
+Lorsque la liste des actions est vide, le projet doit être {\bf cohérent}
+c'est-à-dire que tous les appels de fonction doivent être affectés
+à une fonction ayant une signature compatible avec celle de l'appel.
+
+
+\section{Actions pour le calcul interprocédural}\label{sec-def-actions}
+
+La difficulté du traitement est d'enchaîner correctement les actions pour
+obtenir une application cohérente.  De plus, pour avoir une boite à outils
+suffisamment flexible, les actions doivent correspondre à des traitements
+suffisamment élémentaires, et parfaitement spécifiés (surtout leur comportement
+vis à vis des différentes options). 
+
+On  décide donc que toute action doit être décomposée et traduite 
+en une séquence d'{\bf actions élémentaires} définies ci-dessous.
+Elles doivent être simples, et
+le moins paramétrables possible, la flexibilité venant plutôt de la
+traduction d'une action de haut niveau en actions élémentaires.
+Ces dernières ne sont donc pas toutes accessibles par l'utilisateur,
+mais peuvent être vues comme des étapes de calcul qui seront combinées 
+par la suite en fonction des besoins.
+\bb
+
+L'application d'une action élémentaire~:
+\begin{itemize}
+  \item peut éventuellement générer de nouvelles actions,
+  \item mais ne peut créer ou modifier qu'une seule fonction (ou aucune).
+\end{itemize}
+\bb
+
+Cette partie présente donc tout d'abord les actions élémentaires,
+et le détail de l'application de chacune d'entre elles.
+Puis, on verra que la génération de ces actions dépend du mode de fonctionnement
+choisi. Les modes proposés sont exposés en \S\ref{sec-modes}.
+
+Les actions sont résumées sous forme de fiches signalétiques, en annexe
+\ref{app-actions}.
+
+\defaction{NewSlice}
+\subsection{Création une spécialisation~: \actNewSlice}\labact{NewSlice}{1}
+
+On appelle $f_i = \actNewSlice(f_0)$ l'action qui permet de construire
+une spécialisation $f_i$ de $f_0$ . Initialement, toutes les marques sont
+mises à $\botm$ et la fonction $\Call(f_i)(c) = \topc$.
+Les modifications peuvent ensuite être faite à l'aide des actions présentées
+ci-dessous. Cela permet d'avoir un traitement cohérent.
+
+\subsection{Modification d'une spécialisation}
+
+Les actions suivantes permettent de modifier la marquage une spécialisation 
+Elles ne créent pas de nouvelles fonctions.
+\bb
+
+{\bf Attention}~: pour l'instant, les actions {\bf ajoutent} des marques.
+Veut-on pouvoir réduire une spécialisation~?
+
+\defaction{ExamineCalls}
+Dans tous les cas, lorsque le marquage d'une fonction est modifié,
+il faut ensuite gérer ses appels de fonction.
+Toutes les actions de modification ci-dessous génèrent donc une requête 
+\actExamineCalls{} qui permet d'effectuer cette tâche.
+Son application est présentée en \refact{ExamineCalls}{1}.
+
+\defaction{AddUserMark}
+\subsubsection{Ajout d'une marque utilisateur~: \actAddUserMark}\labact{AddUserMark}{1}
+
+L'action $\actAddUserMark(f_i, (e, m)$  permet d'ajouter et de propager
+une marque sur
+n'importe quel élément de $f_i$. Il s'agit d'une marque utilisateur,
+elle est donc ajoutée en $m_1$.
+
+\defaction{AddOutputMarks}
+\subsubsection{Propagation d'une marque de sortie ~: \actAddOutputMarks}\labact{AddOutputMarks}{1}
+
+L'action $\actAddOutputMarks(f_i, \outsigc)$
+est générée lorsque $f_i$ est appelée, mais qu'elle ne calcule pas assez de
+choses. Pour chaque sortie $s$, si $\outsigc(s) = <m_1, m_2>$,
+il faut ajouter $<\botm, m_1+m_2>$ à $\outsigf(f_i)(s)$ et propager
+la nouvelle marque dans $f_i$.
+
+\defaction{ModifCallInputs}
+\subsubsection{Marquage des entrées d'un appel~: \actModifCallInputs}\labact{ModifCallInputs}{1}
+
+L'action $\actModifCallInputs(c_g, f_i)$ est générée lorsque
+les marques d'entrée d'un appel $g_j = \Call(f_i)(c_g)$ dans $f_i$
+sont insuffisantes pour la fonction appelée. Pour chaque entrée $e$ de l'appel, 
+on commence par recalculer sa marque en fonction des marques de ses dépendances.
+Cela permet d'obtenir un résultat correct même si on avait besoin de plus
+d'entrée avant d'appeler $g_j$. Puis, si
+$\insigf(g_j)(e) = <m_1, m_2>$, il faut ajouter $<m_1, \spare>$ à
+$\insigc(c_g, f_i)$ si $m_2 \neq \botm$ et $<m_1, \botm>$ sinon,
+et propager la nouvelle marque ainsi obtenue dans $f_i$.
+
+
+\subsubsection{Gestion des appels~: $\actExamineCalls$}\labact{ExamineCalls}{1}
+
+L'action $\actExamineCalls(f_i)$ est automatiquement appliquée
+après toute modification du marquage de la fonction $f_i$
+car il faut examiner $\Call(f_i)$ afin d'en vérifier la cohérence,
+c'est-à-dire pour voir si les fonctions appelées conviennent toujours.
+\bb
+
+
+\defaction{ChooseCall}
+Pour chaque appel, on regarde donc~:
+\begin{itemize}
+  \item si $\outsigc(c, f_i) = \bots$ (on n'utilise pas les sorties de l'appel
+    de fonction), alors $\Call(f_i)(c) = \botc$,
+  \item sinon (certaines sorties sont marquées)~:
+    \begin{itemize}
+      \item si $\Call(f_i)(c) = \botc$~:
+	rien n'était appelé précédemment, il faire faire comme si 
+	$\Call(f_i)(c) = \topc$ (voir ci-dessous),
+      \item si $\Call(f_i)(c) = \topc$~:
+	aucune fonction n'a encore été attribuée à cet appel.
+	Une action \actChooseCall est chargée d'affecter une fonction à cet
+	appel (cf. \refact{ChooseCall}{1}).
+      \item si $\Call(f_i)(c) = g_j$~: il faut comparer $\outsigc(c, f_i)$ à
+	$outsigf(g_j)$ comme nous allons le voir.
+    \end{itemize}
+\end{itemize}
+
+Pour que la fonction appelée $g_j$ convienne, il faut qu'elle calcule au moins
+toutes les sorties nécessaires à cet appel. C'est-à-dire que si une sortie de
+l'appel est marquée $<m_1, m_2>$, et que la sortie correspondante de $g_j$ est
+marquée $<m_1', m_2'>$, on doit avoir~:
+\begin{equation*}
+m_2' \geq m_1 + m_2
+\end{equation*}
+
+\defaction{MissingOutputs}
+Si ce n'est pas le cas, une action \actMissingOutputs{} est générée
+(cf. \refact{MissingOutputs}{1}).
+On pourrait générer directement $\actAddOutputMarks(g_j, \outsigc(c, f_i)$ mais
+ça ne permettrait pas de choisir une autre fonction $g$ plutôt que d'étendre
+$g_j$.
+\bb
+
+\defaction{MissingInputs}
+Par ailleurs, $\actExamineCalls$ s'occupe également de la propagation des
+marques aux appelants, c'est-à-dire que si $f_i$ est appelée par $h_k$ et que
+les marques de ses entrées ont été modifiées, il faut les propager aux entrées
+des appels.  Pour cela, on génère une action \actMissingInputs
+(cf. \refact{MissingInputs}{1}).  On
+pourrait directement générer $\actModifCallInputs(c_f, h_k)$, mais cela ne
+permettrait pas de modifier l'appel de fonction pour choisir d'appeler une autre
+spécialisation de $f$ dans $h_k$.
+
+Les étapes de l'attribution, puis de la modification des appels de fonction
+peuvent sembler complexes au premier abord, 
+d'autant plus que leur enchaînement dépend d'un mode
+de fonctionnement qui sera explicité en \S\ref{sec-modes} et éventuellement des
+interventions ponctuelles de l'utilisateur.
+La figure \ref{fig-modifcall} tente de résumer ce processus.
+
+\clearpage
+\begin{center}
+  \rotatebox{90}{%
+     \resizebox{200mm}{!}{\includegraphics{choose_call}}}
+
+Fig.~\thefigure~:\label{fig-modifcall} 
+Gestion d'un appel $c$ à une fonction $g$
+
+suite à la modification des marques de la signature de $c$ dans la fonction appelante
+
+ou à celle des entrées de $g$.
+\stepcounter{figure}
+\end{center}
+\clearpage
+
+\subsection{Affecter ou modifier un appel de fonction}
+
+On a vu que lors de la création ou la modification du marquage d'une fonction
+$f_i$, des actions $\actChooseCall(c, f_i)$, 
+$\actMissingOutputs(c, f_i)$ ou
+$\actMissingInputs(c, f_i)$ pouvaient être générées lorsqu'un appel $c$
+doit être attribué ou modifié.
+Dans tous les cas, on se pose la question de la fonction à appeler car soit on
+ne l'a pas encore choisie, soit elle ne convient plus. 
+\bb
+
+\subsubsection{Attribution d'un appel : $\actChooseCall$}\labact{ChooseCall}{1}
+
+Une action $\actChooseCall(c, f_i)$ peut-être générée (selon le mode choisi)
+lorsque
+$\Call(f_i)(c)$ doit être modifié car le marquage de $f_i$ a changé~: 
+il s'agit de trouver une fonction $g_k$ pour remplacer l'ancienne valeur de
+$\Call(f_i)(c)$ qui pouvait être $\topc$, $\botc$ ou encore $g_j$,
+mais cette dernière ne convient plus.
+\bb
+
+Lors de l'application de cette action, outre le mode de fonctionnement,
+le critère principal de choix est le marquage des sorties dans l'appel 
+($\outsigc(c, f_i)$) qui est confronté  
+au marquage des spécialisations de $g$ déjà calculées,
+en appliquant éventuellement un traitement particulier à $g_j$,
+la fonction initialement appelée.
+
+En fonction du mode~:
+\begin{itemize}
+  \item soit on trouve une $g_k$ qui convient,
+  \item soit on trouve une $g_k$ que l'on souhaite utiliser,
+    mais qui ne calcule pas assez de choses~: 
+    il faut donc créer $\actAddOutputMarks (g_k, \sigc(c, f_i))$,
+  \item soit on ne trouve pas de spécialisation existante et on lance alors la
+    création d'une nouvelle spécialisation soit en partant de $g_0$, soit en
+    partant de $g_j$ (à voir...)
+\end{itemize}
+\bb
+
+\defaction{ChangeCall}
+Dans tous les cas, après avoir choisi $g_k$, 
+on applique une action \actChangeCall (cf. \refact{ChangeCall}{1}).
+
+\subsubsection{Action $\actMissingInputs$}\labact{MissingInputs}{1}
+
+On rappelle qu'une action $\actMissingInputs(c, f_i)$ est générée lorsque la
+fonction $g_j$ attribuée à $\Call(f_i)(c) = g_j$ a été modifiée, et qu'elle
+nécessite le marquage d'entrées qui ne le sont pas $\sigc(c,f_i)$.
+\bb
+
+En fonction du mode de fonctionnement, une telle action peut conduire à~:
+\begin{itemize}
+  \item la modification du marquage de $f_i$, 
+    c'est-à-dire l'application de $\actModifCallInputs(c, f_i)$,
+  \item le choix d'une autre fonction, c'est-à-dire l'application de
+    $\actChooseCall(c, f_i)$ (dont le résultat dépend du mode courant),
+  \item une transformation manuelle par l'utilisateur de cette action par 
+    un $\actChangeCall(c, f_i, g_k)$ où $g_k$ doit nécessairement calculer
+    suffisamment de sorties.
+\end{itemize}
+
+\subsubsection{Action $\actMissingOutputs$}\labact{MissingOutputs}{1}
+
+L'action $\actMissingOutputs(c, f_i)$ est générée lorsque le marquage de $f_i$
+a été modifié et que la
+fonction $g_j$ attribuée à $\Call(f_i)(c) = g_j$ ne calcule pas suffisamment 
+de sorties pour le nouveau marquage.
+\bb
+
+En fonction du mode de fonctionnement, une telle action peut conduire à~:
+\begin{itemize}
+  \item la modification du marquage de $g_j$,
+    c'est-à-dire l'application de $\actAddOutputMarks(g_j, \sigc(c, f_i))$,
+  \item le choix d'une autre fonction, c'est-à-dire l'application de
+    $\actChooseCall(c, f_i)$ (dont le résultat dépend du mode courant),
+  \item une transformation manuelle par l'utilisateur de cette action par
+    un $\actChangeCall(c, f_i, g_k)$ où $g_k$ doit nécessairement calculer
+    suffisamment de sorties.
+\end{itemize}
+
+\subsubsection{Changement d'un appel : $\actChangeCall$}\labact{ChangeCall}{1}
+
+L'action $\actChangeCall(c, f_i, g_j)$ permet de transformer $f_i$
+pour avoir $\Call(f_i)(c) = g_j$.  
+Elle ne peut être appliqué que si
+$g_j$ calcule bien toutes les sorties nécessaire à l'appel $c$ dans $f_i$.
+Il faut donc appliquer $\actAddOutputMarks$ à $g_j$ avant d'appliquer
+$\actChangeCall$ s'il en manque.
+\bb
+
+L'application de $\actChangeCall(c, f_i, g_j)$ consiste à modifier
+$\Call(f_i)(c)$, mais aussi à appliquer $\actModifCallInputs(c, f_i)$ dans le
+cas où la signature de $g_j$ nécessite des entrées qui ne sont pas visibles dans
+$\sigc(c, f_i)$.
+
+\subsection{Modes de fonctionnement}\label{sec-modes}
+
+La génération de ces actions, ainsi que l'effet de leur application sur le
+projet, dépend du choix d'un mode de fonctionnement
+qui décide de la précision des spécialisations. 
+Ce mode peut offrir de nombreuses possibilités, 
+mais on se limite dans un premier temps à quatre comportements~:
+\begin{enumerate}
+  \item pas de spécialisation des appels de fonction (\option{DontSliceCalls}) 
+    (cf. \S\ref{sec-DontSliceCalls})~;
+  \item pas de spécialisation, mais propagation du marquage aux fonctions
+    appelées (\option{PropagateMarksOnly})(cf. \S\ref{sec-PropagateMarksOnly})~;
+  \item le moins de spécialisations possibles 
+    (\option{MinimizeNbSlice}) (cf. \S\ref{sec-MinimizeNbSlice})~: 
+    l'outil ne crée pas plus d'une spécialisation par fonction~;
+  \item spécialisations les plus précises possible 
+    (\option{PreciseSlices}) (cf. \S\ref{sec-PreciseSlices})~:
+    on regroupe néanmoins les fonctions ayant la même visibilité,
+    même si le marquage n'est pas le même.
+\end{enumerate}
+
+Pour plus de flexibilité,
+du point de vue de la boîte à outil décrite ici, on suppose que le mode peut
+être changé à tout moment.
+
+\subsubsection{Réduction avec {\it DontSliceCalls}}\label{sec-DontSliceCalls}
+
+Il s'agit du choix qui permet d'utiliser le marquage intraprocédural sans
+propagation aux fonctions appelées.
+Il peut être utilisé si l'on s'intéresse aux liens de dépendance 
+dans une fonction, sans s'intéresser au reste de l'application.
+Tous les appels visibles sont donc attribués aux fonctions source~:
+$$\forall c. \exists o. \outsigc(c, f_i)(o) \neq \botm 
+\imply \Call(f_i)(c) = \Call(f_0)(c)$$
+
+Dans ce cas, il n'est pas utile de générer d'action $\actChooseCall$,
+et les $\actMissingInputs$ (marquage à \spare{} des entrées non utilisées)
+sont directement appliquées. 
+Par ailleurs, il n'y a pas non plus d'actions
+$\actMissingOutputs$ puisque les fonctions source calculent toutes les sorties.
+\bb
+
+Si un autre mode a été utilisé, il est possible néanmoins d'être amené à
+appliquer les actions suivantes~:
+
+\begin{itemize}
+  \item $\actChooseCall(c, f_i)$ est traduite en $\actChangeCall(c, f_i, g_0)$,
+  \item $\actMissingInputs(c, f_i)$ en $\actModifCallInputs(c, f_i)$
+  \item $\actMissingOutputs(c, f_i)$ en $\actAddOutputMarks$ ?
+    ou $\actChangeCall(c, f_i, g_0)$ ?
+\end{itemize}
+
+\subsubsection{Réduction avec {\it PropagateMarksOnly}}\label{sec-PropagateMarksOnly}
+
+Ce mode est à utiliser si l'on veut voir la propagation des dépendances
+dans l'ensemble de l'application sans calculer de spécialisations.
+Il est donc très semblable au mode précédent sauf que l'on calcule un marquage
+également pour les fonctions appelées. Néanmoins, il ne s'agit pas d'une
+réduction à proprement parlé puisque tout reste visible.
+
+\subsubsection{Réduction avec {\it MinimizeNbSlice}}\label{sec-MinimizeNbSlice}
+
+Lorsque l'on applique une action $\actChooseCall$ 
+sur un appel à une fonction $g$
+et qu'il n'y a pas encore de spécialisation, on en crée une nouvelle.
+
+S'il y a une spécialisation $g_j$ (et une seule), 
+elle est choisie  pour être appelée, indépendamment de son marquage. 
+\bb
+
+Si plusieurs $g_j$ existent, c'est 
+{\it la plus proche}\footnote{Les critères de choix restent à définir.}
+qui doit être choisie.
+\bb
+
+S'il manque des marques aux sorties de la fonction choisie,
+il faut les lui ajouter. Pour cela,
+il n'y a pas de génération de $\actMissingOutputs$ puisqu'on ne souhaite avoir
+qu'une seule spécialisation~: elle est directement remplacée 
+par $\actAddOutputMarks$.
+\bb
+
+Enfin, l'action $\actChangeCall$ permet d'appeler la fonction choisie.
+C'est cette dernière action qui s'occupe
+ensuite de propager le marquage des entrées dans $f_i$
+en appliquant automatiquement le $\actModifCallInputs(c, f_i)$.
+
+\subsubsection{Réduction avec {\it PreciseSlices}}\label{sec-PreciseSlices}
+
+Dans ce mode, lors de l'application de $\actChooseCall(c, f_i)$,
+le choix de la fonction à appeler s'effectue de la façon suivante~:
+\begin{itemize}
+  \item on sélectionne les spécialisations qui ont la même visibilité
+    que $\outsigc(c, f_i)$ (même si elles n'ont pas exactement le même
+    marquage)~;
+  \item s'il n'y en a pas, on en crée une nouvelle~;
+  \item s'il n'y en a qu'une, elle est choisie~;
+  \item s'il y en a plusieurs, il faut en choisir une.
+Dans le cas, on choisit pour l'instant la première 
+spécialisation trouvée. Il est clair que ce choix peut être amélioré
+si on définit des critères de choix.
+
+    Il faut remarquer que cette situation ne peut se produire que si
+    l'utilisateur est intervenu.
+\end{itemize}
+
+
+Remarque~: Si $\Call(f_i)(c)$ est déjà attribué avant l'application de 
+$\actChooseCall$, on ignore son ancienne valeur.\\
+
+Dans ce mode, l'application des actions $\actMissingOutputs(c, f_i)$ et 
+$\actMissingInputs(c, f_i)$ est équivalente à l'application
+de $\actChooseCall(c, f_i)$.
+\bb
+
+Il faut noter que ce mode peut être également être choisi si l'on veut piloter
+tous les choix manuellement car les actions sont toutes générées, et l'outil ne
+fait un choix que lorsqu'elles sont appliquées. Elles peuvent donc être
+préalablement transformées en $\actChangeCall$ par l'utilisateur.
+
+
+\subsection{Autres actions}
+
+\defaction{CopySlice}
+\subsubsection{Duplication d'une spécialisation~: \actCopySlice}\labact{CopySlice}{1}
+
+L'action $f_j = \actCopySlice(f_i)$ permet simplement de dupliquer $f_i$
+et donc de créer une nouvelle fonction spécialisée $f_j$.
+Le marquage, ainsi que la fonction $\Call(f_i)$ sont simplement copiés.
+
+Il faut noter que, initialement, $f_j$ n'est pas appelée.
+
+\defaction{Combine}
+\subsubsection{Combinaison de spécialisations~: \actCombine}\labact{Combine}{1}
+
+On peut combiner deux spécialisations (c'est-à-dire en faire l'union) 
+à l'aide de $f_3 = \actCombine(f_1, f_2)$.\bb
+
+La table de marquage se
+calcule simplement en combinant les marques, sans qu'il y ait besoin de
+propager.  Il faut ensuite résoudre les appels de fonction, c'est-à-dire
+calculer $\Call(f_3)$.  Ce qui est fait
+pour un appel donné $c$ dépend de sa signature dans le résultat $f_3$
+par rapport à ce qu'on a dans $f_1$ et $f_2$.
+On sait que, par construction 
+$\sigc(c, f_3) = \sigc(c, f_1) \cup \sigc(c, f_2)$
+et qu'elle est donc supérieure ou égale.
+
+\begin{itemize}
+  \item si $\sigc(c, f_1)=\sigc(c, f_2)$~:
+    \begin{itemize}
+      \item si $\Call(f_1)(c) = \Call(f_2)(c)$~: $\Call(f_3)(c) = \Call(f_1)(c)$
+      \item si $\Call(f_1)(c) = \topc$~: $\Call(f_3)(c) = \Call(f_2)(c)$
+      \item si $\Call(f_2)(c) = \topc$~: $\Call(f_3)(c) = \Call(f_1)(c)$
+      \item sinon, cela veut dire que les deux appels sont attribués à des
+	fonctions différentes~: on choisit celle qui a la plus petite signature
+	(ie. la plus précise).
+    \end{itemize}
+  \item sinon, si $\sigc(c, f_3)=\sigc(c, f_1)$~: $\Call(f_3)(c) = \Call(f_1)(c)$
+  \item sinon, si $\sigc(c, f_3)=\sigc(c, f_2)$~: $\Call(f_3)(c) = \Call(f_2)(c)$
+  \item sinon, $\Call(f_3)(c) = g_i$, et on crée une action 
+    $g_i = \actCombine(\Call(f_1)(c), \Call(f_2)(c))$.
+\end{itemize}
+\bb
+
+Il faut noter que la création de $f_3$ ne modifie ni $f_1$, ni $f_2$.
+Si l'objectif est de remplacer $f_1$ et $f_2$ par $f_3$,
+cela peut être fait par une combinaison d'actions élémentaires
+(cf. \S\ref{sec-fusion}).
+
+\defaction{DeleteSlice}
+\subsubsection{Suppression d'une spécialisation~: \actDeleteSlice}\labact{DeleteSlice}{1}
+
+Une fonction spécialisée peut être supprimée à l'aide de l'action
+\actDeleteSlice$(f_i)$, mais cette action ne peut être appliquée que 
+que si $f_i$ n'est pas appelée, sauf si elle n'est appelée que par elle même.
+Cela signifie que ses appels doivent être supprimés au préalable à l'aide
+d'actions \actChangeCall{} (ou de \actDeleteSlice{} sur les appelant...).
+
+
+\section{Sélection persistante}
+
+Après une première utilisation des fonctions présentées ci-dessus, il est apparu
+qu'un besoin utilisateur pouvait également être de marquer une instruction (ou
+une donnée à un point de programme) pour toutes les spécialisations d'une
+fonction. Ce type de sélection a été nommée
+\indextxtdef{persistante}{sélection!persistante}.
+Cela signifie que chaque fonction a, en parallèle de ses différents marquages,
+un marquage minimum qui est utilisé à la création de toute nouvelle
+spécialisation. Lorsque l'utilisateur ajoute une sélection persistante,
+elle est ajoutée à la fois dans ce marquage minimum, et dans toutes les
+spécialisations existantes. L'ajout d'une sélection persistante dans une
+fonction peut également rendre tous ses appels visibles (si l'option est
+positionnée) car l'utilisateur souhaite que le programme réduit passe aussi
+souvent au point marqué que le programme source~: cela suppose donc que tous les
+chemins qui mènent à la fonction soit visibles.
+
+\section{Gérer des actions élémentaires}\label{sec-multi-actions}
+
+Les actions élémentaires présentées ci-dessus doivent être combinées pour
+répondre à des requêtes de plus haut niveau.
+L'utilisateur exprime ses requêtes en ajoutant des actions dans la liste
+du projet, mais celles-ci doivent ensuite être décomposées pour être appliquées,
+et l'application d'actions élémentaires en génère d'autres.\\
+
+La granularité à laquelle l'utilisateur peut intervenir reste à
+définir en fonction de ce que l'on souhaite faire de l'outil.\\
+
+Nous allons tout d'abord examiner comment peut être gérée la liste d'action
+(\S\ref{sec-gestion-actions}), puis nous verrons un certain nombre d'exemple de
+combinaison d'actions élémentaires pour répondre à des requêtes de plus haut
+niveau.
+
+\subsection{Modification ou suppression d'actions}\label{sec-gestion-actions}
+
+Les actions de l'utilisateur peuvent être supprimées par ses soins avant d'être
+appliquée.  En revanche, les actions générées telles que \actChooseCall{},
+\actMissingInputs{} ou \actMissingOutputs{} consistent à rendre un appel de
+fonction cohérent, elles ne peuvent donc pas être supprimées. Par contre,
+l'utilisateur peut les transformer en \actChangeCall{} pour préciser la fonction
+qu'il souhaite voir appeler. Dans ce cas, cette nouvelle action ne pourra à son
+tour pas être supprimée.
+
+\subsection{Ordre des actions}\label{sec-ordre}
+
+A priori, le marquage étant parfaitement défini, il ne dépend pas de l'ordre des
+calculs. Néanmoins, le résultat obtenu peut dépendre de l'ordre d'application
+des actions, car si on applique une action qui construit une nouvelle
+fonction $g_j$, puis une autre pour construire $f_i$ qui appelle une fonction
+$g$, $g_j$ va pouvoir être choisie pour l'appel, alors que si la première action
+n'avait pas encore été appliquée, c'est peut-être une autre spécialisation qui
+aurait été appelée, ou une nouvelle action qui aurait été générée.
+De plus, certaines actions ont une précondition qui n'est éventuellement
+satisfaite que si les actions générées sont appliquées dans l'ordre.
+On ne prévoit donc pas dans un premier temps
+de pouvoir modifier l'ordre des actions.
+
+\subsection{Propagation aux appelants}\label{sec-propagate-to-calls}
+
+Les actions élémentaires ne propagent le marquage des entrées d'une certaine
+fonction $f_i$ qu'aux appels $(c, h_k)$ tels que $\Call(h_k)(c) = f_i$.
+Si on souhaite construire de nouvelles fonctions spécialisées pour toutes les
+fonctions $h$ qui appellent $f$ afin de propager le marquage, il faut enchaîner
+différentes actions élémentaires.
+
+Voyons par exemple comment piloter l'ajout d'une marque utilisateur $m$ sur un
+élément $e$ de $f$ avec propagation dans les appelants~:
+\begin{itemize}
+  \item $f_i = \actNewSlice (f_0)$
+  \item $\actAddUserMark (f_i, (e, m))$
+  \item $\forall h_0. \exists c_f \in \call(h_0) 
+    \imply h_k = \actNewSlice (h_0) \land \forall c_f. \actChangeCall(c_f, h_k,
+    f_i)$
+\end{itemize}
+
+\subsection{Fusion de deux spécialisation}\label{sec-fusion}
+
+Si deux spécialisations $f_1$ et $f_2$ ont été calculées, l'utilisateur peut
+vouloir les fusionner. Pour cela, il faut appliquer les actions suivantes~:
+\begin{itemize}
+  \item $f_3 = \actCombine (f_1, f_2)$
+  \item $\forall c, h_k. \Call(h_k)(c) = f_1 \imply \actChangeCall(c, h_k, f_3)$
+  \item $\forall c, h_k. \Call(h_k)(c) = f_2 \imply \actChangeCall(c, h_k, f_3)$
+  \item $\actDeleteSlice(f_1), \actDeleteSlice(f_2)$
+\end{itemize}
+
+% \subsection{autres exemples...}
+% \afaire{ compléter au fur et à mesure, en fonction des besoins.}
+
+%--------------------------------------
+\section{Production du résultat}
+
+On rappelle que l'objectif est de générer des fichiers source compilables.
+Or, après avoir effectué tout le travail de filtrage présenté précédemment,
+on obtient un projet contenant, pour chaque fonction, zéro, une, ou plusieurs
+fonctions filtrées, avec pour chaque fonction filtrée, une table de marquage
+permettant de déterminer les instruction visibles,
+et les appels de fonction.
+Voyons ce qu'il manque pour obtenir le résultat final.
+
+\subsection{Déclarations globales}
+
+Pour produire des fichiers de résultats, il faut avant tout être capable d'y
+mettre ce qui est en dehors des fonctions, à savoir les déclarations globales.
+
+Il aurait été possible de calculer des liens de dépendance vers les déclarations
+globales, mais on a considéré que la suppression de 
+déclarations inutiles était une fonctionnalité intéressante en soi,
+et cela est donc fait sous forme d'une passe supplémentaire sur le résultat.
+
+\subsection{Fonctions}
+
+Pour une fonction qui a été analysée, on a calculé la représentation de la
+fonction source, ainsi qu'une ou plusieurs spécialisations.
+Les fonctions non analysées ne figureront pas dans le résultat
+car elles ne participent pas au calcul demandé.
+
+\subsubsection{Fonction spécialisée}
+
+Pour générer le code correspondant à une fonction spécialisée,
+il faut lui donner un nom qui n'entre pas en conflit avec celui de des fonctions
+source ou des autres spécialisation.
+Il faut également avoir sa signature pour savoir si elle possède une valeur
+de retour, et connaître la liste de ses arguments visibles.
+
+\subsubsection{Garder ou non la fonction source}
+
+Une fonction source n'a besoin d'être présente dans l'application générée
+que si elle est appelée.
+Le traitement d'un appel de fonction qui ne conduit pas à appeler une
+spécialisation doit donc mémoriser un lien avec la fonction source.
+
+\subsubsection{Variables locales statiques}
+
+Lorsqu'une fonction est présente en plusieurs exemplaires dans le résultat,
+il faut penser à sortir les éventuelles variables statiques communes à plusieurs
+spécialisations afin qu'elles soient partagées par les différentes fonctions.
+
+\subsubsection{Modification des appels}\label{sec-filtre-call}
+
+Pour générer un appel à une fonction spécialisée,
+il faut avoir les mêmes informations que celles qui sont utilisées pour la
+définition de la fonction, à savoir~:
+\begin{itemize}
+\item son nom,
+\item la liste des paramètres formels nécessaires au calcul des sorties
+sélectionnées,
+\item le type de retour pour savoir si la fonction produit un résultat.
+\end{itemize}
+
+\subsubsection{Génération des nouveaux prototypes}
+
+Lorsque l'on produit des fonctions spécialisées, il faut aussi 
+générer les prototypes associés. Comme elles ont forcément la même portée que la
+fonction source, il suffit de générer ces nouveaux prototypes à l'endroit où
+l'on rencontre le prototype initial.
+
+\subsubsection{Gestion des blocs}
+
+Même si le graphe de dépendance contient des éléments représentant les blocs,
+et donc que le \slicing associe des marques à ces éléments,
+il est délicat de supprimer un bloc, même si est sensé être invisible.
+En effet, cela peut parfois changer la sémantique,
+et dans une construction \verb!if (c) { S1; } else { S2; }!,
+on peut même obtenir un résultat syntaxiquement incorrect
+si on n'y prend pas garde.\\
+
+Comme il peut être utile par ailleurs d'avoir un outil de nettoyage de code
+qui supprime proprement les blocs vide, on décide de ne pas les traiter 
+au niveau du \slicing. Tous les blocs sont donc considérés comme visibles
+indépendamment de leur marque, et le nettoyage est effectué lors d'une passe
+supplémentaire sur le code généré.
+
+\subsection{Annotations}
+
+Les annotations peuvent être utilisées pour construire des requêtes de \slicing,
+mais au delà de cette possibilité, il faut déterminer si les annotations
+présentes dans le code source doivent être mises dans le résultat.
+On regarde pour cela si les données qui permettent d'évaluer la propriété sont
+préservées dans le programme réduit : si c'est le cas, l'annotation va être
+gardée, dans le cas contraire, elle va être slicée.
diff --git a/doc/slicing/intro.tex b/doc/slicing/intro.tex
new file mode 100644
index 0000000000000000000000000000000000000000..7f312529bebf333dfa3e2427babd70bc15d6a658
--- /dev/null
+++ b/doc/slicing/intro.tex
@@ -0,0 +1,394 @@
+\chapter{Introduction}
+
+
+L'objectif de ces travaux est de concevoir et développer un outil de \slicing
+se basant sur le noyau \ppc d'analyse statique de programme C
+en s'inspirant du module équivalent déjà développé
+sur la base de l'outil \caveat qui est décrit dans \cite{slicingCaveat}.
+
+
+
+\section{État de l'art}\label{sec-lart}
+
+Voyons tout d'abord
+ce que dit la littérature sur ce sujet
+afin de se positionner par rapport aux différentes méthodes.\\
+
+On s'appuie ici sur la présentation des travaux sur le calcul de PDG
+effectué dans un autre document.
+
+\subsection{Origine}
+
+La technique consistant à réduire un logiciel -~appelée \slicing en anglais~-
+a été beaucoup
+étudiée depuis son introduction par la thèse de \cite{weiser79}.
+L'article \cite{weiser81} rappelle que sa définition du \slicing est
+la suivante~:
+
+\begin{definition}{slicing selon Weiser}
+Le programme d'origine et le programme transformé doivent être identique
+si on les regarde à travers la fenêtre défini par le critère de \slicing
+défini par un point de programme et une liste de variable.
+C'est à dire que la séquence de valeurs observées pour ces variables
+à ce point doivent être les mêmes.
+
+De plus, le programme transformé doit être obtenu par suppression de certaines
+instructions du programme d'origine.
+\end{definition}
+
+Cette définition a été remise en cause par la suite
+au motif que cette définition n'est pas suffisante pour traduire
+la compréhension intuitive que l'on a du \slicing.
+On trouve l'exemple suivant dans \cite{kumar02better},
+mais cette critique revient a plusieurs reprises.
+
+\begin{exemple}
+\begin{center}
+\begin{tabular}{|l|l|l|}
+\hline
+P & P1 & P2 \\
+\hline
+a = 1;   &          & a = 1; \\
+b = 3;   &          & b = 3; \\
+c = a*b; &          & \\
+a = 2;   & a = 2;   & \\
+b = 2;   & b = 2;   & \\
+d = a+b; & d = a+b; & d = a+b; \\
+\hline
+\end{tabular}
+\end{center}
+P1 est probablement ce qu'on attend du \slicing de P si l'on s'intéresse
+à la variable d après la dernière instruction, mais P2
+est aussi correct du point de vue de Weiser.
+\end{exemple}
+
+Il semble peu probable de construire un algorithme qui construit P2,
+mais on voit néanmoins que la définition est insuffisante
+pour spécifier complètement ce que doit être le résultat d'un \slicing.\\
+
+\cite{Choi94} formalise la définition de la façon suivante~:
+
+\begin{definition}{Correct-Executable-Slice}
+Let $P_{slice}$ be an executable slice of a program $P_{org}$,
+S be the set of statements in $P_{slice}$ and $Proj_S(P_{org}, \sigma_0)$
+be the projection of $Trace(P_{org}, \sigma_0)$ that contains
+only those statement traces produced by statements in S.
+$P_{slice}$ is a correct executable slice of $P_{org}$ if
+ $Proj_S(P_{org}, \sigma_0)$  is identical to $Trace(P_{org}, \sigma_0)$.
+\end{definition}
+
+Même si cette définition possède les mêmes inconvénients que celle d'origine,
+elle lui permet de faire des preuves de correction des ses algorithmes
+relativement à cette formalisation.
+
+\subsection{Graphes de dépendances}
+
+Comme on l'a vu dans \cite{ppcPdg} les graphes de dépendances sont à la base des
+calculs.
+\cite{Ottenstein84}, puis \\
+\cite{Ferrante87}
+introduisent la notion de PDG ({\it Program Dependence Graph}).
+Un tel graphe est utilisé pour représenter les différentes dépendances
+entre les instructions d'un programme.
+Ils l'exploitent pour calculer un {\it slicing non-executable}
+qui s'intéresse uniquement aux instructions
+qui influencent la valeur des variables,
+mais cette représentation sera également utilisée pour calculer un
+\slicing exécutable.\\
+
+Cette représentation, initialement intraprocédurale, a été étendue
+à l'interprocédurale dans \cite{horwitz88interprocedural} où elle
+porte le nom de SDG ({\it System Dependance Graph}).
+Dans ce papier, Susan Horwitz s'intéresse à un \slicing
+ayant la définition suivante~:
+
+\begin{definition}{slicing selon \cite{horwitz88interprocedural}}
+A slice of a program with respect to program point p and variable x
+consists of a set of statements of the program that might affect
+the value of x at p.
+\end{definition}
+
+Mais elle précise par ailleurs que x doit être défini ou utilisé en p.
+En effet, lorsque le graphe est construit, le \slicing se résume à un
+problème d'accessibilité à un noeud, or un noeud représente un
+point de programme et ne contient que les relations concernant les variables
+qui y apparaissent.\\
+
+Nous avons vu dans \cite{ppcPdg} que l'on peut lever cette limitation en gardant
+une correspondance entre les données à un point de programme et les noeud du
+graphe.
+
+\subsection{Slices vs. Chops}
+
+On a vu que le \slicing s'intéresse à ce qui se passe avant d'arriver
+à un certain point.\\
+
+La notion de {\it chopping} est similaire sauf qu'elle s'intéresse
+aux instructions qui vont être influencées par une certaine donnée
+à un certain point.
+
+\subsection{Critères de \slicing}
+
+Nous n'avons pour l'instant parlé que du \slicing dit {\bf statique}
+qui s'intéresse à toutes les exécutions d'un programme,
+par opposition au \slicingb {\bf dynamique}
+ qui considère la projection du programme
+sur l'exécution d'un jeu d'entrée particulier,
+ou {\bf quasi-statique} qui fixe uniquement une partie des entrées.\\
+
+Une version plus générale qui inclus à la fois l'un et l'autre
+est appelé \slicingb {\bf conditionnel} (\cite{fox-consit}).
+Il s'agit de spécifier le cas d'étude sous forme de
+des propriétés sur le jeu d'entrées (préconditions).\\
+
+Par la suite, la notion de {\bf  \slicing conditionnel arrière}
+a été introduit dans plusieurs buts différents :
+\begin{itemize}
+\item la première technique décrite dans \cite{Comuzzi} et
+ appelée p-slice, s'intéresse aux instructions qui participent
+à l'établissement de la postcondition,
+\item alors que la deuxième (\cite{fox01backward})
+a un objectif un peu différent car vue
+comme une aide à la preuve permettant d'éliminer du programme
+tous les cas dans lesquels la propriété est vérifiée (automatiquement),
+pour ne garder que ceux pour lesquels le résultat n'est pas certain
+afin que l'utilisateur puisse se concentrer sur la vérification
+de cette partie.
+
+Dans \cite{Harman2001}, ces auteurs continuent
+les travaux précédents en combinant
+une propagation avant et une propagation arrière.
+Quelques exemples et la présentation d'un outil mettant en {\oe}uvre
+le travail de cette équipe est présenté dans \cite{daoudi-consus}.
+Ils définissent leur objectif de la façon suivante :
+\end{itemize}
+
+\begin{definition}{pre-post conditioned slicing}
+Statements are removed if they cannot lead to
+satisfaction of the negation of the post condition,
+when executed in an initial state which satisfies
+the pre-condition.
+\end{definition}
+
+\begin{itemize}
+\item une troisième approche est présentée très brièvement
+dans (\cite{Chung-2001}~:
+il s'agit également de spécifier le critère de slicing par une pré-post
+et de combiner une propagation avant et arrière de propriétés
+pour ne garder que ce qui participe
+à l'établissement de la post dans le contexte de la précondition.
+\end{itemize}
+
+
+% {\bf contraint} (\cite{Field95}),
+
+
+Ces nouveaux types de \slicing
+ne se basent plus uniquement sur des relations de dépendance,
+mais nécessitent différentes techniques complémentaires comme
+l'exécution symbolique ou encore le calcul de WP.\\
+
+Dans le cadre de notre étude, il semble intéressant d'explorer
+cette voie étant donné que nous disposons (ou disposerons)
+de tels outils d'analyse dans \ppc.\\
+
+
+
+
+
+
+
+\subsection{Transformations}
+
+Dans nos précédents travaux, nous avons exploré certaines transformations
+de programme comme la spécialisation de fonction
+(et donc la transformation des appels),
+et également la propagation de constantes.\\
+
+Divers papiers, dont \cite{harman01gustt},
+présentent un \slicing qu'ils appellent {\bf amorphe}
+dans lequel il s'agit de
+combiner des techniques de \slicing et de transformation de programme.
+
+ \cite{ward2002} (pour une raison qui m'échappe)
+préfère parler de  \slicingb {\bf sémantique}\\
+
+% {\bf à développer !}
+
+
+\subsection{Outils}
+
+On peut citer deux outils qui mettent en {\oe}uvre cette technique sur les
+programmes C-ANSI~:
+\begin{itemize}
+\item {\it unravel}, présenté dans \cite{lyle97using},
+  est disponible sur le web  (cf. [\cite{unravel}])~;
+\item et le {\it Wisconsin Program-Slicing Tool} (\cite{reps93wisconsin}),
+est commercialisé par {\it GrammaTech} sous le nom {\it CodeSurfer}
+(cf. site web [\cite{CodeSurfeur}]).\\
+\end{itemize}
+
+Ces outils permettent tous les deux~:
+\begin{itemize}
+\item de sélectionner les parties de code utiles au calcul
+d'une variable à un point de contrôle,
+\item de visualiser les instructions sélectionnées sur le
+code source de l'utilisateur,
+\item et de faire des opérations d'union et l'intersection entre plusieurs
+réductions.
+\end{itemize}
+
+\subsection{Pour en savoir plus}
+
+Un état de l'art en 1995 est présenté dans \cite{tip95survey}.\\
+Plus récemment, \cite{survey2005} font un tour très complet des évolutions
+jusqu'en 2005.
+
+Par ailleurs, un site internet~- dont l'adresse est donnée
+dans la bibliographie sous la référence \cite{wwwSlicing}~-
+a tenu à jour une liste des projets
+et une bibliographie très impressionnante sur le \slicing
+jusqu'en 2003, mais ce site ne semble plus maintenu.\\
+
+
+\section{Ce que l'on veux faire}\label{sec-but}\label{sec-defR}
+
+\newcommand{\remitem}[1]{\begin{itemize}\item #1 \end{itemize}}
+%\newcommand{\warnitem}[1]{\begin{itemize}\item[$\blacktriangle$] #1
+                          %\end{itemize}}
+%\newcommand{\question}[1]{\begin{itemize}\item[{\bf ?}] #1 \end{itemize}}
+%\newcommand{\smilitem}[1]{\begin{itemize}\item[$\smiley$] #1 \end{itemize}}
+%\newcommand{\frownitem}[1]{\begin{itemize}\item[$\frownie$] #1 \end{itemize}}
+
+Le document \cite{baudinImpact} spécifie un outil d'aide à l'analyse d'impact
+après avoir analysé les besoins dans ce domaine.
+Le module de \slicing est présenté comme étant
+un composant important de cet outil.\\
+
+Résumons ici les caractéristiques principales de l'outil
+qui ont servies de spécification initiale~:
+
+\begin{itemize}
+\item l'outil sert à construire un programme compilable
+à partir d'un programme source, les deux programmes ayant le même
+comportement vis à vis des critères fournis par l'utilisateur~;
+\item la construction de ce programme résultat est un processus interactif.
+\item {\bf commandes} de l'outil
+\remitem{elles correspondent à des fonctions internes (en \caml)
+et doivent permettre d'accéder aux différentes fonctionnalités.\\
+Elles pourront être utilisées directement,
+combinées dans des {\it scripts} pour effectuer des opérations
+plus évoluées ou encore servir à construire un protocole de communication avec
+une interface graphique~;}
+\item commandes {\bf d'interrogation}
+\remitem{elles servent à questionner le système.
+Elles ne doivent pas modifier l'état interne de l'outil.
+Même si elles effectuent certains calculs pour répondre,
+et qu'elles stockent ces résultats pour éviter un recalcul ultérieur,
+ceci doit être transparent pour la suite des traitements~;}
+\item commandes dites {\bf d'action}
+\remitem{elles doivent permettent de construire
+le résultat du \slicing. Ces commandes doivent pouvoir s'enchaîner et se
+combiner~;}
+\item l'outil maintient une {\bf liste d'attente} des actions à effectuer.
+Ceci est utile car certains traitements peuvent être décomposés
+en plusieurs actions que l'utilisateur peut ensuite choisir d'appliquer ou non.
+Cela permet d'avoir un contrôle plus fin des calculs~;
+\item le programme résultant ne peut être généré
+que lorsque la liste d'attente est vide~;
+\item les traitements doivent être modulaires~;
+\item chaque fonction du programme source peut~:
+  \begin{itemize}
+  \item ne pas apparaître dans le résultat,
+  \item être simplement copiée dans le résultat,
+  \item correspondre à une ou plusieurs fonctions spécialisées du résultat.
+  \end{itemize}
+\item dans la représentation interne du résultat, les instructions
+sont associées à un marquage qui indique si elles doivent être cachées,
+ou sinon, la raison de leur présence, c'est-à-dire par exemple
+si elles participent au contrôle ou à la valeur d'une donnée sélectionnée, etc.
+
+\item identification d'instructions non significatives (ou superflues)
+\remitem{il s'agit d'être capable de distinguer ce que l'on doit ajouter
+lorsque l'on ne fait pas de spécialisation.
+Prenons par exemple le cas d'un appel $L : f(a,b);$
+où seul $a$ est nécessaire au calcul qui nous intéresse,
+mais que l'on ne souhaite pas spécialiser en $f(a);$.
+Il faudra alors ajouter ce qui permet de calculer $b$ en $L$
+aux instructions sélectionnées,
+mais en préservant l'information qu'elles sont {\it superflues}~;
+}
+
+\item spécialisation du code
+\remitem{il s'agit d'être capable d'effectuer des transformations syntaxiques
+pour réduire le code au maximum. Par exemple, si après une instruction
+\verbtt{y = x++;}, on n'a besoin que de \verbtt{x},
+il faut être capable de décomposer cette instruction
+afin de ne garder que \verbtt{x++;}
+
+Ce type de transformation étant déjà faite en amont du module de \slicing,
+le problème ne se pose plus pour ce type d'instruction,
+mais il existe encore pour la spécialisation des appels de fonction.
+En effet, si une fonction $f$ prend, par exemple,
+deux arguments dont un seul sert à calculer ce qui nous intéresse,
+on veut être capable de construire une fonction $f_1$
+qui ne prend qu'un seul argument,
+et transformer l'appel à $f$ en un appel à $f_1$.
+
+Par ailleurs, on peut également envisager de transformer des
+instructions lorsque l'on connaît la valeur constante d'une variable.
+}
+\end{itemize}
+
+
+\section{Plan des documents}
+
+Ce document présente uniquement les principes de ce qui a été développé.
+Pour plus de détail sur l'implémentation ou les commandes disponibles,
+le lecteur est invité à consulter la documentation du code
+car elle sera toujours plus détaillée et à jour que ce rapport.
+Comme la boîte à outil de \slicing est un greffon de \ppc,
+son interface est définie dans le module \verbtt{Db.Slicing}.
+Par ailleurs, l'introduction de la documentation interne du module
+donne une idée de l'architecture, et donne des points d'entrée.\\
+
+Les principes de calcul des graphes de dépendances
+sur lequel s'appuie le \slicing est présenté dans \cite{ppcPdg}.\\
+
+Le chapitre \ref{sec-filtrage-fct} présente
+la façon dont sont marquées les instructions d'une fonction pour
+effectuer une réduction intraprocédurale.\\
+
+Puis, le chapitre \ref{sec-interproc} expose comment sont organisés les calculs
+pour faire une propagation des réductions à l'ensemble de l'application,
+et comment on se propose de spécialiser les fonctions.\\
+
+Enfin, le chapitre \ref{sec-man} présente comment utiliser le module
+développé et propose donc une vision davantage dédiée à un utilisateur
+potentiel.\\
+
+
+Ce rapport étant un document de travail, il va évoluer au fur et à mesure des
+réalisations~:
+\begin{itemize}
+  \item la version 1.0 du 27 juin 2006 présentait
+les développements en cours concernant les graphe de dépendance
+et le marquage d'une fonction. La présentation des travaux à faire
+pour la gestion d'un \slicing interprocédural était moins détaillée car
+plus prospective. Suivait un chapitre contenant un manuel d'utilisation.
+Enfin, la conclusion présentait l'état courant de l'outil,
+et les perspectives d'évolution.
+\item dans la version 2.0 du 26 juin 2007, la partie sur le graphe de
+  dépendance a été extraite car elle fait l'objet d'un document séparé.
+  Le \slicing interprocédural est cette fois présenté en détail.
+  Les parties issues du document de spécification dont les idées
+  n'ont finalement pas été retenues ont été déplacées en annexe
+  \ref{sec-projets} pour mémoire. La partie sur l'utilisation de l'outil
+  a pour l'instant été conservée, même si elle n'est pas très spécifique à
+  l'utilisation du greffon de \slicing.
+\end{itemize}
+
+Fin 2008, ce document peut être considéré comme stable,
+car même si le développement évolue, il ne s'agit plus de modifier les
+fonctionnalité de bases, mais plutôt d'ajuster des points de détail pour
+améliorer la précision par exemple.
diff --git a/doc/slicing/macros_slicing.tex b/doc/slicing/macros_slicing.tex
new file mode 100644
index 0000000000000000000000000000000000000000..8e6b866c7cb643d377418cad661758f791675109
--- /dev/null
+++ b/doc/slicing/macros_slicing.tex
@@ -0,0 +1,187 @@
+%==============================================================================
+\usepackage{tabularx}
+\usepackage{alltt}
+\usepackage{ulem} %sout
+
+\usepackage{amsmath}
+\usepackage{wasysym}
+\usepackage{stmaryrd}
+\usepackage{listings}
+
+\usepackage[french]{varioref}
+
+%------------------------------------------------------------------------------
+\newcommand{\setenvclass}[2]{}
+
+\usepackage{listings}
+% TODO :
+\lstdefinestyle{clststyle}{}
+\lstnewenvironment{clisting}
+  {
+   \setenvclass{lstlisting}{clisting}
+   \lstset{language=C,
+           style=clststyle,
+           inputencoding=utf8,
+           extendedchars=true,
+           literate={ç}{{\c{c}}}1
+                    {â}{{\^{a}}}1
+                    {à}{{\`{a}}}1
+                    {ê}{{\^{e}}}1
+                    {ë}{{\"{e}}}1
+                    {é}{{\'{e}}}1
+                    {è}{{\`{e}}}1
+                    {ï}{{\"{\i}}}1
+                    {î}{{\^{\i}}}1
+                    {ô}{{\^{o}}}1
+                    {û}{{\^{u}}}1
+                    {ü}{{\"{u}}}1}
+                    }
+  {}
+
+\newcommand{\camlListingInput}[1]{
+  \begin{footnotesize}
+  \lstinputlisting[language=caml,
+                  style=clststyle,
+                  inputencoding=utf8,
+                  extendedchars=true,
+                  literate={ç}{{\c{c}}}1
+                           {â}{{\^{a}}}1
+                           {à}{{\`{a}}}1
+                           {ê}{{\^{e}}}1
+                           {ë}{{\"{e}}}1
+                           {é}{{\'{e}}}1
+                           {è}{{\`{e}}}1
+                           {ï}{{\"{\i}}}1
+                           {î}{{\^{\i}}}1
+                           {ô}{{\^{o}}}1
+                           {û}{{\^{u}}}1
+                           {ü}{{\"{u}}}1]{#1}
+  \end{footnotesize}
+}
+
+%-----------------------------------------------
+% Commandes pour mettre des ref dans l'index :
+\newcommand{\idb}[1]{\textbf{#1}}
+\newcommand{\indextxt}[1]{\index{#1}{\bf #1}}
+\newcommand{\indexdef}[1]{\index{#1|idb}{{\bf #1}}}
+\newcommand{\indextxtdef}[2]{\index{#2|idb}{{\bf #1}}}
+
+%-----------------------------------------------
+% quelques "mots" spéciaux
+\newcommand{\slicing}{{\it slicing}\xspace}
+\newcommand{\slicingb}{{\it slicing\ }}
+           % permet de corriger les cas où \slicing est suivi d'une {
+           % car il semble que xspace gère mal ce cas.
+\newcommand{\caml}{{\sc Ocaml}\xspace}
+\newcommand{\caveat}{{\sc Caveat}\xspace}
+\newcommand{\cil}{{\sc CIL}\xspace}
+\newcommand{\ppc}{{\sc Frama-C}\xspace}
+\newcommand{\from}{{\sc From}\xspace}
+
+\newcommand{\mylet}{\text{\it let }}
+\newcommand{\myin}{\text{\it in }}
+
+\DeclareMathOperator{\Call}{\mathcal{C\mathit{all}}}
+
+\makeatletter
+\newcommand*{\motcle}[3]{%
+  \index{#2!#1}%
+  \expandafter \@ifdefinable \csname #3#1\endcsname {%
+    \global \@namedef{#3#1}{\textit{#1}}%
+    }%
+}
+\makeatother
+
+%------------------------------------------------------------------------------
+\newcommand{\verbtt}[1]{{\small{\tt{#1}}}}
+%------------------------------------------------------------------------------
+% Légende des figures :
+\usepackage[hang,small]{caption}
+\renewcommand{\captionfont}{\it}
+\renewcommand{\captionlabelfont}{\it \bf \small}
+%\renewcommand{\captionlabeldelim}{ : }
+%-----------------------------------------------
+% prend le nom du fichier
+% et éventuellement un facteur d'échelle (1 par défaut)
+\newcommand{\uneimage}[1]{
+    \includegraphics[width=1\textwidth]{#1}
+}
+%--------------------------------
+\newcommand{\labcenterepsfig}[3]{
+  \begin{center}
+  \begin{figure}[hbt]
+    \centering{
+    \leavevmode
+    \uneimage{#1}
+    }
+    \caption{\label{#3} #2}
+  \end{figure}
+  \end{center}
+  }
+%------------------------------------------------------------------------------
+\newenvironment{debutenv}[1]
+  {
+    \vspace{5mm}
+    \begin{footnotesize}
+      \setenvclass{minipage}{myminipage}
+      \noindent\begin{minipage}[t]{\textwidth}
+      \fbox{\bf #1} \hrule
+    \vspace{3mm}
+  }
+  {
+    \end{minipage}
+    \end{footnotesize}
+  }
+\newenvironment{finenv}
+  {
+    \begin{footnotesize}
+      \setenvclass{minipage}{myminipage}
+    \noindent\begin{minipage}[t]{\textwidth}
+  }
+  {
+    \hrule
+    \
+    \end{minipage}
+    \end{footnotesize}
+    \vspace{5mm}
+  }
+\newenvironment{monenv}[1]
+  {\begin{debutenv}{#1}}
+  {\end{debutenv}
+   \par
+   \begin{finenv}
+   \end{finenv}}
+
+\newcounter{numexemple}
+\newcommand{\titreexemple}{%
+  \stepcounter{numexemple}{Exemple \arabic{numexemple}}}
+
+\newenvironment{exemple}
+  {\begin{monenv}{\titreexemple}}
+  {\end{monenv}}
+
+\newenvironment{exemple1}
+  {\begin{debutenv}{\titreexemple}}
+    {\end{debutenv}}
+
+\newenvironment{exemple2}
+  {\begin{finenv}}
+    {\end{finenv}}
+
+\newenvironment{astuce}
+  {\begin{monenv}{Astuce}}
+  {\end{monenv}}
+
+\newenvironment{definition}[1]
+  {\begin{monenv}{Definition (#1)}}
+  {\end{monenv}}
+
+\newenvironment{algo}[1]
+  {\begin{monenv}{Algorithme (#1)}}
+  {\end{monenv}}
+
+\newcounter{numrque}
+\newenvironment{remarque}[1]
+  {\refstepcounter{numrque}{\bf Remarque \arabic{numrque}} :\label{#1}}
+  {}
+%==============================================================================
diff --git a/doc/slicing/main.tex b/doc/slicing/main.tex
new file mode 100644
index 0000000000000000000000000000000000000000..817f8ce0d0b860c0703cf04241a512d877f21582
--- /dev/null
+++ b/doc/slicing/main.tex
@@ -0,0 +1,32 @@
+\documentclass[a4paper,11pt,twoside,openright,web,lang=french]{frama-c-book}
+
+%\usepackage[french]{babel}
+
+\input{macros_slicing.tex}
+\input{./frama-c-affiliation.tex}
+%==============================================================================
+\begin{document}
+
+\coverpage{Slicing --- Documentation technique}
+
+\begin{titlepage}
+\begin{flushleft}
+\includegraphics[height=14mm]{../images/cealistlogo.jpg}
+\end{flushleft}
+\vfill
+\title{Documentation du greffon Slicing}{Conception d'un outil de Slicing}
+\author{Anne Pacalet et Patrick Baudin}
+\begin{tabular}{l}
+  \fcaffiliationfr
+\end{tabular}
+\vfill
+\begin{flushleft}
+  \textcopyright 2006-2020 CEA LIST
+
+\end{flushleft}
+\end{titlepage}
+
+\begin{sloppypar}
+\input{slicing.tex}
+\end{sloppypar}
+\end{document}
diff --git a/doc/slicing/man.tex b/doc/slicing/man.tex
new file mode 100644
index 0000000000000000000000000000000000000000..a07780b7a58de5afc87bec93c8a8baca66816430
--- /dev/null
+++ b/doc/slicing/man.tex
@@ -0,0 +1,120 @@
+\chapter{Utilisation}\label{sec-man}
+
+Dans ce chapitre essaye de présenter quelques bases qui permettent de tester
+la boîte à outil de \slicing à partir de l'interpréteur ou
+d'un fichier de commande.
+Pour l'utilisation de l'interface graphique,
+ se reporter à la documentation correspondante.
+Il est également possible d'exécuter certaines actions élémentaires
+en ligne de commande. Voir les options proposées à l'aide de~:
+\begin{center}
+\verb!bin/toplevel.top --help!
+\end{center}
+
+\section{Utilisation interactive}
+
+Lorsqu'on lance l'outil pour faire du slicing, il faut lui fournir le ou les
+fichiers à analyser, et au minimum l'option \verbtt{-deps}
+qui permet d'effectuer l'analyse de
+dépendances (utiliser \verbtt{--help} pour voir les autres options)~:
+\begin{center}
+\verb!bin/toplevel.top -deps fichier.c!
+\end{center}
+
+On se retrouve alors avec un prompt \verb!#!
+qui signale que l'on est sous un interpréteur \caml.\\
+
+Pour quitter l'interpréteur, il faut utiliser la commande~:
+\begin{center}
+\verb!#quit;;!
+\end{center}
+
+(le \verb!#! n'est pas le prompt, il fait parti de la commande).
+On peut aussi utiliser \verbtt{Ctrl-D}.
+
+\begin{astuce}\label{astuce-ledit}
+Comme tout interpréteur \caml, il n'a pas de capacité d'éditer la ligne de
+commande (pour corriger une faute de frappe par exemple), ni d'historique (pour
+rappeler une commande précédente). Il est donc fortement conseillé, même si ce
+n'est pas indispensable, d'installer
+\indextxt{\verbtt{ledit}}, que l'on peut obtenir à l'adresse~: \\
+\url{ftp://ftp.inria.fr/INRIA/Projects/cristal/Daniel.de\_Rauglaudre/Tools/}.
+Il suffit ensuite de faire précéder le nom de la commande par \verbtt{ledit}, tout
+simplement.
+Faire \verbtt{man ledit} pour avoir plus d'information sur les possibilités de cet
+outil.
+\end{astuce}
+
+Sous l'interpréteur, on peut utiliser n'importe quelle instruction \caml,
+et toutes les commandes spécifiques à l'outil.
+
+Pour ceux qui ne sont pas familier avec \caml,
+pour lancer une commande, il faut taper son nom suivie des arguments,
+ou de parenthèses vide s'il n'y a pas d'arguments, et terminer par deux
+points-virgules.
+
+L'interpréteur affiche le type de retour de la commande
+(\verbtt{unit} correspond au type vide),
+suivi éventuellement de la valeur retournée.
+Dans la plupart des cas, la première information n'intéresse pas l'utilisateur,
+mais cet affichage ne peut pas être désactivé.
+Il peut parfois être utile pour retrouver la signature des commandes<
+par exemple~:
+
+\centerline{\tt module S = Db.Slicing;;}
+
+affiche le type du nouveau module S, et permet donc de voir la liste des
+commandes du module \verbtt{Db.Slicing}.\\
+
+L'organisation de \ppc regroupe toutes les commandes dans le module \verbtt{Db}.
+Le sous-module \verbtt{Db.Slicing} contient les commandes de \slicing.
+Le nom d'une commande doit normalement être préfixé par le nom du
+module a qui elle appartient.
+Pour pouvoir utiliser les noms sans
+préfixe, il faut ouvrir le module à l'aide de~:
+
+\centerline{\tt open Db;;}
+
+On peut aussi choisir de renommer le module pour avoir un préfixe plus court~:
+
+\centerline{\tt module S = Db.Slicing;;}
+
+Des commandes provenant d'autres modules sont également utiles
+dans le cadre de l'utilisation du \slicing.
+\verbtt{Kui}, en particulier,
+fournit des fonctions qui permettent de naviguer dans les
+informations générées par les autres analyseurs.
+
+\section{Fichier de commandes}
+
+Les commandes peuvent être tapées directement, mais on peut également charger
+des fichiers contenant les commandes grâce à la commande \verb!#use "cmds.ml";;!.
+Le contenu du fichier \verbtt{cmds.ml} est alors interprété comme si on l'avait
+tapé, et on reprend la main sous l'interpréteur à l'issue de son exécution.\\
+
+Si l'on veut simplement lancer un fichier de commandes,
+on peut utiliser la redirection Unix.
+L'interpréteur se terminera alors à la rencontre du EOF (fin de fichier).
+
+\begin{astuce}\label{astuce-jnl-ledit}
+En utilisant \verbtt{ledit} (voir l'astuce \vpageref{astuce-ledit})
+on obtient également la possibilité de mémoriser
+l'historique, et d'avoir donc une journalisation des commandes lancées (très
+pratique comme base pour écrire un script, ou pour rejouer une séquence).
+Pour cela, il suffit de taper~:
+
+\centerline{{\tt ledit -h cmds.ml bin/toplevel.top} ... arguments...}
+\end{astuce}
+
+\section{Exemples}
+
+Quelques exemples d'utilisation peuvent être trouvées dans le répertoire de
+test. Les deux fichiers suivant fournissent quelques fonctions qui facilitent
+l'utilisation~:
+\begin{itemize}
+  \item \verbtt{libSelect.ml} propose une interface simplifiée pour des sélections
+    simples,
+  \item \verbtt{libAnim.ml} permet de générer des représentations graphiques du
+    projet à différentes étapes de sa construction afin de visualiser
+    les relations entre les spécialisations.
+\end{itemize}
diff --git a/doc/slicing/projets.tex b/doc/slicing/projets.tex
new file mode 100644
index 0000000000000000000000000000000000000000..dabfdf57a982b47e52d8855a9dca8b8647246019
--- /dev/null
+++ b/doc/slicing/projets.tex
@@ -0,0 +1,335 @@
+\chapter{Projets}\label{sec-projets}
+
+Ce chapitre regroupe diverses idées qui ont été évoquées à un moment ou un
+autre, et qui ont soit été abandonnées, soit remises à plus tard.
+
+\section{Autres critères}
+
+\subsection{Spécifier ce qu'on ne veut plus}
+
+Un autre critère intéressant de \slicing, qui n'apparaît dans aucun papier,
+serait, je pense, de pouvoir spécifier ce que l'on veut enlever.
+Par exemple, {\it "que devient le programme si on ne s'intéresse pas
+à telle sortie ou à tel traitement"}.\\
+
+Par ailleurs, l'analyse de dépendance utilisée pour le \slicing
+peut également être utilisée pour calculer des informations utiles à d'autres
+analyses. On peut par exemple s'intéresser aux variables dont la valeur
+détermine la sortie d'une boucle; ce qui peut être utiliser comme un indice
+sur les élargissements à effectuer dans une interprétation abstraite.
+
+\subsection{Calcul d'une variable globale}
+
+Le premier filtrage global vise à sélectionner les instructions qui
+participent au calcul d'une variable globale donnée.
+Comme on a accès par ailleurs à la liste des sorties de chaque fonction,
+il suffit de générer les filtres permettant de calculer
+cette variable sur chaque fonction l'ayant comme sortie.
+
+\section{Utilisation de la sémantique}
+
+Cette partie regroupe quelques idées d'évolutions pour améliorer le \slicing
+d'une fonction en utilisant la sémantique des instructions.
+Certaines d'entre elles ont été implémentées dans l'outil précédent;
+d'autres ne sont que des pistes qui restent à explorer.
+
+\subsection{Réduction relative à une contrainte}
+
+Dans l'outil précédent, une commande permettait de couper une branche
+en remplaçant le test de la condition de chemin par un {\tt assert}.\\
+
+Plus généralement,
+on s'intéresse ici à une contrainte représentant une assertion dans le code.
+On aimerait déplacer cette contrainte
+afin de déterminer un point où elle est impossible (réduite à {\it false}).
+On pourrait alors {\it couper} alors la branche correspondante.
+
+Le test conditionnel
+permettant d'accéder à cette branche peut être transformé en assertion,
+ou être supprimé (option ?).
+Dans le premier cas, les données utilisées dans le test
+sont visibles alors que dans le second,
+elles peuvent éventuellement être supprimées
+si elles ne servent pas par ailleurs.
+
+On peut aussi ôter les instructions qui ne sont plus utiles.
+La détection de code mort permet par exemple de supprimer les éléments qui
+n'étaient utilisés que dans la branche supprimée.
+
+\begin{exemple}
+Dans la séquence suivante~:
+\begin{center}
+\mbox{\texttt x = c+1; a = 2; if (c) x += a; y = x+1;}
+\end{center}
+
+si on demande à sélectionner les dépendances de \verbtt{y}, puis à supprimer la
+branche \verb!if (c)!, on obtient~:
+\begin{center}
+\mbox{\texttt x = c+1; \sout{a = 2;} {\bf assert (!c);} \sout{x += a;} y = x+1;}
+\end{center}
+
+où l'on voit que l'instruction \verb!a=2;! disparaît puis qu'elle ne sert plus.\\
+
+On verra ci-dessous comment on peut aussi déterminer que \verbtt{x} vaut alors $1$
+à l'aide du calcul de WP, et que donc, \verbtt{y} vaut 2 à l'aide de la
+propagation de constantes.
+\end{exemple}
+
+Le problème général lorsque l'on impose des contraintes,
+c'est qu'elles peuvent aussi influencer les résultats d'autres analyses
+comme l'analyse de valeur. On en verra un cas particulier
+ci-dessous avec la propagation de constante.
+
+%--------------------------------------
+\subsection{Passage à un point de programme}
+
+La contrainte dont nous venons de parler peut également être donnée
+implicitement en spécifiant un point de programme. Il s'agit alors d'être
+capable de supprimer ce qui ne sert pas lorsque l'exécution de la fonction passe
+par ce point. Une telle requête peut par exemple être utilisée dans le cadre
+d'une analyse d'impact.\\
+
+Une première étape peut consister à supprimer les branches incompatibles avec le
+point en ne regardant que la syntaxe.
+
+\begin{exemple}
+Dans la séquence suivante~:
+\begin{center}
+\mbox{\texttt if (c) P: x += a; else y = x+1;}
+\end{center}
+si l'utilisateur souhaite examiner le passage au
+point P, on peut éliminer la branche {\texttt else}~:
+\begin{center}
+\mbox{\texttt {\bf assert (c);} P: x += a; \sout{else y = x+1;}}
+\end{center}
+Attention, ceci n'est vrai que si la séquence n'est pas dans une boucle...
+\end{exemple}
+
+Mais il peut être plus intéressant de calculer une précondition qui assure que
+l'on passe par le point donné, et d'utiliser ce résultat comme une contrainte.\\
+
+\remarque{rem-wp} Attention,
+il faut noter que cette précondition ne peut généralement pas être
+calculée par un simple WP car celui-ci assure qu'une propriété est vraie
+si la fonction est exécutée avec des entrées satisfaisant la précondition,
+mais il n'assure pas qu'il n'y a pas d'autres cas possibles.
+Ceci est du à l'approximation introduite par le calcul de WP des boucles.
+
+%--------------------------------------
+\subsection{Propagation de constantes}
+
+D'autres réductions peuvent être effectuées en exploitant
+les constantes du programme.
+
+\begin{exemple}
+Dans la séquence suivante~:
+\begin{center}
+  \verb!x = c ? 1 : -1; if (x<0) f(x); else g(x); !
+\end{center}
+si l'on étudie cette séquence avec une valeur initiale 0 pour \verbtt{c}
+on aimerait savoir déterminer que :
+\begin{itemize}
+\item \verb!x=-1!,
+\item donc que le second test est vrai,
+\item que donc \verbtt{g} ne sera pas appelé,
+\item et que \verbtt{f} sera appelé dans ce contexte avec la valeur \verb!-1!.\\
+\end{itemize}
+
+On souhaite donc obtenir~:
+\begin{center}
+  \verb!assert (c == 0); x = -1; f(-1); !
+\end{center}
+\end{exemple}
+
+Ce calcul peut facilement être effectué par une analyse de valeur externe,
+mais il faut pouvoir lui transmettre la contrainte (ici~: $c=0;$).\\
+
+
+Dans l'outil précédent, le module de \slicing (FLD) avait été couplé à
+un module de propagation de constante (CST) de la façon suivante~:
+\begin{itemize}
+  \item pour chaque fonction filtrée, on calcule les états CST correspondants,
+  \item si une branche est supprimée à la demande de l'utilisateur,
+    CST en est informé pour réduire l'état,
+  \item si une constante est associée à une donnée,
+    (par exemple lors de la spécialisation d'une fonction avec un paramètre
+constant)
+    CST en est également informé,
+  \item lors du calcul d'une fonction filtrée, pour chaque saut conditionnel,
+    on interroge CST pour savoir si une branche est inaccessible ($\bot$),
+    et si c'est le cas, les éléments correspondant sont marqués $mM$ (code
+    mort),
+  \item pour chaque appel de fonction, si l'on sait déterminer qu'une ou
+    plusieurs entrées sont constantes, on demande la spécialisation de cette
+    fonction,
+  \item pour chaque appel de fonction, si l'on sait déterminer qu'une ou
+    plusieurs sorties sont constantes, on fournit l'information à CST pour qu'il
+    puisse la propager.
+\end{itemize}
+
+\begin{exemple}
+  Reprenons l'exemple précédent où l'on sait que $c=0$ en 1~:
+\begin{center}
+  \verb!/*1*/ x = c ? /*2*/1 : /*3*/-1; /*4*/if (x<0) /*5*/f(x); else /*6*/g(x); !
+\end{center}
+On a donc~:
+\begin{itemize}
+  \item en \verb!/*1*/! : $c=0$,
+  \item en \verb!/*2*/! : $\bot$ puisque le test est faux,
+  \item en \verb!/*4*/! : $x=-1$,
+  \item en \verb!/*5*/! : toujours $x=-1$,
+  \item en \verb!/*6*/! : $\bot$ puisque le test est toujours vrai,
+\end{itemize}
+Cette séquence est donc réduite à~:
+\begin{alltt}
+  x = \sout{ c ? 1 : } -1; \sout{ if (x>0)} f\_1(x); \sout{ else  g(x); }
+\end{alltt}
+où \verbtt{f\_1} est la fonction \verbtt{f} spécialisée avec son entrée à -1.\\
+\end{exemple}
+
+Quand l'analyse permet de déterminer la valeur précise d'une variable,
+il peut également être intéressant d'utiliser cette information pour effectuer
+une transformation de programme juste avant de produire le résultat.
+On ne peut pas vraiment le faire avant, car on peut être amené à regrouper
+plusieurs fonctions où la valeur peut être différente.\\
+
+
+L'implémentation des points suivants n'a pas été fait dans l'outil précédent,
+et il faudrait donc voir s'il est possible de les intégrer
+dans le nouveau~:
+  \begin{itemize}
+    \item supprimer l'argument correspondant à une entrée constante.
+En effet, lors du calcul de la fonction spécialisée, on ne savait
+pas supprimer l'argument correspondant,
+mais on propageait tout de même la valeur pour supprimer les éventuelles
+branchesmortes. 
+\begin{exemple}
+Dans l'exemple précédent,
+on peut spécialiser \verbtt{f} en \verbtt{f\_1} car on sait que $x=-1$.
+\begin{tabular}{ccl}
+Mais on aimerait aussi transformer &:& \verb! void f_1 (int x) { ... }!\\
+en &:& \verb! void f_1 (void) { int x = -1; ... }!
+\end{tabular}
+\end{exemple}
+\item supprimer le calcul d'une condition de \verbtt{if} toujours vraie quand il
+  n'y a pas de \verbtt{else}. Cela n'avait pas été fait car dans
+le module de propagation de constante,
+il n'y avait pas de point de programme correspondant à la branche
+\verbtt{else} manquante. L'état $\bot$ qui lui aurait été
+ associé n'était donc pas là pour permettre cette suppression.
+
+  \end{itemize}
+
+%--------------------------------------
+\subsection{Utilisation de WP}
+
+Comme on l'a vu, la propagation de constante peut permettre de
+spécialiser les fonctions et de couper des branches de programme.
+
+Ce type calcul s'effectue a priori par propagation avant. 
+Pour faire de la propagation arrière, 
+nous aimerions utiliser un calcul de WP.
+
+Le principe d'utilisation serait le suivant~:
+
+\begin{exemple1}
+  L'utilisateur s'intéresse uniquement à la branche {\it then} du {\it if}.
+  On introduit donc l'assertion $y<0$~:\\
+
+\begin{center}
+\begin{footnotesize}
+\begin{tabular}{|p{5cm}|p{5cm}|}
+  \hline
+Programme source & coupure de branche \\
+  \hline
+\begin{verbatim}
+int f (int c, int x) {
+
+  int y = c ?  1 : -1;
+  if (y < 0) {
+    int z = y - 1;
+    g (z);
+    return z + x;
+    }
+  else
+    return 0;
+}
+\end{verbatim}
+&
+\begin{alltt}
+int f (int c, int x) \{
+
+  int y = c ?  1 : -1;
+ {\bf assert (y < 0); }\{
+  int z = y - 1;
+  g (z);
+  return z + x;
+  \}
+
+
+\}
+\end{alltt}
+\\
+\hline
+\end{tabular}
+\end{footnotesize}
+\end{center}
+\end{exemple1}
+\begin{exemple2}
+\begin{center}
+\begin{footnotesize}
+\begin{tabular}{|p{5cm}|p{5cm}|}
+\hline
+WP & Propagation de constante \\
+\hline
+\begin{alltt}
+int f (int c, int x) \{
+ {\bf /* (c == 0); */ }
+  int y = c ?  1 : -1;
+  assert (y < 0); \{
+    int z = y - 1;
+    g (z);
+    return z + x;
+  \}
+
+\}
+\end{alltt}
+&
+\begin{alltt}
+int f (int c, int x) \{
+  /* (c == 0);  */
+  int y = {\bf /* 0 ?  1 : */} -1;
+  assert ({\bf -1} < 0); \{
+    int z = {\bf -1} - 1;
+    g ({\bf -2});
+    return {\bf -2} + x;
+  \}
+
+\}
+\end{alltt}
+\\
+\hline
+\end{tabular}
+\end{footnotesize}
+\end{center}
+
+Sur cet exemple, l'utilisation du WP permet de déterminer que $c$ vaut 0,
+et qu'il est alors possible de propager cette constante.\\
+
+\end{exemple2}
+
+
+La principale difficulté de l'utilisation d'un tel calcul est le pilotage des
+opérations.
+
+Le plus simple est de laisser l'utilisateur contrôler la propagation
+en utilisant des commandes interactives.
+
+L'idée est de lui permettre de donner une contrainte,
+de la remonter à l'aide de WP, et d'en déduire d'autres propriétés,
+utilisable par exemple par l'analyse de valeur.\\
+
+Attention, ici encore, comme dans la remarque \vref{rem-wp},
+il faudra préalablement
+s'assurer que l'approximation introduite par le WP des boucles est
+bien dans le bon sens relativement à ce que l'on souhaite obtenir...
diff --git a/doc/slicing/propagation.fig b/doc/slicing/propagation.fig
new file mode 100644
index 0000000000000000000000000000000000000000..512154ae8aa67a221b98d4d19c31b84c7ff9e7ae
--- /dev/null
+++ b/doc/slicing/propagation.fig
@@ -0,0 +1,100 @@
+#FIG 3.2
+Landscape
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+0 32 #ff9902
+0 33 #caa671
+0 34 #ff77ff
+0 35 #000000
+5 1 0 1 0 7 75 -1 -1 0.000 0 1 1 0 1366.500 -412.500 990 1080 1440 1125 1890 1035
+	2 1 1.00 60.00 120.00
+5 1 0 1 0 7 75 -1 -1 0.000 0 0 1 0 2002.500 1552.500 1935 2025 1530 1620 1935 1080
+	2 1 1.00 60.00 120.00
+5 1 0 1 0 7 75 -1 -1 0.000 0 1 1 0 1957.500 922.500 2025 1080 2115 990 2025 765
+	2 1 1.00 60.00 120.00
+5 1 0 1 0 7 75 -1 -1 0.000 0 1 1 0 3505.500 2272.500 3645 2610 3870 2250 3645 1935
+	2 1 1.00 60.00 120.00
+6 1305 1125 1575 1440
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 1440 1282 90 112 1350 1282 1530 1282
+4 0 0 75 -1 18 14 0.0000 4 150 120 1395 1350 2\001
+-6
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 1303 2362 90 112 1213 2362 1393 2362
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 3103 2137 90 112 3013 2137 3193 2137
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 3015 675 90 112 2925 675 3105 675
+2 4 0 1 0 7 100 -1 -1 0.000 0 0 7 0 0 5
+	 4770 2880 0 2880 0 0 4770 0 4770 2880
+2 1 0 1 0 7 80 -1 20 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 990 2250 1890 2250
+2 3 0 1 0 7 75 -1 20 0.000 0 0 -1 0 0 4
+	 1971 1872 1971 1962 2061 1917 1971 1872
+2 3 0 1 0 7 75 -1 20 0.000 0 0 -1 0 0 4
+	 2025 2565 1935 2610 2025 2655 2025 2565
+2 3 0 1 0 7 75 -1 20 0.000 0 0 -1 0 0 4
+	 2025 2475 1935 2520 2025 2565 2025 2475
+2 1 0 1 0 7 80 -1 20 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 2610 2250 3510 2250
+2 1 0 1 0 7 75 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 2070 495 2070 225
+2 3 0 1 0 7 50 -1 0 0.000 0 0 7 0 0 4
+	 1971 1962 1971 2052 2061 2007 1971 1962
+2 3 0 1 0 7 75 -1 20 0.000 0 0 -1 0 0 4
+	 3645 2475 3555 2520 3645 2565 3645 2475
+2 3 0 1 0 7 75 -1 20 0.000 0 0 -1 0 0 4
+	 2025 630 1935 675 2025 720 2025 630
+2 3 0 1 0 7 75 -1 20 0.000 0 0 -1 0 0 4
+	 2025 1125 1935 1170 2025 1215 2025 1125
+2 3 0 1 0 7 75 -1 20 0.000 0 0 -1 0 0 4
+	 1935 945 1935 1035 2025 990 1935 945
+2 3 0 1 0 7 75 -1 20 0.000 0 0 -1 0 0 4
+	 2025 1215 1935 1260 2025 1305 2025 1215
+2 3 0 1 0 7 50 -1 0 0.000 0 0 7 0 0 4
+	 3555 1962 3555 2052 3645 2007 3555 1962
+2 3 0 1 0 7 50 -1 0 0.000 0 0 7 0 0 4
+	 3555 1872 3555 1962 3645 1917 3555 1872
+2 3 0 1 0 7 50 -1 0 0.000 0 0 7 0 0 4
+	 3645 2565 3555 2610 3645 2655 3645 2565
+2 3 0 1 0 7 50 -1 0 0.000 0 0 7 0 0 4
+	 1935 450 1935 540 2025 495 1935 450
+2 3 0 1 0 7 50 -1 0 0.000 0 0 7 0 0 4
+	 1935 540 1935 630 2025 585 1935 540
+2 3 0 1 0 7 50 -1 0 0.000 0 0 7 0 0 4
+	 2025 720 1935 765 2025 810 2025 720
+2 3 0 1 0 7 50 -1 0 0.000 0 0 7 0 0 4
+	 1935 1035 1935 1125 2025 1080 1935 1035
+2 4 0 1 0 7 80 -1 18 0.000 0 0 7 0 0 5
+	 2610 2700 1890 2700 1890 1800 2610 1800 2610 2700
+2 4 0 1 0 7 90 -1 18 0.000 0 0 7 0 0 5
+	 2610 1350 1890 1350 1890 270 2610 270 2610 1350
+2 4 0 1 0 7 80 -1 15 0.000 0 0 7 0 0 5
+	 4230 2700 3510 2700 3510 1800 4230 1800 4230 2700
+2 4 0 1 0 7 50 -1 10 0.000 0 0 7 0 0 5
+	 990 2700 270 2700 270 1800 990 1800 990 2700
+2 4 0 1 0 7 50 -1 10 0.000 0 0 7 0 0 5
+	 990 1350 270 1350 270 270 990 270 990 1350
+3 2 0 1 0 7 75 -1 -1 0.000 0 0 0 3
+	 3555 1935 3015 810 2025 495
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 75 -1 -1 0.000 0 1 0 4
+	2 1 1.00 60.00 120.00
+	 2070 765 2700 1170 3060 2250 3555 2610
+	 0.000 -1.000 -1.000 0.000
+4 0 0 40 -1 18 12 0.0000 4 135 75 540 225 f\001
+4 0 0 40 -1 18 12 0.0000 4 180 345 450 1080 g();\001
+4 0 0 40 -1 18 12 0.0000 4 150 105 540 1710 g\001
+4 0 0 40 -1 18 12 0.0000 4 180 315 2070 1710 g_1\001
+4 0 0 40 -1 18 12 0.0000 4 180 285 2070 180 f_1\001
+4 0 0 89 -1 18 12 0.0000 4 180 555 2070 675 g_2();\001
+4 0 0 89 -1 18 12 0.0000 4 180 555 2070 1215 g_1();\001
+4 0 0 40 -1 18 12 0.0000 4 180 345 450 720 g();\001
+4 0 0 40 -1 18 12 0.0000 4 180 315 3690 1710 g_2\001
+4 0 0 75 -1 18 14 0.0000 4 150 120 1260 2430 1\001
+4 0 0 75 -1 18 14 0.0000 4 150 120 3060 2205 3\001
+4 0 0 75 -1 18 14 0.0000 4 150 120 2970 765 4\001
diff --git a/doc/slicing/slicing.tex b/doc/slicing/slicing.tex
new file mode 100644
index 0000000000000000000000000000000000000000..451b46fef43b3658a22e01569bc75cea49c135ca
--- /dev/null
+++ b/doc/slicing/slicing.tex
@@ -0,0 +1,79 @@
+%===============================================================================
+% Versions
+\section*{Versions}
+
+\begin{small}
+Seules les versions Vx.0 sont des documents achevés~;
+les autres sont à considérer comme des brouillons.
+
+\begin{enumerate}
+  \item[V4.0 -] 2 novembre 2020~:
+    \begin{itemize}
+    \item Document sous licence Creative Commons
+      ``Attribution-ShareAlike 4.0 International''
+      \url{https://creativecommons.org/licenses/by/4.0/}.
+    \end{itemize}
+  \item[V3.0 - ] 3 décembre 2008~:
+    \begin{itemize}
+      \item corrections mineures,
+      \item ajouts sur le \slicing des déclarations globales,
+      \item ajouts de la gestion des annotations.
+    \end{itemize}
+  \item[V2.0 - ] 26 juin 2007~:
+    \begin{itemize}
+      \item extraction de la documentation du PDG,
+      \item mise à jour vis à vis de l'état de l'outil,
+      \item fusion de la documentation sur l'interprocédural,
+      \item réorganisation de la partie sur l'interprocédural,
+      \item mise en annexe des projets non implémentés.
+    \end{itemize}
+  \item[V1.0 - ] 27 juin 2006~:
+    \begin{itemize}
+      \item ajout de la présentation du document,
+      \item ajout du chapitre "Utilisation" (manuel),
+      \item développement du calcul de certains ensembles sur les graphes de
+            dépendances,
+      \item mise à jour du chapitre sur l'interprocédural,
+      \item ajout d'une conclusion résumant l'état d'avancement des travaux.
+    \end{itemize}
+  \item[V0.2 - ] 27 avril 2006~:
+    \begin{itemize}
+      \item réorganisation de la définition des ensembles d'instructions,
+      \item corrections diverses.
+    \end{itemize}
+  \item[V0.1 - ] 22 février 2006~:
+    \begin{itemize}
+      \item bibliographie sur le \slicing,
+      \item analyse du document \cite{baudinImpact},
+      \item ce qu'on prévoit de faire,
+      \item premiers éléments sur la construction de graphe de dépendances,
+      \item intégration et tri des fichiers de l'ancien document (FLD),
+      \item algorithme de calcul des dépendances de contrôle.
+    \end{itemize}
+\end{enumerate}
+\end{small}
+%-------------------------------------------------------------------------------
+% Table des matières
+\cleardoublepage
+\tableofcontents
+%===============================================================================
+\cleardoublepage\input{intro.tex}
+\cleardoublepage\input{fonction.tex}
+\cleardoublepage\input{interproc.tex}
+\cleardoublepage\input{man.tex}
+\cleardoublepage\input{conclusion.tex}
+%===============================================================================
+\appendix
+%--------------------------------------
+\cleardoublepage \input{algo.tex}
+\cleardoublepage \input{interexples.tex}
+\cleardoublepage \input{intercmds.tex}
+\cleardoublepage \input{projets.tex}
+%-------------------------------------------------------------------------------
+\cleardoublepage
+\bibliographystyle{abbrvnat}
+\bibliography{bib-slicing}
+%--------------------------------------
+\cleardoublepage
+\printindex
+%===============================================================================
diff --git a/doc/training/developer/annotations.tex b/doc/training/developer/annotations.tex
index e2ae5aab3057b692d43978d7e18b249a3d23671b..7d412db1a0226c684eac5fbc45ad8e933eafa6b8 100644
--- a/doc/training/developer/annotations.tex
+++ b/doc/training/developer/annotations.tex
@@ -95,8 +95,8 @@ let _ = object
   method vcode_annot =
     let ppts = 
       Property.ip_of_code_annot 
-        (Extlib.the self#current_kf)
-        (Extlib.the self#current_stmt)
+        (Option.get self#current_kf)
+        (Option.get self#current_stmt)
     in
     Pretty_utils.pp_list "%a" 
       Property.pretty ppts;    
diff --git a/doc/training/developer/project.tex b/doc/training/developer/project.tex
index 715f8361c58345aa08b289ac2e78aec428389735..98e08c503c07304da355bff6274bb29fbcde8398 100644
--- a/doc/training/developer/project.tex
+++ b/doc/training/developer/project.tex
@@ -146,7 +146,7 @@ let _ = object (self)
            _args, 
            _loc) ->
       My_callstack.set
-        ((Extlib.the self#current_stmt, 
+        ((Option.get self#current_stmt,
           Globals.Functions.get v)
         :: (My_callstack.get ()));
       Cil.SkipChildren
diff --git a/doc/userman/.gitignore b/doc/userman/.gitignore
index 123e8688a45628ae0ed64486b4c7558e200633ed..f7fe0b371139f1dac67e7449fabe7c0b52a17614 100644
--- a/doc/userman/.gitignore
+++ b/doc/userman/.gitignore
@@ -2,6 +2,7 @@ frama-c-book.cls
 frama-c-cover.pdf
 frama-c-left.pdf
 frama-c-right.pdf
+frama-c-affiliation.tex
 userman.idx
 userman.out
 userman.pdf
diff --git a/doc/userman/user-analysis.tex b/doc/userman/user-analysis.tex
index 926fc9eecd7aba7b21d073d120f60b8fa075ed65..0ee7a66928adad3177a44f2e64231171ccb0320a 100644
--- a/doc/userman/user-analysis.tex
+++ b/doc/userman/user-analysis.tex
@@ -107,8 +107,8 @@ first warning triggered by the kernel.
 
 The two following options modify the behavior of output messages:
 \begin{description}
-\item[\optiondef{-}{add-symbolic-path}] takes a list of the form $name_1:path_1,
-  \dots, name_n:path_n$ in argument and replaces each $path_i$ by $name_i$ when
+\item[\optiondef{-}{add-symbolic-path}] takes a list of the form $path_1:name_1,
+  \dots, path_n:name_n$ in argument and replaces each $path_i$ with $name_i$ when
   displaying file locations in messages.
 \item[\optiondef{-}{permissive}] performs less verification on validity of
   command-line options.
diff --git a/doc/userman/user-changes.tex b/doc/userman/user-changes.tex
index c2d128136851bdda4d32c1a012e7dd380691b341..77cd9c6fca0f9e0201596b5970f01344153804cd 100644
--- a/doc/userman/user-changes.tex
+++ b/doc/userman/user-changes.tex
@@ -3,7 +3,12 @@
 This chapter summarizes the changes in this documentation between each \FramaC
 release. First we list changes of the last release.
 
-\section*{\nextframacversion}
+\begin{itemize}
+\item \textbf{Platform-wide Analysis Option:} swap argument order of
+  \texttt{-add-symbolic-path} (now uses \texttt{path:name}).
+\end{itemize}
+
+\section*{22.0 (Titanium)}
 
 \begin{itemize}
 \item \textbf{Getting Started:} added option
diff --git a/doc/userman/userman.tex b/doc/userman/userman.tex
index 14e4cb255bb86c581c303c71df2b53a06afb9918..f78664bfc948f7e5908c1149f94756b2e8560e2b 100644
--- a/doc/userman/userman.tex
+++ b/doc/userman/userman.tex
@@ -5,6 +5,7 @@
 \usepackage{calc}
 
 \include{macros}
+\input{./frama-c-affiliation.tex}
 
 \makeindex
 
@@ -22,7 +23,7 @@
   Maroneze, Virgile Prevosto, Armand Puccetti, Julien Signoles and Boris
   Yakobowski}
 \begin{tabular}{l}
-CEA LIST, Software Safety Laboratory, Saclay, F-91191 \\
+  \fcaffiliationen
 \end{tabular}
 \vfill
 \begin{flushleft}
diff --git a/doc/value/.gitignore b/doc/value/.gitignore
index 99df3ceaf82a7b06d45a948914548ee6eb87bfad..a15bb914b73364a99358ebb658fc07b6832ca571 100644
--- a/doc/value/.gitignore
+++ b/doc/value/.gitignore
@@ -2,5 +2,6 @@
 /frama-c-cover.pdf
 /frama-c-left.pdf
 /frama-c-right.pdf
+/frama-c-affiliation.tex
 /main.pdf
 
diff --git a/doc/value/examples/parametrizing/makefile b/doc/value/examples/parametrizing/makefile
index 3a3b2ee42d80ae0d87a40f96084430b9f73e4d01..70b98e3bff9a22dafaa225d3ba5db832b6a450fb 100644
--- a/doc/value/examples/parametrizing/makefile
+++ b/doc/value/examples/parametrizing/makefile
@@ -29,13 +29,13 @@ clean:
 
 %.log: SOURCE = $(word 1,$(subst ., ,$*)).c
 $(TARGETS) : %.log: $$(SOURCE) $(FRAMAC) $(MAKEFILE_LIST)
-	$(FRAMAC) $(FCFLAGS) -val $< > $@
+	$(FRAMAC) $(FCFLAGS) -eva $< > $@
 
 global-initial-values.log: FCFLAGS += -lib-entry
 context-depth%.log: FCFLAGS += -lib-entry
-context-depth.2.log: FCFLAGS += -context-width 1 -context-depth 1
-context-depth.3.log: FCFLAGS += -context-width 1 -context-depth 1 -context-valid-pointers
-slevel.1.log: FCFLAGS += -slevel 55
-slevel.2.log: FCFLAGS += -slevel 28
-ilevel.2.log: FCFLAGS += -val-ilevel 16
+context-depth.2.log: FCFLAGS += -eva-context-width 1 -eva-context-depth 1
+context-depth.3.log: FCFLAGS += -eva-context-width 1 -eva-context-depth 1 -eva-context-valid-pointers
+slevel.1.log: FCFLAGS += -eva-slevel 55
+slevel.2.log: FCFLAGS += -eva-slevel 28
+ilevel.2.log: FCFLAGS += -eva-ilevel 16
 split-fabs.log: FCFLAGS += -eva-domains equality
diff --git a/doc/value/main.tex b/doc/value/main.tex
index 73eabe27d0a04b4fff6431e8c30cd12d9764ebe2..a1e9c8363d968adcd504324032e94b471bb1bc52 100644
--- a/doc/value/main.tex
+++ b/doc/value/main.tex
@@ -35,6 +35,8 @@
 
 \newcommand{\Eva}{\textsf{Eva}}
 
+\input{./frama-c-affiliation.tex}
+
 \lstset{literate=%
 {∈}{{$\in$ }}1
 }
@@ -70,7 +72,7 @@
   With Matthieu Lemerre, André Maroneze,
   Valentin Perrelle and Virgile Prevosto}
 \begin{tabular}{l}
-CEA LIST, Software Reliability Laboratory, Saclay, F-91191 \\
+  \fcaffiliationen
 \end{tabular}
 \vfill
 \begin{flushleft}
diff --git a/headers/header_spec.txt b/headers/header_spec.txt
index 27b6beac5547cd0d203f912d37adb9724f172e37..d1b383e76b2d8a39234b67339deb1984c7ad12b3 100644
--- a/headers/header_spec.txt
+++ b/headers/header_spec.txt
@@ -41,6 +41,7 @@ bin/migration_scripts/sodium2magnesium.sh: CEA_LGPL
 bin/migration_scripts/sulfur2chlorine.sh: CEA_LGPL
 bin/migration_scripts/chlorine2argon.sh: CEA_LGPL
 bin/migration_scripts/potassium2calcium.sh: CEA_LGPL
+bin/migration_scripts/titanium2vanadium.sh: CEA_LGPL
 bin/sed_get_binutils_version: .ignore
 bin/sed_get_make_major: .ignore
 bin/sed_get_make_minor: .ignore
@@ -135,6 +136,7 @@ share/analysis-scripts/results_display.py: .ignore
 share/analysis-scripts/summary.py: .ignore
 share/analysis-scripts/template.mk: .ignore
 share/compliance/c11_functions.json: .ignore
+share/compliance/c11_headers.json: .ignore
 share/compliance/glibc_functions.json: .ignore
 share/compliance/nonstandard_identifiers.json: .ignore
 share/compliance/posix_identifiers.json: .ignore
@@ -371,7 +373,6 @@ src/kernel_internals/runtime/dump_config.ml: CEA_LGPL
 src/kernel_internals/runtime/dump_config.mli: CEA_LGPL
 src/kernel_internals/runtime/fc_config.ml.in: CEA_LGPL
 src/kernel_internals/runtime/fc_config.mli: CEA_LGPL
-src/kernel_internals/runtime/frama_c_config.ml.in: CEA_LGPL
 src/kernel_internals/runtime/frama_c_init.ml: CEA_LGPL
 src/kernel_internals/runtime/frama_c_init.mli: CEA_LGPL
 src/kernel_internals/runtime/gui_init.ml: CEA_LGPL
@@ -542,6 +543,8 @@ src/kernel_services/ast_queries/ast_info.ml: CEA_LGPL
 src/kernel_services/ast_queries/ast_info.mli: CEA_LGPL
 src/kernel_services/ast_queries/cil.ml: CIL
 src/kernel_services/ast_queries/cil.mli: CIL
+src/kernel_services/ast_queries/cil_builtins.ml: CIL
+src/kernel_services/ast_queries/cil_builtins.mli: CIL
 src/kernel_services/ast_queries/cil_const.ml: CIL
 src/kernel_services/ast_queries/cil_const.mli: CIL
 src/kernel_services/ast_queries/cil_datatype.ml: CEA_LGPL
@@ -714,6 +717,10 @@ src/plugins/aorai/VERSIONS.txt: .ignore
 src/plugins/aorai/YA.README: .ignore
 src/plugins/aorai/aorai_dataflow.ml: AORAI_LGPL
 src/plugins/aorai/aorai_dataflow.mli: AORAI_LGPL
+src/plugins/aorai/aorai_graph.ml: AORAI_LGPL
+src/plugins/aorai/aorai_graph.mli: AORAI_LGPL
+src/plugins/aorai/aorai_metavariables.ml: AORAI_LGPL
+src/plugins/aorai/aorai_metavariables.mli: AORAI_LGPL
 src/plugins/aorai/aorai_option.ml: AORAI_LGPL
 src/plugins/aorai/aorai_option.mli: AORAI_LGPL
 src/plugins/aorai/aorai_register.ml: AORAI_LGPL
@@ -747,7 +754,7 @@ src/plugins/callgraph/Callgraph.mli: CEA_LGPL_OR_PROPRIETARY
 src/plugins/callgraph/callgraph_api.mli: CEA_LGPL_OR_PROPRIETARY
 src/plugins/callgraph/cg.ml: CEA_LGPL_OR_PROPRIETARY
 src/plugins/callgraph/cg.mli: CEA_LGPL_OR_PROPRIETARY
-src/plugins/callgraph/cg_viewer.ml: CEA_LGPL_OR_PROPRIETARY
+src/plugins/callgraph/cg_viewer.yes.ml: CEA_LGPL_OR_PROPRIETARY
 src/plugins/callgraph/journalize.ml: CEA_LGPL_OR_PROPRIETARY
 src/plugins/callgraph/journalize.mli: CEA_LGPL_OR_PROPRIETARY
 src/plugins/callgraph/options.ml: CEA_LGPL_OR_PROPRIETARY
@@ -806,7 +813,7 @@ src/plugins/gui/analyses_manager.ml: CEA_LGPL_OR_PROPRIETARY
 src/plugins/gui/analyses_manager.mli: CEA_LGPL_OR_PROPRIETARY
 src/plugins/gui/book_manager.ml: CEA_LGPL_OR_PROPRIETARY
 src/plugins/gui/book_manager.mli: CEA_LGPL_OR_PROPRIETARY
-src/plugins/gui/debug_manager.ml: CEA_LGPL_OR_PROPRIETARY
+src/plugins/gui/debug_manager.yes.ml: CEA_LGPL_OR_PROPRIETARY
 src/plugins/gui/debug_manager.mli: CEA_LGPL_OR_PROPRIETARY
 src/plugins/gui/design.ml: CEA_LGPL_OR_PROPRIETARY
 src/plugins/gui/design.mli: CEA_LGPL_OR_PROPRIETARY
@@ -908,9 +915,10 @@ src/plugins/loop_analysis/region_analysis_stmt.mli: CEA_LGPL_OR_PROPRIETARY
 src/plugins/loop_analysis/register.ml: CEA_LGPL_OR_PROPRIETARY
 src/plugins/loop_analysis/slevel_analysis.ml: CEA_LGPL_OR_PROPRIETARY
 src/plugins/markdown-report/configure.ac: CEA_LGPL
-src/plugins/markdown-report/eva_coverage.ml: CEA_LGPL
-src/plugins/markdown-report/eva_coverage.mli: CEA_LGPL
+src/plugins/markdown-report/eva_info.ml: CEA_LGPL
+src/plugins/markdown-report/eva_info.mli: CEA_LGPL
 src/plugins/markdown-report/Makefile.in: CEA_LGPL
+src/plugins/markdown-report/META.in: .ignore
 src/plugins/markdown-report/md_gen.ml: CEA_LGPL
 src/plugins/markdown-report/md_gen.mli: CEA_LGPL
 src/plugins/markdown-report/mdr_params.ml: CEA_LGPL
@@ -1204,6 +1212,8 @@ src/plugins/studia/reads.ml: CEA_LGPL_OR_PROPRIETARY
 src/plugins/studia/reads.mli: CEA_LGPL_OR_PROPRIETARY
 src/plugins/studia/studia_gui.ml: CEA_LGPL_OR_PROPRIETARY
 src/plugins/studia/studia_gui.mli: CEA_LGPL_OR_PROPRIETARY
+src/plugins/studia/studia_request.ml: CEA_LGPL_OR_PROPRIETARY
+src/plugins/studia/studia_request.mli: CEA_LGPL_OR_PROPRIETARY
 src/plugins/studia/Studia.mli: CEA_LGPL_OR_PROPRIETARY
 src/plugins/studia/writes.ml: CEA_LGPL_OR_PROPRIETARY
 src/plugins/studia/writes.mli: CEA_LGPL_OR_PROPRIETARY
@@ -1450,12 +1460,16 @@ src/plugins/variadic/generic.ml: CEA_LGPL_OR_PROPRIETARY
 src/plugins/variadic/options.ml: CEA_LGPL_OR_PROPRIETARY
 src/plugins/variadic/options.mli: CEA_LGPL_OR_PROPRIETARY
 src/plugins/variadic/register.ml: CEA_LGPL_OR_PROPRIETARY
+src/plugins/variadic/replacements.mli: CEA_LGPL_OR_PROPRIETARY
+src/plugins/variadic/replacements.ml: CEA_LGPL_OR_PROPRIETARY
 src/plugins/variadic/standard.ml: CEA_LGPL_OR_PROPRIETARY
 src/plugins/variadic/translate.ml: CEA_LGPL_OR_PROPRIETARY
 src/plugins/variadic/va_build.ml: CEA_LGPL_OR_PROPRIETARY
 src/plugins/variadic/va_types.mli: CEA_LGPL_OR_PROPRIETARY
 src/plugins/wp/.gitignore: .ignore
 src/plugins/wp/.ocp-indent: .ignore
+src/plugins/wp/AssignsCompleteness.ml: CEA_WP
+src/plugins/wp/AssignsCompleteness.mli: CEA_WP
 src/plugins/wp/Auto.ml: CEA_WP
 src/plugins/wp/Auto.mli: CEA_WP
 src/plugins/wp/Cache.ml: CEA_WP
@@ -1607,6 +1621,8 @@ src/plugins/wp/TacBitwised.ml: CEA_WP
 src/plugins/wp/TacBitwised.mli: CEA_WP
 src/plugins/wp/TacBitrange.ml: CEA_WP
 src/plugins/wp/TacBitrange.mli: CEA_WP
+src/plugins/wp/TacBittest.ml: CEA_WP
+src/plugins/wp/TacBittest.mli: CEA_WP
 src/plugins/wp/TacChoice.ml: CEA_WP
 src/plugins/wp/TacChoice.mli: CEA_WP
 src/plugins/wp/TacCongruence.ml: CEA_WP
@@ -1619,6 +1635,8 @@ src/plugins/wp/TacFilter.ml: CEA_WP
 src/plugins/wp/TacFilter.mli: CEA_WP
 src/plugins/wp/TacHavoc.ml: CEA_WP
 src/plugins/wp/TacHavoc.mli: CEA_WP
+src/plugins/wp/TacInduction.ml: CEA_WP
+src/plugins/wp/TacInduction.mli: CEA_WP
 src/plugins/wp/TacInstance.ml: CEA_WP
 src/plugins/wp/TacInstance.mli: CEA_WP
 src/plugins/wp/TacLemma.ml: CEA_WP
@@ -1631,6 +1649,8 @@ src/plugins/wp/TacRange.ml: CEA_WP
 src/plugins/wp/TacRange.mli: CEA_WP
 src/plugins/wp/TacRewrite.ml: CEA_WP
 src/plugins/wp/TacRewrite.mli: CEA_WP
+src/plugins/wp/TacSequence.ml: CEA_WP
+src/plugins/wp/TacSequence.mli: CEA_WP
 src/plugins/wp/TacShift.ml: CEA_WP
 src/plugins/wp/TacShift.mli: CEA_WP
 src/plugins/wp/TacSplit.ml: CEA_WP
@@ -1675,7 +1695,6 @@ src/plugins/wp/doc/coqdoc/typed_generated.tex: .ignore
 src/plugins/wp/doc/coqdoc/wpcoq.tex: .ignore
 src/plugins/wp/doc/manual/.gitignore: .ignore
 src/plugins/wp/doc/manual/Makefile: .ignore
-src/plugins/wp/doc/manual/cealistlogo.jpg: .ignore
 src/plugins/wp/doc/manual/mem.pdf: .ignore
 src/plugins/wp/doc/manual/size_base.pdf: .ignore
 src/plugins/wp/doc/manual/size_compl.pdf: .ignore
@@ -1812,6 +1831,8 @@ src/plugins/wp/wpRTE.ml: CEA_WP
 src/plugins/wp/wpRTE.mli: CEA_WP
 src/plugins/wp/wpStrategy.ml: CEA_WP
 src/plugins/wp/wpStrategy.mli: CEA_WP
+src/plugins/wp/wpTarget.ml: CEA_WP
+src/plugins/wp/wpTarget.mli: CEA_WP
 src/plugins/wp/wp_error.ml: CEA_WP
 src/plugins/wp/wp_error.mli: CEA_WP
 src/plugins/wp/wp_parameters.ml: CEA_WP
diff --git a/ivette/.eslintrc.js b/ivette/.eslintrc.js
index 3e4065c048a1906f5bb0b4f990ee3f72b52ff56c..322375d876f3c51d95ac3358b423fc19b4f04e30 100644
--- a/ivette/.eslintrc.js
+++ b/ivette/.eslintrc.js
@@ -17,13 +17,15 @@ module.exports = {
   },
   settings: {
     // Electron is in devDependencies because of its special build system
-    "import/core-modules": [ "electron" ]
+    "import/core-modules": [ 'electron', 'react-hot-loader' ]
   },
   rules: {
     // Do not enforce a displayName
     "react/display-name": "off",
     // Do not enforce component methods order
     "react/sort-comp": "off",
+    // We do not use propTypes
+    "react/require-default-props": "off",
     // Be more strict on usage of useMemo and useRef
     "react-hooks/exhaustive-deps": "error",
     // Allow type any, even if it should be avoided
@@ -102,7 +104,7 @@ module.exports = {
     "default-case": "off",
     "consistent-return": "off",
     // Allow modify properties of object passed in parameter
-    "no-param-reassign": "error", //[ "error", { "props": false } ],
+    "no-param-reassign": [ "error", { "props": false } ],
     // Disallow the use of var in favor of let and const
     "no-var": "error",
     // Do not favor default import
diff --git a/ivette/.gitignore b/ivette/.gitignore
index e776663c6d3cf6a1573ce6fd0d6ad83e4cfa63e0..6f5c2ec2a1203c5f0e3546ea0130c5bc333d0be3 100644
--- a/ivette/.gitignore
+++ b/ivette/.gitignore
@@ -11,5 +11,6 @@ yarn-error.log
 /bin
 /dist
 /doc/html
+/src/renderer/loader.ts
 
 # --------------------------------------------------------------------------
diff --git a/ivette/Makefile b/ivette/Makefile
index 6effb1ee1b2c0b918e8d54fce26e96a678fb6746..b59b64b75d06949fdbb6c9e2809b328f06021282 100644
--- a/ivette/Makefile
+++ b/ivette/Makefile
@@ -5,12 +5,13 @@ DOME_ARGS=--command $$(dirname $$0)/../../bin/frama-c
 DOME_DEV=-server-debug 1
 DOME_CLI=./bin/frama-c-gui
 DOME_API=./src/frama-c
+DOME_CUSTOM_ENTRIES= yes
 COPYRIGHT=CEA LIST / LSL
 # --------------------------------------------------------------------------
 
-.PHONY: all app dev doc serve dist lint fixlint
+.PHONY: all app dev pkg doc serve dist lint fixlint
 
-all: lint app
+all: pkg lint app
 
 app: dome-app
 dev: dome-dev
@@ -21,10 +22,29 @@ lint: dome-pkg dome-templ
 	yarn run typecheck
 	yarn run lint
 
-fixlint: dome-pkg dome-templ
-	@echo "[Ivette] running typechecker & linter (fix mode)"
+tsc: dome-pkg dome-templ
+	@echo "[Ivette] running typechecker & linter (with cache & fix mode)"
 	yarn run typecheck
-	yarn run lint --fix
+	yarn run lint --fix --cache --cache-location .eslint-cache
+
+# --------------------------------------------------------------------------
+# --- Ivette Package Loader
+# --------------------------------------------------------------------------
+
+LOADER=src/renderer/loader.ts
+PACKAGES=$(shell find src -name "pkg.json")
+
+lint: pkg
+dome-pkg: pkg
+dome-app: pkg
+dome-dev: pkg
+dome-dist: pkg
+pkg: $(LOADER)
+$(LOADER): $(PACKAGES) ./configure.js ./Makefile
+	@rm -f $(LOADER)
+	@echo "[Ivette] configure packages"
+	@node ./configure.js $(LOADER) $(PACKAGES)
+	@chmod -f a-w $(LOADER)
 
 # --------------------------------------------------------------------------
 # --- Frama-C API
@@ -34,9 +54,9 @@ fixlint: dome-pkg dome-templ
 
 api:
 	@echo "[Ivette] Generating TypeScript API"
-	@find api -name "*.ts" -exec rm -f {} \;
-	../bin/frama-c.byte -load-module api/server_tsc.ml -server-tsc
-	@find api -name "*.ts" -exec chmod a-w {} \;
+	@rm -fr src/frama-c/api/generated
+	../bin/frama-c.byte -load-module src/frama-c/api/generator.ml -server-tsc
+	@find src/frama-c/api/generated -name "*.ts" -exec chmod a-w {} \;
 
 # --------------------------------------------------------------------------
 # --- Ivette Documentation
@@ -46,7 +66,7 @@ VERSION=$(shell echo "console.log(require('./package.json').version)" | node -)
 
 DOC_ICONS_CSS= src/dome/doc/gallery.css
 DOC_ICONS_MAKE= src/dome/doc/iconsmd.js
-DOC_ICONS_DATA= src/dome/src/renderer/controls/gallery.json
+DOC_ICONS_DATA= src/dome/renderer/controls/gallery.json
 DOC_GUIDES= src/dome/doc/guides
 
 NODEBIN= ./node_modules/.bin
@@ -80,13 +100,6 @@ $(NODEBIN)/%:
 	@echo "[Node] install package $*"
 	yarn add -D $*
 
-# --------------------------------------------------------------------------
-# --- Ivette Plugins
-# --------------------------------------------------------------------------
-
-DOME_PLUGINS=
-DOME_EXPORTS=
-
 # --------------------------------------------------------------------------
 include $(DOME)/template/makefile
 # --------------------------------------------------------------------------
diff --git a/ivette/api/plugins/eva/values/index.ts b/ivette/api/plugins/eva/values/index.ts
deleted file mode 100644
index 22375d253f9b2f0bac5f1242c8cfe80693973c0e..0000000000000000000000000000000000000000
--- a/ivette/api/plugins/eva/values/index.ts
+++ /dev/null
@@ -1,154 +0,0 @@
-/* --- Generated Frama-C Server API --- */
-
-/**
-   Eva Values
-   @packageDocumentation
-   @module api/plugins/eva/values
-*/
-
-//@ts-ignore
-import * as Json from 'dome/data/json';
-//@ts-ignore
-import * as Compare from 'dome/data/compare';
-//@ts-ignore
-import * as Server from 'frama-c/server';
-//@ts-ignore
-import * as State from 'frama-c/states';
-
-//@ts-ignore
-import { byMarker } from 'api/kernel/ast';
-//@ts-ignore
-import { jMarker } from 'api/kernel/ast';
-//@ts-ignore
-import { jMarkerSafe } from 'api/kernel/ast';
-//@ts-ignore
-import { marker } from 'api/kernel/ast';
-
-/** CallStack */
-export interface callstack {
-  /** Callstack id */
-  id: number;
-  /** Short name for the callstack */
-  short: string;
-  /** Full name for the callstack */
-  full: string;
-}
-
-/** Loose decoder for `callstack` */
-export const jCallstack: Json.Loose<callstack> =
-  Json.jObject({
-    id: Json.jFail(Json.jNumber,'Number expected'),
-    short: Json.jFail(Json.jString,'String expected'),
-    full: Json.jFail(Json.jString,'String expected'),
-  });
-
-/** Safe decoder for `callstack` */
-export const jCallstackSafe: Json.Safe<callstack> =
-  Json.jFail(jCallstack,'Callstack expected');
-
-/** Natural order for `callstack` */
-export const byCallstack: Compare.Order<callstack> =
-  Compare.byFields
-    <{ id: number, short: string, full: string }>({
-    id: Compare.number,
-    short: Compare.string,
-    full: Compare.string,
-  });
-
-/** Data for array rows [`values`](#values)  */
-export interface valuesData {
-  /** Entry identifier. */
-  key: Json.key<'#values'>;
-  /** CallStack */
-  callstack: callstack;
-  /** Value inferred just before the selected point */
-  value_before: string;
-  /** Did the evaluation led to an alarm? */
-  alarm: boolean;
-  /** Value inferred just after the selected point */
-  value_after?: string;
-}
-
-/** Loose decoder for `valuesData` */
-export const jValuesData: Json.Loose<valuesData> =
-  Json.jObject({
-    key: Json.jFail(Json.jKey<'#values'>('#values'),'#values expected'),
-    callstack: jCallstackSafe,
-    value_before: Json.jFail(Json.jString,'String expected'),
-    alarm: Json.jFail(Json.jBoolean,'Boolean expected'),
-    value_after: Json.jString,
-  });
-
-/** Safe decoder for `valuesData` */
-export const jValuesDataSafe: Json.Safe<valuesData> =
-  Json.jFail(jValuesData,'ValuesData expected');
-
-/** Natural order for `valuesData` */
-export const byValuesData: Compare.Order<valuesData> =
-  Compare.byFields
-    <{ key: Json.key<'#values'>, callstack: callstack, value_before: string,
-       alarm: boolean, value_after?: string }>({
-    key: Compare.string,
-    callstack: byCallstack,
-    value_before: Compare.string,
-    alarm: Compare.boolean,
-    value_after: Compare.defined(Compare.string),
-  });
-
-/** Signal for array [`values`](#values)  */
-export const signalValues: Server.Signal = {
-  name: 'plugins.eva.values.signalValues',
-};
-
-const reloadValues_internal: Server.GetRequest<null,null> = {
-  kind: Server.RqKind.GET,
-  name:   'plugins.eva.values.reloadValues',
-  input:  Json.jNull,
-  output: Json.jNull,
-};
-/** Force full reload for array [`values`](#values)  */
-export const reloadValues: Server.GetRequest<null,null>= reloadValues_internal;
-
-const fetchValues_internal: Server.GetRequest<
-  number,
-  { pending: number, updated: valuesData[], removed: Json.key<'#values'>[],
-    reload: boolean }
-  > = {
-  kind: Server.RqKind.GET,
-  name:   'plugins.eva.values.fetchValues',
-  input:  Json.jNumber,
-  output: Json.jObject({
-            pending: Json.jFail(Json.jNumber,'Number expected'),
-            updated: Json.jList(jValuesData),
-            removed: Json.jList(Json.jKey<'#values'>('#values')),
-            reload: Json.jFail(Json.jBoolean,'Boolean expected'),
-          }),
-};
-/** Data fetcher for array [`values`](#values)  */
-export const fetchValues: Server.GetRequest<
-  number,
-  { pending: number, updated: valuesData[], removed: Json.key<'#values'>[],
-    reload: boolean }
-  >= fetchValues_internal;
-
-const values_internal: State.Array<Json.key<'#values'>,valuesData> = {
-  name: 'plugins.eva.values.values',
-  getkey: ((d:valuesData) => d.key),
-  signal: signalValues,
-  fetch: fetchValues,
-  reload: reloadValues,
-  order: byValuesData,
-};
-/** Abstract values inferred by the Eva analysis */
-export const values: State.Array<Json.key<'#values'>,valuesData> = values_internal;
-
-const getValues_internal: Server.GetRequest<marker,null> = {
-  kind: Server.RqKind.GET,
-  name:   'plugins.eva.values.getValues',
-  input:  jMarker,
-  output: Json.jNull,
-};
-/** Get the abstract values computed for an expression or lvalue */
-export const getValues: Server.GetRequest<marker,null>= getValues_internal;
-
-/* ------------------------------------- */
diff --git a/ivette/configure.js b/ivette/configure.js
new file mode 100644
index 0000000000000000000000000000000000000000..ebbf384515fd5e8b27b8d00dec5fbaa7336087a9
--- /dev/null
+++ b/ivette/configure.js
@@ -0,0 +1,47 @@
+// --------------------------------------------------------------------------
+// --- Configure Packages
+// --- Called by [make pkg]
+// --------------------------------------------------------------------------
+
+const path = require('path');
+const fs = require('fs');
+
+const loader = process.argv[2];
+const inputFiles = process.argv.slice(3);
+const packages = new Map();
+let buffer = '// Ivette Package Loader (generated)\n';
+
+inputFiles.forEach((file) => {
+  try {
+    const pkgId = path.relative('./src',path.dirname(file));
+    const pkgSrc = fs.readFileSync(file, { encoding: 'UTF-8' });
+    const pkgJson = JSON.parse(pkgSrc);
+    packages.set(pkgId,pkgJson);
+  } catch(err) {
+    console.error(`[Dome] Error ${file}: ${err}`);
+    process.exit(1);
+  }
+});
+
+function depend(id) {
+  const pkg = packages.get(id);
+  if (pkg) configure(pkg,id);
+}
+
+function configure(pkg, id) {
+  if (!pkg.done) {
+    pkg.done = true;
+    for(let parent = id;;) {
+      parent = path.dirname(parent);
+      if (!parent || parent === '.') break;
+      depend(parent);
+    }
+    const { depends=[], main='.' } = pkg;
+    depends.forEach(depend);
+    console.log(`[Ivette] package ${id}`);
+    buffer += `import '${path.join(id,main)}';\n`;
+  }
+}
+
+packages.forEach(configure);
+fs.writeFileSync(loader, buffer);
diff --git a/ivette/package.json b/ivette/package.json
index 3dacbd3f46bbd1ba6eefa95b300aa254cda32991..4accc25c115927804617213092dd1a8ebf2aead9 100644
--- a/ivette/package.json
+++ b/ivette/package.json
@@ -6,7 +6,7 @@
   "author": "Loïc Correnson <loic.correnson@cea.fr>",
   "license": "MIT",
   "scripts": {
-    "lint": "eslint --ext .ts,.tsx --format=stylish ./src",
+    "lint": "eslint --ext .ts,.tsx --format=compact ./src",
     "typecheck": "tsc --noEmit",
     "typecheck:watch": "yarn run typecheck -- --watch",
     "build": "tsc"
@@ -55,6 +55,8 @@
   "dependencies": {
     "@babel/runtime": "^7.9.2",
     "@fortawesome/fontawesome-free": "^5.13.1",
+    "@types/diff": "^4.0.2",
+    "@types/react-window": "^1.8.2",
     "codemirror": "^5.52.2",
     "cytoscape": "^3.15.1",
     "cytoscape-cola": "^2.3.1",
@@ -62,7 +64,9 @@
     "cytoscape-cxtmenu": "^3.1.2",
     "cytoscape-dagre": "^2.2.2",
     "cytoscape-klay": "^3.1.3",
+    "cytoscape-panzoom": "^2.5.3",
     "cytoscape-popper": "^1.0.7",
+    "diff": "^5.0.0",
     "immutable": "^4.0.0-rc.12",
     "lodash": "^4.17.15",
     "react": "^16.8",
@@ -71,6 +75,7 @@
     "react-draggable": "^4.2.0",
     "react-fast-compare": "^3.2.0",
     "react-virtualized": "^9.21.2",
+    "react-window": "^1.8.6",
     "source-map-support": "^0.5.16",
     "tippy.js": "5.2.1",
     "zeromq": "^6.0.0-beta.5"
diff --git a/ivette/src/dome/.gitignore b/ivette/src/dome/.gitignore
index 7cd1e3e820fe332ae0b7c2364e684d9dfebb5d87..6591bed583d6bb9eb4433e9c6255546ce148706c 100644
--- a/ivette/src/dome/.gitignore
+++ b/ivette/src/dome/.gitignore
@@ -7,47 +7,6 @@
 .dome-*.orig
 .dome-*.lock
 
-#########################################
-# Dome Repository
-#########################################
-
-/.gitdome
-
-#########################################
-# JavaScript
-#########################################
-
-node_modules
-yarn.lock
-/package.json
-
-#########################################
-# Example Application
-#########################################
-
-/.babelrc
-/webpack.main.js
-/webpack.renderer.js
-/webpack.plugin.js
-/electron-webpack.json
-/dist
-/bin
-/src/main/index.js
-/src/misc/exports.js
-/src/renderer/index.js
-/src/renderer/Application.js
-/src/renderer/Preferences.js
-/src/renderer/styles.css
-/src/renderer/demo
-/src/plugins
-
-#########################################
-# Documentation
-#########################################
-
-/html
 /doc/template/gallery-icons.html
-/doc/template/gallery-styles.js
-/doc/template/gallery-styles.html
 
 #########################################
diff --git a/ivette/src/dome/CHANGELOG.md b/ivette/src/dome/CHANGELOG.md
deleted file mode 100644
index 4e51470c1da281d1264d99637ca279df412f3ac7..0000000000000000000000000000000000000000
--- a/ivette/src/dome/CHANGELOG.md
+++ /dev/null
@@ -1 +0,0 @@
-# Version 0.0.1
diff --git a/ivette/src/dome/doc/guides/application.md b/ivette/src/dome/doc/guides/application.md
index 8abb0b0ebdce327a8a1cf2d20d71f4b28bc69a02..484a3c959757acde19a11f3730bba6c6885e087e 100644
--- a/ivette/src/dome/doc/guides/application.md
+++ b/ivette/src/dome/doc/guides/application.md
@@ -85,15 +85,10 @@ your data flow.
 - **Global States** are necessary to implement the unidirectional data-flow. These
   data are stored in the renderer process, but outside of the view hierarchy of
   **React** components actually mounted in the DOM. Hence, it remains consistent whatever
-  the evolution of the view. See `Dome.State` class and the associated custom **React** hooks
+  the evolution of the view. See `dome/state` module and the associated custom **React** hooks
   to implement global states. You may also use global JavaScript variables and emit events
   on your own.
 
-- **Local States** are necessary to maintain local states associated
-  to views.  We strongly encourage the use of the `Dome.useState()` hook for this
-  purpose, since it generalizes `React.useState()` with persistent window settings
-  (see below).
-
 - **View Updates** to make your views listening for updates of the various data
   sources, we encourage to use the **React** hooks we provide, since they
   transparently make your components to re-render when required. However,
@@ -103,19 +98,26 @@ your data flow.
   `Dome.useEvent()` hooks can be used to make your components being notified by
   events.
 
-- **Window Settings** are stored in the user's home directory but remain
-  generally unnoticed by most users, although they are responsible for a good user
-  experience.  They typically include the window's position and dimension,
-  resizable items position, fold/unfold states, presentation options, etc. Most
+- **Window Settings** are stored a local file at the root of user's project, and
+  remains generally unnoticed by most users. They typically include the window's
+  position and dimension, resizable items position, fold/unfold states,
+  presentation options, etc. Most
   **Dome** components with presentation options can be assigned a `settings` key
   to make their state persistent. Contrary to Global Settings, however, they are
   not shared across several windows. You may also access these data by using
-  `Dome.setWindowSetting()` and `Dome.getWindowSetting()`, or the **React** hook
-  `Dome.useWindowSetting()`.
+  `Settings.setWindowSetting()` and `Settings.getWindowSetting()`, or the **React** hook
+  `Settings.useWindowSetting()`. See also helpers `Dome.useXxxSettings()`.
+  It is possible, from the application main menu, to reset all the window settings to their
+  default values.
+
+- **Local Storage** are stored in the same file than window settings, although
+  they are not automatically reset to their initial values.
+  This is very convenient to store persistent user data on a per-project basis.
+  See `Settings.xxxLocalStorage()` functions for more details.
 
 - **Global Settings** are stored in the user's home directory and automatically
   saved and load with your application; they are typically modified _via_ the
   Settings Window, which is accessible from the application menubar. In **Dome**,
-  you access these data by using `Dome.setGlobalSetting()` and
-  `Dome.getGlobalSetting()`, or the **React** hook `Dome.useGlobalSetting()`.
-  Settings must be JSON serializable JavaScript values.
+  you can shall define a global settings by creating an instance of
+  `Settings.GlobalSettings` class and use it with
+  the `Settings.useGlobalSettings()` hook.
diff --git a/ivette/src/dome/doc/guides/development.md b/ivette/src/dome/doc/guides/development.md
index a1bfa4c54602b2ea514f1be81044601f7196a59b..e2269e794490c6d9ee082bc82968277a340ac4e3 100644
--- a/ivette/src/dome/doc/guides/development.md
+++ b/ivette/src/dome/doc/guides/development.md
@@ -175,18 +175,10 @@ $ make dome-help
   make dome-plugins Package plugins for distribution
 
 [Dome] Development:
-  Dome framework  DOME = '…'
-  Local command   DOME_CLI  = '…'
-  Arguments (dev) DOME_ARGS = '…'
-  Export modules  DOME_EXPORTS = '…'
-  Plugin modules  DOME_PLUGINS = '…'
+  … (environment variables)
 
 [Dome] Documentation:
-  Application     APP          = '…'
-  Copyright       COPYRIGHT    = '…'
-  Dome framework  DOME_DOC     = '…'
-  Output dir      DOME_DOC     = '…'
-  Public API      DOME_API     = '…'
+  … (environment variables)
 
 ```
 
diff --git a/ivette/src/dome/doc/tutorials/application.md b/ivette/src/dome/doc/tutorials/application.md
deleted file mode 100644
index ec13570b91555ef2bc7ca83a7a859836bfb737fe..0000000000000000000000000000000000000000
--- a/ivette/src/dome/doc/tutorials/application.md
+++ /dev/null
@@ -1,119 +0,0 @@
-<!-- Application Design -->
-
-This tutorial introduces how to design a **Dome** application within the
-**Electron** & **React** frameworks.  You shall be reasonably familiar with
-**React** concepts, but no knowledge of **Electron** is required.
-
-A desktop **Dome** application looks like a native application, but is actually
-a static web page rendered in a **Chrome** web browser. This is what provides
-the **Electron** framework by default. **Dome** is simply a library of **React**
-components and development templates tuned together to enable professional
-application development.
-
-This tutorial provides an overview of this environment and how to design a typical
-**Dome** application.
-
-## System Architecture
-
-Following the **Electron** framework design, your application will consists of
-two different processes interacting with each others.
-One is responsible for the management of the main GUI resources
-(windows, menu-bar, desktop interaction, user settings, etc.)
-and is named the `Main` process.
-The second one will be responsible for running the
-web page holding the main application window, and is named the `Renderer` process.
-Both kind of process communicates through the message-passing API provided by
-the **Electron** framework.
-
-When several instances of your application are running simultaneously, each invokation
-have its own window, running its owan, separate `Renderer` process. However, the
-**Dome** framework automatically makes them sharing the same `Main` process.
-
-Hence, each application instance has its own working directory and command-line arguments,
-depending on how its has been launched by the user. The **Dome** framework build
-both command-line and desktop entry points, depending on each target platform.
-
-## Event Driven Design
-
-On the renderer process side, the **React** framework induces a natural design where
-_Application State_ is separated from _Application Rendering_. Moreover,
-following a popular design introduced with **Redux**, application rendering tend
-to be written like a pure function (or _view_) on  the state, where user
-actions are just state updater callbacks. Each time the state is modified, the
-entire application rendering is recomputed, and **React** computes a minimal
-diff to apply on the web page displayed in the main application window.
-
-Putting everything together, its is recommended to design **Dome** application
-into two different parts, both running in the `Renderer` process of each
-application instance:
-
-- **Application Internals (State)**
-holding your application state and data and updating it in response to user or
-system events;
-
-- **Application Components (View)**
-responsible for rendering the application main window and
-binding callbacks to application services.
-
-<img src="dataflow.png" style="float: right; width: 30em"/>
-
-Such an architecture is typical of a _Model-View-Controller_ design, but
-revisited to scale. In particular, data flow between those three different
-layers shall follow a unique-direction pattern in order to avoid the
-combinatorial explosion of interactions between components that is generally
-observed in most Model-View-Controller designs.
-
-Hence, data-flow shall follow one of the following routes between these
-three layers, illustrated above:
-
-- from `State` to `View` : your rendering components shall only access the
-current application state and data;
-- from `View` to `State` or `System` : user action callbacks shall only trigger
-state update or system operation, not any other view direct modification.
-- from `System` to `State` : upon completion, system services shall trigger state
-updates that would in turn trigger new requests and view re-rendering.
-
-## Data Management
-
-To implement the recommended data-flow described above, you may use a full
-featured [Redux](https://redux.js.org) platform or any other framework of your
-choice. However, **Dome** provides you with many facilities for implementing
-your data flow.
-
-- **Global States** are necessary to implement the unidirectional data-flow. These
-  data are stored in the renderer process, but outside of the view hierarchy of
-  **React** components actually mounted in the DOM. Hence, it remains consistent whatever
-  the evolution of the view. See `Dome.State` class and the associated custom **React** hooks
-  to implement global states. You may also use global JavaScript variables and emit events
-  on your own.
-
-- **Local States** are necessary to maintain local states associated
-  to views.  We strongly encourage the use of the `Dome.useState()` hook for this
-  purpose, since it generalizes `React.useState()` with persistent window settings
-  (see below).
-
-- **View Updates** to make your views listening for updates of the various data
-  sources, we encourage to use the **React** hooks we provide, since they
-  transparently make your components to re-render when required. However,
-  sometimes you will need to respond to special events by hand. For this purpose,
-  you can use **Dome** as a central event emitter, by using `Dome.emit()`,
-  `Dome.on()` and `Dome.off()` functions. Moreover, the `Dome.useUpdate()` and
-  `Dome.useEvent()` hooks can be used to make your components being notified by
-  events.
-
-- **Window Settings** are stored in the user's home directory but remain
-  generally unnoticed by most users, although they are responsible for a good user
-  experience.  They typically include the window's position and dimension,
-  resizable items position, fold/unfold states, presentation options, etc. Most
-  **Dome** components with presentation options can be assigned a `settings` key
-  to make their state persistent. Contrary to Global Settings, however, they are
-  not shared across several windows. You may also access these data by using
-  `Dome.setWindowSetting()` and `Dome.getWindowSetting()`, or the **React** hook
-  `Dome.useWindowSetting()`.
-
-- **Global Settings** are stored in the user's home directory and automatically
-  saved and load with your application; they are typically modified _via_ the
-  Settings Window, which is accessible from the application menubar. In **Dome**,
-  you access these data by using `Dome.setGlobalSetting()` and
-  `Dome.getGlobalSetting()`, or the **React** hook `Dome.useGlobalSetting()`.
-  Settings must be JSON serializable JavaScript values.
diff --git a/ivette/src/dome/doc/tutorials/dataflow.png b/ivette/src/dome/doc/tutorials/dataflow.png
deleted file mode 100644
index 648a290cadfa3d89ffe5861b76076ab18edfeac1..0000000000000000000000000000000000000000
Binary files a/ivette/src/dome/doc/tutorials/dataflow.png and /dev/null differ
diff --git a/ivette/src/dome/doc/tutorials/development.md b/ivette/src/dome/doc/tutorials/development.md
deleted file mode 100644
index af424ab5c5b2725b6ade6abb67e8bd0f8f03a4f5..0000000000000000000000000000000000000000
--- a/ivette/src/dome/doc/tutorials/development.md
+++ /dev/null
@@ -1,204 +0,0 @@
-<!-- Application Development -->
-
-The [Quick Start](tutorial-quickstart.html) tutorial introduces how to setup a new application project,
-and [Application Design](tutorial-application.html) draw a high-level view of how it works.
-This tutorial goes into more details about the development environment provided by the **Dome**
-framework.
-
-
-## HTML & JavaScript Environment
-
-The Web environment for designing your application is based on the following
-framework:
-
-- **Electron** [v5.0+](https://electronjs.org) runtime environment (packaging Chrome and Node)
-- **Node** [v12.0+](https://nodejs.org/dist/latest-v12.x/docs/api) provided by Electron
-- **Chromium** [v73.0+](https://www.chromium.org/Home) HTML rendering engine provided by Electron
-
-You will write your application in a an environment setup with the following
-JavaScript features:
-
-- **Webpack** for packaging the application from sources
-- **Babel** to parse language extensions
-- **Babel Presets Env** to use ECMA modules and JavaScript strict mode
-- **Babel Presets React** to use JSX react notation in all your `*.js` files
-- **Babel Object Rest Spread** to use object spread syntax `{ ...props }`
-- **React v16** with its latest features (including Hooks)
-- **React Hot Loader** for [live-editing](tutorial-hotreload.html) your application
-- **CSS Loader** to load and install `*.css` files
-
-## Available Packages
-
-The implementation and internals of the **Dome** framework rely on
-high-quality and mature popular packages. They are automatically packed
-into your dependencies by the provided template makefile. We list them here
-since you may re-use them for your own purpose:
-
-- [**Lodash**](https://lodash.com) convenient JavaScript utilities
-- [**React-Virtualized**](http://bvaughn.github.io/react-virtualized)
-for layout of large data set in list, tables and grids
-- [**React-Draggable**](https://github.com/mzabriskie/react-draggable)
-for straightforward drag-and-drop features
-- [**CodeMirror**](https://codemirror.net) for rich text capabilities and edition
-that scales on large document
-- [**ZeroMQ**](http://zeromq.org) for inter-process and distant communications
-(see also [System Services](tutorial-services.html)).
-
-
-## Project Files Organization
-
-The main directory holding your application project with **Dome** consists of
-several files and directories. Each is created and/or managed by various
-entities : yourself the **Developer**, the **Dome** template makefile, the
-**Yarn** JavaScript package manager and the **Electron** suite of
-utilities. Parts of those files are generated and updated on demand and shall or
-shall _not_ be tracked in your source version control system, be it based on `git`,
-`svn` or anything else.
-
-Most files are actually created and used by **Dome**, **Electron** and **Yarn**.
-However, that are _in fine_ under the responsibility of the **Developer**
-since you can edit and extend them to fit your needs.
-Those generated files generally contains comments to indicate how you
-can extend them. You shall put those files under version control only if you edit them.
-
-As depicted in the [Quick Start](tutorial-quickstart.html) tutorial, the only file you
-need to create by yourself is the main `Makefile`, with a minimal content
-limited to:
-
-```makefile
-DOME="..." ;; path to your dome installation
-include $(DOME)/template/makefile
-```
-
-The following table lists the main files and directories of your project, with
-the associated entity responsible for it, and whether they should be tracked by
-your source version control system (VCS).
-
-Optional files are tagged with « (Opt.) » in the corresponding `Entity` column,
-and are _not_ generated by default. Similarly, files mainly used by the system
-but that can still be configured by the developer are tagged with « (+Dev) ».
-Files are tagged with « ✓(*) » in the `VCS` column shall be tracked only if you
-actually modified them.
-
-| File or Directory | Description | Entity  | VCS |
-|:------------------|:------------|:-------:|:---:|
-| `./Makefile` | Drives the build system | **Developer** | ✓ |
-| `./src/main/` | Sources for the main process | **Developer** | ✓ |
-| `./src/main/index.js` | Main process entry point | **Electron** (+Dev) | ✓ |
-| `./src/renderer/` | Sources for the renderer process | **Developer** | ✓ |
-| `./src/renderer/index.js` | Renderer process entry point | **Electron** (+Dev) | ✓ |
-| `./src/renderer/Application.js` | Top React component of the main application window | **Developer** | ✓ |
-| `./src/renderer/Preferences.js` | Top React component of the user preferences window | **Developer** | ✓ |
-| `./src/common/` | Sources for _both_ processes | **Developer** (Opt.) | ✓ |
-| `./static/` | Static resources | **Developer** (Opt.) | ✓ |
-| `./package.json` | JavaScript packages configuration | **Yarn** (+Dev) | ✓ |
-| `./node_modules` | Downloaded packages | **Yarn** | 𐄂 |
-| `./yarn.lock` | Packages versions stamps | **Yarn** | ✓ |
-| `./electron-webpack.json` | Electron configuration | **Electron** (+Dev) | ✓(*) |
-| `./babelrc` | Babel configuration | **Electron** (+Dev) | ✓(*) |
-| `./webpack.main.json` | Webpack main process config. | **Electron** (+Dev) | ✓(*) |
-| `./webpack.renderer.json` | Webpack renderer process config. | **Electron** (+Dev) | ✓(*) |
-| `./.dome-*` | Dome makefile stamps | **Dome** | 𐄂 |
-| `$(DOME)/*` | Dome framework clone | **Dome** | (var.) |
-| `./dist/` | Packaged application | **Dome** | 𐄂 |
-| `./bin/` | Local command-lines | **Dome** | 𐄂 |
-
-The main entry points of the two **Electron** processes running your application,
-`src/main/index.js` and `src/renderer/index.js` shall be modified with extreme care,
-since they are in charge with the correct bootstrap of your application.
-The generated files from **Dome** templates contains explicit comments and guidelines.
-
-You may want to modify the name of your application top-level **React** components,
-namely `src/renderer/Application.js` and `src/render/Preferences.js` by default.
-To do this, you shall hook into the
-`src/renderer/index.js` file and follow the provided comments and guidelines,
-and set the `DOME_CUSTOM_ENTRIES` variable into your own `./Makefile` to make
-**Dome** aware about this.
-
-If you need static resource files to be packed with your application, put them in the `static` directory.
-You can then access to their actual path from your code by using the `System.getStatic(<path>)` utility function.
-
-The location of the **Dome** resources actually depends on the developer
-profile, as explained in more detailed in the [Live Editing](tutorial-hotreload.html) tutorial.
-To summarize:
-- for normal developers, it can be a local copy of the dome framework, for instance in your `/usr/local/lib/dome` directory;
-- for developers working with a specific or modified version of the dome framework, it can be in the local
-`./dome/` directory of your project, with or without versioning control;
-- for **Dome** developers, it is also possible to clone the Git repository inside the `./src/dome/` sub-directory of your
-project, hence also enabling live-editing of **Dome** itself;
-- for **Dome** maintainers, it is even possible to use the root of the **Dome** development repository as an application project
-in itself, for demos, examples or testing purposes.
-
-Most of the **Electron** configuration files depends on the definition of the
-`DOME` environment variable to find the necessary resources for your application
-during development. Commands initiated by **Dome** from `$(DOME)/template/makefile`
-will explicitly copy the `$(DOME)` makefile variable into the `$DOME` shell environment
-variable when calling the **Electron** builder utilities, and might use it to generate static
-files from templates, if necessary.
-
-If you ever _move_ the place where **Dome** is installed, you
-probably have to inspect the generated files that you have modified to check
-if they still behave as expected.
-
-Notice, however, that distributed versions of
-the application (those accessible from the `./dist/` directory) are
-self-contained: they are _not_ tied to your local installation of **Dome**.
-
-The command-line version of the application is accessible to the developer from the `./bin` directory.
-
-# Common Development Tasks
-
-Most development tasks shall be accessible from your `./Makefile`, and simply delegate to the
-predefined **Dome** targets in `$(DOME)/template/makefile` ; however, for very specific needs,
-you can borrow the content of the template makefile into your own one and modify it at your
-convenience. The **Dome** environment will not target this template makefile explicitly.
-
-The top target of the **Dome** template makefile is `make dome-help`,
-which is thus activated by default unless you put your own targets _before_
-its inclusion. The `dome-help` target simply echoes a short list of all the
-`dome-xxx` predefined targets in the template. It also reports on
-actual values of makefile variables used by the template.
-
-```
-$ make dome-help
-
-[Dome] Builtin Targets:
-  make dome-help    This help
-  make dome-dev     Run application in development mode
-  make dome-app     Compile application
-  make dome-dist    Package application for production
-  make dome-doc     Generate Dome documentation
-  make dome-api     Generate Application documentation
-  make dome-pkg     Install development packages
-  make dome-templ   Update templates
-  make dome-reboot  Rebuild templates from scratch
-  make dome-clean   Remove dome temporary files
-  make dome-plugins Package plugins for distribution
-
-[Dome] Development:
-  Dome framework  DOME = '…'
-  Local command   DOME_CLI  = '…'
-  Arguments (dev) DOME_ARGS = '…'
-  Export modules  DOME_EXPORTS = '…'
-  Plugin modules  DOME_PLUGINS = '…'
-
-[Dome] Documentation:
-  Application     APP          = '…'
-  Copyright       COPYRIGHT    = '…'
-  Dome framework  DOME_DOC     = '…'
-  Output dir      DOME_DOC     = '…'
-  Public API      DOME_API     = '…'
-
-```
-
-As depicted above, the **Dome** template also provides two extensible targets `help::` and `clean::`.
-By default, the `make clean` would only remove the **Dome** stamp files, not the actually generated files,
-since they can have been modified when developing the application. This can cause, however, an _update_ of
-configuration files that can be managed incrementally, typically for the `package.json` and the installed
-JavaScript packages.
-
-The **Dome** framework can generate its own documentation locally, hence you may consult it offline. It
-is also capable of generating internal **JSDoc** documentation of the application itself. The application
-documentation does _not_ contain the framework documentation, though.
-
-The environment variable can be redefined _via_ your own Makefile before the **Dome** template inclusion.
diff --git a/ivette/src/dome/doc/tutorials/glossary.md b/ivette/src/dome/doc/tutorials/glossary.md
deleted file mode 100644
index 1368e8e25b91cf10a011d4c50ec85a4ec5f81a4f..0000000000000000000000000000000000000000
--- a/ivette/src/dome/doc/tutorials/glossary.md
+++ /dev/null
@@ -1,30 +0,0 @@
-<!-- Glossary -->
-
-## Basic Concepts
-
-- **Component** a React Component definition (class of function)
-- **Element** a React Component instance of a Component, typically `<Component ...>`
-- **Elements** a fragment of any number of elements, typically the `children` properties of elements
-- **Render Prop** a function returning element(s), typically used instead of children elements
-
-## Component Properties
-
-- `id` an element identifier
-- `icon` an icon identifier, as listed in the [icon gallery](tutorial-icons.html)
-- `label` a short text used as the displayed title of a component
-- `text` textual content to be printed on screen
-- `title` a description for a component, usually provided in a tooltip box
-- `settings` a key for making local state(s) persistent in user's settings
-- `value` the value associated to some basic control (see `onChange`)
-- `state` an object holding some current state (see `onUpdate`)
-- `default` identifies the element selected by default in a list
-- `selected` whether an element is selected or not (never by default)
-- `disabled` whether an element will not responds to user actions (never by default)
-- `selection` the identifier or value of current selection, or `undefined` (see `onSelect`)
-- `children` the children elements of a component instance
-- `onClick` a callback function in response to a click event
-- `onClose` a callback function in response to closing action
-- `onChange` a callback function in response to value changes (see `value`)
-- `onUpdate` a callback function in response to (partial) state updates (see `state`)
-- `onSelection` a callback function in response to user selection (see `selection`)
-- `style` an inlined CSS style object to inject in a DOM element
diff --git a/ivette/src/dome/doc/tutorials/hooks.md b/ivette/src/dome/doc/tutorials/hooks.md
deleted file mode 100644
index 00f2f0dd59b14159336ba94ba084bacb011d03a2..0000000000000000000000000000000000000000
--- a/ivette/src/dome/doc/tutorials/hooks.md
+++ /dev/null
@@ -1,20 +0,0 @@
-<!-- Dome React Hooks --->
-
-The **Dome** framework provides several [React Hooks](https://reactjs.org/docs/hooks-intro.html)
-to ease your developpement process. Here is a summary of them.
-
-- [`useUpdate(evt)`](dome_.html#.useUpdate) to trigger re-rendering on **Dome** events;
-- [`useEvent(emitter,event,callback)`](dome_.html#.useEvent) to trigger callbacks on events;
-- [`useForceUpdate()`](dome_.html#.useForceUpdate) to trigger re-rendering on demand;
-- [`useState(settings,defaultValue)`](dome_.html#.useState)
-  similar to `React.useState()` with optional persistent _window_ settings;
-- [`useSwitch(settings,defaultValue)`](dome_.html#.useSwitch)
-  similar to `React.useState()` for boolean values with _window_ settings;
-- [`useGlobalSetting(settings,defaultValue)`](dome_.html#.useGlobalSetting)
-  similar to `React.useState()` with optional persistent _global_ settings;
-- [`useHistory(settings,defaultValue)`](dome_.html#.useHistory)
-  for managing histories
-- [`useClock(period,initStart)`](dome_.html#.useClock)
-returns start/stop clocks synchronized on period.
-- [`useCommand()`](dome_.html#.useCommand) for working with different application instances.
-- See also the [`Dome.State`](dome(renderer).State.html) and the associated hooks.
diff --git a/ivette/src/dome/doc/tutorials/hotreload.md b/ivette/src/dome/doc/tutorials/hotreload.md
deleted file mode 100644
index 283ae63281cb34888bae4c3af77e18988b142710..0000000000000000000000000000000000000000
--- a/ivette/src/dome/doc/tutorials/hotreload.md
+++ /dev/null
@@ -1,45 +0,0 @@
-<!-- Live Code Editing -->
-
-The **Dome** framework comes with live-editing facilities, provided by a
-combination of
-[Webpack Hot Module Reloading](https://webpack.js.org/concepts/hot-module-replacement)
-and [React Hot Loader](http://gaearon.github.io/react-hot-loader).
-This allows you to live edit your code and style sheets in real time while application
-is running. This feature is only enabled in development mode, not in production mode
-used when packaging the application for some platform.
-
-Hot reloading for **React** components is known to be a fragile feature and to
-suffer from certain limitations. Typically, files that can trigger live updates
-must be reachable from the `./src` directory, without traversing symbolic links.
-Style sheets in `*.css` files can be live edited, and **React** components in
-`*.js` files as well. Most **React** components can be live-edited, provided
-they are defined in top-level variables or exported by modules. Generally, the
-component states are preserved during live-editing.
-
-For live-editing to work properly, your source code must follow strict
-configuration settings. These rules are enforced when using configuration files
-and application entry points generated from **Dome** templates. Pay attention to
-the provided comments in generated files when modifying them.
-
-By default, we suggest to install the **Dome** framework in the sub-directory `./dome`
-of your project. Being outside `./src`, this normally prevents **Dome** files to
-be live-edited. If you want to also live-edit the framework, you shall move the
-`$(DOME)` directory inside your own `./src`.
-In particular, you might install the framework with `DOME=src/dome` for instance.
-
-**State Management:** hot-reloading on **React** components preserves application
-states _only_ when they are stored outside the reloaded module. This is the case
-for local states maintained in **React** components, as they live in the virtual DOM.
-However, for global application state stored in global variables of modules,
-they simply vanish when a module is hot-reloaded. Worst, the virtual DOM will
-be still bound to the _old_ versions of the modules. However, you usually don't
-want to live-edit the global state of your application and mix new data with
-old ones. A good practice is to separate files holding global state from files
-implementing views. Hence, live-editing the views will not cause the global state
-modules to reload, and views will stay in sync with your data. If you ever modify
-the global state, you will have to reload the application window (`CmdOrCtrl-R`).
-
-**Versioning Note:** the framework currently sticks on `webpack` version 3 and
-`react-hot-loader` version 3, because of limitations and issues when using
-`electron-webpack` with most recent versions of those libraries. However, we
-hope to be able to migrate to newer versions as soon as possible.
diff --git a/ivette/src/dome/doc/tutorials/icons.md b/ivette/src/dome/doc/tutorials/icons.md
deleted file mode 100644
index ee71eb82740a147dcffe4319e0c8526d2206af33..0000000000000000000000000000000000000000
--- a/ivette/src/dome/doc/tutorials/icons.md
+++ /dev/null
@@ -1,3 +0,0 @@
-<!-- Icon Gallery -->
-
-<!-- (Generated) -->
diff --git a/ivette/src/dome/doc/tutorials/index.json b/ivette/src/dome/doc/tutorials/index.json
deleted file mode 100644
index 981c5505336a6e6090b6f3ad086a017aafd69c84..0000000000000000000000000000000000000000
--- a/ivette/src/dome/doc/tutorials/index.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-  "quickstart":  { "order": 1, "title": "Quick Start" },
-  "application": { "order": 2, "title": "Application Design" },
-  "development": { "order": 3, "title": "Application Development" },
-  "hooks":       { "order": 4, "title": "Custom React Hooks" },
-  "hotreload":   { "order": 5, "title": "Live Editing" },
-  "styling":     { "order": 7, "title": "Styling Components" },
-  "icons":       { "order": 8, "title": "Icon Gallery" },
-  "glossary":    { "order": 9, "title": "Glossary" }
-}
diff --git a/ivette/src/dome/doc/tutorials/quickstart.md b/ivette/src/dome/doc/tutorials/quickstart.md
deleted file mode 100644
index 44d9925fdd1da5072f1fd7491c69b6c58e7244eb..0000000000000000000000000000000000000000
--- a/ivette/src/dome/doc/tutorials/quickstart.md
+++ /dev/null
@@ -1,26 +0,0 @@
-<!-- -------------------------------------------------------------------------- -->
-<!-- --- Quick Start                                                        --- -->
-<!-- -------------------------------------------------------------------------- -->
-
-We strongly recommand to use [**Yarn**](https://reactjs.org)
-for installing the necessary Node packages and their dependencies.
-
-Then, prepare a directory for developing your application, and download
-the Dome Application Framework into sub-directory `dome`.
-You shall now setup a makefile for your application as follows:
-
-<pre>
-  # Makefile
-  include dome/template/makefile
-  all: dome-dev
-</pre>
-
-Now, simply type `make` and all the necessary packages will be automatically
-installed and configured. This can take a while for the very first installation.
-You will be prompted for generating a default `package.json` file
-if you do not have some already.
-
-Eventually, your application will start with
-a « _Hello World_ » window.
-Now, you can _live edit_ the generated `src/renderer/Application.js` which is the main entry point
-of your application and see what happens into the main window.
diff --git a/ivette/src/dome/doc/tutorials/styling.md b/ivette/src/dome/doc/tutorials/styling.md
deleted file mode 100644
index 9074a9373f0f2204fea054e8cdc182ce77564356..0000000000000000000000000000000000000000
--- a/ivette/src/dome/doc/tutorials/styling.md
+++ /dev/null
@@ -1,63 +0,0 @@
-<!-- Styling Components -->
-
-This tutorial explains how **Dome** style sheets are organized and how
-to reuse them for styling your own components. Although modern styling
-usually rely on _style preprocessors_ to leverage the complexity of
-CSS style sheets development, the approach used here is based on separation
-of concerns and multi-class styling. The advantage is that you can
-develop your _own_ style sheets, while still being able
-to re-use the existing classes provided by the framework.
-
-All CSS classes provided by **Dome** start with prefix `dome-` ; you shall not
-use such a prefix when designing your own classes. Many class names are provided
-with optional or mandatory variants. Typically:
-
-- `dome-<base>[-<a>,<b>,...]` describes class `dome-<base>` and its variants
-`dome-<base>-<a>`, `dome-<base>-<b>` _etc_.
-
-- `dome-<name>-[<a>,<b>,...]` describes classes `dome-<name>-<a>`, `dome-<name>-<b>` _etc_.
-
-## Platform Context
-
-These classes can be used when writing selectors in order to style things
-with respect to the target platform. The main window container is attributed
-with one of the following class:
-
-- `dome-platform-[darwin,linux,windows]` derived from the `process.darwin`
-global variable (**Node.js** environment).
-
-- `dome-window-[active|inactive]` depending on whether the main application window
-has focus or not.
-
-## Color Palettes
-
-Attributing colors to graphical elements is often an issue, since a precise
-hex variants shall be tuned depending on the surrounding context. However,
-base colors are provided in public classes for several usages:
-
-- `dome-color-frame` background, foreground and borders for
-window frames, which includes tool-bars, status-bars, tabs and such.
-Those colors actually depend on the focus state of the main application window.
-
-- `dome-color-[dragzone|dragging]` for painting the background of a dragging
-zone, typically a splitting rule. The `dragzone` variant is completely
-transparent with a very transparent light gray when hovered.
-The `dragging` variant is semi-transparent blended blue with light gray.
-All these drag background effects are smoothly transitioned.
-
-## Text Properties
-
-- `dome-text-[label|title|descr]` for labels (_eg._ buttons, tabs, menu
-entries), titles (larger labels) and descriptions (_eg._ tooltips).
-Uses a sans-serif font, is non-selectable and truncated with an ellipsis.
-
-- `dome-text-[data|code]` for selectable text, typically input fields.
-Uses a sans-serif font (for `data`) or monospace font (for `code`),
-never wraps and is clipped when overflow.
-
-## Component Layout
-
-The entire application uses the `box-model` box-sizing property by default,
-since it is usually much more consistent with nested `<div>` components.
-Similarly, default margins and paddings are set to `0px` to avoid unwanted
-messy background issues.
diff --git a/ivette/src/dome/Makefile b/ivette/src/dome/examples/Makefile
similarity index 100%
rename from ivette/src/dome/Makefile
rename to ivette/src/dome/examples/Makefile
diff --git a/ivette/src/dome/examples/README.md b/ivette/src/dome/examples/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..27ced4fd5e9da5fcd000f09eebfce1d09cea679d
--- /dev/null
+++ b/ivette/src/dome/examples/README.md
@@ -0,0 +1,5 @@
+# Dome Examples
+
+The `./Makefile` is from an old demo. It is probably outdated.
+
+**TO BE CONTINUED**
diff --git a/ivette/src/dome/main/dome.ts b/ivette/src/dome/main/dome.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d4ee1916ce8f0e13cb61f930cbcdcf39ff366913
--- /dev/null
+++ b/ivette/src/dome/main/dome.ts
@@ -0,0 +1,565 @@
+/**
+   ## Dome Application (Main Process)
+
+   This module manages the electron main-process of the application.
+   Your application will launch on `Dome.start()`:
+
+   @example
+   // src/main/index.js:
+   import * as Dome from 'dome' ;
+   Dome.start();
+
+   @packageDocumentation
+   @module dome(main)
+*/
+
+import _ from 'lodash';
+import fs from 'fs';
+import path from 'path';
+import {
+  app,
+  ipcMain,
+  BrowserWindow,
+  BrowserWindowConstructorOptions,
+  IpcMainEvent,
+  shell,
+} from 'electron';
+import installExtension, { REACT_DEVELOPER_TOOLS } from 'dome/devtools';
+import SYS, * as System from 'dome/system';
+
+// --------------------------------------------------------------------------
+// --- Main Window Web Navigation
+// --------------------------------------------------------------------------
+
+import { URL } from 'url';
+import * as Menubar from './menubar';
+
+// --------------------------------------------------------------------------
+// --- System Helpers
+// --------------------------------------------------------------------------
+
+function fstat(p: string) {
+  try {
+    return fs.statSync(p);
+  } catch (_error) {
+    return undefined;
+  }
+}
+
+// --------------------------------------------------------------------------
+// --- Helpers
+// --------------------------------------------------------------------------
+
+const LOCAL = process.env.DOME_LOCAL;
+
+/** Development mode flag */
+export const { DEVEL } = System;
+
+/** System platform */
+export const { platform } = System;
+
+// --------------------------------------------------------------------------
+// --- Settings
+// --------------------------------------------------------------------------
+
+function loadSettings(file: string) {
+  try {
+    if (!fstat(file))
+      return {};
+    const text = fs.readFileSync(file, { encoding: 'utf8' });
+    return { ...JSON.parse(text) };
+  } catch (err) {
+    console.error('[Dome] Unable to load settings', file, err);
+    return {};
+  }
+}
+
+function saveSettings(file: string, data = {}) {
+  try {
+    const text = JSON.stringify(data, undefined, DEVEL ? 2 : 0);
+    fs.writeFileSync(file, text, { encoding: 'utf8' });
+  } catch (err) {
+    console.error('[Dome] Unable to save settings', file, err);
+  }
+}
+
+// --------------------------------------------------------------------------
+// --- Global Settings
+// --------------------------------------------------------------------------
+
+let GlobalSettings = {}; // Current Dictionnary
+
+const APP_DIR = app.getPath('userData');
+const PATH_WINDOW_SETTINGS = path.join(APP_DIR, 'WindowSettings.json');
+const PATH_GLOBAL_SETTINGS = path.join(APP_DIR, 'GlobalSettings.json');
+
+function saveGlobalSettings() {
+  try {
+    if (!fstat(APP_DIR)) fs.mkdirSync(APP_DIR);
+    saveSettings(PATH_GLOBAL_SETTINGS, GlobalSettings);
+  } catch (err) {
+    console.error('[Dome] Unable to save global settings', err);
+  }
+}
+
+function obtainGlobalSettings() {
+  if (!GlobalSettings) {
+    GlobalSettings = loadSettings(PATH_GLOBAL_SETTINGS);
+  }
+  return GlobalSettings;
+}
+
+// --------------------------------------------------------------------------
+// --- Window Settings & Frames
+// --------------------------------------------------------------------------
+
+type Store = { [key: string]: any };
+
+interface Handle {
+  window: BrowserWindow; // Also prevents Gc
+  frame: Electron.Rectangle; // Window frame
+  devtools: boolean; // Developper tools visible
+  reloaded: boolean; // Reloaded window
+  config: string; // Path to config file
+  settings: Store; // Current settings
+  storage: Store; // Local storage
+}
+
+const WindowHandles = new Map<number, Handle>(); // Indexed by *webContents* id
+
+function saveWindowConfig(handle: Handle) {
+  const configData = {
+    frame: handle.frame,
+    settings: handle.settings,
+    storage: handle.storage,
+    devtools: handle.devtools,
+  };
+  saveSettings(handle.config, configData);
+}
+
+function windowSyncSettings(event: IpcMainEvent) {
+  const handle = WindowHandles.get(event.sender.id);
+  event.returnValue = {
+    globals: obtainGlobalSettings(),
+    storage: handle && handle.storage,
+    settings: handle && handle.settings,
+  };
+}
+
+ipcMain.on('dome.ipc.settings.sync', windowSyncSettings);
+
+// --------------------------------------------------------------------------
+// --- Patching Settings
+// --------------------------------------------------------------------------
+
+type patch = { key: string; value: any };
+
+function applyPatches(data: Store, args: patch[]) {
+  args.forEach(({ key, value }) => {
+    if (value === null) {
+      delete data[key];
+    } else {
+      data[key] = value;
+    }
+  });
+}
+
+function applyWindowSettings(event: IpcMainEvent, args: patch[]) {
+  const handle = WindowHandles.get(event.sender.id);
+  if (handle) {
+    applyPatches(handle.settings, args);
+    if (DEVEL) saveWindowConfig(handle);
+  }
+}
+
+function applyStorageSettings(event: IpcMainEvent, args: patch[]) {
+  const handle = WindowHandles.get(event.sender.id);
+  if (handle) {
+    applyPatches(handle.storage, args);
+    if (DEVEL) saveWindowConfig(handle);
+  }
+}
+
+function applyGlobalSettings(event: IpcMainEvent, args: patch[]) {
+  applyPatches(obtainGlobalSettings(), args);
+  BrowserWindow.getAllWindows().forEach((w: BrowserWindow) => {
+    const contents = w.webContents;
+    if (contents.id !== event.sender.id) {
+      contents.send('dome.ipc.settings.broadcast', args);
+    }
+  });
+  if (DEVEL) saveGlobalSettings();
+}
+
+ipcMain.on('dome.ipc.settings.window', applyWindowSettings);
+ipcMain.on('dome.ipc.settings.global', applyGlobalSettings);
+ipcMain.on('dome.ipc.settings.storage', applyStorageSettings);
+
+// --------------------------------------------------------------------------
+// --- Renderer-Process Communication
+// --------------------------------------------------------------------------
+
+function broadcast(event: string, ...args: any[]) {
+  BrowserWindow.getAllWindows().forEach((w) => {
+    w.webContents.send(event, ...args);
+  });
+}
+
+// --------------------------------------------------------------------------
+// --- Window Activities
+// --------------------------------------------------------------------------
+
+let appName = 'Dome';
+const MODIFIED = '(*) ';
+
+/**
+   Sets application window name
+ */
+export function setName(title: string) {
+  appName = title;
+}
+
+function setTitle(event: IpcMainEvent, title: string) {
+  const handle = WindowHandles.get(event.sender.id);
+  if (handle) handle.window.setTitle(title || appName);
+}
+
+function setModified(event: IpcMainEvent, modified: boolean) {
+  const handle = WindowHandles.get(event.sender.id);
+  if (handle) {
+    const w = handle.window;
+    if (platform === 'macos')
+      w.setDocumentEdited(modified);
+    else {
+      let title = w.getTitle();
+      if (title.startsWith(MODIFIED))
+        title = title.substring(MODIFIED.length);
+      if (modified)
+        title = MODIFIED + title;
+      w.setTitle(title);
+    }
+  }
+}
+
+ipcMain.on('dome.ipc.window.title', setTitle);
+ipcMain.on('dome.ipc.window.modified', setModified);
+
+function getURL() {
+  if (DEVEL)
+    return `http://localhost:${process.env.ELECTRON_WEBPACK_WDS_PORT}`;
+  if (LOCAL)
+    return `file://${path.join(__dirname, '../renderer/index.html')}`;
+  return `file://${__dirname}/index.html`;
+}
+
+function navigateURL(sender: Electron.webContents) {
+  return (event: Electron.Event, url: string) => {
+    event.preventDefault();
+    const href = new URL(url);
+    const main = new URL(getURL());
+    if (href.origin === main.origin) {
+      sender.send('dome.ipc.href', url);
+    } else {
+      shell.openExternal(url);
+    }
+  };
+}
+
+// --------------------------------------------------------------------------
+// --- Lookup for config file
+// --------------------------------------------------------------------------
+
+function lookupConfig(pwd = '.') {
+  const wdir = path.resolve(pwd);
+  let cwd = wdir;
+  const cfg = `.${appName.toLowerCase()}`;
+  for (; ;) {
+    const here = path.join(cwd, cfg);
+    if (fstat(here)) return here;
+    const up = path.dirname(cwd);
+    if (up === cwd) break;
+    cwd = up;
+  }
+  const home = path.resolve(app.getPath('home'));
+  const user = wdir.startsWith(home) ? wdir : home;
+  return path.join(user, cfg);
+}
+
+// --------------------------------------------------------------------------
+// --- Browser Window SetUp
+// --------------------------------------------------------------------------
+
+function createBrowserWindow(
+  config: BrowserWindowConstructorOptions,
+  argv?: string[],
+  wdir?: string,
+) {
+
+  const isAppWindow = (argv !== undefined && wdir !== undefined);
+
+  const browserArguments = isAppWindow
+    ? SYS.WINDOW_APPLICATION_ARGV
+    : SYS.WINDOW_PREFERENCES_ARGV;
+
+  const options: BrowserWindowConstructorOptions = {
+    show: false,
+    backgroundColor: '#f0f0f0',
+    webPreferences: {
+      nodeIntegration: true,
+      additionalArguments: [browserArguments],
+    },
+    ...config,
+  };
+
+  const configFile = isAppWindow ? lookupConfig(wdir) : PATH_WINDOW_SETTINGS;
+  const configData = loadSettings(configFile);
+
+  const { frame, devtools, settings = {}, storage = {} } = configData;
+  if (frame) {
+    const getInt = (v: any) => v && _.toSafeInteger(v);
+    options.x = getInt(frame.x);
+    options.y = getInt(frame.y);
+    options.width = getInt(frame.width);
+    options.height = getInt(frame.height);
+  }
+
+  const theWindow = new BrowserWindow(options);
+  const { webContents } = theWindow;
+  const wid = webContents.id;
+
+  const handle: Handle = {
+    window: theWindow,
+    config: configFile,
+    reloaded: false,
+    frame,
+    settings,
+    storage,
+    devtools,
+  };
+
+  // Keep the window reference (prevent garbage collection)
+  WindowHandles.set(wid, handle);
+
+  // Emitted when the window is closed.
+  theWindow.on('closed', () => {
+    saveWindowConfig(handle);
+    // Dereference the window object (allow garbage collection)
+    WindowHandles.delete(wid);
+  });
+
+  // Load the index.html of the app.
+  if (DEVEL || LOCAL)
+    process.env.ELECTRON_DISABLE_SECURITY_WARNINGS = 'true';
+
+  theWindow.loadURL(getURL());
+
+  // Load Finished
+  theWindow.once('ready-to-show', () => {
+    if (DEVEL || LOCAL)
+      process.env.ELECTRON_DISABLE_SECURITY_WARNINGS = 'false';
+    if (DEVEL && devtools) {
+      webContents.openDevTools();
+    }
+    theWindow.show();
+  });
+
+  // Focus Management
+  theWindow.on('focus', () => webContents.send('dome.ipc.focus', true));
+  theWindow.on('blur', () => webContents.send('dome.ipc.focus', false));
+
+  // URL Navigation
+  webContents.on('will-navigate', navigateURL(webContents));
+  webContents.on('did-navigate-in-page', navigateURL(webContents));
+
+  // Application Startup
+  webContents.on('did-finish-load', () => {
+    if (!handle.reloaded) {
+      handle.reloaded = true;
+    } else {
+      broadcast('dome.ipc.reload');
+    }
+    webContents.send('dome.ipc.command', argv, wdir);
+  });
+
+  // Emitted when the window want's to close.
+  theWindow.on('close', () => {
+    handle.frame = theWindow.getBounds();
+    handle.devtools = webContents.isDevToolsOpened();
+    webContents.send('dome.ipc.closing');
+  });
+
+  // Keep track of frame positions (in DEVEL)
+  if (DEVEL) {
+    const saveFrame = _.debounce(() => {
+      handle.frame = theWindow.getBounds();
+      handle.devtools = webContents.isDevToolsOpened();
+      saveWindowConfig(handle);
+    }, 300);
+    theWindow.on('resize', saveFrame);
+    theWindow.on('moved', saveFrame);
+  }
+
+  return theWindow;
+}
+
+// --------------------------------------------------------------------------
+// --- Application Window(s) & Command Line
+// --------------------------------------------------------------------------
+
+function stripElectronArgv(argv: string[]) {
+  return argv.slice(DEVEL ? 3 : (LOCAL ? 2 : 1)).filter((p) => !!p);
+}
+
+function createPrimaryWindow() {
+  // Initialize Menubar
+  Menubar.install();
+
+  // React Developper Tools
+  if (DEVEL)
+    installExtension(REACT_DEVELOPER_TOOLS, true).catch((err) => {
+      console.error('[Dome] Enable to install React dev-tools', err);
+    });
+  const cwd = process.cwd();
+  const wdir = cwd === '/' ? app.getPath('home') : cwd;
+  const argv = stripElectronArgv(process.argv);
+  createBrowserWindow({ title: appName }, argv, wdir);
+}
+
+let appCount = 1;
+
+function createSecondaryWindow(
+  _event: Electron.Event,
+  electronArgv: string[],
+  wdir: string,
+) {
+  const argv = stripElectronArgv(electronArgv);
+  createBrowserWindow({ title: `${appName} #${++appCount}` }, argv, wdir);
+}
+
+function createDesktopWindow() {
+  const wdir = app.getPath('home');
+  createBrowserWindow({ title: `${appName} #${++appCount}` }, [], wdir);
+}
+
+// --------------------------------------------------------------------------
+// --- Activate Windows (macOS)
+// --------------------------------------------------------------------------
+
+function activateWindows() {
+  let isFocused = false;
+  let toFocus: BrowserWindow | undefined;
+  BrowserWindow.getAllWindows().forEach((w) => {
+    w.show();
+    if (w.isFocused()) isFocused = true;
+    else if (!toFocus) toFocus = w;
+  });
+  if (!isFocused) {
+    if (toFocus) toFocus.focus();
+    else {
+      // No focusable nor focused window
+      createDesktopWindow();
+    }
+  }
+}
+
+// --------------------------------------------------------------------------
+// --- Settings Window
+// --------------------------------------------------------------------------
+
+let PreferenceWindow: BrowserWindow | undefined;
+
+function showSettingsWindow() {
+  if (!PreferenceWindow)
+    PreferenceWindow = createBrowserWindow({
+      title: `${appName} Settings`,
+      width: 256,
+      height: 248,
+      fullscreen: false,
+      maximizable: false,
+      minimizable: false,
+    });
+  PreferenceWindow.show();
+  PreferenceWindow.on('closed', () => { PreferenceWindow = undefined; });
+}
+
+function restoreDefaultSettings() {
+  GlobalSettings = {};
+  if (DEVEL) saveGlobalSettings();
+
+  WindowHandles.forEach((handle) => {
+    // Keep frame for user comfort
+    handle.settings = {};
+    handle.devtools = handle.window.webContents.isDevToolsOpened();
+    if (DEVEL) saveWindowConfig(handle);
+  });
+
+  broadcast('dome.ipc.settings.defaults');
+}
+
+ipcMain.on('dome.menu.settings', showSettingsWindow);
+ipcMain.on('dome.menu.defaults', restoreDefaultSettings);
+
+// --------------------------------------------------------------------------
+// --- Main Application Starter
+// --------------------------------------------------------------------------
+
+/** Starts the main process. */
+export function start() {
+
+  // Ensures second instance triggers the main one
+  if (!app.requestSingleInstanceLock()) app.quit();
+
+  // Change default locale
+  app.commandLine.appendSwitch('lang', 'en');
+
+  // Listen to application events
+  app.on('ready', createPrimaryWindow); // Wait for Electron init
+  app.on('activate', activateWindows); // Mac OSX response to dock
+  app.on('second-instance', createSecondaryWindow);
+
+  // At-exit callbacks
+  app.on('will-quit', () => {
+    saveGlobalSettings();
+    System.doExit();
+  });
+
+  // On macOS the menu bar stays active until the user explicitly quits.
+  // On other systems, automatically quit when all windows are closed.
+  // Warning: when no event handler is registered, the app automatically
+  // quit when all windows are closed.
+  app.on('window-all-closed', () => {
+    if (System.platform !== 'macos') app.quit();
+  });
+
+}
+
+// --------------------------------------------------------------------------
+// --- MenuBar Management
+// --------------------------------------------------------------------------
+
+/**
+    Define a custom main window menu.
+*/
+export function addMenu(label: string) {
+  Menubar.addMenu(label);
+}
+
+/**
+   Define a custom menu item.
+*/
+export function addMenuItem(spec: Menubar.CustomMenuItemSpec) {
+  Menubar.addMenuItem(spec);
+}
+
+/**
+   Update a menu item.
+*/
+export function setMenuItem(spec: Menubar.CustomMenuItem) {
+  Menubar.setMenuItem(spec);
+}
+
+ipcMain.on('dome.ipc.menu.addmenu', (_evt, label) => addMenu(label));
+ipcMain.on('dome.ipc.menu.addmenuitem', (_evt, spec) => addMenuItem(spec));
+ipcMain.on('dome.ipc.menu.setmenuitem', (_evt, spec) => setMenuItem(spec));
+
+// --------------------------------------------------------------------------
diff --git a/ivette/src/dome/main/menubar.ts b/ivette/src/dome/main/menubar.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5ca2f7ed903e25445a82f67b147a64e0c08c913c
--- /dev/null
+++ b/ivette/src/dome/main/menubar.ts
@@ -0,0 +1,434 @@
+// --------------------------------------------------------------------------
+// --- Menus & MenuBar Management
+// --------------------------------------------------------------------------
+
+/* eslint-disable max-len */
+/* eslint-disable @typescript-eslint/camelcase */
+
+import { app, ipcMain, BrowserWindow, Menu, MenuItem, shell } from 'electron';
+import * as System from 'dome/system';
+
+// --------------------------------------------------------------------------
+// --- Special Callbacks
+// --------------------------------------------------------------------------
+
+function reloadWindow() {
+  reset(); // declared below
+  BrowserWindow.getAllWindows().forEach((win) => {
+    if (win) {
+      try {
+        win.webContents.send('dome.ipc.closing');
+        win.reload();
+      } catch (err) {
+        console.warn('[Reload]', win.id, err);
+      }
+    }
+  });
+}
+
+function toggleFullScreen(_item: MenuItem, focusedWindow: BrowserWindow) {
+  if (focusedWindow)
+    focusedWindow.setFullScreen(!focusedWindow.isFullScreen());
+}
+
+function toggleDevTools(_item: MenuItem, focusedWindow: BrowserWindow) {
+  if (focusedWindow)
+    focusedWindow.webContents.toggleDevTools();
+}
+
+// --------------------------------------------------------------------------
+// --- Menu Utilities
+// --------------------------------------------------------------------------
+
+export type MenuItemSpec = Electron.MenuItemConstructorOptions;
+export type MenuSpec = MenuItemSpec[];
+
+const Separator: MenuItemSpec = { type: 'separator' };
+
+function concatSep(...menus: MenuSpec[]): MenuSpec {
+  let menu: MenuItemSpec[] = [];
+  let needsep = false;
+  menus.forEach((items) => {
+    const n = items.length;
+    if (n > 0) {
+      if (needsep) menu.push(Separator);
+      menu = menu.concat(items);
+      needsep = (items[n - 1].type !== 'separator');
+    }
+  });
+  return menu;
+}
+
+// --------------------------------------------------------------------------
+// --- MacOS Menu Items
+// --------------------------------------------------------------------------
+
+const macosAppMenuItems = (appName: string): MenuSpec => [
+  {
+    label: `About ${appName}`,
+    role: 'about',
+  },
+  Separator,
+  {
+    label: 'Preferences…',
+    accelerator: 'Command+,',
+    click: () => ipcMain.emit('dome.menu.settings'),
+  },
+  {
+    label: 'Restore Defaults',
+    click: () => ipcMain.emit('dome.menu.defaults'),
+  },
+  Separator,
+  {
+    label: 'Services',
+    submenu: [],
+    role: 'services',
+  },
+  Separator,
+  {
+    label: `Hide ${appName}`,
+    accelerator: 'Command+H',
+    role: 'hide',
+  }, {
+    label: 'Hide Others',
+    accelerator: 'Command+Alt+H',
+    role: 'hideOthers',
+  }, {
+    label: 'Show All',
+    role: 'unhide',
+  },
+  Separator,
+  {
+    label: 'Quit',
+    accelerator: 'Command+Q',
+    role: 'quit',
+  },
+];
+
+// --------------------------------------------------------------------------
+// --- File Menu Items (platform dependant)
+// --------------------------------------------------------------------------
+
+const fileMenuItems_custom: MenuSpec = [];
+
+const fileMenuItems_linux: MenuSpec = [
+  {
+    label: 'Preferences…',
+    click: () => ipcMain.emit('dome.menu.settings'),
+  },
+  {
+    label: 'Restore Defaults',
+    click: () => ipcMain.emit('dome.menu.defaults'),
+  },
+  Separator,
+  {
+    label: 'Exit',
+    accelerator: 'Ctrl+Q',
+    role: 'quit',
+  },
+];
+
+// --------------------------------------------------------------------------
+// --- Edit Menu Items
+// --------------------------------------------------------------------------
+
+const editMenuItems_custom: MenuSpec = [];
+
+const editMenuItems: MenuSpec = [
+  {
+    label: 'Undo',
+    accelerator: 'CmdOrCtrl+Z',
+    role: 'undo',
+  }, {
+    label: 'Redo',
+    accelerator: 'Shift+CmdOrCtrl+Z',
+    role: 'redo',
+  },
+  Separator,
+  {
+    label: 'Cut',
+    accelerator: 'CmdOrCtrl+X',
+    role: 'cut',
+  }, {
+    label: 'Copy',
+    accelerator: 'CmdOrCtrl+C',
+    role: 'copy',
+  }, {
+    label: 'Paste',
+    accelerator: 'CmdOrCtrl+V',
+    role: 'paste',
+  }, {
+    label: 'Select All',
+    accelerator: 'CmdOrCtrl+A',
+    role: 'selectAll',
+  },
+  Separator,
+  {
+    label: 'Find',
+    accelerator: 'CmdOrCtrl+F',
+    click: (
+      _item: Electron.MenuItem,
+      window: Electron.BrowserWindow,
+      _evt: Electron.KeyboardEvent,
+    ) => window.webContents.send('dome.ipc.find'),
+  },
+];
+
+// --------------------------------------------------------------------------
+// --- View Menu Items
+// --------------------------------------------------------------------------
+
+const viewMenuItems_custom: MenuSpec = [];
+
+const viewMenuItems = (osx: boolean): MenuSpec => [
+  {
+    label: 'Reload',
+    accelerator: 'CmdOrCtrl+R',
+    click: reloadWindow,
+  }, {
+    label: 'Toggle Full Screen',
+    accelerator: (osx ? 'Ctrl+Command+F' : 'F11'),
+    click: toggleFullScreen,
+  }, {
+    label: 'Toggle Developer Tools',
+    accelerator: (osx ? 'Alt+Command+I' : 'Ctrl+Shift+I'),
+    click: toggleDevTools,
+  },
+];
+
+// --------------------------------------------------------------------------
+// --- Window Menu Items
+// --------------------------------------------------------------------------
+
+const windowMenuItems_linux: MenuSpec = [
+  {
+    label: 'Minimize',
+    accelerator: 'CmdOrCtrl+M',
+    role: 'minimize',
+  }, {
+    label: 'Close',
+    accelerator: 'CmdOrCtrl+W',
+    role: 'close',
+  },
+  Separator,
+  {
+    label: 'Reopen Window',
+    accelerator: 'CmdOrCtrl+Shift+T',
+    enabled: false,
+    click: () => { app.emit('activate'); },
+  },
+];
+
+const windowMenuItems_macos: MenuSpec = windowMenuItems_linux.concat([
+  {
+    label: 'Bring All to Front',
+    role: 'front',
+  },
+]);
+
+// --------------------------------------------------------------------------
+// --- Help Menu Items
+// --------------------------------------------------------------------------
+
+const helpMenuItems: MenuSpec = [
+  {
+    label: 'Learn More',
+    click() {
+      shell.openExternal('http://electron.atom.io');
+    },
+  },
+];
+
+// --------------------------------------------------------------------------
+// --- Update MenuBar (async)
+// --------------------------------------------------------------------------
+
+let updateRequired = false;
+let updateTriggered = false;
+
+function requestUpdate() {
+  if (updateRequired && !updateTriggered) {
+    updateTriggered = true;
+    setImmediate(install);
+  }
+}
+
+// --------------------------------------------------------------------------
+// --- CustomMenus
+// --------------------------------------------------------------------------
+
+interface CustomMenu extends Electron.MenuItemConstructorOptions {
+  label: string;
+  submenu: MenuSpec;
+}
+
+const customMenus: CustomMenu[] = [];
+
+type ItemEntry = { spec: MenuItemSpec; item?: MenuItem };
+
+const customItems = new Map<string, ItemEntry>();
+
+function findMenu(label: string): MenuSpec | undefined {
+  switch (label) {
+    case 'File': return fileMenuItems_custom;
+    case 'Edit': return editMenuItems_custom;
+    case 'View': return viewMenuItems_custom;
+    default: {
+      const cm = customMenus.find((m) => m.label === label);
+      return cm && cm.submenu;
+    }
+  }
+}
+
+export function addMenu(label: string) {
+  if (findMenu(label)) {
+    console.warn(`Already defined menu '${label}'`);
+  } else {
+    customMenus.push({ label, submenu: [] });
+  }
+  requestUpdate();
+}
+
+export interface CustomMenuItem extends MenuItemSpec {
+  menu: string;
+  id: string;
+  key?: string;
+}
+
+export interface Separator {
+  menu: string;
+  type: 'separator';
+}
+
+export type CustomMenuItemSpec = Separator | CustomMenuItem;
+
+export function addMenuItem(custom: CustomMenuItemSpec) {
+  const menuSpec = findMenu(custom.menu);
+  if (!menuSpec) {
+    console.error('[Dome] Unknown menu', custom);
+    return;
+  }
+  if (custom.type === 'separator') {
+    menuSpec.push(Separator);
+  } else {
+    const { id, key, ...spec } = custom;
+    if (key) {
+      switch (System.platform) {
+        case 'macos':
+          if (key.startsWith('Cmd+')) spec.accelerator = `Cmd+${key.substring(4)}`;
+          if (key.startsWith('Alt+')) spec.accelerator = `Cmd+Alt+${key.substring(4)}`;
+          if (key.startsWith('Meta+')) spec.accelerator = `Cmd+Shift+${key.substring(5)}`;
+          break;
+        case 'windows':
+        case 'linux':
+        default:
+          if (key.startsWith('Cmd+')) spec.accelerator = `Ctrl+${key.substring(4)}`;
+          if (key.startsWith('Alt+')) spec.accelerator = `Alt+${key.substring(4)}`;
+          if (key.startsWith('Meta+')) spec.accelerator = `Ctrl+Alt+${key.substring(5)}`;
+          break;
+      }
+    }
+    const entry = customItems.get(id);
+    if (entry) {
+      if (!System.DEVEL) {
+        console.error('[Dome] Duplicate menu item:', custom);
+        return;
+      }
+      if (entry.spec) Object.assign(entry.spec, spec);
+      if (entry.item) Object.assign(entry.item, spec);
+    } else {
+      if (!spec.click && !spec.role)
+        spec.click = (
+          _item: Electron.MenuItem,
+          window: Electron.BrowserWindow,
+          _evt: Electron.KeyboardEvent,
+        ) => window.webContents.send('dome.ipc.menu.clicked', id);
+      customItems.set(id, { spec });
+      menuSpec.push(spec);
+    }
+  }
+  requestUpdate();
+}
+
+export function setMenuItem({ id, ...options }: CustomMenuItem) {
+  const entry = customItems.get(id);
+  if (entry) {
+    if (entry.spec) Object.assign(entry.spec, options);
+    if (entry.item) Object.assign(entry.item, options);
+    if (options.label || options.type || options.click) requestUpdate();
+  } else
+    console.warn(`[Dome] unknown menu item #${id}`);
+}
+
+// --------------------------------------------------------------------------
+// --- Menu Bar Template
+// --------------------------------------------------------------------------
+
+function template(): CustomMenu[] {
+  switch (System.platform) {
+    case 'macos':
+      return ([] as CustomMenu[]).concat(
+        [
+          { label: app.name, submenu: macosAppMenuItems(app.name) },
+          { label: 'File', submenu: fileMenuItems_custom },
+          { label: 'Edit', submenu: concatSep(editMenuItems, editMenuItems_custom) },
+          { label: 'View', submenu: concatSep(viewMenuItems_custom, viewMenuItems(true)) },
+        ],
+        customMenus,
+        [
+          { label: 'Window', role: 'window', submenu: windowMenuItems_macos },
+          { label: 'Help', role: 'help', submenu: helpMenuItems },
+        ],
+      );
+    case 'windows':
+    case 'linux':
+    default:
+      return ([] as CustomMenu[]).concat(
+        [
+          { label: 'File', submenu: concatSep(fileMenuItems_custom, fileMenuItems_linux) },
+          { label: 'Edit', submenu: concatSep(editMenuItems, editMenuItems_custom) },
+          { label: 'View', submenu: concatSep(viewMenuItems_custom, viewMenuItems(false)) },
+        ],
+        customMenus,
+        [
+          { label: 'Window', submenu: windowMenuItems_linux },
+          { label: 'Help', submenu: helpMenuItems },
+        ],
+      );
+  }
+}
+
+// --------------------------------------------------------------------------
+// --- MenuBar SetUp
+// --------------------------------------------------------------------------
+
+let menubar: Menu;
+
+function registerCustomItems(menu: Menu) {
+  menu.items.forEach((item: MenuItem) => {
+    const entry = customItems.get(item.id);
+    if (entry) entry.item = item;
+    if (item.submenu) registerCustomItems(item.submenu);
+  });
+}
+
+// Initialize the menubar machinery
+export function install() {
+  updateRequired = true;
+  updateTriggered = false;
+  menubar = Menu.buildFromTemplate(template());
+  registerCustomItems(menubar);
+  Menu.setApplicationMenu(menubar);
+}
+
+// Called by reload above
+function reset() {
+  fileMenuItems_custom.length = 0;
+  editMenuItems_custom.length = 0;
+  viewMenuItems_custom.length = 0;
+  customMenus.length = 0;
+  customItems.clear();
+  install();
+}
+
+// --------------------------------------------------------------------------
diff --git a/ivette/src/dome/src/misc/devtools.js b/ivette/src/dome/misc/devtools.js
similarity index 87%
rename from ivette/src/dome/src/misc/devtools.js
rename to ivette/src/dome/misc/devtools.js
index 4c921aa6c9ed956aaa131813074cb4303c6af844..8042675a83d8abb31b33f494126b4584c4db3d94 100644
--- a/ivette/src/dome/src/misc/devtools.js
+++ b/ivette/src/dome/misc/devtools.js
@@ -7,6 +7,6 @@
 export const REACT_DEVELOPER_TOOLS = undefined ;
 
 // Shall not be used in non-development mode
-export default function installExtension(_id) {
+export default function installExtension(_id,_force) {
   return Promise.resolve();
 }
diff --git a/ivette/src/dome/src/misc/register.js b/ivette/src/dome/misc/register.js
similarity index 100%
rename from ivette/src/dome/src/misc/register.js
rename to ivette/src/dome/misc/register.js
diff --git a/ivette/src/dome/misc/system.ts b/ivette/src/dome/misc/system.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a2eada5dc588abff223fd22c3a4def0bfee250d7
--- /dev/null
+++ b/ivette/src/dome/misc/system.ts
@@ -0,0 +1,634 @@
+/**
+   @packageDocumentation
+   @module dome/system
+*/
+
+/* eslint-disable max-len */
+
+// --------------------------------------------------------------------------
+// --- Evolved Spawn Process
+// --------------------------------------------------------------------------
+
+import _ from 'lodash';
+import Emitter from 'events';
+import Exec from 'child_process';
+import fspath from 'path';
+import fs from 'fs';
+import { app, remote } from 'electron';
+
+declare const __static: string;
+
+// --------------------------------------------------------------------------
+// --- Platform Specificities
+// --------------------------------------------------------------------------
+
+let thePlatform = 'linux';
+switch (process.platform) {
+  case 'darwin':
+    thePlatform = 'macos'; break;
+  case 'win32':
+    thePlatform = 'windows'; break;
+  case 'aix':
+  case 'freebsd':
+  case 'linux':
+  case 'openbsd':
+  case 'sunos':
+    thePlatform = 'linux'; break;
+  default:
+    console.warn(`Unkwnon '${process.platform}' (fallback to 'linux')`);
+    thePlatform = 'linux'; break;
+}
+
+/**
+   @summary System platform.
+   @description
+   Similar to `process.platform`, but fall into fewer categories:
+   - `'macos'` for Mac OSX,
+   - `'windows'` for Windows (32 or 64)
+   - `'linux'` for most unix-like platforms
+
+   Non-recognized platforms will fallback to `'linux'` with the
+   emission of a warning.
+*/
+export const platform = thePlatform;
+
+// --------------------------------------------------------------------------
+// --- Logging
+// --------------------------------------------------------------------------
+
+/** Development mode flag */
+export const DEVEL = process.env.NODE_ENV !== 'production';
+
+// --------------------------------------------------------------------------
+// --- System Emitter
+// --------------------------------------------------------------------------
+
+export const emitter = new Emitter();
+emitter.setMaxListeners(250);
+
+// --------------------------------------------------------------------------
+// --- At Exit
+// --------------------------------------------------------------------------
+
+export type Callback = () => void;
+
+const exitJobs: Callback[] = [];
+
+/**
+   Executes a routine at exit.
+
+   Exceptions thrown by the function are captured and reported on the console.
+ */
+export function atExit(callback: Callback) {
+  exitJobs.push(callback);
+}
+
+/** Execute all pending exit jobs (and flush the list). */
+export function doExit() {
+  exitJobs.forEach((fn) => {
+    try { fn(); }
+    catch (err) { console.error('[Dome] atExit:', err); }
+  });
+  exitJobs.length = 0;
+}
+
+// --------------------------------------------------------------------------
+// --- Command Line Arguments
+// --------------------------------------------------------------------------
+
+let COMMAND_WDIR = '.';
+let COMMAND_ARGV: string[] = [];
+
+function SET_COMMAND(argv: string[], wdir: string) {
+  COMMAND_ARGV = argv;
+  COMMAND_WDIR = wdir;
+}
+
+// --------------------------------------------------------------------------
+// --- User's Directories
+// --------------------------------------------------------------------------
+
+const appProxy = app || remote.app;
+
+/** Returns user's home directory. */
+export function getHome() { return appProxy.getPath('home'); }
+
+/** Returns user's desktop directory. */
+export function getDesktop() { return appProxy.getPath('desktop'); }
+
+/** Returns user's documents directory. */
+export function getDocuments() { return appProxy.getPath('documents'); }
+
+/** Returns user's downloads directory. */
+export function getDownloads() { return appProxy.getPath('downloads'); }
+
+/**
+   Working directory (Application Window).
+
+   This the current working directory from where the application window
+   was opened.
+
+   The function returns `undefined` until the `dome.command` event has
+   been emitted from the `Main` process.
+
+   See also [[dome.onCommand]]
+*/
+export function getWorkingDir() { return COMMAND_WDIR; }
+
+/**
+   Returns the current process ID.
+ */
+export function getPID() { return process.pid; }
+
+/**
+   Command-line arguments (Application Window).
+
+   This the command-line arguments used to open the application window.
+
+   The function returns `undefined` until the `dome.command`
+   event has been emitted from the `Main` process.
+
+   See also [[dome.onCommand]]
+*/
+export function getArguments() { return COMMAND_ARGV; }
+
+/** Returns path of static assets.
+
+    Returns the path to the associated `./static/<...path>` of your
+    application. The `./static/` directory is automatically packed
+    into your application by Dome thanks to `electron-webpack` default
+    configuration.
+*/
+export function getStatic(...path: string[]) {
+  return fspath.join(__static, ...path);
+}
+
+// --------------------------------------------------------------------------
+// --- File Join
+// --------------------------------------------------------------------------
+
+/**
+   @summary Join file paths.
+   @param {string} [...paths] - a sequence of path segments
+   @return {string} the joined filepath
+   @description
+   Same as [Node `path.join`](https://nodejs.org/dist/latest-v12.x/docs/api/path.html#path_path_join_paths)
+*/
+export const { join } = fspath;
+
+/**
+   @summary Absolute (joined) file paths.
+   @param {string} [...paths] - a sequence of path segments
+   @return {string} the corresponding absolute path
+   @description
+   Same as [Node `path.resolve`](https://nodejs.org/dist/latest-v12.x/docs/api/path.html#path_path_resolve_paths)
+*/
+export const { resolve } = fspath;
+
+/**
+   @summary Dirname of path.
+   @param {string} path - a file path
+   @return {string} the dirname of the path
+   @description
+   Same as [Node `path.dirname`](https://nodejs.org/dist/latest-v12.x/docs/api/path.html#path_path_dirname_path)
+*/
+export const { dirname } = fspath;
+
+/**
+   @summary Basename of path.
+   @param {string} path - a file path
+   @param {string} [ext] - file extension to remove
+   @return {string} the basename of the path
+   @description
+   Same as [Node `path.basename`](https://nodejs.org/dist/latest-v12.x/docs/api/path.html#path_path_basename_path_ext)
+*/
+export const { basename } = fspath;
+
+/**
+   @summary File extension of path.
+   @param {string} path - a file path
+   @return {string} the file extension of the path
+   @description
+   Same as [Node `path.extname`](https://nodejs.org/dist/latest-v12.x/docs/api/path.html#path_path_extname_path)
+*/
+export const { extname } = fspath;
+
+// --------------------------------------------------------------------------
+// --- File Stats
+// --------------------------------------------------------------------------
+
+/**
+   Returns an `fs.stat()` object for the path.
+
+   Promisified [Node `fs.stat`](https://nodejs.org/dist/latest-v12.x/docs/api/fs.html#fs_fs_stat_path_callback).
+
+   Returns a (promised) [Node `fs.Stats`](https://nodejs.org/dist/latest-v12.x/docs/api/fs.html#fs_class_fs_stats) object,
+   including the following usefull fields and methods (and more):
+   - `stats.isFile()` returns `true` for a regular file
+   - `stats.isDirectory()` returns `true` for a directory
+   - `stats.mode` the bitfield (integer) of the file access mode
+   - `stats.size` the size of the file (in bytes)
+   - `stats.mtime` last modification time stamp (javascript `Date` object)
+
+   The promise is rejected if the file does not exists.
+*/
+export function fileStat(path: string): Promise<fs.Stats> {
+  return new Promise((result, reject) => {
+    fs.stat(path, (err, data) => (err ? reject(err) : result(data)));
+  });
+}
+
+/**
+   Checks if a path exists and is a regular file
+   (Synchronous check).
+*/
+export function isFile(path: string) {
+  try {
+    return path && fs.statSync(path).isFile();
+  } catch (_err) {
+    return false;
+  }
+}
+
+/**
+   Checks if a path exists and is a directory
+   (Synchronous check).
+*/
+export function isDirectory(path: string) {
+  try {
+    return path && fs.statSync(path).isDirectory();
+  } catch (_err) {
+    return false;
+  }
+}
+
+/**
+   Checks if a path exists and is a file or directory
+   (Synchronous check).
+*/
+export function exists(path: string) {
+  try {
+    if (!path) return false;
+    const stats = fs.statSync(path);
+    return stats.isFile() || stats.isDirectory();
+  } catch (_err) {
+    return false;
+  }
+}
+
+// --------------------------------------------------------------------------
+// --- Read File
+// --------------------------------------------------------------------------
+
+/**
+   Reads a textual file contents.
+
+   Promisified
+   [Node `fs.readFile`](https://nodejs.org/dist/latest-v12.x/docs/api/fs.html#fs_fs_readfile_path_options_callback)
+   using `UTF-8` encoding.
+ */
+export function readFile(path: string): Promise<string> {
+  return new Promise((result, reject) => {
+    fs.readFile(path, 'UTF-8', (err, data) => (err ? reject(err) : result(data)));
+  });
+}
+
+// --------------------------------------------------------------------------
+// --- Write File
+// --------------------------------------------------------------------------
+
+/**
+   Writes a textual content in a file.
+
+   Promisified
+   [Node `fs.writeFile`](https://nodejs.org/dist/latest-v12.x/docs/api/fs.html#fs_fs_writefile_file_data_options_callback)
+   using `UTF-8` encoding.
+ */
+export function writeFile(path: string, content: string): Promise<void> {
+  return new Promise((result, reject) => {
+    fs.writeFile(path, content, 'UTF-8', (err) => (err ? reject(err) : result()));
+  });
+}
+
+// --------------------------------------------------------------------------
+// --- Copy File
+// --------------------------------------------------------------------------
+
+/**
+   Copy file to a new path.
+   @param srcPath - the source file path
+   @param tgtPath - the target file path
+
+   Promisified
+   [Node `fs.copyFile`](https://nodejs.org/dist/latest-v12.x/docs/api/fs.html#fs_fs_copyfile_src_dest_flags_callback)
+   using `UTF-8` encoding.
+ */
+export function copyFile(srcPath: string, tgtPath: string): Promise<void> {
+  return new Promise((result, reject) => {
+    fs.copyFile(srcPath, tgtPath, (err) => (err ? reject(err) : result()));
+  });
+}
+
+// --------------------------------------------------------------------------
+// --- Read Directory
+// --------------------------------------------------------------------------
+
+/**
+   Reads a directory.
+   @returns directory contents (local names)
+
+   Promisified
+   [Node `fs.readdir`](https://nodejs.org/dist/latest-v12.x/docs/api/fs.html#fs_fs_readdir_path_options_callback).
+
+   Uses `UTF-8` encoding to obtain (relative) file names instead of byte buffers. On MacOS, `.DS_Store` entries
+   are filtered out.
+*/
+export function readDir(path: string): Promise<string[]> {
+  const filterDir = (f: string) => f !== '.DS_Store';
+  return new Promise((result, reject) => {
+    fs.readdir(
+      path,
+      { encoding: 'UTF-8', withFileTypes: true },
+      (err: NodeJS.ErrnoException | null, files: fs.Dirent[]) => {
+        if (err) reject(err);
+        else result(files.map((fn) => fn.name).filter(filterDir));
+      },
+    );
+  });
+}
+
+// --------------------------------------------------------------------------
+// --- Make Directory
+// --------------------------------------------------------------------------
+
+const CREATE_DIR_OPTIONS: fs.MakeDirectoryOptions = {
+  recursive: true,
+  mode: 0o777,
+};
+
+/**
+   Creates a new directory. Defaults permission is recursive `0o777`.
+
+   Promisified
+   [Node `fs.mkdir`](https://nodejs.org/dist/latest-v12.x/docs/api/fs.html#fs_fs_mkdir_path_options_callback).
+
+*/
+export function mkDir(
+  path: string,
+  options?: number | fs.MakeDirectoryOptions,
+): Promise<void> {
+  return new Promise((result, reject) => {
+    fs.mkdir(path, options ?? CREATE_DIR_OPTIONS, (err) => {
+      if (err) reject(err); else result();
+    });
+  });
+}
+
+// --------------------------------------------------------------------------
+// --- Remove File
+// --------------------------------------------------------------------------
+
+/**
+   Remove a file.
+
+   Promisified
+   [Node `fs.unlink`](https://nodejs.org/dist/latest-v12.x/docs/api/fs.html#fs_fs_unlink_path_callback)
+*/
+export function remove(path: string): Promise<void> {
+  return new Promise((result, reject) => {
+    fs.unlink(path, (err) => (err ? reject(err) : result()));
+  });
+}
+
+// --------------------------------------------------------------------------
+// --- Remove Directory
+// --------------------------------------------------------------------------
+
+// Not (yet) implemented in Node for Electron
+function rmDirNonRec(path: string): Promise<void> {
+  return new Promise((result, reject) => {
+    fs.rmdir(path, (err) => (err ? reject(err) : result()));
+  });
+}
+
+// Not (yet) implemented in Node for Electron
+async function rmDirRec(path: string): Promise<void> {
+  try {
+    const stats = fs.statSync(path);
+    if (stats.isFile()) {
+      return remove(path);
+    }
+    if (stats.isDirectory()) {
+      const rmDirSub = (name: string) => {
+        rmDirRec(fspath.join(path, name));
+      };
+      const entries = await readDir(path);
+      await Promise.all(entries.map(rmDirSub));
+      await rmDirNonRec(path);
+      return;
+    }
+  } catch (err) {
+    if (DEVEL) console.warn('[Dome.rmDirRec]', err);
+  }
+}
+
+export interface RmDirOptions {
+  recursive: boolean;
+}
+
+/**
+   Removes a directory.
+
+   Promisified
+   [Node `fs.rmdir`](https://nodejs.org/dist/latest-v12.x/docs/api/fs.html#fs_fs_mkdir_path_options_callback).
+
+*/
+export function rmDir(path: string, options?: RmDirOptions): Promise<void> {
+  return (options?.recursive ?? true) ? rmDirRec(path) : rmDirNonRec(path);
+}
+
+// --------------------------------------------------------------------------
+// --- Rename File
+// --------------------------------------------------------------------------
+
+/**
+   Renames of file of direcory.
+
+   Promisified
+   [Node `fs.rename`](https://nodejs.org/dist/latest-v12.x/docs/api/fs.html#fs_fs_rename_oldpath_newpath_callback)
+*/
+export function rename(oldPath: string, newPath: string): Promise<void> {
+  return new Promise((result, reject) => {
+    fs.rename(oldPath, newPath, (err) => (err ? reject(err) : result()));
+  });
+}
+
+// --------------------------------------------------------------------------
+// --- Child Process
+// --------------------------------------------------------------------------
+
+const childprocess = new Map<number, Exec.ChildProcess>();
+
+atExit(() => {
+  childprocess.forEach((process, pid) => {
+    try { process.kill(); }
+    catch (err) {
+      if (DEVEL) console.warn('[Dome.atExit] killing process', pid, err);
+    }
+  });
+});
+
+export type StdPipe = { path?: string | undefined; mode?: number; pipe?: boolean };
+export type StdOptions = undefined | 'null' | 'ignore' | 'pipe' | StdPipe;
+
+type stdio = { io: number | 'pipe' | 'ignore' | 'ipc'; fd?: number };
+
+function stdSpec(spec: StdOptions, isOutput: boolean): stdio {
+  switch (spec) {
+    case undefined:
+      return { io: isOutput ? 'pipe' : 'ignore' };
+    case null:
+    case 'null':
+    case 'ignore':
+      return { io: 'ignore' };
+    case 'pipe':
+      return { io: 'pipe' };
+    default: {
+      let fd: number | undefined;
+      if (spec.path) fd = fs.openSync(spec.path, spec.mode || (isOutput ? 'w' : 'r'));
+      return (isOutput && spec.pipe) ? { io: 'pipe', fd } : { io: fd ?? 'ignore' };
+    }
+  }
+}
+
+interface Readable {
+  pipe(out: fs.WriteStream): void;
+  unpipe(out: fs.WriteStream): void;
+}
+
+function pipeTee(std: Readable, fd: number) {
+  if (!fd) return;
+  const out = fs.createWriteStream('<ignored>', { fd, encoding: 'UTF-8' });
+  out.on('error', (err) => {
+    console.warn('[Dome] can not pipe:', err);
+    std.unpipe(out);
+  });
+  std.pipe(out);
+}
+
+export interface ProcessOptions {
+  /** Defaults to the application current working directory. */
+  cwd?: string;
+  env?: { [VAR: string]: string };
+  stdin?: StdOptions;
+  stdout?: StdOptions;
+  stderr?: StdOptions;
+  /** Use a Node child process with inter-node process RPC. */
+  fork?: boolean;
+}
+
+/**
+   Spawn a child process.
+
+   Based on [Node `child_process.spawn`](https://nodejs.org/dist/latest-v12.x/docs/api/child_process.html#child_process_child_process_spawn_command_args_options). The promised process object is a regular [Node `ChildProcess`](https://nodejs.org/api/child_process.html#child_process_class_childprocess) object, for which we recall the main useful methods below:
+
+   - `child.on('exit',(code) => {...})` emitted event when the process is terminated
+   - `child.on('close',(code) => {...})` emitted event when the process is fully terminated (all pipes closed)
+   - `child.on('message',(...data) => {...})` emitted from the _forked_ process (if applicable)
+   - `child.stdout.on('data',(text) => {...})` emitted when the process writes on piped stdout (receives `UTF-8` strings)
+   - `child.stderr.on('data',(text) => {...})` emitted when the process writes on piped stderr (receives `UTF-8` strings)
+   - `child.kill()` sends a `'SIGTERM'` unix message to the process
+
+   Options is an object similar to the original Node options, with small adaptations.
+   The possible option fields are described as follows:
+
+   Environment variables are _added_ to the default `process.env` environment.
+
+   All pipes have their encoding set to `UTF-8`,
+   hence all callbacks on process events will receive natural strings instead of raw byte buffers.
+
+   When specifying a file for a process standard stream, an optional mode can be specified.
+   Default is `'r'` for input streams and `'w'` for output ones.
+   If option `pipe:true` is provided (output streams only), the output of the process is
+   also piped through the Process object. The file-path is relative to the current working directory
+   of the _application_, not be confused with the `cwd` option of the spawned command.
+
+   When the `fork` flag is set, the child process is spawned using
+   [Node `child_process.fork`](https://nodejs.org/dist/latest-v12.x/docs/api/child_process.html#child_process_child_process_fork_modulepath_args_options). This enables Node inter-process communication _via_ the
+   `process.send()` and `process.on('message')` methods of the child process object.
+*/
+
+export function spawn(
+  command: string,
+  args?: string[],
+  options?: ProcessOptions,
+): Promise<Exec.ChildProcess> {
+  return new Promise((result, reject) => {
+
+    const cwd = options ? options.cwd : undefined;
+    const env = options && options.env ? ({ ...process.env, ...options.env }) : undefined;
+    const stdin = stdSpec(options && options.stdin, false);
+    const stdout = stdSpec(options && options.stdout, true);
+    const stderr = stdSpec(options && options.stderr, true);
+    const stdio = [stdin.io, stdout.io, stderr.io];
+    const opt: Exec.ForkOptions = { cwd, env, stdio };
+    const fork = options && options.fork;
+    const cargs = args ? args.slice() : [];
+    let child: Exec.ChildProcess | undefined;
+
+    if (fork) {
+      stdio.push('ipc');
+      child = Exec.fork(command, cargs, opt);
+    } else {
+      child = Exec.spawn(command, cargs, opt);
+    }
+
+    if (!child) reject(new Error(
+      `[Dome] Unable to create process ('${command}')`,
+    ));
+
+    const { pid } = child;
+
+    if (!pid) {
+      // Must defer rejection, otherwise an uncaught exception is raised.
+      child.on('error', (err) => reject(err));
+      return;
+    }
+
+    childprocess.set(pid, child);
+    child.on('exit', () => childprocess.delete(pid));
+
+    const out = child.stdout;
+    const err = child.stderr;
+
+    if (out && stdout.fd) {
+      out.setEncoding('UTF-8');
+      pipeTee(out, stdout.fd);
+    }
+    if (err && stderr.fd) {
+      err.setEncoding('UTF-8');
+      pipeTee(err, stderr.fd);
+    }
+
+    result(child);
+  });
+}
+
+// --------------------------------------------------------------------------
+// --- Window Management
+// --------------------------------------------------------------------------
+
+const WINDOW_APPLICATION_ARGV = '--dome-application-window';
+const WINDOW_PREFERENCES_ARGV = '--dome-preferences-window';
+
+// --------------------------------------------------------------------------
+// --- Only used for inter-module initialisation
+// --------------------------------------------------------------------------
+
+export default {
+  SET_COMMAND,
+  WINDOW_APPLICATION_ARGV,
+  WINDOW_PREFERENCES_ARGV,
+};
+
+// --------------------------------------------------------------------------
diff --git a/ivette/src/dome/src/misc/utils.ts b/ivette/src/dome/misc/utils.ts
similarity index 100%
rename from ivette/src/dome/src/misc/utils.ts
rename to ivette/src/dome/misc/utils.ts
diff --git a/ivette/src/dome/src/renderer/controls/buttons.tsx b/ivette/src/dome/renderer/controls/buttons.tsx
similarity index 98%
rename from ivette/src/dome/src/renderer/controls/buttons.tsx
rename to ivette/src/dome/renderer/controls/buttons.tsx
index f3f2c0a38ce7e4039e988a00d6aa2f87d0c41d12..871c37c1221660b797f502e089f64f6fe8b632e4 100644
--- a/ivette/src/dome/src/renderer/controls/buttons.tsx
+++ b/ivette/src/dome/renderer/controls/buttons.tsx
@@ -116,8 +116,7 @@ const LABEL = ({ disabled, label }: LABELprops) => (
 );
 
 export type ButtonKind =
-  undefined | 'default' |
-  'active' | 'primary' | 'warning' | 'positive' | 'negative';
+  'default' | 'active' | 'primary' | 'warning' | 'positive' | 'negative';
 
 export interface ButtonProps {
   /** Text of the label. Prepend to other children elements. */
@@ -240,7 +239,7 @@ export const CircButton = (props: ButtonProps) => {
 // --------------------------------------------------------------------------
 
 export type IconButtonKind =
-  undefined | 'default' | 'negative' | 'positive' | 'warning';
+  undefined | 'selected' | 'default' | 'negative' | 'positive' | 'warning';
 
 export interface IconButtonProps {
   /** Icon identifier. Displayed on the left side of the label. */
@@ -267,6 +266,7 @@ export interface IconButtonProps {
   display?: boolean;
   /** Styled bytton:
      - `'default'`: normal button;
+     - `'selected'`: selection button, in blue;
      - `'warning'`: warning button, in orange;
      - `'positive'`: positive button, in green;
      - `'negative'`: negative button, in red.
@@ -451,7 +451,7 @@ export interface RadioGroupProps<A> {
   /** Additional style for the `< dov /> ` container of Raiods */
   style?: React.CSSProperties;
   /** [[Radio]] Buttons. */
-  children: any;
+  children?: React.ReactNode;
 }
 
 /**
@@ -522,8 +522,8 @@ export interface SelectProps {
   className?: string;
   /** Additional style for the `< dov /> ` container of Raiods */
   style?: React.CSSProperties;
-  /** Shall be [[Item]] elements. */
-  children: any;
+  /** Shall be standard `<option/>` and `<optgroup/>` elements. */
+  children?: React.ReactNode;
 }
 
 /**
diff --git a/ivette/src/dome/src/renderer/controls/gallery.json b/ivette/src/dome/renderer/controls/gallery.json
similarity index 98%
rename from ivette/src/dome/src/renderer/controls/gallery.json
rename to ivette/src/dome/renderer/controls/gallery.json
index 93fb175304006f611729775c94b76890ae82d8dc..62fe91ead33c03e2bd5b866519ffd02dfc3574a8 100644
--- a/ivette/src/dome/src/renderer/controls/gallery.json
+++ b/ivette/src/dome/renderer/controls/gallery.json
@@ -17,6 +17,18 @@
     "viewBox": "0 0 15 16",
     "path": "M9.143 7.143v0.571q0 0.116-0.085 0.201t-0.201 0.085h-5.143q-0.116 0-0.201-0.085t-0.085-0.201v-0.571q0-0.116 0.085-0.201t0.201-0.085h5.143q0.116 0 0.201 0.085t0.085 0.201zM10.286 7.429q0-1.652-1.174-2.826t-2.826-1.174-2.826 1.174-1.174 2.826 1.174 2.826 2.826 1.174 2.826-1.174 1.174-2.826zM14.857 14.857q0 0.473-0.335 0.808t-0.808 0.335q-0.482 0-0.804-0.339l-3.063-3.054q-1.598 1.107-3.563 1.107-1.277 0-2.442-0.496t-2.009-1.339-1.339-2.009-0.496-2.442 0.496-2.442 1.339-2.009 2.009-1.339 2.442-0.496 2.442 0.496 2.009 1.339 1.339 2.009 0.496 2.442q0 1.964-1.107 3.563l3.063 3.063q0.33 0.33 0.33 0.804z"
   },
+  "CURSOR": {
+    "section": "Tools",
+    "viewBox": "0 0 32 32",
+    "title": "Mouse Pointer",
+    "path": "M16.689 17.655l5.311 12.345-4 2-4.646-12.678-7.354 6.678v-26l20 16-9.311 1.655z"
+  },
+  "PIN": {
+    "section": "Tools",
+    "title": "Push Pin",
+    "viewBox": "0 0 16 16",
+    "path": "M8.5 0l-1.5 1.5 1.5 1.5-3.5 4h-3.5l2.75 2.75-4.25 5.635v0.615h0.615l5.635-4.25 2.75 2.75v-3.5l4-3.5 1.5 1.5 1.5-1.5-7.5-7.5zM7 8.5l-1-1 3.5-3.5 1 1-3.5 3.5z"
+  },
   "PAINTBRUSH": {
     "section": "Tools",
     "title": "Paint Brush",
diff --git a/ivette/src/dome/src/renderer/controls/icons.tsx b/ivette/src/dome/renderer/controls/icons.tsx
similarity index 100%
rename from ivette/src/dome/src/renderer/controls/icons.tsx
rename to ivette/src/dome/renderer/controls/icons.tsx
diff --git a/ivette/src/dome/src/renderer/controls/labels.tsx b/ivette/src/dome/renderer/controls/labels.tsx
similarity index 69%
rename from ivette/src/dome/src/renderer/controls/labels.tsx
rename to ivette/src/dome/renderer/controls/labels.tsx
index 28c1b23777a292e970418364efb5d4e4c4afd22d..ca1630fc302230e8ff3c11f447b030ce131c9e72 100644
--- a/ivette/src/dome/src/renderer/controls/labels.tsx
+++ b/ivette/src/dome/renderer/controls/labels.tsx
@@ -16,6 +16,7 @@ import './style.css';
 // --- Generic Label
 // --------------------------------------------------------------------------
 
+/** Labels support fowarding refs to their inner [<label/>] element. */
 export interface LabelProps {
   /** Text of the label. Prepend to other children elements. */
   label?: string;
@@ -30,10 +31,16 @@ export interface LabelProps {
   /** If `false`, do not display the label. Default to `true`. */
   display?: boolean;
   /** Additional content of the `<label/>` element. */
-  children?: any;
+  children?: React.ReactNode;
+  /** Click event callback. */
+  onClick?: (evt: React.MouseEvent) => void;
+  /** Click event callback. */
+  onDoubleClick?: (evt: React.MouseEvent) => void;
+  /** Right-click event callback. */
+  onContextMenu?: (evt: React.MouseEvent) => void;
 }
 
-const makeLabel = (className: string, props: LabelProps) => {
+const makeLabel = (className: string) => (props: LabelProps, ref: any) => {
   const { display = true } = props;
   const allClasses = classes(
     className,
@@ -42,9 +49,13 @@ const makeLabel = (className: string, props: LabelProps) => {
   );
   return (
     <label
+      ref={ref}
       className={allClasses}
       title={props.title}
       style={props.style}
+      onClick={props.onClick}
+      onDoubleClick={props.onDoubleClick}
+      onContextMenu={props.onContextMenu}
     >
       {props.icon && <Icon title={props.title} id={props.icon} />}
       {props.label}
@@ -62,24 +73,28 @@ const TITLE = 'dome-xLabel dome-text-title';
 const DESCR = 'dome-xLabel dome-text-descr';
 const TDATA = 'dome-xLabel dome-text-data';
 const TCODE = 'dome-xLabel dome-text-code';
+const TCELL = 'dome-xLabel dome-text-cell';
 
 // --------------------------------------------------------------------------
 // --- Components
 // --------------------------------------------------------------------------
 
 /** Simple labels. */
-export const Label = (props: LabelProps) => makeLabel(LABEL, props);
+export const Label = React.forwardRef(makeLabel(LABEL));
 
 /** Title and headings. */
-export const Title = (props: LabelProps) => makeLabel(TITLE, props);
+export const Title = React.forwardRef(makeLabel(TITLE));
 
 /** Description, textbook content. */
-export const Descr = (props: LabelProps) => makeLabel(DESCR, props);
+export const Descr = React.forwardRef(makeLabel(DESCR));
 
 /** Selectable textual information. */
-export const Data = (props: LabelProps) => makeLabel(TDATA, props);
+export const Data = React.forwardRef(makeLabel(TDATA));
 
 /** Selectable inlined source-code content. */
-export const Code = (props: LabelProps) => makeLabel(TCODE, props);
+export const Code = React.forwardRef(makeLabel(TCODE));
+
+/** Selectable inlined source-code content with default cursor. */
+export const Cell = React.forwardRef(makeLabel(TCELL));
 
 // --------------------------------------------------------------------------
diff --git a/ivette/src/dome/src/renderer/controls/style.css b/ivette/src/dome/renderer/controls/style.css
similarity index 98%
rename from ivette/src/dome/src/renderer/controls/style.css
rename to ivette/src/dome/renderer/controls/style.css
index 17e54575b1f8be877d33f17a444bd07f1a1ebbfb..ffbf1cabcf280cee2b4a4a612cc1b7f35e096128 100644
--- a/ivette/src/dome/src/renderer/controls/style.css
+++ b/ivette/src/dome/renderer/controls/style.css
@@ -237,7 +237,7 @@
 }
 
 .dome-xButton-led-positive {
-    background: radial-gradient( circle at center , #00ff0091 , #00ff00 );
+    background: radial-gradient( circle at center , #50c140, #279c16 );
 }
 
 .dome-xButton-led-negative {
@@ -288,7 +288,7 @@
 .dome-xIconButton-selected:not(:hover) { fill: #449bef ; }
 .dome-xIconButton-selected:hover { fill: #c54dae ; }
 
-.dome-xIconButton-positive { fill: #00d000 ; }
+.dome-xIconButton-positive { fill: #279c16 ; }
 
 .dome-xIconButton-negative { fill: #fb3832 ; }
 
diff --git a/ivette/src/dome/src/renderer/data/compare.ts b/ivette/src/dome/renderer/data/compare.ts
similarity index 100%
rename from ivette/src/dome/src/renderer/data/compare.ts
rename to ivette/src/dome/renderer/data/compare.ts
diff --git a/ivette/src/dome/src/renderer/data/json.ts b/ivette/src/dome/renderer/data/json.ts
similarity index 97%
rename from ivette/src/dome/src/renderer/data/json.ts
rename to ivette/src/dome/renderer/data/json.ts
index 2dfd4a7b52b6c5ad984f6ad6d41ae84fd294a98d..76f304999bf0d97da38455431aae41114f388c05 100644
--- a/ivette/src/dome/src/renderer/data/json.ts
+++ b/ivette/src/dome/renderer/data/json.ts
@@ -11,7 +11,10 @@
 import { DEVEL } from 'dome/system';
 
 export type json =
-  undefined | null | number | string | json[] | { [key: string]: json };
+  undefined | null | boolean | number | string |
+  json[] | { [key: string]: json };
+
+export type jobject = { [key: string]: json };
 
 /**
    Parse without _revivals_.
@@ -83,6 +86,11 @@ export const jNull: Safe<undefined> = () => undefined;
 /** Identity. */
 export const jAny: Safe<json> = (js: json) => js;
 
+/** JSON Object. */
+export const jObj: Loose<jobject> = (js: json) => (
+  typeof js === 'object' && !Array.isArray(js) && js !== null ? js : undefined
+);
+
 /** Primitive JSON number or `undefined`. */
 export const jNumber: Loose<number> = (js: json) => (
   typeof js === 'number' && !Number.isNaN(js) ? js : undefined
diff --git a/ivette/src/dome/src/renderer/data/library.js b/ivette/src/dome/renderer/data/library.js
similarity index 100%
rename from ivette/src/dome/src/renderer/data/library.js
rename to ivette/src/dome/renderer/data/library.js
diff --git a/ivette/src/dome/renderer/data/settings.ts b/ivette/src/dome/renderer/data/settings.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9ca6989bbe1f7b50e89df9727f8ff8ea313c211d
--- /dev/null
+++ b/ivette/src/dome/renderer/data/settings.ts
@@ -0,0 +1,461 @@
+// --------------------------------------------------------------------------
+// --- States
+// --------------------------------------------------------------------------
+
+/**
+   Typed States & Settings
+   @packageDocumentation
+   @module dome/data/settings
+*/
+
+import React from 'react';
+import { ipcRenderer } from 'electron';
+import { debounce } from 'lodash';
+import isEqual from 'react-fast-compare';
+import { emitter as SysEmitter } from 'dome/misc/system';
+import * as JSON from './json';
+import type { State } from './states';
+
+// --------------------------------------------------------------------------
+// --- Settings
+// --------------------------------------------------------------------------
+
+/** @internal */
+interface Settings<A> {
+  decoder: JSON.Loose<A>;
+  encoder: JSON.Encoder<A>;
+  defaultValue: A;
+}
+
+/**
+   Global settings.
+   This utility class allows you to share accross several
+   components and windows the parameters associated to global settings.
+
+   However, it is important to note that global settings are uniquely identified
+   by their `name`. If you have multiple definitions of global settings class
+   with the same name, they will actually share the same value. Hence, if they
+   have different default values or decoders, this might leads to strange
+   results.
+ */
+export class GlobalSettings<A> {
+  name: string;
+  decoder: JSON.Loose<A>;
+  encoder: JSON.Encoder<A>;
+  defaultValue: A;
+  constructor(
+    name: string,
+    decoder: JSON.Loose<A>,
+    encoder: JSON.Encoder<A>,
+    defaultValue: A,
+  ) {
+    this.name = name;
+    this.decoder = decoder;
+    this.encoder = encoder;
+    this.defaultValue = defaultValue;
+  }
+}
+
+// --------------------------------------------------------------------------
+// --- Smart Constructors
+// --------------------------------------------------------------------------
+
+/** Boolean settings with `true` default. */
+export class GTrue extends GlobalSettings<boolean> {
+  constructor(name: string) {
+    super(name, JSON.jBoolean, JSON.identity, true);
+  }
+}
+
+/** Boolean settings with `false` default. */
+export class GFalse extends GlobalSettings<boolean> {
+  constructor(name: string) {
+    super(name, JSON.jBoolean, JSON.identity, false);
+  }
+}
+
+/** Numeric settings (default is zero unless specified). */
+export class GNumber extends GlobalSettings<number> {
+  constructor(name: string, defaultValue = 0) {
+    super(name, JSON.jNumber, JSON.identity, defaultValue);
+  }
+}
+
+/** String settings (default is `""` unless specified). */
+export class GString extends GlobalSettings<string> {
+  constructor(name: string, defaultValue = '') {
+    super(name, JSON.jString, JSON.identity, defaultValue);
+  }
+}
+
+/** Smart constructor for optional (JSON serializable) data. */
+export class GOption<A extends JSON.json>
+  extends GlobalSettings<A | undefined>
+{
+  constructor(name: string, encoder: JSON.Loose<A>, defaultValue?: A) {
+    super(name, encoder, JSON.identity, defaultValue);
+  }
+}
+
+/** Smart constructor for (JSON serializable) data with default. */
+export class GDefault<A extends JSON.json> extends GlobalSettings<A> {
+  constructor(name: string, encoder: JSON.Loose<A>, defaultValue: A) {
+    super(name, encoder, JSON.identity, defaultValue);
+  }
+}
+
+/** Smart constructor for object (JSON serializable) data. */
+export class GObject<A extends JSON.json> extends GlobalSettings<A> {
+  constructor(name: string, fields: JSON.Props<A>, defaultValue: A) {
+    super(name, JSON.jObject(fields), JSON.identity, defaultValue);
+  }
+}
+
+// --------------------------------------------------------------------------
+// --- Generic Settings (private)
+// --------------------------------------------------------------------------
+
+type store = { [key: string]: JSON.json };
+type patch = { key: string; value: JSON.json };
+type driver = {
+  evt: string;
+  ipc: string;
+  globals: boolean; // Global Settings (all windows share the same)
+  defaults: boolean; // Restore defaults on demand
+};
+
+class Driver {
+
+  readonly evt: string; // Global Update Event
+  readonly store: Map<string, JSON.json> = new Map();
+  readonly diffs: Map<string, JSON.json> = new Map();
+  readonly commit: (() => void) & { flush: () => void; cancel: () => void };
+
+  constructor({ evt, ipc, defaults, globals }: driver) {
+    this.evt = evt;
+    // --- Update Events
+    this.commit = debounce(() => {
+      const m = this.diffs;
+      if (m.size > 0) {
+        const patches: patch[] = [];
+        m.forEach((value, key) => {
+          patches.push({ key, value });
+        });
+        m.clear();
+        ipcRenderer.send(ipc, patches);
+      }
+    }, 100);
+    // --- Restore Defaults Events
+    if (defaults) {
+      ipcRenderer.on('dome.ipc.settings.defaults', () => {
+        this.commit.cancel();
+        this.store.clear();
+        this.diffs.clear();
+        SysEmitter.emit(this.evt);
+      });
+    }
+    // --- Broadcast Events
+    if (globals) {
+      ipcRenderer.on(
+        'dome.ipc.settings.broadcast',
+        (_sender, updates: patch[]) => {
+          const m = this.store;
+          const d = this.diffs;
+          updates.forEach(({ key, value }) => {
+            // Don't cancel local updates
+            if (!d.has(key)) {
+              if (value === null)
+                m.delete(key);
+              else
+                m.set(key, value);
+            }
+          });
+          SysEmitter.emit(this.evt);
+        },
+      );
+    }
+    // --- Closing Events
+    ipcRenderer.on('dome.ipc.closing', () => {
+      this.commit();
+      this.commit.flush();
+    });
+  }
+
+  // --- Initial Data
+
+  sync(data: store) {
+    this.commit.cancel();
+    this.store.clear();
+    this.diffs.clear();
+    const m = this.store;
+    Object.keys(data).forEach((k) => { m.set(k, data[k]); });
+    SysEmitter.emit(this.evt);
+  }
+
+  // --- Load Data
+
+  load(key: string | undefined): JSON.json {
+    return key === undefined ? undefined : this.store.get(key);
+  }
+
+  // --- Save Data
+
+  save(key: string | undefined, data: JSON.json) {
+    if (key === undefined) return;
+    if (data === undefined) {
+      this.store.delete(key);
+      this.diffs.set(key, null);
+    } else {
+      this.store.set(key, data);
+      this.diffs.set(key, data);
+    }
+    SysEmitter.emit(this.evt);
+    this.commit();
+  }
+
+}
+
+// --------------------------------------------------------------------------
+// --- Generic Settings Hook
+// --------------------------------------------------------------------------
+
+function useSettings<A>(
+  S: Settings<A>,
+  D: Driver,
+  K?: string,
+): State<A> {
+  // Load value
+  const loader = () => (
+    JSON.jCatch(S.decoder, S.defaultValue)(D.load(K))
+  );
+  // Local state
+  const [value, setValue] = React.useState<A>(loader);
+  // Emit update event
+  React.useEffect(() => {
+    const event = D.evt;
+    const callback = () => setValue(loader());
+    SysEmitter.on(event, callback);
+    return () => { SysEmitter.off(event, callback); };
+  });
+  // Updates
+  const updateValue = React.useCallback((newValue: A) => {
+    if (!isEqual(value, newValue)) {
+      setValue(newValue);
+      if (K) D.save(K, S.encoder(newValue));
+    }
+  }, [S, D, K, value]);
+  return [value, updateValue];
+}
+
+// --------------------------------------------------------------------------
+// --- Window Settings
+// --------------------------------------------------------------------------
+
+const WindowSettingsDriver = new Driver({
+  evt: 'dome.settings.window',
+  ipc: 'dome.ipc.settings.window',
+  globals: false,
+  defaults: true,
+});
+
+/**
+   Returns the current value of the settings (default for undefined key).
+ */
+export function getWindowSettings<A>(
+  key: string | undefined,
+  decoder: JSON.Loose<A>,
+  defaultValue: A,
+): A {
+  return key ?
+    JSON.jCatch(decoder, defaultValue)(WindowSettingsDriver.load(key))
+    : defaultValue;
+}
+
+/**
+   Updates the current value of the settings (on defined key).
+   Most settings are subtypes of `JSON` and do not require any specific
+   encoder. If you have some, simply use it before updating the settings.
+   See [[useWindowSettings]] and [[useWindowSettingsData]].
+ */
+export function setWindowSettings(
+  key: string | undefined,
+  value: JSON.json,
+) {
+  if (key) WindowSettingsDriver.save(key, value);
+}
+
+/**
+   Returns a local state that is saved back to the local window user settings.
+   Local window settings are stored in the `.<appName>` file of the working
+   directory, or in the closest one in parent directories, if any.
+ */
+export function useWindowSettings<A extends JSON.json>(
+  key: string | undefined,
+  decoder: JSON.Loose<A>,
+  defaultValue: A,
+) {
+  return useSettings({
+    decoder,
+    encoder: JSON.identity,
+    defaultValue,
+  }, WindowSettingsDriver, key);
+}
+
+/** Same as [[useWindowSettings]] with a specific encoder. */
+export function useWindowSettingsData<A>(
+  key: string | undefined,
+  decoder: JSON.Loose<A>,
+  encoder: JSON.Encoder<A>,
+  defaultValue: A,
+) {
+  return useSettings({
+    decoder,
+    encoder,
+    defaultValue,
+  }, WindowSettingsDriver, key);
+}
+
+/** Call the callback function on window settings events. */
+export function useWindowSettingsEvent(callback: () => void) {
+  React.useEffect(() => {
+    const { evt } = WindowSettingsDriver;
+    SysEmitter.on(evt, callback);
+    return () => { SysEmitter.off(evt, callback); };
+  });
+}
+
+/** @ignore DEPRECATED */
+export function onWindowSettings(callback: () => void) {
+  const { evt } = WindowSettingsDriver;
+  SysEmitter.on(evt, callback);
+}
+
+/** @ignore DEPRECATED */
+export function offWindowSettings(callback: () => void) {
+  const { evt } = WindowSettingsDriver;
+  SysEmitter.off(evt, callback);
+}
+
+// --------------------------------------------------------------------------
+// --- Local Storage
+// --------------------------------------------------------------------------
+
+const LocalStorageDriver = new Driver({
+  evt: 'dome.settings.storage',
+  ipc: 'dome.ipc.settings.storage',
+  globals: false,
+  defaults: false,
+});
+
+/**
+   Returns the current value of the settings (default for undefined key).
+ */
+export function getLocalStorage<A>(
+  key: string | undefined,
+  decoder: JSON.Loose<A>,
+  defaultValue: A,
+): A {
+  return key ?
+    JSON.jCatch(decoder, defaultValue)(LocalStorageDriver.load(key))
+    : defaultValue;
+}
+
+/**
+   Updates the current value of the settings (on defined key).
+   Most settings are subtypes of `JSON` and do not require any specific
+   encoder. If you have some, simply use it before updating the settings.
+   See [[useLocalStorage]] and [[useWindowSettingsData]].
+ */
+export function setLocalStorage(
+  key: string | undefined,
+  value: JSON.json,
+) {
+  if (key) LocalStorageDriver.save(key, value);
+}
+
+export function useLocalStorage<A extends JSON.json>(
+  key: string | undefined,
+  decoder: JSON.Loose<A>,
+  defaultValue: A,
+) {
+  return useSettings({
+    decoder,
+    encoder: JSON.identity,
+    defaultValue,
+  }, LocalStorageDriver, key);
+}
+
+/** Same as [[useLocalStorage]] with a specific encoder. */
+export function useLocalStorageData<A>(
+  key: string | undefined,
+  decoder: JSON.Loose<A>,
+  encoder: JSON.Encoder<A>,
+  defaultValue: A,
+) {
+  return useSettings({
+    decoder,
+    encoder,
+    defaultValue,
+  }, LocalStorageDriver, key);
+}
+
+/** Call the callback function on window settings events. */
+export function useLocalStorageEvent(callback: () => void) {
+  React.useEffect(() => {
+    const { evt } = LocalStorageDriver;
+    SysEmitter.on(evt, callback);
+    return () => { SysEmitter.off(evt, callback); };
+  });
+}
+
+// --------------------------------------------------------------------------
+// --- Global Settings
+// --------------------------------------------------------------------------
+
+const GlobalSettingsDriver = new Driver({
+  evt: 'dome.settings.global',
+  ipc: 'dome.ipc.settings.global',
+  globals: true,
+  defaults: true,
+});
+
+/**
+   Returns a global state, which is synchronized among all windows, and saved
+   back in the global user settings. The global user settings file is located in
+   the usual place for the application with respect to the underlying system.
+ */
+export function useGlobalSettings<A>(S: GlobalSettings<A>) {
+  return useSettings(S, GlobalSettingsDriver, S.name);
+}
+
+/** Call the callback function on global settings events. */
+export function useGlobalSettingsEvent(callback: () => void) {
+  React.useEffect(() => {
+    const { evt } = GlobalSettingsDriver;
+    SysEmitter.on(evt, callback);
+    return () => { SysEmitter.off(evt, callback); };
+  });
+}
+
+// --------------------------------------------------------------------------
+// --- Settings Synchronization
+// --------------------------------------------------------------------------
+
+/* @ internal */
+export const window = WindowSettingsDriver.evt;
+
+/* @ internal */
+export const global = GlobalSettingsDriver.evt;
+
+/* @ internal */
+export function synchronize() {
+  const data = ipcRenderer.sendSync('dome.ipc.settings.sync');
+  const storage: store = data.storage ?? {};
+  const globals: store = data.globals ?? {};
+  const settings: store = data.settings ?? {};
+  LocalStorageDriver.sync(storage);
+  GlobalSettingsDriver.sync(globals);
+  WindowSettingsDriver.sync(settings);
+}
+
+// --------------------------------------------------------------------------
diff --git a/ivette/src/dome/renderer/data/states.ts b/ivette/src/dome/renderer/data/states.ts
new file mode 100644
index 0000000000000000000000000000000000000000..030a2180b9095f35002e52801dd965da59a3e0d2
--- /dev/null
+++ b/ivette/src/dome/renderer/data/states.ts
@@ -0,0 +1,117 @@
+// --------------------------------------------------------------------------
+// --- States
+// --------------------------------------------------------------------------
+
+/**
+   Local & Global States
+   @packageDocumentation
+   @module dome/data/states
+*/
+
+import React from 'react';
+import Emitter from 'events';
+import isEqual from 'react-fast-compare';
+
+// --------------------------------------------------------------------------
+// --- State utilities
+// --------------------------------------------------------------------------
+
+/** Alias to `[state,setState]` returned values */
+export type State<A> = [A, (newValue: A) => void];
+
+/** State field of an object state. */
+export function keyOf<A, K extends keyof A>(
+  state: State<A>,
+  key: K,
+): State<A[K]> {
+  const [props, setProps] = state;
+  return [props[key], (value: A[K]) => {
+    const newProps = { ...props };
+    newProps[key] = value;
+    setProps(newProps);
+  }];
+}
+
+/** State index of an array state. */
+export function index<A>(
+  state: State<A[]>,
+  idx: number,
+): State<A> {
+  const [array, setArray] = state;
+  return [array[idx], (value: A) => {
+    const newArray = array.slice();
+    newArray[idx] = value;
+    setArray(newArray);
+  }];
+}
+
+/** Log state updates in the console. */
+export function debug<A>(msg: string, st: State<A>): State<A> {
+  const [value, setValue] = st;
+  return [value, (v) => {
+    setValue(v);
+    console.log(msg, v); // eslint-disable-line no-console
+  }];
+}
+
+/** Purely local value. No hook, no events, just a ref. */
+export function local<A>(init: A): State<A> {
+  const ref = { current: init };
+  return [ref.current, (v) => { ref.current = v; }];
+}
+
+// --------------------------------------------------------------------------
+// --- Global States
+// --------------------------------------------------------------------------
+
+const UPDATE = 'dome.states.update';
+
+/** Cross-component State. */
+export class GlobalState<A> {
+
+  private value: A;
+  private emitter: Emitter;
+
+  constructor(initValue: A) {
+    this.value = initValue;
+    this.emitter = new Emitter();
+    this.getValue = this.getValue.bind(this);
+    this.setValue = this.setValue.bind(this);
+  }
+
+  /** Current state value. */
+  getValue() { return this.value; }
+
+  /** Notify callbacks on change, using _deep_ structural comparison. */
+  setValue(value: A) {
+    if (!isEqual(value, this.value)) {
+      this.value = value;
+      this.emitter.emit(UPDATE, value);
+    }
+  }
+
+  /** Callback Emitter. */
+  on(callback: (value: A) => void) {
+    this.emitter.on(UPDATE, callback);
+  }
+
+  /** Callback Emitter. */
+  off(callback: (value: A) => void) {
+    this.emitter.off(UPDATE, callback);
+  }
+
+}
+
+/** React Hook, similar to `React.useState()`.
+    Assignments to the global state also update _all_
+    its associated hooks and listeners. */
+export function useGlobalState<A>(s: GlobalState<A>): State<A> {
+  const [current, setCurrent] = React.useState<A>(s.getValue);
+  React.useEffect(() => {
+    s.on(setCurrent);
+    return () => s.off(setCurrent);
+  }, [s]);
+  return [current, s.setValue];
+}
+
+// --------------------------------------------------------------------------
diff --git a/ivette/src/dome/src/renderer/dialogs.tsx b/ivette/src/dome/renderer/dialogs.tsx
similarity index 100%
rename from ivette/src/dome/src/renderer/dialogs.tsx
rename to ivette/src/dome/renderer/dialogs.tsx
diff --git a/ivette/src/dome/src/renderer/dnd.js b/ivette/src/dome/renderer/dnd.js
similarity index 100%
rename from ivette/src/dome/src/renderer/dnd.js
rename to ivette/src/dome/renderer/dnd.js
diff --git a/ivette/src/dome/renderer/dome.tsx b/ivette/src/dome/renderer/dome.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..12606069a35c248072e1994daa4a1350f415bdf9
--- /dev/null
+++ b/ivette/src/dome/renderer/dome.tsx
@@ -0,0 +1,698 @@
+/**
+   Dome Application (Renderer Process)
+
+   This modules manages your main application window
+   and its interaction with the main process.
+
+   Example:
+
+   * ```ts
+   *   // File 'src/renderer/index.js':
+   *   import Application from './Application.js' ;
+   *   Dome.setContent( Application );
+   * ```
+
+   @packageDocumentation
+   @module dome
+ */
+
+import _ from 'lodash';
+import React from 'react';
+import ReactDOM from 'react-dom';
+import { AppContainer } from 'react-hot-loader';
+import { remote, ipcRenderer } from 'electron';
+import SYS, * as System from 'dome/system';
+import * as Json from 'dome/data/json';
+import * as Settings from 'dome/data/settings';
+import './style.css';
+
+// --------------------------------------------------------------------------
+// --- Context
+// --------------------------------------------------------------------------
+
+// main window focus
+let windowFocus = true;
+
+function setContextAppNode() {
+  const node = document.getElementById('app');
+  if (node) {
+    node.className =
+      `dome-container dome-platform-${System.platform
+      }${windowFocus ? ' dome-window-active' : ' dome-window-inactive'}`;
+  }
+  return node;
+}
+
+// --------------------------------------------------------------------------
+// --- Helpers
+// --------------------------------------------------------------------------
+
+/** Configured to be `'true'` when in development mode. */
+export const { DEVEL } = System;
+
+export type PlatformKind = 'linux' | 'macos' | 'windows';
+
+/** System platform. */
+export const platform: PlatformKind = (System.platform as PlatformKind);
+
+// --------------------------------------------------------------------------
+// --- Application Emitter
+// --------------------------------------------------------------------------
+
+/** Typed Dome Event.
+
+    To register an event with no argument, simply use `new Event('myEvent')`.
+*/
+export class Event<A = void> {
+
+  private name: string;
+
+  constructor(name: string) {
+    this.name = name;
+    this.emit = this.emit.bind(this);
+  }
+
+  on(callback: (arg: A) => void) {
+    System.emitter.on(this.name, callback);
+  }
+
+  off(callback: (arg: A) => void) {
+    System.emitter.off(this.name, callback);
+  }
+
+  /**
+     Notify all listeners with the provided argument.
+     This methods is bound to the event, so you may use `myEvent.emit`
+     as a callback function, instead of eg. `(arg) => myEvent.emit(arg)`.
+  */
+  emit(arg: A) {
+    System.emitter.emit(this.name, arg);
+  }
+
+  /**
+     Number of currenty registered listeners.
+   */
+  listenerCount() {
+    return System.emitter.listenerCount(this.name);
+  }
+
+}
+
+/** Custom React Hook on event. */
+export function useEvent<A>(
+  evt: undefined | null | Event<A>,
+  callback: (arg: A) => void,
+) {
+  return React.useEffect(() => {
+    if (evt) {
+      evt.on(callback);
+      return () => evt.off(callback);
+    }
+    return undefined;
+  });
+}
+
+// --------------------------------------------------------------------------
+// --- Application Events
+// --------------------------------------------------------------------------
+
+/**
+   Dome update event.
+   It is emitted when a general re-rendering is required, typically when
+   the window frame is resized.
+   You can use it for your own components as an easy-to-use global
+   re-render event.
+*/
+export const update = new Event('dome.update');
+
+/**
+   Dome reload event.
+   It is emitted when the entire window is reloaded.
+*/
+export const reload = new Event('dome.reload');
+ipcRenderer.on('dome.ipc.reload', () => reload.emit());
+
+/**
+   Dome « Find » event. Trigered by [Cmd+F] and [Edit > Find] menu.
+ */
+export const find = new Event('dome.find');
+ipcRenderer.on('dome.ipc.find', () => find.emit());
+
+/** Command-line arguments event handler. */
+export function onCommand(
+  job: (argv: string[], workingDir: string) => void,
+) {
+  System.emitter.on('dome.command', job);
+}
+
+ipcRenderer.on('dome.ipc.command', (_event, argv, wdir) => {
+  SYS.SET_COMMAND(argv, wdir);
+  System.emitter.emit('dome.command', argv, wdir);
+});
+
+/** Window Settings event.
+    Emitted when window settings are reset or restored. */
+export const windowSettings = new Event(Settings.window);
+
+/** Global Settings event.
+    Emiited when global settings are updated. */
+export const globalSettings = new Event(Settings.global);
+
+// --------------------------------------------------------------------------
+// --- Closing
+// --------------------------------------------------------------------------
+
+ipcRenderer.on('dome.ipc.closing', System.doExit);
+
+/** Register a callback to be executed when the window is closing. */
+export function atExit(callback: () => void) {
+  System.atExit(callback);
+}
+
+// --------------------------------------------------------------------------
+// --- Focus Management
+// --------------------------------------------------------------------------
+
+/** Window focus event. */
+export const focus = new Event<boolean>('dome.focus');
+
+/** Current focus state of the main window. See also [[useWindowFocus]]. */
+export function isFocused() { return windowFocus; }
+
+ipcRenderer.on('dome.ipc.focus', (_sender, value) => {
+  windowFocus = value;
+  setContextAppNode();
+  focus.emit(value);
+});
+
+/** Return the current window focus. See [[isFocused]]. */
+export function useWindowFocus(): boolean {
+  useUpdate(focus);
+  return windowFocus;
+}
+
+// --------------------------------------------------------------------------
+// --- Web Navigation
+// --------------------------------------------------------------------------
+
+/**
+   DOM href events for internal URLs.
+
+   This event is emitted whenever some `<a href/>` DOM element
+   is clicked with an internal link. External links will be automatically
+   opened with the user's default Web navigator.
+ */
+export const navigate = new Event<string>('dome.href');
+
+ipcRenderer.on(
+  'dome.ipc.href',
+  (_sender, href) => navigate.emit(href),
+);
+
+// --------------------------------------------------------------------------
+// --- Window Management
+// --------------------------------------------------------------------------
+
+export function isApplicationWindow() {
+  return process.argv.includes(SYS.WINDOW_APPLICATION_ARGV);
+}
+
+export function isPreferencesWindow() {
+  return process.argv.includes(SYS.WINDOW_PREFERENCES_ARGV);
+}
+
+// --------------------------------------------------------------------------
+// --- Window Title
+// --------------------------------------------------------------------------
+
+/** Sets the modified status of the window-frame flag.
+    User feedback is platform dependent. */
+export function setModified(modified = false) {
+  ipcRenderer.send('dome.ipc.window.modified', modified);
+}
+
+/** Sets the window-frame title. */
+export function setTitle(title: string) {
+  ipcRenderer.send('dome.ipc.window.title', title);
+}
+
+// --------------------------------------------------------------------------
+// --- Window Container
+// --------------------------------------------------------------------------
+
+function setContainer(
+  Component: React.FunctionComponent | React.ComponentClass,
+) {
+  Settings.synchronize();
+  const appNode = setContextAppNode();
+  const contents = <AppContainer><Component /></AppContainer>;
+  ReactDOM.render(contents, appNode);
+}
+
+// --------------------------------------------------------------------------
+// --- Main Content
+// --------------------------------------------------------------------------
+
+/**
+   Defines the user's main window content.
+
+   Binds the component to the main window.  A `<Component/>` instance is
+   generated and rendered in the `#app` window element. Its class name is set to
+   `dome-platform-<platform>` with the `<platform>` set to the `Dome.platform`
+   value. This class name can be used as a CSS selector for platform-dependent
+   styling.
+
+   @param Component - to be rendered in the main window
+*/
+export function setApplicationWindow(
+  Component: React.FunctionComponent | React.ComponentClass,
+) {
+  if (isApplicationWindow()) setContainer(Component);
+}
+
+// --------------------------------------------------------------------------
+// --- Settings Window
+// --------------------------------------------------------------------------
+
+/**
+   Defines the user's preferences window content.
+
+   A `<Component/>` instance is generated and rendered in the `#app` window
+   element. Its class name is set to `dome-platform-<platform>` with the
+   `<platform>` set to the `Dome.platform` value. This class name can be used as
+   a CSS selector for platform-dependent styling.
+
+   @param Component - to be rendered in the preferences window
+*/
+export function setPreferencesWindow(
+  Component: React.FunctionComponent | React.ComponentClass,
+) {
+  if (isPreferencesWindow()) setContainer(Component);
+}
+
+// --------------------------------------------------------------------------
+// --- MenuBar Management
+// --------------------------------------------------------------------------
+
+type callback = () => void;
+const customItemCallbacks = new Map<string, callback>();
+
+/**
+   Create a new custom menu in the menu bar.
+
+   This function can be triggered at any time, and will eventually trigger
+   an update of the whole application menubar.
+
+   It is also possible to call this function from the main process.
+
+   @param label - the menu title (shall be unique)
+*/
+export function addMenu(label: string) {
+  ipcRenderer.send('dome.ipc.menu.addmenu', label);
+}
+
+export type MenuName = 'File' | 'Edit' | 'View' | string;
+export type MenuItemType = 'normal' | 'separator' | 'checkbox' | 'radio';
+
+export interface MenuItemProps {
+  /** The label of the menu to insert the item in. */
+  menu: MenuName;
+  /** The menu item identifier. Shall be unique in the _entire_ menu bar. */
+  id: string;
+  /** Default is `'normal'`. */
+  type: MenuItemType;
+  /** Item label. Only optional for separators. */
+  label?: string;
+  /** Item is visible or not (default is `true`). */
+  visible?: boolean;
+  /** Enabled item (default is `true`). */
+  enabled?: boolean;
+  /** Item status for radio and checkbox. Default is `false`. */
+  checked?: boolean;
+  /** Keyboard shortcut. */
+  key?: string;
+  /** Callback. */
+  onClick?: () => void;
+}
+
+/**
+   Inserts a new custom item in a menu.
+
+   The menu can be modified later with [[setMenuItem]].
+
+   When clicked, the menu-item will also trigger a `'dome.menu.clicked'(id)`
+   event on all application windows.  The item callback, if any, is invoked only
+   in the process that specify it.
+
+   Key short cuts shall be specified with the following codes:
+   - `"Cmd+<Key>"` for command (MacOS) or control (Linux) key
+   - `"Alt+<Key>"` for command+option (MacOS) or alt (Linux) key
+   - `"Meta+<Key>"` for command+shift (MacOS) or control+alt (Linux) key
+
+   This function can be triggered at any time, and will eventually trigger
+   an update of the complete application menubar.
+   It is also possible to call this function from the main process.
+*/
+export function addMenuItem(props: MenuItemProps) {
+  if (!props.id && props.type !== 'separator') {
+    console.error('[Dome] Missing menu-item identifier', props);
+    return;
+  }
+  const { onClick, ...options } = props;
+  if (onClick) customItemCallbacks.set(props.id, onClick);
+  ipcRenderer.send('dome.ipc.menu.addmenuitem', options);
+}
+
+export interface MenuItemOptions {
+  id: string;
+  label?: string;
+  visible?: boolean;
+  enabled?: boolean;
+  checked?: boolean;
+  onClick?: null | (() => void);
+}
+
+/**
+   Update properties of an existing menu-item.
+
+   If an `onClick` callback is specified, it will _replace_ the previous one.
+   You shall specify `null` to remove the previously registered callback
+   (`undefined` callback is ignored).
+
+   This function can be triggered at any time, and will possibly trigger
+   an update of the application menubar if the properties
+   can not be changed dynamically in Electron.
+
+   It is also possible to call this function from the main process.
+ */
+export function setMenuItem(options: MenuItemOptions) {
+  const { onClick, ...updates } = options;
+  if (onClick === null) {
+    customItemCallbacks.delete(options.id);
+  } else if (onClick !== undefined) {
+    customItemCallbacks.set(options.id, onClick);
+  }
+  ipcRenderer.send('dome.ipc.menu.setmenuitem', updates);
+}
+
+ipcRenderer.on('dome.ipc.menu.clicked', (_sender, id: string) => {
+  const callback = customItemCallbacks.get(id);
+  if (callback) callback();
+});
+
+// --------------------------------------------------------------------------
+// --- Context Menus
+// --------------------------------------------------------------------------
+
+export interface PopupMenuItemProps {
+  /** Item label. */
+  label: string;
+  /** Optional menu identifier. */
+  id?: string;
+  /** Displayed item, default is `true`. */
+  display?: boolean;
+  /** Enabled item, default is `true`. */
+  enabled?: boolean;
+  /** Checked item, default is `false`. */
+  checked?: boolean;
+  /** Item selection callback. */
+  onClick?: (() => void);
+}
+
+export type PopupMenuItem = PopupMenuItemProps | 'separator';
+
+/**
+   Popup a contextual menu.
+
+   Items can be separated by inserting a `'separator'` constant string in the
+   array. Item identifier and label default to each others. Alternatively, an
+   item can be specified by a single string that will be used for both its label
+   and identifier. Undefined or null items are allowed (and skipped).
+
+   The menu is displayed at the current mouse location.  The callback is called
+   with the selected item identifier or label.  If the menu popup is canceled by
+   the user, the callback is called with `undefined`.
+
+   Example:
+
+   * ```ts
+   *    let myPopup = (_evt) => Dome.popupMenu([ …items… ],(id) => … );
+   *    <div onRightClick={myPopup}>...</div>
+   * ```
+
+*/
+export function popupMenu(
+  items: PopupMenuItem[],
+  callback?: (item: string | undefined) => void,
+) {
+  const { Menu, MenuItem } = remote;
+  const menu = new Menu();
+  let selected = '';
+  let kid = 0;
+  items.forEach((item) => {
+    if (item === 'separator')
+      menu.append(new MenuItem({ type: 'separator' }));
+    else if (item) {
+      const { display = true, enabled, checked } = item;
+      if (display) {
+        const label = item.label || `#${++kid}`;
+        const id = item.id || label;
+        const click = () => {
+          selected = id;
+          if (item.onClick) item.onClick();
+        };
+        const type = checked !== undefined ? 'checkbox' : 'normal';
+        menu.append(new MenuItem({ label, enabled, type, checked, click }));
+      }
+    }
+  });
+  const job = callback ? () => callback(selected) : undefined;
+  menu.popup({ window: remote.getCurrentWindow(), callback: job });
+}
+
+// --------------------------------------------------------------------------
+// --- React Hooks
+// --------------------------------------------------------------------------
+
+/**
+   Hook to re-render on demand (Custom React Hook).
+   Returns a callback to trigger a render on demand.
+*/
+export function useForceUpdate() {
+  const [tac, onTic] = React.useState(false);
+  return () => onTic(!tac);
+}
+
+/**
+   Hook to re-render on Dome events (Custom React Hook).
+   @param events - event names, defaults to a single `'dome.update'`.
+*/
+export function useUpdate(...events: Event<any>[]) {
+  const fn = useForceUpdate();
+  React.useEffect(() => {
+    const theEvents = events ? events.slice() : [update];
+    theEvents.forEach((evt) => evt.on(fn));
+    return () => theEvents.forEach((evt) => evt.off(fn));
+  });
+}
+
+// --------------------------------------------------------------------------
+// --- Timer Hooks
+// --------------------------------------------------------------------------
+
+interface Clock {
+  timer?: NodeJS.Timeout;
+  pending: number; // Number of listeners
+  time: number; // Ellapsed time since firts pending
+  event: string; // Tic events
+  period: number; // Period
+}
+
+// Collection of clocks indexed by period
+const CLOCKS = new Map<number, Clock>();
+
+const CLOCKEVENT = (period: number) => `dome.clock.${period}`;
+
+const TIC_CLOCK = (clk: Clock) => () => {
+  if (0 < clk.pending) {
+    clk.time += clk.period;
+    System.emitter.emit(clk.event, clk.time);
+  } else {
+    if (clk.timer) clearInterval(clk.timer);
+    CLOCKS.delete(clk.period);
+  }
+};
+
+const INC_CLOCK = (period: number) => {
+  let clk = CLOCKS.get(period);
+  if (!clk) {
+    const event = CLOCKEVENT(period);
+    const time = (new Date()).getTime();
+    clk = { pending: 0, time, period, event };
+    clk.timer = setInterval(TIC_CLOCK(clk), period);
+    CLOCKS.set(period, clk);
+  }
+  clk.pending++;
+  return clk.event;
+};
+
+const DEC_CLOCK = (period: number) => {
+  const clk = CLOCKS.get(period);
+  if (clk) clk.pending--;
+};
+
+export interface Timer {
+  /** Starts the timer, if not yet. */
+  start(): void;
+  /** Stops the timer. Can be restarted after. */
+  stop(): void;
+  /** Elapsed time (in milliseconds). */
+  time: number;
+  /** Running timer. */
+  running: boolean;
+}
+
+/**
+   Synchronized start & stop timer (Custom React Hook).
+
+   Create a local timer, synchronized on a global clock, that can be started
+   and stopped on demand during the life cycle of the component.
+
+   Each timer has its individual start & stop state. However,
+   all timers with the same period _are_ synchronized with each others.
+
+   @param period - timer interval, in milliseconds (ms)
+   @param initStart - whether to initially start the timer (default is `false`)
+
+ */
+export function useClock(period: number, initStart: boolean): Timer {
+  const started = React.useRef(0);
+  const [time, setTime] = React.useState(0);
+  const [running, setRunning] = React.useState(initStart);
+  const start = React.useCallback(() => setRunning(false), []);
+  const stop = React.useCallback(() => {
+    setRunning(false);
+    setTime(0);
+    started.current = 0;
+  }, []);
+  React.useEffect(() => {
+    if (running) {
+      const event = INC_CLOCK(period);
+      const callback = (t: number) => {
+        if (!started.current) started.current = t;
+        else setTime(t - started.current);
+      };
+      System.emitter.on(event, callback);
+      return () => {
+        System.emitter.off(event, callback);
+        DEC_CLOCK(period);
+      };
+    } return undefined;
+  }, [period, running]);
+  return { time, running, start, stop };
+}
+
+// --------------------------------------------------------------------------
+// --- Settings Hookds
+// --------------------------------------------------------------------------
+
+/**
+   Bool window settings helper. Default is `false` unless specified.
+*/
+export function useBoolSettings(
+  key: string | undefined,
+  defaultValue = false,
+) {
+  return Settings.useWindowSettings(
+    key, Json.jBoolean, defaultValue,
+  );
+}
+
+/**
+   Bool window settings helper with a flip callback.
+ */
+export function useFlipSettings(
+  key: string | undefined,
+  defaultValue = false,
+): [boolean, () => void] {
+  const [state, setState] = Settings.useWindowSettings(
+    key, Json.jBoolean, defaultValue,
+  );
+  const flipState = React.useCallback(
+    () => setState(!state),
+    [state, setState],
+  );
+  return [state, flipState];
+}
+
+/** Number window settings helper. Default is `0` unless specified. */
+export function useNumberSettings(
+  key: string | undefined,
+  defaultValue = 0,
+) {
+  return Settings.useWindowSettings(
+    key, Json.jNumber, defaultValue,
+  );
+}
+
+/** String window settings. Default is `''` unless specified). */
+export function useStringSettings(key: string | undefined, defaultValue = '') {
+  return Settings.useWindowSettings(
+    key, Json.jString, defaultValue,
+  );
+}
+
+/** Optional string window settings. Default is `undefined`. */
+export function useStringOptSettings(key: string | undefined) {
+  return Settings.useWindowSettings(
+    key, Json.jString, undefined,
+  );
+}
+
+/** Direct shortcut to [[dome/data/settings.useWindowSettings]]. */
+export const { useWindowSettings } = Settings;
+
+/**
+   Utility shortcut to [[dome/data/settings.useGlobalSettings]]
+   with global settings class created on-the-fly.
+ */
+export function useGlobalSettings<A extends Json.json>(
+  globalKey: string,
+  decoder: Json.Loose<A>,
+  defaultValue: A,
+) {
+  // Object creation is cheaper than useMemo...
+  const G = new Settings.GlobalSettings(
+    globalKey, decoder, Json.identity, defaultValue,
+  );
+  return Settings.useGlobalSettings(G);
+}
+
+// --------------------------------------------------------------------------
+// --- Pretty Printing (Browser Console)
+// --------------------------------------------------------------------------
+
+export class Debug {
+  moduleName: string;
+  constructor(moduleName: string) {
+    this.moduleName = moduleName;
+  }
+
+  /* eslint-disable no-console */
+
+  log(...args: any) {
+    if (DEVEL) console.log(`[${this.moduleName}]`, ...args);
+  }
+
+  warn(...args: any) {
+    if (DEVEL) console.warn(`[${this.moduleName}]`, ...args);
+  }
+
+  error(...args: any) {
+    if (DEVEL) console.error(`[${this.moduleName}]`, ...args);
+  }
+
+  /* eslint-enable */
+}
+
+// --------------------------------------------------------------------------
diff --git a/ivette/src/dome/src/renderer/errors.tsx b/ivette/src/dome/renderer/errors.tsx
similarity index 100%
rename from ivette/src/dome/src/renderer/errors.tsx
rename to ivette/src/dome/renderer/errors.tsx
diff --git a/ivette/src/dome/renderer/frame/sidebars.tsx b/ivette/src/dome/renderer/frame/sidebars.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..94d66b95e639b4ae1d2ceb14e34b3676e3093b64
--- /dev/null
+++ b/ivette/src/dome/renderer/frame/sidebars.tsx
@@ -0,0 +1,226 @@
+// --------------------------------------------------------------------------
+// --- SideBars
+// --------------------------------------------------------------------------
+
+/**
+   @packageDocumentation
+   @module dome/frame/sidebars
+*/
+
+import React from 'react';
+import { useFlipSettings } from 'dome';
+import { Badge } from 'dome/controls/icons';
+import { Label } from 'dome/controls/labels';
+import { classes } from 'dome/misc/utils';
+
+import './style.css';
+
+// --------------------------------------------------------------------------
+// --- SideBar Container
+// --------------------------------------------------------------------------
+
+export interface SideBarProps {
+  className?: string;
+  style?: React.CSSProperties;
+  children?: React.ReactNode;
+}
+
+/**
+   Container for sidebar items.
+ */
+export function SideBar(props: SideBarProps) {
+  const className = classes(
+    'dome-xSideBar',
+    'dome-color-frame',
+    props.className,
+  );
+  return (
+    <div className={className} style={props.style}>
+      {props.children}
+    </div>
+  );
+}
+
+// --------------------------------------------------------------------------
+// --- Badges Specifications
+// --------------------------------------------------------------------------
+
+export type BadgeElt = undefined | null | string | number | React.ReactNode;
+export type Badge = BadgeElt | BadgeElt[];
+
+const makeBadgeElt = (elt: BadgeElt): React.ReactNode => {
+  if (elt === undefined || elt === null) return null;
+  switch (typeof (elt)) {
+    case 'number':
+    case 'string':
+      return <Badge value={elt} />;
+    default:
+      return elt;
+  }
+};
+
+const makeBadge = (elt: Badge): React.ReactNode => {
+  if (Array.isArray(elt))
+    return elt.map(makeBadgeElt);
+  return makeBadgeElt(elt);
+};
+
+// --------------------------------------------------------------------------
+// --- SideBar Section Hide/Show Button
+// --------------------------------------------------------------------------
+
+const HideShow = (props: { onClick: () => void; visible: boolean }) => (
+  <label
+    className="dome-xSideBarSection-hideshow dome-text-label"
+    onClick={props.onClick}
+  >
+    {props.visible ? 'Hide' : 'Show'}
+  </label>
+);
+
+// --------------------------------------------------------------------------
+// --- SideBar Section
+// --------------------------------------------------------------------------
+
+export interface SectionProps {
+  /** Section label. */
+  label: string;
+  /** Section tooltip description. */
+  title?: string;
+  /** Hide/Show window settings. */
+  settings?: string;
+  /** Controlled Fold/Unfold state. */
+  unfold?: boolean;
+  /** Initial unfold state (default is `true`). */
+  defaultUnfold?: boolean;
+  /** Enabled sections are made visible. */
+  enabled?: boolean;
+  /** Disabled sections are made unvisible. */
+  disabled?: boolean;
+  /** Badge summary (only visible when folded). */
+  summary?: Badge;
+  /** Right-click callback. */
+  onContextMenu?: () => void;
+  /** Section contents. */
+  children?: React.ReactNode;
+}
+
+/**
+   Sidebar Section.
+
+   Unless specified, sections can be hidden on click.
+   When items in the section have badge(s)
+   it is highly recommended to provide a badge summary to be displayed
+   when the content is hidden.
+
+   Sections with no items are not displayed.
+*/
+export function Section(props: SectionProps) {
+
+  const [state, flipState] = useFlipSettings(
+    props.settings,
+    props.defaultUnfold,
+  );
+
+  const { enabled = true, disabled = false, children } = props;
+  if (disabled || !enabled || React.Children.count(children) === 0)
+    return null;
+  const { unfold } = props;
+  const foldable = unfold === undefined;
+  const visible = unfold ?? state;
+  const maxHeight = visible ? 'max-content' : 0;
+
+  return (
+    <div className="dome-xSideBarSection">
+      <div
+        className="dome-xSideBarSection-title dome-color-frame"
+        title={props.title}
+        onContextMenu={props.onContextMenu}
+      >
+        <Label label={props.label} />
+        {!visible && makeBadge(props.summary)}
+        {foldable && <HideShow visible={visible} onClick={flipState} />}
+      </div>
+      <div className="dome-xSideBarSection-content" style={{ maxHeight }}>
+        {children}
+      </div>
+    </div>
+  );
+}
+
+// --------------------------------------------------------------------------
+// --- SideBar Items
+// --------------------------------------------------------------------------
+
+export interface ItemProps {
+  /** Item icon. */
+  icon?: string;
+  /** Item label. */
+  label?: string;
+  /** Item tooltip text. */
+  title?: string;
+  /** Badge. */
+  badge?: Badge;
+  /** Enabled item. */
+  enabled?: boolean;
+  /** Disabled item (dimmed). */
+  disabled?: boolean;
+  /** Selection state. */
+  selected?: boolean;
+  /** Selection callback. */
+  onSelection?: () => void;
+  /** Right-click callback. */
+  onContextMenu?: () => void;
+  /** Additional class. */
+  className?: string;
+  /** Additional styles. */
+  style?: React.CSSProperties;
+  /** Other item elements. */
+  children?: React.ReactNode;
+}
+
+/** Sidebar Items. */
+export function Item(props: ItemProps) {
+  const { selected = false, disabled = false, enabled = true } = props;
+  const isDisabled = disabled || !enabled;
+  const ref = React.useRef<HTMLDivElement>(null);
+  const [clicked, setClicked] = React.useState(false);
+  const onSelection = isDisabled ? undefined : props.onSelection;
+  const onClick =
+    onSelection ? () => { setClicked(true); onSelection(); } : undefined;
+  const onContextMenu = isDisabled ? undefined : props.onContextMenu;
+  const className = classes(
+    'dome-xSideBarItem',
+    selected ? 'dome-active' : 'dome-inactive',
+    isDisabled && 'dome-disabled',
+    props.className,
+  );
+
+  React.useLayoutEffect(() => {
+    if (!clicked && selected) {
+      ref?.current?.scrollIntoView({
+        behavior: 'auto',
+        block: 'center',
+      });
+    }
+    if (!selected && clicked)
+      setClicked(false);
+  }, [clicked, selected]);
+
+  return (
+    <div
+      ref={ref}
+      className={className}
+      style={props.style}
+      title={props.title}
+      onContextMenu={onContextMenu}
+      onClick={onClick}
+    >
+      <Label icon={props.icon} label={props.label} />
+      {props.children}
+      {makeBadge(props.badge)}
+    </div>
+  );
+}
+
+// --------------------------------------------------------------------------
diff --git a/ivette/src/dome/src/renderer/frame/style.css b/ivette/src/dome/renderer/frame/style.css
similarity index 69%
rename from ivette/src/dome/src/renderer/frame/style.css
rename to ivette/src/dome/renderer/frame/style.css
index 8aa578aa2c81c5b0106b88a28adc114af5b57068..4f7d144cae66f93d3117171f781da10a11fe86b4 100644
--- a/ivette/src/dome/src/renderer/frame/style.css
+++ b/ivette/src/dome/renderer/frame/style.css
@@ -104,11 +104,12 @@
     height: 100% ;
     overflow-x: hidden ;
     overflow-y: auto ;
-    padding-top: 6px ;
-    padding-bottom: 6px ;
+    padding: 0px ;
 }
 
-.dome-window-active .dome-xSideBar.dome-color-frame {
+.dome-window-active .dome-xSideBar.dome-color-frame,
+.dome-window-active .dome-xSideBarSection-title.dome-color-frame
+{
     background: #e3e8ec ;
 }
 
@@ -118,15 +119,18 @@
 
 .dome-xSideBarSection {
     display: block ;
-    margin-top: 10px ;
-    margin-bottom: 10px ;
+    padding: 0px ;
 }
 
 .dome-xSideBarSection-title {
+    position: sticky ;
+    top: 0px ;
+    padding-top: 3px ;
+    padding-bottom: 0px ;
     padding-left: 3px ;
     padding-right: 2px ;
     display: flex ;
-    flew-flow: row nowrap ;
+    flex-flow: row nowrap ;
     align-items: center ;
 }
 
@@ -170,6 +174,7 @@
     display: flex ;
     flex-flow: row nowrap ;
     align-items: center ;
+    scroll-margin-top: 30px;
 }
 
 .dome-window-active .dome-xSideBarItem.dome-active {
@@ -267,7 +272,7 @@
 
 /* Layout */
 
-.dome-xToolBar-Control {
+.dome-xToolBar-control {
     flex: 0 0 auto ;
     height: 21px ;
     margin: 6px 5px 6px 5px ;
@@ -278,72 +283,72 @@
     outline: none ;
 }
 
-.dome-xToolBar-Control svg {
+.dome-xToolBar-control svg {
     height: 10px ;
     position: relative ;
 }
 
-.dome-xToolBar-Control svg + label {
+.dome-xToolBar-control svg + label {
     margin-left: 4px ;
 }
 
 /* Background */
 
-.dome-window-active .dome-xToolBar-Control {
+.dome-window-active .dome-xToolBar-control {
     background-image: linear-gradient(to bottom, #e8e8e8 0, #f1f1f1 100%);
 }
 
-.dome-window-active .dome-xToolBar-Control:hover:not(:disabled) {
+.dome-window-active .dome-xToolBar-control:hover:not(:disabled) {
     background-color: #ffffff ;
     background-image: none ;
 }
 
-.dome-window-active .dome-xToolBar-Control.dome-xToolBar-positive:not(:disabled) {
+.dome-window-active .dome-xToolBar-control.dome-xToolBar-positive:not(:disabled) {
     background-image: linear-gradient(to bottom, #34ff52 0%, #48fd64 100%);
 }
 
-.dome-window-active .dome-xToolBar-Control.dome-xToolBar-positive:hover:not(:disabled) {
+.dome-window-active .dome-xToolBar-control.dome-xToolBar-positive:hover:not(:disabled) {
     background-color: #00ff00 ;
     background-image: none ;
 }
 
-.dome-window-active .dome-xToolBar-Control.dome-xToolBar-negative:not(:disabled) {
+.dome-window-active .dome-xToolBar-control.dome-xToolBar-negative:not(:disabled) {
     color: #ccc ;
     fill: #ccc ;
     background-image: linear-gradient(to bottom, #ec453e 0%, #ff4c47 100%);
 }
 
-.dome-window-active .dome-xToolBar-Control.dome-xToolBar-negative:hover:not(:disabled) {
+.dome-window-active .dome-xToolBar-control.dome-xToolBar-negative:hover:not(:disabled) {
     background-color: red ;
     background-image: none ;
 }
 
-.dome-window-active .dome-xToolBar-Control.dome-xToolBar-warning:not(:disabled) {
+.dome-window-active .dome-xToolBar-control.dome-xToolBar-warning:not(:disabled) {
     background-image: linear-gradient(to bottom, #fece72 0%, #fcaa0e 100%);
 }
 
-.dome-window-active .dome-xToolBar-Control.dome-xToolBar-warning:hover:not(:disabled) {
+.dome-window-active .dome-xToolBar-control.dome-xToolBar-warning:hover:not(:disabled) {
     background-color: orange ;
     background-image: none ;
 }
 
-.dome-window-active .dome-xToolBar-Control.dome-xToolBar-cancel:not(:disabled) {
+.dome-window-active .dome-xToolBar-control.dome-xToolBar-cancel:not(:disabled) {
     background-color: #c2c0c2 ;
     background-image: none ;
 }
 
-.dome-window-active .dome-xToolBar-Control.dome-xToolBar-cancel:hover:not(:disabled) {
+.dome-window-active .dome-xToolBar-control.dome-xToolBar-cancel:hover:not(:disabled) {
     background-image: linear-gradient(to bottom, #e8e8e8 0, #f1f1f1 100%);
 }
 
-.dome-window-inactive .dome-xToolBar-Control {
+.dome-window-inactive .dome-xToolBar-control {
     box-shadow: none ;
     background-image: none ;
 }
 
 /* Activated */
 
-.dome-window-active .dome-xToolBar-Control:active:not(:disabled) {
+.dome-window-active .dome-xToolBar-control:active:not(:disabled) {
     fill: #ddd ;
     color: #ddd ;
     background-color: gray ;
@@ -352,21 +357,21 @@
 
 /* Disabled */
 
-.dome-window-active .dome-xToolBar-Control:disabled {
+.dome-window-active .dome-xToolBar-control:disabled {
     fill: #ccc ;
     color: #ccc ;
     box-shadow: none ;
     border-color: #bbb ;
 }
 
-.dome-window-inactive .dome-xToolBar-Control:disabled {
+.dome-window-inactive .dome-xToolBar-control:disabled {
     fill: #ccc ;
     color: #ccc ;
 }
 
 /* Selected */
 
-.dome-window-active .dome-xToolBar-Control.dome-selected {
+.dome-window-active .dome-xToolBar-control.dome-selected {
     fill:  #fff;
     color: #fff;
     border: 1px solid transparent ;
@@ -374,12 +379,12 @@
     background-image: none ;
 }
 
-.dome-window-active .dome-xToolBar-Control.dome-selected:hover {
+.dome-window-active .dome-xToolBar-control.dome-selected:hover {
     background-color: #888 ;
     background-image: none ;
 }
 
-.dome-window-inactive .dome-xToolBar-Control.dome-selected {
+.dome-window-inactive .dome-xToolBar-control.dome-selected:not(:disabled) {
     fill:  #eee;
     color: #eee;
     background-color: #ccc ;
@@ -387,51 +392,129 @@
 
 /* Selected & Disabled */
 
-.dome-window-active .dome-xToolBar-Control.dome-selected:disabled {
+.dome-window-active .dome-xToolBar-control.dome-selected:disabled {
     fill: #ccc ;
     color: #ccc ;
     border: 1px solid #bbb ;
-    background-color: #eee ;
+    background-color: #ddd ;
 }
 
-.dome-window-inactive .dome-xToolBar-Control.dome-selected:disabled {
+.dome-window-inactive .dome-xToolBar-control.dome-selected:disabled {
     fill: #ccc ;
     color: #ccc ;
     border-color: #ddd ;
-    background-color: #eee ;
+    background-color: #ddd ;
 }
 
 /* -------------------------------------------------------------------------- */
 /* --- Styling ToolBar Button Group                                       --- */
 /* -------------------------------------------------------------------------- */
 
-.dome-xToolBar-Group {
+.dome-xToolBar-group {
     display: flex ;
     flex-direction: row ;
     flex-wrap: nowrap ;
     margin: 6px 5px 6px 5px ;
 }
 
-.dome-xToolBar-Group .dome-xToolBar-Control {
+.dome-xToolBar-group .dome-xToolBar-control {
     margin: 0 ;
 }
 
-.dome-xToolBar-Group .dome-xToolBar-Control:not(:first-child) {
+.dome-xToolBar-group .dome-xToolBar-control:not(:first-child) {
     border-left: 0 ;
 }
 
-.dome-xToolBar-Group > .dome-xToolBar-Control:first-child {
+.dome-xToolBar-group > .dome-xToolBar-control:first-child {
     border-top-right-radius: 0 ;
     border-bottom-right-radius: 0 ;
 }
 
-.dome-xToolBar-Group > .dome-xToolBar-Control:last-child {
+.dome-xToolBar-group > .dome-xToolBar-control:last-child {
     border-top-left-radius: 0 ;
     border-bottom-left-radius: 0 ;
 }
 
-.dome-xToolBar-Group > .dome-xToolBar-Control:not(:first-child):not(:last-child) {
+.dome-xToolBar-group > .dome-xToolBar-control:first-child:last-child {
+    border-radius: 4px ;
+}
+
+.dome-xToolBar-group > .dome-xToolBar-control:not(:first-child):not(:last-child) {
     border-radius: 0 ;
 }
 
 /* -------------------------------------------------------------------------- */
+/* --- Styling ToolBar Search Field                                       --- */
+/* -------------------------------------------------------------------------- */
+
+.dome-xToolBar-control.dome-xToolBar-searchfield {
+    background-image: none ;
+    background-color: #eee ;
+    margin-top: 1px ;
+    padding-top: 1px ;
+    padding-left: 20px ;
+    border-radius: 12px ;
+    border-color: #aaa ;
+    width: 32px ;
+    transition: width 0.4s ease-in-out ;
+}
+
+.dome-window-inactive .dome-xToolBar-control.dome-xToolBar-searchfield {
+    background-color: #f6f6f6 ;
+    border-color: #ddd ;
+}
+
+.dome-xToolBar-searchfield:focus,
+.dome-xToolBar-searchfield:hover,
+.dome-xToolBar-searchicon:hover + .dome-xToolBar-searchfield
+{
+    width: 160px;
+}
+
+.dome-xToolBar-searchicon {
+    position: relative ;
+    overflow: visible ;
+    z-Index: +1;
+    height: 0px;
+    width: 0px;
+    top: 2px ;
+    left: 12px ;
+}
+
+.dome-window-inactive .dome-xToolBar-searchicon svg {
+    fill: #ccc ;
+}
+
+.dome-xToolBar-searchmenu {
+    position: relative ;
+    width: 162px ;
+    max-height: 120px ;
+    overflow-x: hidden ;
+    overflow-y: auto ;
+    left: -7px ;
+    top: 4px ;
+    padding: 0px ;
+    border: 1pt solid #aaa ;
+    background: #fff ;
+}
+
+.dome-xToolBar-searchitem {
+    display: block ;
+    width: 100% ;
+    margin-left: 0px ;
+    margin-right: 0px ;
+    padding-left: 4px ;
+    padding-right: 2px ;
+}
+
+.dome-xToolBar-searchitem:hover,
+.dome-xToolBar-searchindex
+{
+    background: lightblue !important;
+}
+
+.dome-xToolBar-searchitem:nth-child(even) {
+    background: #eef7f7;
+}
+
+/* -------------------------------------------------------------------------- */
diff --git a/ivette/src/dome/renderer/frame/tabs.tsx b/ivette/src/dome/renderer/frame/tabs.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..0b48784125de6118455447f504fd29d25c1b7ee5
--- /dev/null
+++ b/ivette/src/dome/renderer/frame/tabs.tsx
@@ -0,0 +1,81 @@
+// --------------------------------------------------------------------------
+// --- Tabs
+// --------------------------------------------------------------------------
+
+/**
+   @packageDocumentation
+   @module dome/frame/tabs
+*/
+
+import React from 'react';
+import { Icon } from 'dome/controls/icons';
+
+import './style.css';
+
+// --------------------------------------------------------------------------
+// --- Tabs Bar
+// --------------------------------------------------------------------------
+
+export interface TabsBarProps {
+  children?: React.ReactNode;
+}
+
+/** Container for Tabs. */
+export function TabsBar(props: TabsBarProps) {
+  return (
+    <div className="dome-xTabsBar dome-color-frame">
+      {props.children}
+    </div>
+  );
+}
+
+// --------------------------------------------------------------------------
+// --- Single Tab
+// --------------------------------------------------------------------------
+
+export interface TabProps<A> {
+  /** Tab's identifier. */
+  value: A;
+  /** Tab's label. */
+  label?: string;
+  /** Tab's tooltip text. */
+  title?: string;
+  /** Close tab's tooltip text. */
+  closing?: string;
+  /** Currently selected tab. */
+  selection?: A;
+  /** Selection callback. */
+  onSelection?: (value: A) => void;
+  /** Closing callback. */
+  onClose?: (value: A) => void;
+}
+
+/** Tab Selector. */
+export function Tab<A>(props: TabProps<A>) {
+  const { value, selection, onSelection, onClose } = props;
+  const selected = value === selection;
+  // --- Tab Rendering
+  const onSelect = onSelection && (() => onSelection(value));
+  const onClosed = onClose && (() => onClose(value));
+  const closing = onClose ? (
+    <Icon
+      className="dome-xTab-closing"
+      title={props.closing || 'Close Tab'}
+      id="CROSS"
+      onClick={onClosed}
+    />
+  ) : undefined;
+  const classes = `dome-xTab${selected ? ' dome-active' : ' dome-inactive'}`;
+  return (
+    <label
+      className={classes}
+      title={props.title}
+      onClick={onSelect}
+    >
+      {props.label}
+      {closing}
+    </label>
+  );
+}
+
+// --------------------------------------------------------------------------
diff --git a/ivette/src/dome/renderer/frame/toolbars.tsx b/ivette/src/dome/renderer/frame/toolbars.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..d84c50b4a32c1f5afb154c59000fadc069e4653c
--- /dev/null
+++ b/ivette/src/dome/renderer/frame/toolbars.tsx
@@ -0,0 +1,365 @@
+// --------------------------------------------------------------------------
+// --- ToolBars
+// --------------------------------------------------------------------------
+
+/**
+   @packageDocumentation
+   @module dome/frame/toolbars
+ */
+
+import React from 'react';
+import { Event, useEvent, find } from 'dome';
+import { debounce } from 'lodash';
+import { SVG } from 'dome/controls/icons';
+import { Label } from 'dome/controls/labels';
+import { classes } from 'dome/misc/utils';
+import './style.css';
+
+// --------------------------------------------------------------------------
+// --- ToolBar Container
+// --------------------------------------------------------------------------
+
+export interface ToolBarProps {
+  className?: string;
+  style?: React.CSSProperties;
+  children?: React.ReactNode;
+}
+
+/**
+   @class
+   @summary Container for toolbar items.
+ */
+export function ToolBar(props: ToolBarProps) {
+  const { children } = props;
+  const n = React.Children.count(children);
+  if (n === 0) return null;
+  const className = classes(
+    'dome-xToolBar',
+    'dome-color-frame',
+    props.className,
+  );
+  return (
+    <div className={className} style={props.style}>
+      <div className="dome-xToolBar-inset" />
+      {children}
+      <div className="dome-xToolBar-inset" />
+    </div>
+  );
+}
+
+// --------------------------------------------------------------------------
+// --- ToolBar Spaces
+// --------------------------------------------------------------------------
+
+/** Fixed (tiny) space. */
+export const Inset = (() => <div className="dome-xToolBar-inset" />);
+
+/** Fixed space. */
+export const Space = (() => <div className="dome-xToolBar-space" />);
+
+/** Auto-extensible space. */
+export const Filler = (() => <div className="dome-xToolBar-filler" />);
+
+/** Fixed space with vertical rule. */
+export const Separator = () => (
+  <div className="dome-xToolBar-separator">
+    <div className="dome-xToolBar-vrule" />
+  </div>
+);
+
+const SELECT = 'dome-xToolBar-control dome-selected';
+const BUTTON = 'dome-xToolBar-control dome-color-frame';
+const KIND = (kind: undefined | string) => (
+  kind ? ` dome-xToolBar-${kind}` : ''
+);
+
+interface SELECT<A> {
+  selected?: boolean;
+  selection?: A;
+  value?: A;
+}
+
+export type ButtonKind =
+  | 'default' | 'cancel' | 'warning' | 'positive' | 'negative';
+
+export interface ButtonProps<A> {
+  /** Button icon, Cf. [gallery](gallery-icons.html). */
+  icon?: string;
+  /** Button label. */
+  label?: string;
+  /** Button tooltip text. */
+  title?: string;
+  /** Button kind. */
+  kind?: ButtonKind;
+  /** Button is displayed (default `true`). */
+  visible?: boolean;
+  /** Button is hidden (default `false`). */
+  hidden?: boolean;
+  /** Enabled State (default `true`). */
+  enabled?: boolean;
+  /** Disabled State (default `false`). */
+  disabled?: boolean;
+  /** Selection State (defaults to `false` or `selection` equal to `value`). */
+  selected?: boolean;
+  /** Button's value. */
+  value?: A;
+  /** Currently selected value. */
+  selection?: A;
+  /** Selection callback. Receives the button's value. */
+  onClick?: (value: A | undefined) => void;
+}
+
+/** Toolbar Button. */
+export function Button<A = undefined>(props: ButtonProps<A>) {
+  const { visible = true, hidden = false } = props;
+  if (!visible || hidden) return null;
+  const { enabled = true, disabled = false } = props;
+  const { selected, value, selection, onClick } = props;
+  const isSelected = selected !== undefined
+    ? selected
+    : (value !== undefined && value === selection);
+  return (
+    <button
+      type="button"
+      disabled={disabled || !enabled}
+      className={isSelected ? SELECT : (BUTTON + KIND(props.kind))}
+      onClick={onClick && (() => onClick(value))}
+      title={props.title}
+    >
+      {props.icon && <SVG id={props.icon} />}
+      {props.label && <label>{props.label}</label>}
+    </button>
+  );
+}
+
+// --------------------------------------------------------------------------
+// --- Selection Props
+// --------------------------------------------------------------------------
+
+export interface SelectionProps<A> {
+  /** Enabled Group (default `true`). */
+  enabled?: boolean;
+  /** Disabled Group (default `false`). */
+  disabled?: boolean;
+  /** Currently selected button. */
+  value?: A;
+  /** Callback on clicked buttons. */
+  onChange?: (value: undefined | A) => void;
+  /** Buttons array. */
+  children: React.ReactElement[];
+}
+
+// --------------------------------------------------------------------------
+// --- ToolBar Button Group
+// --------------------------------------------------------------------------
+
+export interface ButtonGroupProps<A> extends SelectionProps<A> {
+  className?: string;
+  style?: React.CSSProperties;
+}
+
+/**
+   Toolbar Button Group.
+
+   Properties of the button group are passed down the buttons of the group
+   as appropriate defaults.
+ */
+export function ButtonGroup<A>(props: ButtonGroupProps<A>) {
+  const { children, value, onChange, enabled, disabled } = props;
+  const baseProps: ButtonProps<A> = {
+    enabled,
+    disabled,
+    selection: value,
+    onClick: onChange,
+  };
+  const className = classes('dome-xToolBar-group', props.className);
+  return (
+    <div className={className} style={props.style}>
+      {React.Children.map(children, (elt) => React.cloneElement(
+        elt,
+        { ...baseProps, ...elt.props },
+      ))}
+    </div>
+  );
+}
+
+// --------------------------------------------------------------------------
+// --- ToolBar Menu
+// --------------------------------------------------------------------------
+
+/** Toolbar Selector Menu.
+
+   Behaves likes a standard `<select>` element, except that callback directly
+   receives the select value, not the entire event.
+   The list of options shall be given with standard
+   `<option value={...} label={...}>` elements.
+ */
+export function Select(props: SelectionProps<string>) {
+  const { enabled = true, disabled = false, onChange } = props;
+  const callback = (evt: React.ChangeEvent<HTMLSelectElement>) => {
+    if (onChange) onChange(evt.target.value);
+  };
+  return (
+    <select
+      className="dome-xToolBar-control dome-color-frame"
+      value={props.value}
+      disabled={disabled || !enabled}
+      onChange={callback}
+    >
+      {props.children}
+    </select>
+  );
+}
+
+// --------------------------------------------------------------------------
+// --- SearchField
+// --------------------------------------------------------------------------
+
+const DEBOUNCED_SEARCH = 200;
+
+const scrollToRef = (r: undefined | HTMLLabelElement) => {
+  if (r) r.scrollIntoView({ block: 'nearest' });
+};
+
+export interface Hint<A> {
+  id: string | number;
+  icon?: string;
+  label: string | JSX.Element;
+  title?: string;
+  value: A;
+}
+
+export interface SearchFieldProps<A> {
+  /** Tooltip Text. */
+  title?: string;
+  /** Placeholder Text. */
+  placeholder?: string;
+  /** Provided search hints (with respect to last `onSearch()` callback). */
+  hints?: Hint<A>[];
+  /** Search callback. Triggered on Enter Key, Escape Key or Blur event. */
+  onSelect?: (pattern: string) => void;
+  /** Dynamic search callback. Triggered on key pressed (debounced). */
+  onSearch?: (pattern: string) => void;
+  /** Hint selection callback. */
+  onHint?: (hint: Hint<A>) => void;
+  /** Event that triggers a focus request (defaults to [[dome.find]]). */
+  event?: null | Event<void>;
+}
+
+/**
+   Search Bar.
+ */
+export function SearchField<A = undefined>(props: SearchFieldProps<A>) {
+  const inputRef = React.useRef<HTMLInputElement | null>(null);
+  const blur = () => inputRef.current?.blur();
+  const focus = () => inputRef.current?.focus();
+  const [value, setValue] = React.useState('');
+  const [index, setIndex] = React.useState(-1);
+  const { onHint, onSelect, onSearch, hints = [] } = props;
+
+  // Find event trigger
+  useEvent(props.event ?? find, focus);
+
+  // Lookup trigger
+  const triggerLookup = React.useCallback(
+    debounce((pattern: string) => {
+      if (onSearch) onSearch(pattern);
+    }, DEBOUNCED_SEARCH),
+    [onSearch],
+  );
+
+  // Blur Event
+  const onBlur = () => {
+    setValue('');
+    setIndex(-1);
+    if (onSearch) onSearch('');
+  };
+
+  // Key Events
+  const onKey = (evt: React.KeyboardEvent) => {
+    switch (evt.key) {
+      case 'Escape':
+        blur();
+        break;
+      case 'Enter':
+        if (index >= 0 && index < hints.length) {
+          if (onHint) onHint(hints[index]);
+        } else if (onSelect) onSelect(value);
+        blur();
+        break;
+      case 'ArrowUp':
+        if (index < 0) setIndex(hints.length - 1);
+        if (index > 0) setIndex(index - 1);
+        break;
+      case 'ArrowDown':
+        if (index < 0 && 0 < hints.length) setIndex(0);
+        if (0 <= index && index < hints.length - 1) setIndex(index + 1);
+        break;
+    }
+  };
+
+  // Input Events
+  const onChange = (evt: React.ChangeEvent<HTMLInputElement>) => {
+    const newValue = evt.target.value;
+    triggerLookup(newValue);
+    setIndex(-1);
+    setValue(newValue);
+  };
+
+  // Render Suggestions
+  const suggestions = hints.map((h, k) => {
+    const selected = k === index || hints.length === 1;
+    const className = classes(
+      'dome-xToolBar-searchitem',
+      selected && 'dome-xToolBar-searchindex',
+    );
+    return (
+      <Label
+        ref={selected ? scrollToRef : undefined}
+        key={h.id}
+        icon={h.icon}
+        title={h.title}
+        className={className}
+        onClick={() => {
+          if (onHint) onHint(h);
+          blur();
+        }}
+      >
+        {h.label}
+      </Label>
+    );
+  });
+  const haspopup =
+    inputRef.current === document.activeElement
+    && suggestions.length > 0;
+  const visibility = haspopup ? 'visible' : 'hidden';
+
+  // Render Component
+  return (
+    <>
+      <div className="dome-xToolBar-searchicon">
+        <SVG id="SEARCH" />
+        <div
+          style={{ visibility }}
+          className="dome-xToolBar-searchmenu"
+          onMouseDown={(event) => event.preventDefault()}
+        >
+          {suggestions}
+        </div>
+      </div>
+      <input
+        ref={inputRef}
+        type="search"
+        title={props.title}
+        value={value}
+        placeholder={props.placeholder}
+        className="dome-xToolBar-control dome-xToolBar-searchfield"
+        onKeyUp={onKey}
+        onChange={onChange}
+        onBlur={onBlur}
+      />
+    </>
+  );
+}
+
+// --------------------------------------------------------------------------
diff --git a/ivette/src/dome/src/renderer/layout/boxes.tsx b/ivette/src/dome/renderer/layout/boxes.tsx
similarity index 97%
rename from ivette/src/dome/src/renderer/layout/boxes.tsx
rename to ivette/src/dome/renderer/layout/boxes.tsx
index 2d98e79fd1753cd726bf857c092db42f18cb9f52..789bcb44149e634bd107db0efc6f65bf169e6cf1 100644
--- a/ivette/src/dome/src/renderer/layout/boxes.tsx
+++ b/ivette/src/dome/renderer/layout/boxes.tsx
@@ -166,7 +166,7 @@ export interface FolderProps {
   /** Contents left margin (in pixels, defaults to 18). */
   indent?: number;
   /** Children JSX elements. */
-  children: any;
+  children?: React.ReactNode;
 }
 
 /**
@@ -180,12 +180,12 @@ export const Folder = (props: FolderProps) => {
     indent = 18,
     label, title, children,
   } = props;
-  const [unfold, onClick] = Dome.useSwitch(settings, defaultUnfold);
+  const [unfold, flip] = Dome.useFlipSettings(settings, defaultUnfold);
   const icon = unfold ? 'TRIANGLE.DOWN' : 'TRIANGLE.RIGHT';
-  const display = unfold ? 'none' : 'block';
+  const display = unfold ? 'block' : 'none';
   return (
     <Vpack>
-      <Hpack onClick={onClick}>
+      <Hpack onClick={flip}>
         <Title icon={icon} label={label} title={title} />
       </Hpack>
       <Vpack style={{ display, marginLeft: indent }}>
diff --git a/ivette/src/dome/renderer/layout/dispatch.tsx b/ivette/src/dome/renderer/layout/dispatch.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..73673d6a8e2ae9c6f9377d6e8517219e79968115
--- /dev/null
+++ b/ivette/src/dome/renderer/layout/dispatch.tsx
@@ -0,0 +1,121 @@
+// --------------------------------------------------------------------------
+// --- Dispatch Layout
+// --------------------------------------------------------------------------
+
+/**
+
+   This module allows to declare components anywhere in a component hierarchy
+   and to render them a totally different place.
+
+   You shall wrap dispatched components inside a `<Dispatch.Item>` container,
+   and render them wherever you want with `<Dispatch.Render>`. Each target
+   place can display only one uniquely identified item.
+
+   This can be also used to display some item among many in one unique place.
+
+   @packageDocumentation
+   @module dome/layout/dispatch
+ */
+
+import React from 'react';
+import { Event } from 'dome';
+
+// --------------------------------------------------------------------------
+// --- Global Dispatcher
+// --------------------------------------------------------------------------
+
+class ITEM {
+  event: Event;
+  rendered = false;
+  content: React.ReactNode = undefined;
+  constructor(id: string) {
+    this.event = new Event(`dome-dispatch-${id}`);
+  }
+
+  update(content: React.ReactNode) {
+    this.content = content;
+    if (this.rendered) {
+      this.rendered = false;
+      setImmediate(this.event.emit);
+    }
+  }
+}
+
+const ITEMS = new Map<string, ITEM>();
+
+const getItem = (id: string): ITEM => {
+  let item = ITEMS.get(id);
+  if (!item) {
+    item = new ITEM(id);
+    ITEMS.set(id, item);
+  }
+  return item;
+};
+
+// --------------------------------------------------------------------------
+// --- Element Definition
+// --------------------------------------------------------------------------
+
+export interface ElementProps {
+  /** Element identifier. */
+  id: string;
+  /** Element contents. */
+  children?: React.ReactNode;
+}
+
+/**
+   Define an identified element.
+
+   The `<DefineElement />` renders `null` and register its contents under
+   the specified identifier, which would be rendered by `<RenderElement />`
+   everywhere else.
+
+   Multiple definitions of the same element might produce
+   unpredictable results.
+ */
+export function DefineElement(props: ElementProps) {
+  React.useEffect(() => {
+    const item = getItem(props.id);
+    item.update(props.children);
+    return () => item.update(undefined);
+  });
+  return null;
+}
+
+// --------------------------------------------------------------------------
+// --- Render Elements
+// --------------------------------------------------------------------------
+
+export interface RenderProps {
+  id?: string;
+  children?: React.ReactNode | ((content: React.ReactNode) => React.ReactNode);
+}
+
+/**
+   Render an identified element.
+
+   If the render element has a function as children, it is passed the content
+   of the item, or `undefined` if there is no identifier or no
+   corresponding `<DefineElement />` currently mounted.
+ */
+export function RenderElement(props: RenderProps) {
+  const [age, setAge] = React.useState(0);
+  const { id, children } = props;
+  const item = id ? getItem(id) : undefined;
+  React.useEffect(() => {
+    if (item) {
+      const { event } = item;
+      const trigger = () => setAge(age + 1);
+      event.on(trigger);
+      return () => event.off(trigger);
+    }
+    return undefined;
+  }, [age, item]);
+  if (item) item.rendered = true;
+  if (typeof (children) === 'function')
+    return children(item?.content);
+  const content = item?.content || children;
+  return content;
+}
+
+// --------------------------------------------------------------------------
diff --git a/ivette/src/dome/renderer/layout/forms.tsx b/ivette/src/dome/renderer/layout/forms.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..3cb95ffaa0da2586836e4adf453964007b533384
--- /dev/null
+++ b/ivette/src/dome/renderer/layout/forms.tsx
@@ -0,0 +1,1244 @@
+/* --------------------------------------------------------------------------*/
+/* --- Form Fields                                                        ---*/
+/* --------------------------------------------------------------------------*/
+
+/**
+   Form Fields are made of states and fields, arranged into a form page.
+
+   Field states are typically build with [[useState]] and [[useProperty]]
+   hooks, also you can also build them manually. All the provided hooks
+   can be used and composed with each other to build full feature states.
+
+   Form fields shall be arranged into sections and form pages to obtain a
+   wellformed layout.
+
+   @packageDocumentation
+   @module dome/layout/form
+ */
+
+import { debounce } from 'lodash';
+import React from 'react';
+import * as Dome from 'dome';
+import * as Utils from 'dome/misc/utils';
+import { SVG } from 'dome/controls/icons';
+import { Checkbox, Radio, Select as SelectMenu } from 'dome/controls/buttons';
+
+export type Error =
+  | undefined | boolean | string
+  | { [key: string]: Error } | Error[];
+export type Checker<A> = (value: A) => boolean | Error;
+export type Callback<A> = (value: A, error: Error) => void;
+export type FieldState<A> = [A, Error, Callback<A>];
+
+/* --------------------------------------------------------------------------*/
+/* --- State Errors Utilities                                             ---*/
+/* --------------------------------------------------------------------------*/
+
+export function inRange(
+  a: number,
+  b: number,
+): Checker<number> {
+  return (v: number) => (a <= v && v <= b);
+}
+
+export function validate<A>(
+  value: A,
+  checker: undefined | Checker<A>,
+): Error {
+  if (checker) {
+    try {
+      const r = checker(value);
+      if (r === undefined || r === true) return undefined;
+      return r;
+    } catch (err) {
+      return err.toString() || false;
+    }
+  }
+  return undefined;
+}
+
+export function isValid(err: Error): boolean { return !err; }
+
+type ObjectError = { [key: string]: Error };
+
+function isObjectError(err: Error): err is ObjectError {
+  return typeof err === 'object' && !Array.isArray(err);
+}
+
+function isArrayError(err: Error): err is Error[] {
+  return Array.isArray(err);
+}
+
+function isValidObject(err: ObjectError): boolean {
+  const ks = Object.keys(err);
+  for (let k = 0; k < ks.length; k++) {
+    if (!isValid(err[ks[k]])) return false;
+  }
+  return true;
+}
+
+function isValidArray(err: Error[]): boolean {
+  for (let k = 0; k < err.length; k++) {
+    if (!isValid(err[k])) return false;
+  }
+  return true;
+}
+
+/* --------------------------------------------------------------------------*/
+/* --- State Hooks                                                        ---*/
+/* --------------------------------------------------------------------------*/
+
+/** Create a local field state, like `React.useState()` does. */
+export function useState<A>(
+  defaultValue: A,
+  checker?: Checker<A>,
+  onChange?: Callback<A>,
+): FieldState<A> {
+  const [value, setValue] = React.useState<A>(defaultValue);
+  const [error, setError] = React.useState<Error>(undefined);
+  const setState = React.useCallback((newValue: A, newError: Error) => {
+    const localError = validate(newValue, checker) || newError;
+    setValue(newValue);
+    setError(localError);
+    if (onChange) onChange(newValue, localError);
+  }, [checker, setValue, setError, onChange]);
+  return [value, error, setState];
+}
+
+/** Introduces a local state and propagates only non-errors. */
+export function useValid<A>(
+  state: [A, (newValue: A) => void],
+): FieldState<A> {
+  const [value, setValue] = state;
+  const [local, setLocal] = React.useState(value);
+  const [error, setError] = React.useState<Error>(undefined);
+  const update = React.useCallback(
+    (newValue: A, newError: Error) => {
+      setLocal(newValue);
+      setError(newError);
+      if (!newError) setValue(newValue);
+    }, [setValue],
+  );
+  return [error ? local : value, error, update];
+}
+
+/** Provides a new state with a default value. */
+export function useDefault<A>(
+  state: FieldState<A | undefined>,
+  defaultValue: A,
+): FieldState<A> {
+  const [value, error, setState] = state;
+  return [value ?? defaultValue, error, setState];
+}
+
+/**
+   Coerces a state with defined value
+   into some with possibly undefined one.
+ */
+export function useDefined<A>(
+  state: FieldState<A>,
+): FieldState<A | undefined> {
+  const [value, error, setState] = state;
+  const update = React.useCallback(
+    (newValue: A | undefined, newError: Error) => {
+      if (newValue !== undefined) {
+        setState(newValue, newError);
+      }
+    }, [setState],
+  );
+  return [value, error, update];
+}
+
+/**
+   Undefined value leads to an error.
+   @param onError - error message in case of undefined or invalid updates.
+ */
+export function useRequired<A>(
+  state: FieldState<A>,
+  onError?: string,
+): FieldState<A | undefined> {
+  const [value, error, setState] = state;
+  const cache = React.useRef(value);
+  const update = React.useCallback(
+    (newValue: A | undefined, newError: Error) => {
+      if (newValue === undefined) {
+        setState(cache.current, onError || 'Required field');
+      } else {
+        setState(newValue, newError);
+      }
+    }, [cache, onError, setState],
+  );
+  return [value, error, update];
+}
+
+/**
+   Enrich the state with a local checker.
+   The local error, if any, has precedence over any error from updates.
+ */
+export function useChecker<A>(
+  state: FieldState<A>,
+  checker?: Checker<A>,
+): FieldState<A> {
+  const [value, error, setState] = state;
+  const update = React.useCallback((newValue: A, newError: Error) => {
+    const localError = validate(newValue, checker) || newError;
+    setState(newValue, localError);
+  }, [checker, setState]);
+  return [value, error, update];
+}
+
+/**
+   Transform a state `A` into a state `B` through converting functions.
+
+   Input and output functions shall be the inverse with each others.
+
+   In case an exception is raised during input conversion, state `B`
+   retains its previous value (or default value) but forwards
+   the translation error.
+
+   In case an exception is raised during output conversion, a local state
+   is maintained with the invalid `B` value until it is transformed into
+   a valid one.
+
+   @param input - converting function from `A` to `B`
+   @param output - converting function from `B` to `A`
+ */
+
+export function useFilter<A, B>(
+  state: FieldState<A>,
+  input: (value: A) => B,
+  output: (value: B) => A,
+  defaultValue: B,
+): FieldState<B> {
+
+  const [value, error, setState] = state;
+  const [localValue, setLocalValue] = React.useState(defaultValue);
+  const [localError, setLocalError] = React.useState<Error>(undefined);
+  const [dangling, setDangling] = React.useState(false);
+
+  const update = React.useCallback(
+    (newValue: B, newError: Error) => {
+      try {
+        const outValue = output(newValue);
+        setLocalValue(newValue);
+        setLocalError(newError);
+        if (isValid(newError)) {
+          setDangling(false);
+          setState(outValue, undefined);
+        }
+      } catch (err) {
+        setLocalValue(newValue);
+        setLocalError(newError || err.toString() || 'Invalid value');
+        setDangling(true);
+      }
+    }, [output, setState, setLocalValue, setLocalError],
+  );
+
+  if (dangling) {
+    return [localValue, localError, update];
+  }
+  try {
+    return [input(value), error, update];
+  } catch (err) {
+    return [localValue, err.toString() || 'Invalid input', update];
+  }
+
+}
+
+/**
+   Introduces a latency between local changes and propagated ones.
+   A transient local state is maintained during debounced updates, until
+   the last update is finally flushed.
+ */
+export function useLatency<A>(
+  state: FieldState<A>,
+  latency?: number,
+): FieldState<A> {
+  const [value, error, setState] = state;
+  const period = latency ?? 0;
+  const [localValue, setLocalValue] = React.useState(value);
+  const [localError, setLocalError] = React.useState(error);
+  const [dangling, setDangling] = React.useState(false);
+  const update = React.useMemo(() => {
+    if (period > 0) {
+      const propagate = debounce(
+        (lateValue: A, lateError: Error) => {
+          setState(lateValue, lateError);
+          setDangling(false);
+        }, period,
+      );
+      return (newValue: A, newError: Error) => {
+        setLocalValue(newValue);
+        setLocalError(newError);
+        setDangling(true);
+        propagate(newValue, newError);
+      };
+    }
+    setDangling(false);
+    return setState;
+  }, [period, setDangling, setState, setLocalValue, setLocalError]);
+  return [
+    dangling ? localValue : value,
+    dangling ? localError : error,
+    update,
+  ];
+}
+
+/**
+   Returns the state associated to a property of the input state.
+ */
+export function useProperty<A, K extends keyof A>(
+  state: FieldState<A>,
+  property: K,
+  checker?: Checker<A[K]>,
+): FieldState<A[K]> {
+  const [value, error, setState] = state;
+  const update = React.useCallback((newProp: A[K], newError: Error) => {
+    const newValue = { ...value, [property]: newProp };
+    const objError = isObjectError(error) ? error : {};
+    const propError = validate(newProp, checker) || newError;
+    const localError = { ...objError, [property]: propError };
+    setState(newValue, isValidObject(localError) ? undefined : localError);
+  }, [value, error, setState, property, checker]);
+  return [value[property], error, update];
+}
+
+/**
+   Returns the state associated to an index element of the input state.
+ */
+export function useIndex<A>(
+  state: FieldState<A[]>,
+  index: number,
+  checker?: Checker<A>,
+): FieldState<A> {
+  const [array, error, setState] = state;
+  const update = React.useCallback((newValue: A, newError: Error) => {
+    const newArray = array.slice();
+    newArray[index] = newValue;
+    const localError = isArrayError(error) ? error.slice() : [];
+    const valueError = validate(newValue, checker) || newError;
+    localError[index] = valueError;
+    setState(newArray, isValidArray(localError) ? undefined : localError);
+  }, [array, error, setState, index, checker]);
+  const itemError = isArrayError(error) ? error[index] : undefined;
+  return [array[index], itemError, update];
+}
+
+/* --------------------------------------------------------------------------*/
+/* --- Form Filter Context                                                ---*/
+/* --------------------------------------------------------------------------*/
+
+export interface FilterProps {
+  /** default is false. */
+  hidden?: boolean;
+  /** default is true. */
+  visible?: boolean;
+  /** default is true. */
+  enabled?: boolean;
+  /** default is false. */
+  disabled?: boolean;
+}
+
+export interface Children { children?: React.ReactNode }
+
+interface FormContext {
+  disabled: boolean;
+  hidden: boolean;
+}
+
+const CONTEXT = React.createContext<FormContext | undefined>(undefined);
+
+const HIDDEN =
+  ({ hidden = false, visible = true }: FilterProps) => hidden || !visible;
+
+const DISABLED =
+  ({ disabled = false, enabled = true }: FilterProps) => disabled || !enabled;
+
+function useContext(props?: FilterProps): FormContext {
+  const Parent = React.useContext(CONTEXT);
+  return {
+    hidden: (props && HIDDEN(props)) || (Parent?.hidden ?? false),
+    disabled: (props && DISABLED(props)) || (Parent?.disabled ?? false),
+  };
+}
+
+/**
+   Allow to locally disable or hide all its children fields.
+   @category Form Containers
+*/
+export function FormFilter(props: FilterProps & Children) {
+  const context = useContext(props);
+  if (context.hidden) return null;
+  return (
+    <CONTEXT.Provider value={context}>
+      {props.children}
+    </CONTEXT.Provider>
+  );
+}
+
+/* --------------------------------------------------------------------------*/
+/* --- Main Form Container                                                ---*/
+/* --------------------------------------------------------------------------*/
+
+/** @category Form Containers */
+export interface PageProps extends FilterProps, Children {
+  /** Additional container class. */
+  className?: string;
+  /** Additional container style. */
+  style?: React.CSSProperties;
+}
+
+/**
+   Main Form Container.
+   @category Form Containers
+ */
+export function Page(props: PageProps) {
+  const { className, style, children, ...filter } = props;
+  const { hidden, disabled } = useContext(filter);
+  const css = Utils.classes('dome-xForm-grid', className);
+  if (hidden) return null;
+  return (
+    <div className={css} style={style}>
+      <CONTEXT.Provider value={{ hidden, disabled }}>
+        {children}
+      </CONTEXT.Provider>
+    </div>
+  );
+}
+
+// --------------------------------------------------------------------------
+// --- Warning Badge
+// --------------------------------------------------------------------------
+
+export interface WarningProps {
+  /** Short warning message (displayed on hover). */
+  warning?: string;
+  /** Error details (if a string is provided, in tooltip). */
+  error?: Error;
+  /** Label offset. */
+  offset?: number;
+}
+
+/** Warning Badge. */
+export function Warning(props: WarningProps) {
+  const { warning, error, offset = 0 } = props;
+  const DETAILS = typeof error === 'string' ? error : undefined;
+  const WARNING = warning && (
+    <span className="dome-xForm-warning">
+      {warning}
+    </span>
+  );
+  return (
+    <div
+      className="dome-xIcon dome-xForm-error"
+      style={{ top: offset - 2 }}
+      title={DETAILS}
+    >
+      <SVG id="WARNING" size={11} />
+      {WARNING}
+    </div>
+  );
+}
+
+// --------------------------------------------------------------------------
+// --- Block Container
+// --------------------------------------------------------------------------
+
+/**
+   Layout its contents inside a full-width container.
+   @category Form Containers
+ */
+export function FormBlock(props: FilterProps & Children) {
+  const { children, ...filter } = props;
+  return (
+    <FormFilter {...filter}>
+      <div className="dome-xForm-block">
+        {children}
+      </div>
+    </FormFilter>
+  );
+}
+
+// --------------------------------------------------------------------------
+// --- Section Container
+// --------------------------------------------------------------------------
+
+/** @category Form Fields */
+export interface SectionProps extends FilterProps, Children {
+  /** Section name. */
+  label: string;
+  /** Tooltip text. */
+  title?: string;
+  /** Warning Error (when unfolded). */
+  warning?: string;
+  /** Associated Error. */
+  error?: Error;
+  /** Fold/Unfold settings. */
+  settings?: string;
+  /** Fold/Unfold state (defaults to false). */
+  unfold?: boolean;
+}
+
+/** @category Form Fields */
+export function Section(props: SectionProps) {
+  const { label, title, children, warning, error, ...filter } = props;
+  const { disabled, hidden } = useContext(filter);
+  const [unfold, flip] = Dome.useFlipSettings(props.settings, props.unfold);
+
+  if (hidden) return null;
+
+  const hasWarning = unfold && !disabled && error;
+
+  const cssTitle = Utils.classes(
+    'dome-text-title',
+    disabled && 'dome-disabled',
+  );
+
+  return (
+    <CONTEXT.Provider value={{ hidden, disabled }}>
+      <div className="dome-xForm-section">
+        <div className="dome-xForm-fold" onClick={flip}>
+          <SVG id={unfold ? 'TRIANGLE.DOWN' : 'TRIANGLE.RIGHT'} size={11} />
+        </div>
+        <label className={cssTitle} title={title}>
+          {label}
+        </label>
+        {hasWarning && <Warning warning={warning} />}
+      </div>
+      {unfold && children}
+      {unfold && <div className="dome-xForm-hsep" />}
+    </CONTEXT.Provider>
+  );
+}
+
+/* --------------------------------------------------------------------------*/
+/* --- Generic Field                                                     --- */
+/* --------------------------------------------------------------------------*/
+
+/** @category Form Fields */
+export interface GenericFieldProps extends FilterProps, Children {
+  /** Field label. */
+  label: string;
+  /** Field tooltip text. */
+  title?: string;
+  /** Field offset. */
+  offset?: number;
+  /** Html tag `<input />` element. */
+  htmlFor?: string;
+  /** Warning message (in case of error). */
+  onError?: string;
+  /** Error (if any). */
+  error?: Error;
+}
+
+let FIELDID = 0;
+
+/** Generates a unique, stable identifier. */
+export function useHtmlFor() {
+  return React.useMemo(() => `dome-field ${FIELDID++}`, []);
+}
+
+/**
+   Generic Field.
+   Layout its content in a top-left aligned box on the right of the label.
+   @category Form Fields
+ */
+export function Field(props: GenericFieldProps) {
+  const { hidden, disabled } = useContext(props);
+
+  if (hidden) return null;
+
+  const { label, title, offset, htmlFor, children } = props;
+
+  const cssLabel = Utils.classes(
+    'dome-xForm-label dome-text-label',
+    disabled && 'dome-disabled',
+  );
+
+  const cssField = Utils.classes(
+    'dome-xForm-field dome-text-label',
+    disabled && 'dome-disabled',
+  );
+
+  const { onError, error } = props;
+
+  const WARNING = error ? (
+    <Warning offset={offset} warning={onError} error={error} />
+  ) : null;
+
+  return (
+    <>
+      <label
+        className={cssLabel}
+        style={{ top: offset }}
+        htmlFor={htmlFor}
+        title={title}
+      >
+        {label}
+      </label>
+      <div className={cssField}>
+        {children}
+        {WARNING}
+      </div>
+    </>
+  );
+
+}
+
+/* --------------------------------------------------------------------------*/
+/* --- Input Fields                                                       ---*/
+/* --------------------------------------------------------------------------*/
+
+/** @category Form Fields */
+export interface FieldProps<A> extends FilterProps {
+  /** Field label. */
+  label: string;
+  /** Field tooltip text. */
+  title?: string;
+  /** Field state. */
+  state: FieldState<A>;
+  /** Checker. */
+  checker?: Checker<A>;
+  /** Alternative error message (in case of error). */
+  onError?: string;
+}
+
+type InputEvent = { target: { value: string } };
+type InputState = [string, Error, (evt: InputEvent) => void];
+
+function useChangeEvent(setState: Callback<string>) {
+  return React.useCallback(
+    (evt: InputEvent) => { setState(evt.target.value, undefined); },
+    [setState],
+  );
+}
+
+function useTextInputField(
+  props: TextFieldProps,
+  defaultLatency: number,
+): InputState {
+  const checked = useChecker(props.state, props.checker);
+  const period = props.latency ?? defaultLatency;
+  const [value, error, setState] = useLatency(checked, period);
+  const onChange = useChangeEvent(setState);
+  return [value || '', error, onChange];
+}
+
+/* --------------------------------------------------------------------------*/
+/* --- Text Fields                                                        ---*/
+/* --------------------------------------------------------------------------*/
+
+/** @category Text Fields */
+export interface TextFieldProps extends FieldProps<string | undefined> {
+  placeholder?: string;
+  className?: string;
+  style?: React.CSSProperties;
+  latency?: number;
+}
+
+/**
+   Text Field.
+   @category Text Fields
+ */
+export function TextField(props: TextFieldProps) {
+  const { disabled } = useContext(props);
+  const id = useHtmlFor();
+  const css = Utils.classes('dome-xForm-text-field', props.className);
+  const [value, error, onChange] = useTextInputField(props, 600);
+  return (
+    <Field
+      {...props}
+      offset={4}
+      htmlFor={id}
+      error={error}
+    >
+      <input
+        id={id}
+        type="text"
+        value={value}
+        className={css}
+        style={props.style}
+        disabled={disabled}
+        placeholder={props.placeholder}
+        onChange={onChange}
+      />
+    </Field>
+  );
+}
+
+/**
+   Monospaced Text Field.
+   @category Text Fields
+ */
+export function TextCodeField(props: TextFieldProps) {
+  const { disabled } = useContext(props);
+  const id = useHtmlFor();
+  const [value, error, onChange] = useTextInputField(props, 600);
+  const css = Utils.classes(
+    'dome-xForm-text-field',
+    'dome-text-code',
+    props.className,
+  );
+  return (
+    <Field
+      {...props}
+      offset={4}
+      htmlFor={id}
+      error={error}
+    >
+      <input
+        id={id}
+        type="text"
+        value={value}
+        className={css}
+        style={props.style}
+        disabled={disabled}
+        placeholder={props.placeholder}
+        onChange={onChange}
+      />
+    </Field>
+  );
+}
+
+/* --------------------------------------------------------------------------*/
+/* --- Text Area Fields                                                   ---*/
+/* --------------------------------------------------------------------------*/
+
+/** @category Text Fields */
+export interface TextFieldAreaProps extends TextFieldProps {
+  /** Number of columns (default 35, min 5). */
+  cols?: number;
+  /** Number of rows (default 5, min 2). */
+  rows?: number;
+}
+
+/**
+   Text Field Area.
+   @category Text Fields
+ */
+export function TextFieldArea(props: TextFieldAreaProps) {
+  const { disabled } = useContext(props);
+  const id = useHtmlFor();
+  const [value, error, onChange] = useTextInputField(props, 900);
+  const cols = Math.max(5, props.cols ?? 35);
+  const rows = Math.max(2, props.rows ?? 5);
+  const css = Utils.classes(
+    'dome-xForm-textarea-field',
+    props.className,
+  );
+  return (
+    <Field
+      {...props}
+      offset={4}
+      htmlFor={id}
+      error={error}
+    >
+      <textarea
+        id={id}
+        wrap="hard"
+        spellCheck
+        value={value}
+        cols={cols}
+        rows={rows - 1}
+        className={css}
+        style={props.style}
+        disabled={disabled}
+        placeholder={props.placeholder}
+        onChange={onChange}
+      />
+    </Field>
+  );
+}
+
+/**
+   Monospaced Text Field Area.
+   @category Text Fields
+ */
+export function TextCodeFieldArea(props: TextFieldAreaProps) {
+  const { disabled } = useContext(props);
+  const id = useHtmlFor();
+  const [value, error, onChange] = useTextInputField(props, 900);
+  const cols = Math.max(5, props.cols ?? 35);
+  const rows = Math.max(2, props.rows ?? 5);
+  const css = Utils.classes(
+    'dome-xForm-textarea-field',
+    'dome-text-code',
+    props.className,
+  );
+  return (
+    <Field
+      {...props}
+      offset={4}
+      htmlFor={id}
+      error={error}
+    >
+      <textarea
+        id={id}
+        wrap="off"
+        spellCheck={false}
+        value={value}
+        cols={cols}
+        rows={rows}
+        className={css}
+        style={props.style}
+        disabled={disabled}
+        placeholder={props.placeholder}
+        onChange={onChange}
+      />
+    </Field>
+  );
+}
+
+/* --------------------------------------------------------------------------*/
+/* --- Number Field                                                       ---*/
+/* --------------------------------------------------------------------------*/
+
+/** @category Number Fields */
+export interface NumberFieldProps extends FieldProps<number | undefined> {
+  units?: string;
+  placeholder?: string;
+  className?: string;
+  style?: React.CSSProperties;
+  latency?: number;
+}
+
+function TEXT_OF_NUMBER(n: number | undefined): string {
+  if (n === undefined) return '';
+  if (Number.isNaN(n)) throw new Error('Invalid number');
+  return Number(n).toLocaleString('en');
+}
+
+function NUMBER_OF_TEXT(s: string): number | undefined {
+  if (s === '') return undefined;
+  const n = Number.parseFloat(s.replace(/[ ,]/g, ''));
+  if (Number.isNaN(n)) throw new Error('Invalid number');
+  return n;
+}
+
+/**
+   Text Field for Numbers.
+   @category Number Fields
+ */
+export function NumberField(props: NumberFieldProps) {
+  const { units, latency = 600 } = props;
+  const { disabled } = useContext(props);
+  const id = useHtmlFor();
+  const css = Utils.classes('dome-xForm-number-field', props.className);
+  const checked = useChecker(props.state, props.checker);
+  const filtered = useFilter(checked, TEXT_OF_NUMBER, NUMBER_OF_TEXT, '');
+  const [value, error, setState] = useLatency(filtered, latency);
+  const onChange = useChangeEvent(setState);
+  const UNITS = units && (
+    <label className="dome-text-label dome-xForm-units">{units}</label>
+  );
+  return (
+    <Field
+      {...props}
+      htmlFor={id}
+      error={error}
+    >
+      <input
+        id={id}
+        type="text"
+        value={value}
+        className={css}
+        style={props.style}
+        disabled={disabled}
+        placeholder={props.placeholder}
+        onChange={onChange}
+      />
+      {UNITS}
+    </Field>
+  );
+}
+
+/* --------------------------------------------------------------------------*/
+/* --- Spinner Field                                                      ---*/
+/* --------------------------------------------------------------------------*/
+
+/** @category Number Fields */
+export interface SpinnerFieldProps extends NumberFieldProps {
+  units?: string;
+  /** Minimum value (included). */
+  min: number;
+  /** Maximum value (included). */
+  max: number;
+  /** Stepper increment (defaults 1). */
+  step?: number;
+}
+
+/**
+   Spinner Field
+   @category Number Fields
+ */
+export function SpinnerField(props: SpinnerFieldProps) {
+  const { units, min, max, step = 1, latency = 600, checker } = props;
+  const { disabled } = useContext(props);
+  const id = useHtmlFor();
+  const css = Utils.classes('dome-xForm-spinner-field', props.className);
+  const fullChecker = React.useCallback((v: number | undefined) => {
+    if (v !== undefined && min <= v && v <= max) {
+      return checker ? checker(v) : true;
+    }
+    return `Range ${min}…${max}`;
+
+  }, [min, max, checker]);
+  const checked = useChecker(props.state, fullChecker);
+  const filtered = useFilter(checked, TEXT_OF_NUMBER, NUMBER_OF_TEXT, '');
+  const [value, error, setState] = useLatency(filtered, latency);
+  const onChange = useChangeEvent(setState);
+  const UNITS = units && (
+    <label className="dome-text-label dome-xForm-units">{units}</label>
+  );
+  return (
+    <Field
+      {...props}
+      htmlFor={id}
+      error={error}
+    >
+      <input
+        id={id}
+        type="number"
+        value={value}
+        min={min}
+        max={max}
+        step={step}
+        className={css}
+        style={props.style}
+        disabled={disabled}
+        placeholder={props.placeholder}
+        onChange={onChange}
+      />
+      {UNITS}
+    </Field>
+  );
+}
+
+/* --------------------------------------------------------------------------*/
+/* --- Slider Field                                                       ---*/
+/* --------------------------------------------------------------------------*/
+
+/** @category Number Fields */
+export interface SliderFieldProps extends FieldProps<number> {
+  /** Minimal value (included). */
+  min: number;
+  /** Maximal value (included). */
+  max: number;
+  /** Default is 1. */
+  step?: number;
+  /** Reset value on double-click (if defined). */
+  onReset?: number;
+  /**
+     Show a label displaying the value (default is true).
+     In case a function is provided, it is used to reformat the value.
+   */
+  labelValue?: boolean | ((value: number) => string);
+  className?: string;
+  style?: React.CSSProperties;
+  latency?: number;
+}
+
+const FORMAT_VALUE = (v: number) => Number(v).toString();
+const FORMAT_RANGE = (v: number) => (v > 0 ? `+${v}` : `-${-v}`);
+const FORMATING = (props: SliderFieldProps) => {
+  const { labelValue = true, min } = props;
+  if (labelValue === false) return undefined;
+  if (labelValue === true) return min < 0 ? FORMAT_RANGE : FORMAT_VALUE;
+  return labelValue;
+};
+
+const CSS_SLIDER = 'dome-text-label dome-xForm-units dome-xForm-slider-value';
+const SHOW_SLIDER = `${CSS_SLIDER} dome-xForm-slider-show`;
+const HIDE_SLIDER = `${CSS_SLIDER} dome-xForm-slider-hide`;
+
+/**
+   Slider Field
+   @category Number Fields
+ */
+export function SliderField(props: SliderFieldProps) {
+  const { min, max, step = 1, latency = 600, onReset } = props;
+  const { disabled } = useContext(props);
+  const id = useHtmlFor();
+  const css = Utils.classes('dome-xForm-slider-field', props.className);
+  const checked = useChecker(props.state, props.checker);
+  const delayed = useLatency(checked, latency);
+  const [label, setLabel] = React.useState<string | undefined>(undefined);
+  const [value, error, setState] = delayed;
+  const labeling = FORMATING(props);
+  const onChange = React.useMemo(
+    () => {
+      const fadeOut = debounce(() => setLabel(undefined), latency);
+      return (evt: InputEvent) => {
+        const v = Number.parseInt(evt.target.value, 10);
+        if (!Number.isNaN(v)) {
+          setState(v, undefined);
+          const vlabel = labeling && labeling(v);
+          setLabel(vlabel);
+          if (vlabel) fadeOut();
+        } else {
+          setLabel(undefined);
+        }
+      };
+    }, [labeling, latency, setState, setLabel],
+  );
+  const onDoubleClick = React.useCallback(() => {
+    if (onReset) {
+      setState(onReset, undefined);
+      setLabel(undefined);
+    }
+  }, [onReset, setState, setLabel]);
+  const VALUELABEL = labeling && (
+    <label className={label ? SHOW_SLIDER : HIDE_SLIDER}>
+      {label}
+    </label>
+  );
+  return (
+    <Field
+      {...props}
+      htmlFor={id}
+      error={error}
+    >
+      <input
+        id={id}
+        type="range"
+        value={value}
+        min={min}
+        max={max}
+        step={step}
+        className={css}
+        style={props.style}
+        disabled={disabled}
+        onDoubleClick={onDoubleClick}
+        onChange={onChange}
+      />
+      {VALUELABEL}
+    </Field>
+  );
+}
+
+/* --------------------------------------------------------------------------*/
+/* --- Date Field                                                         ---*/
+/* --------------------------------------------------------------------------*/
+
+/** @category Time and Date Fields */
+export interface TimeOrDateFieldProps extends FieldProps<string | undefined> {
+  min?: string;
+  max?: string;
+  className?: string;
+  style?: React.CSSProperties;
+  latency?: number;
+}
+
+/**
+   Field with a Date Input element.
+
+   The date is presented in english locale, with format `mm/dd/yyyy`,
+   but the state value is a string compatible with
+   javascript `Date('yyyy-dd-mm')` format.
+
+   @category Time and Date Fields
+ */
+export function DateField(props: TimeOrDateFieldProps) {
+  const { disabled } = useContext(props);
+  const id = useHtmlFor();
+  const css = Utils.classes('dome-xForm-date-field', props.className);
+  const [value, error, onChange] = useTextInputField(props, 600);
+  return (
+    <Field
+      {...props}
+      htmlFor={id}
+      error={error}
+    >
+      <input
+        id={id}
+        type="date"
+        value={value}
+        min={props.min}
+        max={props.max}
+        className={css}
+        style={props.style}
+        disabled={disabled}
+        onChange={onChange}
+      />
+    </Field>
+  );
+}
+
+/**
+   Field with a Time Input element.
+
+   The time is presented in english locale, but its internal
+   value is a string 'hh:mm' on 24h per day basis. This internal
+   format can be used to form a valid javascript
+   `Date('yyyy-mm-ddThh:mm')` object.
+
+   @category Time and Date Fields
+ */
+export function TimeField(props: TimeOrDateFieldProps) {
+  const { disabled } = useContext(props);
+  const id = useHtmlFor();
+  const css = Utils.classes('dome-xForm-date-field', props.className);
+  const [value, error, onChange] = useTextInputField(props, 600);
+  return (
+    <Field
+      {...props}
+      htmlFor={id}
+      error={error}
+    >
+      <input
+        id={id}
+        type="time"
+        value={value}
+        min={props.min}
+        max={props.max}
+        className={css}
+        style={props.style}
+        disabled={disabled}
+        onChange={onChange}
+      />
+    </Field>
+  );
+}
+
+/* --------------------------------------------------------------------------*/
+/* --- Color Field                                                        ---*/
+/* --------------------------------------------------------------------------*/
+
+/** @category Form Fields */
+export type ColorFieldProps = FieldProps<string | undefined>;
+
+/** @category Form Fields */
+export function ColorField(props: ColorFieldProps) {
+  const { disabled } = useContext(props);
+  const id = useHtmlFor();
+  const [value, error, onChange] = useTextInputField(props, 600);
+  return (
+    <Field
+      {...props}
+      htmlFor={id}
+      error={error}
+    >
+      <input
+        id={id}
+        type="color"
+        value={value || '#ffffff'}
+        className="dome-xForm-color-field"
+        disabled={disabled}
+        onChange={onChange}
+      />
+    </Field>
+  );
+}
+
+/* --------------------------------------------------------------------------*/
+/* --- Check Box Field                                                    ---*/
+/* --------------------------------------------------------------------------*/
+
+/** @category Form Fields */
+export interface CheckboxFieldProps extends FieldProps<boolean> {
+  /** Default is false */
+  inverted?: boolean;
+}
+
+/** @category Form Fields */
+export function CheckboxField(props: CheckboxFieldProps) {
+  const { hidden, disabled } = useContext(props);
+
+  if (hidden) return null;
+
+  const [value, , setState] = props.state;
+  const { label, title, inverted } = props;
+  const css = Utils.classes(
+    'dome-xForm-field dome-text-label',
+    disabled && 'dome-disabled',
+  );
+  const onChange = () => setState(!value, undefined);
+  return (
+    <Checkbox
+      className={css}
+      label={label}
+      title={title}
+      disabled={disabled}
+      value={inverted ? !value : value}
+      onChange={onChange}
+    />
+  );
+}
+
+/* --------------------------------------------------------------------------*/
+/* --- Radio Box Field                                                    ---*/
+/* --------------------------------------------------------------------------*/
+
+/** @category Form Fields */
+export interface RadioFieldProps<A> extends FieldProps<A> {
+  value: A;
+}
+
+/** @category Form Fields */
+export function RadioField<A>(props: RadioFieldProps<A>) {
+  const { hidden, disabled } = useContext(props);
+
+  if (hidden) return null;
+
+  const [selection, , setState] = props.state;
+  const onSelection = (value: A) => setState(value, undefined);
+  const { label, title, value } = props;
+  const css = Utils.classes(
+    'dome-xForm-field dome-text-label',
+    disabled && 'dome-disabled',
+  );
+
+  return (
+    <Radio
+      className={css}
+      label={label}
+      title={title}
+      value={value}
+      disabled={disabled}
+      selection={selection}
+      onSelection={onSelection}
+    />
+  );
+}
+
+/* --------------------------------------------------------------------------*/
+/* --- Select Menu Field                                                  ---*/
+/* --------------------------------------------------------------------------*/
+
+/** @category Form Fields */
+export interface SelectFieldProps extends FieldProps<string | undefined> {
+  placeholder?: string;
+  children?: React.ReactNode;
+}
+
+/**
+   Children must be standard `<option>` or `<optgroup>` elements.
+
+   @category Form Fields
+ */
+export function SelectField(props: SelectFieldProps) {
+  const { disabled } = useContext(props);
+  const id = useHtmlFor();
+  const [value, error, setState] = useChecker(props.state, props.checker);
+  const onChange = (newValue?: string) => setState(newValue, undefined);
+  const { children, placeholder } = props;
+  return (
+    <Field
+      {...props}
+      error={error}
+      htmlFor={id}
+    >
+      <SelectMenu
+        id={id}
+        value={value}
+        disabled={disabled}
+        placeholder={placeholder}
+        onChange={onChange}
+      >
+        {children}
+      </SelectMenu>
+    </Field>
+  );
+}
+
+// --------------------------------------------------------------------------
diff --git a/ivette/src/dome/src/renderer/layout/grids.js b/ivette/src/dome/renderer/layout/grids.js
similarity index 98%
rename from ivette/src/dome/src/renderer/layout/grids.js
rename to ivette/src/dome/renderer/layout/grids.js
index dd38a71915d290b50a82601b796ce8a9152e1938..5a7f8af8b452f79318f79e2daa2f897378d4dc6c 100644
--- a/ivette/src/dome/src/renderer/layout/grids.js
+++ b/ivette/src/dome/renderer/layout/grids.js
@@ -9,6 +9,8 @@
 
 import _ from 'lodash' ;
 import React from 'react' ;
+import * as Json from 'dome/data/json';
+import * as Settings from 'dome/data/settings';
 import { dispatchEvent, DnD, DragSource, DropTarget } from 'dome/dnd' ;
 import { AutoSizer } from 'react-virtualized' ;
 import { DraggableCore } from 'react-draggable' ;
@@ -1179,11 +1181,13 @@ export class GridLayout extends React.Component
   }
 
   componentDidMount() {
-    Dome.on('dome.defaults',this.onReloadSettings);
+    // DEPRECATED
+    Settings.onWindowSettings(this.onReloadSettings);
   }
 
   componentWillUnmont() {
-    Dome.off('dome.defaults',this.onReloadSettings);
+    // DEPRECATED
+    Settings.offWindowSettings(this.onReloadSettings);
   }
 
   computeTargetProposal(target) {
@@ -1226,7 +1230,7 @@ export class GridLayout extends React.Component
   onReloadSettings() {
     const { settings, onReshape } = this.props ;
     if (!settings) return;
-    const newShape = Dome.getWindowSetting( settings );
+    const newShape = Settings.getWindowSettings( settings, Json.jAny, undefined );
     this.setState({ shape: newShape });
     if (onReshape) onReshape( newShape );
   }
@@ -1234,7 +1238,7 @@ export class GridLayout extends React.Component
   onReshape(newShape) {
     const { settings, shape:setShape, onReshape } = this.props ;
     if (!setShape) this.setState({ shape: newShape });
-    if (settings) Dome.setWindowSetting( settings, newShape );
+    if (settings) Settings.setWindowSettings( settings, newShape );
     if (onReshape) onReshape( newShape );
   }
 
@@ -1299,7 +1303,8 @@ export class GridLayout extends React.Component
     const setShape = propShape === null ? {} : propShape ;
     const insert = inserted ? inserted.id : undefined ;
     const render = DRAGGABLEITEM(this.dnd,anchor,this.onSelfDrag,insert);
-    const shape = holdedShape || setShape || newShape || Dome.getWindowSetting(settings) ;
+    const shape = holdedShape || setShape || newShape ||
+          Settings.getWindowSettings(settings,Json.jAny,undefined) ;
     return (
       <DropTarget
         dnd={this.dnd}
diff --git a/ivette/src/dome/renderer/layout/splitters.tsx b/ivette/src/dome/renderer/layout/splitters.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..f2bbe883d849b02a7d5b8eb877fd0ed9c0fead4a
--- /dev/null
+++ b/ivette/src/dome/renderer/layout/splitters.tsx
@@ -0,0 +1,344 @@
+// --------------------------------------------------------------------------
+// --- Splitters
+// --------------------------------------------------------------------------
+
+/**
+    @packageDocumentation
+    @module dome/layout/splitters
+*/
+
+import * as React from 'react';
+import * as Dome from 'dome';
+import * as Utils from 'dome/misc/utils';
+import { DraggableCore, DraggableEventHandler } from 'react-draggable';
+import { AutoSizer, Size } from 'react-virtualized';
+
+// --------------------------------------------------------------------------
+// --- Splitter
+// --------------------------------------------------------------------------
+
+export interface SplitterBaseProps {
+  /** Window settings to store the splitter position. */
+  settings?: string;
+  /** Minimal margin from container edges (minimum `32`). */
+  margin?: number;
+  /** Splitter children components. */
+  children: [JSX.Element, JSX.Element];
+}
+
+export interface SplitterFoldProps extends SplitterBaseProps {
+  /**
+     Visibility of the foldable component.
+     Only applies to left, right, top and bottom layout.
+   */
+  unfold?: boolean;
+}
+
+export enum Direction {
+  /** Horizontal split. */
+  HORIZONTAL,
+  /** Vertical split. */
+  VERTICAL,
+  /** Stacked, foldable left component. */
+  LEFT,
+  /** Stacked, foldable right component. */
+  RIGHT,
+  /** Stacked, foldable top component. */
+  TOP,
+  /** Stacked, foldable bottom component. */
+  BOTTOM,
+}
+
+export interface SplitterDirProps extends SplitterFoldProps {
+  /** Direction of the splitter. */
+  direction: Direction;
+}
+
+/* --------------------------------------------------------------------------*/
+/* --- Splitter Layout                                                    ---*/
+/* --------------------------------------------------------------------------*/
+
+type Layout = {
+  hsplit: boolean;
+  foldA: boolean;
+  foldB: boolean;
+};
+
+const PANEL = 'dome-container';
+const DRAGGING = 'dome-color-dragging';
+const DRAGZONE = 'dome-color-dragzone';
+
+const CONTAINER = 'dome-xSplitter-container';
+const NOCURSOR = 'dome-xSplitter-no-cursor';
+const HCURSOR = 'dome-xSplitter-h-cursor';
+const VCURSOR = 'dome-xSplitter-v-cursor';
+
+const HIDDEN = 'dome-xSplitter-hidden';
+const HFLEX = 'dome-xSplitter-hflex';
+const VFLEX = 'dome-xSplitter-vflex';
+
+const BLOCK = 'dome-xSplitter-block';
+const HPANE = 'dome-xSplitter-hpane';
+const VPANE = 'dome-xSplitter-vpane';
+const HFOLD = 'dome-xSplitter-hfold';
+const VFOLD = 'dome-xSplitter-vfold';
+const HLINE = 'dome-xSplitter-hline';
+const VLINE = 'dome-xSplitter-vline';
+const HANDLE = '.dome-xSplitter-grab';
+const HGRAB = 'dome-xSplitter-grab dome-xSplitter-hgrab';
+const VGRAB = 'dome-xSplitter-grab dome-xSplitter-vgrab';
+const HPOSA = 'dome-xSplitter-hpos-A';
+const VPOSA = 'dome-xSplitter-vpos-A';
+const HPOSB = 'dome-xSplitter-hpos-B';
+const VPOSB = 'dome-xSplitter-vpos-B';
+const HPOSR = 'dome-xSplitter-hline dome-xSplitter-hpos-R';
+const VPOSR = 'dome-xSplitter-vline dome-xSplitter-vpos-R';
+
+type CSS = {
+  container: string;
+  sideA: string;
+  sideB: string;
+  split: string;
+};
+
+const getFlexCSS = (hsplit: boolean, fold: boolean) => (
+  hsplit ? (fold ? HFOLD : HPANE) : (fold ? VFOLD : VPANE)
+);
+
+const getCSS = (
+  unfold: boolean,
+  dragged: boolean,
+  { hsplit, foldA, foldB }: Layout,
+): CSS => {
+  // FOLDED
+  if (!unfold) return {
+    container: BLOCK,
+    sideA: foldA ? HIDDEN : BLOCK,
+    split: HIDDEN,
+    sideB: foldB ? HIDDEN : BLOCK,
+  };
+  // DRAGGED
+  if (dragged) return {
+    container: BLOCK,
+    sideA: hsplit ? HPOSA : VPOSA,
+    split: hsplit ? HPOSR : VPOSR,
+    sideB: hsplit ? HPOSB : VPOSB,
+  };
+  // FLEX
+  return {
+    container: hsplit ? HFLEX : VFLEX,
+    sideA: getFlexCSS(hsplit, foldA),
+    split: hsplit ? HLINE : VLINE,
+    sideB: getFlexCSS(hsplit, foldB),
+  };
+};
+
+/* --------------------------------------------------------------------------*/
+/* --- Sizing Utility Engine                                              ---*/
+/* --------------------------------------------------------------------------*/
+
+type Dragging = undefined | {
+  position: number;
+  anchor: number;
+  offset: number;
+};
+
+function getPositionFromSettings(
+  dragging: Dragging,
+  L: Layout,
+  S: number,
+  D: number,
+): number {
+  if (dragging) return dragging.position;
+  if (L.foldA) return S;
+  if (L.foldB) return D - S;
+  return D * S;
+}
+
+function getSettingsFromPosition(L: Layout, P: number, D: number): number {
+  if (L.foldA) return P;
+  if (L.foldB) return D - P;
+  return P / D;
+}
+
+const inRange = (M: number, D: number, P: number) => (
+  D < M ? D / 2 : Math.min(Math.max(P, M), D - M)
+);
+
+/* --------------------------------------------------------------------------*/
+/* --- Splitter Engine                                                    ---*/
+/* --------------------------------------------------------------------------*/
+
+interface SplitterLayoutProps extends SplitterFoldProps { layout: Layout }
+interface SplitterEngineProps extends SplitterLayoutProps { size: Size }
+
+function SplitterEngine(props: SplitterEngineProps) {
+  const [settings, setSettings] = Dome.useNumberSettings(props.settings, 0);
+  const [dragging, setDragging] = React.useState<Dragging>(undefined);
+  const { size, margin = 32, layout } = props;
+  const { hsplit } = layout;
+  const M = Math.max(margin, 32);
+  const D = hsplit ? size.width : size.height;
+  const { unfold = true } = props;
+  const [A, B] = props.children;
+  const dragged = settings > 0 || dragging !== undefined;
+  const css = getCSS(unfold, dragged, layout);
+  const cursor = dragging ? (hsplit ? HCURSOR : VCURSOR) : NOCURSOR;
+  const container = Utils.classes(css.container, cursor);
+  const sideA = Utils.classes(css.sideA, PANEL);
+  const sideB = Utils.classes(css.sideB, PANEL);
+  const dragger = Utils.classes(
+    hsplit ? HGRAB : VGRAB,
+    dragging ? DRAGGING : DRAGZONE,
+  );
+
+  let styleA: undefined | React.CSSProperties;
+  let styleB: undefined | React.CSSProperties;
+  let styleR: undefined | React.CSSProperties;
+
+  if (unfold && dragged) {
+    const P = getPositionFromSettings(dragging, layout, settings, D);
+    const X = dragging ? dragging.offset - dragging.anchor : 0;
+    const Q = inRange(M, D, P + X);
+    styleA = hsplit ? { width: Q } : { height: Q };
+    styleR = hsplit ? { left: Q } : { top: Q };
+    styleB = hsplit ? { left: Q + 1 } : { top: Q + 1 };
+  }
+
+  const onStart: DraggableEventHandler =
+    (_evt, data) => {
+      const startPos = hsplit ? data.node.offsetLeft : data.node.offsetTop;
+      const anchor = hsplit ? data.x : data.y;
+      setDragging({ position: startPos, offset: anchor, anchor });
+    };
+
+  const onDrag: DraggableEventHandler =
+    (_evt, data) => {
+      if (dragging) {
+        const offset = hsplit ? data.x : data.y;
+        setDragging({ ...dragging, offset });
+      }
+    };
+
+  const onStop: DraggableEventHandler =
+    (evt, _data) => {
+      if (evt.metaKey || evt.altKey || evt.ctrlKey) {
+        setSettings(0);
+      } else if (unfold && dragging) {
+        const offsetPos = dragging.position + dragging.offset - dragging.anchor;
+        const newPos = inRange(M, D, offsetPos);
+        setSettings(getSettingsFromPosition(layout, newPos, D));
+      }
+      setDragging(undefined);
+    };
+
+  return (
+    <div
+      key="container"
+      className={container}
+      style={props.size}
+    >
+      <div
+        key="sideA"
+        className={sideA}
+        style={styleA}
+      >
+        {A}
+      </div>
+      <DraggableCore
+        handle={HANDLE}
+        onStart={onStart}
+        onDrag={onDrag}
+        onStop={onStop}
+      >
+        <div
+          key="split"
+          className={css.split}
+          style={styleR}
+        >
+          <div className={dragger} />
+        </div>
+      </DraggableCore>
+      <div
+        key="sideB"
+        className={sideB}
+        style={styleB}
+      >
+        {B}
+      </div>
+    </div>
+  );
+}
+
+const SplitterLayout = (props: SplitterLayoutProps) => (
+  <div className={CONTAINER}>
+    <AutoSizer>
+      {(size: Size) => (
+        <SplitterEngine size={size} {...props} />
+      )}
+    </AutoSizer>
+  </div>
+);
+
+// --------------------------------------------------------------------------
+// --- Short Cuts
+// --------------------------------------------------------------------------
+
+const HLayout = { hsplit: true, foldA: false, foldB: false };
+const LLayout = { hsplit: true, foldA: true, foldB: false };
+const RLayout = { hsplit: true, foldA: false, foldB: true };
+const VLayout = { hsplit: false, foldA: false, foldB: false };
+const TLayout = { hsplit: false, foldA: true, foldB: false };
+const BLayout = { hsplit: false, foldA: false, foldB: true };
+
+const getLayout = (d: Direction): Layout => {
+  switch (d) {
+    case Direction.HORIZONTAL: return HLayout;
+    case Direction.LEFT: return LLayout;
+    case Direction.RIGHT: return RLayout;
+    case Direction.VERTICAL: return VLayout;
+    case Direction.TOP: return TLayout;
+    case Direction.BOTTOM: return BLayout;
+  }
+};
+
+/** Splitter with specified direction.
+   @category Base Component
+*/
+export function Splitter(props: SplitterDirProps) {
+  const { direction, ...others } = props;
+  const layout = getLayout(direction);
+  return <SplitterLayout layout={layout} {...others} />;
+}
+
+/** Horizontal Splitter. */
+export function HSplit(props: SplitterBaseProps) {
+  return <SplitterLayout layout={HLayout} {...props} />;
+}
+
+/** Vertical Splitter. */
+export function VSplit(props: SplitterBaseProps) {
+  return <SplitterLayout layout={VLayout} {...props} />;
+}
+
+/** Horizontal Splitter with stacked and foldable left element. */
+export function LSplit(props: SplitterFoldProps) {
+  return <SplitterLayout layout={LLayout} {...props} />;
+}
+
+/** Horizontal Splitter with stacked and foldable right element. */
+export function RSplit(props: SplitterFoldProps) {
+  return <SplitterLayout layout={RLayout} {...props} />;
+}
+
+/** Vertical Splitter with stacked and foldable top element. */
+export function TSplit(props: SplitterFoldProps) {
+  return <SplitterLayout layout={TLayout} {...props} />;
+}
+
+/** Vertical Splitter with stacked and foldable bottom element. */
+export function BSplit(props: SplitterFoldProps) {
+  return <SplitterLayout layout={BLayout} {...props} />;
+}
+
+// --------------------------------------------------------------------------
diff --git a/ivette/src/dome/src/renderer/layout/style.css b/ivette/src/dome/renderer/layout/style.css
similarity index 85%
rename from ivette/src/dome/src/renderer/layout/style.css
rename to ivette/src/dome/renderer/layout/style.css
index 62a94697c92b28e2039d1a86b0a73728bba0c507..cdfc2ac1e86d4863b281d1fbfc9f2b40ef9166e4 100644
--- a/ivette/src/dome/src/renderer/layout/style.css
+++ b/ivette/src/dome/renderer/layout/style.css
@@ -93,46 +93,110 @@
     height: 100% ;
 }
 
-.dome-xSplitPane {
-    position: relative ;
+.dome-xSplitter-no-cursor { }
+.dome-xSplitter-h-cursor  { cursor: col-resize ; }
+.dome-xSplitter-v-cursor  { cursor: row-resize ; }
+
+.dome-xSplitter-hidden {
+    display: none;
+}
+
+.dome-xSplitter-block {
+    display: block;
+    overflow: hidden;
+    position: relative;
+    width: 100%;
+    height: 100%;
+}
+
+.dome-xSplitter-hflex {
+    display: flex;
+    flex-flow: row nowrap;
+}
+
+.dome-xSplitter-vflex {
+    display: flex;
+    flex-flow: column nowrap;
+}
+
+.dome-xSplitter-hfold {
+    flex: none;
+    min-width: 32px;
+    height: 100%;
+    overflow: hidden;
+}
+
+.dome-xSplitter-vfold {
+    flex: none;
+    min-height: 32px;
+    width: 100%;
+    overflow: hidden;
+}
+
+.dome-xSplitter-hpane {
+    flex: auto;
+    width: auto;
+    height: 100%;
+    overflow: hidden;
+}
+
+.dome-xSplitter-vpane {
+    flex: auto;
+    width: 100%;
+    height: auto;
+    overflow: hidden;
+}
+
+.dome-xSplitter-hline {
+    width: 1px;
+    height: 100%;
+}
+
+.dome-xSplitter-vline {
+    width: 100%;
+    height: 1px;
 }
 
 .dome-xSplitter-grab {
-    z-index: 1 ;
     position: relative ;
-    border: 0 ;
+    z-index: 1 ;
+    border: 0px ;
 }
 
-.dome-xSplitter-h {
+.dome-xSplitter-hgrab {
     left: -1px ;
     width: 3px ;
     height: 100% ;
     cursor: col-resize ;
 }
 
-.dome-xSplitter-v {
+.dome-xSplitter-vgrab {
     top: -1px ;
     height: 3px ;
     width: 100% ;
     cursor: row-resize ;
 }
 
-.dome-xSplitter-no-cursor { }
-.dome-xSplitter-h-cursor  { cursor: col-resize ; }
-.dome-xSplitter-v-cursor  { cursor: row-resize ; }
+.dome-xSplitter-hpos-A { position: absolute; left: 0px; height: 100% }
+.dome-xSplitter-hpos-R { position: absolute; width: 1px; height: 100% }
+.dome-xSplitter-hpos-B { position: absolute; right: 0px; height: 100% }
 
-.dome-window-active .dome-xSplitLine {
+.dome-xSplitter-vpos-A { position: absolute; top: 0px; width: 100% }
+.dome-xSplitter-vpos-R { position: absolute; height: 1px; width: 100% }
+.dome-xSplitter-vpos-B { position: absolute; bottom: 0px; width: 100% }
+
+.dome-window-active .dome-xSplitter-hline,
+.dome-window-active .dome-xSplitter-vline
+{
     background: #afafaf ;
 }
 
-.dome-window-inactive .dome-xSplitLine {
+.dome-window-inactive .dome-xSplitter-hline,
+.dome-window-inactive .dome-xSplitter-vline
+{
     background: #d6d6d6 ;
 }
 
-.dome-xSplitPane, .dome-xSplitLine {
-    transition: all 0.1s ease-out ;
-}
-
 /* -------------------------------------------------------------------------- */
 /* --- GridLayout Styles                                                  --- */
 /* -------------------------------------------------------------------------- */
@@ -309,6 +373,7 @@
     visibility: hidden ;
     position: absolute ;
     top: 3px ;
+    width: max-content ;
     color: darkorange ;
     margin-left: 4px ;
     font-size: smaller ;
diff --git a/ivette/src/dome/src/renderer/style.css b/ivette/src/dome/renderer/style.css
similarity index 92%
rename from ivette/src/dome/src/renderer/style.css
rename to ivette/src/dome/renderer/style.css
index 99cb9265aaf25c94f992f721246303c6797b0af6..258fc4e47c1825f058b4c28c876ba0265e93542f 100644
--- a/ivette/src/dome/src/renderer/style.css
+++ b/ivette/src/dome/renderer/style.css
@@ -31,6 +31,14 @@ body {
 /* --- Frame Colors                                                       --- */
 /* -------------------------------------------------------------------------- */
 
+.dome-phantom {
+    display: none;
+}
+
+.dome-hidden {
+    visibility: hidden;
+}
+
 .dome-window-active .dome-color-frame {
     fill:         #606060 ;
     color:        #606060 ;
@@ -128,4 +136,13 @@ div.dome-dragged {
     text-overflow: clip ;
 }
 
+.dome-text-cell {
+    cursor: default ;
+    user-select: text ;
+    font-family: 'Andale mono', monospace ;
+    font-size: 9pt ;
+    white-space: nowrap ;
+    text-overflow: clip ;
+}
+
 /* -------------------------------------------------------------------------- */
diff --git a/ivette/src/dome/src/renderer/table/arrays.ts b/ivette/src/dome/renderer/table/arrays.ts
similarity index 99%
rename from ivette/src/dome/src/renderer/table/arrays.ts
rename to ivette/src/dome/renderer/table/arrays.ts
index 5abe5992daa086172bd98a05b63c30ec72c72908..9ab710b5b95dec1e4d11b40e5146a7afbf8b96a4 100644
--- a/ivette/src/dome/src/renderer/table/arrays.ts
+++ b/ivette/src/dome/renderer/table/arrays.ts
@@ -109,7 +109,6 @@ export class ArrayModel<Key, Row>
   }
 
   // Lazily compute table ; modifies packed entries in place
-  /* eslint-disable no-param-reassign */
   protected rebuild(): PACK<Key, Row>[] {
     const current = this.table;
     let filtered = 0;
@@ -133,7 +132,6 @@ export class ArrayModel<Key, Row>
     this.filtered = filtered;
     return table;
   }
-  /* eslint-enable no-param-reassign */
 
   // --------------------------------------------------------------------------
   // --- Proxy
diff --git a/ivette/src/dome/src/renderer/table/models.ts b/ivette/src/dome/renderer/table/models.ts
similarity index 100%
rename from ivette/src/dome/src/renderer/table/models.ts
rename to ivette/src/dome/renderer/table/models.ts
diff --git a/ivette/src/dome/src/renderer/table/style.css b/ivette/src/dome/renderer/table/style.css
similarity index 100%
rename from ivette/src/dome/src/renderer/table/style.css
rename to ivette/src/dome/renderer/table/style.css
diff --git a/ivette/src/dome/src/renderer/table/views.tsx b/ivette/src/dome/renderer/table/views.tsx
similarity index 96%
rename from ivette/src/dome/src/renderer/table/views.tsx
rename to ivette/src/dome/renderer/table/views.tsx
index 671cc8f8438cd53b47aa12fd09bec96521b246ec..6e33d160a886d8107a8300005d9d7693c93de57b 100644
--- a/ivette/src/dome/src/renderer/table/views.tsx
+++ b/ivette/src/dome/renderer/table/views.tsx
@@ -11,6 +11,8 @@ import React, { ReactNode } from 'react';
 import { forEach, debounce, throttle } from 'lodash';
 import isEqual from 'react-fast-compare';
 import * as Dome from 'dome';
+import * as Json from 'dome/data/json';
+import * as Settings from 'dome/data/settings';
 import { DraggableCore } from 'react-draggable';
 import {
   AutoSizer, Size,
@@ -153,7 +155,7 @@ export interface TableProps<Key, Row> {
   /** Fallback for rendering an empty table. */
   renderEmpty?: () => null | JSX.Element;
   /** Shall only contains `<Column<Row> … />` elements. */
-  children?: any;
+  children?: React.ReactElement | React.ReactElement[];
 }
 
 // --------------------------------------------------------------------------
@@ -265,13 +267,16 @@ function makeDataRenderer(
 // --- Table Settings
 // --------------------------------------------------------------------------
 
-type ColSettings<A> = { [id: string]: undefined | null | A };
-
 type TableSettings = {
-  resize?: ColSettings<number>;
-  visible?: ColSettings<boolean>;
+  resize?: Json.dict<number>;
+  visible?: Json.dict<boolean>;
 };
 
+const jTableSettings = Json.jObject({
+  resize: Json.jDict(Json.jNumber),
+  visible: Json.jDict(Json.jBoolean),
+});
+
 // --------------------------------------------------------------------------
 // --- Table State
 // --------------------------------------------------------------------------
@@ -316,7 +321,6 @@ class TableState<Key, Row> {
     this.onRowRightClick = this.onRowRightClick.bind(this);
     this.onKeyDown = this.onKeyDown.bind(this);
     this.onSorting = this.onSorting.bind(this);
-    this.clearSettings = this.clearSettings.bind(this);
     this.rebuild = debounce(this.rebuild.bind(this), 5);
     this.rowGetter = makeRowGetter();
   }
@@ -394,27 +398,21 @@ class TableState<Key, Row> {
 
   // --- Table settings
 
-  clearSettings() {
-    this.resize.clear();
-    this.visible.clear();
-    this.forceUpdate();
-  }
-
   updateSettings() {
     const userSettings = this.settings;
     if (userSettings) {
-      const cws: ColSettings<number> = {};
-      const cvs: ColSettings<boolean> = {};
+      const cws: Json.dict<number> = {};
+      const cvs: Json.dict<boolean> = {};
       const { resize } = this;
       const { visible } = this;
       this.columns.forEach(({ id }) => {
         const cw = resize.get(id);
         const cv = visible.get(id);
-        cws[id] = cw === undefined ? null : cw;
-        cvs[id] = cv === undefined ? null : cv;
+        if (cw) cws[id] = cw;
+        if (cv) cvs[id] = cv;
       });
       const theSettings: TableSettings = { resize: cws, visible: cvs };
-      Dome.setWindowSetting(userSettings, theSettings);
+      Settings.setWindowSettings(userSettings, theSettings);
     }
     this.forceUpdate();
   }
@@ -427,7 +425,7 @@ class TableState<Key, Row> {
       resize.clear();
       visible.clear();
       const theSettings: undefined | TableSettings =
-        Dome.getWindowSetting(settings);
+        Settings.getWindowSettings(settings, jTableSettings, undefined);
       if (theSettings) {
         forEach(theSettings.resize, (cw, cid) => {
           if (typeof cw === 'number') this.resize.set(cid, cw);
@@ -707,7 +705,7 @@ export function Column<Row, Cell>(props: ColumnProps<Row, Cell>) {
 function spawnIndex(
   state: TableState<any, any>,
   path: number[],
-  children: any,
+  children: React.ReactElement | React.ReactElement[],
 ) {
   const indexChild = (elt: React.ReactElement, k: number) => (
     <ColumnContext.Provider value={{ state, path, index: k }}>
@@ -717,6 +715,11 @@ function spawnIndex(
   return <>{React.Children.map(children, indexChild)}</>;
 }
 
+export interface ColumnGroupProps {
+  index?: index;
+  children?: React.ReactElement | React.ReactElement[];
+}
+
 /** Column Groups.
 
    You should use this component in replacement of React fragments rendering
@@ -760,12 +763,13 @@ function spawnIndex(
    this implicit root column group, just pack your columns inside a classical
    React fragment: `<Table … ><>{children}</></Table>`.
  */
-export function ColumnGroup(props: { index?: index; children: any }) {
+export function ColumnGroup(props: ColumnGroupProps) {
   const context = React.useContext(ColumnContext);
   if (!context) return null;
   const { state, path, index: defaultIndex } = context;
   const newPath = path.concat(props.index ?? defaultIndex);
-  return spawnIndex(state, newPath, props.children);
+  const { children } = props;
+  return children ? spawnIndex(state, newPath, children) : null;
 }
 
 // --------------------------------------------------------------------------
@@ -1018,13 +1022,11 @@ function makeTable<Key, Row>(
   const columns = makeColumns(state, cprops);
   const resizers = makeResizers(state, cprops);
 
-  /* eslint-disable no-param-reassign */
   state.rowCount = rowCount;
   if (state.width !== width) {
     state.width = width;
     setImmediate(state.forceUpdate);
   }
-  /* eslint-enable no-param-reassign */
 
   return (
     <div onKeyDown={state.onKeyDown}>
@@ -1106,11 +1108,12 @@ export function Table<Key, Row>(props: TableProps<Key, Row>) {
     state.onContextMenu = props.onContextMenu;
     return state.unwind;
   });
-  Dome.useEvent('dome.defaults', state.clearSettings);
+  Settings.useGlobalSettingsEvent(state.importSettings);
+  const columns = props.children ?? [];
   return (
     <div className="dome-xTable">
       <React.Fragment key="columns">
-        {spawnIndex(state, [], props.children)}
+        {spawnIndex(state, [], columns)}
       </React.Fragment>
       <AutoSizer key="table">
         {(size: Size) => makeTable(props, state, size)}
diff --git a/ivette/src/dome/src/renderer/text/buffers.ts b/ivette/src/dome/renderer/text/buffers.ts
similarity index 100%
rename from ivette/src/dome/src/renderer/text/buffers.ts
rename to ivette/src/dome/renderer/text/buffers.ts
diff --git a/ivette/src/dome/src/renderer/text/editors.tsx b/ivette/src/dome/renderer/text/editors.tsx
similarity index 98%
rename from ivette/src/dome/src/renderer/text/editors.tsx
rename to ivette/src/dome/renderer/text/editors.tsx
index 0a5d45ec867f57d868dc7e2f85df920f2a71ce25..17fc74f263eb3c955d32ba2f30ff9904cd7665aa 100644
--- a/ivette/src/dome/src/renderer/text/editors.tsx
+++ b/ivette/src/dome/renderer/text/editors.tsx
@@ -25,7 +25,7 @@ const CSS_SELECTED = 'dome-xText-select';
 /* --------------------------------------------------------------------------*/
 
 export interface MarkerCallback {
-  (id: string): void;
+  (id: string, meta?: boolean): void;
 }
 
 /**
@@ -146,7 +146,7 @@ class CodeMirrorWrapper extends React.Component<TextProps> {
       // Binding events to view
       this.codeMirror.on('update', this.handleUpdate);
       this.codeMirror.on('keyHandled', this.handleKey);
-      Dome.on('dome.update', this.refresh);
+      Dome.update.on(this.refresh);
       // Auto refresh
       this.refreshPolling = setInterval(this.autoRefresh, 250);
       this.handleUpdate();
@@ -156,7 +156,7 @@ class CodeMirrorWrapper extends React.Component<TextProps> {
         clearInterval(this.refreshPolling);
         this.refreshPolling = undefined;
       }
-      Dome.off('dome.update', this.refresh);
+      Dome.update.off(this.refresh);
       const { buffer } = this.props;
       if (this.codeMirror && buffer) {
         buffer.unlink(this.codeMirror);
@@ -329,10 +329,12 @@ class CodeMirrorWrapper extends React.Component<TextProps> {
 
   onMouseClick(evt: MouseEvt, callback: MarkerCallback | undefined) {
     // No need for throttling
-    const { target } = evt;
-    if (target instanceof Element && callback) {
-      const marker = this._findMarker(target);
-      if (marker && marker.id) callback(marker.id);
+    if (callback) {
+      const { target } = evt;
+      if (target instanceof Element) {
+        const marker = this._findMarker(target);
+        if (marker && marker.id) callback(marker.id, evt.altKey);
+      }
     }
     this.props.buffer?.setFocused(true);
   }
diff --git a/ivette/src/dome/src/renderer/text/pages.js b/ivette/src/dome/renderer/text/pages.tsx
similarity index 61%
rename from ivette/src/dome/src/renderer/text/pages.js
rename to ivette/src/dome/renderer/text/pages.tsx
index 9714adbb0a05617fa81bef98bd8f8117b88eefa8..4e0cd9992d19d558c7bc0132494b559c34d8415e 100644
--- a/ivette/src/dome/src/renderer/text/pages.js
+++ b/ivette/src/dome/renderer/text/pages.tsx
@@ -3,10 +3,6 @@
 // --------------------------------------------------------------------------
 
 /**
-   @packageDocumentation
-   @module dome/text/pages
-   @description
-
    A collection of text area and elements do render textual content.
 
    Inside such areas, all elements are styled like a classical web page.
@@ -16,58 +12,66 @@
    All the textual parts are selectable inside the page, contrarily to
    most other widget components.
 
-   The behaviour of `<a href=...>` elements differs for local links and external URLs.
-   Local links trigger a `'dome.href'` event, that
-   you can listen to from the originating renderer process, _eg. by using `Dome.useUpdate()`
-   custom hook.
+   The behaviour of `<a href=...>` elements differs for local links and
+   external URLs. Local links trigger a `'dome.href'` event, that
+   you can listen to from the originating renderer process, _eg. by
+   using `Dome.useUpdate()` custom hook.
 
    External links launch the user's default browser.
-*/
 
-import React from 'react' ;
+   @packageDocumentation
+   @module dome/text/pages
+ */
+
+import React from 'react';
+import { classes } from 'dome/misc/utils';
+import './style.css';
 
-import './style.css' ;
+export interface TextProps {
+  /** Additional classe(s). */
+  className?: string;
+  /** Additional style properties. */
+  style?: React.CSSProperties;
+  /** Inner Components. */
+  children?: React.ReactNode;
+}
 
 // --------------------------------------------------------------------------
 // --- Page
 // --------------------------------------------------------------------------
 
 /**
-   @summary Blank HTML page.
-   @property {object} [style] - additional style elements
-   @property {Elements} [children] - page content
-   @description
+   Blank HTML page.
 
    The page has insets and shadows and fills the entire available area.
    Large content is crolled inside in both directions.
-*/
-
-export const Page = ({style,children}) => {
-  return (
-    <div className='dome-xPages-page'>
-      <div className='dome-xPages-sheet dome-pages'>
-        {children}
-      </div>
+ */
+export const Page = (props: TextProps) => (
+  <div className="dome-xPages-page">
+    <div
+      className={classes('dome-xPages-sheet dome-pages', props.className)}
+      style={props.style}
+    >
+      {props.children}
     </div>
-  );
-};
+  </div>
+);
 
 // --------------------------------------------------------------------------
-// --- Page
+// --- Note
 // --------------------------------------------------------------------------
 
 /**
-   @summary Blank HTML textarea.
-   @property {object} [style] - additional style elements
-   @property {Elements} [children] - page content
-   @description
+   Blank HTML textarea.
 
    The area has small padding and no margin, and does not scroll its content.
-*/
-
-export const Note = ({style,children}) => (
-  <div className=' dome-xPages-note dome-pages' style={style}>
-    {children}
+ */
+export const Note = (props: TextProps) => (
+  <div
+    className={classes('dome-xPages-note', 'dome-pages', props.className)}
+    style={props.style}
+  >
+    {props.children}
   </div>
 );
 
diff --git a/ivette/src/dome/src/renderer/text/style.css b/ivette/src/dome/renderer/text/style.css
similarity index 100%
rename from ivette/src/dome/src/renderer/text/style.css
rename to ivette/src/dome/renderer/text/style.css
diff --git a/ivette/src/dome/src/main/dome.js b/ivette/src/dome/src/main/dome.js
deleted file mode 100644
index e6291c5e4f94505092119aea4872d1cd07500c02..0000000000000000000000000000000000000000
--- a/ivette/src/dome/src/main/dome.js
+++ /dev/null
@@ -1,569 +0,0 @@
-/**
-   @packageDocumentation
-   @module dome(main)
-   @description
-
-   ## Dome Application (Main Process)
-
-   This module manages the electron main-process of the application.
-   Your application will launch on `Dome.start()`:
-
-   @example
-   // src/main/index.js:
-   import * as Dome from 'dome' ;
-   Dome.start();
-*/
-
-import _ from 'lodash' ;
-import fs from 'fs' ;
-import path from 'path' ;
-import { app, ipcMain, BrowserWindow } from 'electron' ;
-import installExtension , { REACT_DEVELOPER_TOOLS } from 'dome/devtools' ;
-import * as Menubar from './menubar.js' ;
-import SYS, * as System from 'dome/system' ;
-
-// --------------------------------------------------------------------------
-// --- System Helpers
-// --------------------------------------------------------------------------
-
-function fstat(path) {
-  try {
-    return fs.statSync(path);
-  } catch(_error) {
-    return undefined;
-  }
-}
-
-// --------------------------------------------------------------------------
-// --- Helpers
-// --------------------------------------------------------------------------
-
-const LOCAL = process.env.DOME_LOCAL ;
-
-/** Development mode flag */
-export const DEVEL = System.DEVEL ;
-
-/** System platform */
-export const platform = System.platform ;
-
-// --------------------------------------------------------------------------
-// --- Settings
-// --------------------------------------------------------------------------
-
-function loadSettings( file ) {
-  try {
-    if (!fstat(file))
-      return {};
-    const text = fs.readFileSync(file, { encoding: 'utf8' } );
-    return Object.assign({}, JSON.parse(text));
-  } catch(err) {
-    console.error("[Dome] Unable to load settings", file, err);
-    return {};
-  }
-}
-
-function saveSettings( file, data={} ) {
-  try {
-    const text = JSON.stringify( data, undefined, DEVEL ? 2 : 0 );
-    fs.writeFileSync( file, text, { encoding: 'utf8' }, (err) => { throw(err); } );
-  } catch(err) {
-    console.error("[Dome] Unable to save settings", file, err);
-  }
-}
-
-// --------------------------------------------------------------------------
-// --- Global Settings
-// --------------------------------------------------------------------------
-
-var GlobalSettings; // Current Dictionnary
-
-const APP_DIR = app.getPath('userData');
-const PATH_WINDOW_SETTINGS = path.join( APP_DIR, 'WindowSettings.json' );
-const PATH_GLOBAL_SETTINGS = path.join( APP_DIR, 'GlobalSettings.json' );
-
-function saveGlobalSettings() {
-  try {
-    if (!fstat( APP_DIR )) fs.mkdirSync( APP_DIR );
-    saveSettings( PATH_GLOBAL_SETTINGS, GlobalSettings );
-  } catch(err) {
-    console.error("[Dome] Unable to save global settings", err);
-  }
-}
-
-function obtainGlobalSettings() {
-  if (!GlobalSettings) {
-    GlobalSettings = loadSettings( PATH_GLOBAL_SETTINGS );
-  }
-  return GlobalSettings;
-}
-
-// --------------------------------------------------------------------------
-// --- Window Settings & Frames
-// --------------------------------------------------------------------------
-
-/* Window Handle:
-   {
-     window: BrowserWindow ; // Also prevents Gc
-     config: path;           // Path to config file
-     frame: { x,y,w,h };     // Frame position
-     settings: object;       // Current settings
-     reload: boolean;        // Reloaded window
-   }
- */
-
-const WindowHandles = {}; // Indexed by *webContents* id
-
-function saveWindowConfig(handle) {
-  const settings = {
-    frame: handle.frame,
-    settings: handle.settings,
-    devtools: handle.devtools
-  };
-  saveSettings( handle.config, settings );
-}
-
-function windowSyncSettings(event) {
-  const handle = WindowHandles[event.sender.id];
-  event.returnValue = {
-    globals: obtainGlobalSettings(),
-    settings: handle && handle.settings
-  };
-}
-
-ipcMain.on('dome.ipc.settings.sync', windowSyncSettings );
-
-// --------------------------------------------------------------------------
-// --- Patching Settings
-// --------------------------------------------------------------------------
-
-function applyPatches( data, args ) {
-  args.forEach(({ key, value }) => {
-    if (value === null) {
-      delete data[key];
-    } else {
-      data[key] = value;
-    }
-  });
-}
-
-function applyWindowSettings(event,args) {
-  const handle = WindowHandles[event.sender.id];
-  if (handle) {
-    applyPatches( handle.settings, args );
-    if (DEVEL) saveWindowConfig( handle );
-  }
-}
-
-function applyGlobalSettings(event,args) {
-  applyPatches( obtainGlobalSettings(), args );
-  BrowserWindow.getAllWindows().forEach((w) => {
-    if (w.webContents.id !== event.sender.id) {
-      w.send('dome.ipc.settings.update',args);
-    }
-  });
-  if (DEVEL) saveGlobalSettings();
-}
-
-ipcMain.on('dome.ipc.settings.window', applyWindowSettings );
-ipcMain.on('dome.ipc.settings.global', applyGlobalSettings );
-
-// --------------------------------------------------------------------------
-// --- Renderer-Process Communication
-// --------------------------------------------------------------------------
-
-function broadcast( event, ...args )
-{
-  BrowserWindow.getAllWindows().forEach((w) => {
-    w.send( event, ...args );
-  });
-}
-
-// --------------------------------------------------------------------------
-// --- Window Activities
-// --------------------------------------------------------------------------
-
-var appName = 'Dome' ;
-const MODIFIED = '(*) ' ;
-
-/**
-   Sets application window name
-   @param {string} title - application name
- */
-export function setName(title) {
-  appName = title;
-}
-
-function setTitle(event,title) {
-  let handle = WindowHandles[event.sender.id];
-  handle && handle.setTitle( title || appName );
-}
-
-function setModified(event,modified) {
-  let handle = WindowHandles[event.sender.id];
-  if (handle) {
-    const w = handle.window;
-    if (platform == 'macos')
-      w.setDocumentEdited( modified );
-    else {
-      let title = w.getTitle();
-      if (title.startsWith(MODIFIED))
-        title = title.substring(MODIFIED.length);
-      if (modified)
-        title = MODIFIED + title ;
-      w.setTitle(title);
-    }
-  }
-}
-
-ipcMain.on('dome.ipc.window.title',setTitle);
-ipcMain.on('dome.ipc.window.modified',setModified);
-
-// --------------------------------------------------------------------------
-// --- Main Window Web Navigation
-// --------------------------------------------------------------------------
-
-import { shell } from 'electron' ;
-import { URL } from 'url' ;
-
-function getURL()
-{
-  if (DEVEL)
-    return `http://localhost:${process.env.ELECTRON_WEBPACK_WDS_PORT}` ;
-  if (LOCAL)
-    return 'file://' + path.join(__dirname,'../renderer/index.html') ;
-  return 'file://' + __dirname + '/index.html' ;
-}
-
-function navigateURL( event , url ) {
-  event.preventDefault();
-  const href = new URL( url );
-  const main = new URL( getURL() );
-  if (href.origin == main.origin)
-  {
-    const query = href.pathname.substring(1) + href.query + href.hash ;
-    event.sender.send('dome.ipc.href', query);
-  } else {
-    shell.openExternal( url );
-  }
-}
-
-// --------------------------------------------------------------------------
-// --- Lookup for config file
-// --------------------------------------------------------------------------
-
-function lookupConfig(wdir) {
-  let cwd = wdir = path.resolve(wdir);
-  let cfg = '.' + appName.toLowerCase();
-  for(;;) {
-    const here = path.join(cwd,cfg);
-    if (fstat(here)) return here;
-    let up = path.dirname(cwd);
-    if (up === cwd) break;
-    cwd = up;
-  }
-  const home = path.resolve(app.getPath('home'));
-  const user = wdir.startsWith(home) ? wdir : home ;
-  return path.join( user, cfg );
-}
-
-// --------------------------------------------------------------------------
-// --- Browser Window SetUp
-// --------------------------------------------------------------------------
-
-function createBrowserWindow( config, argv, wdir )
-{
-
-  const isAppWindow = (argv !== undefined && wdir !== undefined);
-
-  const browserArguments = isAppWindow
-        ? SYS.WINDOW_APPLICATION_ARGV
-        : SYS.WINDOW_PREFERENCES_ARGV ;
-
-  const options = Object.assign(
-    {
-      show: false,
-      backgroundColor: '#f0f0f0',
-      webPreferences: {
-        nodeIntegration:true,
-        additionalArguments: [ browserArguments ]
-      }
-    },
-    config
-  );
-
-  const configFile = isAppWindow ? lookupConfig( wdir ) : PATH_WINDOW_SETTINGS ;
-  const configData = loadSettings( configFile );
-
-  const { frame, devtools, settings={} } = configData;
-  if (frame) {
-    const getInt = (v) => v && _.toSafeInteger(v);
-    options.x = getInt(frame.x);
-    options.y = getInt(frame.y);
-    options.width = getInt(frame.width);
-    options.height = getInt(frame.height);
-  }
-
-  const theWindow = new BrowserWindow( options );
-  const wid = theWindow.webContents.id;
-
-  const handle = {
-    window: theWindow,
-    config: configFile,
-    frame, settings, devtools,
-    reload: false
-  };
-
-  // Keep the window reference (prevent garbage collection)
-  WindowHandles[wid] = handle;
-
-  // Emitted when the window is closed.
-  theWindow.on('closed', () => {
-    saveWindowConfig(handle);
-    // Dereference the window object (allow garbage collection)
-    delete WindowHandles[wid] ;
-  });
-
-  // Load the index.html of the app.
-  if (DEVEL || LOCAL)
-    process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = 'true';
-
-  theWindow.loadURL(getURL());
-
-  // Load Finished
-  theWindow.once('ready-to-show' , () => {
-    if (DEVEL || LOCAL)
-      process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = 'false';
-    if (DEVEL && devtools)
-      theWindow.openDevTools();
-    theWindow.show();
-  });
-
-  // Focus Management
-  theWindow.on('focus', () => theWindow.send('dome.ipc.focus',true));
-  theWindow.on('blur',  () => theWindow.send('dome.ipc.focus',false));
-
-  // URL Navigation
-  theWindow.webContents.on('will-navigate', navigateURL );
-  theWindow.webContents.on('did-navigate-in-page', navigateURL );
-
-  // Application Startup
-  theWindow.webContents.on('did-finish-load', () => {
-    if (!handle.reload) {
-      handle.reload = true;
-    } else {
-      broadcast('dome.ipc.reload');
-    }
-    theWindow.send('dome.ipc.command',argv,wdir);
-  });
-
-  // Emitted when the window want's to close.
-  theWindow.on('close', (evt) => {
-    handle.frame = theWindow.getBounds();
-    handle.devtools = theWindow.isDevToolsOpened();
-    theWindow.send('dome.ipc.closing');
-  });
-
-  // Keep track of frame positions (in DEVEL)
-  if (DEVEL) {
-    const saveFrame = _.debounce( (evt) => {
-      handle.frame = theWindow.getBounds();
-      handle.devtools = theWindow.isDevToolsOpened();
-      saveWindowConfig(handle);
-    } , 300);
-    theWindow.on('resize',saveFrame);
-    theWindow.on('moved',saveFrame);
-  }
-
-  return theWindow ;
-}
-
-// --------------------------------------------------------------------------
-// --- Application Window(s) & Command Line
-// --------------------------------------------------------------------------
-
-function stripElectronArgv( argv ) {
-  return argv.slice( DEVEL ? 3 : (LOCAL ? 2 : 1) ).filter((p) => !!p);
-}
-
-function createPrimaryWindow()
-{
-  // Initialize Menubar
-  Menubar.install();
-
-  // React Developper Tools
-  if (DEVEL)
-    installExtension(REACT_DEVELOPER_TOOLS,true)
-    .catch((err) => {
-      console.error('[Dome] Enable to install React dev-tools',err);
-    });
-  const cwd = process.cwd();
-  const wdir = cwd === '/' ? app.getPath('home') : cwd ;
-  const argv = stripElectronArgv(process.argv);
-  createBrowserWindow({ title: appName } , argv, wdir );
-}
-
-var appCount = 1;
-
-function createSecondaryWindow(_event,process_argv,wdir)
-{
-  const argv = stripElectronArgv(process_argv);
-  createBrowserWindow({ title: `${appName} #${++appCount}` }, argv, wdir);
-}
-
-function createDesktopWindow()
-{
-  const instance = appCount++ ;
-  const wdir = app.getPath('home');
-  createBrowserWindow({ title: `${appName} #${++appCount}` }, [], wdir);
-}
-
-// --------------------------------------------------------------------------
-// --- Activate Windows (macOS)
-// --------------------------------------------------------------------------
-
-function activateWindows() {
-  var isFocused = false ;
-  var toFocus = undefined ;
-  BrowserWindow.getAllWindows().forEach((w) => {
-    w.show();
-    if (w.isFocused()) isFocused = true ;
-    else if (!toFocus) toFocus = w;
-  });
-  if (!isFocused) {
-    if (toFocus) toFocus.focus();
-    else {
-      // No focusable nor focused window
-      createDesktopWindow();
-    }
-  }
-}
-
-// --------------------------------------------------------------------------
-// --- Settings Window
-// --------------------------------------------------------------------------
-
-var PreferenceWindow = undefined ; // Preference Window
-
-function showSettingsWindow()
-{
-  if (!PreferenceWindow)
-    PreferenceWindow = createBrowserWindow({
-      title: appName + ' Settings',
-      width: 256,
-      height: 248,
-      fullscreen: false,
-      maximizable: false,
-      minimizable: false
-    });
-  PreferenceWindow.show();
-  PreferenceWindow.on('closed',() => PreferenceWindow = undefined);
-}
-
-function restoreDefaultSettings()
-{
-  GlobalSettings = {};
-  if (DEVEL) saveGlobalSettings();
-
-  _.forEach( WindowHandles, (handle) => {
-    // Keep frame for user comfort
-    handle.settings = {};
-    handle.devtools = handle.window.isDevToolsOpened();
-    if (DEVEL) saveWindowConfig(handle);
-  });
-
-  broadcast( 'dome.ipc.settings.defaults' );
-}
-
-// --------------------------------------------------------------------------
-// --- Main Application Starter
-// --------------------------------------------------------------------------
-
-/** Starts the main process. */
-export function start() {
-
-  // Ensures second instance triggers the main one
-  if (!app.requestSingleInstanceLock()) app.quit();
-
-  // Change default locale
-  app.commandLine.appendSwitch('lang','en');
-
-  // Listen to application events
-  app.on( 'ready', createPrimaryWindow ); // Wait for Electron init
-  app.on( 'activate', activateWindows ); // Mac OSX response to dock
-  app.on( 'second-instance', createSecondaryWindow );
-  app.on( 'dome.menu.settings', showSettingsWindow );
-  app.on( 'dome.menu.defaults', restoreDefaultSettings );
-
-  // At-exit callbacks
-  app.on( 'will-quit' , () => {
-    saveGlobalSettings();
-    System.doExit() ;
-  });
-
-  // On macOS the menu bar stays active until the user explicitly quits.
-  // On other systems, automatically quit when all windows are closed.
-  // Warning: when no event handler is registered, the app automatically
-  // quit when all windows are closed.
-  app.on( 'window-all-closed', () => {
-    if (System.platform !== 'macos') app.quit();
-  });
-
-}
-
-// --------------------------------------------------------------------------
-// --- MenuBar Management
-// --------------------------------------------------------------------------
-
-const MENU_CLICK = (id,callback) => (_item,win,_event) => {
-  callback && callback();
-  app.emit('dome.menu.clicked', id );
-  win.send('dome.ipc.menu.clicked', id );
-};
-
-/**
-    @summary Define a custom main window menu.
-    @description
-    Cf. [addMenu](dome_.html#.addMenu) in the renderer process.
-*/
-export function addMenu( label ) { Menubar.addMenu( label ); }
-
-/**
-   @summary Define a custom menu item.
-   @description
-   Cf. [addMenuItem](dome_.html#.addMenuItem) in the renderer process.
-*/
-export function addMenuItem( spec )
-{
-  if ( spec.type === 'separator' ) {
-    Menubar.addMenuItem( spec );
-  } else {
-    const id = spec.id ;
-    if (!id) {
-      console.error('[Dome] Missing menu-item identifier:',spec);
-      return;
-    }
-    const { callback , ...options } = spec ;
-    options.click = MENU_CLICK( id, callback );
-    Menubar.addMenuItem( options );
-  }
-}
-
-/**
-   @summary Update a menu item.
-   @description
-   Cf. [setMenuItem](dome_.html#.setMenuItem) in the renderer process.
-*/
-export function setMenuItem( options ) {
-  const { callback , ...updates } = options ;
-  if (callback !== undefined) {
-    const id = updates.id ;
-    updates.click = MENU_CLICK( id, callback );
-  }
-  Menubar.setMenuItem( updates );
-}
-
-ipcMain.on( 'dome.ipc.menu.addmenu' , addMenu );
-ipcMain.on( 'dome.ipc.menu.addmenuitem' , addMenuItem );
-ipcMain.on( 'dome.ipc.menu.setmenuitem' , setMenuItem );
-
-// --------------------------------------------------------------------------
diff --git a/ivette/src/dome/src/main/menubar.js b/ivette/src/dome/src/main/menubar.js
deleted file mode 100644
index 061b1b6a1cf4f4c153dc620bcd4fbcbb653c5664..0000000000000000000000000000000000000000
--- a/ivette/src/dome/src/main/menubar.js
+++ /dev/null
@@ -1,402 +0,0 @@
-// --------------------------------------------------------------------------
-// --- Menus & MenuBar Management
-// --------------------------------------------------------------------------
-
-import { app, BrowserWindow, Menu, MenuItem, shell } from 'electron' ;
-import * as System from 'dome/system' ;
-
-// --------------------------------------------------------------------------
-// --- Special Callbacks
-// --------------------------------------------------------------------------
-
-function reloadWindow(item)
-{
-  reset(); // declared below
-  BrowserWindow.getAllWindows().forEach((win) => {
-    if (win) {
-      try {
-        win.send('dome.ipc.closing');
-        win.reload();
-      } catch(err) {
-        console.warn('[Reload]',win.id,err);
-      }
-    };
-  });
-}
-
-function toggleFullScreen(item, focusedWindow)
-{
-  if (focusedWindow)
-    focusedWindow.setFullScreen(!focusedWindow.isFullScreen());
-}
-
-function toggleDevTools(item, focusedWindow)
-{
-  if (focusedWindow)
-    focusedWindow.toggleDevTools();
-}
-
-// --------------------------------------------------------------------------
-// --- Menu Utilities
-// --------------------------------------------------------------------------
-
-const separator = { type: 'separator' } ;
-
-function concatSep( ...menus ) {
-  var submenu = [] ;
-  var needsep = false ;
-  menus.forEach((items) => {
-    const n = items.length ;
-    if (n > 0) {
-      if (needsep)
-        submenu.push( separator );
-      submenu = submenu.concat(items);
-      needsep = (items[n-1].type !== 'separator') ;
-    }
-  });
-  return submenu ;
-}
-
-// --------------------------------------------------------------------------
-// --- MacOS Menu Items
-// --------------------------------------------------------------------------
-
-const macosAppMenuItems = (name) => [
-  {
-    label: `About ${name}`,
-    role: 'about'
-  },
-  separator,
-  {
-    label: `Preferences…`,
-    accelerator: 'Command+,',
-    click: () => app.emit('dome.menu.settings')
-  },
-  {
-    label: `Restore Defaults`,
-    click: () => app.emit('dome.menu.defaults')
-  },
-  separator,
-  {
-    label: `Services`,
-    submenu: [],
-    role: 'services'
-  },
-  separator,
-  {
-    label: `Hide ${name}`,
-    accelerator: 'Command+H',
-    role: 'hide'
-  }, {
-    label: 'Hide Others',
-    accelerator: 'Command+Alt+H',
-    role: 'hideothers'
-  }, {
-    label: 'Show All',
-    role: 'unhide'
-  },
-  separator,
-  {
-    label: 'Quit',
-    accelerator: 'Command+Q',
-    role: 'quit'
-  }
-];
-
-// --------------------------------------------------------------------------
-// --- File Menu Items (platform dependant)
-// --------------------------------------------------------------------------
-
-var fileMenuItems_custom = [];
-
-const fileMenuItems_linux = [
-  {
-    label: `Preferences…`,
-    click: () => app.emit('dome.menu.settings')
-  },
-  {
-    label: `Restore Defaults`,
-    click: () => app.emit('dome.menu.defaults')
-  },
-  separator,
-  {
-    label: 'Exit',
-    accelerator: 'Ctrl+Q',
-    role: 'quit'
-  }
-];
-
-// --------------------------------------------------------------------------
-// --- Edit Menu Items
-// --------------------------------------------------------------------------
-
-const editMenuItems = [
-  { label: 'Undo',
-    accelerator: 'CmdOrCtrl+Z',
-    role: 'undo'
-  }, {
-    label: 'Redo',
-    accelerator: 'Shift+CmdOrCtrl+Z',
-    role: 'redo'
-  },
-  separator,
-  {
-    label: 'Cut',
-    accelerator: 'CmdOrCtrl+X',
-    role: 'cut'
-  }, {
-    label: 'Copy',
-    accelerator: 'CmdOrCtrl+C',
-    role: 'copy'
-  }, {
-    label: 'Paste',
-    accelerator: 'CmdOrCtrl+V',
-    role: 'paste'
-  }, {
-    label: 'Select All',
-    accelerator: 'CmdOrCtrl+A',
-    role: 'selectall'
-  }
-];
-
-var editMenuItems_custom = [] ;
-
-// --------------------------------------------------------------------------
-// --- View Menu Items
-// --------------------------------------------------------------------------
-
-var viewMenuItems_custom = [] ;
-
-const viewMenuItems = (osx) => [
-  {
-    label: 'Reload',
-    accelerator: 'CmdOrCtrl+R',
-    click: reloadWindow
-  }, {
-    label: 'Toggle Full Screen',
-    accelerator: (osx ? 'Ctrl+Command+F' : 'F11'),
-    click: toggleFullScreen
-  }, {
-    label: 'Toggle Developer Tools',
-    accelerator: (osx ? 'Alt+Command+I' : 'Ctrl+Shift+I'),
-    click: toggleDevTools
-  }
-];
-
-// --------------------------------------------------------------------------
-// --- Window Menu Items
-// --------------------------------------------------------------------------
-
-const windowMenuItems_linux = [
-  {
-    label: 'Minimize',
-    accelerator: 'CmdOrCtrl+M',
-    role: 'minimize'
-  }, {
-    label: 'Close',
-    accelerator: 'CmdOrCtrl+W',
-    role: 'close'
-  },
-  separator,
-  {
-    label: 'Reopen Window',
-    accelerator: 'CmdOrCtrl+Shift+T',
-    enabled: false, /*?*/
-    key: 'reopenMenuItem', /*?*/
-    click: () => { app.emit('activate'); }
-  }
-];
-
-const windowMenuItems_macos = windowMenuItems_linux.concat([
-  {
-    label: 'Bring All to Front',
-    role: 'front'
-  }
-]);
-
-// --------------------------------------------------------------------------
-// --- Help Menu Items
-// --------------------------------------------------------------------------
-
-const helpMenuItems = [
-  {
-    label: 'Learn More',
-    click: function () {
-      shell.openExternal('http://electron.atom.io');
-    }
-  }
-];
-
-// --------------------------------------------------------------------------
-// --- Update MenuBar (async)
-// --------------------------------------------------------------------------
-
-var updateRequired = false ;
-var updateTriggered = false ;
-
-function requestUpdate() {
-  if (updateRequired && !updateTriggered) {
-    updateTriggered = true ;
-    setImmediate( install );
-  }
-}
-
-// --------------------------------------------------------------------------
-// --- CustomMenus
-// --------------------------------------------------------------------------
-
-var customMenus = [] ;
-var customItems = {} ;
-
-function findMenu( label ) {
-  switch( label ) {
-  case 'File': return fileMenuItems_custom;
-  case 'Edit': return editMenuItems_custom;
-  case 'View': return viewMenuItems_custom;
-  default:
-    var theMenu = customMenus.find((m) => m.label === label);
-    return theMenu && theMenu.submenu ;
-  }
-}
-
-export function addMenu( label )
-{
-  if (findMenu(label)) {
-    console.warn(`Already defined menu '${menu}'`);
-  } else {
-    customMenus.push( { label , submenu:[] } );
-  }
-  requestUpdate();
-}
-
-export function addMenuItem( { menu , key, ...spec } )
-{
-  var submenu = findMenu( menu );
-  if (!submenu) {
-    console.error(`[Dome] Unknown menu '${menu}' (menu item #${spec.id || spec.label} undefined)`);
-    return;
-  }
-  if (!spec || spec.type === 'separator') {
-    submenu.push( separator );
-  } else {
-    const id = spec.id ;
-    if (!id) {
-      console.error('[Dome] Invalid menu item:',spec);
-      return;
-    }
-    if (key) {
-      switch(System.platform) {
-      case 'macos':
-        if (key.startsWith('Cmd+')) spec.accelerator = "Cmd+" + key.substring(4) ;
-        if (key.startsWith('Alt+')) spec.accelerator = "Cmd+Alt+" + key.substring(4) ;
-        if (key.startsWith('Meta+')) spec.acceperator = "Cmd+Shift+" + key.substring(5) ;
-        break;
-      case 'windows':
-      case 'linux':
-      default:
-        if (key.startsWith('Cmd+')) spec.accelerator = "Ctrl+" + key.substring(4) ;
-        if (key.startsWith('Alt+')) spec.accelerator = "Alt+" + key.substring(4) ;
-        if (key.startsWith('Meta+')) spec.acceperator = "Ctrl+Alt+" + key.substring(5) ;
-        break;
-      }
-    }
-    const entry = customItems[id] ;
-    if (entry) {
-      if (!System.DEVEL) {
-        console.error('[Dome] Duplicate menu item:',spec);
-        return;
-      } else {
-        if (entry.spec) Object.assign( entry.spec , spec );
-        if (entry.item) Object.assign( entry.item , spec );
-      }
-    } else {
-      customItems[id] = { spec } ;
-      submenu.push( spec );
-    }
-  }
-  requestUpdate();
-}
-
-export function setMenuItem({ id, ...options })
-{
-  const entry = customItems[id] ;
-  if (entry) {
-    if (entry.spec) Object.assign( entry.spec , options );
-    if (entry.item) Object.assign( entry.item , options );
-    if ( options.label || options.type || options.click ) requestUpdate();
-  } else
-    console.warn(`[Dome] unknown menu item #${id}`);
-}
-
-// --------------------------------------------------------------------------
-// --- Menu Bar Template
-// --------------------------------------------------------------------------
-
-function template() {
-  switch(System.platform) {
-  case 'macos':
-    return [].concat(
-      [
-        { label: app.name, submenu: macosAppMenuItems(app.name) },
-        { label: 'File', submenu: fileMenuItems_custom },
-        { label: 'Edit', submenu: concatSep(editMenuItems,editMenuItems_custom) },
-        { label: 'View', submenu: concatSep(viewMenuItems_custom,viewMenuItems(true)) }
-      ],
-      customMenus,
-      [
-        { label: 'Window', role: 'window', submenu: windowMenuItems_macos },
-        { label: 'Help', role: 'help', submenu: helpMenuItems }
-      ]
-    );
-  case 'windows':
-  case 'linux':
-  default:
-    return [].concat(
-      [
-        { label: 'File', submenu: concatSep(fileMenuItems_custom,fileMenuItems_linux) },
-        { label: 'Edit', submenu: concatSep(editMenuItems,editMenuItems_custom) },
-        { label: 'View', submenu: concatSep(viewMenuItems_custom,viewMenuItems(false)) }
-      ],
-      customMenus,
-      [
-        { label: 'Window', submenu: windowMenuItems_linux },
-        { label: 'Help', submenu: helpMenuItems }
-      ]
-    );
-  }
-}
-
-// --------------------------------------------------------------------------
-// --- MenuBar SetUp
-// --------------------------------------------------------------------------
-
-var menubar ;
-
-function registerCustomItems( menu ) {
-  menu.items.forEach((item) => {
-    const entry = customItems[item.id];
-    if (entry) entry.item = item ;
-    item.submenu && registerCustomItems( item.submenu );
-  });
-}
-
-// Initialize the menubar machinery
-export function install() {
-  updateRequired = true;
-  updateTriggered = false;
-  menubar = Menu.buildFromTemplate(template());
-  registerCustomItems( menubar );
-  Menu.setApplicationMenu( menubar );
-}
-
-// Called by reload above
-function reset() {
-  fileMenuItems_custom = [] ;
-  editMenuItems_custom = [] ;
-  viewMenuItems_custom = [] ;
-  customMenus = [] ;
-  customItems = {} ;
-  install();
-}
-
-// --------------------------------------------------------------------------
diff --git a/ivette/src/dome/src/misc/layout.js b/ivette/src/dome/src/misc/layout.js
deleted file mode 100644
index a7294351edbfdf0d03db5876af06e12187fb4960..0000000000000000000000000000000000000000
--- a/ivette/src/dome/src/misc/layout.js
+++ /dev/null
@@ -1,71 +0,0 @@
-// --------------------------------------------------------------------------
-// --- A Ghost Component aware of its enclosing positionned container
-// --------------------------------------------------------------------------
-
-import React from 'react' ;
-
-const SIZED = {
-  display: 'block',
-  position: 'absolute',
-  top: 0,
-  left: 0,
-  height: '100%',
-  width: '100%',
-  overflow: 'hidden',
-  pointerEvents: 'none',
-  zIndex: -1
-};
-
-// --------------------------------------------------------------------------
-// --- Components
-// --------------------------------------------------------------------------
-
-/*
-   This component is a ghost element to be inserted inside a _positionned_
-   container.  It makes the container aware of its bounding client rectangle
-   _via_ the `onResize` property.
-
-   The `onResize` callback is invoked whenever the parent container is
-   positionned or resized. The callback is passed the
-   `container.getBoundingClientRect()` rectangle.
-*/
-export class Layout extends React.Component {
-
-  // Init the element
-  componentDidMount() {
-    this.element.data = 'about:blank';
-    this.handleResize = this.handleResize.bind(this);
-  }
-
-  // Callback on Resize
-  handleResize() {
-    if (this.props.onResize) {
-      const r = this.element.getBoundingClientRect();
-      this.props.onResize(r);
-    }
-  }
-
-  componentWillUnmount() {
-    if (this.state.view)
-      this.state.view.removeEventListener('resize', this.handleResize);
-  }
-
-  render() {
-    return React.createElement('object', {
-      type: 'text/html', style: SIZED,
-      ref: elt => { this.element = elt; },
-      onLoad: evt => {
-        this.setState(
-          { view: evt.target.contentDocument.defaultView },
-          () => {
-            this.state.view.addEventListener('resize', this.handleResize);
-            this.handleResize();
-          }
-        );
-      }
-    });
-  }
-
-}
-
-// --------------------------------------------------------------------------
diff --git a/ivette/src/dome/src/misc/plugins.js b/ivette/src/dome/src/misc/plugins.js
deleted file mode 100644
index 87a08c0c836e960d70158825db1a98a685f2282c..0000000000000000000000000000000000000000
--- a/ivette/src/dome/src/misc/plugins.js
+++ /dev/null
@@ -1,97 +0,0 @@
-// --------------------------------------------------------------------------
-// --- Dome Plugins Management
-// --------------------------------------------------------------------------
-
-import fs from 'fs' ;
-import path from 'path' ;
-
-const registry = {} ;
-
-// --------------------------------------------------------------------------
-// --- Installing Bundle
-// --------------------------------------------------------------------------
-
-export function register( id, exports )
-{
-  registry[id] = Object.assign( {} , exports );
-}
-
-const WRAPPER_OPEN = '(function(module,require,__static){\n' ;
-const WRAPPER_CLOSE = '\n})' ;
-const PLUGINS = '@plugins/' ;
-
-export function install( name )
-{
-  // Resolve plugin directory
-  let dir = path.resolve( __static , "plugins" , name );
-  if (!fs.isDirectory())
-    throw `Plugin '${name}' not installed` ;
-
-  // Resolve plugin configuration
-  let pkg = path.resolve( dir , 'package.json' );
-  if (!fs.isFile(pkg))
-    throw `Plugin '${name}' has no 'package.json' file` ;
-  let config ;
-  try { config = JSON.pargse(fs.readFileSync( pkg , 'UTF-8' )); }
-  catch(err) {
-    console.error( `[Dome] Reading '${pkg}':\n`, err );
-    throw `Plugin '${name}' has invalid 'package.json' file` ;
-  }
-
-  // Resolve plugin entry points
-  let bundlejs = path.resolve( dir, config.main || 'bundle.js' );
-  if (!fs.isFile(bundlejs))
-    throw `Plugin '${name}' entry point not found` ;
-  let static_d = path.resolve( dir, 'static' );
-  if (!fs.isDirectory(static_d)) static_d = undefined;
-
-  // Load bundle file
-  let bundle ;
-  try { bundle = fs.readFileSync( bundlejs , 'UTF-8' ); }
-  catch(err) {
-    console.error( `[Dome] Loading '${bundlejs}':\n`, err );
-    throw `Plugin '${name}' can not load its entry point` ;
-  }
-
-  // Install bundle file
-  let id = PLUGINS + name ;
-  let exports = {} ;
-  register( id, exports ); // cut circularities
-  try {
-    let wrapped = WRAPPER_OPEN + bundle + WRAPPER_CLOSE ;
-    let compiled ; eval(wrapped);
-    let module = { id, exports };
-    compiled( module, require, static_d );
-  } catch(err) {
-    console.error( `[Dome] Running '${bundlejs}':\n`, err );
-    throw `Plugin '${name}' can not install bundle` ;
-  }
-  register( id, exports ); // final exports
-
-  // Finally return exports
-  return exports ;
-}
-
-// --------------------------------------------------------------------------
-// --- Resolving Modules
-// --------------------------------------------------------------------------
-
-export function require(id)
-{
-  let exports = registry[id];
-  if (exports) return Object.assign( {} , exports );
-
-  // Resolving plugin
-
-  if (id.startsWith(PLUGINS))
-  {
-    let exports = install( id.substring(PLUGINS.length) );
-    return Object.assign( {} , exports );
-  }
-
-  // Trap
-
-  throw `Module '${id}' not found` ;
-}
-
-// --------------------------------------------------------------------------
diff --git a/ivette/src/dome/src/misc/system.js b/ivette/src/dome/src/misc/system.js
deleted file mode 100644
index 3a4deac841f74817b387562192b72de5108edd91..0000000000000000000000000000000000000000
--- a/ivette/src/dome/src/misc/system.js
+++ /dev/null
@@ -1,644 +0,0 @@
-/**
-   @packageDocumentation
-   @module dome/system
-*/
-
-// --------------------------------------------------------------------------
-// --- Evolved Spawn Process
-// --------------------------------------------------------------------------
-
-import _ from 'lodash' ;
-import Emitter from 'events' ;
-import Exec from 'child_process' ;
-import fspath from 'path' ;
-import fs from 'fs' ;
-import { app, remote } from 'electron' ;
-
-// --------------------------------------------------------------------------
-// --- Platform Specificities
-// --------------------------------------------------------------------------
-
-var thePlatform = 'linux' ;
-{
-  switch( process.platform ) {
-  case 'darwin':
-    thePlatform = 'macos'; break;
-  case 'win32':
-  case 'win64':
-    thePlatform = 'windows'; break;
-  case 'aix':
-  case 'freebsd':
-  case 'linux':
-  case 'openbsd':
-  case 'sunos':
-    thePlatform = 'linux'; break;
-  default:
-    console.warn(`Unkwnon OS platform '${process.platform}' (fallback to 'linux')`);
-    thePlatform = 'linux'; break;
-  }
-}
-
-/**
-   @summary System platform.
-   @description
-   Similar to `process.platform`, but fall into fewer categories:
-   - `'macos'` for Mac OSX,
-   - `'windows'` for Windows (32 or 64)
-   - `'linux'` for most unix-like platforms
-
-Non-recognized platforms will fallback to `'linux'` with the emission of a warning.
-*/
-export const platform = thePlatform ;
-
-// --------------------------------------------------------------------------
-// --- Logging
-// --------------------------------------------------------------------------
-
-/** Development mode flag */
-export const DEVEL = process.env.NODE_ENV !== 'production' ;
-
-// --------------------------------------------------------------------------
-// --- At Exit
-// --------------------------------------------------------------------------
-
-const exitJobs = [];
-
-function exitJob(job,...args) {
-  try { job(...args); }
-  catch(err) { console.err('[Dome] atExit:',err); }
-}
-
-/**
-   @summary Execute a routine at exit.
-   @param {function} callback - the function to be called when application is closing
-   @param {...any} [args] - the argument to be provided to the callback
-   @description
-   Exceptions thrown by the function are captured and reported on the console.
- */
-export function atExit(callback,...args) {
-  exitJobs.push(() => exitJob(callback,...args));
-}
-
-/**
-   @summary Execute a callback at exit on each elements of a collection.
-   @param {array|object} elements - the collection to iterate over
-   @param {function} callback - the function to be called on each element
-   @description
-   The function will be invoked with `callback(value,key,elements)` via
-   the [Lodash `_.forOwn()`](https://lodash.com/docs/4.17.10#forOwn) iterator.
-
-   Exceptions thrown by the function are individually captured and reported
-   on the console for each element in the object or array.
- */
-export function atExitForEach(elements,callback) {
-  atExit(() =>
-         _.forOwn(elements,(value,key,data) => exitJob(callback,value,key,data))
-        );
-}
-
-/** Execute all pending exit jobs (and flush the list). */
-export function doExit() {
-  exitJobs.forEach((f) => f());
-  exitJobs.length = 0;
-}
-
-// --------------------------------------------------------------------------
-// --- Command Line Arguments
-// --------------------------------------------------------------------------
-
-var COMMAND_WDIR = undefined ;
-var COMMAND_ARGV = undefined ;
-
-function SET_COMMAND(argv,wdir) {
-  COMMAND_ARGV = argv ;
-  COMMAND_WDIR = wdir ;
-}
-
-// --------------------------------------------------------------------------
-// --- User's Directories
-// --------------------------------------------------------------------------
-
-const appProxy = app || remote.app ;
-
-/** Returns user's home directory. */
-export function getHome() { return appProxy.getPath('home'); }
-
-/** Returns user's desktop directory. */
-export function getDesktop() { return appProxy.getPath('desktop'); }
-
-/** Returns user's documents directory. */
-export function getDocuments() { return appProxy.getPath('documents'); }
-
-/** Returns user's downloads directory. */
-export function getDownloads() { return appProxy.getPath('downloads'); }
-
-/**
-   @summary Working directory (Application Window).
-   @return {string} absolute path
-   @description
-   This the current working directory from where the application window
-   was opened.
-
-   The function returns `undefined` until the `dome.command` event has been emitted
-   from the `Main` process.
-
-   See also [Dome.onCommand](dome_.html#.onCommand) event handler.
-*/
-export function getWorkingDir() { return COMMAND_WDIR; }
-
-/**
-   @summary Returns the current process ID.
-   @return {number} `process.pid`
- */
-export function getPID() { return process.pid; }
-
-/**
-   @summary Command-line arguments (Application Window).
-   @return {Array.<string>} command-line arguments
-   @description
-   This the command-line arguments used to open the application window.
-
-   The function returns `undefined` until the `dome.command` event has been emitted
-   from the `Main` process.
-
-   See also [Dome.onCommand](dome_.html#.onCommand) event handler.
-*/
-export function getArguments() { return COMMAND_ARGV; }
-
-/** @summary Returns static assets.
-    @param {string} [...path] - a sequecne of path segments
-    @description
-    Returns the path to the associated `./static/<...path>` of your application.
-    The `./static/` directory is automatically packed into your application
-    by Dome thanks to `electron-webpack` default configuration.
-*/
-export function getStatic(...path) { return fspath.join( __static, ...path ); }
-
-// --------------------------------------------------------------------------
-// --- File Join
-// --------------------------------------------------------------------------
-
-/**
-   @summary Join file paths.
-   @param {string} [...paths] - a sequence of path segments
-   @return {string} the joined filepath
-   @description
-   Same as [Node `path.join`](https://nodejs.org/dist/latest-v12.x/docs/api/path.html#path_path_join_paths)
-*/
-export const join = fspath.join ;
-
-/**
-   @summary Absolute (joined) file paths.
-   @param {string} [...paths] - a sequence of path segments
-   @return {string} the corresponding absolute path
-   @description
-   Same as [Node `path.resolve`](https://nodejs.org/dist/latest-v12.x/docs/api/path.html#path_path_resolve_paths)
-*/
-export const resolve = fspath.resolve ;
-
-/**
-   @summary Dirname of path.
-   @param {string} path - a file path
-   @return {string} the dirname of the path
-   @description
-   Same as [Node `path.dirname`](https://nodejs.org/dist/latest-v12.x/docs/api/path.html#path_path_dirname_path)
-*/
-export const dirname = fspath.dirname ;
-
-/**
-   @summary Basename of path.
-   @param {string} path - a file path
-   @param {string} [ext] - file extension to remove
-   @return {string} the basename of the path
-   @description
-   Same as [Node `path.basename`](https://nodejs.org/dist/latest-v12.x/docs/api/path.html#path_path_basename_path_ext)
-*/
-export const basename = fspath.basename ;
-
-/**
-   @summary File extension of path.
-   @param {string} path - a file path
-   @return {string} the file extension of the path
-   @description
-   Same as [Node `path.extname`](https://nodejs.org/dist/latest-v12.x/docs/api/path.html#path_path_extname_path)
-*/
-export const extname = fspath.extname ;
-
-// --------------------------------------------------------------------------
-// --- File Stats
-// --------------------------------------------------------------------------
-
-/**
-   @summary Return an `fs.stat()` object for the path.
-   @param {string} path - the file path
-   @return {Promise<fs.Stats>} the file stats
-   @description
-Promisified [Node `fs.stat`](https://nodejs.org/dist/latest-v12.x/docs/api/fs.html#fs_fs_stat_path_callback).
-
-Returns a (promised) [Node `fs.Stats`](https://nodejs.org/dist/latest-v12.x/docs/api/fs.html#fs_class_fs_stats) object,
-including the following usefull fields and methods (and more):
- - `stats.isFile()` returns `true` for a regular file
- - `stats.isDirectory()` returns `true` for a directory
- - `stats.mode` the bitfield (integer) of the file access mode
- - `stats.size` the size of the file (in bytes)
- - `stats.mtime` last modification time stamp (javascript `Date` object)
-
-The promise is rejected if the file does not exists.
-*/
-export function fileStat( path ) {
-  return new Promise((resolve,reject) => {
-    fs.stat( path, (err,data) => err ? reject(err) : resolve(data) );
-  });
-}
-
-/**
-   @summary Check is a path exists and is a regular file.
-   @param {string} path - the file path
-   @return {boolean} synchronous check
-*/
-export function isFile( path )
-{
-  try {
-    return path && fs.statSync( path ).isFile();
-  } catch(_err) {
-    return false;
-  }
-}
-
-/**
-   @summary Check is a path exists and is a directory.
-   @param {string} path - the dir path
-   @return {boolean} synchronous check
-*/
-export function isDirectory( path )
-{
-  try {
-    return path && fs.statSync( path ).isDirectory();
-  } catch(_err) {
-    return false;
-  }
-}
-
-/**
-   @summary Check is a path exists and is a file or directory.
-   @param {string} path - the dir path
-   @return {boolean} synchronous check
-*/
-export function exists( path )
-{
-  try {
-    if (!path) return false;
-    let stats = fs.statSync( path );
-    return stats.isFile() || stats.isDirectory();
-  } catch(_err) {
-    return false;
-  }
-}
-
-// --------------------------------------------------------------------------
-// --- Read File
-// --------------------------------------------------------------------------
-
-/**
-   @summary Reads a textual file contents.
-   @param {string} path - the file path
-   @return {Promise<string>} the file's content
-   @description
-   Promisified
-   [Node `fs.readFile`](https://nodejs.org/dist/latest-v12.x/docs/api/fs.html#fs_fs_readfile_path_options_callback)
-   using `UTF-8` encoding.
- */
-export function readFile( path ) {
-  return new Promise((resolve,reject) => {
-    fs.readFile( path, 'UTF-8', (err,data) => err ? reject(err) : resolve(data) );
-  });
-}
-
-// --------------------------------------------------------------------------
-// --- Write File
-// --------------------------------------------------------------------------
-
-/**
-   @summary Writes a textual content in a file.
-   @param {string} path - the file path
-   @param {string} content - the content to write in
-   @return {Promise} to handle the request.
-   @description
-   Promisified
-   [Node `fs.writeFile`](https://nodejs.org/dist/latest-v12.x/docs/api/fs.html#fs_fs_writefile_file_data_options_callback)
-   using `UTF-8` encoding.
- */
-export function writeFile( path , content ) {
-  return new Promise((resolve,reject) => {
-    fs.writeFile( path, content, 'UTF-8', (err) => err ? reject(err) : resolve() );
-  });
-}
-
-// --------------------------------------------------------------------------
-// --- Copy File
-// --------------------------------------------------------------------------
-
-/**
-   @summary Copy file to a new path.
-   @param {string} srcPath - the source file path
-   @param {string} tgtPath - the target file path
-   @return {Promise} to handle the request.
-   @description
-   Promisified
-   [Node `fs.copyFile`](https://nodejs.org/dist/latest-v12.x/docs/api/fs.html#fs_fs_copyfile_src_dest_flags_callback)
-   using `UTF-8` encoding.
- */
-export function copyFile( srcPath , tgtPath ) {
-  return new Promise((resolve,reject) => {
-    fs.copyFile( srcPath, tgtPath, (err) => err ? reject(err) : resolve() );
-  });
-}
-
-// --------------------------------------------------------------------------
-// --- Read Directory
-// --------------------------------------------------------------------------
-
-/**
-   @summary Reads a directory.
-   @param {string} path - the directory path
-   @return {Promise<string[]>} the directory content as an array of its file names (not full path)
-   @description
-   Promisified
-   [Node `fs.readdir`](https://nodejs.org/dist/latest-v12.x/docs/api/fs.html#fs_fs_readdir_path_options_callback).
-
-   Uses `UTF-8` encoding to obtain (relative) file names instead of byte buffers. On MacOS, `.DS_Store` entries
-   are filtered out.
-*/
-export function readDir( path ) {
-  const filterDir = (f) => f !== '.DS_Store' ;
-  return new Promise((resolve,reject) => {
-    fs.readdir( path, 'UTF-8', (err,files) => err ? reject(err) : resolve(files.filter(filterDir)) );
-  });
-}
-
-// --------------------------------------------------------------------------
-// --- Make Directory
-// --------------------------------------------------------------------------
-
-/**
-   @summary Creates a new directory.
-   @param {string} path - the directory path
-   @param {object} options - permissions and mode (defaults to recursive, `0o777`)
-   @return {Promise} to handle the request.
-   @description
-   Promisified
-   [Node `fs.mkdir`](https://nodejs.org/dist/latest-v12.x/docs/api/fs.html#fs_fs_mkdir_path_options_callback).
-   Options:
-   - `mode:number` permission modes (default is `0o777`)
-   - `recursive:boolean` recursively create parent directories (default is `true`)
-*/
-export function mkDir( path, { recursive=true, mode=0o777 }={} )
-{
-  return new Promise((resolve,reject) => {
-    fs.mkdir( path, { recursive, mode }, (err) => err ? reject(err) : resolve() );
-  });
-}
-
-// --------------------------------------------------------------------------
-// --- Remove File
-// --------------------------------------------------------------------------
-
-/**
-   @summary Remove a file.
-   @param {string} path - the file path to unlink
-   @return {Promise} to handle the request.
-   @description
-   Promisified
-   [Node `fs.unlink`](https://nodejs.org/dist/latest-v12.x/docs/api/fs.html#fs_fs_unlink_path_callback)
-*/
-export function remove( path )
-{
-  return new Promise((resolve,reject) => {
-    fs.unlink( path, (err) => err ? reject(err) : resolve() );
-  });
-}
-
-// --------------------------------------------------------------------------
-// --- Remove Directory
-// --------------------------------------------------------------------------
-
-// Not (yet) implemented in Node for Electron
-function rmDirNonRec(path) {
-  return new Promise((resolve,reject) => {
-    fs.rmdir( path, (err) => err ? reject(err) : resolve() );
-  });
-}
-
-// Not (yet) implemented in Node for Electron
-function rmDirRec(path) {
-  try {
-    let stats = fs.statSync( path );
-    if (stats.isFile()) {
-      return remove(path);
-    }
-    if (stats.isDirectory()) {
-      const rmDirSub = (name) => rmDirRec(fspath.join(path,name));
-      return readDir(path)
-        .then((names) => Promise.all(names.map(rmDirSub)))
-        .then(() => rmDirNonRec(path));
-    }
-    return Promise.resolve();
-  } catch(_err) {
-    return Promise.resolve();
-  }
-}
-
-/**
-   @summary Remove a directory.
-   @param {string} path - the directory path
-   @param {object|boolean} [options] - deletion mode (defaults to non-recursive)
-   @return {Promise} to handle the request.
-   @description
-   Promisified
-   [Node `fs.rmdir`](https://nodejs.org/dist/latest-v12.x/docs/api/fs.html#fs_fs_mkdir_path_options_callback).
-   Options:
-   - `recursive:boolean` recursively remove sub-directories (default is `true`)
-*/
-export function rmDir( path, { recursive=true }={} )
-{
-  return recursive ? rmDirRec( path ) : rmDirNonRec( path );
-}
-
-// --------------------------------------------------------------------------
-// --- Rename File
-// --------------------------------------------------------------------------
-
-/**
-   @summary Rename of file of direcory.
-   @param {string} oldPath - the old path
-   @param {string} newPath - the new path
-   @return {Promise} to handle the request.
-   @description
-   Promisified
-   [Node `fs.rename`](https://nodejs.org/dist/latest-v12.x/docs/api/fs.html#fs_fs_rename_oldpath_newpath_callback)
-*/
-export function rename( oldPath, newPath )
-{
-  return new Promise((resolve,reject) => {
-    fs.rename( oldPath, newPath, (err) => err ? reject(err) : resolve() );
-  });
-}
-
-// --------------------------------------------------------------------------
-// --- Child Process
-// --------------------------------------------------------------------------
-
-const childprocess = {} ;
-
-atExitForEach(childprocess,(process) => process.kill());
-
-function stdSpec( spec , isOutput ) {
-  switch(spec) {
-  case undefined:
-    return { io: isOutput ? 'pipe' : 'ignore' };
-  case null:
-  case 'null':
-  case 'ignore':
-    return { io: 'ignore' };
-  case 'pipe':
-    return { io: 'pipe' };
-  default:
-    const fd = spec.path ? fs.openSync( spec.path , spec.mode || (isOutput ? 'w' : 'r') ) : undefined ;
-    return (isOutput && spec.pipe) ? { io: 'pipe', fd } : { io: fd } ;
-  }
-}
-
-function pipeTee( std , fd )
-{
-  if (!fd) return;
-  const out = fs.createWriteStream(null,{ fd, encoding: 'UTF-8' });
-  out.on('error',(err) => {
-    console.warn("[Dome] can not pipe:",err);
-    std.unpipe(out);
-  });
-  std.pipe(out);
-}
-
-/**
-   @summary Spawn a child process.
-   @param {string} command - the command to spawn
-   @param {string[]} [args] - the command arguments
-   @param {object} [options] - spawning options (see above)
-   @return {Promise<ChildProcess>} unless rejected, returns a process
-   object to interact with the spawned command
-   @description
-Based on [Node `child_process.spawn`](https://nodejs.org/dist/latest-v12.x/docs/api/child_process.html#child_process_child_process_spawn_command_args_options). The promised process object is a regular [Node `ChildProcess`](https://nodejs.org/api/child_process.html#child_process_class_childprocess) object, for which we recall the main useful methods below:
-
- - `child.on('exit',(code) => {...})` emitted event when the process is terminated
- - `child.on('close',(code) => {...})` emitted event when the process is fully terminated (all pipes closed)
- - `child.on('message',(...data) => {...})` emitted from the _forked_ process (if applicable)
- - `child.stdout.on('data',(text) => {...})` emitted when the process writes on piped stdout (receives `UTF-8` strings)
- - `child.stderr.on('data',(text) => {...})` emitted when the process writes on piped stderr (receives `UTF-8` strings)
- - `child.kill()` sends a `'SIGTERM'` unix message to the process
-
-Options is an object similar to the original Node options, with small adaptations.
-The possible option fields are described as follows:
-
-| Option | Type | Default | Description |
-|--------|------|---------|-------------|
-| `cwd`  | `string` | `process.cmd` | Working directory for the command |
-| `env`  | `object` | `{}` | _additional_ environment variables |
-| `stdin` | _stdio_ | `'ignored'` | Standard input stream |
-| `stdout` | _stdio_ | `'pipe'` | Standard output stream |
-| `stderr` | _stdio_ | `'pipe'` | Standard error stream |
-| `fork` | `boolean` | `false` | Fork a Node-child process |
-
-Environment variables are _added_ to the default `process.env` environment.
-
-Input and output streams are defined according to the following table:
-
-| _stdio_  | Description |
-|----------|-------------|
-| `'pipe'` | Accessible _via_ the promised child-process object |
-| `'ignored'` | Connected to `/dev/null` |
-| `{ path[,mode][,pipe] }` | Connected to file `path` |
-
-All pipes have their encoding set to `UTF-8`,
-hence all callbacks on process events will receive natural strings instead of raw byte buffers.
-
-When specifying a file for a process standard stream, an optional mode can be specified.
-Default is `'r'` for input streams and `'w'` for output ones.
-If option `pipe:true` is provided (output streams only), the output of the process is
-also piped through the Process object. The file-path is relative to the current working directory
-of the _application_, not be confused with the `cwd` option of the spawned command.
-
-When the `fork` flag is set, the child process is spawned using
-[Node `child_process.fork`](https://nodejs.org/dist/latest-v12.x/docs/api/child_process.html#child_process_child_process_fork_modulepath_args_options). This enables Node inter-process communication _via_ the
-`process.send()` and `process.on('message')` methods of the child process object.
-*/
-
-export function spawn(command,args,options) {
-  return new Promise((resolve,reject) => {
-
-    const cwd = options ? options.cwd : undefined ;
-    const env = options && options.env ? Object.assign( {} , process.env , options.env ) : undefined ;
-    const stdin = stdSpec( options && options.stdin , false );
-    const stdout = stdSpec( options && options.stdout , true );
-    const stderr = stdSpec( options && options.stderr , true );
-    const stdio = [ stdin.io , stdout.io , stderr.io ] ;
-    const opt = { cwd , env , stdio , windowsHide: true };
-    const fork = options && options.fork ;
-    var process ;
-
-    if (fork) {
-      opt.stdio.push( 'ipc' );
-      process = Exec.fork(command,args,opt);
-    } else {
-      process = Exec.spawn(command,args,opt);
-    }
-
-    if ( !process ) {
-      throw `[Dome] Unable to create process ('${command}')`;
-      return;
-    }
-
-    const pid = process.pid ;
-
-    if ( !pid ) {
-      // Must defer rejection, otherwize an uncaught exception is raised.
-      process.on('error',(err) => reject(err));
-      return;
-    }
-
-    childprocess[pid] = process ;
-    process.on('exit',() => delete childprocess[pid]);
-
-    const out = process.stdout ;
-    const err = process.stderr ;
-
-    if (out) {
-      out.setEncoding('UTF-8');
-      pipeTee( out , stdout.fd );
-    }
-    if (err) {
-      err.setEncoding('UTF-8');
-      pipeTee( err , stderr.fd );
-    }
-
-    resolve(process);
-  });
-}
-
-// --------------------------------------------------------------------------
-// --- Window Management
-// --------------------------------------------------------------------------
-
-const WINDOW_APPLICATION_ARGV = '--dome-application-window' ;
-const WINDOW_PREFERENCES_ARGV = '--dome-preferences-window' ;
-
-// --------------------------------------------------------------------------
-// --- Only used for inter-module initialisation
-// --------------------------------------------------------------------------
-
-export default {
-  SET_COMMAND,
-  WINDOW_APPLICATION_ARGV,
-  WINDOW_PREFERENCES_ARGV
-};
-
-// --------------------------------------------------------------------------
diff --git a/ivette/src/dome/src/renderer/data/states.ts b/ivette/src/dome/src/renderer/data/states.ts
deleted file mode 100644
index ce7704696991024b8dc1ecb49baaa7825a6c3466..0000000000000000000000000000000000000000
--- a/ivette/src/dome/src/renderer/data/states.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-// --------------------------------------------------------------------------
-// --- States
-// --------------------------------------------------------------------------
-
-/**
-   Typed States & Settings
-   @packageDocumentation
-   @module dome/data/states
-*/
-
-import React from 'react';
-import Emitter from 'events';
-import isEqual from 'react-fast-compare';
-
-const UPDATE = 'dome.states.update';
-
-/** Cross-component State. */
-export class State<A> {
-
-  private value: A;
-  private emitter: Emitter;
-
-  constructor(initValue: A) {
-    this.value = initValue;
-    this.emitter = new Emitter();
-    this.getValue = this.getValue.bind(this);
-    this.setValue = this.setValue.bind(this);
-  }
-
-  /** Current state value. */
-  getValue() { return this.value; }
-
-  /** Notify callbacks on change, using _deep_ structural comparison. */
-  setValue(value: A) {
-    if (!isEqual(value, this.value)) {
-      this.value = value;
-      this.emitter.emit(UPDATE, value);
-    }
-  }
-
-  /** Callback Emitter. */
-  on(callback: (value: A) => void) {
-    this.emitter.on(UPDATE, callback);
-  }
-
-  /** Callback Emitter. */
-  off(callback: (value: A) => void) {
-    this.emitter.off(UPDATE, callback);
-  }
-
-}
-
-/** React Hook, similar to `React.useState()`. */
-export function useState<A>(s: State<A>): [A, (update: A) => void] {
-  const [current, setCurrent] = React.useState<A>(s.getValue);
-  React.useEffect(() => {
-    s.on(setCurrent);
-    return () => s.off(setCurrent);
-  }, [s]);
-  return [current, s.setValue];
-}
-
-// --------------------------------------------------------------------------
diff --git a/ivette/src/dome/src/renderer/dome.js b/ivette/src/dome/src/renderer/dome.js
deleted file mode 100644
index 322a76d8bc3242c7d2631da72db37257d2602649..0000000000000000000000000000000000000000
--- a/ivette/src/dome/src/renderer/dome.js
+++ /dev/null
@@ -1,984 +0,0 @@
-/**
-   @packageDocumentation
-   @module dome(renderer)
-   @description
-
-   ## Dome Application (Renderer Process)
-
-   This modules manages your main application window
-   and its interaction with the main process.
-
-   Example:
-
-   ```typescript
-   // File 'src/renderer/index.js':
-   import Application from './Application.js' ;
-   Dome.setContent( Application );
-   ```
- */
-
-import _ from 'lodash' ;
-import React from 'react';
-import ReactDOM from 'react-dom';
-import { AppContainer } from 'react-hot-loader' ;
-import { remote , ipcRenderer } from 'electron';
-import { EventEmitter } from 'events' ;
-import SYS , * as System from 'dome/system' ;
-import './style.css' ;
-
-// --------------------------------------------------------------------------
-// --- Context
-// --------------------------------------------------------------------------
-
-// main window focus
-var focus = true ;
-
-function setContextAppNode()
-{
-  const node = document.getElementById('app');
-  if (node) {
-    node.className =
-      'dome-container dome-platform-' + System.platform +
-      ( focus ? ' dome-window-active' : ' dome-window-inactive' ) ;
-  }
-  return node;
-}
-
-// --------------------------------------------------------------------------
-// --- Helpers
-// --------------------------------------------------------------------------
-
-/** @summary Development mode flag.
-    @description
-    Configured to be `'true'` when in development mode
-*/
-export const DEVEL = System.DEVEL ;
-
-/** @summary System platform.
-    @description
-    Same as `platform` from `dome/system` */
-export const platform = System.platform ;
-
-// --------------------------------------------------------------------------
-// --- Application Emitter
-// --------------------------------------------------------------------------
-
-/** @summary Application Emitter.
-    @description
-    Can be used as a basic _Flux_ dispatcher. */
-export const emitter = new EventEmitter();
-
-/** Same as `emitter.on` */
-export function on(evt,job) { emitter.on(evt,job); }
-
-/** Same as `emitter.off` */
-export function off(evt,job) { emitter.off(evt,job); }
-
-/** Same as `emitter.emit` */
-export function emit(evt,...args) { emitter.emit(evt,...args); }
-
-{
-  emitter.setMaxListeners(250);
-}
-
-// --------------------------------------------------------------------------
-// --- Application Events
-// --------------------------------------------------------------------------
-
-/** @event 'dome.update'
-    @description
-    Convenient pre-defined events for triggering a global re-render.
-    See also [Dome.onUpdate](#.onUpdate), [Dome.update](#.update) methods and
-    the [Dome.useUpdate](#.useUpdate) hook.
-*/
-
-/** @event 'dome.reload'
-    @description
-    Triggered when the application has been loaded or re-loaded
-    See also [Dome.onReload](#.onReload).
-*/
-
-/** @event 'dome.command'
-    @param {Array.<string>} argv - command line arguments
-    @param {string} wdir - working directory
-    @description
-    Triggered when the command line argument has been received, and when
-    the application is re-loaded (in development mode).
-
-    See also [Dome.onCommand](#.onCommand).
-*/
-
-/**
-   @summary Emits the `dome.update` event.
-*/
-export function update() { emitter.emit('dome.update'); }
-
-/**
-   @summary Update event handler.
-   @param {function} cb - invoked on update events.
-   @description
-   Register a callback on [dome.update](#~event:'dome.update') event.
-*/
-export function onUpdate(job) { emitter.on('dome.update',job); }
-
-/**
-   @summary Update event handler.
-   @param {function} cb - invoked on reload events.
-   @description
-   Register a callback on [dome.reload](#~event:'dome.reload') event.
-*/
-export function onReload(job) { emitter.on('dome.reload',job); }
-
-/** @summary Command-line event handler.
-    @param {function} cb - invoked with `cb(argv,wdir)`
-    @description
-Register a callback on [dome.command](#~event:'dome.reload') event,
-emitted by the `Main` process when the application instance is launched.
-
-See also:
- - [[useCommand]]
- - `System.getArguments`
- - `System.getWorkingDir`
-*/
-export function onCommand(job) { emitter.on('dome.command',job); }
-
-ipcRenderer.on('dome.ipc.reload',() => emitter.emit('dome.reload'));
-ipcRenderer.on('dome.ipc.command', (_event,argv,wdir) => {
-  SYS.SET_COMMAND(argv,wdir);
-  emitter.emit('dome.command',argv,wdir);
-});
-
-// --------------------------------------------------------------------------
-// --- Window Management
-// --------------------------------------------------------------------------
-
-export function isApplicationWindow()
-{
-  return process.argv.includes( SYS.WINDOW_APPLICATION_ARGV );
-}
-
-export function isPreferencesWindow()
-{
-  return process.argv.includes( SYS.WINDOW_PREFERENCES_ARGV );
-}
-
-// --------------------------------------------------------------------------
-// --- Window Title
-// --------------------------------------------------------------------------
-
-export function setModified( modified )
-{
-  ipcRenderer.send('dome.ipc.window.modified',modified);
-}
-
-export function setTitle( title )
-{
-  ipcRenderer.send('dome.ipc.window.title',title);
-}
-
-// --------------------------------------------------------------------------
-// --- Main Content
-// --------------------------------------------------------------------------
-
-/**
-   @summary Defines the user's main window content.
-   @param {React.Component} Component - to be rendered in the main window
-   @description
-   Binds the component to the main window.
-
-   <strong>Notes:</strong> a `<Component/>` instance is generated and rendered in the `#app`
-   window element. Its class name is set to `dome-platform-<platform>` with
-   the `<platform>` set to the `Dome.platform` value. This class name can be used
-   as a CSS selector for platform-dependent styling.
-*/
-export function setApplicationWindow( Component )
-{
-  if (isApplicationWindow()) {
-    syncSettings();
-    const appNode = setContextAppNode();
-    ReactDOM.render( <AppContainer><Component/></AppContainer> , appNode );
-  }
-}
-
-// --------------------------------------------------------------------------
-// --- Settings Window
-// --------------------------------------------------------------------------
-
-/**
-   @summary Defines the user's preferences window content.
-   @param {React.Component} Component - to be rendered in the settings window
-   @description
-   Binds the component to the settings window.
-
-   <strong>Notes:</strong> a `<Component/>` instance is generated and rendered in the `#app`
-   window element. Its class name is set to `dome-platform-<platform>` with
-   the `<platform>` set to the `Dome.platform` value. This class name can be used
-   as a CSS selector for platform-dependent styling.
-*/
-export function setPreferencesWindow( Component )
-{
-  if (isPreferencesWindow()) {
-    syncSettings();
-    const appNode = setContextAppNode();
-    ReactDOM.render( <AppContainer><Component/></AppContainer> , appNode );
-  }
-}
-
-// --------------------------------------------------------------------------
-// --- MenuBar Management
-// --------------------------------------------------------------------------
-
-const customItemCallbacks = {} ;
-
-/**
-   @summary Create a new custom menu in the menu bar.
-   @param {string} label - the menu title (shall be unique)
-   @description
-   This function can be triggered at any time, and will eventually trigger
-   an update of the whole application menubar.
-
-   It is also possible to call this function from the main process.
-*/
-export function addMenu( label ) { ipcRenderer.send( 'dome.ipc.menu.addmenu' , label ); }
-
-/**
-   @summary Insert a new custom item in a menu.
-   @param {object} spec - the menu-item specification
-   @description
-The menu-item shall be specified by using the following fields:
- - `menu` (`string`, _required_) : the label of the menu to insert the item in;
-   can be a custom menu, or one of the predefined `'File'`, `'Edit'` or `'View'` menus.
- - `id` (`string|number`, _required_) : the item identifier;
-   shall be unique among the entire menu-bar.
- - `type` (`string`, _optional_) : one of `'normal'`, `'separator'`, `'checkbox'` or `'radio'`.
- - `label` (`string`, _optional_) : the item label.
- - `visible` (`boolean`, _optional_, default is `true`).
- - `enabled` (`boolean`, _optional_, default is `true`).
- - `checked` (`boolean`, _optional_, for `type:'checkbox'` and `type:'radio'` only, default is `false`).
- - `key` (`string`, _optional_) : a keyboard shortcut for menu-item.
- - `onClick` (`function`, _optional_) : an optional callback.
-
-These options (except `menu` and `id`) can be modified later on by using the [setMenuItem](#.setMenuItem) function.
-
-When clicked, the menu-item will also trigger a `'dome.menu.clicked'` event on the entire application (both process)
-with the corresponding `id`.
-
-Key short cuts shall be specified with the following codes:
- - `"Cmd+<Key>"` for command (MacOS) or control (Linux) key
- - `"Alt+<Key>"` for command+option (MacOS) or alt (Linux) key
- - `"Meta+<Key>"` for command+shift (MacOS) or control+alt (Linux) key
-
-Alternatively, more precise keybord shortcuts can be specified with the `'accelerator'` option,
-which follows the same encoding that menu-item specifications from Electron.
-
-The `addMenu` function can be triggered at any time, and will eventually trigger
-an update of the whole application menubar.
-It is also possible to call this function from the main process.
-
-*/
-export function addMenuItem( spec )
-{
-  if (!spec.id && spec.type !== 'separator') {
-    console.error('[Dome] Missing menu-item identifier',spec);
-    return;
-  }
-  const { onClick , ...options } = spec ;
-  if ( onClick ) customItemCallbacks[ spec.id ] = onClick ;
-  ipcRenderer.send( 'dome.ipc.menu.addmenuitem' , options );
-}
-
-/**
-   @summary Update properties of an existing menu-item.
-   @param {object} options - the menu-item specification to update
-   @description
-   Options must follow the specification of the [addMenuItem](#.addMenuItem) function.
-   Option `id` must specify the identifier of the menu item to update.
-   The menu and item positions can _not_ be modified.
-   If an `onClick` callback is specified, it will _replace_ the previous one.
-   You shall specify `null` to remove the previously registered callback
-   (`undefined` callback is ignored).
-
-   This function can be triggered at any time, and will possibly trigger
-   an update of the whole application menubar if the properties
-   can not be changed dynamically in Electron.
-
-   It is also possible to call this function from the main process.
-   When specified, the item callback is only invoked in the process which
-   specify it. To register callbacks in other process,
-   you shall listen to the `'dome.menu.clicked'` event.
- */
-export function setMenuItem( options ) {
-  if (!options.id) {
-    console.error('[Dome] Missing menu-item identifier',options);
-    return;
-  }
-  const { onClick , ...updates } = options ;
-  if (onClick !== undefined) {
-    if (onClick) customItemCallbacks[options.id] = onClick ;
-    else delete customItemCallbacks[options.id] ;
-  }
-  ipcRenderer.send( 'dome.ipc.menu.setmenuitem', updates );
-}
-
-/** @event 'dome.menu.clicked'
-    @description Emitted with the clicked menu-item identifier */
-
-ipcRenderer.on('dome.ipc.menu.clicked',(id) => {
-  const callback = customItemCallbacks[id] ;
-  callback && callback();
-});
-
-// --------------------------------------------------------------------------
-// --- Context Menus
-// --------------------------------------------------------------------------
-
-/**
-   @summary Popup a contextual menu.
-   @param {item[]} items - the array of menu items
-   @param {function} [callback] - an optional callback
-   @description
-Each menu item is specified by an object with the following fields:
- - `id` (`string|number`, _optional_) : the item identifier.
- - `label` (`string`, _optional_) : the item label.
- - `enabled` (`boolean`, _optional_, default is `true`).
- - `display` (`boolean`, _optional_, default is `true`).
- - `checked` (`boolean`, _optional_, default is `undefined`).
- - `onClick` (`function`, _optional_) : callback on item selection.
-
-Items can be separated by inserting a `'separator'` constant string
-in the array. Item identifier and label default to each others. Alternatively,
-an item can be specified by a single string that will be used for both
-its label and identifier. Undefined or null items are allowed (and skipped).
-
-The menu is displayed at the current mouse location.
-The callback is called with the selected item identifier or label.
-If the menu popup is canceled by the user, the callback is called with `undefined`.
-
-@example
-let myPopup = (_evt) => Dome.popupMenu([ …items… ],(id) => … );
-<div onRightClick={myPopup}>...</div>
-
-*/
-export function popupMenu( items, callback )
-{
-  const { Menu , MenuItem } = remote ;
-  const menu = new Menu();
-  var selected = undefined ;
-  var kid = 0 ;
-  items.forEach((item) => {
-    if (item === 'separator')
-      menu.append(new MenuItem({ type:'separator' }));
-    else if (item)
-    {
-      const { display=true, enabled, checked } = item ;
-      if (display) {
-        const label = item.label || '#'+(++kid) ;
-        const id = item.id || label ;
-        const click = () => {
-          selected = id ;
-          item.onClick && item.onClick();
-        };
-        const type = checked !== undefined ? 'checkbox' : 'normal' ;
-        menu.append(new MenuItem({ label, enabled, type, checked, click }));
-      }
-    }
-  });
-  const job = callback ? () => callback( selected ) : undefined ;
-  menu.popup({window: remote.getCurrentWindow(), callback:job });
-}
-
-// --------------------------------------------------------------------------
-// --- Settings
-// --------------------------------------------------------------------------
-
-var globalSettings = new Map();
-var globalPatches = new Map();
-
-var windowSettings = new Map();
-var windowPatches = new Map();
-
-const initSetting =
-      (m, data) => _.forEach(data,(value,key) => m.set(key,value));
-
-// initial values => synchronized event
-const syncSettings = () => {
-  const fullSettings = ipcRenderer.sendSync('dome.ipc.settings.sync');
-  initSetting( globalSettings, fullSettings.globals );
-  initSetting( windowSettings, fullSettings.settings );
-};
-
-const readSetting = ( local, key, defaultValue ) => {
-  const store = local ? windowSettings : globalSettings;
-  const value = store.get(key);
-  return value === undefined ? defaultValue : value ;
-};
-
-const writeSetting = ( local, key, value ) => {
-  const store = local ? windowSettings : globalSettings;
-  const patches = local ? windowPatches : globalPatches;
-  if (value === undefined) {
-    store.delete(key);
-    patches.set(key,null);
-  } else {
-    store.set(key,value);
-    patches.set(key,value);
-  }
-  if (local) {
-    fireSaveSettings();
-  } else {
-    emitter.emit('dome.settings');
-    fireSaveGlobals();
-  }
-};
-
-const flushPatches = (m) => {
-  if (m.size > 0) {
-    const args = [];
-    m.forEach((value,key) => {
-      args.push({ key, value });
-    });
-    m.clear();
-    return args;
-  }
-  return undefined;
-};
-
-const fireSaveSettings = _.debounce(
-  () => {
-    const args = flushPatches(windowPatches);
-    args && ipcRenderer.send( 'dome.ipc.settings.window', args ) ;
-  }, 100
-);
-
-const fireSaveGlobals = _.debounce(
-  () => {
-    const args = flushPatches(globalPatches);
-    args && ipcRenderer.send( 'dome.ipc.settings.global', args ) ;
-  }, 100
-);
-
-ipcRenderer.on('dome.ipc.closing', (_evt) => {
-  fireSaveSettings();
-  fireSaveSettings.flush();
-  fireSaveGlobals();
-  fireSaveGlobals.flush();
-  System.doExit();
-});
-
-/** @event 'dome.settings'
-    @description Emitted when the global settings have been updated. */
-
-/** @event 'dome.defaults'
-    @description Emitted when the window settings have re-initialized. */
-
-ipcRenderer.on('dome.ipc.settings.defaults',(sender) => {
-  fireSaveSettings.cancel();
-  fireSaveGlobals.cancel();
-  windowPatches.clear();
-  globalPatches.clear();
-  windowSettings.clear();
-  globalSettings.clear();
-  emitter.emit('dome.settings');
-  emitter.emit('dome.defaults');
-});
-
-ipcRenderer.on('dome.ipc.settings.update',(sender,patches) => {
-  patches.forEach(({ key, value }) => {
-    // Don't cancel local updates
-    if (!globalPatches.has(key)) {
-      if (value === null)
-        globalSettings.delete(key);
-      else
-        globalSettings.set(key,value);
-    }
-  });
-  emitter.emit('dome.settings');
-});
-
-/**
-    @summary Get value from local window (persistent) settings.
-    @param {string} [key] -  User's Setting Key (`'dome.*'` are reserved keys)
-    @param {any} [defaultValue] - default value if the key is not present
-    @return {any} associated value of object or `undefined`.
-    @description
-    This settings are local to the current window, but persistently
-    saved in the user's home directory.<br/>
-    For global application settings, use `getGlobal()` instead.
-*/
-export function getWindowSetting( key, defaultValue ) {
-  return key ? readSetting( true, key , defaultValue ) : defaultValue ;
-}
-
-/** @summary Set value into local window (persistent) settings.
-    @param {string} [key] to store the data
-    @param {any} value associated value or object
-    @description
-    This settings are local to the current window, but persistently
-    saved in the user's home directory.<br/>
-    For global application settings, use `setGlobal()` instead.
-*/
-export function setWindowSetting( key , value ) {
-  key && writeSetting( true, key, value );
-}
-
-/**
-    @summary Get value from application (persistent) settings.
-    @param {string} key User's Setting Key (`'dome.*'` are reserved keys)
-    @param {any} [defaultValue] - default value if the key is not present
-    @return {any} associated value of object or `undefined`.
-    @description
-    These settings are global to the application and persistently
-    saved in the user's home directory.<br/>
-    For local window settings, use `get()` instead.
-*/
-export function getGlobalSetting( key, defaultValue ) {
-  return key ? readSetting( false, key , defaultValue ) : defaultValue ;
-}
-
-/** @summary Set value into application (persistent) settings.
-    @param {string} key to store the data
-    @param {any} value associated value or object
-    @description
-    These settings are global to the current window, but persistently
-    saved in the user's home directory. Updated values are broadcasted
-    in batch to all other windows,
-    which in turn receive a `'dome.settings'`
-    event for synchronizing.<br/>
-    For local window settings, use `set()` instead.
-*/
-export function setGlobalSetting( key , value ) {
-  writeSetting( false, key, value );
-}
-
-// --------------------------------------------------------------------------
-// --- Focus Management
-// --------------------------------------------------------------------------
-
-/** Current focus state of the main window. */
-export function isFocused() { return focus; }
-
-/**
-    @event 'dome.focus'
-    @param {boolean} state - updated focus state
-    @description Emitted when the application gain or loses focus.
-*/
-ipcRenderer.on('dome.ipc.focus',(sender,value) => {
-  focus = value;
-  setContextAppNode();
-  emitter.emit('dome.focus',value);
-});
-
-// --------------------------------------------------------------------------
-// --- Web Navigation
-// --------------------------------------------------------------------------
-
-/**
-    @event 'dome.href'
-    @param {string} href - internal `<a href=...>` target
-    @description
-    Emitted when the user clicks on a local `<a href=...>`.
-    URL with an `http://` protocole are opened externally
-    by the user's default browser.
-*/
-ipcRenderer.on('dome.ipc.href',(href) => emitter.emit('dome.href',href));
-
-// --------------------------------------------------------------------------
-// --- Function Component
-// --------------------------------------------------------------------------
-
-/**
-   @summary Inlined Function React Component.
-   @property {function} children - render function as children
-   @description
-   Allows to define an inlined functional component inside JSX.
-   The children function _can_ use hooks.
-
-@example
-<Render>
-   {() => {
-        let [ state, setState ] = React.useState();
-        …
-        return (<div>…</div>);
-   }}
-</Render>
-*/
-export const Render = ({children}) => {
-  return children();
-};
-
-// --------------------------------------------------------------------------
-// --- React Hooks
-// --------------------------------------------------------------------------
-
-/**
-   @summary Hook to re-render on demand (Custom React Hook).
-   @return {function} to trigger re-rendering
-   @description
-   Returns a callback to trigger a render on demand.
-*/
-export function useForceUpdate()
-{
-  const [tac,onTic] = React.useState();
-  return () => onTic(!tac);
-}
-
-/**
-   @summary Hook to re-render on Dome events (Custom React Hook).
-   @param {string} [event,...] - event names (default: `'dome.update'`)
-   @description
-   Returns nothing.
-*/
-export function useUpdate(...evts)
-{
-  const update = useForceUpdate();
-  React.useEffect(() => {
-    const trigger = () => setImmediate(update);
-    if (evts.length == 0) evts.push('dome.update');
-    evts.forEach((evt) => emitter.on(evt,trigger));
-    return () => evts.forEach((evt) => emitter.off(evt,trigger));
-  });
-}
-
-/**
-   @summary Hook to register callbacks to Dome events (Custom React Hook).
-   @param {string} event - Event to register on
-   @param {function} callback - The callback to register
-   @description
-   Register the callback on event until the component is unmount.
-   Do not force the component to re-render (unless the callback does).<br/>
-   Returns nothing.
-*/
-export function useEvent(evt,callback)
-{
-  React.useEffect(() => {
-    emitter.on(evt,callback);
-    return () => emitter.off(evt,callback);
-  });
-}
-
-/**
-   @summary Hook to register callbacks to events (Custom React Hook).
-   @param {EventEmitter} emitter - event emitter
-   @param {string} event - Event to register on
-   @param {function} callback - The callback to register
-   @description
-   Register the callback on event until the component is unmount.
-   Do not force the component to re-render (unless the callback does).<br/>
-   Returns nothing.
-*/
-export function useEmitter(emitter,evt,callback)
-{
-  React.useEffect(() => {
-    emitter.on(evt,callback);
-    return () => emitter.off(evt,callback);
-  });
-}
-
-const NULL = {}; // Dummy initial value
-
-// --------------------------------------------------------------------------
-// --- Commands Hooks
-// --------------------------------------------------------------------------
-
-/**
-   @summary Hook for command-line interface (Custom React Hook).
-   @return {array} `[argv,wdir]` command-line arguments and working directory
-   @description
-   Returns the command-line arguments and working directory for the application
-   instance running in the window. Automatically updated on `dome.command` events.
-
-   See also [[onCommand]] event handler.
-*/
-export function useCommand() {
-  useUpdate('dome.command');
-  const wdir = System.getWorkingDir();
-  const argv = System.getArguments();
-  return [ argv , wdir ];
-}
-
-// --------------------------------------------------------------------------
-// --- Settings Hooks
-// --------------------------------------------------------------------------
-
-function useSettings( local, settings, defaultValue )
-{
-  const [ value, setValue ] =
-        React.useState(() => readSetting( local, settings, defaultValue ));
-  React.useEffect(() => {
-    let callback = () => {
-      let v = readSetting( local, settings , defaultValue );
-      setValue(v);
-    };
-    const event = local ? 'dome.defaults' : 'dome.settings' ;
-    emitter.on(event,callback);
-    return () => emitter.off(event, callback);
-  });
-  const doUpdate = (upd) => {
-    const theValue = typeof(upd)==='function' ? upd(value) : upd ;
-    if (settings) writeSetting( local, settings, theValue );
-    if (local) setValue(theValue);
-  };
-  return [ value, doUpdate ];
-}
-
-/**
-   @summary Local state with optional window settings (Custom React Hook).
-   @param {string} [settings] - optional window settings to backup the value
-   @param {any} [defaultValue] - the initial (and default) value
-   @return {array} `[value,setValue]` of the local state
-   @description
-   Similar to `React.useState()` with persistent _window_ settings.
-   When the settings key is undefined, it simply uses a local React state.
-   Also responds to `'dome.defaults'`.
-
-   The `setValue` callback accepts either a value, or a function to be applied
-   on current value.
-*/
-export function useState( settings, defaultValue )
-{
-  return useSettings( true, settings, defaultValue );
-}
-
-/**
-   @summary Local boolean state with optional window settings (Custom React Hook).
-   @param {string} [settings] - optional window settings to backup the value
-   @param {boolean} [defaultValue] - the initial value (default is `false`)
-   @return {array} `[value,flipValue]` for the local state
-   @description
-   Same as [useState](#.useState) with a boolean value that can be set or flipped:
-    - `flipValue()` change the value to its opposite;
-    - `flipValue(v)` change the value to `v`.
-*/
-export function useSwitch( settings, defaultValue=false )
-{
-  const [ value, update ] = useSettings( true, settings, defaultValue );
-  return [ value, v => update(v===undefined ? !value : v) ];
-}
-
-/**
-   @summary Local state with global settings (Custom React Hook).
-   @param {string} settings - global settings for storing the value
-   @param {any} [defaultValue] - the initial and default value
-   @return {array} `[value,setValue]` of the local state
-   @description
-   Similar to `React.useState()` with persistent _global_ settings.
-   When the settings key is undefined, it simply uses a local React state.
-   Also responds to `'dome.settings'` to update the state.
-
-   The `setValue` callback accepts either a value, or a function to be applied
-   on current value.
-*/
-export function useGlobalSetting( settings, defaultValue )
-{
-  return useSettings( false, settings, defaultValue );
-}
-
-// --------------------------------------------------------------------------
-// --- Global States
-// --------------------------------------------------------------------------
-
-/** @event 'dome.state.update'
-    @description
-    Notify updates within a State object.
-*/
-
-const STATE_UPDATE = 'dome.state.update' ;
-
-/**
-  @summary Global state object.
-  @property {object} state - the current state properties
-  @property {object} defaults - the default state properties
-  @description
-
-You may use this class as convenient way to implement global
-state for your Dome application. Simply create a state `s` with `new State(defaults)`
-and use `s.setState()`, `s.getState()` or `s.state` property, and `s.useState()`
-custom hooks.
-
-A state is also an event emitter that you can use to fire events, and you can use
-the React custom hooks `s.useUpdate()` and `s.useEvent()`.
-
-All above methods are bound to `this` by the constructor.
-
-*/
-export class State extends EventEmitter
-{
-
-  constructor(props) {
-    super();
-    // Makes this field private
-    this.defaults = props ;
-    this.state = Object.assign( {}, props );
-    this.update = this.update.bind(this);
-    this.getState = this.getState.bind(this);
-    this.setState = this.setState.bind(this);
-    this.clearState = this.clearState.bind(this);
-    this.replaceState = this.replaceState.bind(this);
-    this.useState = this.useState.bind(this);
-    this.useEvent = this.useEvent.bind(this);
-    this.useUpdate = this.useUpdate.bind(this);
-  }
-
-  /** Emits the `dome.state.update` event */
-  update() { this.emit('dome.state.update'); }
-
-  /** Returns the state property. */
-  getState() { return this.state; }
-
-  /** @summary Update the state with (some) properties.
-      @param {object} props - the properties to be updated
-      @description
-      Update the state with `Object.assign`, like `setState()` on React components.
-      Also fire the `'dome.update'` property on the object. */
-  setState(props) {
-    Object.assign( this.state, props );
-    this.update();
-  }
-
-  /** @summary Replace (all) state properties.
-      @description
-      Replace the entire store with the new properties.
-      Also fire the `'dome.update'` property on the object. */
-  replaceState(props) {
-    this.state = Object.assign( {}, props );
-    this.update();
-  }
-
-  /** @summary Reset (all) state properties.
-      @description
-      Restore the entire store with the default properties.
-      Also fire the `'dome.state.update'` property on the object. */
-  clearState() {
-    this.state = Object.assign( {}, this.defaults );
-    this.update();
-  }
-
-  /** @summary Hook to use the state (custom React Hook).
-      @return {array} `[state,setState]` with current object properties and
-      function to update them. */
-  useState() {
-    let forceUpdate = useForceUpdate();
-    useEmitter( this, 'dome.state.update', forceUpdate );
-    return [ this.state , this.setState ];
-  }
-
-  /** @summary Hook to re-render your component on State events.
-      @param {string} [event] - the event to listen to (defaults to `'dome.update'`)
-  */
-  useUpdate(evt = 'dome.state.update') {
-    let forceUpdate = useForceUpdate();
-    useEmitter( this, evt, forceUpdate );
-  }
-
-  /** @summary Hook to trigger callbacks on State events.
-      @param {string} event - the event to listen to
-      @param {function} callback - the callback triggered on event
-  */
-  useEvent(evt,callback) {
-    useEmitter( this, evt, callback );
-  }
-
-}
-
-// --------------------------------------------------------------------------
-// --- Timer Hooks
-// --------------------------------------------------------------------------
-
-// Collection of { pending, timer, period, time, event } indexed by period
-const clocks = {};
-
-const CLOCKEVENT = (period) => 'dome.clock.' + period ;
-
-const TIC_CLOCK = (clk) => () => {
-  if (0 < clk.pending) {
-    clk.time += clk.period ;
-    emitter.emit(clk.event,clk.time);
-  } else {
-    clearInterval(clk.timer);
-    delete clocks[clk.period];
-  }
-};
-
-const INC_CLOCK = (period) => {
-  let clk = clocks[period] ;
-  if (!clk) {
-    let event = CLOCKEVENT(period);
-    let time = (new Date()).getTime();
-    clk = { pending: 0, time, period, event };
-    clocks[period] = clk ;
-    let tic = TIC_CLOCK(clk);
-    clk.timer = setInterval(tic,period);
-  }
-  clk.pending++;
-};
-
-const DEC_CLOCK = (period) => {
-  let clk = clocks[period] ;
-  if (clk) {
-    clk.pending--;
-  }
-};
-
-/**
-   @summary Synchronized start & stop timer (Custom React Hook).
-   @param {number} period - timer interval, in milliseconds (ms)
-   @param {boolean} [initStart] - whether to initially start the timer (default is `false`)
-   @return {timer} Timer object
-   @description
-   Create a local timer, synchronized on a global clock, that can be started
-   and stopped on demand during the life cycle of the component.
-
-   Each timer has its individual start & stop state. However,
-   all timers with the same period _are_ synchronized with each others.
-
-   The timer object has the following properties and methods:
-   - `timer.start()` starts the timer,
-   - `timer.stop()` starts the timer,
-   - `timer.time` is the time stamp of the last clock (see below)
-
-   It is safe to call `start()` and `stop()` whether the timer is running or not.
-   When `timer.time` is `-1`, it means the timer is stopped.
-   When `timer.time` is `0` it means the timer has just been started and no tic has
-   been received yet. The time stamp is in milliseconds; it is shared among all
-   timers synchronized on the same period and roughly equal to the `Date.getTime()`
-   of the associated clock.
-
- */
-
-export function useClock(period,initStart)
-{
-  const [time,setTime] = React.useState(initStart ? 0 : -1);
-  const running = 0 <= time ;
-  React.useEffect(() => {
-    if (running) {
-      INC_CLOCK(period);
-      const event = CLOCKEVENT(period);
-      emitter.on(event,setTime);
-      return () => {
-        DEC_CLOCK(period);
-        emitter.off(event,setTime);
-      };
-    } else
-      return undefined ;
-  });
-  return {
-    time,
-    start: () => { if (!running) setTime(0); },
-    stop: () => { if (running) setTime(-1); }
-  };
-}
-
-// --------------------------------------------------------------------------
-// --- Pretty Printing (Browser Console)
-// --------------------------------------------------------------------------
-
-export class PP {
-  constructor(moduleName) {
-    this.moduleName = moduleName;
-  }
-  log(...args) { console.log(`[${this.moduleName}]`,...args); }
-  warn(...args) { console.warn(`[${this.moduleName}]`,...args); }
-  error(...args) { console.error(`[${this.moduleName}]`,...args); }
-}
-
-// --------------------------------------------------------------------------
diff --git a/ivette/src/dome/src/renderer/frame/sidebars.js b/ivette/src/dome/src/renderer/frame/sidebars.js
deleted file mode 100644
index 6fcd8e42a50b7fca2f0dff2261ebd09b4daf413b..0000000000000000000000000000000000000000
--- a/ivette/src/dome/src/renderer/frame/sidebars.js
+++ /dev/null
@@ -1,214 +0,0 @@
-// --------------------------------------------------------------------------
-// --- SideBars
-// --------------------------------------------------------------------------
-
-/**
-   @packageDocumentation
-   @module dome/frame/sidebars
-*/
-
-import React from 'react' ;
-import * as Dome from 'dome' ;
-import { Badge } from 'dome/controls/icons' ;
-import { Label } from 'dome/controls/labels' ;
-
-import './style.css' ;
-
-const SideBarContext = React.createContext();
-
-// --------------------------------------------------------------------------
-// --- SideBar Container
-// --------------------------------------------------------------------------
-
-/**
-   @summary Container for sidebar items.
-   @property {Elements} [children] - Side bar items
-   @property {string} [settings] - Side bar items settings
-   @property {string} [selection] - Current item selection
-   @property {function} [onSelection] - Selection callback
-   @property {function} [onContextMenu] - Context Menu callback
-   @description
-
-   When a base settings is set on the sidebar, all contained
-   sections and items are attributed derived settings based on their identifiers.
-
-   The global selection state and callback are also propagated to the side bar items.
- */
-export const SideBar = ({ children , ...props }) => (
-  <div className="dome-xSideBar dome-color-frame">
-    <SideBarContext.Provider value={props}>
-      {children}
-    </SideBarContext.Provider>
-  </div>
-);
-
-const makeSettings = ( globalSettings, { settings, label, id } ) => {
-  if (settings) return settings ;
-  if (globalSettings) {
-    let localId = id || label ;
-    if (localId)
-      return globalSettings + '.' + localId ;
-  }
-  return undefined ;
-};
-
-// --------------------------------------------------------------------------
-// --- Badges Specifications
-// --------------------------------------------------------------------------
-
-const makeBadge = ((element) => {
-  switch(typeof(element)) {
-  case 'number':
-  case 'string':
-    return <Badge value={element}/>;
-  default:
-    return element ;
-  }
-});
-
-// --------------------------------------------------------------------------
-// --- SideBar Section Hide/Show Button
-// --------------------------------------------------------------------------
-
-const HideShow = (props) => (
-  <label className='dome-xSideBarSection-hideshow dome-text-label'
-         onClick={props.onClick} >
-    {props.visible ? 'Hide' : 'Show'}
-  </label>
-);
-
-// --------------------------------------------------------------------------
-// --- SideBar Section
-// --------------------------------------------------------------------------
-
-const disableAll = (children) =>
-      React.Children.map( children , (elt) => React.cloneElement( elt , { disabled: true } ) );
-
-/**
-   @summary Sidebar Section.
-   @property {string} [id] - Section identifier (used for derived settings)
-   @property {string} label - **Section label**
-   @property {string} [title] - Section short description (label tooltip)
-   @property {boolean} [enabled] - Enabled section (by default)
-   @property {boolean} [disabled] - Disabled section (not by default)
-   @property {boolean} [unfold] - Fold/unfold local state (default to local state)
-   @property {string} [settings] - Fold/unfold window settings (local state)
-   @property {boolean} [defaultUnfold] - Fold/unfold default state (default is `true`)
-   @property {Badge} [summary] - Badge summary (when content is hidden)
-   @property {Item[]} children - Content items
-   @description
-
-   Unless specified, sections can be hidden on click. When items in the section have badge(s)
-   it is highly recommended to provide a badge summary to be displayed
-   when the content is hidden.
-
-   Sections with no items are not displayed.
-*/
-export function Section(props) {
-
-  const context = React.useContext( SideBarContext );
-  const [ state=true, setState ] = Dome.useState(
-    makeSettings(context.settings,props),
-    props.defaultUnfold
-  );
-  const { enabled=true, disabled=false, unfold, children } = props ;
-
-  if (React.Children.count(children) == 0) return null;
-
-  const dimmed = context.disabled || disabled || !enabled ;
-  const foldable = unfold === undefined ;
-  const visible = foldable ? state : unfold ;
-  const onClick = foldable ? (() => setState(!state)) : undefined ;
-  const maxHeight = visible ? 'max-content' : 0 ;
-  const subContext = Object.assign( {}, context, { disabled: dimmed } );
-
-  return (
-    <div className='dome-xSideBarSection'>
-      <div className='dome-xSideBarSection-title' title={props.label}>
-        <Label className={ dimmed ? 'dome-disabled' : '' } label={props.label} />
-        {!visible && React.Children.map(props.summary,makeBadge)}
-        {foldable && <HideShow visible={visible} onClick={onClick}/>}
-      </div>
-      <div className='dome-xSideBarSection-content' style={{ maxHeight }}>
-        <SideBarContext.Provider value={subContext}>
-          {children}
-        </SideBarContext.Provider>
-      </div>
-    </div>
-  );
-}
-
-// --------------------------------------------------------------------------
-// --- SideBar Items
-// --------------------------------------------------------------------------
-
-/**
-   @summary Sidebar Section Items.
-   @property {string} [id] - Item identifier
-   @property {string} [label] - **Item label**
-   @property {string} [icon] - Item icon
-   @property {string} [title] - Item tooltip
-   @property {boolean} [enabled] - Enabled item (default is `true`)
-   @property {boolean} [disabled] - Disabled item (default is `false`)
-   @property {boolean} [selected] - Item selection state (default is `SideBar` selection)
-   @property {function} [onSelection] - Selection callback
-   @property {function} [onContextMenu] - Context Menu callback
-   @property {Badge} [badge] - Badge element(s)
-   @property {React.Children} [children] - Item additional content
-   @description
-
-   The item will be highlighted if selected _via_ the `selection` property of the
-   englobing sidebar. The `onSelection` and `onContextMenu` callbacks are invoked with the item identifier.
-   Context menu callback also triggers the selection callback (first).
-   In case callbacks are defined from the englobing sidebar, both are invoked.
-
-   Badges can be single or multiple [[Badge]] values.
-   They are displayed stacked on the right edge of the item.
-
-**/
-export function Item(props)
-{
-  const { selection,
-          disabled: disabledSection,
-          onSelection: ctxtOnSelect,
-          onContextMenu: ctxtOnPopup
-        } = React.useContext(SideBarContext);
-  const { id, selected,
-          disabled=false, enabled=true,
-          onSelection:itemOnSelect,
-          onContextMenu:itemOnPopup
-        } = props ;
-  const isDisabled = disabled || !enabled || disabled ;
-  const isSelected = selected !== undefined ? selected : (selection && id && (selection === id)) ;
-  const onClick = isDisabled ? undefined : () => {
-    itemOnSelect && itemOnSelect(id);
-    ctxtOnSelect && ctxtOnSelect(id);
-  };
-  const onContextMenu = isDisabled ? undefined : () => {
-    onClick();
-    itemOnPopup && itemOnPopup(id);
-    ctxtOnPopup && ctxtOnPopup(id);
-  };
-  const classes = 'dome-xSideBarItem'
-        + ( isSelected ? ' dome-active' : ' dome-inactive' )
-        + ( isDisabled ? ' dome-disabled' : '' );
-  return (
-    <div className={classes} title={props.title}
-         onContextMenu={onContextMenu}
-         onClick={onClick}>
-      <Label icon={props.icon} label={props.label} />
-      {props.children}
-      {React.Children.map(props.badge,makeBadge)}
-    </div>
-  );
-}
-
-// --------------------------------------------------------------------------
-
-import { register } from 'dome/misc/register' ;
-
-register( SideBar, 'DOME_SIDEBAR' );
-register( Section, 'DOME_SIDEBAR_ITEM' );
-register( Item,    'DOME_SIDEBAR_ITEM' );
-
-// --------------------------------------------------------------------------
diff --git a/ivette/src/dome/src/renderer/frame/tabs.js b/ivette/src/dome/src/renderer/frame/tabs.js
deleted file mode 100644
index fe89a5691e857ff128406b1d2af3b85e5a780be5..0000000000000000000000000000000000000000
--- a/ivette/src/dome/src/renderer/frame/tabs.js
+++ /dev/null
@@ -1,127 +0,0 @@
-// --------------------------------------------------------------------------
-// --- Tabs
-// --------------------------------------------------------------------------
-
-/**
-   @packageDocumentation
-   @module dome/frame/tabs
-*/
-
-import React from 'react' ;
-import { Icon } from 'dome/controls/icons' ;
-
-import './style.css' ;
-
-/**
-   @class
-   @summary Pure Container for tab buttons.
-   @description
-   Shall contains only [[Tab]] instances.
-*/
-// --------------------------------------------------------------------------
-// --- Tabs Bar
-// --------------------------------------------------------------------------
-
-export function TabsBar(props) {
-  return (
-    <div className='dome-xTabsBar dome-color-frame'>
-      {props.children}
-    </div>
-  );
-}
-
-// --------------------------------------------------------------------------
-// --- Single Tab
-// --------------------------------------------------------------------------
-
-const VISIBLE = { display: 'block' };
-const HIDDEN  = { display: 'none' };
-
-/**
-   @class
-   @summary Pure Component for rendering a tab button.
-   @property {string} [id] - tab's identifier
-   @property {component} [label] - tab's label
-   @property {string} [title] - tab's tooltip
-   @property {string} [closing] - closing button's tooltip (defaults to `"Close Tab"`)
-   @property {string} [selection] - Currently selected tab identifier
-   @property {function} [onSelection] - selection callcack, feed with value
-   @property {function} [onClose] - selection callcack, feed with value
-   @property {boolean} [default] - if `true`, selected tab by default
-   @property {boolean} [content] - render content instead of tab
-   @description
-   A single tab selector. Shall only be used as a children
-   of [[TabsBar]].
-
-   When `content` is positionned, the component renders
-   its content children instead of the tab button. In such a case, content
-   is displayed only when selected.
-
-   __Remark__: on Mac OSX, the close button appears on the left-side of the tab.
-*/
-
-export function Tab(props) {
-  const selected = props.id === props.selection ;
-  if (props.content) {
-    //--- Content Rendering
-    const style = selected ? VISIBLE : HIDDEN ;
-    return (
-      <div className='dome-xTab-content dome-container' style={style}>
-        {props.children}
-      </div>
-    );
-  } else {
-    //--- Tab Rendering
-    const onClick = props.onSelection && (() => props.onSelection(props.id));
-    const onClose = props.onClose && (() => props.onClose(props.id));
-    var closing = onClose ? (
-      <Icon className="dome-xTab-closing"
-            title={props.closing || "Close Tab"}
-            name="CROSS" onClick={onClose} />
-    ) : undefined ;
-    const classes = 'dome-xTab' + ( selected ? ' dome-active' : ' dome-inactive' ) ;
-    return (
-      <label
-        className={classes} title={props.title} onClick={onClick}>
-        {props.label}
-        {closing}
-      </label>
-    );
-  }
-}
-
-// --------------------------------------------------------------------------
-// --- TabsPane
-// --------------------------------------------------------------------------
-
-/**
-   @class
-   @summary Pure Container for tab contents.
-   @property {string} selection - tab identifier to render
-   @property {Tab[]} children - tabs (content) to render
-   @description
-   Shall contains [[Tab]] instances.
-   Only the selected tab identifier will be displayed, although all tab
-   contents remains properly mounted. If no tab is selected,
-   no content is displayed.
-*/
-
-export function TabsPane({ selection, children }) {
-  const showTab = (elt) => React.cloneElement(elt, { content: true, selection });
-  return (
-    <React.Fragment>
-      {React.Children.map(children , showTab)}
-    </React.Fragment>
-  );
-}
-
-// --------------------------------------------------------------------------
-// --- Dome Class (private)
-// --------------------------------------------------------------------------
-
-import { register } from 'dome/misc/register' ;
-
-register(TabsBar, 'DOME_TABSBAR');
-register(Tab,     'DOME_TABSBAR_ITEM');
-
-// --------------------------------------------------------------------------
diff --git a/ivette/src/dome/src/renderer/frame/toolbars.js b/ivette/src/dome/src/renderer/frame/toolbars.js
deleted file mode 100644
index a34a6c5f091d6e4639b93d8223b89127d5acf753..0000000000000000000000000000000000000000
--- a/ivette/src/dome/src/renderer/frame/toolbars.js
+++ /dev/null
@@ -1,190 +0,0 @@
-// --------------------------------------------------------------------------
-// --- ToolBars
-// --------------------------------------------------------------------------
-
-/**
-   @packageDocumentation
-   @module dome/frame/toolbars
-*/
-
-import React from 'react' ;
-
-import './style.css' ;
-
-// --------------------------------------------------------------------------
-// --- ToolBar Container
-// --------------------------------------------------------------------------
-
-/**
-   @class
-   @summary Container for toolbar items.
- */
-export class ToolBar extends React.Component {
-
-  constructor(props) {
-    super(props);
-  }
-
-  render() {
-    const children = this.props.children ;
-    return React.Children.count(children) > 0 && (
-      <div className='dome-xToolBar dome-color-frame'>
-        <div className='dome-xToolBar-inset'/>
-        {children}
-        <div className='dome-xToolBar-inset'/>
-      </div>
-    );
-  }
-
-}
-
-// --------------------------------------------------------------------------
-// --- ToolBar Spaces
-// --------------------------------------------------------------------------
-
-/**
-   @summary Fixed (tiny) space.
-*/
-export const Inset = (() => <div className='dome-xToolBar-inset'/>);
-
-/**
-   @summary Fixed space.
-*/
-export const Space = (() => <div className='dome-xToolBar-space'/>);
-
-/**
-   @summary Extensible space (can be used to right-align controls).
-*/
-export const Filler = (() => <div className='dome-xToolBar-filler'/>);
-
-/**
-   @summary Vertical rule.
-*/
-export const Separator = () => (
-  <div className='dome-xToolBar-separator'>
-    <div className='dome-xToolBar-vrule'/>
-  </div>
-);
-
-// --------------------------------------------------------------------------
-// --- ToolBar Button
-// --------------------------------------------------------------------------
-
-import { SVG } from 'dome/controls/icons' ;
-
-const SELECT = 'dome-xToolBar-Control dome-selected' ;
-const BUTTON = 'dome-xToolBar-Control dome-color-frame' ;
-const KIND = (kind) => kind ? ' dome-xToolBar-' + kind : '';
-
-const isSelected = ( { selected , selection , value } ) => (
-  selected !== undefined ? selected : ( value !== undefined && value === selection )
-);
-
-const isDisabled = ( { enabled=true, disabled=false } ) => (disabled || !enabled) ;
-const onClick = ( { onClick , value } ) => onClick ? (() => onClick(value)) : undefined ;
-
-/**
-   @summary Toolbar Button.
-   @property {string} [icon] - Button icon name (See [gallery](gallery-icons.html))
-   @property {string} [label] - Button label
-   @property {string} [title] - Button tooltip
-   @property {string} [kind] - Styled button (see below)
-   @property {boolean} [selected] - Selected button (default: `false`)
-   @property {boolean} [disabled] - Disabled button (default: `false`)
-   @property {boolean} [enabled] - Enabled button (default: `true`)
-   @property {any} [value] - button's value
-   @property {any} [selection] - Currently selected value
-   @property {function} [onClick] - Button callback (receives the current value)
-   @description
-
-   By default, the propery `selected` is computed from properties `value`
-   and `selection`, when provided.
-
-   The callback is given the `value` property, if any.
-
-   The different available kinds for styling a (non-selected) button are:
-   - `'default'`: normal button;
-   - `'cancel'`: normal button, in dark grey;
-   - `'warning'`: warning button, in orange;
-   - `'positive'`: positive button, in green;
-   - `'negative'`: negative button, in red.
-
-*/
-export const Button = ( props ) => (
-  <button
-    disabled={isDisabled(props)}
-    className={isSelected(props) ? SELECT : (BUTTON + KIND(props.kind))}
-    onClick={onClick(props)}
-    title={props.title}
-    >
-    {props.icon && <SVG id={props.icon} />}
-    {props.label && <label>{props.label}</label>}
-  </button>
-);
-
-// --------------------------------------------------------------------------
-// --- ToolBar Button Group
-// --------------------------------------------------------------------------
-
-/**
-   @summary Toolbar Button Group.
-   @property {Button[]} children - Buttons in the group
-   @property {any} [value] - Passed to children as `selection` property
-   @property {any} [onChange] - Passed to children as `onClick` property
-   @property {any} [...props] - Properties passed to all children
-*/
-export const ButtonGroup = (props) => {
-  const { children, value, onChange, ...otherProps } = props;
-  if (value !== undefined) otherProps.selection = value;
-  if (onChange !== undefined) otherProps.onClick = onChange;
-  return (
-    <div className='dome-xToolBar-Group'>
-      {React.Children.map(children, (elt) => React.cloneElement(elt, otherProps))}
-    </div>
-  );
-};
-
-// --------------------------------------------------------------------------
-// --- ToolBar Menu
-// --------------------------------------------------------------------------
-
-/**
-   @summary Toolbar Selector Menu.
-   @property {any} [value] - selected option's value
-   @property {function} [onChange] - selection callback (receives option value)
-   @property {boolean} [disabled] - disable the selector (default: `false`)
-   @property {boolean} [enabled] - enable the selector (default: `true`)
-   @property {option[]} children - Array of menu options
-   @description
-
-   Behaves likes a standard `<select>` element, except that callback directly
-   receives the select value, not the entire event.
-
-   The list of options shall be given with standard `<option value={...} label={...}>`
-   elements.
-
-*/
-export const Select = (props) => (
-  <select className='dome-xToolBar-Control dome-color-frame'
-          value={props.value}
-          disabled={isDisabled(props)}
-          onChange={(props.onChange && ((evt) => props.onChange(evt.target.value)))}
-    >
-    {props.children}
-  </select>
-);
-
-// --------------------------------------------------------------------------
-// --- Export & Registration
-// --------------------------------------------------------------------------
-
-import { register } from 'dome/misc/register' ;
-
-register( ToolBar, 'DOME_TOOLBAR' );
-register( Inset ,  'DOME_TOOLBAR_ITEM' );
-register( Space ,  'DOME_TOOLBAR_ITEM' );
-register( Separator ,  'DOME_TOOLBAR_ITEM' );
-register( Filler , 'DOME_TOOLBAR_ITEM' );
-register( Button , 'DOME_TOOLBAR_ITEM' );
-
-// --------------------------------------------------------------------------
diff --git a/ivette/src/dome/src/renderer/layout/dispatch.js b/ivette/src/dome/src/renderer/layout/dispatch.js
deleted file mode 100644
index 1e02c53c0c8529ef1c1cee74572572a384e0e7a4..0000000000000000000000000000000000000000
--- a/ivette/src/dome/src/renderer/layout/dispatch.js
+++ /dev/null
@@ -1,114 +0,0 @@
-// --------------------------------------------------------------------------
-// --- Dispatch Layout
-// --------------------------------------------------------------------------
-
-/**
-   @packageDocumentation
-   @module dome/layout/dispatch
-   @description
-
-   This module allows to declare components anywhere in a component hierarchy
-   and to render them a totally different place.
-
-   You shall wrap dispatched components inside a `<Dispatch.Item>` container,
-   and render them wherever you want with `<Dispatch.Render>`. Each target
-   place can display only one uniquely identified item.
-
-   This can be also used to display some item among many in one unique place.
-*/
-
-import _ from 'lodash' ;
-import React from 'react';
-import * as Dome from 'dome' ;
-
-// --------------------------------------------------------------------------
-// --- Global Dispatcher
-// --------------------------------------------------------------------------
-
-const EVENT = (id) => 'dome.dispatch.' + id ;
-const ITEMS = {};
-
-const getItem = (id) => {
-  let item = ITEMS[id];
-  if (!item) item = ITEMS[id] = {
-    id, evt: EVENT(id)
-  };
-  return item;
-};
-
-const trigger = (item) => {
-  if (item.rendered) {
-    item.rendered = false ;
-    setImmediate(() => Dome.emit(item.evt));
-  }
-};
-
-const setItem = (id,children) => {
-  let item = getItem(id);
-  item.content = children ;
-  trigger(item);
-};
-
-const removeItem = (id) => {
-  let item = getItem(id);
-  item.content = null ;
-  trigger(item);
-};
-
-// --------------------------------------------------------------------------
-// --- Dispatched Items
-// --------------------------------------------------------------------------
-
-/**
-   @summary Define dispatched item.
-   @property {string} id - the item _global_ unique identifier
-   @property {React.Children} {children} - item contents
-   @description
-   Declare the content of some dispatched item.
-   Each item identifier shall be assigned once from the mounted
-   hierarchy of components. Otherwize, the content that would be
-   displayed is totally unpredictable.
-*/
-export function Item({ id, children })
-{
-  React.useEffect(() => {
-    setItem(id,children);
-    return () => removeItem(id);
-  });
-  return null;
-}
-
-// --------------------------------------------------------------------------
-// --- Render Targets
-// --------------------------------------------------------------------------
-
-/**
-   @summary Render dispatched item.
-   @property {string} id - the item _global_ unique identifier to render
-   @property {function|React.Children} {children} - conditional or alternative content (default: `null`)
-   @description
-   Render the content of some dispatched item.
-   In case multiple of rendering, the children elements would be shared
-   among several places, with unpredicatable behavior.
-
-   If the render element has a function as children, it is passed the content of the
-   item, or undefined. This allows for conditional rendering, depending on whether the item
-   has been specified somewhere in the hierarchy or not.
-
-   Otherwized, when the item is not specified, the render element display
-   its own content, if any.
-*/
-export function Render({ id, children=null })
-{
-  Dome.useUpdate(EVENT(id));
-  let item = getItem(id);
-  item.rendered = true ;
-  if (typeof(children)==='function')
-    return children(item.content);
-  else {
-    let content = item.content || children ;
-    return content && <React.Fragment>{content}</React.Fragment>;
-  }
-}
-
-// --------------------------------------------------------------------------
diff --git a/ivette/src/dome/src/renderer/layout/forms.js b/ivette/src/dome/src/renderer/layout/forms.js
deleted file mode 100644
index 3a0d3a9010bb3e786488577602e1960bd415d4e4..0000000000000000000000000000000000000000
--- a/ivette/src/dome/src/renderer/layout/forms.js
+++ /dev/null
@@ -1,1105 +0,0 @@
-// --------------------------------------------------------------------------
-// --- Form Layout
-// --------------------------------------------------------------------------
-
-/**
-   @packageDocumentation
-   @module dome/layout/forms
-*/
-
-import _ from 'lodash' ;
-import React from 'react' ;
-import * as Dome from 'dome' ;
-import { SVG } from 'dome/controls/icons' ;
-import { Checkbox, Radio, Select as Selector } from 'dome/controls/buttons' ;
-import './style.css' ;
-
-// --------------------------------------------------------------------------
-// --- Utilities
-// --------------------------------------------------------------------------
-
-const Context = React.createContext();
-
-const SELECT = (props,context) => props === undefined ? context : props ;
-const ACCESS = (props,context,path) => props === undefined ? _.get(context,path) : props ;
-const CONDITION = (context,cond,undef) => {
-  switch(typeof(cond)) {
-  case 'undefined':
-    return undef;
-  case 'string':
-  case 'array':
-    return _.get(context,cond);
-  default:
-    return cond;
-  }
-};
-
-const COMBINE = (a,b) => {
-  if (a === undefined) return b;
-  if (b === undefined) return a;
-  return (...args) => { a(...args); b(...args); };
-};
-
-const UPDATE = (value,error,path,callback) => callback &&
-      ((v,e) => {
-        let update = value || {} ;
-        _.set( update, path, v );
-        let errors ;
-        if (error || e) {
-          errors = error || {} ;
-          _.set( errors, path, e );
-          if (!_.find(errors))
-            errors = undefined;
-        }
-        callback(update,errors);
-      });
-
-const CHECK = (validate,v) => {
-  if (typeof(validate) === 'function')
-    return validate(v);
-  if (_.isRegExp(validate))
-    return validate.test(v);
-  return validate;
-};
-
-const ERROR = (validate,warning,v) => {
-  let ok = CHECK(validate,v);
-  switch(ok) {
-  case undefined:
-  case true:
-    return undefined ;
-  default:
-    return ok || warning ;
-  }
-};
-
-const VALIDATE = (validate,warning,callback) => {
-  if (!validate) return callback;
-  return ((v,e) => {
-    if (!callback) return;
-    else if (v===undefined || e) callback(v,e);
-    else {
-      let e = ERROR(validate,warning,v);
-      callback(v,e);
-    }
-  });
-};
-
-const RENDER = (children,context) => (
-  children ?
-    ( typeof(children)==='function'
-      ? children(context)
-      : children )
-    : null
-);
-
-const ONCHANGE = (onChange) =>
-      typeof(onChange)==='function'
-      ? (evt) => onChange(evt.target.value)
-      : undefined ;
-
-const CLASSES = (...args) => _.filter(args).join(' ');
-
-// --------------------------------------------------------------------------
-// --- Filtering DataFlow
-// --------------------------------------------------------------------------
-
-const FILTER_ERROR = (err) =>
-      err ? _.toString(err) : 'Invalid input, enter a new value to fix'
-;
-
-class FILTER extends React.Component
-{
-
-  constructor(props) {
-    super(props);
-    this.state = this.forward();
-    this.onChange = this.onChange.bind(this);
-    if (props.period)
-      this.backward = _.debounce(this.backward,props.period);
-  }
-
-  componentDidUpdate(prevProps) {
-    const props = this.props ;
-    if (props.value !== prevProps.value ||
-        props.error !== prevProps.error)
-      this.setState(this.forward());
-  }
-
-  onChange(value,error) {
-    this.setState({value,error});
-    this.backward(value,error);
-  }
-
-  forward() {
-    try {
-      const { input , value , error } = this.props ;
-      return { value: input ? input(value) : value, error };
-    } catch(err) {
-      return { value: undefined, error: FILTER_ERROR(err) };
-    }
-  };
-
-  backward(v,e)
-  {
-    const { output, onChange } = this.props ;
-    try {
-      if (output) v = output(v);
-    } catch(err) {
-      this.setState({error: FILTER_ERROR(err)});
-      return;
-    }
-    if (onChange) onChange(v,e);
-  }
-
-  render() {
-    const { disabled, children } = this.props ;
-    const { value, error } = this.state ;
-    const context = { onChange: this.onChange, disabled, value, error };
-    return (
-      <Context.Provider value={context}>
-        {RENDER(children,context)}
-      </Context.Provider>
-    );
-  }
-
-}
-
-// --------------------------------------------------------------------------
-// --- Generic Field
-// --------------------------------------------------------------------------
-
-const PERIOD = (latency) => {
-  switch(typeof(latency)) {
-  case 'undefined': return 0;
-  case 'number': return latency;
-  default:
-    return latency ? 600 : 0 ;
-  }
-};
-
-/**
-   @summary Generic context wrapper for field values.
-   @property {string} [path] - select a property in the context value (and error)
-   @property {any} [value] - set the inherited or edited value
-   @property {any} [error] - set the inherited or edited error
-   @property {function} [input] - pre-processing of input values (after `path` selection)
-   @property {function} [output] - post-processing of output values (before `path` update)
-   @property {function} [onChange] - callback for edited values and errors
-   @property {boolean|string|function} [disabled] - disabled field (default is `false`)
-   @property {boolean|string|function} [enabled] - conditional enabling (default is `true`)
-   @property {boolean|string|function} [visible] - conditional rendering (default is `true`)
-   @property {boolean|string|function} [hidden] - conditional hidding (default is `false`)
-   @property {boolean|regexp|function} [validate] - validation of the updated value
-   @property {string} [warning] - error message in case `validate` returns `false`
-   @property {boolean|number} [latency] - delay validation and propagation callbacks
-   @property {boolean} [state] - maintain a locally edited state (default is `false`)
-   @property {React.children|function} [children] - elements to render in the new context
-   @description
-
-Forms are based on a local context that can be modified by using this multi-purposed
-component. The local context consists of:
-- `value`: the currently edited value;
-- `error`: the last emitted error for this value;
-- `onChange(value[,error])`: the callback to be used on updates;
-- `disabled`: whether this value can be edited or not.
-
-Undefined properties are inherited from the context. If the `path` property is defined,
-the `<Select>` component extract the associated value and error from the inherited context.
-When both `path` and `value` properties are defined, the specified value takes the precedence.
-Access and updates of `path` are performed with the lodash `_.get()` and `_.set()` functions.
-Although, the `<Select>` might perform in-place modifications of previous object or array value.
-Use `_.cloneDeep()` to build a (recursive) copy of some value.
-
-Before being processed downward, the inherited or selected value can be transformed.
-The `input` function is applied on incomming value, and `output` function is applied
-on updated values.
-
-The specified callback `onChange` is invoked with the updated value and error. The callback
-inherited from the context is _also_ notified. When the `path` property is set,
-the contextual callback will be notified with the full context values and errors,
-updated with local changes to the selected path.
-
-The validation callback is invoked on updates. It shall return `undefined`
-or a string explaining why the value is invalid. Boolean are also accepted,
-leading to an error string defined by the `warning` property, which defaults to `"Invalid field"`.
-Alternatively, `validate` can be a regexp that is tested against the value.
-For instance, to accept only numbers, you can use `validate={/^[0-9]+$/}`
-and `warning='Must be a number'`.
-
-To avoid too many callback and validation checks, typically for text-based fields, it is possible to
-set a latency period before validating the input and emitting the callback. In such a case, a transient
-local state for value and error is maintained until the edited value is stabilized, before performing
-validation and upward propagation. The default lantency period is 600ms.
-
-It is possible to conditionally enabling, disabling or hiding the content by using
-the `disabled`, `enabled`, `visible` and `hidden` properties. They all can be boolean values,
-or path in or function of the inherited value. For instance, `<Select path='f.g' enabled='f.ok'/>`
-would allow to edit the value `value.f.g`, but disable edition when `value.f.ok` is falsy.
-Remark that if the inherited context is disabled, the selected content is disabled too.
-
-When latency, or input/output transformation are required, a local state is maintained.
-Otherwized, context and callbacks are propagated upward and backward. However, you can
-force this local state to be maintained by specifying the property `state` to `true`.
-This shall be used only at top-level for implementing a non-controlled component.
-
-*/
-export function Select({
-  path, latency,
-  defaultValue:def,
-  children, state,
-  ...props
-}) {
-  let context = React.useContext( Context );
-  if (!CONDITION(context.value,props.visible,true) ||
-      CONDITION(context.value,props.hidden,false))
-    return null;
-  let disabled = context.disabled
-      || CONDITION(context.value,props.disabled,false)
-      || !CONDITION(context.value,props.enabled,true);
-  let value,error,callback ;
-  if (path) {
-    value = ACCESS( props.value , context.value , path );
-    error = ACCESS( props.error , context.error , path );
-    if (!disabled)
-      callback = UPDATE(context.value,context.error,path,context.onChange);
-  } else {
-    value = SELECT( props.value , context.value );
-    error = SELECT( props.error , context.error );
-    if (!disabled)
-      callback = context.onChange;
-  };
-
-  let onChange ;
-  if (!disabled) {
-    onChange = VALIDATE( props.validate, props.warning,
-                         COMBINE(props.onChange,callback) );
-  }
-
-  if (props.validate && value && !error) {
-    error = ERROR( props.validate, props.warning, value );
-  }
-
-  let newContext = { value,error, disabled, onChange };
-  if (state || latency || props.input || props.output) {
-    return (
-      <FILTER period={PERIOD(latency)}
-              input={props.input}
-              output={props.output}
-              {...newContext}>
-        {children}
-      </FILTER>
-    );
-  } else
-    return (
-      <Context.Provider value={newContext}>
-        {RENDER(children,newContext)}
-      </Context.Provider>
-    );
-}
-
-// --------------------------------------------------------------------------
-// --- Form Container
-// --------------------------------------------------------------------------
-
-/**
-   @summary Form Container.
-   @property {string} [className] - Container additional class
-   @property {object} [style] - Container additional style
-   @property {object} [value] - Set the form context value
-   @property {object} [error] - Set the form context error
-   @property {boolean} [disabled] - Disables the form (default is `false`)
-   @property {onChange} [function] - Callback to updated `(value,error)`
-   @property {any} [...props] - [[Select]] properties
-   @property {React.children|function} [children] - Fields to populate the form
-   @description
-
-   Setup a form context with the provided values.
-   A local state is maintained unless you fully control the `value` and `error`
-   properties. You may also specify any other properties of the
-   [[Select]] filter component.
-
-*/
-
-export const Form = ({...props}) =>
-  (
-    <div className={CLASSES('dome-xForm-grid',props.className)}>
-      <Context.Provider value={{}}>
-        <Select state {...props}/>
-      </Context.Provider>
-    </div>
-  );
-
-// --------------------------------------------------------------------------
-// --- Generic Error Badge
-// --------------------------------------------------------------------------
-
-const ERROR_MSG = (error) => {
-  switch(typeof(error)) {
-  case 'undefined':
-    return undefined ;
-  case 'string':
-    return error;
-  case 'object':
-  case 'array':
-    var n = 0;
-    _.forEach(error,(err) => { if (err) n++; });
-    if (n==1) return 'Invalid field' ;
-    if (n>1) return n + ' Invalid fields' ;
-    return undefined ;
-  default:
-    return _.toString(error);
-  }
-};
-
-/**
-   @summary Warning badge with description.
-   @property {string} [warn] - the short message (hovered)
-   @property {number} [offset] - the label offset (Cf. field)
-   @property {any} [error] - the error description (in tooltip)
-   @property {full} [boolean] - full error message on error (no tooltip, default `false`)
-   @description
-   Display a warning badge with a tooltip when the `error` is not
-   undefined. Otherwize, renders nothing.
-*/
-export const Warning = ({full,warn,offset,error,width}) => {
-  let msg = ERROR_MSG(error);
-  return msg ? (
-    <div className='dome-xIcon dome-xForm-error'
-         style={{top: (offset-2)}} >
-      <SVG id='WARNING' size={11} title={full ? undefined : msg}/>
-      {(full
-        ? <span className='dome-xForm-warning' style={{width: 'max-content'}}>{msg}</span>
-        : <span className='dome-xForm-warning'>{warn}</span>
-       )}
-    </div>
-  ) : null ;
-};
-
-// --------------------------------------------------------------------------
-// --- Section Container
-// --------------------------------------------------------------------------
-
-const TITLE_ENABLED = 'dome-text-title' ;
-const TITLE_DISABLED = 'dome-text-title dome-disabled' ;
-
-/**
-   @summary Expandable Section sub-form.
-   @property {string} label - Section title
-   @property {string} [title] - Tooltip text
-   @property {string} [path] - Fields selection
-   @property {string} [settings] - User's settings for making fold/unfold state persistent
-   @property {boolean} [unfold] - Default fold/unfold state (default is `false`)
-   @property {any} [...props] - [[Select]] properties
-   @property {React.children|function} [children] - Section field content
-   @description
-   Wraps some fields inside a foldable section.
-   When unfolded, the section fields are not visible but still rendered.
-*/
-
-export function Section(props)
-{
-
-  let [ unfold, setUnfold ] = Dome.useState(props.settings,props.unfold);
-
-  const onSwitch = () => setUnfold(!unfold);
-
-  const { label, title, path, children, ...otherProps } = props ;
-
-  return (
-    <Select path={path} {...otherProps}>
-      {(context) => (
-        <React.Fragment>
-          <div className='dome-xForm-section'>
-            <div className='dome-xForm-fold' onClick={onSwitch}>
-              <SVG id={unfold?'TRIANGLE.DOWN':'TRIANGLE.RIGHT'} size={11}/>
-            </div>
-            <label className={ (path && context.disabled) ? TITLE_DISABLED : TITLE_ENABLED }
-                   title={title}>
-              {label}
-            </label>
-            { unfold && path && <Warning full error={context.error}/> }
-          </div>
-          { unfold && RENDER(children,context) }
-          { unfold && <div className='dome-xForm-hsep'/> }
-        </React.Fragment>
-      )}
-    </Select>
-  );
-}
-
-// --------------------------------------------------------------------------
-// --- Block Container
-// --------------------------------------------------------------------------
-
-/**
-   @summary Full width form block.
-   @property {any} [...props] - [[Select]] properties
-   @property {React.children|function} [children] - Block content
-   @description
-   Wraps its children inside the entire width of the form.
-*/
-
-export const Block = ({ children, ...props }) => (
-  <Select {...props}>
-    {(context) => (
-      <div className='dome-xForm-block'>
-        {RENDER(children,context)}
-      </div>)}
-  </Select>
-);
-
-// --------------------------------------------------------------------------
-// --- Generic Fields
-// --------------------------------------------------------------------------
-
-let fid = 0 ;
-
-const LABEL_ENABLED  = 'dome-xForm-label dome-text-label';
-const LABEL_DISABLED = 'dome-xForm-label dome-text-label dome-disabled';
-const FIELD_ENABLED  = 'dome-xForm-field dome-text-label';
-const FIELD_DISABLED = 'dome-xForm-field dome-text-label dome-disabled';
-
-/**
-   @class
-   @summary Generic Custom Field.
-   @property {string} [label] - Field label
-   @property {string} [title] - Field tooltip text
-   @property {number} [offset] - Vertical label offset (for baseline alignment)
-   @property {boolean|string} [warn] - Display errors (default: `true`)
-   @property {any} [...props] - [[Select]] properties
-   @property {React.children|function} [children] - Custom field content
-   @description
-
-Field layout inside a Form container.
-The custom field component is positionned on the left of the label, right-aligned.
-The label itself is left-aligned with the other fields.
-
-The Field component setup a [[Select]] filter for your custom
-component. Additionnaly, if you use a custom function rendering, the context is
-enriched with the `id` of the `<label/>` DOM element of the label, that you can
-use with `<input htmlFor={id}/>` as custom field component.
-
-A warning badge is displayed on the right of your custom component, unless `warn:false`
-is specified. When hovered, the badge displays `Error` or the specified `string`. When
-hovered for a while, a full description of the error is displayed in a tooltip.
-*/
-
-export class Field extends React.Component
-{
-
-  constructor(props) {
-    super(props);
-    this.id = props.id || 'DOME$' + (fid++) ;
-  }
-
-  render() {
-    const id = this.id ;
-    const { label, title, offset=1, children, warn='Error', ...props } = this.props ;
-    return (
-      <Select {...props}>
-        {(context) => (
-          <React.Fragment>
-            <label className={context.disabled ? LABEL_DISABLED : LABEL_ENABLED}
-                   style={{top: offset}}
-                   htmlFor={id}
-                   title={title}>
-              {label}
-            </label>
-            <div className={context.disabled ? FIELD_DISABLED : FIELD_ENABLED}>
-              {RENDER(children,Object.assign(context,{id}))}
-              {warn && <Warning offset={offset} warn={warn} error={context.error}/>}
-            </div>
-          </React.Fragment>
-        )}
-      </Select>
-    );
-  }
-
-}
-
-// --------------------------------------------------------------------------
-// --- Field List Container
-// --------------------------------------------------------------------------
-
-/**
-   @summary Field List Container.
-   @property {string} [label] - Field label
-   @property {string} [title] - Field tooltip text
-   @property {boolean} [warn] - Display errors (default: `false`)
-   @property {any} [...props] - [[Select]] properties
-   @property {React.children|function} [children] - List field content
-   @description
-
-Render its field children in a right-aligned list on the left of the label.
-Typically designed for a list of checkboxes and radio buttons.
-
-Inside the field list, the field-label column no more exists. Hence, text field labels are
-typically never displayed when placed in a field list.
-
-*/
-export const FieldList = ({ label, title, warn=false, children, ...props }) => (
-  <Field label={label} title={title} warn={warn} {...props}>
-    <div className='dome-xForm-list'>
-      {children}
-    </div>
-  </Field>
-);
-
-// --------------------------------------------------------------------------
-// --- Text Field
-// --------------------------------------------------------------------------
-
-/**
-   @summary Text Field.
-   @property {string} [label] - Field label
-   @property {string} [title] - Field tooltip text
-   @property {string} [placeholder] - Input field place holder
-   @property {string} [className] - Input field additional class
-   @property {object} [style] - Input field additional style
-   @property {any} [...props] - [[Select]] properties
-   @description
-   Field with a Text Input element. The default latency is set to 600ms.
-*/
-export const FieldText = ({ className, style, latency=true, placeholder, ...props }) => (
-  <Field offset={4} latency={latency} {...props}>
-    {({id,value,disabled,onChange}) => (
-      <input id={id}
-             type='text'
-             value={value || ''}
-             className={CLASSES('dome-xForm-text-field',className)}
-             style={style}
-             disabled={disabled}
-             placeholder={placeholder}
-             onChange={ONCHANGE(onChange)}
-             />
-    )}
-  </Field>
-);
-
-// --------------------------------------------------------------------------
-// --- Code Field
-// --------------------------------------------------------------------------
-
-/**
-   @summary Monospaced Text Field.
-   @property {string} [label] - Field label
-   @property {string} [title] - Field tooltip text
-   @property {string} [placeholder] - Input field place holder
-   @property {string} [className] - Input field additional class
-   @property {object} [style] - Input field additional style
-   @property {any} [...props] - [[Select]] properties
-   @description
-   Field with a Text Input element. The default latency is set to 600ms.
-*/
-export const FieldCode = ({ className, style, latency=true, placeholder, ...props }) => (
-  <Field offset={4} latency={latency} {...props}>
-    {({id,value,disabled,onChange}) => (
-      <input id={id}
-             type='text'
-             value={value || ''}
-             className={CLASSES('dome-xForm-text-field dome-text-code',className)}
-             style={style}
-             disabled={disabled}
-             placeholder={placeholder}
-             onChange={ONCHANGE(onChange)}
-             />
-    )}
-  </Field>
-);
-
-// --------------------------------------------------------------------------
-// --- TextArea Field
-// --------------------------------------------------------------------------
-
-/**
-   @summary Text Area Field.
-   @property {string} [label] - Field label
-   @property {string} [title] - Field tooltip text
-   @property {string} [className] - Input field additional class
-   @property {string} [placeholder] - Input field place holder
-   @property {number} [cols] - Number of columns (default 35, min 5)
-   @property {number} [rows] - Number of lines (default 5, min 2)
-   @property {object} [style] - Input field additional style
-   @property {any} [...props] - [[Select]] properties
-   @description
-   Field with a Text Input element. The default latency is set to 900ms.
-*/
-export const FieldTextArea = ({ className, style, cols=35, rows=5,
-                                placeholder, latency=900, ...props }) => (
-  <Field offset={4} latency={latency} {...props}>
-    {({id, value, disabled, onChange }) => (
-      <textarea id={id}
-                type='text'
-                className={CLASSES('dome-xForm-textarea-field',className)} style={style}
-                disabled={disabled}
-                wrap='off' spellchecker='true'
-                value={value || ''}
-                cols={Math.max(5,cols)}
-                rows={Math.max(1,rows-1)}
-                placeholder={placeholder}
-                onChange={ONCHANGE(onChange)}
-                />
-    )}
-  </Field>
-);
-
-// --------------------------------------------------------------------------
-// --- CodeArea Field
-// --------------------------------------------------------------------------
-
-/**
-   @summary Text Area Field.
-   @property {string} [label] - Field label
-   @property {string} [title] - Field tooltip text
-   @property {string} [className] - Input field additional class
-   @property {string} [placeholder] - Input field place holder
-   @property {number} [cols] - Number of columns (default 35, min 5)
-   @property {number} [rows] - Number of lines (default 5, min 2)
-   @property {object} [style] - Input field additional style
-   @property {any} [...props] - [[Select]] properties
-   @description
-   Field with a Text Input element. The default latency is set to 900ms.
-*/
-export const FieldCodeArea = ({ className, style, cols=35, rows=5,
-                                placeholder, latency=900, ...props }) => (
-  <Field offset={4} latency={latency} {...props}>
-    {({id, value, disabled, onChange }) => (
-      <textarea id={id}
-                ref={this.area}
-                type='text'
-                className={CLASSES('dome-xForm-textarea-field dome-text-code',className)} style={style}
-                disabled={disabled}
-                wrap='off' spellchecker='false'
-                value={value || ''}
-                cols={Math.max(5,cols)}
-                rows={Math.max(1,rows-1)}
-                placeholder={placeholder}
-                onChange={ONCHANGE(onChange)}
-                />
-    )}
-  </Field>
-);
-
-// --------------------------------------------------------------------------
-// --- Number Field
-// --------------------------------------------------------------------------
-
-const PARSE_NUMBER = (v,debug) => {
-  let n = parseFloat(v);
-  if (Number.isNaN(n)) {
-    let msg = "Invalid number format";
-    if (debug) {
-      let txt = _.toString(v);
-      if (txt.length > 20) txt = txt.substring(0,19)+'…' ;
-      msg += ": «" + txt + "»" ;
-    }
-    throw msg ;
-  }
-  return n;
-};
-const TEXT_OF_NUMBER = (v) => v===undefined ? '' : PARSE_NUMBER(v,true).toLocaleString('en');
-const NUMBER_OF_TEXT = (s) => s==='' ? undefined : PARSE_NUMBER(s.replace(/[ ,]/g,''));
-
-/**
-   @summary Number Field.
-   @property {string} [label] - Field label
-   @property {string} [title] - Field tooltip text
-   @property {string} [placeholder] - Input field place holder
-   @property {string} [units] - Number units or currency
-   @property {string} [className] - Input field additional class
-   @property {object} [style] - Input field additional style
-   @property {any} [...props] - [[Select]] properties
-   @description
-   Field to edit number values with a Text Input element.
-   The default latency is set to 600ms. Numbers are rendered in the english locale, grouping thousands
-   with «,». The currency or units is displayed on the right of the field. The edited text
-   is converted back and forth to number values with `parseFloat`.
-*/
-export const FieldNumber =
-  ({ className, style, latency=true, units, placeholder, ...props }) => (
-    <Field latency={latency}
-           input={TEXT_OF_NUMBER}
-           output={NUMBER_OF_TEXT}
-           {...props}>
-      {({id,value,disabled,onChange}) => (
-        <React.Fragment>
-          <input id={id}
-                 type='text'
-                 value={value || ''}
-                 className={CLASSES('dome-xForm-number-field',className)}
-                 style={style}
-                 disabled={disabled}
-                 placeholder={placeholder}
-                 onChange={ONCHANGE(onChange)}
-                 />
-        {units && <label className='dome-text-label dome-xForm-units'>{units}</label>}
-        </React.Fragment>
-      )}
-    </Field>
-  );
-
-// --------------------------------------------------------------------------
-// --- Spinner field
-// --------------------------------------------------------------------------
-
-const PARSE_INT = (v,debug) => {
-  let n = parseInt(v);
-  if (Number.isNaN(n)) {
-    let msg = "Invalid number format";
-    if (debug) {
-      let txt = _.toString(v);
-      if (txt.length > 20) txt = txt.substring(0,19)+'…' ;
-      msg += ": «" + txt + "»" ;
-    }
-    throw msg ;
-  }
-  return n;
-};
-const TEXT_OF_INT = (v) => v===undefined ? '' : PARSE_INT(v,true);
-const INT_OF_TEXT = (s) => s==='' ? undefined : PARSE_INT(s);
-
-const INT_RANGE = (min,max,warning) => (v) =>
-      (min <= v && v <= max) ? undefined :
-      warning || 'Range ' + min + '…' + max ;
-
-/**
-   @summary Spinner Field.
-   @property {string} [label] - Field label
-   @property {string} [title] - Field tooltip text
-   @property {string} [placeholder] - Input field place holder
-   @property {string} [units] - Number units or currency
-   @property {number} [min] - Minimum value (default: 0)
-   @property {number} [max] - Maximum value (default: 1000)
-   @property {number} [step] - Stepper increment
-   @property {string} [warning] - Out of bound message (default is explaining the range)
-   @property {string} [className] - Input field additional class
-   @property {object} [style] - Input field additional style
-   @property {any} [...props] - [[Select]] properties
-   @description
-   Field to edit integer numbers with a spinner element.
-   The default latency is set to 600ms.
-*/
-export const FieldSpinner =
-  ({ className, style, latency=true, units, placeholder, min=0, max=1000, step, ...props }) => (
-    <Field latency={latency}
-           input={TEXT_OF_INT}
-           output={INT_OF_TEXT}
-           validate={INT_RANGE(min,max)}
-           {...props}>
-      {({id,value,disabled,onChange}) => (
-        <React.Fragment>
-          <input id={id}
-                 type='number'
-                 value={ value === undefined ? '' : value }
-                 className={CLASSES('dome-xForm-spinner-field',className)}
-                 style={style}
-                 min={min}
-                 max={max}
-                 step={step}
-                 disabled={disabled}
-                 placeholder={placeholder}
-                 onChange={ONCHANGE(onChange)}
-                 />
-        {units && <label className='dome-text-label dome-xForm-units'>{units}</label>}
-        </React.Fragment>
-      )}
-    </Field>
-  );
-
-// --------------------------------------------------------------------------
-// --- Slider field
-// --------------------------------------------------------------------------
-
-const RESET_RANGE = (onChange,min,max) =>
-      onChange && (() => onChange(Math.round( min + (max - min) / 2 )));
-
-const SHOW_VALUE = (show,v) => {
-  if (typeof(show)==='function')
-    return show(v);
-  if (v>0) return '+' + v ;
-  if (v<0) return v ;
-  return undefined ;
-};
-
-const SLIDER_VALUE = 'dome-text-label dome-xForm-units dome-xForm-slider-value ' ;
-const SHOW_SLIDER = SLIDER_VALUE + 'dome-xForm-slider-show' ;
-const HIDE_SLIDER = SLIDER_VALUE + 'dome-xForm-slider-hide' ;
-
-class REVEAL extends React.Component {
-
-  constructor(props) {
-    super(props);
-    this.state = { shown: false };
-    this.fadeOut = _.debounce(this.fadeOut,PERIOD(props.latency));
-  }
-
-  componentDidUpdate(prevProps) {
-    if (prevProps.value !== this.props.value) {
-      this.fadeIn();
-      this.fadeOut();
-    }
-  }
-
-  fadeIn() {
-    if (!this.state.shown) this.setState({ shown: true });
-  }
-
-  fadeOut() {
-    if (this.state.shown) this.setState({ shown: false });
-  }
-
-  render() {
-    const { show, value } = this.props ;
-    const { shown } = this.state ;
-    return (
-      <label className={shown ? SHOW_SLIDER : HIDE_SLIDER}>{SHOW_VALUE(show,value)}</label>
-    );
-  }
-
-}
-
-
-/**
-   @summary Slider Field.
-   @property {string} [label] - Field label
-   @property {string} [title] - Field tooltip text
-   @property {number} [min] - Minimum value (default: -24)
-   @property {number} [max] - Maximum value (default: 24)
-   @property {number} [step] - Stepper increment (default: 1)
-   @property {boolean} [reset] - Reset on double click (default is `true`)
-   @property {boolean|function} [show] - Display the selected value on the right (default is `true`)
-   @property {string} [className] - Input field additional class
-   @property {object} [style] - Input field additional style
-   @property {any} [...props] - [[Select]] properties
-   @description
-   Field to edit integer numbers with a spinner element.
-   The default latency is set to 600ms. Double click on the slider reset it
-   to its median value, unless `toreset` is specified. The `show` flag can be set to display
-   the actual value when the slider is dragged. Alternatively, a function can be provided
-   for computing the text to display for the dragged value.
-*/
-export const FieldSlider =
-  ({ className, style, latency=true, min=-24, max=24, step=1, reset=true, show=true, ...props }) => (
-    <Field latency={latency}
-           input={TEXT_OF_INT}
-           output={INT_OF_TEXT}
-           {...props}>
-      {({id,value,disabled,onChange}) => (
-        <React.Fragment>
-          <input id={id}
-                 type='range'
-                 value={ value === undefined ? '' : value }
-                 className={CLASSES('dome-xForm-slider-field',className)}
-                 style={style}
-                 min={min}
-                 max={max}
-                 step={step}
-                 disabled={disabled}
-                 onDoubleClick={reset ? RESET_RANGE(onChange,min,max) : undefined}
-                 onChange={ONCHANGE(onChange)}
-                 />
-          {show && <REVEAL latency={latency} show={show} value={value}/>}
-        </React.Fragment>
-      )}
-    </Field>
-  );
-
-// --------------------------------------------------------------------------
-// --- Date Field
-// --------------------------------------------------------------------------
-
-/**
-   @summary Date Field.
-   @property {string} [label] - Field label
-   @property {string} [title] - Field tooltip text
-   @property {string} [min] - Minimum date (default to `undefined`)
-   @property {string} [max] - Maximum date (default to `undefined`)
-   @property {string} [className] - Input field additional class
-   @property {object} [style] - Input field additional style
-   @property {any} [...props] - [[Select]] properties
-   @description
-   Field with a Date Input element. The default latency is set to 600ms.
-   The date is presented in english locale, with format `mm/dd/yyyy`, but the internal value
-   is a string compatible with javascript `Date('yyyy-dd-mm')` format.
-*/
-export const FieldDate = ({ className, style, latency=true, min, max, ...props }) => (
-  <Field latency={latency} {...props}>
-    {({id,value,disabled,onChange}) => (
-      <input id={id}
-             type='date'
-             value={value || ''} min={min} max={max}
-             className={CLASSES('dome-xForm-date-field',className)}
-             style={style}
-             disabled={disabled}
-             onChange={ONCHANGE(onChange)}
-             />
-    )}
-  </Field>
-);
-
-// --------------------------------------------------------------------------
-// --- Time Field
-// --------------------------------------------------------------------------
-
-/**
-   @summary Time Field.
-   @property {string} [label] - Field label
-   @property {string} [title] - Field tooltip text
-   @property {string} [min] - Minimum time (default to `undefined`)
-   @property {string} [max] - Maximum time (default to `undefined`)
-   @property {string} [className] - Input field additional class
-   @property {object} [style] - Input field additional style
-   @property {any} [...props] - [[Select]] properties
-   @description
-   Field with a Time Input element. The default latency is set to 600ms.
-   The time is presented in english locale, but its internal value is a string 'hh:mm'
-   on 24h per day basis. This internal format can be used to form a valid javascript
-   `Date('yyyy-mm-ddThh:mm')` object.
-*/
-export const FieldTime = ({ className, style, latency=true, min, max, ...props }) => (
-  <Field latency={latency} {...props}>
-    {({id,value,disabled,onChange}) => (
-      <input id={id}
-             type='time'
-             value={value || ''} min={min} max={max}
-             className={CLASSES('dome-xForm-time-field',className)}
-             style={style}
-             disabled={disabled}
-             onChange={ONCHANGE(onChange)}
-             />
-    )}
-  </Field>
-);
-
-// --------------------------------------------------------------------------
-// --- Date Field
-// --------------------------------------------------------------------------
-
-/**
-   @summary Color Field.
-   @property {string} [label] - Field label
-   @property {string} [title] - Field tooltip text
-   @property {string} [className] - Input field additional class
-   @property {object} [style] - Input field additional style
-   @property {any} [...props] - [[Select]] properties
-   @description
-   Field with a Text Input element. The default latency is set to 600ms.
-*/
-export const FieldColor = ({ className, style, latency=true, ...props }) => (
-  <Field latency={latency} {...props}>
-    {({id,value,disabled,onChange}) => (
-      <input id={id}
-             type='color'
-             value={value || '#ffffff'}
-             className={CLASSES('dome-xForm-color-field',className)}
-             style={style}
-             disabled={disabled}
-             onChange={ONCHANGE(onChange)}
-             />
-    )}
-  </Field>
-);
-
-// --------------------------------------------------------------------------
-// --- Select Field
-// --------------------------------------------------------------------------
-
-/**
-   @summary Select Field.
-   @property {string} [label] - Field label
-   @property {string} [title] - Field tooltip text
-   @property {string} [placeholder] - Selector placeholder
-   @property {string} [className] - Input field additional class
-   @property {object} [style] - Input field additional style
-   @property {any} [...props] - [[Select]] properties
-   @property {option|optgroup} [children] - HTML options of the `<select>` element
-   @description
-   Field with a Select element. Children must be standard `<option>` and `<optgroup>` elements.
-   Typically:
-
-   ```
-   <FieldSelect placeholder='Choose a value'>
-      <option value='A'>Item A</option>
-      <option value='B'>Item B</option>
-      <option value='C'>Item C</option>
-   </FieldSelect>
-   ```
-
-*/
-export const FieldSelect = ({ className, style, children, placeholder, ...props }) => (
-  <Field {...props}>
-    {({id,value,disabled,onChange}) => (
-      <Selector id={id}
-                className={className}
-                style={style}
-                placeholder={placeholder}
-                value={value}
-                onChange={onChange} >
-        {children}
-      </Selector>
-    )}
-  </Field>
-);
-
-// --------------------------------------------------------------------------
-// --- CheckBox Field
-// --------------------------------------------------------------------------
-
-/**
-   @summary Checkbox Field.
-   @property {string} [label] - Field label
-   @property {string} [title] - Field tooltip text
-   @property {boolean} [inverted] - Inverted value (incompatible with `input` and `output` properties)
-   @property {any} [...props] - [[Select]] properties
-   @description
-   A check box field.
-*/
-
-export const FieldCheckbox = ({ label, ...props }) => {
-  let transform = props.inverted ? (v) => !v : (v) => !!v ;
-  return (
-    <Select input={transform} output={transform} {...props}>
-      {({value,disabled,onChange}) => (
-        <Checkbox className={disabled ? FIELD_DISABLED : FIELD_ENABLED}
-                  label={label} title={props.title}
-                  disabled={disabled}
-                  value={value} onChange={onChange}/>
-      )}
-    </Select>
-  );
-};
-
-// --------------------------------------------------------------------------
-// --- Radio Field
-// --------------------------------------------------------------------------
-
-/**
-   @summary Radio Button Field.
-   @property {string} [label] - Field label
-   @property {string} [title] - Field tooltip text
-   @property {any} [value] - Value associated with the radio button
-   @property {any} [...props] - [[Select]] properties
-   @description
-   A radio button field.
-
-   <strong>Note:</strong> there is no need for using a radio group here,
-   since the selected value is taken from the context.
-*/
-
-export const FieldRadio = ({ label, title, value, ...props }) => {
-  return (
-    <Select {...props}>
-      {({value:selection,disabled,onChange}) => (
-        <Radio className={disabled ? FIELD_DISABLED : FIELD_ENABLED}
-               label={label} title={title}
-               disabled={disabled}
-               value={value}
-               selection={selection}
-               onSelection={onChange}/>
-      )}
-    </Select>
-  );
-};
-
-// --------------------------------------------------------------------------
diff --git a/ivette/src/dome/src/renderer/layout/splitters.js b/ivette/src/dome/src/renderer/layout/splitters.js
deleted file mode 100644
index b6468165cfcf2a07a4e425d291150a7c1a8b8527..0000000000000000000000000000000000000000
--- a/ivette/src/dome/src/renderer/layout/splitters.js
+++ /dev/null
@@ -1,400 +0,0 @@
-// --------------------------------------------------------------------------
-// --- Splitters
-// --------------------------------------------------------------------------
-
-/**
-    @packageDocumentation
-    @module dome/layout/splitters
-*/
-
-import _ from 'lodash' ;
-import * as React from 'react' ;
-import * as Dome from 'dome' ;
-import { Layout } from 'dome/misc/layout' ;
-
-import './style.css' ;
-
-// --------------------------------------------------------------------------
-// --- Splitter Layout
-// --------------------------------------------------------------------------
-
-const SUBVIEW = { overflow: 'hidden' };
-
-const LAYOUT = {
-  // Container Class
-  hcursor: 'dome-xSplitter-h-cursor',
-  vcursor: 'dome-xSplitter-v-cursor',
-  nocursor: 'dome-xSplitter-no-cursor',
-  // Grab Class
-  hgrab: 'dome-xSplitter-grab dome-xSplitter-h dome-color-dragzone',
-  vgrab: 'dome-xSplitter-grab dome-xSplitter-v dome-color-dragzone',
-  hdrag: 'dome-xSplitter-grab dome-xSplitter-h dome-color-dragging',
-  vdrag: 'dome-xSplitter-grab dome-xSplitter-v dome-color-dragging',
-  // Non-Positionned Splitter Styles
-  hsplitter: { width:1, height: '100%' },
-  vsplitter: { height:1, width: '100%' },
-  // Hidden style
-  hide: { display: 'none' },
-  // Non-Positionned Pane Styles
-  fixH: { flex: 'none', height: 'auto', width: '100%' },
-  extH: { flex: 'auto', minHeight: 30, width: '100%' },
-  fixW: { flex: 'none', width: 'auto', height: '100%' },
-  extW: { flex: 'auto', minWidth: 10, height: '100%' },
-  // Non-Positionned Contailer Styles
-  horizontal: {
-    display:'flex', flexFlow: 'row nowrap'
-  },
-  vertical: {
-    display:'flex', flexFlow: 'column nowrap'
-  },
-  // Positionned Container Style
-  container: {
-    display:'block'
-  }
-};
-
-const subview = ( primary,secondary ) =>
-      Object.assign( {} , SUBVIEW , { primary,secondary } );
-
-// Tabulated flex-box styles
-const FLEX = {
-  'HORIZONTAL': subview( LAYOUT.extW, LAYOUT.extW ),
-  'LEFT':       subview( LAYOUT.fixW, LAYOUT.extW ),
-  'RIGHT':      subview( LAYOUT.extW, LAYOUT.fixW ),
-  'VERTICAL':   subview( LAYOUT.extH, LAYOUT.extH ),
-  'TOP':        subview( LAYOUT.fixH, LAYOUT.extH ),
-  'BOTTOM':     subview( LAYOUT.extH, LAYOUT.fixH )
-};
-
-// Tabulated hidden styles
-const HIDDEN = {
-  'HORIZONTAL': subview( LAYOUT.hide, LAYOUT.extW ),
-  'LEFT':       subview( LAYOUT.hide, LAYOUT.extW ),
-  'RIGHT':      subview( LAYOUT.extW, LAYOUT.hide ),
-  'VERTICAL':   subview( LAYOUT.hide, LAYOUT.extH ),
-  'TOP':        subview( LAYOUT.hide, LAYOUT.extH ),
-  'BOTTOM':     subview( LAYOUT.extH, LAYOUT.hide )
-};
-
-// Horizontal / Vertical mode
-const LR = {
-  'HORIZONTAL': true,
-  'LEFT':       true,
-  'RIGHT':      true,
-  'VERTICAL':   false,
-  'TOP':        false,
-  'BOTTOM':     false
-};
-
-// --------------------------------------------------------------------------
-// --- Splitter Component
-// --------------------------------------------------------------------------
-
-/**
-   @class
-   @summary Draggable split pane.
-   @property {Direction} [dir]  - Layout and dimensionning strategy
-   @property {string} [settings] - User-settings key for persistent splitter position
-   @property {number} [margin]  - Minimal margin from container edges
-   @property {boolean} [unfold] - whether to display or not the slider component (by default)
-   @description
-   Layout two panels horizontally or vertically with a draggable splitter.
-   Clicking the splitter bar with any modifier key restore its natural position.
-
-   The visibility of the slider component (the fixed size one, or the primary one) can
-   be defined by the `unfold` property.
-
-   ##### Direction
-
-   | Tag | Description
-   |:-------------------:|-------------------------------------------------
-   | `'HORIZONTAL'`      | Horizontal layout (default)
-   | `'LEFT'`, `'RIGHT'` | Horizontal layout with _fixed_ left or right component
-   | `'VERTICAL'`        | Vertical layout
-   | `'TOP'`, `'BOTTOM'` | Vertical layout with _fixed_ top or bottom component
-
-   When resizing the entire component, free available space is distributed among both children
-   except when one is _fixed_ by the `dir` property.
-   Typically, if your component has a left side-bar, you would provide a `LEFT` direction
-   to the splitter.
-
-
-   ##### Children
-
-   The component is designed for two children. If no-children is given, the
-   component returns `undefined`. If only one children is provided, it is
-   rendered as is-it, without any additional decoration. Extra chidren after the
-   2nd are simply not rendered.
-
-
-   ##### Borders & Margin
-
-   Primary and secondary components are laidout within positionned div elements with hidden overflows.
-   If your components have borders, you should adjust their CSS box-sizing property to `'border-box'`.
-   Margin with `'100%'` height or width should be avoided and replaced by padding, otherwize
-   the left and bottom sides of the views are likely to be cropped.
-
-*/
-export class Splitter extends React.Component {
-
-  // --------------------------------------------------------------------------
-  // --- Life Cycle
-  // --------------------------------------------------------------------------
-
-  constructor(props) {
-    super(props);
-    this.handleReset = this.handleReset.bind(this);
-    this.handleClick = this.handleClick.bind(this);
-    this.handleResize = this.handleResize.bind(this);
-    this.handleDragInit = this.handleDragInit.bind(this);
-    this.handleDragMove = this.handleDragMove.bind(this);
-    this.handleDragStop = this.handleDragStop.bind(this);
-    this.doDragMove = _.throttle( this.doDragMove , 100 );
-    this.lr = LR[ this.props.dir ];
-    this.margin = Math.max( 32 , this.props.margin || 0 );
-    this.state = {
-      dragging: false,   // Splitter is currently dragging
-      absolute: false,   // Splitter is positionned with offset
-      anchor: 0,         // Invariant: anchor == mouse position - offset
-      offset: 0          // Position of splitter edge from container edge
-    };
-  }
-
-  // --------------------------------------------------------------------------
-  // --- Mounting
-  // --------------------------------------------------------------------------
-
-  componentDidMount() {
-    if (this.refs.container && this.refs.splitter) {
-      const container = this.refs.container.getBoundingClientRect() ;
-      const dimension = this.lr ? container.width : container.height ;
-      this.range = dimension - this.margin ;
-      const settings = this.props.settings ;
-      if (settings) {
-        const offset = Dome.getWindowSetting(settings,-1);
-        if (this.margin <= offset && offset <= this.range)
-          this.setState({ absolute: true, offset });
-      }
-    }
-    Dome.on( 'dome.defaults', this.handleReset );
-  }
-
-  componentWillUnmount() {
-    Dome.off( 'dome.defaults', this.handleReset );
-  }
-
-  componentDidUpdate() {
-    this.lr = LR[ this.props.dir ];
-    this.margin = Math.max( 32 , this.props.margin || 0 );
-  }
-
-  // --------------------------------------------------------------------------
-  // --- Reset Offset
-  // --------------------------------------------------------------------------
-
-  handleReset() {
-    this.setState({ absolute: false, dragging: false, anchor: 0, offset: 0 });
-    Dome.setWindowSetting(this.props.settings, -1);
-  }
-
-  handleClick(event) {
-    if (event.altKey || event.ctrlKey || event.cmdKey || event.shiftKey)
-      this.handleReset();
-  }
-
-  // --------------------------------------------------------------------------
-  // --- Resizing Handler
-  // --------------------------------------------------------------------------
-
-  handleResize() {
-    // Defensive
-    if (this.refs.container && this.refs.splitter && this.state.absolute) {
-      let container = this.refs.container.getBoundingClientRect() ;
-      let dimension = this.lr ? container.width : container.height ;
-      if (dimension == 0) return;
-      let newrange = dimension - this.margin ;
-      let newoffset ;
-      switch(this.props.dir) {
-      case 'LEFT':
-      case 'TOP':
-        newoffset = this.state.offset ;
-        break;
-      case 'RIGHT':
-      case 'BOTTOM':
-        newoffset = this.state.offset + newrange - this.range ;
-        break;
-      default:
-        newoffset = this.state.offset + (newrange - this.range) / 2 ;
-        break;
-      }
-      this.range = newrange ;
-      if ( this.margin <= this.range) {
-        if (newoffset > this.range) newoffset = this.range ;
-        if (newoffset < this.margin) newoffset = this.margin ;
-      } else {
-        newoffset = dimension / 2 ;
-      }
-      this.setState( { offset: newoffset } );
-    }
-  }
-
-  // --------------------------------------------------------------------------
-  // --- Init Drag
-  // --------------------------------------------------------------------------
-
-  handleDragInit(evt) {
-    evt.preventDefault();
-    // Invariant: offset == position - anchor
-    let position = this.lr ? evt.clientX : evt.clientY ;
-    // Defensive
-    if (this.refs.splitter && this.refs.container) {
-      let splitter = this.refs.splitter.getBoundingClientRect() ;
-      let container = this.refs.container.getBoundingClientRect() ;
-      let dimension = this.lr ? container.width : container.height ;
-      let offset = this.lr
-          ? splitter.left - container.left
-          : splitter.top - container.top ;
-      this.range = dimension - this.margin ;
-      if (this.margin <= offset && offset <= this.range) {
-        let anchor = position - offset ;
-        this.setState( { dragging: true, absolute: true,
-                         anchor: anchor, offset: offset } );
-      }
-    }
-  }
-
-  // --------------------------------------------------------------------------
-  // --- Move Drag
-  // --------------------------------------------------------------------------
-
-  // Throttled 100ms
-  doDragMove(client) {
-    // Invariant: offset == position - anchor
-    let offset = client - this.state.anchor ;
-    if (this.margin <= offset && offset <= this.range)
-      this.setState( { offset: offset, absolute: true } );
-  }
-
-  // Not throttled (non-persistent event)
-  handleDragMove(evt) {
-    this.doDragMove(this.lr ? evt.clientX : evt.clientY);
-  }
-
-  // --------------------------------------------------------------------------
-  // --- Stop Drag
-  // --------------------------------------------------------------------------
-
-  handleDragStop(evt) {
-    Dome.setWindowSetting( this.props.settings, this.state.offset );
-    this.setState({ dragging: false });
-  }
-
-  // --------------------------------------------------------------------------
-  // --- Rendering
-  // --------------------------------------------------------------------------
-
-  render() {
-    const children = this.props.children ;
-    switch(children.length) {
-    case 0:
-      return undefined;
-    case 1:
-      return children[0];
-    default:
-      let dir = this.props.dir;
-      let dragging = this.state.dragging;
-      let offset = this.state.offset;
-      let cursor = dragging
-          ? (this.lr ? LAYOUT.hcursor : LAYOUT.vcursor)
-          : LAYOUT.nocursor ;
-      let grab = this.state.dragging
-          ? (this.lr ? LAYOUT.hdrag : LAYOUT.vdrag )
-          : (this.lr ? LAYOUT.hgrab : LAYOUT.vgrab ) ;
-      let container, splitter, primary, secondary ;
-      let { unfold=true } = this.props ;
-      let absolute = this.state.absolute ;
-      if (!unfold)
-      {
-        container = LAYOUT.container ;
-        splitter = LAYOUT.hide ;
-        let hidden = HIDDEN[dir] ;
-        primary = hidden.primary ;
-        secondary = hidden.secondary ;
-      }
-      else if (!absolute)
-      {
-        container  = this.lr ? LAYOUT.horizontal : LAYOUT.vertical ;
-        splitter   = this.lr ? LAYOUT.hsplitter : LAYOUT.vsplitter ;
-        let flex = FLEX[dir];
-        primary    = flex.primary ;
-        secondary  = flex.secondary ;
-      }
-      else
-      {
-        container  = LAYOUT.container ;
-        if (this.lr) {
-          primary   = { position: 'absolute', left: 0, width: offset, height: '100%' };
-          splitter  = { position: 'absolute', left: offset, width: 1, height: '100%' };
-          secondary = { position: 'absolute', left: offset+1, right: 0, height: '100%' };
-        } else {
-          primary   = { position: 'absolute', top: 0, height: offset, width: '100%' };
-          splitter  = { position: 'absolute', top: offset, height: 1, width: '100%' };
-          secondary = { position: 'absolute', top: offset+1, bottom: 0, width: '100%' };
-        }
-        Object.assign( primary , SUBVIEW );
-        Object.assign( secondary , SUBVIEW );
-      }
-      return (
-        <div ref="container"
-             onMouseUp={dragging ? this.handleDragStop : undefined}
-             onMouseMove={dragging ? this.handleDragMove : undefined}
-             className={'dome-xSplitter-container ' + cursor}
-             style={container}>
-          <div ref="primary" style={primary} className='dome-xSplitPane dome-container'>
-            {children[0]}
-          </div>
-          <div ref="splitter" style={splitter} className='dome-xSplitLine'>
-            <div className={grab}
-                 onMouseDown={this.handleDragInit}
-                 onClick={absolute ? this.handleClick : undefined} />
-          </div>
-          <div ref="secondary" style={secondary} className='dome-xSplitPane dome-container'>
-            {children[1]}
-          </div>
-          <Layout onResize={this.handleResize} />
-        </div>
-      );
-    }
-  }
-
-}
-
-// --------------------------------------------------------------------------
-// --- Short Cuts
-// --------------------------------------------------------------------------
-
-/** @summary Splitter with `dir="HORIZONTAL"`. */
-export const HSplit =
-  ({ children, ...props }) => <Splitter dir="HORIZONTAL" {...props}>{children}</Splitter>;
-
-/** @summary Splitter with `dir="VERTICAL"`. */
-export const VSplit =
-  ({ children, ...props }) => <Splitter dir="VERTICAL" {...props}>{children}</Splitter>;
-
-/** @summary Splitter with `dir="TOP"`. */
-export const TSplit =
-  ({ children, ...props }) => <Splitter dir="TOP" {...props}>{children}</Splitter>;
-
-/** @summary Splitter with `dir="BOTTOM"`. */
-export const BSplit =
-  ({ children, ...props }) => <Splitter dir="BOTTOM" {...props}>{children}</Splitter>;
-
-/** @summary Splitter with `dir="LEFT"`. */
-export const LSplit =
-  ({ children, ...props }) => <Splitter dir="LEFT" {...props}>{children}</Splitter>;
-
-/** @summary Splitter with `dir="RIGHT"`. */
-export const RSplit =
-  ({ children, ...props }) => <Splitter dir="RIGHT" {...props}>{children}</Splitter>;
-
-// --------------------------------------------------------------------------
diff --git a/ivette/src/dome/template/Application.js b/ivette/src/dome/template/Application.js
index c98deea8572112ba3444adeba90303d3e5d365dc..539097f43bea2e3b23af9a82fcf4e6c0601d51cb 100644
--- a/ivette/src/dome/template/Application.js
+++ b/ivette/src/dome/template/Application.js
@@ -13,7 +13,6 @@
 
 import React from 'react' ;
 import * as Dome from 'dome' ;
-import 'dome/misc/exports' ;
 
 export default (() => (
   <h1 className='dome-text-title' style={{margin: 24}}>
diff --git a/ivette/src/dome/template/makefile b/ivette/src/dome/template/makefile
index 0389a471ef67c7a1cbd6afc7c3d0b98291cbc68f..376d32c4fadf74c1c5bd08d3f8761a1821cb570d 100644
--- a/ivette/src/dome/template/makefile
+++ b/ivette/src/dome/template/makefile
@@ -13,8 +13,6 @@ DOME?=dome
 DOME_ARGS?=
 DOME_DEV_ARGS?=
 DOME_APP_ARGS?=
-DOME_EXPORTS?=
-DOME_PLUGINS?=
 DOME_CLI?=./bin/$(DOME_MK_NAME)
 DOME_DOC?=./doc/html
 DOME_API?=
@@ -38,15 +36,12 @@ dome-help:
 	@echo "  make dome-templ   Update templates"
 	@echo "  make dome-reboot  Rebuild templates from scratch"
 	@echo "  make dome-clean   Remove dome temporary files"
-	@echo "  make dome-plugins Package plugins for distribution"
 	@echo
 	@echo "[Dome] Development:"
 	@echo "  Dome framework  DOME         = '$(DOME)'"
 	@echo "  Local command   DOME_CLI     = '$(DOME_CLI)'"
 	@echo "  Local arguments DOME_ARGS    = '$(DOME_ARGS)'"
 	@echo "  Extra arg.(dev) DOME_DEV     = '$(DOME_DEV)'"
-	@echo "  Export modules  DOME_EXPORTS = '$(DOME_EXPORTS)'"
-	@echo "  Plugin modules  DOME_PLUGINS = '$(DOME_PLUGINS)'"
 	@echo
 	@echo "[Dome] Documentation:"
 	@echo "  Application     APP          = '$(APP)'"
@@ -134,7 +129,6 @@ DOME_MK_TEMPLATES= \
 	.gitignore \
 	.babelrc \
 	webpack.main.js \
-	webpack.plugin.js \
 	webpack.renderer.js \
 	electron-webpack.json \
 	src/main/index.js \
@@ -169,9 +163,6 @@ webpack.main.js: $(DOME)/template/update.sh $(DOME)/template/webpack.main.js
 webpack.renderer.js: $(DOME)/template/update.sh $(DOME)/template/webpack.renderer.js
 	@$^ $@
 
-webpack.plugin.js: $(DOME)/template/update.sh $(DOME)/template/webpack.plugin.js
-	@$^ $@
-
 electron-webpack.json: $(DOME)/template/update.sh $(DOME)/template/electron-webpack.json
 	@$^ $@
 
@@ -191,11 +182,11 @@ src/main/index.js: $(DOME)/template/update.sh $(DOME)/template/main.js
 
 ifndef DOME_CUSTOM_ENTRIES
 
-# dome-templ: src/renderer/Application.js
-# src/renderer/Application.js:
-# 	@echo "[Dome] creating $@ from template"
-# 	@mkdir -p src/renderer
-# 	@cp -f $(DOME)/template/Application.js $@
+dome-templ: src/renderer/Application.js
+src/renderer/Application.js:
+	@echo "[Dome] creating $@ from template"
+	@mkdir -p src/renderer
+	@cp -f $(DOME)/template/Application.js $@
 
 dome-templ: src/renderer/Preferences.js
 src/renderer/Preferences.js:
@@ -205,82 +196,6 @@ src/renderer/Preferences.js:
 
 endif
 
-# --------------------------------------------------------------------------
-# ---  Exported API for Plugins
-# --------------------------------------------------------------------------
-
-.PHONY: dome-export-dev dome-export-app
-
-DOME_MK_EXPORTS_JS=$(DOME)/src/misc/exports.js
-
-# --------------------------------------------------------------------------
-
-dome-export-dev:
-	@rm -f $(DOME_MK_EXPORTS_JS)
-	@echo "// Static Plugins Loader" > $(DOME_MK_EXPORTS_JS)
-	@for m in $(DOME_EXPORTS) ;\
-	 do \
-		echo "[Dome] installing '$$m'" ;\
-		echo "import '$$m';" \
-		>> $(DOME_MK_EXPORTS_JS) ;\
-	 done
-	@for m in $(DOME_PLUGINS) ;\
-	 do \
-		echo "[Dome] loading plugin $$m" ;\
-		echo "import '@plugins/$$m';" >> $(DOME_MK_EXPORTS_JS) ;\
-	 done
-	@chmod a-w $(DOME_MK_EXPORTS_JS)
-
-# --------------------------------------------------------------------------
-
-dome-export-app:
-	@rm -f $(DOME_MK_EXPORTS_JS)
-	@echo "// Static Loader (Generated by Dome)" > $(DOME_MK_EXPORTS_JS)
-	@echo "import { register } from 'dome/misc/plugins' ;" >> $(DOME_MK_EXPORTS_JS) ;
-	@echo "[Dome] export 'dome'" ;
-	@$(DOME)/template/export.sh $(DOME) >> $(DOME_MK_EXPORTS_JS)
-	@for m in $(DOME_EXPORTS) ;\
-	 do \
-		echo "[Dome] export '$$m'" ;\
-		echo "{ let m = require('$$m'); register('$$m',m); }" \
-		>> $(DOME_MK_EXPORTS_JS) ;\
-	 done
-	@for m in $(DOME_PLUGINS) ;\
-	 do \
-		echo "[Dome] install '@plugins/$$m'" ;\
-		echo "{ let m = require('@plugins/$$m'); register('@plugins/$$m',m); }" \
-		>> $(DOME_MK_EXPORTS_JS) ;\
-	 done
-	@chmod a-w $(DOME_MK_EXPORTS_JS)
-
-# --------------------------------------------------------------------------
-# ---  Packaging Plugins
-# --------------------------------------------------------------------------
-
-.PHONY: dome-plugins dome-plugin-%
-
-DOME_MK_PLUGINS_TARGET=$(addprefix dome-plugin-, $(DOME_PLUGINS))
-DOME_MK_PLUGINS_SOURCE=$(addprefix src/plugins/, $(DOME_PLUGINS))
-DOME_MK_PLUGINS_CONFIG=$(addsuffix /package.json, $(DOME_MK_PLUGINS_SOURCE))
-
-dome-plugins: $(DOME_MK_PLUGINS_CONFIG) $(DOME_MK_PLUGINS_TARGET)
-
-dome-plugin-%: src/plugins/%/package.json webpack.plugin.js
-	@echo "[Dome] building plugin '$*'"
-	@rm -fr dist/plugins/$*
-	@mkdir -p dist/plugins/$*
-	@node $(DOME)/template/packplugin.js '$*'
-	DOME=$(DOME) DOME_PLUGIN='$*' yarn run webpack -p --config webpack.plugin.js
-	@echo "[Dome] plugin packaged in ./dist/plugins/$*"
-
-src/plugins/%/package.json:
-	@echo "[Dome] creating package.json for plugin '$*'"
-	@echo '{' > $@
-	@echo '  "name": "$*",' >> $@
-	@echo '  "version": "0.1",' >> $@
-	@echo '  "license": "UNLICENSED"' >> $@
-	@echo '}' >> $@
-
 # --------------------------------------------------------------------------
 # ---  Application Development
 # --------------------------------------------------------------------------
@@ -289,7 +204,7 @@ DOME_MK_CLIDIR=$(dir $(DOME_CLI))
 
 .PHONY: dome-dev
 
-dome-dev: dome-pkg dome-templ dome-export-dev
+dome-dev: dome-pkg dome-templ
 	@echo "[Dome] linking $(DOME_CLI)"
 	@mkdir -p $(DOME_MK_CLIDIR)
 	@rm -f $(DOME_CLI)
@@ -307,7 +222,7 @@ dome-dev: dome-pkg dome-templ dome-export-dev
 
 .PHONY: dome-app
 
-dome-app: dome-pkg dome-templ dome-export-app
+dome-app: dome-pkg dome-templ
 	@echo "[Dome] compiling application (production)"
 	DOME=$(DOME) DOME_ENV='app' yarn run electron-webpack app
 	@echo "[Dome] linking $(DOME_CLI)"
@@ -334,7 +249,7 @@ dome-dist: dome-app
 # --------------------------------------------------------------------------
 
 DOME_MK_ICON_MAKE=$(DOME)/doc/icons.js
-DOME_MK_ICON_DATA=$(DOME)/src/renderer/controls/icons.json
+DOME_MK_ICON_DATA=$(DOME)/renderer/controls/icons.json
 DOME_MK_ICON_HTML=$(DOME)/doc/template/gallery-icons.html
 
 $(DOME_MK_ICON_HTML): $(DOME_MK_ICON_MAKE) $(DOME_MK_ICON_DATA)
@@ -345,8 +260,7 @@ $(DOME_MK_ICON_HTML): $(DOME_MK_ICON_MAKE) $(DOME_MK_ICON_DATA)
 # ---  Dome Documentation
 # --------------------------------------------------------------------------
 
-DOME_MK_DOC_SRC=$(DOME_API) $(addprefix src/plugins/, $(DOME_PLUGINS))
-DOME_MK_DOC_API=$(addprefix $(CURDIR)/, $(DOME_MK_DOC_SRC))
+DOME_MK_DOC_API=$(addprefix $(CURDIR)/, $(DOME_API))
 DOME_MK_DOC_OUT=$(addprefix $(CURDIR)/, $(DOME_DOC))
 
 dome-doc: $(DOME_MK_BIN)/jsdoc $(DOME_MK_ICON_HTML)
diff --git a/ivette/src/dome/template/packplugin.js b/ivette/src/dome/template/packplugin.js
deleted file mode 100644
index d0a9f265c2826d99fc11b7fed2a32ba4a574fb00..0000000000000000000000000000000000000000
--- a/ivette/src/dome/template/packplugin.js
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/bin/node
-
-const fs = require('fs');
-const name = process.argv[2];
-const INFOS = [
-  'name',
-  'version',
-  'description',
-  'homepage',
-  'bugs',
-  'keywords',
-  'author',
-  'contributors',
-  'repository',
-  'license'
-];
-
-const dst = {
-  name,
-  version: '0.1',
-  license: 'UNLICENSED',
-  main: 'bundle.js'
-};
-
-let src = './src/plugins/' + name + '/package.json' ;
-let tgt = './dist/plugins/' + name + '/package.json' ;
-let pkg = JSON.parse( fs.readFileSync( src , 'UTF-8' ) );
-INFOS.forEach((fd) => { let d = pkg[fd] ; if (!d) dst[fd] = d });
-fs.writeFileSync( tgt , JSON.stringify(dst) , 'UTF-8' );
-
-// End.
diff --git a/ivette/share/typescript-config.el b/ivette/src/dome/template/typescript.el
similarity index 74%
rename from ivette/share/typescript-config.el
rename to ivette/src/dome/template/typescript.el
index 2a524efd0792b26fdd86f3d7af3bada8b00ee397..049bf597848f548abea59ff75210da81ef79f0d7 100644
--- a/ivette/share/typescript-config.el
+++ b/ivette/src/dome/template/typescript.el
@@ -48,4 +48,24 @@
 (add-to-list 'auto-mode-alist '("\\.ts$" . typescript-mode))
 (add-to-list 'auto-mode-alist '("\\.tsx$" . web-mode))
 
+;; Column mode
+
+(safe-require fill-column-indicator
+  (setq-default fill-column 80)
+  (setq fci-rule-color "#8f8f8f")
+  (add-hook 'typescript-mode-hook 'fci-mode t)
+  (add-hook 'web-mode-hook 'fci-mode t))
+
+;; Compilation mode
+
+(require 'compile)
+
+;;; TSC output
+(add-to-list 'compilation-error-regexp-alist
+             '("^\\([a-zA-Z0-9_/.-]+.tsx?\\):\\([0-9]+\\):\\([0-9]+\\) - error" 1 2 3))
+
+;;; ES-Lint output
+(add-to-list 'compilation-error-regexp-alist
+             '("^\\([a-zA-Z0-9_/.-]+.tsx?\\): line \\([0-9]+\\), col \\([0-9]+\\), Error" 1 2 3))
+
 ;;; -------------------------------------------------------------------------
diff --git a/ivette/src/dome/template/webpack.main.js b/ivette/src/dome/template/webpack.main.js
index 608d29372314dcb2e5cd7406dac737c35371daf6..3d91c95097c725faad8398566de393881c2a3b02 100644
--- a/ivette/src/dome/template/webpack.main.js
+++ b/ivette/src/dome/template/webpack.main.js
@@ -21,15 +21,24 @@ function domeDevtools() {
   case 'dev':
     return 'electron-devtools-installer';
   default:
-    return path.resolve( DOME , 'src/misc/devtools.js' );
+    return path.resolve( DOME , 'misc/devtools.js' );
   }
 }
 
+// --------------------------------------------------------------------------
+
 module.exports = {
+  module: {
+    rules: [
+      { test: /\.(ts|js)x?$/, use: [ 'babel-loader' ], exclude: /node_modules/ }
+    ],
+    strictExportPresence: true
+  },
   resolve: {
+    extensions: ['.ts', '.tsx', '.js', 'jsx', '.json'],
     alias: {
-      'dome$':         path.resolve( DOME , 'src/main/dome.js' ),
-      'dome/system$':  path.resolve( DOME , 'src/misc/system.js' ),
+      'dome$':         path.resolve( DOME , 'main/dome.ts' ),
+      'dome/system$':  path.resolve( DOME , 'misc/system.ts' ),
       'dome/devtools': domeDevtools()
     }
   }
diff --git a/ivette/src/dome/template/webpack.plugin.js b/ivette/src/dome/template/webpack.plugin.js
deleted file mode 100644
index f60bdbf7ab8cda15ad9dcba2c747a5a3d82e57ed..0000000000000000000000000000000000000000
--- a/ivette/src/dome/template/webpack.plugin.js
+++ /dev/null
@@ -1,41 +0,0 @@
-// --------------------------------------------------------------------------
-// --- Webpack configuration for packing plugins
-// --------------------------------------------------------------------------
-
-/*
-   Template of ./webpack.plugin.js from $(DOME)/template/webpack.plugin.js
-
-   This webpack definitions will be used to make plugin bundles.
-
-   You may extend it with your own additions.
-*/
-
-const path = require('path');
-const DOME = process.env.DOME || path.resolve( __dirname , 'dome' );
-const PLUGIN = process.env.DOME_PLUGIN ;
-const ENTRY = path.resolve( __dirname , 'src/plugins' , PLUGIN );
-const DIST = path.resolve( __dirname , 'dist/plugins' , PLUGIN );
-
-module.exports = {
-  entry: ENTRY,
-  output: {
-    path: DIST,
-    filename: 'bundle.js',
-    libraryTarget: 'commonjs2'
-  },
-  module: {
-    rules: [
-      { test: /\.css$/, use: [ 'style-loader', 'css-loader' ] },
-      { test: /\.js$/, use: [ 'babel-loader' ], exclude: /(node_modules)/ }
-    ]
-  },
-  externals: [
-    'lodash',
-    'react',
-    /^dome\/.+$/,
-    /^@plugins\/.+$/,
-    /^@\/.+$/
-  ]
-};
-
-// --------------------------------------------------------------------------
diff --git a/ivette/src/dome/template/webpack.renderer.js b/ivette/src/dome/template/webpack.renderer.js
index 5cba35d887a82293a2c5ee5c482eda406729fdd4..f0b03d02cbe34d8c1399c36dbfa899cac95a368e 100644
--- a/ivette/src/dome/template/webpack.renderer.js
+++ b/ivette/src/dome/template/webpack.renderer.js
@@ -14,19 +14,23 @@
 const path = require('path');
 const DOME = process.env.DOME || path.resolve( __dirname , 'dome' );
 
+// --------------------------------------------------------------------------
+
 module.exports = {
   module: {
     rules: [
-      { test: /\.css$/, use: [ 'css-loader' ] }
-    ]
+      { test: /\.css$/, use: [ 'css-loader' ] },
+      { test: /\.(ts|js)x?$/, use: [ 'babel-loader' ], exclude: /node_modules/ }
+    ],
+    strictExportPresence: true
   },
   resolve: {
+    extensions: ['.ts', '.tsx', '.js', 'jsx', '.json'],
     alias: {
-      '@plugins':     path.resolve( __dirname , 'src/plugins' ),
-      'dome/misc':    path.resolve( DOME , 'src/misc' ),
-      'dome/system':  path.resolve( DOME , 'src/misc/system.js' ),
-      'dome$':        path.resolve( DOME , 'src/renderer/dome.js' ),
-      'dome':         path.resolve( DOME , 'src/renderer' ),
+      'dome/misc':    path.resolve( DOME , 'misc' ),
+      'dome/system':  path.resolve( DOME , 'misc/system.ts' ),
+      'dome$':        path.resolve( DOME , 'renderer/dome.tsx' ),
+      'dome':         path.resolve( DOME , 'renderer' ),
       'react-dom':    '@hot-loader/react-dom'
     }
   }
diff --git a/ivette/api/kernel/ast/index.ts b/ivette/src/frama-c/api/generated/kernel/ast/index.ts
similarity index 81%
rename from ivette/api/kernel/ast/index.ts
rename to ivette/src/frama-c/api/generated/kernel/ast/index.ts
index 64b119c98b4d1b4315d7031fdbd8e1a6d8eee987..9ae32c6bf691af3a416da8b033a070e337f6c38a 100644
--- a/ivette/api/kernel/ast/index.ts
+++ b/ivette/src/frama-c/api/generated/kernel/ast/index.ts
@@ -3,7 +3,7 @@
 /**
    Ast Services
    @packageDocumentation
-   @module api/kernel/ast
+   @module frama-c/api/kernel/ast
 */
 
 //@ts-ignore
@@ -16,21 +16,29 @@ import * as Server from 'frama-c/server';
 import * as State from 'frama-c/states';
 
 //@ts-ignore
-import { byTag } from 'api/kernel/data';
+import { byTag } from 'frama-c/api/kernel/data';
 //@ts-ignore
-import { byText } from 'api/kernel/data';
+import { byText } from 'frama-c/api/kernel/data';
 //@ts-ignore
-import { jTag } from 'api/kernel/data';
+import { jTag } from 'frama-c/api/kernel/data';
 //@ts-ignore
-import { jTagSafe } from 'api/kernel/data';
+import { jTagSafe } from 'frama-c/api/kernel/data';
 //@ts-ignore
-import { jText } from 'api/kernel/data';
+import { jText } from 'frama-c/api/kernel/data';
 //@ts-ignore
-import { jTextSafe } from 'api/kernel/data';
+import { jTextSafe } from 'frama-c/api/kernel/data';
 //@ts-ignore
-import { tag } from 'api/kernel/data';
+import { tag } from 'frama-c/api/kernel/data';
 //@ts-ignore
-import { text } from 'api/kernel/data';
+import { text } from 'frama-c/api/kernel/data';
+//@ts-ignore
+import { bySource } from 'frama-c/api/kernel/services';
+//@ts-ignore
+import { jSource } from 'frama-c/api/kernel/services';
+//@ts-ignore
+import { jSourceSafe } from 'frama-c/api/kernel/services';
+//@ts-ignore
+import { source } from 'frama-c/api/kernel/services';
 
 const compute_internal: Server.ExecRequest<null,null> = {
   kind: Server.RqKind.EXEC,
@@ -112,7 +120,7 @@ export const markerVarTags: Server.GetRequest<null,tag[]>= markerVarTags_interna
 /** Data for array rows [`markerInfo`](#markerinfo)  */
 export interface markerInfoData {
   /** Entry identifier. */
-  key: Json.key<'#markerInfo'>;
+  key: string;
   /** Marker kind */
   kind: markerKind;
   /** Marker variable */
@@ -121,17 +129,19 @@ export interface markerInfoData {
   name: string;
   /** Marker declaration or description */
   descr: string;
+  /** Source location */
+  sloc: source;
 }
 
 /** Loose decoder for `markerInfoData` */
 export const jMarkerInfoData: Json.Loose<markerInfoData> =
   Json.jObject({
-    key: Json.jFail(Json.jKey<'#markerInfo'>('#markerInfo'),
-           '#markerInfo expected'),
+    key: Json.jFail(Json.jString,'String expected'),
     kind: jMarkerKindSafe,
     var: jMarkerVarSafe,
     name: Json.jFail(Json.jString,'String expected'),
     descr: Json.jFail(Json.jString,'String expected'),
+    sloc: jSourceSafe,
   });
 
 /** Safe decoder for `markerInfoData` */
@@ -141,13 +151,14 @@ export const jMarkerInfoDataSafe: Json.Safe<markerInfoData> =
 /** Natural order for `markerInfoData` */
 export const byMarkerInfoData: Compare.Order<markerInfoData> =
   Compare.byFields
-    <{ key: Json.key<'#markerInfo'>, kind: markerKind, var: markerVar,
-       name: string, descr: string }>({
+    <{ key: string, kind: markerKind, var: markerVar, name: string,
+       descr: string, sloc: source }>({
     key: Compare.string,
     kind: byMarkerKind,
     var: byMarkerVar,
     name: Compare.alpha,
     descr: Compare.string,
+    sloc: bySource,
   });
 
 /** Signal for array [`markerInfo`](#markerinfo)  */
@@ -166,8 +177,8 @@ export const reloadMarkerInfo: Server.GetRequest<null,null>= reloadMarkerInfo_in
 
 const fetchMarkerInfo_internal: Server.GetRequest<
   number,
-  { pending: number, updated: markerInfoData[],
-    removed: Json.key<'#markerInfo'>[], reload: boolean }
+  { pending: number, updated: markerInfoData[], removed: string[],
+    reload: boolean }
   > = {
   kind: Server.RqKind.GET,
   name:   'kernel.ast.fetchMarkerInfo',
@@ -175,21 +186,18 @@ const fetchMarkerInfo_internal: Server.GetRequest<
   output: Json.jObject({
             pending: Json.jFail(Json.jNumber,'Number expected'),
             updated: Json.jList(jMarkerInfoData),
-            removed: Json.jList(Json.jKey<'#markerInfo'>('#markerInfo')),
+            removed: Json.jList(Json.jString),
             reload: Json.jFail(Json.jBoolean,'Boolean expected'),
           }),
 };
 /** Data fetcher for array [`markerInfo`](#markerinfo)  */
 export const fetchMarkerInfo: Server.GetRequest<
   number,
-  { pending: number, updated: markerInfoData[],
-    removed: Json.key<'#markerInfo'>[], reload: boolean }
+  { pending: number, updated: markerInfoData[], removed: string[],
+    reload: boolean }
   >= fetchMarkerInfo_internal;
 
-const markerInfo_internal: State.Array<
-  Json.key<'#markerInfo'>,
-  markerInfoData
-  > = {
+const markerInfo_internal: State.Array<string,markerInfoData> = {
   name: 'kernel.ast.markerInfo',
   getkey: ((d:markerInfoData) => d.key),
   signal: signalMarkerInfo,
@@ -198,7 +206,7 @@ const markerInfo_internal: State.Array<
   order: byMarkerInfoData,
 };
 /** Marker informations */
-export const markerInfo: State.Array<Json.key<'#markerInfo'>,markerInfoData> = markerInfo_internal;
+export const markerInfo: State.Array<string,markerInfoData> = markerInfo_internal;
 
 /** Localizable AST markers */
 export type marker =
@@ -230,7 +238,7 @@ export const byMarker: Compare.Order<marker> = Compare.structural;
 /** Location: function and marker */
 export interface location {
   /** Function */
-  function: Json.key<'#fct'>;
+  fct: Json.key<'#fct'>;
   /** Marker */
   marker: marker;
 }
@@ -238,7 +246,7 @@ export interface location {
 /** Loose decoder for `location` */
 export const jLocation: Json.Loose<location> =
   Json.jObject({
-    function: Json.jFail(Json.jKey<'#fct'>('#fct'),'#fct expected'),
+    fct: Json.jFail(Json.jKey<'#fct'>('#fct'),'#fct expected'),
     marker: jMarkerSafe,
   });
 
@@ -249,8 +257,8 @@ export const jLocationSafe: Json.Safe<location> =
 /** Natural order for `location` */
 export const byLocation: Compare.Order<location> =
   Compare.byFields
-    <{ function: Json.key<'#fct'>, marker: marker }>({
-    function: Compare.string,
+    <{ fct: Json.key<'#fct'>, marker: marker }>({
+    fct: Compare.string,
     marker: byMarker,
   });
 
@@ -280,6 +288,18 @@ export interface functionsData {
   name: string;
   /** Signature */
   signature: string;
+  /** Is the function the main entry point */
+  main?: boolean;
+  /** Is the function defined? */
+  defined?: boolean;
+  /** Is the function from the Frama-C stdlib? */
+  stdlib?: boolean;
+  /** Is the function a Frama-C builtin? */
+  builtin?: boolean;
+  /** Has the function been analyzed by Eva */
+  eva_analyzed?: boolean;
+  /** Source location */
+  sloc: source;
 }
 
 /** Loose decoder for `functionsData` */
@@ -289,6 +309,12 @@ export const jFunctionsData: Json.Loose<functionsData> =
            '#functions expected'),
     name: Json.jFail(Json.jString,'String expected'),
     signature: Json.jFail(Json.jString,'String expected'),
+    main: Json.jBoolean,
+    defined: Json.jBoolean,
+    stdlib: Json.jBoolean,
+    builtin: Json.jBoolean,
+    eva_analyzed: Json.jBoolean,
+    sloc: jSourceSafe,
   });
 
 /** Safe decoder for `functionsData` */
@@ -298,10 +324,18 @@ export const jFunctionsDataSafe: Json.Safe<functionsData> =
 /** Natural order for `functionsData` */
 export const byFunctionsData: Compare.Order<functionsData> =
   Compare.byFields
-    <{ key: Json.key<'#functions'>, name: string, signature: string }>({
+    <{ key: Json.key<'#functions'>, name: string, signature: string,
+       main?: boolean, defined?: boolean, stdlib?: boolean,
+       builtin?: boolean, eva_analyzed?: boolean, sloc: source }>({
     key: Compare.string,
     name: Compare.alpha,
     signature: Compare.string,
+    main: Compare.defined(Compare.boolean),
+    defined: Compare.defined(Compare.boolean),
+    stdlib: Compare.defined(Compare.boolean),
+    builtin: Compare.defined(Compare.boolean),
+    eva_analyzed: Compare.defined(Compare.boolean),
+    sloc: bySource,
   });
 
 /** Signal for array [`functions`](#functions)  */
diff --git a/ivette/api/kernel/data/index.ts b/ivette/src/frama-c/api/generated/kernel/data/index.ts
similarity index 98%
rename from ivette/api/kernel/data/index.ts
rename to ivette/src/frama-c/api/generated/kernel/data/index.ts
index f3bd97722e658b170d5a5e6dbae991eae25396c2..e90c22f754936f59db24afb3eede129130222f0b 100644
--- a/ivette/api/kernel/data/index.ts
+++ b/ivette/src/frama-c/api/generated/kernel/data/index.ts
@@ -3,7 +3,7 @@
 /**
    Informations
    @packageDocumentation
-   @module api/kernel/data
+   @module frama-c/api/kernel/data
 */
 
 //@ts-ignore
diff --git a/ivette/api/kernel/project/index.ts b/ivette/src/frama-c/api/generated/kernel/project/index.ts
similarity index 99%
rename from ivette/api/kernel/project/index.ts
rename to ivette/src/frama-c/api/generated/kernel/project/index.ts
index c1dba98e07b19f1bdd52e2c9d1db91ccdbc981c0..dfe685fc55801c456edde40ed9ee081cf1113f03 100644
--- a/ivette/api/kernel/project/index.ts
+++ b/ivette/src/frama-c/api/generated/kernel/project/index.ts
@@ -3,7 +3,7 @@
 /**
    Project Management
    @packageDocumentation
-   @module api/kernel/project
+   @module frama-c/api/kernel/project
 */
 
 //@ts-ignore
diff --git a/ivette/api/kernel/properties/index.ts b/ivette/src/frama-c/api/generated/kernel/properties/index.ts
similarity index 90%
rename from ivette/api/kernel/properties/index.ts
rename to ivette/src/frama-c/api/generated/kernel/properties/index.ts
index 9f7eeb5e6e49df77718140190f847501a88e5eec..dcba1484d490140e593cacd56ab49052929aed4e 100644
--- a/ivette/api/kernel/properties/index.ts
+++ b/ivette/src/frama-c/api/generated/kernel/properties/index.ts
@@ -3,7 +3,7 @@
 /**
    Property Services
    @packageDocumentation
-   @module api/kernel/properties
+   @module frama-c/api/kernel/properties
 */
 
 //@ts-ignore
@@ -16,21 +16,21 @@ import * as Server from 'frama-c/server';
 import * as State from 'frama-c/states';
 
 //@ts-ignore
-import { byTag } from 'api/kernel/data';
+import { byTag } from 'frama-c/api/kernel/data';
 //@ts-ignore
-import { jTag } from 'api/kernel/data';
+import { jTag } from 'frama-c/api/kernel/data';
 //@ts-ignore
-import { jTagSafe } from 'api/kernel/data';
+import { jTagSafe } from 'frama-c/api/kernel/data';
 //@ts-ignore
-import { tag } from 'api/kernel/data';
+import { tag } from 'frama-c/api/kernel/data';
 //@ts-ignore
-import { bySource } from 'api/kernel/services';
+import { bySource } from 'frama-c/api/kernel/services';
 //@ts-ignore
-import { jSource } from 'api/kernel/services';
+import { jSource } from 'frama-c/api/kernel/services';
 //@ts-ignore
-import { jSourceSafe } from 'api/kernel/services';
+import { jSourceSafe } from 'frama-c/api/kernel/services';
 //@ts-ignore
-import { source } from 'api/kernel/services';
+import { source } from 'frama-c/api/kernel/services';
 
 /** Property Kinds */
 export enum propKind {
@@ -225,7 +225,7 @@ export const alarmsTags: Server.GetRequest<null,tag[]>= alarmsTags_internal;
 /** Data for array rows [`status`](#status)  */
 export interface statusData {
   /** Entry identifier. */
-  key: Json.key<'#status'>;
+  key: Json.key<'#property'>;
   /** Full description */
   descr: string;
   /** Kind */
@@ -235,7 +235,7 @@ export interface statusData {
   /** Status */
   status: propStatus;
   /** Function */
-  function?: Json.key<'#fct'>;
+  fct?: Json.key<'#fct'>;
   /** Instruction */
   kinstr?: Json.key<'#stmt'>;
   /** Position */
@@ -251,12 +251,12 @@ export interface statusData {
 /** Loose decoder for `statusData` */
 export const jStatusData: Json.Loose<statusData> =
   Json.jObject({
-    key: Json.jFail(Json.jKey<'#status'>('#status'),'#status expected'),
+    key: Json.jFail(Json.jKey<'#property'>('#property'),'#property expected'),
     descr: Json.jFail(Json.jString,'String expected'),
     kind: jPropKindSafe,
     names: Json.jList(Json.jString),
     status: jPropStatusSafe,
-    function: Json.jKey<'#fct'>('#fct'),
+    fct: Json.jKey<'#fct'>('#fct'),
     kinstr: Json.jKey<'#stmt'>('#stmt'),
     source: jSourceSafe,
     alarm: Json.jString,
@@ -271,8 +271,8 @@ export const jStatusDataSafe: Json.Safe<statusData> =
 /** Natural order for `statusData` */
 export const byStatusData: Compare.Order<statusData> =
   Compare.byFields
-    <{ key: Json.key<'#status'>, descr: string, kind: propKind,
-       names: string[], status: propStatus, function?: Json.key<'#fct'>,
+    <{ key: Json.key<'#property'>, descr: string, kind: propKind,
+       names: string[], status: propStatus, fct?: Json.key<'#fct'>,
        kinstr?: Json.key<'#stmt'>, source: source, alarm?: string,
        alarm_descr?: string, predicate?: string }>({
     key: Compare.string,
@@ -280,7 +280,7 @@ export const byStatusData: Compare.Order<statusData> =
     kind: byPropKind,
     names: Compare.array(Compare.string),
     status: byPropStatus,
-    function: Compare.defined(Compare.string),
+    fct: Compare.defined(Compare.string),
     kinstr: Compare.defined(Compare.string),
     source: bySource,
     alarm: Compare.defined(Compare.string),
@@ -304,7 +304,7 @@ export const reloadStatus: Server.GetRequest<null,null>= reloadStatus_internal;
 
 const fetchStatus_internal: Server.GetRequest<
   number,
-  { pending: number, updated: statusData[], removed: Json.key<'#status'>[],
+  { pending: number, updated: statusData[], removed: Json.key<'#property'>[],
     reload: boolean }
   > = {
   kind: Server.RqKind.GET,
@@ -313,18 +313,18 @@ const fetchStatus_internal: Server.GetRequest<
   output: Json.jObject({
             pending: Json.jFail(Json.jNumber,'Number expected'),
             updated: Json.jList(jStatusData),
-            removed: Json.jList(Json.jKey<'#status'>('#status')),
+            removed: Json.jList(Json.jKey<'#property'>('#property')),
             reload: Json.jFail(Json.jBoolean,'Boolean expected'),
           }),
 };
 /** Data fetcher for array [`status`](#status)  */
 export const fetchStatus: Server.GetRequest<
   number,
-  { pending: number, updated: statusData[], removed: Json.key<'#status'>[],
+  { pending: number, updated: statusData[], removed: Json.key<'#property'>[],
     reload: boolean }
   >= fetchStatus_internal;
 
-const status_internal: State.Array<Json.key<'#status'>,statusData> = {
+const status_internal: State.Array<Json.key<'#property'>,statusData> = {
   name: 'kernel.properties.status',
   getkey: ((d:statusData) => d.key),
   signal: signalStatus,
@@ -333,6 +333,6 @@ const status_internal: State.Array<Json.key<'#status'>,statusData> = {
   order: byStatusData,
 };
 /** Status of Registered Properties */
-export const status: State.Array<Json.key<'#status'>,statusData> = status_internal;
+export const status: State.Array<Json.key<'#property'>,statusData> = status_internal;
 
 /* ------------------------------------- */
diff --git a/ivette/api/kernel/services/index.ts b/ivette/src/frama-c/api/generated/kernel/services/index.ts
similarity index 95%
rename from ivette/api/kernel/services/index.ts
rename to ivette/src/frama-c/api/generated/kernel/services/index.ts
index 2b98b1c59cbc4e138a9ceada0949b5ca6e7c9de7..7949c24a43c91be25965e1a3373dbb75c0222cff 100644
--- a/ivette/api/kernel/services/index.ts
+++ b/ivette/src/frama-c/api/generated/kernel/services/index.ts
@@ -3,7 +3,7 @@
 /**
    Kernel Services
    @packageDocumentation
-   @module api/kernel/services
+   @module frama-c/api/kernel/services
 */
 
 //@ts-ignore
@@ -16,13 +16,13 @@ import * as Server from 'frama-c/server';
 import * as State from 'frama-c/states';
 
 //@ts-ignore
-import { byTag } from 'api/kernel/data';
+import { byTag } from 'frama-c/api/kernel/data';
 //@ts-ignore
-import { jTag } from 'api/kernel/data';
+import { jTag } from 'frama-c/api/kernel/data';
 //@ts-ignore
-import { jTagSafe } from 'api/kernel/data';
+import { jTagSafe } from 'frama-c/api/kernel/data';
 //@ts-ignore
-import { tag } from 'api/kernel/data';
+import { tag } from 'frama-c/api/kernel/data';
 
 const getConfig_internal: Server.GetRequest<
   null,
diff --git a/ivette/api/plugins/dive/index.ts b/ivette/src/frama-c/api/generated/plugins/dive/index.ts
similarity index 95%
rename from ivette/api/plugins/dive/index.ts
rename to ivette/src/frama-c/api/generated/plugins/dive/index.ts
index b1e2c48ddcccd6edb1f670193decea3cc8039f21..19de6add85525eba51b77bad271d460e936cb13c 100644
--- a/ivette/api/plugins/dive/index.ts
+++ b/ivette/src/frama-c/api/generated/plugins/dive/index.ts
@@ -3,7 +3,7 @@
 /**
    Dive Services
    @packageDocumentation
-   @module api/plugins/dive
+   @module frama-c/api/plugins/dive
 */
 
 //@ts-ignore
@@ -16,21 +16,21 @@ import * as Server from 'frama-c/server';
 import * as State from 'frama-c/states';
 
 //@ts-ignore
-import { byLocation } from 'api/kernel/ast';
+import { byLocation } from 'frama-c/api/kernel/ast';
 //@ts-ignore
-import { byMarker } from 'api/kernel/ast';
+import { byMarker } from 'frama-c/api/kernel/ast';
 //@ts-ignore
-import { jLocation } from 'api/kernel/ast';
+import { jLocation } from 'frama-c/api/kernel/ast';
 //@ts-ignore
-import { jLocationSafe } from 'api/kernel/ast';
+import { jLocationSafe } from 'frama-c/api/kernel/ast';
 //@ts-ignore
-import { jMarker } from 'api/kernel/ast';
+import { jMarker } from 'frama-c/api/kernel/ast';
 //@ts-ignore
-import { jMarkerSafe } from 'api/kernel/ast';
+import { jMarkerSafe } from 'frama-c/api/kernel/ast';
 //@ts-ignore
-import { location } from 'api/kernel/ast';
+import { location } from 'frama-c/api/kernel/ast';
 //@ts-ignore
-import { marker } from 'api/kernel/ast';
+import { marker } from 'frama-c/api/kernel/ast';
 
 /** Parametrization of the exploration range. */
 export interface range {
diff --git a/ivette/api/plugins/eva/general/index.ts b/ivette/src/frama-c/api/generated/plugins/eva/general/index.ts
similarity index 80%
rename from ivette/api/plugins/eva/general/index.ts
rename to ivette/src/frama-c/api/generated/plugins/eva/general/index.ts
index 519329eeb53dfa7fda48ac9c286506bd2da3440c..d16a45ad200fe7939ed2b1f81461ec0d78dce8e8 100644
--- a/ivette/api/plugins/eva/general/index.ts
+++ b/ivette/src/frama-c/api/generated/plugins/eva/general/index.ts
@@ -3,7 +3,7 @@
 /**
    Eva General Services
    @packageDocumentation
-   @module api/plugins/eva/general
+   @module frama-c/api/plugins/eva/general
 */
 
 //@ts-ignore
@@ -16,13 +16,22 @@ import * as Server from 'frama-c/server';
 import * as State from 'frama-c/states';
 
 //@ts-ignore
-import { byMarker } from 'api/kernel/ast';
+import { byMarker } from 'frama-c/api/kernel/ast';
 //@ts-ignore
-import { jMarker } from 'api/kernel/ast';
+import { jMarker } from 'frama-c/api/kernel/ast';
 //@ts-ignore
-import { jMarkerSafe } from 'api/kernel/ast';
+import { jMarkerSafe } from 'frama-c/api/kernel/ast';
 //@ts-ignore
-import { marker } from 'api/kernel/ast';
+import { marker } from 'frama-c/api/kernel/ast';
+
+const isComputed_internal: Server.GetRequest<null,boolean> = {
+  kind: Server.RqKind.GET,
+  name:   'plugins.eva.general.isComputed',
+  input:  Json.jNull,
+  output: Json.jBoolean,
+};
+/** True if the Eva analysis has been done */
+export const isComputed: Server.GetRequest<null,boolean>= isComputed_internal;
 
 const getCallers_internal: Server.GetRequest<
   Json.key<'#fct'>,
diff --git a/ivette/src/frama-c/api/generated/plugins/eva/values/index.ts b/ivette/src/frama-c/api/generated/plugins/eva/values/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b08b8540d749cde916fd0650a73acd73c4c6dac2
--- /dev/null
+++ b/ivette/src/frama-c/api/generated/plugins/eva/values/index.ts
@@ -0,0 +1,152 @@
+/* --- Generated Frama-C Server API --- */
+
+/**
+   Eva Values
+   @packageDocumentation
+   @module frama-c/api/plugins/eva/values
+*/
+
+//@ts-ignore
+import * as Json from 'dome/data/json';
+//@ts-ignore
+import * as Compare from 'dome/data/compare';
+//@ts-ignore
+import * as Server from 'frama-c/server';
+//@ts-ignore
+import * as State from 'frama-c/states';
+
+//@ts-ignore
+import { byMarker } from 'frama-c/api/kernel/ast';
+//@ts-ignore
+import { jMarker } from 'frama-c/api/kernel/ast';
+//@ts-ignore
+import { jMarkerSafe } from 'frama-c/api/kernel/ast';
+//@ts-ignore
+import { marker } from 'frama-c/api/kernel/ast';
+
+/** Emitted when EVA results has changed */
+export const changed: Server.Signal = {
+  name: 'plugins.eva.values.changed',
+};
+
+export type callstack = Json.index<'#eva-callstack-id'>;
+
+/** Loose decoder for `callstack` */
+export const jCallstack: Json.Loose<callstack> =
+  Json.jIndex<'#eva-callstack-id'>('#eva-callstack-id');
+
+/** Safe decoder for `callstack` */
+export const jCallstackSafe: Json.Safe<callstack> =
+  Json.jFail(Json.jIndex<'#eva-callstack-id'>('#eva-callstack-id'),
+    '#eva-callstack-id expected');
+
+/** Natural order for `callstack` */
+export const byCallstack: Compare.Order<callstack> = Compare.number;
+
+const getCallstacks_internal: Server.GetRequest<marker[],callstack[]> = {
+  kind: Server.RqKind.GET,
+  name:   'plugins.eva.values.getCallstacks',
+  input:  Json.jList(jMarker),
+  output: Json.jList(jCallstack),
+};
+/** Callstacks for markers */
+export const getCallstacks: Server.GetRequest<marker[],callstack[]>= getCallstacks_internal;
+
+const getCallstackInfo_internal: Server.GetRequest<
+  callstack,
+  { callee: Json.key<'#fct'>, caller?: Json.key<'#fct'>,
+    stmt?: Json.key<'#stmt'>, rank?: number }[]
+  > = {
+  kind: Server.RqKind.GET,
+  name:   'plugins.eva.values.getCallstackInfo',
+  input:  jCallstack,
+  output: Json.jList(
+            Json.jObject({
+              callee: Json.jFail(Json.jKey<'#fct'>('#fct'),'#fct expected'),
+              caller: Json.jKey<'#fct'>('#fct'),
+              stmt: Json.jKey<'#stmt'>('#stmt'),
+              rank: Json.jNumber,
+            })),
+};
+/** Callstack Description */
+export const getCallstackInfo: Server.GetRequest<
+  callstack,
+  { callee: Json.key<'#fct'>, caller?: Json.key<'#fct'>,
+    stmt?: Json.key<'#stmt'>, rank?: number }[]
+  >= getCallstackInfo_internal;
+
+const getStmtInfo_internal: Server.GetRequest<
+  Json.key<'#stmt'>,
+  { rank: number, fct: Json.key<'#fct'> }
+  > = {
+  kind: Server.RqKind.GET,
+  name:   'plugins.eva.values.getStmtInfo',
+  input:  Json.jKey<'#stmt'>('#stmt'),
+  output: Json.jObject({
+            rank: Json.jFail(Json.jNumber,'Number expected'),
+            fct: Json.jFail(Json.jKey<'#fct'>('#fct'),'#fct expected'),
+          }),
+};
+/** Stmt Information */
+export const getStmtInfo: Server.GetRequest<
+  Json.key<'#stmt'>,
+  { rank: number, fct: Json.key<'#fct'> }
+  >= getStmtInfo_internal;
+
+const getProbeInfo_internal: Server.GetRequest<
+  marker,
+  { condition: boolean, effects: boolean, rank: number,
+    stmt?: Json.key<'#stmt'>, code?: string }
+  > = {
+  kind: Server.RqKind.GET,
+  name:   'plugins.eva.values.getProbeInfo',
+  input:  jMarker,
+  output: Json.jObject({
+            condition: Json.jFail(Json.jBoolean,'Boolean expected'),
+            effects: Json.jFail(Json.jBoolean,'Boolean expected'),
+            rank: Json.jFail(Json.jNumber,'Number expected'),
+            stmt: Json.jKey<'#stmt'>('#stmt'),
+            code: Json.jString,
+          }),
+};
+/** Probe informations */
+export const getProbeInfo: Server.GetRequest<
+  marker,
+  { condition: boolean, effects: boolean, rank: number,
+    stmt?: Json.key<'#stmt'>, code?: string }
+  >= getProbeInfo_internal;
+
+const getValues_internal: Server.GetRequest<
+  { callstack?: callstack, target: marker },
+  { v_else?: string, v_then?: string, v_after?: string, values?: string,
+    alarms: [ "True" | "False" | "Unknown", string ][] }
+  > = {
+  kind: Server.RqKind.GET,
+  name:   'plugins.eva.values.getValues',
+  input:  Json.jObject({ callstack: jCallstack, target: jMarkerSafe,}),
+  output: Json.jObject({
+            v_else: Json.jString,
+            v_then: Json.jString,
+            v_after: Json.jString,
+            values: Json.jString,
+            alarms: Json.jList(
+                      Json.jTry(
+                        Json.jPair(
+                          Json.jFail(
+                            Json.jUnion<"True" | "False" | "Unknown">(
+                              Json.jTag("True"),
+                              Json.jTag("False"),
+                              Json.jTag("Unknown"),
+                            ),'Union expected'),
+                          Json.jFail(Json.jString,'String expected'),
+                        ))),
+          }),
+};
+/** Abstract values for the given marker */
+export const getValues: Server.GetRequest<
+  { callstack?: callstack, target: marker },
+  { v_else?: string, v_then?: string, v_after?: string, values?: string,
+    alarms: [ "True" | "False" | "Unknown", string ][] }
+  >= getValues_internal;
+
+/* ------------------------------------- */
diff --git a/ivette/src/frama-c/api/generated/plugins/studia/studia/index.ts b/ivette/src/frama-c/api/generated/plugins/studia/studia/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..003c89fe0638336421928fcdbade1fd3b06b209d
--- /dev/null
+++ b/ivette/src/frama-c/api/generated/plugins/studia/studia/index.ts
@@ -0,0 +1,83 @@
+/* --- Generated Frama-C Server API --- */
+
+/**
+   Studia
+   @packageDocumentation
+   @module frama-c/api/plugins/studia/studia
+*/
+
+//@ts-ignore
+import * as Json from 'dome/data/json';
+//@ts-ignore
+import * as Compare from 'dome/data/compare';
+//@ts-ignore
+import * as Server from 'frama-c/server';
+//@ts-ignore
+import * as State from 'frama-c/states';
+
+//@ts-ignore
+import { byMarker } from 'frama-c/api/kernel/ast';
+//@ts-ignore
+import { jMarker } from 'frama-c/api/kernel/ast';
+//@ts-ignore
+import { jMarkerSafe } from 'frama-c/api/kernel/ast';
+//@ts-ignore
+import { marker } from 'frama-c/api/kernel/ast';
+
+/** Statements that read or write a location. */
+export interface effects {
+  /** List of statements with direct effect. */
+  direct: [ Json.key<'#fct'>, marker ][];
+  /** List of statements with indirect effect. */
+  indirect: [ Json.key<'#fct'>, marker ][];
+}
+
+/** Loose decoder for `effects` */
+export const jEffects: Json.Loose<effects> =
+  Json.jObject({
+    direct: Json.jList(
+              Json.jTry(
+                Json.jPair(
+                  Json.jFail(Json.jKey<'#fct'>('#fct'),'#fct expected'),
+                  jMarkerSafe,
+                ))),
+    indirect: Json.jList(
+                Json.jTry(
+                  Json.jPair(
+                    Json.jFail(Json.jKey<'#fct'>('#fct'),'#fct expected'),
+                    jMarkerSafe,
+                  ))),
+  });
+
+/** Safe decoder for `effects` */
+export const jEffectsSafe: Json.Safe<effects> =
+  Json.jFail(jEffects,'Effects expected');
+
+/** Natural order for `effects` */
+export const byEffects: Compare.Order<effects> =
+  Compare.byFields
+    <{ direct: [ Json.key<'#fct'>, marker ][],
+       indirect: [ Json.key<'#fct'>, marker ][] }>({
+    direct: Compare.array(Compare.pair(Compare.string,byMarker,)),
+    indirect: Compare.array(Compare.pair(Compare.string,byMarker,)),
+  });
+
+const getReadsLval_internal: Server.GetRequest<Json.key<'#lval'>,effects> = {
+  kind: Server.RqKind.GET,
+  name:   'plugins.studia.studia.getReadsLval',
+  input:  Json.jKey<'#lval'>('#lval'),
+  output: jEffects,
+};
+/** Get the list of statements that read a lval. */
+export const getReadsLval: Server.GetRequest<Json.key<'#lval'>,effects>= getReadsLval_internal;
+
+const getWritesLval_internal: Server.GetRequest<Json.key<'#lval'>,effects> = {
+  kind: Server.RqKind.GET,
+  name:   'plugins.studia.studia.getWritesLval',
+  input:  Json.jKey<'#lval'>('#lval'),
+  output: jEffects,
+};
+/** Get the list of statements that write a lval. */
+export const getWritesLval: Server.GetRequest<Json.key<'#lval'>,effects>= getWritesLval_internal;
+
+/* ------------------------------------- */
diff --git a/ivette/api/server_tsc.ml b/ivette/src/frama-c/api/generator.ml
similarity index 96%
rename from ivette/api/server_tsc.ml
rename to ivette/src/frama-c/api/generator.ml
index 4e11f8b611762b57c27393e014da65f20edd760a..61bb475671b26042d989628ca26c3d52e6a7badf 100644
--- a/ivette/api/server_tsc.ml
+++ b/ivette/src/frama-c/api/generator.ml
@@ -15,12 +15,20 @@ module TSC = Self.Action
       let help = "Generate TypeScript API"
     end)
 
+module API = Self.String
+    (struct
+      let option_name = "-server-tsc-pkg"
+      let arg_name = "dir"
+      let default = "frama-c/api"
+      let help = Printf.sprintf "Output package (default is '%s')" default
+     end)
+
 module OUT = Self.String
     (struct
       let option_name = "-server-tsc-out"
       let arg_name = "dir"
-      let default = "api"
-      let help = "Output directory (default is './api')"
+      let default = "src/frama-c/api/generated"
+      let help = Printf.sprintf "Output directory (default is '%s')" default
     end)
 
 module Md = Markdown
@@ -367,10 +375,9 @@ let makeDeclaration fmt names d =
       self.name jtype js self.name;
 
 
-  | D_array { arr_key ; arr_kind } ->
+  | D_array { arr_key ; arr_kind = jkey } ->
     let data = Pkg.Derived.data self in
-    let jkey = (Pkg.Jkey arr_kind) in
-    let jrow = (Pkg.Jdata data) in
+    let jrow = Pkg.Jdata data in
     Format.fprintf fmt
       "@[<hv 2>const %s_internal: State.Array<@,%a,@,%a@,>@] = {@\n"
       self.name jtype jkey jtype jrow ;
@@ -474,12 +481,13 @@ let makeIgnore fmt msg =
 let makePackage pkg name fmt =
   begin
     let open Pkg in
+    let framac = API.get () in
     Format.fprintf fmt "/* --- Generated Frama-C Server API --- */@\n@\n" ;
     Format.fprintf fmt "/**@\n   %s@\n" pkg.p_title ;
     if pkg.p_descr <> [] then
       Format.fprintf fmt "@\n   @[<hov 0>%a@]@\n@\n" pp_descr pkg.p_descr ;
     Format.fprintf fmt "   @@packageDocumentation@\n" ;
-    Format.fprintf fmt "   @@module api/%s@\n" name ;
+    Format.fprintf fmt "   @@module %s/%s@\n" framac name ;
     Format.fprintf fmt "*/@\n@." ;
     let names = Pkg.resolve ~keywords pkg in
     makeIgnore fmt "import * as Json from 'dome/data/json';@\n" ;
@@ -494,11 +502,11 @@ let makePackage pkg name fmt =
          then
            let pkg = Pkg.name_of_pkg ~sep:"/" id.plugin id.package in
            if id.name = name then
-             makeIgnore fmt "import { %s } from 'api/%s';@\n"
-               name pkg
+             makeIgnore fmt "import { %s } from '%s/%s';@\n"
+               name framac pkg
            else
-             makeIgnore fmt "import { %s: %s } from 'api/%s';@\n"
-               id.name name pkg
+             makeIgnore fmt "import { %s: %s } from '%s/%s';@\n"
+               id.name name framac pkg
       ) names ;
     List.iter
       (makeDeclaration fmt names)
diff --git a/ivette/src/frama-c/dive/cytoscape_libs.js b/ivette/src/frama-c/dive/cytoscape_libs.js
deleted file mode 100644
index 0bd1aced540e77450152e649c1475d3326898915..0000000000000000000000000000000000000000
--- a/ivette/src/frama-c/dive/cytoscape_libs.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Currently Cytoscape.use emits an error when a library is already loaded.
-This prevents Hot Module Reloading for modules where Cytescope.use is used.
-Grouping all Cytoscape plugins registrations here solves the problem. */
-
-import Cytoscape from 'cytoscape' ;
-
-import CytoscapeMenu from 'cytoscape-cxtmenu';
-import CytoscapePopper from 'cytoscape-popper';
-import CytoscapeLayoutDagre from 'cytoscape-dagre';
-import CytoscapeLayoutCola from 'cytoscape-cola';
-import CytoscapeLayoutCoseBilkent from 'cytoscape-cose-bilkent';
-import CytoscapeLayoutKlay from 'cytoscape-klay';
-
-Cytoscape.use(CytoscapePopper);
-Cytoscape.use(CytoscapeMenu);
-Cytoscape.use(CytoscapeLayoutDagre);
-Cytoscape.use(CytoscapeLayoutCola);
-Cytoscape.use(CytoscapeLayoutCoseBilkent);
-Cytoscape.use(CytoscapeLayoutKlay);
diff --git a/ivette/src/frama-c/index.tsx b/ivette/src/frama-c/index.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..a63e1225775874f212c5494ee6591c58432c633e
--- /dev/null
+++ b/ivette/src/frama-c/index.tsx
@@ -0,0 +1,69 @@
+/* --------------------------------------------------------------------------*/
+/* --- Frama-C Registry                                                   ---*/
+/* --------------------------------------------------------------------------*/
+
+import React from 'react';
+import * as Ivette from 'ivette';
+
+import History from 'frama-c/kernel/History';
+import Globals from 'frama-c/kernel/Globals';
+import ASTview from 'frama-c/kernel/ASTview';
+import ASTinfo from 'frama-c/kernel/ASTinfo';
+import SourceCode from 'frama-c/kernel/SourceCode';
+import Locations from 'frama-c/kernel/Locations';
+import Properties from 'frama-c/kernel/Properties';
+
+import 'frama-c/kernel/style.css';
+
+/* --------------------------------------------------------------------------*/
+/* --- Frama-C Kernel Groups                                              ---*/
+/* --------------------------------------------------------------------------*/
+
+Ivette.registerGroup({
+  id: 'frama-c.kernel',
+  label: 'Frama-C Kernel',
+}, () => {
+  Ivette.registerSidebar({ id: 'frama-c.globals', children: <Globals /> });
+  Ivette.registerToolbar({ id: 'frama-c.history', children: <History /> });
+  Ivette.registerComponent({
+    id: 'frama-c.astview',
+    label: 'AST',
+    title: 'Normalized C/ACSL Source Code',
+    children: <ASTview />,
+  });
+  Ivette.registerComponent({
+    id: 'frama-c.astinfo',
+    label: 'Informations',
+    title: 'Informations on currently selected item',
+    children: <ASTinfo />,
+  });
+  Ivette.registerComponent({
+    id: 'frama-c.sourcecode',
+    label: 'Source Code',
+    title: 'C/ASCL Source Code',
+    children: <SourceCode />,
+  });
+  Ivette.registerComponent({
+    id: 'frama-c.locations',
+    label: 'Locations',
+    title: 'Selected list of locations',
+    children: <Locations />,
+  });
+  Ivette.registerComponent({
+    id: 'frama-c.properties',
+    label: 'Properties',
+    title: 'Status of ASCL Properties',
+    children: <Properties />,
+  });
+});
+
+/* --------------------------------------------------------------------------*/
+/* --- Frama-C Plug-ins Group                                             ---*/
+/* --------------------------------------------------------------------------*/
+
+Ivette.registerGroup({
+  id: 'frama-c.plugins',
+  label: 'Frama-C Plug-ins',
+});
+
+/* --------------------------------------------------------------------------*/
diff --git a/ivette/src/renderer/ASTinfo.tsx b/ivette/src/frama-c/kernel/ASTinfo.tsx
similarity index 74%
rename from ivette/src/renderer/ASTinfo.tsx
rename to ivette/src/frama-c/kernel/ASTinfo.tsx
index 9e624f8182b12b1915b699b3955a06c225a71a0f..75e85684bdb488849a75da5df3274cf3d5606897 100644
--- a/ivette/src/renderer/ASTinfo.tsx
+++ b/ivette/src/frama-c/kernel/ASTinfo.tsx
@@ -9,15 +9,13 @@ import * as Utils from 'frama-c/utils';
 import { Vfill } from 'dome/layout/boxes';
 import { RichTextBuffer } from 'dome/text/buffers';
 import { Text } from 'dome/text/editors';
-import { Component } from 'frama-c/LabViews';
-
-import { getInfo } from 'api/kernel/ast';
+import { getInfo } from 'frama-c/api/kernel/ast';
 
 // --------------------------------------------------------------------------
 // --- Information Panel
 // --------------------------------------------------------------------------
 
-const ASTinfo = () => {
+export default function ASTinfo() {
 
   const buffer = React.useMemo(() => new RichTextBuffer(), []);
   const [selection, updateSelection] = States.useSelection();
@@ -34,7 +32,7 @@ const ASTinfo = () => {
   // Callbacks
   function onTextSelection(id: string) {
     // For now, the only markers are functions.
-    const location = { function: id };
+    const location = { fct: id };
     updateSelection({ location });
   }
 
@@ -52,20 +50,6 @@ const ASTinfo = () => {
       </Vfill>
     </>
   );
-};
-
-// --------------------------------------------------------------------------
-// --- Export Component
-// --------------------------------------------------------------------------
-
-export default () => (
-  <Component
-    id="frama-c.astinfo"
-    label="Information"
-    title="AST Information"
-  >
-    <ASTinfo />
-  </Component>
-);
+}
 
 // --------------------------------------------------------------------------
diff --git a/ivette/src/frama-c/kernel/ASTview.tsx b/ivette/src/frama-c/kernel/ASTview.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..7bf897426b521f111ee9abb307d1f80344c0d727
--- /dev/null
+++ b/ivette/src/frama-c/kernel/ASTview.tsx
@@ -0,0 +1,296 @@
+// --------------------------------------------------------------------------
+// --- AST Source Code
+// --------------------------------------------------------------------------
+
+import React from 'react';
+import _ from 'lodash';
+import * as Server from 'frama-c/server';
+import * as States from 'frama-c/states';
+import * as Utils from 'frama-c/utils';
+
+import * as Dome from 'dome';
+import { RichTextBuffer } from 'dome/text/buffers';
+import { Text } from 'dome/text/editors';
+import { TitleBar } from 'ivette';
+import * as Preferences from 'ivette/prefs';
+
+import * as Ast from 'frama-c/api/kernel/ast';
+import * as Properties from 'frama-c/api/kernel/properties';
+import { getCallers, getDeadCode } from 'frama-c/api/plugins/eva/general';
+import { getWritesLval, getReadsLval } from 'frama-c/api/plugins/studia/studia';
+
+// --------------------------------------------------------------------------
+// --- Pretty Printing (Browser Console)
+// --------------------------------------------------------------------------
+
+const D = new Dome.Debug('AST View');
+
+// --------------------------------------------------------------------------
+// --- Rich Text Printer
+// --------------------------------------------------------------------------
+
+async function loadAST(
+  buffer: RichTextBuffer, theFunction?: string, theMarker?: string,
+) {
+  buffer.clear();
+  if (theFunction) {
+    buffer.log('// Loading', theFunction, '…');
+    (async () => {
+      try {
+        const data = await Server.send(Ast.printFunction, theFunction);
+        buffer.clear();
+        if (!data) {
+          buffer.log('// No code for function', theFunction);
+        }
+        Utils.printTextWithTags(buffer, data);
+        if (theMarker)
+          buffer.scroll(theMarker);
+      } catch (err) {
+        D.error(
+          `Fail to retrieve the AST of function '${theFunction}' ` +
+          `and marker '${theMarker}':`, err,
+        );
+      }
+    })();
+  }
+}
+
+/* --------------------------------------------------------------------------*/
+/* --- Function Callers                                                   ---*/
+/* --------------------------------------------------------------------------*/
+
+async function functionCallers(functionName: string) {
+  try {
+    const data = await Server.send(getCallers, functionName);
+    const locations = data.map(([fct, marker]) => ({ fct, marker }));
+    return locations;
+  } catch (err) {
+    D.error(`Fail to retrieve callers of function '${functionName}':`, err);
+    return [];
+  }
+}
+
+/* --------------------------------------------------------------------------*/
+/* --- Studia Access                                                      ---*/
+/* --------------------------------------------------------------------------*/
+
+type access = 'Reads' | 'Writes';
+
+async function studia(
+  marker: string,
+  info: Ast.markerInfoData,
+  kind: access,
+) {
+  const request = kind === 'Reads' ? getReadsLval : getWritesLval;
+  const data = await Server.send(request, marker);
+  const locations = data.direct.map(([f, m]) => ({ fct: f, marker: m }));
+  const lval = info.name;
+  if (locations.length > 0) {
+    const name = `${kind} of ${lval}`;
+    const acc = (kind === 'Reads') ? 'accessing' : 'modifying';
+    const title =
+      `List of statements ${acc} the memory location pointed by ${lval}.`;
+    return { name, title, locations, index: 0 };
+  }
+  const name = `No ${kind.toLowerCase()} of ${lval}`;
+  return { name, title: '', locations: [], index: 0 };
+}
+
+/* --------------------------------------------------------------------------*/
+/* --- Property Bullets                                                   ---*/
+/* --------------------------------------------------------------------------*/
+
+function getBulletColor(status: States.Tag) {
+  switch (status.name) {
+    case 'unknown': return '#FF8300';
+    case 'invalid':
+    case 'invalid_under_hyp': return '#FF0000';
+    case 'valid':
+    case 'valid_under_hyp': return '#00B900';
+    case 'considered_valid': return '#73bbbb';
+    case 'invalid_but_dead':
+    case 'valid_but_dead':
+    case 'unknown_but_dead': return '#000000';
+    case 'never_tried': return '#FFFFFF';
+    case 'inconsistent': return '#FF00FF';
+    default: return '#FF8300';
+  }
+}
+
+function makeBullet(status: States.Tag) {
+  const marker = document.createElement('div');
+  marker.style.color = getBulletColor(status);
+  if (status.descr)
+    marker.title = status.descr;
+  marker.innerHTML = 'â—‰';
+  marker.align = 'center';
+  return marker;
+}
+
+// --------------------------------------------------------------------------
+// --- AST Printer
+// --------------------------------------------------------------------------
+
+export default function ASTview() {
+
+  // Hooks
+  const buffer = React.useMemo(() => new RichTextBuffer(), []);
+  const printed = React.useRef<string | undefined>();
+  const [selection, updateSelection] = States.useSelection();
+  const multipleSelections = selection?.multiple.allSelections;
+  const theFunction = selection?.current?.fct;
+  const theMarker = selection?.current?.marker;
+  const { buttons: themeButtons, theme, fontSize, wrapText } =
+    Preferences.useThemeButtons({
+      target: 'Internal AST',
+      theme: Preferences.AstTheme,
+      fontSize: Preferences.AstFontSize,
+      wrapText: Preferences.AstWrapText,
+      disabled: !theFunction,
+    });
+
+  const markersInfo = States.useSyncArray(Ast.markerInfo);
+  const deadCode = States.useRequest(getDeadCode, theFunction);
+  const propertyStatus = States.useSyncArray(Properties.status).getArray();
+  const statusDict = States.useTags(Properties.propStatusTags);
+
+  const setBullets = React.useCallback(() => {
+    if (theFunction) {
+      propertyStatus.forEach((prop) => {
+        if (prop.fct === theFunction) {
+          const status = statusDict.get(prop.status);
+          if (status) {
+            const bullet = makeBullet(status);
+            const markers = buffer.findTextMarker(prop.key);
+            markers.forEach((marker) => {
+              const pos = marker.find();
+              buffer.forEach((cm) => {
+                cm.setGutterMarker(pos.from.line, 'bullet', bullet);
+              });
+            });
+          }
+        }
+      });
+    }
+  }, [buffer, theFunction, propertyStatus, statusDict]);
+
+  React.useEffect(() => {
+    buffer.on('change', setBullets);
+    return () => { buffer.off('change', setBullets); };
+  }, [buffer, setBullets]);
+
+  // Hook: async loading
+  React.useEffect(() => {
+    if (printed.current !== theFunction) {
+      printed.current = theFunction;
+      loadAST(buffer, theFunction, theMarker);
+    }
+  });
+
+  React.useEffect(() => {
+    const decorator = (marker: string) => {
+      if (multipleSelections?.some((location) => location?.marker === marker))
+        return 'highlighted-marker';
+      if (deadCode?.unreachable?.some((m) => m === marker))
+        return 'dead-code';
+      if (deadCode?.nonTerminating?.some((m) => m === marker))
+        return 'non-terminating';
+      return undefined;
+    };
+    buffer.setDecorator(decorator);
+  }, [buffer, multipleSelections, deadCode]);
+
+  // Hook: marker scrolling
+  React.useEffect(() => {
+    if (theMarker) buffer.scroll(theMarker);
+  }, [buffer, theMarker]);
+
+  function onSelection(markerId: string, meta = false) {
+    const fct = selection?.current?.fct;
+    const location = { fct, marker: Ast.jMarker(markerId) };
+    updateSelection({ location });
+    if (meta) States.MetaSelection.emit(location);
+  }
+
+  async function onContextMenu(markerId: string) {
+    const items = [];
+    const selectedMarkerInfo = markersInfo.getData(markerId);
+    if (selectedMarkerInfo?.var === 'function') {
+      if (selectedMarkerInfo.kind === 'declaration') {
+        const name = selectedMarkerInfo?.name;
+        if (name) {
+          const locations = await functionCallers(name);
+          const locationsByFunction = _.groupBy(locations, (e) => e.fct);
+          _.forEach(locationsByFunction,
+            (e) => {
+              const callerName = e[0].fct;
+              items.push({
+                label:
+                  `Go to caller ${callerName} ` +
+                  `${e.length > 1 ? `(${e.length} call sites)` : ''}`,
+                onClick: () => updateSelection({
+                  name: `Call sites of function ${name}`,
+                  locations,
+                  index: locations.findIndex((l) => l.fct === callerName),
+                }),
+              });
+            });
+        }
+      } else {
+        items.push({
+          label: `Go to definition of ${selectedMarkerInfo.name}`,
+          onClick: () => {
+            const location = { fct: selectedMarkerInfo.name };
+            updateSelection({ location });
+          },
+        });
+      }
+    }
+    const enabled = selectedMarkerInfo?.kind === 'lvalue'
+      || selectedMarkerInfo?.var === 'variable';
+    function onClick(kind: access) {
+      if (selectedMarkerInfo)
+        studia(
+          markerId,
+          selectedMarkerInfo,
+          kind,
+        ).then(updateSelection);
+    }
+    items.push({
+      label: 'Studia: select writes',
+      enabled,
+      onClick: () => onClick('Writes'),
+    });
+    items.push({
+      label: 'Studia: select reads',
+      enabled,
+      onClick: () => onClick('Reads'),
+    });
+    if (items.length > 0)
+      Dome.popupMenu(items);
+  }
+
+  // Component
+  return (
+    <>
+      <TitleBar>
+        {themeButtons}
+      </TitleBar>
+      <Text
+        buffer={buffer}
+        mode="text/x-csrc"
+        theme={theme}
+        fontSize={fontSize}
+        lineWrapping={wrapText}
+        selection={theMarker}
+        onSelection={onSelection}
+        onContextMenu={onContextMenu}
+        gutters={['bullet']}
+        readOnly
+      />
+    </>
+  );
+
+}
+
+// --------------------------------------------------------------------------
diff --git a/ivette/src/frama-c/kernel/Globals.tsx b/ivette/src/frama-c/kernel/Globals.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..034fc93e90aec33741f5dba1e29faec480197079
--- /dev/null
+++ b/ivette/src/frama-c/kernel/Globals.tsx
@@ -0,0 +1,181 @@
+// --------------------------------------------------------------------------
+// --- Frama-C Globals
+// --------------------------------------------------------------------------
+
+import React from 'react';
+import * as Dome from 'dome';
+import { classes } from 'dome/misc/utils';
+import { alpha } from 'dome/data/compare';
+import { Section, Item } from 'dome/frame/sidebars';
+import * as Ivette from 'ivette';
+
+import * as States from 'frama-c/states';
+import { functions, functionsData } from 'frama-c/api/kernel/ast';
+import { isComputed } from 'frama-c/api/plugins/eva/general';
+
+// --------------------------------------------------------------------------
+// --- Global Search Hints
+// --------------------------------------------------------------------------
+
+function makeFunctionHint(fct: functionsData): Ivette.Hint {
+  return {
+    id: fct.key,
+    label: fct.name,
+    title: fct.signature,
+    onSelection: () => States.setSelection({ fct: fct.name }),
+  };
+}
+
+async function lookupGlobals(pattern: string): Promise<Ivette.Hint[]> {
+  const lookup = pattern.toLowerCase();
+  const fcts = States.getSyncArray(functions).getArray();
+  return fcts.filter((fn) => (
+    0 <= fn.name.toLowerCase().indexOf(lookup)
+  )).map(makeFunctionHint);
+}
+
+Ivette.registerHints('frama-c.globals', lookupGlobals);
+
+// --------------------------------------------------------------------------
+// --- Function Item
+// --------------------------------------------------------------------------
+
+interface FctItemProps {
+  fct: functionsData;
+  current: string | undefined;
+  onSelection: (name: string) => void;
+}
+
+function FctItem(props: FctItemProps) {
+  const { name, signature, main, stdlib, builtin, defined } = props.fct;
+  const className = classes(
+    main && 'globals-main',
+    (stdlib || builtin) && 'globals-stdlib',
+  );
+  const attributes = classes(
+    main && '(main)',
+    !stdlib && !builtin && !defined && '(ext)',
+  );
+  return (
+    <Item
+      className={className}
+      label={name}
+      title={signature}
+      selected={name === props.current}
+      onSelection={() => props.onSelection(name)}
+    >
+      {attributes && <span className="globals-attr">{attributes}</span>}
+    </Item>
+  );
+}
+
+// --------------------------------------------------------------------------
+// --- Globals Section(s)
+// --------------------------------------------------------------------------
+
+export default () => {
+
+  // Hooks
+  const [selection, updateSelection] = States.useSelection();
+  const fcts = States.useSyncArray(functions).getArray().sort(
+    (f, g) => alpha(f.name, g.name),
+  );
+  const { useFlipSettings } = Dome;
+  const [stdlib, flipStdlib] =
+    useFlipSettings('ivette.globals.stdlib', false);
+  const [builtin, flipBuiltin] =
+    useFlipSettings('ivette.globals.builtin', false);
+  const [undef, flipUndef] =
+    useFlipSettings('ivette.globals.undef', true);
+  const [selected, flipSelected] =
+    useFlipSettings('ivette.globals.selected', false);
+  const [evaOnly, flipEvaOnly] =
+    useFlipSettings('ivette.globals.evaonly', false);
+  const multipleSelection = selection?.multiple;
+  const multipleSelectionActive = multipleSelection?.allSelections.length > 0;
+  const evaComputed = States.useRequest(isComputed, null);
+
+  function isSelected(fct: functionsData) {
+    return multipleSelection?.allSelections.some(
+      (l) => fct.name === l?.fct
+    );
+  }
+
+  // Currently selected function.
+  const current: undefined | string = selection?.current?.fct;
+
+  function showFunction(fct: functionsData) {
+    const visible =
+      (stdlib || !fct.stdlib)
+      && (builtin || !fct.builtin)
+      && (undef || fct.defined)
+      && (!evaOnly || !evaComputed || (fct.eva_analyzed === true))
+      && (!selected || !multipleSelectionActive || isSelected(fct));
+    return visible || (current && fct.name === current);
+  }
+
+  function onSelection(name: string) {
+    updateSelection({ location: { fct: name } });
+  }
+
+  async function onContextMenu() {
+    const items: Dome.PopupMenuItem[] = [
+      {
+        label: 'Show Frama-C builtins',
+        checked: builtin,
+        onClick: flipBuiltin,
+      },
+      {
+        label: 'Show stdlib functions',
+        checked: stdlib,
+        onClick: flipStdlib,
+      },
+      {
+        label: 'Show undefined functions',
+        checked: undef,
+        onClick: flipUndef,
+      },
+      'separator',
+      {
+        label: 'Selected only',
+        enabled: multipleSelectionActive,
+        checked: selected,
+        onClick: flipSelected,
+      },
+      {
+        label: 'Analyzed by Eva only',
+        enabled: evaComputed,
+        checked: evaOnly,
+        onClick: flipEvaOnly,
+      },
+    ];
+    Dome.popupMenu(items);
+  }
+
+  // Filtered
+
+  const filtered = fcts.filter(showFunction);
+  const nTotal = fcts.length;
+  const nFilter = filtered.length;
+  const title = `Functions ${nFilter} / ${nTotal}`;
+  return (
+    <Section
+      label="Functions"
+      title={title}
+      onContextMenu={onContextMenu}
+      defaultUnfold
+    >
+      {filtered.map((fct) => (
+        <FctItem
+          key={fct.name}
+          fct={fct}
+          current={current}
+          onSelection={onSelection}
+        />
+      ))}
+    </Section>
+  );
+
+};
+
+// --------------------------------------------------------------------------
diff --git a/ivette/src/frama-c/kernel/History.tsx b/ivette/src/frama-c/kernel/History.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..d806894fbf0f4450275e0e9f3c3bf73bd498462a
--- /dev/null
+++ b/ivette/src/frama-c/kernel/History.tsx
@@ -0,0 +1,33 @@
+/* --------------------------------------------------------------------------*/
+/* --- Frama-C Selection History                                          ---*/
+/* --------------------------------------------------------------------------*/
+
+import React from 'react';
+import * as Toolbar from 'dome/frame/toolbars';
+import * as States from 'frama-c/states';
+
+export default function History() {
+  const [selection, updateSelection] = States.useSelection();
+
+  const doPrevSelect = () => { updateSelection('HISTORY_PREV'); };
+  const doNextSelect = () => { updateSelection('HISTORY_NEXT'); };
+
+  return (
+    <Toolbar.ButtonGroup>
+      <Toolbar.Button
+        icon="ANGLE.LEFT"
+        onClick={doPrevSelect}
+        disabled={!selection || selection.history.prevSelections.length === 0}
+        title="Previous location"
+      />
+      <Toolbar.Button
+        icon="ANGLE.RIGHT"
+        onClick={doNextSelect}
+        disabled={!selection || selection.history.nextSelections.length === 0}
+        title="Next location"
+      />
+    </Toolbar.ButtonGroup>
+  );
+}
+
+/* --------------------------------------------------------------------------*/
diff --git a/ivette/src/renderer/Locations.tsx b/ivette/src/frama-c/kernel/Locations.tsx
similarity index 77%
rename from ivette/src/renderer/Locations.tsx
rename to ivette/src/frama-c/kernel/Locations.tsx
index 3008d8d9cd2e83bd70089181f168d8f98578d9a2..3d5f9da244bddeb6ff5a2ed9fa36d2e99d09fcd1 100644
--- a/ivette/src/renderer/Locations.tsx
+++ b/ivette/src/frama-c/kernel/Locations.tsx
@@ -5,12 +5,14 @@
 import React from 'react';
 import * as States from 'frama-c/states';
 
+import * as Json from 'dome/data/json';
 import { CompactModel } from 'dome/table/arrays';
-import { Table, Column } from 'dome/table/views';
+import { Table, Column, Renderer } from 'dome/table/views';
 import { Label } from 'dome/controls/labels';
 import { IconButton } from 'dome/controls/buttons';
 import { Space } from 'dome/frame/toolbars';
-import { Component, TitleBar } from 'frama-c/LabViews';
+import { TitleBar } from 'ivette';
+import { markerInfo } from 'frama-c/api/kernel/ast';
 
 // --------------------------------------------------------------------------
 // --- Locations Panel
@@ -18,7 +20,7 @@ import { Component, TitleBar } from 'frama-c/LabViews';
 
 type LocationId = States.Location & { id: number };
 
-const LocationsTable = () => {
+export default function LocationsTable() {
 
   // Hooks
   const [selection, updateSelection] = States.useSelection();
@@ -27,6 +29,17 @@ const LocationsTable = () => {
   ), []);
   const multipleSelections = selection?.multiple;
   const numberOfSelections = multipleSelections?.allSelections?.length;
+  const markersInfo = States.useSyncArray(markerInfo);
+
+  // Renderer for statement markers.
+  const renderMarker: Renderer<string> =
+    (loc: string) => {
+      const markerId = (loc as Json.key<'#markerInfo'>);
+      const info = markersInfo.getData(markerId);
+      const sloc = info?.sloc;
+      const position = `${sloc?.base}:${sloc?.line}`;
+      return <Label label={position} title={info?.descr} />;
+    };
 
   // Updates [[model]] with the current multiple selections.
   React.useEffect(() => {
@@ -94,6 +107,11 @@ const LocationsTable = () => {
           title={`Clear location${numberOfSelections > 1 ? 's' : ''}`}
         />
       </TitleBar>
+      <Label
+        label={multipleSelections?.name}
+        title={multipleSelections?.title}
+        style={{ textAlign: 'center' }}
+      />
       <Table
         model={model}
         selection={multipleSelections?.index}
@@ -106,25 +124,16 @@ const LocationsTable = () => {
           width={25}
           getter={(r: { id: number }) => r.id + 1}
         />
-        <Column id="function" label="Function" width={120} />
-        <Column id="marker" label="Marker" fill />
+        <Column id="fct" label="Function" width={120} />
+        <Column
+          id="marker"
+          label="Statement"
+          fill
+          render={renderMarker}
+        />
       </Table>
     </>
   );
-};
-
-// --------------------------------------------------------------------------
-// --- Export Component
-// --------------------------------------------------------------------------
-
-export default () => (
-  <Component
-    id="frama-c.locations"
-    label="Locations"
-    title="Browse multiple locations"
-  >
-    <LocationsTable />
-  </Component>
-);
+}
 
 // --------------------------------------------------------------------------
diff --git a/ivette/src/frama-c/kernel/Properties.tsx b/ivette/src/frama-c/kernel/Properties.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..5024f12f3e0ce47a2bbfb0d88d4a43edb8b4c2ec
--- /dev/null
+++ b/ivette/src/frama-c/kernel/Properties.tsx
@@ -0,0 +1,534 @@
+// --------------------------------------------------------------------------
+// --- Properties
+// --------------------------------------------------------------------------
+
+import _ from 'lodash';
+import React, { useEffect } from 'react';
+import * as Dome from 'dome';
+import * as Json from 'dome/data/json';
+import * as States from 'frama-c/states';
+import * as Compare from 'dome/data/compare';
+import * as Settings from 'dome/data/settings';
+import { Label, Code } from 'dome/controls/labels';
+import { IconButton, Checkbox } from 'dome/controls/buttons';
+import * as Models from 'dome/table/models';
+import * as Arrays from 'dome/table/arrays';
+import { Table, Column, ColumnProps, Renderer } from 'dome/table/views';
+import { TitleBar } from 'ivette';
+import { Scroll, Folder } from 'dome/layout/boxes';
+
+import { RSplit } from 'dome/layout/splitters';
+
+import { source as SourceLoc } from 'frama-c/api/kernel/services';
+import { statusData as Property } from 'frama-c/api/kernel/properties';
+import * as Properties from 'frama-c/api/kernel/properties';
+
+// --------------------------------------------------------------------------
+// --- Filters
+// --------------------------------------------------------------------------
+
+const DEFAULTS: { [key: string]: boolean } = {
+  currentFunction: false,
+  'status.valid': true,
+  'status.valid_hyp': true,
+  'status.unknown': true,
+  'status.invalid': true,
+  'status.invalid_hyp': true,
+  'status.considered_valid': false,
+  'status.untried': false,
+  'status.dead': false,
+  'status.inconsistent': true,
+  'kind.assert': true,
+  'kind.invariant': true,
+  'kind.variant': true,
+  'kind.requires': true,
+  'kind.ensures': true,
+  'kind.instance': true,
+  'kind.assumes': true,
+  'kind.assigns': true,
+  'kind.froms': true,
+  'kind.allocates': true,
+  'kind.behavior': false,
+  'kind.reachable': false,
+  'kind.axiomatic': true,
+  'kind.pragma': true,
+  'kind.others': true,
+  'alarms.alarms': true, // show properties that are alarms
+  'alarms.others': true, // show properties that are not alarms
+  'alarms.overflow': true,
+  'alarms.division_by_zero': true,
+  'alarms.mem_access': true,
+  'alarms.index_bound': true,
+  'alarms.pointer_value': true,
+  'alarms.shift': true,
+  'alarms.ptr_comparison': true,
+  'alarms.differing_blocks': true,
+  'alarms.separation': true,
+  'alarms.overlap': true,
+  'alarms.initialization': true,
+  'alarms.dangling_pointer': true,
+  'alarms.special_float': true,
+  'alarms.float_to_int': true,
+  'alarms.function_pointer': true,
+  'alarms.union_initialization': true,
+  'alarms.bool_value': true,
+};
+
+function filter(path: string) {
+  const defaultValue = DEFAULTS[path] ?? true;
+  return Settings.getWindowSettings(
+    `ivette.properties.filter.${path}`,
+    Json.jBoolean,
+    defaultValue,
+  );
+}
+
+function useFilter(path: string) {
+  const defaultValue = DEFAULTS[path] ?? true;
+  return Dome.useFlipSettings(
+    `ivette.properties.filter.${path}`,
+    defaultValue,
+  );
+}
+
+function filterStatus(
+  status: Properties.propStatus,
+) {
+  switch (status) {
+    case 'valid':
+      return filter('status.valid');
+    case 'valid_under_hyp':
+      return filter('status.valid_hyp');
+    case 'invalid':
+      return filter('status.invalid');
+    case 'invalid_under_hyp':
+      return filter('status.invalid_hyp');
+    case 'inconsistent':
+      return filter('status.inconsistent');
+    case 'unknown':
+      return filter('status.unknown');
+    case 'considered_valid':
+      return filter('status.considered_valid');
+    case 'never_tried':
+      return filter('status.untried');
+    case 'valid_but_dead':
+    case 'unknown_but_dead':
+    case 'invalid_but_dead':
+      return filter('status.dead');
+    default:
+      return true;
+  }
+}
+
+function filterKind(
+  kind: Properties.propKind,
+) {
+  switch (kind) {
+    case 'assert': return filter('kind.assert');
+    case 'loop_invariant': return filter('kind.invariant');
+    case 'loop_variant': return filter('kind.variant');
+    case 'requires': return filter('kind.requires');
+    case 'ensures': return filter('kind.ensures');
+    case 'instance': return filter('kind.instance');
+    case 'assigns': return filter('kind.assigns');
+    case 'froms': return filter('kind.froms');
+    case 'allocates': return filter('kind.allocates');
+    case 'behavior': return filter('kind.behavior');
+    case 'reachable': return filter('kind.reachable');
+    case 'axiomatic': return filter('kind.axiomatic');
+    case 'loop_pragma': return filter('kind.pragma');
+    case 'assumes': return filter('kind.assumes');
+    default: return filter('kind.others');
+  }
+}
+
+function filterAlarm(alarm: string | undefined) {
+  if (alarm) {
+    if (!filter('alarms.alarms')) return false;
+    switch (alarm) {
+      case 'overflow': return filter('alarms.overflow');
+      case 'division_by_zero': return filter('alarms.division_by_zero');
+      case 'mem_access': return filter('alarms.mem_access');
+      case 'index_bound': return filter('alarms.index_bound');
+      case 'pointer_value': return filter('alarms.pointer_value');
+      case 'shift': return filter('alarms.shift');
+      case 'ptr_comparison': return filter('alarms.ptr_comparison');
+      case 'differing_blocks': return filter('alarms.differing_blocks');
+      case 'separation': return filter('alarms.separation');
+      case 'overlap': return filter('alarms.overlap');
+      case 'initialization': return filter('alarms.initialization');
+      case 'dangling_pointer': return filter('alarms.dangling_pointer');
+      case 'is_nan_or_infinite':
+      case 'is_nan': return filter('alarms.special_float');
+      case 'float_to_int': return filter('alarms.float_to_int');
+      case 'function_pointer': return filter('alarms.function_pointer');
+      case 'initialization_of_union':
+        return filter('alarms.union_initialization');
+      case 'bool_value': return filter('alarms.bool_value');
+      default: return false;
+    }
+  }
+  return filter('alarms.others');
+}
+
+function filterProperty(p: Property) {
+  return filterStatus(p.status)
+    && filterKind(p.kind)
+    && filterAlarm(p.alarm);
+}
+
+// --------------------------------------------------------------------------
+// --- Property Columns
+// --------------------------------------------------------------------------
+
+const renderCode: Renderer<string> =
+  (text: string) => (<Code className="code-column" title={text}>{text}</Code>);
+
+const renderTag: Renderer<States.Tag> =
+  (d: States.Tag) => <Label label={d.label ?? d.name} title={d.descr} />;
+
+const renderNames: Renderer<string[]> =
+  (names: string[]) => {
+    const label = names?.join(': ');
+    return (label ? <Label label={label} /> : null);
+  };
+
+const renderDir: Renderer<SourceLoc> =
+  (loc: SourceLoc) => (
+    <Code className="code-column" label={loc.dir} title={loc.file} />
+  );
+
+const renderFile: Renderer<SourceLoc> =
+  (loc: SourceLoc) => (
+    <Code className="code-column" label={loc.base} title={loc.file} />
+  );
+
+function ColumnCode<Row>(props: ColumnProps<Row, string>) {
+  return <Column render={renderCode} {...props} />;
+}
+
+function ColumnTag<Row>(props: ColumnProps<Row, States.Tag>) {
+  return <Column render={renderTag} {...props} />;
+}
+
+// --------------------------------------------------------------------------
+// --- Properties Table
+// -------------------------------------------------------------------------
+
+const bySource =
+  Compare.byFields<SourceLoc>({ file: Compare.alpha, line: Compare.number });
+
+const byStatus =
+  Compare.byRank(
+    'inconsistent',
+    'invalid',
+    'invalid_under_hyp',
+    'unknown',
+    'valid_under_hyp',
+    'valid',
+    'invalid_but_dead',
+    'unknown_but_dead',
+    'valid_but_dead',
+    'never_tried',
+    'considered_valid',
+  );
+
+const byProperty: Compare.ByFields<Property> = {
+  status: byStatus,
+  fct: Compare.defined(Compare.alpha),
+  source: bySource,
+  kind: Compare.structural,
+  alarm: Compare.defined(Compare.alpha),
+  names: Compare.array(Compare.alpha),
+  predicate: Compare.defined(Compare.alpha),
+  key: Compare.string,
+  kinstr: Compare.structural,
+};
+
+const byDir = Compare.byFields<SourceLoc>({ dir: Compare.alpha });
+const byFile = Compare.byFields<SourceLoc>({ base: Compare.alpha });
+
+const byColumn: Arrays.ByColumns<Property> = {
+  dir: Compare.byFields<Property>({ source: byDir }),
+  file: Compare.byFields<Property>({ source: byFile }),
+};
+
+class PropertyModel extends Arrays.CompactModel<Json.key<'#status'>, Property> {
+
+  private filterFun?: string;
+
+  constructor() {
+    super((p: Property) => p.key);
+    this.setOrderingByFields(byProperty);
+    this.setColumnOrder(byColumn);
+    this.setFilter(this.filterItem.bind(this));
+  }
+
+  setFilterFunction(kf?: string) {
+    this.filterFun = kf;
+    if (filter('currentFunction')) this.reload();
+  }
+
+  filterItem(prop: Property) {
+    const kf = prop.fct;
+    const cf = this.filterFun;
+    const filteringFun = cf && filter('currentFunction');
+    const filterFunction = filteringFun ? kf === cf : true;
+    return filterFunction && filterProperty(prop);
+  }
+
+}
+
+// --------------------------------------------------------------------------
+// --- Property Filter Form
+// -------------------------------------------------------------------------
+
+const Reload = new Dome.Event('ivette.properties.reload');
+
+interface SectionProps {
+  label: string;
+  children: React.ReactNode;
+}
+
+function Section(props: SectionProps) {
+  const settings = `properties-section-${props.label}`;
+  return (
+    <Folder label={props.label} settings={settings}>
+      {props.children}
+    </Folder>
+  );
+}
+
+interface CheckFieldProps {
+  label: string;
+  path: string;
+}
+
+function CheckField(props: CheckFieldProps) {
+  const [value, setValue] = useFilter(props.path);
+  const onChange = () => { setValue(); Reload.emit(); };
+  return (
+    <Checkbox
+      style={{ display: 'block' }}
+      label={props.label}
+      value={value}
+      onChange={onChange}
+    />
+  );
+}
+
+/* eslint-disable max-len */
+
+function PropertyFilter() {
+  return (
+    <Scroll>
+      <CheckField label="Current function" path="currentFunction" />
+      <Section label="Status">
+        <CheckField label="Valid" path="status.valid" />
+        <CheckField label="Valid under hyp." path="status.valid_hyp" />
+        <CheckField label="Unknown" path="status.unknown" />
+        <CheckField label="Invalid" path="status.invalid" />
+        <CheckField label="Invalid under hyp." path="status.invalid_hyp" />
+        <CheckField label="Considered valid" path="status.considered_valid" />
+        <CheckField label="Untried" path="status.untried" />
+        <CheckField label="Dead" path="status.dead" />
+        <CheckField label="Inconsistent" path="status.inconsistent" />
+      </Section>
+      <Section label="Property kind">
+        <CheckField label="Assertions" path="kind.assert" />
+        <CheckField label="Invariants" path="kind.invariant" />
+        <CheckField label="Variants" path="kind.variant" />
+        <CheckField label="Preconditions" path="kind.requires" />
+        <CheckField label="Postconditions" path="kind.ensures" />
+        <CheckField label="Instance" path="kind.instance" />
+        <CheckField label="Assigns clauses" path="kind.assigns" />
+        <CheckField label="From clauses" path="kind.froms" />
+        <CheckField label="Allocates" path="kind.allocates" />
+        <CheckField label="Behaviors" path="kind.behavior" />
+        <CheckField label="Reachables" path="kind.reachable" />
+        <CheckField label="Axiomatics" path="kind.axiomatic" />
+        <CheckField label="Pragma" path="kind.pragma" />
+        <CheckField label="Assumes" path="kind.assumes" />
+        <CheckField label="Others" path="kind.others" />
+      </Section>
+      <Section label="Alarms">
+        <CheckField label="Alarms" path="alarms.alarms" />
+        <CheckField label="Others" path="alarms.others" />
+      </Section>
+      <Section label="Alarms kind">
+        <CheckField label="Overflows" path="alarms.overflow" />
+        <CheckField label="Divisions by zero" path="alarms.division_by_zero" />
+        <CheckField label="Shifts" path="alarms.shift" />
+        <CheckField label="Special floats" path="alarms.special_float" />
+        <CheckField label="Float to int" path="alarms.float_to_int" />
+        <CheckField label="_Bool values" path="alarms.bool_value" />
+        <CheckField label="Memory accesses" path="alarms.mem_access" />
+        <CheckField label="Index bounds" path="alarms.index_bound" />
+        <CheckField label="Initializations" path="alarms.initialization" />
+        <CheckField label="Dangling pointers" path="alarms.dangling_pointer" />
+        <CheckField label="Pointer values" path="alarms.pointer_value" />
+        <CheckField label="Function pointers" path="alarms.function_pointer" />
+        <CheckField label="Pointer comparisons" path="alarms.ptr_comparison" />
+        <CheckField label="Differing blocks" path="alarms.differing_blocks" />
+        <CheckField label="Separations" path="alarms.separation" />
+        <CheckField label="Overlaps" path="alarms.overlap" />
+        <CheckField label="Initialization of unions" path="alarms.union_initialization" />
+      </Section>
+    </Scroll>
+  );
+}
+
+/* eslint-enable max-len */
+
+// -------------------------------------------------------------------------
+// --- Property Columns
+// -------------------------------------------------------------------------
+
+const PropertyColumns = () => {
+
+  const statusDict = States.useTags(Properties.propStatusTags);
+  const kindDict = States.useTags(Properties.propKindTags);
+  const alarmDict = States.useTags(Properties.alarmsTags);
+
+  const getStatus = React.useCallback(
+    ({ status: st }: Property) => (statusDict.get(st) ?? { name: st }),
+    [statusDict],
+  );
+
+  const getKind = React.useCallback(
+    ({ kind: kd }: Property) => (kindDict.get(kd) ?? { name: kd }),
+    [kindDict],
+  );
+
+  const getAlarm = React.useCallback(
+    ({ alarm }: Property) => (
+      alarm === undefined ? alarm : (alarmDict.get(alarm) ?? { name: alarm })
+    ),
+    [alarmDict],
+  );
+
+  return (
+    <>
+      <Column
+        id="dir"
+        label="Directory"
+        width={240}
+        visible={false}
+        getter={(prop: Property) => prop?.source}
+        render={renderDir}
+      />
+      <Column
+        id="file"
+        label="File"
+        width={120}
+        getter={(prop: Property) => prop?.source}
+        render={renderFile}
+      />
+      <ColumnCode id="fct" label="Function" width={120} />
+      <ColumnTag id="kind" label="Property kind" getter={getKind} width={120} />
+      <ColumnTag id="alarm" label="Alarms" getter={getAlarm} width={160} />
+      <Column
+        id="names"
+        label="Names"
+        width={240}
+        visible={false}
+        render={renderNames}
+      />
+      <ColumnCode id="predicate" label="Predicate" fill />
+      <ColumnCode id="descr" label="Property" fill visible={false} />
+      <ColumnTag
+        id="status"
+        label="Status"
+        fixed
+        width={100}
+        align="center"
+        getter={getStatus}
+      />
+    </>
+  );
+
+};
+
+function FilterRatio({ model }: { model: PropertyModel }) {
+  Models.useModel(model);
+  const [filtered, total] = [model.getRowCount(), model.getTotalRowCount()];
+  return (
+    <Label
+      className="component-info"
+      title="Displayed Properties / Total"
+      display={filtered !== total || true}
+    >
+      {filtered} / {total}
+    </Label>
+  );
+}
+
+// -------------------------------------------------------------------------
+// --- Properties Table
+// -------------------------------------------------------------------------
+
+export default function RenderProperties() {
+
+  // Hooks
+  const model = React.useMemo(() => new PropertyModel(), []);
+  const data = States.useSyncArray(Properties.status).getArray();
+  useEffect(() => {
+    model.removeAllData();
+    model.updateData(data);
+    model.reload();
+  }, [model, data]);
+
+  const [selection, updateSelection] = States.useSelection();
+
+  const [showFilter, flipFilter] =
+    Dome.useFlipSettings('ivette.properties.showFilter');
+
+  // Updating the filter
+  Dome.useEvent(Reload, model.reload);
+  const selectedFunction = selection?.current?.fct;
+  React.useEffect(() => {
+    model.setFilterFunction(selectedFunction);
+  }, [model, selectedFunction]);
+
+  // Callbacks
+
+  const onPropertySelection = React.useCallback(
+    ({ key: marker, fct }: Property) => {
+      const location = { fct, marker };
+      updateSelection({ location });
+    }, [updateSelection],
+  );
+
+  const propertySelection = selection?.current?.marker;
+
+  return (
+    <>
+      <TitleBar>
+        <FilterRatio model={model} />
+        <IconButton
+          icon="CLIPBOARD"
+          selected={showFilter}
+          onClick={flipFilter}
+          title="Toggle filters panel"
+        />
+      </TitleBar>
+      <RSplit
+        settings="ivette.properties.filterSplit"
+        unfold={showFilter}
+      >
+        <Table<string, Property>
+          model={model}
+          sorting={model}
+          selection={propertySelection}
+          onSelection={onPropertySelection}
+          settings="ivette.properties.table"
+        >
+          <PropertyColumns />
+        </Table>
+        <PropertyFilter />
+      </RSplit>
+    </>
+  );
+}
+
+// --------------------------------------------------------------------------
diff --git a/ivette/src/frama-c/kernel/SourceCode.tsx b/ivette/src/frama-c/kernel/SourceCode.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..9fb4f2082b3f11e93b9a94de6fa88b546ad0614a
--- /dev/null
+++ b/ivette/src/frama-c/kernel/SourceCode.tsx
@@ -0,0 +1,109 @@
+// --------------------------------------------------------------------------
+// --- Source Code
+// --------------------------------------------------------------------------
+
+import React from 'react';
+import * as States from 'frama-c/states';
+
+import * as Dome from 'dome';
+import { readFile } from 'dome/system';
+import { RichTextBuffer } from 'dome/text/buffers';
+import { Text } from 'dome/text/editors';
+import { TitleBar } from 'ivette';
+import * as Preferences from 'ivette/prefs';
+import { functions, markerInfo } from 'frama-c/api/kernel/ast';
+import { source } from 'frama-c/api/kernel/services';
+
+import 'codemirror/addon/selection/active-line';
+import 'codemirror/addon/dialog/dialog.css';
+import 'codemirror/addon/dialog/dialog';
+import 'codemirror/addon/search/searchcursor';
+import 'codemirror/addon/search/search';
+import 'codemirror/addon/search/jump-to-line';
+
+// --------------------------------------------------------------------------
+// --- Pretty Printing (Browser Console)
+// --------------------------------------------------------------------------
+
+const D = new Dome.Debug('Source Code');
+
+// --------------------------------------------------------------------------
+// --- Source Code Printer
+// --------------------------------------------------------------------------
+
+export default function SourceCode() {
+
+  // Hooks
+  const buffer = React.useMemo(() => new RichTextBuffer(), []);
+  const [selection] = States.useSelection();
+  const theFunction = selection?.current?.fct;
+  const theMarker = selection?.current?.marker;
+  const { buttons: themeButtons, theme, fontSize, wrapText } =
+    Preferences.useThemeButtons({
+      target: 'Source Code',
+      theme: Preferences.SourceTheme,
+      fontSize: Preferences.SourceFontSize,
+      wrapText: Preferences.AstWrapText,
+      disabled: !theFunction,
+    });
+
+  const markersInfo = States.useSyncArray(markerInfo);
+  const functionsData = States.useSyncArray(functions).getArray();
+
+  const currentFile = React.useRef<string>();
+
+  React.useEffect(() => {
+    // Async source file loading and jump to line/location.
+    async function loadSourceCode(sloc?: source) {
+      if (sloc) {
+        const { file, line } = sloc;
+        try {
+          if (file !== currentFile.current) {
+            currentFile.current = file;
+            const content = await readFile(file);
+            buffer.setValue(content);
+          }
+          buffer.forEach((cm) => { cm.setCursor(line - 1); });
+        } catch (err) {
+          D.error(`Fail to load source code file ${file}.`);
+        }
+      }
+    }
+    // Actual source code loading upon function or marker update.
+    const sloc =
+      /* markers have more precise source location */
+      (theMarker && markersInfo.getData(theMarker)?.sloc)
+      ??
+      (theFunction && functionsData.find((e) => e.name === theFunction)?.sloc);
+    if (sloc) {
+      loadSourceCode(sloc);
+    } else {
+      currentFile.current = undefined;
+      buffer.clear();
+    }
+  }, [buffer, functionsData, markersInfo, theFunction, theMarker]);
+
+  // Component
+  return (
+    <>
+      <TitleBar>
+        {themeButtons}
+      </TitleBar>
+      <Text
+        buffer={buffer}
+        mode="text/x-csrc"
+        theme={theme}
+        fontSize={fontSize}
+        lineWrapping={wrapText}
+        selection={theMarker}
+        lineNumbers={!!theFunction}
+        styleActiveLine={!!theFunction}
+        extraKeys={{ 'Alt-F': 'findPersistent' }}
+        readOnly
+      />
+    </>
+  );
+
+}
+
+// --------------------------------------------------------------------------
diff --git a/ivette/src/frama-c/kernel/style.css b/ivette/src/frama-c/kernel/style.css
new file mode 100644
index 0000000000000000000000000000000000000000..04aacdc2e13f2fb6a72f6b6bc2eabbfa7d6decdf
--- /dev/null
+++ b/ivette/src/frama-c/kernel/style.css
@@ -0,0 +1,52 @@
+/* -------------------------------------------------------------------------- */
+/* --- Properties                                                         --- */
+/* -------------------------------------------------------------------------- */
+
+.code-column {
+    margin: 0px;
+    padding: 0px;
+    display: block;
+    text-overflow: ellipsis;
+}
+
+/* -------------------------------------------------------------------------- */
+/* --- AST View                                                           --- */
+/* -------------------------------------------------------------------------- */
+
+.highlighted-marker {
+    background-color: #FFFF66;
+}
+
+.dead-code {
+    background-color: #BBB;
+    border-bottom: solid 0.1em #BBB;
+}
+
+.non-terminating {
+    border-bottom: solid 0.2em #BBB;
+}
+
+.bullet {
+    width: 1.5em;
+    background: #DDD;
+}
+
+/* -------------------------------------------------------------------------- */
+/* --- Globals                                                            --- */
+/* -------------------------------------------------------------------------- */
+
+.globals-main label {
+    text-decoration: underline;
+}
+
+.globals-stdlib label {
+    font-style: italic;
+}
+
+.globals-attr {
+    font-size: smaller;
+    font-weight: lighter;
+    color: #aaa;
+}
+
+/* -------------------------------------------------------------------------- */
diff --git a/ivette/src/frama-c/pkg.json b/ivette/src/frama-c/pkg.json
new file mode 100644
index 0000000000000000000000000000000000000000..8a0024216f05e9c67a485bff3d0156d27edb2b66
--- /dev/null
+++ b/ivette/src/frama-c/pkg.json
@@ -0,0 +1,3 @@
+{
+  "name": "Frama-C"
+}
diff --git a/ivette/src/frama-c/plugins/dive/cytoscape_libs.js b/ivette/src/frama-c/plugins/dive/cytoscape_libs.js
new file mode 100644
index 0000000000000000000000000000000000000000..35ecb1b1ffdebe5bed3e5964a17aad4e492479d3
--- /dev/null
+++ b/ivette/src/frama-c/plugins/dive/cytoscape_libs.js
@@ -0,0 +1,24 @@
+/* Currently Cytoscape.use emits an error when a library is already loaded.
+This prevents Hot Module Reloading for modules where Cytescope.use is used.
+Grouping all Cytoscape plugins registrations here solves the problem. */
+
+import Cytoscape from 'cytoscape';
+
+import CxtMenu from 'cytoscape-cxtmenu';
+import Popper from 'cytoscape-popper';
+import Panzoom from 'cytoscape-panzoom';
+
+// Layouts
+import Dagre from 'cytoscape-dagre';
+import Cola from 'cytoscape-cola';
+import CoseBilkent from 'cytoscape-cose-bilkent';
+import Klay from 'cytoscape-klay';
+
+Cytoscape.use(Popper);
+Cytoscape.use(CxtMenu);
+Panzoom(Cytoscape); // register extension
+
+Cytoscape.use(Dagre);
+Cytoscape.use(Cola);
+Cytoscape.use(CoseBilkent);
+Cytoscape.use(Klay);
diff --git a/ivette/src/frama-c/dive/Dive.tsx b/ivette/src/frama-c/plugins/dive/index.tsx
similarity index 87%
rename from ivette/src/frama-c/dive/Dive.tsx
rename to ivette/src/frama-c/plugins/dive/index.tsx
index c0480f5b4b54d3bf747390caaceb846ed712fb3b..0cedc34e0e35f2c9c44d625c24ef0e051e5aee3b 100644
--- a/ivette/src/frama-c/dive/Dive.tsx
+++ b/ivette/src/frama-c/plugins/dive/index.tsx
@@ -2,14 +2,16 @@ import React, { useState, useEffect } from 'react';
 import _ from 'lodash';
 import { renderToString } from 'react-dom/server';
 import * as Dome from 'dome';
+import * as Ivette from 'ivette';
 import * as Server from 'frama-c/server';
 import * as States from 'frama-c/states';
 
-import * as API from 'api/plugins/dive';
+import * as API from 'frama-c/api/plugins/dive';
 
 import Cytoscape from 'cytoscape';
 import CytoscapeComponent from 'react-cytoscapejs';
 import './cytoscape_libs';
+import 'cytoscape-panzoom/cytoscape.js-panzoom.css';
 
 import tippy, * as Tippy from 'tippy.js';
 import 'tippy.js/dist/tippy.css';
@@ -19,7 +21,6 @@ import './tippy.css';
 
 import { IconButton } from 'dome/controls/buttons';
 import { Space } from 'dome/frame/toolbars';
-import { Component, TitleBar } from 'frama-c/LabViews';
 
 import '@fortawesome/fontawesome-free/js/all';
 
@@ -34,6 +35,7 @@ interface Cxtcommand {
 
 interface CytoscapeExtended extends Cytoscape.Core {
   cxtmenu(options: any): void;
+  panzoom(options: any): void;
 }
 
 function callstackToString(callstack: API.callstack): string {
@@ -52,6 +54,19 @@ function buildCxtMenu(
   });
 }
 
+/* double click events for Cytoscape */
+
+function enableDoubleClickEvents(cy: Cytoscape.Core, delay = 350) {
+  let last: Cytoscape.EventObject | undefined;
+  cy.on('click', (e) => {
+    if (last && last.target === e.target &&
+      e.timeStamp - last.timeStamp < delay) {
+      e.target.trigger('double-click', e);
+    }
+    last = e;
+  });
+}
+
 /* The Dive class handles the selection of nodes according to user actions.
    To prevent cytoscape to automatically select (and unselect) nodes wrongly,
    we make some nodes unselectable. We then use the functions below to make
@@ -83,8 +98,17 @@ class Dive {
     this.cy = cy || Cytoscape();
     this.headless = this.cy.container() === null;
     this.cy.elements().remove();
-    this.cy.off('click'); // Remove previous listeners
+
+    // Remove previous listeners
+    this.cy.off('click');
+    this.cy.off('double-click');
+
+    // Add new listeners
+    enableDoubleClickEvents(this.cy);
     this.cy.on('click', 'node', (event) => this.clickNode(event.target));
+    this.cy.on('double-click', '$node > node', // compound nodes
+      (event) => this.doubleClickNode(event.target));
+    (this.cy as CytoscapeExtended).panzoom({});
 
     this.layout = 'cose-bilkent';
 
@@ -273,9 +297,8 @@ class Dive {
     for (const dep of data.deps) {
       const src = this.cy.$id(dep.src);
       const dst = this.cy.$id(dep.dst);
-      const isRoot = dst?.data('is_root');
       this.cy.add({
-        data: { ...dep, source: dep.src, target: dep.dst, is_root: isRoot },
+        data: { ...dep, source: dep.src, target: dep.dst },
         group: 'edges',
         classes: src?.hasClass('new') || dst?.hasClass('new') ? 'new' : '',
       });
@@ -389,7 +412,7 @@ class Dive {
         });
         break;
       default: /* This is useless and impossible if the program is correctly
-        typed, but the linter wants it */
+                  typed, but the linter wants it */
     }
   }
 
@@ -436,6 +459,10 @@ class Dive {
     node.unselectify();
   }
 
+  doubleClickNode(node: Cytoscape.NodeSingular) {
+    this.cy.animate({ fit: { eles: node, padding: 10 } });
+  }
+
   selectLocation(location: States.Location | undefined, doExplore: boolean) {
     if (!location) {
       // Reset whole graph if no location is selected.
@@ -458,25 +485,25 @@ class Dive {
       _.some(ele.data().origins, this.selectedLocation)
     );
     this.cy.$(':selected').forEach(unselect);
+    this.cy.$('.multiple-selection').removeClass('multiple-selection');
+    this.cy.$('.selection').removeClass('selection');
     select(node);
     const edges = node.incomers('edge');
-    edges.unselect();
     const relevantEdges = edges.filter(hasOrigin);
-    if (relevantEdges.empty())
-      edges.select();
-    else
-      relevantEdges.select();
+    edges.addClass('multiple-selection');
+    relevantEdges.addClass('selection');
   }
 }
 
-const GraphView = () => {
+function GraphView() {
 
   // Hooks
   const [dive, setDive] = useState(() => new Dive());
   const [selection, updateSelection] = States.useSelection();
-  const [lock, flipLock] = Dome.useSwitch('dive.lock', false);
-  const [selectionMode, flipSelectionMode] =
-    Dome.useGlobalSetting('dive.selectionMode', 'follow');
+  const [lock, flipLock] =
+    Dome.useFlipSettings('dive.lock');
+  const [selectionMode, setSelectionMode] =
+    Dome.useStringSettings('dive.selectionMode', 'follow');
 
   function setCy(cy: Cytoscape.Core) {
     if (cy !== dive.cy)
@@ -522,13 +549,13 @@ const GraphView = () => {
   };
 
   // Selection mode
-  const selectMode = (id?: boolean) => id && flipSelectionMode(id);
+  const selectMode = (id?: string) => id && setSelectionMode(id);
   const modes = [
     { id: 'follow', label: 'Follow selection' },
     { id: 'add', label: 'Add selection to the graph' },
   ];
   const checkMode =
-    (item: { id: string }) => (
+    (item: { id: string; label: string }) => (
       { checked: item.id === selectionMode, ...item }
     );
   const modeMenu = () => {
@@ -538,7 +565,7 @@ const GraphView = () => {
   // Component
   return (
     <>
-      <TitleBar>
+      <Ivette.TitleBar>
         <IconButton
           icon="LOCK"
           onClick={flipLock}
@@ -563,7 +590,7 @@ const GraphView = () => {
           onClick={() => dive.clear()}
           title="Clear the graph"
         />
-      </TitleBar>
+      </Ivette.TitleBar>
       <CytoscapeComponent
         stylesheet={style}
         cy={setCy}
@@ -572,21 +599,31 @@ const GraphView = () => {
     </>
   );
 
-};
+}
 
 // --------------------------------------------------------------------------
 // --- Export Component
 // --------------------------------------------------------------------------
 
-export default () => (
-  <Component
-    id="dive.graph"
-    label="Data-flow graph"
-    title={'Data dependency graph according to an Eva analysis.\nNodes color ' +
-      'represents the precision of the values inferred by Eva.'}
-  >
-    <GraphView />
-  </Component>
-);
+Ivette.registerComponent({
+  id: 'frama-c.plugins.dive',
+  label: 'Dive Dataflow',
+  group: 'frama-c.plugins',
+  rank: 2,
+  title:
+    'Data dependency graph according to an Eva analysis.\nNodes color ' +
+    'represents the precision of the values inferred by Eva.',
+  children: <GraphView />,
+});
+
+Ivette.registerView({
+  id: 'dive',
+  label: 'Dive Dataflow',
+  rank: 2,
+  layout: [
+    ['frama-c.astview', 'frama-c.plugins.dive', 'frama-c.locations'],
+    ['frama-c.properties', 'frama-c.console'],
+  ],
+});
 
 // --------------------------------------------------------------------------
diff --git a/ivette/src/frama-c/dive/layouts.json b/ivette/src/frama-c/plugins/dive/layouts.json
similarity index 100%
rename from ivette/src/frama-c/dive/layouts.json
rename to ivette/src/frama-c/plugins/dive/layouts.json
diff --git a/ivette/src/frama-c/plugins/dive/pkg.json b/ivette/src/frama-c/plugins/dive/pkg.json
new file mode 100644
index 0000000000000000000000000000000000000000..a832e6f2b4d05f1d0366e01e683ea298ce6a6a48
--- /dev/null
+++ b/ivette/src/frama-c/plugins/dive/pkg.json
@@ -0,0 +1,3 @@
+{
+  "name": "Frama-C/Dive"
+}
diff --git a/ivette/src/frama-c/dive/react-cytoscapejs.d.ts b/ivette/src/frama-c/plugins/dive/react-cytoscapejs.d.ts
similarity index 100%
rename from ivette/src/frama-c/dive/react-cytoscapejs.d.ts
rename to ivette/src/frama-c/plugins/dive/react-cytoscapejs.d.ts
diff --git a/ivette/src/frama-c/dive/style.json b/ivette/src/frama-c/plugins/dive/style.json
similarity index 94%
rename from ivette/src/frama-c/dive/style.json
rename to ivette/src/frama-c/plugins/dive/style.json
index 38374dab223ddb7e212d2de4fc0751cd3a7835b1..1b1b8a69f7bd093f61c8a08d811ed30cb703b141 100644
--- a/ivette/src/frama-c/dive/style.json
+++ b/ivette/src/frama-c/plugins/dive/style.json
@@ -15,14 +15,6 @@
       "text-wrap" : "wrap"
     }
   },
-  {
-    "selector": "node:selected",
-    "style": {
-      "overlay-color": "#8bf",
-      "overlay-padding": "10px",
-      "overlay-opacity": 0.4
-    }
-  },
   {
     "selector": "node[label]",
     "style": {
@@ -58,18 +50,19 @@
     }
   },
   {
-    "selector": "edge:selected",
+    "selector": "edge.multiple-selection",
     "style": {
-      "color": "#48f",
-      "overlay-color": "#8bf",
+      "overlay-color": "#aaa",
       "overlay-padding": "10px",
       "overlay-opacity": 0.4
     }
   },
   {
-    "selector": "edge[?is_root]",
+    "selector": "edge.selection, :selected",
     "style": {
-      "width": 4
+      "overlay-color": "#8bf",
+      "overlay-padding": "10px",
+      "overlay-opacity": 0.4
     }
   },
   {
diff --git a/ivette/src/frama-c/dive/tippy.css b/ivette/src/frama-c/plugins/dive/tippy.css
similarity index 100%
rename from ivette/src/frama-c/dive/tippy.css
rename to ivette/src/frama-c/plugins/dive/tippy.css
diff --git a/ivette/src/frama-c/plugins/eva/cells.ts b/ivette/src/frama-c/plugins/eva/cells.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b4242c27b06880a8e119bf6a74f5d6b572d8332f
--- /dev/null
+++ b/ivette/src/frama-c/plugins/eva/cells.ts
@@ -0,0 +1,209 @@
+// --------------------------------------------------------------------------
+// --- Cells
+// --------------------------------------------------------------------------
+
+// Frama-C
+import * as Server from 'frama-c/server';
+import * as Ast from 'frama-c/api/kernel/ast';
+import * as Values from 'frama-c/api/plugins/eva/values';
+
+// --------------------------------------------------------------------------
+// --- Cell Utilities
+// --------------------------------------------------------------------------
+
+export type callback = () => void;
+
+export interface ModelCallbacks {
+  forceUpdate: callback;
+  forceLayout: callback;
+}
+
+export interface Size { cols: number; rows: number }
+
+export const EMPTY: Size = { cols: 0, rows: 0 };
+
+export function sizeof(text?: string): Size {
+  if (text === undefined) return EMPTY;
+  const lines = text.split('\n');
+  return {
+    rows: lines.length,
+    cols: lines.reduce((w, l) => Math.max(w, l.length), 0),
+  };
+}
+
+export function merge(a: Size, b: Size): Size {
+  return {
+    cols: Math.max(a.cols, b.cols),
+    rows: Math.max(a.rows, b.rows),
+  };
+}
+
+export function addH(a: Size, b: Size, padding = 0): Size {
+  return {
+    cols: a.cols + b.cols + padding,
+    rows: Math.max(a.rows, b.rows),
+  };
+}
+
+export function addV(a: Size, b: Size, padding = 0): Size {
+  return {
+    cols: Math.max(a.cols, b.cols),
+    rows: a.rows + b.rows + padding,
+  };
+}
+
+export function addS(s: Size, t: string | undefined): Size {
+  return t ? merge(s, sizeof(t)) : s;
+}
+
+export function lt(a: Size, b: Size): boolean {
+  return a.rows < b.rows && a.cols < b.cols;
+}
+
+export function leq(a: Size, b: Size): boolean {
+  return a.rows <= b.rows && a.cols <= b.cols;
+}
+
+// --------------------------------------------------------------------------
+// --- Data
+// --------------------------------------------------------------------------
+
+export type EvaStatus = 'True' | 'False' | 'Unknown';
+export type EvaAlarm = [EvaStatus, string];
+export type EvaState = 'Here' | 'After' | 'Then' | 'Else';
+
+export interface EvaValues {
+  errors?: string;
+  values?: string;
+  v_after?: string;
+  v_then?: string;
+  v_else?: string;
+  alarms?: EvaAlarm[];
+  size: Size;
+}
+
+// --------------------------------------------------------------------------
+// --- Value Cache
+// --------------------------------------------------------------------------
+
+export interface Probe {
+  fct: string | undefined;
+  marker: Ast.marker;
+}
+
+export class ValueCache {
+
+  private readonly state: ModelCallbacks;
+  private readonly probes = new Map<Ast.marker, Size>(); // Marker -> max in column
+  private readonly stacks = new Map<string, Size>(); // Callstack -> max in row
+  private readonly vcache = new Map<string, EvaValues>(); // '<Marker><@Callstack>?' -> value
+  private smax = EMPTY; // max cell size
+
+  constructor(state: ModelCallbacks) {
+    this.state = state;
+  }
+
+  clear() {
+    this.smax = EMPTY;
+    this.probes.clear();
+    this.stacks.clear();
+    this.vcache.clear();
+    this.state.forceLayout();
+  }
+
+  // --- Cached Measures
+
+  getMaxSize() { return this.smax; }
+
+  getProbeSize(target: Ast.marker) {
+    return this.probes.get(target) ?? EMPTY;
+  }
+
+  private static stackKey(fct: string, callstack: Values.callstack) {
+    return `${fct}::${callstack}`;
+  }
+
+  getStackSize(fct: string, callstack: Values.callstack) {
+    const key = ValueCache.stackKey(fct, callstack);
+    return this.stacks.get(key) ?? EMPTY;
+  }
+
+  // --- Cached Values & Request Update
+
+  getValues(
+    { fct, marker }: Probe,
+    callstack: Values.callstack | undefined,
+  ): EvaValues {
+    const key = callstack !== undefined ? `${marker}@${callstack}` : marker;
+    const cache = this.vcache;
+    const cached = cache.get(key);
+    if (cached) return cached;
+    const newValue: EvaValues = { values: '', size: EMPTY };
+    if (callstack !== undefined && fct === undefined)
+      return newValue;
+    // callstack !== undefined ==> fct !== undefined)
+    cache.set(key, newValue);
+    Server
+      .send(Values.getValues, { target: marker, callstack })
+      .then((r) => {
+        newValue.errors = undefined;
+        newValue.values = r.values;
+        newValue.v_after = r.v_after;
+        newValue.v_then = r.v_then;
+        newValue.v_else = r.v_else;
+        newValue.alarms = r.alarms;
+        if (this.updateLayout(marker, fct, callstack, newValue))
+          this.state.forceLayout();
+        else
+          this.state.forceUpdate();
+      })
+      .catch((err) => {
+        newValue.errors = `$Error: ${err}`;
+        this.state.forceUpdate();
+      });
+    return newValue;
+  }
+
+  // --- Updating Measures
+
+  private updateLayout(
+    target: Ast.marker,
+    fct: string | undefined,
+    callstack: Values.callstack | undefined,
+    v: EvaValues,
+  ): boolean {
+    // measuring cell
+    let s = sizeof(v.values);
+    s = addS(s, v.v_after);
+    s = addS(s, v.v_then);
+    s = addS(s, v.v_else);
+    v.size = s;
+    // max cell size
+    const { smax } = this;
+    let small = leq(s, smax);
+    if (!small) this.smax = merge(s, smax);
+    // max size for probe column
+    const ps = this.getProbeSize(target);
+    if (!leq(s, ps)) {
+      this.probes.set(target, merge(ps, s));
+      small = false;
+    }
+    // max size for stack row
+    if (callstack !== undefined) {
+      if (fct === undefined) small = false;
+      else {
+        const key = ValueCache.stackKey(fct, callstack);
+        const cs = this.stacks.get(key) ?? EMPTY;
+        if (!leq(s, cs)) {
+          this.stacks.set(key, merge(cs, s));
+          small = false;
+        }
+      }
+    }
+    // request new layout if not small enough
+    return !small;
+  }
+
+}
+
+// --------------------------------------------------------------------------
diff --git a/ivette/src/frama-c/plugins/eva/diffed.tsx b/ivette/src/frama-c/plugins/eva/diffed.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..19dd3b913268add01e6b2623a54dda1879b5232b
--- /dev/null
+++ b/ivette/src/frama-c/plugins/eva/diffed.tsx
@@ -0,0 +1,161 @@
+// --------------------------------------------------------------------------
+// --- Diff Text Rendering
+// --------------------------------------------------------------------------
+
+import React from 'react';
+import { Change, diffChars } from 'diff';
+
+const MODIFIED = 'eva-diff eva-diff-modified';
+const REMOVED = 'eva-diff eva-diff-removed';
+const ADDED = 'eva-diff eva-diff-added';
+const SHADOW = 'eva-diff eva-diff-shadow';
+
+export class DiffBuffer {
+
+  private added = false;
+  private removed = false;
+  private value = '';
+  private scratch = '';
+  private contents: React.ReactNode[] = [];
+
+  constructor() {
+    this.push = this.push.bind(this);
+  }
+
+  clear() {
+    this.added = false;
+    this.removed = false;
+    this.value = '';
+    this.scratch = '';
+    this.contents = [];
+  }
+
+  push(c: Change) {
+    if (!c.added && !c.removed) {
+      this.flush();
+      this.value += c.value;
+      this.flush();
+    } else {
+      if (c.added) this.added = true;
+      if (c.removed) {
+        this.removed = true;
+        this.value += c.value;
+      }
+    }
+  }
+
+  private flush() {
+    const { value, added, removed } = this;
+    if (added && removed) {
+      if (value) {
+        this.scratch += '\0'.repeat(value.length);
+        this.contents.push(
+          <span className={MODIFIED} title="Modified">{value}</span>,
+        );
+      }
+    } else if (removed) {
+      if (value) {
+        this.contents.push(
+          <span className={REMOVED} title="Removed">{value}</span>,
+        );
+      }
+    } else if (added) {
+      this.contents.push(
+        <span className={ADDED}><span className={SHADOW} /></span>,
+      );
+    } else if (value) {
+      this.scratch += value;
+      this.contents.push(value);
+    }
+    this.value = '';
+    this.added = false;
+    this.removed = false;
+  }
+
+  getContents(): React.ReactNode {
+    this.flush();
+    return React.Children.toArray(this.contents);
+  }
+
+  getScratch() {
+    this.flush();
+    return this.scratch;
+  }
+
+}
+
+/* --------------------------------------------------------------------------*/
+/* --- Diff2 Component                                                    ---*/
+/* --------------------------------------------------------------------------*/
+
+export interface Diff2Props {
+  text: string;
+  diff: string;
+}
+
+export function Diff2(props: Diff2Props) {
+  const { text, diff } = props;
+  const contents = React.useMemo<React.ReactNode>(() => {
+    if (text === diff) return text;
+    const buffer = new DiffBuffer();
+    const chunks = diffChars(text, diff);
+    chunks.forEach(buffer.push);
+    return buffer.getContents();
+  }, [text, diff]);
+  return <>{contents}</>;
+}
+
+/* --------------------------------------------------------------------------*/
+/* --- Diff3 Component                                                    ---*/
+/* --------------------------------------------------------------------------*/
+
+export interface Diff3Props {
+  text: string;
+  diffA: string;
+  diffB: string;
+}
+
+export function Diff3(props: Diff3Props) {
+  const { text, diffA, diffB } = props;
+  const contents = React.useMemo<React.ReactNode>(() => {
+    if (text === diffA && text === diffB) return text;
+    const buffer = new DiffBuffer();
+    diffChars(diffA, diffB).forEach(buffer.push);
+    const scratch = buffer.getScratch();
+    buffer.clear();
+    diffChars(text, scratch).forEach(buffer.push);
+    return buffer.getContents();
+  }, [text, diffA, diffB]);
+  return <>{contents}</>;
+}
+
+/* --------------------------------------------------------------------------*/
+/* --- Diff Component                                                     ---*/
+/* --------------------------------------------------------------------------*/
+
+export interface DiffProps {
+  text?: string;
+  diff?: string;
+  diffA?: string;
+  diffB?: string;
+}
+
+export function Diff(props: DiffProps) {
+  const { text, diff, diffA, diffB } = props;
+  if (text === undefined)
+    return diff ? <>{diff}</> : null;
+  if (diff !== undefined) {
+    if (diff === text) return <>{text}</>;
+    return <Diff2 text={text} diff={diff} />;
+  }
+  if (diffA === undefined) {
+    if (diffB === undefined) return <>{text}</>;
+    return <Diff2 text={text} diff={diffB} />;
+  } if (diffB === undefined) {
+    if (diffA === undefined) return <>{text}</>;
+    return <Diff2 text={text} diff={diffA} />;
+  }
+  return <Diff3 text={text} diffA={diffA} diffB={diffB} />;
+}
+
+// --------------------------------------------------------------------------
diff --git a/ivette/src/frama-c/plugins/eva/index.tsx b/ivette/src/frama-c/plugins/eva/index.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..1cb699bc9420603632e6345de57c86aef1b84b75
--- /dev/null
+++ b/ivette/src/frama-c/plugins/eva/index.tsx
@@ -0,0 +1,81 @@
+// --------------------------------------------------------------------------
+// --- Eva Values
+// --------------------------------------------------------------------------
+
+// React & Dome
+import React from 'react';
+import * as Dome from 'dome';
+import * as Ivette from 'ivette';
+import { Vfill } from 'dome/layout/boxes';
+import { IconButton } from 'dome/controls/buttons';
+import { AutoSizer } from 'react-virtualized';
+
+// Locals
+import { ProbeInfos } from './probeinfos';
+import { Dimension, ValuesPanel } from './valuetable';
+import { AlarmsInfos, StackInfos } from './valueinfos';
+import './style.css';
+
+// --------------------------------------------------------------------------
+// --- Values Component
+// --------------------------------------------------------------------------
+
+function ValuesComponent() {
+  const [zoom, setZoom] = Dome.useNumberSettings('eva-zoom-factor', 0);
+  return (
+    <>
+      <Ivette.TitleBar>
+        <IconButton
+          enabled={zoom > 0}
+          icon="ZOOM.OUT"
+          onClick={() => setZoom(zoom - 1)}
+        />
+        <IconButton
+          enabled={zoom < 20}
+          icon="ZOOM.IN"
+          onClick={() => setZoom(zoom + 1)}
+        />
+      </Ivette.TitleBar>
+      <Vfill>
+        <ProbeInfos />
+        <Vfill>
+          <AutoSizer>
+            {(dim: Dimension) => (
+              <ValuesPanel
+                zoom={zoom}
+                {...dim}
+              />
+            )}
+          </AutoSizer>
+        </Vfill>
+        <AlarmsInfos />
+        <StackInfos />
+      </Vfill>
+    </>
+  );
+}
+
+// --------------------------------------------------------------------------
+// --- Export Component
+// --------------------------------------------------------------------------
+
+Ivette.registerComponent({
+  id: 'frama-c.plugins.values',
+  group: 'frama-c.plugins',
+  rank: 1,
+  label: 'Eva Values',
+  title: 'Values inferred by the Eva analysis',
+  children: <ValuesComponent />,
+});
+
+Ivette.registerView({
+  id: 'values',
+  rank: 1,
+  label: 'Eva Values',
+  layout: [
+    ['frama-c.astview', 'frama-c.plugins.values'],
+    'frama-c.properties',
+  ],
+});
+
+// --------------------------------------------------------------------------
diff --git a/ivette/src/frama-c/plugins/eva/layout.ts b/ivette/src/frama-c/plugins/eva/layout.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c116ca319731b62b3b5cc456d666b07528931f2f
--- /dev/null
+++ b/ivette/src/frama-c/plugins/eva/layout.ts
@@ -0,0 +1,217 @@
+/* --------------------------------------------------------------------------*/
+/* --- Layout                                                             ---*/
+/* --------------------------------------------------------------------------*/
+
+import { callstack } from 'frama-c/api/plugins/eva/values';
+import { Probe } from './probes';
+import { StacksCache } from './stacks';
+import { Size, EMPTY, leq, addH, ValueCache } from './cells';
+
+export interface LayoutProps {
+  zoom?: number;
+  margin: number;
+}
+
+export type RowKind = 'section' | 'probes' | 'values' | 'callstack';
+
+export interface Row {
+  key: string;
+  fct: string;
+  kind: RowKind;
+  probes: Probe[];
+  headstack?: string;
+  stackIndex?: number;
+  stackCount?: number;
+  callstack?: callstack;
+  hlines: number;
+}
+
+/* --------------------------------------------------------------------------*/
+/* --- Layout Enfine                                                      ---*/
+/* --------------------------------------------------------------------------*/
+
+const HEAD_PADDING = 4; // Left margin
+const CELL_PADDING = 4; // Inter cell padding
+const TEXT_PADDING = 2; // Intra cell padding
+const HCROP = 18;
+const VCROP = 1;
+
+export class LayoutEngine {
+
+  // --- Setup
+
+  private readonly folded: (fct: string) => boolean;
+  private readonly values: ValueCache;
+  private readonly stacks: StacksCache;
+  private readonly hcrop: number;
+  private readonly vcrop: number;
+  private readonly margin: number;
+
+  constructor(
+    props: undefined | LayoutProps,
+    values: ValueCache,
+    stacks: StacksCache,
+    folded: (fct: string) => boolean,
+  ) {
+    this.values = values;
+    this.stacks = stacks;
+    this.folded = folded;
+    const zoom = Math.max(0, props?.zoom ?? 0);
+    this.vcrop = VCROP + 3 * zoom;
+    this.hcrop = HCROP + zoom;
+    this.margin = (props?.margin ?? 80) - HEAD_PADDING;
+    this.push = this.push.bind(this);
+  }
+
+  // --- Probe Buffer
+  private byFct?: string; // current function
+  private byStk?: boolean; // callstack probes
+  private skip?: boolean; // skip current function
+  private rowSize: Size = EMPTY;
+  private buffer: Probe[] = [];
+  private rows: Row[] = [];
+  private chained?: Probe;
+
+  crop(zoomed: boolean, s: Size): Size {
+    const s$cols = s.cols + TEXT_PADDING;
+    const cols = zoomed ? s$cols : Math.min(s$cols, this.hcrop);
+    const rows = zoomed ? s.rows : Math.min(s.rows, this.vcrop);
+    return {
+      cols: Math.max(HCROP, cols),
+      rows: Math.max(VCROP, rows),
+    };
+  }
+
+  layout(ps: Probe[]): Row[] {
+    this.chained = undefined;
+    ps.sort(LayoutEngine.order).forEach(this.push);
+    return this.flush();
+  }
+
+  private static order(p: Probe, q: Probe): number {
+    const fp = p.fct;
+    const fq = q.fct;
+    if (fp === fq) {
+      const cp = p.byCallstacks;
+      const cq = q.byCallstacks;
+      if (!cp && cq) return (-1);
+      if (cp && !cq) return (+1);
+    }
+    const rp = p.rank ?? 0;
+    const rq = q.rank ?? 0;
+    if (rp < rq) return (-1);
+    if (rp > rq) return (+1);
+    if (p.marker < q.marker) return (-1);
+    if (p.marker > q.marker) return (+1);
+    return 0;
+  }
+
+  private push(p: Probe) {
+    // --- sectionning
+    const { fct, byCallstacks: stk } = p;
+    if (fct !== this.byFct) {
+      this.flush();
+      this.rows.push({
+        key: `S:${fct}`,
+        kind: 'section',
+        fct,
+        probes: [],
+        hlines: 1,
+      });
+      this.byFct = fct;
+      this.byStk = stk;
+      this.skip = this.folded(fct);
+    } else if (stk !== this.byStk) {
+      this.flush();
+      this.byStk = stk;
+    }
+    if (this.skip) return;
+    // --- chaining
+    const q = this.chained;
+    if (q) q.next = p;
+    p.prev = q;
+    this.chained = p;
+    // --- sizing
+    const probeSize = this.values.getProbeSize(p.marker);
+    const s = this.crop(p.zoomed, probeSize);
+    p.zoomable = p.zoomed || !leq(probeSize, s);
+    p.minCols = s.cols;
+    p.maxCols = Math.max(p.minCols, probeSize.cols);
+    // --- queueing
+    if (!stk && s.cols + this.rowSize.cols > this.margin)
+      this.flush();
+    this.rowSize = addH(this.rowSize, s);
+    this.rowSize.cols += CELL_PADDING;
+    this.buffer.push(p);
+  }
+
+  // --- Flush Rows
+
+  private flush(): Row[] {
+    const ps = this.buffer;
+    const rs = this.rows;
+    const fct = this.byFct;
+    if (fct && ps.length > 0) {
+      const stk = this.byStk;
+      const hlines = this.rowSize.rows;
+      if (stk) {
+        // --- by callstacks
+        const markers = ps.map((p) => p.marker);
+        const stacks = this.stacks.getStacks(...markers);
+        const summary = fct ? this.stacks.getSummary(fct) : false;
+        const callstacks = stacks.length;
+        rs.push({
+          key: `P:${fct}`,
+          kind: 'probes',
+          probes: ps,
+          stackCount: callstacks,
+          fct,
+          hlines: 1,
+        });
+        if (summary) rs.push({
+          key: `V:${fct}`,
+          kind: 'values',
+          probes: ps,
+          stackIndex: -1,
+          stackCount: stacks.length,
+          fct,
+          hlines: 1,
+        });
+        stacks.forEach((cs, k) => {
+          rs.push({
+            key: `C:${fct}:${cs}`,
+            kind: 'callstack',
+            probes: ps,
+            stackIndex: k,
+            stackCount: callstacks,
+            callstack: cs,
+            fct,
+            hlines,
+          });
+        });
+      } else {
+        // --- not by callstacks
+        const n = rs.length;
+        rs.push({
+          key: `P#${n}`,
+          kind: 'probes',
+          probes: ps,
+          fct,
+          hlines: 1,
+        }, {
+          key: `V#${n}`,
+          kind: 'values',
+          probes: ps,
+          fct,
+          hlines,
+        });
+      }
+    }
+    this.buffer = [];
+    this.rowSize = EMPTY;
+    return rs;
+  }
+
+}
+
+/* --------------------------------------------------------------------------*/
diff --git a/ivette/src/frama-c/plugins/eva/model.ts b/ivette/src/frama-c/plugins/eva/model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0c5f7c2bfe107e58f0d396178f448f2958979b29
--- /dev/null
+++ b/ivette/src/frama-c/plugins/eva/model.ts
@@ -0,0 +1,275 @@
+// --------------------------------------------------------------------------
+// --- Eva Values
+// --------------------------------------------------------------------------
+
+// External Libs
+import { throttle } from 'lodash';
+import equal from 'react-fast-compare';
+import * as Dome from 'dome';
+
+import * as Server from 'frama-c/server';
+import * as States from 'frama-c/states';
+import * as Values from 'frama-c/api/plugins/eva/values';
+
+// Model
+import { Probe } from './probes';
+import { StacksCache, Callsite } from './stacks';
+import { ModelCallbacks, ValueCache, EvaState } from './cells';
+import { LayoutProps, LayoutEngine, Row } from './layout';
+
+export interface ModelLayout extends LayoutProps {
+  location?: States.Location;
+}
+
+/* --------------------------------------------------------------------------*/
+/* --- EVA Values Model                                                   ---*/
+/* --------------------------------------------------------------------------*/
+
+export class Model implements ModelCallbacks {
+
+  constructor() {
+    this.forceUpdate = this.forceUpdate.bind(this);
+    this.forceLayout = this.forceLayout.bind(this);
+    this.forceReload = this.forceReload.bind(this);
+    this.computeLayout = this.computeLayout.bind(this);
+    this.setLayout = throttle(this.setLayout.bind(this), 300);
+    this.metaSelection = this.metaSelection.bind(this);
+    this.getRowKey = this.getRowKey.bind(this);
+    this.getRowCount = this.getRowCount.bind(this);
+    this.getRowLines = this.getRowLines.bind(this);
+    this.isFolded = this.isFolded.bind(this);
+  }
+
+  // --- Probes
+
+  private vstmt: EvaState = 'After';
+  private vcond: EvaState = 'Here';
+  private selected?: Probe;
+  private focused?: Probe;
+  private callstack?: Values.callstack;
+  private remanent?: Probe; // last transient
+  private probes = new Map<string, Probe>();
+  private folded = new Map<string, boolean>(); // folded functions
+
+  getFocused() { return this.focused; }
+  isFocused(p: Probe | undefined) { return this.focused === p; }
+
+  getProbe(location: States.Location | undefined): Probe | undefined {
+    if (!location) return undefined;
+    const { fct, marker } = location;
+    if (fct && marker) {
+      let p = this.probes.get(marker);
+      if (!p) {
+        p = new Probe(this, fct, marker);
+        this.probes.set(marker, p);
+        p.requestProbeInfo();
+      }
+      return p;
+    }
+    return undefined;
+  }
+
+  getStacks(p: Probe | undefined): Values.callstack[] {
+    return p ? this.stacks.getStacks(p.marker) : [];
+  }
+
+  getVstmt(): EvaState { return this.vstmt; }
+  getVcond(): EvaState { return this.vcond; }
+  setVstmt(s: EvaState) { this.vstmt = s; this.forceUpdate(); }
+  setVcond(s: EvaState) { this.vcond = s; this.forceUpdate(); }
+
+  isFolded(fct: string): boolean {
+    return (this.focused?.fct !== fct) && (this.folded.get(fct) ?? false);
+  }
+
+  isFoldable(fct: string): boolean {
+    return this.focused?.fct !== fct;
+  }
+
+  setFolded(fct: string, folded: boolean) {
+    this.folded.set(fct, folded);
+    this.forceLayout();
+  }
+
+  // --- Caches
+
+  readonly stacks = new StacksCache(this);
+  readonly values = new ValueCache(this);
+
+  // --- Rows
+
+  private lock = false;
+  private layout: ModelLayout = { margin: 80 };
+  private rows: Row[] = [];
+
+  getRow(index: number): Row | undefined {
+    return this.rows[index];
+  }
+
+  getRowCount() {
+    return this.rows.length;
+  }
+
+  getRowKey(index: number): string {
+    const row = this.rows[index];
+    return row ? row.key : `#${index}`;
+  }
+
+  getRowLines(index: number): number {
+    const row = this.rows[index];
+    return row ? row.hlines : 0;
+  }
+
+  setSelectedRow(row: Row) {
+    const cs = row.callstack;
+    if (cs !== this.callstack) {
+      this.callstack = cs;
+      this.forceUpdate();
+    }
+  }
+
+  isSelectedRow(row: Row): boolean {
+    if (!this.focused?.byCallstacks) return false;
+    const cs = this.callstack;
+    return cs !== undefined && cs === row.callstack;
+  }
+
+  isAlignedRow(row: Row): boolean {
+    const cs = this.callstack;
+    const cr = row.callstack;
+    return cs !== undefined && cr !== undefined && this.stacks.aligned(cs, cr);
+  }
+
+  getCallstack(): Values.callstack | undefined {
+    return this.callstack;
+  }
+
+  getCalls(): Callsite[] {
+    const c = this.callstack;
+    return c === undefined ? [] : this.stacks.getCalls(c);
+  }
+
+  // --- Throttled
+  setLayout(ly: ModelLayout) {
+    if (!equal(this.layout, ly)) {
+      this.layout = ly;
+      this.selected = this.getProbe(ly.location);
+      this.forceLayout();
+    }
+  }
+
+  metaSelection(location: States.Location) {
+    const p = this.getProbe(location);
+    if (p) {
+      if (p.transient) {
+        if (this.focused?.byCallstacks)
+          p.setByCallstacks(true);
+        else
+          p.setPersistent();
+      }
+    }
+  }
+
+  clearSelection() {
+    this.focused = undefined;
+    this.selected = undefined;
+    this.remanent = undefined;
+    this.forceLayout();
+  }
+
+  // --- Recompute Layout
+
+  private computeLayout() {
+    if (this.lock) return;
+    this.lock = true;
+    const s = this.selected;
+    if (!s) {
+      this.focused = undefined;
+      this.remanent = undefined;
+    } else if (!s.loading) {
+      this.focused = s;
+      if (s.code && s.transient) {
+        this.remanent = s;
+      } else {
+        this.remanent = undefined;
+      }
+    }
+    const toLayout: Probe[] = [];
+    this.probes.forEach((p) => {
+      if (p.code && (!p.transient || p === this.remanent)) {
+        toLayout.push(p);
+      }
+    });
+    const engine = new LayoutEngine(
+      this.layout,
+      this.values,
+      this.stacks,
+      this.isFolded,
+    );
+    this.rows = engine.layout(toLayout);
+    this.laidout.emit();
+    this.lock = false;
+  }
+
+  // --- Force Reload (empty caches)
+  forceReload() {
+    this.focused = undefined;
+    this.remanent = undefined;
+    this.selected = undefined;
+    this.callstack = undefined;
+    this.probes.clear();
+    this.stacks.clear();
+    this.values.clear();
+    this.forceLayout();
+    this.forceUpdate();
+  }
+
+  // --- Events
+  readonly changed = new Dome.Event('eva-changed');
+  readonly laidout = new Dome.Event('eva-laidout');
+
+  // --- Force Layout
+  forceLayout() {
+    setImmediate(this.computeLayout);
+  }
+
+  // --- Foce Update
+  forceUpdate() { this.changed.emit(); }
+
+  // --- Global Signals
+
+  mount() {
+    States.MetaSelection.on(this.metaSelection);
+    Server.onSignal(Values.changed, this.forceReload);
+  }
+
+  unmount() {
+    States.MetaSelection.off(this.metaSelection);
+    Server.offSignal(Values.changed, this.forceReload);
+  }
+
+}
+
+// --------------------------------------------------------------------------
+// --- EVA Model Hook
+// --------------------------------------------------------------------------
+
+let MODEL: Model | undefined;
+
+Server.onShutdown(() => {
+  if (MODEL) {
+    MODEL.unmount();
+    MODEL = undefined;
+  }
+});
+
+export function useModel(): Model {
+  if (!MODEL) {
+    MODEL = new Model();
+    MODEL.mount();
+  }
+  Dome.useUpdate(MODEL.changed, MODEL.laidout);
+  return MODEL;
+}
+
+// --------------------------------------------------------------------------
diff --git a/ivette/src/frama-c/plugins/eva/pkg.json b/ivette/src/frama-c/plugins/eva/pkg.json
new file mode 100644
index 0000000000000000000000000000000000000000..753dacec0049c0968417a1b55308748c7b3f70cb
--- /dev/null
+++ b/ivette/src/frama-c/plugins/eva/pkg.json
@@ -0,0 +1,3 @@
+{
+  "name": "Frama-C/Eva"
+}
diff --git a/ivette/src/frama-c/plugins/eva/probeinfos.tsx b/ivette/src/frama-c/plugins/eva/probeinfos.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..7f8d1da41fcd27494b5905f9e234b811ee2277b2
--- /dev/null
+++ b/ivette/src/frama-c/plugins/eva/probeinfos.tsx
@@ -0,0 +1,163 @@
+// --------------------------------------------------------------------------
+// --- Eva Values
+// --------------------------------------------------------------------------
+
+// React & Dome
+import React from 'react';
+import { Hpack, Filler } from 'dome/layout/boxes';
+import { Label, Code } from 'dome/controls/labels';
+import { IconButton } from 'dome/controls/buttons';
+import { ButtonGroup, Button } from 'dome/frame/toolbars';
+
+// Frama-C
+import * as States from 'frama-c/states';
+
+// Locals
+import { SizedArea } from './sized';
+import { sizeof } from './cells';
+import { useModel } from './model';
+import { Stmt } from './valueinfos';
+
+// --------------------------------------------------------------------------
+// --- Probe Editor
+// --------------------------------------------------------------------------
+
+function ProbeEditor() {
+  const model = useModel();
+  const probe = model.getFocused();
+  if (!probe || !probe.code) return null;
+  const { label } = probe;
+  const { code } = probe;
+  const { stmt } = probe;
+  const { rank } = probe;
+  const byCS = probe.byCallstacks;
+  const stacks = model.getStacks(probe);
+  const stackable = byCS || stacks.length > 1;
+  const { cols, rows } = sizeof(code);
+  const { transient } = probe;
+  const { zoomed } = probe;
+  const { zoomable } = probe;
+  return (
+    <>
+      <Label className="eva-probeinfo-label">{label}</Label>
+      <div className="eva-probeinfo-code">
+        <SizedArea cols={cols} rows={rows}>{code}</SizedArea>
+      </div>
+      <Code><Stmt stmt={stmt} rank={rank} /></Code>
+      <IconButton
+        icon="ITEMS.LIST"
+        className="eva-probeinfo-button"
+        display={stackable}
+        selected={byCS}
+        title={`Details by callstack (${stacks})`}
+        onClick={() => { if (probe) probe.setByCallstacks(!byCS); }}
+      />
+      <IconButton
+        icon="SEARCH"
+        className="eva-probeinfo-button"
+        display={zoomable}
+        selected={zoomed}
+        onClick={() => { if (probe) probe.setZoomed(!zoomed); }}
+      />
+      <IconButton
+        icon="PIN"
+        className="eva-probeinfo-button"
+        selected={!transient}
+        title={transient ? 'Make the probe persistent' : 'Release the probe'}
+        onClick={() => {
+          if (probe) {
+            if (transient) probe.setPersistent();
+            else probe.setTransient();
+          }
+        }}
+      />
+      <IconButton
+        icon="CIRC.CLOSE"
+        className="eva-probeinfo-button"
+        display={!transient}
+        title="Discard the probe"
+        onClick={() => {
+          if (probe) {
+            probe.setTransient();
+            const p = probe.next ?? probe.prev;
+            if (p) setImmediate(() => {
+              States.setSelection({ fct: p.fct, marker: p.marker });
+            });
+            else model.clearSelection();
+          }
+        }}
+      />
+    </>
+  );
+}
+
+// --------------------------------------------------------------------------
+// --- Probe Panel
+// --------------------------------------------------------------------------
+
+export function ProbeInfos() {
+  const model = useModel();
+  const probe = model.getFocused();
+  const fct = probe?.fct;
+  const byCS = probe?.byCallstacks;
+  const effects = probe ? probe.effects : false;
+  const condition = probe ? probe.condition : false;
+  const summary = fct ? model.stacks.getSummary(fct) : false;
+  const vcond = model.getVcond();
+  const vstmt = model.getVstmt();
+  return (
+    <Hpack className="eva-probeinfo">
+      <ProbeEditor />
+      <Filler />
+      <ButtonGroup
+        enabled={!!probe}
+        className="eva-probeinfo-state"
+      >
+        <Button
+          label={'\u2211'}
+          title="Show Callstacks Summary"
+          selected={summary}
+          visible={byCS}
+          onClick={() => { if (fct) model.stacks.setSummary(fct, !summary); }}
+        />
+        <Button
+          visible={condition}
+          label="C"
+          selected={vcond === 'Here'}
+          title="Show values in all conditions"
+          onClick={() => model.setVcond('Here')}
+        />
+        <Button
+          visible={condition || vcond === 'Then'}
+          selected={vcond === 'Then'}
+          enabled={condition}
+          label="T"
+          value="Then"
+          title="Show reduced values when condition holds (Then)"
+          onClick={() => model.setVcond('Then')}
+        />
+        <Button
+          visible={condition || vcond === 'Else'}
+          selected={vcond === 'Else'}
+          enabled={condition}
+          label="E"
+          value="Else"
+          title="Show reduced values when condition does not hold (Else)"
+          onClick={() => model.setVcond('Else')}
+        />
+        <Button
+          visible={condition || effects}
+          selected={vstmt === 'After'}
+          label="A"
+          value="After"
+          title="Show values after/before statement effects"
+          onClick={() => {
+            model.setVstmt(vstmt === 'After' ? 'Here' : 'After');
+          }}
+        />
+      </ButtonGroup>
+    </Hpack>
+  );
+}
+
+// --------------------------------------------------------------------------
diff --git a/ivette/src/frama-c/plugins/eva/probes.ts b/ivette/src/frama-c/plugins/eva/probes.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e301c9f6439052a0f86f958b488d3ede1a467508
--- /dev/null
+++ b/ivette/src/frama-c/plugins/eva/probes.ts
@@ -0,0 +1,141 @@
+/* --------------------------------------------------------------------------*/
+/* --- Probes                                                             ---*/
+/* --------------------------------------------------------------------------*/
+
+// Frama-C
+import * as Server from 'frama-c/server';
+import * as Values from 'frama-c/api/plugins/eva/values';
+import * as Ast from 'frama-c/api/kernel/ast';
+
+// Model
+import { ModelCallbacks } from './cells';
+
+/* --------------------------------------------------------------------------*/
+/* --- Probe Labelling                                                    ---*/
+/* --------------------------------------------------------------------------*/
+
+const Ka = 'A'.charCodeAt(0);
+const Kz = 'Z'.charCodeAt(0);
+const LabelRing: string[] = [];
+const LabelSize = 12;
+let La = Ka;
+let Lk = 0;
+
+function newLabel() {
+  let lbl = LabelRing.shift();
+  if (lbl) return lbl;
+  const a = La;
+  const k = Lk;
+  lbl = String.fromCharCode(a);
+  if (a < Kz) {
+    La++;
+  } else {
+    La = Ka;
+    Lk++;
+  }
+  return k > 0 ? lbl + k : lbl;
+}
+
+/* --------------------------------------------------------------------------*/
+/* --- Probe State                                                        ---*/
+/* --------------------------------------------------------------------------*/
+
+export class Probe {
+
+  // properties
+  readonly fct: string;
+  readonly marker: Ast.marker;
+  readonly model: ModelCallbacks;
+  next?: Probe;
+  prev?: Probe;
+  transient = true;
+  loading = true;
+  label?: string;
+  code?: string;
+  stmt?: string;
+  rank?: number;
+  minCols: number = LabelSize;
+  maxCols: number = LabelSize;
+  byCallstacks = false;
+  zoomed = false;
+  zoomable = false;
+  effects = false;
+  condition = false;
+
+  constructor(state: ModelCallbacks, fct: string, marker: Ast.marker) {
+    this.fct = fct;
+    this.marker = marker;
+    this.model = state;
+    this.requestProbeInfo = this.requestProbeInfo.bind(this);
+  }
+
+  requestProbeInfo() {
+    this.loading = true;
+    this.label = '…';
+    Server
+      .send(Values.getProbeInfo, this.marker)
+      .then(({ code, stmt, rank, effects, condition }) => {
+        this.code = code;
+        this.stmt = stmt;
+        this.rank = rank;
+        this.label = undefined;
+        this.effects = effects;
+        this.condition = condition;
+        this.loading = false;
+        this.updateLabel();
+      })
+      .catch(() => {
+        this.code = '(error)';
+        this.stmt = undefined;
+        this.rank = undefined;
+        this.label = undefined;
+        this.effects = false;
+        this.condition = false;
+        this.loading = false;
+      })
+      .finally(this.model.forceLayout);
+  }
+
+  // --------------------------------------------------------------------------
+  // --- Internal State
+  // --------------------------------------------------------------------------
+
+  setPersistent() { this.updateTransient(false); }
+  setTransient() { this.updateTransient(true); }
+
+  private updateLabel() {
+    const { transient, label, code } = this;
+    if (transient && label) {
+      LabelRing.push(label);
+      this.label = undefined;
+    }
+    if (!transient && !label && code && code.length > LabelSize)
+      this.label = newLabel();
+  }
+
+  private updateTransient(tr: boolean) {
+    if (this.transient !== tr) {
+      this.transient = tr;
+      this.updateLabel();
+      this.model.forceLayout();
+    }
+  }
+
+  setByCallstacks(byCS: boolean) {
+    if (byCS !== this.byCallstacks) {
+      this.byCallstacks = byCS;
+      if (byCS) this.setPersistent();
+      this.model.forceLayout();
+    }
+  }
+
+  setZoomed(zoomed: boolean) {
+    if (zoomed !== this.zoomed) {
+      this.zoomed = zoomed;
+      this.model.forceLayout();
+    }
+  }
+
+}
+
+/* --------------------------------------------------------------------------*/
diff --git a/ivette/src/frama-c/plugins/eva/sized.tsx b/ivette/src/frama-c/plugins/eva/sized.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..bb4b564a1740f236f4d79965a22db56e9b9987ed
--- /dev/null
+++ b/ivette/src/frama-c/plugins/eva/sized.tsx
@@ -0,0 +1,119 @@
+// --------------------------------------------------------------------------
+// --- Sized Cell
+// --------------------------------------------------------------------------
+
+import React from 'react';
+
+// --------------------------------------------------------------------------
+// --- Measurer
+// --------------------------------------------------------------------------
+
+export class Streamer {
+  private readonly v0: number;
+  private readonly vs: number[] = [];
+  private v?: number;
+  constructor(v0: number) {
+    this.v0 = v0;
+  }
+
+  push(v: number) {
+    const { vs } = this;
+    vs.push(Math.round(v));
+    if (vs.length > 200) vs.shift();
+  }
+
+  mean(): number {
+    if (this.v === undefined) {
+      const { vs } = this;
+      const n = vs.length;
+      if (n > 0) {
+        const m = vs.reduce((s, v) => s + v, 0) / n;
+        this.v = Math.round(m + 0.5);
+      } else {
+        this.v = this.v0;
+      }
+    }
+    return this.v;
+  }
+
+}
+
+export class FontSizer {
+  a = 0;
+  b = 0;
+  k: Streamer;
+  p: Streamer;
+
+  constructor(k: number, p: number) {
+    this.k = new Streamer(k);
+    this.p = new Streamer(p);
+  }
+
+  push(x: number, y: number) {
+    const a0 = this.a;
+    const b0 = this.b;
+    if (x !== a0 && a0 !== 0) {
+      const k = (y - b0) / (x - a0);
+      const p = y - k * x;
+      this.k.push(k);
+      this.p.push(p);
+    }
+    this.a = x;
+    this.b = y;
+  }
+
+  capacity(y: number) {
+    const k = this.k.mean();
+    const p = this.p.mean();
+    return Math.round(0.5 + (y - p) / k);
+  }
+
+  dimension(n: number) {
+    const k = this.k.mean();
+    const p = this.p.mean();
+    return p + n * k;
+  }
+
+  dump(x: string) {
+    const k = this.k.mean();
+    const p = this.p.mean();
+    return `${k}.${x}+${p}`;
+  }
+
+}
+
+/* --------------------------------------------------------------------------*/
+/* ---  Sizing Component                                                  ---*/
+/* --------------------------------------------------------------------------*/
+
+export const WSIZER = new FontSizer(7, 6);
+export const HSIZER = new FontSizer(14, 6);
+
+export interface SizedAreaProps {
+  cols: number;
+  rows: number;
+  children?: React.ReactNode;
+}
+
+export function SizedArea(props: SizedAreaProps) {
+  const { rows, cols, children } = props;
+  const refSizer = React.useCallback(
+    (ref: null | HTMLDivElement) => {
+      if (ref) {
+        const r = ref.getBoundingClientRect();
+        WSIZER.push(cols, r.width);
+        HSIZER.push(rows, r.height);
+      }
+    }, [rows, cols],
+  );
+  return (
+    <div
+      ref={refSizer}
+      className="eva-sized-area dome-text-cell"
+    >
+      {children}
+    </div>
+  );
+}
+
+/* --------------------------------------------------------------------------*/
diff --git a/ivette/src/frama-c/plugins/eva/stacks.ts b/ivette/src/frama-c/plugins/eva/stacks.ts
new file mode 100644
index 0000000000000000000000000000000000000000..891d90fea51c93ca5e28fd5493ba85538cb5ca0c
--- /dev/null
+++ b/ivette/src/frama-c/plugins/eva/stacks.ts
@@ -0,0 +1,120 @@
+// --------------------------------------------------------------------------
+// --- CallStacks
+// --------------------------------------------------------------------------
+
+import * as Server from 'frama-c/server';
+import * as Ast from 'frama-c/api/kernel/ast';
+import * as Values from 'frama-c/api/plugins/eva/values';
+
+import { ModelCallbacks } from './cells';
+
+// --------------------------------------------------------------------------
+// --- Callstack infos
+// --------------------------------------------------------------------------
+
+export type callstacks = Values.callstack[];
+export interface Callsite {
+  callee: string;
+  caller?: string;
+  stmt?: Ast.marker;
+  rank?: number;
+}
+
+function equalSite(a: Callsite, b: Callsite): boolean {
+  return a.stmt === b.stmt && a.callee === b.callee;
+}
+
+// --------------------------------------------------------------------------
+// --- CallStacks Cache
+// --------------------------------------------------------------------------
+
+export class StacksCache {
+
+  private readonly model: ModelCallbacks;
+  private readonly stacks = new Map<string, callstacks>();
+  private readonly summary = new Map<string, boolean>();
+  private readonly calls = new Map<Values.callstack, Callsite[]>();
+
+  // --------------------------------------------------------------------------
+  // --- LifeCycle
+  // --------------------------------------------------------------------------
+
+  constructor(state: ModelCallbacks) {
+    this.model = state;
+  }
+
+  clear() {
+    this.stacks.clear();
+    this.calls.clear();
+  }
+
+  // --------------------------------------------------------------------------
+  // --- Getters
+  // --------------------------------------------------------------------------
+
+  getSummary(fct: string): boolean {
+    return this.summary.get(fct) ?? true;
+  }
+
+  setSummary(fct: string, s: boolean) {
+    this.summary.set(fct, s);
+    this.model.forceLayout();
+  }
+
+  getStacks(...markers: Ast.marker[]): callstacks {
+    if (markers.length === 0) return [];
+    const key = markers.join('$');
+    const cs = this.stacks.get(key);
+    if (cs !== undefined) return cs;
+    this.stacks.set(key, []);
+    this.requestStacks(key, markers);
+    return [];
+  }
+
+  getCalls(cs: Values.callstack): Callsite[] {
+    const fs = this.calls.get(cs);
+    if (fs !== undefined) return fs;
+    this.calls.set(cs, []);
+    this.requestCalls(cs);
+    return [];
+  }
+
+  aligned(a: Values.callstack, b: Values.callstack): boolean {
+    if (a === b) return true;
+    const ca = this.getCalls(a);
+    const cb = this.getCalls(b);
+    let ka = ca.length - 1;
+    let kb = cb.length - 1;
+    while (ka >= 0 && kb >= 0 && equalSite(ca[ka], cb[kb])) {
+      --ka;
+      --kb;
+    }
+    return ka < 0 || kb < 0;
+  }
+
+  // --------------------------------------------------------------------------
+  // --- Fetchers
+  // --------------------------------------------------------------------------
+
+  private requestStacks(key: string, markers: Ast.marker[]) {
+    Server
+      .send(Values.getCallstacks, markers)
+      .then((stacks: callstacks) => {
+        this.stacks.set(key, stacks);
+        this.model.forceLayout();
+        this.model.forceUpdate();
+      });
+  }
+
+  private requestCalls(cs: Values.callstack) {
+    Server
+      .send(Values.getCallstackInfo, cs)
+      .then((calls) => {
+        this.calls.set(cs, calls);
+        this.model.forceUpdate();
+      });
+  }
+
+}
+
+// --------------------------------------------------------------------------
diff --git a/ivette/src/frama-c/plugins/eva/style.css b/ivette/src/frama-c/plugins/eva/style.css
new file mode 100644
index 0000000000000000000000000000000000000000..e578ea782ba99cb6cf9866b99429f404c0233191
--- /dev/null
+++ b/ivette/src/frama-c/plugins/eva/style.css
@@ -0,0 +1,260 @@
+/* -------------------------------------------------------------------------- */
+/* --- Probe Panel                                                        --- */
+/* -------------------------------------------------------------------------- */
+
+.eva-probeinfo {
+    min-height: 32px;
+    padding-left: 6px;
+    padding-top: 2px;
+    padding-bottom: 4px;
+    width: 100%;
+    background: #ccc;
+    display: flex;
+}
+
+.eva-probeinfo-label {
+    flex: 0 1 auto;
+    min-width: 22px;
+    text-align: left;
+}
+
+.eva-probeinfo-code {
+    flex: 0 1 auto;
+    height: fit-content;
+    background: lightgrey;
+    min-width: 120px;
+    width: auto;
+    border: thin solid black;
+    padding-left: 6px;
+    padding-right: 6px;
+    border-radius: 4px;
+    overflow: hidden;
+}
+
+.eva-probeinfo-stmt {
+    flex: 0 0 auto;
+    margin-left: 2px;
+    margin-right: 0px;
+    margin-top: 2px;
+}
+
+.eva-probeinfo-button {
+    flex: 0 0 auto;
+    margin: 1px;
+    min-width: 16px;
+}
+
+.eva-probeinfo-state {
+    margin-top: 2px;
+    margin-bottom: 2px;
+}
+
+/* -------------------------------------------------------------------------- */
+/* --- Call Satck Info                                                    --- */
+/* -------------------------------------------------------------------------- */
+
+.eva-info {
+    width: 100%;
+    flex-wrap: wrap;
+    background: #ccc;
+    padding-top: 3px;
+    padding-left: 12px;
+    padding-bottom: 2px;
+}
+
+.eva-callsite {
+    flex: 0 0 auto;
+    fill: #7cacbb;
+    background: #eee;
+    border-radius: 4px;
+    border: thin solid black;
+    padding-right: 7px;
+}
+
+.eva-callsite.eva-focused {
+    background: #cbe4cb;
+}
+
+.eva-callsite.eva-focused.eva-transient {
+    background: #f9dca6;
+}
+
+/* -------------------------------------------------------------------------- */
+/* --- Alarms                                                             --- */
+/* -------------------------------------------------------------------------- */
+
+.eva-cell-alarms {
+    fill: orange;
+    position: absolute;
+    top: -1px;
+    right: 3px;
+    z-index: 1;
+}
+
+.eva-alarm-info {
+    font-size: x-small;
+    padding: 0px;
+    margin: 1px;
+}
+
+.eva-alarm-none { display: none; }
+.eva-alarm-True { fill: green; }
+.eva-alarm-False { fill: #fb4e4a; }
+.eva-alarm-Unknown { fill: darkorange; }
+
+/* -------------------------------------------------------------------------- */
+/* --- Styling Values                                                     --- */
+/* -------------------------------------------------------------------------- */
+
+.eva-stmt {
+    color: grey;
+    text-select: none;
+}
+
+.eva-sized-area {
+    padding: 3px;
+    white-space: pre;
+    overflow: hidden;
+    text-overflow: ellipsis;
+}
+
+/* -------------------------------------------------------------------------- */
+/* --- Table Rows                                                         --- */
+/* -------------------------------------------------------------------------- */
+
+.eva-row {
+    display: flex;
+    position: relative;
+    flex: 0 1 auto;
+    height: 100%;
+}
+
+/* -------------------------------------------------------------------------- */
+/* --- Table Heads                                                        --- */
+/* -------------------------------------------------------------------------- */
+
+.eva-function {
+    padding-top: 0px;
+    background: #ccc;
+}
+
+.eva-head {
+    padding-top: 2px;
+    color: #777;
+    text-align: center;
+    border-left: thin solid black;
+    border-bottom: thin solid black;
+}
+
+.eva-probes .eva-head {
+    border-top: thin solid black;
+}
+
+.eva-phantom {
+    visibility: hidden;
+    height: 0;
+}
+
+/* -------------------------------------------------------------------------- */
+/* --- Table Cells                                                        --- */
+/* -------------------------------------------------------------------------- */
+
+.eva-fct-fold {
+    margin-left: 4px;
+    margin-right: 8px;
+    padding: 0px;
+}
+
+.eva-fct-name {
+    padding: 0px;
+    font-weight: bold;
+}
+
+.eva-cell {
+    flex: 1 1 auto;
+    border-right: thin solid black;
+    border-bottom: thin solid black;
+}
+
+.eva-cell:nth-child(2) {
+    border-left: thin solid black;
+}
+
+.eva-probes .eva-cell {
+    padding: 2px;
+    text-align: center;
+    border-top: thin solid black;
+}
+
+/* -------------------------------------------------------------------------- */
+/* --- Cell Diffs                                                         --- */
+/* -------------------------------------------------------------------------- */
+
+.eva-diff-shadow {
+    border: solid transparent 2px;
+    position: relative;
+    z-index: -1;
+}
+
+.eva-diff-added { }
+.eva-diff-removed { text-decoration: strike }
+
+.eva-state-Here .eva-diff { background: #95f5ff; }
+.eva-state-After .eva-diff { background: #fff819; }
+.eva-state-Then .eva-diff { background: #c8e06e; }
+.eva-state-Else .eva-diff { background: #ff834e; }
+
+/* -------------------------------------------------------------------------- */
+/* --- Table Rows Background                                              --- */
+/* -------------------------------------------------------------------------- */
+
+/* --- Probes --- */
+
+.eva-probes .eva-cell {
+    background: #cbe4cb;
+}
+
+.eva-probes .eva-focused {
+    background: #02da02;
+}
+
+.eva-probes .eva-transient {
+    background: #fff0d5;
+}
+
+.eva-probes .eva-transient.eva-focused {
+    background: orange;
+}
+
+
+/* --- Values / Callstacks --- */
+
+.eva-values .eva-cell {
+    background: #eee;
+}
+
+.eva-values .eva-focused {
+    background: #e1e8f7;
+}
+
+.eva-values .eva-transient.eva-focused {
+    background: #fff0d5;
+}
+
+.eva-callstack.eva-row-odd .eva-cell {
+    background: #eee;
+}
+
+.eva-callstack.eva-row-even .eva-cell {
+    background: #e2e8e8;
+}
+
+.eva-callstack.eva-row-aligned {
+    background: lightblue;
+}
+
+.eva-callstack.eva-row-selected {
+    background: #f9dca6;
+}
+
+/* -------------------------------------------------------------------------- */
diff --git a/ivette/src/frama-c/plugins/eva/valueinfos.tsx b/ivette/src/frama-c/plugins/eva/valueinfos.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..72271f07b54b58aa5f8f0cb486e5a892ae205286
--- /dev/null
+++ b/ivette/src/frama-c/plugins/eva/valueinfos.tsx
@@ -0,0 +1,117 @@
+// --------------------------------------------------------------------------
+// --- Info Components
+// --------------------------------------------------------------------------
+
+// React & Dome
+import React from 'react';
+import { classes } from 'dome/misc/utils';
+import { Hpack, Vpack } from 'dome/layout/boxes';
+import { Code, Cell } from 'dome/controls/labels';
+import * as States from 'frama-c/states';
+
+// Locals
+import { EvaAlarm } from './cells';
+import { Callsite } from './stacks';
+import { useModel } from './model';
+
+// --------------------------------------------------------------------------
+// --- Stmt Printer
+// --------------------------------------------------------------------------
+
+interface StmtProps {
+  stmt?: string;
+  rank?: number;
+}
+
+export function Stmt(props: StmtProps) {
+  const { rank, stmt } = props;
+  if (rank === undefined || !stmt) return null;
+  const title = `Stmt at global rank ${rank} (internal id: ${stmt})`;
+  return (
+    <span className="dome-text-cell eva-stmt" title={title}>
+      @S{rank}
+    </span>
+  );
+}
+
+// --------------------------------------------------------------------------
+// --- Alarms Panel
+// --------------------------------------------------------------------------
+
+export function AlarmsInfos() {
+  const model = useModel();
+  const probe = model.getFocused();
+  if (probe) {
+    const callstack = model.getCallstack();
+    const domain = model.values.getValues(probe, callstack);
+    const alarms = domain?.alarms ?? [];
+    if (alarms.length > 0) {
+      const renderAlarm = ([status, alarm]: EvaAlarm) => {
+        const className = `eva-alarm-info eva-alarm-${status}`;
+        return (
+          <Code className={className} icon="WARNING">{alarm}</Code>
+        );
+      };
+      return (
+        <Vpack className="eva-info">
+          {React.Children.toArray(alarms.map(renderAlarm))}
+        </Vpack>
+      );
+    }
+  }
+  return null;
+}
+
+// --------------------------------------------------------------------------
+// --- Stack Panel
+// --------------------------------------------------------------------------
+
+export function StackInfos() {
+  const model = useModel();
+  const [, setSelection] = States.useSelection();
+  const focused = model.getFocused();
+  const callstack = model.getCalls();
+  if (callstack.length <= 1) return null;
+  const makeCallsite = ({ caller, stmt, rank }: Callsite) => {
+    if (!caller || !stmt) return null;
+    const key = `${caller}@${stmt}`;
+    const isFocused = focused?.marker === stmt;
+    const isTransient = focused?.transient;
+    const className = classes(
+      'eva-callsite',
+      isFocused && 'eva-focused',
+      isTransient && 'eva-transient',
+    );
+    const select = (meta: boolean) => {
+      const location = { fct: caller, marker: stmt };
+      setSelection({ location });
+      if (meta) States.MetaSelection.emit(location);
+    };
+    const onClick = (evt: React.MouseEvent) => {
+      select(evt.altKey);
+    };
+    const onDoubleClick = (evt: React.MouseEvent) => {
+      evt.preventDefault();
+      select(true);
+    };
+    return (
+      <Cell
+        key={key}
+        icon="TRIANGLE.LEFT"
+        className={className}
+        onClick={onClick}
+        onDoubleClick={onDoubleClick}
+      >
+        {caller}
+        <Stmt stmt={stmt} rank={rank} />
+      </Cell>
+    );
+  };
+  return (
+    <Hpack className="eva-info">
+      {callstack.map(makeCallsite)}
+    </Hpack>
+  );
+}
+
+// --------------------------------------------------------------------------
diff --git a/ivette/src/frama-c/plugins/eva/valuetable.tsx b/ivette/src/frama-c/plugins/eva/valuetable.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..8a4dff4bac16f75bca3f4f18390d08df12333490
--- /dev/null
+++ b/ivette/src/frama-c/plugins/eva/valuetable.tsx
@@ -0,0 +1,358 @@
+// --------------------------------------------------------------------------
+// --- Eva Values
+// --------------------------------------------------------------------------
+
+// React & Dome
+import React from 'react';
+import * as Dome from 'dome';
+import { classes } from 'dome/misc/utils';
+import { VariableSizeList } from 'react-window';
+import { Hpack, Filler } from 'dome/layout/boxes';
+import { Icon } from 'dome/controls/icons';
+import { Cell } from 'dome/controls/labels';
+import { IconButton } from 'dome/controls/buttons';
+
+// Frama-C
+import * as States from 'frama-c/states';
+
+// Locals
+import { SizedArea, HSIZER, WSIZER } from './sized';
+import { Diff, DiffProps } from './diffed';
+import { sizeof, EvaValues, EvaState } from './cells';
+import { Probe } from './probes';
+import { Row } from './layout';
+import { Callsite } from './stacks';
+import { useModel } from './model';
+import { Stmt } from './valueinfos';
+import './style.css';
+
+// --------------------------------------------------------------------------
+// --- Cell Diffs
+// --------------------------------------------------------------------------
+
+function isTrivial(v: EvaValues) {
+  return v.values === '{0; 1}' &&
+    v.v_then === '{1}' &&
+    v.v_else === '{0}';
+}
+
+function computeDiffs(
+  condition: boolean,
+  v: EvaValues,
+  vstate: EvaState,
+): DiffProps {
+  if (condition) {
+    const trv = isTrivial(v);
+    switch (vstate) {
+      case 'Here':
+      case 'After':
+        return trv ? { text: v.values } :
+          { text: v.values, diffA: v.v_then, diffB: v.v_else };
+      case 'Then':
+        return { text: v.v_then, diff: !trv ? v.values : undefined };
+      case 'Else':
+        return { text: v.v_else, diff: !trv ? v.values : undefined };
+    }
+  } else {
+    switch (vstate) {
+      case 'Here':
+      case 'Then':
+      case 'Else':
+        return { text: v.values, diff: v.v_after };
+      case 'After':
+        return { text: v.v_after, diff: v.values };
+    }
+  }
+}
+
+// --------------------------------------------------------------------------
+// --- Table Cell
+// --------------------------------------------------------------------------
+
+interface TableCellProps {
+  probe: Probe;
+  row: Row;
+}
+
+const CELLPADDING = 12;
+
+function TableCell(props: TableCellProps) {
+  const model = useModel();
+  const [, setSelection] = States.useSelection();
+  const { probe, row } = props;
+  const { kind, callstack } = row;
+  const minWidth = CELLPADDING + WSIZER.dimension(probe.minCols);
+  const maxWidth = CELLPADDING + WSIZER.dimension(probe.maxCols);
+  const style = { width: minWidth, maxWidth };
+  let contents: React.ReactNode = props.probe.marker;
+  const { transient } = probe;
+  const focused = model.getFocused();
+  const isFocused = focused === probe;
+
+  switch (kind) {
+
+    // ---- Probe Contents
+    case 'probes':
+      if (transient) {
+        contents = <span className="dome-text-label">« Probe »</span>;
+      } else {
+        const { stmt, rank, code, label } = probe;
+        const textClass = label ? 'dome-text-label' : 'dome-text-cell';
+        contents = (
+          <>
+            <span className={textClass}>{label ?? code}</span>
+            <Stmt stmt={stmt} rank={rank} />
+          </>
+        );
+      }
+      break;
+
+    // ---- Values Contents
+    case 'values':
+    case 'callstack':
+      {
+        const domain = model.values.getValues(probe, callstack);
+        const { alarms = [] } = domain;
+        const { condition } = probe;
+        const vstate = condition ? model.getVcond() : model.getVstmt();
+        const vdiffs = computeDiffs(condition, domain, vstate);
+        const text = vdiffs.text ?? vdiffs.diff;
+        const { cols, rows } = sizeof(text);
+        let status = 'none';
+        if (alarms.length > 0) {
+          if (alarms.find(([st, _]) => st === 'False')) status = 'False';
+          else status = 'Unknown';
+        }
+        const alarmClass = `eva-cell-alarms eva-alarm-${status}`;
+        contents = (
+          <>
+            <Icon className={alarmClass} size={10} id="WARNING" />
+            <SizedArea cols={cols} rows={rows}>
+              <span className={`eva-state-${vstate}`}>
+                <Diff {...vdiffs} />
+              </span>
+            </SizedArea>
+          </>
+        );
+      }
+      break;
+
+  }
+
+  // --- Cell Packing
+  const className = classes(
+    'eva-cell',
+    transient && 'eva-transient',
+    isFocused && 'eva-focused',
+  );
+  const onClick = () => {
+    const location = { fct: probe.fct, marker: probe.marker };
+    setSelection({ location });
+    model.setSelectedRow(row);
+  };
+  const onDoubleClick = () => {
+    probe.setPersistent();
+    if (probe.zoomable) probe.setZoomed(!probe.zoomed);
+  };
+  return (
+    <div
+      className={className}
+      style={style}
+      onClick={onClick}
+      onDoubleClick={onDoubleClick}
+    >
+      {contents}
+    </div>
+  );
+}
+
+// --------------------------------------------------------------------------
+// --- Table Section
+// --------------------------------------------------------------------------
+
+interface TableSectionProps {
+  fct: string;
+  folded: boolean;
+  foldable: boolean;
+  onClick: () => void;
+}
+
+function TableSection(props: TableSectionProps) {
+  const { fct, foldable, folded, onClick } = props;
+  const icon = folded ? 'ANGLE.RIGHT' :
+    foldable ? 'ANGLE.DOWN' : 'TRIANGLE.RIGHT';
+  return (
+    <>
+      <IconButton
+        className="eva-fct-fold"
+        size={10}
+        offset={-1}
+        icon={icon}
+        enabled={foldable}
+        onClick={onClick}
+      />
+      <Cell className="eva-fct-name">{fct}</Cell>
+    </>
+  );
+}
+
+// --------------------------------------------------------------------------
+// --- Table Row Header
+// --------------------------------------------------------------------------
+
+interface TableHeadProps {
+  stackCalls: Callsite[];
+  stackIndex: number | undefined;
+  stackCount: number | undefined;
+  onClick: () => void;
+}
+
+function makeStackTitle(calls: Callsite[]) {
+  const cs = calls.slice(1);
+  if (cs.length > 0)
+    return `Callstack: ${cs.map((c) => c.callee).join(' \u2190 ')}`;
+  return 'Callstack Details';
+}
+
+function TableHead(props: TableHeadProps) {
+  const sk = props.stackIndex;
+  const sc = props.stackCount;
+  const hdClass = classes('eva-head', sc ? undefined : 'dome-hidden');
+  const hdHeader = sk === undefined;
+  const hdSummary = sk !== undefined && sk < 0;
+  const hdNumber = sk === undefined ? 0 : 1 + sk;
+  const hdTitle =
+    hdHeader ? 'Callstack / Summary' :
+      hdSummary ? 'Summary' : makeStackTitle(props.stackCalls);
+  return (
+    <div
+      className={hdClass}
+      title={hdTitle}
+      onClick={props.onClick}
+    >
+      <div className="eva-phantom">{'\u2211'}{sc ?? '#'}</div>
+      {hdHeader ? '#' : hdSummary ? '\u2211' : `${hdNumber}`}
+    </div>
+  );
+}
+
+// --------------------------------------------------------------------------
+// --- Table Row
+// --------------------------------------------------------------------------
+
+interface TableRowProps {
+  style: React.CSSProperties;
+  index: number;
+}
+
+function TableRow(props: TableRowProps) {
+  const model = useModel();
+  const row = model.getRow(props.index);
+  if (!row) return null;
+  const { kind, probes } = row;
+  if (kind === 'section') {
+    const { fct } = row;
+    if (!fct) return null;
+    const folded = model.isFolded(fct);
+    const foldable = model.isFoldable(fct);
+    return (
+      <Hpack className="eva-function" style={props.style}>
+        <TableSection
+          fct={fct}
+          folded={folded}
+          foldable={foldable}
+          onClick={() => model.setFolded(fct, !folded)}
+        />
+      </Hpack>
+    );
+  }
+  const sk = row.stackIndex;
+  const sc = row.stackCount;
+  const cs = row.callstack;
+  const calls = cs ? model.stacks.getCalls(cs) : [];
+  const rowKind = `eva-${kind}`;
+  const rowParity = sk !== undefined && sk % 2 === 1;
+  const rowIndexKind =
+    model.isSelectedRow(row) ? 'eva-row-selected' :
+      model.isAlignedRow(row) ? 'eva-row-aligned' :
+        rowParity ? 'eva-row-odd' : 'eva-row-even';
+  const rowClass = classes('eva-row', rowKind, rowIndexKind);
+  const onHeaderClick = () => model.setSelectedRow(row);
+  const makeCell = (probe: Probe) => (
+    <TableCell
+      key={probe.marker}
+      probe={probe}
+      row={row}
+    />
+  );
+  return (
+    <Hpack style={props.style}>
+      <div className={rowClass}>
+        <TableHead
+          stackIndex={sk}
+          stackCount={sc}
+          stackCalls={calls}
+          onClick={onHeaderClick}
+        />
+        {probes.map(makeCell)}
+      </div>
+      <Filler />
+    </Hpack>
+  );
+}
+
+// --------------------------------------------------------------------------
+// --- Values Panel
+// --------------------------------------------------------------------------
+
+export interface Dimension {
+  width: number;
+  height: number;
+}
+
+export interface ValuesPanelProps extends Dimension {
+  zoom: number;
+}
+
+export function ValuesPanel(props: ValuesPanelProps) {
+  const model = useModel();
+  const { zoom, width, height } = props;
+  // --- reset line cache
+  const listRef = React.useRef<VariableSizeList>(null);
+  Dome.useEvent(model.laidout, () => {
+    setImmediate(() => {
+      const vlist = listRef.current;
+      if (vlist) vlist.resetAfterIndex(0, true);
+    });
+  });
+  // --- compute line height
+  const getRowHeight = React.useCallback(
+    (k: number) => HSIZER.dimension(model.getRowLines(k)),
+    [model],
+  );
+  // --- compute layout
+  const margin = WSIZER.capacity(width);
+  const estimatedHeight = HSIZER.dimension(1);
+  const [selection] = States.useSelection();
+  React.useEffect(() => {
+    const location = selection?.current;
+    model.setLayout({ zoom, margin, location });
+  });
+  // --- render list
+  return (
+    <VariableSizeList
+      ref={listRef}
+      itemCount={model.getRowCount()}
+      itemKey={model.getRowKey}
+      itemSize={getRowHeight}
+      estimatedItemSize={estimatedHeight}
+      width={width}
+      height={height}
+      itemData={model}
+    >
+      {TableRow}
+    </VariableSizeList>
+  );
+}
+
+// --------------------------------------------------------------------------
diff --git a/ivette/src/frama-c/server.ts b/ivette/src/frama-c/server.ts
index 77b31f11834bbd946f851794d4be3fab477c5227..63c67957c1a310aee3ba8154031adc677f02c8c5 100644
--- a/ivette/src/frama-c/server.ts
+++ b/ivette/src/frama-c/server.ts
@@ -21,7 +21,7 @@ import { ChildProcess } from 'child_process';
 // --- Pretty Printing (Browser Console)
 // --------------------------------------------------------------------------
 
-const PP = new Dome.PP('Server');
+const D = new Dome.Debug('Server');
 
 // --------------------------------------------------------------------------
 // --- Events
@@ -32,7 +32,7 @@ const PP = new Dome.PP('Server');
 
  *  This event is emitted whenever the server status changes.
  */
-const STATUS = 'frama-c.server.status';
+const STATUS = new Dome.Event<Status>('frama-c.server.status');
 
 /**
  *  Server is actually started and running.
@@ -40,7 +40,7 @@ const STATUS = 'frama-c.server.status';
  *  This event is emitted when ther server _enters_ the `ON` state.
  *  The server is now ready to handle requests.
  */
-const READY = 'frama-c.server.ready';
+const READY = new Dome.Event('frama-c.server.ready');
 
 /**
  *  Server Status Notification Event
@@ -48,21 +48,18 @@ const READY = 'frama-c.server.ready';
  *  This event is emitted when ther server _leaves_ the `ON` state.
  *  The server is no more able to handle requests until restart.
  */
-const SHUTDOWN = 'frama-c.server.shutdown';
+const SHUTDOWN = new Dome.Event('frama-c.server.shutdown');
 
 /**
- *  Server Signal Prefix
+ *  Server Signal event constructor.
 
  *  Event `frama-c.server.signal.<id>'` for signal `<id>`.
  */
-const SIGNAL = 'frama-c.server.signal.';
-
-/**
- *  Server Signal Activity Prefix
-
- *  Event `frama-c.server.activity.<id>'` for signal `<id>`.
- */
-const ACTIVITY = 'frama-c.server.activity.';
+export class SIGNAL extends Dome.Event {
+  constructor(signal: string) {
+    super(`frama-c.server.signal.${signal}`);
+  }
+}
 
 // --------------------------------------------------------------------------
 // --- Server Status
@@ -200,22 +197,13 @@ export function getPending(): number {
  *  Register callback on `READY` event.
  *  @param {function} callback Invoked when the server enters [[ON]] stage.
  */
-export function onReady(callback: any) { Dome.on(READY, callback); }
+export function onReady(callback: () => void) { READY.on(callback); }
 
 /**
  *  Register callback on `SHUTDOWN` event.
  *  @param {function} callback Invoked when the server leaves [[ON]] stage.
  */
-export function onShutdown(callback: any) { Dome.on(SHUTDOWN, callback); }
-
-/**
- *  Register callback on a signal `ACTIVITY` event.
- *  @param {string} id The signal identifier to listen to.
- *  @param {function} callback Invoked with `callback(signal, active)`.
- */
-export function onActivity(signal: string, callback: any) {
-  Dome.on(ACTIVITY + signal, callback);
-}
+export function onShutdown(callback: () => void) { SHUTDOWN.on(callback); }
 
 // --------------------------------------------------------------------------
 // --- Status Update
@@ -223,15 +211,15 @@ export function onActivity(signal: string, callback: any) {
 
 function _status(newStatus: Status) {
   if (Dome.DEVEL && hasErrorStatus(newStatus)) {
-    PP.error(newStatus.error);
+    D.error(newStatus.error);
   }
 
   if (newStatus !== status) {
     const oldStatus = status;
     status = newStatus;
-    Dome.emit(STATUS);
-    if (oldStatus.stage === Stage.ON) Dome.emit(SHUTDOWN);
-    if (newStatus.stage === Stage.ON) Dome.emit(READY);
+    STATUS.emit(newStatus);
+    if (oldStatus.stage === Stage.ON) SHUTDOWN.emit();
+    if (newStatus.stage === Stage.ON) READY.emit();
   }
 }
 
@@ -256,7 +244,7 @@ export async function start() {
         await _launch();
         _status(okStatus(Stage.ON));
       } catch (error) {
-        PP.error(error.toString());
+        D.error(error.toString());
         buffer.append(error.toString(), '\n');
         _exit(error);
       }
@@ -368,12 +356,9 @@ export function restart() {
 export function clear() {
   switch (status.stage) {
     case Stage.FAILURE:
-      buffer.clear();
-      _status(okStatus(Stage.OFF));
-      return;
     case Stage.OFF:
       buffer.clear();
-      Dome.emit(STATUS);
+      _status(okStatus(Stage.OFF));
       return;
     default:
       return;
@@ -484,7 +469,7 @@ async function _launch() {
   process?.stdout?.on('data', logger);
   process?.stderr?.on('data', logger);
   process?.on('exit', (code: number | null, signal: string | null) => {
-    PP.log('Process exited');
+    D.log('Process exited');
 
     if (signal) {
       // [signal] is non-null.
@@ -514,7 +499,7 @@ async function _launch() {
 // --------------------------------------------------------------------------
 
 function _reset() {
-  PP.log('Reset to initial configuration');
+  D.log('Reset to initial configuration');
 
   rqCount = 0;
   queueCmd = [];
@@ -536,7 +521,7 @@ function _reset() {
 }
 
 function _kill() {
-  PP.log('Hard kill');
+  D.log('Hard kill');
 
   _reset();
   if (process) {
@@ -545,7 +530,7 @@ function _kill() {
 }
 
 async function _shutdown() {
-  PP.log('Shutdown');
+  D.log('Shutdown');
 
   _reset();
   queueCmd.push('SHUTDOWN');
@@ -587,13 +572,13 @@ function _exit(error?: Error) {
 
 class SignalHandler {
   id: any;
-  event: string;
+  event: Dome.Event;
   active: boolean;
   listen: boolean;
 
   constructor(id: any) {
     this.id = id;
-    this.event = SIGNAL + id;
+    this.event = new SIGNAL(id);
     this.active = false;
     this.listen = false;
     this.sigon = this.sigon.bind(this);
@@ -601,18 +586,21 @@ class SignalHandler {
     this.unplug = this.unplug.bind(this);
   }
 
-  on(callback: any) {
-    const n = Dome.emitter.listenerCount(this.event);
-    Dome.on(this.event, callback);
+  on(callback: () => void) {
+    const e = this.event;
+
+    const n = e.listenerCount();
+    e.on(callback);
     if (n === 0) {
       this.active = true;
       if (isRunning()) this.sigon();
     }
   }
 
-  off(callback: any) {
-    Dome.off(this.event, callback);
-    const n = Dome.emitter.listenerCount(this.event);
+  off(callback: () => void) {
+    const e = this.event;
+    e.off(callback);
+    const n = e.listenerCount();
     if (n === 0) {
       this.active = false;
       if (isRunning()) this.sigoff();
@@ -622,7 +610,6 @@ class SignalHandler {
   /* Bound to this */
   sigon() {
     if (this.active && !this.listen) {
-      Dome.emit(ACTIVITY + this.id, true);
       this.listen = true;
       queueCmd.push('SIGON', this.id);
       _flush();
@@ -632,7 +619,6 @@ class SignalHandler {
   /* Bound to this, Debounced */
   sigoff() {
     if (!this.active && this.listen) {
-      Dome.emit(ACTIVITY + this.id, false);
       if (isRunning()) {
         this.listen = false;
         queueCmd.push('SIGOFF', this.id);
@@ -699,13 +685,13 @@ export function useSignal(s: Signal, callback: any) {
 
 // --- Server Synchro
 
-Dome.on(READY, () => {
+READY.on(() => {
   signals.forEach((h: SignalHandler) => {
     h.sigon();
   });
 });
 
-Dome.on(SHUTDOWN, () => {
+SHUTDOWN.on(() => {
   signals.forEach((h: SignalHandler) => {
     h.unplug();
     (h.sigoff as unknown as _.Cancelable).cancel();
@@ -846,7 +832,7 @@ async function _send() {
         const resp = await zmqSocket?.receive();
         _receive(resp);
       } catch (error) {
-        PP.error(`Error in send/receive on ZMQ socket. ${error.toString()}`);
+        D.error(`Error in send/receive on ZMQ socket. ${error.toString()}`);
         _cancel(ids);
       }
       zmqIsBusy = false;
@@ -854,7 +840,7 @@ async function _send() {
       // No pending command nor pending response
       rqCount = 0;
     }
-    Dome.emit(STATUS);
+    STATUS.emit(status);
   }
 }
 
@@ -891,14 +877,14 @@ function _receive(resp: any) {
           break;
         case 'SIGNAL':
           rid = shift();
-          Dome.emit(SIGNAL + rid);
+          (new SIGNAL(rid)).emit();
           break;
         case 'WRONG':
           err = shift();
-          PP.error(`ZMQ Protocol Error: ${err}`);
+          D.error(`ZMQ Protocol Error: ${err}`);
           break;
         default:
-          PP.error(`Unknown Response: ${cmd}`);
+          D.error(`Unknown Response: ${cmd}`);
           unknownResponse = true;
           break;
       }
diff --git a/ivette/src/frama-c/states.ts b/ivette/src/frama-c/states.ts
index 6154bcd40fea1eb02149b2897efb9e15947a9560..a7580038100d64ffaad5ce75e3cfe48ccd84d273 100644
--- a/ivette/src/frama-c/states.ts
+++ b/ivette/src/frama-c/states.ts
@@ -12,19 +12,24 @@ import React from 'react';
 import * as Dome from 'dome';
 import * as Json from 'dome/data/json';
 import { Order } from 'dome/data/compare';
-import * as GlobalStates from 'dome/data/states';
-import { useModel } from 'dome/table/models';
+import { GlobalState, useGlobalState } from 'dome/data/states';
+import { Client, useModel } from 'dome/table/models';
 import { CompactModel } from 'dome/table/arrays';
+import * as Ast from 'frama-c/api/kernel/ast';
 import * as Server from './server';
 
-const PROJECT = 'frama-c.project';
-const STATE_PREFIX = 'frama-c.state.';
+const PROJECT = new Dome.Event('frama-c.project');
+class STATE extends Dome.Event {
+  constructor(id: string) {
+    super(`frama-c.state.${id}`);
+  }
+}
 
 // --------------------------------------------------------------------------
 // --- Pretty Printing (Browser Console)
 // --------------------------------------------------------------------------
 
-const PP = new Dome.PP('States');
+const D = new Dome.Debug('States');
 
 // --------------------------------------------------------------------------
 // --- Synchronized Current Project
@@ -42,15 +47,15 @@ Server.onReady(async () => {
     };
     const current: { id?: string } = await Server.send(sr, null);
     currentProject = current.id;
-    Dome.emit(PROJECT);
+    PROJECT.emit();
   } catch (error) {
-    PP.error(`Fail to retrieve the current project. ${error.toString()}`);
+    D.error(`Fail to retrieve the current project. ${error.toString()}`);
   }
 });
 
 Server.onShutdown(() => {
   currentProject = '';
-  Dome.emit(PROJECT);
+  PROJECT.emit();
 });
 
 // --------------------------------------------------------------------------
@@ -85,9 +90,9 @@ export async function setProject(project: string) {
       };
       await Server.send(sr, project);
       currentProject = project;
-      Dome.emit(PROJECT);
+      PROJECT.emit();
     } catch (error) {
-      PP.error(`Fail to set the current project. ${error.toString()}`);
+      D.error(`Fail to set the current project. ${error.toString()}`);
     }
   }
 }
@@ -133,7 +138,7 @@ export function useRequest<In, Out>(
         const r = await Server.send(rq, params);
         update(r);
       } catch (error) {
-        PP.error(`Fail in useRequest '${rq.name}'. ${error.toString()}`);
+        D.error(`Fail in useRequest '${rq.name}'. ${error.toString()}`);
         update(options.onError);
       }
     } else {
@@ -221,20 +226,20 @@ interface Handler<A> {
 
 // shared for all projects
 class SyncState<A> {
-  UPDATE: string;
+  UPDATE: Dome.Event;
   handler: Handler<A>;
   upToDate: boolean;
   value?: A;
 
   constructor(h: Handler<A>) {
     this.handler = h;
-    this.UPDATE = STATE_PREFIX + h.name;
+    this.UPDATE = new STATE(h.name);
     this.upToDate = false;
     this.value = undefined;
     this.update = this.update.bind(this);
     this.getValue = this.getValue.bind(this);
     this.setValue = this.setValue.bind(this);
-    Dome.on(PROJECT, this.update);
+    PROJECT.on(this.update);
   }
 
   getValue() {
@@ -250,9 +255,9 @@ class SyncState<A> {
       this.value = v;
       const setter = this.handler.getter;
       if (setter) await Server.send(setter, v);
-      Dome.emit(this.UPDATE);
+      this.UPDATE.emit();
     } catch (error) {
-      PP.error(
+      D.error(
         `Fail to set value of SyncState '${this.handler.name}'.`,
         `${error.toString()}`,
       );
@@ -264,9 +269,9 @@ class SyncState<A> {
       this.upToDate = true;
       const v = await Server.send(this.handler.getter, null);
       this.value = v;
-      Dome.emit(this.UPDATE);
+      this.UPDATE.emit();
     } catch (error) {
-      PP.error(
+      D.error(
         `Fail to update SyncState '${this.handler.name}'.`,
         `${error.toString()}`,
       );
@@ -309,7 +314,7 @@ export function useSyncState<A>(
 /** Synchronization with a (projectified) server value. */
 export function useSyncValue<A>(va: Value<A>): A | undefined {
   const s = getSyncState(va);
-  Dome.useUpdate(s.update);
+  Dome.useUpdate(PROJECT, s.UPDATE);
   Server.useSignal(s.handler.signal, s.update);
   return s.getValue();
 }
@@ -359,7 +364,7 @@ class SyncArray<K, A> {
       } while (pending > 0);
       /* eslint-enable no-await-in-loop */
     } catch (error) {
-      PP.error(
+      D.error(
         `Fail to retrieve the value of syncArray '${this.handler.name}.`,
         `${error.toString()}`,
       );
@@ -378,7 +383,7 @@ class SyncArray<K, A> {
         this.fetch();
       }
     } catch (error) {
-      PP.error(
+      D.error(
         `Fail to set reload of syncArray '${this.handler.name}'.`,
         `${error.toString()}`,
       );
@@ -393,7 +398,7 @@ class SyncArray<K, A> {
 
 const syncArrays = new Map<string, SyncArray<any, any>>();
 
-function getSyncArray<K, A>(
+function lookupSyncArray<K, A>(
   array: Array<K, A>,
 ): SyncArray<K, A> {
   const id = `${currentProject}@${array.name}`;
@@ -413,7 +418,7 @@ Server.onShutdown(() => syncArrays.clear());
 
 /** Force a Synchronized Array to reload. */
 export function reloadArray<K, A>(arr: Array<K, A>) {
-  getSyncArray(arr).reload();
+  lookupSyncArray(arr).reload();
 }
 
 /**
@@ -430,33 +435,50 @@ export function useSyncArray<K, A>(
   sync = true,
 ): CompactModel<K, A> {
   Dome.useUpdate(PROJECT);
-  const st = getSyncArray(arr);
+  const st = lookupSyncArray(arr);
   React.useEffect(st.update);
   Server.useSignal(arr.signal, st.fetch);
   useModel(st.model, sync);
   return st.model;
 }
 
+/**
+   Return the associated array model.
+*/
+export function getSyncArray<K, A>(
+  arr: Array<K, A>,
+): CompactModel<K, A> {
+  const st = lookupSyncArray(arr);
+  return st.model;
+}
+
+/**
+   Link on the associated array model.
+   @param onReload callback on reload event and update event if not specified.
+   @param onUpdate callback on update event.
+ */
+export function onSyncArray<K, A>(
+  arr: Array<K, A>,
+  onReload?: () => void,
+  onUpdate?: () => void,
+): Client {
+  const st = lookupSyncArray(arr);
+  return st.model.link(onReload, onUpdate);
+}
+
 // --------------------------------------------------------------------------
 // --- Selection
 // --------------------------------------------------------------------------
 
-type AtLeastOne<T, U = { [K in keyof T]: Pick<T, K> }> =
-  Partial<T> & U[keyof U];
-
-export interface FullLocation {
-  /** Function name. */
-  readonly function: string;
-  /** Marker identifier. */
-  readonly marker: string;
-}
-
 /** An AST location.
  *
  *  Properties [[function]] and [[marker]] are optional,
  *  but at least one of the two must be set.
  */
-export type Location = AtLeastOne<FullLocation>;
+export type Location = {
+  fct?: string;
+  marker?: Ast.marker;
+};
 
 export interface HistorySelection {
   /** Previous locations with respect to the [[current]] one. */
@@ -475,7 +497,11 @@ export type HistorySelectActions = 'HISTORY_PREV' | 'HISTORY_NEXT';
 
 /** A selection of multiple locations. */
 export interface MultipleSelection {
-  /** The index of the current selected location in [[possibleSelections]]. */
+  /** Name of the multiple selection.  */
+  name: string;
+  /** Explanatory description of the multiple selection.  */
+  title: string;
+  /** The index of the current selected location in [[allSelections]]. */
   index: number;
   /** All locations forming a multiple selection. */
   allSelections: Location[];
@@ -483,6 +509,8 @@ export interface MultipleSelection {
 
 /** A select action on multiple locations. */
 export interface MultipleSelect {
+  readonly name: string;
+  readonly title: string;
   readonly index: number;
   readonly locations: Location[];
 }
@@ -544,7 +572,7 @@ function isNthSelect(a: SelectionActions): a is NthSelect {
 /** Update selection to the given location. */
 function selectLocation(s: Selection, location: Location): Selection {
   const [prevSelections, nextSelections] =
-    s.current && s.current.function !== location.function ?
+    s.current && s.current.fct !== location.fct ?
       [[s.current, ...s.history.prevSelections], []] :
       [s.history.prevSelections, s.history.nextSelections];
   return {
@@ -593,19 +621,18 @@ function fromHistory(s: Selection, action: HistorySelectActions): Selection {
  */
 function fromMultipleSelections(
   s: Selection,
-  action: 'MULTIPLE_PREV' | 'MULTIPLE_NEXT' | 'MULTIPLE_CYCLE'
-  | 'MULTIPLE_CLEAR',
+  a: 'MULTIPLE_PREV' | 'MULTIPLE_NEXT' | 'MULTIPLE_CYCLE' | 'MULTIPLE_CLEAR',
 ): Selection {
-  switch (action) {
+  switch (a) {
     case 'MULTIPLE_PREV':
     case 'MULTIPLE_NEXT':
     case 'MULTIPLE_CYCLE': {
       const idx =
-        action === 'MULTIPLE_PREV' ?
+        a === 'MULTIPLE_PREV' ?
           s.multiple.index - 1 :
           s.multiple.index + 1;
       const index =
-        action === 'MULTIPLE_CYCLE' && idx >= s.multiple.allSelections.length ?
+        a === 'MULTIPLE_CYCLE' && idx >= s.multiple.allSelections.length ?
           0 :
           idx;
       if (0 <= index && index < s.multiple.allSelections.length) {
@@ -621,6 +648,8 @@ function fromMultipleSelections(
       return {
         ...s,
         multiple: {
+          name: '',
+          title: '',
           index: 0,
           allSelections: [],
         },
@@ -636,13 +665,15 @@ function reducer(s: Selection, action: SelectionActions): Selection {
     return selectLocation(s, action.location);
   }
   if (isMultipleSelect(action)) {
-    if (action.locations.length === 0)
-      return s;
     const index = action.index > 0 ? action.index : 0;
-    const selection = selectLocation(s, action.locations[index]);
+    const selection =
+      action.locations.length === 0 ? s :
+        selectLocation(s, action.locations[index]);
     return {
       ...selection,
       multiple: {
+        name: action.name,
+        title: action.title,
         allSelections: action.locations,
         index,
       },
@@ -680,24 +711,27 @@ const emptySelection = {
     nextSelections: [],
   },
   multiple: {
+    name: '',
+    title: '',
     index: 0,
     allSelections: [],
   },
 };
 
-const GlobalSelection = new GlobalStates.State<Selection>(emptySelection);
+export const MetaSelection = new Dome.Event<Location>('frama-c-meta-selection');
+export const GlobalSelection = new GlobalState<Selection>(emptySelection);
 Server.onShutdown(() => GlobalSelection.setValue(emptySelection));
 
+export function setSelection(location: Location, meta = false) {
+  const s = GlobalSelection.getValue();
+  GlobalSelection.setValue(reducer(s, { location }));
+  if (meta) MetaSelection.emit(location);
+}
+
 /** Current selection. */
 export function useSelection(): [Selection, (a: SelectionActions) => void] {
-  const [selection, setSelection] = GlobalStates.useState(GlobalSelection);
-
-  function update(action: SelectionActions) {
-    const nextSelection = reducer(selection, action);
-    setSelection(nextSelection);
-  }
-
-  return [selection, update];
+  const [current, setCurrent] = useGlobalState(GlobalSelection);
+  return [current, (action) => setCurrent(reducer(current, action))];
 }
 
 // --------------------------------------------------------------------------
diff --git a/ivette/src/frama-c/style.css b/ivette/src/frama-c/style.css
deleted file mode 100644
index 79a3307a70214e7304248a083e1ae2f724f90f34..0000000000000000000000000000000000000000
--- a/ivette/src/frama-c/style.css
+++ /dev/null
@@ -1,49 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* --- Styling LabViews                                                   --- */
-/* -------------------------------------------------------------------------- */
-
-.dome-window-active .labview-icon {
-    fill: #7d7d7d ;
-}
-
-.labview-field {
-    position: relative ;
-    left: -8px ;
-}
-
-.labview-stock:hover {
-    background: #ccc ;
-}
-
-.labview-stock:hover * {
-    cursor: move ;
-}
-
-.labview-stock.dome-dragging
-{
-    border-radius: 4px ;
-    background: #ccc ;
-    border: thin solid black ;
-}
-
-.labview-content
-{
-    background: #e6e6e6 ;
-}
-
-.labview-titlebar
-{
-    background: #ccc ;
-    height: 24px ;
-}
-
-.labview-handle
-{
-    flex: 1 1 auto ;
-    cursor: move ;
-}
-
-.labview-close:hover
-{
-    fill: red ;
-}
diff --git a/ivette/src/frama-c/utils.ts b/ivette/src/frama-c/utils.ts
index 619027b1825592503c20931e47e681f5b63460a8..0d0980bae04002789d9cf1b0a1926a8e5d97c117 100644
--- a/ivette/src/frama-c/utils.ts
+++ b/ivette/src/frama-c/utils.ts
@@ -9,9 +9,9 @@
 
 import * as Dome from 'dome';
 import * as DomeBuffers from 'dome/text/buffers';
-import * as KernelData from 'api/kernel/data';
+import * as KernelData from 'frama-c/api/kernel/data';
 
-const PP = new Dome.PP('Utils');
+const D = new Dome.Debug('Utils');
 
 // --------------------------------------------------------------------------
 // --- Print Utilities
@@ -47,6 +47,6 @@ export function printTextWithTags(
   } else if (typeof contents === 'string') {
     buffer.append(contents);
   } else {
-    PP.error('Unexpected text', contents);
+    D.error('Unexpected text', contents);
   }
 }
diff --git a/ivette/src/ivette/index.tsx b/ivette/src/ivette/index.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..7e205094917586707f0a9dcc0cb2467809bb77cc
--- /dev/null
+++ b/ivette/src/ivette/index.tsx
@@ -0,0 +1,205 @@
+/* --------------------------------------------------------------------------*/
+/* --- Lab View Component                                                 ---*/
+/* --------------------------------------------------------------------------*/
+
+/**
+   @packageDocumentation
+   @module ivette
+ */
+
+import React from 'react';
+import { Label } from 'dome/controls/labels';
+import { DefineElement } from 'dome/layout/dispatch';
+import { GridItem, GridHbox, GridVbox } from 'dome/layout/grids';
+import * as Lab from 'ivette@lab';
+import * as Ext from 'ivette@ext';
+
+/* --------------------------------------------------------------------------*/
+/* --- Items                                                              ---*/
+/* --------------------------------------------------------------------------*/
+
+export interface ItemProps {
+  /** Identifier. */
+  id: string;
+  /** Displayed name. */
+  label: string;
+  /** Tooltip description. */
+  title?: string;
+  /** Ordering index. */
+  rank?: number;
+}
+
+export interface ContentProps extends ItemProps {
+  /** Contents. */
+  children?: React.ReactNode;
+}
+
+/* --------------------------------------------------------------------------*/
+/* --- Groups                                                             ---*/
+/* --------------------------------------------------------------------------*/
+
+let GROUP: string | undefined;
+
+/**
+   Defines a group of components.
+   To arrach components to the group, use their `group` property.
+   Empty groups are not displayed.
+
+   If provided, the group is used by default for all components registered
+   during the continuation.
+ */
+export function registerGroup(group: ItemProps, job?: () => void) {
+  Lab.addLibraryItem('groups', group);
+  if (job) {
+    const STACK = GROUP;
+    try {
+      GROUP = group.id;
+      job();
+    } finally {
+      GROUP = STACK;
+    }
+  }
+}
+
+/* --------------------------------------------------------------------------*/
+/* --- View Layout                                                        ---*/
+/* --------------------------------------------------------------------------*/
+
+/**
+   Alternating V-split and H-split layouts.
+ */
+export type Layout = string | Layout[];
+
+function makeLayout(ly: Layout, hsplit = false) {
+  if (typeof (ly) === 'string') return <GridItem id={ly} />;
+  if (!ly) return null;
+  if (hsplit) {
+    return (
+      <GridHbox>
+        {React.Children.toArray(ly.map((l) => makeLayout(l, false)))}
+      </GridHbox>
+    );
+  }
+  return (
+    <GridVbox>
+      {React.Children.toArray(ly.map((l) => makeLayout(l, true)))}
+    </GridVbox>
+  );
+
+}
+
+export interface ViewLayoutProps extends ItemProps {
+  /** Use this view by default. */
+  defaultView?: boolean;
+  /** View layout. */
+  layout: Layout;
+}
+
+/** Register a new View. */
+export function registerView(view: ViewLayoutProps) {
+  const { layout, ...viewprops } = view;
+  Lab.addLibraryItem('views', {
+    ...viewprops,
+    children: makeLayout(layout),
+  });
+}
+
+/* --------------------------------------------------------------------------*/
+/* --- Components                                                         ---*/
+/* --------------------------------------------------------------------------*/
+
+export interface ComponentProps extends ContentProps {
+  /** Group attachment. */
+  group?: string;
+}
+
+/**
+   Register the given Ivette Component.
+   Components are sorted by rank and identifier among each group.
+ */
+export function registerComponent(props: ComponentProps) {
+  Lab.addLibraryItem('components', { group: GROUP, ...props });
+}
+
+export interface TitleBarProps {
+  /** Displayed icon. */
+  icon?: string;
+  /** Displayed name (when mounted). */
+  label?: string;
+  /** Tooltip description (when mounted). */
+  title?: string;
+  /** TitleBar additional components (stacked to right). */
+  children?: React.ReactNode;
+}
+
+/**
+   LabView Component's title bar.
+   Defines an alternative component title bar in current context.
+   Default values are taken from the associated component.
+ */
+export function TitleBar(props: TitleBarProps) {
+  const { icon, label, title, children } = props;
+  const context = Lab.useTitleContext();
+  if (!context.id) return null;
+  return (
+    <DefineElement id={`labview.title.${context.id}`}>
+      <Label
+        className="labview-handle"
+        icon={icon}
+        label={label || context.label}
+        title={title || context.title}
+      />
+      {children}
+    </DefineElement>
+  );
+}
+
+/* --------------------------------------------------------------------------*/
+/* --- Search Hints                                                       ---*/
+/* --------------------------------------------------------------------------*/
+
+export interface Hint {
+  id: string;
+  label: string | JSX.Element;
+  title?: string;
+  rank?: number;
+  onSelection: () => void;
+}
+
+/**
+   Register a hint search engine for the Ivette toolbar.
+*/
+export function registerHints(
+  id: string,
+  lookup: (pattern: string) => Promise<Hint[]>,
+) {
+  const adaptor = (h: Hint): Ext.SearchHint => (
+    { ...h, value: () => h.onSelection() }
+  );
+  const search = (p: string) => lookup(p).then((hs) => hs.map(adaptor));
+  Ext.registerHints({ id, search });
+}
+
+/* --------------------------------------------------------------------------*/
+/* --- Sidebar Panels                                                     ---*/
+/* --------------------------------------------------------------------------*/
+
+export interface ToolProps {
+  id: string;
+  rank?: number;
+  children?: React.ReactNode;
+}
+
+export function registerSidebar(panel: ToolProps) {
+  Ext.SIDEBAR.register(panel);
+}
+
+export function registerToolbar(tools: ToolProps) {
+  Ext.TOOLBAR.register(tools);
+}
+
+export function registerStatusbar(status: ToolProps) {
+  Ext.STATUSBAR.register(status);
+}
+
+// --------------------------------------------------------------------------
diff --git a/ivette/src/ivette/prefs.tsx b/ivette/src/ivette/prefs.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..49a13dbb15e7c34f566be7039cc8b6f4b865b7f8
--- /dev/null
+++ b/ivette/src/ivette/prefs.tsx
@@ -0,0 +1,107 @@
+// --------------------------------------------------------------------------
+// --- Main React Component rendered by './index.js'
+// --------------------------------------------------------------------------
+
+/**
+   @packageDocumentation
+   @module ivette/prefs
+ */
+
+import React from 'react';
+
+import { popupMenu } from 'dome';
+import * as Settings from 'dome/data/settings';
+import { IconButton } from 'dome/controls/buttons';
+
+import 'codemirror/mode/clike/clike';
+import 'codemirror/theme/ambiance.css';
+import 'codemirror/theme/solarized.css';
+
+export const THEMES = [
+  { id: 'default', label: 'Default' },
+  { id: 'ambiance', label: 'Ambiance' },
+  { id: 'solarized light', label: 'Solarized Light' },
+  { id: 'solarized dark', label: 'Solarized Dark' },
+];
+
+// --------------------------------------------------------------------------
+// --- AST View Preferences
+// --------------------------------------------------------------------------
+
+export const AstTheme = new Settings.GString('ASTview.theme', 'default');
+export const AstFontSize = new Settings.GNumber('ASTview.fontSize', 12);
+export const AstWrapText = new Settings.GFalse('ASTview.wrapText');
+
+export const SourceTheme = new Settings.GString('SourceCode.theme', 'default');
+export const SourceFontSize = new Settings.GNumber('SourceCode.fontSize', 12);
+export const SourceWrapText = new Settings.GFalse('SourceCode.wrapText');
+
+export interface ThemeProps {
+  target: string;
+  theme: Settings.GlobalSettings<string>;
+  fontSize: Settings.GlobalSettings<number>;
+  wrapText: Settings.GlobalSettings<boolean>;
+  disabled?: boolean;
+}
+
+// --------------------------------------------------------------------------
+// --- Icon Buttons
+// --------------------------------------------------------------------------
+
+export interface ThemeControls {
+  buttons: React.ReactNode;
+  theme: string;
+  fontSize: number;
+  wrapText: boolean;
+}
+
+export function useThemeButtons(props: ThemeProps): ThemeControls {
+  const [theme, setTheme] = Settings.useGlobalSettings(props.theme);
+  const [fontSize, setFontSize] = Settings.useGlobalSettings(props.fontSize);
+  const [wrapText, setWrapText] = Settings.useGlobalSettings(props.wrapText);
+  const zoomIn = () => fontSize < 48 && setFontSize(fontSize + 2);
+  const zoomOut = () => fontSize > 4 && setFontSize(fontSize - 2);
+  const flipWrapText = () => setWrapText(!wrapText);
+  const selectTheme = (id?: string) => id && setTheme(id);
+  const themeItem = (th: { id: string; label: string }) => (
+    { checked: th.id === theme, ...th }
+  );
+  const themePopup = () => popupMenu(THEMES.map(themeItem), selectTheme);
+  const { disabled = false } = props;
+  return {
+    theme,
+    fontSize,
+    wrapText,
+    buttons: [
+      <IconButton
+        key="zoom.out"
+        icon="ZOOM.OUT"
+        onClick={zoomOut}
+        disabled={disabled}
+        title="Decrease font size"
+      />,
+      <IconButton
+        key="zoom.in"
+        icon="ZOOM.IN"
+        onClick={zoomIn}
+        disabled={disabled}
+        title="Increase font size"
+      />,
+      <IconButton
+        key="theme"
+        icon="PAINTBRUSH"
+        onClick={themePopup}
+        title="Choose theme"
+      />,
+      <IconButton
+        key="wrap"
+        icon="WRAPTEXT"
+        selected={wrapText}
+        onClick={flipWrapText}
+        title="Wrap text"
+      />,
+    ],
+  };
+}
+
+// --------------------------------------------------------------------------
diff --git a/ivette/src/renderer/ASTview.tsx b/ivette/src/renderer/ASTview.tsx
deleted file mode 100644
index 24d8eaa06db4b0be4396ca3f3dcb43ee1a217c70..0000000000000000000000000000000000000000
--- a/ivette/src/renderer/ASTview.tsx
+++ /dev/null
@@ -1,236 +0,0 @@
-// --------------------------------------------------------------------------
-// --- AST Source Code
-// --------------------------------------------------------------------------
-
-import React from 'react';
-import _ from 'lodash';
-import * as Server from 'frama-c/server';
-import * as States from 'frama-c/states';
-import * as Utils from 'frama-c/utils';
-
-import * as Dome from 'dome';
-import { RichTextBuffer } from 'dome/text/buffers';
-import { Text } from 'dome/text/editors';
-import { IconButton } from 'dome/controls/buttons';
-import { Component, TitleBar } from 'frama-c/LabViews';
-import { printFunction, markerInfo } from 'api/kernel/ast';
-import { getCallers, getDeadCode } from 'api/plugins/eva/general';
-
-import 'codemirror/mode/clike/clike';
-import 'codemirror/theme/ambiance.css';
-import 'codemirror/theme/solarized.css';
-
-const THEMES = [
-  { id: 'default', label: 'Default' },
-  { id: 'ambiance', label: 'Ambiance' },
-  { id: 'solarized light', label: 'Solarized Light' },
-  { id: 'solarized dark', label: 'Solarized Dark' },
-];
-
-// --------------------------------------------------------------------------
-// --- Pretty Printing (Browser Console)
-// --------------------------------------------------------------------------
-
-const PP = new Dome.PP('AST View');
-
-// --------------------------------------------------------------------------
-// --- Rich Text Printer
-// --------------------------------------------------------------------------
-
-async function loadAST(
-  buffer: RichTextBuffer, theFunction?: string, theMarker?: string,
-) {
-  buffer.clear();
-  if (theFunction) {
-    buffer.log('// Loading', theFunction, '…');
-    (async () => {
-      try {
-        const data = await Server.send(printFunction, theFunction);
-        buffer.clear();
-        if (!data) {
-          buffer.log('// No code for function', theFunction);
-        }
-        Utils.printTextWithTags(buffer, data);
-        if (theMarker)
-          buffer.scroll(theMarker);
-      } catch (err) {
-        PP.error(
-          'Fail to obtain AST', theFunction, theMarker, err,
-        );
-      }
-    })();
-  }
-}
-
-/** Compute the [[functionName]] caller locations. */
-async function functionCallers(functionName: string) {
-  try {
-    const data = await Server.send(getCallers, functionName);
-    const locations = data.map(([fct, marker]) => ({ function: fct, marker }));
-    return locations;
-  } catch (err) {
-    PP.error(`Fail to retrieve callers of function '${functionName}':`, err);
-    return [];
-  }
-}
-
-// --------------------------------------------------------------------------
-// --- AST Printer
-// --------------------------------------------------------------------------
-
-const ASTview = () => {
-
-  // Hooks
-  const buffer = React.useMemo(() => new RichTextBuffer(), []);
-  const printed = React.useRef<string | undefined>();
-  const [selection, updateSelection] = States.useSelection();
-  const multipleSelections = selection?.multiple.allSelections;
-  const [theme, setTheme] = Dome.useGlobalSetting('ASTview.theme', 'default');
-  const [fontSize, setFontSize] = Dome.useGlobalSetting('ASTview.fontSize', 12);
-  const [wrapText, setWrapText] = Dome.useSwitch('ASTview.wrapText', false);
-  const markersInfo = States.useSyncArray(markerInfo).getArray();
-
-  const theFunction = selection?.current?.function;
-  const theMarker = selection?.current?.marker;
-
-  const deadCode = States.useRequest(getDeadCode, theFunction);
-
-  // Hook: async loading
-  React.useEffect(() => {
-    if (printed.current !== theFunction) {
-      printed.current = theFunction;
-      loadAST(buffer, theFunction, theMarker);
-    }
-  });
-
-  React.useEffect(() => {
-    const decorator = (marker: string) => {
-      if (multipleSelections?.some((location) => location?.marker === marker))
-        return 'highlighted-marker';
-      if (deadCode?.unreachable?.some((m) => m === marker))
-        return 'dead-code';
-      if (deadCode?.nonTerminating?.some((m) => m === marker))
-        return 'non-terminating';
-      return undefined;
-    };
-    buffer.setDecorator(decorator);
-  }, [buffer, multipleSelections, deadCode]);
-
-  // Hook: marker scrolling
-  React.useEffect(() => {
-    if (theMarker) buffer.scroll(theMarker);
-  }, [buffer, theMarker]);
-
-  // Callbacks
-  const zoomIn = () => fontSize < 48 && setFontSize(fontSize + 2);
-  const zoomOut = () => fontSize > 4 && setFontSize(fontSize - 2);
-
-  function onTextSelection(id: string) {
-    if (selection.current) {
-      const location = { ...selection.current, marker: id };
-      updateSelection({ location });
-    }
-  }
-
-  async function onContextMenu(id: string) {
-    const items = [];
-    const selectedMarkerInfo = markersInfo.find((e) => e.key === id);
-    if (selectedMarkerInfo?.var === 'function') {
-      if (selectedMarkerInfo.kind === 'declaration') {
-        if (selectedMarkerInfo?.name) {
-          const locations = await functionCallers(selectedMarkerInfo.name);
-          const locationsByFunction = _.groupBy(locations, (e) => e.function);
-          _.forEach(locationsByFunction,
-            (e) => {
-              const callerName = e[0].function;
-              items.push({
-                label:
-                  `Go to caller ${callerName} ` +
-                  `${e.length > 1 ? `(${e.length} call sites)` : ''}`,
-                onClick: () => updateSelection({
-                  locations,
-                  index: locations.findIndex((l) => l.function === callerName),
-                }),
-              });
-            });
-        }
-      } else {
-        items.push({
-          label: `Go to definition of ${selectedMarkerInfo.name}`,
-          onClick: () => {
-            const location = { function: selectedMarkerInfo.name };
-            updateSelection({ location });
-          },
-        });
-      }
-    }
-    if (items.length > 0)
-      Dome.popupMenu(items);
-  }
-
-  // Theme Popup
-  const selectTheme = (id?: string) => id && setTheme(id);
-  const checkTheme =
-    (th: { id: string }) => ({ checked: th.id === theme, ...th });
-  const themePopup =
-    () => Dome.popupMenu(THEMES.map(checkTheme), selectTheme);
-
-  // Component
-  return (
-    <>
-      <TitleBar>
-        <IconButton
-          icon="ZOOM.OUT"
-          onClick={zoomOut}
-          disabled={!theFunction}
-          title="Decrease font size"
-        />
-        <IconButton
-          icon="ZOOM.IN"
-          onClick={zoomIn}
-          disabled={!theFunction}
-          title="Increase font size"
-        />
-        <IconButton
-          icon="PAINTBRUSH"
-          onClick={themePopup}
-          title="Choose theme"
-        />
-        <IconButton
-          icon="WRAPTEXT"
-          selected={wrapText}
-          onClick={setWrapText}
-          title="Wrap text"
-        />
-      </TitleBar>
-      <Text
-        buffer={buffer}
-        mode="text/x-csrc"
-        theme={theme}
-        fontSize={fontSize}
-        lineWrapping={wrapText}
-        selection={theMarker}
-        onSelection={onTextSelection}
-        onContextMenu={onContextMenu}
-        readOnly
-      />
-    </>
-  );
-
-};
-
-// --------------------------------------------------------------------------
-// --- Export Component
-// --------------------------------------------------------------------------
-
-export default () => (
-  <Component
-    id="frama-c.astview"
-    label="AST"
-    title="Normalized source code representation"
-  >
-    <ASTview />
-  </Component>
-);
-
-// --------------------------------------------------------------------------
diff --git a/ivette/src/renderer/Application.tsx b/ivette/src/renderer/Application.tsx
index a3a4bad5ae3e8bed8131be99c3073c65295e1c43..db7ff6f6d260407bc5887c27de03b6bfd32f0dab 100644
--- a/ivette/src/renderer/Application.tsx
+++ b/ivette/src/renderer/Application.tsx
@@ -2,69 +2,32 @@
 // --- Main React Component rendered by './index.js'
 // --------------------------------------------------------------------------
 
+// --- React & Dome
+
 import React from 'react';
 import * as Dome from 'dome';
-import * as States from 'frama-c/states';
 import { Vfill } from 'dome/layout/boxes';
-import { Splitter } from 'dome/layout/splitters';
+import { LSplit } from 'dome/layout/splitters';
 import * as Toolbar from 'dome/frame/toolbars';
 import * as Sidebar from 'dome/frame/sidebars';
-
-import './style.css';
-
-import { LabView, View, Group } from 'frama-c/LabViews';
-import Dive from 'frama-c/dive/Dive';
-import { GridHbox, GridItem } from 'dome/layout/grids';
 import * as Controller from './Controller';
-
-import ASTview from './ASTview';
-import ASTinfo from './ASTinfo';
-import Globals from './Globals';
-import Properties from './Properties';
-import Locations from './Locations';
-import Values from './Values';
-
-// --------------------------------------------------------------------------
-// --- Selection Controls
-// --------------------------------------------------------------------------
-
-const HistorySelectionControls = () => {
-  const [selection, updateSelection] = States.useSelection();
-
-  const doPrevSelect = () => { updateSelection('HISTORY_PREV'); };
-  const doNextSelect = () => { updateSelection('HISTORY_NEXT'); };
-
-  return (
-    <Toolbar.ButtonGroup>
-      <Toolbar.Button
-        icon="ANGLE.LEFT"
-        onClick={doPrevSelect}
-        disabled={!selection || selection.history.prevSelections.length === 0}
-        title="Previous location"
-      />
-      <Toolbar.Button
-        icon="ANGLE.RIGHT"
-        onClick={doNextSelect}
-        disabled={!selection || selection.history.nextSelections.length === 0}
-        title="Next location"
-      />
-    </Toolbar.ButtonGroup>
-  );
-};
+import * as Extensions from './Extensions';
+import * as Laboratory from './Laboratory';
+import './loader';
 
 // --------------------------------------------------------------------------
 // --- Main View
 // --------------------------------------------------------------------------
 
 export default (() => {
-  const [sidebar, flipSidebar] = Dome.useSwitch(
-    'frama-c.sidebar.unfold',
-    true,
-  );
-  const [viewbar, flipViewbar] = Dome.useSwitch(
-    'frama-c.viewbar.unfold',
-    true,
-  );
+  const [sidebar, flipSidebar] =
+    Dome.useFlipSettings('frama-c.sidebar.unfold', true);
+  const [viewbar, flipViewbar] =
+    Dome.useFlipSettings('frama-c.viewbar.unfold', true);
+  const hints = Extensions.useSearchHints();
+  const onSelectedHints = () => {
+    if (hints.length === 1) Extensions.onSearchHint(hints[0]);
+  };
 
   return (
     <Vfill>
@@ -76,8 +39,15 @@ export default (() => {
           onClick={flipSidebar}
         />
         <Controller.Control />
-        <HistorySelectionControls />
+        <Extensions.Toolbar />
         <Toolbar.Filler />
+        <Toolbar.SearchField
+          placeholder="Search…"
+          hints={hints}
+          onSearch={Extensions.searchHints}
+          onHint={Extensions.onSearchHint}
+          onSelect={onSelectedHints}
+        />
         <Toolbar.Button
           icon="ITEMS.GRID"
           title="Customize Main View"
@@ -85,49 +55,19 @@ export default (() => {
           onClick={flipViewbar}
         />
       </Toolbar.ToolBar>
-      <Splitter dir="LEFT" settings="frame-c.sidebar.position" unfold={sidebar}>
+      <LSplit settings="frama-c.sidebar.split" unfold={sidebar}>
         <Sidebar.SideBar>
           <div className="sidebar-ruler" />
-          <Globals key="globals" />
+          <Extensions.Sidebar />
         </Sidebar.SideBar>
-        <LabView
+        <Laboratory.LabView
           customize={viewbar}
           settings="frama-c.labview"
-        >
-          <View id="console" label="Console" defaultView>
-            <GridItem id="frama-c.console" />
-          </View>
-          <View id="values" label="Values">
-            <GridHbox>
-              <GridItem id="frama-c.astview" />
-              <GridItem id="frama-c.values" />
-            </GridHbox>
-            <GridItem id="frama-c.properties" />
-          </View>
-          <View id="dive" label="Dive">
-            <GridHbox>
-              <GridItem id="frama-c.astview" />
-              <GridItem id="dive.graph" />
-              <GridItem id="frama-c.locations" />
-            </GridHbox>
-            <GridHbox>
-              <GridItem id="frama-c.properties" />
-              <GridItem id="frama-c.console" />
-            </GridHbox>
-          </View>
-          <Group id="frama-c" label="Frama-C" title="Frama-C Kernel Components">
-            <Controller.Console />
-            <Properties />
-            <ASTview />
-            <ASTinfo />
-            <Locations />
-            <Dive />
-            <Values />
-          </Group>
-        </LabView>
-      </Splitter>
+        />
+      </LSplit>
       <Toolbar.ToolBar>
         <Controller.Status />
+        <Extensions.Statusbar />
         <Toolbar.Filler />
         <Controller.Stats />
       </Toolbar.ToolBar>
diff --git a/ivette/src/renderer/Controller.tsx b/ivette/src/renderer/Controller.tsx
index 9a8b2c950ba6b64a685f62d0f15dfe41ff960dcc..04c9d5c9d883b5ef896fbd4f7170322b51697fad 100644
--- a/ivette/src/renderer/Controller.tsx
+++ b/ivette/src/renderer/Controller.tsx
@@ -4,6 +4,8 @@
 
 import React from 'react';
 import * as Dome from 'dome';
+import * as Json from 'dome/data/json';
+import * as Settings from 'dome/data/settings';
 
 import { Button as ToolButton, ButtonGroup, Space } from 'dome/frame/toolbars';
 import { LED, LEDstatus, IconButton } from 'dome/controls/buttons';
@@ -11,8 +13,8 @@ import { Label, Code } from 'dome/controls/labels';
 import { RichTextBuffer } from 'dome/text/buffers';
 import { Text } from 'dome/text/editors';
 
+import * as Ivette from 'ivette';
 import * as Server from 'frama-c/server';
-import { Component, TitleBar } from 'frama-c/LabViews';
 
 import 'codemirror/theme/ambiance.css';
 
@@ -96,9 +98,11 @@ function insertConfig(hs: string[], cfg: Server.Configuration) {
 
 let reloadCommand: string | undefined;
 
-Dome.onReload(() => {
-  const hst = Dome.getWindowSetting('Controller.history');
-  reloadCommand = Array.isArray(hst) && hst[0];
+Dome.reload.on(() => {
+  const [lastCmd] = Settings.getLocalStorage(
+    'Controller.history', Json.jList(Json.jString), [],
+  );
+  reloadCommand = lastCmd;
 });
 
 Dome.onCommand((argv: string[], cwd: string) => {
@@ -169,14 +173,20 @@ const editor = new RichTextBuffer();
 const RenderConsole = () => {
   const scratch = React.useRef([] as string[]);
   const [cursor, setCursor] = React.useState(-1);
-  const [history, setHistory] = Dome.useState('Controller.history', []);
   const [isEmpty, setEmpty] = React.useState(true);
   const [noTrash, setNoTrash] = React.useState(true);
+  const [history, setHistory] = Settings.useLocalStorage(
+    'Controller.history', Json.jList(Json.jString), [],
+  );
 
-  Dome.useEmitter(editor, 'change', () => {
-    const cmd = editor.getValue().trim();
-    setEmpty(cmd === '');
-    setNoTrash(cursor === 0 && history.length === 1 && cmd === history[0]);
+  React.useEffect(() => {
+    const callback = () => {
+      const cmd = editor.getValue().trim();
+      setEmpty(cmd === '');
+      setNoTrash(noTrash && cmd === history[0]);
+    };
+    editor.on('change', callback);
+    return () => { editor.off('change', callback); };
   });
 
   const doReload = () => {
@@ -241,7 +251,7 @@ const RenderConsole = () => {
 
   return (
     <>
-      <TitleBar label={edited ? 'Command line' : 'Console'}>
+      <Ivette.TitleBar label={edited ? 'Command line' : 'Console'}>
         <IconButton
           icon="TRASH"
           display={edited}
@@ -290,7 +300,7 @@ const RenderConsole = () => {
           onClick={doSwitch}
           title="Toggle command line editing"
         />
-      </TitleBar>
+      </Ivette.TitleBar>
       <Text
         buffer={edited ? editor : Server.buffer}
         mode="text"
@@ -301,15 +311,22 @@ const RenderConsole = () => {
   );
 };
 
-export const Console = () => (
-  <Component
-    id="frama-c.console"
-    label="Console"
-    title="Frama-C Server Output & Command Line"
-  >
-    <RenderConsole />
-  </Component>
-);
+Ivette.registerComponent({
+  id: 'frama-c.console',
+  group: 'frama-c.kernel',
+  label: 'Console',
+  title: 'Frama-C Server Output & Command Line',
+  rank: -1,
+  children: <RenderConsole />,
+});
+
+Ivette.registerView({
+  id: 'console',
+  rank: -1,
+  label: 'Console',
+  defaultView: true,
+  layout: 'frama-c.console',
+});
 
 // --------------------------------------------------------------------------
 // --- Status
diff --git a/ivette/src/renderer/Extensions.tsx b/ivette/src/renderer/Extensions.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..962fc0a09a254ecf16b0158545ee2a3a44920f9c
--- /dev/null
+++ b/ivette/src/renderer/Extensions.tsx
@@ -0,0 +1,141 @@
+/* --------------------------------------------------------------------------*/
+/* --- Ivette Extensions                                                  ---*/
+/* --------------------------------------------------------------------------*/
+
+import React from 'react';
+import * as Dome from 'dome';
+import { Hint } from 'dome/frame/toolbars';
+
+/* --------------------------------------------------------------------------*/
+/* --- Search Hints                                                       ---*/
+/* --------------------------------------------------------------------------*/
+
+export interface HintCallback {
+  (): void;
+}
+
+export interface SearchHint extends Hint<HintCallback> {
+  rank?: number;
+}
+
+function bySearchHint(a: SearchHint, b: SearchHint) {
+  const ra = a.rank ?? 0;
+  const rb = b.rank ?? 0;
+  if (ra < rb) return -1;
+  if (ra > rb) return +1;
+  return 0;
+}
+
+export interface SearchEngine {
+  id: string;
+  search: (pattern: string) => Promise<SearchHint[]>;
+}
+
+const NEWHINTS = new Dome.Event('ivette.hints');
+const HINTLOOKUP = new Map<string, SearchEngine>();
+const HINTS = new Map<string, SearchHint[]>();
+let CURRENT = '';
+
+export function updateHints() {
+  if (CURRENT !== '')
+    NEWHINTS.emit();
+}
+
+export function registerHints(E: SearchEngine) {
+  HINTLOOKUP.set(E.id, E);
+}
+
+export function searchHints(pattern: string) {
+  if (pattern === '') {
+    CURRENT = '';
+    HINTS.clear();
+    NEWHINTS.emit();
+  } else {
+    const REF = pattern;
+    CURRENT = pattern;
+    HINTLOOKUP.forEach((E: SearchEngine) => {
+      E.search(REF).then((hs) => {
+        if (REF === CURRENT) {
+          HINTS.set(E.id, hs);
+          NEWHINTS.emit();
+        }
+      }).catch(() => {
+        if (REF === CURRENT) {
+          HINTS.delete(E.id);
+          NEWHINTS.emit();
+        }
+      });
+    });
+  }
+}
+
+export function onSearchHint(h: SearchHint) {
+  h.value();
+}
+
+export function useSearchHints() {
+  const [hints, setHints] = React.useState<SearchHint[]>([]);
+  Dome.useEvent(NEWHINTS, () => {
+    let hs: SearchHint[] = [];
+    HINTS.forEach((rhs) => { hs = hs.concat(rhs); });
+    setHints(hs.sort(bySearchHint));
+  });
+  return hints;
+}
+
+/* --------------------------------------------------------------------------*/
+/* --- Extension Elements                                                 ---*/
+/* --------------------------------------------------------------------------*/
+
+const UPDATED = new Dome.Event('ivette.updated');
+
+export interface ElementProps {
+  id: string;
+  rank?: number;
+  children?: React.ReactNode;
+}
+
+function byPanel(p: ElementProps, q: ElementProps) {
+  const rp = p.rank ?? 0;
+  const rq = q.rank ?? 0;
+  if (rp < rq) return -1;
+  if (rp > rq) return +1;
+  const ip = p.id;
+  const iq = q.id;
+  if (ip < iq) return -1;
+  if (ip > iq) return +1;
+  return 0;
+}
+
+export class ElementRack {
+
+  private readonly items = new Map<string, ElementProps>();
+
+  register(elt: ElementProps) {
+    this.items.set(elt.id, elt);
+    UPDATED.emit();
+  }
+
+  render() {
+    const panels: ElementProps[] = [];
+    this.items.forEach((p) => { if (p.children) { panels.push(p); } });
+    const contents = panels.sort(byPanel).map((p) => p.children);
+    return <>{React.Children.toArray(contents)}</>;
+  }
+
+}
+
+export function useRack(E: ElementRack) {
+  Dome.useUpdate(UPDATED);
+  return E.render();
+}
+
+export const SIDEBAR = new ElementRack();
+export const TOOLBAR = new ElementRack();
+export const STATUSBAR = new ElementRack();
+
+export function Sidebar() { return useRack(SIDEBAR); }
+export function Toolbar() { return useRack(TOOLBAR); }
+export function Statusbar() { return useRack(STATUSBAR); }
+
+/* --------------------------------------------------------------------------*/
diff --git a/ivette/src/renderer/Globals.tsx b/ivette/src/renderer/Globals.tsx
deleted file mode 100644
index a37d1e5b6b9ef61d0136eb07120c2f0966b2033d..0000000000000000000000000000000000000000
--- a/ivette/src/renderer/Globals.tsx
+++ /dev/null
@@ -1,46 +0,0 @@
-// --------------------------------------------------------------------------
-// --- Globals Side Bar
-// --------------------------------------------------------------------------
-
-import React from 'react';
-import { Section, Item } from 'dome/frame/sidebars';
-import * as States from 'frama-c/states';
-import { alpha } from 'dome/data/compare';
-import { functions, functionsData } from 'api/kernel/ast';
-
-// --------------------------------------------------------------------------
-// --- Globals Section
-// --------------------------------------------------------------------------
-
-export default () => {
-
-  // Hooks
-  const [selection, updateSelection] = States.useSelection();
-  const fcts = States.useSyncArray(functions).getArray().sort(
-    (f, g) => alpha(f.name, g.name),
-  );
-
-  // Items
-  const current: undefined | string = selection?.current?.function;
-  const makeFctItem = (fct: functionsData) => {
-    const kf = fct.name;
-    return (
-      <Item
-        key={kf}
-        label={kf}
-        title={fct.signature}
-        selected={kf === current}
-        onSelection={() => updateSelection({ location: { function: kf } })}
-      />
-    );
-  };
-
-  return (
-    <Section label="Functions">
-      {fcts.map(makeFctItem)}
-    </Section>
-  );
-
-};
-
-// --------------------------------------------------------------------------
diff --git a/ivette/src/frama-c/LabViews.tsx b/ivette/src/renderer/Laboratory.tsx
similarity index 58%
rename from ivette/src/frama-c/LabViews.tsx
rename to ivette/src/renderer/Laboratory.tsx
index fe74698d0346f10153cd61714e1086a9a3027761..5d6a3cbe0572eadf3097bfb94f93f3e8a9d39162 100644
--- a/ivette/src/frama-c/LabViews.tsx
+++ b/ivette/src/renderer/Laboratory.tsx
@@ -2,34 +2,31 @@
 // ---  Lab View Component
 // --------------------------------------------------------------------------
 
-/**
-   @packageDocumentation
-   @module frama-c/labviews
-*/
-
 import _ from 'lodash';
 import React from 'react';
 import * as Dome from 'dome';
+import * as Json from 'dome/data/json';
+import * as Settings from 'dome/data/settings';
 import { Catch } from 'dome/errors';
 import { DnD, DragSource } from 'dome/dnd';
 import { SideBar, Section, Item } from 'dome/frame/sidebars';
-import { Splitter } from 'dome/layout/splitters';
+import { RSplit } from 'dome/layout/splitters';
 import * as Grids from 'dome/layout/grids';
 import { Hbox, Hfill, Vfill } from 'dome/layout/boxes';
 import { IconButton, Field } from 'dome/controls/buttons';
 import { Label } from 'dome/controls/labels';
 import { Icon } from 'dome/controls/icons';
-import {
-  Item as ItemToRender,
-  Render as RenderItem,
-} from 'dome/layout/dispatch';
+import { RenderElement } from 'dome/layout/dispatch';
 
 import './style.css';
 
 // --------------------------------------------------------------------------
-// --- Library
+// --- Library Class
 // --------------------------------------------------------------------------
 
+let RANK = 0;
+const UPDATE = new Dome.Event('labview.library');
+
 class Library {
   modified: boolean;
   virtual: {};
@@ -48,31 +45,27 @@ class Library {
       this.collection = { ...this.virtual };
       this.items = _.sortBy(this.collection, ['order', 'id']);
       this.modified = false;
-      Dome.emit('labview.library');
+      UPDATE.emit();
     }
   }
 
-  useItem(
+  addItem(
     id: string,
-    gcontext: any,
-    path: any[],
-    props: { rank: undefined; group: any },
+    props: { rank?: number },
   ) {
     if (!this.modified) {
       this.modified = true;
       setImmediate(() => this.commit());
     }
-    if (!id) return undefined;
-    const order = props.rank === undefined
-      ? path
-      : path.slice(0, -1).concat([props.rank]);
-    const group = props.group || gcontext;
+    const order = props.rank ?? ++RANK;
     const collection: any = this.virtual;
-    collection[id] = { id, order, group, ...props };
-    return (): boolean => delete collection[id];
+    collection[id] = { ...props, id, order };
   }
+
 }
 
+const LIBRARY = new Library();
+
 // --------------------------------------------------------------------------
 // --- Library Components
 // --------------------------------------------------------------------------
@@ -86,183 +79,29 @@ const getItemId =
 const getItems =
   (items: any[], fd: string) => items.filter((item) => isItemId(fd, item.id));
 
-const LibraryManager = React.createContext(undefined);
-
-const useLibraryItem = (fd: string, { id, ...props }: any) => {
-  const context = React.useContext(LibraryManager);
-  React.useEffect(() => {
-    if (context) {
-      const { group, order, library }: any = context;
-      const itemId = `${fd}.${id}`;
-      return library.useItem(itemId, group, order, props);
-    }
-    return undefined;
-  });
-  return context;
-};
-
-const Rankify =
-  ({ library, group, order, children }: any) => {
-    let rank = 0;
-    const rankify = (elt: any) => {
-      rank += 1;
-      const context: any = { group, order: [...order, rank], library };
-      return (
-        <LibraryManager.Provider value={context}>
-          {elt}
-        </LibraryManager.Provider>
-      );
-    };
-    return (
-      <>
-        {React.Children.map(children, rankify)}
-      </>
-    );
-  };
-
-const HIDDEN = { display: 'none' };
-
-const UseLibrary = ({ library, children }: any) => (
-  <div style={HIDDEN}>
-    <Rankify library={library} order={[]}>
-      {children}
-    </Rankify>
-  </div>
-);
-
-/**
-   @summary Ordered collection of LabView Components.
-   @description
-   Renderers its children in the specified order.
-   Otherwise, elements are ordered by `rank` and `id`.
- */
-export const Fragment = ({ group, children }: any) => {
-  const context: any = React.useContext(LibraryManager);
-
-  if (!context) return null;
-
-  return (
-    <Rankify
-      group={group || context.group}
-      order={context.order}
-      library={context.library}
-    >
-      {children}
-    </Rankify>
-  );
-};
-
-/**
-   @summary Group of LabView Components.
-   @property {string} id - group identifier
-   @property {string} label - displayed name
-   @property {string} [title] - description tooltip
-   @property {React.Children} [children] - group content
-   @description
-   Defines a group of components. The components rendered
-   _inside_ its content are implicitely affected to this group,
-   unless specified. The group content are also rendered
-   in their specified order. For nested collections of components,
-   use `<Fragment/>` instead of `<React.Fragment/>` to specify order.
- */
-export const Group = ({ children, ...props }: any) => {
-  const context: any = useLibraryItem('groups', props);
-  return (
-    <Rankify
-      group={props.id}
-      order={context.order}
-      library={context.library}
-    >
-      {children}
-    </Rankify>
-  );
-};
-
-// --------------------------------------------------------------------------
-// --- Views
-// --------------------------------------------------------------------------
-
-/**
-   @summary Layout of LabView Components.
-   @property {string} id - view identifier
-   @property {string} label - displayed name
-   @property {string} [title] - description tooltip
-   @property {boolean} [defaultView] - use this view by default
-   @property {GridContent} children - grid content of the view
-   @description
-   Defines a predefined layout of components. The view is organized
-   into a GridContent, which must _only_ consists of:
-   - `<GridHbox>…</GridHbox>` an horizontal grid of `GridContent` elements;
-   - `<GridVbox>…</GridVbox>` a vertical grid of `GridContent` elements;
-   - `<GridItem id=…>` a single component.
-
-   These grid content components must be imported from the `dome/layout/grids`
-   module:
-   ```
-   import { GridItem, GridHbox, GridVbox } from 'dome/layout/grids';
-   ```
- */
-export const View = (props: any) => {
-  useLibraryItem('views', props);
-  return null;
-};
+export function addLibraryItem(
+  fd: string,
+  { id, ...props }: any,
+) {
+  const itemId = `${fd}.${id}`;
+  LIBRARY.addItem(itemId, props);
+}
 
 // --------------------------------------------------------------------------
-// --- Components
+// --- Grid Item
 // --------------------------------------------------------------------------
 
-/**
-   @summary LabView Component.
-   @property {string} id - component identifier
-   @property {string} label - displayed name
-   @property {number} [rank] - ordering index
-   @property {string} [group] - attachment group
-   @property {string} [title] - description tooltip
-   @property {React.Children} children - component rendering elements
-   @description
-   Defines a component and its content when incorporated inside a view.
-   Unless specified, the component will be implicitely attached
-   to the current enclosing group. The `rank` property can be used
-   for adjusting component ordering (see also `<Fragment/>` and `<Group/>`).
- */
-export const Component = (props: any) => {
-  useLibraryItem('components', props);
-  return null;
-};
+interface TitleContext {
+  id?: string;
+  label?: string;
+  title?: string;
+}
 
-const TitleContext: any = React.createContext(undefined);
+const TITLE = React.createContext<TitleContext>({});
 
-/**
-   @summary LabView Component's title bar.
-   @property {string} [icon] - displayed icon
-   @property {string} [label] - displayed name
-   @property {string} [title] - description tooltip
-   @property {React.Children} children - additional components to render
-   @description
-   Defines an alternative component title bar.
-   If specified, the icon, label and title properties are rendered in an
-   `<Label/>` component.
-   By default, the component title bar is labelled according to the component
-   properties.
- */
-export const TitleBar = ({ icon, label, title, children }: any) => {
-  const context: any = React.useContext(TitleContext);
-  return (
-    <ItemToRender id={`labview.title.${context.id}`}>
-      <Label
-        className="labview-handle"
-        icon={icon}
-        label={label || context.label}
-        title={title || context.title}
-      />
-      {children}
-    </ItemToRender>
-  );
-};
-
-// --------------------------------------------------------------------------
-// --- Grid Item
-// --------------------------------------------------------------------------
+export function useTitleContext() {
+  return React.useContext(TITLE);
+}
 
 const GRIDITEM = {
   className: 'dome-container dome-xBoxes-vbox dome-xBoxes-box',
@@ -330,16 +169,16 @@ const makeGridItem = (customize: any, onClose: any) => (comp: any) => {
         <Hbox className="labview-titlebar">
           <Hfill>
             <Catch label={id}>
-              <RenderItem id={`labview.title.${id}`}>
+              <RenderElement id={`labview.title.${id}`}>
                 <Label className="labview-handle" label={label} title={title} />
-              </RenderItem>
+              </RenderElement>
             </Catch>
           </Hfill>
           {CLOSING}
         </Hbox>
-        <TitleContext.Provider value={{ id, label, title }}>
+        <TITLE.Provider value={{ id, label, title }}>
           <Catch label={id}>{children}</Catch>
-        </TitleContext.Provider>
+        </TITLE.Provider>
       </Vfill>
     </Grids.GridItem>
   );
@@ -350,8 +189,12 @@ const makeGridItem = (customize: any, onClose: any) => (comp: any) => {
 // --------------------------------------------------------------------------
 
 function CustomViews({ settings, shape, setShape, views: libViews }: any) {
-  const [local, setLocal] = Dome.useState(settings, {});
-  const [customs, setCustoms] = Dome.useGlobalSetting(settings, {});
+  const [local, setLocal] = Settings.useWindowSettings(
+    settings, Json.jObj, {},
+  ) as any;
+  const [customs, setCustoms] = Settings.useLocalStorage(
+    'frama-c.labview', Json.jObj, {},
+  );
   const [edited, setEdited]: any = React.useState();
   const triggerDefault = React.useRef();
   const { current, shapes = {} } = local;
@@ -370,7 +213,7 @@ function CustomViews({ settings, shape, setShape, views: libViews }: any) {
       { id, order, label, title, builtin: true, defaultView, origin };
   });
 
-  _.forEach(customs, (view) => {
+  _.forEach(customs as any, (view) => {
     const { id, order, label = '(Custom View)', title, origin } = view;
     if (id && !theViews[id]) {
       theViews[id] = { id, order, label, title, builtin: false, origin };
@@ -459,7 +302,7 @@ function CustomViews({ settings, shape, setShape, views: libViews }: any) {
     if (edited === id) {
       const RENAMED = (newLabel: string) => {
         if (newLabel) {
-          const custom = customs[id];
+          const custom = Json.jObj(customs[id]) || {};
           if (custom) custom.label = newLabel;
           setCustoms(customs);
         }
@@ -471,11 +314,14 @@ function CustomViews({ settings, shape, setShape, views: libViews }: any) {
           placeholder="View Name"
           autoFocus
           value={label}
+          title={title}
           onChange={RENAMED}
         />
       );
       return (
-        <Item key={id} id={id} icon="DISPLAY" title={title} label={FIELD} />
+        <Item key={id} icon="DISPLAY">
+          {FIELD}
+        </Item>
       );
     }
     const FLAGS = [];
@@ -483,13 +329,12 @@ function CustomViews({ settings, shape, setShape, views: libViews }: any) {
     return (
       <Item
         key={id}
-        id={id}
         icon="DISPLAY"
         label={label}
         title={title}
         selected={id && current === id}
-        onSelection={SELECT}
-        onContextMenu={POPUP}
+        onSelection={() => SELECT(id)}
+        onContextMenu={() => POPUP(id)}
       >
         {FLAGS.map((icn) => (
           <Icon
@@ -511,7 +356,7 @@ function CustomViews({ settings, shape, setShape, views: libViews }: any) {
   }
 
   return (
-    <Section label="Views">
+    <Section label="Views" defaultUnfold>
       {_.sortBy(theViews, ['order', 'id']).map(makeViewItem)}
     </Section>
   );
@@ -524,6 +369,7 @@ function CustomViews({ settings, shape, setShape, views: libViews }: any) {
 const DRAGOVERLAY = { className: 'labview-stock' };
 
 function CustomGroup({
+  settings,
   dnd, shape, setDragging,
   id: sectionId,
   title: sectionTitle,
@@ -550,9 +396,14 @@ function CustomGroup({
       </DragSource>
     );
   };
-
   return (
-    <Section id={sectionId} label={sectionLabel} title={sectionTitle}>
+    <Section
+      key={sectionId}
+      settings={settings && `${settings}.${sectionId}`}
+      label={sectionLabel}
+      title={sectionTitle}
+      defaultUnfold={sectionId === 'groups.frama-c'}
+    >
       {components.map(makeComponent)}
     </Section>
   );
@@ -563,10 +414,10 @@ function CustomGroup({
 // --------------------------------------------------------------------------
 
 function CustomizePanel(
-  { dnd, settings, library, shape, setShape, setDragging }: any,
+  { dnd, settings, shape, setShape, setDragging }: any,
 ) {
-  Dome.useUpdate('labview.library');
-  const { items } = library;
+  Dome.useUpdate(UPDATE);
+  const { items } = LIBRARY;
   const views = getItems(items, 'views');
   const groups = getItems(items, 'groups');
   const components = getItems(items, 'components');
@@ -585,7 +436,7 @@ function CustomizePanel(
   });
 
   return (
-    <SideBar settings={settingFolds}>
+    <SideBar>
       <CustomViews
         key="views"
         settings={settingViews}
@@ -595,6 +446,7 @@ function CustomizePanel(
       />
       {groups.map((g) => (
         <CustomGroup
+          settings={settingFolds}
           key={g.id}
           id={g.id}
           label={g.label}
@@ -613,66 +465,64 @@ function CustomizePanel(
 // --- LabView Container
 // --------------------------------------------------------------------------
 
+export interface LabViewProps {
+  /** Show component panels. */
+  customize?: boolean;
+  /** Base settings identifier. */
+  settings?: string;
+}
+
 /**
-   @summary Reconfigurable Container (React Component).
-   @property {boolean} [customize] - show components panel (false by default)
-   @property {string} [settings] - window settings to make views persistent
-   @property {React.Children} children - the labview content
-   @description
-   This container displays its content into a reconfigurable view.
-
-   The entire content is rendered, but elements must be packed into
-   `<Component/>` containers, otherwise, they would remain invisible.
-   Content may also contains `<View/>` and `<Group/>` definitions, and the
-   content can be defined through any kind of React components.
-*/
-export function LabView(props: any) {
+   Reconfigurable Component Display.
+ */
+export function LabView(props: LabViewProps) {
   // Parameters
-  const { settings, customize = false, children } = props;
+  const { settings, customize = false } = props;
   const settingSplit = settings && `${settings}.split`;
   const settingShape = settings && `${settings}.shape`;
   const settingPanel = settings && `${settings}.panel`;
   // Hooks & State
-  Dome.useUpdate('labview.library', 'dome.defaults');
+  Dome.useUpdate(
+    UPDATE,
+    Dome.windowSettings,
+    Dome.globalSettings,
+  );
   const dnd = React.useMemo(() => new DnD(), []);
-  const lib = React.useMemo(() => new Library(), []);
-  const [shape, setShape] = Dome.useState(settingShape);
+  const [shape, setShape] =
+    Settings.useWindowSettings(settingShape, Json.jAny, undefined);
   const [dragging, setDragging] = React.useState();
   // Preparation
   const onClose =
     (id: string) => setShape(Grids.removeShapeItem(shape, id));
   const components =
-    _.filter(lib.collection, (item: any) => isItemId('components', item.id));
+    _.filter(
+      LIBRARY.collection,
+      (item: any) => isItemId('components', item.id),
+    );
   const gridItems =
     components.map(makeGridItem(customize, onClose));
   const holding =
     dragging ? gridItems.find((elt) => elt.props.id === dragging) : undefined;
   // Make view
   return (
-    <>
-      <UseLibrary library={lib}>
-        {children}
-      </UseLibrary>
-      <Splitter settings={settingSplit} unfold={customize} dir="RIGHT">
-        <Grids.GridLayout
-          dnd={dnd}
-          padding={2}
-          className="labview-container"
-          items={gridItems}
-          shape={shape}
-          onReshape={setShape}
-          holding={holding}
-        />
-        <CustomizePanel
-          dnd={dnd}
-          settings={settingPanel}
-          shape={shape}
-          setShape={setShape}
-          setDragging={setDragging}
-          library={lib}
-        />
-      </Splitter>
-    </>
+    <RSplit margin={120} settings={settingSplit} unfold={customize}>
+      <Grids.GridLayout
+        dnd={dnd}
+        padding={2}
+        className="labview-container"
+        items={gridItems}
+        shape={shape}
+        onReshape={setShape}
+        holding={holding}
+      />
+      <CustomizePanel
+        dnd={dnd}
+        settings={settingPanel}
+        shape={shape}
+        setShape={setShape}
+        setDragging={setDragging}
+      />
+    </RSplit>
   );
 }
 
diff --git a/ivette/src/renderer/Preferences.js b/ivette/src/renderer/Preferences.js
deleted file mode 100644
index 7a9d1f76f585e32a17058ba1bd3c7151644aa108..0000000000000000000000000000000000000000
--- a/ivette/src/renderer/Preferences.js
+++ /dev/null
@@ -1,55 +0,0 @@
-// --------------------------------------------------------------------------
-// --- Main React Component rendered by './index.js'
-// --------------------------------------------------------------------------
-
-/*
-   Template from $(DOME)/template/Settings.js
-
-   This module shall export a React Component that
-   will be rendered (with empty props and children)
-   in the settings window of your application.
-
-*/
-
-import React from 'react' ;
-
-import * as Dome from 'dome';
-import { Form, Section, FieldSelect, FieldCheckbox, FieldSlider } from 'dome/layout/forms' ;
-
-const ASTviewPrefs = () => {
-
-  const [theme, setTheme] = Dome.useGlobalSetting('ASTview.theme', 'default');
-  const [fontSize, setFontSize] = Dome.useGlobalSetting('ASTview.fontSize', 12);
-
-  return (
-    <React.Fragment>
-      <Form>
-        <Section label="AST View" unfold={true}>
-          <FieldSelect
-            value={theme}
-            onChange={setTheme}
-            label="Theme"
-            title="Set the color theme of the AST source code">
-            <option value='default' label='Default'/>
-            <option value='ambiance' label='Ambiance'/>
-            <option value='solarized light' label='Solarized light'/>
-            <option value='solarized dark' label='Solarized dark'/>
-          </FieldSelect>
-          <FieldSlider
-            value={fontSize}
-            onChange={setFontSize}
-            label="Font Size"
-            title="Set the font size of the AST source code"
-            min={8}
-            max={32}
-            step={2}
-            />
-        </Section>
-      </Form>
-    </React.Fragment>
-  );
-}
-
-export default (() => (
-  <ASTviewPrefs/>
-));
diff --git a/ivette/src/renderer/Preferences.tsx b/ivette/src/renderer/Preferences.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..c1cb7e72194a634953b60df144aeb09858d1e44e
--- /dev/null
+++ b/ivette/src/renderer/Preferences.tsx
@@ -0,0 +1,89 @@
+// --------------------------------------------------------------------------
+// --- Main React Component rendered by './index.js'
+// --------------------------------------------------------------------------
+
+/*
+   Template from $(DOME)/template/Settings.js
+
+   This module shall export a React Component that
+   will be rendered (with empty props and children)
+   in the settings window of your application.
+
+*/
+
+import React from 'react';
+
+import * as Settings from 'dome/data/settings';
+import * as Forms from 'dome/layout/forms';
+import * as P from 'ivette/prefs';
+
+// --------------------------------------------------------------------------
+// --- Font Forms
+// --------------------------------------------------------------------------
+
+function ThemeFields(props: P.ThemeProps) {
+  const theme = Forms.useDefined(Forms.useValid(
+    Settings.useGlobalSettings(props.theme),
+  ));
+  const fontsize = Forms.useValid(
+    Settings.useGlobalSettings(props.fontSize),
+  );
+  const wraptext = Forms.useValid(
+    Settings.useGlobalSettings(props.wrapText),
+  );
+  const options = P.THEMES.map(({ id, label }) => (
+    <option key={id} value={id} label={label} />
+  ));
+  const { target } = props;
+  return (
+    <>
+      <Forms.SelectField
+        state={theme}
+        label="Theme"
+        title={`Set the color theme of ${target}`}
+      >
+        {options}
+      </Forms.SelectField>
+      <Forms.SliderField
+        state={fontsize}
+        label="Font Size"
+        title={`Set the font size of ${target}`}
+        min={8}
+        max={32}
+        step={2}
+      />
+      <Forms.CheckboxField
+        state={wraptext}
+        label="Wrap Text"
+        title={`Set long line wrapping mode of ${target}`}
+      />
+    </>
+  );
+}
+
+// --------------------------------------------------------------------------
+// --- Export Components
+// --------------------------------------------------------------------------
+
+export default (() => (
+  <Forms.Page>
+    <Forms.Section label="AST View" unfold>
+      <ThemeFields
+        target="Internal AST"
+        theme={P.AstTheme}
+        fontSize={P.AstFontSize}
+        wrapText={P.AstWrapText}
+      />
+    </Forms.Section>
+    <Forms.Section label="Source View" unfold>
+      <ThemeFields
+        target="Source Code"
+        theme={P.SourceTheme}
+        fontSize={P.SourceFontSize}
+        wrapText={P.SourceWrapText}
+      />
+    </Forms.Section>
+  </Forms.Page>
+));
+
+// --------------------------------------------------------------------------
diff --git a/ivette/src/renderer/Properties.tsx b/ivette/src/renderer/Properties.tsx
deleted file mode 100644
index 341091ddd0367bb843a06a26ebf8d043bb84069d..0000000000000000000000000000000000000000
--- a/ivette/src/renderer/Properties.tsx
+++ /dev/null
@@ -1,504 +0,0 @@
-// --------------------------------------------------------------------------
-// --- Properties
-// --------------------------------------------------------------------------
-
-import _ from 'lodash';
-import React, { useEffect } from 'react';
-import * as Dome from 'dome';
-import { key } from 'dome/data/json';
-import * as States from 'frama-c/states';
-import * as Compare from 'dome/data/compare';
-import { Label, Code } from 'dome/controls/labels';
-import { IconButton } from 'dome/controls/buttons';
-import * as Models from 'dome/table/models';
-import * as Arrays from 'dome/table/arrays';
-import { Table, Column, ColumnProps, Renderer } from 'dome/table/views';
-import { TitleBar, Component } from 'frama-c/LabViews';
-import { Vfill } from 'dome/layout/boxes';
-import { Splitter } from 'dome/layout/splitters';
-import { Form, Section, FieldCheckbox } from 'dome/layout/forms';
-
-import { source as SourceLoc } from 'api/kernel/services';
-import { statusData as Property } from 'api/kernel/properties';
-import * as Properties from 'api/kernel/properties';
-
-// --------------------------------------------------------------------------
-// --- Filters
-// --------------------------------------------------------------------------
-
-const defaultStatusFilter =
-{
-  valid: true,
-  valid_hyp: true,
-  unknown: true,
-  invalid: true,
-  invalid_hyp: true,
-  considered_valid: false,
-  untried: false,
-  inconsistent: true,
-};
-
-const defaultKindFilter =
-{
-  assert: true,
-  invariant: true,
-  variant: true,
-  requires: true,
-  ensures: true,
-  instance: true,
-  assumes: true,
-  assigns: true,
-  from: true,
-  allocates: true,
-  behavior: false,
-  reachable: false,
-  axiomatic: true,
-  pragma: true,
-  others: true,
-};
-
-const defaultAlarmsFilter =
-{
-  alarms: true, // show properties that are alarms
-  others: true, // show properties that are not alarms
-  overflow: true,
-  division_by_zero: true,
-  mem_access: true,
-  index_bound: true,
-  pointer_value: true,
-  shift: true,
-  ptr_comparison: true,
-  differing_blocks: true,
-  separation: true,
-  overlap: true,
-  initialization: true,
-  dangling_pointer: true,
-  special_float: true,
-  float_to_int: true,
-  function_pointer: true,
-  union_initialization: true,
-  bool_value: true,
-};
-
-const defaultFilter =
-{
-  currentFunction: false,
-  status: defaultStatusFilter,
-  kind: defaultKindFilter,
-  alarms: defaultAlarmsFilter,
-};
-
-function filterStatus(
-  f: typeof defaultStatusFilter,
-  status: Properties.propStatus,
-) {
-  switch (status) {
-    case 'valid':
-    case 'valid_but_dead': return f.valid;
-    case 'valid_under_hyp': return f.valid_hyp;
-    case 'invalid':
-    case 'invalid_but_dead': return f.invalid;
-    case 'invalid_under_hyp': return f.invalid_hyp;
-    case 'unknown':
-    case 'unknown_but_dead': return f.unknown;
-    case 'considered_valid': return f.considered_valid;
-    case 'never_tried': return f.untried;
-    case 'inconsistent': return f.inconsistent;
-    default: return true;
-  }
-}
-
-function filterKind(
-  f: typeof defaultKindFilter,
-  kind: Properties.propKind,
-) {
-  switch (kind) {
-    case 'assert': return f.assert;
-    case 'loop_invariant':
-      return f.invariant;
-    case 'loop_variant': return f.variant;
-    case 'requires': return f.requires;
-    case 'ensures': return f.ensures;
-    case 'instance': return f.instance;
-    case 'assigns': return f.assigns;
-    case 'froms': return f.from;
-    case 'allocates': return f.allocates;
-    case 'behavior': return f.behavior;
-    case 'reachable': return f.reachable;
-    case 'axiomatic': return f.axiomatic;
-    case 'loop_pragma': return f.pragma;
-    default: return f.others;
-  }
-}
-
-function filterAlarm(f: typeof defaultAlarmsFilter, alarm: string) {
-  switch (alarm) {
-    case 'overflow': return f.overflow;
-    case 'division_by_zero': return f.division_by_zero;
-    case 'mem_access': return f.mem_access;
-    case 'index_bound': return f.index_bound;
-    case 'pointer_value': return f.pointer_value;
-    case 'shift': return f.shift;
-    case 'ptr_comparison': return f.ptr_comparison;
-    case 'differing_blocks': return f.differing_blocks;
-    case 'separation': return f.separation;
-    case 'overlap': return f.overlap;
-    case 'initialization': return f.initialization;
-    case 'dangling_pointer': return f.dangling_pointer;
-    case 'is_nan_or_infinite':
-    case 'is_nan': return f.special_float;
-    case 'float_to_int': return f.float_to_int;
-    case 'function_pointer': return f.function_pointer;
-    case 'initialization_of_union': return f.union_initialization;
-    case 'bool_value': return f.bool_value;
-    default: return true;
-  }
-}
-
-function filterProperty(f: typeof defaultFilter, item: Property) {
-  return filterStatus(f.status, item.status)
-    && filterKind(f.kind, item.kind)
-    && ((item.alarm && f.alarms.alarms)
-      || (!item.alarm && f.alarms.others))
-    && (!item.alarm || filterAlarm(f.alarms, item.alarm));
-}
-
-// --------------------------------------------------------------------------
-// --- Property Columns
-// --------------------------------------------------------------------------
-
-const renderCode: Renderer<string> =
-  (text: string) => (<Code className="code-column" title={text}>{text}</Code>);
-
-const renderTag: Renderer<States.Tag> =
-  (d: States.Tag) => <Label label={d.label ?? d.name} title={d.descr} />;
-
-const renderNames: Renderer<string[]> =
-  (names: string[]) => {
-    const label = names?.join(': ');
-    return (label ? <Label label={label} /> : null);
-  };
-
-const renderDir: Renderer<SourceLoc> =
-  (loc: SourceLoc) => (
-    <Code className="code-column" label={loc.dir} title={loc.file} />
-  );
-
-const renderFile: Renderer<SourceLoc> =
-  (loc: SourceLoc) => (
-    <Code className="code-column" label={loc.base} title={loc.file} />
-  );
-
-function ColumnCode<Row>(props: ColumnProps<Row, string>) {
-  return <Column render={renderCode} {...props} />;
-}
-
-function ColumnTag<Row>(props: ColumnProps<Row, States.Tag>) {
-  return <Column render={renderTag} {...props} />;
-}
-
-// --------------------------------------------------------------------------
-// --- Properties Table
-// -------------------------------------------------------------------------
-
-const bySource =
-  Compare.byFields<SourceLoc>({ file: Compare.alpha, line: Compare.number });
-
-const byStatus =
-  Compare.byRank(
-    'inconsistent',
-    'invalid',
-    'invalid_under_hyp',
-    'unknown',
-    'valid_under_hyp',
-    'valid',
-    'invalid_but_dead',
-    'unknown_but_dead',
-    'valid_but_dead',
-    'never_tried',
-    'considered_valid',
-  );
-
-const byProperty: Compare.ByFields<Property> = {
-  status: byStatus,
-  function: Compare.defined(Compare.alpha),
-  source: bySource,
-  kind: Compare.structural,
-  alarm: Compare.defined(Compare.alpha),
-  names: Compare.array(Compare.alpha),
-  predicate: Compare.defined(Compare.alpha),
-  key: Compare.string,
-  kinstr: Compare.structural,
-};
-
-const byDir = Compare.byFields<SourceLoc>({ dir: Compare.alpha });
-const byFile = Compare.byFields<SourceLoc>({ base: Compare.alpha });
-
-const byColumn: Arrays.ByColumns<Property> = {
-  dir: Compare.byFields<Property>({ source: byDir }),
-  file: Compare.byFields<Property>({ source: byFile }),
-};
-
-class PropertyModel extends Arrays.CompactModel<key<'#status'>, Property> {
-
-  private filterFun?: string;
-  private filterProp = _.cloneDeep(defaultFilter);
-
-  constructor() {
-    super((p: Property) => p.key);
-    this.setOrderingByFields(byProperty);
-    this.setColumnOrder(byColumn);
-    this.setFilter(this.filterItem.bind(this));
-  }
-
-  getFilterProps() {
-    return this.filterProp;
-  }
-
-  setFilterFunction(kf?: string) {
-    this.filterFun = kf;
-    if (this.filterProp.currentFunction)
-      this.reload();
-  }
-
-  filterItem(item: Property) {
-    const cf = this.filterFun;
-    const cp = this.filterProp;
-    return (
-      (!cp.currentFunction || cf === undefined || cf === item.function) &&
-      filterProperty(cp, item)
-    );
-  }
-
-}
-
-// --------------------------------------------------------------------------
-// --- Property Filter Form
-// -------------------------------------------------------------------------
-
-const PropertyFilter =
-  (props: { model: PropertyModel }) => (
-    <Vfill>
-      <Form
-        value={props.model.getFilterProps()}
-        onChange={props.model.reload}
-      >
-        <FieldCheckbox label="Current function" path="currentFunction" />
-        <Section label="Status" unfold path="status">
-          <FieldCheckbox label="Valid" path="valid" />
-          <FieldCheckbox label="Valid under hyp." path="valid_hyp" />
-          <FieldCheckbox label="Unknown" path="unknown" />
-          <FieldCheckbox label="Invalid" path="invalid" />
-          <FieldCheckbox label="Invalid under hyp." path="invalid_hyp" />
-          <FieldCheckbox label="Considered valid" path="considered_valid" />
-          <FieldCheckbox label="Untried" path="untried" />
-          <FieldCheckbox label="Dead" path="dead" />
-          <FieldCheckbox label="Inconsistent" path="inconsistent" />
-        </Section>
-        <Section label="Property kind" path="kind">
-          <FieldCheckbox label="Assertions" path="assert" />
-          <FieldCheckbox label="Invariants" path="invariant" />
-          <FieldCheckbox label="Variants" path="variant" />
-          <FieldCheckbox label="Preconditions" path="requires" />
-          <FieldCheckbox label="Postconditions" path="ensures" />
-          <FieldCheckbox label="Instance" path="instance" />
-          <FieldCheckbox label="Assigns clauses" path="assigns" />
-          <FieldCheckbox label="From clauses" path="from" />
-          <FieldCheckbox label="Allocates" path="allocates" />
-          <FieldCheckbox label="Behaviors" path="behavior" />
-          <FieldCheckbox label="Reachables" path="reachable" />
-          <FieldCheckbox label="Axiomatics" path="axiomatic" />
-          <FieldCheckbox label="Pragma" path="pragma" />
-          <FieldCheckbox label="Others" path="others" />
-        </Section>
-        <Section label="Alarms" path="alarms">
-          <FieldCheckbox label="Alarms" path="alarms" />
-          <FieldCheckbox label="Others" path="others" />
-        </Section>
-        <Section label="Alarms kind" path="alarms">
-          <FieldCheckbox label="Overflows" path="overflow" />
-          <FieldCheckbox label="Divisions by zero" path="division_by_zero" />
-          <FieldCheckbox label="Shifts" path="shift" />
-          <FieldCheckbox label="Special floats" path="special_float" />
-          <FieldCheckbox label="Float to int" path="float_to_int" />
-          <FieldCheckbox label="_Bool values" path="bool_value" />
-          <FieldCheckbox label="Memory accesses" path="mem_access" />
-          <FieldCheckbox label="Index bounds" path="index_bound" />
-          <FieldCheckbox label="Initializations" path="initialization" />
-          <FieldCheckbox label="Dangling pointers" path="dangling_pointer" />
-          <FieldCheckbox label="Pointer values" path="pointer_value" />
-          <FieldCheckbox label="Function pointers" path="function_pointer" />
-          <FieldCheckbox label="Pointer comparisons" path="ptr_comparison" />
-          <FieldCheckbox label="Differing blocks" path="differing_blocks" />
-          <FieldCheckbox label="Separations" path="separation" />
-          <FieldCheckbox label="Overlaps" path="overlap" />
-          <FieldCheckbox
-            label="Initialization of unions"
-            path="union_initialization"
-          />
-        </Section>
-      </Form>
-    </Vfill>
-  );
-
-// -------------------------------------------------------------------------
-// --- Property Columns
-// -------------------------------------------------------------------------
-
-const PropertyColumns = () => {
-
-  const statusDict = States.useTags(Properties.propStatusTags);
-  const kindDict = States.useTags(Properties.propKindTags);
-  const alarmDict = States.useTags(Properties.alarmsTags);
-
-  const getStatus = React.useCallback(
-    ({ status: st }: Property) => (statusDict.get(st) ?? { name: st }),
-    [statusDict],
-  );
-
-  const getKind = React.useCallback(
-    ({ kind: kd }: Property) => (kindDict.get(kd) ?? { name: kd }),
-    [kindDict],
-  );
-
-  const getAlarm = React.useCallback(
-    ({ alarm }: Property) => (
-      alarm === undefined ? alarm : (alarmDict.get(alarm) ?? { name: alarm })
-    ),
-    [alarmDict],
-  );
-
-  return (
-    <>
-      <Column
-        id="dir"
-        label="Directory"
-        width={240}
-        visible={false}
-        getter={(prop: Property) => prop?.source}
-        render={renderDir}
-      />
-      <Column
-        id="file"
-        label="File"
-        width={120}
-        getter={(prop: Property) => prop?.source}
-        render={renderFile}
-      />
-      <ColumnCode id="function" label="Function" width={120} />
-      <ColumnTag id="kind" label="Property kind" getter={getKind} width={120} />
-      <ColumnTag id="alarm" label="Alarms" getter={getAlarm} width={160} />
-      <Column
-        id="names"
-        label="Names"
-        width={240}
-        visible={false}
-        render={renderNames}
-      />
-      <ColumnCode id="predicate" label="Predicate" fill />
-      <ColumnCode id="descr" label="Property" fill visible={false} />
-      <ColumnTag
-        id="status"
-        label="Status"
-        fixed
-        width={100}
-        align="center"
-        getter={getStatus}
-      />
-    </>
-  );
-
-};
-
-function FilterRatio({ model }: { model: PropertyModel }) {
-  Models.useModel(model);
-  const [filtered, total] = [model.getRowCount(), model.getTotalRowCount()];
-  return (
-    <Label
-      className="component-info"
-      title="Displayed Properties / Total"
-      display={filtered !== total || true}
-    >
-      {filtered} / {total}
-    </Label>
-  );
-}
-
-// -------------------------------------------------------------------------
-// --- Properties Table
-// -------------------------------------------------------------------------
-
-const RenderTable = () => {
-  // Hooks
-  const model = React.useMemo(() => new PropertyModel(), []);
-  const data = States.useSyncArray(Properties.status).getArray();
-  useEffect(() => {
-    model.removeAllData();
-    model.updateData(data);
-    model.reload();
-  }, [model, data]);
-
-  const [selection, updateSelection] = States.useSelection();
-
-  const [showFilter, flipFilter] =
-    Dome.useSwitch('ivette.properties.showFilter', true);
-
-  // Updating the filter
-  const selectedFunction = selection?.current?.function;
-  React.useEffect(() => {
-    model.setFilterFunction(selectedFunction);
-  }, [model, selectedFunction]);
-
-  // Callbacks
-
-  const onPropertySelection = React.useCallback(
-    ({ key: propKey, function: fct }: Property) => {
-      const location = { function: fct, marker: propKey };
-      updateSelection({ location });
-    }, [updateSelection],
-  );
-
-  const propertySelection = selection?.current?.marker;
-
-  return (
-    <>
-      <TitleBar>
-        <FilterRatio model={model} />
-        <IconButton
-          icon="CLIPBOARD"
-          selected={showFilter}
-          onClick={flipFilter}
-          title="Toggle filters panel"
-        />
-      </TitleBar>
-      <Splitter dir="RIGHT" unfold={showFilter}>
-        <Table<string, Property>
-          model={model}
-          sorting={model}
-          selection={propertySelection}
-          onSelection={onPropertySelection}
-          settings="ivette.properties.table"
-        >
-          <PropertyColumns />
-        </Table>
-        <PropertyFilter model={model} />
-      </Splitter>
-    </>
-  );
-};
-
-// --------------------------------------------------------------------------
-// --- Export Component
-// -------------------------------------------------------------------------
-
-export default () => (
-  <Component
-    id="frama-c.properties"
-    label="Properties"
-    title="Registered ACSL properties status"
-  >
-    <RenderTable />
-  </Component>
-);
-
-// --------------------------------------------------------------------------
diff --git a/ivette/src/renderer/Values.tsx b/ivette/src/renderer/Values.tsx
deleted file mode 100644
index 652f48fc1072c0a0ea7186293fdcaec0504e00c5..0000000000000000000000000000000000000000
--- a/ivette/src/renderer/Values.tsx
+++ /dev/null
@@ -1,141 +0,0 @@
-// --------------------------------------------------------------------------
-// --- Eva Values
-// --------------------------------------------------------------------------
-
-import React from 'react';
-import * as States from 'frama-c/states';
-import * as Json from 'dome/data/json';
-import * as Eva from 'api/plugins/eva/values';
-import * as Ast from 'api/kernel/ast';
-import * as Compare from 'dome/data/compare';
-
-import { Table, Column } from 'dome/table/views';
-import { ArrayModel } from 'dome/table/arrays';
-import { Component } from 'frama-c/LabViews';
-import { Icon } from 'dome/controls/icons';
-import { Label } from 'dome/controls/labels';
-
-// --------------------------------------------------------------------------
-// --- Columns
-// --------------------------------------------------------------------------
-
-const CallstackRenderer = (
-  (cs: Eva.callstack) => <Label label={cs.short} title={cs.full} />
-);
-
-const ColumnCallstack = () => Column({
-  id: 'callstack',
-  label: 'Callstack',
-  title: 'Context of the evaluation',
-  align: 'left',
-  width: 150,
-  render: CallstackRenderer,
-});
-
-const AlarmRenderer = (
-  (alarm: boolean) => <>{alarm && <Icon id="ATTENTION" />}</>
-);
-
-const ColumnAlarm = (props: { visible: boolean }) => Column({
-  id: 'alarm',
-  label: 'Alarm',
-  title: 'Did the evaluation emit an alarm?',
-  align: 'center',
-  width: 26,
-  fixed: true,
-  icon: 'WARNING',
-  visible: props.visible,
-  render: AlarmRenderer,
-});
-
-const byValues: Compare.ByFields<Eva.valuesData> =
-  { callstack: Compare.defined(Compare.byFields({ full: Compare.string })) };
-
-class ValuesModel extends ArrayModel<Json.key<'#values'>, Eva.valuesData> {
-  constructor() {
-    super();
-    this.setOrderingByFields(byValues);
-  }
-}
-
-// --------------------------------------------------------------------------
-// --- Values Panel
-// --------------------------------------------------------------------------
-
-const Values = () => {
-
-  const model = React.useMemo(() => new ValuesModel(), []);
-  const evaValues = States.useSyncArray(Eva.values).getArray();
-  const selectMarker = States.useSelection()[0]?.current?.marker;
-  const markerInfo = States.useSyncArray(Ast.markerInfo).getArray();
-  const [name, setName] = React.useState<string | undefined>(undefined);
-
-  States.useRequest(Eva.getValues, selectMarker);
-
-  React.useEffect(() => {
-    model.removeAllData();
-    if (selectMarker && evaValues) {
-      const selectMarkerInfo = markerInfo.find((e) => e.key === selectMarker);
-      if (selectMarkerInfo && selectMarkerInfo.var !== 'function') {
-        switch (selectMarkerInfo.kind) {
-          case 'expression':
-          case 'lvalue':
-            evaValues.forEach((i) => model.setData(i.key, i));
-            setName(selectMarkerInfo.descr);
-            break;
-          case 'declaration':
-            evaValues.forEach((i) => model.setData(i.key, i));
-            setName(selectMarkerInfo.name);
-            break;
-          default:
-            setName(undefined);
-        }
-      }
-    } else {
-      setName(undefined);
-    }
-    model.reload();
-  }, [evaValues, selectMarker, markerInfo, model]);
-
-  // Component
-  return (
-    <>
-      <Table model={model}>
-        <ColumnCallstack />
-        <Column
-          id="value_before"
-          visible={!!name}
-          label={name && `${name} (before)`}
-          title="Values inferred by Eva just before the selected point"
-          disableSort
-          width={300}
-        />
-        <ColumnAlarm visible={!!name} />
-        <Column
-          id="value_after"
-          visible={!!name}
-          label={name && `${name} (after)`}
-          title="Values inferred by Eva just after the selected point"
-          disableSort
-          width={300}
-        />
-      </Table>
-    </>
-  );
-};
-
-// --------------------------------------------------------------------------
-// --- Export Component
-// --------------------------------------------------------------------------
-
-export default () => (
-  <Component
-    id="frama-c.values"
-    label="Eva Values"
-    title="Values inferred by the Eva analysis"
-  >
-    <Values />
-  </Component>
-);
-
-// --------------------------------------------------------------------------
diff --git a/ivette/src/renderer/style.css b/ivette/src/renderer/style.css
index 09df391d8df39183598a6fa9d2636fc49ce2372b..3f56713b0c713f1385e5af163d3fa0b810ff8999 100644
--- a/ivette/src/renderer/style.css
+++ b/ivette/src/renderer/style.css
@@ -1,5 +1,5 @@
 /* -------------------------------------------------------------------------- */
-/* --- Frama-C Styling                                                    --- */
+/* --- Main Frame                                                         --- */
 /* -------------------------------------------------------------------------- */
 
 .sidebar-ruler {
@@ -16,24 +16,52 @@
     font-size: smaller;
 }
 
-.code-column {
-    margin: 0px;
-    padding: 0px;
-    display: block;
-    text-overflow: ellipsis;
+/* -------------------------------------------------------------------------- */
+/* --- Styling LabViews                                                   --- */
+/* -------------------------------------------------------------------------- */
+
+.labview-field {
+    position: relative ;
+    left: -8px ;
 }
 
-.highlighted-marker {
-    background-color: #FFFF66;
+.labview-stock:hover {
+    background: #ccc ;
 }
 
-.dead-code {
-    background-color: #BBB;
-    border-bottom: solid 0.1em #BBB;
+.labview-stock:hover * {
+    cursor: move ;
 }
 
-.non-terminating {
-    border-bottom: solid 0.2em #BBB;
+.labview-stock.dome-dragging
+{
+    border-radius: 4px ;
+    background: #ccc ;
+    border: thin solid black ;
 }
 
-/* -------------------------------------------------------------------------- */
+.labview-content
+{
+    background: #e6e6e6 ;
+}
+
+.labview-titlebar
+{
+    background: #ccc ;
+    height: 24px ;
+}
+
+.labview-handle
+{
+    flex: 1 1 auto ;
+    cursor: move ;
+}
+
+.labview-close:hover
+{
+    fill: red ;
+}
+
+.dome-window-active .labview-icon {
+    fill: #7d7d7d ;
+}
diff --git a/ivette/tsconfig.json b/ivette/tsconfig.json
index 0cbb1f1af838676ae822f3048a4df3ca1086e745..143f87202b1e26dd1891190fabceeffc018ab922 100644
--- a/ivette/tsconfig.json
+++ b/ivette/tsconfig.json
@@ -43,12 +43,17 @@
     "resolveJsonModule": true,                /* Allow to load JSON files as module. */
     "baseUrl": ".",                           /* Base directory to resolve non-absolute module names. */
     "paths": {                                /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
-      "api/*": [ "api/*" ],
+      "ivette@ext": [ "src/renderer/Extensions.tsx" ],
+      "ivette@lab": [ "src/renderer/Laboratory.tsx" ],
+      "ivette": [ "src/ivette/index.tsx" ],
+      "ivette/*": [ "src/ivette/*" ],
+      "frama-c/api/*": [ "src/frama-c/api/generated/*" ],
       "frama-c/*": [ "src/frama-c/*" ],
-      "dome": [ "src/dome/src/renderer/dome.js" ],
-      "dome/system": [ "src/dome/src/misc/system.js" ],
-      "dome/misc/*": [ "src/dome/src/misc/*"],
-      "dome/*": [ "src/dome/src/renderer/*" ],
+      "dome": [ "src/dome/renderer/dome.tsx" ],
+      "dome/system": [ "src/dome/misc/system.js" ],
+      "dome/devtools": [ "src/dome/misc/devtools.js" ],
+      "dome/misc/*": [ "src/dome/misc/*"],
+      "dome/*": [ "src/dome/renderer/*" ],
       "codemirror/lib/codemirror": ["node_modules/@types/codemirror/index.d.ts"],
     },
     // "rootDirs": [],                        /* List of root folders whose combined content represents the structure of the project at runtime. */
@@ -99,9 +104,15 @@
     "readme": "./README.md",
     "inputFiles": [
       "doc/pages",
-      "src/frama-c", "api",
-      "src/dome/src/renderer",
-      "src/dome/src/misc",
+      "src/ivette/index.tsx",
+      "src/ivette/prefs.tsx",
+      "src/frama-c/server.ts",
+      "src/frama-c/states.ts",
+      "src/frama-c/utils.ts",
+      "src/frama-c/api/generated",
+      "src/dome/renderer",
+      "src/dome/misc/utils.ts",
+      "src/dome/misc/system.ts",
     ]
   }
 }
diff --git a/ivette/webpack.main.js b/ivette/webpack.main.js
index 608d29372314dcb2e5cd7406dac737c35371daf6..3d91c95097c725faad8398566de393881c2a3b02 100644
--- a/ivette/webpack.main.js
+++ b/ivette/webpack.main.js
@@ -21,15 +21,24 @@ function domeDevtools() {
   case 'dev':
     return 'electron-devtools-installer';
   default:
-    return path.resolve( DOME , 'src/misc/devtools.js' );
+    return path.resolve( DOME , 'misc/devtools.js' );
   }
 }
 
+// --------------------------------------------------------------------------
+
 module.exports = {
+  module: {
+    rules: [
+      { test: /\.(ts|js)x?$/, use: [ 'babel-loader' ], exclude: /node_modules/ }
+    ],
+    strictExportPresence: true
+  },
   resolve: {
+    extensions: ['.ts', '.tsx', '.js', 'jsx', '.json'],
     alias: {
-      'dome$':         path.resolve( DOME , 'src/main/dome.js' ),
-      'dome/system$':  path.resolve( DOME , 'src/misc/system.js' ),
+      'dome$':         path.resolve( DOME , 'main/dome.ts' ),
+      'dome/system$':  path.resolve( DOME , 'misc/system.ts' ),
       'dome/devtools': domeDevtools()
     }
   }
diff --git a/ivette/webpack.plugin.js b/ivette/webpack.plugin.js
deleted file mode 100644
index f60bdbf7ab8cda15ad9dcba2c747a5a3d82e57ed..0000000000000000000000000000000000000000
--- a/ivette/webpack.plugin.js
+++ /dev/null
@@ -1,41 +0,0 @@
-// --------------------------------------------------------------------------
-// --- Webpack configuration for packing plugins
-// --------------------------------------------------------------------------
-
-/*
-   Template of ./webpack.plugin.js from $(DOME)/template/webpack.plugin.js
-
-   This webpack definitions will be used to make plugin bundles.
-
-   You may extend it with your own additions.
-*/
-
-const path = require('path');
-const DOME = process.env.DOME || path.resolve( __dirname , 'dome' );
-const PLUGIN = process.env.DOME_PLUGIN ;
-const ENTRY = path.resolve( __dirname , 'src/plugins' , PLUGIN );
-const DIST = path.resolve( __dirname , 'dist/plugins' , PLUGIN );
-
-module.exports = {
-  entry: ENTRY,
-  output: {
-    path: DIST,
-    filename: 'bundle.js',
-    libraryTarget: 'commonjs2'
-  },
-  module: {
-    rules: [
-      { test: /\.css$/, use: [ 'style-loader', 'css-loader' ] },
-      { test: /\.js$/, use: [ 'babel-loader' ], exclude: /(node_modules)/ }
-    ]
-  },
-  externals: [
-    'lodash',
-    'react',
-    /^dome\/.+$/,
-    /^@plugins\/.+$/,
-    /^@\/.+$/
-  ]
-};
-
-// --------------------------------------------------------------------------
diff --git a/ivette/webpack.renderer.js b/ivette/webpack.renderer.js
index e35b929d4766762beef45a01ecd3b55126716021..3f9bea9ec9b4d3ded76373b66839a38f0ec386e6 100644
--- a/ivette/webpack.renderer.js
+++ b/ivette/webpack.renderer.js
@@ -21,18 +21,21 @@ module.exports = {
     rules: [
       { test: /\.css$/, use: [ 'css-loader' ] },
       { test: /\.(ts|js)x?$/, use: [ 'babel-loader' ], exclude: /node_modules/ }
-    ]
+    ],
+    strictExportPresence: true
   },
   resolve: {
     extensions: ['.ts', '.tsx', '.js', 'jsx', '.json'],
     alias: {
-      'api':          path.resolve( __dirname , 'api' ),
+      'frama-c/api':  path.resolve( __dirname , 'src/frama-c/api/generated' ),
       'frama-c':      path.resolve( __dirname , 'src/frama-c' ),
-      '@plugins':     path.resolve( __dirname , 'src/plugins' ),
-      'dome/misc':    path.resolve( DOME , 'src/misc' ),
-      'dome/system':  path.resolve( DOME , 'src/misc/system.js' ),
-      'dome$':        path.resolve( DOME , 'src/renderer/dome.js' ),
-      'dome':         path.resolve( DOME , 'src/renderer' ),
+      'ivette@ext':   path.resolve( __dirname , 'src/renderer/Extensions' ),
+      'ivette@lab':   path.resolve( __dirname , 'src/renderer/Laboratory' ),
+      'ivette':       path.resolve( __dirname , 'src/ivette' ),
+      'dome/misc':    path.resolve( DOME , 'misc' ),
+      'dome/system':  path.resolve( DOME , 'misc/system.ts' ),
+      'dome$':        path.resolve( DOME , 'renderer/dome.tsx' ),
+      'dome':         path.resolve( DOME , 'renderer' ),
       'react-dom':    '@hot-loader/react-dom'
     }
   }
diff --git a/ivette/yarn.lock b/ivette/yarn.lock
index 1402c44ae3bc9d7200f381f5fd57207ac495b66b..d1b9cd89c54e0e40fff49ff63ea303bc37d47555 100644
--- a/ivette/yarn.lock
+++ b/ivette/yarn.lock
@@ -876,6 +876,13 @@
     core-js-pure "^3.0.0"
     regenerator-runtime "^0.13.4"
 
+"@babel/runtime@^7.0.0":
+  version "7.12.5"
+  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e"
+  integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==
+  dependencies:
+    regenerator-runtime "^0.13.4"
+
 "@babel/runtime@^7.10.2":
   version "7.10.4"
   resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.4.tgz#a6724f1a6b8d2f6ea5236dbfe58c7d7ea9c5eb99"
@@ -1015,6 +1022,11 @@
   resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd"
   integrity sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==
 
+"@types/diff@^4.0.2":
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/@types/diff/-/diff-4.0.2.tgz#2e9bb89f9acc3ab0108f0f3dc4dbdcf2fff8a99c"
+  integrity sha512-mIenTfsIe586/yzsyfql69KRnA75S8SVXQbTLpDejRrjH0QSJcpu3AUOi/Vjnt9IOsXKxPhJfGpQUNMueIU1fQ==
+
 "@types/eslint-visitor-keys@^1.0.0":
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d"
@@ -1111,6 +1123,13 @@
     "@types/prop-types" "*"
     "@types/react" "*"
 
+"@types/react-window@^1.8.2":
+  version "1.8.2"
+  resolved "https://registry.yarnpkg.com/@types/react-window/-/react-window-1.8.2.tgz#a5a6b2762ce73ffaab7911ee1397cf645f2459fe"
+  integrity sha512-gP1xam68Wc4ZTAee++zx6pTdDAH08rAkQrWm4B4F/y6hhmlT9Mgx2q8lTCXnrPHXsr15XjRN9+K2DLKcz44qEQ==
+  dependencies:
+    "@types/react" "*"
+
 "@types/react@*", "@types/react@^16.9.17":
   version "16.9.32"
   resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.32.tgz#f6368625b224604148d1ddf5920e4fefbd98d383"
@@ -3008,6 +3027,13 @@ cytoscape-klay@^3.1.3:
   dependencies:
     klayjs "^0.4.1"
 
+cytoscape-panzoom@^2.5.3:
+  version "2.5.3"
+  resolved "https://registry.yarnpkg.com/cytoscape-panzoom/-/cytoscape-panzoom-2.5.3.tgz#edf041b5aa8be1cbe3c001f16a8b2193b46127a7"
+  integrity sha512-//qLOqbbFUCGddarNKHDZArItOJHgnkQ1TvxI9nV2/8aOOl/5wuEOHmra3fL/aWSjB4AYpYTG4LX7w96uWfRTQ==
+  dependencies:
+    jquery "^1.4 || ^2.0 || ^3.0"
+
 cytoscape-popper@^1.0.7:
   version "1.0.7"
   resolved "https://registry.yarnpkg.com/cytoscape-popper/-/cytoscape-popper-1.0.7.tgz#8154ff507d0cc1a17952f00643e71fc1f8ea9fae"
@@ -3219,6 +3245,11 @@ detect-node@^2.0.4:
   resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c"
   integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==
 
+diff@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b"
+  integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==
+
 diffie-hellman@^5.0.0:
   version "5.0.3"
   resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
@@ -5396,6 +5427,11 @@ jest-worker@^25.1.0:
     merge-stream "^2.0.0"
     supports-color "^7.0.0"
 
+"jquery@^1.4 || ^2.0 || ^3.0":
+  version "3.5.1"
+  resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.5.1.tgz#d7b4d08e1bfdb86ad2f1a3d039ea17304717abb5"
+  integrity sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==
+
 js-base64@^2.1.9:
   version "2.5.2"
   resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.2.tgz#313b6274dda718f714d00b3330bbae6e38e90209"
@@ -5899,6 +5935,11 @@ mem@^4.0.0:
     mimic-fn "^2.0.0"
     p-is-promise "^2.0.0"
 
+"memoize-one@>=3.1.1 <6":
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.1.1.tgz#047b6e3199b508eaec03504de71229b8eb1d75c0"
+  integrity sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA==
+
 memory-fs@^0.4.0, memory-fs@^0.4.1:
   version "0.4.1"
   resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
@@ -7399,6 +7440,14 @@ react-virtualized@^9.21.2:
     prop-types "^15.6.0"
     react-lifecycles-compat "^3.0.4"
 
+react-window@^1.8.6:
+  version "1.8.6"
+  resolved "https://registry.yarnpkg.com/react-window/-/react-window-1.8.6.tgz#d011950ac643a994118632665aad0c6382e2a112"
+  integrity sha512-8VwEEYyjz6DCnGBsd+MgkD0KJ2/OXFULyDtorIiTz+QzwoP94tBoA7CnbtyXMm+cCeAUER5KJcPtWl9cpKbOBg==
+  dependencies:
+    "@babel/runtime" "^7.0.0"
+    memoize-one ">=3.1.1 <6"
+
 react@^16.8:
   version "16.13.1"
   resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e"
diff --git a/man/frama-c.1 b/man/frama-c.1
index f175412be20b91f5b8c7a1d557822d8e9831fa3d..b2b5cfc68717f3ed2add02df1f35cd3e7e529c7c 100644
--- a/man/frama-c.1
+++ b/man/frama-c.1
@@ -25,7 +25,7 @@
 .\" 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-10-07
+.TH FRAMA-C 1 2021-01-07
 .SH NAME
 .PP
 frama-c[.byte] - a static analyzer for C programs
@@ -123,6 +123,12 @@ By default, all numerical addresses are considered invalid.
 adds directories \f[I]p1\f[R] through \f[I]pn\f[R] to the list of
 directories in which plugins are searched.
 .TP
+.B \-add\-symbolic\-path \f[I]p1:n1[,p2:n2[\&...,pn:nn]]\f[]
+replaces each path \f[I]pi\f[] with the name \f[I]ni\f[] when displaying
+file locations in messages.
+.RS
+.RE
+.TP
 .B [-no]-aggressive-merging
 merges function definitions modulo renaming.
 Defaults to no.
@@ -395,7 +401,9 @@ 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[R].
-Default is \f[B]x86_32\f[R].
+Default is \f[B]x86_64\f[R].
+The environment variable FRAMAC_MACHDEP can be used to override the default
+value. The command line parameter still has priority over the default value.
 .TP
 .B -main \f[I]f\f[R]
 sets \f[I]f\f[R] as the entry point of the analysis.
diff --git a/man/frama-c.1.md b/man/frama-c.1.md
index a2872e73a32d8eeabccc26e9456e13147bac0445..071242bc2be7cd4d5659c688eb925f70db74da19 100644
--- a/man/frama-c.1.md
+++ b/man/frama-c.1.md
@@ -81,6 +81,10 @@ This option has the same per-plugin (and kernel) specializations as
 Bounds are parsed as OCaml integer constants.
 By default, all numerical addresses are considered invalid.
 
+-add-symbolic-path *p1:n1[,p2:n2[...,pn:nn]]*
+: replaces each path *pi* with the name *ni* when displaying file locations
+in messages.
+
 [-no]-aggressive-merging
 : merges function definitions modulo renaming. Defaults to no.
 
diff --git a/nix/default.nix b/nix/default.nix
index ced638c3277ec6bc5d5d29a4ecd62b7440f916da..7de2749d9c834d29bb5324c0f2b634b889e0fdad 100644
--- a/nix/default.nix
+++ b/nix/default.nix
@@ -3,7 +3,7 @@
 
 let mk_buildInputs = { opamPackages ? [], nixPackages ? [] } :
     [ pkgs.gnugrep pkgs.gnused  pkgs.autoconf pkgs.gnumake pkgs.gcc pkgs.ncurses pkgs.time pkgs.python3 pkgs.perl pkgs.file pkgs.which pkgs.dos2unix] ++ nixPackages ++ opam2nix.build {
-           specs = opam2nix.toSpecs ([ "ocamlfind" "zarith" "ocamlgraph" "yojson"
+           specs = opam2nix.toSpecs ([ "ocamlfind" "zarith" "ocamlgraph" "yojson" "zmq"
                 { name = "coq"; constraint = "=8.12.0";  }
                 { name = "alt-ergo" ; constraint = "=2.2.0"; }
                 { name = "why3" ; constraint = "=1.3.3"; }
@@ -295,6 +295,14 @@ rec {
                 autoPatchelf src/plugins/pathcrawler
                 make -j 4
                 ln -sr src/plugins/pathcrawler/share share/pc
+                # Setup Why3
+                mkdir home
+                HOME=$(pwd)/home
+                why3 config --detect
+                # Setup WP related
+                export CAVEAT_IMPORTER_NIX_MODE=yes
+                export FRAMAC_WP_CACHE=replay
+                export FRAMAC_WP_CACHEDIR=${plugins.wp-cache.src}
                 make tests -j4 PTESTS_OPTS="-error-code -j 4"
         '';
         installPhase = ''
diff --git a/opam/opam b/opam/opam
index dd9a22814ac9549d145b8d40c79de1590dc8192f..a102e260f1917bf705f3806fcdaad692a90754f1 100644
--- a/opam/opam
+++ b/opam/opam
@@ -1,7 +1,7 @@
 opam-version: "2.0"
 name: "frama-c"
 synopsis: "Platform dedicated to the analysis of source code written in C"
-version: "21.1+dev"
+version: "22.0+dev"
 description:"""
 Frama-C gathers several analysis techniques in a single collaborative
 framework, based on analyzers (called "plug-ins") that can build upon the
@@ -63,9 +63,9 @@ authors: [
   "Boris Yakobowski"
 ]
 homepage: "http://frama-c.com/"
-license: "GNU Lesser General Public License version 2.1"
+license: "LGPL-2.1-only"
 dev-repo: "git+https://git.frama-c.com/pub/frama-c.git"
-doc: "http://frama-c.com/download/user-manual-21.1-Scandium.pdf"
+doc: "http://frama-c.com/download/user-manual-22.0-Titanium.pdf"
 bug-reports: "https://git.frama-c.com/pub/frama-c/issues"
 tags: [
   "deductive"
@@ -86,9 +86,6 @@ tags: [
 build: [
   ["autoconf"] {pinned}
   ["./configure" "--prefix" prefix
-                 "--disable-gui" { !conf-gtksourceview:installed |
-                                   ( !conf-gnomecanvas:installed &
-                                     !lablgtk3:installed) }
                  "--mandir=%{man}%"
   ]
   [make "-j%{jobs}%"]
@@ -101,22 +98,27 @@ install: [
 ]
 
 run-test: [
-  [make "-j%{jobs}%" "PTESTS_OPTS=-error-code" "tests"]
+  [make "-j%{jobs}%" "PTESTS_OPTS=-error-code" "tests"] { arch != "ppc64" }
+  # tests are disabled on PPC64 due to floating-point oracle differences
+  # (some ULPs in libc trigonometric functions) and due to the lack of
+  # available hardware to test them locally
 ]
 
 depends: [
-  "ocaml" { >= "4.05.0" & ( < "4.08.0~" | >= "4.08.1" ) }
-  "ocamlgraph" { >= "1.8.8" & < "1.9~" }
+  "ocaml" { >= "4.08.1" }
+  "ocamlgraph" { >= "1.8.8" }
   "ocamlfind" # needed beyond build stage, used by -load-module
   "zarith"
   "conf-autoconf" { build }
-  ( ( "lablgtk" { >= "2.18.2" } & "conf-gnomecanvas" & "conf-gtksourceview" )
-    | ( "lablgtk3" { >= "3.0.beta4" & os!="macos" }
+  ( ( "lablgtk" { >= "2.18.8" } & "conf-gnomecanvas" & "conf-gtksourceview"
+      & ("ocamlgraph" { < "2.0" } | "ocamlgraph_gtk" ))
+    | ( "lablgtk3" { >= "3.1.0" & os!="macos" }
         & "lablgtk3-sourceview3" & "conf-gtksourceview3" ) )
   ( "alt-ergo-free" | "alt-ergo" )
   "conf-graphviz" { post }
   "yojson"
   "why3" { >= "1.3.3" }
+  "conf-time" { with-test }
 ]
 
 depopts: [
@@ -131,18 +133,13 @@ depopts: [
   "ppx_deriving_yojson"
 ]
 
-conflicts: [
-  "lablgtk" { < "2.18.2" } #for ocaml >= 4.02.1
-  "frama-c-e-acsl" #avoid mixing old releases of E-ACSL, it is already
-                   #distributed with this version of Frama-C
-  "frama-c-base"   #avoid mixing old releases of Frama-C, now that only the
-                   #'frama-c' package exists
-]
-
 messages: [
   "The Frama-C/Wp now uses Why-3 for all provers (Cf. deprecated -wp-prover native:alt-ergo)"
   {alt-ergo:installed}
-  "The Frama-C/Wp native support for Coq is now deprecated (use TIP or Why-3 instead)."
+  "The Frama-C/Wp native support for Coq is deprecated and only activated with Coq.8.12.x (use TIP or Why-3 instead)."
   {coq:installed}
-  "WARNING: There is a known issue with OCaml 4.05.0 and ocamlfind 1.8.1 (https://github.com/ocaml/opam-repository/issues/10925) when upgrading from a previous ocamlfind. If the compilation of Frama-C fails, try downgrading ocamlfind to 1.8.0 or upgrading OCaml to > 4.05.0." { ocaml:version = "4.05.0" & ocamlfind:version = "1.8.1" }
+]
+
+post-messages: [
+  "Why3 provers setup: rm -r ~/.why3.conf ; why3 config --detect"
 ]
diff --git a/ptests/check_oracles.sh b/ptests/check_oracles.sh
index b7e8046494b93677ccc2ac9e712a2bdb577ad91d..42c418fd2926e810ae50364162fec5f43c1daf80 100755
--- a/ptests/check_oracles.sh
+++ b/ptests/check_oracles.sh
@@ -58,7 +58,7 @@ do
 
      # only report oracles in tested directories (DEFAULT_SUITES)
      for dir in $(grep DEFAULT_SUITES "tests/ptests_config" | sed 's/DEFAULT_SUITES=//'); do
-         find "tests/$dir" -name "*.oracle" | sed "s|^|${plugin_test_dir%tests}|" >> $actual_oracles
+         find "tests/$dir" -name "*.oracle" | sed "s|^|${plugin_test_dir%tests}|" | sed 's|"|\\"|g' >> $actual_oracles
      done
     )
 done
diff --git a/share/Makefile.config.in b/share/Makefile.config.in
index 6122bfa3f4c437dd88a727a972b114a9d3d64fbb..d7329f3f40e2583444d3b2bd43185ada1bd36d1b 100644
--- a/share/Makefile.config.in
+++ b/share/Makefile.config.in
@@ -98,6 +98,10 @@ DEVELOPMENT	?=@DEVELOPMENT@
 # Libraries #
 #############
 
+# ocamlgraph
+HAS_OCAMLGRAPH_2 ?= @HAS_OCAMLGRAPH_2@
+HAS_DGRAPH ?= @HAS_DGRAPH@
+
 # lablgtk
 HAS_LABLGTK	?=@HAS_LABLGTK@
 HAS_LABLGTK_CUSTOM_MODEL ?=@HAS_LABLGTK@
@@ -105,6 +109,8 @@ LABLGTK_PATH ?=@LABLGTK_PATH@
 LABLGTK ?= lablgtk@LABLGTK_VERSION@
 # lablgtksourceview
 HAS_GTKSOURCEVIEW ?=@HAS_GTKSOURCEVIEW@
+#gnomecanvas
+HAS_GNOMECANVAS ?=@HAS_GNOMECANVAS@
 
 LABLGTK_VERSION ?=@LABLGTK_VERSION@
 ifeq ("$(LABLGTK_VERSION)","3")
@@ -116,9 +122,6 @@ else
   THREAD:=
 endif
 
-# lablgnomecanvas
-HAS_GNOMECANVAS	?=@HAS_GNOMECANVAS@
-
 # apron
 HAS_APRON	?=@HAS_APRON@
 
@@ -159,11 +162,11 @@ HAVE_BUILTIN_VA_LIST ?=@HAVE_BUILTIN_VA_LIST@
 # test directories for ptests configuration
 # Non-plugin test directories containing some ML files to compile
 TEST_DIRS_AS_PLUGIN:=\
-  dynamic dynamic_plugin journal saveload spec misc syntax cil \
+  dynamic journal saveload spec misc syntax cil \
   pretty_printing builtins libc value
 
 ifeq ($(HAS_PYTHON36),yes)
-TEST_DIRS_AS_PLUGIN+= fc_script jcdb
+TEST_DIRS_AS_PLUGIN+= compliance fc_script jcdb
 endif
 
 PLUGIN_TESTS_LIST+=$(TEST_DIRS_AS_PLUGIN)
@@ -201,8 +204,17 @@ endif
 
 ifneq ($(ENABLE_GUI),no)
   LIBRARY_NAMES_GUI = $(LABLGTK) $(GTKSOURCEVIEW)
-  ifeq ($(HAS_GNOMECANVAS),yes)
-    LIBRARY_NAMES_GUI+=lablgtk2.gnomecanvas ocamlgraph.dgraph
+  ifeq ($(HAS_OCAMLGRAPH_2),yes)
+    ifeq ($(HAS_DGRAPH),yes)
+      LIBRARY_NAMES_GUI+=ocamlgraph_gtk
+    endif
+  else
+    ifeq ($(HAS_GNOMECANVAS),yes)
+      LIBRARY_NAMES_GUI+=lablgtk2.gnomecanvas
+      GRAPH_GUICMO= dgraph.cmo
+      GRAPH_GUICMX= dgraph.cmx
+      GRAPH_GUIO= dgraph.o
+    endif
   endif
 else
 LIBRARY_NAMES_GUI =
diff --git a/share/analysis-scripts/analysis.mk b/share/analysis-scripts/analysis.mk
index 068fe3b20cfa6afee747a2382882ac4b6a0a3a72..07bcf42f649be6868296faa913b8aaa052716515 100644
--- a/share/analysis-scripts/analysis.mk
+++ b/share/analysis-scripts/analysis.mk
@@ -84,7 +84,7 @@ else
   SED_UNBUFFERED:=sed --unbuffered
 ifneq (,$(wildcard /usr/bin/time))
 define time_with_output
-  /usr/bin/time --format='user_time=%U\nmemory=%M' --output="$(1)"
+  /usr/bin/time -f 'user_time=%U\nmemory=%M' -o "$(1)"
 endef
 else
 define time_with_output
@@ -96,9 +96,13 @@ endif
 # --- Utilities ---
 
 define display_command =
-  $(info )
-  $(info $(shell tput setaf 4)Command: $(1)$(shell tput sgr0))
-  $(info )
+  @{
+    echo '';
+    [ -t 1 ] && tput setaf 4;
+    echo "Command: $(strip $(1))";
+    [ -t 1 ] && tput sgr0;
+    echo '';
+  }
 endef
 
 empty :=
@@ -118,7 +122,7 @@ EVAFLAGS   ?= \
   -eva-print-callstacks -eva-warn-key alarm=inactive \
   -no-deps-print -no-calldeps-print \
   -eva-warn-key garbled-mix \
-  -calldeps -permissive -from-verbose 0 \
+  -calldeps -from-verbose 0 \
   $(if $(EVABUILTINS), -eva-builtin=$(call fc_list,$(EVABUILTINS)),) \
   $(if $(EVAUSESPECS), -eva-use-spec $(call fc_list,$(EVAUSESPECS)),)
 FCFLAGS    ?=
@@ -143,7 +147,7 @@ clean-backups:
 
 HR_TIMESTAMP := $(shell date +"%H:%M:%S %d/%m/%Y")# Human readable
 DIR          := $(dir $(lastword $(MAKEFILE_LIST)))
-SHELL        := /bin/bash
+SHELL        := $(shell which bash)
 .SHELLFLAGS  := -eu -o pipefail -c
 
 .ONESHELL:
diff --git a/share/analysis-scripts/make_template.py b/share/analysis-scripts/make_template.py
index 92f01b85dffae6dab5f01c1423d94fd58045961b..e0fca52e556c7096971a8dac30f6ce03acb4b15e 100755
--- a/share/analysis-scripts/make_template.py
+++ b/share/analysis-scripts/make_template.py
@@ -226,7 +226,7 @@ with open(sharedir / "analysis-scripts" / "template.mk") as f:
     if json_compilation_database:
       lines = insert_line_after(lines, "^FCFLAGS", f"  -json-compilation-database {json_compilation_database} \\\n")
     if relprefix != "..":
-        lines = replace_line(lines, "^  -add-symbolic-path=.:.. \\\\", f"  -add-symbolic-path=.:{relprefix} \\\n", all_occurrences=True)
+        lines = replace_line(lines, "^  -add-symbolic-path=..:. \\\\", f"  -add-symbolic-path={relprefix}:. \\\n", all_occurrences=True)
 
 gnumakefile.write_text("".join(lines))
 
diff --git a/share/analysis-scripts/make_wrapper.py b/share/analysis-scripts/make_wrapper.py
index ed72df096223334ce385db07fc050376f49d21b6..07c314b9d8a8679b51f13c03973d15e36091395e 100755
--- a/share/analysis-scripts/make_wrapper.py
+++ b/share/analysis-scripts/make_wrapper.py
@@ -32,6 +32,7 @@ import re
 import subprocess
 import sys
 from functools import partial
+import tempfile
 
 MIN_PYTHON = (3, 6) # for automatic Path conversions
 if sys.version_info < MIN_PYTHON:
@@ -40,7 +41,7 @@ if sys.version_info < MIN_PYTHON:
 parser = argparse.ArgumentParser(description="""
 Builds the specified target, parsing the output to identify and recommend
 actions in case of failure.""")
-parser.add_argument('--make-dir', metavar='DIR', default=".frama-c", nargs=1,
+parser.add_argument('--make-dir', metavar='DIR', default=".frama-c",
                     help='directory containing the makefile (default: .frama-c)')
 
 (make_dir_arg, args) = parser.parse_known_args()
@@ -52,10 +53,19 @@ if not framac_bin:
    sys.exit("error: FRAMAC_BIN not in environment (set by frama-c-script)")
 framac_script = f"{framac_bin}/frama-c-script"
 
-out = subprocess.Popen(['make', "-C", make_dir] + args,
-                       stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
-
-output = out.communicate()[0].decode('utf-8')
+output_lines = []
+cmd_list = ['make', "-C", make_dir] + args
+with subprocess.Popen(cmd_list,
+                      stdout=subprocess.PIPE,
+                      stderr=subprocess.PIPE) as proc:
+  while True:
+    line = proc.stdout.readline()
+    if line:
+       sys.stdout.buffer.write(line)
+       sys.stdout.flush()
+       output_lines.append(line.decode('utf-8'))
+    else:
+       break
 
 re_missing_spec = re.compile("Neither code nor specification for function ([^,]+),")
 re_recursive_call_start = re.compile("detected recursive call")
@@ -63,9 +73,8 @@ re_recursive_call_end = re.compile("Use -eva-ignore-recursive-calls to ignore")
 
 tips = []
 
-lines = iter(output.splitlines())
+lines = iter(output_lines)
 for line in lines:
-    print(line)
     match = re_missing_spec.search(line)
     if match:
        fname = match.group(1)
diff --git a/share/analysis-scripts/template.mk b/share/analysis-scripts/template.mk
index edeb8cbd3b1106c5eb1f3aad2fe03285e70ae8cc..caaee20f0d9aa3db2bad843121689acf99e3a48f 100644
--- a/share/analysis-scripts/template.mk
+++ b/share/analysis-scripts/template.mk
@@ -19,7 +19,7 @@ CPPFLAGS    += \
 
 ## General flags
 FCFLAGS     += \
-  -add-symbolic-path=.:.. \
+  -add-symbolic-path=..:. \
   -kernel-warn-key annot:missing-spec=abort \
   -kernel-warn-key typing:implicit-function-declaration=abort \
 
@@ -29,7 +29,6 @@ EVAFLAGS    += \
 
 ## GUI-only flags
 FCGUIFLAGS += \
-  -add-symbolic-path=.:.. \
 
 ## Analysis targets (suffixed with .eva)
 TARGETS = main.eva
diff --git a/share/compliance/c11_functions.json b/share/compliance/c11_functions.json
index 1ec844c35e497dc756f763aa49b8383e23055b27..2f7d18b10365d5a192c1aad54c37acd9433ca51b 100644
--- a/share/compliance/c11_functions.json
+++ b/share/compliance/c11_functions.json
@@ -1,605 +1,610 @@
 {
     "description": "C11 reserved function identifiers",
+    "notes": {
+        "description": "The 'notes' field is a list of characteristics related to CWEs or that may affect the 'difficulty' of analyzing such functions with Frama-C. Each note is succintly described below.",
+        "variadic":"Variadic function, OR having an argument of type va_list.",
+        "safer-alts":"A list of recommended alternatives for functions considered unsafe (CWE-242, CWE-477, CWE-676)."
+    },
     "source":"ISO/IEC 9899:2011",
-    "data":[
-        {"ident":"abort", "header":"stdlib.h"},
-        {"ident":"abort_handler_s", "header":"stdlib.h"},
-        {"ident":"abs", "header":"stdlib.h"},
-        {"ident":"acos", "header":"math.h"},
-        {"ident":"acosf", "header":"math.h"},
-        {"ident":"acosh", "header":"math.h"},
-        {"ident":"acoshf", "header":"math.h"},
-        {"ident":"acoshl", "header":"math.h"},
-        {"ident":"acosl", "header":"math.h"},
-        {"ident":"aligned_alloc", "header":"stdlib.h"},
-        {"ident":"asctime", "header":"time.h"},
-        {"ident":"asctime_s", "header":"time.h"},
-        {"ident":"asin", "header":"math.h"},
-        {"ident":"asinf", "header":"math.h"},
-        {"ident":"asinh", "header":"math.h"},
-        {"ident":"asinhf", "header":"math.h"},
-        {"ident":"asinhl", "header":"math.h"},
-        {"ident":"asinl", "header":"math.h"},
-        {"ident":"at_quick_exit", "header":"stdlib.h"},
-        {"ident":"atan", "header":"math.h"},
-        {"ident":"atan2", "header":"math.h"},
-        {"ident":"atan2f", "header":"math.h"},
-        {"ident":"atanf", "header":"math.h"},
-        {"ident":"atanh", "header":"math.h"},
-        {"ident":"atanhf", "header":"math.h"},
-        {"ident":"atanhl", "header":"math.h"},
-        {"ident":"atanl", "header":"math.h"},
-        {"ident":"atexit", "header":"stdlib.h"},
-        {"ident":"atof", "header":"stdlib.h"},
-        {"ident":"atoi", "header":"stdlib.h"},
-        {"ident":"atol", "header":"stdlib.h"},
-        {"ident":"atoll", "header":"stdlib.h"},
-        {"ident":"atomic_compare_exchange_strong", "header":"stdatomic.h"},
-        {"ident":"atomic_compare_exchange_strong_explicit", "header":"stdatomic.h"},
-        {"ident":"atomic_compare_exchange_weak", "header":"stdatomic.h"},
-        {"ident":"atomic_compare_exchange_weak_explicit", "header":"stdatomic.h"},
-        {"ident":"atomic_exchange", "header":"stdatomic.h"},
-        {"ident":"atomic_exchange_explicit", "header":"stdatomic.h"},
-        {"ident":"atomic_fetch_key", "header":"stdatomic.h"},
-        {"ident":"atomic_fetch_key_explicit", "header":"stdatomic.h"},
-        {"ident":"atomic_flag_clear", "header":"stdatomic.h"},
-        {"ident":"atomic_flag_clear_explicit", "header":"stdatomic.h"},
-        {"ident":"atomic_flag_test_and_set", "header":"stdatomic.h"},
-        {"ident":"atomic_flag_test_and_set_explicit", "header":"stdatomic.h"},
-        {"ident":"atomic_init", "header":"stdatomic.h"},
-        {"ident":"atomic_is_lock_free", "header":"stdatomic.h"},
-        {"ident":"atomic_load", "header":"stdatomic.h"},
-        {"ident":"atomic_load_explicit", "header":"stdatomic.h"},
-        {"ident":"atomic_signal_fence", "header":"stdatomic.h"},
-        {"ident":"atomic_store", "header":"stdatomic.h"},
-        {"ident":"atomic_store_explicit", "header":"stdatomic.h"},
-        {"ident":"atomic_thread_fence", "header":"stdatomic.h"},
-        {"ident":"bsearch", "header":"stdlib.h"},
-        {"ident":"bsearch_s", "header":"stdlib.h"},
-        {"ident":"btowc", "header":"wchar.h"},
-        {"ident":"c16rtomb", "header":"uchar.h"},
-        {"ident":"c32rtomb", "header":"uchar.h"},
-        {"ident":"cabs", "header":"complex.h"},
-        {"ident":"cabsf", "header":"complex.h"},
-        {"ident":"cabsl", "header":"complex.h"},
-        {"ident":"cacos", "header":"complex.h"},
-        {"ident":"cacosf", "header":"complex.h"},
-        {"ident":"cacosh", "header":"complex.h"},
-        {"ident":"cacoshf", "header":"complex.h"},
-        {"ident":"cacoshl", "header":"complex.h"},
-        {"ident":"cacosl", "header":"complex.h"},
-        {"ident":"call_once", "header":"threads.h"},
-        {"ident":"calloc", "header":"stdlib.h"},
-        {"ident":"carg", "header":"complex.h"},
-        {"ident":"cargf", "header":"complex.h"},
-        {"ident":"cargl", "header":"complex.h"},
-        {"ident":"casin", "header":"complex.h"},
-        {"ident":"casinf", "header":"complex.h"},
-        {"ident":"casinh", "header":"complex.h"},
-        {"ident":"casinhf", "header":"complex.h"},
-        {"ident":"casinhl", "header":"complex.h"},
-        {"ident":"casinl", "header":"complex.h"},
-        {"ident":"catan", "header":"complex.h"},
-        {"ident":"catanf", "header":"complex.h"},
-        {"ident":"catanh", "header":"complex.h"},
-        {"ident":"catanhf", "header":"complex.h"},
-        {"ident":"catanhl", "header":"complex.h"},
-        {"ident":"catanl", "header":"complex.h"},
-        {"ident":"cbrt", "header":"math.h"},
-        {"ident":"cbrtf", "header":"math.h"},
-        {"ident":"cbrtl", "header":"math.h"},
-        {"ident":"ccos", "header":"complex.h"},
-        {"ident":"ccosf", "header":"complex.h"},
-        {"ident":"ccosh", "header":"complex.h"},
-        {"ident":"ccoshf", "header":"complex.h"},
-        {"ident":"ccoshl", "header":"complex.h"},
-        {"ident":"ccosl", "header":"complex.h"},
-        {"ident":"ceil", "header":"math.h"},
-        {"ident":"ceilf", "header":"math.h"},
-        {"ident":"ceill", "header":"math.h"},
-        {"ident":"cexp", "header":"complex.h"},
-        {"ident":"cexpf", "header":"complex.h"},
-        {"ident":"cexpl", "header":"complex.h"},
-        {"ident":"cimag", "header":"complex.h"},
-        {"ident":"cimagf", "header":"complex.h"},
-        {"ident":"cimagl", "header":"complex.h"},
-        {"ident":"clearerr", "header":"stdio.h"},
-        {"ident":"clock", "header":"time.h"},
-        {"ident":"clog", "header":"complex.h"},
-        {"ident":"clogf", "header":"complex.h"},
-        {"ident":"clogl", "header":"complex.h"},
-        {"ident":"cnd_broadcast", "header":"threads.h"},
-        {"ident":"cnd_destroy", "header":"threads.h"},
-        {"ident":"cnd_init", "header":"threads.h"},
-        {"ident":"cnd_signal", "header":"threads.h"},
-        {"ident":"cnd_timedwait", "header":"threads.h"},
-        {"ident":"cnd_wait", "header":"threads.h"},
-        {"ident":"conj", "header":"complex.h"},
-        {"ident":"conjf", "header":"complex.h"},
-        {"ident":"conjl", "header":"complex.h"},
-        {"ident":"copysign", "header":"math.h"},
-        {"ident":"copysignf", "header":"math.h"},
-        {"ident":"copysignl", "header":"math.h"},
-        {"ident":"cos", "header":"math.h"},
-        {"ident":"cosf", "header":"math.h"},
-        {"ident":"cosh", "header":"math.h"},
-        {"ident":"coshf", "header":"math.h"},
-        {"ident":"coshl", "header":"math.h"},
-        {"ident":"cosl", "header":"math.h"},
-        {"ident":"cpow", "header":"complex.h"},
-        {"ident":"cpowf", "header":"complex.h"},
-        {"ident":"cpowl", "header":"complex.h"},
-        {"ident":"cproj", "header":"complex.h"},
-        {"ident":"cprojf", "header":"complex.h"},
-        {"ident":"cprojl", "header":"complex.h"},
-        {"ident":"creal", "header":"complex.h"},
-        {"ident":"crealf", "header":"complex.h"},
-        {"ident":"creall", "header":"complex.h"},
-        {"ident":"csin", "header":"complex.h"},
-        {"ident":"csinf", "header":"complex.h"},
-        {"ident":"csinh", "header":"complex.h"},
-        {"ident":"csinhf", "header":"complex.h"},
-        {"ident":"csinhl", "header":"complex.h"},
-        {"ident":"csinl", "header":"complex.h"},
-        {"ident":"csqrt", "header":"complex.h"},
-        {"ident":"csqrtf", "header":"complex.h"},
-        {"ident":"csqrtl", "header":"complex.h"},
-        {"ident":"ctan", "header":"complex.h"},
-        {"ident":"ctanf", "header":"complex.h"},
-        {"ident":"ctanh", "header":"complex.h"},
-        {"ident":"ctanhf", "header":"complex.h"},
-        {"ident":"ctanhl", "header":"complex.h"},
-        {"ident":"ctanl", "header":"complex.h"},
-        {"ident":"ctime", "header":"time.h"},
-        {"ident":"ctime_s", "header":"time.h"},
-        {"ident":"difftime", "header":"time.h"},
-        {"ident":"div", "header":"stdlib.h"},
-        {"ident":"erf", "header":"math.h"},
-        {"ident":"erfc", "header":"math.h"},
-        {"ident":"erfcf", "header":"math.h"},
-        {"ident":"erfcl", "header":"math.h"},
-        {"ident":"erff", "header":"math.h"},
-        {"ident":"erfl", "header":"math.h"},
-        {"ident":"exit", "header":"stdlib.h"},
-        {"ident":"exp", "header":"math.h"},
-        {"ident":"exp2", "header":"math.h"},
-        {"ident":"exp2f", "header":"math.h"},
-        {"ident":"exp2l", "header":"math.h"},
-        {"ident":"expf", "header":"math.h"},
-        {"ident":"expl", "header":"math.h"},
-        {"ident":"expm1", "header":"math.h"},
-        {"ident":"expm1f", "header":"math.h"},
-        {"ident":"expm1l", "header":"math.h"},
-        {"ident":"fabs", "header":"math.h"},
-        {"ident":"fabsf", "header":"math.h"},
-        {"ident":"fabsl", "header":"math.h"},
-        {"ident":"fclose", "header":"stdio.h"},
-        {"ident":"fdim", "header":"math.h"},
-        {"ident":"fdimf", "header":"math.h"},
-        {"ident":"fdiml", "header":"math.h"},
-        {"ident":"feclearexcept", "header":"fenv.h"},
-        {"ident":"fegetenv", "header":"fenv.h"},
-        {"ident":"fegetexceptflag", "header":"fenv.h"},
-        {"ident":"fegetround", "header":"fenv.h"},
-        {"ident":"feholdexcept", "header":"fenv.h"},
-        {"ident":"feof", "header":"stdio.h"},
-        {"ident":"feraiseexcept", "header":"fenv.h"},
-        {"ident":"ferror", "header":"stdio.h"},
-        {"ident":"fesetenv", "header":"fenv.h"},
-        {"ident":"fesetexceptflag", "header":"fenv.h"},
-        {"ident":"fesetround", "header":"fenv.h"},
-        {"ident":"fetestexcept", "header":"fenv.h"},
-        {"ident":"feupdateenv", "header":"fenv.h"},
-        {"ident":"fflush", "header":"stdio.h"},
-        {"ident":"fgetc", "header":"stdio.h"},
-        {"ident":"fgetpos", "header":"stdio.h"},
-        {"ident":"fgets", "header":"stdio.h"},
-        {"ident":"fgetwc", "header":"wchar.h"},
-        {"ident":"fgetws", "header":"wchar.h"},
-        {"ident":"floor", "header":"math.h"},
-        {"ident":"floorf", "header":"math.h"},
-        {"ident":"floorl", "header":"math.h"},
-        {"ident":"fma", "header":"math.h"},
-        {"ident":"fmaf", "header":"math.h"},
-        {"ident":"fmal", "header":"math.h"},
-        {"ident":"fmax", "header":"math.h"},
-        {"ident":"fmaxf", "header":"math.h"},
-        {"ident":"fmaxl", "header":"math.h"},
-        {"ident":"fmin", "header":"math.h"},
-        {"ident":"fminf", "header":"math.h"},
-        {"ident":"fminl", "header":"math.h"},
-        {"ident":"fmod", "header":"math.h"},
-        {"ident":"fmodf", "header":"math.h"},
-        {"ident":"fmodl", "header":"math.h"},
-        {"ident":"fopen", "header":"stdio.h"},
-        {"ident":"fopen_s", "header":"stdio.h"},
-        {"ident":"fpclassify", "header":"math.h"},
-        {"ident":"fprintf", "header":"stdio.h"},
-        {"ident":"fprintf_s", "header":"stdio.h"},
-        {"ident":"fputc", "header":"stdio.h"},
-        {"ident":"fputs", "header":"stdio.h"},
-        {"ident":"fputwc", "header":"wchar.h"},
-        {"ident":"fputws", "header":"wchar.h"},
-        {"ident":"fread", "header":"stdio.h"},
-        {"ident":"free", "header":"stdlib.h"},
-        {"ident":"freopen", "header":"stdio.h"},
-        {"ident":"freopen_s", "header":"stdio.h"},
-        {"ident":"frexp", "header":"math.h"},
-        {"ident":"frexpf", "header":"math.h"},
-        {"ident":"frexpl", "header":"math.h"},
-        {"ident":"fscanf", "header":"stdio.h"},
-        {"ident":"fscanf_s", "header":"stdio.h"},
-        {"ident":"fseek", "header":"stdio.h"},
-        {"ident":"fsetpos", "header":"stdio.h"},
-        {"ident":"ftell", "header":"stdio.h"},
-        {"ident":"fwide", "header":"wchar.h"},
-        {"ident":"fwprintf", "header":"wchar.h"},
-        {"ident":"fwprintf_s", "header":"wchar.h"},
-        {"ident":"fwrite", "header":"stdio.h"},
-        {"ident":"fwscanf", "header":"wchar.h"},
-        {"ident":"fwscanf_s", "header":"wchar.h"},
-        {"ident":"getc", "header":"stdio.h"},
-        {"ident":"getchar", "header":"stdio.h"},
-        {"ident":"getenv", "header":"stdlib.h"},
-        {"ident":"getenv_s", "header":"stdlib.h"},
-        {"ident":"gets_s", "header":"stdio.h"},
-        {"ident":"getwc", "header":"wchar.h"},
-        {"ident":"getwchar", "header":"wchar.h"},
-        {"ident":"gmtime", "header":"time.h"},
-        {"ident":"gmtime_s", "header":"time.h"},
-        {"ident":"hypot", "header":"math.h"},
-        {"ident":"hypotf", "header":"math.h"},
-        {"ident":"hypotl", "header":"math.h"},
-        {"ident":"ignore_handler_s", "header":"stdlib.h"},
-        {"ident":"ilogb", "header":"math.h"},
-        {"ident":"ilogbf", "header":"math.h"},
-        {"ident":"ilogbl", "header":"math.h"},
-        {"ident":"imaxabs", "header":"inttypes.h"},
-        {"ident":"imaxdiv", "header":"inttypes.h"},
-        {"ident":"isalnum", "header":"ctype.h"},
-        {"ident":"isalpha", "header":"ctype.h"},
-        {"ident":"isblank", "header":"ctype.h"},
-        {"ident":"iscntrl", "header":"ctype.h"},
-        {"ident":"isdigit", "header":"ctype.h"},
-        {"ident":"isfinite", "header":"math.h"},
-        {"ident":"isgraph", "header":"ctype.h"},
-        {"ident":"isgreater", "header":"math.h"},
-        {"ident":"isgreaterequal", "header":"math.h"},
-        {"ident":"isinf", "header":"math.h"},
-        {"ident":"isless", "header":"math.h"},
-        {"ident":"islessequal", "header":"math.h"},
-        {"ident":"islessgreater", "header":"math.h"},
-        {"ident":"islower", "header":"ctype.h"},
-        {"ident":"isnan", "header":"math.h"},
-        {"ident":"isnormal", "header":"math.h"},
-        {"ident":"isprint", "header":"ctype.h"},
-        {"ident":"ispunct", "header":"ctype.h"},
-        {"ident":"isspace", "header":"ctype.h"},
-        {"ident":"isunordered", "header":"math.h"},
-        {"ident":"isupper", "header":"ctype.h"},
-        {"ident":"iswalnum", "header":"wctype.h"},
-        {"ident":"iswalpha", "header":"wctype.h"},
-        {"ident":"iswblank", "header":"wctype.h"},
-        {"ident":"iswcntrl", "header":"wctype.h"},
-        {"ident":"iswctype", "header":"wctype.h"},
-        {"ident":"iswdigit", "header":"wctype.h"},
-        {"ident":"iswgraph", "header":"wctype.h"},
-        {"ident":"iswlower", "header":"wctype.h"},
-        {"ident":"iswprint", "header":"wctype.h"},
-        {"ident":"iswpunct", "header":"wctype.h"},
-        {"ident":"iswspace", "header":"wctype.h"},
-        {"ident":"iswupper", "header":"wctype.h"},
-        {"ident":"iswxdigit", "header":"wctype.h"},
-        {"ident":"isxdigit", "header":"ctype.h"},
-        {"ident":"kill_dependency", "header":"stdatomic.h"},
-        {"ident":"labs", "header":"stdlib.h"},
-        {"ident":"ldexp", "header":"math.h"},
-        {"ident":"ldexpf", "header":"math.h"},
-        {"ident":"ldexpl", "header":"math.h"},
-        {"ident":"ldiv", "header":"stdlib.h"},
-        {"ident":"lgamma", "header":"math.h"},
-        {"ident":"lgammaf", "header":"math.h"},
-        {"ident":"lgammal", "header":"math.h"},
-        {"ident":"llabs", "header":"stdlib.h"},
-        {"ident":"lldiv", "header":"stdlib.h"},
-        {"ident":"llrint", "header":"math.h"},
-        {"ident":"llrintf", "header":"math.h"},
-        {"ident":"llrintl", "header":"math.h"},
-        {"ident":"llround", "header":"math.h"},
-        {"ident":"llroundf", "header":"math.h"},
-        {"ident":"llroundl", "header":"math.h"},
-        {"ident":"localeconv", "header":"locale.h"},
-        {"ident":"localtime", "header":"time.h"},
-        {"ident":"localtime_s", "header":"time.h"},
-        {"ident":"log", "header":"math.h"},
-        {"ident":"log10", "header":"math.h"},
-        {"ident":"log10f", "header":"math.h"},
-        {"ident":"log10l", "header":"math.h"},
-        {"ident":"log1p", "header":"math.h"},
-        {"ident":"log1pf", "header":"math.h"},
-        {"ident":"log1pl", "header":"math.h"},
-        {"ident":"log2", "header":"math.h"},
-        {"ident":"log2f", "header":"math.h"},
-        {"ident":"log2l", "header":"math.h"},
-        {"ident":"logb", "header":"math.h"},
-        {"ident":"logbf", "header":"math.h"},
-        {"ident":"logbl", "header":"math.h"},
-        {"ident":"logf", "header":"math.h"},
-        {"ident":"logl", "header":"math.h"},
-        {"ident":"longjmp", "header":"setjmp.h"},
-        {"ident":"lrint", "header":"math.h"},
-        {"ident":"lrintf", "header":"math.h"},
-        {"ident":"lrintl", "header":"math.h"},
-        {"ident":"lround", "header":"math.h"},
-        {"ident":"lroundf", "header":"math.h"},
-        {"ident":"lroundl", "header":"math.h"},
-        {"ident":"malloc", "header":"stdlib.h"},
-        {"ident":"mblen", "header":"stdlib.h"},
-        {"ident":"mbrlen", "header":"wchar.h"},
-        {"ident":"mbrtoc16", "header":"uchar.h"},
-        {"ident":"mbrtoc32", "header":"uchar.h"},
-        {"ident":"mbrtowc", "header":"wchar.h"},
-        {"ident":"mbsinit", "header":"wchar.h"},
-        {"ident":"mbsrtowcs", "header":"wchar.h"},
-        {"ident":"mbsrtowcs_s", "header":"wchar.h"},
-        {"ident":"mbstowcs", "header":"stdlib.h"},
-        {"ident":"mbstowcs_s", "header":"stdlib.h"},
-        {"ident":"mbtowc", "header":"stdlib.h"},
-        {"ident":"memchr", "header":"string.h"},
-        {"ident":"memcmp", "header":"string.h"},
-        {"ident":"memcpy", "header":"string.h"},
-        {"ident":"memcpy_s", "header":"string.h"},
-        {"ident":"memmove", "header":"string.h"},
-        {"ident":"memmove_s", "header":"string.h"},
-        {"ident":"memset", "header":"string.h"},
-        {"ident":"memset_s", "header":"string.h"},
-        {"ident":"mktime", "header":"time.h"},
-        {"ident":"modf", "header":"math.h"},
-        {"ident":"modff", "header":"math.h"},
-        {"ident":"modfl", "header":"math.h"},
-        {"ident":"mtx_destroy", "header":"threads.h"},
-        {"ident":"mtx_init", "header":"threads.h"},
-        {"ident":"mtx_lock", "header":"threads.h"},
-        {"ident":"mtx_timedlock", "header":"threads.h"},
-        {"ident":"mtx_trylock", "header":"threads.h"},
-        {"ident":"mtx_unlock", "header":"threads.h"},
-        {"ident":"nan", "header":"math.h"},
-        {"ident":"nanf", "header":"math.h"},
-        {"ident":"nanl", "header":"math.h"},
-        {"ident":"nearbyint", "header":"math.h"},
-        {"ident":"nearbyintf", "header":"math.h"},
-        {"ident":"nearbyintl", "header":"math.h"},
-        {"ident":"nextafter", "header":"math.h"},
-        {"ident":"nextafterf", "header":"math.h"},
-        {"ident":"nextafterl", "header":"math.h"},
-        {"ident":"nexttoward", "header":"math.h"},
-        {"ident":"nexttowardf", "header":"math.h"},
-        {"ident":"nexttowardl", "header":"math.h"},
-        {"ident":"perror", "header":"stdio.h"},
-        {"ident":"pow", "header":"math.h"},
-        {"ident":"powf", "header":"math.h"},
-        {"ident":"powl", "header":"math.h"},
-        {"ident":"printf", "header":"stdio.h"},
-        {"ident":"printf_s", "header":"stdio.h"},
-        {"ident":"putc", "header":"stdio.h"},
-        {"ident":"putchar", "header":"stdio.h"},
-        {"ident":"puts", "header":"stdio.h"},
-        {"ident":"putwc", "header":"wchar.h"},
-        {"ident":"putwchar", "header":"wchar.h"},
-        {"ident":"qsort", "header":"stdlib.h"},
-        {"ident":"qsort_s", "header":"stdlib.h"},
-        {"ident":"quick_exit", "header":"stdlib.h"},
-        {"ident":"raise", "header":"signal.h"},
-        {"ident":"rand", "header":"stdlib.h"},
-        {"ident":"realloc", "header":"stdlib.h"},
-        {"ident":"remainder", "header":"math.h"},
-        {"ident":"remainderf", "header":"math.h"},
-        {"ident":"remainderl", "header":"math.h"},
-        {"ident":"remove", "header":"stdio.h"},
-        {"ident":"remquo", "header":"math.h"},
-        {"ident":"remquof", "header":"math.h"},
-        {"ident":"remquol", "header":"math.h"},
-        {"ident":"rename", "header":"stdio.h"},
-        {"ident":"rewind", "header":"stdio.h"},
-        {"ident":"rint", "header":"math.h"},
-        {"ident":"rintf", "header":"math.h"},
-        {"ident":"rintl", "header":"math.h"},
-        {"ident":"round", "header":"math.h"},
-        {"ident":"roundf", "header":"math.h"},
-        {"ident":"roundl", "header":"math.h"},
-        {"ident":"scalbln", "header":"math.h"},
-        {"ident":"scalblnf", "header":"math.h"},
-        {"ident":"scalblnl", "header":"math.h"},
-        {"ident":"scalbn", "header":"math.h"},
-        {"ident":"scalbnf", "header":"math.h"},
-        {"ident":"scalbnl", "header":"math.h"},
-        {"ident":"scanf", "header":"stdio.h"},
-        {"ident":"scanf_s", "header":"stdio.h"},
-        {"ident":"set_constraint_handler_s", "header":"stdlib.h"},
-        {"ident":"setbuf", "header":"stdio.h"},
-        {"ident":"setjmp", "header":"setjmp.h"},
-        {"ident":"setlocale", "header":"locale.h"},
-        {"ident":"setvbuf", "header":"stdio.h"},
-        {"ident":"signal", "header":"signal.h"},
-        {"ident":"signbit", "header":"math.h"},
-        {"ident":"sin", "header":"math.h"},
-        {"ident":"sinf", "header":"math.h"},
-        {"ident":"sinh", "header":"math.h"},
-        {"ident":"sinhf", "header":"math.h"},
-        {"ident":"sinhl", "header":"math.h"},
-        {"ident":"sinl", "header":"math.h"},
-        {"ident":"snprintf", "header":"stdio.h"},
-        {"ident":"snprintf_s", "header":"stdio.h"},
-        {"ident":"snwprintf_s", "header":"wchar.h"},
-        {"ident":"sprintf", "header":"stdio.h"},
-        {"ident":"sprintf_s", "header":"stdio.h"},
-        {"ident":"sqrt", "header":"math.h"},
-        {"ident":"sqrtf", "header":"math.h"},
-        {"ident":"sqrtl", "header":"math.h"},
-        {"ident":"srand", "header":"stdlib.h"},
-        {"ident":"sscanf", "header":"stdio.h"},
-        {"ident":"sscanf_s", "header":"stdio.h"},
-        {"ident":"strcat", "header":"string.h"},
-        {"ident":"strcat_s", "header":"string.h"},
-        {"ident":"strchr", "header":"string.h"},
-        {"ident":"strcmp", "header":"string.h"},
-        {"ident":"strcoll", "header":"string.h"},
-        {"ident":"strcpy", "header":"string.h"},
-        {"ident":"strcpy_s", "header":"string.h"},
-        {"ident":"strcspn", "header":"string.h"},
-        {"ident":"strerror", "header":"string.h"},
-        {"ident":"strerror_s", "header":"string.h"},
-        {"ident":"strerrorlen_s", "header":"string.h"},
-        {"ident":"strftime", "header":"time.h"},
-        {"ident":"strlen", "header":"string.h"},
-        {"ident":"strncat", "header":"string.h"},
-        {"ident":"strncat_s", "header":"string.h"},
-        {"ident":"strncmp", "header":"string.h"},
-        {"ident":"strncpy", "header":"string.h"},
-        {"ident":"strncpy_s", "header":"string.h"},
-        {"ident":"strnlen_s", "header":"string.h"},
-        {"ident":"strpbrk", "header":"string.h"},
-        {"ident":"strrchr", "header":"string.h"},
-        {"ident":"strspn", "header":"string.h"},
-        {"ident":"strstr", "header":"string.h"},
-        {"ident":"strtod", "header":"stdlib.h"},
-        {"ident":"strtof", "header":"stdlib.h"},
-        {"ident":"strtoimax", "header":"inttypes.h"},
-        {"ident":"strtok", "header":"string.h"},
-        {"ident":"strtok_s", "header":"string.h"},
-        {"ident":"strtol", "header":"stdlib.h"},
-        {"ident":"strtold", "header":"stdlib.h"},
-        {"ident":"strtoll", "header":"stdlib.h"},
-        {"ident":"strtoul", "header":"stdlib.h"},
-        {"ident":"strtoull", "header":"stdlib.h"},
-        {"ident":"strtoumax", "header":"inttypes.h"},
-        {"ident":"strxfrm", "header":"string.h"},
-        {"ident":"swprintf", "header":"wchar.h"},
-        {"ident":"swprintf_s", "header":"wchar.h"},
-        {"ident":"swscanf", "header":"wchar.h"},
-        {"ident":"swscanf_s", "header":"wchar.h"},
-        {"ident":"system", "header":"stdlib.h"},
-        {"ident":"tan", "header":"math.h"},
-        {"ident":"tanf", "header":"math.h"},
-        {"ident":"tanh", "header":"math.h"},
-        {"ident":"tanhf", "header":"math.h"},
-        {"ident":"tanhl", "header":"math.h"},
-        {"ident":"tanl", "header":"math.h"},
-        {"ident":"tgamma", "header":"math.h"},
-        {"ident":"tgammaf", "header":"math.h"},
-        {"ident":"tgammal", "header":"math.h"},
-        {"ident":"thrd_create", "header":"threads.h"},
-        {"ident":"thrd_current", "header":"threads.h"},
-        {"ident":"thrd_detach", "header":"threads.h"},
-        {"ident":"thrd_equal", "header":"threads.h"},
-        {"ident":"thrd_exit", "header":"threads.h"},
-        {"ident":"thrd_join", "header":"threads.h"},
-        {"ident":"thrd_sleep", "header":"threads.h"},
-        {"ident":"thrd_yield", "header":"threads.h"},
-        {"ident":"time", "header":"time.h"},
-        {"ident":"timespec_get", "header":"time.h"},
-        {"ident":"tmpfile", "header":"stdio.h"},
-        {"ident":"tmpfile_s", "header":"stdio.h"},
-        {"ident":"tmpnam", "header":"stdio.h"},
-        {"ident":"tmpnam_s", "header":"stdio.h"},
-        {"ident":"tolower", "header":"ctype.h"},
-        {"ident":"toupper", "header":"ctype.h"},
-        {"ident":"towctrans", "header":"wctype.h"},
-        {"ident":"towlower", "header":"wctype.h"},
-        {"ident":"towupper", "header":"wctype.h"},
-        {"ident":"trunc", "header":"math.h"},
-        {"ident":"truncf", "header":"math.h"},
-        {"ident":"truncl", "header":"math.h"},
-        {"ident":"tss_create", "header":"threads.h"},
-        {"ident":"tss_delete", "header":"threads.h"},
-        {"ident":"tss_get", "header":"threads.h"},
-        {"ident":"tss_set", "header":"threads.h"},
-        {"ident":"ungetc", "header":"stdio.h"},
-        {"ident":"ungetwc", "header":"wchar.h"},
-        {"ident":"va_arg", "header":"stdarg.h"},
-        {"ident":"va_copy", "header":"stdarg.h"},
-        {"ident":"va_end", "header":"stdarg.h"},
-        {"ident":"va_start", "header":"stdarg.h"},
-        {"ident":"vfprintf", "header":"stdio.h"},
-        {"ident":"vfprintf_s", "header":"stdio.h"},
-        {"ident":"vfscanf", "header":"stdio.h"},
-        {"ident":"vfscanf_s", "header":"stdio.h"},
-        {"ident":"vfwprintf", "header":"wchar.h"},
-        {"ident":"vfwprintf_s", "header":"wchar.h"},
-        {"ident":"vfwscanf", "header":"wchar.h"},
-        {"ident":"vfwscanf_s", "header":"wchar.h"},
-        {"ident":"vprintf", "header":"stdio.h"},
-        {"ident":"vprintf_s", "header":"stdio.h"},
-        {"ident":"vscanf", "header":"stdio.h"},
-        {"ident":"vscanf_s", "header":"stdio.h"},
-        {"ident":"vsnprintf", "header":"stdio.h"},
-        {"ident":"vsnprintf_s", "header":"stdio.h"},
-        {"ident":"vsnwprintf_s", "header":"wchar.h"},
-        {"ident":"vsprintf", "header":"stdio.h"},
-        {"ident":"vsprintf_s", "header":"stdio.h"},
-        {"ident":"vsscanf", "header":"stdio.h"},
-        {"ident":"vsscanf_s", "header":"stdio.h"},
-        {"ident":"vswprintf", "header":"wchar.h"},
-        {"ident":"vswprintf_s", "header":"wchar.h"},
-        {"ident":"vswscanf", "header":"wchar.h"},
-        {"ident":"vswscanf_s", "header":"wchar.h"},
-        {"ident":"vwprintf", "header":"wchar.h"},
-        {"ident":"vwprintf_s", "header":"wchar.h"},
-        {"ident":"vwscanf", "header":"wchar.h"},
-        {"ident":"vwscanf_s", "header":"wchar.h"},
-        {"ident":"wcrtomb", "header":"wchar.h"},
-        {"ident":"wcrtomb_s", "header":"wchar.h"},
-        {"ident":"wcscat", "header":"wchar.h"},
-        {"ident":"wcscat_s", "header":"wchar.h"},
-        {"ident":"wcschr", "header":"wchar.h"},
-        {"ident":"wcscmp", "header":"wchar.h"},
-        {"ident":"wcscoll", "header":"wchar.h"},
-        {"ident":"wcscpy", "header":"wchar.h"},
-        {"ident":"wcscpy_s", "header":"wchar.h"},
-        {"ident":"wcscspn", "header":"wchar.h"},
-        {"ident":"wcsftime", "header":"wchar.h"},
-        {"ident":"wcslen", "header":"wchar.h"},
-        {"ident":"wcsncat", "header":"wchar.h"},
-        {"ident":"wcsncat_s", "header":"wchar.h"},
-        {"ident":"wcsncmp", "header":"wchar.h"},
-        {"ident":"wcsncpy", "header":"wchar.h"},
-        {"ident":"wcsncpy_s", "header":"wchar.h"},
-        {"ident":"wcsnlen_s", "header":"wchar.h"},
-        {"ident":"wcspbrk", "header":"wchar.h"},
-        {"ident":"wcsrchr", "header":"wchar.h"},
-        {"ident":"wcsrtombs", "header":"wchar.h"},
-        {"ident":"wcsrtombs_s", "header":"wchar.h"},
-        {"ident":"wcsspn", "header":"wchar.h"},
-        {"ident":"wcsstr", "header":"wchar.h"},
-        {"ident":"wcstod", "header":"wchar.h"},
-        {"ident":"wcstof", "header":"wchar.h"},
-        {"ident":"wcstoimax", "header":"inttypes.h"},
-        {"ident":"wcstok", "header":"wchar.h"},
-        {"ident":"wcstok_s", "header":"wchar.h"},
-        {"ident":"wcstol", "header":"wchar.h"},
-        {"ident":"wcstold", "header":"wchar.h"},
-        {"ident":"wcstoll", "header":"wchar.h"},
-        {"ident":"wcstombs", "header":"stdlib.h"},
-        {"ident":"wcstombs_s", "header":"stdlib.h"},
-        {"ident":"wcstoul", "header":"wchar.h"},
-        {"ident":"wcstoull", "header":"wchar.h"},
-        {"ident":"wcstoumax", "header":"inttypes.h"},
-        {"ident":"wcsxfrm", "header":"wchar.h"},
-        {"ident":"wctob", "header":"wchar.h"},
-        {"ident":"wctomb", "header":"stdlib.h"},
-        {"ident":"wctomb_s", "header":"stdlib.h"},
-        {"ident":"wctrans", "header":"wctype.h"},
-        {"ident":"wctype", "header":"wctype.h"},
-        {"ident":"wmemchr", "header":"wchar.h"},
-        {"ident":"wmemcmp", "header":"wchar.h"},
-        {"ident":"wmemcpy", "header":"wchar.h"},
-        {"ident":"wmemcpy_s", "header":"wchar.h"},
-        {"ident":"wmemmove", "header":"wchar.h"},
-        {"ident":"wmemmove_s", "header":"wchar.h"},
-        {"ident":"wmemset", "header":"wchar.h"},
-        {"ident":"wprintf", "header":"wchar.h"},
-        {"ident":"wprintf_s", "header":"wchar.h"},
-        {"ident":"wscanf", "header":"wchar.h"},
-        {"ident":"wscanf_s", "header":"wchar.h"}
-    ]
+    "data":{
+        "abort":{"header":"stdlib.h"},
+        "abort_handler_s": {"header":"stdlib.h"},
+        "abs": {"header":"stdlib.h"},
+        "acos": {"header":"math.h"},
+        "acosf": {"header":"math.h"},
+        "acosh": {"header":"math.h"},
+        "acoshf": {"header":"math.h"},
+        "acoshl": {"header":"math.h"},
+        "acosl": {"header":"math.h"},
+        "aligned_alloc": {"header":"stdlib.h"},
+        "asctime": {"header":"time.h", "notes":{"safer-alts":["asctime_s"]}},
+        "asctime_s": {"header":"time.h"},
+        "asin": {"header":"math.h"},
+        "asinf": {"header":"math.h"},
+        "asinh": {"header":"math.h"},
+        "asinhf": {"header":"math.h"},
+        "asinhl": {"header":"math.h"},
+        "asinl": {"header":"math.h"},
+        "at_quick_exit": {"header":"stdlib.h"},
+        "atan": {"header":"math.h"},
+        "atan2": {"header":"math.h"},
+        "atan2f": {"header":"math.h"},
+        "atanf": {"header":"math.h"},
+        "atanh": {"header":"math.h"},
+        "atanhf": {"header":"math.h"},
+        "atanhl": {"header":"math.h"},
+        "atanl": {"header":"math.h"},
+        "atexit": {"header":"stdlib.h"},
+        "atof": {"header":"stdlib.h"},
+        "atoi": {"header":"stdlib.h"},
+        "atol": {"header":"stdlib.h"},
+        "atoll": {"header":"stdlib.h"},
+        "atomic_compare_exchange_strong": {"header":"stdatomic.h"},
+        "atomic_compare_exchange_strong_explicit": {"header":"stdatomic.h"},
+        "atomic_compare_exchange_weak": {"header":"stdatomic.h"},
+        "atomic_compare_exchange_weak_explicit": {"header":"stdatomic.h"},
+        "atomic_exchange": {"header":"stdatomic.h"},
+        "atomic_exchange_explicit": {"header":"stdatomic.h"},
+        "atomic_fetch_key": {"header":"stdatomic.h"},
+        "atomic_fetch_key_explicit": {"header":"stdatomic.h"},
+        "atomic_flag_clear": {"header":"stdatomic.h"},
+        "atomic_flag_clear_explicit": {"header":"stdatomic.h"},
+        "atomic_flag_test_and_set": {"header":"stdatomic.h"},
+        "atomic_flag_test_and_set_explicit": {"header":"stdatomic.h"},
+        "atomic_init": {"header":"stdatomic.h"},
+        "atomic_is_lock_free": {"header":"stdatomic.h"},
+        "atomic_load": {"header":"stdatomic.h"},
+        "atomic_load_explicit": {"header":"stdatomic.h"},
+        "atomic_signal_fence": {"header":"stdatomic.h"},
+        "atomic_store": {"header":"stdatomic.h"},
+        "atomic_store_explicit": {"header":"stdatomic.h"},
+        "atomic_thread_fence": {"header":"stdatomic.h"},
+        "bsearch": {"header":"stdlib.h", "notes":{"safer-alts":["bsearch_s"]}},
+        "bsearch_s": {"header":"stdlib.h"},
+        "btowc": {"header":"wchar.h"},
+        "c16rtomb": {"header":"uchar.h"},
+        "c32rtomb": {"header":"uchar.h"},
+        "cabs": {"header":"complex.h"},
+        "cabsf": {"header":"complex.h"},
+        "cabsl": {"header":"complex.h"},
+        "cacos": {"header":"complex.h"},
+        "cacosf": {"header":"complex.h"},
+        "cacosh": {"header":"complex.h"},
+        "cacoshf": {"header":"complex.h"},
+        "cacoshl": {"header":"complex.h"},
+        "cacosl": {"header":"complex.h"},
+        "call_once": {"header":"threads.h"},
+        "calloc": {"header":"stdlib.h"},
+        "carg": {"header":"complex.h"},
+        "cargf": {"header":"complex.h"},
+        "cargl": {"header":"complex.h"},
+        "casin": {"header":"complex.h"},
+        "casinf": {"header":"complex.h"},
+        "casinh": {"header":"complex.h"},
+        "casinhf": {"header":"complex.h"},
+        "casinhl": {"header":"complex.h"},
+        "casinl": {"header":"complex.h"},
+        "catan": {"header":"complex.h"},
+        "catanf": {"header":"complex.h"},
+        "catanh": {"header":"complex.h"},
+        "catanhf": {"header":"complex.h"},
+        "catanhl": {"header":"complex.h"},
+        "catanl": {"header":"complex.h"},
+        "cbrt": {"header":"math.h"},
+        "cbrtf": {"header":"math.h"},
+        "cbrtl": {"header":"math.h"},
+        "ccos": {"header":"complex.h"},
+        "ccosf": {"header":"complex.h"},
+        "ccosh": {"header":"complex.h"},
+        "ccoshf": {"header":"complex.h"},
+        "ccoshl": {"header":"complex.h"},
+        "ccosl": {"header":"complex.h"},
+        "ceil": {"header":"math.h"},
+        "ceilf": {"header":"math.h"},
+        "ceill": {"header":"math.h"},
+        "cexp": {"header":"complex.h"},
+        "cexpf": {"header":"complex.h"},
+        "cexpl": {"header":"complex.h"},
+        "cimag": {"header":"complex.h"},
+        "cimagf": {"header":"complex.h"},
+        "cimagl": {"header":"complex.h"},
+        "clearerr": {"header":"stdio.h"},
+        "clock": {"header":"time.h"},
+        "clog": {"header":"complex.h"},
+        "clogf": {"header":"complex.h"},
+        "clogl": {"header":"complex.h"},
+        "cnd_broadcast": {"header":"threads.h"},
+        "cnd_destroy": {"header":"threads.h"},
+        "cnd_init": {"header":"threads.h"},
+        "cnd_signal": {"header":"threads.h"},
+        "cnd_timedwait": {"header":"threads.h"},
+        "cnd_wait": {"header":"threads.h"},
+        "conj": {"header":"complex.h"},
+        "conjf": {"header":"complex.h"},
+        "conjl": {"header":"complex.h"},
+        "copysign": {"header":"math.h"},
+        "copysignf": {"header":"math.h"},
+        "copysignl": {"header":"math.h"},
+        "cos": {"header":"math.h"},
+        "cosf": {"header":"math.h"},
+        "cosh": {"header":"math.h"},
+        "coshf": {"header":"math.h"},
+        "coshl": {"header":"math.h"},
+        "cosl": {"header":"math.h"},
+        "cpow": {"header":"complex.h"},
+        "cpowf": {"header":"complex.h"},
+        "cpowl": {"header":"complex.h"},
+        "cproj": {"header":"complex.h"},
+        "cprojf": {"header":"complex.h"},
+        "cprojl": {"header":"complex.h"},
+        "creal": {"header":"complex.h"},
+        "crealf": {"header":"complex.h"},
+        "creall": {"header":"complex.h"},
+        "csin": {"header":"complex.h"},
+        "csinf": {"header":"complex.h"},
+        "csinh": {"header":"complex.h"},
+        "csinhf": {"header":"complex.h"},
+        "csinhl": {"header":"complex.h"},
+        "csinl": {"header":"complex.h"},
+        "csqrt": {"header":"complex.h"},
+        "csqrtf": {"header":"complex.h"},
+        "csqrtl": {"header":"complex.h"},
+        "ctan": {"header":"complex.h"},
+        "ctanf": {"header":"complex.h"},
+        "ctanh": {"header":"complex.h"},
+        "ctanhf": {"header":"complex.h"},
+        "ctanhl": {"header":"complex.h"},
+        "ctanl": {"header":"complex.h"},
+        "ctime": {"header":"time.h"},
+        "ctime_s": {"header":"time.h"},
+        "difftime": {"header":"time.h"},
+        "div": {"header":"stdlib.h"},
+        "erf": {"header":"math.h"},
+        "erfc": {"header":"math.h"},
+        "erfcf": {"header":"math.h"},
+        "erfcl": {"header":"math.h"},
+        "erff": {"header":"math.h"},
+        "erfl": {"header":"math.h"},
+        "exit": {"header":"stdlib.h"},
+        "exp": {"header":"math.h"},
+        "exp2": {"header":"math.h"},
+        "exp2f": {"header":"math.h"},
+        "exp2l": {"header":"math.h"},
+        "expf": {"header":"math.h"},
+        "expl": {"header":"math.h"},
+        "expm1": {"header":"math.h"},
+        "expm1f": {"header":"math.h"},
+        "expm1l": {"header":"math.h"},
+        "fabs": {"header":"math.h"},
+        "fabsf": {"header":"math.h"},
+        "fabsl": {"header":"math.h"},
+        "fclose": {"header":"stdio.h"},
+        "fdim": {"header":"math.h"},
+        "fdimf": {"header":"math.h"},
+        "fdiml": {"header":"math.h"},
+        "feclearexcept": {"header":"fenv.h"},
+        "fegetenv": {"header":"fenv.h"},
+        "fegetexceptflag": {"header":"fenv.h"},
+        "fegetround": {"header":"fenv.h"},
+        "feholdexcept": {"header":"fenv.h"},
+        "feof": {"header":"stdio.h"},
+        "feraiseexcept": {"header":"fenv.h"},
+        "ferror": {"header":"stdio.h"},
+        "fesetenv": {"header":"fenv.h"},
+        "fesetexceptflag": {"header":"fenv.h"},
+        "fesetround": {"header":"fenv.h"},
+        "fetestexcept": {"header":"fenv.h"},
+        "feupdateenv": {"header":"fenv.h"},
+        "fflush": {"header":"stdio.h"},
+        "fgetc": {"header":"stdio.h"},
+        "fgetpos": {"header":"stdio.h"},
+        "fgets": {"header":"stdio.h"},
+        "fgetwc": {"header":"wchar.h"},
+        "fgetws": {"header":"wchar.h"},
+        "floor": {"header":"math.h"},
+        "floorf": {"header":"math.h"},
+        "floorl": {"header":"math.h"},
+        "fma": {"header":"math.h"},
+        "fmaf": {"header":"math.h"},
+        "fmal": {"header":"math.h"},
+        "fmax": {"header":"math.h"},
+        "fmaxf": {"header":"math.h"},
+        "fmaxl": {"header":"math.h"},
+        "fmin": {"header":"math.h"},
+        "fminf": {"header":"math.h"},
+        "fminl": {"header":"math.h"},
+        "fmod": {"header":"math.h"},
+        "fmodf": {"header":"math.h"},
+        "fmodl": {"header":"math.h"},
+        "fopen": {"header":"stdio.h", "notes":{"safer-alts":["fopen_s"]}},
+        "fopen_s": {"header":"stdio.h"},
+        "fpclassify": {"header":"math.h"},
+        "fprintf": {"header":"stdio.h", "notes":{"variadic":true, "safer-alts":["fprintf_s"]}},
+        "fprintf_s": {"header":"stdio.h", "notes":{"variadic":true}},
+        "fputc": {"header":"stdio.h"},
+        "fputs": {"header":"stdio.h"},
+        "fputwc": {"header":"wchar.h"},
+        "fputws": {"header":"wchar.h"},
+        "fread": {"header":"stdio.h"},
+        "free": {"header":"stdlib.h"},
+        "freopen": {"header":"stdio.h", "notes":{"safer-alts":["freopen_s"]}},
+        "freopen_s": {"header":"stdio.h"},
+        "frexp": {"header":"math.h"},
+        "frexpf": {"header":"math.h"},
+        "frexpl": {"header":"math.h"},
+        "fscanf": {"header":"stdio.h", "notes":{"variadic":true, "safer-alts":["fscanf_s"]}},
+        "fscanf_s": {"header":"stdio.h", "notes":{"variadic":true}},
+        "fseek": {"header":"stdio.h"},
+        "fsetpos": {"header":"stdio.h"},
+        "ftell": {"header":"stdio.h"},
+        "fwide": {"header":"wchar.h"},
+        "fwprintf": {"header":"wchar.h", "notes":{"variadic":true, "safer-alts":["fwprintf_s"]}},
+        "fwprintf_s": {"header":"wchar.h", "notes":{"variadic":true}},
+        "fwrite": {"header":"stdio.h"},
+        "fwscanf": {"header":"wchar.h", "notes":{"variadic":true, "safer-alts":["fwscanf_s"]}},
+        "fwscanf_s": {"header":"wchar.h", "notes":{"variadic":true}},
+        "getc": {"header":"stdio.h"},
+        "getchar": {"header":"stdio.h"},
+        "getenv": {"header":"stdlib.h", "notes":{"safer-alts":["getenv_s"]}},
+        "getenv_s": {"header":"stdlib.h"},
+        "gets_s": {"header":"stdio.h"},
+        "getwc": {"header":"wchar.h"},
+        "getwchar": {"header":"wchar.h"},
+        "gmtime": {"header":"time.h", "notes":{"safer-alts":["gmtime_s"]}},
+        "gmtime_s": {"header":"time.h"},
+        "hypot": {"header":"math.h"},
+        "hypotf": {"header":"math.h"},
+        "hypotl": {"header":"math.h"},
+        "ignore_handler_s": {"header":"stdlib.h"},
+        "ilogb": {"header":"math.h"},
+        "ilogbf": {"header":"math.h"},
+        "ilogbl": {"header":"math.h"},
+        "imaxabs": {"header":"inttypes.h"},
+        "imaxdiv": {"header":"inttypes.h"},
+        "isalnum": {"header":"ctype.h"},
+        "isalpha": {"header":"ctype.h"},
+        "isblank": {"header":"ctype.h"},
+        "iscntrl": {"header":"ctype.h"},
+        "isdigit": {"header":"ctype.h"},
+        "isfinite": {"header":"math.h"},
+        "isgraph": {"header":"ctype.h"},
+        "isgreater": {"header":"math.h"},
+        "isgreaterequal": {"header":"math.h"},
+        "isinf": {"header":"math.h"},
+        "isless": {"header":"math.h"},
+        "islessequal": {"header":"math.h"},
+        "islessgreater": {"header":"math.h"},
+        "islower": {"header":"ctype.h"},
+        "isnan": {"header":"math.h"},
+        "isnormal": {"header":"math.h"},
+        "isprint": {"header":"ctype.h"},
+        "ispunct": {"header":"ctype.h"},
+        "isspace": {"header":"ctype.h"},
+        "isunordered": {"header":"math.h"},
+        "isupper": {"header":"ctype.h"},
+        "iswalnum": {"header":"wctype.h"},
+        "iswalpha": {"header":"wctype.h"},
+        "iswblank": {"header":"wctype.h"},
+        "iswcntrl": {"header":"wctype.h"},
+        "iswctype": {"header":"wctype.h"},
+        "iswdigit": {"header":"wctype.h"},
+        "iswgraph": {"header":"wctype.h"},
+        "iswlower": {"header":"wctype.h"},
+        "iswprint": {"header":"wctype.h"},
+        "iswpunct": {"header":"wctype.h"},
+        "iswspace": {"header":"wctype.h"},
+        "iswupper": {"header":"wctype.h"},
+        "iswxdigit": {"header":"wctype.h"},
+        "isxdigit": {"header":"ctype.h"},
+        "kill_dependency": {"header":"stdatomic.h"},
+        "labs": {"header":"stdlib.h"},
+        "ldexp": {"header":"math.h"},
+        "ldexpf": {"header":"math.h"},
+        "ldexpl": {"header":"math.h"},
+        "ldiv": {"header":"stdlib.h"},
+        "lgamma": {"header":"math.h"},
+        "lgammaf": {"header":"math.h"},
+        "lgammal": {"header":"math.h"},
+        "llabs": {"header":"stdlib.h"},
+        "lldiv": {"header":"stdlib.h"},
+        "llrint": {"header":"math.h"},
+        "llrintf": {"header":"math.h"},
+        "llrintl": {"header":"math.h"},
+        "llround": {"header":"math.h"},
+        "llroundf": {"header":"math.h"},
+        "llroundl": {"header":"math.h"},
+        "localeconv": {"header":"locale.h"},
+        "localtime": {"header":"time.h", "notes":{"safer-alts":["localtime_s"]}},
+        "localtime_s": {"header":"time.h"},
+        "log": {"header":"math.h"},
+        "log10": {"header":"math.h"},
+        "log10f": {"header":"math.h"},
+        "log10l": {"header":"math.h"},
+        "log1p": {"header":"math.h"},
+        "log1pf": {"header":"math.h"},
+        "log1pl": {"header":"math.h"},
+        "log2": {"header":"math.h"},
+        "log2f": {"header":"math.h"},
+        "log2l": {"header":"math.h"},
+        "logb": {"header":"math.h"},
+        "logbf": {"header":"math.h"},
+        "logbl": {"header":"math.h"},
+        "logf": {"header":"math.h"},
+        "logl": {"header":"math.h"},
+        "longjmp": {"header":"setjmp.h"},
+        "lrint": {"header":"math.h"},
+        "lrintf": {"header":"math.h"},
+        "lrintl": {"header":"math.h"},
+        "lround": {"header":"math.h"},
+        "lroundf": {"header":"math.h"},
+        "lroundl": {"header":"math.h"},
+        "malloc": {"header":"stdlib.h"},
+        "mblen": {"header":"stdlib.h"},
+        "mbrlen": {"header":"wchar.h"},
+        "mbrtoc16": {"header":"uchar.h"},
+        "mbrtoc32": {"header":"uchar.h"},
+        "mbrtowc": {"header":"wchar.h"},
+        "mbsinit": {"header":"wchar.h"},
+        "mbsrtowcs": {"header":"wchar.h", "notes":{"safer-alts":["mbsrtowcs_s"]}},
+        "mbsrtowcs_s": {"header":"wchar.h"},
+        "mbstowcs": {"header":"stdlib.h", "notes":{"safer-alts":["mbstowcs_s"]}},
+        "mbstowcs_s": {"header":"stdlib.h"},
+        "mbtowc": {"header":"stdlib.h"},
+        "memchr": {"header":"string.h"},
+        "memcmp": {"header":"string.h"},
+        "memcpy": {"header":"string.h", "notes":{"safer-alts":["memcpy_s"]}},
+        "memcpy_s": {"header":"string.h"},
+        "memmove": {"header":"string.h", "notes":{"safer-alts":["memmove_s"]}},
+        "memmove_s": {"header":"string.h"},
+        "memset": {"header":"string.h", "notes":{"safer-alts":["memset_s"]}},
+        "memset_s": {"header":"string.h"},
+        "mktime": {"header":"time.h"},
+        "modf": {"header":"math.h"},
+        "modff": {"header":"math.h"},
+        "modfl": {"header":"math.h"},
+        "mtx_destroy": {"header":"threads.h"},
+        "mtx_init": {"header":"threads.h"},
+        "mtx_lock": {"header":"threads.h"},
+        "mtx_timedlock": {"header":"threads.h"},
+        "mtx_trylock": {"header":"threads.h"},
+        "mtx_unlock": {"header":"threads.h"},
+        "nan": {"header":"math.h"},
+        "nanf": {"header":"math.h"},
+        "nanl": {"header":"math.h"},
+        "nearbyint": {"header":"math.h"},
+        "nearbyintf": {"header":"math.h"},
+        "nearbyintl": {"header":"math.h"},
+        "nextafter": {"header":"math.h"},
+        "nextafterf": {"header":"math.h"},
+        "nextafterl": {"header":"math.h"},
+        "nexttoward": {"header":"math.h"},
+        "nexttowardf": {"header":"math.h"},
+        "nexttowardl": {"header":"math.h"},
+        "perror": {"header":"stdio.h"},
+        "pow": {"header":"math.h"},
+        "powf": {"header":"math.h"},
+        "powl": {"header":"math.h"},
+        "printf": {"header":"stdio.h", "notes":{"variadic":true, "safer-alts":["printf_s"]}},
+        "printf_s": {"header":"stdio.h"},
+        "putc": {"header":"stdio.h"},
+        "putchar": {"header":"stdio.h"},
+        "puts": {"header":"stdio.h"},
+        "putwc": {"header":"wchar.h"},
+        "putwchar": {"header":"wchar.h"},
+        "qsort": {"header":"stdlib.h"},
+        "qsort_s": {"header":"stdlib.h"},
+        "quick_exit": {"header":"stdlib.h"},
+        "raise": {"header":"signal.h"},
+        "rand": {"header":"stdlib.h"},
+        "realloc": {"header":"stdlib.h"},
+        "remainder": {"header":"math.h"},
+        "remainderf": {"header":"math.h"},
+        "remainderl": {"header":"math.h"},
+        "remove": {"header":"stdio.h"},
+        "remquo": {"header":"math.h"},
+        "remquof": {"header":"math.h"},
+        "remquol": {"header":"math.h"},
+        "rename": {"header":"stdio.h"},
+        "rewind": {"header":"stdio.h"},
+        "rint": {"header":"math.h"},
+        "rintf": {"header":"math.h"},
+        "rintl": {"header":"math.h"},
+        "round": {"header":"math.h"},
+        "roundf": {"header":"math.h"},
+        "roundl": {"header":"math.h"},
+        "scalbln": {"header":"math.h"},
+        "scalblnf": {"header":"math.h"},
+        "scalblnl": {"header":"math.h"},
+        "scalbn": {"header":"math.h"},
+        "scalbnf": {"header":"math.h"},
+        "scalbnl": {"header":"math.h"},
+        "scanf": {"header":"stdio.h", "notes":{"variadic":true, "safer-alts":["scanf_s"]}},
+        "scanf_s": {"header":"stdio.h", "notes":{"variadic":true}},
+        "set_constraint_handler_s": {"header":"stdlib.h"},
+        "setbuf": {"header":"stdio.h"},
+        "setjmp": {"header":"setjmp.h"},
+        "setlocale": {"header":"locale.h"},
+        "setvbuf": {"header":"stdio.h"},
+        "signal": {"header":"signal.h"},
+        "signbit": {"header":"math.h"},
+        "sin": {"header":"math.h"},
+        "sinf": {"header":"math.h"},
+        "sinh": {"header":"math.h"},
+        "sinhf": {"header":"math.h"},
+        "sinhl": {"header":"math.h"},
+        "sinl": {"header":"math.h"},
+        "snprintf": {"header":"stdio.h", "notes":{"variadic":true, "safer-alts":["snprintf_s", "sprintf_s"]}},
+        "snprintf_s": {"header":"stdio.h", "notes":{"variadic":true}},
+        "snwprintf_s": {"header":"wchar.h"},
+        "sprintf": {"header":"stdio.h", "notes":{"variadic":true, "safer-alts":["sprintf_s", "snprintf_s"]}},
+        "sprintf_s": {"header":"stdio.h", "notes":{"variadic":true, "safer-alts":["snprintf_s"]}},
+        "sqrt": {"header":"math.h"},
+        "sqrtf": {"header":"math.h"},
+        "sqrtl": {"header":"math.h"},
+        "srand": {"header":"stdlib.h"},
+        "sscanf": {"header":"stdio.h", "notes":{"variadic":true, "safer-alts":["sscanf_s"]}},
+        "sscanf_s": {"header":"stdio.h", "notes":{"variadic":true}},
+        "strcat": {"header":"string.h", "notes":{"safer-alts":["strcat_s", "strncat_s", "strlcat", "strncat"]}},
+        "strcat_s": {"header":"string.h"},
+        "strchr": {"header":"string.h"},
+        "strcmp": {"header":"string.h"},
+        "strcoll": {"header":"string.h"},
+        "strcpy": {"header":"string.h", "notes":{"safer-alts":["strcpy_s", "strncpy_s", "strlcpy", "strncpy"]}},
+        "strcpy_s": {"header":"string.h"},
+        "strcspn": {"header":"string.h"},
+        "strerror": {"header":"string.h"},
+        "strerror_s": {"header":"string.h"},
+        "strerrorlen_s": {"header":"string.h"},
+        "strftime": {"header":"time.h"},
+        "strlen": {"header":"string.h", "notes":{"safer-alts":["strnlen_s"]}},
+        "strncat": {"header":"string.h", "notes":{"safer-alts":["strncat_s", "strlcat"]}},
+        "strncat_s": {"header":"string.h"},
+        "strncmp": {"header":"string.h"},
+        "strncpy": {"header":"string.h", "notes":{"safer-alts":["strncpy_s", "strlcpy"]}},
+        "strncpy_s": {"header":"string.h"},
+        "strnlen_s": {"header":"string.h"},
+        "strpbrk": {"header":"string.h"},
+        "strrchr": {"header":"string.h"},
+        "strspn": {"header":"string.h"},
+        "strstr": {"header":"string.h"},
+        "strtod": {"header":"stdlib.h"},
+        "strtof": {"header":"stdlib.h"},
+        "strtoimax": {"header":"inttypes.h"},
+        "strtok": {"header":"string.h", "notes":{"safer-alts":["strtok_s"]}},
+        "strtok_s": {"header":"string.h"},
+        "strtol": {"header":"stdlib.h"},
+        "strtold": {"header":"stdlib.h"},
+        "strtoll": {"header":"stdlib.h"},
+        "strtoul": {"header":"stdlib.h"},
+        "strtoull": {"header":"stdlib.h"},
+        "strtoumax": {"header":"inttypes.h"},
+        "strxfrm": {"header":"string.h"},
+        "swprintf": {"header":"wchar.h", "notes":{"variadic":true, "safer-alts":["swprintf_s", "sprintf_s"]}},
+        "swprintf_s": {"header":"wchar.h", "notes":{"variadic":true}},
+        "swscanf": {"header":"wchar.h", "notes":{"variadic":true, "safer-alts":["swscanf_s", "sscanf_s"]}},
+        "swscanf_s": {"header":"wchar.h", "notes":{"variadic":true}},
+        "system": {"header":"stdlib.h"},
+        "tan": {"header":"math.h"},
+        "tanf": {"header":"math.h"},
+        "tanh": {"header":"math.h"},
+        "tanhf": {"header":"math.h"},
+        "tanhl": {"header":"math.h"},
+        "tanl": {"header":"math.h"},
+        "tgamma": {"header":"math.h"},
+        "tgammaf": {"header":"math.h"},
+        "tgammal": {"header":"math.h"},
+        "thrd_create": {"header":"threads.h"},
+        "thrd_current": {"header":"threads.h"},
+        "thrd_detach": {"header":"threads.h"},
+        "thrd_equal": {"header":"threads.h"},
+        "thrd_exit": {"header":"threads.h"},
+        "thrd_join": {"header":"threads.h"},
+        "thrd_sleep": {"header":"threads.h"},
+        "thrd_yield": {"header":"threads.h"},
+        "time": {"header":"time.h"},
+        "timespec_get": {"header":"time.h"},
+        "tmpfile": {"header":"stdio.h", "notes":{"safer-alts":["tmpfile_s"]}},
+        "tmpfile_s": {"header":"stdio.h"},
+        "tmpnam": {"header":"stdio.h", "notes":{"safer-alts":["tmpnam_s"]}},
+        "tmpnam_s": {"header":"stdio.h"},
+        "tolower": {"header":"ctype.h"},
+        "toupper": {"header":"ctype.h"},
+        "towctrans": {"header":"wctype.h"},
+        "towlower": {"header":"wctype.h"},
+        "towupper": {"header":"wctype.h"},
+        "trunc": {"header":"math.h"},
+        "truncf": {"header":"math.h"},
+        "truncl": {"header":"math.h"},
+        "tss_create": {"header":"threads.h"},
+        "tss_delete": {"header":"threads.h"},
+        "tss_get": {"header":"threads.h"},
+        "tss_set": {"header":"threads.h"},
+        "ungetc": {"header":"stdio.h"},
+        "ungetwc": {"header":"wchar.h"},
+        "va_arg": {"header":"stdarg.h"},
+        "va_copy": {"header":"stdarg.h"},
+        "va_end": {"header":"stdarg.h"},
+        "va_start": {"header":"stdarg.h"},
+        "vfprintf": {"header":"stdio.h", "notes":{"variadic":true, "safer-alts":["vfprintf_s"]}},
+        "vfprintf_s": {"header":"stdio.h", "notes":{"variadic":true}},
+        "vfscanf": {"header":"stdio.h", "notes":{"variadic":true, "safer-alts":["vfscanf_s"]}},
+        "vfscanf_s": {"header":"stdio.h", "notes":{"variadic":true}},
+        "vfwprintf": {"header":"wchar.h", "notes":{"variadic":true, "safer-alts":["vfwprintf_s"]}},
+        "vfwprintf_s": {"header":"wchar.h", "notes":{"variadic":true}},
+        "vfwscanf": {"header":"wchar.h", "notes":{"variadic":true}, "notes":{"safer-alts":["vfwscanf_s"]}},
+        "vfwscanf_s": {"header":"wchar.h", "notes":{"variadic":true}},
+        "vprintf": {"header":"stdio.h", "notes":{"variadic":true, "safer-alts":["vprintf_s"]}},
+        "vprintf_s": {"header":"stdio.h", "notes":{"variadic":true}},
+        "vscanf": {"header":"stdio.h", "notes":{"variadic":true, "safer-alts":["vscanf_s"]}},
+        "vscanf_s": {"header":"stdio.h", "notes":{"variadic":true}},
+        "vsnprintf": {"header":"stdio.h", "notes":{"variadic":true, "safer-alts":["vsnprintf_s"]}},
+        "vsnprintf_s": {"header":"stdio.h", "notes":{"variadic":true}},
+        "vsnwprintf_s": {"header":"wchar.h", "notes":{"variadic":true}},
+        "vsprintf": {"header":"stdio.h", "notes":{"variadic":true, "safer-alts":["vsprintf_s", "sprintf_s"]}},
+        "vsprintf_s": {"header":"stdio.h", "notes":{"variadic":true}},
+        "vsscanf": {"header":"stdio.h", "notes":{"variadic":true, "safer-alts":["vsscanf_s"]}},
+        "vsscanf_s": {"header":"stdio.h", "notes":{"variadic":true}},
+        "vswprintf": {"header":"wchar.h", "notes":{"variadic":true, "safer-alts":["vswprintf_s", "sprintf_s"]}},
+        "vswprintf_s": {"header":"wchar.h", "notes":{"variadic":true}},
+        "vswscanf": {"header":"wchar.h", "notes":{"variadic":true, "safer-alts":["vswscanf_s"]}},
+        "vswscanf_s": {"header":"wchar.h", "notes":{"variadic":true}},
+        "vwprintf": {"header":"wchar.h", "notes":{"variadic":true, "safer-alts":["vwprintf_s"]}},
+        "vwprintf_s": {"header":"wchar.h", "notes":{"variadic":true}},
+        "vwscanf": {"header":"wchar.h", "notes":{"variadic":true, "safer-alts":["vwscanf_s"]}},
+        "vwscanf_s": {"header":"wchar.h", "notes":{"variadic":true}},
+        "wcrtomb": {"header":"wchar.h", "notes":{"safer-alts":["wcrtomb_s"]}},
+        "wcrtomb_s": {"header":"wchar.h"},
+        "wcscat": {"header":"wchar.h", "notes":{"safer-alts":["wcscat_s", "strcat_s"]}},
+        "wcscat_s": {"header":"wchar.h"},
+        "wcschr": {"header":"wchar.h"},
+        "wcscmp": {"header":"wchar.h"},
+        "wcscoll": {"header":"wchar.h"},
+        "wcscpy": {"header":"wchar.h", "notes":{"safer-alts":["wcscpy_s", "strcpy_s"]}},
+        "wcscpy_s": {"header":"wchar.h"},
+        "wcscspn": {"header":"wchar.h"},
+        "wcsftime": {"header":"wchar.h"},
+        "wcslen": {"header":"wchar.h", "notes":{"safer-alts":["wcsnlen_s"]}},
+        "wcsncat": {"header":"wchar.h",  "notes":{"safer-alts":["wcsncat_s", "strncat_s", "strlcat"]}},
+        "wcsncat_s": {"header":"wchar.h"},
+        "wcsncmp": {"header":"wchar.h"},
+        "wcsncpy": {"header":"wchar.h",  "notes":{"safer-alts":["wcsncpy_s", "strncpy_s", "strlcpy"]}},
+        "wcsncpy_s": {"header":"wchar.h"},
+        "wcsnlen_s": {"header":"wchar.h"},
+        "wcspbrk": {"header":"wchar.h"},
+        "wcsrchr": {"header":"wchar.h"},
+        "wcsrtombs": {"header":"wchar.h",  "notes":{"safer-alts":["wcsrtombs_s"]}},
+        "wcsrtombs_s": {"header":"wchar.h"},
+        "wcsspn": {"header":"wchar.h"},
+        "wcsstr": {"header":"wchar.h"},
+        "wcstod": {"header":"wchar.h"},
+        "wcstof": {"header":"wchar.h"},
+        "wcstoimax": {"header":"inttypes.h"},
+        "wcstok": {"header":"wchar.h",  "notes":{"safer-alts":["wcstok_s"]}},
+        "wcstok_s": {"header":"wchar.h"},
+        "wcstol": {"header":"wchar.h"},
+        "wcstold": {"header":"wchar.h"},
+        "wcstoll": {"header":"wchar.h"},
+        "wcstombs": {"header":"stdlib.h",  "notes":{"safer-alts":["wcstombs_s"]}},
+        "wcstombs_s": {"header":"stdlib.h"},
+        "wcstoul": {"header":"wchar.h"},
+        "wcstoull": {"header":"wchar.h"},
+        "wcstoumax": {"header":"inttypes.h"},
+        "wcsxfrm": {"header":"wchar.h"},
+        "wctob": {"header":"wchar.h"},
+        "wctomb": {"header":"stdlib.h",  "notes":{"safer-alts":["wctomb_s"]}},
+        "wctomb_s": {"header":"stdlib.h"},
+        "wctrans": {"header":"wctype.h"},
+        "wctype": {"header":"wctype.h"},
+        "wmemchr": {"header":"wchar.h"},
+        "wmemcmp": {"header":"wchar.h"},
+        "wmemcpy": {"header":"wchar.h",  "notes":{"safer-alts":["wmemcpy_s"]}},
+        "wmemcpy_s": {"header":"wchar.h"},
+        "wmemmove": {"header":"wchar.h",  "notes":{"safer-alts":["wmemmove_s"]}},
+        "wmemmove_s": {"header":"wchar.h"},
+        "wmemset": {"header":"wchar.h"},
+        "wprintf": {"header":"wchar.h", "notes":{"variadic":true, "safer-alts":["wprintf_s"]}},
+        "wprintf_s": {"header":"wchar.h", "notes":{"variadic":true}},
+        "wscanf": {"header":"wchar.h", "notes":{"variadic":true, "safer-alts":["wscanf_s", "sscanf_s"]}},
+        "wscanf_s": {"header":"wchar.h", "notes":{"variadic":true}}
+    }
 }
diff --git a/share/compliance/c11_headers.json b/share/compliance/c11_headers.json
new file mode 100644
index 0000000000000000000000000000000000000000..82f65fafa3b040d2f633cbaa669930b98bc3e26a
--- /dev/null
+++ b/share/compliance/c11_headers.json
@@ -0,0 +1,35 @@
+{
+    "description": "C11 standard library headers",
+    "source":"ISO/IEC 9899:2011, 7.1.2§2",
+    "data":[
+        "assert.h",
+        "complex.h",
+        "ctype.h",
+        "errno.h",
+        "fenv.h",
+        "float.h",
+        "inttypes.h",
+        "iso646.h",
+        "limits.h",
+        "locale.h",
+        "math.h",
+        "setjmp.h",
+        "signal.h",
+        "stdalign.h",
+        "stdarg.h",
+        "stdatomic.h",
+        "stdbool.h",
+        "stddef.h",
+        "stdint.h",
+        "stdio.h",
+        "stdlib.h",
+        "stdnoreturn.h",
+        "string.h",
+        "tgmath.h",
+        "threads.h",
+        "time.h",
+        "uchar.h",
+        "wchar.h",
+        "wctype.h"
+    ]
+}
diff --git a/share/compliance/glibc_functions.json b/share/compliance/glibc_functions.json
index 9e21f7e79ea74fe74d18fbaf24cc9977bba09679..90906ec100ed106e7d0f3f9e736e19e5a95d9463 100644
--- a/share/compliance/glibc_functions.json
+++ b/share/compliance/glibc_functions.json
@@ -3,1592 +3,1592 @@
     "last_update": "2017-11",
     "source": "glibc - https://www.gnu.org/software/libc/manual/html_node/Function-Index.html",
     "data":[
-        {"ident":"__fbufsize"},
-        {"ident":"__flbf"},
-        {"ident":"__fpending"},
-        {"ident":"__fpurge"},
-        {"ident":"__freadable"},
-        {"ident":"__freading"},
-        {"ident":"__fsetlocking"},
-        {"ident":"__fwritable"},
-        {"ident":"__fwriting"},
-        {"ident":"__ppc_get_timebase"},
-        {"ident":"__ppc_get_timebase_freq"},
-        {"ident":"__ppc_mdoio"},
-        {"ident":"__ppc_mdoom"},
-        {"ident":"__ppc_set_ppr_low"},
-        {"ident":"__ppc_set_ppr_med"},
-        {"ident":"__ppc_set_ppr_med_high"},
-        {"ident":"__ppc_set_ppr_med_low"},
-        {"ident":"__ppc_set_ppr_very_low"},
-        {"ident":"__ppc_yield"},
-        {"ident":"__va_copy"},
-        {"ident":"_exit"},
-        {"ident":"_Exit"},
-        {"ident":"_flushlbf"},
-        {"ident":"_tolower"},
-        {"ident":"_toupper"},
-        {"ident":"a64l"},
-        {"ident":"abort"},
-        {"ident":"abs"},
-        {"ident":"accept"},
-        {"ident":"access"},
-        {"ident":"acos"},
-        {"ident":"acosf"},
-        {"ident":"acosfN"},
-        {"ident":"acosfNx"},
-        {"ident":"acosh"},
-        {"ident":"acoshf"},
-        {"ident":"acoshfN"},
-        {"ident":"acoshfNx"},
-        {"ident":"acoshl"},
-        {"ident":"acosl"},
-        {"ident":"addmntent"},
-        {"ident":"addseverity"},
-        {"ident":"adjtime"},
-        {"ident":"adjtimex"},
-        {"ident":"aio_cancel"},
-        {"ident":"aio_cancel64"},
-        {"ident":"aio_error"},
-        {"ident":"aio_error64"},
-        {"ident":"aio_fsync"},
-        {"ident":"aio_fsync64"},
-        {"ident":"aio_init"},
-        {"ident":"aio_read"},
-        {"ident":"aio_read64"},
-        {"ident":"aio_return"},
-        {"ident":"aio_return64"},
-        {"ident":"aio_suspend"},
-        {"ident":"aio_suspend64"},
-        {"ident":"aio_write"},
-        {"ident":"aio_write64"},
-        {"ident":"alarm"},
-        {"ident":"aligned_alloc"},
-        {"ident":"alloca"},
-        {"ident":"alphasort"},
-        {"ident":"alphasort64"},
-        {"ident":"argp_error"},
-        {"ident":"argp_failure"},
-        {"ident":"argp_help"},
-        {"ident":"argp_parse"},
-        {"ident":"argp_state_help"},
-        {"ident":"argp_usage"},
-        {"ident":"argz_add"},
-        {"ident":"argz_add_sep"},
-        {"ident":"argz_append"},
-        {"ident":"argz_count"},
-        {"ident":"argz_create"},
-        {"ident":"argz_create_sep"},
-        {"ident":"argz_delete"},
-        {"ident":"argz_extract"},
-        {"ident":"argz_insert"},
-        {"ident":"argz_next"},
-        {"ident":"argz_replace"},
-        {"ident":"argz_stringify"},
-        {"ident":"asctime"},
-        {"ident":"asctime_r"},
-        {"ident":"asin"},
-        {"ident":"asinf"},
-        {"ident":"asinfN"},
-        {"ident":"asinfNx"},
-        {"ident":"asinh"},
-        {"ident":"asinhf"},
-        {"ident":"asinhfN"},
-        {"ident":"asinhfNx"},
-        {"ident":"asinhl"},
-        {"ident":"asinl"},
-        {"ident":"asprintf"},
-        {"ident":"assert"},
-        {"ident":"assert_perror"},
-        {"ident":"atan"},
-        {"ident":"atan2"},
-        {"ident":"atan2f"},
-        {"ident":"atan2fN"},
-        {"ident":"atan2fNx"},
-        {"ident":"atan2l"},
-        {"ident":"atanf"},
-        {"ident":"atanfN"},
-        {"ident":"atanfNx"},
-        {"ident":"atanh"},
-        {"ident":"atanhf"},
-        {"ident":"atanhfN"},
-        {"ident":"atanhfNx"},
-        {"ident":"atanhl"},
-        {"ident":"atanl"},
-        {"ident":"atexit"},
-        {"ident":"atof"},
-        {"ident":"atoi"},
-        {"ident":"atol"},
-        {"ident":"atoll"},
-        {"ident":"backtrace"},
-        {"ident":"backtrace_symbols"},
-        {"ident":"backtrace_symbols_fd"},
-        {"ident":"basename"},
-        {"ident":"basename"},
-        {"ident":"bcmp"},
-        {"ident":"bcopy"},
-        {"ident":"bind"},
-        {"ident":"bind_textdomain_codeset"},
-        {"ident":"bindtextdomain"},
-        {"ident":"brk"},
-        {"ident":"bsearch"},
-        {"ident":"btowc"},
-        {"ident":"bzero"},
-        {"ident":"cabs"},
-        {"ident":"cabsf"},
-        {"ident":"cabsfN"},
-        {"ident":"cabsfNx"},
-        {"ident":"cabsl"},
-        {"ident":"cacos"},
-        {"ident":"cacosf"},
-        {"ident":"cacosfN"},
-        {"ident":"cacosfNx"},
-        {"ident":"cacosh"},
-        {"ident":"cacoshf"},
-        {"ident":"cacoshfN"},
-        {"ident":"cacoshfNx"},
-        {"ident":"cacoshl"},
-        {"ident":"cacosl"},
-        {"ident":"calloc"},
-        {"ident":"canonicalize"},
-        {"ident":"canonicalize_file_name"},
-        {"ident":"canonicalizef"},
-        {"ident":"canonicalizefN"},
-        {"ident":"canonicalizefNx"},
-        {"ident":"canonicalizel"},
-        {"ident":"carg"},
-        {"ident":"cargf"},
-        {"ident":"cargfN"},
-        {"ident":"cargfNx"},
-        {"ident":"cargl"},
-        {"ident":"casin"},
-        {"ident":"casinf"},
-        {"ident":"casinfN"},
-        {"ident":"casinfNx"},
-        {"ident":"casinh"},
-        {"ident":"casinhf"},
-        {"ident":"casinhfN"},
-        {"ident":"casinhfNx"},
-        {"ident":"casinhl"},
-        {"ident":"casinl"},
-        {"ident":"catan"},
-        {"ident":"catanf"},
-        {"ident":"catanfN"},
-        {"ident":"catanfNx"},
-        {"ident":"catanh"},
-        {"ident":"catanhf"},
-        {"ident":"catanhfN"},
-        {"ident":"catanhfNx"},
-        {"ident":"catanhl"},
-        {"ident":"catanl"},
-        {"ident":"catclose"},
-        {"ident":"catgets"},
-        {"ident":"catopen"},
-        {"ident":"cbc_crypt"},
-        {"ident":"cbrt"},
-        {"ident":"cbrtf"},
-        {"ident":"cbrtfN"},
-        {"ident":"cbrtfNx"},
-        {"ident":"cbrtl"},
-        {"ident":"ccos"},
-        {"ident":"ccosf"},
-        {"ident":"ccosfN"},
-        {"ident":"ccosfNx"},
-        {"ident":"ccosh"},
-        {"ident":"ccoshf"},
-        {"ident":"ccoshfN"},
-        {"ident":"ccoshfNx"},
-        {"ident":"ccoshl"},
-        {"ident":"ccosl"},
-        {"ident":"ceil"},
-        {"ident":"ceilf"},
-        {"ident":"ceilfN"},
-        {"ident":"ceilfNx"},
-        {"ident":"ceill"},
-        {"ident":"cexp"},
-        {"ident":"cexpf"},
-        {"ident":"cexpfN"},
-        {"ident":"cexpfNx"},
-        {"ident":"cexpl"},
-        {"ident":"cfgetispeed"},
-        {"ident":"cfgetospeed"},
-        {"ident":"cfmakeraw"},
-        {"ident":"cfsetispeed"},
-        {"ident":"cfsetospeed"},
-        {"ident":"cfsetspeed"},
-        {"ident":"chdir"},
-        {"ident":"chmod"},
-        {"ident":"chmod"},
-        {"ident":"chown"},
-        {"ident":"cimag"},
-        {"ident":"cimagf"},
-        {"ident":"cimagfN"},
-        {"ident":"cimagfNx"},
-        {"ident":"cimagl"},
-        {"ident":"clearenv"},
-        {"ident":"clearerr"},
-        {"ident":"clearerr_unlocked"},
-        {"ident":"clock"},
-        {"ident":"clog"},
-        {"ident":"clog10"},
-        {"ident":"clog10f"},
-        {"ident":"clog10fN"},
-        {"ident":"clog10fNx"},
-        {"ident":"clog10l"},
-        {"ident":"clogf"},
-        {"ident":"clogfN"},
-        {"ident":"clogfNx"},
-        {"ident":"clogl"},
-        {"ident":"close"},
-        {"ident":"closedir"},
-        {"ident":"closelog"},
-        {"ident":"confstr"},
-        {"ident":"conj"},
-        {"ident":"conjf"},
-        {"ident":"conjfN"},
-        {"ident":"conjfNx"},
-        {"ident":"conjl"},
-        {"ident":"connect"},
-        {"ident":"continue"},
-        {"ident":"copysign"},
-        {"ident":"copysignf"},
-        {"ident":"copysignfN"},
-        {"ident":"copysignfNx"},
-        {"ident":"copysignl"},
-        {"ident":"cos"},
-        {"ident":"cosf"},
-        {"ident":"cosfN"},
-        {"ident":"cosfNx"},
-        {"ident":"cosh"},
-        {"ident":"coshf"},
-        {"ident":"coshfN"},
-        {"ident":"coshfNx"},
-        {"ident":"coshl"},
-        {"ident":"cosl"},
-        {"ident":"cpow"},
-        {"ident":"cpowf"},
-        {"ident":"cpowfN"},
-        {"ident":"cpowfNx"},
-        {"ident":"cpowl"},
-        {"ident":"cproj"},
-        {"ident":"cprojf"},
-        {"ident":"cprojfN"},
-        {"ident":"cprojfNx"},
-        {"ident":"cprojl"},
-        {"ident":"CPU_CLR"},
-        {"ident":"CPU_ISSET"},
-        {"ident":"CPU_SET"},
-        {"ident":"CPU_ZERO"},
-        {"ident":"creal"},
-        {"ident":"crealf"},
-        {"ident":"crealfN"},
-        {"ident":"crealfNx"},
-        {"ident":"creall"},
-        {"ident":"creat"},
-        {"ident":"creat64"},
-        {"ident":"crypt"},
-        {"ident":"crypt_r"},
-        {"ident":"csin"},
-        {"ident":"csinf"},
-        {"ident":"csinfN"},
-        {"ident":"csinfNx"},
-        {"ident":"csinh"},
-        {"ident":"csinhf"},
-        {"ident":"csinhfN"},
-        {"ident":"csinhfNx"},
-        {"ident":"csinhl"},
-        {"ident":"csinl"},
-        {"ident":"csqrt"},
-        {"ident":"csqrtf"},
-        {"ident":"csqrtfN"},
-        {"ident":"csqrtfNx"},
-        {"ident":"csqrtl"},
-        {"ident":"ctan"},
-        {"ident":"ctanf"},
-        {"ident":"ctanfN"},
-        {"ident":"ctanfNx"},
-        {"ident":"ctanh"},
-        {"ident":"ctanhf"},
-        {"ident":"ctanhfN"},
-        {"ident":"ctanhfNx"},
-        {"ident":"ctanhl"},
-        {"ident":"ctanl"},
-        {"ident":"ctermid"},
-        {"ident":"ctime"},
-        {"ident":"ctime_r"},
-        {"ident":"cuserid"},
-        {"ident":"dcgettext"},
-        {"ident":"dcngettext"},
-        {"ident":"DES_FAILED"},
-        {"ident":"des_setparity"},
-        {"ident":"dgettext"},
-        {"ident":"difftime"},
-        {"ident":"dirfd"},
-        {"ident":"dirname"},
-        {"ident":"div"},
-        {"ident":"dngettext"},
-        {"ident":"drand48"},
-        {"ident":"drand48_r"},
-        {"ident":"drem"},
-        {"ident":"dremf"},
-        {"ident":"dreml"},
-        {"ident":"DTTOIF"},
-        {"ident":"dup"},
-        {"ident":"dup2"},
-        {"ident":"ecb_crypt"},
-        {"ident":"ecvt"},
-        {"ident":"ecvt_r"},
-        {"ident":"encrypt"},
-        {"ident":"encrypt_r"},
-        {"ident":"endfsent"},
-        {"ident":"endgrent"},
-        {"ident":"endhostent"},
-        {"ident":"endmntent"},
-        {"ident":"endnetent"},
-        {"ident":"endnetgrent"},
-        {"ident":"endprotoent"},
-        {"ident":"endpwent"},
-        {"ident":"endservent"},
-        {"ident":"endutent"},
-        {"ident":"endutxent"},
-        {"ident":"envz_add"},
-        {"ident":"envz_entry"},
-        {"ident":"envz_get"},
-        {"ident":"envz_merge"},
-        {"ident":"envz_remove"},
-        {"ident":"envz_strip"},
-        {"ident":"erand48"},
-        {"ident":"erand48_r"},
-        {"ident":"erf"},
-        {"ident":"erfc"},
-        {"ident":"erfcf"},
-        {"ident":"erfcfN"},
-        {"ident":"erfcfNx"},
-        {"ident":"erfcl"},
-        {"ident":"erff"},
-        {"ident":"erffN"},
-        {"ident":"erffNx"},
-        {"ident":"erfl"},
-        {"ident":"err"},
-        {"ident":"error"},
-        {"ident":"error_at_line"},
-        {"ident":"errx"},
-        {"ident":"execl"},
-        {"ident":"execle"},
-        {"ident":"execlp"},
-        {"ident":"execv"},
-        {"ident":"execve"},
-        {"ident":"execvp"},
-        {"ident":"exit"},
-        {"ident":"exp"},
-        {"ident":"exp10"},
-        {"ident":"exp10f"},
-        {"ident":"exp10fN"},
-        {"ident":"exp10fNx"},
-        {"ident":"exp10l"},
-        {"ident":"exp2"},
-        {"ident":"exp2f"},
-        {"ident":"exp2fN"},
-        {"ident":"exp2fNx"},
-        {"ident":"exp2l"},
-        {"ident":"expf"},
-        {"ident":"expfN"},
-        {"ident":"expfNx"},
-        {"ident":"expl"},
-        {"ident":"explicit_bzero"},
-        {"ident":"expm1"},
-        {"ident":"expm1f"},
-        {"ident":"expm1fN"},
-        {"ident":"expm1fNx"},
-        {"ident":"expm1l"},
-        {"ident":"fabs"},
-        {"ident":"fabsf"},
-        {"ident":"fabsfN"},
-        {"ident":"fabsfNx"},
-        {"ident":"fabsl"},
-        {"ident":"fchdir"},
-        {"ident":"fchmod"},
-        {"ident":"fchown"},
-        {"ident":"fclose"},
-        {"ident":"fcloseall"},
-        {"ident":"fcntl"},
-        {"ident":"fcvt"},
-        {"ident":"fcvt_r"},
-        {"ident":"FD_CLR"},
-        {"ident":"FD_ISSET"},
-        {"ident":"FD_SET"},
-        {"ident":"FD_ZERO"},
-        {"ident":"fdatasync"},
-        {"ident":"fdim"},
-        {"ident":"fdimf"},
-        {"ident":"fdimfN"},
-        {"ident":"fdimfNx"},
-        {"ident":"fdiml"},
-        {"ident":"fdopen"},
-        {"ident":"fdopendir"},
-        {"ident":"feclearexcept"},
-        {"ident":"fedisableexcept"},
-        {"ident":"feenableexcept"},
-        {"ident":"fegetenv"},
-        {"ident":"fegetexcept"},
-        {"ident":"fegetexceptflag"},
-        {"ident":"fegetmode"},
-        {"ident":"fegetround"},
-        {"ident":"feholdexcept"},
-        {"ident":"feof"},
-        {"ident":"feof_unlocked"},
-        {"ident":"feraiseexcept"},
-        {"ident":"ferror"},
-        {"ident":"ferror_unlocked"},
-        {"ident":"fesetenv"},
-        {"ident":"fesetexcept"},
-        {"ident":"fesetexceptflag"},
-        {"ident":"fesetmode"},
-        {"ident":"fesetround"},
-        {"ident":"fetestexcept"},
-        {"ident":"fetestexceptflag"},
-        {"ident":"feupdateenv"},
-        {"ident":"fflush"},
-        {"ident":"fflush_unlocked"},
-        {"ident":"fgetc"},
-        {"ident":"fgetc_unlocked"},
-        {"ident":"fgetgrent"},
-        {"ident":"fgetgrent_r"},
-        {"ident":"fgetpos"},
-        {"ident":"fgetpos64"},
-        {"ident":"fgetpwent"},
-        {"ident":"fgetpwent_r"},
-        {"ident":"fgets"},
-        {"ident":"fgets_unlocked"},
-        {"ident":"fgetwc"},
-        {"ident":"fgetwc_unlocked"},
-        {"ident":"fgetws"},
-        {"ident":"fgetws_unlocked"},
-        {"ident":"fileno"},
-        {"ident":"fileno_unlocked"},
-        {"ident":"finite"},
-        {"ident":"finitef"},
-        {"ident":"finitel"},
-        {"ident":"flockfile"},
-        {"ident":"floor"},
-        {"ident":"floorf"},
-        {"ident":"floorfN"},
-        {"ident":"floorfNx"},
-        {"ident":"floorl"},
-        {"ident":"fma"},
-        {"ident":"fmaf"},
-        {"ident":"fmafN"},
-        {"ident":"fmafNx"},
-        {"ident":"fmal"},
-        {"ident":"fmax"},
-        {"ident":"fmaxf"},
-        {"ident":"fmaxfN"},
-        {"ident":"fmaxfNx"},
-        {"ident":"fmaxl"},
-        {"ident":"fmaxmag"},
-        {"ident":"fmaxmagf"},
-        {"ident":"fmaxmagfN"},
-        {"ident":"fmaxmagfNx"},
-        {"ident":"fmaxmagl"},
-        {"ident":"fmemopen"},
-        {"ident":"fmin"},
-        {"ident":"fminf"},
-        {"ident":"fminfN"},
-        {"ident":"fminfNx"},
-        {"ident":"fminl"},
-        {"ident":"fminmag"},
-        {"ident":"fminmagf"},
-        {"ident":"fminmagfN"},
-        {"ident":"fminmagfNx"},
-        {"ident":"fminmagl"},
-        {"ident":"fmod"},
-        {"ident":"fmodf"},
-        {"ident":"fmodfN"},
-        {"ident":"fmodfNx"},
-        {"ident":"fmodl"},
-        {"ident":"fmtmsg"},
-        {"ident":"fnmatch"},
-        {"ident":"fopen"},
-        {"ident":"fopen64"},
-        {"ident":"fopencookie"},
-        {"ident":"fork"},
-        {"ident":"forkpty"},
-        {"ident":"fpathconf"},
-        {"ident":"fpclassify"},
-        {"ident":"fprintf"},
-        {"ident":"fputc"},
-        {"ident":"fputc_unlocked"},
-        {"ident":"fputs"},
-        {"ident":"fputs_unlocked"},
-        {"ident":"fputwc"},
-        {"ident":"fputwc_unlocked"},
-        {"ident":"fputws"},
-        {"ident":"fputws_unlocked"},
-        {"ident":"fread"},
-        {"ident":"fread_unlocked"},
-        {"ident":"free"},
-        {"ident":"freopen"},
-        {"ident":"freopen64"},
-        {"ident":"frexp"},
-        {"ident":"frexpf"},
-        {"ident":"frexpfN"},
-        {"ident":"frexpfNx"},
-        {"ident":"frexpl"},
-        {"ident":"fromfp"},
-        {"ident":"fromfpf"},
-        {"ident":"fromfpfN"},
-        {"ident":"fromfpfNx"},
-        {"ident":"fromfpl"},
-        {"ident":"fromfpx"},
-        {"ident":"fromfpxf"},
-        {"ident":"fromfpxfN"},
-        {"ident":"fromfpxfNx"},
-        {"ident":"fromfpxl"},
-        {"ident":"fscanf"},
-        {"ident":"fseek"},
-        {"ident":"fseeko"},
-        {"ident":"fseeko64"},
-        {"ident":"fsetpos"},
-        {"ident":"fsetpos64"},
-        {"ident":"fstat"},
-        {"ident":"fstat64"},
-        {"ident":"fsync"},
-        {"ident":"ftell"},
-        {"ident":"ftello"},
-        {"ident":"ftello64"},
-        {"ident":"ftruncate"},
-        {"ident":"ftruncate64"},
-        {"ident":"ftrylockfile"},
-        {"ident":"ftw"},
-        {"ident":"ftw64"},
-        {"ident":"funlockfile"},
-        {"ident":"futimes"},
-        {"ident":"fwide"},
-        {"ident":"fwprintf"},
-        {"ident":"fwrite"},
-        {"ident":"fwrite_unlocked"},
-        {"ident":"fwscanf"},
-        {"ident":"gamma"},
-        {"ident":"gammaf"},
-        {"ident":"gammal"},
-        {"ident":"gcvt"},
-        {"ident":"get_avphys_pages"},
-        {"ident":"get_current_dir_name"},
-        {"ident":"get_nprocs"},
-        {"ident":"get_nprocs_conf"},
-        {"ident":"get_phys_pages"},
-        {"ident":"getauxval"},
-        {"ident":"getc"},
-        {"ident":"getc_unlocked"},
-        {"ident":"getchar"},
-        {"ident":"getchar_unlocked"},
-        {"ident":"getcontext"},
-        {"ident":"getcwd"},
-        {"ident":"getdate"},
-        {"ident":"getdate_r"},
-        {"ident":"getdelim"},
-        {"ident":"getdomainnname"},
-        {"ident":"getegid"},
-        {"ident":"getentropy"},
-        {"ident":"getenv"},
-        {"ident":"geteuid"},
-        {"ident":"getfsent"},
-        {"ident":"getfsfile"},
-        {"ident":"getfsspec"},
-        {"ident":"getgid"},
-        {"ident":"getgrent"},
-        {"ident":"getgrent_r"},
-        {"ident":"getgrgid"},
-        {"ident":"getgrgid_r"},
-        {"ident":"getgrnam"},
-        {"ident":"getgrnam_r"},
-        {"ident":"getgrouplist"},
-        {"ident":"getgroups"},
-        {"ident":"gethostbyaddr"},
-        {"ident":"gethostbyaddr_r"},
-        {"ident":"gethostbyname"},
-        {"ident":"gethostbyname2"},
-        {"ident":"gethostbyname2_r"},
-        {"ident":"gethostbyname_r"},
-        {"ident":"gethostent"},
-        {"ident":"gethostid"},
-        {"ident":"gethostname"},
-        {"ident":"getitimer"},
-        {"ident":"getline"},
-        {"ident":"getloadavg"},
-        {"ident":"getlogin"},
-        {"ident":"getmntent"},
-        {"ident":"getmntent_r"},
-        {"ident":"getnetbyaddr"},
-        {"ident":"getnetbyname"},
-        {"ident":"getnetent"},
-        {"ident":"getnetgrent"},
-        {"ident":"getnetgrent_r"},
-        {"ident":"getopt"},
-        {"ident":"getopt_long"},
-        {"ident":"getopt_long_only"},
-        {"ident":"getpagesize"},
-        {"ident":"getpass"},
-        {"ident":"getpayload"},
-        {"ident":"getpayloadf"},
-        {"ident":"getpayloadfN"},
-        {"ident":"getpayloadfNx"},
-        {"ident":"getpayloadl"},
-        {"ident":"getpeername"},
-        {"ident":"getpgid"},
-        {"ident":"getpgrp"},
-        {"ident":"getpid"},
-        {"ident":"getppid"},
-        {"ident":"getpriority"},
-        {"ident":"getprotobyname"},
-        {"ident":"getprotobynumber"},
-        {"ident":"getprotoent"},
-        {"ident":"getpt"},
-        {"ident":"getpwent"},
-        {"ident":"getpwent_r"},
-        {"ident":"getpwnam"},
-        {"ident":"getpwnam_r"},
-        {"ident":"getpwuid"},
-        {"ident":"getpwuid_r"},
-        {"ident":"getrandom"},
-        {"ident":"getrlimit"},
-        {"ident":"getrlimit64"},
-        {"ident":"getrusage"},
-        {"ident":"gets"},
-        {"ident":"getservbyname"},
-        {"ident":"getservbyport"},
-        {"ident":"getservent"},
-        {"ident":"getsid"},
-        {"ident":"getsockname"},
-        {"ident":"getsockopt"},
-        {"ident":"getsubopt"},
-        {"ident":"gettext"},
-        {"ident":"gettimeofday"},
-        {"ident":"getuid"},
-        {"ident":"getumask"},
-        {"ident":"getutent"},
-        {"ident":"getutent_r"},
-        {"ident":"getutid"},
-        {"ident":"getutid_r"},
-        {"ident":"getutline"},
-        {"ident":"getutline_r"},
-        {"ident":"getutmp"},
-        {"ident":"getutmpx"},
-        {"ident":"getutxent"},
-        {"ident":"getutxid"},
-        {"ident":"getutxline"},
-        {"ident":"getw"},
-        {"ident":"getwc"},
-        {"ident":"getwc_unlocked"},
-        {"ident":"getwchar"},
-        {"ident":"getwchar_unlocked"},
-        {"ident":"getwd"},
-        {"ident":"glob"},
-        {"ident":"glob64"},
-        {"ident":"globfree"},
-        {"ident":"globfree64"},
-        {"ident":"gmtime"},
-        {"ident":"gmtime_r"},
-        {"ident":"grantpt"},
-        {"ident":"grantpt"},
-        {"ident":"gsignal"},
-        {"ident":"gtty"},
-        {"ident":"hasmntopt"},
-        {"ident":"hcreate"},
-        {"ident":"hcreate_r"},
-        {"ident":"hdestroy"},
-        {"ident":"hdestroy_r"},
-        {"ident":"hsearch"},
-        {"ident":"hsearch_r"},
-        {"ident":"htonl"},
-        {"ident":"htons"},
-        {"ident":"hypot"},
-        {"ident":"hypotf"},
-        {"ident":"hypotfN"},
-        {"ident":"hypotfNx"},
-        {"ident":"hypotl"},
-        {"ident":"iconv"},
-        {"ident":"iconv_close"},
-        {"ident":"iconv_open"},
-        {"ident":"if_freenameindex"},
-        {"ident":"if_indextoname"},
-        {"ident":"if_nameindex"},
-        {"ident":"if_nametoindex"},
-        {"ident":"IFTODT"},
-        {"ident":"ilogb"},
-        {"ident":"ilogbf"},
-        {"ident":"ilogbfN"},
-        {"ident":"ilogbfNx"},
-        {"ident":"ilogbl"},
-        {"ident":"imaxabs"},
-        {"ident":"imaxdiv"},
-        {"ident":"index"},
-        {"ident":"inet_addr"},
-        {"ident":"inet_aton"},
-        {"ident":"inet_lnaof"},
-        {"ident":"inet_makeaddr"},
-        {"ident":"inet_netof"},
-        {"ident":"inet_network"},
-        {"ident":"inet_ntoa"},
-        {"ident":"inet_ntop"},
-        {"ident":"inet_pton"},
-        {"ident":"initgroups"},
-        {"ident":"initstate"},
-        {"ident":"initstate_r"},
-        {"ident":"innetgr"},
-        {"ident":"ioctl"},
-        {"ident":"isalnum"},
-        {"ident":"isalpha"},
-        {"ident":"isascii"},
-        {"ident":"isatty"},
-        {"ident":"isblank"},
-        {"ident":"iscanonical"},
-        {"ident":"iscntrl"},
-        {"ident":"isdigit"},
-        {"ident":"iseqsig"},
-        {"ident":"isfinite"},
-        {"ident":"isgraph"},
-        {"ident":"isgreater"},
-        {"ident":"isgreaterequal"},
-        {"ident":"isinf"},
-        {"ident":"isinff"},
-        {"ident":"isinfl"},
-        {"ident":"isless"},
-        {"ident":"islessequal"},
-        {"ident":"islessgreater"},
-        {"ident":"islower"},
-        {"ident":"isnan"},
-        {"ident":"isnan"},
-        {"ident":"isnanf"},
-        {"ident":"isnanl"},
-        {"ident":"isnormal"},
-        {"ident":"isprint"},
-        {"ident":"ispunct"},
-        {"ident":"issignaling"},
-        {"ident":"isspace"},
-        {"ident":"issubnormal"},
-        {"ident":"isunordered"},
-        {"ident":"isupper"},
-        {"ident":"iswalnum"},
-        {"ident":"iswalpha"},
-        {"ident":"iswblank"},
-        {"ident":"iswcntrl"},
-        {"ident":"iswctype"},
-        {"ident":"iswdigit"},
-        {"ident":"iswgraph"},
-        {"ident":"iswlower"},
-        {"ident":"iswprint"},
-        {"ident":"iswpunct"},
-        {"ident":"iswspace"},
-        {"ident":"iswupper"},
-        {"ident":"iswxdigit"},
-        {"ident":"isxdigit"},
-        {"ident":"iszero"},
-        {"ident":"j0"},
-        {"ident":"j0f"},
-        {"ident":"j0fN"},
-        {"ident":"j0fNx"},
-        {"ident":"j0l"},
-        {"ident":"j1"},
-        {"ident":"j1f"},
-        {"ident":"j1fN"},
-        {"ident":"j1fNx"},
-        {"ident":"j1l"},
-        {"ident":"jn"},
-        {"ident":"jnf"},
-        {"ident":"jnfN"},
-        {"ident":"jnfNx"},
-        {"ident":"jnl"},
-        {"ident":"jrand48"},
-        {"ident":"jrand48_r"},
-        {"ident":"kill"},
-        {"ident":"killpg"},
-        {"ident":"l64a"},
-        {"ident":"labs"},
-        {"ident":"lcong48"},
-        {"ident":"lcong48_r"},
-        {"ident":"ldexp"},
-        {"ident":"ldexpf"},
-        {"ident":"ldexpfN"},
-        {"ident":"ldexpfNx"},
-        {"ident":"ldexpl"},
-        {"ident":"ldiv"},
-        {"ident":"lfind"},
-        {"ident":"lgamma"},
-        {"ident":"lgamma_r"},
-        {"ident":"lgammaf"},
-        {"ident":"lgammaf_r"},
-        {"ident":"lgammafN"},
-        {"ident":"lgammafN_r"},
-        {"ident":"lgammafNx"},
-        {"ident":"lgammafNx_r"},
-        {"ident":"lgammal"},
-        {"ident":"lgammal_r"},
-        {"ident":"link"},
-        {"ident":"lio_listio"},
-        {"ident":"lio_listio64"},
-        {"ident":"listen"},
-        {"ident":"llabs"},
-        {"ident":"lldiv"},
-        {"ident":"llogb"},
-        {"ident":"llogbf"},
-        {"ident":"llogbfN"},
-        {"ident":"llogbfNx"},
-        {"ident":"llogbl"},
-        {"ident":"llrint"},
-        {"ident":"llrintf"},
-        {"ident":"llrintfN"},
-        {"ident":"llrintfNx"},
-        {"ident":"llrintl"},
-        {"ident":"llround"},
-        {"ident":"llroundf"},
-        {"ident":"llroundfN"},
-        {"ident":"llroundfNx"},
-        {"ident":"llroundl"},
-        {"ident":"localeconv"},
-        {"ident":"localtime"},
-        {"ident":"localtime_r"},
-        {"ident":"log"},
-        {"ident":"log10"},
-        {"ident":"log10f"},
-        {"ident":"log10fN"},
-        {"ident":"log10fNx"},
-        {"ident":"log10l"},
-        {"ident":"log1p"},
-        {"ident":"log1pf"},
-        {"ident":"log1pfN"},
-        {"ident":"log1pfNx"},
-        {"ident":"log1pl"},
-        {"ident":"log2"},
-        {"ident":"log2f"},
-        {"ident":"log2fN"},
-        {"ident":"log2fNx"},
-        {"ident":"log2l"},
-        {"ident":"logb"},
-        {"ident":"logbf"},
-        {"ident":"logbfN"},
-        {"ident":"logbfNx"},
-        {"ident":"logbl"},
-        {"ident":"logf"},
-        {"ident":"logfN"},
-        {"ident":"logfNx"},
-        {"ident":"login"},
-        {"ident":"login_tty"},
-        {"ident":"logl"},
-        {"ident":"logout"},
-        {"ident":"logwtmp"},
-        {"ident":"longjmp"},
-        {"ident":"lrand48"},
-        {"ident":"lrand48_r"},
-        {"ident":"lrint"},
-        {"ident":"lrintf"},
-        {"ident":"lrintfN"},
-        {"ident":"lrintfNx"},
-        {"ident":"lrintl"},
-        {"ident":"lround"},
-        {"ident":"lroundf"},
-        {"ident":"lroundfN"},
-        {"ident":"lroundfNx"},
-        {"ident":"lroundl"},
-        {"ident":"lsearch"},
-        {"ident":"lseek"},
-        {"ident":"lseek64"},
-        {"ident":"lstat"},
-        {"ident":"lstat64"},
-        {"ident":"lutimes"},
-        {"ident":"madvise"},
-        {"ident":"main"},
-        {"ident":"makecontext"},
-        {"ident":"mallinfo"},
-        {"ident":"malloc"},
-        {"ident":"mallopt"},
-        {"ident":"matherr"},
-        {"ident":"mblen"},
-        {"ident":"mbrlen"},
-        {"ident":"mbrtowc"},
-        {"ident":"mbsinit"},
-        {"ident":"mbsnrtowcs"},
-        {"ident":"mbsrtowcs"},
-        {"ident":"mbstowcs"},
-        {"ident":"mbtowc"},
-        {"ident":"mcheck"},
-        {"ident":"memalign"},
-        {"ident":"memccpy"},
-        {"ident":"memchr"},
-        {"ident":"memcmp"},
-        {"ident":"memcpy"},
-        {"ident":"memfrob"},
-        {"ident":"memmem"},
-        {"ident":"memmove"},
-        {"ident":"mempcpy"},
-        {"ident":"memrchr"},
-        {"ident":"memset"},
-        {"ident":"merge"},
-        {"ident":"mkdir"},
-        {"ident":"mkdtemp"},
-        {"ident":"mkfifo"},
-        {"ident":"mknod"},
-        {"ident":"mkstemp"},
-        {"ident":"mktemp"},
-        {"ident":"mktime"},
-        {"ident":"mlock"},
-        {"ident":"mlockall"},
-        {"ident":"mmap"},
-        {"ident":"mmap64"},
-        {"ident":"modf"},
-        {"ident":"modff"},
-        {"ident":"modffN"},
-        {"ident":"modffNx"},
-        {"ident":"modfl"},
-        {"ident":"mount"},
-        {"ident":"mprobe"},
-        {"ident":"mrand48"},
-        {"ident":"mrand48_r"},
-        {"ident":"mremap"},
-        {"ident":"msync"},
-        {"ident":"mtrace"},
-        {"ident":"munlock"},
-        {"ident":"munlockall"},
-        {"ident":"munmap"},
-        {"ident":"muntrace"},
-        {"ident":"nan"},
-        {"ident":"nanf"},
-        {"ident":"nanfN"},
-        {"ident":"nanfNx"},
-        {"ident":"nanl"},
-        {"ident":"nanosleep"},
-        {"ident":"nearbyint"},
-        {"ident":"nearbyintf"},
-        {"ident":"nearbyintfN"},
-        {"ident":"nearbyintfNx"},
-        {"ident":"nearbyintl"},
-        {"ident":"nextafter"},
-        {"ident":"nextafterf"},
-        {"ident":"nextafterfN"},
-        {"ident":"nextafterfNx"},
-        {"ident":"nextafterl"},
-        {"ident":"nextdown"},
-        {"ident":"nextdownf"},
-        {"ident":"nextdownfN"},
-        {"ident":"nextdownfNx"},
-        {"ident":"nextdownl"},
-        {"ident":"nexttoward"},
-        {"ident":"nexttowardf"},
-        {"ident":"nexttowardl"},
-        {"ident":"nextup"},
-        {"ident":"nextupf"},
-        {"ident":"nextupfN"},
-        {"ident":"nextupfNx"},
-        {"ident":"nextupl"},
-        {"ident":"nftw"},
-        {"ident":"nftw64"},
-        {"ident":"ngettext"},
-        {"ident":"nice"},
-        {"ident":"nl_langinfo"},
-        {"ident":"notfound"},
-        {"ident":"nrand48"},
-        {"ident":"nrand48_r"},
-        {"ident":"ntohl"},
-        {"ident":"ntohs"},
-        {"ident":"ntp_adjtime"},
-        {"ident":"ntp_gettime"},
-        {"ident":"obstack_1grow"},
-        {"ident":"obstack_1grow_fast"},
-        {"ident":"obstack_alignment_mask"},
-        {"ident":"obstack_alloc"},
-        {"ident":"obstack_base"},
-        {"ident":"obstack_blank"},
-        {"ident":"obstack_blank_fast"},
-        {"ident":"obstack_chunk_alloc"},
-        {"ident":"obstack_chunk_free"},
-        {"ident":"obstack_chunk_size"},
-        {"ident":"obstack_copy"},
-        {"ident":"obstack_copy0"},
-        {"ident":"obstack_finish"},
-        {"ident":"obstack_free"},
-        {"ident":"obstack_grow"},
-        {"ident":"obstack_grow0"},
-        {"ident":"obstack_init"},
-        {"ident":"obstack_int_grow"},
-        {"ident":"obstack_int_grow_fast"},
-        {"ident":"obstack_next_free"},
-        {"ident":"obstack_object_size"},
-        {"ident":"obstack_object_size"},
-        {"ident":"obstack_printf"},
-        {"ident":"obstack_ptr_grow"},
-        {"ident":"obstack_ptr_grow_fast"},
-        {"ident":"obstack_room"},
-        {"ident":"obstack_vprintf"},
-        {"ident":"offsetof"},
-        {"ident":"on_exit"},
-        {"ident":"open"},
-        {"ident":"open64"},
-        {"ident":"open_memstream"},
-        {"ident":"opendir"},
-        {"ident":"openlog"},
-        {"ident":"openpty"},
-        {"ident":"parse_printf_format"},
-        {"ident":"pathconf"},
-        {"ident":"pause"},
-        {"ident":"pclose"},
-        {"ident":"perror"},
-        {"ident":"pipe"},
-        {"ident":"popen"},
-        {"ident":"posix_fallocate"},
-        {"ident":"posix_fallocate64"},
-        {"ident":"posix_memalign"},
-        {"ident":"pow"},
-        {"ident":"pow10"},
-        {"ident":"pow10f"},
-        {"ident":"pow10l"},
-        {"ident":"powf"},
-        {"ident":"powfN"},
-        {"ident":"powfNx"},
-        {"ident":"powl"},
-        {"ident":"pread"},
-        {"ident":"pread64"},
-        {"ident":"preadv"},
-        {"ident":"preadv2"},
-        {"ident":"preadv64"},
-        {"ident":"preadv64v2"},
-        {"ident":"printf"},
-        {"ident":"printf_size"},
-        {"ident":"printf_size_info"},
-        {"ident":"psignal"},
-        {"ident":"pthread_getattr_default_np"},
-        {"ident":"pthread_getspecific"},
-        {"ident":"pthread_key_create"},
-        {"ident":"pthread_key_delete"},
-        {"ident":"pthread_setattr_default_np"},
-        {"ident":"pthread_setspecific"},
-        {"ident":"ptsname"},
-        {"ident":"ptsname_r"},
-        {"ident":"putc"},
-        {"ident":"putc_unlocked"},
-        {"ident":"putchar"},
-        {"ident":"putchar_unlocked"},
-        {"ident":"putenv"},
-        {"ident":"putpwent"},
-        {"ident":"puts"},
-        {"ident":"pututline"},
-        {"ident":"pututxline"},
-        {"ident":"putw"},
-        {"ident":"putwc"},
-        {"ident":"putwc_unlocked"},
-        {"ident":"putwchar"},
-        {"ident":"putwchar_unlocked"},
-        {"ident":"pwrite"},
-        {"ident":"pwrite64"},
-        {"ident":"pwritev"},
-        {"ident":"pwritev2"},
-        {"ident":"pwritev64"},
-        {"ident":"pwritev64v2"},
-        {"ident":"qecvt"},
-        {"ident":"qecvt_r"},
-        {"ident":"qfcvt"},
-        {"ident":"qfcvt_r"},
-        {"ident":"qgcvt"},
-        {"ident":"qsort"},
-        {"ident":"raise"},
-        {"ident":"rand"},
-        {"ident":"rand_r"},
-        {"ident":"random"},
-        {"ident":"random_r"},
-        {"ident":"rawmemchr"},
-        {"ident":"read"},
-        {"ident":"readdir"},
-        {"ident":"readdir64"},
-        {"ident":"readdir64_r"},
-        {"ident":"readdir_r"},
-        {"ident":"readlink"},
-        {"ident":"readv"},
-        {"ident":"realloc"},
-        {"ident":"reallocarray"},
-        {"ident":"realpath"},
-        {"ident":"recv"},
-        {"ident":"recvfrom"},
-        {"ident":"regcomp"},
-        {"ident":"regerror"},
-        {"ident":"regexec"},
-        {"ident":"regfree"},
-        {"ident":"register_printf_function"},
-        {"ident":"remainder"},
-        {"ident":"remainderf"},
-        {"ident":"remainderfN"},
-        {"ident":"remainderfNx"},
-        {"ident":"remainderl"},
-        {"ident":"remove"},
-        {"ident":"rename"},
-        {"ident":"return"},
-        {"ident":"rewind"},
-        {"ident":"rewinddir"},
-        {"ident":"rindex"},
-        {"ident":"rint"},
-        {"ident":"rintf"},
-        {"ident":"rintfN"},
-        {"ident":"rintfNx"},
-        {"ident":"rintl"},
-        {"ident":"rmdir"},
-        {"ident":"round"},
-        {"ident":"roundeven"},
-        {"ident":"roundevenf"},
-        {"ident":"roundevenfN"},
-        {"ident":"roundevenfNx"},
-        {"ident":"roundevenl"},
-        {"ident":"roundf"},
-        {"ident":"roundfN"},
-        {"ident":"roundfNx"},
-        {"ident":"roundl"},
-        {"ident":"rpmatch"},
-        {"ident":"S_ISBLK"},
-        {"ident":"S_ISCHR"},
-        {"ident":"S_ISDIR"},
-        {"ident":"S_ISFIFO"},
-        {"ident":"S_ISLNK"},
-        {"ident":"S_ISREG"},
-        {"ident":"S_ISSOCK"},
-        {"ident":"S_TYPEISMQ"},
-        {"ident":"S_TYPEISSEM"},
-        {"ident":"S_TYPEISSHM"},
-        {"ident":"sbrk"},
-        {"ident":"scalb"},
-        {"ident":"scalbf"},
-        {"ident":"scalbl"},
-        {"ident":"scalbln"},
-        {"ident":"scalblnf"},
-        {"ident":"scalblnfN"},
-        {"ident":"scalblnfNx"},
-        {"ident":"scalblnl"},
-        {"ident":"scalbn"},
-        {"ident":"scalbnf"},
-        {"ident":"scalbnfN"},
-        {"ident":"scalbnfNx"},
-        {"ident":"scalbnl"},
-        {"ident":"scandir"},
-        {"ident":"scandir64"},
-        {"ident":"scanf"},
-        {"ident":"sched_get_priority_max"},
-        {"ident":"sched_get_priority_min"},
-        {"ident":"sched_getaffinity"},
-        {"ident":"sched_getparam"},
-        {"ident":"sched_getscheduler"},
-        {"ident":"sched_rr_get_interval"},
-        {"ident":"sched_setaffinity"},
-        {"ident":"sched_setparam"},
-        {"ident":"sched_setscheduler"},
-        {"ident":"sched_yield"},
-        {"ident":"secure_getenv"},
-        {"ident":"seed48"},
-        {"ident":"seed48_r"},
-        {"ident":"seekdir"},
-        {"ident":"select"},
-        {"ident":"sem_close"},
-        {"ident":"sem_destroy"},
-        {"ident":"sem_getvalue"},
-        {"ident":"sem_init"},
-        {"ident":"sem_open"},
-        {"ident":"sem_post"},
-        {"ident":"sem_timedwait"},
-        {"ident":"sem_trywait"},
-        {"ident":"sem_unlink"},
-        {"ident":"sem_wait"},
-        {"ident":"semctl"},
-        {"ident":"semget"},
-        {"ident":"semop"},
-        {"ident":"semtimedop"},
-        {"ident":"send"},
-        {"ident":"sendto"},
-        {"ident":"setbuf"},
-        {"ident":"setbuffer"},
-        {"ident":"setcontext"},
-        {"ident":"setdomainname"},
-        {"ident":"setegid"},
-        {"ident":"setenv"},
-        {"ident":"seteuid"},
-        {"ident":"setfsent"},
-        {"ident":"setgid"},
-        {"ident":"setgrent"},
-        {"ident":"setgroups"},
-        {"ident":"sethostent"},
-        {"ident":"sethostid"},
-        {"ident":"sethostname"},
-        {"ident":"setitimer"},
-        {"ident":"setjmp"},
-        {"ident":"setkey"},
-        {"ident":"setkey_r"},
-        {"ident":"setlinebuf"},
-        {"ident":"setlocale"},
-        {"ident":"setlogmask"},
-        {"ident":"setmntent"},
-        {"ident":"setnetent"},
-        {"ident":"setnetgrent"},
-        {"ident":"setpayload"},
-        {"ident":"setpayloadf"},
-        {"ident":"setpayloadfN"},
-        {"ident":"setpayloadfNx"},
-        {"ident":"setpayloadl"},
-        {"ident":"setpayloadsig"},
-        {"ident":"setpayloadsigf"},
-        {"ident":"setpayloadsigfN"},
-        {"ident":"setpayloadsigfNx"},
-        {"ident":"setpayloadsigl"},
-        {"ident":"setpgid"},
-        {"ident":"setpgrp"},
-        {"ident":"setpriority"},
-        {"ident":"setprotoent"},
-        {"ident":"setpwent"},
-        {"ident":"setregid"},
-        {"ident":"setreuid"},
-        {"ident":"setrlimit"},
-        {"ident":"setrlimit64"},
-        {"ident":"setservent"},
-        {"ident":"setsid"},
-        {"ident":"setsockopt"},
-        {"ident":"setstate"},
-        {"ident":"setstate_r"},
-        {"ident":"settimeofday"},
-        {"ident":"setuid"},
-        {"ident":"setutent"},
-        {"ident":"setutxent"},
-        {"ident":"setvbuf"},
-        {"ident":"shm_open"},
-        {"ident":"shm_unlink"},
-        {"ident":"shutdown"},
-        {"ident":"sigaction"},
-        {"ident":"sigaddset"},
-        {"ident":"sigaltstack"},
-        {"ident":"sigblock"},
-        {"ident":"sigdelset"},
-        {"ident":"sigemptyset"},
-        {"ident":"sigfillset"},
-        {"ident":"siginterrupt"},
-        {"ident":"sigismember"},
-        {"ident":"siglongjmp"},
-        {"ident":"sigmask"},
-        {"ident":"signal"},
-        {"ident":"signbit"},
-        {"ident":"significand"},
-        {"ident":"significandf"},
-        {"ident":"significandl"},
-        {"ident":"sigpause"},
-        {"ident":"sigpending"},
-        {"ident":"sigprocmask"},
-        {"ident":"sigsetjmp"},
-        {"ident":"sigsetmask"},
-        {"ident":"sigstack"},
-        {"ident":"sigsuspend"},
-        {"ident":"sin"},
-        {"ident":"sincos"},
-        {"ident":"sincosf"},
-        {"ident":"sincosfN"},
-        {"ident":"sincosfNx"},
-        {"ident":"sincosl"},
-        {"ident":"sinf"},
-        {"ident":"sinfN"},
-        {"ident":"sinfNx"},
-        {"ident":"sinh"},
-        {"ident":"sinhf"},
-        {"ident":"sinhfN"},
-        {"ident":"sinhfNx"},
-        {"ident":"sinhl"},
-        {"ident":"sinl"},
-        {"ident":"sleep"},
-        {"ident":"snprintf"},
-        {"ident":"socket"},
-        {"ident":"socketpair"},
-        {"ident":"sprintf"},
-        {"ident":"sqrt"},
-        {"ident":"sqrtf"},
-        {"ident":"sqrtfN"},
-        {"ident":"sqrtfNx"},
-        {"ident":"sqrtl"},
-        {"ident":"srand"},
-        {"ident":"srand48"},
-        {"ident":"srand48_r"},
-        {"ident":"srandom"},
-        {"ident":"srandom_r"},
-        {"ident":"sscanf"},
-        {"ident":"ssignal"},
-        {"ident":"stat"},
-        {"ident":"stat64"},
-        {"ident":"stime"},
-        {"ident":"stpcpy"},
-        {"ident":"stpncpy"},
-        {"ident":"strcasecmp"},
-        {"ident":"strcasestr"},
-        {"ident":"strcat"},
-        {"ident":"strchr"},
-        {"ident":"strchrnul"},
-        {"ident":"strcmp"},
-        {"ident":"strcoll"},
-        {"ident":"strcpy"},
-        {"ident":"strcspn"},
-        {"ident":"strdup"},
-        {"ident":"strdupa"},
-        {"ident":"strerror"},
-        {"ident":"strerror_r"},
-        {"ident":"strfmon"},
-        {"ident":"strfromd"},
-        {"ident":"strfromf"},
-        {"ident":"strfromfN"},
-        {"ident":"strfromfNx"},
-        {"ident":"strfroml"},
-        {"ident":"strfry"},
-        {"ident":"strftime"},
-        {"ident":"strlen"},
-        {"ident":"strncasecmp"},
-        {"ident":"strncat"},
-        {"ident":"strncmp"},
-        {"ident":"strncpy"},
-        {"ident":"strndup"},
-        {"ident":"strndupa"},
-        {"ident":"strnlen"},
-        {"ident":"strpbrk"},
-        {"ident":"strptime"},
-        {"ident":"strrchr"},
-        {"ident":"strsep"},
-        {"ident":"strsignal"},
-        {"ident":"strspn"},
-        {"ident":"strstr"},
-        {"ident":"strtod"},
-        {"ident":"strtof"},
-        {"ident":"strtofN"},
-        {"ident":"strtofNx"},
-        {"ident":"strtoimax"},
-        {"ident":"strtok"},
-        {"ident":"strtok_r"},
-        {"ident":"strtol"},
-        {"ident":"strtold"},
-        {"ident":"strtoll"},
-        {"ident":"strtoq"},
-        {"ident":"strtoul"},
-        {"ident":"strtoull"},
-        {"ident":"strtoumax"},
-        {"ident":"strtouq"},
-        {"ident":"strverscmp"},
-        {"ident":"strxfrm"},
-        {"ident":"stty"},
-        {"ident":"success"},
-        {"ident":"SUN_LEN"},
-        {"ident":"swapcontext"},
-        {"ident":"swprintf"},
-        {"ident":"swscanf"},
-        {"ident":"symlink"},
-        {"ident":"sync"},
-        {"ident":"syscall"},
-        {"ident":"sysconf"},
-        {"ident":"sysctl"},
-        {"ident":"syslog"},
-        {"ident":"system"},
-        {"ident":"sysv_signal"},
-        {"ident":"tan"},
-        {"ident":"tanf"},
-        {"ident":"tanfN"},
-        {"ident":"tanfNx"},
-        {"ident":"tanh"},
-        {"ident":"tanhf"},
-        {"ident":"tanhfN"},
-        {"ident":"tanhfNx"},
-        {"ident":"tanhl"},
-        {"ident":"tanl"},
-        {"ident":"tcdrain"},
-        {"ident":"tcflow"},
-        {"ident":"tcflush"},
-        {"ident":"tcgetattr"},
-        {"ident":"tcgetpgrp"},
-        {"ident":"tcgetsid"},
-        {"ident":"tcsendbreak"},
-        {"ident":"tcsetattr"},
-        {"ident":"tcsetpgrp"},
-        {"ident":"tdelete"},
-        {"ident":"tdestroy"},
-        {"ident":"telldir"},
-        {"ident":"TEMP_FAILURE_RETRY"},
-        {"ident":"tempnam"},
-        {"ident":"textdomain"},
-        {"ident":"tfind"},
-        {"ident":"tgamma"},
-        {"ident":"tgammaf"},
-        {"ident":"tgammafN"},
-        {"ident":"tgammafNx"},
-        {"ident":"tgammal"},
-        {"ident":"time"},
-        {"ident":"timegm"},
-        {"ident":"timelocal"},
-        {"ident":"times"},
-        {"ident":"tmpfile"},
-        {"ident":"tmpfile64"},
-        {"ident":"tmpnam"},
-        {"ident":"tmpnam_r"},
-        {"ident":"toascii"},
-        {"ident":"tolower"},
-        {"ident":"totalorder"},
-        {"ident":"totalorderf"},
-        {"ident":"totalorderfN"},
-        {"ident":"totalorderfNx"},
-        {"ident":"totalorderl"},
-        {"ident":"totalordermag"},
-        {"ident":"totalordermagf"},
-        {"ident":"totalordermagfN"},
-        {"ident":"totalordermagfNx"},
-        {"ident":"totalordermagl"},
-        {"ident":"toupper"},
-        {"ident":"towctrans"},
-        {"ident":"towlower"},
-        {"ident":"towupper"},
-        {"ident":"trunc"},
-        {"ident":"truncate"},
-        {"ident":"truncate64"},
-        {"ident":"truncf"},
-        {"ident":"truncfN"},
-        {"ident":"truncfNx"},
-        {"ident":"truncl"},
-        {"ident":"tryagain"},
-        {"ident":"tsearch"},
-        {"ident":"ttyname"},
-        {"ident":"ttyname_r"},
-        {"ident":"twalk"},
-        {"ident":"tzset"},
-        {"ident":"ufromfp"},
-        {"ident":"ufromfpf"},
-        {"ident":"ufromfpfN"},
-        {"ident":"ufromfpfNx"},
-        {"ident":"ufromfpl"},
-        {"ident":"ufromfpx"},
-        {"ident":"ufromfpxf"},
-        {"ident":"ufromfpxfN"},
-        {"ident":"ufromfpxfNx"},
-        {"ident":"ufromfpxl"},
-        {"ident":"ulimit"},
-        {"ident":"umask"},
-        {"ident":"umount"},
-        {"ident":"umount2"},
-        {"ident":"uname"},
-        {"ident":"unavail"},
-        {"ident":"ungetc"},
-        {"ident":"ungetwc"},
-        {"ident":"unlink"},
-        {"ident":"unlockpt"},
-        {"ident":"unsetenv"},
-        {"ident":"updwtmp"},
-        {"ident":"utime"},
-        {"ident":"utimes"},
-        {"ident":"utmpname"},
-        {"ident":"utmpxname"},
-        {"ident":"va_arg"},
-        {"ident":"va_copy"},
-        {"ident":"va_end"},
-        {"ident":"va_start"},
-        {"ident":"valloc"},
-        {"ident":"vasprintf"},
-        {"ident":"verr"},
-        {"ident":"verrx"},
-        {"ident":"versionsort"},
-        {"ident":"versionsort64"},
-        {"ident":"vfork"},
-        {"ident":"vfprintf"},
-        {"ident":"vfscanf"},
-        {"ident":"vfwprintf"},
-        {"ident":"vfwscanf"},
-        {"ident":"vlimit"},
-        {"ident":"vprintf"},
-        {"ident":"vscanf"},
-        {"ident":"vsnprintf"},
-        {"ident":"vsprintf"},
-        {"ident":"vsscanf"},
-        {"ident":"vswprintf"},
-        {"ident":"vswscanf"},
-        {"ident":"vsyslog"},
-        {"ident":"vtimes"},
-        {"ident":"vwarn"},
-        {"ident":"vwarnx"},
-        {"ident":"vwprintf"},
-        {"ident":"vwscanf"},
-        {"ident":"wait"},
-        {"ident":"wait3"},
-        {"ident":"wait4"},
-        {"ident":"waitpid"},
-        {"ident":"warn"},
-        {"ident":"warnx"},
-        {"ident":"WCOREDUMP"},
-        {"ident":"wcpcpy"},
-        {"ident":"wcpncpy"},
-        {"ident":"wcrtomb"},
-        {"ident":"wcscasecmp"},
-        {"ident":"wcscat"},
-        {"ident":"wcschr"},
-        {"ident":"wcschrnul"},
-        {"ident":"wcscmp"},
-        {"ident":"wcscoll"},
-        {"ident":"wcscpy"},
-        {"ident":"wcscspn"},
-        {"ident":"wcsdup"},
-        {"ident":"wcsftime"},
-        {"ident":"wcslen"},
-        {"ident":"wcsncasecmp"},
-        {"ident":"wcsncat"},
-        {"ident":"wcsncmp"},
-        {"ident":"wcsncpy"},
-        {"ident":"wcsnlen"},
-        {"ident":"wcsnrtombs"},
-        {"ident":"wcspbrk"},
-        {"ident":"wcsrchr"},
-        {"ident":"wcsrtombs"},
-        {"ident":"wcsspn"},
-        {"ident":"wcsstr"},
-        {"ident":"wcstod"},
-        {"ident":"wcstof"},
-        {"ident":"wcstofN"},
-        {"ident":"wcstofNx"},
-        {"ident":"wcstoimax"},
-        {"ident":"wcstok"},
-        {"ident":"wcstol"},
-        {"ident":"wcstold"},
-        {"ident":"wcstoll"},
-        {"ident":"wcstombs"},
-        {"ident":"wcstoq"},
-        {"ident":"wcstoul"},
-        {"ident":"wcstoull"},
-        {"ident":"wcstoumax"},
-        {"ident":"wcstouq"},
-        {"ident":"wcswcs"},
-        {"ident":"wcsxfrm"},
-        {"ident":"wctob"},
-        {"ident":"wctomb"},
-        {"ident":"wctrans"},
-        {"ident":"wctype"},
-        {"ident":"WEXITSTATUS"},
-        {"ident":"WIFEXITED"},
-        {"ident":"WIFSIGNALED"},
-        {"ident":"WIFSTOPPED"},
-        {"ident":"wmemchr"},
-        {"ident":"wmemcmp"},
-        {"ident":"wmemcpy"},
-        {"ident":"wmemmove"},
-        {"ident":"wmempcpy"},
-        {"ident":"wmemset"},
-        {"ident":"wordexp"},
-        {"ident":"wordfree"},
-        {"ident":"wprintf"},
-        {"ident":"write"},
-        {"ident":"writev"},
-        {"ident":"wscanf"},
-        {"ident":"WSTOPSIG"},
-        {"ident":"WTERMSIG"},
-        {"ident":"y0"},
-        {"ident":"y0f"},
-        {"ident":"y0fN"},
-        {"ident":"y0fNx"},
-        {"ident":"y0l"},
-        {"ident":"y1"},
-        {"ident":"y1f"},
-        {"ident":"y1fN"},
-        {"ident":"y1fNx"},
-        {"ident":"y1l"},
-        {"ident":"yn"},
-        {"ident":"ynf"},
-        {"ident":"ynfN"},
-        {"ident":"ynfNx"},
-        {"ident":"ynl"}
+        "__fbufsize",
+        "__flbf",
+        "__fpending",
+        "__fpurge",
+        "__freadable",
+        "__freading",
+        "__fsetlocking",
+        "__fwritable",
+        "__fwriting",
+        "__ppc_get_timebase",
+        "__ppc_get_timebase_freq",
+        "__ppc_mdoio",
+        "__ppc_mdoom",
+        "__ppc_set_ppr_low",
+        "__ppc_set_ppr_med",
+        "__ppc_set_ppr_med_high",
+        "__ppc_set_ppr_med_low",
+        "__ppc_set_ppr_very_low",
+        "__ppc_yield",
+        "__va_copy",
+        "_exit",
+        "_Exit",
+        "_flushlbf",
+        "_tolower",
+        "_toupper",
+        "a64l",
+        "abort",
+        "abs",
+        "accept",
+        "access",
+        "acos",
+        "acosf",
+        "acosfN",
+        "acosfNx",
+        "acosh",
+        "acoshf",
+        "acoshfN",
+        "acoshfNx",
+        "acoshl",
+        "acosl",
+        "addmntent",
+        "addseverity",
+        "adjtime",
+        "adjtimex",
+        "aio_cancel",
+        "aio_cancel64",
+        "aio_error",
+        "aio_error64",
+        "aio_fsync",
+        "aio_fsync64",
+        "aio_init",
+        "aio_read",
+        "aio_read64",
+        "aio_return",
+        "aio_return64",
+        "aio_suspend",
+        "aio_suspend64",
+        "aio_write",
+        "aio_write64",
+        "alarm",
+        "aligned_alloc",
+        "alloca",
+        "alphasort",
+        "alphasort64",
+        "argp_error",
+        "argp_failure",
+        "argp_help",
+        "argp_parse",
+        "argp_state_help",
+        "argp_usage",
+        "argz_add",
+        "argz_add_sep",
+        "argz_append",
+        "argz_count",
+        "argz_create",
+        "argz_create_sep",
+        "argz_delete",
+        "argz_extract",
+        "argz_insert",
+        "argz_next",
+        "argz_replace",
+        "argz_stringify",
+        "asctime",
+        "asctime_r",
+        "asin",
+        "asinf",
+        "asinfN",
+        "asinfNx",
+        "asinh",
+        "asinhf",
+        "asinhfN",
+        "asinhfNx",
+        "asinhl",
+        "asinl",
+        "asprintf",
+        "assert",
+        "assert_perror",
+        "atan",
+        "atan2",
+        "atan2f",
+        "atan2fN",
+        "atan2fNx",
+        "atan2l",
+        "atanf",
+        "atanfN",
+        "atanfNx",
+        "atanh",
+        "atanhf",
+        "atanhfN",
+        "atanhfNx",
+        "atanhl",
+        "atanl",
+        "atexit",
+        "atof",
+        "atoi",
+        "atol",
+        "atoll",
+        "backtrace",
+        "backtrace_symbols",
+        "backtrace_symbols_fd",
+        "basename",
+        "basename",
+        "bcmp",
+        "bcopy",
+        "bind",
+        "bind_textdomain_codeset",
+        "bindtextdomain",
+        "brk",
+        "bsearch",
+        "btowc",
+        "bzero",
+        "cabs",
+        "cabsf",
+        "cabsfN",
+        "cabsfNx",
+        "cabsl",
+        "cacos",
+        "cacosf",
+        "cacosfN",
+        "cacosfNx",
+        "cacosh",
+        "cacoshf",
+        "cacoshfN",
+        "cacoshfNx",
+        "cacoshl",
+        "cacosl",
+        "calloc",
+        "canonicalize",
+        "canonicalize_file_name",
+        "canonicalizef",
+        "canonicalizefN",
+        "canonicalizefNx",
+        "canonicalizel",
+        "carg",
+        "cargf",
+        "cargfN",
+        "cargfNx",
+        "cargl",
+        "casin",
+        "casinf",
+        "casinfN",
+        "casinfNx",
+        "casinh",
+        "casinhf",
+        "casinhfN",
+        "casinhfNx",
+        "casinhl",
+        "casinl",
+        "catan",
+        "catanf",
+        "catanfN",
+        "catanfNx",
+        "catanh",
+        "catanhf",
+        "catanhfN",
+        "catanhfNx",
+        "catanhl",
+        "catanl",
+        "catclose",
+        "catgets",
+        "catopen",
+        "cbc_crypt",
+        "cbrt",
+        "cbrtf",
+        "cbrtfN",
+        "cbrtfNx",
+        "cbrtl",
+        "ccos",
+        "ccosf",
+        "ccosfN",
+        "ccosfNx",
+        "ccosh",
+        "ccoshf",
+        "ccoshfN",
+        "ccoshfNx",
+        "ccoshl",
+        "ccosl",
+        "ceil",
+        "ceilf",
+        "ceilfN",
+        "ceilfNx",
+        "ceill",
+        "cexp",
+        "cexpf",
+        "cexpfN",
+        "cexpfNx",
+        "cexpl",
+        "cfgetispeed",
+        "cfgetospeed",
+        "cfmakeraw",
+        "cfsetispeed",
+        "cfsetospeed",
+        "cfsetspeed",
+        "chdir",
+        "chmod",
+        "chmod",
+        "chown",
+        "cimag",
+        "cimagf",
+        "cimagfN",
+        "cimagfNx",
+        "cimagl",
+        "clearenv",
+        "clearerr",
+        "clearerr_unlocked",
+        "clock",
+        "clog",
+        "clog10",
+        "clog10f",
+        "clog10fN",
+        "clog10fNx",
+        "clog10l",
+        "clogf",
+        "clogfN",
+        "clogfNx",
+        "clogl",
+        "close",
+        "closedir",
+        "closelog",
+        "confstr",
+        "conj",
+        "conjf",
+        "conjfN",
+        "conjfNx",
+        "conjl",
+        "connect",
+        "continue",
+        "copysign",
+        "copysignf",
+        "copysignfN",
+        "copysignfNx",
+        "copysignl",
+        "cos",
+        "cosf",
+        "cosfN",
+        "cosfNx",
+        "cosh",
+        "coshf",
+        "coshfN",
+        "coshfNx",
+        "coshl",
+        "cosl",
+        "cpow",
+        "cpowf",
+        "cpowfN",
+        "cpowfNx",
+        "cpowl",
+        "cproj",
+        "cprojf",
+        "cprojfN",
+        "cprojfNx",
+        "cprojl",
+        "CPU_CLR",
+        "CPU_ISSET",
+        "CPU_SET",
+        "CPU_ZERO",
+        "creal",
+        "crealf",
+        "crealfN",
+        "crealfNx",
+        "creall",
+        "creat",
+        "creat64",
+        "crypt",
+        "crypt_r",
+        "csin",
+        "csinf",
+        "csinfN",
+        "csinfNx",
+        "csinh",
+        "csinhf",
+        "csinhfN",
+        "csinhfNx",
+        "csinhl",
+        "csinl",
+        "csqrt",
+        "csqrtf",
+        "csqrtfN",
+        "csqrtfNx",
+        "csqrtl",
+        "ctan",
+        "ctanf",
+        "ctanfN",
+        "ctanfNx",
+        "ctanh",
+        "ctanhf",
+        "ctanhfN",
+        "ctanhfNx",
+        "ctanhl",
+        "ctanl",
+        "ctermid",
+        "ctime",
+        "ctime_r",
+        "cuserid",
+        "dcgettext",
+        "dcngettext",
+        "DES_FAILED",
+        "des_setparity",
+        "dgettext",
+        "difftime",
+        "dirfd",
+        "dirname",
+        "div",
+        "dngettext",
+        "drand48",
+        "drand48_r",
+        "drem",
+        "dremf",
+        "dreml",
+        "DTTOIF",
+        "dup",
+        "dup2",
+        "ecb_crypt",
+        "ecvt",
+        "ecvt_r",
+        "encrypt",
+        "encrypt_r",
+        "endfsent",
+        "endgrent",
+        "endhostent",
+        "endmntent",
+        "endnetent",
+        "endnetgrent",
+        "endprotoent",
+        "endpwent",
+        "endservent",
+        "endutent",
+        "endutxent",
+        "envz_add",
+        "envz_entry",
+        "envz_get",
+        "envz_merge",
+        "envz_remove",
+        "envz_strip",
+        "erand48",
+        "erand48_r",
+        "erf",
+        "erfc",
+        "erfcf",
+        "erfcfN",
+        "erfcfNx",
+        "erfcl",
+        "erff",
+        "erffN",
+        "erffNx",
+        "erfl",
+        "err",
+        "error",
+        "error_at_line",
+        "errx",
+        "execl",
+        "execle",
+        "execlp",
+        "execv",
+        "execve",
+        "execvp",
+        "exit",
+        "exp",
+        "exp10",
+        "exp10f",
+        "exp10fN",
+        "exp10fNx",
+        "exp10l",
+        "exp2",
+        "exp2f",
+        "exp2fN",
+        "exp2fNx",
+        "exp2l",
+        "expf",
+        "expfN",
+        "expfNx",
+        "expl",
+        "explicit_bzero",
+        "expm1",
+        "expm1f",
+        "expm1fN",
+        "expm1fNx",
+        "expm1l",
+        "fabs",
+        "fabsf",
+        "fabsfN",
+        "fabsfNx",
+        "fabsl",
+        "fchdir",
+        "fchmod",
+        "fchown",
+        "fclose",
+        "fcloseall",
+        "fcntl",
+        "fcvt",
+        "fcvt_r",
+        "FD_CLR",
+        "FD_ISSET",
+        "FD_SET",
+        "FD_ZERO",
+        "fdatasync",
+        "fdim",
+        "fdimf",
+        "fdimfN",
+        "fdimfNx",
+        "fdiml",
+        "fdopen",
+        "fdopendir",
+        "feclearexcept",
+        "fedisableexcept",
+        "feenableexcept",
+        "fegetenv",
+        "fegetexcept",
+        "fegetexceptflag",
+        "fegetmode",
+        "fegetround",
+        "feholdexcept",
+        "feof",
+        "feof_unlocked",
+        "feraiseexcept",
+        "ferror",
+        "ferror_unlocked",
+        "fesetenv",
+        "fesetexcept",
+        "fesetexceptflag",
+        "fesetmode",
+        "fesetround",
+        "fetestexcept",
+        "fetestexceptflag",
+        "feupdateenv",
+        "fflush",
+        "fflush_unlocked",
+        "fgetc",
+        "fgetc_unlocked",
+        "fgetgrent",
+        "fgetgrent_r",
+        "fgetpos",
+        "fgetpos64",
+        "fgetpwent",
+        "fgetpwent_r",
+        "fgets",
+        "fgets_unlocked",
+        "fgetwc",
+        "fgetwc_unlocked",
+        "fgetws",
+        "fgetws_unlocked",
+        "fileno",
+        "fileno_unlocked",
+        "finite",
+        "finitef",
+        "finitel",
+        "flockfile",
+        "floor",
+        "floorf",
+        "floorfN",
+        "floorfNx",
+        "floorl",
+        "fma",
+        "fmaf",
+        "fmafN",
+        "fmafNx",
+        "fmal",
+        "fmax",
+        "fmaxf",
+        "fmaxfN",
+        "fmaxfNx",
+        "fmaxl",
+        "fmaxmag",
+        "fmaxmagf",
+        "fmaxmagfN",
+        "fmaxmagfNx",
+        "fmaxmagl",
+        "fmemopen",
+        "fmin",
+        "fminf",
+        "fminfN",
+        "fminfNx",
+        "fminl",
+        "fminmag",
+        "fminmagf",
+        "fminmagfN",
+        "fminmagfNx",
+        "fminmagl",
+        "fmod",
+        "fmodf",
+        "fmodfN",
+        "fmodfNx",
+        "fmodl",
+        "fmtmsg",
+        "fnmatch",
+        "fopen",
+        "fopen64",
+        "fopencookie",
+        "fork",
+        "forkpty",
+        "fpathconf",
+        "fpclassify",
+        "fprintf",
+        "fputc",
+        "fputc_unlocked",
+        "fputs",
+        "fputs_unlocked",
+        "fputwc",
+        "fputwc_unlocked",
+        "fputws",
+        "fputws_unlocked",
+        "fread",
+        "fread_unlocked",
+        "free",
+        "freopen",
+        "freopen64",
+        "frexp",
+        "frexpf",
+        "frexpfN",
+        "frexpfNx",
+        "frexpl",
+        "fromfp",
+        "fromfpf",
+        "fromfpfN",
+        "fromfpfNx",
+        "fromfpl",
+        "fromfpx",
+        "fromfpxf",
+        "fromfpxfN",
+        "fromfpxfNx",
+        "fromfpxl",
+        "fscanf",
+        "fseek",
+        "fseeko",
+        "fseeko64",
+        "fsetpos",
+        "fsetpos64",
+        "fstat",
+        "fstat64",
+        "fsync",
+        "ftell",
+        "ftello",
+        "ftello64",
+        "ftruncate",
+        "ftruncate64",
+        "ftrylockfile",
+        "ftw",
+        "ftw64",
+        "funlockfile",
+        "futimes",
+        "fwide",
+        "fwprintf",
+        "fwrite",
+        "fwrite_unlocked",
+        "fwscanf",
+        "gamma",
+        "gammaf",
+        "gammal",
+        "gcvt",
+        "get_avphys_pages",
+        "get_current_dir_name",
+        "get_nprocs",
+        "get_nprocs_conf",
+        "get_phys_pages",
+        "getauxval",
+        "getc",
+        "getc_unlocked",
+        "getchar",
+        "getchar_unlocked",
+        "getcontext",
+        "getcwd",
+        "getdate",
+        "getdate_r",
+        "getdelim",
+        "getdomainnname",
+        "getegid",
+        "getentropy",
+        "getenv",
+        "geteuid",
+        "getfsent",
+        "getfsfile",
+        "getfsspec",
+        "getgid",
+        "getgrent",
+        "getgrent_r",
+        "getgrgid",
+        "getgrgid_r",
+        "getgrnam",
+        "getgrnam_r",
+        "getgrouplist",
+        "getgroups",
+        "gethostbyaddr",
+        "gethostbyaddr_r",
+        "gethostbyname",
+        "gethostbyname2",
+        "gethostbyname2_r",
+        "gethostbyname_r",
+        "gethostent",
+        "gethostid",
+        "gethostname",
+        "getitimer",
+        "getline",
+        "getloadavg",
+        "getlogin",
+        "getmntent",
+        "getmntent_r",
+        "getnetbyaddr",
+        "getnetbyname",
+        "getnetent",
+        "getnetgrent",
+        "getnetgrent_r",
+        "getopt",
+        "getopt_long",
+        "getopt_long_only",
+        "getpagesize",
+        "getpass",
+        "getpayload",
+        "getpayloadf",
+        "getpayloadfN",
+        "getpayloadfNx",
+        "getpayloadl",
+        "getpeername",
+        "getpgid",
+        "getpgrp",
+        "getpid",
+        "getppid",
+        "getpriority",
+        "getprotobyname",
+        "getprotobynumber",
+        "getprotoent",
+        "getpt",
+        "getpwent",
+        "getpwent_r",
+        "getpwnam",
+        "getpwnam_r",
+        "getpwuid",
+        "getpwuid_r",
+        "getrandom",
+        "getrlimit",
+        "getrlimit64",
+        "getrusage",
+        "gets",
+        "getservbyname",
+        "getservbyport",
+        "getservent",
+        "getsid",
+        "getsockname",
+        "getsockopt",
+        "getsubopt",
+        "gettext",
+        "gettimeofday",
+        "getuid",
+        "getumask",
+        "getutent",
+        "getutent_r",
+        "getutid",
+        "getutid_r",
+        "getutline",
+        "getutline_r",
+        "getutmp",
+        "getutmpx",
+        "getutxent",
+        "getutxid",
+        "getutxline",
+        "getw",
+        "getwc",
+        "getwc_unlocked",
+        "getwchar",
+        "getwchar_unlocked",
+        "getwd",
+        "glob",
+        "glob64",
+        "globfree",
+        "globfree64",
+        "gmtime",
+        "gmtime_r",
+        "grantpt",
+        "grantpt",
+        "gsignal",
+        "gtty",
+        "hasmntopt",
+        "hcreate",
+        "hcreate_r",
+        "hdestroy",
+        "hdestroy_r",
+        "hsearch",
+        "hsearch_r",
+        "htonl",
+        "htons",
+        "hypot",
+        "hypotf",
+        "hypotfN",
+        "hypotfNx",
+        "hypotl",
+        "iconv",
+        "iconv_close",
+        "iconv_open",
+        "if_freenameindex",
+        "if_indextoname",
+        "if_nameindex",
+        "if_nametoindex",
+        "IFTODT",
+        "ilogb",
+        "ilogbf",
+        "ilogbfN",
+        "ilogbfNx",
+        "ilogbl",
+        "imaxabs",
+        "imaxdiv",
+        "index",
+        "inet_addr",
+        "inet_aton",
+        "inet_lnaof",
+        "inet_makeaddr",
+        "inet_netof",
+        "inet_network",
+        "inet_ntoa",
+        "inet_ntop",
+        "inet_pton",
+        "initgroups",
+        "initstate",
+        "initstate_r",
+        "innetgr",
+        "ioctl",
+        "isalnum",
+        "isalpha",
+        "isascii",
+        "isatty",
+        "isblank",
+        "iscanonical",
+        "iscntrl",
+        "isdigit",
+        "iseqsig",
+        "isfinite",
+        "isgraph",
+        "isgreater",
+        "isgreaterequal",
+        "isinf",
+        "isinff",
+        "isinfl",
+        "isless",
+        "islessequal",
+        "islessgreater",
+        "islower",
+        "isnan",
+        "isnan",
+        "isnanf",
+        "isnanl",
+        "isnormal",
+        "isprint",
+        "ispunct",
+        "issignaling",
+        "isspace",
+        "issubnormal",
+        "isunordered",
+        "isupper",
+        "iswalnum",
+        "iswalpha",
+        "iswblank",
+        "iswcntrl",
+        "iswctype",
+        "iswdigit",
+        "iswgraph",
+        "iswlower",
+        "iswprint",
+        "iswpunct",
+        "iswspace",
+        "iswupper",
+        "iswxdigit",
+        "isxdigit",
+        "iszero",
+        "j0",
+        "j0f",
+        "j0fN",
+        "j0fNx",
+        "j0l",
+        "j1",
+        "j1f",
+        "j1fN",
+        "j1fNx",
+        "j1l",
+        "jn",
+        "jnf",
+        "jnfN",
+        "jnfNx",
+        "jnl",
+        "jrand48",
+        "jrand48_r",
+        "kill",
+        "killpg",
+        "l64a",
+        "labs",
+        "lcong48",
+        "lcong48_r",
+        "ldexp",
+        "ldexpf",
+        "ldexpfN",
+        "ldexpfNx",
+        "ldexpl",
+        "ldiv",
+        "lfind",
+        "lgamma",
+        "lgamma_r",
+        "lgammaf",
+        "lgammaf_r",
+        "lgammafN",
+        "lgammafN_r",
+        "lgammafNx",
+        "lgammafNx_r",
+        "lgammal",
+        "lgammal_r",
+        "link",
+        "lio_listio",
+        "lio_listio64",
+        "listen",
+        "llabs",
+        "lldiv",
+        "llogb",
+        "llogbf",
+        "llogbfN",
+        "llogbfNx",
+        "llogbl",
+        "llrint",
+        "llrintf",
+        "llrintfN",
+        "llrintfNx",
+        "llrintl",
+        "llround",
+        "llroundf",
+        "llroundfN",
+        "llroundfNx",
+        "llroundl",
+        "localeconv",
+        "localtime",
+        "localtime_r",
+        "log",
+        "log10",
+        "log10f",
+        "log10fN",
+        "log10fNx",
+        "log10l",
+        "log1p",
+        "log1pf",
+        "log1pfN",
+        "log1pfNx",
+        "log1pl",
+        "log2",
+        "log2f",
+        "log2fN",
+        "log2fNx",
+        "log2l",
+        "logb",
+        "logbf",
+        "logbfN",
+        "logbfNx",
+        "logbl",
+        "logf",
+        "logfN",
+        "logfNx",
+        "login",
+        "login_tty",
+        "logl",
+        "logout",
+        "logwtmp",
+        "longjmp",
+        "lrand48",
+        "lrand48_r",
+        "lrint",
+        "lrintf",
+        "lrintfN",
+        "lrintfNx",
+        "lrintl",
+        "lround",
+        "lroundf",
+        "lroundfN",
+        "lroundfNx",
+        "lroundl",
+        "lsearch",
+        "lseek",
+        "lseek64",
+        "lstat",
+        "lstat64",
+        "lutimes",
+        "madvise",
+        "main",
+        "makecontext",
+        "mallinfo",
+        "malloc",
+        "mallopt",
+        "matherr",
+        "mblen",
+        "mbrlen",
+        "mbrtowc",
+        "mbsinit",
+        "mbsnrtowcs",
+        "mbsrtowcs",
+        "mbstowcs",
+        "mbtowc",
+        "mcheck",
+        "memalign",
+        "memccpy",
+        "memchr",
+        "memcmp",
+        "memcpy",
+        "memfrob",
+        "memmem",
+        "memmove",
+        "mempcpy",
+        "memrchr",
+        "memset",
+        "merge",
+        "mkdir",
+        "mkdtemp",
+        "mkfifo",
+        "mknod",
+        "mkstemp",
+        "mktemp",
+        "mktime",
+        "mlock",
+        "mlockall",
+        "mmap",
+        "mmap64",
+        "modf",
+        "modff",
+        "modffN",
+        "modffNx",
+        "modfl",
+        "mount",
+        "mprobe",
+        "mrand48",
+        "mrand48_r",
+        "mremap",
+        "msync",
+        "mtrace",
+        "munlock",
+        "munlockall",
+        "munmap",
+        "muntrace",
+        "nan",
+        "nanf",
+        "nanfN",
+        "nanfNx",
+        "nanl",
+        "nanosleep",
+        "nearbyint",
+        "nearbyintf",
+        "nearbyintfN",
+        "nearbyintfNx",
+        "nearbyintl",
+        "nextafter",
+        "nextafterf",
+        "nextafterfN",
+        "nextafterfNx",
+        "nextafterl",
+        "nextdown",
+        "nextdownf",
+        "nextdownfN",
+        "nextdownfNx",
+        "nextdownl",
+        "nexttoward",
+        "nexttowardf",
+        "nexttowardl",
+        "nextup",
+        "nextupf",
+        "nextupfN",
+        "nextupfNx",
+        "nextupl",
+        "nftw",
+        "nftw64",
+        "ngettext",
+        "nice",
+        "nl_langinfo",
+        "notfound",
+        "nrand48",
+        "nrand48_r",
+        "ntohl",
+        "ntohs",
+        "ntp_adjtime",
+        "ntp_gettime",
+        "obstack_1grow",
+        "obstack_1grow_fast",
+        "obstack_alignment_mask",
+        "obstack_alloc",
+        "obstack_base",
+        "obstack_blank",
+        "obstack_blank_fast",
+        "obstack_chunk_alloc",
+        "obstack_chunk_free",
+        "obstack_chunk_size",
+        "obstack_copy",
+        "obstack_copy0",
+        "obstack_finish",
+        "obstack_free",
+        "obstack_grow",
+        "obstack_grow0",
+        "obstack_init",
+        "obstack_int_grow",
+        "obstack_int_grow_fast",
+        "obstack_next_free",
+        "obstack_object_size",
+        "obstack_object_size",
+        "obstack_printf",
+        "obstack_ptr_grow",
+        "obstack_ptr_grow_fast",
+        "obstack_room",
+        "obstack_vprintf",
+        "offsetof",
+        "on_exit",
+        "open",
+        "open64",
+        "open_memstream",
+        "opendir",
+        "openlog",
+        "openpty",
+        "parse_printf_format",
+        "pathconf",
+        "pause",
+        "pclose",
+        "perror",
+        "pipe",
+        "popen",
+        "posix_fallocate",
+        "posix_fallocate64",
+        "posix_memalign",
+        "pow",
+        "pow10",
+        "pow10f",
+        "pow10l",
+        "powf",
+        "powfN",
+        "powfNx",
+        "powl",
+        "pread",
+        "pread64",
+        "preadv",
+        "preadv2",
+        "preadv64",
+        "preadv64v2",
+        "printf",
+        "printf_size",
+        "printf_size_info",
+        "psignal",
+        "pthread_getattr_default_np",
+        "pthread_getspecific",
+        "pthread_key_create",
+        "pthread_key_delete",
+        "pthread_setattr_default_np",
+        "pthread_setspecific",
+        "ptsname",
+        "ptsname_r",
+        "putc",
+        "putc_unlocked",
+        "putchar",
+        "putchar_unlocked",
+        "putenv",
+        "putpwent",
+        "puts",
+        "pututline",
+        "pututxline",
+        "putw",
+        "putwc",
+        "putwc_unlocked",
+        "putwchar",
+        "putwchar_unlocked",
+        "pwrite",
+        "pwrite64",
+        "pwritev",
+        "pwritev2",
+        "pwritev64",
+        "pwritev64v2",
+        "qecvt",
+        "qecvt_r",
+        "qfcvt",
+        "qfcvt_r",
+        "qgcvt",
+        "qsort",
+        "raise",
+        "rand",
+        "rand_r",
+        "random",
+        "random_r",
+        "rawmemchr",
+        "read",
+        "readdir",
+        "readdir64",
+        "readdir64_r",
+        "readdir_r",
+        "readlink",
+        "readv",
+        "realloc",
+        "reallocarray",
+        "realpath",
+        "recv",
+        "recvfrom",
+        "regcomp",
+        "regerror",
+        "regexec",
+        "regfree",
+        "register_printf_function",
+        "remainder",
+        "remainderf",
+        "remainderfN",
+        "remainderfNx",
+        "remainderl",
+        "remove",
+        "rename",
+        "return",
+        "rewind",
+        "rewinddir",
+        "rindex",
+        "rint",
+        "rintf",
+        "rintfN",
+        "rintfNx",
+        "rintl",
+        "rmdir",
+        "round",
+        "roundeven",
+        "roundevenf",
+        "roundevenfN",
+        "roundevenfNx",
+        "roundevenl",
+        "roundf",
+        "roundfN",
+        "roundfNx",
+        "roundl",
+        "rpmatch",
+        "S_ISBLK",
+        "S_ISCHR",
+        "S_ISDIR",
+        "S_ISFIFO",
+        "S_ISLNK",
+        "S_ISREG",
+        "S_ISSOCK",
+        "S_TYPEISMQ",
+        "S_TYPEISSEM",
+        "S_TYPEISSHM",
+        "sbrk",
+        "scalb",
+        "scalbf",
+        "scalbl",
+        "scalbln",
+        "scalblnf",
+        "scalblnfN",
+        "scalblnfNx",
+        "scalblnl",
+        "scalbn",
+        "scalbnf",
+        "scalbnfN",
+        "scalbnfNx",
+        "scalbnl",
+        "scandir",
+        "scandir64",
+        "scanf",
+        "sched_get_priority_max",
+        "sched_get_priority_min",
+        "sched_getaffinity",
+        "sched_getparam",
+        "sched_getscheduler",
+        "sched_rr_get_interval",
+        "sched_setaffinity",
+        "sched_setparam",
+        "sched_setscheduler",
+        "sched_yield",
+        "secure_getenv",
+        "seed48",
+        "seed48_r",
+        "seekdir",
+        "select",
+        "sem_close",
+        "sem_destroy",
+        "sem_getvalue",
+        "sem_init",
+        "sem_open",
+        "sem_post",
+        "sem_timedwait",
+        "sem_trywait",
+        "sem_unlink",
+        "sem_wait",
+        "semctl",
+        "semget",
+        "semop",
+        "semtimedop",
+        "send",
+        "sendto",
+        "setbuf",
+        "setbuffer",
+        "setcontext",
+        "setdomainname",
+        "setegid",
+        "setenv",
+        "seteuid",
+        "setfsent",
+        "setgid",
+        "setgrent",
+        "setgroups",
+        "sethostent",
+        "sethostid",
+        "sethostname",
+        "setitimer",
+        "setjmp",
+        "setkey",
+        "setkey_r",
+        "setlinebuf",
+        "setlocale",
+        "setlogmask",
+        "setmntent",
+        "setnetent",
+        "setnetgrent",
+        "setpayload",
+        "setpayloadf",
+        "setpayloadfN",
+        "setpayloadfNx",
+        "setpayloadl",
+        "setpayloadsig",
+        "setpayloadsigf",
+        "setpayloadsigfN",
+        "setpayloadsigfNx",
+        "setpayloadsigl",
+        "setpgid",
+        "setpgrp",
+        "setpriority",
+        "setprotoent",
+        "setpwent",
+        "setregid",
+        "setreuid",
+        "setrlimit",
+        "setrlimit64",
+        "setservent",
+        "setsid",
+        "setsockopt",
+        "setstate",
+        "setstate_r",
+        "settimeofday",
+        "setuid",
+        "setutent",
+        "setutxent",
+        "setvbuf",
+        "shm_open",
+        "shm_unlink",
+        "shutdown",
+        "sigaction",
+        "sigaddset",
+        "sigaltstack",
+        "sigblock",
+        "sigdelset",
+        "sigemptyset",
+        "sigfillset",
+        "siginterrupt",
+        "sigismember",
+        "siglongjmp",
+        "sigmask",
+        "signal",
+        "signbit",
+        "significand",
+        "significandf",
+        "significandl",
+        "sigpause",
+        "sigpending",
+        "sigprocmask",
+        "sigsetjmp",
+        "sigsetmask",
+        "sigstack",
+        "sigsuspend",
+        "sin",
+        "sincos",
+        "sincosf",
+        "sincosfN",
+        "sincosfNx",
+        "sincosl",
+        "sinf",
+        "sinfN",
+        "sinfNx",
+        "sinh",
+        "sinhf",
+        "sinhfN",
+        "sinhfNx",
+        "sinhl",
+        "sinl",
+        "sleep",
+        "snprintf",
+        "socket",
+        "socketpair",
+        "sprintf",
+        "sqrt",
+        "sqrtf",
+        "sqrtfN",
+        "sqrtfNx",
+        "sqrtl",
+        "srand",
+        "srand48",
+        "srand48_r",
+        "srandom",
+        "srandom_r",
+        "sscanf",
+        "ssignal",
+        "stat",
+        "stat64",
+        "stime",
+        "stpcpy",
+        "stpncpy",
+        "strcasecmp",
+        "strcasestr",
+        "strcat",
+        "strchr",
+        "strchrnul",
+        "strcmp",
+        "strcoll",
+        "strcpy",
+        "strcspn",
+        "strdup",
+        "strdupa",
+        "strerror",
+        "strerror_r",
+        "strfmon",
+        "strfromd",
+        "strfromf",
+        "strfromfN",
+        "strfromfNx",
+        "strfroml",
+        "strfry",
+        "strftime",
+        "strlen",
+        "strncasecmp",
+        "strncat",
+        "strncmp",
+        "strncpy",
+        "strndup",
+        "strndupa",
+        "strnlen",
+        "strpbrk",
+        "strptime",
+        "strrchr",
+        "strsep",
+        "strsignal",
+        "strspn",
+        "strstr",
+        "strtod",
+        "strtof",
+        "strtofN",
+        "strtofNx",
+        "strtoimax",
+        "strtok",
+        "strtok_r",
+        "strtol",
+        "strtold",
+        "strtoll",
+        "strtoq",
+        "strtoul",
+        "strtoull",
+        "strtoumax",
+        "strtouq",
+        "strverscmp",
+        "strxfrm",
+        "stty",
+        "success",
+        "SUN_LEN",
+        "swapcontext",
+        "swprintf",
+        "swscanf",
+        "symlink",
+        "sync",
+        "syscall",
+        "sysconf",
+        "sysctl",
+        "syslog",
+        "system",
+        "sysv_signal",
+        "tan",
+        "tanf",
+        "tanfN",
+        "tanfNx",
+        "tanh",
+        "tanhf",
+        "tanhfN",
+        "tanhfNx",
+        "tanhl",
+        "tanl",
+        "tcdrain",
+        "tcflow",
+        "tcflush",
+        "tcgetattr",
+        "tcgetpgrp",
+        "tcgetsid",
+        "tcsendbreak",
+        "tcsetattr",
+        "tcsetpgrp",
+        "tdelete",
+        "tdestroy",
+        "telldir",
+        "TEMP_FAILURE_RETRY",
+        "tempnam",
+        "textdomain",
+        "tfind",
+        "tgamma",
+        "tgammaf",
+        "tgammafN",
+        "tgammafNx",
+        "tgammal",
+        "time",
+        "timegm",
+        "timelocal",
+        "times",
+        "tmpfile",
+        "tmpfile64",
+        "tmpnam",
+        "tmpnam_r",
+        "toascii",
+        "tolower",
+        "totalorder",
+        "totalorderf",
+        "totalorderfN",
+        "totalorderfNx",
+        "totalorderl",
+        "totalordermag",
+        "totalordermagf",
+        "totalordermagfN",
+        "totalordermagfNx",
+        "totalordermagl",
+        "toupper",
+        "towctrans",
+        "towlower",
+        "towupper",
+        "trunc",
+        "truncate",
+        "truncate64",
+        "truncf",
+        "truncfN",
+        "truncfNx",
+        "truncl",
+        "tryagain",
+        "tsearch",
+        "ttyname",
+        "ttyname_r",
+        "twalk",
+        "tzset",
+        "ufromfp",
+        "ufromfpf",
+        "ufromfpfN",
+        "ufromfpfNx",
+        "ufromfpl",
+        "ufromfpx",
+        "ufromfpxf",
+        "ufromfpxfN",
+        "ufromfpxfNx",
+        "ufromfpxl",
+        "ulimit",
+        "umask",
+        "umount",
+        "umount2",
+        "uname",
+        "unavail",
+        "ungetc",
+        "ungetwc",
+        "unlink",
+        "unlockpt",
+        "unsetenv",
+        "updwtmp",
+        "utime",
+        "utimes",
+        "utmpname",
+        "utmpxname",
+        "va_arg",
+        "va_copy",
+        "va_end",
+        "va_start",
+        "valloc",
+        "vasprintf",
+        "verr",
+        "verrx",
+        "versionsort",
+        "versionsort64",
+        "vfork",
+        "vfprintf",
+        "vfscanf",
+        "vfwprintf",
+        "vfwscanf",
+        "vlimit",
+        "vprintf",
+        "vscanf",
+        "vsnprintf",
+        "vsprintf",
+        "vsscanf",
+        "vswprintf",
+        "vswscanf",
+        "vsyslog",
+        "vtimes",
+        "vwarn",
+        "vwarnx",
+        "vwprintf",
+        "vwscanf",
+        "wait",
+        "wait3",
+        "wait4",
+        "waitpid",
+        "warn",
+        "warnx",
+        "WCOREDUMP",
+        "wcpcpy",
+        "wcpncpy",
+        "wcrtomb",
+        "wcscasecmp",
+        "wcscat",
+        "wcschr",
+        "wcschrnul",
+        "wcscmp",
+        "wcscoll",
+        "wcscpy",
+        "wcscspn",
+        "wcsdup",
+        "wcsftime",
+        "wcslen",
+        "wcsncasecmp",
+        "wcsncat",
+        "wcsncmp",
+        "wcsncpy",
+        "wcsnlen",
+        "wcsnrtombs",
+        "wcspbrk",
+        "wcsrchr",
+        "wcsrtombs",
+        "wcsspn",
+        "wcsstr",
+        "wcstod",
+        "wcstof",
+        "wcstofN",
+        "wcstofNx",
+        "wcstoimax",
+        "wcstok",
+        "wcstol",
+        "wcstold",
+        "wcstoll",
+        "wcstombs",
+        "wcstoq",
+        "wcstoul",
+        "wcstoull",
+        "wcstoumax",
+        "wcstouq",
+        "wcswcs",
+        "wcsxfrm",
+        "wctob",
+        "wctomb",
+        "wctrans",
+        "wctype",
+        "WEXITSTATUS",
+        "WIFEXITED",
+        "WIFSIGNALED",
+        "WIFSTOPPED",
+        "wmemchr",
+        "wmemcmp",
+        "wmemcpy",
+        "wmemmove",
+        "wmempcpy",
+        "wmemset",
+        "wordexp",
+        "wordfree",
+        "wprintf",
+        "write",
+        "writev",
+        "wscanf",
+        "WSTOPSIG",
+        "WTERMSIG",
+        "y0",
+        "y0f",
+        "y0fN",
+        "y0fNx",
+        "y0l",
+        "y1",
+        "y1f",
+        "y1fN",
+        "y1fNx",
+        "y1l",
+        "yn",
+        "ynf",
+        "ynfN",
+        "ynfNx",
+        "ynl"
     ]
 }
diff --git a/share/compliance/nonstandard_identifiers.json b/share/compliance/nonstandard_identifiers.json
index 34dc8300e44e4631e1a59479c4aa42e3b0b378ab..597eb9212001ea484dce3c52deff1c1b902a9bd9 100644
--- a/share/compliance/nonstandard_identifiers.json
+++ b/share/compliance/nonstandard_identifiers.json
@@ -1,19 +1,19 @@
 {
     "description": "Non-ISO C, Non-POSIX identifiers known to the Frama-C standard library",
     "source":"Manpages, mostly Linux and BSD",
-    "data":[
-        {"ident":"facilitynames", "header":"syslog.h"},
-        {"ident":"getresgid", "header":"unistd.h"},
-        {"ident":"getresuid", "header":"unistd.h"},
-        {"ident":"makedev", "header":"sys/types.h"},
-        {"ident":"option", "header":"getopt.h"},
-        {"ident":"prioritynames", "header":"syslog.h"},
-        {"ident":"setresgid", "header":"unistd.h"},
-        {"ident":"setresuid", "header":"unistd.h"},
-        {"ident":"strcspn", "header":"string.h"},
-        {"ident":"strlcat", "header":"string.h"},
-        {"ident":"strlcpy", "header":"string.h"},
-        {"ident":"wcslcat", "header":"wchar.h"},
-        {"ident":"wcslcpy", "header":"wchar.h"}
-    ]
+    "data":{
+        "facilitynames": {"header":"syslog.h"},
+        "getresgid": {"header":"unistd.h"},
+        "getresuid": {"header":"unistd.h"},
+        "makedev": {"header":"sys/types.h"},
+        "option": {"header":"getopt.h"},
+        "prioritynames": {"header":"syslog.h"},
+        "setresgid": {"header":"unistd.h"},
+        "setresuid": {"header":"unistd.h"},
+        "strcspn": {"header":"string.h"},
+        "strlcat": {"header":"string.h"},
+        "strlcpy": {"header":"string.h"},
+        "wcslcat": {"header":"wchar.h"},
+        "wcslcpy": {"header":"wchar.h"}
+    }
 }
diff --git a/share/compliance/posix_identifiers.json b/share/compliance/posix_identifiers.json
index ba548080fdc7f4e9c61adeb9a96e2d31f9e35156..43bceeac2d67a5b4f1ecac3776462123b4d064ba 100644
--- a/share/compliance/posix_identifiers.json
+++ b/share/compliance/posix_identifiers.json
@@ -1,6 +1,11 @@
 {
     "description": "POSIX.1-2008 reserved function identifiers (plus a few legacy POSIX identifiers)",
     "source":"POSIX.1-2008 - Base Specifications, Issue 7 (IEEE Std 1003.1-2008, 2016 Edition)",
+    "notes": {
+        "description": "The 'notes' field is a list of characteristics related to CWEs or that may affect the 'difficulty' of analyzing such headers or functions with Frama-C. Each note is succintly described below.",
+        "fc-support":"How well Frama-C supports this construct, w.r.t. the C11 standard: 'unsupported', 'none', 'partial', or 'good'. The difference between 'unsupported' and 'none' is that the former means something requiring substantial changes to be supported by Frama-C, while the latter only means 'not tried yet'.",
+        "variadic-plugin":"This is a variadic function known by the Variadic plug-in, which can (in some cases) generate a specification for it."
+    },
     "id_types":[
         {"type":"function", "description":"declared as a function; may also be defined as a macro"},
         {"type":"variable", "description":"external variable"},
@@ -9,90 +14,90 @@
         {"type":"constant", "description":"symbolic constant"},
         {"type":"type", "description":"type or structure"}
     ],
-    "headers":[
-        "aio.h",
-        "arpa/inet.h",
-        "assert.h",
-        "complex.h",
-        "cpio.h",
-        "ctype.h",
-        "dirent.h",
-        "dlfcn.h",
-        "errno.h",
-        "fcntl.h",
-        "fenv.h",
-        "float.h",
-        "fmtmsg.h",
-        "fnmatch.h",
-        "ftw.h",
-        "glob.h",
-        "grp.h",
-        "iconv.h",
-        "inttypes.h",
-        "iso646.h",
-        "langinfo.h",
-        "libgen.h",
-        "limits.h",
-        "locale.h",
-        "math.h",
-        "monetary.h",
-        "mqueue.h",
-        "ndbm.h",
-        "net/if.h",
-        "netdb.h",
-        "netinet/in.h",
-        "netinet/tcp.h",
-        "nl_types.h",
-        "poll.h",
-        "pthread.h",
-        "pwd.h",
-        "regex.h",
-        "sched.h",
-        "search.h",
-        "semaphore.h",
-        "setjmp.h",
-        "signal.h",
-        "spawn.h",
-        "stdarg.h",
-        "stdbool.h",
-        "stddef.h",
-        "stdint.h",
-        "stdio.h",
-        "stdlib.h",
-        "string.h",
-        "strings.h",
-        "stropts.h",
-        "sys/ipc.h",
-        "sys/mman.h",
-        "sys/msg.h",
-        "sys/resource.h",
-        "sys/select.h",
-        "sys/sem.h",
-        "sys/shm.h",
-        "sys/socket.h",
-        "sys/stat.h",
-        "sys/statvfs.h",
-        "sys/time.h",
-        "sys/times.h",
-        "sys/types.h",
-        "sys/uio.h",
-        "sys/un.h",
-        "sys/utsname.h",
-        "sys/wait.h",
-        "syslog.h",
-        "tar.h",
-        "termios.h",
-        "tgmath.h",
-        "time.h",
-        "trace.h",
-        "ulimit.h",
-        "unistd.h",
-        "utime.h",
-        "utmpx.h",
-        "wchar.h",
-        "wctype.h",
-        "wordexp.h"
-    ],
+    "headers":{
+        "aio.h": {"fc-support":"none"},
+        "arpa/inet.h": {"fc-support":"partial"},
+        "assert.h": {"fc-support":"good"},
+        "complex.h": {"fc-support":"unsupported"},
+        "cpio.h": {"fc-support":"none"},
+        "ctype.h": {"fc-support":"good"},
+        "dirent.h": {"fc-support":"partial"},
+        "dlfcn.h": {"fc-support":"partial"},
+        "errno.h": {"fc-support":"good"},
+        "fcntl.h": {"fc-support":"partial"},
+        "fenv.h": {"fc-support":"partial"},
+        "float.h": {"fc-support":"partial"},
+        "fmtmsg.h": {"fc-support":"none"},
+        "fnmatch.h": {"fc-support":"partial"},
+        "ftw.h": {"fc-support":"partial"},
+        "glob.h": {"fc-support":"partial"},
+        "grp.h": {"fc-support":"partial"},
+        "iconv.h": {"fc-support":"partial"},
+        "inttypes.h": {"fc-support":"good"},
+        "iso646.h": {"fc-support":"good"},
+        "langinfo.h": {"fc-support":"none"},
+        "libgen.h": {"fc-support":"good"},
+        "limits.h": {"fc-support":"good"},
+        "locale.h": {"fc-support":"partial"},
+        "math.h": {"fc-support":"partial"},
+        "monetary.h": {"fc-support":"none"},
+        "mqueue.h": {"fc-support":"none"},
+        "ndbm.h": {"fc-support":"none"},
+        "net/if.h": {"fc-support":"partial"},
+        "netdb.h": {"fc-support":"partial"},
+        "netinet/in.h": {"fc-support":"partial"},
+        "netinet/tcp.h": {"fc-support":"good"},
+        "nl_types.h": {"fc-support":"partial"},
+        "poll.h": {"fc-support":"good"},
+        "pthread.h": {"fc-support":"partial"},
+        "pwd.h": {"fc-support":"partial"},
+        "regex.h": {"fc-support":"partial"},
+        "sched.h": {"fc-support":"partial"},
+        "search.h": {"fc-support":"none"},
+        "semaphore.h": {"fc-support":"partial"},
+        "setjmp.h": {"fc-support":"partial"},
+        "signal.h": {"fc-support":"partial"},
+        "spawn.h": {"fc-support":"none"},
+        "stdarg.h": {"fc-support":"good"},
+        "stdbool.h": {"fc-support":"good"},
+        "stddef.h": {"fc-support":"good"},
+        "stdint.h": {"fc-support":"good"},
+        "stdio.h": {"fc-support":"good"},
+        "stdlib.h": {"fc-support":"good"},
+        "string.h": {"fc-support":"good"},
+        "strings.h": {"fc-support":"partial"},
+        "stropts.h": {"fc-support":"partial"},
+        "sys/ipc.h": {"fc-support":"partial"},
+        "sys/mman.h": {"fc-support":"partial"},
+        "sys/msg.h": {"fc-support":"none"},
+        "sys/resource.h": {"fc-support":"good"},
+        "sys/select.h": {"fc-support":"partial"},
+        "sys/sem.h": {"fc-support":"none"},
+        "sys/shm.h": {"fc-support":"partial"},
+        "sys/socket.h": {"fc-support":"partial"},
+        "sys/stat.h": {"fc-support":"partial"},
+        "sys/statvfs.h": {"fc-support":"none"},
+        "sys/time.h": {"fc-support":"partial"},
+        "sys/times.h": {"fc-support":"partial"},
+        "sys/types.h": {"fc-support":"good"},
+        "sys/uio.h": {"fc-support":"partial"},
+        "sys/un.h": {"fc-support":"partial"},
+        "sys/utsname.h": {"fc-support":"partial"},
+        "sys/wait.h": {"fc-support":"partial"},
+        "syslog.h": {"fc-support":"partial"},
+        "tar.h": {"fc-support":"none"},
+        "termios.h": {"fc-support":"partial"},
+        "tgmath.h": {"fc-support":"unsupported"},
+        "time.h": {"fc-support":"partial"},
+        "trace.h": {"fc-support":"none"},
+        "ulimit.h": {"fc-support":"none"},
+        "unistd.h": {"fc-support":"partial"},
+        "utime.h": {"fc-support":"partial"},
+        "utmpx.h": {"fc-support":"partial"},
+        "wchar.h": {"fc-support":"partial"},
+        "wctype.h": {"fc-support":"partial"},
+        "wordexp.h": {"fc-support":"none"}
+    },
     "extension_names":{
         "ADV":"Advisory Information",
         "CX":"Extension to the ISO C standard",
@@ -124,2004 +129,2016 @@
         "XSI":"X/Open System Interfaces",
         "XSR":"XSI STREAMS"
     },
-    "data":[
-        {"ident":"__bool_true_false_are_defined", "id_type":"macro", "header":"stdbool.h", "extensions":[]},
-        {"ident":"_Complex_I", "id_type":"macro", "header":"complex.h", "extensions":[]},
-        {"ident":"_CS_PATH", "id_type":"constant", "header":"unistd.h", "extensions":[]},
-        {"ident":"_CS_POSIX_V7_ILP32_OFF32_CFLAGS", "id_type":"constant", "header":"unistd.h", "extensions":[]},
-        {"ident":"_CS_POSIX_V7_ILP32_OFF32_LDFLAGS", "id_type":"constant", "header":"unistd.h", "extensions":[]},
-        {"ident":"_CS_POSIX_V7_ILP32_OFF32_LIBS", "id_type":"constant", "header":"unistd.h", "extensions":[]},
-        {"ident":"_CS_POSIX_V7_ILP32_OFFBIG_CFLAGS", "id_type":"constant", "header":"unistd.h", "extensions":[]},
-        {"ident":"_CS_POSIX_V7_ILP32_OFFBIG_LDFLAGS", "id_type":"constant", "header":"unistd.h", "extensions":[]},
-        {"ident":"_CS_POSIX_V7_ILP32_OFFBIG_LIBS", "id_type":"constant", "header":"unistd.h", "extensions":[]},
-        {"ident":"_CS_POSIX_V7_LP64_OFF64_CFLAGS", "id_type":"constant", "header":"unistd.h", "extensions":[]},
-        {"ident":"_CS_POSIX_V7_LP64_OFF64_LDFLAGS", "id_type":"constant", "header":"unistd.h", "extensions":[]},
-        {"ident":"_CS_POSIX_V7_LP64_OFF64_LIBS", "id_type":"constant", "header":"unistd.h", "extensions":[]},
-        {"ident":"_CS_POSIX_V7_LPBIG_OFFBIG_CFLAGS", "id_type":"constant", "header":"unistd.h", "extensions":[]},
-        {"ident":"_CS_POSIX_V7_LPBIG_OFFBIG_LDFLAGS", "id_type":"constant", "header":"unistd.h", "extensions":[]},
-        {"ident":"_CS_POSIX_V7_LPBIG_OFFBIG_LIBS", "id_type":"constant", "header":"unistd.h", "extensions":[]},
-        {"ident":"_CS_POSIX_V7_THREADS_CFLAGS", "id_type":"constant", "header":"unistd.h", "extensions":[]},
-        {"ident":"_CS_POSIX_V7_THREADS_LDFLAGS", "id_type":"constant", "header":"unistd.h", "extensions":[]},
-        {"ident":"_CS_POSIX_V7_WIDTH_RESTRICTED_ENVS", "id_type":"constant", "header":"unistd.h", "extensions":[]},
-        {"ident":"_CS_V7_ENV", "id_type":"constant", "header":"unistd.h", "extensions":[]},
-        {"ident":"_Exit", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"_exit", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"_Imaginary_I", "id_type":"macro", "header":"complex.h", "extensions":[]},
-        {"ident":"_IOFBF", "id_type":"macro", "header":"stdio.h", "extensions":[]},
-        {"ident":"_IOLBF", "id_type":"macro", "header":"stdio.h", "extensions":[]},
-        {"ident":"_IONBF", "id_type":"macro", "header":"stdio.h", "extensions":[]},
-        {"ident":"_longjmp", "id_type":"function", "header":"setjmp.h", "extensions":["OB","XSI"]},
-        {"ident":"_POSIX2_VERSION", "id_type":"constant", "header":"unistd.h", "extensions":[]},
-        {"ident":"_POSIX_AIO_LISTIO_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_AIO_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_ARG_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_CHILD_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_CLOCKRES_MIN", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_DELAYTIMER_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_HOST_NAME_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_LINK_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_LOGIN_NAME_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_MAX_CANON", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_MAX_INPUT", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_MQ_OPEN_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_MQ_PRIO_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_NAME_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_NGROUPS_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_OPEN_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_PATH_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_PIPE_BUF", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_RE_DUP_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_RTSIG_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_SEM_NSEMS_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_SEM_VALUE_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_SIGQUEUE_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_SS_REPL_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_SSIZE_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_STREAM_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_SYMLINK_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_SYMLOOP_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_THREAD_DESTRUCTOR_ITERATIONS", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_THREAD_KEYS_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_THREAD_THREADS_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_TIMER_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_TRACE_EVENT_NAME_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_TRACE_NAME_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_TRACE_SYS_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_TRACE_USER_EVENT_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_TTY_NAME_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_TZNAME_MAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"_POSIX_VDISABLE", "id_type":"constant", "header":"unistd.h", "extensions":[]},
-        {"ident":"_POSIX_VERSION", "id_type":"constant", "header":"unistd.h", "extensions":[]},
-        {"ident":"_setjmp", "id_type":"function", "header":"setjmp.h", "extensions":["OB","XSI"]},
-        {"ident":"_tolower", "id_type":"function", "header":"ctype.h", "extensions":["OB","XSI"]},
-        {"ident":"_toupper", "id_type":"function", "header":"ctype.h", "extensions":["OB","XSI"]},
-        {"ident":"_XOPEN_VERSION", "id_type":"constant", "header":"unistd.h", "extensions":[]},
-        {"ident":"a64l", "id_type":"function", "header":"stdlib.h", "extensions":["XSI"]},
-        {"ident":"abort", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"abs", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"accept", "id_type":"function", "header":"sys/socket.h", "extensions":["XSI"]},
-        {"ident":"access", "id_type":"function", "header":"unistd.h", "extensions":["ADV"]},
-        {"ident":"acos", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"acosf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"acosh", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"acoshf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"acoshl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"acosl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"addrinfo", "id_type":"type", "header":"netdb.h", "extensions":[]},
-        {"ident":"AF_INET", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"AF_INET6", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"AF_UNIX", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"AF_UNSPEC", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"AI_ADDRCONFIG", "id_type":"constant", "header":"netdb.h", "extensions":[]},
-        {"ident":"AI_ALL", "id_type":"constant", "header":"netdb.h", "extensions":[]},
-        {"ident":"AI_CANONNAME", "id_type":"constant", "header":"netdb.h", "extensions":[]},
-        {"ident":"AI_NUMERICHOST", "id_type":"constant", "header":"netdb.h", "extensions":[]},
-        {"ident":"AI_NUMERICSERV", "id_type":"constant", "header":"netdb.h", "extensions":[]},
-        {"ident":"AI_PASSIVE", "id_type":"constant", "header":"netdb.h", "extensions":[]},
-        {"ident":"AI_V4MAPPED", "id_type":"constant", "header":"netdb.h", "extensions":[]},
-        {"ident":"AIO_ALLDONE", "id_type":"constant", "header":"aio.h", "extensions":[]},
-        {"ident":"aio_cancel", "id_type":"function", "header":"aio.h", "extensions":[]},
-        {"ident":"AIO_CANCELED", "id_type":"constant", "header":"aio.h", "extensions":[]},
-        {"ident":"aio_error", "id_type":"function", "header":"aio.h", "extensions":[]},
-        {"ident":"aio_fsync", "id_type":"function", "header":"aio.h", "extensions":["FSC","SIO"]},
-        {"ident":"AIO_NOTCANCELED", "id_type":"constant", "header":"aio.h", "extensions":[]},
-        {"ident":"aio_read", "id_type":"function", "header":"aio.h", "extensions":[]},
-        {"ident":"aio_return", "id_type":"function", "header":"aio.h", "extensions":[]},
-        {"ident":"aio_suspend", "id_type":"function", "header":"aio.h", "extensions":[]},
-        {"ident":"aio_write", "id_type":"function", "header":"aio.h", "extensions":[]},
-        {"ident":"aiocb", "id_type":"type", "header":"aio.h", "extensions":["FSC","SIO"]},
-        {"ident":"alarm", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"alphasort", "id_type":"function", "header":"dirent.h", "extensions":[]},
-        {"ident":"and", "id_type":"macro", "header":"iso646.h", "extensions":["CX"]},
-        {"ident":"and_eq", "id_type":"macro", "header":"iso646.h", "extensions":[]},
-        {"ident":"asctime", "id_type":"function", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"asctime_r", "id_type":"function", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"asin", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"asinf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"asinh", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"asinhf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"asinhl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"asinl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"assert", "id_type":"macro", "header":"assert.h", "extensions":[]},
-        {"ident":"AT_EACCESS", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"AT_FDCWD", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"AT_REMOVEDIR", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"AT_SYMLINK_FOLLOW", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"AT_SYMLINK_NOFOLLOW", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"atan", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"atan2", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"atan2f", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"atan2l", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"atanf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"atanh", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"atanhf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"atanhl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"atanl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"atexit", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"atof", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"atoi", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"atol", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"atoll", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"B0", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"B110", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"B1200", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"B134", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"B150", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"B1800", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"B19200", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"B200", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"B2400", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"B300", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"B38400", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"B4800", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"B50", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"B600", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"B75", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"B9600", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"bandinfo", "id_type":"type", "header":"stropts.h", "extensions":[]},
-        {"ident":"basename", "id_type":"function", "header":"libgen.h", "extensions":[]},
-        {"ident":"bind", "id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"bitand", "id_type":"macro", "header":"iso646.h", "extensions":[]},
-        {"ident":"bitor", "id_type":"macro", "header":"iso646.h", "extensions":[]},
-        {"ident":"blkcnt_t", "id_type":"type", "header":"sys/types.h", "extensions":["XSI"]},
-        {"ident":"blksize_t", "id_type":"type", "header":"sys/types.h", "extensions":["XSI"]},
-        {"ident":"bool", "id_type":"macro", "header":"stdbool.h", "extensions":[]},
-        {"ident":"BOOT_TIME", "id_type":"constant", "header":"utmpx.h", "extensions":[]},
-        {"ident":"BRKINT", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"BSDLY", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"bsearch", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"btowc", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"BUFSIZ", "id_type":"type", "header":"stdio.h", "extensions":[]},
-        {"ident":"cabs", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"cabsf", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"cabsl", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"cacos", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"cacosf", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"cacosh", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"cacoshf", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"cacoshl", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"cacosl", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"calloc", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"carg", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"cargf", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"cargl", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"casin", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"casinf", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"casinh", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"casinhf", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"casinhl", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"casinl", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"catan", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"catanf", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"catanh", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"catanhf", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"catanhl", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"catanl", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"catclose", "id_type":"function", "header":"nl_types.h", "extensions":[]},
-        {"ident":"catgets", "id_type":"function", "header":"nl_types.h", "extensions":[]},
-        {"ident":"catopen", "id_type":"function", "header":"nl_types.h", "extensions":[]},
-        {"ident":"cbrt", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"cbrtf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"cbrtl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"cc_t", "id_type":"type", "header":"termios.h", "extensions":[]},
-        {"ident":"ccos", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"ccosf", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"ccosh", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"ccoshf", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"ccoshl", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"ccosl", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"ceil", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"ceilf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"ceill", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"cexp", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"cexpf", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"cexpl", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"cfgetispeed", "id_type":"function", "header":"termios.h", "extensions":[]},
-        {"ident":"cfgetospeed", "id_type":"function", "header":"termios.h", "extensions":[]},
-        {"ident":"cfsetispeed", "id_type":"function", "header":"termios.h", "extensions":[]},
-        {"ident":"cfsetospeed", "id_type":"function", "header":"termios.h", "extensions":[]},
-        {"ident":"CHAR_BIT", "id_type":"macro", "header":"limits.h", "extensions":[]},
-        {"ident":"CHAR_MAX", "id_type":"macro", "header":"limits.h", "extensions":[]},
-        {"ident":"CHAR_MIN", "id_type":"macro", "header":"limits.h", "extensions":[]},
-        {"ident":"chdir", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"chmod", "id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
-        {"ident":"chown", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"chroot", "id_type":"function", "header":"unistd.h", "extensions":["OB","REM"]},
-        {"ident":"cimag", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"cimagf", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"cimagl", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"clearerr", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"CLOCAL", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"clock", "id_type":"function", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"clock_getcpuclockid", "id_type":"function", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"clock_getres", "id_type":"function", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"clock_gettime", "id_type":"function", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"CLOCK_MONOTONIC", "id_type":"macro", "header":"time.h", "extensions":["MON"]},
-        {"ident":"clock_nanosleep", "id_type":"function", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"CLOCK_PROCESS_CPUTIME_ID", "id_type":"macro", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"CLOCK_REALTIME", "id_type":"macro", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"clock_settime", "id_type":"function", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"clock_t", "id_type":"type", "header":"sys/types.h", "extensions":[]},
-        {"ident":"CLOCK_THREAD_CPUTIME_ID", "id_type":"macro", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"clockid_t", "id_type":"type", "header":"sys/types.h", "extensions":["TCT"]},
-        {"ident":"CLOCKS_PER_SEC", "id_type":"macro", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"clog", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"clogf", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"clogl", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"close", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"closedir", "id_type":"function", "header":"dirent.h", "extensions":[]},
-        {"ident":"closelog", "id_type":"function", "header":"syslog.h", "extensions":[]},
-        {"ident":"CMSG_DATA", "id_type":"macro", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"CMSG_FIRSTHDR", "id_type":"macro", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"CMSG_NXTHDR", "id_type":"macro", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"cmsghdr", "id_type":"type", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"compl", "id_type":"macro", "header":"iso646.h", "extensions":[]},
-        {"ident":"complex", "id_type":"macro", "header":"complex.h", "extensions":[]},
-        {"ident":"confstr", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"conj", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"conjf", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"conjl", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"connect", "id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"copysign", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"copysignf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"copysignl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"cos", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"cosf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"cosh", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"coshf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"coshl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"cosl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"cpow", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"cpowf", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"cpowl", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"cproj", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"cprojf", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"cprojl", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"CRDLY", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"CREAD", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"creal", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"crealf", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"creall", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"creat", "id_type":"function", "header":"fcntl.h", "extensions":[]},
-        {"ident":"crypt", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"csin", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"csinf", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"csinh", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"csinhf", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"csinhl", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"csinl", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"CSIZE", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"csqrt", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"csqrtf", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"csqrtl", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"CSTOPB", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"ctan", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"ctanf", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"ctanh", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"ctanhf", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"ctanhl", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"ctanl", "id_type":"function", "header":"complex.h", "extensions":[]},
-        {"ident":"ctermid", "id_type":"function", "header":"stdio.h", "extensions":["CX"]},
-        {"ident":"ctime", "id_type":"function", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"ctime_r", "id_type":"function", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"datum", "id_type":"type", "header":"ndbm.h", "extensions":[]},
-        {"ident":"daylight", "id_type":"variable", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"DBM", "id_type":"type", "header":"ndbm.h", "extensions":[]},
-        {"ident":"dbm_clearerr", "id_type":"function", "header":"ndbm.h", "extensions":[]},
-        {"ident":"dbm_close", "id_type":"function", "header":"ndbm.h", "extensions":[]},
-        {"ident":"dbm_delete", "id_type":"function", "header":"ndbm.h", "extensions":[]},
-        {"ident":"dbm_error", "id_type":"function", "header":"ndbm.h", "extensions":[]},
-        {"ident":"dbm_fetch", "id_type":"function", "header":"ndbm.h", "extensions":[]},
-        {"ident":"dbm_firstkey", "id_type":"function", "header":"ndbm.h", "extensions":[]},
-        {"ident":"DBM_INSERT", "id_type":"constant", "header":"ndbm.h", "extensions":[]},
-        {"ident":"dbm_nextkey", "id_type":"function", "header":"ndbm.h", "extensions":[]},
-        {"ident":"dbm_open", "id_type":"function", "header":"ndbm.h", "extensions":[]},
-        {"ident":"DBM_REPLACE", "id_type":"constant", "header":"ndbm.h", "extensions":[]},
-        {"ident":"dbm_store", "id_type":"function", "header":"ndbm.h", "extensions":[]},
-        {"ident":"DEAD_PROCESS", "id_type":"constant", "header":"utmpx.h", "extensions":[]},
-        {"ident":"dev_t", "id_type":"type", "header":"sys/types.h", "extensions":["XSI"]},
-        {"ident":"difftime", "id_type":"function", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"DIR", "id_type":"type", "header":"dirent.h", "extensions":[]},
-        {"ident":"dirent", "id_type":"type", "header":"dirent.h", "extensions":[]},
-        {"ident":"dirfd", "id_type":"function", "header":"dirent.h", "extensions":[]},
-        {"ident":"dirname", "id_type":"function", "header":"libgen.h", "extensions":[]},
-        {"ident":"div", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"div_t", "id_type":"type", "header":"stdlib.h", "extensions":[]},
-        {"ident":"dlclose", "id_type":"function", "header":"dlfcn.h", "extensions":[]},
-        {"ident":"dlerror", "id_type":"function", "header":"dlfcn.h", "extensions":[]},
-        {"ident":"dlopen", "id_type":"function", "header":"dlfcn.h", "extensions":[]},
-        {"ident":"dlsym", "id_type":"function", "header":"dlfcn.h", "extensions":[]},
-        {"ident":"dprintf", "id_type":"function", "header":"stdio.h", "extensions":["CX"]},
-        {"ident":"drand48", "id_type":"function", "header":"stdlib.h", "extensions":["XSI"]},
-        {"ident":"dup", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"dup2", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"duplocale", "id_type":"function", "header":"locale.h", "extensions":["CX"]},
-        {"ident":"E2BIG", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EACCES", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EADDRINUSE", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EADDRNOTAVAIL", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EAFNOSUPPORT", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EAGAIN", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EAI_AGAIN", "id_type":"constant", "header":"netdb.h", "extensions":[]},
-        {"ident":"EAI_BADFLAGS", "id_type":"constant", "header":"netdb.h", "extensions":[]},
-        {"ident":"EAI_FAIL", "id_type":"constant", "header":"netdb.h", "extensions":[]},
-        {"ident":"EAI_FAMILY", "id_type":"constant", "header":"netdb.h", "extensions":[]},
-        {"ident":"EAI_MEMORY", "id_type":"constant", "header":"netdb.h", "extensions":[]},
-        {"ident":"EAI_NONAME", "id_type":"constant", "header":"netdb.h", "extensions":[]},
-        {"ident":"EAI_OVERFLOW", "id_type":"constant", "header":"netdb.h", "extensions":[]},
-        {"ident":"EAI_SERVICE", "id_type":"constant", "header":"netdb.h", "extensions":[]},
-        {"ident":"EAI_SOCKTYPE", "id_type":"constant", "header":"netdb.h", "extensions":[]},
-        {"ident":"EAI_SYSTEM", "id_type":"constant", "header":"netdb.h", "extensions":[]},
-        {"ident":"EALREADY", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EBADF", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EBADMSG", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EBUSY", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ECANCELED", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ECHILD", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ECHO", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"ECHOE", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"ECHOK", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"ECHONL", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"ECONNABORTED", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ECONNREFUSED", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ECONNRESET", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EDEADLK", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EDESTADDRREQ", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EDOM", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EDQUOT", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EEXIST", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EFAULT", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EFBIG", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EHOSTUNREACH", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EIDRM", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EILSEQ", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EINPROGRESS", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EINTR", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EINVAL", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EIO", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EISCONN", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EISDIR", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ELOOP", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EMFILE", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EMLINK", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EMPTY", "id_type":"constant", "header":"utmpx.h", "extensions":[]},
-        {"ident":"EMSGSIZE", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EMULTIHOP", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ENAMETOOLONG", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"encrypt", "id_type":"function", "header":"unistd.h", "extensions":["XSI"]},
-        {"ident":"endgrent", "id_type":"function", "header":"grp.h", "extensions":["XSI"]},
-        {"ident":"endhostent", "id_type":"function", "header":"netdb.h", "extensions":[]},
-        {"ident":"endnetent", "id_type":"function", "header":"netdb.h", "extensions":[]},
-        {"ident":"endprotoent", "id_type":"function", "header":"netdb.h", "extensions":[]},
-        {"ident":"endpwent", "id_type":"function", "header":"pwd.h", "extensions":["XSI"]},
-        {"ident":"endservent", "id_type":"function", "header":"netdb.h", "extensions":[]},
-        {"ident":"endutxent", "id_type":"function", "header":"utmpx.h", "extensions":[]},
-        {"ident":"ENETDOWN", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ENETRESET", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ENETUNREACH", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ENFILE", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ENOBUFS", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ENODATA", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ENODEV", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ENOENT", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ENOEXEC", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ENOLCK", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ENOLINK", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ENOMEM", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ENOMSG", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ENOPROTOOPT", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ENOSPC", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ENOSR", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ENOSTR", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ENOSYS", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ENOTCONN", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ENOTDIR", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ENOTEMPTY", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ENOTRECOVERABLE", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ENOTSOCK", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ENOTSUP", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ENOTTY", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ENTRY", "id_type":"type", "header":"search.h", "extensions":[]},
-        {"ident":"entry", "id_type":"type", "header":"search.h", "extensions":[]},
-        {"ident":"ENXIO", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EOF", "id_type":"macro", "header":"stdio.h", "extensions":[]},
-        {"ident":"EOPNOTSUPP", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EOVERFLOW", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EOWNERDEAD", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EPERM", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EPIPE", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EPROTO", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EPROTONOSUPPORT", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EPROTOTYPE", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"erand48", "id_type":"function", "header":"stdlib.h", "extensions":["XSI"]},
-        {"ident":"ERANGE", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"erf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"erfc", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"erfcf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"erfcl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"erff", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"erfl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"EROFS", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"errno", "id_type":"macroOrIdentifier", "header":"errno.h", "extensions":[]},
-        {"ident":"ESPIPE", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ESRCH", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ESTALE", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ETIME", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ETIMEDOUT", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"ETXTBSY", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EWOULDBLOCK", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"EXDEV", "id_type":"macro", "header":"errno.h", "extensions":[]},
-        {"ident":"execl", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"execle", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"execlp", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"execv", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"execve", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"execvp", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"exit", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"EXIT_FAILURE", "id_type":"macro", "header":"stdlib.h", "extensions":[]},
-        {"ident":"EXIT_SUCCESS", "id_type":"macro", "header":"stdlib.h", "extensions":[]},
-        {"ident":"exp", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"exp2", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"exp2f", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"exp2l", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"expf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"expl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"expm1", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"expm1f", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"expm1l", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"F_DUPFD", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"F_DUPFD_CLOEXEC", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"F_GETFD", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"F_GETFL", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"F_GETLK", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"F_GETOWN", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"F_LOCK", "id_type":"constant", "header":"unistd.h", "extensions":["XSI"]},
-        {"ident":"F_OK", "id_type":"constant", "header":"unistd.h", "extensions":[]},
-        {"ident":"F_SETFD", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"F_SETFL", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"F_SETLK", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"F_SETLKW", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"F_SETOWN", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"F_TEST", "id_type":"constant", "header":"unistd.h", "extensions":["XSI"]},
-        {"ident":"F_TLOCK", "id_type":"constant", "header":"unistd.h", "extensions":["XSI"]},
-        {"ident":"F_ULOCK", "id_type":"constant", "header":"unistd.h", "extensions":["XSI"]},
-        {"ident":"fabs", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"fabsf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"fabsl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"faccessat", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"false", "id_type":"macro", "header":"stdbool.h", "extensions":[]},
-        {"ident":"fattach", "id_type":"function", "header":"stropts.h", "extensions":[]},
-        {"ident":"fchdir", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"fchmod", "id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
-        {"ident":"fchmodat", "id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
-        {"ident":"fchown", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"fchownat", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"fclose", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"fcntl", "id_type":"function", "header":"fcntl.h", "extensions":[]},
-        {"ident":"FD_CLOEXEC", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"FD_CLR", "id_type":"function", "header":"sys/select.h", "extensions":[]},
-        {"ident":"FD_ISSET", "id_type":"function", "header":"sys/select.h", "extensions":[]},
-        {"ident":"FD_SET", "id_type":"function", "header":"sys/select.h", "extensions":[]},
-        {"ident":"fd_set", "id_type":"type", "header":"sys/select.h", "extensions":[]},
-        {"ident":"FD_SETSIZE", "id_type":"constant", "header":"sys/select.h", "extensions":[]},
-        {"ident":"FD_ZERO", "id_type":"function", "header":"sys/select.h", "extensions":[]},
-        {"ident":"fdatasync", "id_type":"function", "header":"unistd.h", "extensions":["SIO"]},
-        {"ident":"fdetach", "id_type":"function", "header":"stropts.h", "extensions":[]},
-        {"ident":"fdim", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"fdimf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"fdiml", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"fdopen", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"fdopendir", "id_type":"function", "header":"dirent.h", "extensions":[]},
-        {"ident":"feclearexcept", "id_type":"function", "header":"fenv.h", "extensions":[]},
-        {"ident":"fegetenv", "id_type":"function", "header":"fenv.h", "extensions":[]},
-        {"ident":"fegetexceptflag", "id_type":"function", "header":"fenv.h", "extensions":[]},
-        {"ident":"fegetround", "id_type":"function", "header":"fenv.h", "extensions":[]},
-        {"ident":"feholdexcept", "id_type":"function", "header":"fenv.h", "extensions":[]},
-        {"ident":"fenv_t", "id_type":"type", "header":"fenv.h", "extensions":[]},
-        {"ident":"feof", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"feraiseexcept", "id_type":"function", "header":"fenv.h", "extensions":[]},
-        {"ident":"ferror", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"fesetenv", "id_type":"function", "header":"fenv.h", "extensions":[]},
-        {"ident":"fesetexceptflag", "id_type":"function", "header":"fenv.h", "extensions":[]},
-        {"ident":"fesetround", "id_type":"function", "header":"fenv.h", "extensions":[]},
-        {"ident":"fetestexcept", "id_type":"function", "header":"fenv.h", "extensions":[]},
-        {"ident":"feupdateenv", "id_type":"function", "header":"fenv.h", "extensions":[]},
-        {"ident":"fexcept_t", "id_type":"type", "header":"fenv.h", "extensions":[]},
-        {"ident":"fexecve", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"FFDLY", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"fflush", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"ffs", "id_type":"function", "header":"strings.h", "extensions":["XSI"]},
-        {"ident":"fgetc", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"fgetpos", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"fgets", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"fgetwc", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"fgetws", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"FILE", "id_type":"type", "header":"stdio.h", "extensions":["CX"]},
-        {"ident":"FILENAME_MAX", "id_type":"macro", "header":"stdio.h", "extensions":[]},
-        {"ident":"fileno", "id_type":"function", "header":"stdio.h", "extensions":["CX"]},
-        {"ident":"flock", "id_type":"type", "header":"fcntl.h", "extensions":[]},
-        {"ident":"flockfile", "id_type":"function", "header":"stdio.h", "extensions":["CX"]},
-        {"ident":"floor", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"floorf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"floorl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"fma", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"fmaf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"fmal", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"fmax", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"fmaxf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"fmaxl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"fmemopen", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"fmin", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"fminf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"fminl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"fmod", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"fmodf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"fmodl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"fmtmsg", "id_type":"function", "header":"fmtmsg.h", "extensions":[]},
-        {"ident":"FNM_NOESCAPE", "id_type":"constant", "header":"fnmatch.h", "extensions":[]},
-        {"ident":"FNM_NOMATCH", "id_type":"constant", "header":"fnmatch.h", "extensions":[]},
-        {"ident":"FNM_PATHNAME", "id_type":"constant", "header":"fnmatch.h", "extensions":[]},
-        {"ident":"FNM_PERIOD", "id_type":"constant", "header":"fnmatch.h", "extensions":[]},
-        {"ident":"fnmatch", "id_type":"function", "header":"fnmatch.h", "extensions":[]},
-        {"ident":"fopen", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"FOPEN_MAX", "id_type":"macro", "header":"stdio.h", "extensions":[]},
-        {"ident":"fork", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"fpathconf", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"fpos_t", "id_type":"type", "header":"stdio.h", "extensions":[]},
-        {"ident":"fprintf", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"fputc", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"fputs", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"fputwc", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"fputws", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"fread", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"free", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"freeaddrinfo", "id_type":"function", "header":"netdb.h", "extensions":[]},
-        {"ident":"freelocale", "id_type":"function", "header":"locale.h", "extensions":["CX"]},
-        {"ident":"freopen", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"frexp", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"frexpf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"frexpl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"fsblkcnt_t", "id_type":"type", "header":"sys/types.h", "extensions":[]},
-        {"ident":"fscanf", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"fseek", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"fseeko", "id_type":"function", "header":"stdio.h", "extensions":["CX"]},
-        {"ident":"fsetpos", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"fsfilcnt_t", "id_type":"type", "header":"sys/types.h", "extensions":[]},
-        {"ident":"fstat", "id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
-        {"ident":"fstatat", "id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
-        {"ident":"fstatvfs", "id_type":"function", "header":"sys/statvfs.h", "extensions":[]},
-        {"ident":"fsync", "id_type":"function", "header":"unistd.h", "extensions":["FSC"]},
-        {"ident":"ftell", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"ftello", "id_type":"function", "header":"stdio.h", "extensions":["CX"]},
-        {"ident":"ftok", "id_type":"function", "header":"sys/ipc.h", "extensions":[]},
-        {"ident":"ftruncate", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"ftrylockfile", "id_type":"function", "header":"stdio.h", "extensions":["CX"]},
-        {"ident":"ftw", "id_type":"function", "header":"ftw.h", "extensions":["OB"]},
-        {"ident":"FTW", "id_type":"type", "header":"ftw.h", "extensions":["OB"]},
-        {"ident":"FTW_CHDIR", "id_type":"constant", "header":"ftw.h", "extensions":["OB"]},
-        {"ident":"FTW_D", "id_type":"constant", "header":"ftw.h", "extensions":["OB"]},
-        {"ident":"FTW_DEPTH", "id_type":"constant", "header":"ftw.h", "extensions":["OB"]},
-        {"ident":"FTW_DNR", "id_type":"constant", "header":"ftw.h", "extensions":["OB"]},
-        {"ident":"FTW_DP", "id_type":"constant", "header":"ftw.h", "extensions":["OB"]},
-        {"ident":"FTW_F", "id_type":"constant", "header":"ftw.h", "extensions":["OB"]},
-        {"ident":"FTW_MOUNT", "id_type":"constant", "header":"ftw.h", "extensions":["OB"]},
-        {"ident":"FTW_NS", "id_type":"constant", "header":"ftw.h", "extensions":["OB"]},
-        {"ident":"FTW_PHYS", "id_type":"constant", "header":"ftw.h", "extensions":["OB"]},
-        {"ident":"FTW_SL", "id_type":"constant", "header":"ftw.h", "extensions":["OB"]},
-        {"ident":"FTW_SLN", "id_type":"constant", "header":"ftw.h", "extensions":["OB"]},
-        {"ident":"funlockfile", "id_type":"function", "header":"stdio.h", "extensions":["CX"]},
-        {"ident":"futimens", "id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
-        {"ident":"fwide", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"fwprintf", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"fwrite", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"fwscanf", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"gai_strerror", "id_type":"function", "header":"netdb.h", "extensions":[]},
-        {"ident":"getaddrinfo", "id_type":"function", "header":"netdb.h", "extensions":["IP6"]},
-        {"ident":"GETALL", "id_type":"constant", "header":"sys/sem.h", "extensions":[]},
-        {"ident":"getc", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"getc_unlocked", "id_type":"function", "header":"stdio.h", "extensions":["CX"]},
-        {"ident":"getchar", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"getchar_unlocked", "id_type":"function", "header":"stdio.h", "extensions":["CX"]},
-        {"ident":"getcwd", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"getdate", "id_type":"function", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"getdelim", "id_type":"function", "header":"stdio.h", "extensions":["CX"]},
-        {"ident":"getegid", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"getenv", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"geteuid", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"getgid", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"getgrent", "id_type":"function", "header":"grp.h", "extensions":[]},
-        {"ident":"getgrgid", "id_type":"function", "header":"grp.h", "extensions":[]},
-        {"ident":"getgrgid_r", "id_type":"function", "header":"grp.h", "extensions":[]},
-        {"ident":"getgrnam", "id_type":"function", "header":"grp.h", "extensions":[]},
-        {"ident":"getgrnam_r", "id_type":"function", "header":"grp.h", "extensions":[]},
-        {"ident":"getgroups", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"gethostbyaddr", "id_type":"function", "header":"netdb.h", "extensions":["OB","REM"]},
-        {"ident":"gethostbyname", "id_type":"function", "header":"netdb.h", "extensions":["OB","REM"]},
-        {"ident":"gethostent", "id_type":"function", "header":"netdb.h", "extensions":[]},
-        {"ident":"gethostid", "id_type":"function", "header":"unistd.h", "extensions":["XSI"]},
-        {"ident":"gethostname", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"getitimer", "id_type":"function", "header":"sys/time.h", "extensions":["IP6"]},
-        {"ident":"getline", "id_type":"function", "header":"stdio.h", "extensions":["CX"]},
-        {"ident":"getlogin", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"getlogin_r", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"getmsg", "id_type":"function", "header":"stropts.h", "extensions":[]},
-        {"ident":"getnameinfo", "id_type":"function", "header":"netdb.h", "extensions":[]},
-        {"ident":"GETNCNT", "id_type":"constant", "header":"sys/sem.h", "extensions":[]},
-        {"ident":"getnetbyaddr", "id_type":"function", "header":"netdb.h", "extensions":[]},
-        {"ident":"getnetbyname", "id_type":"function", "header":"netdb.h", "extensions":[]},
-        {"ident":"getnetent", "id_type":"function", "header":"netdb.h", "extensions":[]},
-        {"ident":"getopt", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"getpeername", "id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"getpgid", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"getpgrp", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"GETPID", "id_type":"constant", "header":"sys/sem.h", "extensions":[]},
-        {"ident":"getpid", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"getpmsg", "id_type":"function", "header":"stropts.h", "extensions":[]},
-        {"ident":"getppid", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"getpriority", "id_type":"function", "header":"sys/resource.h", "extensions":[]},
-        {"ident":"getprotobyname", "id_type":"function", "header":"netdb.h", "extensions":[]},
-        {"ident":"getprotobynumber", "id_type":"function", "header":"netdb.h", "extensions":[]},
-        {"ident":"getprotoent", "id_type":"function", "header":"netdb.h", "extensions":[]},
-        {"ident":"getpwent", "id_type":"function", "header":"pwd.h", "extensions":[]},
-        {"ident":"getpwnam", "id_type":"function", "header":"pwd.h", "extensions":[]},
-        {"ident":"getpwnam_r", "id_type":"function", "header":"pwd.h", "extensions":[]},
-        {"ident":"getpwuid", "id_type":"function", "header":"pwd.h", "extensions":[]},
-        {"ident":"getpwuid_r", "id_type":"function", "header":"pwd.h", "extensions":[]},
-        {"ident":"getrlimit", "id_type":"function", "header":"sys/resource.h", "extensions":[]},
-        {"ident":"getrusage", "id_type":"function", "header":"sys/resource.h", "extensions":[]},
-        {"ident":"gets", "id_type":"function", "header":"stdio.h", "extensions":["OB"]},
-        {"ident":"getservbyname", "id_type":"function", "header":"netdb.h", "extensions":[]},
-        {"ident":"getservbyport", "id_type":"function", "header":"netdb.h", "extensions":[]},
-        {"ident":"getservent", "id_type":"function", "header":"netdb.h", "extensions":[]},
-        {"ident":"getsid", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"getsockname", "id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"getsockopt", "id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"getsubopt", "id_type":"function", "header":"stdlib.h", "extensions":["CX"]},
-        {"ident":"gettimeofday", "id_type":"function", "header":"sys/time.h", "extensions":["IP6"]},
-        {"ident":"getuid", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"getutxent", "id_type":"function", "header":"utmpx.h", "extensions":[]},
-        {"ident":"getutxid", "id_type":"function", "header":"utmpx.h", "extensions":[]},
-        {"ident":"getutxline", "id_type":"function", "header":"utmpx.h", "extensions":[]},
-        {"ident":"GETVAL", "id_type":"constant", "header":"sys/sem.h", "extensions":[]},
-        {"ident":"getwc", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"getwchar", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"GETZCNT", "id_type":"constant", "header":"sys/sem.h", "extensions":[]},
-        {"ident":"gid_t", "id_type":"type", "header":"sys/types.h", "extensions":[]},
-        {"ident":"glob", "id_type":"function", "header":"glob.h", "extensions":[]},
-        {"ident":"GLOB_ABORTED", "id_type":"constant", "header":"glob.h", "extensions":[]},
-        {"ident":"GLOB_APPEND", "id_type":"constant", "header":"glob.h", "extensions":[]},
-        {"ident":"GLOB_DOOFFS", "id_type":"constant", "header":"glob.h", "extensions":[]},
-        {"ident":"GLOB_ERR", "id_type":"constant", "header":"glob.h", "extensions":[]},
-        {"ident":"GLOB_MARK", "id_type":"constant", "header":"glob.h", "extensions":[]},
-        {"ident":"GLOB_NOCHECK", "id_type":"constant", "header":"glob.h", "extensions":[]},
-        {"ident":"GLOB_NOESCAPE", "id_type":"constant", "header":"glob.h", "extensions":[]},
-        {"ident":"GLOB_NOMATCH", "id_type":"constant", "header":"glob.h", "extensions":[]},
-        {"ident":"GLOB_NOSORT", "id_type":"constant", "header":"glob.h", "extensions":[]},
-        {"ident":"GLOB_NOSPACE", "id_type":"constant", "header":"glob.h", "extensions":[]},
-        {"ident":"glob_t", "id_type":"type", "header":"glob.h", "extensions":[]},
-        {"ident":"globfree", "id_type":"function", "header":"glob.h", "extensions":[]},
-        {"ident":"gmtime", "id_type":"function", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"gmtime_r", "id_type":"function", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"grantpt", "id_type":"function", "header":"stdlib.h", "extensions":["XSI"]},
-        {"ident":"group", "id_type":"type", "header":"grp.h", "extensions":["XSI"]},
-        {"ident":"h_errno", "id_type":"macroOrIdentifier", "header":"netdb.h", "extensions":["OB","REM"]},
-        {"ident":"hcreate", "id_type":"function", "header":"search.h", "extensions":[]},
-        {"ident":"hdestroy", "id_type":"function", "header":"search.h", "extensions":[]},
-        {"ident":"hostent", "id_type":"type", "header":"netdb.h", "extensions":[]},
-        {"ident":"hsearch", "id_type":"function", "header":"search.h", "extensions":[]},
-        {"ident":"htonl", "id_type":"function", "header":"arpa/inet.h", "extensions":[]},
-        {"ident":"htons", "id_type":"function", "header":"arpa/inet.h", "extensions":[]},
-        {"ident":"HUGE_VAL", "id_type":"macro", "header":"math.h", "extensions":[]},
-        {"ident":"HUGE_VALF", "id_type":"macro", "header":"math.h", "extensions":[]},
-        {"ident":"HUGE_VALL", "id_type":"macro", "header":"math.h", "extensions":[]},
-        {"ident":"HUPCL", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"hypot", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"hypotf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"hypotl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"I", "id_type":"macro", "header":"complex.h", "extensions":[]},
-        {"ident":"ICANON", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"iconv", "id_type":"function", "header":"iconv.h", "extensions":[]},
-        {"ident":"iconv_close", "id_type":"function", "header":"iconv.h", "extensions":[]},
-        {"ident":"iconv_open", "id_type":"function", "header":"iconv.h", "extensions":[]},
-        {"ident":"iconv_t", "id_type":"type", "header":"iconv.h", "extensions":[]},
-        {"ident":"ICRNL", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"id_t", "id_type":"type", "header":"sys/types.h", "extensions":[]},
-        {"ident":"IEXTEN", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"if_freenameindex", "id_type":"function", "header":"net/if.h", "extensions":[]},
-        {"ident":"if_indextoname", "id_type":"function", "header":"net/if.h", "extensions":[]},
-        {"ident":"if_nameindex", "id_type":"function", "header":"net/if.h", "extensions":[]},
-        {"ident":"IF_NAMESIZE", "id_type":"constant", "header":"net/if.h", "extensions":[]},
-        {"ident":"if_nametoindex", "id_type":"function", "header":"net/if.h", "extensions":[]},
-        {"ident":"IGNBRK", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"IGNCR", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"IGNPAR", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"ilogb", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"ilogbf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"ilogbl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"imaginary", "id_type":"macro", "header":"complex.h", "extensions":[]},
-        {"ident":"imaxabs", "id_type":"function", "header":"inttypes.h", "extensions":[]},
-        {"ident":"imaxdiv", "id_type":"function", "header":"inttypes.h", "extensions":[]},
-        {"ident":"in6_addr", "id_type":"type", "header":"netinet/in.h", "extensions":["IP6"]},
-        {"ident":"IN6_IS_ADDR_LINKLOCAL", "id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
-        {"ident":"IN6_IS_ADDR_LOOPBACK", "id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
-        {"ident":"IN6_IS_ADDR_MC_GLOBAL", "id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
-        {"ident":"IN6_IS_ADDR_MC_LINKLOCAL", "id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
-        {"ident":"IN6_IS_ADDR_MC_NODELOCAL", "id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
-        {"ident":"IN6_IS_ADDR_MC_ORGLOCAL", "id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
-        {"ident":"IN6_IS_ADDR_MC_SITELOCAL", "id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
-        {"ident":"IN6_IS_ADDR_MULTICAST", "id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
-        {"ident":"IN6_IS_ADDR_SITELOCAL", "id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
-        {"ident":"IN6_IS_ADDR_UNSPECIFIED", "id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
-        {"ident":"IN6_IS_ADDR_V4COMPAT", "id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
-        {"ident":"IN6_IS_ADDR_V4MAPPED", "id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
-        {"ident":"in6addr_any", "id_type":"variable", "header":"netinet/in.h", "extensions":["IP6"]},
-        {"ident":"in6addr_loopback", "id_type":"variable", "header":"netinet/in.h", "extensions":["IP6"]},
-        {"ident":"in_addr", "id_type":"type", "header":"netinet/in.h", "extensions":[]},
-        {"ident":"in_addr_t", "id_type":"type", "header":"netinet/in.h", "extensions":[]},
-        {"ident":"in_port_t", "id_type":"type", "header":"netinet/in.h", "extensions":["IP6"]},
-        {"ident":"INADDR_ANY", "id_type":"constant", "header":"netinet/in.h", "extensions":[]},
-        {"ident":"INADDR_BROADCAST", "id_type":"constant", "header":"netinet/in.h", "extensions":[]},
-        {"ident":"INET6_ADDRSTRLEN", "id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
-        {"ident":"inet_addr", "id_type":"function", "header":"arpa/inet.h", "extensions":[]},
-        {"ident":"INET_ADDRSTRLEN", "id_type":"constant", "header":"netinet/in.h", "extensions":[]},
-        {"ident":"inet_ntoa", "id_type":"function", "header":"arpa/inet.h", "extensions":[]},
-        {"ident":"inet_ntop", "id_type":"function", "header":"arpa/inet.h", "extensions":[]},
-        {"ident":"inet_pton", "id_type":"function", "header":"arpa/inet.h", "extensions":[]},
-        {"ident":"INFINITY", "id_type":"macro", "header":"math.h", "extensions":[]},
-        {"ident":"INIT_PROCESS", "id_type":"constant", "header":"utmpx.h", "extensions":[]},
-        {"ident":"initstate", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"INLCR", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"ino_t", "id_type":"type", "header":"sys/types.h", "extensions":["XSI"]},
-        {"ident":"INPCK", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"insque", "id_type":"function", "header":"search.h", "extensions":[]},
-        {"ident":"INT_MAX", "id_type":"macro", "header":"limits.h", "extensions":[]},
-        {"ident":"INT_MIN", "id_type":"macro", "header":"limits.h", "extensions":[]},
-        {"ident":"ioctl", "id_type":"function", "header":"stropts.h", "extensions":["OB","XSR"]},
-        {"ident":"iovec", "id_type":"type", "header":"sys/uio.h", "extensions":["XSI"]},
-        {"ident":"IPC_CREAT", "id_type":"constant", "header":"sys/ipc.h", "extensions":[]},
-        {"ident":"IPC_EXCL", "id_type":"constant", "header":"sys/ipc.h", "extensions":[]},
-        {"ident":"IPC_NOWAIT", "id_type":"constant", "header":"sys/ipc.h", "extensions":[]},
-        {"ident":"ipc_perm", "id_type":"type", "header":"sys/ipc.h", "extensions":[]},
-        {"ident":"IPPROTO_ICMP", "id_type":"constant", "header":"netinet/in.h", "extensions":[]},
-        {"ident":"IPPROTO_IP", "id_type":"constant", "header":"netinet/in.h", "extensions":[]},
-        {"ident":"IPPROTO_IPV6", "id_type":"constant", "header":"netinet/in.h", "extensions":[]},
-        {"ident":"IPPROTO_RAW", "id_type":"constant", "header":"netinet/in.h", "extensions":[]},
-        {"ident":"IPPROTO_TCP", "id_type":"constant", "header":"netinet/in.h", "extensions":[]},
-        {"ident":"IPPROTO_UDP", "id_type":"constant", "header":"netinet/in.h", "extensions":[]},
-        {"ident":"IPV6_JOIN_GROUP", "id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
-        {"ident":"IPV6_LEAVE_GROUP", "id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
-        {"ident":"ipv6_mreq", "id_type":"type", "header":"netinet/in.h", "extensions":["IP6"]},
-        {"ident":"IPV6_MULTICAST_HOPS", "id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
-        {"ident":"IPV6_MULTICAST_IF", "id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
-        {"ident":"IPV6_MULTICAST_LOOP", "id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
-        {"ident":"IPV6_UNICAST_HOPS", "id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
-        {"ident":"IPV6_V6ONLY", "id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
-        {"ident":"isalnum", "id_type":"function", "header":"ctype.h", "extensions":[]},
-        {"ident":"isalnum_l", "id_type":"function", "header":"ctype.h", "extensions":["CX"]},
-        {"ident":"isalpha", "id_type":"function", "header":"ctype.h", "extensions":[]},
-        {"ident":"isalpha_l", "id_type":"function", "header":"ctype.h", "extensions":["CX"]},
-        {"ident":"isascii", "id_type":"function", "header":"ctype.h", "extensions":["OB","XSI"]},
-        {"ident":"isastream", "id_type":"function", "header":"stropts.h", "extensions":[]},
-        {"ident":"isatty", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"isblank", "id_type":"function", "header":"ctype.h", "extensions":[]},
-        {"ident":"isblank_l", "id_type":"function", "header":"ctype.h", "extensions":["CX"]},
-        {"ident":"iscntrl", "id_type":"function", "header":"ctype.h", "extensions":[]},
-        {"ident":"iscntrl_l", "id_type":"function", "header":"ctype.h", "extensions":["CX"]},
-        {"ident":"isdigit", "id_type":"function", "header":"ctype.h", "extensions":[]},
-        {"ident":"isdigit_l", "id_type":"function", "header":"ctype.h", "extensions":["CX"]},
-        {"ident":"isgraph", "id_type":"function", "header":"ctype.h", "extensions":[]},
-        {"ident":"isgraph_l", "id_type":"function", "header":"ctype.h", "extensions":["CX"]},
-        {"ident":"ISIG", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"islower", "id_type":"function", "header":"ctype.h", "extensions":[]},
-        {"ident":"islower_l", "id_type":"function", "header":"ctype.h", "extensions":["CX"]},
-        {"ident":"isprint", "id_type":"function", "header":"ctype.h", "extensions":[]},
-        {"ident":"isprint_l", "id_type":"function", "header":"ctype.h", "extensions":["CX"]},
-        {"ident":"ispunct", "id_type":"function", "header":"ctype.h", "extensions":[]},
-        {"ident":"ispunct_l", "id_type":"function", "header":"ctype.h", "extensions":["CX"]},
-        {"ident":"isspace", "id_type":"function", "header":"ctype.h", "extensions":[]},
-        {"ident":"isspace_l", "id_type":"function", "header":"ctype.h", "extensions":["CX"]},
-        {"ident":"ISTRIP", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"isupper", "id_type":"function", "header":"ctype.h", "extensions":[]},
-        {"ident":"isupper_l", "id_type":"function", "header":"ctype.h", "extensions":["CX"]},
-        {"ident":"iswalnum", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"iswalnum_l", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"iswalpha", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"iswalpha_l", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"iswblank", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"iswblank_l", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"iswcntrl", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"iswcntrl_l", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"iswctype", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"iswctype_l", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"iswdigit", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"iswdigit_l", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"iswgraph", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"iswgraph_l", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"iswlower", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"iswlower_l", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"iswprint", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"iswprint_l", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"iswpunct", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"iswpunct_l", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"iswspace", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"iswspace_l", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"iswupper", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"iswupper_l", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"iswxdigit", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"iswxdigit_l", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"isxdigit", "id_type":"function", "header":"ctype.h", "extensions":[]},
-        {"ident":"isxdigit_l", "id_type":"function", "header":"ctype.h", "extensions":["CX"]},
-        {"ident":"ITIMER_PROF", "id_type":"constant", "header":"sys/time.h", "extensions":["IP6"]},
-        {"ident":"ITIMER_REAL", "id_type":"constant", "header":"sys/time.h", "extensions":["IP6"]},
-        {"ident":"ITIMER_VIRTUAL", "id_type":"constant", "header":"sys/time.h", "extensions":["IP6"]},
-        {"ident":"itimerspec", "id_type":"type", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"itimerval", "id_type":"type", "header":"sys/time.h", "extensions":["IP6"]},
-        {"ident":"IXANY", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"IXOFF", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"IXON", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"j0", "id_type":"function", "header":"math.h", "extensions":["XSI"]},
-        {"ident":"j1", "id_type":"function", "header":"math.h", "extensions":["XSI"]},
-        {"ident":"jn", "id_type":"function", "header":"math.h", "extensions":["XSI"]},
-        {"ident":"jrand48", "id_type":"function", "header":"stdlib.h", "extensions":["XSI"]},
-        {"ident":"key_t", "id_type":"type", "header":"sys/types.h", "extensions":[]},
-        {"ident":"kill", "id_type":"function", "header":"signal.h", "extensions":[]},
-        {"ident":"killpg", "id_type":"function", "header":"signal.h", "extensions":[]},
-        {"ident":"l64a", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"L_ctermid", "id_type":"type", "header":"stdio.h", "extensions":[]},
-        {"ident":"L_tmpnam", "id_type":"type", "header":"stdio.h", "extensions":[]},
-        {"ident":"labs", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"lchown", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"lcong48", "id_type":"function", "header":"stdlib.h", "extensions":["XSI"]},
-        {"ident":"lconv", "id_type":"type", "header":"locale.h", "extensions":[]},
-        {"ident":"ldexp", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"ldexpf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"ldexpl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"ldiv", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"ldiv_t", "id_type":"type", "header":"stdlib.h", "extensions":[]},
-        {"ident":"lfind", "id_type":"function", "header":"search.h", "extensions":[]},
-        {"ident":"lgamma", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"lgammaf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"lgammal", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"linger", "id_type":"type", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"link", "id_type":"function", "header":"unistd.h", "extensions":["IP6"]},
-        {"ident":"linkat", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"lio_listio", "id_type":"function", "header":"aio.h", "extensions":[]},
-        {"ident":"LIO_NOP", "id_type":"constant", "header":"aio.h", "extensions":[]},
-        {"ident":"LIO_NOWAIT", "id_type":"constant", "header":"aio.h", "extensions":[]},
-        {"ident":"LIO_READ", "id_type":"constant", "header":"aio.h", "extensions":[]},
-        {"ident":"LIO_WAIT", "id_type":"constant", "header":"aio.h", "extensions":[]},
-        {"ident":"LIO_WRITE", "id_type":"constant", "header":"aio.h", "extensions":[]},
-        {"ident":"listen", "id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"llabs", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"lldiv", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"lldiv_t", "id_type":"type", "header":"stdlib.h", "extensions":[]},
-        {"ident":"LLONG_MAX", "id_type":"macro", "header":"limits.h", "extensions":[]},
-        {"ident":"LLONG_MIN", "id_type":"macro", "header":"limits.h", "extensions":[]},
-        {"ident":"llrint", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"llrintf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"llrintl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"llround", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"llroundf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"llroundl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"locale_t", "id_type":"type", "header":"wchar.h", "extensions":["CX"]},
-        {"ident":"localeconv", "id_type":"function", "header":"locale.h", "extensions":[]},
-        {"ident":"localtime", "id_type":"function", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"localtime_r", "id_type":"function", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"lockf", "id_type":"function", "header":"unistd.h", "extensions":["XSI"]},
-        {"ident":"log", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"log10", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"log10f", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"log10l", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"log1p", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"log1pf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"log1pl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"log2", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"log2f", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"log2l", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"LOG_ALERT", "id_type":"macro", "header":"syslog.h", "extensions":[]},
-        {"ident":"LOG_AUTH", "id_type":"constant", "header":"syslog.h", "extensions":[]},
-        {"ident":"LOG_CONS", "id_type":"constant", "header":"syslog.h", "extensions":[]},
-        {"ident":"LOG_CRIT", "id_type":"macro", "header":"syslog.h", "extensions":[]},
-        {"ident":"LOG_CRON", "id_type":"constant", "header":"syslog.h", "extensions":[]},
-        {"ident":"LOG_DAEMON", "id_type":"constant", "header":"syslog.h", "extensions":[]},
-        {"ident":"LOG_DEBUG", "id_type":"macro", "header":"syslog.h", "extensions":[]},
-        {"ident":"LOG_EMERG", "id_type":"macro", "header":"syslog.h", "extensions":[]},
-        {"ident":"LOG_ERR", "id_type":"macro", "header":"syslog.h", "extensions":[]},
-        {"ident":"LOG_INFO", "id_type":"macro", "header":"syslog.h", "extensions":[]},
-        {"ident":"LOG_KERN", "id_type":"constant", "header":"syslog.h", "extensions":[]},
-        {"ident":"LOG_LOCAL0", "id_type":"constant", "header":"syslog.h", "extensions":[]},
-        {"ident":"LOG_LOCAL1", "id_type":"constant", "header":"syslog.h", "extensions":[]},
-        {"ident":"LOG_LOCAL2", "id_type":"constant", "header":"syslog.h", "extensions":[]},
-        {"ident":"LOG_LOCAL3", "id_type":"constant", "header":"syslog.h", "extensions":[]},
-        {"ident":"LOG_LOCAL4", "id_type":"constant", "header":"syslog.h", "extensions":[]},
-        {"ident":"LOG_LOCAL5", "id_type":"constant", "header":"syslog.h", "extensions":[]},
-        {"ident":"LOG_LOCAL6", "id_type":"constant", "header":"syslog.h", "extensions":[]},
-        {"ident":"LOG_LOCAL7", "id_type":"constant", "header":"syslog.h", "extensions":[]},
-        {"ident":"LOG_LPR", "id_type":"constant", "header":"syslog.h", "extensions":[]},
-        {"ident":"LOG_MAIL", "id_type":"constant", "header":"syslog.h", "extensions":[]},
-        {"ident":"LOG_MASK", "id_type":"macro", "header":"syslog.h", "extensions":[]},
-        {"ident":"LOG_NDELAY", "id_type":"constant", "header":"syslog.h", "extensions":[]},
-        {"ident":"LOG_NEWS", "id_type":"constant", "header":"syslog.h", "extensions":[]},
-        {"ident":"LOG_NOTICE", "id_type":"macro", "header":"syslog.h", "extensions":[]},
-        {"ident":"LOG_NOWAIT", "id_type":"constant", "header":"syslog.h", "extensions":[]},
-        {"ident":"LOG_ODELAY", "id_type":"constant", "header":"syslog.h", "extensions":[]},
-        {"ident":"LOG_PID", "id_type":"constant", "header":"syslog.h", "extensions":[]},
-        {"ident":"LOG_USER", "id_type":"constant", "header":"syslog.h", "extensions":[]},
-        {"ident":"LOG_UUCP", "id_type":"constant", "header":"syslog.h", "extensions":[]},
-        {"ident":"LOG_WARNING", "id_type":"macro", "header":"syslog.h", "extensions":[]},
-        {"ident":"logb", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"logbf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"logbl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"logf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"LOGIN_PROCESS", "id_type":"constant", "header":"utmpx.h", "extensions":[]},
-        {"ident":"logl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"LONG_BIT", "id_type":"macro", "header":"limits.h", "extensions":[]},
-        {"ident":"LONG_MAX", "id_type":"macro", "header":"limits.h", "extensions":[]},
-        {"ident":"LONG_MIN", "id_type":"macro", "header":"limits.h", "extensions":[]},
-        {"ident":"longjmp", "id_type":"function", "header":"setjmp.h", "extensions":[]},
-        {"ident":"lrand48", "id_type":"function", "header":"stdlib.h", "extensions":["XSI"]},
-        {"ident":"lrint", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"lrintf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"lrintl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"lround", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"lroundf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"lroundl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"lsearch", "id_type":"function", "header":"search.h", "extensions":[]},
-        {"ident":"lseek", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"lstat", "id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
-        {"ident":"M_1_PI", "id_type":"constant", "header":"math.h", "extensions":[]},
-        {"ident":"M_2_PI", "id_type":"constant", "header":"math.h", "extensions":[]},
-        {"ident":"M_2_SQRTPI", "id_type":"constant", "header":"math.h", "extensions":[]},
-        {"ident":"M_E", "id_type":"constant", "header":"math.h", "extensions":[]},
-        {"ident":"M_LN10", "id_type":"constant", "header":"math.h", "extensions":[]},
-        {"ident":"M_LN2", "id_type":"constant", "header":"math.h", "extensions":[]},
-        {"ident":"M_LOG10E", "id_type":"constant", "header":"math.h", "extensions":[]},
-        {"ident":"M_LOG2E", "id_type":"constant", "header":"math.h", "extensions":[]},
-        {"ident":"M_PI", "id_type":"constant", "header":"math.h", "extensions":[]},
-        {"ident":"M_PI_2", "id_type":"constant", "header":"math.h", "extensions":[]},
-        {"ident":"M_PI_4", "id_type":"constant", "header":"math.h", "extensions":[]},
-        {"ident":"M_SQRT1_2", "id_type":"constant", "header":"math.h", "extensions":[]},
-        {"ident":"M_SQRT2", "id_type":"constant", "header":"math.h", "extensions":[]},
-        {"ident":"malloc", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"MAP_FAILED", "id_type":"constant", "header":"sys/mman.h", "extensions":[]},
-        {"ident":"MAP_FIXED", "id_type":"constant", "header":"sys/mman.h", "extensions":[]},
-        {"ident":"MAP_PRIVATE", "id_type":"constant", "header":"sys/mman.h", "extensions":[]},
-        {"ident":"MAP_SHARED", "id_type":"constant", "header":"sys/mman.h", "extensions":[]},
-        {"ident":"MAXFLOAT", "id_type":"constant", "header":"math.h", "extensions":[]},
-        {"ident":"MB_CUR_MAX", "id_type":"macro", "header":"stdlib.h", "extensions":[]},
-        {"ident":"MB_LEN_MAX", "id_type":"macro", "header":"limits.h", "extensions":[]},
-        {"ident":"mblen", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"mbrlen", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"mbrtowc", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"mbsinit", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"mbsnrtowcs", "id_type":"function", "header":"wchar.h", "extensions":["CX"]},
-        {"ident":"mbsrtowcs", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"mbstate_t", "id_type":"type", "header":"wchar.h", "extensions":["CX"]},
-        {"ident":"mbstowcs", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"mbtowc", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"MCL_CURRENT", "id_type":"constant", "header":"sys/mman.h", "extensions":["ML"]},
-        {"ident":"MCL_FUTURE", "id_type":"constant", "header":"sys/mman.h", "extensions":["ML"]},
-        {"ident":"memccpy", "id_type":"function", "header":"string.h", "extensions":[]},
-        {"ident":"memchr", "id_type":"function", "header":"string.h", "extensions":[]},
-        {"ident":"memcmp", "id_type":"function", "header":"string.h", "extensions":[]},
-        {"ident":"memcpy", "id_type":"function", "header":"string.h", "extensions":[]},
-        {"ident":"memmove", "id_type":"function", "header":"string.h", "extensions":[]},
-        {"ident":"memset", "id_type":"function", "header":"string.h", "extensions":[]},
-        {"ident":"MINSIGSTKSZ", "id_type":"macro", "header":"signal.h", "extensions":[]},
-        {"ident":"mkdir", "id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
-        {"ident":"mkdirat", "id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
-        {"ident":"mkdtemp", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"mkfifo", "id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
-        {"ident":"mkfifoat", "id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
-        {"ident":"mknod", "id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
-        {"ident":"mknodat", "id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
-        {"ident":"mkstemp", "id_type":"function", "header":"stdlib.h", "extensions":["CX"]},
-        {"ident":"mktime", "id_type":"function", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"mlock", "id_type":"function", "header":"sys/mman.h", "extensions":["MLR"]},
-        {"ident":"mlockall", "id_type":"function", "header":"sys/mman.h", "extensions":["ML"]},
-        {"ident":"MM_APPL", "id_type":"constant", "header":"fmtmsg.h", "extensions":[]},
-        {"ident":"MM_CONSOLE", "id_type":"constant", "header":"fmtmsg.h", "extensions":[]},
-        {"ident":"MM_ERROR", "id_type":"constant", "header":"fmtmsg.h", "extensions":[]},
-        {"ident":"MM_FIRM", "id_type":"constant", "header":"fmtmsg.h", "extensions":[]},
-        {"ident":"MM_HALT", "id_type":"constant", "header":"fmtmsg.h", "extensions":[]},
-        {"ident":"MM_HARD", "id_type":"constant", "header":"fmtmsg.h", "extensions":[]},
-        {"ident":"MM_INFO", "id_type":"constant", "header":"fmtmsg.h", "extensions":[]},
-        {"ident":"MM_NOSEV", "id_type":"constant", "header":"fmtmsg.h", "extensions":[]},
-        {"ident":"MM_NRECOV", "id_type":"constant", "header":"fmtmsg.h", "extensions":[]},
-        {"ident":"MM_OPSYS", "id_type":"constant", "header":"fmtmsg.h", "extensions":[]},
-        {"ident":"MM_PRINT", "id_type":"constant", "header":"fmtmsg.h", "extensions":[]},
-        {"ident":"MM_RECOVER", "id_type":"constant", "header":"fmtmsg.h", "extensions":[]},
-        {"ident":"MM_SOFT", "id_type":"constant", "header":"fmtmsg.h", "extensions":[]},
-        {"ident":"MM_UTIL", "id_type":"constant", "header":"fmtmsg.h", "extensions":[]},
-        {"ident":"MM_WARNING", "id_type":"constant", "header":"fmtmsg.h", "extensions":[]},
-        {"ident":"mmap", "id_type":"function", "header":"sys/mman.h", "extensions":["TYM"]},
-        {"ident":"mode_t", "id_type":"type", "header":"sys/types.h", "extensions":[]},
-        {"ident":"modf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"modff", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"modfl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"MORECTL", "id_type":"constant", "header":"stropts.h", "extensions":[]},
-        {"ident":"MOREDATA", "id_type":"constant", "header":"stropts.h", "extensions":[]},
-        {"ident":"mprotect", "id_type":"function", "header":"sys/mman.h", "extensions":[]},
-        {"ident":"mq_attr", "id_type":"type", "header":"mqueue.h", "extensions":[]},
-        {"ident":"mq_close", "id_type":"function", "header":"mqueue.h", "extensions":[]},
-        {"ident":"mq_getattr", "id_type":"function", "header":"mqueue.h", "extensions":[]},
-        {"ident":"mq_notify", "id_type":"function", "header":"mqueue.h", "extensions":[]},
-        {"ident":"mq_open", "id_type":"function", "header":"mqueue.h", "extensions":[]},
-        {"ident":"mq_receive", "id_type":"function", "header":"mqueue.h", "extensions":[]},
-        {"ident":"mq_send", "id_type":"function", "header":"mqueue.h", "extensions":[]},
-        {"ident":"mq_setattr", "id_type":"function", "header":"mqueue.h", "extensions":[]},
-        {"ident":"mq_timedreceive", "id_type":"function", "header":"mqueue.h", "extensions":[]},
-        {"ident":"mq_timedsend", "id_type":"function", "header":"mqueue.h", "extensions":[]},
-        {"ident":"mq_unlink", "id_type":"function", "header":"mqueue.h", "extensions":[]},
-        {"ident":"mrand48", "id_type":"function", "header":"stdlib.h", "extensions":["XSI"]},
-        {"ident":"MS_ASYNC", "id_type":"constant", "header":"sys/mman.h", "extensions":["XSI","SIO"]},
-        {"ident":"MS_INVALIDATE", "id_type":"constant", "header":"sys/mman.h", "extensions":["XSI","SIO"]},
-        {"ident":"MS_SYNC", "id_type":"constant", "header":"sys/mman.h", "extensions":["XSI","SIO"]},
-        {"ident":"MSG_ANY", "id_type":"constant", "header":"stropts.h", "extensions":[]},
-        {"ident":"MSG_BAND", "id_type":"constant", "header":"stropts.h", "extensions":[]},
-        {"ident":"MSG_CTRUNC", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"MSG_DONTROUTE", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"MSG_EOR", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"MSG_HIPRI", "id_type":"constant", "header":"stropts.h", "extensions":[]},
-        {"ident":"MSG_NOERROR", "id_type":"constant", "header":"sys/msg.h", "extensions":[]},
-        {"ident":"MSG_NOSIGNAL", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"MSG_OOB", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"MSG_PEEK", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"MSG_TRUNC", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"MSG_WAITALL", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"msgctl", "id_type":"function", "header":"sys/msg.h", "extensions":[]},
-        {"ident":"msgget", "id_type":"function", "header":"sys/msg.h", "extensions":[]},
-        {"ident":"msghdr", "id_type":"type", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"msglen_t", "id_type":"type", "header":"sys/msg.h", "extensions":[]},
-        {"ident":"msgqnum_t", "id_type":"type", "header":"sys/msg.h", "extensions":[]},
-        {"ident":"msgrcv", "id_type":"function", "header":"sys/msg.h", "extensions":[]},
-        {"ident":"msgsnd", "id_type":"function", "header":"sys/msg.h", "extensions":[]},
-        {"ident":"msqid_ds", "id_type":"type", "header":"sys/msg.h", "extensions":[]},
-        {"ident":"msync", "id_type":"function", "header":"sys/mman.h", "extensions":["XSI","SIO"]},
-        {"ident":"munlock", "id_type":"function", "header":"sys/mman.h", "extensions":["MLR"]},
-        {"ident":"munlockall", "id_type":"function", "header":"sys/mman.h", "extensions":["ML"]},
-        {"ident":"munmap", "id_type":"function", "header":"sys/mman.h", "extensions":[]},
-        {"ident":"nan", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"NAN", "id_type":"macro", "header":"math.h", "extensions":[]},
-        {"ident":"nanf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"nanl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"nanosleep", "id_type":"function", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"NCCS", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"nearbyint", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"nearbyintf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"nearbyintl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"netent", "id_type":"type", "header":"netdb.h", "extensions":[]},
-        {"ident":"NEW_TIME", "id_type":"constant", "header":"utmpx.h", "extensions":[]},
-        {"ident":"newlocale", "id_type":"function", "header":"locale.h", "extensions":["CX"]},
-        {"ident":"nextafter", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"nextafterf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"nextafterl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"nexttoward", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"nexttowardf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"nexttowardl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"nfds_t", "id_type":"type", "header":"poll.h", "extensions":[]},
-        {"ident":"nftw", "id_type":"function", "header":"ftw.h", "extensions":["OB"]},
-        {"ident":"NI_DGRAM", "id_type":"constant", "header":"netdb.h", "extensions":[]},
-        {"ident":"NI_NAMEREQD", "id_type":"constant", "header":"netdb.h", "extensions":[]},
-        {"ident":"NI_NOFQDN", "id_type":"constant", "header":"netdb.h", "extensions":[]},
-        {"ident":"NI_NUMERICHOST", "id_type":"constant", "header":"netdb.h", "extensions":[]},
-        {"ident":"NI_NUMERICSCOPE", "id_type":"constant", "header":"netdb.h", "extensions":[]},
-        {"ident":"NI_NUMERICSERV", "id_type":"constant", "header":"netdb.h", "extensions":[]},
-        {"ident":"nice", "id_type":"function", "header":"unistd.h", "extensions":["XSI"]},
-        {"ident":"NL_ARGMAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"nl_langinfo", "id_type":"function", "header":"langinfo.h", "extensions":[]},
-        {"ident":"nl_langinfo_l", "id_type":"function", "header":"langinfo.h", "extensions":[]},
-        {"ident":"NL_LANGMAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"NL_MSGMAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"NL_SETMAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"NL_TEXTMAX", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"NLDLY", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"nlink_t", "id_type":"type", "header":"sys/types.h", "extensions":[]},
-        {"ident":"NOFLSH", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"not", "id_type":"macro", "header":"iso646.h", "extensions":["ADV"]},
-        {"ident":"not_eq", "id_type":"macro", "header":"iso646.h", "extensions":[]},
-        {"ident":"nrand48", "id_type":"function", "header":"stdlib.h", "extensions":["XSI"]},
-        {"ident":"ntohl", "id_type":"function", "header":"arpa/inet.h", "extensions":[]},
-        {"ident":"ntohs", "id_type":"function", "header":"arpa/inet.h", "extensions":[]},
-        {"ident":"NULL", "id_type":"macro", "header":"stddef.h", "extensions":[]},
-        {"ident":"NZERO", "id_type":"constant", "header":"limits.h", "extensions":[]},
-        {"ident":"O_ACCMODE", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"O_APPEND", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"O_CLOEXEC", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"O_CREAT", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"O_DIRECTORY", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"O_DSYNC", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"O_EXCL", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"O_EXEC", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"O_NOCTTY", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"O_NOFOLLOW", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"O_NONBLOCK", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"O_RDONLY", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"O_RDWR", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"O_RSYNC", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"O_SEARCH", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"O_SYNC", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"O_TRUNC", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"O_TTY_INIT", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"O_WRONLY", "id_type":"constant", "header":"fcntl.h", "extensions":[]},
-        {"ident":"OCRNL", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"OFDEL", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"off_t", "id_type":"type", "header":"stdio.h", "extensions":["CX"]},
-        {"ident":"offsetof", "id_type":"macro", "header":"stddef.h", "extensions":[]},
-        {"ident":"OFILL", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"OLD_TIME", "id_type":"constant", "header":"utmpx.h", "extensions":[]},
-        {"ident":"ONLCR", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"ONLRET", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"ONOCR", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"open", "id_type":"function", "header":"fcntl.h", "extensions":["ADV"]},
-        {"ident":"open_memstream", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"open_wmemstream", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"openat", "id_type":"function", "header":"fcntl.h", "extensions":[]},
-        {"ident":"opendir", "id_type":"function", "header":"dirent.h", "extensions":[]},
-        {"ident":"openlog", "id_type":"function", "header":"syslog.h", "extensions":[]},
-        {"ident":"OPOST", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"optarg", "id_type":"variable", "header":"unistd.h", "extensions":[]},
-        {"ident":"opterr", "id_type":"variable", "header":"unistd.h", "extensions":[]},
-        {"ident":"optind", "id_type":"variable", "header":"unistd.h", "extensions":[]},
-        {"ident":"optopt", "id_type":"variable", "header":"unistd.h", "extensions":[]},
-        {"ident":"or", "id_type":"macro", "header":"iso646.h", "extensions":["XSI"]},
-        {"ident":"or_eq", "id_type":"macro", "header":"iso646.h", "extensions":[]},
-        {"ident":"P_tmpdir", "id_type":"macro", "header":"stdio.h", "extensions":[]},
-        {"ident":"PARENB", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"PARMRK", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"PARODD", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"passwd", "id_type":"type", "header":"pwd.h", "extensions":["XSI"]},
-        {"ident":"pathconf", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"pause", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"pclose", "id_type":"function", "header":"stdio.h", "extensions":["CX"]},
-        {"ident":"perror", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"pid_t", "id_type":"type", "header":"signal.h", "extensions":["PS"]},
-        {"ident":"pipe", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"poll", "id_type":"function", "header":"poll.h", "extensions":[]},
-        {"ident":"POLLERR", "id_type":"constant", "header":"poll.h", "extensions":[]},
-        {"ident":"pollfd", "id_type":"type", "header":"poll.h", "extensions":[]},
-        {"ident":"POLLHUP", "id_type":"constant", "header":"poll.h", "extensions":[]},
-        {"ident":"POLLIN", "id_type":"constant", "header":"poll.h", "extensions":[]},
-        {"ident":"POLLNVAL", "id_type":"constant", "header":"poll.h", "extensions":[]},
-        {"ident":"POLLOUT", "id_type":"constant", "header":"poll.h", "extensions":[]},
-        {"ident":"POLLPRI", "id_type":"constant", "header":"poll.h", "extensions":[]},
-        {"ident":"POLLRDBAND", "id_type":"constant", "header":"poll.h", "extensions":[]},
-        {"ident":"POLLRDNORM", "id_type":"constant", "header":"poll.h", "extensions":[]},
-        {"ident":"POLLWRBAND", "id_type":"constant", "header":"poll.h", "extensions":[]},
-        {"ident":"POLLWRNORM", "id_type":"constant", "header":"poll.h", "extensions":[]},
-        {"ident":"popen", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"POSIX_FADV_DONTNEED", "id_type":"constant", "header":"fcntl.h", "extensions":["ADV"]},
-        {"ident":"POSIX_FADV_NOREUSE", "id_type":"constant", "header":"fcntl.h", "extensions":["ADV"]},
-        {"ident":"POSIX_FADV_NORMAL", "id_type":"constant", "header":"fcntl.h", "extensions":["ADV"]},
-        {"ident":"POSIX_FADV_RANDOM", "id_type":"constant", "header":"fcntl.h", "extensions":["ADV"]},
-        {"ident":"POSIX_FADV_SEQUENTIAL", "id_type":"constant", "header":"fcntl.h", "extensions":["ADV"]},
-        {"ident":"POSIX_FADV_WILLNEED", "id_type":"constant", "header":"fcntl.h", "extensions":["ADV"]},
-        {"ident":"posix_fadvise", "id_type":"function", "header":"fcntl.h", "extensions":["ADV"]},
-        {"ident":"posix_fallocate", "id_type":"function", "header":"fcntl.h", "extensions":["ADV"]},
-        {"ident":"posix_madvise", "id_type":"function", "header":"sys/mman.h", "extensions":["ADV"]},
-        {"ident":"posix_mem_offset", "id_type":"function", "header":"sys/mman.h", "extensions":["TYM"]},
-        {"ident":"posix_memalign", "id_type":"function", "header":"stdlib.h", "extensions":["ADV"]},
-        {"ident":"posix_openpt", "id_type":"function", "header":"stdlib.h", "extensions":["XSI"]},
-        {"ident":"posix_spawn", "id_type":"function", "header":"spawn.h", "extensions":[]},
-        {"ident":"posix_spawn_file_actions_addclose", "id_type":"function", "header":"spawn.h", "extensions":[]},
-        {"ident":"posix_spawn_file_actions_adddup2", "id_type":"function", "header":"spawn.h", "extensions":[]},
-        {"ident":"posix_spawn_file_actions_addopen", "id_type":"function", "header":"spawn.h", "extensions":[]},
-        {"ident":"posix_spawn_file_actions_destroy", "id_type":"function", "header":"spawn.h", "extensions":[]},
-        {"ident":"posix_spawn_file_actions_init", "id_type":"function", "header":"spawn.h", "extensions":[]},
-        {"ident":"posix_spawnattr_destroy", "id_type":"function", "header":"spawn.h", "extensions":[]},
-        {"ident":"posix_spawnattr_getflags", "id_type":"function", "header":"spawn.h", "extensions":[]},
-        {"ident":"posix_spawnattr_getpgroup", "id_type":"function", "header":"spawn.h", "extensions":[]},
-        {"ident":"posix_spawnattr_getschedparam", "id_type":"function", "header":"spawn.h", "extensions":["PS"]},
-        {"ident":"posix_spawnattr_getschedpolicy", "id_type":"function", "header":"spawn.h", "extensions":["PS"]},
-        {"ident":"posix_spawnattr_getsigdefault", "id_type":"function", "header":"spawn.h", "extensions":[]},
-        {"ident":"posix_spawnattr_getsigmask", "id_type":"function", "header":"spawn.h", "extensions":[]},
-        {"ident":"posix_spawnattr_init", "id_type":"function", "header":"spawn.h", "extensions":[]},
-        {"ident":"posix_spawnattr_setflags", "id_type":"function", "header":"spawn.h", "extensions":[]},
-        {"ident":"posix_spawnattr_setpgroup", "id_type":"function", "header":"spawn.h", "extensions":[]},
-        {"ident":"posix_spawnattr_setschedparam", "id_type":"function", "header":"spawn.h", "extensions":["PS"]},
-        {"ident":"posix_spawnattr_setschedpolicy", "id_type":"function", "header":"spawn.h", "extensions":["PS"]},
-        {"ident":"posix_spawnattr_setsigdefault", "id_type":"function", "header":"spawn.h", "extensions":[]},
-        {"ident":"posix_spawnattr_setsigmask", "id_type":"function", "header":"spawn.h", "extensions":[]},
-        {"ident":"posix_spawnp", "id_type":"function", "header":"spawn.h", "extensions":[]},
-        {"ident":"posix_trace_attr_destroy", "id_type":"function", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_attr_getclockres", "id_type":"function", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_attr_getcreatetime", "id_type":"function", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_attr_getgenversion", "id_type":"function", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_attr_getinherited", "id_type":"function", "header":"trace.h", "extensions":["TRI"]},
-        {"ident":"posix_trace_attr_getlogfullpolicy", "id_type":"function", "header":"trace.h", "extensions":["TRL"]},
-        {"ident":"posix_trace_attr_getlogsize", "id_type":"function", "header":"trace.h", "extensions":["TRL"]},
-        {"ident":"posix_trace_attr_getmaxdatasize", "id_type":"function", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_attr_getmaxsystemeventsize", "id_type":"function", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_attr_getmaxusereventsize", "id_type":"function", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_attr_getname", "id_type":"function", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_attr_getstreamfullpolicy", "id_type":"function", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_attr_getstreamsize", "id_type":"function", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_attr_init", "id_type":"function", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_attr_setinherited", "id_type":"function", "header":"trace.h", "extensions":["TRI"]},
-        {"ident":"posix_trace_attr_setlogfullpolicy", "id_type":"function", "header":"trace.h", "extensions":["TRL"]},
-        {"ident":"posix_trace_attr_setlogsize", "id_type":"function", "header":"trace.h", "extensions":["TRL"]},
-        {"ident":"posix_trace_attr_setmaxdatasize", "id_type":"function", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_attr_setname", "id_type":"function", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_attr_setstreamfullpolicy", "id_type":"function", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_attr_setstreamsize", "id_type":"function", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_clear", "id_type":"function", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_close", "id_type":"function", "header":"trace.h", "extensions":["TRL"]},
-        {"ident":"posix_trace_create", "id_type":"function", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_create_withlog", "id_type":"function", "header":"trace.h", "extensions":["TRL"]},
-        {"ident":"posix_trace_event", "id_type":"function", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_event_info", "id_type":"type", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_eventid_equal", "id_type":"function", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_eventid_get_name", "id_type":"function", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_eventid_open", "id_type":"function", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_eventset_add", "id_type":"function", "header":"trace.h", "extensions":["TEF"]},
-        {"ident":"posix_trace_eventset_del", "id_type":"function", "header":"trace.h", "extensions":["TEF"]},
-        {"ident":"posix_trace_eventset_empty", "id_type":"function", "header":"trace.h", "extensions":["TEF"]},
-        {"ident":"posix_trace_eventset_fill", "id_type":"function", "header":"trace.h", "extensions":["TEF"]},
-        {"ident":"posix_trace_eventset_ismember", "id_type":"function", "header":"trace.h", "extensions":["TEF"]},
-        {"ident":"posix_trace_eventtypelist_getnext_id", "id_type":"function", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_eventtypelist_rewind", "id_type":"function", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_flush", "id_type":"function", "header":"trace.h", "extensions":["TRL"]},
-        {"ident":"posix_trace_get_attr", "id_type":"function", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_get_filter", "id_type":"function", "header":"trace.h", "extensions":["TEF"]},
-        {"ident":"posix_trace_get_status", "id_type":"function", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_getnext_event", "id_type":"function", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_open", "id_type":"function", "header":"trace.h", "extensions":["TRL"]},
-        {"ident":"posix_trace_rewind", "id_type":"function", "header":"trace.h", "extensions":["TRL"]},
-        {"ident":"posix_trace_set_filter", "id_type":"function", "header":"trace.h", "extensions":["TEF"]},
-        {"ident":"posix_trace_shutdown", "id_type":"function", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_start", "id_type":"function", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_status_info", "id_type":"type", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_stop", "id_type":"function", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_timedgetnext_event", "id_type":"function", "header":"trace.h", "extensions":[]},
-        {"ident":"posix_trace_trid_eventid_open", "id_type":"function", "header":"trace.h", "extensions":["TEF"]},
-        {"ident":"posix_trace_trygetnext_event", "id_type":"function", "header":"trace.h", "extensions":[]},
-        {"ident":"POSIX_TYPED_MEM_ALLOCATE", "id_type":"constant", "header":"sys/mman.h", "extensions":["TYM"]},
-        {"ident":"POSIX_TYPED_MEM_ALLOCATE_CONTIG", "id_type":"constant", "header":"sys/mman.h", "extensions":["TYM"]},
-        {"ident":"posix_typed_mem_get_info", "id_type":"function", "header":"sys/mman.h", "extensions":["TYM"]},
-        {"ident":"posix_typed_mem_info", "id_type":"type", "header":"sys/mman.h", "extensions":["TYM"]},
-        {"ident":"POSIX_TYPED_MEM_MAP_ALLOCATABLE", "id_type":"constant", "header":"sys/mman.h", "extensions":["TYM"]},
-        {"ident":"posix_typed_mem_open", "id_type":"function", "header":"sys/mman.h", "extensions":["TYM"]},
-        {"ident":"pow", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"powf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"powl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"pread", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"printf", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"PRIO_PGRP", "id_type":"constant", "header":"sys/resource.h", "extensions":[]},
-        {"ident":"PRIO_PROCESS", "id_type":"constant", "header":"sys/resource.h", "extensions":[]},
-        {"ident":"PRIO_USER", "id_type":"constant", "header":"sys/resource.h", "extensions":[]},
-        {"ident":"PROT_EXEC", "id_type":"constant", "header":"sys/mman.h", "extensions":[]},
-        {"ident":"PROT_NONE", "id_type":"constant", "header":"sys/mman.h", "extensions":[]},
-        {"ident":"PROT_READ", "id_type":"constant", "header":"sys/mman.h", "extensions":[]},
-        {"ident":"PROT_WRITE", "id_type":"constant", "header":"sys/mman.h", "extensions":[]},
-        {"ident":"protoent", "id_type":"type", "header":"netdb.h", "extensions":[]},
-        {"ident":"pselect", "id_type":"function", "header":"sys/select.h", "extensions":[]},
-        {"ident":"psiginfo", "id_type":"function", "header":"signal.h", "extensions":[]},
-        {"ident":"psignal", "id_type":"function", "header":"signal.h", "extensions":[]},
-        {"ident":"pthread_atfork", "id_type":"function", "header":"pthread.h", "extensions":["OB"]},
-        {"ident":"pthread_attr_destroy", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_attr_getdetachstate", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_attr_getguardsize", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_attr_getinheritsched", "id_type":"function", "header":"pthread.h", "extensions":["TPS"]},
-        {"ident":"pthread_attr_getschedparam", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_attr_getschedpolicy", "id_type":"function", "header":"pthread.h", "extensions":["TPS"]},
-        {"ident":"pthread_attr_getscope", "id_type":"function", "header":"pthread.h", "extensions":["TPS"]},
-        {"ident":"pthread_attr_getstack", "id_type":"function", "header":"pthread.h", "extensions":["TSA","TSS"]},
-        {"ident":"pthread_attr_getstacksize", "id_type":"function", "header":"pthread.h", "extensions":["TSS"]},
-        {"ident":"pthread_attr_init", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_attr_setdetachstate", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_attr_setguardsize", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_attr_setinheritsched", "id_type":"function", "header":"pthread.h", "extensions":["TPS"]},
-        {"ident":"pthread_attr_setschedparam", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_attr_setschedpolicy", "id_type":"function", "header":"pthread.h", "extensions":["TPS"]},
-        {"ident":"pthread_attr_setscope", "id_type":"function", "header":"pthread.h", "extensions":["TPS"]},
-        {"ident":"pthread_attr_setstack", "id_type":"function", "header":"pthread.h", "extensions":["TSA","TSS"]},
-        {"ident":"pthread_attr_setstacksize", "id_type":"function", "header":"pthread.h", "extensions":["TSS"]},
-        {"ident":"pthread_attr_t", "id_type":"type", "header":"sys/types.h", "extensions":["TPS"]},
-        {"ident":"pthread_barrier_destroy", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_barrier_init", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_barrier_t", "id_type":"type", "header":"sys/types.h", "extensions":[]},
-        {"ident":"pthread_barrier_wait", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_barrierattr_destroy", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_barrierattr_getpshared", "id_type":"function", "header":"pthread.h", "extensions":["TSH"]},
-        {"ident":"pthread_barrierattr_init", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_barrierattr_setpshared", "id_type":"function", "header":"pthread.h", "extensions":["TSH"]},
-        {"ident":"pthread_barrierattr_t", "id_type":"type", "header":"sys/types.h", "extensions":["TSH"]},
-        {"ident":"pthread_cancel", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_cleanup_pop", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_cleanup_push", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_cond_broadcast", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_cond_destroy", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_cond_init", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_cond_signal", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_cond_t", "id_type":"type", "header":"sys/types.h", "extensions":[]},
-        {"ident":"pthread_cond_timedwait", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_cond_wait", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_condattr_destroy", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_condattr_getclock", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_condattr_getpshared", "id_type":"function", "header":"pthread.h", "extensions":["TSH"]},
-        {"ident":"pthread_condattr_init", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_condattr_setclock", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_condattr_setpshared", "id_type":"function", "header":"pthread.h", "extensions":["TSH"]},
-        {"ident":"pthread_condattr_t", "id_type":"type", "header":"sys/types.h", "extensions":["TSH"]},
-        {"ident":"pthread_create", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_detach", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_equal", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_exit", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_getconcurrency", "id_type":"function", "header":"pthread.h", "extensions":["OB","XSI"]},
-        {"ident":"pthread_getcpuclockid", "id_type":"function", "header":"pthread.h", "extensions":["TCT"]},
-        {"ident":"pthread_getschedparam", "id_type":"function", "header":"pthread.h", "extensions":["TPS"]},
-        {"ident":"pthread_getspecific", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_join", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_key_create", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_key_delete", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_key_t", "id_type":"type", "header":"sys/types.h", "extensions":[]},
-        {"ident":"pthread_kill", "id_type":"function", "header":"signal.h", "extensions":[]},
-        {"ident":"pthread_mutex_consistent", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_mutex_destroy", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_mutex_getprioceiling", "id_type":"function", "header":"pthread.h", "extensions":["RPP","TPP"]},
-        {"ident":"pthread_mutex_init", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_mutex_lock", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_mutex_setprioceiling", "id_type":"function", "header":"pthread.h", "extensions":["RPP","TPP"]},
-        {"ident":"pthread_mutex_t", "id_type":"type", "header":"sys/types.h", "extensions":["RPP","TPP"]},
-        {"ident":"pthread_mutex_timedlock", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_mutex_trylock", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_mutex_unlock", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_mutexattr_destroy", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_mutexattr_getprioceiling", "id_type":"function", "header":"pthread.h", "extensions":["RPP","TPP"]},
-        {"ident":"pthread_mutexattr_getprotocol", "id_type":"function", "header":"pthread.h", "extensions":["MC1"]},
-        {"ident":"pthread_mutexattr_getpshared", "id_type":"function", "header":"pthread.h", "extensions":["TSH"]},
-        {"ident":"pthread_mutexattr_getrobust", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_mutexattr_gettype", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_mutexattr_init", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_mutexattr_setprioceiling", "id_type":"function", "header":"pthread.h", "extensions":["RPP","TPP"]},
-        {"ident":"pthread_mutexattr_setprotocol", "id_type":"function", "header":"pthread.h", "extensions":["MC1"]},
-        {"ident":"pthread_mutexattr_setpshared", "id_type":"function", "header":"pthread.h", "extensions":["TSH"]},
-        {"ident":"pthread_mutexattr_setrobust", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_mutexattr_settype", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_mutexattr_t", "id_type":"type", "header":"sys/types.h", "extensions":["RPP","TPP"]},
-        {"ident":"pthread_once", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_once_t", "id_type":"type", "header":"sys/types.h", "extensions":[]},
-        {"ident":"pthread_rwlock_destroy", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_rwlock_init", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_rwlock_rdlock", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_rwlock_t", "id_type":"type", "header":"sys/types.h", "extensions":[]},
-        {"ident":"pthread_rwlock_timedrdlock", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_rwlock_timedwrlock", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_rwlock_tryrdlock", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_rwlock_trywrlock", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_rwlock_unlock", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_rwlock_wrlock", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_rwlockattr_destroy", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_rwlockattr_getpshared", "id_type":"function", "header":"pthread.h", "extensions":["TSH"]},
-        {"ident":"pthread_rwlockattr_init", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_rwlockattr_setpshared", "id_type":"function", "header":"pthread.h", "extensions":["TSH"]},
-        {"ident":"pthread_rwlockattr_t", "id_type":"type", "header":"sys/types.h", "extensions":["TSH"]},
-        {"ident":"pthread_self", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_setcancelstate", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_setcanceltype", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_setconcurrency", "id_type":"function", "header":"pthread.h", "extensions":["OB","XSI"]},
-        {"ident":"pthread_setschedparam", "id_type":"function", "header":"pthread.h", "extensions":["TPS"]},
-        {"ident":"pthread_setschedprio", "id_type":"function", "header":"pthread.h", "extensions":["TPS"]},
-        {"ident":"pthread_setspecific", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_sigmask", "id_type":"function", "header":"signal.h", "extensions":[]},
-        {"ident":"pthread_spin_destroy", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_spin_init", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_spin_lock", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_spin_trylock", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_spin_unlock", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"pthread_spinlock_t", "id_type":"type", "header":"sys/types.h", "extensions":[]},
-        {"ident":"pthread_t", "id_type":"type", "header":"sys/types.h", "extensions":[]},
-        {"ident":"pthread_testcancel", "id_type":"function", "header":"pthread.h", "extensions":[]},
-        {"ident":"ptrdiff_t", "id_type":"macro", "header":"stddef.h", "extensions":[]},
-        {"ident":"ptsname", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"putc", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"putc_unlocked", "id_type":"function", "header":"stdio.h", "extensions":["CX"]},
-        {"ident":"putchar", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"putchar_unlocked", "id_type":"function", "header":"stdio.h", "extensions":["CX"]},
-        {"ident":"putenv", "id_type":"function", "header":"stdlib.h", "extensions":["XSI"]},
-        {"ident":"putmsg", "id_type":"function", "header":"stropts.h", "extensions":[]},
-        {"ident":"putpmsg", "id_type":"function", "header":"stropts.h", "extensions":[]},
-        {"ident":"puts", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"pututxline", "id_type":"function", "header":"utmpx.h", "extensions":[]},
-        {"ident":"putwc", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"putwchar", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"pwrite", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"qsort", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"R_OK", "id_type":"constant", "header":"unistd.h", "extensions":[]},
-        {"ident":"raise", "id_type":"function", "header":"signal.h", "extensions":[]},
-        {"ident":"rand", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"RAND_MAX", "id_type":"macro", "header":"stdlib.h", "extensions":[]},
-        {"ident":"rand_r", "id_type":"function", "header":"stdlib.h", "extensions":["OB","CX"]},
-        {"ident":"random", "id_type":"function", "header":"stdlib.h", "extensions":["ADV"]},
-        {"ident":"read", "id_type":"function", "header":"unistd.h", "extensions":["OB","XSR"]},
-        {"ident":"readdir", "id_type":"function", "header":"dirent.h", "extensions":[]},
-        {"ident":"readdir_r", "id_type":"function", "header":"dirent.h", "extensions":[]},
-        {"ident":"readlink", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"readlinkat", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"readv", "id_type":"function", "header":"sys/uio.h", "extensions":["XSI"]},
-        {"ident":"realloc", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"realpath", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"recv", "id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"recvfrom", "id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"recvmsg", "id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"REG_BADBR", "id_type":"constant", "header":"regex.h", "extensions":[]},
-        {"ident":"REG_BADPAT", "id_type":"constant", "header":"regex.h", "extensions":[]},
-        {"ident":"REG_BADRPT", "id_type":"constant", "header":"regex.h", "extensions":[]},
-        {"ident":"REG_EBRACE", "id_type":"constant", "header":"regex.h", "extensions":[]},
-        {"ident":"REG_EBRACK", "id_type":"constant", "header":"regex.h", "extensions":[]},
-        {"ident":"REG_ECOLLATE", "id_type":"constant", "header":"regex.h", "extensions":[]},
-        {"ident":"REG_ECTYPE", "id_type":"constant", "header":"regex.h", "extensions":[]},
-        {"ident":"REG_EESCAPE", "id_type":"constant", "header":"regex.h", "extensions":[]},
-        {"ident":"REG_EPAREN", "id_type":"constant", "header":"regex.h", "extensions":[]},
-        {"ident":"REG_ERANGE", "id_type":"constant", "header":"regex.h", "extensions":[]},
-        {"ident":"REG_ESPACE", "id_type":"constant", "header":"regex.h", "extensions":[]},
-        {"ident":"REG_ESUBREG", "id_type":"constant", "header":"regex.h", "extensions":[]},
-        {"ident":"REG_EXTENDED", "id_type":"constant", "header":"regex.h", "extensions":[]},
-        {"ident":"REG_ICASE", "id_type":"constant", "header":"regex.h", "extensions":[]},
-        {"ident":"REG_NEWLINE", "id_type":"constant", "header":"regex.h", "extensions":[]},
-        {"ident":"REG_NOMATCH", "id_type":"constant", "header":"regex.h", "extensions":[]},
-        {"ident":"REG_NOSUB", "id_type":"constant", "header":"regex.h", "extensions":[]},
-        {"ident":"REG_NOTBOL", "id_type":"constant", "header":"regex.h", "extensions":[]},
-        {"ident":"REG_NOTEOL", "id_type":"constant", "header":"regex.h", "extensions":[]},
-        {"ident":"regcomp", "id_type":"function", "header":"regex.h", "extensions":[]},
-        {"ident":"regerror", "id_type":"function", "header":"regex.h", "extensions":[]},
-        {"ident":"regex_t", "id_type":"type", "header":"regex.h", "extensions":[]},
-        {"ident":"regexec", "id_type":"function", "header":"regex.h", "extensions":[]},
-        {"ident":"regfree", "id_type":"function", "header":"regex.h", "extensions":[]},
-        {"ident":"regmatch_t", "id_type":"type", "header":"regex.h", "extensions":[]},
-        {"ident":"regoff_t", "id_type":"type", "header":"regex.h", "extensions":[]},
-        {"ident":"remainder", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"remainderf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"remainderl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"remove", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"remque", "id_type":"function", "header":"search.h", "extensions":[]},
-        {"ident":"remquo", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"remquof", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"remquol", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"rename", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"renameat", "id_type":"function", "header":"stdio.h", "extensions":["CX"]},
-        {"ident":"rewind", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"rewinddir", "id_type":"function", "header":"dirent.h", "extensions":[]},
-        {"ident":"rint", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"rintf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"rintl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"RLIM_INFINITY", "id_type":"constant", "header":"sys/resource.h", "extensions":[]},
-        {"ident":"RLIM_SAVED_CUR", "id_type":"constant", "header":"sys/resource.h", "extensions":[]},
-        {"ident":"RLIM_SAVED_MAX", "id_type":"constant", "header":"sys/resource.h", "extensions":[]},
-        {"ident":"rlim_t", "id_type":"type", "header":"sys/resource.h", "extensions":[]},
-        {"ident":"rlimit", "id_type":"type", "header":"sys/resource.h", "extensions":[]},
-        {"ident":"RLIMIT_AS", "id_type":"constant", "header":"sys/resource.h", "extensions":[]},
-        {"ident":"RLIMIT_CORE", "id_type":"constant", "header":"sys/resource.h", "extensions":[]},
-        {"ident":"RLIMIT_CPU", "id_type":"constant", "header":"sys/resource.h", "extensions":[]},
-        {"ident":"RLIMIT_DATA", "id_type":"constant", "header":"sys/resource.h", "extensions":[]},
-        {"ident":"RLIMIT_FSIZE", "id_type":"constant", "header":"sys/resource.h", "extensions":[]},
-        {"ident":"RLIMIT_NOFILE", "id_type":"constant", "header":"sys/resource.h", "extensions":[]},
-        {"ident":"RLIMIT_STACK", "id_type":"constant", "header":"sys/resource.h", "extensions":[]},
-        {"ident":"rmdir", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"round", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"roundf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"roundl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"rusage", "id_type":"type", "header":"sys/resource.h", "extensions":[]},
-        {"ident":"RUSAGE_CHILDREN", "id_type":"constant", "header":"sys/resource.h", "extensions":[]},
-        {"ident":"RUSAGE_SELF", "id_type":"constant", "header":"sys/resource.h", "extensions":[]},
-        {"ident":"S_IFMT", "id_type":"constant", "header":"sys/stat.h", "extensions":["OB"]},
-        {"ident":"SA_NOCLDSTOP", "id_type":"macro", "header":"signal.h", "extensions":[]},
-        {"ident":"SA_NOCLDWAIT", "id_type":"macro", "header":"signal.h", "extensions":[]},
-        {"ident":"SA_NODEFER", "id_type":"macro", "header":"signal.h", "extensions":[]},
-        {"ident":"SA_ONSTACK", "id_type":"macro", "header":"signal.h", "extensions":[]},
-        {"ident":"SA_RESETHAND", "id_type":"macro", "header":"signal.h", "extensions":[]},
-        {"ident":"SA_RESTART", "id_type":"macro", "header":"signal.h", "extensions":[]},
-        {"ident":"SA_SIGINFO", "id_type":"macro", "header":"signal.h", "extensions":[]},
-        {"ident":"scalbln", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"scalblnf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"scalblnl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"scalbn", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"scalbnf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"scalbnl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"scandir", "id_type":"function", "header":"dirent.h", "extensions":[]},
-        {"ident":"scanf", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"SCHAR_MAX", "id_type":"macro", "header":"limits.h", "extensions":[]},
-        {"ident":"SCHAR_MIN", "id_type":"macro", "header":"limits.h", "extensions":[]},
-        {"ident":"sched_get_priority_max", "id_type":"function", "header":"sched.h", "extensions":["PS","TPS"]},
-        {"ident":"sched_get_priority_min", "id_type":"function", "header":"sched.h", "extensions":["PS","TPS"]},
-        {"ident":"sched_getparam", "id_type":"function", "header":"sched.h", "extensions":["PS"]},
-        {"ident":"sched_getscheduler", "id_type":"function", "header":"sched.h", "extensions":["PS"]},
-        {"ident":"sched_param", "id_type":"type", "header":"sched.h", "extensions":["TPS"]},
-        {"ident":"sched_rr_get_interval", "id_type":"function", "header":"sched.h", "extensions":["PS","TPS"]},
-        {"ident":"sched_setparam", "id_type":"function", "header":"sched.h", "extensions":["PS"]},
-        {"ident":"sched_setscheduler", "id_type":"function", "header":"sched.h", "extensions":["PS"]},
-        {"ident":"sched_yield", "id_type":"function", "header":"sched.h", "extensions":[]},
-        {"ident":"SCM_RIGHTS", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"seed48", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"SEEK_CUR", "id_type":"macro", "header":"stdio.h", "extensions":[]},
-        {"ident":"SEEK_END", "id_type":"macro", "header":"stdio.h", "extensions":[]},
-        {"ident":"SEEK_SET", "id_type":"macro", "header":"stdio.h", "extensions":[]},
-        {"ident":"seekdir", "id_type":"function", "header":"dirent.h", "extensions":["XSI"]},
-        {"ident":"select", "id_type":"function", "header":"sys/select.h", "extensions":[]},
-        {"ident":"sem_close", "id_type":"function", "header":"semaphore.h", "extensions":[]},
-        {"ident":"sem_destroy", "id_type":"function", "header":"semaphore.h", "extensions":[]},
-        {"ident":"sem_getvalue", "id_type":"function", "header":"semaphore.h", "extensions":[]},
-        {"ident":"sem_init", "id_type":"function", "header":"semaphore.h", "extensions":[]},
-        {"ident":"sem_open", "id_type":"function", "header":"semaphore.h", "extensions":[]},
-        {"ident":"sem_post", "id_type":"function", "header":"semaphore.h", "extensions":[]},
-        {"ident":"sem_timedwait", "id_type":"function", "header":"semaphore.h", "extensions":[]},
-        {"ident":"sem_trywait", "id_type":"function", "header":"semaphore.h", "extensions":[]},
-        {"ident":"SEM_UNDO", "id_type":"constant", "header":"sys/sem.h", "extensions":[]},
-        {"ident":"sem_unlink", "id_type":"function", "header":"semaphore.h", "extensions":[]},
-        {"ident":"sem_wait", "id_type":"function", "header":"semaphore.h", "extensions":[]},
-        {"ident":"sembuf", "id_type":"type", "header":"sys/sem.h", "extensions":[]},
-        {"ident":"semctl", "id_type":"function", "header":"sys/sem.h", "extensions":[]},
-        {"ident":"semget", "id_type":"function", "header":"sys/sem.h", "extensions":[]},
-        {"ident":"semid_ds", "id_type":"type", "header":"sys/sem.h", "extensions":[]},
-        {"ident":"semop", "id_type":"function", "header":"sys/sem.h", "extensions":[]},
-        {"ident":"send", "id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"sendmsg", "id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"sendto", "id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"servent", "id_type":"type", "header":"netdb.h", "extensions":[]},
-        {"ident":"SETALL", "id_type":"constant", "header":"sys/sem.h", "extensions":[]},
-        {"ident":"setbuf", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"setegid", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"setenv", "id_type":"function", "header":"stdlib.h", "extensions":["CX"]},
-        {"ident":"seteuid", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"setgid", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"setgrent", "id_type":"function", "header":"grp.h", "extensions":["XSI"]},
-        {"ident":"sethostent", "id_type":"function", "header":"netdb.h", "extensions":[]},
-        {"ident":"setitimer", "id_type":"function", "header":"sys/time.h", "extensions":["IP6"]},
-        {"ident":"setjmp", "id_type":"function", "header":"setjmp.h", "extensions":[]},
-        {"ident":"setkey", "id_type":"function", "header":"stdlib.h", "extensions":["XSI"]},
-        {"ident":"setlocale", "id_type":"function", "header":"locale.h", "extensions":[]},
-        {"ident":"setlogmask", "id_type":"function", "header":"syslog.h", "extensions":[]},
-        {"ident":"setnetent", "id_type":"function", "header":"netdb.h", "extensions":[]},
-        {"ident":"setpgid", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"setpgrp", "id_type":"function", "header":"unistd.h", "extensions":["OB","XSI"]},
-        {"ident":"setpriority", "id_type":"function", "header":"sys/resource.h", "extensions":[]},
-        {"ident":"setprotoent", "id_type":"function", "header":"netdb.h", "extensions":[]},
-        {"ident":"setpwent", "id_type":"function", "header":"pwd.h", "extensions":["XSI"]},
-        {"ident":"setregid", "id_type":"function", "header":"unistd.h", "extensions":["XSI"]},
-        {"ident":"setreuid", "id_type":"function", "header":"unistd.h", "extensions":["XSI"]},
-        {"ident":"setrlimit", "id_type":"function", "header":"sys/resource.h", "extensions":[]},
-        {"ident":"setservent", "id_type":"function", "header":"netdb.h", "extensions":[]},
-        {"ident":"setsid", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"setsockopt", "id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"setstate", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"setuid", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"setutxent", "id_type":"function", "header":"utmpx.h", "extensions":[]},
-        {"ident":"SETVAL", "id_type":"constant", "header":"sys/sem.h", "extensions":[]},
-        {"ident":"setvbuf", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"shm_open", "id_type":"function", "header":"sys/mman.h", "extensions":["SHM"]},
-        {"ident":"SHM_RDONLY", "id_type":"constant", "header":"sys/shm.h", "extensions":[]},
-        {"ident":"SHM_RND", "id_type":"constant", "header":"sys/shm.h", "extensions":[]},
-        {"ident":"shm_unlink", "id_type":"function", "header":"sys/mman.h", "extensions":["SHM"]},
-        {"ident":"shmat", "id_type":"function", "header":"sys/shm.h", "extensions":[]},
-        {"ident":"shmatt_t", "id_type":"type", "header":"sys/shm.h", "extensions":[]},
-        {"ident":"shmctl", "id_type":"function", "header":"sys/shm.h", "extensions":[]},
-        {"ident":"shmdt", "id_type":"function", "header":"sys/shm.h", "extensions":[]},
-        {"ident":"shmget", "id_type":"function", "header":"sys/shm.h", "extensions":[]},
-        {"ident":"shmid_ds", "id_type":"type", "header":"sys/shm.h", "extensions":[]},
-        {"ident":"SHMLBA", "id_type":"constant", "header":"sys/shm.h", "extensions":[]},
-        {"ident":"SHRT_MAX", "id_type":"macro", "header":"limits.h", "extensions":[]},
-        {"ident":"SHRT_MIN", "id_type":"macro", "header":"limits.h", "extensions":[]},
-        {"ident":"SHUT_RD", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"SHUT_RDWR", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"SHUT_WR", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"shutdown", "id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"sig_atomic_t", "id_type":"type", "header":"signal.h", "extensions":[]},
-        {"ident":"SIG_BLOCK", "id_type":"macro", "header":"signal.h", "extensions":[]},
-        {"ident":"SIG_DFL", "id_type":"macro", "header":"signal.h", "extensions":[]},
-        {"ident":"SIG_ERR", "id_type":"macro", "header":"signal.h", "extensions":[]},
-        {"ident":"SIG_HOLD", "id_type":"macro", "header":"signal.h", "extensions":[]},
-        {"ident":"SIG_IGN", "id_type":"macro", "header":"signal.h", "extensions":[]},
-        {"ident":"SIG_SETMASK", "id_type":"macro", "header":"signal.h", "extensions":[]},
-        {"ident":"SIG_UNBLOCK", "id_type":"macro", "header":"signal.h", "extensions":[]},
-        {"ident":"sigaction", "id_type":"function", "header":"signal.h", "extensions":[]},
-        {"ident":"sigaction", "id_type":"type", "header":"signal.h", "extensions":[]},
-        {"ident":"sigaddset", "id_type":"function", "header":"signal.h", "extensions":[]},
-        {"ident":"sigaltstack", "id_type":"function", "header":"signal.h", "extensions":[]},
-        {"ident":"sigdelset", "id_type":"function", "header":"signal.h", "extensions":[]},
-        {"ident":"sigemptyset", "id_type":"function", "header":"signal.h", "extensions":[]},
-        {"ident":"SIGEV_NONE", "id_type":"constant", "header":"signal.h", "extensions":[]},
-        {"ident":"SIGEV_SIGNAL", "id_type":"constant", "header":"signal.h", "extensions":[]},
-        {"ident":"SIGEV_THREAD", "id_type":"constant", "header":"signal.h", "extensions":[]},
-        {"ident":"sigevent", "id_type":"type", "header":"signal.h", "extensions":["CX"]},
-        {"ident":"sigfillset", "id_type":"function", "header":"signal.h", "extensions":[]},
-        {"ident":"sighold", "id_type":"function", "header":"signal.h", "extensions":[]},
-        {"ident":"sigignore", "id_type":"function", "header":"signal.h", "extensions":[]},
-        {"ident":"siginfo_t", "id_type":"type", "header":"signal.h", "extensions":[]},
-        {"ident":"siginterrupt", "id_type":"function", "header":"signal.h", "extensions":[]},
-        {"ident":"sigismember", "id_type":"function", "header":"signal.h", "extensions":[]},
-        {"ident":"siglongjmp", "id_type":"function", "header":"setjmp.h", "extensions":["CX"]},
-        {"ident":"signal", "id_type":"function", "header":"signal.h", "extensions":[]},
-        {"ident":"signgam", "id_type":"variable", "header":"math.h", "extensions":[]},
-        {"ident":"sigpause", "id_type":"function", "header":"signal.h", "extensions":[]},
-        {"ident":"sigpending", "id_type":"function", "header":"signal.h", "extensions":[]},
-        {"ident":"sigprocmask", "id_type":"function", "header":"signal.h", "extensions":[]},
-        {"ident":"sigqueue", "id_type":"function", "header":"signal.h", "extensions":[]},
-        {"ident":"sigrelse", "id_type":"function", "header":"signal.h", "extensions":[]},
-        {"ident":"sigset", "id_type":"function", "header":"signal.h", "extensions":[]},
-        {"ident":"sigset_t", "id_type":"type", "header":"signal.h", "extensions":[]},
-        {"ident":"sigsetjmp", "id_type":"function", "header":"setjmp.h", "extensions":["CX"]},
-        {"ident":"SIGSTKSZ", "id_type":"macro", "header":"signal.h", "extensions":[]},
-        {"ident":"sigsuspend", "id_type":"function", "header":"signal.h", "extensions":[]},
-        {"ident":"sigtimedwait", "id_type":"function", "header":"signal.h", "extensions":[]},
-        {"ident":"sigval", "id_type":"type", "header":"signal.h", "extensions":[]},
-        {"ident":"sigwait", "id_type":"function", "header":"signal.h", "extensions":[]},
-        {"ident":"sigwaitinfo", "id_type":"function", "header":"signal.h", "extensions":[]},
-        {"ident":"sin", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"sinf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"sinh", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"sinhf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"sinhl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"sinl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"size_t", "id_type":"macro", "header":"stddef.h", "extensions":["TSA","TSS"]},
-        {"ident":"sleep", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"snprintf", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"SO_ACCEPTCONN", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"SO_BROADCAST", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"SO_DEBUG", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"SO_DONTROUTE", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"SO_ERROR", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"SO_KEEPALIVE", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"SO_LINGER", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"SO_OOBINLINE", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"SO_RCVBUF", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"SO_RCVLOWAT", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"SO_RCVTIMEO", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"SO_REUSEADDR", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"SO_SNDBUF", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"SO_SNDLOWAT", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"SO_SNDTIMEO", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"SO_TYPE", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"SOCK_DGRAM", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"SOCK_RAW", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"SOCK_SEQPACKET", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"SOCK_STREAM", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"sockaddr", "id_type":"type", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"sockaddr_in", "id_type":"type", "header":"netinet/in.h", "extensions":[]},
-        {"ident":"sockaddr_in6", "id_type":"type", "header":"netinet/in.h", "extensions":["IP6"]},
-        {"ident":"sockaddr_un", "id_type":"type", "header":"sys/un.h", "extensions":[]},
-        {"ident":"sockatmark", "id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"socket", "id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"socketpair", "id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"SOL_SOCKET", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"SOMAXCONN", "id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
-        {"ident":"speed_t", "id_type":"type", "header":"termios.h", "extensions":[]},
-        {"ident":"sprintf", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"sqrt", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"sqrtf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"sqrtl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"srand", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"srand48", "id_type":"function", "header":"stdlib.h", "extensions":["XSI"]},
-        {"ident":"srandom", "id_type":"function", "header":"stdlib.h", "extensions":["XSI"]},
-        {"ident":"SS_DISABLE", "id_type":"macro", "header":"signal.h", "extensions":[]},
-        {"ident":"SS_ONSTACK", "id_type":"macro", "header":"signal.h", "extensions":[]},
-        {"ident":"sscanf", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"SSIZE_MAX", "id_type":"macro", "header":"limits.h", "extensions":[]},
-        {"ident":"ssize_t", "id_type":"type", "header":"stdio.h", "extensions":["CX"]},
-        {"ident":"ST_NOSUID", "id_type":"constant", "header":"sys/statvfs.h", "extensions":[]},
-        {"ident":"ST_RDONLY", "id_type":"constant", "header":"sys/statvfs.h", "extensions":[]},
-        {"ident":"stack_t", "id_type":"type", "header":"signal.h", "extensions":[]},
-        {"ident":"stat", "id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
-        {"ident":"stat", "id_type":"type", "header":"sys/stat.h", "extensions":["OB"]},
-        {"ident":"static_assert", "id_type":"macro", "header":"assert.h", "extensions":[]},
-        {"ident":"statvfs", "id_type":"function", "header":"sys/statvfs.h", "extensions":[]},
-        {"ident":"statvfs", "id_type":"type", "header":"sys/statvfs.h", "extensions":[]},
-        {"ident":"stderr", "id_type":"macro", "header":"stdio.h", "extensions":[]},
-        {"ident":"STDERR_FILENO", "id_type":"constant", "header":"unistd.h", "extensions":[]},
-        {"ident":"stdin", "id_type":"macro", "header":"stdio.h", "extensions":[]},
-        {"ident":"STDIN_FILENO", "id_type":"constant", "header":"unistd.h", "extensions":[]},
-        {"ident":"stdout", "id_type":"macro", "header":"stdio.h", "extensions":[]},
-        {"ident":"STDOUT_FILENO", "id_type":"constant", "header":"unistd.h", "extensions":[]},
-        {"ident":"stpcpy", "id_type":"function", "header":"string.h", "extensions":[]},
-        {"ident":"stpncpy", "id_type":"function", "header":"string.h", "extensions":[]},
-        {"ident":"str_list", "id_type":"type", "header":"stropts.h", "extensions":[]},
-        {"ident":"str_mlist", "id_type":"type", "header":"stropts.h", "extensions":[]},
-        {"ident":"strbuf", "id_type":"type", "header":"stropts.h", "extensions":[]},
-        {"ident":"strcasecmp", "id_type":"function", "header":"strings.h", "extensions":[]},
-        {"ident":"strcasecmp_l", "id_type":"function", "header":"strings.h", "extensions":[]},
-        {"ident":"strcat", "id_type":"function", "header":"string.h", "extensions":[]},
-        {"ident":"strchr", "id_type":"function", "header":"string.h", "extensions":[]},
-        {"ident":"strcmp", "id_type":"function", "header":"string.h", "extensions":[]},
-        {"ident":"strcoll", "id_type":"function", "header":"string.h", "extensions":[]},
-        {"ident":"strcoll_l", "id_type":"function", "header":"string.h", "extensions":["CX"]},
-        {"ident":"strcpy", "id_type":"function", "header":"string.h", "extensions":[]},
-        {"ident":"strcspn", "id_type":"function", "header":"string.h", "extensions":[]},
-        {"ident":"strdup", "id_type":"function", "header":"string.h", "extensions":["XSI"]},
-        {"ident":"strerror", "id_type":"function", "header":"string.h", "extensions":[]},
-        {"ident":"strerror_l", "id_type":"function", "header":"string.h", "extensions":[]},
-        {"ident":"strerror_r", "id_type":"function", "header":"string.h", "extensions":["CX"]},
-        {"ident":"strfdinsert", "id_type":"type", "header":"stropts.h", "extensions":[]},
-        {"ident":"strfmon", "id_type":"function", "header":"monetary.h", "extensions":[]},
-        {"ident":"strfmon_l", "id_type":"function", "header":"monetary.h", "extensions":[]},
-        {"ident":"strftime", "id_type":"function", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"strftime_l", "id_type":"function", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"strioctl", "id_type":"type", "header":"stropts.h", "extensions":[]},
-        {"ident":"strlen", "id_type":"function", "header":"string.h", "extensions":[]},
-        {"ident":"strncasecmp", "id_type":"function", "header":"strings.h", "extensions":[]},
-        {"ident":"strncasecmp_l", "id_type":"function", "header":"strings.h", "extensions":[]},
-        {"ident":"strncat", "id_type":"function", "header":"string.h", "extensions":[]},
-        {"ident":"strncmp", "id_type":"function", "header":"string.h", "extensions":[]},
-        {"ident":"strncpy", "id_type":"function", "header":"string.h", "extensions":[]},
-        {"ident":"strndup", "id_type":"function", "header":"string.h", "extensions":[]},
-        {"ident":"strnlen", "id_type":"function", "header":"string.h", "extensions":["CX"]},
-        {"ident":"strpbrk", "id_type":"function", "header":"string.h", "extensions":[]},
-        {"ident":"strpeek", "id_type":"type", "header":"stropts.h", "extensions":[]},
-        {"ident":"strptime", "id_type":"function", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"strrchr", "id_type":"function", "header":"string.h", "extensions":[]},
-        {"ident":"strrecvfd", "id_type":"type", "header":"stropts.h", "extensions":[]},
-        {"ident":"strsignal", "id_type":"function", "header":"string.h", "extensions":[]},
-        {"ident":"strspn", "id_type":"function", "header":"string.h", "extensions":[]},
-        {"ident":"strstr", "id_type":"function", "header":"string.h", "extensions":[]},
-        {"ident":"strtod", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"strtof", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"strtoimax", "id_type":"function", "header":"inttypes.h", "extensions":[]},
-        {"ident":"strtok", "id_type":"function", "header":"string.h", "extensions":[]},
-        {"ident":"strtok_r", "id_type":"function", "header":"string.h", "extensions":[]},
-        {"ident":"strtol", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"strtold", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"strtoll", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"strtoul", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"strtoull", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"strtoumax", "id_type":"function", "header":"inttypes.h", "extensions":[]},
-        {"ident":"strxfrm", "id_type":"function", "header":"string.h", "extensions":[]},
-        {"ident":"strxfrm_l", "id_type":"function", "header":"string.h", "extensions":["CX"]},
-        {"ident":"suseconds_t", "id_type":"type", "header":"sys/types.h", "extensions":["XSI"]},
-        {"ident":"swab", "id_type":"function", "header":"unistd.h", "extensions":["XSI"]},
-        {"ident":"swprintf", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"swscanf", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"symlink", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"symlinkat", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"sync", "id_type":"function", "header":"unistd.h", "extensions":["XSI"]},
-        {"ident":"sysconf", "id_type":"function", "header":"unistd.h", "extensions":["ADV"]},
-        {"ident":"syslog", "id_type":"function", "header":"syslog.h", "extensions":[]},
-        {"ident":"system", "id_type":"function", "header":"stdlib.h", "extensions":["IP6"]},
-        {"ident":"t_scalar_t", "id_type":"type", "header":"stropts.h", "extensions":[]},
-        {"ident":"t_uscalar_t", "id_type":"type", "header":"stropts.h", "extensions":[]},
-        {"ident":"TABDLY", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"tan", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"tanf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"tanh", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"tanhf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"tanhl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"tanl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"tcdrain", "id_type":"function", "header":"termios.h", "extensions":[]},
-        {"ident":"tcflag_t", "id_type":"type", "header":"termios.h", "extensions":[]},
-        {"ident":"tcflow", "id_type":"function", "header":"termios.h", "extensions":[]},
-        {"ident":"tcflush", "id_type":"function", "header":"termios.h", "extensions":[]},
-        {"ident":"tcgetattr", "id_type":"function", "header":"termios.h", "extensions":[]},
-        {"ident":"tcgetpgrp", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"tcgetsid", "id_type":"function", "header":"termios.h", "extensions":[]},
-        {"ident":"TCIFLUSH", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"TCIOFF", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"TCIOFLUSH", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"TCION", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"TCOFLUSH", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"TCOOFF", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"TCOON", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"TCP_NODELAY", "id_type":"constant", "header":"netinet/tcp.h", "extensions":[]},
-        {"ident":"TCSADRAIN", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"TCSAFLUSH", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"TCSANOW", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"tcsendbreak", "id_type":"function", "header":"termios.h", "extensions":[]},
-        {"ident":"tcsetattr", "id_type":"function", "header":"termios.h", "extensions":[]},
-        {"ident":"tcsetpgrp", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"tdelete", "id_type":"function", "header":"search.h", "extensions":[]},
-        {"ident":"telldir", "id_type":"function", "header":"dirent.h", "extensions":["XSI"]},
-        {"ident":"tempnam", "id_type":"function", "header":"stdio.h", "extensions":["OB","XSI"]},
-        {"ident":"termios", "id_type":"type", "header":"termios.h", "extensions":[]},
-        {"ident":"tfind", "id_type":"function", "header":"search.h", "extensions":[]},
-        {"ident":"tgamma", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"tgammaf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"tgammal", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"time", "id_type":"function", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"time_t", "id_type":"type", "header":"sys/types.h", "extensions":["SS","TSP"]},
-        {"ident":"TIMER_ABSTIME", "id_type":"constant", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"timer_create", "id_type":"function", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"timer_delete", "id_type":"function", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"timer_getoverrun", "id_type":"function", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"timer_gettime", "id_type":"function", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"timer_settime", "id_type":"function", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"timer_t", "id_type":"type", "header":"sys/types.h", "extensions":["CX"]},
-        {"ident":"times", "id_type":"function", "header":"sys/times.h", "extensions":["OB"]},
-        {"ident":"timespec", "id_type":"type", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"timeval", "id_type":"type", "header":"sys/time.h", "extensions":["IP6"]},
-        {"ident":"timezone", "id_type":"variable", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"tm", "id_type":"type", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"TMP_MAX", "id_type":"macro", "header":"stdio.h", "extensions":[]},
-        {"ident":"tmpfile", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"tmpnam", "id_type":"function", "header":"stdio.h", "extensions":["OB"]},
-        {"ident":"tms", "id_type":"type", "header":"sys/times.h", "extensions":["OB"]},
-        {"ident":"toascii", "id_type":"function", "header":"ctype.h", "extensions":["OB","XSI"]},
-        {"ident":"tolower", "id_type":"function", "header":"ctype.h", "extensions":[]},
-        {"ident":"tolower_l", "id_type":"function", "header":"ctype.h", "extensions":["CX"]},
-        {"ident":"TOSTOP", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"toupper", "id_type":"function", "header":"ctype.h", "extensions":[]},
-        {"ident":"toupper_l", "id_type":"function", "header":"ctype.h", "extensions":["CX"]},
-        {"ident":"towctrans", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"towctrans_l", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"towlower", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"towlower_l", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"towupper", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"towupper_l", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"trace_attr_t", "id_type":"type", "header":"sys/types.h", "extensions":["OB","TRC"]},
-        {"ident":"trace_event_id_t", "id_type":"type", "header":"sys/types.h", "extensions":["OB","TRC"]},
-        {"ident":"trace_event_set_t", "id_type":"type", "header":"sys/types.h", "extensions":["OB","TEF"]},
-        {"ident":"trace_id_t", "id_type":"type", "header":"sys/types.h", "extensions":["OB","TRC"]},
-        {"ident":"true", "id_type":"macro", "header":"stdbool.h", "extensions":[]},
-        {"ident":"trunc", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"truncate", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"truncf", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"truncl", "id_type":"function", "header":"math.h", "extensions":[]},
-        {"ident":"tsearch", "id_type":"function", "header":"search.h", "extensions":[]},
-        {"ident":"ttyname", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"ttyname_r", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"twalk", "id_type":"function", "header":"search.h", "extensions":[]},
-        {"ident":"tzname", "id_type":"variable", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"tzset", "id_type":"function", "header":"time.h", "extensions":["IP6"]},
-        {"ident":"UCHAR_MAX", "id_type":"macro", "header":"limits.h", "extensions":[]},
-        {"ident":"ucontext_t", "id_type":"type", "header":"signal.h", "extensions":[]},
-        {"ident":"uid_t", "id_type":"type", "header":"sys/types.h", "extensions":[]},
-        {"ident":"UINT_MAX", "id_type":"macro", "header":"limits.h", "extensions":[]},
-        {"ident":"ulimit", "id_type":"function", "header":"ulimit.h", "extensions":[]},
-        {"ident":"ULLONG_MAX", "id_type":"macro", "header":"limits.h", "extensions":[]},
-        {"ident":"ULONG_MAX", "id_type":"macro", "header":"limits.h", "extensions":[]},
-        {"ident":"umask", "id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
-        {"ident":"uname", "id_type":"function", "header":"sys/utsname.h", "extensions":[]},
-        {"ident":"ungetc", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"ungetwc", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"unlink", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"unlinkat", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"unlockpt", "id_type":"function", "header":"stdlib.h", "extensions":["XSI"]},
-        {"ident":"unsetenv", "id_type":"function", "header":"stdlib.h", "extensions":["CX"]},
-        {"ident":"USER_PROCESS", "id_type":"constant", "header":"utmpx.h", "extensions":[]},
-        {"ident":"USHRT_MAX", "id_type":"macro", "header":"limits.h", "extensions":[]},
-        {"ident":"usleep", "id_type":"function", "header":"unistd.h", "extensions":["OB","REM"]},
-        {"ident":"utimbuf", "id_type":"type", "header":"utime.h", "extensions":[]},
-        {"ident":"utime", "id_type":"function", "header":"utime.h", "extensions":[]},
-        {"ident":"utimensat", "id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
-        {"ident":"utimes", "id_type":"function", "header":"sys/time.h", "extensions":["IP6"]},
-        {"ident":"utmpx", "id_type":"type", "header":"utmpx.h", "extensions":[]},
-        {"ident":"utsname", "id_type":"type", "header":"sys/utsname.h", "extensions":[]},
-        {"ident":"va_arg", "id_type":"type", "header":"stdarg.h", "extensions":[]},
-        {"ident":"va_copy", "id_type":"macro", "header":"stdarg.h", "extensions":[]},
-        {"ident":"va_end", "id_type":"macro", "header":"stdarg.h", "extensions":[]},
-        {"ident":"va_list", "id_type":"type", "header":"stdarg.h", "extensions":[]},
-        {"ident":"va_start", "id_type":"macro", "header":"stdarg.h", "extensions":[]},
-        {"ident":"vdprintf", "id_type":"function", "header":"stdio.h", "extensions":["CX"]},
-        {"ident":"vfprintf", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"vfscanf", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"vfwprintf", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"vfwscanf", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"vprintf", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"vscanf", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"vsnprintf", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"vsprintf", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"vsscanf", "id_type":"function", "header":"stdio.h", "extensions":[]},
-        {"ident":"vswprintf", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"vswscanf", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"VTDLY", "id_type":"constant", "header":"termios.h", "extensions":[]},
-        {"ident":"vwprintf", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"vwscanf", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"W_OK", "id_type":"constant", "header":"unistd.h", "extensions":[]},
-        {"ident":"wait", "id_type":"function", "header":"sys/wait.h", "extensions":[]},
-        {"ident":"waitid", "id_type":"function", "header":"sys/wait.h", "extensions":[]},
-        {"ident":"waitpid", "id_type":"function", "header":"sys/wait.h", "extensions":[]},
-        {"ident":"WCHAR_MAX", "id_type":"macro", "header":"wchar.h", "extensions":[]},
-        {"ident":"WCHAR_MIN", "id_type":"macro", "header":"wchar.h", "extensions":[]},
-        {"ident":"wchar_t", "id_type":"macro", "header":"stddef.h", "extensions":["CX"]},
-        {"ident":"WCONTINUED", "id_type":"constant", "header":"sys/wait.h", "extensions":["XSI"]},
-        {"ident":"wcpcpy", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wcpncpy", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wcrtomb", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wcscasecmp", "id_type":"function", "header":"wchar.h", "extensions":["CX"]},
-        {"ident":"wcscasecmp_l", "id_type":"function", "header":"wchar.h", "extensions":["CX"]},
-        {"ident":"wcscat", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wcschr", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wcscmp", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wcscoll", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wcscoll_l", "id_type":"function", "header":"wchar.h", "extensions":["CX"]},
-        {"ident":"wcscpy", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wcscspn", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wcsdup", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wcsftime", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wcslen", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wcsncasecmp", "id_type":"function", "header":"wchar.h", "extensions":["CX"]},
-        {"ident":"wcsncasecmp_l", "id_type":"function", "header":"wchar.h", "extensions":["CX"]},
-        {"ident":"wcsncat", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wcsncmp", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wcsncpy", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wcsnlen", "id_type":"function", "header":"wchar.h", "extensions":["CX"]},
-        {"ident":"wcsnrtombs", "id_type":"function", "header":"wchar.h", "extensions":["CX"]},
-        {"ident":"wcspbrk", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wcsrchr", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wcsrtombs", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wcsspn", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wcsstr", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wcstod", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wcstof", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wcstoimax", "id_type":"function", "header":"inttypes.h", "extensions":[]},
-        {"ident":"wcstok", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wcstol", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wcstold", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wcstoll", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wcstombs", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"wcstoul", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wcstoull", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wcstoumax", "id_type":"function", "header":"inttypes.h", "extensions":[]},
-        {"ident":"wcswidth", "id_type":"function", "header":"wchar.h", "extensions":["XSI"]},
-        {"ident":"wcsxfrm", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wcsxfrm_l", "id_type":"function", "header":"wchar.h", "extensions":["CX"]},
-        {"ident":"wctob", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wctomb", "id_type":"function", "header":"stdlib.h", "extensions":[]},
-        {"ident":"wctrans", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"wctrans_l", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"wctrans_t", "id_type":"type", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"wctype", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"wctype_l", "id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
-        {"ident":"wctype_t", "id_type":"type", "header":"wchar.h", "extensions":["OB","XSI"]},
-        {"ident":"wcwidth", "id_type":"function", "header":"wchar.h", "extensions":["XSI"]},
-        {"ident":"WEOF", "id_type":"macro", "header":"wchar.h", "extensions":[]},
-        {"ident":"WEXITED", "id_type":"constant", "header":"sys/wait.h", "extensions":[]},
-        {"ident":"WEXITSTATUS", "id_type":"constant", "header":"sys/wait.h", "extensions":["CX"]},
-        {"ident":"WIFCONTINUED", "id_type":"constant", "header":"sys/wait.h", "extensions":[]},
-        {"ident":"WIFEXITED", "id_type":"constant", "header":"sys/wait.h", "extensions":["CX"]},
-        {"ident":"WIFSIGNALED", "id_type":"constant", "header":"sys/wait.h", "extensions":["CX"]},
-        {"ident":"WIFSTOPPED", "id_type":"constant", "header":"sys/wait.h", "extensions":["CX"]},
-        {"ident":"wint_t", "id_type":"type", "header":"wchar.h", "extensions":["OB","XSI"]},
-        {"ident":"wmemchr", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wmemcmp", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wmemcpy", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wmemmove", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"wmemset", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"WNOHANG", "id_type":"constant", "header":"sys/wait.h", "extensions":["CX"]},
-        {"ident":"WNOWAIT", "id_type":"constant", "header":"sys/wait.h", "extensions":[]},
-        {"ident":"WORD_BIT", "id_type":"macro", "header":"limits.h", "extensions":[]},
-        {"ident":"wordexp", "id_type":"function", "header":"wordexp.h", "extensions":[]},
-        {"ident":"wordexp_t", "id_type":"type", "header":"wordexp.h", "extensions":[]},
-        {"ident":"wordfree", "id_type":"function", "header":"wordexp.h", "extensions":[]},
-        {"ident":"wprintf", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"WRDE_APPEND", "id_type":"constant", "header":"wordexp.h", "extensions":[]},
-        {"ident":"WRDE_BADCHAR", "id_type":"constant", "header":"wordexp.h", "extensions":[]},
-        {"ident":"WRDE_BADVAL", "id_type":"constant", "header":"wordexp.h", "extensions":[]},
-        {"ident":"WRDE_CMDSUB", "id_type":"constant", "header":"wordexp.h", "extensions":[]},
-        {"ident":"WRDE_DOOFFS", "id_type":"constant", "header":"wordexp.h", "extensions":[]},
-        {"ident":"WRDE_NOCMD", "id_type":"constant", "header":"wordexp.h", "extensions":[]},
-        {"ident":"WRDE_NOSPACE", "id_type":"constant", "header":"wordexp.h", "extensions":[]},
-        {"ident":"WRDE_REUSE", "id_type":"constant", "header":"wordexp.h", "extensions":[]},
-        {"ident":"WRDE_SHOWERR", "id_type":"constant", "header":"wordexp.h", "extensions":[]},
-        {"ident":"WRDE_SYNTAX", "id_type":"constant", "header":"wordexp.h", "extensions":[]},
-        {"ident":"WRDE_UNDEF", "id_type":"constant", "header":"wordexp.h", "extensions":[]},
-        {"ident":"write", "id_type":"function", "header":"unistd.h", "extensions":[]},
-        {"ident":"writev", "id_type":"function", "header":"sys/uio.h", "extensions":["XSI"]},
-        {"ident":"wscanf", "id_type":"function", "header":"wchar.h", "extensions":[]},
-        {"ident":"WSTOPPED", "id_type":"constant", "header":"sys/wait.h", "extensions":[]},
-        {"ident":"WSTOPSIG", "id_type":"constant", "header":"sys/wait.h", "extensions":["CX"]},
-        {"ident":"WTERMSIG", "id_type":"constant", "header":"sys/wait.h", "extensions":["CX"]},
-        {"ident":"WUNTRACED", "id_type":"constant", "header":"sys/wait.h", "extensions":["CX"]},
-        {"ident":"X_OK", "id_type":"constant", "header":"unistd.h", "extensions":[]},
-        {"ident":"xor", "id_type":"macro", "header":"iso646.h", "extensions":[]},
-        {"ident":"xor_eq", "id_type":"macro", "header":"iso646.h", "extensions":[]},
-        {"ident":"y0", "id_type":"function", "header":"math.h", "extensions":["XSI"]},
-        {"ident":"y1", "id_type":"function", "header":"math.h", "extensions":["XSI"]},
-        {"ident":"yn", "id_type":"function", "header":"math.h", "extensions":["XSI"]}
-    ]
+    "data":{
+        "__bool_true_false_are_defined": {"id_type":"macro", "header":"stdbool.h", "extensions":[]},
+        "_Complex_I": {"id_type":"macro", "header":"complex.h", "extensions":[]},
+        "_CS_PATH": {"id_type":"constant", "header":"unistd.h", "extensions":[]},
+        "_CS_POSIX_V7_ILP32_OFF32_CFLAGS": {"id_type":"constant", "header":"unistd.h", "extensions":[]},
+        "_CS_POSIX_V7_ILP32_OFF32_LDFLAGS": {"id_type":"constant", "header":"unistd.h", "extensions":[]},
+        "_CS_POSIX_V7_ILP32_OFF32_LIBS": {"id_type":"constant", "header":"unistd.h", "extensions":[]},
+        "_CS_POSIX_V7_ILP32_OFFBIG_CFLAGS": {"id_type":"constant", "header":"unistd.h", "extensions":[]},
+        "_CS_POSIX_V7_ILP32_OFFBIG_LDFLAGS": {"id_type":"constant", "header":"unistd.h", "extensions":[]},
+        "_CS_POSIX_V7_ILP32_OFFBIG_LIBS": {"id_type":"constant", "header":"unistd.h", "extensions":[]},
+        "_CS_POSIX_V7_LP64_OFF64_CFLAGS": {"id_type":"constant", "header":"unistd.h", "extensions":[]},
+        "_CS_POSIX_V7_LP64_OFF64_LDFLAGS": {"id_type":"constant", "header":"unistd.h", "extensions":[]},
+        "_CS_POSIX_V7_LP64_OFF64_LIBS": {"id_type":"constant", "header":"unistd.h", "extensions":[]},
+        "_CS_POSIX_V7_LPBIG_OFFBIG_CFLAGS": {"id_type":"constant", "header":"unistd.h", "extensions":[]},
+        "_CS_POSIX_V7_LPBIG_OFFBIG_LDFLAGS": {"id_type":"constant", "header":"unistd.h", "extensions":[]},
+        "_CS_POSIX_V7_LPBIG_OFFBIG_LIBS": {"id_type":"constant", "header":"unistd.h", "extensions":[]},
+        "_CS_POSIX_V7_THREADS_CFLAGS": {"id_type":"constant", "header":"unistd.h", "extensions":[]},
+        "_CS_POSIX_V7_THREADS_LDFLAGS": {"id_type":"constant", "header":"unistd.h", "extensions":[]},
+        "_CS_POSIX_V7_WIDTH_RESTRICTED_ENVS": {"id_type":"constant", "header":"unistd.h", "extensions":[]},
+        "_CS_V7_ENV": {"id_type":"constant", "header":"unistd.h", "extensions":[]},
+        "_Exit": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "_exit": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "_Imaginary_I": {"id_type":"macro", "header":"complex.h", "extensions":[]},
+        "_IOFBF": {"id_type":"macro", "header":"stdio.h", "extensions":[]},
+        "_IOLBF": {"id_type":"macro", "header":"stdio.h", "extensions":[]},
+        "_IONBF": {"id_type":"macro", "header":"stdio.h", "extensions":[]},
+        "_longjmp": {"id_type":"function", "header":"setjmp.h", "extensions":["OB","XSI"]},
+        "_POSIX2_VERSION": {"id_type":"constant", "header":"unistd.h", "extensions":[]},
+        "_POSIX_AIO_LISTIO_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_AIO_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_ARG_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_CHILD_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_CLOCKRES_MIN": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_DELAYTIMER_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_HOST_NAME_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_LINK_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_LOGIN_NAME_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_MAX_CANON": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_MAX_INPUT": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_MQ_OPEN_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_MQ_PRIO_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_NAME_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_NGROUPS_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_OPEN_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_PATH_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_PIPE_BUF": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_RE_DUP_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_RTSIG_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_SEM_NSEMS_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_SEM_VALUE_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_SIGQUEUE_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_SS_REPL_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_SSIZE_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_STREAM_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_SYMLINK_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_SYMLOOP_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_THREAD_DESTRUCTOR_ITERATIONS": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_THREAD_KEYS_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_THREAD_THREADS_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_TIMER_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_TRACE_EVENT_NAME_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_TRACE_NAME_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_TRACE_SYS_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_TRACE_USER_EVENT_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_TTY_NAME_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_TZNAME_MAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "_POSIX_VDISABLE": {"id_type":"constant", "header":"unistd.h", "extensions":[]},
+        "_POSIX_VERSION": {"id_type":"constant", "header":"unistd.h", "extensions":[]},
+        "_setjmp": {"id_type":"function", "header":"setjmp.h", "extensions":["OB","XSI"]},
+        "_tolower": {"id_type":"function", "header":"ctype.h", "extensions":["OB","XSI"]},
+        "_toupper": {"id_type":"function", "header":"ctype.h", "extensions":["OB","XSI"]},
+        "_XOPEN_VERSION": {"id_type":"constant", "header":"unistd.h", "extensions":[]},
+        "a64l": {"id_type":"function", "header":"stdlib.h", "extensions":["XSI"]},
+        "abort": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "abs": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "accept": {"id_type":"function", "header":"sys/socket.h", "extensions":["XSI"]},
+        "access": {"id_type":"function", "header":"unistd.h", "extensions":["ADV"]},
+        "acos": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "acosf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "acosh": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "acoshf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "acoshl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "acosl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "addrinfo": {"id_type":"type", "header":"netdb.h", "extensions":[]},
+        "AF_INET": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "AF_INET6": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "AF_UNIX": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "AF_UNSPEC": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "AI_ADDRCONFIG": {"id_type":"constant", "header":"netdb.h", "extensions":[]},
+        "AI_ALL": {"id_type":"constant", "header":"netdb.h", "extensions":[]},
+        "AI_CANONNAME": {"id_type":"constant", "header":"netdb.h", "extensions":[]},
+        "AI_NUMERICHOST": {"id_type":"constant", "header":"netdb.h", "extensions":[]},
+        "AI_NUMERICSERV": {"id_type":"constant", "header":"netdb.h", "extensions":[]},
+        "AI_PASSIVE": {"id_type":"constant", "header":"netdb.h", "extensions":[]},
+        "AI_V4MAPPED": {"id_type":"constant", "header":"netdb.h", "extensions":[]},
+        "AIO_ALLDONE": {"id_type":"constant", "header":"aio.h", "extensions":[]},
+        "aio_cancel": {"id_type":"function", "header":"aio.h", "extensions":[]},
+        "AIO_CANCELED": {"id_type":"constant", "header":"aio.h", "extensions":[]},
+        "aio_error": {"id_type":"function", "header":"aio.h", "extensions":[]},
+        "aio_fsync": {"id_type":"function", "header":"aio.h", "extensions":["FSC","SIO"]},
+        "AIO_NOTCANCELED": {"id_type":"constant", "header":"aio.h", "extensions":[]},
+        "aio_read": {"id_type":"function", "header":"aio.h", "extensions":[]},
+        "aio_return": {"id_type":"function", "header":"aio.h", "extensions":[]},
+        "aio_suspend": {"id_type":"function", "header":"aio.h", "extensions":[]},
+        "aio_write": {"id_type":"function", "header":"aio.h", "extensions":[]},
+        "aiocb": {"id_type":"type", "header":"aio.h", "extensions":["FSC","SIO"]},
+        "alarm": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "alphasort": {"id_type":"function", "header":"dirent.h", "extensions":[]},
+        "and": {"id_type":"macro", "header":"iso646.h", "extensions":["CX"]},
+        "and_eq": {"id_type":"macro", "header":"iso646.h", "extensions":[]},
+        "asctime": {"id_type":"function", "header":"time.h", "extensions":["IP6"]},
+        "asctime_r": {"id_type":"function", "header":"time.h", "extensions":["IP6"]},
+        "asin": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "asinf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "asinh": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "asinhf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "asinhl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "asinl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "assert": {"id_type":"macro", "header":"assert.h", "extensions":[]},
+        "AT_EACCESS": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "AT_FDCWD": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "AT_REMOVEDIR": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "AT_SYMLINK_FOLLOW": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "AT_SYMLINK_NOFOLLOW": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "atan": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "atan2": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "atan2f": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "atan2l": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "atanf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "atanh": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "atanhf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "atanhl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "atanl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "atexit": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "atof": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "atoi": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "atol": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "atoll": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "B0": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "B110": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "B1200": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "B134": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "B150": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "B1800": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "B19200": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "B200": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "B2400": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "B300": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "B38400": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "B4800": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "B50": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "B600": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "B75": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "B9600": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "bandinfo": {"id_type":"type", "header":"stropts.h", "extensions":[]},
+        "basename": {"id_type":"function", "header":"libgen.h", "extensions":[]},
+        "bind": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
+        "bitand": {"id_type":"macro", "header":"iso646.h", "extensions":[]},
+        "bitor": {"id_type":"macro", "header":"iso646.h", "extensions":[]},
+        "blkcnt_t": {"id_type":"type", "header":"sys/types.h", "extensions":["XSI"]},
+        "blksize_t": {"id_type":"type", "header":"sys/types.h", "extensions":["XSI"]},
+        "bool": {"id_type":"macro", "header":"stdbool.h", "extensions":[]},
+        "BOOT_TIME": {"id_type":"constant", "header":"utmpx.h", "extensions":[]},
+        "BRKINT": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "BSDLY": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "bsearch": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "btowc": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "BUFSIZ": {"id_type":"type", "header":"stdio.h", "extensions":[]},
+        "cabs": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "cabsf": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "cabsl": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "cacos": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "cacosf": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "cacosh": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "cacoshf": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "cacoshl": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "cacosl": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "calloc": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "carg": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "cargf": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "cargl": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "casin": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "casinf": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "casinh": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "casinhf": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "casinhl": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "casinl": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "catan": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "catanf": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "catanh": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "catanhf": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "catanhl": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "catanl": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "catclose": {"id_type":"function", "header":"nl_types.h", "extensions":[]},
+        "catgets": {"id_type":"function", "header":"nl_types.h", "extensions":[]},
+        "catopen": {"id_type":"function", "header":"nl_types.h", "extensions":[]},
+        "cbrt": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "cbrtf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "cbrtl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "cc_t": {"id_type":"type", "header":"termios.h", "extensions":[]},
+        "ccos": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "ccosf": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "ccosh": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "ccoshf": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "ccoshl": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "ccosl": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "ceil": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "ceilf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "ceill": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "cexp": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "cexpf": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "cexpl": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "cfgetispeed": {"id_type":"function", "header":"termios.h", "extensions":[]},
+        "cfgetospeed": {"id_type":"function", "header":"termios.h", "extensions":[]},
+        "cfsetispeed": {"id_type":"function", "header":"termios.h", "extensions":[]},
+        "cfsetospeed": {"id_type":"function", "header":"termios.h", "extensions":[]},
+        "CHAR_BIT": {"id_type":"macro", "header":"limits.h", "extensions":[]},
+        "CHAR_MAX": {"id_type":"macro", "header":"limits.h", "extensions":[]},
+        "CHAR_MIN": {"id_type":"macro", "header":"limits.h", "extensions":[]},
+        "chdir": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "chmod": {"id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
+        "chown": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "chroot": {"id_type":"function", "header":"unistd.h", "extensions":["OB","REM"]},
+        "cimag": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "cimagf": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "cimagl": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "clearerr": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "CLOCAL": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "clock": {"id_type":"function", "header":"time.h", "extensions":["IP6"]},
+        "clock_getcpuclockid": {"id_type":"function", "header":"time.h", "extensions":["IP6"]},
+        "clock_getres": {"id_type":"function", "header":"time.h", "extensions":["IP6"]},
+        "clock_gettime": {"id_type":"function", "header":"time.h", "extensions":["IP6"]},
+        "CLOCK_MONOTONIC": {"id_type":"macro", "header":"time.h", "extensions":["MON"]},
+        "clock_nanosleep": {"id_type":"function", "header":"time.h", "extensions":["IP6"]},
+        "CLOCK_PROCESS_CPUTIME_ID": {"id_type":"macro", "header":"time.h", "extensions":["IP6"]},
+        "CLOCK_REALTIME": {"id_type":"macro", "header":"time.h", "extensions":["IP6"]},
+        "clock_settime": {"id_type":"function", "header":"time.h", "extensions":["IP6"]},
+        "clock_t": {"id_type":"type", "header":"sys/types.h", "extensions":[]},
+        "CLOCK_THREAD_CPUTIME_ID": {"id_type":"macro", "header":"time.h", "extensions":["IP6"]},
+        "clockid_t": {"id_type":"type", "header":"sys/types.h", "extensions":["TCT"]},
+        "CLOCKS_PER_SEC": {"id_type":"macro", "header":"time.h", "extensions":["IP6"]},
+        "clog": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "clogf": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "clogl": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "close": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "closedir": {"id_type":"function", "header":"dirent.h", "extensions":[]},
+        "closelog": {"id_type":"function", "header":"syslog.h", "extensions":[]},
+        "CMSG_DATA": {"id_type":"macro", "header":"sys/socket.h", "extensions":["IP6"]},
+        "CMSG_FIRSTHDR": {"id_type":"macro", "header":"sys/socket.h", "extensions":["IP6"]},
+        "CMSG_NXTHDR": {"id_type":"macro", "header":"sys/socket.h", "extensions":["IP6"]},
+        "cmsghdr": {"id_type":"type", "header":"sys/socket.h", "extensions":["IP6"]},
+        "compl": {"id_type":"macro", "header":"iso646.h", "extensions":[]},
+        "complex": {"id_type":"macro", "header":"complex.h", "extensions":[]},
+        "confstr": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "conj": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "conjf": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "conjl": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "connect": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
+        "copysign": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "copysignf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "copysignl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "cos": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "cosf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "cosh": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "coshf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "coshl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "cosl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "cpow": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "cpowf": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "cpowl": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "cproj": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "cprojf": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "cprojl": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "CRDLY": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "CREAD": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "creal": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "crealf": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "creall": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "creat": {"id_type":"function", "header":"fcntl.h", "extensions":[]},
+        "crypt": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "csin": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "csinf": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "csinh": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "csinhf": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "csinhl": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "csinl": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "CSIZE": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "csqrt": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "csqrtf": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "csqrtl": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "CSTOPB": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "ctan": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "ctanf": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "ctanh": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "ctanhf": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "ctanhl": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "ctanl": {"id_type":"function", "header":"complex.h", "extensions":[]},
+        "ctermid": {"id_type":"function", "header":"stdio.h", "extensions":["CX"]},
+        "ctime": {"id_type":"function", "header":"time.h", "extensions":["IP6"]},
+        "ctime_r": {"id_type":"function", "header":"time.h", "extensions":["IP6"]},
+        "datum": {"id_type":"type", "header":"ndbm.h", "extensions":[]},
+        "daylight": {"id_type":"variable", "header":"time.h", "extensions":["IP6"]},
+        "DBM": {"id_type":"type", "header":"ndbm.h", "extensions":[]},
+        "dbm_clearerr": {"id_type":"function", "header":"ndbm.h", "extensions":[]},
+        "dbm_close": {"id_type":"function", "header":"ndbm.h", "extensions":[]},
+        "dbm_delete": {"id_type":"function", "header":"ndbm.h", "extensions":[]},
+        "dbm_error": {"id_type":"function", "header":"ndbm.h", "extensions":[]},
+        "dbm_fetch": {"id_type":"function", "header":"ndbm.h", "extensions":[]},
+        "dbm_firstkey": {"id_type":"function", "header":"ndbm.h", "extensions":[]},
+        "DBM_INSERT": {"id_type":"constant", "header":"ndbm.h", "extensions":[]},
+        "dbm_nextkey": {"id_type":"function", "header":"ndbm.h", "extensions":[]},
+        "dbm_open": {"id_type":"function", "header":"ndbm.h", "extensions":[]},
+        "DBM_REPLACE": {"id_type":"constant", "header":"ndbm.h", "extensions":[]},
+        "dbm_store": {"id_type":"function", "header":"ndbm.h", "extensions":[]},
+        "DEAD_PROCESS": {"id_type":"constant", "header":"utmpx.h", "extensions":[]},
+        "dev_t": {"id_type":"type", "header":"sys/types.h", "extensions":["XSI"]},
+        "difftime": {"id_type":"function", "header":"time.h", "extensions":["IP6"]},
+        "DIR": {"id_type":"type", "header":"dirent.h", "extensions":[]},
+        "dirent": {"id_type":"type", "header":"dirent.h", "extensions":[]},
+        "dirfd": {"id_type":"function", "header":"dirent.h", "extensions":[]},
+        "dirname": {"id_type":"function", "header":"libgen.h", "extensions":[]},
+        "div": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "div_t": {"id_type":"type", "header":"stdlib.h", "extensions":[]},
+        "dlclose": {"id_type":"function", "header":"dlfcn.h", "extensions":[]},
+        "dlerror": {"id_type":"function", "header":"dlfcn.h", "extensions":[]},
+        "dlopen": {"id_type":"function", "header":"dlfcn.h", "extensions":[]},
+        "dlsym": {"id_type":"function", "header":"dlfcn.h", "extensions":[]},
+        "dprintf": {"id_type":"function", "header":"stdio.h", "extensions":["CX"], "notes":{"variadic-plugin":true}},
+        "drand48": {"id_type":"function", "header":"stdlib.h", "extensions":["XSI"]},
+        "dup": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "dup2": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "duplocale": {"id_type":"function", "header":"locale.h", "extensions":["CX"]},
+        "E2BIG": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EACCES": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EADDRINUSE": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EADDRNOTAVAIL": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EAFNOSUPPORT": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EAGAIN": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EAI_AGAIN": {"id_type":"constant", "header":"netdb.h", "extensions":[]},
+        "EAI_BADFLAGS": {"id_type":"constant", "header":"netdb.h", "extensions":[]},
+        "EAI_FAIL": {"id_type":"constant", "header":"netdb.h", "extensions":[]},
+        "EAI_FAMILY": {"id_type":"constant", "header":"netdb.h", "extensions":[]},
+        "EAI_MEMORY": {"id_type":"constant", "header":"netdb.h", "extensions":[]},
+        "EAI_NONAME": {"id_type":"constant", "header":"netdb.h", "extensions":[]},
+        "EAI_OVERFLOW": {"id_type":"constant", "header":"netdb.h", "extensions":[]},
+        "EAI_SERVICE": {"id_type":"constant", "header":"netdb.h", "extensions":[]},
+        "EAI_SOCKTYPE": {"id_type":"constant", "header":"netdb.h", "extensions":[]},
+        "EAI_SYSTEM": {"id_type":"constant", "header":"netdb.h", "extensions":[]},
+        "EALREADY": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EBADF": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EBADMSG": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EBUSY": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ECANCELED": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ECHILD": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ECHO": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "ECHOE": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "ECHOK": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "ECHONL": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "ECONNABORTED": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ECONNREFUSED": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ECONNRESET": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EDEADLK": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EDESTADDRREQ": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EDOM": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EDQUOT": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EEXIST": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EFAULT": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EFBIG": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EHOSTUNREACH": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EIDRM": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EILSEQ": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EINPROGRESS": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EINTR": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EINVAL": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EIO": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EISCONN": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EISDIR": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ELOOP": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EMFILE": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EMLINK": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EMPTY": {"id_type":"constant", "header":"utmpx.h", "extensions":[]},
+        "EMSGSIZE": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EMULTIHOP": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ENAMETOOLONG": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "encrypt": {"id_type":"function", "header":"unistd.h", "extensions":["XSI"]},
+        "endgrent": {"id_type":"function", "header":"grp.h", "extensions":["XSI"]},
+        "endhostent": {"id_type":"function", "header":"netdb.h", "extensions":[]},
+        "endnetent": {"id_type":"function", "header":"netdb.h", "extensions":[]},
+        "endprotoent": {"id_type":"function", "header":"netdb.h", "extensions":[]},
+        "endpwent": {"id_type":"function", "header":"pwd.h", "extensions":["XSI"]},
+        "endservent": {"id_type":"function", "header":"netdb.h", "extensions":[]},
+        "endutxent": {"id_type":"function", "header":"utmpx.h", "extensions":[]},
+        "ENETDOWN": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ENETRESET": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ENETUNREACH": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ENFILE": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ENOBUFS": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ENODATA": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ENODEV": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ENOENT": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ENOEXEC": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ENOLCK": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ENOLINK": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ENOMEM": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ENOMSG": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ENOPROTOOPT": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ENOSPC": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ENOSR": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ENOSTR": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ENOSYS": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ENOTCONN": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ENOTDIR": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ENOTEMPTY": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ENOTRECOVERABLE": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ENOTSOCK": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ENOTSUP": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ENOTTY": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ENTRY": {"id_type":"type", "header":"search.h", "extensions":[]},
+        "entry": {"id_type":"type", "header":"search.h", "extensions":[]},
+        "ENXIO": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EOF": {"id_type":"macro", "header":"stdio.h", "extensions":[]},
+        "EOPNOTSUPP": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EOVERFLOW": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EOWNERDEAD": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EPERM": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EPIPE": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EPROTO": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EPROTONOSUPPORT": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EPROTOTYPE": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "erand48": {"id_type":"function", "header":"stdlib.h", "extensions":["XSI"]},
+        "ERANGE": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "erf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "erfc": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "erfcf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "erfcl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "erff": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "erfl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "EROFS": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "errno": {"id_type":"macroOrIdentifier", "header":"errno.h", "extensions":[]},
+        "ESPIPE": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ESRCH": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ESTALE": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ETIME": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ETIMEDOUT": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "ETXTBSY": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EWOULDBLOCK": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "EXDEV": {"id_type":"macro", "header":"errno.h", "extensions":[]},
+        "execl": {"id_type":"function", "header":"unistd.h", "extensions":[], "notes":{"variadic-plugin":true}},
+        "execle": {"id_type":"function", "header":"unistd.h", "extensions":[], "notes":{"variadic-plugin":true}},
+        "execlp": {"id_type":"function", "header":"unistd.h", "extensions":[], "notes":{"variadic-plugin":true}},
+        "execv": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "execve": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "execvp": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "exit": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "EXIT_FAILURE": {"id_type":"macro", "header":"stdlib.h", "extensions":[]},
+        "EXIT_SUCCESS": {"id_type":"macro", "header":"stdlib.h", "extensions":[]},
+        "exp": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "exp2": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "exp2f": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "exp2l": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "expf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "expl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "expm1": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "expm1f": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "expm1l": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "F_DUPFD": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "F_DUPFD_CLOEXEC": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "F_GETFD": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "F_GETFL": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "F_GETLK": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "F_GETOWN": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "F_LOCK": {"id_type":"constant", "header":"unistd.h", "extensions":["XSI"]},
+        "F_OK": {"id_type":"constant", "header":"unistd.h", "extensions":[]},
+        "F_SETFD": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "F_SETFL": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "F_SETLK": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "F_SETLKW": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "F_SETOWN": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "F_TEST": {"id_type":"constant", "header":"unistd.h", "extensions":["XSI"]},
+        "F_TLOCK": {"id_type":"constant", "header":"unistd.h", "extensions":["XSI"]},
+        "F_ULOCK": {"id_type":"constant", "header":"unistd.h", "extensions":["XSI"]},
+        "fabs": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "fabsf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "fabsl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "faccessat": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "false": {"id_type":"macro", "header":"stdbool.h", "extensions":[]},
+        "fattach": {"id_type":"function", "header":"stropts.h", "extensions":[]},
+        "fchdir": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "fchmod": {"id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
+        "fchmodat": {"id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
+        "fchown": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "fchownat": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "fclose": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "fcntl": {"id_type":"function", "header":"fcntl.h", "extensions":[], "notes":{"variadic-plugin":true}},
+        "FD_CLOEXEC": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "FD_CLR": {"id_type":"function", "header":"sys/select.h", "extensions":[]},
+        "FD_ISSET": {"id_type":"function", "header":"sys/select.h", "extensions":[]},
+        "FD_SET": {"id_type":"function", "header":"sys/select.h", "extensions":[]},
+        "fd_set": {"id_type":"type", "header":"sys/select.h", "extensions":[]},
+        "FD_SETSIZE": {"id_type":"constant", "header":"sys/select.h", "extensions":[]},
+        "FD_ZERO": {"id_type":"function", "header":"sys/select.h", "extensions":[]},
+        "fdatasync": {"id_type":"function", "header":"unistd.h", "extensions":["SIO"]},
+        "fdetach": {"id_type":"function", "header":"stropts.h", "extensions":[]},
+        "fdim": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "fdimf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "fdiml": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "fdopen": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "fdopendir": {"id_type":"function", "header":"dirent.h", "extensions":[]},
+        "feclearexcept": {"id_type":"function", "header":"fenv.h", "extensions":[]},
+        "fegetenv": {"id_type":"function", "header":"fenv.h", "extensions":[]},
+        "fegetexceptflag": {"id_type":"function", "header":"fenv.h", "extensions":[]},
+        "fegetround": {"id_type":"function", "header":"fenv.h", "extensions":[]},
+        "feholdexcept": {"id_type":"function", "header":"fenv.h", "extensions":[]},
+        "fenv_t": {"id_type":"type", "header":"fenv.h", "extensions":[]},
+        "feof": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "feraiseexcept": {"id_type":"function", "header":"fenv.h", "extensions":[]},
+        "ferror": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "fesetenv": {"id_type":"function", "header":"fenv.h", "extensions":[]},
+        "fesetexceptflag": {"id_type":"function", "header":"fenv.h", "extensions":[]},
+        "fesetround": {"id_type":"function", "header":"fenv.h", "extensions":[]},
+        "fetestexcept": {"id_type":"function", "header":"fenv.h", "extensions":[]},
+        "feupdateenv": {"id_type":"function", "header":"fenv.h", "extensions":[]},
+        "fexcept_t": {"id_type":"type", "header":"fenv.h", "extensions":[]},
+        "fexecve": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "FFDLY": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "fflush": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "ffs": {"id_type":"function", "header":"strings.h", "extensions":["XSI"]},
+        "fgetc": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "fgetpos": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "fgets": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "fgetwc": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "fgetws": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "FILE": {"id_type":"type", "header":"stdio.h", "extensions":["CX"]},
+        "FILENAME_MAX": {"id_type":"macro", "header":"stdio.h", "extensions":[]},
+        "fileno": {"id_type":"function", "header":"stdio.h", "extensions":["CX"]},
+        "flock": {"id_type":"type", "header":"fcntl.h", "extensions":[]},
+        "flockfile": {"id_type":"function", "header":"stdio.h", "extensions":["CX"]},
+        "floor": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "floorf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "floorl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "fma": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "fmaf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "fmal": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "fmax": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "fmaxf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "fmaxl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "fmemopen": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "fmin": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "fminf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "fminl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "fmod": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "fmodf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "fmodl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "fmtmsg": {"id_type":"function", "header":"fmtmsg.h", "extensions":[]},
+        "FNM_NOESCAPE": {"id_type":"constant", "header":"fnmatch.h", "extensions":[]},
+        "FNM_NOMATCH": {"id_type":"constant", "header":"fnmatch.h", "extensions":[]},
+        "FNM_PATHNAME": {"id_type":"constant", "header":"fnmatch.h", "extensions":[]},
+        "FNM_PERIOD": {"id_type":"constant", "header":"fnmatch.h", "extensions":[]},
+        "fnmatch": {"id_type":"function", "header":"fnmatch.h", "extensions":[]},
+        "fopen": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "FOPEN_MAX": {"id_type":"macro", "header":"stdio.h", "extensions":[]},
+        "fork": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "fpathconf": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "fpclassify": {"id_type":"macro", "header":"math.h", "extensions":[]},
+        "fpos_t": {"id_type":"type", "header":"stdio.h", "extensions":[]},
+        "fprintf": {"id_type":"function", "header":"stdio.h", "extensions":[], "notes":{"variadic-plugin":true}},
+        "fputc": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "fputs": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "fputwc": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "fputws": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "fread": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "free": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "freeaddrinfo": {"id_type":"function", "header":"netdb.h", "extensions":[]},
+        "freelocale": {"id_type":"function", "header":"locale.h", "extensions":["CX"]},
+        "freopen": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "frexp": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "frexpf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "frexpl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "fsblkcnt_t": {"id_type":"type", "header":"sys/types.h", "extensions":[]},
+        "fscanf": {"id_type":"function", "header":"stdio.h", "extensions":[], "notes":{"variadic-plugin":true}},
+        "fseek": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "fseeko": {"id_type":"function", "header":"stdio.h", "extensions":["CX"]},
+        "fsetpos": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "fsfilcnt_t": {"id_type":"type", "header":"sys/types.h", "extensions":[]},
+        "fstat": {"id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
+        "fstatat": {"id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
+        "fstatvfs": {"id_type":"function", "header":"sys/statvfs.h", "extensions":[]},
+        "fsync": {"id_type":"function", "header":"unistd.h", "extensions":["FSC"]},
+        "ftell": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "ftello": {"id_type":"function", "header":"stdio.h", "extensions":["CX"]},
+        "ftok": {"id_type":"function", "header":"sys/ipc.h", "extensions":[]},
+        "ftruncate": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "ftrylockfile": {"id_type":"function", "header":"stdio.h", "extensions":["CX"]},
+        "ftw": {"id_type":"function", "header":"ftw.h", "extensions":["OB"]},
+        "FTW": {"id_type":"type", "header":"ftw.h", "extensions":["OB"]},
+        "FTW_CHDIR": {"id_type":"constant", "header":"ftw.h", "extensions":["OB"]},
+        "FTW_D": {"id_type":"constant", "header":"ftw.h", "extensions":["OB"]},
+        "FTW_DEPTH": {"id_type":"constant", "header":"ftw.h", "extensions":["OB"]},
+        "FTW_DNR": {"id_type":"constant", "header":"ftw.h", "extensions":["OB"]},
+        "FTW_DP": {"id_type":"constant", "header":"ftw.h", "extensions":["OB"]},
+        "FTW_F": {"id_type":"constant", "header":"ftw.h", "extensions":["OB"]},
+        "FTW_MOUNT": {"id_type":"constant", "header":"ftw.h", "extensions":["OB"]},
+        "FTW_NS": {"id_type":"constant", "header":"ftw.h", "extensions":["OB"]},
+        "FTW_PHYS": {"id_type":"constant", "header":"ftw.h", "extensions":["OB"]},
+        "FTW_SL": {"id_type":"constant", "header":"ftw.h", "extensions":["OB"]},
+        "FTW_SLN": {"id_type":"constant", "header":"ftw.h", "extensions":["OB"]},
+        "funlockfile": {"id_type":"function", "header":"stdio.h", "extensions":["CX"]},
+        "futimens": {"id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
+        "fwide": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "fwprintf": {"id_type":"function", "header":"wchar.h", "extensions":[], "notes":{"variadic-plugin":true}},
+        "fwrite": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "fwscanf": {"id_type":"function", "header":"wchar.h", "extensions":[], "notes":{"variadic-plugin":true}},
+        "gai_strerror": {"id_type":"function", "header":"netdb.h", "extensions":[]},
+        "getaddrinfo": {"id_type":"function", "header":"netdb.h", "extensions":["IP6"]},
+        "GETALL": {"id_type":"constant", "header":"sys/sem.h", "extensions":[]},
+        "getc": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "getc_unlocked": {"id_type":"function", "header":"stdio.h", "extensions":["CX"]},
+        "getchar": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "getchar_unlocked": {"id_type":"function", "header":"stdio.h", "extensions":["CX"]},
+        "getcwd": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "getdate": {"id_type":"function", "header":"time.h", "extensions":["IP6"]},
+        "getdelim": {"id_type":"function", "header":"stdio.h", "extensions":["CX"]},
+        "getegid": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "getenv": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "geteuid": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "getgid": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "getgrent": {"id_type":"function", "header":"grp.h", "extensions":[]},
+        "getgrgid": {"id_type":"function", "header":"grp.h", "extensions":[]},
+        "getgrgid_r": {"id_type":"function", "header":"grp.h", "extensions":[]},
+        "getgrnam": {"id_type":"function", "header":"grp.h", "extensions":[]},
+        "getgrnam_r": {"id_type":"function", "header":"grp.h", "extensions":[]},
+        "getgroups": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "gethostbyaddr": {"id_type":"function", "header":"netdb.h", "extensions":["OB","REM"]},
+        "gethostbyname": {"id_type":"function", "header":"netdb.h", "extensions":["OB","REM"]},
+        "gethostent": {"id_type":"function", "header":"netdb.h", "extensions":[]},
+        "gethostid": {"id_type":"function", "header":"unistd.h", "extensions":["XSI"]},
+        "gethostname": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "getitimer": {"id_type":"function", "header":"sys/time.h", "extensions":["IP6"]},
+        "getline": {"id_type":"function", "header":"stdio.h", "extensions":["CX"]},
+        "getlogin": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "getlogin_r": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "getmsg": {"id_type":"function", "header":"stropts.h", "extensions":[]},
+        "getnameinfo": {"id_type":"function", "header":"netdb.h", "extensions":[]},
+        "GETNCNT": {"id_type":"constant", "header":"sys/sem.h", "extensions":[]},
+        "getnetbyaddr": {"id_type":"function", "header":"netdb.h", "extensions":[]},
+        "getnetbyname": {"id_type":"function", "header":"netdb.h", "extensions":[]},
+        "getnetent": {"id_type":"function", "header":"netdb.h", "extensions":[]},
+        "getopt": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "getpeername": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
+        "getpgid": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "getpgrp": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "GETPID": {"id_type":"constant", "header":"sys/sem.h", "extensions":[]},
+        "getpid": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "getpmsg": {"id_type":"function", "header":"stropts.h", "extensions":[]},
+        "getppid": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "getpriority": {"id_type":"function", "header":"sys/resource.h", "extensions":[]},
+        "getprotobyname": {"id_type":"function", "header":"netdb.h", "extensions":[]},
+        "getprotobynumber": {"id_type":"function", "header":"netdb.h", "extensions":[]},
+        "getprotoent": {"id_type":"function", "header":"netdb.h", "extensions":[]},
+        "getpwent": {"id_type":"function", "header":"pwd.h", "extensions":[]},
+        "getpwnam": {"id_type":"function", "header":"pwd.h", "extensions":[]},
+        "getpwnam_r": {"id_type":"function", "header":"pwd.h", "extensions":[]},
+        "getpwuid": {"id_type":"function", "header":"pwd.h", "extensions":[]},
+        "getpwuid_r": {"id_type":"function", "header":"pwd.h", "extensions":[]},
+        "getrlimit": {"id_type":"function", "header":"sys/resource.h", "extensions":[]},
+        "getrusage": {"id_type":"function", "header":"sys/resource.h", "extensions":[]},
+        "gets": {"id_type":"function", "header":"stdio.h", "extensions":["OB"]},
+        "getservbyname": {"id_type":"function", "header":"netdb.h", "extensions":[]},
+        "getservbyport": {"id_type":"function", "header":"netdb.h", "extensions":[]},
+        "getservent": {"id_type":"function", "header":"netdb.h", "extensions":[]},
+        "getsid": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "getsockname": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
+        "getsockopt": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
+        "getsubopt": {"id_type":"function", "header":"stdlib.h", "extensions":["CX"]},
+        "gettimeofday": {"id_type":"function", "header":"sys/time.h", "extensions":["IP6"]},
+        "getuid": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "getutxent": {"id_type":"function", "header":"utmpx.h", "extensions":[]},
+        "getutxid": {"id_type":"function", "header":"utmpx.h", "extensions":[]},
+        "getutxline": {"id_type":"function", "header":"utmpx.h", "extensions":[]},
+        "GETVAL": {"id_type":"constant", "header":"sys/sem.h", "extensions":[]},
+        "getwc": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "getwchar": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "GETZCNT": {"id_type":"constant", "header":"sys/sem.h", "extensions":[]},
+        "gid_t": {"id_type":"type", "header":"sys/types.h", "extensions":[]},
+        "glob": {"id_type":"function", "header":"glob.h", "extensions":[]},
+        "GLOB_ABORTED": {"id_type":"constant", "header":"glob.h", "extensions":[]},
+        "GLOB_APPEND": {"id_type":"constant", "header":"glob.h", "extensions":[]},
+        "GLOB_DOOFFS": {"id_type":"constant", "header":"glob.h", "extensions":[]},
+        "GLOB_ERR": {"id_type":"constant", "header":"glob.h", "extensions":[]},
+        "GLOB_MARK": {"id_type":"constant", "header":"glob.h", "extensions":[]},
+        "GLOB_NOCHECK": {"id_type":"constant", "header":"glob.h", "extensions":[]},
+        "GLOB_NOESCAPE": {"id_type":"constant", "header":"glob.h", "extensions":[]},
+        "GLOB_NOMATCH": {"id_type":"constant", "header":"glob.h", "extensions":[]},
+        "GLOB_NOSORT": {"id_type":"constant", "header":"glob.h", "extensions":[]},
+        "GLOB_NOSPACE": {"id_type":"constant", "header":"glob.h", "extensions":[]},
+        "glob_t": {"id_type":"type", "header":"glob.h", "extensions":[]},
+        "globfree": {"id_type":"function", "header":"glob.h", "extensions":[]},
+        "gmtime": {"id_type":"function", "header":"time.h", "extensions":["IP6"]},
+        "gmtime_r": {"id_type":"function", "header":"time.h", "extensions":["IP6"]},
+        "grantpt": {"id_type":"function", "header":"stdlib.h", "extensions":["XSI"]},
+        "group": {"id_type":"type", "header":"grp.h", "extensions":["XSI"]},
+        "h_errno": {"id_type":"macroOrIdentifier", "header":"netdb.h", "extensions":["OB","REM"]},
+        "hcreate": {"id_type":"function", "header":"search.h", "extensions":[]},
+        "hdestroy": {"id_type":"function", "header":"search.h", "extensions":[]},
+        "hostent": {"id_type":"type", "header":"netdb.h", "extensions":[]},
+        "hsearch": {"id_type":"function", "header":"search.h", "extensions":[]},
+        "htonl": {"id_type":"function", "header":"arpa/inet.h", "extensions":[]},
+        "htons": {"id_type":"function", "header":"arpa/inet.h", "extensions":[]},
+        "HUGE_VAL": {"id_type":"macro", "header":"math.h", "extensions":[]},
+        "HUGE_VALF": {"id_type":"macro", "header":"math.h", "extensions":[]},
+        "HUGE_VALL": {"id_type":"macro", "header":"math.h", "extensions":[]},
+        "HUPCL": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "hypot": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "hypotf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "hypotl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "I": {"id_type":"macro", "header":"complex.h", "extensions":[]},
+        "ICANON": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "iconv": {"id_type":"function", "header":"iconv.h", "extensions":[]},
+        "iconv_close": {"id_type":"function", "header":"iconv.h", "extensions":[]},
+        "iconv_open": {"id_type":"function", "header":"iconv.h", "extensions":[]},
+        "iconv_t": {"id_type":"type", "header":"iconv.h", "extensions":[]},
+        "ICRNL": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "id_t": {"id_type":"type", "header":"sys/types.h", "extensions":[]},
+        "IEXTEN": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "if_freenameindex": {"id_type":"function", "header":"net/if.h", "extensions":[]},
+        "if_indextoname": {"id_type":"function", "header":"net/if.h", "extensions":[]},
+        "if_nameindex": {"id_type":"function", "header":"net/if.h", "extensions":[]},
+        "IF_NAMESIZE": {"id_type":"constant", "header":"net/if.h", "extensions":[]},
+        "if_nametoindex": {"id_type":"function", "header":"net/if.h", "extensions":[]},
+        "IGNBRK": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "IGNCR": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "IGNPAR": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "ilogb": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "ilogbf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "ilogbl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "imaginary": {"id_type":"macro", "header":"complex.h", "extensions":[]},
+        "imaxabs": {"id_type":"function", "header":"inttypes.h", "extensions":[]},
+        "imaxdiv": {"id_type":"function", "header":"inttypes.h", "extensions":[]},
+        "in6_addr": {"id_type":"type", "header":"netinet/in.h", "extensions":["IP6"]},
+        "IN6_IS_ADDR_LINKLOCAL": {"id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
+        "IN6_IS_ADDR_LOOPBACK": {"id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
+        "IN6_IS_ADDR_MC_GLOBAL": {"id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
+        "IN6_IS_ADDR_MC_LINKLOCAL": {"id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
+        "IN6_IS_ADDR_MC_NODELOCAL": {"id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
+        "IN6_IS_ADDR_MC_ORGLOCAL": {"id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
+        "IN6_IS_ADDR_MC_SITELOCAL": {"id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
+        "IN6_IS_ADDR_MULTICAST": {"id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
+        "IN6_IS_ADDR_SITELOCAL": {"id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
+        "IN6_IS_ADDR_UNSPECIFIED": {"id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
+        "IN6_IS_ADDR_V4COMPAT": {"id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
+        "IN6_IS_ADDR_V4MAPPED": {"id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
+        "in6addr_any": {"id_type":"variable", "header":"netinet/in.h", "extensions":["IP6"]},
+        "in6addr_loopback": {"id_type":"variable", "header":"netinet/in.h", "extensions":["IP6"]},
+        "in_addr": {"id_type":"type", "header":"netinet/in.h", "extensions":[]},
+        "in_addr_t": {"id_type":"type", "header":"netinet/in.h", "extensions":[]},
+        "in_port_t": {"id_type":"type", "header":"netinet/in.h", "extensions":["IP6"]},
+        "INADDR_ANY": {"id_type":"constant", "header":"netinet/in.h", "extensions":[]},
+        "INADDR_BROADCAST": {"id_type":"constant", "header":"netinet/in.h", "extensions":[]},
+        "INET6_ADDRSTRLEN": {"id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
+        "inet_addr": {"id_type":"function", "header":"arpa/inet.h", "extensions":[]},
+        "INET_ADDRSTRLEN": {"id_type":"constant", "header":"netinet/in.h", "extensions":[]},
+        "inet_ntoa": {"id_type":"function", "header":"arpa/inet.h", "extensions":[]},
+        "inet_ntop": {"id_type":"function", "header":"arpa/inet.h", "extensions":[]},
+        "inet_pton": {"id_type":"function", "header":"arpa/inet.h", "extensions":[]},
+        "INFINITY": {"id_type":"macro", "header":"math.h", "extensions":[]},
+        "INIT_PROCESS": {"id_type":"constant", "header":"utmpx.h", "extensions":[]},
+        "initstate": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "INLCR": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "ino_t": {"id_type":"type", "header":"sys/types.h", "extensions":["XSI"]},
+        "INPCK": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "insque": {"id_type":"function", "header":"search.h", "extensions":[]},
+        "INT_MAX": {"id_type":"macro", "header":"limits.h", "extensions":[]},
+        "INT_MIN": {"id_type":"macro", "header":"limits.h", "extensions":[]},
+        "ioctl": {"id_type":"function", "header":"stropts.h", "extensions":["OB","XSR"], "notes":{"variadic-plugin":true}},
+        "iovec": {"id_type":"type", "header":"sys/uio.h", "extensions":["XSI"]},
+        "IPC_CREAT": {"id_type":"constant", "header":"sys/ipc.h", "extensions":[]},
+        "IPC_EXCL": {"id_type":"constant", "header":"sys/ipc.h", "extensions":[]},
+        "IPC_NOWAIT": {"id_type":"constant", "header":"sys/ipc.h", "extensions":[]},
+        "ipc_perm": {"id_type":"type", "header":"sys/ipc.h", "extensions":[]},
+        "IPPROTO_ICMP": {"id_type":"constant", "header":"netinet/in.h", "extensions":[]},
+        "IPPROTO_IP": {"id_type":"constant", "header":"netinet/in.h", "extensions":[]},
+        "IPPROTO_IPV6": {"id_type":"constant", "header":"netinet/in.h", "extensions":[]},
+        "IPPROTO_RAW": {"id_type":"constant", "header":"netinet/in.h", "extensions":[]},
+        "IPPROTO_TCP": {"id_type":"constant", "header":"netinet/in.h", "extensions":[]},
+        "IPPROTO_UDP": {"id_type":"constant", "header":"netinet/in.h", "extensions":[]},
+        "IPV6_JOIN_GROUP": {"id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
+        "IPV6_LEAVE_GROUP": {"id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
+        "ipv6_mreq": {"id_type":"type", "header":"netinet/in.h", "extensions":["IP6"]},
+        "IPV6_MULTICAST_HOPS": {"id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
+        "IPV6_MULTICAST_IF": {"id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
+        "IPV6_MULTICAST_LOOP": {"id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
+        "IPV6_UNICAST_HOPS": {"id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
+        "IPV6_V6ONLY": {"id_type":"constant", "header":"netinet/in.h", "extensions":["IP6"]},
+        "isalnum": {"id_type":"function", "header":"ctype.h", "extensions":[]},
+        "isalnum_l": {"id_type":"function", "header":"ctype.h", "extensions":["CX"]},
+        "isalpha": {"id_type":"function", "header":"ctype.h", "extensions":[]},
+        "isalpha_l": {"id_type":"function", "header":"ctype.h", "extensions":["CX"]},
+        "isascii": {"id_type":"function", "header":"ctype.h", "extensions":["OB","XSI"]},
+        "isastream": {"id_type":"function", "header":"stropts.h", "extensions":[]},
+        "isatty": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "isblank": {"id_type":"function", "header":"ctype.h", "extensions":[]},
+        "isblank_l": {"id_type":"function", "header":"ctype.h", "extensions":["CX"]},
+        "iscntrl": {"id_type":"function", "header":"ctype.h", "extensions":[]},
+        "iscntrl_l": {"id_type":"function", "header":"ctype.h", "extensions":["CX"]},
+        "isdigit": {"id_type":"function", "header":"ctype.h", "extensions":[]},
+        "isdigit_l": {"id_type":"function", "header":"ctype.h", "extensions":["CX"]},
+        "isfinite": {"id_type":"macro", "header":"math.h", "extensions":[]},
+        "isgraph": {"id_type":"function", "header":"ctype.h", "extensions":[]},
+        "isgraph_l": {"id_type":"function", "header":"ctype.h", "extensions":["CX"]},
+        "isgreater": {"id_type":"macro", "header":"math.h", "extensions":[]},
+        "isgreaterequal": {"id_type":"macro", "header":"math.h", "extensions":[]},
+        "ISIG": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "isinf": {"id_type":"macro", "header":"math.h", "extensions":[]},
+        "isless": {"id_type":"macro", "header":"math.h", "extensions":[]},
+        "islessequal": {"id_type":"macro", "header":"math.h", "extensions":[]},
+        "islessgreater": {"id_type":"macro", "header":"math.h", "extensions":[]},
+        "islower": {"id_type":"function", "header":"ctype.h", "extensions":[]},
+        "islower_l": {"id_type":"function", "header":"ctype.h", "extensions":["CX"]},
+        "isnan": {"id_type":"macro", "header":"math.h", "extensions":[]},
+        "isnormal": {"id_type":"macro", "header":"math.h", "extensions":[]},
+        "isprint": {"id_type":"function", "header":"ctype.h", "extensions":[]},
+        "isprint_l": {"id_type":"function", "header":"ctype.h", "extensions":["CX"]},
+        "ispunct": {"id_type":"function", "header":"ctype.h", "extensions":[]},
+        "ispunct_l": {"id_type":"function", "header":"ctype.h", "extensions":["CX"]},
+        "isspace": {"id_type":"function", "header":"ctype.h", "extensions":[]},
+        "isspace_l": {"id_type":"function", "header":"ctype.h", "extensions":["CX"]},
+        "ISTRIP": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "isunordered": {"id_type":"macro", "header":"math.h", "extensions":[]},
+        "isupper": {"id_type":"function", "header":"ctype.h", "extensions":[]},
+        "isupper_l": {"id_type":"function", "header":"ctype.h", "extensions":["CX"]},
+        "iswalnum": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "iswalnum_l": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "iswalpha": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "iswalpha_l": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "iswblank": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "iswblank_l": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "iswcntrl": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "iswcntrl_l": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "iswctype": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "iswctype_l": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "iswdigit": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "iswdigit_l": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "iswgraph": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "iswgraph_l": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "iswlower": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "iswlower_l": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "iswprint": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "iswprint_l": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "iswpunct": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "iswpunct_l": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "iswspace": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "iswspace_l": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "iswupper": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "iswupper_l": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "iswxdigit": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "iswxdigit_l": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "isxdigit": {"id_type":"function", "header":"ctype.h", "extensions":[]},
+        "isxdigit_l": {"id_type":"function", "header":"ctype.h", "extensions":["CX"]},
+        "ITIMER_PROF": {"id_type":"constant", "header":"sys/time.h", "extensions":["IP6"]},
+        "ITIMER_REAL": {"id_type":"constant", "header":"sys/time.h", "extensions":["IP6"]},
+        "ITIMER_VIRTUAL": {"id_type":"constant", "header":"sys/time.h", "extensions":["IP6"]},
+        "itimerspec": {"id_type":"type", "header":"time.h", "extensions":["IP6"]},
+        "itimerval": {"id_type":"type", "header":"sys/time.h", "extensions":["IP6"]},
+        "IXANY": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "IXOFF": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "IXON": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "j0": {"id_type":"function", "header":"math.h", "extensions":["XSI"]},
+        "j1": {"id_type":"function", "header":"math.h", "extensions":["XSI"]},
+        "jn": {"id_type":"function", "header":"math.h", "extensions":["XSI"]},
+        "jrand48": {"id_type":"function", "header":"stdlib.h", "extensions":["XSI"]},
+        "key_t": {"id_type":"type", "header":"sys/types.h", "extensions":[]},
+        "kill": {"id_type":"function", "header":"signal.h", "extensions":[]},
+        "killpg": {"id_type":"function", "header":"signal.h", "extensions":[]},
+        "l64a": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "L_ctermid": {"id_type":"type", "header":"stdio.h", "extensions":[]},
+        "L_tmpnam": {"id_type":"type", "header":"stdio.h", "extensions":[]},
+        "labs": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "lchown": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "lcong48": {"id_type":"function", "header":"stdlib.h", "extensions":["XSI"]},
+        "lconv": {"id_type":"type", "header":"locale.h", "extensions":[]},
+        "ldexp": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "ldexpf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "ldexpl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "ldiv": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "ldiv_t": {"id_type":"type", "header":"stdlib.h", "extensions":[]},
+        "lfind": {"id_type":"function", "header":"search.h", "extensions":[]},
+        "lgamma": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "lgammaf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "lgammal": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "linger": {"id_type":"type", "header":"sys/socket.h", "extensions":["IP6"]},
+        "link": {"id_type":"function", "header":"unistd.h", "extensions":["IP6"]},
+        "linkat": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "lio_listio": {"id_type":"function", "header":"aio.h", "extensions":[]},
+        "LIO_NOP": {"id_type":"constant", "header":"aio.h", "extensions":[]},
+        "LIO_NOWAIT": {"id_type":"constant", "header":"aio.h", "extensions":[]},
+        "LIO_READ": {"id_type":"constant", "header":"aio.h", "extensions":[]},
+        "LIO_WAIT": {"id_type":"constant", "header":"aio.h", "extensions":[]},
+        "LIO_WRITE": {"id_type":"constant", "header":"aio.h", "extensions":[]},
+        "listen": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
+        "llabs": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "lldiv": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "lldiv_t": {"id_type":"type", "header":"stdlib.h", "extensions":[]},
+        "LLONG_MAX": {"id_type":"macro", "header":"limits.h", "extensions":[]},
+        "LLONG_MIN": {"id_type":"macro", "header":"limits.h", "extensions":[]},
+        "llrint": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "llrintf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "llrintl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "llround": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "llroundf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "llroundl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "locale_t": {"id_type":"type", "header":"wchar.h", "extensions":["CX"]},
+        "localeconv": {"id_type":"function", "header":"locale.h", "extensions":[]},
+        "localtime": {"id_type":"function", "header":"time.h", "extensions":["IP6"]},
+        "localtime_r": {"id_type":"function", "header":"time.h", "extensions":["IP6"]},
+        "lockf": {"id_type":"function", "header":"unistd.h", "extensions":["XSI"]},
+        "log": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "log10": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "log10f": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "log10l": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "log1p": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "log1pf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "log1pl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "log2": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "log2f": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "log2l": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "LOG_ALERT": {"id_type":"macro", "header":"syslog.h", "extensions":[]},
+        "LOG_AUTH": {"id_type":"constant", "header":"syslog.h", "extensions":[]},
+        "LOG_CONS": {"id_type":"constant", "header":"syslog.h", "extensions":[]},
+        "LOG_CRIT": {"id_type":"macro", "header":"syslog.h", "extensions":[]},
+        "LOG_CRON": {"id_type":"constant", "header":"syslog.h", "extensions":[]},
+        "LOG_DAEMON": {"id_type":"constant", "header":"syslog.h", "extensions":[]},
+        "LOG_DEBUG": {"id_type":"macro", "header":"syslog.h", "extensions":[]},
+        "LOG_EMERG": {"id_type":"macro", "header":"syslog.h", "extensions":[]},
+        "LOG_ERR": {"id_type":"macro", "header":"syslog.h", "extensions":[]},
+        "LOG_INFO": {"id_type":"macro", "header":"syslog.h", "extensions":[]},
+        "LOG_KERN": {"id_type":"constant", "header":"syslog.h", "extensions":[]},
+        "LOG_LOCAL0": {"id_type":"constant", "header":"syslog.h", "extensions":[]},
+        "LOG_LOCAL1": {"id_type":"constant", "header":"syslog.h", "extensions":[]},
+        "LOG_LOCAL2": {"id_type":"constant", "header":"syslog.h", "extensions":[]},
+        "LOG_LOCAL3": {"id_type":"constant", "header":"syslog.h", "extensions":[]},
+        "LOG_LOCAL4": {"id_type":"constant", "header":"syslog.h", "extensions":[]},
+        "LOG_LOCAL5": {"id_type":"constant", "header":"syslog.h", "extensions":[]},
+        "LOG_LOCAL6": {"id_type":"constant", "header":"syslog.h", "extensions":[]},
+        "LOG_LOCAL7": {"id_type":"constant", "header":"syslog.h", "extensions":[]},
+        "LOG_LPR": {"id_type":"constant", "header":"syslog.h", "extensions":[]},
+        "LOG_MAIL": {"id_type":"constant", "header":"syslog.h", "extensions":[]},
+        "LOG_MASK": {"id_type":"macro", "header":"syslog.h", "extensions":[]},
+        "LOG_NDELAY": {"id_type":"constant", "header":"syslog.h", "extensions":[]},
+        "LOG_NEWS": {"id_type":"constant", "header":"syslog.h", "extensions":[]},
+        "LOG_NOTICE": {"id_type":"macro", "header":"syslog.h", "extensions":[]},
+        "LOG_NOWAIT": {"id_type":"constant", "header":"syslog.h", "extensions":[]},
+        "LOG_ODELAY": {"id_type":"constant", "header":"syslog.h", "extensions":[]},
+        "LOG_PID": {"id_type":"constant", "header":"syslog.h", "extensions":[]},
+        "LOG_USER": {"id_type":"constant", "header":"syslog.h", "extensions":[]},
+        "LOG_UUCP": {"id_type":"constant", "header":"syslog.h", "extensions":[]},
+        "LOG_WARNING": {"id_type":"macro", "header":"syslog.h", "extensions":[]},
+        "logb": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "logbf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "logbl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "logf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "LOGIN_PROCESS": {"id_type":"constant", "header":"utmpx.h", "extensions":[]},
+        "logl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "LONG_BIT": {"id_type":"macro", "header":"limits.h", "extensions":[]},
+        "LONG_MAX": {"id_type":"macro", "header":"limits.h", "extensions":[]},
+        "LONG_MIN": {"id_type":"macro", "header":"limits.h", "extensions":[]},
+        "longjmp": {"id_type":"function", "header":"setjmp.h", "extensions":[]},
+        "lrand48": {"id_type":"function", "header":"stdlib.h", "extensions":["XSI"]},
+        "lrint": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "lrintf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "lrintl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "lround": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "lroundf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "lroundl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "lsearch": {"id_type":"function", "header":"search.h", "extensions":[]},
+        "lseek": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "lstat": {"id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
+        "M_1_PI": {"id_type":"constant", "header":"math.h", "extensions":[]},
+        "M_2_PI": {"id_type":"constant", "header":"math.h", "extensions":[]},
+        "M_2_SQRTPI": {"id_type":"constant", "header":"math.h", "extensions":[]},
+        "M_E": {"id_type":"constant", "header":"math.h", "extensions":[]},
+        "M_LN10": {"id_type":"constant", "header":"math.h", "extensions":[]},
+        "M_LN2": {"id_type":"constant", "header":"math.h", "extensions":[]},
+        "M_LOG10E": {"id_type":"constant", "header":"math.h", "extensions":[]},
+        "M_LOG2E": {"id_type":"constant", "header":"math.h", "extensions":[]},
+        "M_PI": {"id_type":"constant", "header":"math.h", "extensions":[]},
+        "M_PI_2": {"id_type":"constant", "header":"math.h", "extensions":[]},
+        "M_PI_4": {"id_type":"constant", "header":"math.h", "extensions":[]},
+        "M_SQRT1_2": {"id_type":"constant", "header":"math.h", "extensions":[]},
+        "M_SQRT2": {"id_type":"constant", "header":"math.h", "extensions":[]},
+        "malloc": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "MAP_FAILED": {"id_type":"constant", "header":"sys/mman.h", "extensions":[]},
+        "MAP_FIXED": {"id_type":"constant", "header":"sys/mman.h", "extensions":[]},
+        "MAP_PRIVATE": {"id_type":"constant", "header":"sys/mman.h", "extensions":[]},
+        "MAP_SHARED": {"id_type":"constant", "header":"sys/mman.h", "extensions":[]},
+        "MAXFLOAT": {"id_type":"constant", "header":"math.h", "extensions":[]},
+        "MB_CUR_MAX": {"id_type":"macro", "header":"stdlib.h", "extensions":[]},
+        "MB_LEN_MAX": {"id_type":"macro", "header":"limits.h", "extensions":[]},
+        "mblen": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "mbrlen": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "mbrtowc": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "mbsinit": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "mbsnrtowcs": {"id_type":"function", "header":"wchar.h", "extensions":["CX"]},
+        "mbsrtowcs": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "mbstate_t": {"id_type":"type", "header":"wchar.h", "extensions":["CX"]},
+        "mbstowcs": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "mbtowc": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "MCL_CURRENT": {"id_type":"constant", "header":"sys/mman.h", "extensions":["ML"]},
+        "MCL_FUTURE": {"id_type":"constant", "header":"sys/mman.h", "extensions":["ML"]},
+        "memccpy": {"id_type":"function", "header":"string.h", "extensions":[]},
+        "memchr": {"id_type":"function", "header":"string.h", "extensions":[]},
+        "memcmp": {"id_type":"function", "header":"string.h", "extensions":[]},
+        "memcpy": {"id_type":"function", "header":"string.h", "extensions":[]},
+        "memmove": {"id_type":"function", "header":"string.h", "extensions":[]},
+        "memset": {"id_type":"function", "header":"string.h", "extensions":[]},
+        "MINSIGSTKSZ": {"id_type":"macro", "header":"signal.h", "extensions":[]},
+        "mkdir": {"id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
+        "mkdirat": {"id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
+        "mkdtemp": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "mkfifo": {"id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
+        "mkfifoat": {"id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
+        "mknod": {"id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
+        "mknodat": {"id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
+        "mkstemp": {"id_type":"function", "header":"stdlib.h", "extensions":["CX"]},
+        "mktime": {"id_type":"function", "header":"time.h", "extensions":["IP6"]},
+        "mlock": {"id_type":"function", "header":"sys/mman.h", "extensions":["MLR"]},
+        "mlockall": {"id_type":"function", "header":"sys/mman.h", "extensions":["ML"]},
+        "MM_APPL": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]},
+        "MM_CONSOLE": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]},
+        "MM_ERROR": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]},
+        "MM_FIRM": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]},
+        "MM_HALT": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]},
+        "MM_HARD": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]},
+        "MM_INFO": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]},
+        "MM_NOSEV": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]},
+        "MM_NRECOV": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]},
+        "MM_OPSYS": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]},
+        "MM_PRINT": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]},
+        "MM_RECOVER": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]},
+        "MM_SOFT": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]},
+        "MM_UTIL": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]},
+        "MM_WARNING": {"id_type":"constant", "header":"fmtmsg.h", "extensions":[]},
+        "mmap": {"id_type":"function", "header":"sys/mman.h", "extensions":["TYM"]},
+        "mode_t": {"id_type":"type", "header":"sys/types.h", "extensions":[]},
+        "modf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "modff": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "modfl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "MORECTL": {"id_type":"constant", "header":"stropts.h", "extensions":[]},
+        "MOREDATA": {"id_type":"constant", "header":"stropts.h", "extensions":[]},
+        "mprotect": {"id_type":"function", "header":"sys/mman.h", "extensions":[]},
+        "mq_attr": {"id_type":"type", "header":"mqueue.h", "extensions":[]},
+        "mq_close": {"id_type":"function", "header":"mqueue.h", "extensions":[]},
+        "mq_getattr": {"id_type":"function", "header":"mqueue.h", "extensions":[]},
+        "mq_notify": {"id_type":"function", "header":"mqueue.h", "extensions":[]},
+        "mq_open": {"id_type":"function", "header":"mqueue.h", "extensions":[]},
+        "mq_receive": {"id_type":"function", "header":"mqueue.h", "extensions":[]},
+        "mq_send": {"id_type":"function", "header":"mqueue.h", "extensions":[]},
+        "mq_setattr": {"id_type":"function", "header":"mqueue.h", "extensions":[]},
+        "mq_timedreceive": {"id_type":"function", "header":"mqueue.h", "extensions":[]},
+        "mq_timedsend": {"id_type":"function", "header":"mqueue.h", "extensions":[]},
+        "mq_unlink": {"id_type":"function", "header":"mqueue.h", "extensions":[]},
+        "mrand48": {"id_type":"function", "header":"stdlib.h", "extensions":["XSI"]},
+        "MS_ASYNC": {"id_type":"constant", "header":"sys/mman.h", "extensions":["XSI","SIO"]},
+        "MS_INVALIDATE": {"id_type":"constant", "header":"sys/mman.h", "extensions":["XSI","SIO"]},
+        "MS_SYNC": {"id_type":"constant", "header":"sys/mman.h", "extensions":["XSI","SIO"]},
+        "MSG_ANY": {"id_type":"constant", "header":"stropts.h", "extensions":[]},
+        "MSG_BAND": {"id_type":"constant", "header":"stropts.h", "extensions":[]},
+        "MSG_CTRUNC": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "MSG_DONTROUTE": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "MSG_EOR": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "MSG_HIPRI": {"id_type":"constant", "header":"stropts.h", "extensions":[]},
+        "MSG_NOERROR": {"id_type":"constant", "header":"sys/msg.h", "extensions":[]},
+        "MSG_NOSIGNAL": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "MSG_OOB": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "MSG_PEEK": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "MSG_TRUNC": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "MSG_WAITALL": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "msgctl": {"id_type":"function", "header":"sys/msg.h", "extensions":[]},
+        "msgget": {"id_type":"function", "header":"sys/msg.h", "extensions":[]},
+        "msghdr": {"id_type":"type", "header":"sys/socket.h", "extensions":["IP6"]},
+        "msglen_t": {"id_type":"type", "header":"sys/msg.h", "extensions":[]},
+        "msgqnum_t": {"id_type":"type", "header":"sys/msg.h", "extensions":[]},
+        "msgrcv": {"id_type":"function", "header":"sys/msg.h", "extensions":[]},
+        "msgsnd": {"id_type":"function", "header":"sys/msg.h", "extensions":[]},
+        "msqid_ds": {"id_type":"type", "header":"sys/msg.h", "extensions":[]},
+        "msync": {"id_type":"function", "header":"sys/mman.h", "extensions":["XSI","SIO"]},
+        "munlock": {"id_type":"function", "header":"sys/mman.h", "extensions":["MLR"]},
+        "munlockall": {"id_type":"function", "header":"sys/mman.h", "extensions":["ML"]},
+        "munmap": {"id_type":"function", "header":"sys/mman.h", "extensions":[]},
+        "nan": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "NAN": {"id_type":"macro", "header":"math.h", "extensions":[]},
+        "nanf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "nanl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "nanosleep": {"id_type":"function", "header":"time.h", "extensions":["IP6"]},
+        "NCCS": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "nearbyint": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "nearbyintf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "nearbyintl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "netent": {"id_type":"type", "header":"netdb.h", "extensions":[]},
+        "NEW_TIME": {"id_type":"constant", "header":"utmpx.h", "extensions":[]},
+        "newlocale": {"id_type":"function", "header":"locale.h", "extensions":["CX"]},
+        "nextafter": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "nextafterf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "nextafterl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "nexttoward": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "nexttowardf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "nexttowardl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "nfds_t": {"id_type":"type", "header":"poll.h", "extensions":[]},
+        "nftw": {"id_type":"function", "header":"ftw.h", "extensions":["OB"]},
+        "NI_DGRAM": {"id_type":"constant", "header":"netdb.h", "extensions":[]},
+        "NI_NAMEREQD": {"id_type":"constant", "header":"netdb.h", "extensions":[]},
+        "NI_NOFQDN": {"id_type":"constant", "header":"netdb.h", "extensions":[]},
+        "NI_NUMERICHOST": {"id_type":"constant", "header":"netdb.h", "extensions":[]},
+        "NI_NUMERICSCOPE": {"id_type":"constant", "header":"netdb.h", "extensions":[]},
+        "NI_NUMERICSERV": {"id_type":"constant", "header":"netdb.h", "extensions":[]},
+        "nice": {"id_type":"function", "header":"unistd.h", "extensions":["XSI"]},
+        "NL_ARGMAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "nl_langinfo": {"id_type":"function", "header":"langinfo.h", "extensions":[]},
+        "nl_langinfo_l": {"id_type":"function", "header":"langinfo.h", "extensions":[]},
+        "NL_LANGMAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "NL_MSGMAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "NL_SETMAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "NL_TEXTMAX": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "NLDLY": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "nlink_t": {"id_type":"type", "header":"sys/types.h", "extensions":[]},
+        "NOFLSH": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "not": {"id_type":"macro", "header":"iso646.h", "extensions":["ADV"]},
+        "not_eq": {"id_type":"macro", "header":"iso646.h", "extensions":[]},
+        "nrand48": {"id_type":"function", "header":"stdlib.h", "extensions":["XSI"]},
+        "ntohl": {"id_type":"function", "header":"arpa/inet.h", "extensions":[]},
+        "ntohs": {"id_type":"function", "header":"arpa/inet.h", "extensions":[]},
+        "NULL": {"id_type":"macro", "header":"stddef.h", "extensions":[]},
+        "NZERO": {"id_type":"constant", "header":"limits.h", "extensions":[]},
+        "O_ACCMODE": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "O_APPEND": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "O_CLOEXEC": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "O_CREAT": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "O_DIRECTORY": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "O_DSYNC": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "O_EXCL": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "O_EXEC": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "O_NOCTTY": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "O_NOFOLLOW": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "O_NONBLOCK": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "O_RDONLY": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "O_RDWR": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "O_RSYNC": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "O_SEARCH": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "O_SYNC": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "O_TRUNC": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "O_TTY_INIT": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "O_WRONLY": {"id_type":"constant", "header":"fcntl.h", "extensions":[]},
+        "OCRNL": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "OFDEL": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "off_t": {"id_type":"type", "header":"stdio.h", "extensions":["CX"]},
+        "offsetof": {"id_type":"macro", "header":"stddef.h", "extensions":[]},
+        "OFILL": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "OLD_TIME": {"id_type":"constant", "header":"utmpx.h", "extensions":[]},
+        "ONLCR": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "ONLRET": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "ONOCR": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "open": {"id_type":"function", "header":"fcntl.h", "extensions":["ADV"], "notes":{"variadic-plugin":true}},
+        "open_memstream": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "open_wmemstream": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "openat": {"id_type":"function", "header":"fcntl.h", "extensions":[], "notes":{"variadic-plugin":true}},
+        "opendir": {"id_type":"function", "header":"dirent.h", "extensions":[]},
+        "openlog": {"id_type":"function", "header":"syslog.h", "extensions":[]},
+        "OPOST": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "optarg": {"id_type":"variable", "header":"unistd.h", "extensions":[]},
+        "opterr": {"id_type":"variable", "header":"unistd.h", "extensions":[]},
+        "optind": {"id_type":"variable", "header":"unistd.h", "extensions":[]},
+        "optopt": {"id_type":"variable", "header":"unistd.h", "extensions":[]},
+        "or": {"id_type":"macro", "header":"iso646.h", "extensions":["XSI"]},
+        "or_eq": {"id_type":"macro", "header":"iso646.h", "extensions":[]},
+        "P_tmpdir": {"id_type":"macro", "header":"stdio.h", "extensions":[]},
+        "PARENB": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "PARMRK": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "PARODD": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "passwd": {"id_type":"type", "header":"pwd.h", "extensions":["XSI"]},
+        "pathconf": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "pause": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "pclose": {"id_type":"function", "header":"stdio.h", "extensions":["CX"]},
+        "perror": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "pid_t": {"id_type":"type", "header":"signal.h", "extensions":["PS"]},
+        "pipe": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "poll": {"id_type":"function", "header":"poll.h", "extensions":[]},
+        "POLLERR": {"id_type":"constant", "header":"poll.h", "extensions":[]},
+        "pollfd": {"id_type":"type", "header":"poll.h", "extensions":[]},
+        "POLLHUP": {"id_type":"constant", "header":"poll.h", "extensions":[]},
+        "POLLIN": {"id_type":"constant", "header":"poll.h", "extensions":[]},
+        "POLLNVAL": {"id_type":"constant", "header":"poll.h", "extensions":[]},
+        "POLLOUT": {"id_type":"constant", "header":"poll.h", "extensions":[]},
+        "POLLPRI": {"id_type":"constant", "header":"poll.h", "extensions":[]},
+        "POLLRDBAND": {"id_type":"constant", "header":"poll.h", "extensions":[]},
+        "POLLRDNORM": {"id_type":"constant", "header":"poll.h", "extensions":[]},
+        "POLLWRBAND": {"id_type":"constant", "header":"poll.h", "extensions":[]},
+        "POLLWRNORM": {"id_type":"constant", "header":"poll.h", "extensions":[]},
+        "popen": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "POSIX_FADV_DONTNEED": {"id_type":"constant", "header":"fcntl.h", "extensions":["ADV"]},
+        "POSIX_FADV_NOREUSE": {"id_type":"constant", "header":"fcntl.h", "extensions":["ADV"]},
+        "POSIX_FADV_NORMAL": {"id_type":"constant", "header":"fcntl.h", "extensions":["ADV"]},
+        "POSIX_FADV_RANDOM": {"id_type":"constant", "header":"fcntl.h", "extensions":["ADV"]},
+        "POSIX_FADV_SEQUENTIAL": {"id_type":"constant", "header":"fcntl.h", "extensions":["ADV"]},
+        "POSIX_FADV_WILLNEED": {"id_type":"constant", "header":"fcntl.h", "extensions":["ADV"]},
+        "posix_fadvise": {"id_type":"function", "header":"fcntl.h", "extensions":["ADV"]},
+        "posix_fallocate": {"id_type":"function", "header":"fcntl.h", "extensions":["ADV"]},
+        "posix_madvise": {"id_type":"function", "header":"sys/mman.h", "extensions":["ADV"]},
+        "posix_mem_offset": {"id_type":"function", "header":"sys/mman.h", "extensions":["TYM"]},
+        "posix_memalign": {"id_type":"function", "header":"stdlib.h", "extensions":["ADV"]},
+        "posix_openpt": {"id_type":"function", "header":"stdlib.h", "extensions":["XSI"]},
+        "posix_spawn": {"id_type":"function", "header":"spawn.h", "extensions":[]},
+        "posix_spawn_file_actions_addclose": {"id_type":"function", "header":"spawn.h", "extensions":[]},
+        "posix_spawn_file_actions_adddup2": {"id_type":"function", "header":"spawn.h", "extensions":[]},
+        "posix_spawn_file_actions_addopen": {"id_type":"function", "header":"spawn.h", "extensions":[]},
+        "posix_spawn_file_actions_destroy": {"id_type":"function", "header":"spawn.h", "extensions":[]},
+        "posix_spawn_file_actions_init": {"id_type":"function", "header":"spawn.h", "extensions":[]},
+        "posix_spawnattr_destroy": {"id_type":"function", "header":"spawn.h", "extensions":[]},
+        "posix_spawnattr_getflags": {"id_type":"function", "header":"spawn.h", "extensions":[]},
+        "posix_spawnattr_getpgroup": {"id_type":"function", "header":"spawn.h", "extensions":[]},
+        "posix_spawnattr_getschedparam": {"id_type":"function", "header":"spawn.h", "extensions":["PS"]},
+        "posix_spawnattr_getschedpolicy": {"id_type":"function", "header":"spawn.h", "extensions":["PS"]},
+        "posix_spawnattr_getsigdefault": {"id_type":"function", "header":"spawn.h", "extensions":[]},
+        "posix_spawnattr_getsigmask": {"id_type":"function", "header":"spawn.h", "extensions":[]},
+        "posix_spawnattr_init": {"id_type":"function", "header":"spawn.h", "extensions":[]},
+        "posix_spawnattr_setflags": {"id_type":"function", "header":"spawn.h", "extensions":[]},
+        "posix_spawnattr_setpgroup": {"id_type":"function", "header":"spawn.h", "extensions":[]},
+        "posix_spawnattr_setschedparam": {"id_type":"function", "header":"spawn.h", "extensions":["PS"]},
+        "posix_spawnattr_setschedpolicy": {"id_type":"function", "header":"spawn.h", "extensions":["PS"]},
+        "posix_spawnattr_setsigdefault": {"id_type":"function", "header":"spawn.h", "extensions":[]},
+        "posix_spawnattr_setsigmask": {"id_type":"function", "header":"spawn.h", "extensions":[]},
+        "posix_spawnp": {"id_type":"function", "header":"spawn.h", "extensions":[]},
+        "posix_trace_attr_destroy": {"id_type":"function", "header":"trace.h", "extensions":[]},
+        "posix_trace_attr_getclockres": {"id_type":"function", "header":"trace.h", "extensions":[]},
+        "posix_trace_attr_getcreatetime": {"id_type":"function", "header":"trace.h", "extensions":[]},
+        "posix_trace_attr_getgenversion": {"id_type":"function", "header":"trace.h", "extensions":[]},
+        "posix_trace_attr_getinherited": {"id_type":"function", "header":"trace.h", "extensions":["TRI"]},
+        "posix_trace_attr_getlogfullpolicy": {"id_type":"function", "header":"trace.h", "extensions":["TRL"]},
+        "posix_trace_attr_getlogsize": {"id_type":"function", "header":"trace.h", "extensions":["TRL"]},
+        "posix_trace_attr_getmaxdatasize": {"id_type":"function", "header":"trace.h", "extensions":[]},
+        "posix_trace_attr_getmaxsystemeventsize": {"id_type":"function", "header":"trace.h", "extensions":[]},
+        "posix_trace_attr_getmaxusereventsize": {"id_type":"function", "header":"trace.h", "extensions":[]},
+        "posix_trace_attr_getname": {"id_type":"function", "header":"trace.h", "extensions":[]},
+        "posix_trace_attr_getstreamfullpolicy": {"id_type":"function", "header":"trace.h", "extensions":[]},
+        "posix_trace_attr_getstreamsize": {"id_type":"function", "header":"trace.h", "extensions":[]},
+        "posix_trace_attr_init": {"id_type":"function", "header":"trace.h", "extensions":[]},
+        "posix_trace_attr_setinherited": {"id_type":"function", "header":"trace.h", "extensions":["TRI"]},
+        "posix_trace_attr_setlogfullpolicy": {"id_type":"function", "header":"trace.h", "extensions":["TRL"]},
+        "posix_trace_attr_setlogsize": {"id_type":"function", "header":"trace.h", "extensions":["TRL"]},
+        "posix_trace_attr_setmaxdatasize": {"id_type":"function", "header":"trace.h", "extensions":[]},
+        "posix_trace_attr_setname": {"id_type":"function", "header":"trace.h", "extensions":[]},
+        "posix_trace_attr_setstreamfullpolicy": {"id_type":"function", "header":"trace.h", "extensions":[]},
+        "posix_trace_attr_setstreamsize": {"id_type":"function", "header":"trace.h", "extensions":[]},
+        "posix_trace_clear": {"id_type":"function", "header":"trace.h", "extensions":[]},
+        "posix_trace_close": {"id_type":"function", "header":"trace.h", "extensions":["TRL"]},
+        "posix_trace_create": {"id_type":"function", "header":"trace.h", "extensions":[]},
+        "posix_trace_create_withlog": {"id_type":"function", "header":"trace.h", "extensions":["TRL"]},
+        "posix_trace_event": {"id_type":"function", "header":"trace.h", "extensions":[]},
+        "posix_trace_event_info": {"id_type":"type", "header":"trace.h", "extensions":[]},
+        "posix_trace_eventid_equal": {"id_type":"function", "header":"trace.h", "extensions":[]},
+        "posix_trace_eventid_get_name": {"id_type":"function", "header":"trace.h", "extensions":[]},
+        "posix_trace_eventid_open": {"id_type":"function", "header":"trace.h", "extensions":[]},
+        "posix_trace_eventset_add": {"id_type":"function", "header":"trace.h", "extensions":["TEF"]},
+        "posix_trace_eventset_del": {"id_type":"function", "header":"trace.h", "extensions":["TEF"]},
+        "posix_trace_eventset_empty": {"id_type":"function", "header":"trace.h", "extensions":["TEF"]},
+        "posix_trace_eventset_fill": {"id_type":"function", "header":"trace.h", "extensions":["TEF"]},
+        "posix_trace_eventset_ismember": {"id_type":"function", "header":"trace.h", "extensions":["TEF"]},
+        "posix_trace_eventtypelist_getnext_id": {"id_type":"function", "header":"trace.h", "extensions":[]},
+        "posix_trace_eventtypelist_rewind": {"id_type":"function", "header":"trace.h", "extensions":[]},
+        "posix_trace_flush": {"id_type":"function", "header":"trace.h", "extensions":["TRL"]},
+        "posix_trace_get_attr": {"id_type":"function", "header":"trace.h", "extensions":[]},
+        "posix_trace_get_filter": {"id_type":"function", "header":"trace.h", "extensions":["TEF"]},
+        "posix_trace_get_status": {"id_type":"function", "header":"trace.h", "extensions":[]},
+        "posix_trace_getnext_event": {"id_type":"function", "header":"trace.h", "extensions":[]},
+        "posix_trace_open": {"id_type":"function", "header":"trace.h", "extensions":["TRL"]},
+        "posix_trace_rewind": {"id_type":"function", "header":"trace.h", "extensions":["TRL"]},
+        "posix_trace_set_filter": {"id_type":"function", "header":"trace.h", "extensions":["TEF"]},
+        "posix_trace_shutdown": {"id_type":"function", "header":"trace.h", "extensions":[]},
+        "posix_trace_start": {"id_type":"function", "header":"trace.h", "extensions":[]},
+        "posix_trace_status_info": {"id_type":"type", "header":"trace.h", "extensions":[]},
+        "posix_trace_stop": {"id_type":"function", "header":"trace.h", "extensions":[]},
+        "posix_trace_timedgetnext_event": {"id_type":"function", "header":"trace.h", "extensions":[]},
+        "posix_trace_trid_eventid_open": {"id_type":"function", "header":"trace.h", "extensions":["TEF"]},
+        "posix_trace_trygetnext_event": {"id_type":"function", "header":"trace.h", "extensions":[]},
+        "POSIX_TYPED_MEM_ALLOCATE": {"id_type":"constant", "header":"sys/mman.h", "extensions":["TYM"]},
+        "POSIX_TYPED_MEM_ALLOCATE_CONTIG": {"id_type":"constant", "header":"sys/mman.h", "extensions":["TYM"]},
+        "posix_typed_mem_get_info": {"id_type":"function", "header":"sys/mman.h", "extensions":["TYM"]},
+        "posix_typed_mem_info": {"id_type":"type", "header":"sys/mman.h", "extensions":["TYM"]},
+        "POSIX_TYPED_MEM_MAP_ALLOCATABLE": {"id_type":"constant", "header":"sys/mman.h", "extensions":["TYM"]},
+        "posix_typed_mem_open": {"id_type":"function", "header":"sys/mman.h", "extensions":["TYM"]},
+        "pow": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "powf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "powl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "pread": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "printf": {"id_type":"function", "header":"stdio.h", "extensions":[], "notes":{"variadic-plugin":true}},
+        "PRIO_PGRP": {"id_type":"constant", "header":"sys/resource.h", "extensions":[]},
+        "PRIO_PROCESS": {"id_type":"constant", "header":"sys/resource.h", "extensions":[]},
+        "PRIO_USER": {"id_type":"constant", "header":"sys/resource.h", "extensions":[]},
+        "PROT_EXEC": {"id_type":"constant", "header":"sys/mman.h", "extensions":[]},
+        "PROT_NONE": {"id_type":"constant", "header":"sys/mman.h", "extensions":[]},
+        "PROT_READ": {"id_type":"constant", "header":"sys/mman.h", "extensions":[]},
+        "PROT_WRITE": {"id_type":"constant", "header":"sys/mman.h", "extensions":[]},
+        "protoent": {"id_type":"type", "header":"netdb.h", "extensions":[]},
+        "pselect": {"id_type":"function", "header":"sys/select.h", "extensions":[]},
+        "psiginfo": {"id_type":"function", "header":"signal.h", "extensions":[]},
+        "psignal": {"id_type":"function", "header":"signal.h", "extensions":[]},
+        "pthread_atfork": {"id_type":"function", "header":"pthread.h", "extensions":["OB"]},
+        "pthread_attr_destroy": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_attr_getdetachstate": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_attr_getguardsize": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_attr_getinheritsched": {"id_type":"function", "header":"pthread.h", "extensions":["TPS"]},
+        "pthread_attr_getschedparam": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_attr_getschedpolicy": {"id_type":"function", "header":"pthread.h", "extensions":["TPS"]},
+        "pthread_attr_getscope": {"id_type":"function", "header":"pthread.h", "extensions":["TPS"]},
+        "pthread_attr_getstack": {"id_type":"function", "header":"pthread.h", "extensions":["TSA","TSS"]},
+        "pthread_attr_getstacksize": {"id_type":"function", "header":"pthread.h", "extensions":["TSS"]},
+        "pthread_attr_init": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_attr_setdetachstate": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_attr_setguardsize": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_attr_setinheritsched": {"id_type":"function", "header":"pthread.h", "extensions":["TPS"]},
+        "pthread_attr_setschedparam": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_attr_setschedpolicy": {"id_type":"function", "header":"pthread.h", "extensions":["TPS"]},
+        "pthread_attr_setscope": {"id_type":"function", "header":"pthread.h", "extensions":["TPS"]},
+        "pthread_attr_setstack": {"id_type":"function", "header":"pthread.h", "extensions":["TSA","TSS"]},
+        "pthread_attr_setstacksize": {"id_type":"function", "header":"pthread.h", "extensions":["TSS"]},
+        "pthread_attr_t": {"id_type":"type", "header":"sys/types.h", "extensions":["TPS"]},
+        "pthread_barrier_destroy": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_barrier_init": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_barrier_t": {"id_type":"type", "header":"sys/types.h", "extensions":[]},
+        "pthread_barrier_wait": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_barrierattr_destroy": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_barrierattr_getpshared": {"id_type":"function", "header":"pthread.h", "extensions":["TSH"]},
+        "pthread_barrierattr_init": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_barrierattr_setpshared": {"id_type":"function", "header":"pthread.h", "extensions":["TSH"]},
+        "pthread_barrierattr_t": {"id_type":"type", "header":"sys/types.h", "extensions":["TSH"]},
+        "pthread_cancel": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_cleanup_pop": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_cleanup_push": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_cond_broadcast": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_cond_destroy": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_cond_init": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_cond_signal": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_cond_t": {"id_type":"type", "header":"sys/types.h", "extensions":[]},
+        "pthread_cond_timedwait": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_cond_wait": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_condattr_destroy": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_condattr_getclock": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_condattr_getpshared": {"id_type":"function", "header":"pthread.h", "extensions":["TSH"]},
+        "pthread_condattr_init": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_condattr_setclock": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_condattr_setpshared": {"id_type":"function", "header":"pthread.h", "extensions":["TSH"]},
+        "pthread_condattr_t": {"id_type":"type", "header":"sys/types.h", "extensions":["TSH"]},
+        "pthread_create": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_detach": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_equal": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_exit": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_getconcurrency": {"id_type":"function", "header":"pthread.h", "extensions":["OB","XSI"]},
+        "pthread_getcpuclockid": {"id_type":"function", "header":"pthread.h", "extensions":["TCT"]},
+        "pthread_getschedparam": {"id_type":"function", "header":"pthread.h", "extensions":["TPS"]},
+        "pthread_getspecific": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_join": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_key_create": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_key_delete": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_key_t": {"id_type":"type", "header":"sys/types.h", "extensions":[]},
+        "pthread_kill": {"id_type":"function", "header":"signal.h", "extensions":[]},
+        "pthread_mutex_consistent": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_mutex_destroy": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_mutex_getprioceiling": {"id_type":"function", "header":"pthread.h", "extensions":["RPP","TPP"]},
+        "pthread_mutex_init": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_mutex_lock": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_mutex_setprioceiling": {"id_type":"function", "header":"pthread.h", "extensions":["RPP","TPP"]},
+        "pthread_mutex_t": {"id_type":"type", "header":"sys/types.h", "extensions":["RPP","TPP"]},
+        "pthread_mutex_timedlock": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_mutex_trylock": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_mutex_unlock": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_mutexattr_destroy": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_mutexattr_getprioceiling": {"id_type":"function", "header":"pthread.h", "extensions":["RPP","TPP"]},
+        "pthread_mutexattr_getprotocol": {"id_type":"function", "header":"pthread.h", "extensions":["MC1"]},
+        "pthread_mutexattr_getpshared": {"id_type":"function", "header":"pthread.h", "extensions":["TSH"]},
+        "pthread_mutexattr_getrobust": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_mutexattr_gettype": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_mutexattr_init": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_mutexattr_setprioceiling": {"id_type":"function", "header":"pthread.h", "extensions":["RPP","TPP"]},
+        "pthread_mutexattr_setprotocol": {"id_type":"function", "header":"pthread.h", "extensions":["MC1"]},
+        "pthread_mutexattr_setpshared": {"id_type":"function", "header":"pthread.h", "extensions":["TSH"]},
+        "pthread_mutexattr_setrobust": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_mutexattr_settype": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_mutexattr_t": {"id_type":"type", "header":"sys/types.h", "extensions":["RPP","TPP"]},
+        "pthread_once": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_once_t": {"id_type":"type", "header":"sys/types.h", "extensions":[]},
+        "pthread_rwlock_destroy": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_rwlock_init": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_rwlock_rdlock": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_rwlock_t": {"id_type":"type", "header":"sys/types.h", "extensions":[]},
+        "pthread_rwlock_timedrdlock": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_rwlock_timedwrlock": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_rwlock_tryrdlock": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_rwlock_trywrlock": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_rwlock_unlock": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_rwlock_wrlock": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_rwlockattr_destroy": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_rwlockattr_getpshared": {"id_type":"function", "header":"pthread.h", "extensions":["TSH"]},
+        "pthread_rwlockattr_init": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_rwlockattr_setpshared": {"id_type":"function", "header":"pthread.h", "extensions":["TSH"]},
+        "pthread_rwlockattr_t": {"id_type":"type", "header":"sys/types.h", "extensions":["TSH"]},
+        "pthread_self": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_setcancelstate": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_setcanceltype": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_setconcurrency": {"id_type":"function", "header":"pthread.h", "extensions":["OB","XSI"]},
+        "pthread_setschedparam": {"id_type":"function", "header":"pthread.h", "extensions":["TPS"]},
+        "pthread_setschedprio": {"id_type":"function", "header":"pthread.h", "extensions":["TPS"]},
+        "pthread_setspecific": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_sigmask": {"id_type":"function", "header":"signal.h", "extensions":[]},
+        "pthread_spin_destroy": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_spin_init": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_spin_lock": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_spin_trylock": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_spin_unlock": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "pthread_spinlock_t": {"id_type":"type", "header":"sys/types.h", "extensions":[]},
+        "pthread_t": {"id_type":"type", "header":"sys/types.h", "extensions":[]},
+        "pthread_testcancel": {"id_type":"function", "header":"pthread.h", "extensions":[]},
+        "ptrdiff_t": {"id_type":"macro", "header":"stddef.h", "extensions":[]},
+        "ptsname": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "putc": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "putc_unlocked": {"id_type":"function", "header":"stdio.h", "extensions":["CX"]},
+        "putchar": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "putchar_unlocked": {"id_type":"function", "header":"stdio.h", "extensions":["CX"]},
+        "putenv": {"id_type":"function", "header":"stdlib.h", "extensions":["XSI"]},
+        "putmsg": {"id_type":"function", "header":"stropts.h", "extensions":[]},
+        "putpmsg": {"id_type":"function", "header":"stropts.h", "extensions":[]},
+        "puts": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "pututxline": {"id_type":"function", "header":"utmpx.h", "extensions":[]},
+        "putwc": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "putwchar": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "pwrite": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "qsort": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "R_OK": {"id_type":"constant", "header":"unistd.h", "extensions":[]},
+        "raise": {"id_type":"function", "header":"signal.h", "extensions":[]},
+        "rand": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "RAND_MAX": {"id_type":"macro", "header":"stdlib.h", "extensions":[]},
+        "rand_r": {"id_type":"function", "header":"stdlib.h", "extensions":["OB","CX"]},
+        "random": {"id_type":"function", "header":"stdlib.h", "extensions":["ADV"]},
+        "read": {"id_type":"function", "header":"unistd.h", "extensions":["OB","XSR"]},
+        "readdir": {"id_type":"function", "header":"dirent.h", "extensions":[]},
+        "readdir_r": {"id_type":"function", "header":"dirent.h", "extensions":[]},
+        "readlink": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "readlinkat": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "readv": {"id_type":"function", "header":"sys/uio.h", "extensions":["XSI"]},
+        "realloc": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "realpath": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "recv": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
+        "recvfrom": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
+        "recvmsg": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
+        "REG_BADBR": {"id_type":"constant", "header":"regex.h", "extensions":[]},
+        "REG_BADPAT": {"id_type":"constant", "header":"regex.h", "extensions":[]},
+        "REG_BADRPT": {"id_type":"constant", "header":"regex.h", "extensions":[]},
+        "REG_EBRACE": {"id_type":"constant", "header":"regex.h", "extensions":[]},
+        "REG_EBRACK": {"id_type":"constant", "header":"regex.h", "extensions":[]},
+        "REG_ECOLLATE": {"id_type":"constant", "header":"regex.h", "extensions":[]},
+        "REG_ECTYPE": {"id_type":"constant", "header":"regex.h", "extensions":[]},
+        "REG_EESCAPE": {"id_type":"constant", "header":"regex.h", "extensions":[]},
+        "REG_EPAREN": {"id_type":"constant", "header":"regex.h", "extensions":[]},
+        "REG_ERANGE": {"id_type":"constant", "header":"regex.h", "extensions":[]},
+        "REG_ESPACE": {"id_type":"constant", "header":"regex.h", "extensions":[]},
+        "REG_ESUBREG": {"id_type":"constant", "header":"regex.h", "extensions":[]},
+        "REG_EXTENDED": {"id_type":"constant", "header":"regex.h", "extensions":[]},
+        "REG_ICASE": {"id_type":"constant", "header":"regex.h", "extensions":[]},
+        "REG_NEWLINE": {"id_type":"constant", "header":"regex.h", "extensions":[]},
+        "REG_NOMATCH": {"id_type":"constant", "header":"regex.h", "extensions":[]},
+        "REG_NOSUB": {"id_type":"constant", "header":"regex.h", "extensions":[]},
+        "REG_NOTBOL": {"id_type":"constant", "header":"regex.h", "extensions":[]},
+        "REG_NOTEOL": {"id_type":"constant", "header":"regex.h", "extensions":[]},
+        "regcomp": {"id_type":"function", "header":"regex.h", "extensions":[]},
+        "regerror": {"id_type":"function", "header":"regex.h", "extensions":[]},
+        "regex_t": {"id_type":"type", "header":"regex.h", "extensions":[]},
+        "regexec": {"id_type":"function", "header":"regex.h", "extensions":[]},
+        "regfree": {"id_type":"function", "header":"regex.h", "extensions":[]},
+        "regmatch_t": {"id_type":"type", "header":"regex.h", "extensions":[]},
+        "regoff_t": {"id_type":"type", "header":"regex.h", "extensions":[]},
+        "remainder": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "remainderf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "remainderl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "remove": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "remque": {"id_type":"function", "header":"search.h", "extensions":[]},
+        "remquo": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "remquof": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "remquol": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "rename": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "renameat": {"id_type":"function", "header":"stdio.h", "extensions":["CX"]},
+        "rewind": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "rewinddir": {"id_type":"function", "header":"dirent.h", "extensions":[]},
+        "rint": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "rintf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "rintl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "RLIM_INFINITY": {"id_type":"constant", "header":"sys/resource.h", "extensions":[]},
+        "RLIM_SAVED_CUR": {"id_type":"constant", "header":"sys/resource.h", "extensions":[]},
+        "RLIM_SAVED_MAX": {"id_type":"constant", "header":"sys/resource.h", "extensions":[]},
+        "rlim_t": {"id_type":"type", "header":"sys/resource.h", "extensions":[]},
+        "rlimit": {"id_type":"type", "header":"sys/resource.h", "extensions":[]},
+        "RLIMIT_AS": {"id_type":"constant", "header":"sys/resource.h", "extensions":[]},
+        "RLIMIT_CORE": {"id_type":"constant", "header":"sys/resource.h", "extensions":[]},
+        "RLIMIT_CPU": {"id_type":"constant", "header":"sys/resource.h", "extensions":[]},
+        "RLIMIT_DATA": {"id_type":"constant", "header":"sys/resource.h", "extensions":[]},
+        "RLIMIT_FSIZE": {"id_type":"constant", "header":"sys/resource.h", "extensions":[]},
+        "RLIMIT_NOFILE": {"id_type":"constant", "header":"sys/resource.h", "extensions":[]},
+        "RLIMIT_STACK": {"id_type":"constant", "header":"sys/resource.h", "extensions":[]},
+        "rmdir": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "round": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "roundf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "roundl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "rusage": {"id_type":"type", "header":"sys/resource.h", "extensions":[]},
+        "RUSAGE_CHILDREN": {"id_type":"constant", "header":"sys/resource.h", "extensions":[]},
+        "RUSAGE_SELF": {"id_type":"constant", "header":"sys/resource.h", "extensions":[]},
+        "S_IFMT": {"id_type":"constant", "header":"sys/stat.h", "extensions":["OB"]},
+        "SA_NOCLDSTOP": {"id_type":"macro", "header":"signal.h", "extensions":[]},
+        "SA_NOCLDWAIT": {"id_type":"macro", "header":"signal.h", "extensions":[]},
+        "SA_NODEFER": {"id_type":"macro", "header":"signal.h", "extensions":[]},
+        "SA_ONSTACK": {"id_type":"macro", "header":"signal.h", "extensions":[]},
+        "SA_RESETHAND": {"id_type":"macro", "header":"signal.h", "extensions":[]},
+        "SA_RESTART": {"id_type":"macro", "header":"signal.h", "extensions":[]},
+        "SA_SIGINFO": {"id_type":"macro", "header":"signal.h", "extensions":[]},
+        "scalbln": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "scalblnf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "scalblnl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "scalbn": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "scalbnf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "scalbnl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "scandir": {"id_type":"function", "header":"dirent.h", "extensions":[]},
+        "scanf": {"id_type":"function", "header":"stdio.h", "extensions":[], "notes":{"variadic-plugin":true}},
+        "SCHAR_MAX": {"id_type":"macro", "header":"limits.h", "extensions":[]},
+        "SCHAR_MIN": {"id_type":"macro", "header":"limits.h", "extensions":[]},
+        "sched_get_priority_max": {"id_type":"function", "header":"sched.h", "extensions":["PS","TPS"]},
+        "sched_get_priority_min": {"id_type":"function", "header":"sched.h", "extensions":["PS","TPS"]},
+        "sched_getparam": {"id_type":"function", "header":"sched.h", "extensions":["PS"]},
+        "sched_getscheduler": {"id_type":"function", "header":"sched.h", "extensions":["PS"]},
+        "sched_param": {"id_type":"type", "header":"sched.h", "extensions":["TPS"]},
+        "sched_rr_get_interval": {"id_type":"function", "header":"sched.h", "extensions":["PS","TPS"]},
+        "sched_setparam": {"id_type":"function", "header":"sched.h", "extensions":["PS"]},
+        "sched_setscheduler": {"id_type":"function", "header":"sched.h", "extensions":["PS"]},
+        "sched_yield": {"id_type":"function", "header":"sched.h", "extensions":[]},
+        "SCM_RIGHTS": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "seed48": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "SEEK_CUR": {"id_type":"macro", "header":"stdio.h", "extensions":[]},
+        "SEEK_END": {"id_type":"macro", "header":"stdio.h", "extensions":[]},
+        "SEEK_SET": {"id_type":"macro", "header":"stdio.h", "extensions":[]},
+        "seekdir": {"id_type":"function", "header":"dirent.h", "extensions":["XSI"]},
+        "select": {"id_type":"function", "header":"sys/select.h", "extensions":[]},
+        "sem_close": {"id_type":"function", "header":"semaphore.h", "extensions":[]},
+        "sem_destroy": {"id_type":"function", "header":"semaphore.h", "extensions":[]},
+        "sem_getvalue": {"id_type":"function", "header":"semaphore.h", "extensions":[]},
+        "sem_init": {"id_type":"function", "header":"semaphore.h", "extensions":[]},
+        "sem_open": {"id_type":"function", "header":"semaphore.h", "extensions":[]},
+        "sem_post": {"id_type":"function", "header":"semaphore.h", "extensions":[]},
+        "sem_timedwait": {"id_type":"function", "header":"semaphore.h", "extensions":[]},
+        "sem_trywait": {"id_type":"function", "header":"semaphore.h", "extensions":[]},
+        "SEM_UNDO": {"id_type":"constant", "header":"sys/sem.h", "extensions":[]},
+        "sem_unlink": {"id_type":"function", "header":"semaphore.h", "extensions":[]},
+        "sem_wait": {"id_type":"function", "header":"semaphore.h", "extensions":[]},
+        "sembuf": {"id_type":"type", "header":"sys/sem.h", "extensions":[]},
+        "semctl": {"id_type":"function", "header":"sys/sem.h", "extensions":[]},
+        "semget": {"id_type":"function", "header":"sys/sem.h", "extensions":[]},
+        "semid_ds": {"id_type":"type", "header":"sys/sem.h", "extensions":[]},
+        "semop": {"id_type":"function", "header":"sys/sem.h", "extensions":[]},
+        "send": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
+        "sendmsg": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
+        "sendto": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
+        "servent": {"id_type":"type", "header":"netdb.h", "extensions":[]},
+        "SETALL": {"id_type":"constant", "header":"sys/sem.h", "extensions":[]},
+        "setbuf": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "setegid": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "setenv": {"id_type":"function", "header":"stdlib.h", "extensions":["CX"]},
+        "seteuid": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "setgid": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "setgrent": {"id_type":"function", "header":"grp.h", "extensions":["XSI"]},
+        "sethostent": {"id_type":"function", "header":"netdb.h", "extensions":[]},
+        "setitimer": {"id_type":"function", "header":"sys/time.h", "extensions":["IP6"]},
+        "setjmp": {"id_type":"function", "header":"setjmp.h", "extensions":[]},
+        "setkey": {"id_type":"function", "header":"stdlib.h", "extensions":["XSI"]},
+        "setlocale": {"id_type":"function", "header":"locale.h", "extensions":[]},
+        "setlogmask": {"id_type":"function", "header":"syslog.h", "extensions":[]},
+        "setnetent": {"id_type":"function", "header":"netdb.h", "extensions":[]},
+        "setpgid": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "setpgrp": {"id_type":"function", "header":"unistd.h", "extensions":["OB","XSI"]},
+        "setpriority": {"id_type":"function", "header":"sys/resource.h", "extensions":[]},
+        "setprotoent": {"id_type":"function", "header":"netdb.h", "extensions":[]},
+        "setpwent": {"id_type":"function", "header":"pwd.h", "extensions":["XSI"]},
+        "setregid": {"id_type":"function", "header":"unistd.h", "extensions":["XSI"]},
+        "setreuid": {"id_type":"function", "header":"unistd.h", "extensions":["XSI"]},
+        "setrlimit": {"id_type":"function", "header":"sys/resource.h", "extensions":[]},
+        "setservent": {"id_type":"function", "header":"netdb.h", "extensions":[]},
+        "setsid": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "setsockopt": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
+        "setstate": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "setuid": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "setutxent": {"id_type":"function", "header":"utmpx.h", "extensions":[]},
+        "SETVAL": {"id_type":"constant", "header":"sys/sem.h", "extensions":[]},
+        "setvbuf": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "shm_open": {"id_type":"function", "header":"sys/mman.h", "extensions":["SHM"]},
+        "SHM_RDONLY": {"id_type":"constant", "header":"sys/shm.h", "extensions":[]},
+        "SHM_RND": {"id_type":"constant", "header":"sys/shm.h", "extensions":[]},
+        "shm_unlink": {"id_type":"function", "header":"sys/mman.h", "extensions":["SHM"]},
+        "shmat": {"id_type":"function", "header":"sys/shm.h", "extensions":[]},
+        "shmatt_t": {"id_type":"type", "header":"sys/shm.h", "extensions":[]},
+        "shmctl": {"id_type":"function", "header":"sys/shm.h", "extensions":[]},
+        "shmdt": {"id_type":"function", "header":"sys/shm.h", "extensions":[]},
+        "shmget": {"id_type":"function", "header":"sys/shm.h", "extensions":[]},
+        "shmid_ds": {"id_type":"type", "header":"sys/shm.h", "extensions":[]},
+        "SHMLBA": {"id_type":"constant", "header":"sys/shm.h", "extensions":[]},
+        "SHRT_MAX": {"id_type":"macro", "header":"limits.h", "extensions":[]},
+        "SHRT_MIN": {"id_type":"macro", "header":"limits.h", "extensions":[]},
+        "SHUT_RD": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "SHUT_RDWR": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "SHUT_WR": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "shutdown": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
+        "sig_atomic_t": {"id_type":"type", "header":"signal.h", "extensions":[]},
+        "SIG_BLOCK": {"id_type":"macro", "header":"signal.h", "extensions":[]},
+        "SIG_DFL": {"id_type":"macro", "header":"signal.h", "extensions":[]},
+        "SIG_ERR": {"id_type":"macro", "header":"signal.h", "extensions":[]},
+        "SIG_HOLD": {"id_type":"macro", "header":"signal.h", "extensions":[]},
+        "SIG_IGN": {"id_type":"macro", "header":"signal.h", "extensions":[]},
+        "SIG_SETMASK": {"id_type":"macro", "header":"signal.h", "extensions":[]},
+        "SIG_UNBLOCK": {"id_type":"macro", "header":"signal.h", "extensions":[]},
+        "sigaction": {"id_type":"function", "header":"signal.h", "extensions":[]},
+        "sigaction": {"id_type":"type", "header":"signal.h", "extensions":[]},
+        "sigaddset": {"id_type":"function", "header":"signal.h", "extensions":[]},
+        "sigaltstack": {"id_type":"function", "header":"signal.h", "extensions":[]},
+        "sigdelset": {"id_type":"function", "header":"signal.h", "extensions":[]},
+        "sigemptyset": {"id_type":"function", "header":"signal.h", "extensions":[]},
+        "SIGEV_NONE": {"id_type":"constant", "header":"signal.h", "extensions":[]},
+        "SIGEV_SIGNAL": {"id_type":"constant", "header":"signal.h", "extensions":[]},
+        "SIGEV_THREAD": {"id_type":"constant", "header":"signal.h", "extensions":[]},
+        "sigevent": {"id_type":"type", "header":"signal.h", "extensions":["CX"]},
+        "sigfillset": {"id_type":"function", "header":"signal.h", "extensions":[]},
+        "sighold": {"id_type":"function", "header":"signal.h", "extensions":[]},
+        "sigignore": {"id_type":"function", "header":"signal.h", "extensions":[]},
+        "siginfo_t": {"id_type":"type", "header":"signal.h", "extensions":[]},
+        "siginterrupt": {"id_type":"function", "header":"signal.h", "extensions":[]},
+        "sigismember": {"id_type":"function", "header":"signal.h", "extensions":[]},
+        "siglongjmp": {"id_type":"function", "header":"setjmp.h", "extensions":["CX"]},
+        "signal": {"id_type":"function", "header":"signal.h", "extensions":[]},
+        "signbit": {"id_type":"macro", "header":"math.h", "extensions":[]},
+        "signgam": {"id_type":"variable", "header":"math.h", "extensions":[]},
+        "sigpause": {"id_type":"function", "header":"signal.h", "extensions":[]},
+        "sigpending": {"id_type":"function", "header":"signal.h", "extensions":[]},
+        "sigprocmask": {"id_type":"function", "header":"signal.h", "extensions":[]},
+        "sigqueue": {"id_type":"function", "header":"signal.h", "extensions":[]},
+        "sigrelse": {"id_type":"function", "header":"signal.h", "extensions":[]},
+        "sigset": {"id_type":"function", "header":"signal.h", "extensions":[]},
+        "sigset_t": {"id_type":"type", "header":"signal.h", "extensions":[]},
+        "sigsetjmp": {"id_type":"function", "header":"setjmp.h", "extensions":["CX"]},
+        "SIGSTKSZ": {"id_type":"macro", "header":"signal.h", "extensions":[]},
+        "sigsuspend": {"id_type":"function", "header":"signal.h", "extensions":[]},
+        "sigtimedwait": {"id_type":"function", "header":"signal.h", "extensions":[]},
+        "sigval": {"id_type":"type", "header":"signal.h", "extensions":[]},
+        "sigwait": {"id_type":"function", "header":"signal.h", "extensions":[]},
+        "sigwaitinfo": {"id_type":"function", "header":"signal.h", "extensions":[]},
+        "sin": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "sinf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "sinh": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "sinhf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "sinhl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "sinl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "size_t": {"id_type":"macro", "header":"stddef.h", "extensions":["TSA","TSS"]},
+        "sleep": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "snprintf": {"id_type":"function", "header":"stdio.h", "extensions":[], "notes":{"variadic-plugin":true}},
+        "SO_ACCEPTCONN": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "SO_BROADCAST": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "SO_DEBUG": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "SO_DONTROUTE": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "SO_ERROR": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "SO_KEEPALIVE": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "SO_LINGER": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "SO_OOBINLINE": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "SO_RCVBUF": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "SO_RCVLOWAT": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "SO_RCVTIMEO": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "SO_REUSEADDR": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "SO_SNDBUF": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "SO_SNDLOWAT": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "SO_SNDTIMEO": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "SO_TYPE": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "SOCK_DGRAM": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "SOCK_RAW": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "SOCK_SEQPACKET": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "SOCK_STREAM": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "sockaddr": {"id_type":"type", "header":"sys/socket.h", "extensions":["IP6"]},
+        "sockaddr_in": {"id_type":"type", "header":"netinet/in.h", "extensions":[]},
+        "sockaddr_in6": {"id_type":"type", "header":"netinet/in.h", "extensions":["IP6"]},
+        "sockaddr_un": {"id_type":"type", "header":"sys/un.h", "extensions":[]},
+        "sockatmark": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
+        "socket": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
+        "socketpair": {"id_type":"function", "header":"sys/socket.h", "extensions":["IP6"]},
+        "SOL_SOCKET": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "SOMAXCONN": {"id_type":"constant", "header":"sys/socket.h", "extensions":["IP6"]},
+        "speed_t": {"id_type":"type", "header":"termios.h", "extensions":[]},
+        "sprintf": {"id_type":"function", "header":"stdio.h", "extensions":[], "notes":{"variadic-plugin":true}},
+        "sqrt": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "sqrtf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "sqrtl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "srand": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "srand48": {"id_type":"function", "header":"stdlib.h", "extensions":["XSI"]},
+        "srandom": {"id_type":"function", "header":"stdlib.h", "extensions":["XSI"]},
+        "SS_DISABLE": {"id_type":"macro", "header":"signal.h", "extensions":[]},
+        "SS_ONSTACK": {"id_type":"macro", "header":"signal.h", "extensions":[]},
+        "sscanf": {"id_type":"function", "header":"stdio.h", "extensions":[], "notes":{"variadic-plugin":true}},
+        "SSIZE_MAX": {"id_type":"macro", "header":"limits.h", "extensions":[]},
+        "ssize_t": {"id_type":"type", "header":"stdio.h", "extensions":["CX"]},
+        "ST_NOSUID": {"id_type":"constant", "header":"sys/statvfs.h", "extensions":[]},
+        "ST_RDONLY": {"id_type":"constant", "header":"sys/statvfs.h", "extensions":[]},
+        "stack_t": {"id_type":"type", "header":"signal.h", "extensions":[]},
+        "stat": {"id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
+        "stat": {"id_type":"type", "header":"sys/stat.h", "extensions":["OB"]},
+        "static_assert": {"id_type":"macro", "header":"assert.h", "extensions":[]},
+        "statvfs": {"id_type":"function", "header":"sys/statvfs.h", "extensions":[]},
+        "statvfs": {"id_type":"type", "header":"sys/statvfs.h", "extensions":[]},
+        "stderr": {"id_type":"macro", "header":"stdio.h", "extensions":[]},
+        "STDERR_FILENO": {"id_type":"constant", "header":"unistd.h", "extensions":[]},
+        "stdin": {"id_type":"macro", "header":"stdio.h", "extensions":[]},
+        "STDIN_FILENO": {"id_type":"constant", "header":"unistd.h", "extensions":[]},
+        "stdout": {"id_type":"macro", "header":"stdio.h", "extensions":[]},
+        "STDOUT_FILENO": {"id_type":"constant", "header":"unistd.h", "extensions":[]},
+        "stpcpy": {"id_type":"function", "header":"string.h", "extensions":[]},
+        "stpncpy": {"id_type":"function", "header":"string.h", "extensions":[]},
+        "str_list": {"id_type":"type", "header":"stropts.h", "extensions":[]},
+        "str_mlist": {"id_type":"type", "header":"stropts.h", "extensions":[]},
+        "strbuf": {"id_type":"type", "header":"stropts.h", "extensions":[]},
+        "strcasecmp": {"id_type":"function", "header":"strings.h", "extensions":[]},
+        "strcasecmp_l": {"id_type":"function", "header":"strings.h", "extensions":[]},
+        "strcat": {"id_type":"function", "header":"string.h", "extensions":[]},
+        "strchr": {"id_type":"function", "header":"string.h", "extensions":[]},
+        "strcmp": {"id_type":"function", "header":"string.h", "extensions":[]},
+        "strcoll": {"id_type":"function", "header":"string.h", "extensions":[]},
+        "strcoll_l": {"id_type":"function", "header":"string.h", "extensions":["CX"]},
+        "strcpy": {"id_type":"function", "header":"string.h", "extensions":[]},
+        "strcspn": {"id_type":"function", "header":"string.h", "extensions":[]},
+        "strdup": {"id_type":"function", "header":"string.h", "extensions":["XSI"]},
+        "strerror": {"id_type":"function", "header":"string.h", "extensions":[]},
+        "strerror_l": {"id_type":"function", "header":"string.h", "extensions":[]},
+        "strerror_r": {"id_type":"function", "header":"string.h", "extensions":["CX"]},
+        "strfdinsert": {"id_type":"type", "header":"stropts.h", "extensions":[]},
+        "strfmon": {"id_type":"function", "header":"monetary.h", "extensions":[]},
+        "strfmon_l": {"id_type":"function", "header":"monetary.h", "extensions":[]},
+        "strftime": {"id_type":"function", "header":"time.h", "extensions":["IP6"]},
+        "strftime_l": {"id_type":"function", "header":"time.h", "extensions":["IP6"]},
+        "strioctl": {"id_type":"type", "header":"stropts.h", "extensions":[]},
+        "strlen": {"id_type":"function", "header":"string.h", "extensions":[]},
+        "strncasecmp": {"id_type":"function", "header":"strings.h", "extensions":[]},
+        "strncasecmp_l": {"id_type":"function", "header":"strings.h", "extensions":[]},
+        "strncat": {"id_type":"function", "header":"string.h", "extensions":[]},
+        "strncmp": {"id_type":"function", "header":"string.h", "extensions":[]},
+        "strncpy": {"id_type":"function", "header":"string.h", "extensions":[]},
+        "strndup": {"id_type":"function", "header":"string.h", "extensions":[]},
+        "strnlen": {"id_type":"function", "header":"string.h", "extensions":["CX"]},
+        "strpbrk": {"id_type":"function", "header":"string.h", "extensions":[]},
+        "strpeek": {"id_type":"type", "header":"stropts.h", "extensions":[]},
+        "strptime": {"id_type":"function", "header":"time.h", "extensions":["IP6"]},
+        "strrchr": {"id_type":"function", "header":"string.h", "extensions":[]},
+        "strrecvfd": {"id_type":"type", "header":"stropts.h", "extensions":[]},
+        "strsignal": {"id_type":"function", "header":"string.h", "extensions":[]},
+        "strspn": {"id_type":"function", "header":"string.h", "extensions":[]},
+        "strstr": {"id_type":"function", "header":"string.h", "extensions":[]},
+        "strtod": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "strtof": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "strtoimax": {"id_type":"function", "header":"inttypes.h", "extensions":[]},
+        "strtok": {"id_type":"function", "header":"string.h", "extensions":[]},
+        "strtok_r": {"id_type":"function", "header":"string.h", "extensions":[]},
+        "strtol": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "strtold": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "strtoll": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "strtoul": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "strtoull": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "strtoumax": {"id_type":"function", "header":"inttypes.h", "extensions":[]},
+        "strxfrm": {"id_type":"function", "header":"string.h", "extensions":[]},
+        "strxfrm_l": {"id_type":"function", "header":"string.h", "extensions":["CX"]},
+        "suseconds_t": {"id_type":"type", "header":"sys/types.h", "extensions":["XSI"]},
+        "swab": {"id_type":"function", "header":"unistd.h", "extensions":["XSI"]},
+        "swprintf": {"id_type":"function", "header":"wchar.h", "extensions":[], "notes":{"variadic-plugin":true}},
+        "swscanf": {"id_type":"function", "header":"wchar.h", "extensions":[], "notes":{"variadic-plugin":true}},
+        "symlink": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "symlinkat": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "sync": {"id_type":"function", "header":"unistd.h", "extensions":["XSI"]},
+        "sysconf": {"id_type":"function", "header":"unistd.h", "extensions":["ADV"]},
+        "syslog": {"id_type":"function", "header":"syslog.h", "extensions":[], "notes":{"variadic-plugin":true}},
+        "system": {"id_type":"function", "header":"stdlib.h", "extensions":["IP6"]},
+        "t_scalar_t": {"id_type":"type", "header":"stropts.h", "extensions":[]},
+        "t_uscalar_t": {"id_type":"type", "header":"stropts.h", "extensions":[]},
+        "TABDLY": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "tan": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "tanf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "tanh": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "tanhf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "tanhl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "tanl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "tcdrain": {"id_type":"function", "header":"termios.h", "extensions":[]},
+        "tcflag_t": {"id_type":"type", "header":"termios.h", "extensions":[]},
+        "tcflow": {"id_type":"function", "header":"termios.h", "extensions":[]},
+        "tcflush": {"id_type":"function", "header":"termios.h", "extensions":[]},
+        "tcgetattr": {"id_type":"function", "header":"termios.h", "extensions":[]},
+        "tcgetpgrp": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "tcgetsid": {"id_type":"function", "header":"termios.h", "extensions":[]},
+        "TCIFLUSH": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "TCIOFF": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "TCIOFLUSH": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "TCION": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "TCOFLUSH": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "TCOOFF": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "TCOON": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "TCP_NODELAY": {"id_type":"constant", "header":"netinet/tcp.h", "extensions":[]},
+        "TCSADRAIN": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "TCSAFLUSH": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "TCSANOW": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "tcsendbreak": {"id_type":"function", "header":"termios.h", "extensions":[]},
+        "tcsetattr": {"id_type":"function", "header":"termios.h", "extensions":[]},
+        "tcsetpgrp": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "tdelete": {"id_type":"function", "header":"search.h", "extensions":[]},
+        "telldir": {"id_type":"function", "header":"dirent.h", "extensions":["XSI"]},
+        "tempnam": {"id_type":"function", "header":"stdio.h", "extensions":["OB","XSI"]},
+        "termios": {"id_type":"type", "header":"termios.h", "extensions":[]},
+        "tfind": {"id_type":"function", "header":"search.h", "extensions":[]},
+        "tgamma": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "tgammaf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "tgammal": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "time": {"id_type":"function", "header":"time.h", "extensions":["IP6"]},
+        "time_t": {"id_type":"type", "header":"sys/types.h", "extensions":["SS","TSP"]},
+        "TIMER_ABSTIME": {"id_type":"constant", "header":"time.h", "extensions":["IP6"]},
+        "timer_create": {"id_type":"function", "header":"time.h", "extensions":["IP6"]},
+        "timer_delete": {"id_type":"function", "header":"time.h", "extensions":["IP6"]},
+        "timer_getoverrun": {"id_type":"function", "header":"time.h", "extensions":["IP6"]},
+        "timer_gettime": {"id_type":"function", "header":"time.h", "extensions":["IP6"]},
+        "timer_settime": {"id_type":"function", "header":"time.h", "extensions":["IP6"]},
+        "timer_t": {"id_type":"type", "header":"sys/types.h", "extensions":["CX"]},
+        "times": {"id_type":"function", "header":"sys/times.h", "extensions":["OB"]},
+        "timespec": {"id_type":"type", "header":"time.h", "extensions":["IP6"]},
+        "timeval": {"id_type":"type", "header":"sys/time.h", "extensions":["IP6"]},
+        "timezone": {"id_type":"variable", "header":"time.h", "extensions":["IP6"]},
+        "tm": {"id_type":"type", "header":"time.h", "extensions":["IP6"]},
+        "TMP_MAX": {"id_type":"macro", "header":"stdio.h", "extensions":[]},
+        "tmpfile": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "tmpnam": {"id_type":"function", "header":"stdio.h", "extensions":["OB"]},
+        "tms": {"id_type":"type", "header":"sys/times.h", "extensions":["OB"]},
+        "toascii": {"id_type":"function", "header":"ctype.h", "extensions":["OB","XSI"]},
+        "tolower": {"id_type":"function", "header":"ctype.h", "extensions":[]},
+        "tolower_l": {"id_type":"function", "header":"ctype.h", "extensions":["CX"]},
+        "TOSTOP": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "toupper": {"id_type":"function", "header":"ctype.h", "extensions":[]},
+        "toupper_l": {"id_type":"function", "header":"ctype.h", "extensions":["CX"]},
+        "towctrans": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "towctrans_l": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "towlower": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "towlower_l": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "towupper": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "towupper_l": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "trace_attr_t": {"id_type":"type", "header":"sys/types.h", "extensions":["OB","TRC"]},
+        "trace_event_id_t": {"id_type":"type", "header":"sys/types.h", "extensions":["OB","TRC"]},
+        "trace_event_set_t": {"id_type":"type", "header":"sys/types.h", "extensions":["OB","TEF"]},
+        "trace_id_t": {"id_type":"type", "header":"sys/types.h", "extensions":["OB","TRC"]},
+        "true": {"id_type":"macro", "header":"stdbool.h", "extensions":[]},
+        "trunc": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "truncate": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "truncf": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "truncl": {"id_type":"function", "header":"math.h", "extensions":[]},
+        "tsearch": {"id_type":"function", "header":"search.h", "extensions":[]},
+        "ttyname": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "ttyname_r": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "twalk": {"id_type":"function", "header":"search.h", "extensions":[]},
+        "tzname": {"id_type":"variable", "header":"time.h", "extensions":["IP6"]},
+        "tzset": {"id_type":"function", "header":"time.h", "extensions":["IP6"]},
+        "UCHAR_MAX": {"id_type":"macro", "header":"limits.h", "extensions":[]},
+        "ucontext_t": {"id_type":"type", "header":"signal.h", "extensions":[]},
+        "uid_t": {"id_type":"type", "header":"sys/types.h", "extensions":[]},
+        "UINT_MAX": {"id_type":"macro", "header":"limits.h", "extensions":[]},
+        "ulimit": {"id_type":"function", "header":"ulimit.h", "extensions":[]},
+        "ULLONG_MAX": {"id_type":"macro", "header":"limits.h", "extensions":[]},
+        "ULONG_MAX": {"id_type":"macro", "header":"limits.h", "extensions":[]},
+        "umask": {"id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
+        "uname": {"id_type":"function", "header":"sys/utsname.h", "extensions":[]},
+        "ungetc": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "ungetwc": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "unlink": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "unlinkat": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "unlockpt": {"id_type":"function", "header":"stdlib.h", "extensions":["XSI"]},
+        "unsetenv": {"id_type":"function", "header":"stdlib.h", "extensions":["CX"]},
+        "USER_PROCESS": {"id_type":"constant", "header":"utmpx.h", "extensions":[]},
+        "USHRT_MAX": {"id_type":"macro", "header":"limits.h", "extensions":[]},
+        "usleep": {"id_type":"function", "header":"unistd.h", "extensions":["OB","REM"]},
+        "utimbuf": {"id_type":"type", "header":"utime.h", "extensions":[]},
+        "utime": {"id_type":"function", "header":"utime.h", "extensions":[]},
+        "utimensat": {"id_type":"function", "header":"sys/stat.h", "extensions":["OB"]},
+        "utimes": {"id_type":"function", "header":"sys/time.h", "extensions":["IP6"]},
+        "utmpx": {"id_type":"type", "header":"utmpx.h", "extensions":[]},
+        "utsname": {"id_type":"type", "header":"sys/utsname.h", "extensions":[]},
+        "va_arg": {"id_type":"type", "header":"stdarg.h", "extensions":[]},
+        "va_copy": {"id_type":"macro", "header":"stdarg.h", "extensions":[]},
+        "va_end": {"id_type":"macro", "header":"stdarg.h", "extensions":[]},
+        "va_list": {"id_type":"type", "header":"stdarg.h", "extensions":[]},
+        "va_start": {"id_type":"macro", "header":"stdarg.h", "extensions":[]},
+        "vdprintf": {"id_type":"function", "header":"stdio.h", "extensions":["CX"]},
+        "vfprintf": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "vfscanf": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "vfwprintf": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "vfwscanf": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "vprintf": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "vscanf": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "vsnprintf": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "vsprintf": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "vsscanf": {"id_type":"function", "header":"stdio.h", "extensions":[]},
+        "vswprintf": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "vswscanf": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "VTDLY": {"id_type":"constant", "header":"termios.h", "extensions":[]},
+        "vwprintf": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "vwscanf": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "W_OK": {"id_type":"constant", "header":"unistd.h", "extensions":[]},
+        "wait": {"id_type":"function", "header":"sys/wait.h", "extensions":[]},
+        "waitid": {"id_type":"function", "header":"sys/wait.h", "extensions":[]},
+        "waitpid": {"id_type":"function", "header":"sys/wait.h", "extensions":[]},
+        "WCHAR_MAX": {"id_type":"macro", "header":"wchar.h", "extensions":[]},
+        "WCHAR_MIN": {"id_type":"macro", "header":"wchar.h", "extensions":[]},
+        "wchar_t": {"id_type":"macro", "header":"stddef.h", "extensions":["CX"]},
+        "WCONTINUED": {"id_type":"constant", "header":"sys/wait.h", "extensions":["XSI"]},
+        "wcpcpy": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wcpncpy": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wcrtomb": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wcscasecmp": {"id_type":"function", "header":"wchar.h", "extensions":["CX"]},
+        "wcscasecmp_l": {"id_type":"function", "header":"wchar.h", "extensions":["CX"]},
+        "wcscat": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wcschr": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wcscmp": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wcscoll": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wcscoll_l": {"id_type":"function", "header":"wchar.h", "extensions":["CX"]},
+        "wcscpy": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wcscspn": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wcsdup": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wcsftime": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wcslen": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wcsncasecmp": {"id_type":"function", "header":"wchar.h", "extensions":["CX"]},
+        "wcsncasecmp_l": {"id_type":"function", "header":"wchar.h", "extensions":["CX"]},
+        "wcsncat": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wcsncmp": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wcsncpy": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wcsnlen": {"id_type":"function", "header":"wchar.h", "extensions":["CX"]},
+        "wcsnrtombs": {"id_type":"function", "header":"wchar.h", "extensions":["CX"]},
+        "wcspbrk": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wcsrchr": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wcsrtombs": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wcsspn": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wcsstr": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wcstod": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wcstof": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wcstoimax": {"id_type":"function", "header":"inttypes.h", "extensions":[]},
+        "wcstok": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wcstol": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wcstold": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wcstoll": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wcstombs": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "wcstoul": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wcstoull": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wcstoumax": {"id_type":"function", "header":"inttypes.h", "extensions":[]},
+        "wcswidth": {"id_type":"function", "header":"wchar.h", "extensions":["XSI"]},
+        "wcsxfrm": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wcsxfrm_l": {"id_type":"function", "header":"wchar.h", "extensions":["CX"]},
+        "wctob": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wctomb": {"id_type":"function", "header":"stdlib.h", "extensions":[]},
+        "wctrans": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "wctrans_l": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "wctrans_t": {"id_type":"type", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "wctype": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "wctype_l": {"id_type":"function", "header":"wctype.h", "extensions":["OB","XSI"]},
+        "wctype_t": {"id_type":"type", "header":"wchar.h", "extensions":["OB","XSI"]},
+        "wcwidth": {"id_type":"function", "header":"wchar.h", "extensions":["XSI"]},
+        "WEOF": {"id_type":"macro", "header":"wchar.h", "extensions":[]},
+        "WEXITED": {"id_type":"constant", "header":"sys/wait.h", "extensions":[]},
+        "WEXITSTATUS": {"id_type":"constant", "header":"sys/wait.h", "extensions":["CX"]},
+        "WIFCONTINUED": {"id_type":"constant", "header":"sys/wait.h", "extensions":[]},
+        "WIFEXITED": {"id_type":"constant", "header":"sys/wait.h", "extensions":["CX"]},
+        "WIFSIGNALED": {"id_type":"constant", "header":"sys/wait.h", "extensions":["CX"]},
+        "WIFSTOPPED": {"id_type":"constant", "header":"sys/wait.h", "extensions":["CX"]},
+        "wint_t": {"id_type":"type", "header":"wchar.h", "extensions":["OB","XSI"]},
+        "wmemchr": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wmemcmp": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wmemcpy": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wmemmove": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "wmemset": {"id_type":"function", "header":"wchar.h", "extensions":[]},
+        "WNOHANG": {"id_type":"constant", "header":"sys/wait.h", "extensions":["CX"]},
+        "WNOWAIT": {"id_type":"constant", "header":"sys/wait.h", "extensions":[]},
+        "WORD_BIT": {"id_type":"macro", "header":"limits.h", "extensions":[]},
+        "wordexp": {"id_type":"function", "header":"wordexp.h", "extensions":[]},
+        "wordexp_t": {"id_type":"type", "header":"wordexp.h", "extensions":[]},
+        "wordfree": {"id_type":"function", "header":"wordexp.h", "extensions":[]},
+        "wprintf": {"id_type":"function", "header":"wchar.h", "extensions":[], "notes":{"variadic-plugin":true}},
+        "WRDE_APPEND": {"id_type":"constant", "header":"wordexp.h", "extensions":[]},
+        "WRDE_BADCHAR": {"id_type":"constant", "header":"wordexp.h", "extensions":[]},
+        "WRDE_BADVAL": {"id_type":"constant", "header":"wordexp.h", "extensions":[]},
+        "WRDE_CMDSUB": {"id_type":"constant", "header":"wordexp.h", "extensions":[]},
+        "WRDE_DOOFFS": {"id_type":"constant", "header":"wordexp.h", "extensions":[]},
+        "WRDE_NOCMD": {"id_type":"constant", "header":"wordexp.h", "extensions":[]},
+        "WRDE_NOSPACE": {"id_type":"constant", "header":"wordexp.h", "extensions":[]},
+        "WRDE_REUSE": {"id_type":"constant", "header":"wordexp.h", "extensions":[]},
+        "WRDE_SHOWERR": {"id_type":"constant", "header":"wordexp.h", "extensions":[]},
+        "WRDE_SYNTAX": {"id_type":"constant", "header":"wordexp.h", "extensions":[]},
+        "WRDE_UNDEF": {"id_type":"constant", "header":"wordexp.h", "extensions":[]},
+        "write": {"id_type":"function", "header":"unistd.h", "extensions":[]},
+        "writev": {"id_type":"function", "header":"sys/uio.h", "extensions":["XSI"]},
+        "wscanf": {"id_type":"function", "header":"wchar.h", "extensions":[], "notes":{"variadic-plugin":true}},
+        "WSTOPPED": {"id_type":"constant", "header":"sys/wait.h", "extensions":[]},
+        "WSTOPSIG": {"id_type":"constant", "header":"sys/wait.h", "extensions":["CX"]},
+        "WTERMSIG": {"id_type":"constant", "header":"sys/wait.h", "extensions":["CX"]},
+        "WUNTRACED": {"id_type":"constant", "header":"sys/wait.h", "extensions":["CX"]},
+        "X_OK": {"id_type":"constant", "header":"unistd.h", "extensions":[]},
+        "xor": {"id_type":"macro", "header":"iso646.h", "extensions":[]},
+        "xor_eq": {"id_type":"macro", "header":"iso646.h", "extensions":[]},
+        "y0": {"id_type":"function", "header":"math.h", "extensions":["XSI"]},
+        "y1": {"id_type":"function", "header":"math.h", "extensions":["XSI"]},
+        "yn": {"id_type":"function", "header":"math.h", "extensions":["XSI"]}
+    }
 }
diff --git a/share/dune b/share/dune
index 32a1201a6e512aec124c226600f0d5784c2dbe47..59006e15d0b530ce1de67f8e9fa9f61457aeb3e1 100644
--- a/share/dune
+++ b/share/dune
@@ -177,6 +177,7 @@
 (analysis-scripts/summary.py as analysis-scripts/summary.py)
 (analysis-scripts/template.mk as analysis-scripts/template.mk)
 (compliance/c11_functions.json as compliance/c11_functions.json)
+(compliance/c11_headers.json as compliance/c11_headers.json)
 (compliance/glibc_functions.json as compliance/glibc_functions.json)
 (compliance/nonstandard_identifiers.json as compliance/nonstandard_identifiers.json)
 (compliance/posix_identifiers.json as compliance/posix_identifiers.json)
diff --git a/share/libc/__fc_alloc_axiomatic.h b/share/libc/__fc_alloc_axiomatic.h
index b158a02d2399b723b00b4caabf6a1e4596439ac5..a5cae2a5c45b2816d6981c6fefa1bc2e98fd225c 100644
--- a/share/libc/__fc_alloc_axiomatic.h
+++ b/share/libc/__fc_alloc_axiomatic.h
@@ -29,7 +29,7 @@ __PUSH_FC_STDLIB
 
 __BEGIN_DECLS
 
-/*@ ghost extern int __fc_heap_status __attribute__((FRAMA_C_MODEL)); */
+/*@ ghost extern int __fc_heap_status; */
 
 /*@ axiomatic dynamic_allocation {
   @   predicate is_allocable{L}(integer n) // Can a block of n bytes be allocated?
diff --git a/share/libc/__fc_builtin.h b/share/libc/__fc_builtin.h
index ba911325872a129da48602079d27b669cb7b2430..48babc72906a74f56ffe01172c555078735f5136 100644
--- a/share/libc/__fc_builtin.h
+++ b/share/libc/__fc_builtin.h
@@ -28,7 +28,7 @@ __PUSH_FC_STDLIB
 
 __BEGIN_DECLS
 
-extern volatile int Frama_C_entropy_source __attribute__((unused)) __attribute__((FRAMA_C_MODEL));
+extern volatile int Frama_C_entropy_source __attribute__((unused));
 
 /*@ requires valid_p: \valid(p + (0 .. l-1));
     assigns p[0 .. l-1] \from Frama_C_entropy_source;
diff --git a/share/libc/alloca.h b/share/libc/alloca.h
index 7d903f91b477f2c578c1b042be314068616f8a80..0745815cd9802465fc0699bd4ee53c633e9ef572 100644
--- a/share/libc/alloca.h
+++ b/share/libc/alloca.h
@@ -28,7 +28,7 @@ __PUSH_FC_STDLIB
 
 __BEGIN_DECLS
 
-/*@ ghost extern int __fc_stack_status __attribute__((FRAMA_C_MODEL)); */
+/*@ ghost extern int __fc_stack_status; */
 
 // Note: alloca is considered to never fail, unlike malloc
 // Currently, ACSL does not allow specifying that the memory allocated by
diff --git a/share/libc/fenv.c b/share/libc/fenv.c
index f9c9cff39a5fc65945d9d19b3f59ec45723575dd..53644e303f765779cb71ab0a8d97a3f4053b382e 100644
--- a/share/libc/fenv.c
+++ b/share/libc/fenv.c
@@ -33,13 +33,13 @@ __PUSH_FC_STDLIB
  */
 int fetestexcept( int excepts )
 {
-  static volatile int __fc_random_fetestexcept __attribute__((FRAMA_C_MODEL)); /* random represent the FPU status word. */
+  static volatile int __fc_random_fetestexcept; /* random represent the FPU status word. */
 
   return (0x00FF & __fc_random_fetestexcept); /* B, C3, TOSP, C2, C1, and C0 don't matter. Mask the selected bits. */
 }
 
 
-volatile fenv_t __fc_fenv_state __attribute__((FRAMA_C_MODEL));
+volatile fenv_t __fc_fenv_state;
 
 
 /** Saves the current floating-point environment in the object pointed to by
diff --git a/share/libc/inttypes.h b/share/libc/inttypes.h
index 0f4880d33e6eb972956f59c942aff8898c3d2422..49becc11ad8aaf4c816cb85cac8aae27c5f24874 100644
--- a/share/libc/inttypes.h
+++ b/share/libc/inttypes.h
@@ -253,9 +253,12 @@ typedef struct __fc_imaxdiv_t
   } imaxdiv_t;
 
 /* ISO C: 7.8.2 */
-/*@ 
-  requires abs_representable: (intmax_t)(-c) != c ;
-  assigns \result \from c ; 
+/*@
+  requires abs_representable: c > INTMAX_MIN;
+  assigns \result \from c;
+  ensures positive_result: \result >= 0.;
+  ensures equal_magnitude_result: \result == c || \result == -c;
+  ensures logical_abs_result: \result == \abs(c);
 */
 extern intmax_t imaxabs(intmax_t c);
 
diff --git a/share/libc/math.h b/share/libc/math.h
index 750ce95085e5b7d9bd78df21e884213802f579eb..10229ad2ec85d98a834f04d16d6f01f5bc7e3046 100644
--- a/share/libc/math.h
+++ b/share/libc/math.h
@@ -702,8 +702,30 @@ extern double fma(double x, double y, double z);
 extern float fmaf(float x, float y, float z);
 extern long double fmal(long double x, long double y, long double z);
 
+/*@
+  assigns \result \from f;
+  behavior finite:
+    assumes isfinite_f: \is_finite(f);
+    ensures nonzero_result: \result > 0 || \result < 0;
+  behavior nonfinite:
+    assumes nonfinite_f: !\is_finite(f);
+    ensures zero_result: \result == 0;
+  complete behaviors;
+  disjoint behaviors;
+*/
 extern int __finitef(float f);
 
+/*@
+  assigns \result \from d;
+  behavior finite:
+    assumes isfinite_d: \is_finite(d);
+    ensures nonzero_result: \result > 0 || \result < 0;
+  behavior nonfinite:
+    assumes nonfinite_d: !\is_finite(d);
+    ensures zero_result: \result == 0;
+  complete behaviors;
+  disjoint behaviors;
+*/
 extern int __finite(double d);
 
 #  define isfinite(x) \
diff --git a/share/libc/stdlib.c b/share/libc/stdlib.c
index 0bd44d021009544f381d6b277966360ec7c11dfe..7437c80fd775481c4bc32ab6d9bd85c3f59dc6f7 100644
--- a/share/libc/stdlib.c
+++ b/share/libc/stdlib.c
@@ -74,7 +74,7 @@ void *calloc(size_t nmemb, size_t size)
   return p;
 }
 
-char *__fc_env[ARG_MAX] __attribute__((FRAMA_C_MODEL));
+char *__fc_env[ARG_MAX];
 // To provide for some non-determinism, __fc_initenv initializes the
 // environment with an arbitrary string
 #define __FC_INITENV_LEN 64
diff --git a/share/libc/stdlib.h b/share/libc/stdlib.h
index e5e7a3e33e45f371eaef678848ae3fa8fd3ac0a0..541fc9664bb7724d7024d8548edb38d5bf4e1475 100644
--- a/share/libc/stdlib.h
+++ b/share/libc/stdlib.h
@@ -261,7 +261,7 @@ extern unsigned long long int strtoull(
      char ** restrict endptr,
      int base);
 
-//@ ghost extern int __fc_random_counter __attribute__((unused)) __attribute__((FRAMA_C_MODEL));
+//@ ghost extern int __fc_random_counter __attribute__((unused));
 const unsigned long __fc_rand_max = __FC_RAND_MAX;
 
 /* ISO C: 7.20.2 */
@@ -284,9 +284,9 @@ extern long int random(void);
 extern void srandom(unsigned int seed);
 
 // used to check if some *48() functions have called the seed initializer
-int __fc_random48_init __attribute__((FRAMA_C_MODEL));
+int __fc_random48_init;
 
-extern unsigned short __fc_random48_counter[3] __attribute__((FRAMA_C_MODEL));
+extern unsigned short __fc_random48_counter[3];
 unsigned short *__fc_p_random48_counter = __fc_random48_counter;
 
 /*@
@@ -480,7 +480,7 @@ extern void exit(int status) __attribute__ ((__noreturn__));
 */
 extern void _Exit(int status) __attribute__ ((__noreturn__));
 
-extern char *__fc_env[ARG_MAX] __attribute__((FRAMA_C_MODEL));
+extern char *__fc_env[ARG_MAX];
 
 /*@
   requires valid_name: valid_read_string(name);
diff --git a/share/libc/sys/ioctl.h b/share/libc/sys/ioctl.h
index 91453478272e1eb297ad7982588723bec1dd14c8..82372ab303722507f054f37237e1fc882b34c54d 100644
--- a/share/libc/sys/ioctl.h
+++ b/share/libc/sys/ioctl.h
@@ -29,6 +29,14 @@
 // For the ioctl() prototype
 #include "../stropts.h"
 
+struct winsize
+{
+  unsigned short int ws_row;
+  unsigned short int ws_col;
+  unsigned short int ws_xpixel;
+  unsigned short int ws_ypixel;
+};
+
 /* Routing table calls.  */
 #define SIOCADDRT	0x890B		/* add routing table entry	*/
 #define SIOCDELRT	0x890C		/* delete routing table entry	*/
@@ -118,7 +126,86 @@
 
 // Some definitions from ioctls.h
 
+#define TCGETS 0x5401
+#define TCSETS 0x5402
+#define TCSETSW 0x5403
+#define TCSETSF 0x5404
+#define TCGETA 0x5405
+#define TCSETA 0x5406
+#define TCSETAW 0x5407
+#define TCSETAF 0x5408
+#define TCSBRK 0x5409
+#define TCXONC 0x540A
+#define TCFLSH 0x540B
+#define TIOCEXCL 0x540C
+#define TIOCNXCL 0x540D
+#define TIOCSCTTY 0x540E
+#define TIOCGPGRP 0x540F
+#define TIOCSPGRP 0x5410
+#define TIOCOUTQ 0x5411
+#define TIOCSTI 0x5412
+#define TIOCGWINSZ 0x5413
+#define TIOCSWINSZ 0x5414
+#define TIOCMGET 0x5415
+#define TIOCMBIS 0x5416
+#define TIOCMBIC 0x5417
+#define TIOCMSET 0x5418
+#define TIOCGSOFTCAR 0x5419
+#define TIOCSSOFTCAR 0x541A
 #define FIONREAD 0x541B
+#define TIOCINQ FIONREAD
+#define TIOCLINUX 0x541C
+#define TIOCCONS 0x541D
+#define TIOCGSERIAL 0x541E
+#define TIOCSSERIAL 0x541F
+#define TIOCPKT 0x5420
+#define FIONBIO 0x5421
+#define TIOCNOTTY 0x5422
+#define TIOCSETD 0x5423
+#define TIOCGETD 0x5424
+#define TCSBRKP 0x5425
+#define TIOCSBRK 0x5427
+#define TIOCCBRK 0x5428
+#define TIOCGSID 0x5429
+#define TIOCGRS485 0x542E
+#ifndef TIOCSRS485
+#define TIOCSRS485 0x542F
+#endif
+#define TCGETX 0x5432
+#define TCSETX 0x5433
+#define TCSETXF 0x5434
+#define TCSETXW 0x5435
+#define TIOCVHANGUP 0x5437
+
+#define FIONCLEX 0x5450
+#define FIOCLEX 0x5451
+#define FIOASYNC 0x5452
+#define TIOCSERCONFIG 0x5453
+#define TIOCSERGWILD 0x5454
+#define TIOCSERSWILD 0x5455
+#define TIOCGLCKTRMIOS 0x5456
+#define TIOCSLCKTRMIOS 0x5457
+#define TIOCSERGSTRUCT 0x5458
+#define TIOCSERGETLSR 0x5459
+#define TIOCSERGETMULTI 0x545A
+#define TIOCSERSETMULTI 0x545B
+
+#define TIOCMIWAIT 0x545C
+#define TIOCGICOUNT 0x545D
+
+#ifndef FIOQSIZE
+# define FIOQSIZE 0x5460
+#endif
+
+#define TIOCPKT_DATA 0
+#define TIOCPKT_FLUSHREAD 1
+#define TIOCPKT_FLUSHWRITE 2
+#define TIOCPKT_STOP 4
+#define TIOCPKT_START 8
+#define TIOCPKT_NOSTOP 16
+#define TIOCPKT_DOSTOP 32
+#define TIOCPKT_IOCTL 64
 
+#define TIOCSER_TEMT 0x01
 
 #endif
diff --git a/share/libc/sys/socket.h b/share/libc/sys/socket.h
index 4a6e6c21f4f0c90c4f9038e42b47340ad1a7ab38..faad4d167cb90fb2aee12659ee8782fb3e903b6a 100644
--- a/share/libc/sys/socket.h
+++ b/share/libc/sys/socket.h
@@ -443,8 +443,29 @@ extern int listen(int sockfd, int backlog);
  */
 extern ssize_t recv(int sockfd, void * buf, size_t len, int flags);
 
-extern ssize_t recvfrom(int, void *, size_t, int,
-        struct sockaddr *, socklen_t *);
+
+/*@
+  requires valid_sockfd: 0 <= sockfd < __FC_MAX_OPEN_SOCKETS;
+  requires valid_buffer_length: \valid((char *)buf+(0 .. len-1));
+  requires valid_addrbuf_or_null: (\valid(addrbuf_len) &&
+                                   \initialized(addrbuf_len) &&
+                                   \valid((char *)addrbuf+(0 .. *addrbuf_len-1)))
+                                  || (addrbuf == \null && addrbuf_len == \null);
+  assigns *((char *)buf+(0 .. len-1)), __fc_sockfds[sockfd], \result
+          \from sockfd, len, flags, __fc_sockfds[sockfd];
+  assigns *addrbuf_len \from indirect:sockfd, indirect: len,
+                             indirect:flags, __fc_sockfds[sockfd];
+  assigns *((char *)addrbuf+(0 .. \old(*addrbuf_len)-1))
+          \from indirect:sockfd, indirect: len,
+                         indirect:flags, __fc_sockfds[sockfd];
+  ensures result_error_or_received_length: \result == -1 || 0 <= \result <= len;
+  ensures initialization:buf: \initialized(((char *)buf+(0 .. \result-1)));
+  ensures initialization:addrbuf:
+          addrbuf != \null ==>
+            \initialized(((char *)addrbuf+(0 .. \old(*addrbuf_len)-1)));
+*/
+extern ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
+                        struct sockaddr *addrbuf, socklen_t *addrbuf_len);
 
 /*@ requires valid_sockfd: 0 <= sockfd < __FC_MAX_OPEN_SOCKETS;
   @ requires msg_control_has_room:
@@ -483,8 +504,22 @@ extern ssize_t recvmsg(int sockfd, struct msghdr *hdr, int flags);
  */
 extern ssize_t send(int sockfd, const void *buf, size_t len, int flags);
 extern ssize_t sendmsg(int, const struct msghdr *, int);
-extern ssize_t sendto(int, const void *, size_t, int, const struct sockaddr *,
-        socklen_t);
+
+/*@
+  requires available_sockfd: 0 <= sockfd < __FC_MAX_OPEN_SOCKETS;
+  requires buf_len_ok: \valid_read(((char*)buf)+(0 .. len - 1));
+  assigns 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;
+  ensures error_or_chars_sent: \result == -1 || 0 <= \result <= len;
+ */
+extern ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
+                      const struct sockaddr *address, socklen_t address_len);
 
 /*@
   requires valid_sockfd: 0 <= sockfd < __FC_MAX_OPEN_SOCKETS;
diff --git a/share/libc/sys/time.h b/share/libc/sys/time.h
index 163aeb422a5f7581f6880ec63e017267e40ff443..e7f0f0ba66f33ac003e6ac54fa4063a03ffdadaf 100644
--- a/share/libc/sys/time.h
+++ b/share/libc/sys/time.h
@@ -42,8 +42,8 @@ struct timezone {
 };
 
 /* Abstract representation of the current time. */
-//@ ghost volatile unsigned int __fc_time __attribute__((FRAMA_C_MODEL));
-//@ ghost extern int __fc_tz __attribute__((FRAMA_C_MODEL));
+//@ ghost volatile unsigned int __fc_time;
+//@ ghost extern int __fc_tz;
 
 /*@
   requires valid_path: valid_read_string(path);
@@ -111,9 +111,9 @@ struct itimerval {
 };
 
 /* Abstract representation of interval timers. */
-//@ ghost volatile struct itimerval __fc_itimer_real    __attribute__((FRAMA_C_MODEL));
-//@ ghost volatile struct itimerval __fc_itimer_virtual __attribute__((FRAMA_C_MODEL));
-//@ ghost volatile struct itimerval __fc_itimer_prof    __attribute__((FRAMA_C_MODEL));
+//@ ghost volatile struct itimerval __fc_itimer_real;
+//@ ghost volatile struct itimerval __fc_itimer_virtual;
+//@ ghost volatile struct itimerval __fc_itimer_prof;
 
 // NOTE: for functions setitimer/getitimer, we do not currently model
 // the signals generated by the timers when they reach zero.
diff --git a/share/libc/time.h b/share/libc/time.h
index 0083859f5e05cee3802b772b3150f0015767f27e..9b11b2503582007f275f894cebdcfafc6a3e45bc 100644
--- a/share/libc/time.h
+++ b/share/libc/time.h
@@ -78,7 +78,7 @@ struct itimerspec {
 #define CLOCK_MONOTONIC 1
 #define TIMER_ABSTIME 1
 
-//@ ghost volatile unsigned int __fc_time __attribute__((FRAMA_C_MODEL));
+//@ ghost volatile unsigned int __fc_time;
 
 /*@ assigns \result \from __fc_time; */
 extern clock_t clock(void);
@@ -206,7 +206,7 @@ extern int clock_gettime(clockid_t clk_id, struct timespec *tp);
   @ }                                           // calling thread
 */
 
-/*@ ghost volatile int __fc_interrupted __attribute__((FRAMA_C_MODEL)); */
+/*@ ghost volatile int __fc_interrupted; */
 
 /*@ // missing: may assign to errno: EINTR, EINVAL, ENOTSUP
     // missing: assigns \result, rmtp \from 'clock having id clock_id'
diff --git a/src/kernel_internals/parsing/clexer.mll b/src/kernel_internals/parsing/clexer.mll
index 603bab87c565977c17eece7e50293bb4e86baaff..71d54b7ee3449b04cebdab892e97bdc67ada3112 100644
--- a/src/kernel_internals/parsing/clexer.mll
+++ b/src/kernel_internals/parsing/clexer.mll
@@ -233,12 +233,12 @@ let init_lexicon _ =
           let filename =
             Filepath.Normalized.to_pretty_string (fst loc).pos_path
           in
-          (* TODO: when 4.07 becomes minimal OCaml version,
-             use String.to_seq and Seq.fold_left. *)
-          let l = ref [] in
-          let convert_char c = l:=Int64.of_int (Char.code c) :: !l in
-          String.iter convert_char filename;
-          CST_STRING (List.rev !l,loc)))
+          let seq = String.to_seq filename in
+          let convert_char c = Int64.of_int (Char.code c) in
+          let l =
+            Seq.fold_left (fun acc c -> convert_char c :: acc) [] seq
+          in
+          CST_STRING (List.rev l,loc)))
     ]
 
 
diff --git a/src/kernel_internals/parsing/cparser.mly b/src/kernel_internals/parsing/cparser.mly
index 05ecc2d4e0835fdd37db0110b7b5cac240296be4..26a088776423753ffba37c1c13e53a6c59c29455 100644
--- a/src/kernel_internals/parsing/cparser.mly
+++ b/src/kernel_internals/parsing/cparser.mly
@@ -145,7 +145,7 @@ let doDeclaration logic_spec (loc: cabsloc) (specs: spec_elem list) (nl: init_na
         match logic_spec with
         | None -> None
         | Some (loc, _ as ls) -> begin
-            Extlib.opt_map
+            Option.map
               (fun (loc', spec) ->
                  let name =
                    match nl with
@@ -181,7 +181,7 @@ let doFunctionDef spec (loc: cabsloc)
                   (b: block) : definition =
   let fname = (specs, n) in
   let name = match n with (n,_,_,_) -> n in
-  Extlib.may (fun (spec, _) -> check_funspec_abrupt_clauses name spec) spec;
+  Option.iter (fun (spec, _) -> check_funspec_abrupt_clauses name spec) spec;
   let b = if !ghost_global then { b with bstmts = in_ghost b.bstmts } else b in
   FUNDEF (spec, fname, b, loc, lend)
 
@@ -1403,7 +1403,7 @@ function_def:  /* (* ISO 6.9.1 *) */
             let (loc, specs, decl) = $2 in
             let spec_loc =
               let loc = fst $1 in
-              Extlib.opt_map
+              Option.map
                 (fun (loc', spec) -> spec, (loc, loc'))
                 (Logic_lexer.spec $1)
             in
diff --git a/src/kernel_internals/parsing/errorloc.ml b/src/kernel_internals/parsing/errorloc.ml
index 3c439cfe907832f4290811a298fe5d90488ab46a..c86c90d612ac304fa9e99da7332fc533e5da9009 100644
--- a/src/kernel_internals/parsing/errorloc.ml
+++ b/src/kernel_internals/parsing/errorloc.ml
@@ -191,12 +191,12 @@ let pp_context_from_file ?(ctx=2) ?start_line fmt pos =
     with _ -> close_in_noerr in_ch
   with _ -> ()
 
-let pretty_pos fmt pos =
+let pp_pos fmt pos =
   if pos = Cil_datatype.Position.unknown then Format.fprintf fmt "<unknown>"
   else Format.fprintf fmt "%d:%d" pos.Filepath.pos_lnum
       (pos.Filepath.pos_cnum - pos.Filepath.pos_bol)
 
-let pretty_pos_between fmt (pos_start, pos_end) =
+let pp_location fmt (pos_start, pos_end) =
   if pos_start.Filepath.pos_path = pos_end.Filepath.pos_path then
     if pos_start.Filepath.pos_lnum = pos_end.Filepath.pos_lnum then
       (* single file, single line *)
@@ -210,7 +210,7 @@ let pretty_pos_between fmt (pos_start, pos_end) =
         pos_start.Filepath.pos_lnum pos_end.Filepath.pos_lnum
   else (* multiple files (very rare) *)
     Format.fprintf fmt "Location: between %a and %a"
-      pretty_pos pos_start pretty_pos pos_end
+      pp_pos pos_start pp_pos pos_end
 
 let parse_error ?(source=Cil_datatype.Position.of_lexing_pos (Lexing.lexeme_start_p !current.lexbuf)) msg =
   let start_pos = try Some (Parsing.symbol_start_pos ()) with | _ -> None in
@@ -239,7 +239,7 @@ let parse_error ?(source=Cil_datatype.Position.of_lexing_pos (Lexing.lexeme_star
         Kernel.feedback ~source:start_pos "%s:@." str
           ~append:(fun fmt ->
             Format.fprintf fmt "%a%a\n"
-              pretty_pos_between (start_pos, source)
+              pp_location (start_pos, source)
               pretty_token (Lexing.lexeme !current.lexbuf);
             Format.fprintf fmt "%a@."
               (pp_context_from_file ~start_line:start_pos.Filepath.pos_lnum ~ctx:2) source);
diff --git a/src/kernel_internals/parsing/errorloc.mli b/src/kernel_internals/parsing/errorloc.mli
index 3722a65a22283a23f9bdacc79837ba15c2ecea30..76ceffd5a5afbf1ddd093864553bc0043a885aa0 100644
--- a/src/kernel_internals/parsing/errorloc.mli
+++ b/src/kernel_internals/parsing/errorloc.mli
@@ -73,6 +73,10 @@ val finishParsing: unit -> unit (** Call this function to finish parsing and
 val pp_context_from_file:
   ?ctx:int -> ?start_line:int -> Format.formatter -> Filepath.position -> unit
 
+(** prints a readable description of a location
+    @since 22.0-Titanium *)
+val pp_location: Format.formatter -> Cil_types.location -> unit
+
 (** Parse errors are usually fatal, but their reporting is sometimes
     delayed until the end of the current parsing phase. Functions that
     intend to ultimately fail should call {!clear_errors} when they
diff --git a/src/kernel_internals/parsing/logic_lexer.mll b/src/kernel_internals/parsing/logic_lexer.mll
index b86e9200489ea822f2dfb2315a2d5134b2bfd3b3..e2471a994e8bc829f5e98c7e27540d6892e099d0 100644
--- a/src/kernel_internals/parsing/logic_lexer.mll
+++ b/src/kernel_internals/parsing/logic_lexer.mll
@@ -26,7 +26,6 @@
 
   open Logic_parser
   open Lexing
-  open Logic_ptree
 
   type state = Normal | Test
 
@@ -207,7 +206,12 @@
             match Logic_env.extension_category s with
             | exception Not_found -> None
             | Cil_types.Ext_contract -> Some (EXT_CONTRACT s)
-            | Cil_types.Ext_global -> Some (EXT_GLOBAL s)
+            | Cil_types.Ext_global ->
+              begin
+                match Logic_env.is_extension_block s with
+                | false -> Some (EXT_GLOBAL s)
+                | true -> Some (EXT_GLOBAL_BLOCK s)
+              end
             | Cil_types.Ext_code_annot _ -> Some (EXT_CODE_ANNOT s)
           end
           else None
@@ -362,17 +366,17 @@ rule token = parse
       end else curr_tok
     }
 
-  | '0'['x''X'] rH+ rIS?    { CONSTANT (IntConstant (lexeme lexbuf)) }
-  | '0'['b''B'] rB+ rIS?    { CONSTANT (IntConstant (lexeme lexbuf)) }
-  | '0' rD+ rIS?            { CONSTANT (IntConstant (lexeme lexbuf)) }
-  | rD+                     { CONSTANT10 (lexeme lexbuf) }
-  | rD+ rIS                 { CONSTANT (IntConstant (lexeme lexbuf)) }
+  | '0'['x''X'] rH+ rIS?    { INT_CONSTANT (lexeme lexbuf) }
+  | '0'['b''B'] rB+ rIS?    { INT_CONSTANT (lexeme lexbuf) }
+  | '0' rD+ rIS?            { INT_CONSTANT (lexeme lexbuf) }
+  | rD+                     { INT_CONSTANT (lexeme lexbuf) }
+  | rD+ rIS                 { INT_CONSTANT (lexeme lexbuf) }
   | ('L'? "'" as prelude) (([^ '\\' '\'' '\n']|("\\"[^ '\n']))+ as content) "'"
       {
         let b = Buffer.create 5 in
         Buffer.add_string b prelude;
         let lbf = Lexing.from_string content in
-        CONSTANT (IntConstant (chr b lbf ^ "'"))
+        INT_CONSTANT (chr b lbf ^ "'")
       }
 (* floating-point literals, both decimal and hexadecimal *)
   | rD+ rE rFS?
@@ -381,11 +385,11 @@ rule token = parse
   | '0'['x''X'] rH+ '.' rH* rP rFS?
   | '0'['x''X'] rH* '.' rH+ rP rFS?
   | '0'['x''X'] rH+ rP rFS?
-      { CONSTANT (FloatConstant (lexeme lexbuf)) }
+      { FLOAT_CONSTANT (lexeme lexbuf) }
 
  (* hack to lex 0..3 as 0 .. 3 and not as 0. .3 *)
   | (rD+ as n) ".."         { lexbuf.lex_curr_pos <- lexbuf.lex_curr_pos - 2;
-                              CONSTANT (IntConstant n) }
+                              INT_CONSTANT n }
 
   | 'L'? '"' as prelude (([^ '\\' '"' '\n']|("\\"[^ '\n']))* as content) '"'
       { STRING_LITERAL (prelude.[0] = 'L',content) }
@@ -565,8 +569,9 @@ and comment = parse
       | Logic_utils.Not_well_formed (loc, m) ->
         output ~source:(fst loc) "%s" m;
         None
-      | Log.FeatureRequest(_,msg) ->
-        output ~source:(Cil_datatype.Position.of_lexing_pos lb.lex_curr_p) "unimplemented ACSL feature: %s" msg; None
+      | Log.FeatureRequest(source,_,msg) ->
+        let source = Option.value ~default:(Cil_datatype.Position.of_lexing_pos lb.lex_curr_p) source in
+        output ~source "unimplemented ACSL feature: %s" msg; None
       | exn ->
         Kernel.fatal ~source:(Cil_datatype.Position.of_lexing_pos lb.lex_curr_p) "Unknown error (%s)"
           (Printexc.to_string exn)
diff --git a/src/kernel_internals/parsing/logic_parser.mly b/src/kernel_internals/parsing/logic_parser.mly
index 0bff4b69eda3bb3a77ca80cddbc3294ddbc2acfb..aff0ff384ad84bba322d6ac71bc4ac8be26bc350 100644
--- a/src/kernel_internals/parsing/logic_parser.mly
+++ b/src/kernel_internals/parsing/logic_parser.mly
@@ -107,15 +107,25 @@
 
   let loc_decl d = { decl_node = d; decl_loc = loc () }
 
-  let concat_froms a1 a2 =
-    let compare_pair (b1,_) (b2,_) = is_same_lexpr b1 b2 in
+  let loc_ext d = { extended_node = d; extended_loc = loc () }
+
+  let filter_from l = function
+    | FromAny ->
+      l, FromAny
+    | From ds ->
+      let f ds d = if List.exists (is_same_lexpr d) ds then ds else d :: ds in
+      l, From(List.(rev (fold_left f [] ds)))
+
+  let concat_froms cura newa =
+    let compare_pair (curb,_) (newb,_) = is_same_lexpr curb newb in
     (* NB: the following has an horrible complexity, but the order of
        clauses in the input is preserved. *)
-    let concat_one acc (_,f2 as p)  =
+    let concat_one acc (newloc, newf)  =
+      let (newloc, newf) as p = filter_from newloc newf in
       try
-        let (_,f1) = List.find (compare_pair p) acc
+        let (curloc,curf) = List.find (compare_pair p) acc
         in
-        match (f1, f2) with
+        match (curf, newf) with
           | _,FromAny ->
             (* the new fundeps does not give more information than the one
                which is already present. Just ignore it.
@@ -128,12 +138,28 @@
                  that we get the exact same clause if we try to
                  link the original contract with its pretty-printed version. *)
               Extlib.replace compare_pair p acc
-          | From _, From _ ->
-            (* we keep the two functional dependencies,
-               as they have to be proved separately. *)
-            acc @ [p]
+          | From curl, From newl ->
+            let incl l lin =
+              List.(for_all (fun e -> exists (is_same_lexpr e) lin) l)
+            in
+            let drop d k =
+              Kernel.warning ~current:false ~wkey:Kernel.wkey_multi_from
+                "Drop '%a' \\from at %a for more precise one at %a"
+                Logic_print.print_lexpr curloc
+                Cil_datatype.Location.pretty d.lexpr_loc
+                Cil_datatype.Location.pretty k.lexpr_loc
+            in
+            if incl curl newl then begin
+              if not (incl newl curl) then drop newloc curloc;
+              acc
+            end
+            else if incl newl curl then begin
+              drop curloc newloc;
+              Extlib.replace compare_pair p acc
+            end
+            else acc @ [p]
       with Not_found -> acc @ [p]
-    in List.fold_left concat_one a1 a2
+    in List.fold_left concat_one cura newa
 
   let concat_allocation fa1 fa2 =
     match fa1,fa2 with
@@ -149,7 +175,7 @@
       | Writes [], _  | Writes _, [] ->
         raise (
           Not_well_formed (loc(),"Mixing \\nothing and a real location"))
-      | Writes a1, a2 -> Writes (concat_froms a2 a1)
+      | Writes a1, a2 -> Writes (concat_froms (concat_froms [] a2) a1)
 
   let concat_loop_assigns_allocation annots bhvs2 a2 fa2=
     (* NB: this is supposed to merge assigns related to named behaviors, in
@@ -238,8 +264,10 @@
 /* ACSL extension for external spec  file */
 %token <string> IDENTIFIER TYPENAME
 %token <bool*string> STRING_LITERAL
-%token <Logic_ptree.constant> CONSTANT
-%token <string> CONSTANT10
+%token <string> INT_CONSTANT
+%token <string> FLOAT_CONSTANT
+%token <string> STRING_CONSTANT
+%token <string> WSTRING_CONSTANT
 %token LPAR RPAR IF ELSE COLON COLON2 COLONCOLON DOT DOTDOT DOTDOTDOT
 %token INT INTEGER REAL BOOLEAN BOOL FLOAT LT GT LE GE EQ NE COMMA ARROW EQUAL
 %token FORALL EXISTS IFF IMPLIES AND OR NOT SEPARATED
@@ -253,7 +281,7 @@
 %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 <string> EXT_CODE_ANNOT EXT_GLOBAL EXT_GLOBAL_BLOCK EXT_CONTRACT
 %token EXITS BREAKS CONTINUES RETURNS
 %token VOLATILE READS WRITES
 %token LOGIC PREDICATE INDUCTIVE AXIOMATIC AXIOM LEMMA LBRACE RBRACE
@@ -484,12 +512,23 @@ lexpr_inner:
 | ALLOCABLE opt_label_1 LPAR lexpr RPAR { info (PLallocable ($2,$4)) }
 | FREEABLE opt_label_1 LPAR lexpr RPAR { info (PLfreeable ($2,$4)) }
 | ALLOCATION opt_label_1 LPAR lexpr RPAR
-  { Kernel.not_yet_implemented "\\allocation" }
-| AUTOMATIC { Kernel.not_yet_implemented "\\automatic" }
-| DYNAMIC { Kernel.not_yet_implemented "\\dynamic" }
-| REGISTER { Kernel.not_yet_implemented "\\register" }
-| STATIC { Kernel.not_yet_implemented "\\static" }
-| UNALLOCATED { Kernel.not_yet_implemented "\\unallocated" }
+  { let source = fst(loc()) in
+    Kernel.not_yet_implemented ~source "\\allocation" }
+| AUTOMATIC {
+  let source = fst(loc()) in
+  Kernel.not_yet_implemented ~source "\\automatic" }
+| DYNAMIC {
+  let source = fst(loc()) in
+  Kernel.not_yet_implemented ~source "\\dynamic" }
+| REGISTER {
+  let source = fst(loc()) in
+  Kernel.not_yet_implemented ~source "\\register" }
+| STATIC {
+  let source = fst(loc()) in
+  Kernel.not_yet_implemented ~source "\\static" }
+| UNALLOCATED {
+  let source = fst(loc()) in
+  Kernel.not_yet_implemented ~source "\\unallocated" }
 | NULL { info PLnull }
 | constant { info (PLconstant $1) }
 | lexpr_inner PLUS lexpr_inner { info (PLbinop ($1, Badd, $3)) }
@@ -652,12 +691,14 @@ var_spec:
 ;
 
 constant:
-| CONSTANT   { $1 }
-| CONSTANT10 { IntConstant $1 }
+| INT_CONSTANT   { IntConstant $1 }
+| FLOAT_CONSTANT { FloatConstant $1 }
+| STRING_CONSTANT { StringConstant $1 }
+| WSTRING_CONSTANT { WStringConstant $1 }
 ;
 
 array_size:
-| CONSTANT10 { ASinteger $1 }
+| INT_CONSTANT { ASinteger $1 }
 | identifier { ASidentifier $1 }
 | /* empty */ { ASnone }
 ;
@@ -680,7 +721,8 @@ abs_param_type_list:
 | /* empty */    { [ ] }
 | abs_param_list { $1 }
 | abs_param_list COMMA DOTDOTDOT {
-    Kernel.not_yet_implemented "variadic C function types"
+  let source = fst(loc()) in
+  Kernel.not_yet_implemented ~source "variadic C function types"
   }
 ;
 
@@ -1014,7 +1056,7 @@ ext_contract_markup:
 
 stmt_markup:
 | any_identifier { $1 }
-| CONSTANT10 { $1 }
+| INT_CONSTANT { $1 }
 ;
 
 stmt_markup_attr:
@@ -1532,13 +1574,34 @@ decl:
 | type_annot {LDtype_annot $1}
 | model_annot {LDmodel_annot $1}
 | logic_def  { $1 }
-| EXT_GLOBAL grammar_extension SEMICOLON {
-    let processed = Logic_env.preprocess_extension $1 $2 in
-	  LDextended ($1, processed)
-  }
+| ext_decl { LDextended $1 }
 | deprecated_logic_decl { $1 }
 ;
 
+ext_decl:
+| EXT_GLOBAL grammar_extension SEMICOLON {
+     let processed = Logic_env.preprocess_extension $1 $2 in
+     Ext_lexpr($1, processed)
+   }
+| EXT_GLOBAL_BLOCK any_identifier LBRACE ext_decls RBRACE {
+    let processed_id,processed_block =
+       Logic_env.preprocess_extension_block $1 ($2,$4)
+    in
+    Ext_extension($1,processed_id,processed_block)
+   }
+;
+
+ext_decls:
+| /* epsilon */
+    { [] }
+| ext_decl_loc ext_decls
+    { $1::$2 }
+;
+
+ext_decl_loc:
+| ext_decl { loc_ext $1 }
+;
+
 volatile_opt:
 | /* empty */ { None, None }
 | READS any_identifier volatile_opt
@@ -1893,6 +1956,7 @@ is_acsl_spec:
 is_acsl_decl_or_code_annot:
 | EXT_CODE_ANNOT { $1 }
 | EXT_GLOBAL     { $1 }
+| EXT_GLOBAL_BLOCK     { $1 }
 | ASSUMES   { "assumes" }
 | ASSERT    { "assert" }
 | CHECK     { "check" }
@@ -1993,8 +2057,10 @@ wildcard:
 | COLON2 { () }
 | COLONCOLON { () }
 | COMMA { () }
-| CONSTANT { () }
-| CONSTANT10 { () }
+| INT_CONSTANT { () }
+| FLOAT_CONSTANT { () }
+| STRING_CONSTANT { () }
+| WSTRING_CONSTANT { () }
 | DOLLAR { () }
 | DOT { () }
 | DOTDOT { () }
diff --git a/src/kernel_internals/parsing/logic_preprocess.mll b/src/kernel_internals/parsing/logic_preprocess.mll
index 34ea01b4d6bda1c8a16eb82d54425fc1b82b90ef..765d158daf4a966e8c609f7a6f0e56426b143a7e 100644
--- a/src/kernel_internals/parsing/logic_preprocess.mll
+++ b/src/kernel_internals/parsing/logic_preprocess.mll
@@ -62,9 +62,30 @@
 
   let backslash = "__ANNOT_BACKSLASH__"
   let annot_content = "__ANNOT_CONTENT__"
+  let utf8_prefix = "__FC_UTF8_"
+
+  let encode_utf8 c = utf8_prefix  ^ (string_of_int (Char.code c))
 
   let re_backslash = Str.regexp_string backslash
   let re_annot_content = Str.regexp_string annot_content
+  let re_utf8 = Str.regexp (utf8_prefix ^ "\\([0-9]+\\)")
+
+  let decode_utf8 s =
+    let res = ref s in
+    let start = ref 0 in
+    try
+      while true do
+        let b = Str.search_forward re_utf8 !res !start in
+        let e = Str.match_end () in
+        let chr = Char.chr (int_of_string (Str.matched_group 1 !res)) in
+        let buf = Bytes.of_string !res in
+        Bytes.set buf b chr;
+        Bytes.blit buf e buf (b+1) (String.length !res - e);
+        res:= Bytes.sub_string buf 0 (String.length !res + 1 + b - e);
+        start := b+1;
+      done;
+      assert false;
+    with Not_found -> !res
 
   (* Delimiters for the various annotations in the preprocessing buffer.
      We have one delimiter for the beginning of an annotation (to discard
@@ -115,7 +136,7 @@
       ignore_content ();
       ignore (input_line file); (* ignore the #line directive *)
       let with_nl, content = get_annot true in
-      with_nl, replace_backslash content
+      with_nl, decode_utf8 @@ replace_backslash content
     with End_of_file ->
       Kernel.fatal
         "too few annotations in result file while pre-processing annotations"
@@ -184,6 +205,8 @@
     add_preprocess_line_info()
 }
 
+let utf8 = ['\128'-'\255']
+
 rule main = parse
   | ("#define"|"#undef") [' ''\t']* ((['a'-'z''A'-'Z''0'-'9''_'])* as m)
       {
@@ -388,6 +411,10 @@ and annot = parse
         is_newline:=CHAR;
         Buffer.add_char preprocess_buffer '"';
         string annot lexbuf }
+  | utf8 as c {
+     Buffer.add_string preprocess_buffer (encode_utf8 c);
+     annot lexbuf
+    }
   | _ as c { is_newline := CHAR;
              Buffer.add_char preprocess_buffer c;
              annot lexbuf }
diff --git a/src/kernel_internals/runtime/frama_c_config.ml.in b/src/kernel_internals/runtime/frama_c_config.ml.in
deleted file mode 100644
index 6b0e200a724380edfba96d88e2aaa62243da89fb..0000000000000000000000000000000000000000
--- a/src/kernel_internals/runtime/frama_c_config.ml.in
+++ /dev/null
@@ -1,89 +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).            *)
-(*                                                                        *)
-(**************************************************************************)
-
-# 24 "src/kernel_internals/runtime/frama_c_config.ml.in"
-
-(** This file is *not* linked in Frama-C. Instead, is it is concatenated
-    to Config, to create a standalone executable *)
-
-let version _ =
-  Format.printf
-    "Frama-C %s (%s)@\n\
-     Environment:@\n  \
-       FRAMAC_SHARE  = %S@\n  \
-       FRAMAC_LIB    = %S@\n  \
-       FRAMAC_PLUGIN = %S@."
-    Fc_config.version Fc_config.codename
-    Fc_config.datadir Fc_config.libdir Fc_config.plugin_path
-  ;
-  exit 0
-
-let options = Arg.([
-  "-print-share-path",
-  Unit (fun _ -> Format.printf "%s%!" Fc_config.datadir; exit 0),
-  " Print the path of Frama-C share directory";
-
-  "-share",
-  Unit (fun _ -> Format.printf "%s%!" Fc_config.datadir; exit 0),
-  " Alias for -print-share-path";
-
-  "-libc",
-  Unit (fun _ -> Format.printf "%s%!"
-           (Filename.concat Fc_config.datadir "libc"); exit 0),
-  " Print the path of Frama-C standard library directory";
-
-  "-scripts",
-  Unit (fun _ -> Format.printf "%s%!"
-           (Filename.concat Fc_config.datadir "analysis-scripts"); exit 0),
-  " Print the path of Frama-C analysis-scripts directory";
-
-  "-print-libpath",
-  Unit (fun _ -> Format.printf "%s%!" Fc_config.libdir; exit 0),
-  " Print the path of Frama-C kernel library";
-
-  "-libpath",
-  Unit (fun _ -> Format.printf "%s%!" Fc_config.libdir; exit 0),
-  " Alias for -print-libpath";
-
-  "-print-plugin-path",
-  Unit (fun _ -> Format.printf "%s%!" Fc_config.plugin_path; exit 0),
-  " Print the path where Frama-C dynamic plug-ins are searched for";
-
-  "-plugin-path",
-  Unit (fun _ -> Format.printf "%s%!" Fc_config.plugin_path; exit 0),
-  " Alias for -print-plugin-path";
-
-  "-print-version",
-  Unit (fun _ -> Format.printf "%s%!" Fc_config.version; exit 0),
-  " Print the version number of Frama-C";
-
-  "-version",
-  Unit version,
-  " Display full version and configuration information"
-])
-
-let usage = "\
-Usage:  frama-c-config <option>"
-
-let () =
-  Arg.parse options (fun _ -> ()) usage;
-  version () (* We only get here if no option has been specified *)
diff --git a/src/kernel_internals/runtime/messages.ml b/src/kernel_internals/runtime/messages.ml
index 30ad09ac69fb87b4d9ca6288d1e21358efde9ae8..2f4cffa49367a7dd56c1652b158f4c3100c96fef 100644
--- a/src/kernel_internals/runtime/messages.ml
+++ b/src/kernel_internals/runtime/messages.ml
@@ -23,51 +23,53 @@
 module DatatypeMessages =
   Datatype.Make_with_collections
     (struct
-       include Datatype.Serializable_undefined
-       open Log
-       type t = event
-       let name = "message"
-       let reprs =
-         [ { evt_kind = Failure;
-             evt_plugin = "";
-             evt_category = None;
-             evt_source = None;
-             evt_message = "" } ]
-       let mem_project = Datatype.never_any_project
-       let hash (e: event)= Hashtbl.hash e
-       let compare (e1: event) e2 = Extlib.compare_basic e1 e2
-       let equal = Datatype.from_compare
-     end)
+      include Datatype.Serializable_undefined
+      open Log
+      type t = event
+      let name = "message"
+      let reprs =
+        [ { evt_kind = Failure;
+            evt_plugin = "";
+            evt_category = None;
+            evt_source = None;
+            evt_message = "" } ]
+      let mem_project = Datatype.never_any_project
+      let hash (e: event)= Hashtbl.hash e
+      let compare (e1: event) e2 = Extlib.compare_basic e1 e2
+      let equal = Datatype.from_compare
+    end)
 
 module Messages =
   State_builder.List_ref
     (DatatypeMessages)
     (struct
-       let name = "Messages.message_table"
-       let dependencies = [ Ast.self ]
-     end)
+      let name = "Messages.message_table"
+      let dependencies = [ Ast.self ]
+    end)
 let () = Ast.add_monotonic_state Messages.self
 
+let hooks = ref []
 let add_message m =
-  Messages.set (m :: Messages.get ());;
+  begin
+    Messages.set (m :: Messages.get ()) ;
+    List.iter (fun fn -> fn()) !hooks ;
+  end
 
 let nb_errors () =
-  let n = ref 0 in
-  Messages.iter (fun e ->
-      match e.Log.evt_kind with
-      | Log.Error -> incr n
-      | _ -> ());
-  !n
+  Messages.fold_left
+    (fun n e ->
+       match e.Log.evt_kind with
+       | Log.Error -> succ n
+       | _ -> n) 0
 
 let nb_warnings () =
-  let n = ref 0 in
-  Messages.iter (fun e ->
-      match e.Log.evt_kind with
-      | Log.Warning -> incr n
-      | _ -> ());
-  !n
+  Messages.fold_left
+    (fun n e ->
+       match e.Log.evt_kind with
+       | Log.Warning -> succ n
+       | _ -> n) 0
 
-let nb_messages() = nb_errors() + nb_warnings();;
+let nb_messages() = List.length (Messages.get ())
 
 let self = Messages.self
 
@@ -75,10 +77,9 @@ let iter f = List.iter f (List.rev (Messages.get ()))
 let dump_messages () = iter Log.echo
 
 let () =
-  Log.add_listener ~kind:[ Log.Error; Log.Warning ] add_message;
-;;
+  Log.add_listener ~kind:[ Log.Error; Log.Warning ] add_message
 
-module OnceTable = 
+module OnceTable =
   State_builder.Hashtbl
     (DatatypeMessages.Hashtbl)
     (Datatype.Unit)
@@ -86,12 +87,12 @@ module OnceTable =
       let size = 37
       let dependencies = [ Ast.self ]
       let name = "Messages.OnceTable"
-     end)
+    end)
 
 let check_not_yet evt =
   if OnceTable.mem evt then false
   else begin
-    OnceTable.add evt (); 
+    OnceTable.add evt ();
     true
   end
 
@@ -99,6 +100,7 @@ let () = Log.check_not_yet := check_not_yet
 
 let reset_once_flag () = OnceTable.clear ()
 
+let add_global_hook fn = hooks := !hooks @ [fn]
 
 (*
 Local Variables:
diff --git a/src/kernel_internals/runtime/messages.mli b/src/kernel_internals/runtime/messages.mli
index c78dec23b50e5a21ff0f5dbb5c919d5b264d1bf6..11f26cc5bf12d49304fa30a01e87d592f44d3c21 100644
--- a/src/kernel_internals/runtime/messages.mli
+++ b/src/kernel_internals/runtime/messages.mli
@@ -24,19 +24,19 @@
     Currently, only warning and error messages are stored. *)
 
 val iter: (Log.event -> unit) -> unit
-  (** Iter over all stored messages. The messages are passed in emission order.
-      @modify Nitrogen-20111001  Messages are now passed in emission order. *)
+(** Iter over all stored messages. The messages are passed in emission order.
+    @modify Nitrogen-20111001  Messages are now passed in emission order. *)
 
 val dump_messages: unit -> unit
-  (** Dump stored messages to standard channels *)
+(** Dump stored messages to standard channels *)
 
 val self: State.t
-  (** Internal state of stored messages *)
+(** Internal state of stored messages *)
 
 val reset_once_flag : unit -> unit
-  (** Reset the [once] flag of pretty-printers. Messages already printed
-      will be printed again.
-      @since Boron-20100401 *)
+(** Reset the [once] flag of pretty-printers. Messages already printed
+    will be printed again.
+    @since Boron-20100401 *)
 
 val nb_errors: unit -> int
 val nb_warnings: unit -> int
@@ -44,6 +44,9 @@ val nb_messages: unit -> int
 (** Number of stored warning messages, error messages, or all
     messages.*)
 
+val add_global_hook: (unit -> unit) -> unit
+(** Register a global hook (not projectified) on message addition. *)
+
 (*
 Local Variables:
 compile-command: "make -C ../../.."
diff --git a/src/kernel_internals/runtime/special_hooks.ml b/src/kernel_internals/runtime/special_hooks.ml
index 6936800dc9ce718ed79b232e5a6666dc87a7ee2d..9b776290f686b7b14aee48c833cc291f55f2e93b 100644
--- a/src/kernel_internals/runtime/special_hooks.ml
+++ b/src/kernel_internals/runtime/special_hooks.ml
@@ -20,18 +20,13 @@
 (*                                                                        *)
 (**************************************************************************)
 
-(* just after loading all plug-ins, add the dependencies between the AST
-   and the command line options that depend on it. *)
-let () =
-  Cmdline.run_after_extended_stage
-    (fun () ->
-      State_dependency_graph.add_dependencies
-        ~from:Ast.self
-        !Parameter_builder.ast_dependencies)
+(**************************************************************************)
+(* Hooks run very early *)
+(**************************************************************************)
 
 let print_config () =
   if Kernel.PrintConfig.get () then begin
-    Log.print_on_output 
+    Log.print_on_output
       (fun fmt -> Format.fprintf fmt
           "Frama-C %s@\n\
            Environment:@\n  \
@@ -48,7 +43,7 @@ let print_config () =
               "@\nWarning: default pre-processor is not able to keep comments \
                (hence ACSL annotations) in its output")
         ;
-        );
+      );
     raise Cmdline.Exit
   end
 let () = Cmdline.run_after_early_stage print_config
@@ -64,8 +59,8 @@ let print_configl get value () =
     Log.print_on_output (fun fmt -> (Format.fprintf fmt "%s%!" (String.concat "\n" value))) ;
     raise Cmdline.Exit
   end
-
-let print_version = print_config Kernel.PrintVersion.get Fc_config.version_and_codename
+let print_version =
+  print_config Kernel.PrintVersion.get Fc_config.version_and_codename
 let () = Cmdline.run_after_early_stage print_version
 
 let print_sharepath = print_configl Kernel.PrintShare.get Fc_config.datadirs
@@ -74,6 +69,39 @@ let () = Cmdline.run_after_early_stage print_sharepath
 let print_libpath = print_configl Kernel.PrintLib.get Fc_config.plugin_dir
 let () = Cmdline.run_after_early_stage print_libpath
 
+(**************************************************************************)
+(* Hooks run after loading plug-ins *)
+(**************************************************************************)
+
+(* just after loading all plug-ins, add the dependencies between the AST
+   and the command line options that depend on it. *)
+let () =
+  Cmdline.run_after_extended_stage
+    (fun () ->
+       State_dependency_graph.add_dependencies
+         ~from:Ast.self
+         !Parameter_builder.ast_dependencies)
+
+(**************************************************************************)
+(* Hooks run when restoring a saved file *)
+(**************************************************************************)
+
+(* Load Frama-c from disk if required *)
+let load_binary () =
+  let filepath = Kernel.LoadState.get () in
+  if filepath <> Filepath.Normalized.unknown then begin
+    try
+      Project.load_all filepath
+    with Project.IOError s ->
+      Kernel.abort "problem while loading file %a (%s)"
+        Filepath.Normalized.pretty filepath s
+  end
+let () = Cmdline.run_after_loading_stage load_binary
+
+(**************************************************************************)
+(* Hooks run when exiting *)
+(**************************************************************************)
+
 let print_machdep () =
   if Kernel.PrintMachdep.get () then begin
     File.pretty_machdep ();
@@ -82,7 +110,6 @@ let print_machdep () =
     Cmdline.nop
 let () = Cmdline.run_after_exiting_stage print_machdep
 
-
 (* Time *)
 let time () =
   let filename = Kernel.Time.get () in
@@ -120,13 +147,13 @@ let save_binary error_extension =
            modifying filename into `%s'." s;
         Filepath.Normalized.of_string s
     in
-    try 
+    try
       Project.save_all realname
     with Project.IOError s ->
       Kernel.error "problem while saving to file %a (%s)."
         Filepath.Normalized.pretty realname s
   end
-let () = 
+let () =
   (* implement a refinement of the behavior described in BTS #1388:
      - on normal exit: save
      - on Sys.break, system error or feature request: do not save
@@ -139,29 +166,14 @@ let () =
       | Log.AbortError _ -> save_binary (Some ".error")
       | _ -> save_binary (Some ".crash"))
 
-(* Load Frama-c from disk if required *)
-let load_binary () =
-  let filepath = Kernel.LoadState.get () in
-  if filepath <> Filepath.Normalized.unknown then begin
-    try
-      Project.load_all filepath
-    with Project.IOError s ->
-      Kernel.abort "problem while loading file %a (%s)"
-        Filepath.Normalized.pretty filepath s
-  end
-let () = Cmdline.run_after_loading_stage load_binary
-
-(* This hook cannot be registered directly in Kernel or Cabs2cil, as it
-   depends on Ast_info *)
-let on_call_to_undeclared_function vi =
-  let name = vi.Cil_types.vname in
-  if not (Ast_info.is_frama_c_builtin name) then
-    Kernel.warning ~wkey:Kernel.wkey_implicit_function_declaration
-      ~current:true ~once:true
-      "Calling undeclared function %s. Old style K&R code?" name
+(* Write JSON files to disk if required *)
+let flush_json_files () =
+  let written = Json.flush_cache () in
+  List.iter (fun fp ->
+      Kernel.feedback "Wrote: %a" Filepath.Normalized.pretty fp)
+    written
 
-let () =
-  Cabs2cil.register_implicit_prototype_hook on_call_to_undeclared_function
+let () = Cmdline.at_normal_exit (fun () -> flush_json_files ())
 
 let run_list_all_plugin_options () =
   if not (Kernel.AutocompleteHelp.is_empty ()) then begin
@@ -223,6 +235,22 @@ let run_list_all_plugin_options () =
   else Cmdline.nop
 let () = Cmdline.run_after_exiting_stage run_list_all_plugin_options
 
+(**************************************************************************)
+(* Hooks independent from cmdline ordering *)
+(**************************************************************************)
+
+(* This hook cannot be registered directly in Kernel or Cabs2cil, as it
+   depends on Ast_info *)
+let on_call_to_undeclared_function vi =
+  let name = vi.Cil_types.vname in
+  if not (Ast_info.is_frama_c_builtin name) then
+    Kernel.warning ~wkey:Kernel.wkey_implicit_function_declaration
+      ~current:true ~once:true
+      "Calling undeclared function %s. Old style K&R code?" name
+
+let () =
+  Cabs2cil.register_implicit_prototype_hook on_call_to_undeclared_function
+
 (*
 Local Variables:
 compile-command: "make -C ../../.."
diff --git a/src/kernel_internals/typing/asm_contracts.ml b/src/kernel_internals/typing/asm_contracts.ml
index b61d0d1c2b343fee034e3bf7e7c162d7affd86e3..a841b52040557d15f88774c4f07f1a99193a75d9 100644
--- a/src/kernel_internals/typing/asm_contracts.ml
+++ b/src/kernel_internals/typing/asm_contracts.ml
@@ -104,7 +104,7 @@ let extract_mem_term ~loc acc tlv =
   match Logic_utils.unroll_type (Cil.typeOfTermLval tlv) with
   | Ctype (TPtr _ ) -> access_ptr_elts ~loc tlv :: acc
   | Ctype (TArray(_,e,_,_)) ->
-    let size = Extlib.opt_bind (Cil.constFoldToInt ~machdep:true) e in
+    let size = Option.bind e (Cil.constFoldToInt ~machdep:true) in
     access_elts ~loc ?size tlv :: acc
   | _ -> acc
 
@@ -116,8 +116,8 @@ class visit_assembly =
     inherit Visitor.frama_c_inplace
 
     method! vinst i =
-      let stmt = Extlib.the self#current_stmt in
-      let kf = Extlib.the self#current_kf in
+      let stmt = Option.get self#current_stmt in
+      let kf = Option.get self#current_kf in
       match i with
       | Asm(_, _, Some { asm_outputs; asm_inputs; asm_clobbers }, loc) ->
         let lv_out, lv_from = find_out_lval asm_outputs in
@@ -195,7 +195,7 @@ class visit_assembly =
              List.iter
                Property_status.(
                  fun x -> emit emitter ~hyps:[] x True)
-               (Extlib.list_of_opt ip_assigns @ ip_from)
+               (Option.to_list ip_assigns @ ip_from)
            end
          | [ { annot_content = AStmtSpec ([], spec) } ] ->
            (* Already existing contracts. Just add assigns clause for
diff --git a/src/kernel_internals/typing/cabs2cil.ml b/src/kernel_internals/typing/cabs2cil.ml
index 89290cbc8816f5a0694977e7ba49d2ed6a279850..703a2ea9f3b3548161133d0236d1928de8340b5d 100644
--- a/src/kernel_internals/typing/cabs2cil.ml
+++ b/src/kernel_internals/typing/cabs2cil.ml
@@ -388,7 +388,7 @@ let packing_pragma_stack = Stack.create ()
 let current_packing_pragma = ref None
 let pretty_current_packing_pragma fmt =
   let align =
-    Extlib.opt_conv (Integer.of_int theMachine.theMachine.alignof_aligned)
+    Option.value ~default:(Integer.of_int theMachine.theMachine.alignof_aligned)
       !current_packing_pragma
   in
   (Integer.pretty ~hexa:false) fmt align
@@ -688,10 +688,10 @@ let isTransparentUnion (t: typ) : fieldinfo option =
     (* Turn transparent unions into the type of their first field *)
     if typeHasAttribute "transparent_union" t then begin
       match comp.cfields with
-      | [] ->
+      | Some [] | None ->
         abort_context
           "Empty transparent union: %s" (compFullName comp)
-      | f :: _ -> Some f
+      | Some (f :: _) -> Some f
     end else
       None
   | _ -> None
@@ -1208,6 +1208,7 @@ let get_temp_name ghost () =
 (* Create a new temporary variable *)
 let newTempVar ~ghost loc descr (descrpure:bool) typ =
   let t' = (!typeForInsertedVar) typ in
+  let t' = Cil.typeRemoveAttributes ["const"] t' in
   let name = get_temp_name ghost () in
   let vi = makeVarinfo ~ghost ~temp:true ~loc false false name t' in
   vi.vdescr <- Some descr;
@@ -1262,7 +1263,8 @@ let createCompInfo (iss: bool) (n: string) ~(norig: string) : compinfo * bool =
   with Not_found -> begin
       (* Create a compinfo. This will have "cdefined" false. *)
       let res =
-        Cil_const.mkCompInfo iss n ~norig (fun _ ->[]) (fc_stdlib_attribute [])
+        Cil_const.mkCompInfo
+          iss n ~norig (fun _ -> None) (fc_stdlib_attribute [])
       in
       H.add compInfoNameEnv key res;
       res, true
@@ -3216,7 +3218,7 @@ let setupBuiltin ?(force_keep=false) name ?spec (resTyp, args_or_argtypes, isva)
     | None -> empty_funspec ()
     | Some s -> s
   in
-  cabsPushGlobal (GFunDecl (funspec, v, Cil.builtinLoc));
+  cabsPushGlobal (GFunDecl (funspec, v, Cil_builtins.builtinLoc));
   Cil.unsafeSetFormalsDecl v args;
   if force_keep then
     v.vattr <- Cil.addAttribute (Attr ("FC_BUILTIN",[])) v.vattr;
@@ -3341,7 +3343,7 @@ let rec setOneInit this o preinit =
           | f' :: _ when f'.fname = f.fname -> idx
           | _ :: restf -> loop (idx + 1) restf
         in
-        loop 0 f.fcomp.cfields, off
+        loop 0 (Option.value ~default:[] f.fcomp.cfields), off
       | _ -> abort_context "setOneInit: non-constant index"
     in
     let pMaxIdx, pArray =
@@ -3518,7 +3520,8 @@ let rec collectInitializer
             let rest, reads' = collect (idx+1) reads' restf in
             (Field(f, NoOffset), thisi) :: rest, reads'
       in
-      let init, reads = collect 0 reads comp.cfields in
+      let init, reads =
+        collect 0 reads (Option.value ~default:[] comp.cfields) in
       CompoundInit (thistype, init), thistype, reads
 
     | TComp (comp, _, _), CompoundPre (pMaxIdx, pArray) when not comp.cstruct ->
@@ -3542,7 +3545,7 @@ let rec collectInitializer
       if Cil.msvcMode () && !pMaxIdx != 0 then
         Kernel.warning ~current:true
           "On MSVC we can initialize only the first field of a union";
-      let init, reads = findField 0 comp.cfields in
+      let init, reads = findField 0 (Option.value ~default:[] comp.cfields) in
       CompoundInit (thistype, [ init ]), thistype, reads
 
     | _ -> Kernel.fatal ~current:true "collectInitializer"
@@ -3683,7 +3686,7 @@ let fieldsToInit
      the resulting fields are in reverse order *)
   let rec add_comp (offset : offset) (comp : compinfo) acc =
     let in_union = not comp.cstruct in
-    add_fields offset in_union comp.cfields acc
+    add_fields offset in_union (Option.value ~default:[] comp.cfields) acc
   and add_fields (offset : offset) (in_union : bool) (l : fieldinfo list) acc =
     match l with
     | [] -> acc
@@ -3716,7 +3719,7 @@ let fieldsToInit
   in
   let found, r = add_comp NoOffset comp (designator = None, []) in
   begin if not found then
-      let fn = Extlib.the designator in
+      let fn = Option.get designator in
       Kernel.fatal ~current:true "Cannot find designated field %s" fn;
   end;
   List.rev r
@@ -3743,7 +3746,9 @@ let find_field_offset cond (fidlist: fieldinfo list) : offset =
     | fid :: rest when prefix anonCompFieldName fid.fname -> begin
         match unrollType fid.ftype with
         | TComp (ci, _, _) ->
-          (try let off = search ci.cfields in Field(fid,off)
+          (try
+             let off = search (Option.value ~default:[] ci.cfields) in
+             Field(fid,off)
            with Not_found -> search rest  (* Continue searching *))
         | _ ->
           abort_context "unnamed field type is not a struct/union"
@@ -3754,7 +3759,7 @@ let find_field_offset cond (fidlist: fieldinfo list) : offset =
 
 let findField n comp =
   try
-    find_field_offset (fun x -> x.fname = n) comp.cfields
+    find_field_offset (fun x -> x.fname = n) (Option.value ~default:[] comp.cfields)
   with Not_found ->
     abort_context "Cannot find field %s in type %s" n (Cil.compFullName comp)
 
@@ -4242,11 +4247,11 @@ let append_chunk_to_annot ~ghost annot_chunk current_chunk =
         match current_chunk.stmts with
         | [(s1, m1, w1, r1, c1); (s2, m2, w2, r2, c2)] ->
           Extlib.swap
-            Extlib.opt_bind
-            (collapseCallCast (s2,s1)) (* the chunk list is reversed.*)
+            Option.bind
             (function
               | [ s1' ] -> Some (s1', m1 @ m2, w1 @ w2, r1 @ r2, c1 @ c2)
               | _ -> None (* should not happen. *))
+            (collapseCallCast (s2,s1)) (* the chunk list is reversed.*)
         | _ -> None
       in
       match res with
@@ -5384,8 +5389,14 @@ and makeCompType ghost (isstruct: bool)
   (* Create the self cell for use in fields and forward references. Or maybe
    * one exists already from a forward reference  *)
   let comp, _ = createCompInfo isstruct n' norig in
-  let doFieldGroup ~is_first_group ~is_last_group ((s: A.spec_elem list),
-                                                   (nl: (A.name * A.expression option) list)) =
+  let rec fold f acc = function
+    | [] -> acc
+    | [x] -> f ~last:true acc x
+    | x :: l -> fold f (f ~last:false acc x) l
+  in
+
+  let addFieldGroup ~last:last_group (flds : fieldinfo list)
+      ((s: A.spec_elem list), (nl: (A.name * A.expression option) list)) =
     (* Do the specifiers exactly once *)
     let sugg = match nl with
       | [] -> ""
@@ -5393,13 +5404,13 @@ and makeCompType ghost (isstruct: bool)
     in
     let bt, sto, inl, attrs = doSpecList ghost sugg s in
     (* Do the fields *)
-    let makeFieldInfo ~is_first_field ~is_last_field
+    let addFieldInfo ~last:last_field (flds : fieldinfo list)
         (((n,ndt,a,cloc) : A.name), (widtho : A.expression option))
-      : fieldinfo =
+      : fieldinfo list =
       if sto <> NoStorage || inl then
         Kernel.error ~once:true ~current:true "Storage or inline not allowed for fields";
       let allowZeroSizeArrays = true in
-      let ftype, nattr =
+      let ftype, fattr =
         doType
           ~allowZeroSizeArrays ghost false (AttrName false) bt
           (A.PARENTYPE(attrs, ndt, a))
@@ -5419,11 +5430,11 @@ and makeCompType ghost (isstruct: bool)
       else if not (Cil.isCompleteType ~allowZeroSizeArrays ftype)
       then begin
         match Cil.unrollType ftype with
-        | TArray(_,None,_,_) when is_last_field ->
+        | TArray(_,None,_,_) when last_group && last_field ->
           begin
             (* possible flexible array member; check if struct contains at least
                one other field *)
-            if is_first_field then (* struct is empty *)
+            if flds = [] then (* struct is empty *)
               Kernel.error ~current:true
                 "flexible array member '%s' (type %a) \
                  not allowed in otherwise empty struct"
@@ -5435,7 +5446,7 @@ and makeCompType ghost (isstruct: bool)
             "field `%s' is declared with incomplete type %a"
             n Cil_printer.pp_typ ftype
       end;
-      let width, ftype =
+      let fbitfield, ftype =
         match widtho with
         | None -> None, ftype
         | Some w -> begin
@@ -5458,9 +5469,14 @@ and makeCompType ghost (isstruct: bool)
               w, ftype
           end
       in
+      (* Compute the order of the field in the structure *)
+      let forder = match flds with
+        | [] -> 0
+        | { forder=previous_order } :: _ -> previous_order + 1
+      in
       (* If the field is unnamed and its type is a structure of union type
        * then give it a distinguished name  *)
-      let n' =
+      let fname =
         if n = missingFieldName then begin
           match unrollType ftype with
           | TComp _ -> begin
@@ -5488,56 +5504,40 @@ and makeCompType ghost (isstruct: bool)
               (if comp.cstruct then "struct" else "union")
               comp.cname;
           end else
-            List.iter (fun f -> is_circular f.ftype) comp'.cfields;
+            List.iter
+              (fun f -> is_circular f.ftype)
+              (Option.value ~default:[] comp'.cfields);
         | _ -> ()
       in
       is_circular ftype;
-      { fcomp     =  comp;
+      { fcomp =  comp;
+        forder;
         forig_name = n;
-        fname     =  n';
-        ftype     =  ftype;
-        fbitfield =  width;
-        fattr     =  nattr;
-        floc      =  convLoc cloc;
-        faddrof   = false;
+        fname;
+        ftype;
+        fbitfield;
+        fattr;
+        floc =  convLoc cloc;
+        faddrof = false;
         fsize_in_bits = None;
         foffset_in_bits = None;
         fpadding_in_bits = None;
-      }
-    in
-    let rec map_but_last l =
-      match l with
-      | [] -> []
-      | [f] ->
-        [makeFieldInfo ~is_first_field:false ~is_last_field:is_last_group f]
-      | f::l ->
-        let fi = makeFieldInfo ~is_first_field:false ~is_last_field:false f in
-        [fi] @ map_but_last l
+      } :: flds
     in
-    match nl with
-    | [] -> []
-    | [f] ->
-      [makeFieldInfo ~is_first_field:is_first_group ~is_last_field:is_last_group f]
-    | f::l ->
-      let fi =
-        makeFieldInfo ~is_first_field:is_first_group ~is_last_field:false f
-      in
-      [fi] @ map_but_last l
+    fold addFieldInfo flds nl
   in
 
   (* Do regular fields first. *)
-  let flds =
-    List.filter (function FIELD _ -> true | TYPE_ANNOT _ -> false) nglist in
-  let flds =
-    List.map (function FIELD (f,g) -> (f,g) | _ -> assert false) flds in
-  let last = List.length flds -  1 in
-  let doField i = doFieldGroup ~is_first_group:(i=0) ~is_last_group:(i=last) in
-  let flds = List.concat (List.mapi doField flds) in
-
-  let fld_table = Cil_datatype.Fieldinfo.Hashtbl.create 17 in
+  let to_field = function
+    | TYPE_ANNOT _ -> None
+    | FIELD (f,g) -> Some (f,g) in
+  let flds = Extlib.filter_map_opt to_field nglist in
+  let flds = List.rev (fold addFieldGroup [] flds) in
+
+  let fld_table = Hashtbl.create 17 in
   let check f =
     try
-      let oldf = Cil_datatype.Fieldinfo.Hashtbl.find fld_table f in
+      let oldf = Hashtbl.find fld_table f.fname in
       let source = fst f.floc in
       Kernel.error ~source
         "field %s occurs multiple times in aggregate %a. \
@@ -5546,41 +5546,44 @@ and makeCompType ghost (isstruct: bool)
         (fst oldf.floc).Filepath.pos_lnum
     with Not_found ->
       (* Do not add unnamed bitfields: they can share the empty name. *)
-      if f.fname <> "" then Cil_datatype.Fieldinfo.Hashtbl.add fld_table f f
+      if f.fname <> "" then Hashtbl.add fld_table f.fname f
   in
+  if flds = [] && not (Cil.acceptEmptyCompinfo ()) then
+    Kernel.error ~current:true ~once:true
+      "empty %ss only allowed for GCC/MSVC"
+      (if comp.cstruct then "struct" else "union");
   List.iter check flds;
-  if comp.cfields <> [] then begin
+  if comp.cfields <> None then begin
+    let old_fields = Option.get comp.cfields in
     (* This appears to be a multiply defined structure. This can happen from
      * a construct like "typedef struct foo { ... } A, B;". This is dangerous
      * because at the time B is processed some forward references in { ... }
      * appear as backward references, which could lead to circularity in
      * the type structure. We do a thorough check and then we reuse the type
      * for A *)
-    if List.length comp.cfields <> List.length flds
+    if List.length old_fields <> List.length flds
     || (List.exists2 (fun f1 f2 -> not (Cil_datatype.Typ.equal f1.ftype f2.ftype))
-          comp.cfields flds)
+          old_fields flds)
     then
       Kernel.error ~once:true ~current:true
         "%s seems to be multiply defined" (compFullName comp)
   end else
     begin
-      comp.cfields <- flds;
+      comp.cfields <- Some flds;
       let fields_with_pragma_attrs =
         List.map (fun fld ->
             (* note: in the call below, we CANNOT use fld.fcomp.cattr because it has not
                been filled in yet, so we need to pass the list of attributes [a] to it *)
             {fld with fattr = (process_pragmas_pack_align_field_attributes fld fld.fattr a)}
-          ) comp.cfields
+          ) flds
       in
-      comp.cfields <- fields_with_pragma_attrs
+      comp.cfields <- Some fields_with_pragma_attrs
     end;
 
   (*  ignore (E.log "makeComp: %s: %a\n" comp.cname d_attrlist a); *)
   let a = Cil.addAttributes comp.cattr a in
   comp.cattr <- process_pragmas_pack_align_comp_attributes comp a;
   let res = TComp (comp,empty_size_cache (), []) in
-  (* This compinfo is defined, even if there are no fields *)
-  comp.cdefined <- true;
   (* Create a typedef for this one *)
   cabsPushGlobal (GCompTag (comp, CurrentLoc.get ()));
 
@@ -6284,7 +6287,7 @@ and doExp local_env
             finishExp []
               (se' +++
                (mkStmtOneInstr ~ghost:local_env.is_ghost ~valid_sid
-                  (Set(lv, makeCastT result tresult t,
+                  (Set(lv, snd (castTo tresult t result),
                        CurrentLoc.get ())),[],[lv],r'))
               e'
               t
@@ -6339,7 +6342,7 @@ and doExp local_env
               (se' +++
                (mkStmtOneInstr ~ghost:local_env.is_ghost ~valid_sid
                   (Set(lv,
-                       makeCastT opresult tresult (typeOfLval lv),
+                       snd (castTo tresult (typeOfLval lv) opresult),
                        CurrentLoc.get ())),
                 [],[lv], r'))
               result
@@ -6671,7 +6674,7 @@ and doExp local_env
        * functions alone*)
       let isSpecialBuiltin =
         match f''.enode with
-        | Lval (Var fv, NoOffset) -> Cil.is_special_builtin fv.vname
+        | Lval (Var fv, NoOffset) -> Cil_builtins.is_special_builtin fv.vname
         | _ -> false
       in
       let init_chunk = unspecified_chunk empty in
@@ -8111,7 +8114,7 @@ and doInit local_env asconst add_implicit_ensures preinit so acc initl =
         (* ISO 6.7.8 para 14: final NUL added only if no size specified, or
          * if there is room for it; btw, we can't rely on zero-init of
          * globals, since this array might be a local variable *)
-        if ((not (Extlib.has_some leno)) ||
+        if (Option.is_none leno ||
             ((String.length s) < (integerArrayLength leno)))
         then ref [init Int64.zero]
         else ref []
@@ -8189,7 +8192,7 @@ and doInit local_env asconst add_implicit_ensures preinit so acc initl =
         (* ISO 6.7.8 para 14: final NUL added only if no size specified, or
          * if there is room for it; btw, we can't rely on zero-init of
          * globals, since this array might be a local variable *)
-        if (not (Extlib.has_some leno)
+        if (Option.is_none leno
             || ((List.length s) < (integerArrayLength leno)))
         then [init Int64.zero]
         else [])
@@ -8223,7 +8226,7 @@ and doInit local_env asconst add_implicit_ensures preinit so acc initl =
     (* Start over with the fields *)
     doInit local_env asconst add_implicit_ensures preinit so acc allinitl
   (* An incomplete structure with any initializer is an error. *)
-  | TComp (comp, _, _), _ :: restil when not comp.cdefined ->
+  | TComp (comp, _, _), _ :: restil when comp.cfields = None ->
     Kernel.error ~current:true ~once:true
       "variable `%s' has initializer but incomplete type" so.host.vname;
     doInit local_env asconst add_implicit_ensures preinit so acc restil
@@ -8329,7 +8332,7 @@ and doInit local_env asconst add_implicit_ensures preinit so acc initl =
         [(A.NEXT_INIT, A.SINGLE_INIT oneinit)]
     else
       (* If this is a GNU extension with field-to-union cast find the field *)
-      let fi = findField ci.cfields in
+      let fi = findField (Option.value ~default:[] ci.cfields) in
       (* Change the designator and redo *)
       doInit
         local_env asconst add_implicit_ensures preinit so acc
@@ -8524,7 +8527,7 @@ and createGlobal ghost logic_spec ((t,s,b,attr_list) : (typ * storage * bool * A
     if inite != A.NO_INIT  then
       Kernel.error ~once:true ~current:true
         "Function declaration with initializer (%s)\n" vi.vname;
-  end else if Extlib.has_some logic_spec then begin
+  end else if Option.is_some logic_spec then begin
     Kernel.warning ~wkey:Kernel.wkey_annot_error ~current:true ~once:true
       "Global variable %s is not a function. It cannot have a contract."
       vi.vname
@@ -8714,7 +8717,7 @@ and cleanup_autoreference vi chunk =
 
       method! vinst = function
         | Call _ | Local_init(_,ConsInit _,_) ->
-          calls := ref (Extlib.the self#current_stmt) :: !calls;
+          calls := ref (Option.get self#current_stmt) :: !calls;
           DoChildren
         | _ -> DoChildren
 
@@ -9098,7 +9101,7 @@ and doDecl local_env (isglobal: bool) : A.definition -> chunk = function
             Kernel.warning ~current:true "Unexpected attribute in #pragma";
             Some (Attr ("", [a']))
         in
-        Extlib.may
+        Option.iter
           (fun a'' ->
              cabsPushGlobal (GPragma (a'', CurrentLoc.get ())))
           a'';
@@ -10316,7 +10319,7 @@ let convFile (path, f) =
   Logic_env.prepare_tables ();
   anonCompFieldNameId := 0;
   Kernel.debug ~level:2 "Converting CABS->CIL" ;
-  Cil.Builtin_functions.iter_sorted
+  Cil_builtins.Builtin_functions.iter_sorted
     (fun name (resTyp, argTypes, isva) ->
        ignore (setupBuiltin name (resTyp, ArgTypes argTypes, isva)));
   let globalidx = ref 0 in
diff --git a/src/kernel_internals/typing/ghost_accesses.ml b/src/kernel_internals/typing/ghost_accesses.ml
index ce796a384de5e708b69737cf6fe54e232bf39452..ae1eceffe9607d029a978c3ef746b07439497f68 100644
--- a/src/kernel_internals/typing/ghost_accesses.ml
+++ b/src/kernel_internals/typing/ghost_accesses.ml
@@ -172,16 +172,17 @@ class visitor = object(self)
         | { enode = Lval ( (Var vi), NoOffset ) } -> Some vi
         | _ -> None
       in
+      let is_ghost vi = vi.vghost || Ast_info.is_frama_c_builtin vi.vname in
       let failed = match i with
         | Call(_, fexp, _, _) ->
           begin match call_varinfo fexp with
-            | Some fct when not fct.vghost ->
+            | Some fct when not (is_ghost fct) ->
               Error.non_ghost_function_call_in_ghost ~current:true () ; true
             | None ->
               Error.function_pointer_call ~current:true () ; true
             | _ -> false
           end
-        | Local_init(_, ConsInit(fct, _, _), _) when not fct.vghost ->
+        | Local_init(_, ConsInit(fct, _, _), _) when not (is_ghost fct) ->
           Error.non_ghost_function_call_in_ghost ~current:true () ; true
         | _ -> false
       in
@@ -225,7 +226,7 @@ class visitor = object(self)
         if not (ghost_term_type term.term_type) then
           Error.assigns_non_ghost_term ~current:true term
       in
-      let kf = Extlib.the (self#current_kf) in
+      let kf = Option.get (self#current_kf) in
       match assigns with
       | Writes froms -> List.iter check_assign froms
       | WritesAny when not (Kernel_function.has_definition kf) ->
diff --git a/src/kernel_internals/typing/infer_annotations.ml b/src/kernel_internals/typing/infer_annotations.ml
index 3395a3e15d3f9d9c648de863db624d71a7bb6f13..207cc91a28d224c8d9608d9e3ab55e1480809b26 100644
--- a/src/kernel_internals/typing/infer_annotations.ml
+++ b/src/kernel_internals/typing/infer_annotations.ml
@@ -169,7 +169,7 @@ let emit_unknown_status_on_assigns kf bhv assigns =
     Property.ip_of_assigns
       kf Kglobal (Property.Id_contract (Datatype.String.Set.empty,bhv)) assigns
   in
-  Extlib.may emit pptopt;
+  Option.iter emit pptopt;
   match assigns with
     | WritesAny -> ()
     | Writes froms ->
@@ -179,7 +179,7 @@ let emit_unknown_status_on_assigns kf bhv assigns =
               kf Kglobal
               (Property.Id_contract (Datatype.String.Set.empty,bhv)) from
           in
-          Extlib.may emit pptopt
+          Option.iter emit pptopt
         in
         List.iter emit froms
 
diff --git a/src/kernel_internals/typing/mergecil.ml b/src/kernel_internals/typing/mergecil.ml
index 805f4e06efe13270078d3163e9eca76ef90a9d8c..5815b0145f26b0ab9c25bee502028062e76cdb18 100644
--- a/src/kernel_internals/typing/mergecil.ml
+++ b/src/kernel_internals/typing/mergecil.ml
@@ -442,28 +442,35 @@ let hash_list f l =
     | _ -> acc
   in aux 47 3 l
 
-let hash_ext_kind = function
-  | Ext_id i -> Datatype.Int.hash i
-  | Ext_terms terms -> 29 * (hash_list Logic_utils.hash_term terms)
-  | Ext_preds preds -> 47 * (hash_list Logic_utils.hash_predicate preds)
-
-let compare_ext_kind k1 k2 =
-  match k1, k2 with
-  | Ext_id i1, Ext_id i2 -> Datatype.Int.compare i1 i2
-  | Ext_id _, _ -> 1 | _, Ext_id _ -> -1
-  | Ext_terms terms1, Ext_terms terms2 ->
-    Extlib.list_compare Logic_utils.compare_term terms1 terms2
-  | Ext_terms _, _ -> 1 | _, Ext_terms _ -> -1
-  | Ext_preds p1, Ext_preds p2 ->
-    Extlib.list_compare Logic_utils.compare_predicate p1 p2
 
 module ExtMerging =
   Merging
     (struct
       type t = acsl_extension
-      let hash (e : acsl_extension) =
+      let rec hash (e : acsl_extension) =
+        let hash_ext_kind = function
+          | Ext_id i -> Datatype.Int.hash i
+          | Ext_terms terms -> 29 * (hash_list Logic_utils.hash_term terms)
+          | Ext_preds preds -> 47 * (hash_list Logic_utils.hash_predicate preds)
+          | Ext_annot (id, annots) -> Datatype.String.hash id + 5 * (hash_list hash annots)
+        in
         Datatype.String.hash e.ext_name + 5 * hash_ext_kind e.ext_kind
-      let compare (e1 : acsl_extension) (e2 : acsl_extension) =
+      let rec compare (e1 : acsl_extension) (e2 : acsl_extension) =
+        let compare_ext_kind k1 k2 =
+          match k1, k2 with
+          | Ext_id i1, Ext_id i2 -> Datatype.Int.compare i1 i2
+          | Ext_id _, _ -> 1 | _, Ext_id _ -> -1
+          | Ext_terms terms1, Ext_terms terms2 ->
+            Extlib.list_compare Logic_utils.compare_term terms1 terms2
+          | Ext_terms _, _ -> 1 | _, Ext_terms _ -> -1
+          | Ext_preds p1, Ext_preds p2 ->
+            Extlib.list_compare Logic_utils.compare_predicate p1 p2
+          | Ext_preds _, _ -> 1 | _, Ext_preds _ -> -1
+          | Ext_annot (id1, a1) , Ext_annot (id2, a2)  ->
+            match String.compare id1 id2 with
+            | 0 -> Extlib.list_compare compare a1 a2
+            | n -> n
+        in
         let res = Datatype.String.compare e1.ext_name e2.ext_name in
         if res <> 0 then res
         else
@@ -838,7 +845,8 @@ let init ?(all=true) () =
   if all then Logic_env.prepare_tables ()
 
 (* Ignores some attributes that are irrelevant for mergecil, e.g. fc_stdlib *)
-let drop_attributes_for_merge attrs = Cil.dropAttributes ["fc_stdlib"] attrs
+let drop_attributes_for_merge attrs =
+  Cil.dropAttributes ["fc_stdlib"; "fc_stdlib_generated"] attrs
 
 let equal_attributes_for_merge attrs1 attrs2 =
   Cil_datatype.Attributes.equal (drop_attributes_for_merge attrs1)
@@ -884,12 +892,12 @@ let rec global_annot_pass1 g = match g with
            annotation at loc %a. Ignoring new binding."
           Cil_printer.pp_identified_term t
           pretty_volatile_kind k
-          Cil_printer.pp_location (fst (Extlib.the node.nloc))
+          Cil_printer.pp_location (fst (Option.get node.nloc))
     in
     List.iter
       (fun x ->
-         if Extlib.has_some rvi then process_term_kind (x,R);
-         if Extlib.has_some wvi then process_term_kind (x,W))
+         if Option.is_some rvi then process_term_kind (x,R);
+         if Option.is_some wvi then process_term_kind (x,W))
       hs
   | Daxiomatic(id,decls,_,l) ->
     CurrentLoc.set l;
@@ -1144,7 +1152,7 @@ and equalModuloPackedAlign attrs1 attrs2 =
    Raises [Failure] if the fields are not equivalent.
    If [mustCheckOffsets] is true, then there is already a difference in the
    composite type, so each field must be checked. *)
-and checkFieldsEqualModuloPackedAlign ~mustCheckOffsets typ_ci1 typ_ci2 f1 f2 =
+and checkFieldsEqualModuloPackedAlign ~mustCheckOffsets f1 f2 =
   if f1.fbitfield <> f2.fbitfield then
     raise (Failure "different bitfield info");
   if mustCheckOffsets || not (equal_attributes_for_merge f1.fattr f2.fattr) then
@@ -1153,11 +1161,8 @@ and checkFieldsEqualModuloPackedAlign ~mustCheckOffsets typ_ci1 typ_ci2 f1 f2 =
        in which case the difference may be safely ignored *)
     begin
       try
-        let offs1, width1 =
-          Cil.bitsOffset typ_ci1 (Field (f1, NoOffset))
-        in
-        let offs2, width2 =
-          Cil.bitsOffset typ_ci2 (Field (f2, NoOffset))
+        let offs1, width1 = Cil.fieldBitsOffset f1
+        and offs2, width2 = Cil.fieldBitsOffset f2
         in
         if not (equalModuloPackedAlign f1.fattr f2.fattr)
         || offs1 <> offs2 || width1 <> width2 then
@@ -1196,121 +1201,112 @@ and matchCompInfo (oldfidx: int) (oldci: compinfo)
     let ci = cinode.ndata in
     let fidx = cinode.nfidx in
 
-    let old_len = List.length oldci.cfields in
-    let len = List.length ci.cfields in
-    (* It is easy to catch here the case when the new structure is undefined
-     * and the old one was defined. We just reuse the old *)
-    (* More complicated is the case when the old one is not defined but the
-     * new one is. We still reuse the old one and we'll take care of defining
-     * it later with the new fields.
-     * GN: 7/10/04, I could not find when is "later", so I added it below *)
-    if len <> 0 && old_len <> 0 && old_len <> len then begin
-      let curLoc = CurrentLoc.get () in     (* d_global blows this away.. *)
-      CurrentLoc.set curLoc;
-      let aggregate_name = if cstruct then "struct" else "union" in
-      let msg = Printf.sprintf
-          "different number of fields in %s %s and %s %s: %d != %d."
-          aggregate_name oldci.cname aggregate_name ci.cname
-          old_len len
-      in
-      raise (Failure msg)
-    end;
-    (* We check that they are defined in the same way. While doing this there
-     * might be recursion and we have to watch for going into an infinite
-     * loop. So we add the assumption that they are equal *)
-    let newrep, undo = union oldcinode cinode in
-    (* We check the fields but watch for Failure. We only do the check when
-     * the lengths are the same. Due to the code above this the other
-     * possibility is that one of the length is 0, in which case we reuse the
-     * old compinfo. *)
-    (* But what if the old one is the empty one ? *)
-    if old_len = len then begin
-      try
-        (* must_check_offsets indicates that composite type attributes are
-           different, which may impact field offsets *)
-        let mustCheckOffsets =
-          if equal_attributes_for_merge ci.cattr oldci.cattr then false
-          else if equalModuloPackedAlign ci.cattr oldci.cattr then true
-          else raise
-              (Failure
-                 (let attrs = drop_attributes_for_merge ci.cattr in
-                  let oldattrs = drop_attributes_for_merge oldci.cattr in
-                  (* we do not use Cil_datatype.Attributes.pretty because it
-                     may not print some relevant attributes *)
-                  let pp_attrs =
-                    Pretty_utils.pp_list ~sep:", " Printer.pp_attribute
-                  in
-                  Format.asprintf
-                    "different/incompatible composite type attributes: \
-                     [%a] vs [%a]"
-                    pp_attrs attrs pp_attrs oldattrs))
-        in
-        let typ_ci = TComp(ci, {scache = Not_Computed}, []) in
-        let typ_oldci = TComp(oldci, {scache = Not_Computed}, []) in
-        List.iter2
-          (fun oldf f ->
-             checkFieldsEqualModuloPackedAlign ~mustCheckOffsets
-               typ_ci typ_oldci f oldf;
-             (* Make sure the types are compatible *)
-             (* Note: 6.2.7 §1 states that the names of the fields should be the
-                same. We do not force this for now, but could do it. *)
-             let newtype =
-               combineTypes CombineOther oldfidx oldf.ftype fidx f.ftype
-             in
-             (* Change the type in the representative *)
-             oldf.ftype <- newtype)
-          oldci.cfields ci.cfields
-      with Failure reason ->
-        (* Our assumption was wrong. Forget the isomorphism *)
-        undo ();
-        let fields_old =
-          Format.asprintf "%a"
-            Cil_printer.pp_global
-            (GCompTag(oldci, Cil_datatype.Location.unknown))
-        in
-        let fields =
-          Format.asprintf "%a"
-            Cil_printer.pp_global (GCompTag(ci, Cil_datatype.Location.unknown))
-        in
-        let fullname_old = compFullName oldci in
-        let fullname = compFullName ci in
-        let msg =
-          match fullname_old = fullname,
-                fields_old = fields (* Could also use a special comparison *)
-          with
-            true, true ->
-            Format.asprintf
-              "Definitions of %s are not isomorphic. Reason follows:@\n@?%s"
-              fullname_old reason
-          | false, true ->
-            Format.asprintf
-              "%s and %s are not isomorphic. Reason follows:@\n@?%s"
-              fullname_old fullname reason
-          | true, false ->
-            Format.asprintf
-              "Definitions of %s are not isomorphic. \
-               Reason follows:@\n@?%s@\n@?%s@?%s"
-              fullname_old reason
-              fields_old fields
-          | false, false ->
-            Format.asprintf
-              "%s and %s are not isomorphic. Reason follows:@\n@?%s@\n@?%s@?%s"
-              fullname_old fullname reason
-              fields_old fields
-
-
+    match oldci.cfields, ci.cfields with
+    | _, None -> () (* new struct is not defined, just keep using the old one *)
+    | None, Some fields ->
+      (* old struct is not defined, but new one is. Use its fields. *)
+      oldci.cfields <- Some fields
+    | Some oldfields, Some fields ->
+      let old_len = List.length oldfields in
+      let len = List.length fields in
+      if old_len <> len then begin
+        let curLoc = CurrentLoc.get () in (* d_global blows this away.. *)
+        CurrentLoc.set curLoc;
+        let aggregate_name = if cstruct then "struct" else "union" in
+        let msg = Printf.sprintf
+            "different number of fields in %s %s and %s %s: %d != %d."
+            aggregate_name oldci.cname aggregate_name ci.cname
+            old_len len
         in
         raise (Failure msg)
-    end else begin
-      (* We will reuse the old one. One of them is empty. If the old one is
-       * empty, copy over the fields from the new one. Won't this result in
-       * all sorts of undefined types??? *)
-      if old_len = 0 then oldci.cfields <- ci.cfields;
-    end;
-    (* We get here when we succeeded checking that they are equal, or one of
-     * them was empty *)
-    newrep.ndata.cattr <- addAttributes oldci.cattr ci.cattr;
-    ()
+      end;
+      (* We check that they are defined in the same way. While doing this there
+       * might be recursion and we have to watch for going into an infinite
+       * loop. So we add the assumption that they are equal *)
+      let newrep, undo = union oldcinode cinode in
+      (* We check the fields but watch for Failure. We only do the check when
+       * the lengths are the same. Due to the code above this the other
+       * possibility is that one of the length is 0, in which case we reuse the
+       * old compinfo. *)
+      begin
+        try
+          (* must_check_offsets indicates that composite type attributes are
+             different, which may impact field offsets *)
+          let mustCheckOffsets =
+            if equal_attributes_for_merge ci.cattr oldci.cattr then false
+            else if equalModuloPackedAlign ci.cattr oldci.cattr then true
+            else raise
+                (Failure
+                   (let attrs = drop_attributes_for_merge ci.cattr in
+                    let oldattrs = drop_attributes_for_merge oldci.cattr in
+                    (* we do not use Cil_datatype.Attributes.pretty because it
+                       may not print some relevant attributes *)
+                    let pp_attrs =
+                      Pretty_utils.pp_list ~sep:", " Printer.pp_attribute
+                    in
+                    Format.asprintf
+                      "different/incompatible composite type attributes: \
+                       [%a] vs [%a]"
+                      pp_attrs attrs pp_attrs oldattrs))
+          in
+          List.iter2
+            (fun oldf f ->
+               checkFieldsEqualModuloPackedAlign ~mustCheckOffsets f oldf;
+               (* Make sure the types are compatible *)
+               (* Note: 6.2.7 §1 states that the names of the fields
+                  should be the same.
+                  We do not force this for now, but could do it. *)
+               let newtype =
+                 combineTypes CombineOther oldfidx oldf.ftype fidx f.ftype
+               in
+               (* Change the type in the representative *)
+               oldf.ftype <- newtype)
+            oldfields fields
+        with Failure reason ->
+          (* Our assumption was wrong. Forget the isomorphism *)
+          undo ();
+          let fields_old =
+            Format.asprintf "%a"
+              Cil_printer.pp_global
+              (GCompTag(oldci, Cil_datatype.Location.unknown))
+          in
+          let fields =
+            Format.asprintf "%a"
+              Cil_printer.pp_global
+              (GCompTag(ci, Cil_datatype.Location.unknown))
+          in
+          let fullname_old = compFullName oldci in
+          let fullname = compFullName ci in
+          let msg =
+            match fullname_old = fullname,
+                  fields_old = fields (* Could also use a special comparison *)
+            with
+              true, true ->
+              Format.asprintf
+                "Definitions of %s are not isomorphic. Reason follows:@\n@?%s"
+                fullname_old reason
+            | false, true ->
+              Format.asprintf
+                "%s and %s are not isomorphic. Reason follows:@\n@?%s"
+                fullname_old fullname reason
+            | true, false ->
+              Format.asprintf
+                "Definitions of %s are not isomorphic. \
+                 Reason follows:@\n@?%s@\n@?%s@?%s"
+                fullname_old reason
+                fields_old fields
+            | false, false ->
+              Format.asprintf
+                "%s and %s are not isomorphic. \
+                 Reason follows:@\n@?%s@\n@?%s@?%s"
+                fullname_old fullname reason
+                fields_old fields
+          in
+          raise (Failure msg)
+      end;
+      (* We get here when we succeeded checking that they are equal, or one of
+       * them was empty *)
+      newrep.ndata.cattr <- addAttributes oldci.cattr ci.cattr
   end
 
 (* Match two enuminfos and throw a Failure if they do not match *)
@@ -1945,7 +1941,7 @@ class renameVisitorClass =
          if lv == lv' then DoChildren (* Replacement already done... *)
          else ChangeTo lv')
     | LVC ->
-      let vi = Extlib.the lv.lv_origin in
+      let vi = Option.get lv.lv_origin in
       if not vi.vglob then DoChildren
       else begin
         match PlainMerging.findReplacement true vEq !currentFidx vi.vname
@@ -2158,64 +2154,46 @@ class renameVisitorClass =
              })
       | _ -> DoChildren
 
+    method private update_field f =
+      (* See if the compinfo was changed *)
+      if f.fcomp.creferenced then None
+      else begin
+        match
+          PlainMerging.findReplacement true sEq !currentFidx f.fcomp.cname
+        with
+          None -> None (* We did not replace it *)
+        | Some (ci', _oldfidx) -> begin
+            (* First, find out the index of the original field *)
+            let rec indexOf (i: int) = function
+              | [] -> Kernel.fatal "Cannot find field %s in %s"
+                        f.fname (compFullName f.fcomp)
+              | f' :: _ when f' == f -> i
+              | _ :: rest -> indexOf (i + 1) rest
+            in
+            let idx = indexOf 0 (Option.value ~default:[] f.fcomp.cfields) in
+            let ci'_fields = Option.value ~default:[] ci'.cfields in
+            if List.length ci'_fields <= idx then
+              Kernel.fatal "Too few fields in replacement %s for %s"
+                (compFullName ci')
+                (compFullName f.fcomp);
+            Some (List.nth ci'_fields idx)
+          end
+      end
+
     (* The Field offset might need to be changed to use new compinfo *)
     method! voffs = function
         Field (f, o) -> begin
-          (* See if the compinfo was changed *)
-          if f.fcomp.creferenced then
-            DoChildren
-          else begin
-            match
-              PlainMerging.findReplacement true sEq !currentFidx f.fcomp.cname
-            with
-              None -> DoChildren (* We did not replace it *)
-            | Some (ci', _oldfidx) -> begin
-                (* First, find out the index of the original field *)
-                let rec indexOf (i: int) = function
-                    [] -> Kernel.fatal "Cannot find field %s in %s"
-                            f.fname (compFullName f.fcomp)
-                  | f' :: _ when f' == f -> i
-                  | _ :: rest -> indexOf (i + 1) rest
-                in
-                let index = indexOf 0 f.fcomp.cfields in
-                if List.length ci'.cfields <= index then
-                  Kernel.fatal "Too few fields in replacement %s for %s"
-                    (compFullName ci')
-                    (compFullName f.fcomp);
-                let f' = List.nth ci'.cfields index in
-                ChangeDoChildrenPost (Field (f', o), fun x -> x)
-              end
-          end
+          match self#update_field f with
+          | None -> DoChildren
+          | Some f' -> ChangeDoChildrenPost (Field (f', o), fun x -> x)
         end
       | _ -> DoChildren
 
     method! vterm_offset = function
         TField (f, o) -> begin
-          (* See if the compinfo was changed *)
-          if f.fcomp.creferenced then
-            DoChildren
-          else begin
-            match
-              PlainMerging.findReplacement true sEq !currentFidx f.fcomp.cname
-            with
-              None -> DoChildren (* We did not replace it *)
-            | Some (ci', _oldfidx) -> begin
-                (* First, find out the index of the original field *)
-                let rec indexOf (i: int) = function
-                    [] -> Kernel.fatal "Cannot find field %s in %s"
-                            f.fname (compFullName f.fcomp)
-                  | f' :: _ when f' == f -> i
-                  | _ :: rest -> indexOf (i + 1) rest
-                in
-                let index = indexOf 0 f.fcomp.cfields in
-                if List.length ci'.cfields <= index then
-                  Kernel.fatal "Too few fields in replacement %s for %s"
-                    (compFullName ci')
-                    (compFullName f.fcomp);
-                let f' = List.nth ci'.cfields index in
-                ChangeDoChildrenPost (TField (f', o), fun x -> x)
-              end
-          end
+          match self#update_field f with
+          | None -> DoChildren
+          | Some f' -> ChangeDoChildrenPost (TField (f', o), fun x -> x)
         end
       | TModel(f,o) ->
         (match
@@ -2408,9 +2386,8 @@ let rec logic_annot_pass2 ~in_axiomatic g a =
     end
   | Dvolatile(vi,rd,wr,attr,loc) ->
     let is_representative id =
-      not
-        (Extlib.has_some
-           (VolatileMerging.findReplacement true lvEq !currentFidx id))
+      Option.is_none
+        (VolatileMerging.findReplacement true lvEq !currentFidx id)
     in
     let push_volatile l rd wr =
       match l with
@@ -2437,8 +2414,8 @@ let rec logic_annot_pass2 ~in_axiomatic g a =
            annotation can be used as is (i.e. does not overlap with a
            preceding annotation.
       *)
-      let reads = not (Extlib.has_some rd) || is_representative (v,R) in
-      let writes = not (Extlib.has_some wr) || is_representative (v,W) in
+      let reads = Option.is_none rd || is_representative (v,R) in
+      let writes = Option.is_none wr || is_representative (v,W) in
       if reads then
         if writes then
           no_drop, v::full_representative, only_reads, only_writes
@@ -2455,8 +2432,8 @@ let rec logic_annot_pass2 ~in_axiomatic g a =
     if no_drop then mergePushGlobals (visitCilGlobal renameVisitor g)
     else begin
       push_volatile full_representative rd wr;
-      if Extlib.has_some rd then push_volatile only_reads rd None;
-      if Extlib.has_some wr then push_volatile only_writes None wr
+      if Option.is_some rd then push_volatile only_reads rd None;
+      if Option.is_some wr then push_volatile only_writes None wr
     end
   | Daxiomatic(n,l,_,loc) ->
     begin
@@ -2986,7 +2963,7 @@ let oneFilePass2 (f: file) =
               (* Restore the formals from the old definition. We always have
                  Some l from getFormalsDecl
                  in case of a defined function. *)
-              Cil.setFormals fdec (Extlib.the defn_formals);
+              Cil.setFormals fdec (Option.get defn_formals);
               (* previous was found *)
               if (curSum = prevSum) then
                 Kernel.warning ~current:true
@@ -3285,7 +3262,7 @@ let find_decls g =
       method! vspec _ = SkipChildren
       method! vfunc f =
         ignore (self#vvdec f.svar);
-        Extlib.may (ignore $ self#vlogic_var_decl) f.svar.vlogic_var_assoc;
+        Option.iter (ignore $ self#vlogic_var_decl) f.svar.vlogic_var_assoc;
         SkipChildren
     end
   in
diff --git a/src/kernel_internals/typing/oneret.ml b/src/kernel_internals/typing/oneret.ml
index 164f5b48e7887784a264e4c55beaaaa74421f352..80708cb69689325ac5b9e5a75c4052ddabac5e5c 100644
--- a/src/kernel_internals/typing/oneret.ml
+++ b/src/kernel_internals/typing/oneret.ml
@@ -483,7 +483,7 @@ let oneret ?(callback: callback option) (f: fundec) : unit =
     lastloc := !currentLoc ;  *) (* last location in the function *)
   f.sbody <- scanBlock true f.sbody ;
   if !haveGoto && !retStmt != dummyStmt then encapsulate_local_vars f;
-  Extlib.may do_callback callback
+  Option.iter do_callback callback
 
 (*
   Local Variables:
diff --git a/src/kernel_internals/typing/rmtmps.ml b/src/kernel_internals/typing/rmtmps.ml
index 4a6a6f796373b8d2bcd6893dd2d91e0b52969cfe..f898d1f50d1ec59321661861cae1f305ff7b1bc2 100644
--- a/src/kernel_internals/typing/rmtmps.ml
+++ b/src/kernel_internals/typing/rmtmps.ml
@@ -460,7 +460,7 @@ class markReachableVisitor
 
              (* to recurse, we must ask explicitly *)
              let recurse f = ignore (self#vtype f.ftype) in
-             List.iter recurse c.cfields;
+             List.iter recurse (Option.value ~default:[] c.cfields);
              self#visitAttrs attrs;
              self#visitAttrs c.cattr
            end;
@@ -483,10 +483,10 @@ class markReachableVisitor
        | TPtr(ty,a) -> ignore (self#vtype ty); self#visitAttrs a
        | TArray(ty,sz, _, a) ->
          ignore (self#vtype ty); self#visitAttrs a;
-         Extlib.may (ignore $ (visitCilExpr (self:>cilVisitor))) sz
+         Option.iter (ignore $ (visitCilExpr (self:>cilVisitor))) sz
        | TFun (ty, args,_,a) ->
          ignore (self#vtype ty);
-         Extlib.may (List.iter (fun (_,ty,_) -> ignore (self#vtype ty))) args;
+         Option.iter (List.iter (fun (_,ty,_) -> ignore (self#vtype ty))) args;
          self#visitAttrs a
       );
       SkipChildren
diff --git a/src/kernel_internals/typing/unroll_loops.ml b/src/kernel_internals/typing/unroll_loops.ml
index e73b70a19d740f53d7b2e2c390297b7473f4d1fd..2ef5c657b18fb1ffc3bd7c32eac702fd0482aa17 100644
--- a/src/kernel_internals/typing/unroll_loops.ml
+++ b/src/kernel_internals/typing/unroll_loops.ml
@@ -39,7 +39,7 @@ let empty_info =
 let update_info global_find_init emitter info spec =
   match spec with
     | {term_type=typ}  when Logic_typing.is_integral_type typ ->
-      if Extlib.has_some info.unroll_number && not info.ignore_unroll then begin
+      if Option.is_some info.unroll_number && not info.ignore_unroll then begin
 	Kernel.warning ~once:true ~current:true
 	  "ignoring unrolling directive (directive already defined)";
         info
@@ -65,7 +65,7 @@ let update_info global_find_init emitter info spec =
       end
     | {term_node=TConst (LStr "done") } -> { info with ignore_unroll = true }
     | {term_node=TConst (LStr "completely") } ->
-      if Extlib.has_some info.total_unroll then begin
+      if Option.is_some info.total_unroll then begin
         Kernel.warning ~once:true ~current:true
           "found two total unroll pragmas";
         info
@@ -187,7 +187,7 @@ let copy_annotations kf assoc labelled_stmt_tbl (break_continue_must_change, stm
             begin
               try
                 let vi'= snd (List.find (fun (x,_) -> x.vid = vi.vid) assoc) in
-                ChangeTo (Extlib.the vi'.vlogic_var_assoc)
+                ChangeTo (Option.get vi'.vlogic_var_assoc)
               with Not_found -> SkipChildren
                 | Invalid_argument _ ->
                     Kernel.abort
@@ -604,13 +604,13 @@ class do_it global_find_init ((force:bool),(times:int)) = object(self)
       ChangeDoChildrenPost (s, update)
   | Loop _ ->
     let infos = extract_from_pragmas global_find_init s in
-    let number = Extlib.opt_conv times infos.unroll_number in
+    let number = Option.value ~default:times infos.unroll_number in
     let total_unrolling = infos.total_unroll in
     let is_ignored_unrolling = not force && infos.ignore_unroll in
     let f sloop = 
       Kernel.debug ~dkey
         "Unrolling loop stmt %d (%d times) inside function %a@." 
-	sloop.sid number Kernel_function.pretty (Extlib.the self#current_kf);
+	sloop.sid number Kernel_function.pretty (Option.get self#current_kf);
       file_has_unrolled_loop <- true ;
       has_unrolled_loop <- true ;
       match sloop.skind with
@@ -644,14 +644,14 @@ class do_it global_find_init ((force:bool),(times:int)) = object(self)
         let switch_label_action = if i = number-1 then Move else Ignore in
         let new_block, new_switch_cases =
           copy_block
-	    (Extlib.the self#current_kf)
+	    (Option.get self#current_kf)
             switch_label_action
             ((Some break_lbl_stmt),(Some !current_continue))
             block
         in
         cases <- new_switch_cases @ cases;
         current_continue := mk_continue ();
-	update_loop_current (Extlib.the self#current_kf) !current_continue new_block;
+	update_loop_current (Option.get self#current_kf) !current_continue new_block;
         (match new_block.blocals with
           [] -> new_stmts:= new_block.bstmts @ !new_stmts;
         | _ -> (* keep the block in order to preserve locals decl *)
@@ -660,7 +660,7 @@ class do_it global_find_init ((force:bool),(times:int)) = object(self)
       let new_stmt = match !new_stmts with
       | [ s ] -> s
       | l ->
-	List.iter (update_loop_entry (Extlib.the self#current_kf) !current_continue) l;
+	List.iter (update_loop_entry (Option.get self#current_kf) !current_continue) l;
         let l = if is_referenced !current_continue l then !current_continue :: l else l in
         let new_stmts = l @ [break_lbl_stmt] in
         let new_block = mkBlock new_stmts in
@@ -687,7 +687,7 @@ class do_it global_find_init ((force:bool),(times:int)) = object(self)
               (AInvariant ([],true,Logic_const.(toplevel_predicate pfalse)))
           in
           Annotations.add_code_annot
-	    emitter ~kf:(Extlib.the self#current_kf) sloop annot;
+	    emitter ~kf:(Option.get self#current_kf) sloop annot;
           new_stmts
     in
     let h sloop new_stmts = (* To indicate that the unrolling has been done *)
@@ -699,7 +699,7 @@ class do_it global_find_init ((force:bool),(times:int)) = object(self)
         Logic_const.new_code_annotation (APragma (Loop_pragma specs))
       in
       Annotations.add_code_annot
-        Emitter.end_user ~kf:(Extlib.the self#current_kf) sloop annot;
+        Emitter.end_user ~kf:(Option.get self#current_kf) sloop annot;
       new_stmts
     in
     let fgh sloop = h sloop (g sloop (f sloop)) in
diff --git a/src/kernel_services/abstract_interp/base.ml b/src/kernel_services/abstract_interp/base.ml
index 226eefc98e5cefef8ab31e32f53547054abacb74..095c1b9cef30592a727e57fd69af31aeb6640c8b 100644
--- a/src/kernel_services/abstract_interp/base.ml
+++ b/src/kernel_services/abstract_interp/base.ml
@@ -41,69 +41,69 @@ type validity =
 let pretty_validity fmt v =
   match v with
   | Empty -> Format.fprintf fmt "Empty"
-  | Unknown (b,k,e)  -> 
-      Format.fprintf fmt "Unknown %a/%a/%a"
-	Int.pretty b (Pretty_utils.pp_opt Int.pretty) k Int.pretty e
+  | Unknown (b,k,e)  ->
+    Format.fprintf fmt "Unknown %a/%a/%a"
+      Int.pretty b (Pretty_utils.pp_opt Int.pretty) k Int.pretty e
   | Known (b,e)  -> Format.fprintf fmt "Known %a-%a" Int.pretty b Int.pretty e
   | Invalid -> Format.fprintf fmt "Invalid"
   | Variable variable_v ->
-      Format.fprintf fmt "Variable [0..%a--%a]"
-	Int.pretty variable_v.min_alloc Int.pretty variable_v.max_alloc
+    Format.fprintf fmt "Variable [0..%a--%a]"
+      Int.pretty variable_v.min_alloc Int.pretty variable_v.max_alloc
 
 module Validity = Datatype.Make
-  (struct
-    type t = validity
-    let name = "Base.validity"
-    let structural_descr = Structural_descr.t_abstract
-    let reprs = [ Known (Int.zero, Int.one) ]
-
-    (* Invalid > Variable > Unknown > Known > Empty *)
-    let compare v1 v2 = match v1, v2 with
-      | Empty, Empty -> 0
-      | Known (b1, e1), Known (b2, e2) ->
-        let c = Int.compare b1 b2 in
-        if c = 0 then Int.compare e1 e2 else c
-      | Unknown (b1, m1, e1), Unknown (b2, m2, e2) ->
-        let c = Int.compare b1 b2 in
-        if c = 0 then
-          let c = Extlib.opt_compare Int.compare m1 m2 in
+    (struct
+      type t = validity
+      let name = "Base.validity"
+      let structural_descr = Structural_descr.t_abstract
+      let reprs = [ Known (Int.zero, Int.one) ]
+
+      (* Invalid > Variable > Unknown > Known > Empty *)
+      let compare v1 v2 = match v1, v2 with
+        | Empty, Empty -> 0
+        | Known (b1, e1), Known (b2, e2) ->
+          let c = Int.compare b1 b2 in
           if c = 0 then Int.compare e1 e2 else c
-        else c
-      | Variable v1, Variable v2 ->
-        let c = Int.compare v1.min_alloc v2.min_alloc in
-        if c = 0 then
-          let c = Int.compare v1.max_alloc v2.max_alloc in
-          if c = 0 then Int.compare v1.max_allocable v2.max_allocable
+        | Unknown (b1, m1, e1), Unknown (b2, m2, e2) ->
+          let c = Int.compare b1 b2 in
+          if c = 0 then
+            let c = Option.compare Int.compare m1 m2 in
+            if c = 0 then Int.compare e1 e2 else c
+          else c
+        | Variable v1, Variable v2 ->
+          let c = Int.compare v1.min_alloc v2.min_alloc in
+          if c = 0 then
+            let c = Int.compare v1.max_alloc v2.max_alloc in
+            if c = 0 then Int.compare v1.max_allocable v2.max_allocable
+            else c
           else c
-        else c
-      | Invalid, Invalid -> 0
-      | Empty, (Known _ | Unknown _ | Variable _ | Invalid)
-      | Known _, (Unknown _ | Variable _ | Invalid)
-      | Unknown _, (Variable _ | Invalid)
-      | Variable _, Invalid -> -1
-      | Invalid, (Variable _ | Unknown _ | Known _ | Empty)
-      | Variable _, (Unknown _ | Known _ | Empty)
-      | Unknown _, (Known _ | Empty)
-      | Known _, Empty -> 1
-
-    let equal = Datatype.from_compare
-
-    let hash v = match v with
-      | Empty -> 13
-      | Invalid -> 37
-      | Known (b, e) -> Hashtbl.hash (3, Int.hash b, Int.hash e)
-      | Unknown (b, m, e) ->
-        Hashtbl.hash (7, Int.hash b, Extlib.opt_hash Int.hash m, Int.hash e)
-      | Variable variable_v ->
-        Hashtbl.hash (Int.hash variable_v.min_alloc, Int.hash variable_v.max_alloc)
-
-    let pretty = pretty_validity
-    let mem_project = Datatype.never_any_project
-    let internal_pretty_code = Datatype.pp_fail
-    let rehash = Datatype.identity
-    let copy (x:t) = x
-    let varname _ = "v"
-   end)
+        | Invalid, Invalid -> 0
+        | Empty, (Known _ | Unknown _ | Variable _ | Invalid)
+        | Known _, (Unknown _ | Variable _ | Invalid)
+        | Unknown _, (Variable _ | Invalid)
+        | Variable _, Invalid -> -1
+        | Invalid, (Variable _ | Unknown _ | Known _ | Empty)
+        | Variable _, (Unknown _ | Known _ | Empty)
+        | Unknown _, (Known _ | Empty)
+        | Known _, Empty -> 1
+
+      let equal = Datatype.from_compare
+
+      let hash v = match v with
+        | Empty -> 13
+        | Invalid -> 37
+        | Known (b, e) -> Hashtbl.hash (3, Int.hash b, Int.hash e)
+        | Unknown (b, m, e) ->
+          Hashtbl.hash (7, Int.hash b, Extlib.opt_hash Int.hash m, Int.hash e)
+        | Variable variable_v ->
+          Hashtbl.hash (Int.hash variable_v.min_alloc, Int.hash variable_v.max_alloc)
+
+      let pretty = pretty_validity
+      let mem_project = Datatype.never_any_project
+      let internal_pretty_code = Datatype.pp_fail
+      let rehash = Datatype.identity
+      let copy (x:t) = x
+      let varname _ = "v"
+    end)
 
 type cstring = CSString of string | CSWstring of Escape.wstring
 
@@ -128,20 +128,20 @@ let null = Null
 
 let is_null x = match x with Null -> true | _ -> false
 
-let pretty fmt t = 
+let pretty fmt t =
   match t with
-    | String (_, CSString s) -> Format.fprintf fmt "%S" s
-    | String (_, CSWstring s) -> 
-        Format.fprintf fmt "L\"%s\"" (Escape.escape_wstring s)
-    | Var (t,_) | Allocated (t,_,_) -> Printer.pp_varinfo fmt t
-    | CLogic_Var (lvi, _, _) -> Printer.pp_logic_var fmt lvi
-    | Null -> Format.pp_print_string fmt "NULL"
+  | String (_, CSString s) -> Format.fprintf fmt "%S" s
+  | String (_, CSWstring s) ->
+    Format.fprintf fmt "L\"%s\"" (Escape.escape_wstring s)
+  | Var (t,_) | Allocated (t,_,_) -> Printer.pp_varinfo fmt t
+  | CLogic_Var (lvi, _, _) -> Printer.pp_logic_var fmt lvi
+  | Null -> Format.pp_print_string fmt "NULL"
 
 let pretty_addr fmt t =
   (match t with
-    | Var _ | CLogic_Var _ | Allocated _ ->
-      Format.pp_print_string fmt "&"
-    | String _ | Null -> ()
+   | Var _ | CLogic_Var _ | Allocated _ ->
+     Format.pp_print_string fmt "&"
+   | String _ | Null -> ()
   );
   pretty fmt t
 
@@ -154,24 +154,24 @@ let typeof v =
   | Null -> None
   | Var (v,_) | Allocated(v,_,_) -> Some (unrollType v.vtype)
 
-let cstring_bitlength s = 
-  let u, l = 
+let cstring_bitlength s =
+  let u, l =
     match s with
     | CSString s ->
-	bitsSizeOf charType, (String.length s)
+      bitsSizeOf charType, (String.length s)
     | CSWstring s ->
-	bitsSizeOf theMachine.wcharType, (List.length s)
+      bitsSizeOf theMachine.wcharType, (List.length s)
   in
   Int.of_int (u*(succ l))
 
 let bits_sizeof v =
   match v with
-    | String (_,e) ->
-        Int_Base.inject (cstring_bitlength e)
-    | Null -> Int_Base.top
-    | Var (v,_) | Allocated (v,_,_) ->
-        Bit_utils.sizeof_vid v
-    | CLogic_Var (_, ty, _) -> Bit_utils.sizeof ty
+  | String (_,e) ->
+    Int_Base.inject (cstring_bitlength e)
+  | Null -> Int_Base.top
+  | Var (v,_) | Allocated (v,_,_) ->
+    Bit_utils.sizeof_vid v
+  | CLogic_Var (_, ty, _) -> Bit_utils.sizeof ty
 
 let dep_absolute = [Kernel.AbsoluteValidRange.self]
 
@@ -179,32 +179,32 @@ module MinValidAbsoluteAddress =
   State_builder.Ref
     (Abstract_interp.Int)
     (struct
-       let name = "MinValidAbsoluteAddress"
-       let dependencies = dep_absolute
-       let default () = Abstract_interp.Int.zero
-     end)
+      let name = "MinValidAbsoluteAddress"
+      let dependencies = dep_absolute
+      let default () = Abstract_interp.Int.zero
+    end)
 
 module MaxValidAbsoluteAddress =
   State_builder.Ref
     (Abstract_interp.Int)
     (struct
-       let name = "MaxValidAbsoluteAddress"
-       let dependencies = dep_absolute
-       let default () = Abstract_interp.Int.minus_one
-     end)
+      let name = "MaxValidAbsoluteAddress"
+      let dependencies = dep_absolute
+      let default () = Abstract_interp.Int.minus_one
+    end)
 
 let () =
   Kernel.AbsoluteValidRange.add_set_hook
     (fun _ x ->
        try Scanf.sscanf x "%s@-%s"
-         (fun min max ->
-(* let mul_CHAR_BIT = Int64.mul (Int64.of_int (bitsSizeOf charType)) in *)
-(* the above is what we would like to write but it is too early *)
-	   let mul_CHAR_BIT = Int.mul Int.eight in 
-            MinValidAbsoluteAddress.set
-              (mul_CHAR_BIT (Int.of_string min));
-            MaxValidAbsoluteAddress.set
-              ((Int.pred (mul_CHAR_BIT (Int.succ (Int.of_string max))))))
+             (fun min max ->
+                (* let mul_CHAR_BIT = Int64.mul (Int64.of_int (bitsSizeOf charType)) in *)
+                (* the above is what we would like to write but it is too early *)
+                let mul_CHAR_BIT = Int.mul Int.eight in
+                MinValidAbsoluteAddress.set
+                  (mul_CHAR_BIT (Int.of_string min));
+                MaxValidAbsoluteAddress.set
+                  ((Int.pred (mul_CHAR_BIT (Int.succ (Int.of_string max))))))
        with End_of_file | Scanf.Scan_failure _ | Failure _
           | Invalid_argument _ as e ->
          Kernel.abort "Invalid -absolute-valid-range integer-integer: each integer may be in decimal, hexadecimal (0x, 0X), octal (0o) or binary (0b) notation and has to hold in 64 bits. A correct example is -absolute-valid-range 1-0xFFFFFF0.@\nError was %S@."
@@ -221,7 +221,7 @@ let validity_from_size size =
 let validity_from_known_size size =
   match size with
   | Int_Base.Value size ->
-          (* all start to be valid at offset 0 *)
+    (* all start to be valid at offset 0 *)
     validity_from_size size
   | Int_Base.Top ->
     Unknown (Int.zero, None, Bit_utils.max_bit_address ())
@@ -230,15 +230,15 @@ let validity b =
   match b with
   | Var (_,v) | CLogic_Var (_, _, v) | Allocated (_,_,v) -> v
   | Null ->
-      let mn = min_valid_absolute_address ()in
-      let mx = max_valid_absolute_address () in
-      if Integer.gt mx mn then
-        Known (mn, mx)
-      else
-        Invalid
+    let mn = min_valid_absolute_address ()in
+    let mx = max_valid_absolute_address () in
+    if Integer.gt mx mn then
+      Known (mn, mx)
+    else
+      Invalid
   | String _ ->
-      let size = bits_sizeof b in
-      validity_from_known_size size
+    let size = bits_sizeof b in
+    validity_from_known_size size
 
 let is_read_only base =
   match base with
@@ -257,8 +257,8 @@ let rec final_empty_struct = function
   | TComp (compinfo, _, _) ->
     begin
       match compinfo.cfields with
-      | [] -> true
-      | l ->
+      | Some [] | None -> true
+      | Some l ->
         let last_field = List.(hd (rev l)) in
         try Cil.bitsSizeOf last_field.ftype = 0
         with Cil.SizeOfError _ -> false
@@ -341,7 +341,7 @@ let is_function base =
   match base with
   | String _ | Null | CLogic_Var _ | Allocated _ -> false
   | Var(v,_) ->
-      isFunctionType v.vtype
+    isFunctionType v.vtype
 
 let equal v w = (id v) = (id w)
 
@@ -351,7 +351,7 @@ let is_aligned_by b alignment =
   else
     match b with
     | Var (v,_) | Allocated(v,_,_) ->
-        Int.is_zero (Int.e_rem (Int.of_int (Cil.bytesAlignOf v.vtype)) alignment)
+      Int.is_zero (Int.e_rem (Int.of_int (Cil.bytesAlignOf v.vtype)) alignment)
     | CLogic_Var (_, ty, _) ->
       Int.is_zero (Int.e_rem (Int.of_int (Cil.bytesAlignOf ty)) alignment)
     | Null -> true
@@ -403,11 +403,11 @@ let is_block_local v block =
 let validity_from_type v =
   if isFunctionType v.vtype then Invalid
   else
-  let max_valid = Bit_utils.sizeof_vid v in
-  match max_valid with
-  | Int_Base.Top ->
-    Unknown (Int.zero, None, Bit_utils.max_bit_address ())
-  | Int_Base.Value size -> validity_from_size size
+    let max_valid = Bit_utils.sizeof_vid v in
+    match max_valid with
+    | Int_Base.Top ->
+      Unknown (Int.zero, None, Bit_utils.max_bit_address ())
+    | Int_Base.Value size -> validity_from_size size
 
 type range_validity =
   | Invalid_range
@@ -436,30 +436,30 @@ let update_variable_validity v ~weak ~min_alloc ~max_alloc =
 
 module Base = struct
   include Datatype.Make_with_collections
-  (struct
-    type t = base
-    let name = "Base"
-    let structural_descr = Structural_descr.t_abstract (* TODO better *)
-    let reprs = [ Null ]
-    let equal = equal
-    let compare = compare
-    let pretty = pretty
-    let hash = hash
-    let mem_project = Datatype.never_any_project
-    let internal_pretty_code = Datatype.pp_fail
-    let rehash = Datatype.identity
-    let copy = Datatype.undefined
-    let varname = Datatype.undefined
-   end)
+      (struct
+        type t = base
+        let name = "Base"
+        let structural_descr = Structural_descr.t_abstract (* TODO better *)
+        let reprs = [ Null ]
+        let equal = equal
+        let compare = compare
+        let pretty = pretty
+        let hash = hash
+        let mem_project = Datatype.never_any_project
+        let internal_pretty_code = Datatype.pp_fail
+        let rehash = Datatype.identity
+        let copy = Datatype.undefined
+        let varname = Datatype.undefined
+      end)
   let id = id
 end
 
 include Base
 
 module Hptset = Hptset.Make
-  (Base)
-  (struct let v = [ [ ]; [Null] ] end)
-  (struct let l = [ Ast.self ] end)
+    (Base)
+    (struct let v = [ [ ]; [Null] ] end)
+    (struct let l = [ Ast.self ] end)
 let () = Ast.add_monotonic_state Hptset.self
 let () = Ast.add_hook_on_update Hptset.clear_caches
 
@@ -469,10 +469,10 @@ module VarinfoNotSource =
   Cil_state_builder.Varinfo_hashtbl
     (Base)
     (struct
-       let name = "Base.VarinfoLogic"
-       let dependencies = [ Ast.self ]
-       let size = 89
-     end)
+      let name = "Base.VarinfoLogic"
+      let dependencies = [ Ast.self ]
+      let size = 89
+    end)
 let () = Ast.add_monotonic_state VarinfoNotSource.self
 
 let base_of_varinfo varinfo =
@@ -484,12 +484,12 @@ module Validities =
   Cil_state_builder.Varinfo_hashtbl
     (Base)
     (struct
-       let name = "Base.Validities"
-       let dependencies = [ Ast.self ]
-         (* No dependency on Kernel.AbsoluteValidRange.self needed:
-            the null base is not present in this table (not a varinfo) *)
-       let size = 117
-     end)
+      let name = "Base.Validities"
+      let dependencies = [ Ast.self ]
+      (* No dependency on Kernel.AbsoluteValidRange.self needed:
+         the null base is not present in this table (not a varinfo) *)
+      let size = 117
+    end)
 let () = Ast.add_monotonic_state Validities.self
 
 let of_varinfo_aux = Validities.memo base_of_varinfo
@@ -508,9 +508,9 @@ let register_allocated_var varinfo deallocation validity =
 
 let of_c_logic_var lv =
   match Logic_utils.unroll_type lv.lv_type with
-    | Ctype ty ->
-      CLogic_Var (lv, ty, validity_from_known_size (Bit_utils.sizeof ty))
-    | _ -> Kernel.fatal "Logic variable with a non-C type %s" lv.lv_name
+  | Ctype ty ->
+    CLogic_Var (lv, ty, validity_from_known_size (Bit_utils.sizeof ty))
+  | _ -> Kernel.fatal "Logic variable with a non-C type %s" lv.lv_name
 
 let of_varinfo varinfo =
   if varinfo.vsource
@@ -533,10 +533,10 @@ module LiteralStrings =
     (Datatype.Int.Hashtbl)
     (Base)
     (struct
-       let name = "literal strings"
-       let dependencies = [ Ast.self ]
-       let size = 17
-     end)
+      let name = "literal strings"
+      let dependencies = [ Ast.self ]
+      let size = 17
+    end)
 let () = Ast.add_monotonic_state LiteralStrings.self
 
 let of_string_exp e =
diff --git a/src/kernel_services/abstract_interp/base.mli b/src/kernel_services/abstract_interp/base.mli
index 8264a30a35a76cd327f75104ec83c5c28eafc6ee..924cf619648fa3874122ea6ed6c3c32610ca1e7b 100644
--- a/src/kernel_services/abstract_interp/base.mli
+++ b/src/kernel_services/abstract_interp/base.mli
@@ -45,33 +45,33 @@ type deallocation = Malloc | VLA | Alloca
 
 type base = private
   | Var of Cil_types.varinfo * validity
-      (** Base for a standard C variable. *)
+  (** Base for a standard C variable. *)
   | CLogic_Var of Cil_types.logic_var * Cil_types.typ * validity
-      (** Base for a logic variable that has a C type. *)
+  (** Base for a logic variable that has a C type. *)
   | Null (** Base for an address like [(int* )0x123] *)
   | String of int (** unique id of the constant string (one per code location)*)
-    * cstring (** contents of the constant string *)
+              * cstring (** contents of the constant string *)
   | Allocated of Cil_types.varinfo * deallocation  * validity
-      (** Base for a variable dynamically allocated via malloc/calloc/realloc/alloca *)
+  (** Base for a variable dynamically allocated via malloc/calloc/realloc/alloca *)
 
 and validity =
   | Empty (** For 0-sized bases *)
   | Known of Int.t * Int.t (** Valid between those two bits *)
-  | Unknown of Int.t * Int.t option * Int.t 
-      (** Unknown(b,k,e) indicates:
-          If k is [None], potentially valid between b and e
-          If k is [Some k], then b <= k <= e, and the base is
-           - valid between b and k;
-  	   - potentially valid between k+1 and e:
-          Accesses on potentially valid parts will succeed, but will also
-          raise an alarm. *)
+  | Unknown of Int.t * Int.t option * Int.t
+  (** Unknown(b,k,e) indicates:
+      If k is [None], potentially valid between b and e
+      If k is [Some k], then b <= k <= e, and the base is
+      - valid between b and k;
+      - potentially valid between k+1 and e:
+        Accesses on potentially valid parts will succeed, but will also
+        raise an alarm. *)
   | Variable of variable_validity
-        (** Variable(min_alloc, max_alloc) means:
-            - all offsets between [0] and [min_alloc] are valid; min_alloc can
-              be -1, in which case no offsets are guaranteed to be valid.
-            - offsets between [min_alloc+1] and [max_alloc] are potentially valid;
-            - offsets above [max_alloc+1] are invalid.
-        *)
+  (** Variable(min_alloc, max_alloc) means:
+      - all offsets between [0] and [min_alloc] are valid; min_alloc can
+        be -1, in which case no offsets are guaranteed to be valid.
+      - offsets between [min_alloc+1] and [max_alloc] are potentially valid;
+      - offsets above [max_alloc+1] are invalid.
+  *)
   | Invalid (** Valid nowhere. Typically used for the NULL base, or for
                 function pointers. *)
 
@@ -84,13 +84,13 @@ include Datatype.S_with_collections with type t = base
 
 module Hptset: Hptset.S
   with type elt = t
-  and type 'a shape = 'a Hptmap.Shape(Base).t
+   and type 'a shape = 'a Hptmap.Shape(Base).t
 
 module SetLattice: Lattice_type.Lattice_Set with module O = Hptset
 
 module Validity: Datatype.S with type t = validity
 
-(** [pretty_addr fmt base] pretty-prints the name of [base] on [fmt], with 
+(** [pretty_addr fmt base] pretty-prints the name of [base] on [fmt], with
     a leading ampersand if it is a variable *)
 val pretty_addr : Format.formatter -> t -> unit
 
@@ -107,7 +107,7 @@ val validity : t -> validity
 (** [validity_from_size size] returns [Empty] if [size] is zero,
     or [Known (0, size-1)] if [size > 0].
     [size] must not be negative.
-   @since Aluminium-20160501 *)
+    @since Aluminium-20160501 *)
 val validity_from_size : Int.t -> validity
 val validity_from_type : Cil_types.varinfo -> validity
 
@@ -216,14 +216,14 @@ val is_aligned_by : t -> Int.t -> bool
     and is never needed for normal users. *)
 
 val register_allocated_var: Cil_types.varinfo -> deallocation -> validity -> t
-  (** Allocated variables are variables not present in the source of the
-      program, but instead created through dynamic allocation. Their field
-      [vsource] is set to false. *)
+(** Allocated variables are variables not present in the source of the
+    program, but instead created through dynamic allocation. Their field
+    [vsource] is set to false. *)
 
 val register_memory_var : Cil_types.varinfo -> validity -> t
-  (** Memory variables are variables not present in the source of the program.
-      They are created only to fill the contents of another variable.
-      Their field [vsource] is set to false. *)
+(** Memory variables are variables not present in the source of the program.
+    They are created only to fill the contents of another variable.
+    Their field [vsource] is set to false. *)
 
 (*
 Local Variables:
diff --git a/src/kernel_services/abstract_interp/fc_float.ml b/src/kernel_services/abstract_interp/fc_float.ml
index 3fd653052056c4e4aede01aaa7a01b37fc20652c..748e227d2dd83dd709a9d36b08724a06029ebbd5 100644
--- a/src/kernel_services/abstract_interp/fc_float.ml
+++ b/src/kernel_services/abstract_interp/fc_float.ml
@@ -58,11 +58,8 @@ let cmp_ieee = (compare: float -> float -> int)
     are also considered, e.g. "if x < 0.0" is equivalent to "if x < -0.0",
     which is also equivalent to "F.compare x (-0.0) < 0".
     This 'compare' operator distinguishes -0. and 0. *)
-(* replace "noalloc" with [@@noalloc] for OCaml version >= 4.03.0 *)
-[@@@ warning "-3"]
-external compare : float -> float -> int = "float_compare_total" "noalloc"
+external compare : float -> float -> int = "float_compare_total" [@@noalloc]
 let total_compare = compare
-[@@@ warning "+3"]
 
 let of_float round prec f = round >>% fun () -> round_to_precision prec f
 
@@ -74,10 +71,7 @@ let is_finite f = match classify_float f with
   | FP_nan | FP_infinite -> false
   | FP_normal | FP_subnormal | FP_zero -> true
 
-(* replace "noalloc" with [@@noalloc] for OCaml version >= 4.03.0 *)
-[@@@ warning "-3"]
-external is_negative : float -> bool = "float_is_negative" "noalloc"
-[@@@ warning "+3"]
+external is_negative : float -> bool = "float_is_negative" [@@noalloc]
 
 let round_to_precision round prec t =
   if is_single prec
diff --git a/src/kernel_services/abstract_interp/fval.ml b/src/kernel_services/abstract_interp/fval.ml
index 8bd884baf257cd2d9b9d7af27fd10e6b8337a536..a3771a9b86e7d65a30c5a5fdd7c2dcab18d3c45a 100644
--- a/src/kernel_services/abstract_interp/fval.ml
+++ b/src/kernel_services/abstract_interp/fval.ml
@@ -59,10 +59,7 @@ module F = struct
       are also considered, e.g. "if x < 0.0" is equivalent to "if x < -0.0",
       which is also equivalent to "F.compare x (-0.0) < 0".
       This 'compare' operator distinguishes -0. and 0. *)
-  (* replace "noalloc" with [@@noalloc] for OCaml version >= 4.03.0 *)
-  [@@@ warning "-3"]
-  external compare : float -> float -> int = "float_compare_total" "noalloc"
-  [@@@ warning "+3"]
+  external compare : float -> float -> int = "float_compare_total" [@@noalloc]
   let equal f1 f2 = compare f1 f2 = 0
 
   (* The Caml version of compare below is fine but the C version above is
diff --git a/src/kernel_services/abstract_interp/int_interval.ml b/src/kernel_services/abstract_interp/int_interval.ml
index 3cfb032d20f5c2024880f8c6290b974dbad24fcb..5a6b83b8b72f80269cf275511b0854a95dec7760 100644
--- a/src/kernel_services/abstract_interp/int_interval.ml
+++ b/src/kernel_services/abstract_interp/int_interval.ml
@@ -438,8 +438,8 @@ let opt_map2 f m1 m2 =
 
 let add_singleton_int i t =
   let incr = Int.add i in
-  let min = Extlib.opt_map incr t.min in
-  let max = Extlib.opt_map incr t.max in
+  let min = Option.map incr t.min in
+  let max = Option.map incr t.max in
   let rem = Int.e_rem (incr t.rem) t.modu in
   make ~min ~max ~rem ~modu:t.modu
 
@@ -477,8 +477,8 @@ let add_under t1 t2 =
 
 let neg t =
   make
-    ~min:(Extlib.opt_map Int.neg t.max)
-    ~max:(Extlib.opt_map Int.neg t.min)
+    ~min:(Option.map Int.neg t.max)
+    ~max:(Option.map Int.neg t.min)
     ~rem:(Int.e_rem (Int.neg t.rem) t.modu)
     ~modu:t.modu
 
@@ -530,12 +530,12 @@ let scale f t =
   then
     let modu = incr t.modu in
     make
-      ~min:(Extlib.opt_map incr t.min) ~max:(Extlib.opt_map incr t.max)
+      ~min:(Option.map incr t.min) ~max:(Option.map incr t.max)
       ~rem:(Int.e_rem (incr t.rem) modu) ~modu
   else
     let modu = Int.neg (incr t.modu) in
     make
-      ~min:(Extlib.opt_map incr t.max) ~max:(Extlib.opt_map incr t.min)
+      ~min:(Option.map incr t.max) ~max:(Option.map incr t.min)
       ~rem:(Int.e_rem (incr t.rem) modu) ~modu
 
 let scale_div_common ~pos f t degenerate =
@@ -559,8 +559,8 @@ let scale_div_common ~pos f t degenerate =
     else (* degeneration*)
       degenerate t.rem t.modu
   in
-  let divf_mn1 = Extlib.opt_map div_f t.min in
-  let divf_mx1 = Extlib.opt_map div_f t.max in
+  let divf_mn1 = Option.map div_f t.min in
+  let divf_mx1 = Option.map div_f t.max in
   let min, max =
     if Int.gt f Int.zero
     then divf_mn1, divf_mx1
@@ -627,7 +627,7 @@ let c_rem t1 t2 =
       (* Bound the result: no more than |x|, and no more than |y|-1 *)
       let pos_rem = Integer.max (Int.abs min2) (Int.abs max2) in
       let bound = Int.pred pos_rem in
-      let bound = Extlib.may_map (Int.min bound) ~dft:bound max_x in
+      let bound = Option.fold ~some:(Int.min bound) ~none:bound max_x in
       (* Compute result bounds using sign information *)
       let min = if neg then Some (Int.neg bound) else Some Int.zero in
       let max = if pos then Some bound else Some Int.zero in
diff --git a/src/kernel_services/abstract_interp/int_set.ml b/src/kernel_services/abstract_interp/int_set.ml
index a337b628b848bdcb910ad4827411b6d5290ce3a3..e6ad99f6fadde425107ba87cf766d6b025422c61 100644
--- a/src/kernel_services/abstract_interp/int_set.ml
+++ b/src/kernel_services/abstract_interp/int_set.ml
@@ -152,7 +152,7 @@ let for_all f (a : Integer.t array) =
   let rec c i = i = l || ((f a.(i)) && c (succ i)) in
   c 0
 
-let exists = Extlib.array_exists
+let exists = Array.exists
 
 let iter = Array.iter
 let fold ?(increasing=true) =
diff --git a/src/kernel_services/abstract_interp/int_val.ml b/src/kernel_services/abstract_interp/int_val.ml
index df1e9925d9db5c0e2f8cb9ea0486a9cc8bf71af4..a35989c89fd42576de4e16618decf88e0e81b022 100644
--- a/src/kernel_services/abstract_interp/int_val.ml
+++ b/src/kernel_services/abstract_interp/int_val.ml
@@ -270,7 +270,7 @@ let cardinal = function
 
 let cardinal_estimate ~size = function
   | Set s -> Int.of_int (Int_set.cardinal s)
-  | Itv i -> Extlib.opt_conv (Int.two_power size) (Int_interval.cardinal i)
+  | Itv i -> Option.value ~default:(Int.two_power size) (Int_interval.cardinal i)
 
 let cardinal_less_than v n =
   let c =
@@ -521,8 +521,8 @@ let shift_aux scale op (x: t) (y: t) =
     match y with
     | Set s -> Int_set.map_reduce (fun n -> scale (Int.two_power n) x) join s
     | Itv _ ->
-      let min = Extlib.opt_map Int.two_power (min_int y) in
-      let max = Extlib.opt_map Int.two_power (max_int y) in
+      let min = Option.map Int.two_power (min_int y) in
+      let max = Option.map Int.two_power (max_int y) in
       let modu = match min with None -> Int.one | Some m -> m in
       let factor = check_make ~min ~max ~rem:Int.zero ~modu in
       op x factor
diff --git a/src/kernel_services/abstract_interp/ival.ml b/src/kernel_services/abstract_interp/ival.ml
index 54772b1ae81599941154d7328df7c0393b4faaaa..840592615b1dde78505a3caeda6cb92e066b1d79 100644
--- a/src/kernel_services/abstract_interp/ival.ml
+++ b/src/kernel_services/abstract_interp/ival.ml
@@ -667,8 +667,8 @@ let backward_ge_int min v =
   | Float _ -> v
   | Int _ -> narrow v (inject_int (Int_val.inject_range min None))
 
-let backward_lt_int max v = backward_le_int (Extlib.opt_map Int.pred max) v
-let backward_gt_int min v = backward_ge_int (Extlib.opt_map Int.succ min) v
+let backward_lt_int max v = backward_le_int (Option.map Int.pred max) v
+let backward_gt_int min v = backward_ge_int (Option.map Int.succ min) v
 
 let diff_if_one value rem =
   match value, rem with
@@ -837,8 +837,8 @@ type overflow_float_to_int =
 
 let cast_float_to_int_non_nan ~signed ~size (min, max) =
   let all = create_all_values ~size ~signed in
-  let min_all = Extlib.the (min_int all) in
-  let max_all = Extlib.the (max_int all) in
+  let min_all = Option.get (min_int all) in
+  let max_all = Option.get (max_int all) in
   let conv f =
     try
       (* truncate_to_integer returns an integer that fits in a 64 bits
diff --git a/src/kernel_services/abstract_interp/offsetmap.ml b/src/kernel_services/abstract_interp/offsetmap.ml
index 8421d01cc1b1adb0be7027ca6df26e9c23f5a965..b70cd7e562cb656af389c8c084966a8df4229ec1 100644
--- a/src/kernel_services/abstract_interp/offsetmap.ml
+++ b/src/kernel_services/abstract_interp/offsetmap.ml
@@ -510,13 +510,9 @@ module Make (V : Offsetmap_lattice_with_isotropy.S) = struct
        | Node (max, _, _, _, _, r, m, v, _) ->
          let abs_max = max +~ o in
          let now = f (o, abs_max) (v, m, r) pre in
-         let no, nt, nz =
-           try move_right o t z
-           with End_reached -> (* Use match ... with exception in 4.02 *)
-             abs_max, Empty, z (* End the recursion at next iteration *)
-         in
-         aux_fold no nt nz now
-
+         match move_right o t z with
+         | no, nt, nz -> aux_fold no nt nz now
+         | exception End_reached -> now
      in
      aux_fold o n z acc
  ;;
@@ -531,16 +527,11 @@ module Make (V : Offsetmap_lattice_with_isotropy.S) = struct
        match t with
        | Empty -> ()
        | Node (max, _, _, _, _, r, m, v, _) ->
-         begin
-           let abs_max = max +~ o in
-           f (o, abs_max) (v, m, r);
-           let no, nt, nz =
-             try move_right o t z
-             with End_reached ->
-               abs_max, Empty, z (* End the recursion at next iteration *)
-           in
-           aux_iter no nt nz
-         end
+         let abs_max = max +~ o in
+         f (o, abs_max) (v, m, r);
+         match move_right o t z with
+         | no, nt, nz -> aux_iter no nt nz
+         | exception End_reached -> ()
      in
      aux_iter o n z
  ;;
diff --git a/src/kernel_services/abstract_interp/tr_offset.ml b/src/kernel_services/abstract_interp/tr_offset.ml
index 36376d3393e27214ed22b83b70e079d0855aab9b..f923d0914630844a230b41835bfb09ef3409bfb9 100644
--- a/src/kernel_services/abstract_interp/tr_offset.ml
+++ b/src/kernel_services/abstract_interp/tr_offset.ml
@@ -52,7 +52,7 @@ let reduce_offset_by_validity origin ival size validity =
       | None ->
         let min, max, _r, modu = Ival.min_max_r_mod reduced_ival in
         (* The bounds are finite thanks to the narrow with the valid range. *)
-        let min = Extlib.the min and max = Extlib.the max in
+        let min = Option.get min and max = Option.get max in
         if Int.lt modu size
         then Overlap (min, Int.add max (Int.pred size), origin)
         else Interval (min, max, modu)
diff --git a/src/kernel_services/analysis/bit_utils.ml b/src/kernel_services/analysis/bit_utils.ml
index ce6b804ffac0b2a688bd0bdade62d83f9e640d84..90968aed324a5b1a9921a83277f9666bfcf25ce8 100644
--- a/src/kernel_services/analysis/bit_utils.ml
+++ b/src/kernel_services/analysis/bit_utils.ml
@@ -248,8 +248,7 @@ let rec pretty_bits_internal env bfinfo typ ~align ~start ~stop =
         try
           let full_fields_to_print = List.fold_left
             (fun acc field ->
-               let current_offset = Field (field,NoOffset) in
-               let start_o,width_o = bitsOffset typ current_offset in
+               let start_o,width_o = fieldBitsOffset field in
                let start_o,width_o =
                  Integer.of_int start_o, Integer.of_int width_o
                in
@@ -281,7 +280,7 @@ let rec pretty_bits_internal env bfinfo typ ~align ~start ~stop =
                else
                  acc)
             []
-            compinfo.cfields
+            (Option.value ~default:[] compinfo.cfields)
           in
           (** find non covered intervals in structs *)
           let non_covered,succ_last =
@@ -304,7 +303,7 @@ let rec pretty_bits_internal env bfinfo typ ~align ~start ~stop =
                      (s,succ_stop_o)
                 )
                 (full_fields_to_print,start)
-                compinfo.cfields
+                (Option.value ~default:[] compinfo.cfields)
             else full_fields_to_print, Integer.zero
           in
           let overflowing =
@@ -463,7 +462,7 @@ type offset_match =
 let rec equal_type_no_attribute t1 t2 =
   match Cil.unrollType t1, Cil.unrollType t2 with
   | TVoid _, TVoid _ -> true
-  | TInt (i1, _), TInt (i2, _) -> i1 = i2 
+  | TInt (i1, _), TInt (i2, _) -> i1 = i2
   | TFloat (f1, _), TFloat (f2, _) -> f1 = f2
   | TPtr (t1, _), TPtr (t2, _) -> equal_type_no_attribute t1 t2
   | TArray (t1', s1, _, _), TArray (t2', s2, _, _) ->
@@ -578,7 +577,7 @@ let rec find_offset typ ~offset om =
                other fields are too far and we abort. *)
             find_field q
       in
-      find_field ci.cfields
+      find_field (Option.value ~default:[] ci.cfields)
 
     | _ -> raise NoMatchingOffset
 
diff --git a/src/kernel_services/analysis/dataflow2.ml b/src/kernel_services/analysis/dataflow2.ml
index 2c31737ece909ee4ea322fcf855198cc37d8c9a2..24d9cf46ae218b4286edb020014d7ecd7bfea612 100644
--- a/src/kernel_services/analysis/dataflow2.ml
+++ b/src/kernel_services/analysis/dataflow2.ml
@@ -365,7 +365,7 @@ module Forwards(T : ForwardsTransfer) = struct
             | TryExcept _ | TryFinally _
             | Loop _ | Return _ | Block _ -> do_succs curr
             | Throw _ | TryCatch _ ->
-              Kernel.not_yet_implemented
+              Kernel.not_yet_implemented ~current:true
                 "[dataflow] exception handling"
 
 
diff --git a/src/kernel_services/analysis/destructors.ml b/src/kernel_services/analysis/destructors.ml
index 60a89abe305204587f016ebca8b64c0d9f3411ad..99e2cef1c2ea23922820e87c639dfb55749c480d 100644
--- a/src/kernel_services/analysis/destructors.ml
+++ b/src/kernel_services/analysis/destructors.ml
@@ -244,7 +244,7 @@ class vis flag = object(self)
         Kernel.fatal ~current:true
           "%a in function %a is expected to have a single successor"
           Printer.pp_stmt s
-          Kernel_function.pretty (Extlib.the self#current_kf)
+          Kernel_function.pretty (Option.get self#current_kf)
     in
     let treat_succ_open kind s succ =
       (* The jump must not bypass a vla initialization in the opened blocks. *)
@@ -280,7 +280,8 @@ class vis flag = object(self)
 end
 
 let treat_one_function flag kf =
-  if not (Cil.is_special_builtin (Kernel_function.get_name kf)) then begin
+  if not (Cil_builtins.is_special_builtin (Kernel_function.get_name kf))
+  then begin
     let my_flag = ref false in
     let vis = new vis my_flag in
     ignore (Visitor.visitFramacKf vis kf);
diff --git a/src/kernel_services/analysis/dominators.ml b/src/kernel_services/analysis/dominators.ml
index ec7711a0798e499184809ff821399f8c01081bf3..dc0d578bd3b0e849f32f80aa9bb1f0d1632a56e3 100644
--- a/src/kernel_services/analysis/dominators.ml
+++ b/src/kernel_services/analysis/dominators.ml
@@ -172,7 +172,7 @@ let direction_dom kf =
 (* Fill the project table with the dominators of a given function. *)
 let store_dom domtree to_stmt =
   Array.iteri( fun ord idom ->
-    let idom = Extlib.opt_map to_stmt idom in
+    let idom = Option.map to_stmt idom in
     let stmt = to_stmt ord in
     Kernel.debug ~dkey:Kernel.dkey_dominators "storing dom for %d: %s"
       stmt.sid (match idom with None -> "self" | Some s ->string_of_int s.sid);
@@ -270,7 +270,7 @@ let nearest_common_ancestor l =
     );
     let to_ordered = Dominator.to_ordered in
     let to_stmt = Dominator.to_stmt in
-    let find i = Extlib.opt_map to_ordered (Dom_tree.find (to_stmt i)) in
+    let find i = Option.map to_ordered (Dom_tree.find (to_stmt i)) in
     let rec aux = function
       | [] -> assert false
       | [s] -> to_ordered s
diff --git a/src/kernel_services/analysis/exn_flow.ml b/src/kernel_services/analysis/exn_flow.ml
index e6badcad629642c2838b939b21aab3b326d45b45..6c1568a7051e44207129266ad9a6e9560c1531dc 100644
--- a/src/kernel_services/analysis/exn_flow.ml
+++ b/src/kernel_services/analysis/exn_flow.ml
@@ -346,7 +346,7 @@ let generate_exn_union e exns =
   let loc = Cil_datatype.Location.unknown in
   let create_union_fields _ =
     let add_one_field t acc = (get_type_tag t, t, None, [], loc) :: acc in
-    Cil_datatype.Typ.Set.fold add_one_field exns []
+    Some (Cil_datatype.Typ.Set.fold add_one_field exns [])
   in
   let union_name = "__fc_exn_union" in
   let exn_kind_union =
@@ -360,7 +360,7 @@ let generate_exn_union e exns =
       (exn_obj_name,
        TComp(exn_kind_union, { scache = Not_Computed } , []), None, [], loc)
     in
-    [uncaught; kind; obj]
+    Some [uncaught; kind; obj]
   in
   let struct_name = "__fc_exn_struct" in
   let exn_struct =
@@ -444,7 +444,7 @@ class erase_exn =
         let s = get_type_tag t in
         Kernel.debug ~dkey:Kernel.dkey_exn_flow
           "Registering %a as possible exn type" Cil_datatype.Typ.pretty t;
-        let fi = List.find (fun fi -> fi.fname = s) union.cfields in
+        let fi = List.find (fun fi -> fi.fname = s) (Option.get union.cfields) in
         Cil_datatype.Typ.Hashtbl.add exn_union t fi
       in
       Cil_datatype.Typ.Set.iter update_one_binding exns
@@ -454,13 +454,13 @@ class erase_exn =
     method private is_thrown t = Cil_datatype.Typ.Hashtbl.mem exn_enum t
 
     method private exn_field_off name =
-      List.find (fun fi -> fi.fname = name) (Extlib.the exn_struct).cfields
+      List.find (fun fi -> fi.fname = name) (Option.(get (get exn_struct).cfields))
 
     method private exn_field name =
-      Var (Extlib.the exn_var), Field(self#exn_field_off name, NoOffset)
+      Var (Option.get exn_var), Field(self#exn_field_off name, NoOffset)
 
     method private exn_field_term name =
-      TVar(Cil.cvar_to_lvar (Extlib.the exn_var)),
+      TVar(Cil.cvar_to_lvar (Option.get exn_var)),
       TField(self#exn_field_off name, TNoOffset)
 
     method private exn_obj_field = self#exn_field exn_obj_name
@@ -516,7 +516,7 @@ class erase_exn =
       if Stack.is_empty catch_all_label then begin
         (* no catch-all clause in the function: just go up in the stack. *)
         fct_can_throw <- true;
-        let kf = Extlib.the self#current_kf in
+        let kf = Option.get self#current_kf in
         let ret = Kernel_function.find_return kf in
         let rtyp = Kernel_function.get_return_type kf in
         if ret.labels = [] then
@@ -594,7 +594,7 @@ class erase_exn =
         in
         b.bstmts <- s :: b.bstmts
       in
-      let f = Extlib.the self#current_func in
+      let f = Option.get self#current_func in
       let update_locals v b =
         if not (List.memq v b.blocals) then b.blocals <- v::b.blocals;
         if not (List.memq v f.slocals) then f.slocals <- v::f.slocals
@@ -638,7 +638,7 @@ class erase_exn =
 
     method private modify_current () =
       modified_funcs <-
-        Cil_datatype.Fundec.Set.add (Extlib.the self#current_func) modified_funcs;
+        Cil_datatype.Fundec.Set.add (Option.get self#current_func) modified_funcs;
 
     method private aux_handler_goto target (v,b) =
       let loc = v.vdecl in
@@ -696,7 +696,7 @@ class erase_exn =
     method private clean_catch_clause (bind,b as handler) acc =
       let remove_local v =
         let f =
-          Visitor_behavior.Get.fundec self#behavior (Extlib.the self#current_func)
+          Visitor_behavior.Get.fundec self#behavior (Option.get self#current_func)
         in
         let v = Visitor_behavior.Get.varinfo self#behavior v in
         f.slocals <- List.filter (fun v' -> v!=v') f.slocals;
@@ -776,7 +776,7 @@ class erase_exn =
       | Throw (None,loc) ->
         self#modify_current ();
         let s1 = self#set_uncaught_flag loc true in
-        let t = purify (Extlib.the exn_var).vtype in
+        let t = purify (Option.get exn_var).vtype in
         let rv = self#jumps_to_handler loc t in
         let b = mkBlock (s1 :: rv) in
         s.skind <- Block b;
diff --git a/src/kernel_services/analysis/interpreted_automata.ml b/src/kernel_services/analysis/interpreted_automata.ml
index 32a98309ead70a015f9269dbe4c382f2abc97e72..3b312f516dba0e9d87ad9af7dd906870ced37fda 100644
--- a/src/kernel_services/analysis/interpreted_automata.ml
+++ b/src/kernel_services/analysis/interpreted_automata.ml
@@ -83,22 +83,22 @@ let dummy_edge = {
 }
 
 module Vertex = Datatype.Make_with_collections
-  (struct
-    include Datatype.Serializable_undefined
-    type t = vertex
-    let reprs = [dummy_vertex]
-    let name = "Interpreted_automata.Vertex"
-    let copy v =
-      { v with vertex_key = v.vertex_key }
-    let compare v1 v2 = v1.vertex_key - v2.vertex_key
-    let hash v = v.vertex_key
-    let equal v1 v2 = v1.vertex_key = v2.vertex_key
-    let pretty fmt v = Format.pp_print_int fmt v.vertex_key
-  end)
-
-module Edge = 
-  struct 
-    include Datatype.Make_with_collections
+    (struct
+      include Datatype.Serializable_undefined
+      type t = vertex
+      let reprs = [dummy_vertex]
+      let name = "Interpreted_automata.Vertex"
+      let copy v =
+        { v with vertex_key = v.vertex_key }
+      let compare v1 v2 = v1.vertex_key - v2.vertex_key
+      let hash v = v.vertex_key
+      let equal v1 v2 = v1.vertex_key = v2.vertex_key
+      let pretty fmt v = Format.pp_print_int fmt v.vertex_key
+    end)
+
+module Edge =
+struct
+  include Datatype.Make_with_collections
       (struct
         include Datatype.Serializable_undefined
         type t = vertex edge
@@ -110,8 +110,8 @@ module Edge =
         let equal e1 e2 = e1.edge_key = e2.edge_key
         let pretty fmt e = Format.pp_print_int fmt e.edge_key
       end)
-    let default = dummy_edge
-  end
+  let default = dummy_edge
+end
 
 
 module G = Graph.Imperative.Digraph.ConcreteBidirectionalLabeled (Vertex)
@@ -133,7 +133,7 @@ type automaton = {
   stmt_table : (vertex * vertex) StmtTable.t;
 }
 
-(** Each goto statement is referenced during the traversal of the AST so 
+(** Each goto statement is referenced during the traversal of the AST so
     that the jumps can be added to the graph afterward using a stmt_table.
     They are stored as a (vertex,stmt,stmt) tuple, where the vertex is the
     origin and the two statements are the origin and the destination of the
@@ -145,8 +145,6 @@ type goto_list = (vertex * stmt * stmt) list ref
 type control_points = {
   src: vertex;
   dest: vertex;
-  break: vertex option;
-  continue: vertex option;
 }
 
 
@@ -165,24 +163,24 @@ let unknown_loc =
 
 let first_loc block =
   let rec f = function
-  | [] ->
-    raise Not_found
-  | {skind = Block b} :: l ->
-    (try f b.bstmts with Not_found -> f l)
-  | stmt :: _ ->
-    stmt_loc stmt
+    | [] ->
+      raise Not_found
+    | {skind = Block b} :: l ->
+      (try f b.bstmts with Not_found -> f l)
+    | stmt :: _ ->
+      stmt_loc stmt
   in
   try f block.bstmts
   with Not_found -> unknown_loc
 
 let last_loc block =
   let rec f = function
-  | [] ->
-    raise Not_found
-  | {skind = Block b} :: l ->
-    (try f (List.rev b.bstmts) with Not_found -> f l)
-  | stmt :: _ ->
-    stmt_loc stmt
+    | [] ->
+      raise Not_found
+    | {skind = Block b} :: l ->
+      (try f (List.rev b.bstmts) with Not_found -> f l)
+    | stmt :: _ ->
+      stmt_loc stmt
   in
   try f (List.rev block.bstmts)
   with Not_found -> unknown_loc
@@ -262,16 +260,16 @@ let build_automaton ~annotations kf =
   let build_transitions src dest kinstr loc l =
     (* Add transitions to the graph *)
     let rec fold_transition v1 = function
-    | [] ->
-      assert false
-    | [t] -> 
-      add_edge v1 dest kinstr t loc
-    | Skip :: l ->
-      fold_transition v1 l
-    | t :: l -> 
-      let v2 = add_vertex () in
-      add_edge v1 v2 kinstr t loc;
-      fold_transition v2 l
+      | [] ->
+        assert false
+      | [t] ->
+        add_edge v1 dest kinstr t loc
+      | Skip :: l ->
+        fold_transition v1 l
+      | t :: l ->
+        let v2 = add_vertex () in
+        add_edge v1 v2 kinstr t loc;
+        fold_transition v2 l
     in
     fold_transition src l
   in
@@ -286,15 +284,7 @@ let build_automaton ~annotations kf =
       List.map (fun b -> Enter b) entered_blocks
     and kinstr = Kstmt stmt
     in
-    build_transitions src dest kinstr (stmt_loc stmt) l 
-  in
-  let add_jump src dest stmt =
-    (* We use Cil stmt successor informations *)
-    let succ = match stmt.succs with
-    | [succ] -> succ (* List must contain one element *)
-    | _ -> assert false
-    in
-    build_stmt_transition src dest stmt succ Skip
+    build_transitions src dest kinstr (stmt_loc stmt) l
   in
 
   let rec do_list do_one control labels = function
@@ -324,14 +314,14 @@ let build_automaton ~annotations kf =
       in
       add_edge control.src block_start kinstr (Enter block) loc_start;
       add_edge block_end control.dest kinstr (Leave block) loc_end;
-      let block_control = {control with src = block_start; dest = block_end} in
+      let block_control = {src = block_start; dest = block_end} in
       do_list do_stmt block_control labels block.bstmts
     end
 
   and do_stmt control (labels:vertex labels) stmt =
     let kinstr = Kstmt stmt
     and loc = stmt_loc stmt in
-
+    let source = fst loc in
     let do_annot control labels (annot: code_annotation) : unit =
       let labels = LabelMap.add_builtin Here control.src labels in
       let annotation = make_annotation kf stmt annot labels in
@@ -384,12 +374,10 @@ let build_automaton ~annotations kf =
         gotos := (control.src,stmt,!dest_stmt) :: !gotos;
         control.src
 
-      | Break _ ->
-        add_jump control.src (Extlib.the control.break) stmt;
-        control.src
-
-      | Continue _ ->
-        add_jump control.src (Extlib.the control.continue) stmt;
+      | Break _ | Continue _ ->
+        assert (List.length stmt.succs = 1);
+        let dest_stmt = List.hd stmt.succs in
+        gotos := (control.src,stmt,dest_stmt) :: !gotos;
         control.src
 
       | If (exp, then_block, else_block, _) ->
@@ -414,7 +402,6 @@ let build_automaton ~annotations kf =
         let block_control = {
           control with
           src = add_vertex ();
-          break = Some control.dest;
         } in
         do_block block_control kinstr labels block;
         (* Then link the cases *)
@@ -424,31 +411,31 @@ let build_automaton ~annotations kf =
             begin fun values case_stmt ->
               let dest,_ = StmtTable.find table case_stmt in
               (* For all cases for this statement *)
-            List.fold_left
-              begin fun values -> function
-              | Case (exp2,_) ->
-                  let guard = build_guard exp2 Then in
-                  build_stmt_transition control.src dest stmt case_stmt guard;
-                  exp2 :: values
-              | Default (_) ->
-                  default_case := Some (dest,case_stmt);
-                  values
-              | Label _ -> values
-              end values case_stmt.Cil_types.labels
-          end [] cases
+              List.fold_left
+                begin fun values -> function
+                  | Case (exp2,_) ->
+                    let guard = build_guard exp2 Then in
+                    build_stmt_transition control.src dest stmt case_stmt guard;
+                    exp2 :: values
+                  | Default (_) ->
+                    default_case := Some (dest,case_stmt);
+                    values
+                  | Label _ -> values
+                end values case_stmt.Cil_types.labels
+            end [] cases
         in
         (* Finally, link the default case *)
         let rec add_default_edge src = function
           | [] ->
-              add_last_edge src Skip
+            add_last_edge src Skip
           | exp2 :: [] ->
-              let guard = build_guard exp2 Else in
-              add_last_edge src guard
+            let guard = build_guard exp2 Else in
+            add_last_edge src guard
           | exp2 :: l ->
-              let point = add_vertex ()
-              and guard = build_guard exp2 Else in
-              add_edge src point kinstr guard loc;
-              add_default_edge point l
+            let point = add_vertex ()
+            and guard = build_guard exp2 Else in
+            add_edge src point kinstr guard loc;
+            add_default_edge point l
         and add_last_edge src transition =
           match !default_case with
           | None ->
@@ -465,9 +452,7 @@ let build_automaton ~annotations kf =
           if not annotations
           then
             { src = control.src;
-              dest = control.src;
-              break = Some control.dest;
-              continue = Some control.src; }
+              dest = control.src; }
           else
             (* We separate loop head from first statement of the loop, otherwise
                  we can't separate loop_entry from loop_current *)
@@ -476,7 +461,7 @@ let build_automaton ~annotations kf =
             loop_head_point.vertex_info <- LoopHead (!loop_level);
             let labels =
               LabelMap.(add_builtin LoopEntry control.src
-                           (add_builtin LoopCurrent loop_head_point labels))
+                          (add_builtin LoopCurrent loop_head_point labels))
             in
             (* for variant to have one point at the end of the loop *)
             let loop_end_point = add_vertex () in
@@ -493,26 +478,24 @@ let build_automaton ~annotations kf =
             in
             add_edge loop_back loop_head_point kinstr Skip loc;
             { src=loop_start_body;
-              break=Some control.dest;
-              dest=loop_end_point;
-              continue=Some loop_end_point; }
+              dest=loop_end_point; }
         in
         do_block loop_control kinstr labels block;
         decr loop_level;
         control.dest
 
-    | Block block ->
-      do_block control kinstr labels block;
-      control.dest
+      | Block block ->
+        do_block control kinstr labels block;
+        control.dest
 
-    | UnspecifiedSequence us ->
-      let block = Cil.block_from_unspecified_sequence us in
-      do_block control kinstr labels block;
-      control.dest
+      | UnspecifiedSequence us ->
+        let block = Cil.block_from_unspecified_sequence us in
+        do_block control kinstr labels block;
+        control.dest
 
-    | Throw _ | TryCatch _ | TryFinally _ | TryExcept _
-        -> Kernel.not_yet_implemented
-                  "[interpreted_automata] exception handling"
+      | Throw _ | TryCatch _ | TryFinally _ | TryExcept _
+        -> Kernel.not_yet_implemented ~source
+             "[interpreted_automata] exception handling"
     in
     (* Update statement table *)
     assert (control.src.vertex_start_of = None);
@@ -529,8 +512,6 @@ let build_automaton ~annotations kf =
   let control = {
     src = start_code;
     dest = end_code;
-    break = None;
-    continue = None;
   }
   in
 
@@ -543,7 +524,7 @@ let build_automaton ~annotations kf =
   List.iter
     begin fun (src,src_stmt,dest_stmt) ->
       let dest,_ = StmtTable.find table dest_stmt in
-      add_jump src dest src_stmt
+      build_stmt_transition src dest src_stmt dest_stmt Skip
     end !gotos;
 
   (* For annotation transitions, bind statement labels to their corresponding
@@ -559,9 +540,9 @@ let build_automaton ~annotations kf =
       let bind label map =
         try
           let vertex = match label with
-          | FormalLabel _ -> raise Not_found
-          | BuiltinLabel _ -> LabelMap.find label annot.labels
-          | StmtLabel stmt -> snd (StmtTable.find table !stmt)
+            | FormalLabel _ -> raise Not_found
+            | BuiltinLabel _ -> LabelMap.find label annot.labels
+            | StmtLabel stmt -> snd (StmtTable.find table !stmt)
           in
           LabelMap.add label vertex map
         with Not_found -> map
@@ -585,32 +566,32 @@ let build_automaton ~annotations kf =
 (* ---------------------------------------------------------------------- *)
 
 module Automaton = Datatype.Make
-  (struct
-    include Datatype.Serializable_undefined
-    type t = automaton
-    let reprs = [{
-      graph=G.create ();
-      entry_point=dummy_vertex;
-      return_point=dummy_vertex;
-      stmt_table=StmtTable.create 0;
-    }]
-    let name = "Interpreted_automata.Automaton"
-    let copy automaton =
-      {
-        automaton with
-        graph = G.copy automaton.graph;
-        stmt_table = StmtTable.copy automaton.stmt_table;
-      }
-    let pretty : t Pretty_utils.formatter = fun fmt g ->
-      Pretty_utils.pp_iter G.iter_vertex ~pre:"@[" ~suf:"@]" ~sep:";@ "
-        (fun fmt v ->
-           Format.fprintf fmt "@[<2>@[%a ->@]@ %a@]"
-             Vertex.pretty v
-             (Pretty_utils.pp_iter (fun f -> G.iter_succ f g.graph) ~sep:",@ " Vertex.pretty)
-             v
-        )
-        fmt g.graph
-   end)
+    (struct
+      include Datatype.Serializable_undefined
+      type t = automaton
+      let reprs = [{
+          graph=G.create ();
+          entry_point=dummy_vertex;
+          return_point=dummy_vertex;
+          stmt_table=StmtTable.create 0;
+        }]
+      let name = "Interpreted_automata.Automaton"
+      let copy automaton =
+        {
+          automaton with
+          graph = G.copy automaton.graph;
+          stmt_table = StmtTable.copy automaton.stmt_table;
+        }
+      let pretty : t Pretty_utils.formatter = fun fmt g ->
+        Pretty_utils.pp_iter G.iter_vertex ~pre:"@[" ~suf:"@]" ~sep:";@ "
+          (fun fmt v ->
+             Format.fprintf fmt "@[<2>@[%a ->@]@ %a@]"
+               Vertex.pretty v
+               (Pretty_utils.pp_iter (fun f -> G.iter_succ f g.graph) ~sep:",@ " Vertex.pretty)
+               v
+          )
+          fmt g.graph
+    end)
 
 (* ---------------------------------------------------------------------- *)
 (* --- Weak Topological Order                                         --- *)
@@ -629,14 +610,14 @@ let build_wto ~pref {graph; entry_point} =
 module WTO = struct
   include Scheduler
   include Datatype.Make
-    (struct
-      include Datatype.Serializable_undefined
-      type t = wto
-      let reprs = [List.map (fun s -> Wto.Node s) Vertex.reprs]
-      let pretty = Scheduler.pretty_partition
-      let name = "Interpreted_automata.WTO"
-      let copy w = w
-     end)
+      (struct
+        include Datatype.Serializable_undefined
+        type t = wto
+        let reprs = [List.map (fun s -> Wto.Node s) Vertex.reprs]
+        let pretty = Scheduler.pretty_partition
+        let name = "Interpreted_automata.WTO"
+        let copy w = w
+      end)
 end
 
 (* ---------------------------------------------------------------------- *)
@@ -645,10 +626,10 @@ end
 
 let exit_strategy graph component =
   let head, l = match component with
-  | Wto.Component (v, w) -> v, Wto.Node (v) :: w
-  | Wto.Node (v) -> v, [component]
+    | Wto.Component (v, w) -> v, Wto.Node (v) :: w
+    | Wto.Node (v) -> v, [component]
   in
-  (* Build a table of vertices that should not be passed through to get 
+  (* Build a table of vertices that should not be passed through to get
      a path to an exit. At the begining it only contains the component head. *)
   let table = Hashtbl.create (G.nb_vertex graph) in
   Hashtbl.add table head ();
@@ -656,19 +637,19 @@ let exit_strategy graph component =
   let rec f acc = function
     | [] -> acc
     | Wto.Node v :: l ->
-        if List.for_all (Hashtbl.mem table) (G.succ graph v) then
-          (Hashtbl.add table v (); f acc l)
-        else
-          f (Wto.Node v :: acc) l
+      if List.for_all (Hashtbl.mem table) (G.succ graph v) then
+        (Hashtbl.add table v (); f acc l)
+      else
+        f (Wto.Node v :: acc) l
     | Wto.Component (v, w) :: l ->
-        let vertices = v :: Wto.flatten w in (* All vertices of the sub wto *)
-        List.iter (fun v -> Hashtbl.add table v ()) vertices; (* Temporarilly add them *)
-        let succs = List.flatten (List.map (G.succ graph) vertices) in
-        if List.for_all (Hashtbl.mem table) succs then
-          f acc l
-        else (
-          List.iter (Hashtbl.remove table) vertices; (* Undo *)
-          f (Wto.Component (v, w) :: acc) l)
+      let vertices = v :: Wto.flatten w in (* All vertices of the sub wto *)
+      List.iter (fun v -> Hashtbl.add table v ()) vertices; (* Temporarilly add them *)
+      let succs = List.flatten (List.map (G.succ graph) vertices) in
+      if List.for_all (Hashtbl.mem table) succs then
+        f acc l
+      else (
+        List.iter (Hashtbl.remove table) vertices; (* Undo *)
+        f (Wto.Component (v, w) :: acc) l)
   in
   f [] (List.rev l)
 
@@ -689,17 +670,17 @@ let pretty_transition fmt t =
     Pretty_utils.pp_list ~sep:", " Printer.pp_varinfo fmt l
   in
   begin match t with
-  | Skip -> ()
-  | Return (None,_) -> fprintf fmt "return"
-  | Return (Some exp,_) -> fprintf fmt "return %a" Printer.pp_exp exp
-  | Guard (exp,Then,_) -> Printer.pp_exp fmt exp
-  | Guard (exp,Else,_) -> fprintf fmt "!(%a)" Printer.pp_exp exp
-  | Prop (a,_) ->
-    fprintf fmt "%a: %a"
-      pretty_kind a.kind Printer.pp_identified_predicate a.predicate
-  | Instr (instr,_) -> Printer.pp_instr fmt instr
-  | Enter (b) -> fprintf fmt "Enter %a" print_var_list b.blocals
-  | Leave (b)  -> fprintf fmt "Exit %a" print_var_list b.blocals
+    | Skip -> ()
+    | Return (None,_) -> fprintf fmt "return"
+    | Return (Some exp,_) -> fprintf fmt "return %a" Printer.pp_exp exp
+    | Guard (exp,Then,_) -> Printer.pp_exp fmt exp
+    | Guard (exp,Else,_) -> fprintf fmt "!(%a)" Printer.pp_exp exp
+    | Prop (a,_) ->
+      fprintf fmt "%a: %a"
+        pretty_kind a.kind Printer.pp_identified_predicate a.predicate
+    | Instr (instr,_) -> Printer.pp_instr fmt instr
+    | Enter (b) -> fprintf fmt "Enter %a" print_var_list b.blocals
+    | Leave (b)  -> fprintf fmt "Exit %a" print_var_list b.blocals
   end
 
 let pretty_edge fmt t = pretty_transition fmt t.edge_transition
@@ -741,7 +722,7 @@ module MakeDot
         | `Vertex -> htmllabel "%a" V.pretty v
       in
       let vertex_attributes =
-        if head && Extlib.has_some subgraph
+        if head && Option.is_some subgraph
         then [`Shape `Invtriangle ; label]
         else [label]
       in
@@ -753,7 +734,7 @@ module MakeDot
         incr component_count;
         let subgraph = Some {
             sg_name = string_of_int !component_count;
-            sg_parent = Extlib.opt_map (fun s -> s.sg_name) subgraph;
+            sg_parent = Option.map (fun s -> s.sg_name) subgraph;
             sg_attributes = []} in
         donode subgraph true v;
         traverse_component subgraph w
@@ -775,21 +756,23 @@ module MakeDot
           try let (x,_,_,_) = Table.find subgraphs v in x
           with Not_found ->
             let l = if wto = None then [] else [`Style `Dashed] in
-            (htmllabel "%a" V.pretty v)::l
+            let pretty fmt v =
+              V.pretty fmt v ;
+              match V.start_of v with
+              | None -> ()
+              | Some s -> Format.fprintf fmt "@s%d" s.sid
+            in (htmllabel "%a" pretty v)::l
         let get_subgraph v =
           try let (_,x,_,_) = Table.find subgraphs v in x
           with Not_found -> None
         let default_edge_attributes _g = []
         let edge_attributes (v1,e,v2) =
+          htmllabel "%a" pretty_edge e ::
           if Table.mem subgraphs v1 && Table.mem subgraphs v2 then
             let (_,_,c1,_) = Table.find subgraphs v1 in
             let (_,_,c2,head2) = Table.find subgraphs v2 in
-            let l = if head2 && c2 <= c1 then [`Constraint false] else [] in
-            (htmllabel "%a" pretty_edge e)::l
-          else if wto = None then
-            [`Style `Dashed]
-          else
-            []
+            if head2 && c2 <= c1 then [`Constraint false] else []
+          else if wto = None then [] else [`Style `Dashed]
         include G
       end)
     in
@@ -818,7 +801,7 @@ module WTOIndex =
       let pretty i =
         Pretty_utils.pp_list ~sep:"," Vertex.pretty i
       let copy i = i
-     end)
+    end)
 
 module Compute = struct
 
@@ -889,21 +872,21 @@ end
 
 
 module AutomatonState = Kernel_function.Make_Table (Automaton)
-  (struct
-    let size = 97
-    let name = "Interpreted_automata.AutomatonState"
-    let dependencies = [Ast.self]
-   end)
+    (struct
+      let size = 97
+      let name = "Interpreted_automata.AutomatonState"
+      let dependencies = [Ast.self]
+    end)
 
 let get_automaton = AutomatonState.memo (build_automaton ~annotations:false)
 
 
 module WTOState = Kernel_function.Make_Table (WTO)
-  (struct
-    let size = 97
-    let name = "Interpreted_automata.WTOState"
-    let dependencies = [Ast.self]
-   end)
+    (struct
+      let size = 97
+      let name = "Interpreted_automata.WTOState"
+      let dependencies = [Ast.self]
+    end)
 
 let get_wto =
   let build kf =
@@ -927,7 +910,7 @@ module WTOIndexState =
       let size = 97
       let name = "Interpreted_automata.WTOIndexState"
       let dependencies = [Ast.self]
-     end)
+    end)
 
 let build_wto_index_table kf = Compute.build_wto_index_table (get_wto kf)
 
@@ -1178,4 +1161,3 @@ struct
     iterate_list wto;
     results
 end
-
diff --git a/src/kernel_services/analysis/interpreted_automata.mli b/src/kernel_services/analysis/interpreted_automata.mli
index fab9cacaaadd29c69c56a881f0c0f9129f6f090e..c04c8b027b571f3c97f98622caa47f3341307195 100644
--- a/src/kernel_services/analysis/interpreted_automata.mli
+++ b/src/kernel_services/analysis/interpreted_automata.mli
@@ -97,9 +97,9 @@ val pretty_edge: vertex edge Pretty_utils.formatter
 
 module G : Graph.Sig.I
   with type V.t = vertex
-  and  type E.t = vertex * vertex edge * vertex
-  and  type V.label = vertex
-  and  type E.label = vertex edge
+   and  type E.t = vertex * vertex edge * vertex
+   and  type V.label = vertex
+   and  type E.label = vertex edge
 
 type graph = G.t
 
@@ -145,7 +145,7 @@ val exit_strategy : graph -> vertex Wto.component -> wto
 val output_to_dot : out_channel -> ?number:[`Stmt|`Vertex] -> ?wto:wto -> automaton -> unit
 
 
-(** the position of a statement in a wto given as the list of 
+(** the position of a statement in a wto given as the list of
     component heads *)
 type wto_index = vertex list
 
@@ -277,4 +277,3 @@ module Dataflow (D : Domain) :
 sig
   val fixpoint : Cil_types.kernel_function -> D.t -> D.t Vertex.Hashtbl.t
 end
-
diff --git a/src/kernel_services/analysis/logic_interp.ml b/src/kernel_services/analysis/logic_interp.ml
index 5235e6aec142f3c85c6363fc58002714829453ec..06a027ae6107987adb4143b0eb3879b2c455fbde 100644
--- a/src/kernel_services/analysis/logic_interp.ml
+++ b/src/kernel_services/analysis/logic_interp.ml
@@ -154,9 +154,9 @@ let code_annot kf stmt s =
   end) in
   let loc = Stmt.loc stmt in
   let pa =
-    Extlib.opt_bind
-      (function (_, Logic_ptree.Acode_annot (_,a)) -> Some a | _ -> None)
+    Option.bind
       (Logic_lexer.annot (fst loc,s))
+      (function (_, Logic_ptree.Acode_annot (_,a)) -> Some a | _ -> None)
   in
   let parse pa =
     LT.code_annot
@@ -175,7 +175,7 @@ let term kf ?(loc=Location.unknown) ?(env=default_term_env ()) s =
     let kf = kf
     let kinstr = Kglobal
   end) in
-  let pa_expr = Extlib.opt_map snd (Logic_lexer.lexpr (fst loc, s)) in
+  let pa_expr = Option.map snd (Logic_lexer.lexpr (fst loc, s)) in
   let parse pa_expr = LT.term env pa_expr in
   wrap parse pa_expr loc
 
@@ -190,7 +190,7 @@ let predicate kf ?(loc=Location.unknown) ?(env=default_term_env ()) s =
     let kf = kf
     let kinstr = Kglobal
   end) in
-  let pa_expr = Extlib.opt_map snd (Logic_lexer.lexpr (fst loc, s)) in
+  let pa_expr = Option.map snd (Logic_lexer.lexpr (fst loc, s)) in
   let parse pa_expr = LT.predicate env pa_expr in
   wrap parse pa_expr loc
 
@@ -642,7 +642,7 @@ struct
 	     None)  
         in
         let get_ctrl_point dft =
-          let before = Extlib.opt_conv dft before_opt in
+          let before = Option.value ~default:dft before_opt in
           match ki_opt with
           | None -> (* function contract *)
 
@@ -954,13 +954,13 @@ to function contracts."
         (* 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.tp_statement;
+        get_zone_from_pred (Option.get 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.tp_statement;
       | AVariant (term,_) ->
         (* to preserve the interpretation of the variant *)
-        get_zone_from_term (Extlib.the loop_body_opt) term;
+        get_zone_from_term (Option.get loop_body_opt) term;
       | APragma (Loop_pragma (Unroll_specs terms))
       | APragma (Loop_pragma (Widen_hints terms))
       | APragma (Loop_pragma (Widen_variables terms)) ->
@@ -973,14 +973,14 @@ to function contracts."
       | AAllocation (_,FreeAllocAny) -> ();
       | AAllocation (_,FreeAlloc(f,a)) -> 
         let get_zone x =
-          get_zone_from_term (Extlib.the loop_body_opt) x.it_content
+          get_zone_from_term (Option.get loop_body_opt) x.it_content
         in
           List.iter get_zone f ;
           List.iter get_zone a 
       | AAssigns (_, WritesAny) -> ()
       | AAssigns (_, Writes l) -> (* loop assigns *)
         let get_zone x =
-          get_zone_from_term (Extlib.the loop_body_opt) x.it_content
+          get_zone_from_term (Option.get loop_body_opt) x.it_content
         in
         List.iter
           (fun (zone,deps) ->
@@ -994,7 +994,7 @@ to function contracts."
       | AExtended _ -> raise (NYI "[logic_interp] extension")
     (** Used by annotations entry points. *)
     let get_from_stmt_annots code_annot_filter ((ki, _kf) as stmt) =
-      Extlib.may
+      Option.iter
         (fun caf ->
            let loop_body_opt = match ki.skind with
              | Loop(_, { bstmts = body :: _ }, _, _, _) -> Some body
diff --git a/src/kernel_services/analysis/loop.ml b/src/kernel_services/analysis/loop.ml
index 3a8e04081f1e843edfff5c336ce93c001b3e1a67..491d5cd0aea81b52b9e55f3ab3080de1043fc36a 100644
--- a/src/kernel_services/analysis/loop.ml
+++ b/src/kernel_services/analysis/loop.ml
@@ -109,7 +109,7 @@ let get_non_naturals kf =
     if Stmt.Hashtbl.mem visited s then begin
       (* pred always contains something except when entering the recursion,
          when visited is empty. *)
-      let pred = Extlib.the pred in
+      let pred = Option.get pred in
       if Stmt.Hashtbl.mem current s &&  not (is_back_edge kf pred s) then begin
         res := Stmt.Set.add s !res;
         Kernel.warning ~once:true ~source:(fst (Cil_datatype.Stmt.loc s))
diff --git a/src/kernel_services/analysis/stmts_graph.ml b/src/kernel_services/analysis/stmts_graph.ml
index 3271d4b6ef1c2018d129be949e486aa8a4f41416..8dfd0f0f66e698b55c3375cf46f1243f091c874d 100644
--- a/src/kernel_services/analysis/stmts_graph.ml
+++ b/src/kernel_services/analysis/stmts_graph.ml
@@ -267,6 +267,7 @@ let rec get_block_stmts blk =
   List.fold_left add Stmt.Set.empty blk.bstmts
 
 and get_stmt_stmts s =
+  let () = CurrentLoc.set (Cil_datatype.Stmt.loc s) in
   let compute_stmt_stmts s = match s.skind with
     | Instr _ | Return _ | Throw _ -> Stmt.Set.singleton s
     | Continue _ | Break _ | Goto _ -> Stmt.Set.singleton s
@@ -284,7 +285,7 @@ and get_stmt_stmts s =
         (fun acc (_,b) -> Stmt.Set.union acc (get_block_stmts b))
         (get_block_stmts t) c
     | TryExcept (_, _, _, _) | TryFinally (_, _, _) ->
-        Kernel.not_yet_implemented "exception handling"
+        Kernel.not_yet_implemented ~current:true "exception handling"
   in
   StmtStmts.memo compute_stmt_stmts s
 
diff --git a/src/kernel_services/ast_data/alarms.ml b/src/kernel_services/ast_data/alarms.ml
index 0785ae1209cce4dd3abdff0d0c71b3f6185c396f..eefbda4d0b28f0b9c96d180dd9057dad295006d4 100644
--- a/src/kernel_services/ast_data/alarms.ml
+++ b/src/kernel_services/ast_data/alarms.ml
@@ -138,13 +138,13 @@ module D =
           if n = 0 then Lval.compare lv1 lv2 else n
         | Index_out_of_bound(e11, e12), Index_out_of_bound(e21, e22) ->
           let n = Exp.compare e11 e21 in
-          if n = 0 then Extlib.opt_compare Exp.compare e12 e22 else n
+          if n = 0 then Option.compare Exp.compare e12 e22 else n
         | Invalid_pointer e1, Invalid_pointer e2 -> Exp.compare e1 e2
         | Invalid_shift(e1, n1), Invalid_shift(e2, n2) ->
           let n = Exp.compare e1 e2 in
-          if n = 0 then Extlib.opt_compare Datatype.Int.compare n1 n2 else n
+          if n = 0 then Option.compare Datatype.Int.compare n1 n2 else n
         | Pointer_comparison(e11, e12), Pointer_comparison(e21, e22) ->
-          let n = Extlib.opt_compare Exp.compare e11 e21 in
+          let n = Option.compare Exp.compare e11 e21 in
           if n = 0 then Exp.compare e12 e22 else n
         | Overflow(s1, e1, n1, b1), Overflow(s2, e2, n2, b2) ->
           let n = Stdlib.compare s1 s2 in
@@ -188,7 +188,7 @@ module D =
         | Function_pointer (e1, l1), Function_pointer (e2, l2) ->
           let n = Exp.compare e1 e2 in
           if n <> 0 then n
-          else Extlib.opt_compare (Extlib.list_compare Exp.compare) l1 l2
+          else Option.compare (Extlib.list_compare Exp.compare) l1 l2
         | Invalid_bool lv1, Invalid_bool lv2 -> Lval.compare lv1 lv2
         | _, (Division_by_zero _ | Memory_access _ |
               Index_out_of_bound _ | Invalid_pointer _ |
diff --git a/src/kernel_services/ast_data/annotations.ml b/src/kernel_services/ast_data/annotations.ml
index dd260448133df9396c39b2a93c1e98ba53f08be9..38729e6fbee348c12af24dddce1b547ad16e66e3 100644
--- a/src/kernel_services/ast_data/annotations.ml
+++ b/src/kernel_services/ast_data/annotations.ml
@@ -408,7 +408,7 @@ let code_annot ?emitter ?filter stmt =
         | Some f -> List.filter f l)
      with Not_found -> [])
   | None ->
-    let filter = Extlib.opt_map (fun filter _ e -> filter e) filter in
+    let filter = Option.map (fun filter _ e -> filter e) filter in
     fst (List.split (code_annot_emitter ?filter stmt))
 
 let pre_register_funspec ?tbl ?(emitter=Emitter.end_user) ?(force=false) kf =
@@ -625,8 +625,8 @@ let iter_complete f =
 let iter_disjoint f =
   iter_spec_gen (fun s -> s.spec_disjoint_behaviors) List.iter f
 
-let iter_terminates f = iter_spec_gen (fun s -> s.spec_terminates) Extlib.may f
-let iter_decreases f = iter_spec_gen (fun s -> s.spec_variant) Extlib.may f
+let iter_terminates f = iter_spec_gen (fun s -> s.spec_terminates) Option.iter f
+let iter_decreases f = iter_spec_gen (fun s -> s.spec_variant) Option.iter f
 
 let iter_bhv_gen get iter f kf b =
   let get spec =
@@ -635,11 +635,35 @@ let iter_bhv_gen get iter f kf b =
   in
   iter_spec_gen get iter f kf
 
+(* Filter out generic specification. If nothing is
+ * found, call f on generic spec once *)
+let iter_filter_generic to_filter iterator f kf b =
+  let something = ref false in
+  let filter_generic e a =
+    if a <> to_filter then begin something := true; f e a end
+  in iterator filter_generic kf b;
+  if not !something then f Emitter.dummy to_filter
+
+(* Fold version *)
+let fold_filter_generic to_filter iterator f kf b init =
+  let something = ref false in
+  let filter_generic e a acc =
+    if a <> to_filter then (something := true; f e a acc) else acc
+  in let res = iterator filter_generic kf b init in
+  if not !something then f Emitter.dummy to_filter res else res
+
 let iter_requires f = iter_bhv_gen (fun b -> b.b_requires) List.iter f
 let iter_assumes f = iter_bhv_gen (fun b -> b.b_assumes) List.iter f
 let iter_ensures f = iter_bhv_gen (fun b -> b.b_post_cond) List.iter f
-let iter_assigns f = iter_bhv_gen (fun b -> b.b_assigns) (fun f a -> f a) f
-let iter_allocates f = iter_bhv_gen (fun b -> b.b_allocation) (fun f a -> f a) f
+
+let iter_assigns f =
+  iter_filter_generic WritesAny
+    (iter_bhv_gen (fun b -> b.b_assigns) (fun f a -> f a)) f
+
+let iter_allocates f =
+  iter_filter_generic FreeAllocAny
+    (iter_bhv_gen (fun b -> b.b_allocation) (fun f a -> f a)) f
+
 let iter_extended f = iter_bhv_gen (fun b -> b.b_extended) List.iter f
 
 let fold_spec_gen get fold f kf acc =
@@ -703,10 +727,12 @@ let fold_ensures f =
     (fun f l acc -> List.fold_left (Extlib.swap f) acc l) f
 
 let fold_assigns f =
-  fold_bhv_gen (fun b -> b.b_assigns) (fun f a acc -> f a acc) f
+  fold_filter_generic WritesAny
+    (fold_bhv_gen (fun b -> b.b_assigns) (fun f a -> f a)) f
 
 let fold_allocates f =
-  fold_bhv_gen (fun b -> b.b_allocation) (fun f a acc -> f a acc) f
+  fold_filter_generic FreeAllocAny
+    (fold_bhv_gen (fun b -> b.b_allocation) (fun f a -> f a)) f
 
 let fold_extended f =
   fold_bhv_gen (fun b -> b.b_extended)
@@ -883,15 +909,15 @@ let add_behaviors ?(register_children=true) e kf ?stmt ?active bhvs =
            let ip = Property.ip_from_of_behavior kf ki active bhv in
            List.iter Property_status.remove ip;
            let ip = Property.ip_assigns_of_behavior kf ki active bhv in
-           Extlib.may Property_status.remove ip;
+           Option.iter Property_status.remove ip;
            let ip = Property.ip_allocation_of_behavior kf ki active bhv in
-           Extlib.may Property_status.remove ip;
+           Option.iter Property_status.remove ip;
            let ip = Property.ip_from_of_behavior kf ki active b' in
            List.iter Property_status.register ip;
            let ip = Property.ip_assigns_of_behavior kf ki active b' in
-           Extlib.may Property_status.register ip;
+           Option.iter Property_status.register ip;
            let ip = Property.ip_allocation_of_behavior kf ki active b' in
-           Extlib.may Property_status.register ip;
+           Option.iter Property_status.register ip;
          end;
          let ip = Property.ip_of_behavior kf ki active b' in
          Property_status.register ip;
@@ -1077,10 +1103,10 @@ let add_assigns ~keep_empty e kf ?stmt ?active ?behavior a =
           Thus must remove the previous property before adding the new one *)
        List.iter Property_status.remove
          (Property.ip_from_of_behavior kf ki active full_bhv);
-       Extlib.may Property_status.remove
+       Option.iter Property_status.remove
          (Property.ip_assigns_of_behavior kf ki active full_bhv);
        full_bhv.b_assigns <- merge_assigns keep_empty full_bhv.b_assigns a;
-       Extlib.may Property_status.register
+       Option.iter Property_status.register
          (Property.ip_assigns_of_behavior kf ki active full_bhv);
        List.iter Property_status.register
          (Property.ip_from_of_behavior kf ki active full_bhv);
@@ -1103,11 +1129,11 @@ let add_allocates ~keep_empty e kf ?stmt ?active ?behavior a =
     e_bhv.b_allocation <-
       merge_allocation ~keep_empty e_bhv.b_allocation a;
     let active = match active with None -> [] | Some l -> l in
-    Extlib.may Property_status.remove
+    Option.iter Property_status.remove
       (Property.ip_allocation_of_behavior kf ki active full_bhv);
     full_bhv.b_allocation <-
       merge_allocation ~keep_empty full_bhv.b_allocation a;
-    Extlib.may Property_status.register
+    Option.iter Property_status.register
       (Property.ip_allocation_of_behavior kf ki active full_bhv);
   in
   let old_spec = get_full_spec kf ?stmt ?behavior:active () in
@@ -1180,7 +1206,7 @@ let add_code_annot ?(keep_empty=true) emitter ?kf stmt ca =
        if spec.spec_variant <> None then
          Kernel.fatal
            "statement contract cannot have a decrease clause";
-       Extlib.may
+       Option.iter
          (add_terminates emitter kf ~stmt ~active) spec.spec_terminates;
        List.iter
          (add_complete emitter kf ~stmt ~active)
@@ -1559,7 +1585,7 @@ let remove_allocates e kf p =
          if b.b_allocation == p then begin
            b.b_allocation <- FreeAllocAny;
            let info = Id_contract (Datatype.String.Set.empty,b) in
-           Extlib.may Property_status.remove
+           Option.iter Property_status.remove
              (Property.ip_of_allocation kf Kglobal info p)
          end)
       spec.spec_behavior
@@ -1585,14 +1611,14 @@ let remove_assigns e kf p =
          if b.b_assigns == p then begin
            b.b_assigns <- WritesAny;
            let info = Id_contract(Datatype.String.Set.empty, b) in
-           Extlib.may Property_status.remove
+           Option.iter Property_status.remove
              (Property.ip_of_assigns kf Kglobal info p);
            (match p with
             | WritesAny -> ()
             | Writes l ->
               List.iter
                 (fun f ->
-                   Extlib.may
+                   Option.iter
                      Property_status.remove
                      (Property.ip_of_from kf Kglobal info f)) l)
          end)
diff --git a/src/kernel_services/ast_data/annotations.mli b/src/kernel_services/ast_data/annotations.mli
index 60cae71fd149e6c52cdb5015d2509e6194a17bb5..1e49ae756b5729db03bcf120966a9e69e151ac27 100644
--- a/src/kernel_services/ast_data/annotations.mli
+++ b/src/kernel_services/ast_data/annotations.mli
@@ -69,7 +69,7 @@ val funspec:
 
 val has_funspec: kernel_function -> bool
 (** @return [true] iff the function has a non-empty specification.
-    @since Frama-C+dev *)
+    @since 22.0-Titanium *)
 
 val behaviors:
   ?emitter:Emitter.t -> ?populate:bool -> kernel_function -> funbehavior list
@@ -284,7 +284,7 @@ val add_code_annot:
     There can be at most one loop variant registered per statement.
     Attempting to register a second one will result in a fatal error.
 
-    @modify Frama-C+dev: add keep_empty argument
+    @modify 22.0-Titanium: add keep_empty argument
  *)
 
 val add_assert:
@@ -411,7 +411,7 @@ val add_allocates:
   keep_empty:bool -> allocation behavior_component_addition
 (** Add new allocates into the given behavior.
     See {!Annotations.add_assigns} for the signification of [keep_empty]
-    @modify Frama-C+dev add keep_empty argument
+    @modify 22.0-Titanium add keep_empty argument
  *)
 
 val add_extended: acsl_extension behavior_component_addition
diff --git a/src/kernel_services/ast_data/ast.ml b/src/kernel_services/ast_data/ast.ml
index 37093f443f8b83a7f7efac2458c680fa828906c2..9f3f4f1965fccaf3c2ad9b94a92ab0a49fda1cc0 100644
--- a/src/kernel_services/ast_data/ast.ml
+++ b/src/kernel_services/ast_data/ast.ml
@@ -89,7 +89,7 @@ let () =
   add_monotonic_state Cil_datatype.Varinfo.Hptset.self;
   State_dependency_graph.add_dependencies ~from:self
     [Cabshelper.Comments.self;Cil.selfFormalsDecl;
-     Cil.Frama_c_builtins.self;Cil.switch_case_state_self];
+     Cil_builtins.Frama_c_builtins.self;Cil.switch_case_state_self];
   Logic_env.init_dependencies self;
 
 exception Bad_Initialization of string
diff --git a/src/kernel_services/ast_data/cil_types.ml b/src/kernel_services/ast_data/cil_types.ml
index 48697d89dc5e74e9dd3ad936c88e7d7fec533d60..f05d4b75c334e5fcdab357a2b4f7f66497d10a95 100644
--- a/src/kernel_services/ast_data/cil_types.ml
+++ b/src/kernel_services/ast_data/cil_types.ml
@@ -347,7 +347,10 @@ and attrparam =
 (** The definition of a structure or union type. Use {!Cil.mkCompInfo} to make
     one and use {!Cil.copyCompInfo} to copy one (this ensures that a new key is
     assigned and that the fields have the right pointers to parents.).
-    @plugin development guide *)
+    @plugin development guide
+
+    @since Frama-C+dev [cfields] is an option, [None] is used for incomplete
+    types (in replacement of removed field [cdefined]) *)
 and compinfo = {
   mutable cstruct: bool;
   (** [true] if struct, [false] if union *)
@@ -365,21 +368,18 @@ and compinfo = {
       files might have different keys. Use {!Cil_const.copyCompInfo} to copy
       structures so that a new key is assigned. *)
 
-  mutable cfields: fieldinfo list;
+  mutable cfields: fieldinfo list option;
   (** Information about the fields. Notice that each fieldinfo has a pointer
       back to the host compinfo. This means that you should not share
-      fieldinfo's between two compinfo's *)
+      fieldinfo's between two compinfo's.
+
+      None value means that the type is incomplete. *)
 
   mutable cattr:   attributes;
   (** The attributes that are defined at the same time as the composite
       type. These attributes can be supplemented individually at each
       reference to this [compinfo] using the [TComp] type constructor. *)
 
-  mutable cdefined: bool;
-  (** This boolean flag can be used to distinguish between structures
-      that have not been defined and those that have been defined but have
-      no fields (such things are allowed in gcc). *)
-
   mutable creferenced: bool;
   (** [true] if used. Initially set to [false]. *)
 }
@@ -400,6 +400,9 @@ and fieldinfo = {
   (** The host structure that contains this field. There can be only one
       [compinfo] that contains the field. *)
 
+  mutable forder: int;
+  (** The position in the host structure. *)
+
   forig_name: string;
   (** original name as found in C file. *)
 
@@ -433,13 +436,14 @@ and fieldinfo = {
       expression. *)
 
   mutable fsize_in_bits: int option;
-  (** (Deprecated. Use {!Cil.bitsOffset} instead.) Similar to [fbitfield] for
-      all types of fields.
-      @deprecated only Jessie uses this *)
+  (** Similar to [fbitfield] for all types of fields.
+      Do not read this field directly. Use {!Cil.fieldBitsOffset} or
+      {!Cil.bitsOffset} instead. *)
 
   mutable foffset_in_bits: int option;
-  (** Offset at which the field starts in the structure. Do not read directly,
-      but use {!Cil.bitsOffset} instead. *)
+  (** Offset at which the field starts in the structure.
+      Do not read this field directly. Use {!Cil.fieldBitsOffset} or
+      {!Cil.bitsOffset} instead. *)
 
   mutable fpadding_in_bits: int option;
   (** (Deprecated.) Store the size of the padding that follows the field, if any.
@@ -1693,6 +1697,7 @@ and acsl_extension_kind =
   | Ext_terms of term list
   | Ext_preds of predicate list
   (** a list of predicates, the most common case of for extensions *)
+  | Ext_annot of string * acsl_extension list
 
 (** Where are we expected to find corresponding extension keyword.
     @plugin development guide
diff --git a/src/kernel_services/ast_data/globals.ml b/src/kernel_services/ast_data/globals.ml
index cae5f59e1f52990ea1df0ee8aa9ecab4caddfe69..a88e444703a4b42a6e31ee16441763906e6bc61a 100644
--- a/src/kernel_services/ast_data/globals.ml
+++ b/src/kernel_services/ast_data/globals.ml
@@ -307,7 +307,7 @@ module Functions = struct
       *)
       (*Kernel.feedback "adding empty fun for %a"
         Cil_datatype.Varinfo.pretty vi; *)
-      if Cil.is_special_builtin v.vname then
+      if Cil_builtins.is_special_builtin v.vname then
         add_declaration (empty_funspec ()) v v.vdecl
       else
         raise Not_found
diff --git a/src/kernel_services/ast_data/globals.mli b/src/kernel_services/ast_data/globals.mli
index 9e5293c20ff883cae5aebbac55abd97051e1e499..b3f359ffbc8507182062c6876f840e6835056682 100644
--- a/src/kernel_services/ast_data/globals.mli
+++ b/src/kernel_services/ast_data/globals.mli
@@ -107,15 +107,15 @@ module Functions: sig
 
   val mem_name: string -> bool
   (** @return [true] iff there is a function with such a name
-      @since Frama-C+dev *)
+      @since 22.0-Titanium *)
 
   val mem_def_name: string -> bool
   (** @return [true] iff there is a function definition with such a name
-      @since Frama-C+dev *)
+      @since 22.0-Titanium *)
 
   val mem_decl_name: string -> bool
   (** @return [true] iff there is a function declaration with such a name
-      @since Frama-C+dev *)
+      @since 22.0-Titanium *)
 
   (** {2 Searching} *)
 
@@ -236,7 +236,7 @@ module Types : sig
   val mem_enum_tag: string -> bool
   (** @return [true] iff there is an enum constant with the given name in the
       AST.
-      @since Frama-C+dev *)
+      @since 22.0-Titanium *)
 
   val find_enum_tag: string -> exp * typ
   (** Find an enum constant from its name in the AST.
@@ -245,7 +245,7 @@ module Types : sig
   val mem_type: Logic_typing.type_namespace -> string -> bool
   (** @return [true] iff there is a type with the given name in the given
       namespace in the AST.
-      @since Frama-C+dev *)
+      @since 22.0-Titanium *)
 
   val find_type: Logic_typing.type_namespace -> string -> typ
   (** Find a type from its name in the AST.
diff --git a/src/kernel_services/ast_data/kernel_function.ml b/src/kernel_services/ast_data/kernel_function.ml
index e428ec472cf0d420869f8a080b9d7e5dfa3a87e1..df3e3d243bb20f4081244e9627fc3e740cb8ce9f 100644
--- a/src/kernel_services/ast_data/kernel_function.ml
+++ b/src/kernel_services/ast_data/kernel_function.ml
@@ -490,7 +490,7 @@ class callsite_visitor hmap = object (self)
     in
     match stmt.skind with
       | Instr(Call(_,fct,_,_)) ->
-        Extlib.may add_call (called_kernel_function fct); Cil.SkipChildren
+        Option.iter add_call (called_kernel_function fct); Cil.SkipChildren
       | Instr (Local_init (_, ConsInit(f,_,_),_)) ->
         add_call (Globals.Functions.get f); Cil.SkipChildren
       | Instr _ -> Cil.SkipChildren
@@ -578,12 +578,11 @@ let is_return_stmt kf stmt =
     false
 
 let is_entry_point kf =
-  let main, _ = Globals.entry_point () in
-  equal kf main
+  try equal kf (fst (Globals.entry_point ()))
+  with Globals.No_such_entry_point _ -> false
 
 let is_main kf =
-  let name = get_name kf in
-  Datatype.String.equal name "main"
+  String.equal (get_name kf) "main"
 
 let returns_void kf =
   let result_type,_,_,_ = Cil.splitFunctionType (get_type kf) in
diff --git a/src/kernel_services/ast_data/property.ml b/src/kernel_services/ast_data/property.ml
index 27ac25d6e97bbb1a21983b92b35df25fb2680c68..20cfa49ccc1af5984386ab78c5f6230577d7e716 100644
--- a/src/kernel_services/ast_data/property.ml
+++ b/src/kernel_services/ast_data/property.ml
@@ -536,7 +536,7 @@ include Datatype.Make_with_collections
             (11, Kf.hash kf, Kinstr.hash s,
              (b.b_name:string), (a:Datatype.String.Set.t))
         | IPReachable {ir_kf=kf; ir_kinstr=ki; ir_program_point=ba} ->
-          Hashtbl.hash(12, Extlib.may_map Kf.hash ~dft:0 kf,
+          Hashtbl.hash(12, Option.fold ~some:Kf.hash ~none:0 kf,
                        Kinstr.hash ki, Hashtbl.hash ba)
         | IPAllocation {ial_kf=f; ial_kinstr=ki; ial_bhv=b} ->
           Hashtbl.hash (13, Kf.hash f, Kinstr.hash ki, hash_bhv_loop b)
@@ -591,7 +591,7 @@ include Datatype.Make_with_collections
           Kf.equal f1 f2 && Kinstr.equal ki1 ki2
         | IPReachable {ir_kf=kf1; ir_kinstr=ki1; ir_program_point=ba1},
           IPReachable {ir_kf=kf2; ir_kinstr=ki2; ir_program_point=ba2} ->
-          Extlib.opt_equal Kf.equal kf1 kf2 && Kinstr.equal ki1 ki2 && ba1 = ba2
+          Option.equal Kf.equal kf1 kf2 && Kinstr.equal ki1 ki2 && ba1 = ba2
         | IPBehavior {ib_kf=f1; ib_kinstr=k1; ib_active=a1; ib_bhv=b1},
           IPBehavior {ib_kf=f2; ib_kinstr=k2; ib_active=a2; ib_bhv=b2} ->
           Kf.equal f1 f2
@@ -665,7 +665,7 @@ include Datatype.Make_with_collections
           if n = 0 then Kinstr.compare ki1 ki2 else n
         | IPReachable {ir_kf=kf1; ir_kinstr=ki1; ir_program_point=ba1},
           IPReachable {ir_kf=kf2; ir_kinstr=ki2; ir_program_point=ba2} ->
-          let n = Extlib.opt_compare Kf.compare kf1 kf2 in
+          let n = Option.compare Kf.compare kf1 kf2 in
           if n = 0 then
             let n = Kinstr.compare ki1 ki2 in
             if n = 0 then Stdlib.compare ba1 ba2 else n
@@ -1404,7 +1404,7 @@ let ip_from_of_behavior kf st ~active b =
       | From _ ->
         let a = Datatype.String.Set.of_list active in
         let ip =
-          Extlib.the (ip_of_from kf st (Id_contract (a,b)) (out, froms))
+          Option.get (ip_of_from kf st (Id_contract (a,b)) (out, froms))
         in
         ip :: acc
     in
@@ -1424,7 +1424,7 @@ let ip_from_of_code_annot kf st ca = match ca.annot_content with
     let treat_from acc (out, froms) = match froms with FromAny -> acc
                                                      | From _ ->
                                                        let ip =
-                                                         Extlib.the (ip_of_from kf st (Id_loop ca) (out, froms))
+                                                         Option.get (ip_of_from kf st (Id_loop ca) (out, froms))
                                                        in
                                                        ip::acc
     in
@@ -1433,9 +1433,9 @@ let ip_from_of_code_annot kf st ca = match ca.annot_content with
 
 let ip_post_cond_of_behavior kf st ~active b =
   ip_ensures_of_behavior kf st b
-  @ (Extlib.list_of_opt (ip_assigns_of_behavior kf st ~active b))
+  @ (Option.to_list (ip_assigns_of_behavior kf st ~active b))
   @ ip_from_of_behavior kf st active b
-  @ (Extlib.list_of_opt (ip_allocation_of_behavior kf st ~active b))
+  @ (Option.to_list (ip_allocation_of_behavior kf st ~active b))
 
 let ip_of_behavior ib_kf ib_kinstr ~active ib_bhv =
   let ib_active = Datatype.String.Set.of_list active in
@@ -1487,7 +1487,7 @@ let ip_of_decreases id_kf id_kinstr id_variant =
   IPDecrease {id_kf; id_kinstr; id_ca = None; id_variant}
 
 let ip_decreases_of_spec kf st s =
-  Extlib.opt_map (ip_of_decreases kf st) s.spec_variant
+  Option.map (ip_of_decreases kf st) s.spec_variant
 
 let ip_post_cond_of_spec kf st ~active s =
   List.concat
@@ -1497,8 +1497,8 @@ let ip_of_spec kf st ~active s =
   List.concat (List.map (ip_all_of_behavior kf st ~active) s.spec_behavior)
   @ ip_complete_of_spec kf st active s
   @ ip_disjoint_of_spec kf st active s
-  @ (Extlib.list_of_opt (ip_terminates_of_spec kf st s))
-  @ (Extlib.list_of_opt (ip_decreases_of_spec kf st s))
+  @ (Option.to_list (ip_terminates_of_spec kf st s))
+  @ (Option.to_list (ip_decreases_of_spec kf st s))
 
 let ip_axiom s = IPAxiom s
 let ip_lemma s = IPLemma s
@@ -1516,10 +1516,10 @@ let ip_of_code_annot kf stmt ca =
   | AVariant t ->
     [ IPDecrease {id_kf=kf;id_kinstr=ki;id_ca=Some ca; id_variant=t}]
   | AAllocation _ ->
-    Extlib.list_of_opt (ip_allocation_of_code_annot kf ki ca)
+    Option.to_list (ip_allocation_of_code_annot kf ki ca)
     @ ip_from_of_code_annot kf ki ca
   | AAssigns _ ->
-    Extlib.list_of_opt (ip_assigns_of_code_annot kf ki ca)
+    Option.to_list (ip_assigns_of_code_annot kf ki ca)
     @ ip_from_of_code_annot kf ki ca
   | APragma p when Logic_utils.is_property_pragma p ->
     [ IPCodeAnnot {ica_kf=kf; ica_stmt=stmt; ica_ca=ca} ]
diff --git a/src/kernel_services/ast_printing/cil_printer.ml b/src/kernel_services/ast_printing/cil_printer.ml
index 6567141ad0a51d2dbd1cff12ccae4751edb12368..93f7a11edfe9e87b21528fedf243d23d61b58396 100644
--- a/src/kernel_services/ast_printing/cil_printer.ml
+++ b/src/kernel_services/ast_printing/cil_printer.ml
@@ -120,7 +120,7 @@ let print_global g =
     not (Cil.hasAttribute "fc_stdlib" attrs) || Kernel.PrintLibc.get()
   in
   let print_var v =
-    not (Cil.is_unused_builtin v) ||
+    not (Cil_builtins.is_unused_builtin v) ||
     Kernel.is_debug_key_enabled Kernel.dkey_print_builtins
   in
   match g with
@@ -131,7 +131,10 @@ let print_global g =
 let print_std_includes fmt globs =
   if not (Kernel.PrintLibc.get ()) then begin
     let extract_file acc = function
-      | AStr s -> Datatype.String.Set.add s acc
+      | AStr s ->
+        (* These strings are filepaths, so we normalize and prettify them *)
+        let s = Filepath.Normalized.(to_pretty_string (of_string s)) in
+        Datatype.String.Set.add s acc
       | _ -> Kernel.warning "Unexpected attribute parameter for fc_stdlib"; acc
     in
     let add_file acc g =
@@ -1080,7 +1083,7 @@ class cil_printer () = object (self)
         match arg.enode with
         | CastE (_, { enode = AddrOf (host, offset) }) ->
           (* Print the destination *)
-          Extlib.may (fprintf fmt "%a = " self#lval) dest;
+          Option.iter (fprintf fmt "%a = " self#lval) dest;
           (* Now the call itself *)
           fprintf fmt "%a(%a, %a)%s"
             self#varname "offsetof"
@@ -1723,7 +1726,7 @@ class cil_printer () = object (self)
           self#attributes sto_mod
           self#varname n
           (Pretty_utils.pp_list ~sep:"@\n" self#fieldinfo)
-          comp.cfields
+          (Option.value ~default:[] comp.cfields)
           self#attributes rest_attr
 
       | GCompTagDecl (comp, l) -> (* This is a declaration of a tag *)
@@ -1755,7 +1758,8 @@ class cil_printer () = object (self)
       | GFunDecl (funspec, vi, l) ->
         self#in_current_function vi;
         self#opt_funspec fmt funspec;
-        if not state.print_cil_as_is && Cil.Builtin_functions.mem vi.vname
+        if not state.print_cil_as_is &&
+           Cil_builtins.Builtin_functions.mem vi.vname
         then begin
           (* Compiler builtins need no prototypes. Just print them in
              comments. *)
@@ -1833,10 +1837,11 @@ class cil_printer () = object (self)
       self#attributes fi.fattr;
     if Kernel.(is_debug_key_enabled dkey_print_field_offsets) then
       try
-        let (offset, size) = Cil.bitsOffset fi.ftype (Field (fi, NoOffset)) in
+        let (offset, size) = Cil.fieldBitsOffset fi in
         let first = offset in
-        let last = offset + size - 1 in
-        fprintf fmt " /* bits %d .. %d */" first last
+        let last = if size > 0 then Some (offset + size - 1) else None in
+        let pp_opt fmt = Pretty_utils.pp_opt ~none:"" Format.pp_print_int fmt in
+        fprintf fmt " /* bits %d .. %a */" first pp_opt last
       with Cil.SizeOfError _ -> ()
 
   method private opt_funspec fmt funspec =
@@ -2912,12 +2917,17 @@ class cil_printer () = object (self)
           (function (a,_) -> not (Logic_const.is_exit_status a.it_content))
           l
       in
+      let unique_assigned_locs =
+        let same t1 t2 = Cil_datatype.Term.equal t1.it_content t2.it_content in
+        let f l (a,_) = if List.exists (same a) l then l else a :: l in
+        List.rev (List.fold_left f [] without_result)
+      in
       fprintf fmt "@[<h>%t%a@]"
         (fun fmt -> if without_result <> [] then
             Format.fprintf fmt "%a " self#pp_acsl_keyword kw)
         (Pretty_utils.pp_list ~sep:",@ " ~suf:";@]"
-           (fun fmt (t, _) -> self#identified_term fmt t))
-        without_result
+           (fun fmt t -> self#identified_term fmt t))
+        unique_assigned_locs
 
   method private assigns_deps kw fmt = function
     | WritesAny -> ()
diff --git a/src/kernel_services/ast_printing/cil_types_debug.ml b/src/kernel_services/ast_printing/cil_types_debug.ml
index 9f6037a6b458b499e19b3051d4bdfc883bfb8b8a..7ab3d3f9d0fc753b9d0097478f3702190d15cd57 100644
--- a/src/kernel_services/ast_printing/cil_types_debug.ml
+++ b/src/kernel_services/ast_printing/cil_types_debug.ml
@@ -200,16 +200,14 @@ and pp_compinfo fmt compinfo =
        ckey=%a;\
        cfields=%a;\
        cattr=%a;\
-       cdefined=%a;\
        creferenced=%a;\
        }"
       pp_bool compinfo.cstruct
       pp_string compinfo.corig_name
       pp_string compinfo.cname
       pp_int compinfo.ckey
-      (pp_list pp_fieldinfo) compinfo.cfields
+      (pp_option (pp_list pp_fieldinfo)) compinfo.cfields
       pp_attributes compinfo.cattr
-      pp_bool compinfo.cdefined
       pp_bool compinfo.creferenced
   else
     Format.fprintf fmt
@@ -921,6 +919,8 @@ and pp_acsl_extension_kind fmt = function
   | Ext_id(int) -> Format.fprintf fmt "Ext_id(%a)"  pp_int int
   | Ext_terms(term_list) -> Format.fprintf fmt "Ext_terms(%a)"  (pp_list pp_term) term_list
   | Ext_preds(predicate_list) -> Format.fprintf fmt "Ext_preds(%a)"  (pp_list pp_predicate) predicate_list
+  | Ext_annot(string,annotation_list) ->
+    Format.fprintf fmt "Ext_annots(%a,%a)" pp_string string (pp_list pp_acsl_extension) annotation_list
 
 and pp_behavior fmt behavior =
   Format.fprintf fmt
diff --git a/src/kernel_services/ast_printing/cprint.ml b/src/kernel_services/ast_printing/cprint.ml
index d083883d14b84fdfd3d9c87c67dddb6ec12d3389..3633b1c43ff50c5db28a42b111ddadfcdb753917 100644
--- a/src/kernel_services/ast_printing/cprint.ml
+++ b/src/kernel_services/ast_printing/cprint.ml
@@ -262,7 +262,7 @@ and print_fields fmt (flds : field_group list) =
 and print_enum_items fmt items =
   let print_item fmt (id,exp,_) =
     fprintf fmt "%s%a%a"
-      id (pp_cond (exp.expr_node=NOTHING)) "@ =@ " print_expression exp
+      id (pp_cond (exp.expr_node<>NOTHING)) "@ =@ " print_expression exp
   in
   pp_list ~sep:",@ " print_item fmt items
 
diff --git a/src/kernel_services/ast_printing/logic_print.ml b/src/kernel_services/ast_printing/logic_print.ml
index 1b3c0544fc39e38fce56da4f47fe2a8dae606f60..59f6809727dcdd724cb9b841d531c7f072164fa8 100644
--- a/src/kernel_services/ast_printing/logic_print.ml
+++ b/src/kernel_services/ast_printing/logic_print.ml
@@ -311,6 +311,15 @@ let print_model_annot fmt ty =
     (print_logic_type None) ty.model_type
     ty.model_name
 
+let rec print_extended_decl fmt d =
+  let aux fmt d = print_extended_decl fmt d.extended_node in
+  match d with
+  | Ext_lexpr(name,d) ->
+    fprintf fmt "@[<2>%s@ %a@]" name (pp_list ~sep:",@ " print_lexpr) d
+  | Ext_extension(name,id,d) ->
+    fprintf fmt "@[<2>%s@ %s@ {@\n%a@]@\n}" name id
+      (pp_list ~sep:"@\n" aux) d
+
 let rec print_decl fmt d =
   match d.decl_node with
   | LDlogic_def(name,labels,tvar,rt,prms,body) ->
@@ -374,8 +383,7 @@ let rec print_decl fmt d =
       (pp_list ~pre:"@[" ~sep:",@ " ~suf:"@]" print_lexpr) tsets
       (pp_opt ~pre:"@ reads@ " pp_print_string) read
       (pp_opt ~pre:"@ writes@ " pp_print_string) write
-  | LDextended (s,l) ->
-    fprintf fmt "@[<2>%s@ %a@]" s (pp_list ~sep:",@ " print_lexpr) l
+  | LDextended d -> print_extended_decl fmt d
 
 let print_deps fmt deps =
   match deps with
diff --git a/src/kernel_services/ast_printing/printer.ml b/src/kernel_services/ast_printing/printer.ml
index 7735444cd57cef665b84d6588e260f1a8f2950bb..8b8fa7737f1501afeda0f7d72b122ed13a860cff 100644
--- a/src/kernel_services/ast_printing/printer.ml
+++ b/src/kernel_services/ast_printing/printer.ml
@@ -122,7 +122,7 @@ class printer_with_annot () = object (self)
   method! private stmt_has_annot s = Annotations.has_code_annot s
 
   method! private has_annot =
-    Extlib.may_map self#stmt_has_annot ~dft:false self#current_stmt
+    Option.fold ~some:self#stmt_has_annot ~none:false self#current_stmt
 
   method! private inline_block ctxt blk =
     super#inline_block ctxt blk
@@ -143,7 +143,7 @@ class printer_with_annot () = object (self)
        then begin
          declared_globs <- Cil_datatype.Varinfo.Set.add vi declared_globs;
          (* pretty prints the spec, but not for built-ins*)
-         if not (Cil.Builtin_functions.mem vi.vname) then
+         if not (Cil_builtins.Builtin_functions.mem vi.vname) then
            self#pretty_funspec fmt kf
        end
      with Not_found ->
@@ -281,6 +281,7 @@ let () = Cil_datatype.Term_lval.pretty_ref := pp_term_lval
 let () = Cil_datatype.Term_offset.pretty_ref := pp_term_offset
 let () = Cil_datatype.Code_annotation.pretty_ref := pp_code_annotation
 let () = Cil_datatype.Funspec.pretty_ref := pp_funspec
+let () = Cil_datatype.Funbehavior.pretty_ref := pp_behavior
 
 let () = Cil_datatype.Label.pretty_ref := pp_label
 let () = Cil_datatype.Compinfo.pretty_ref := pp_compinfo
diff --git a/src/kernel_services/ast_printing/printer_api.ml b/src/kernel_services/ast_printing/printer_api.ml
index 55444e77588a2125f697a28054600bcfb826c2b8..b6cec4010d9dcd9865f1b6538bde79265a3684c0 100644
--- a/src/kernel_services/ast_printing/printer_api.ml
+++ b/src/kernel_services/ast_printing/printer_api.ml
@@ -453,7 +453,7 @@ module type S_pp = sig
   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 *)
+  (** @since 22.0-Titanium *)
   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_tag.ml b/src/kernel_services/ast_printing/printer_tag.ml
index 8d8d6f6c87f5a2e8f075865c0889cb7a5f5ea2f5..c95353544de9d0f43741b2dd4e215c48885d26f6 100644
--- a/src/kernel_services/ast_printing/printer_tag.ml
+++ b/src/kernel_services/ast_printing/printer_tag.ml
@@ -76,9 +76,7 @@ let pretty fmt = function
   | PExp  (_, _, expr) -> Printer.pp_exp fmt expr
   | PTermLval (_, _, _, lv) -> Printer.pp_term_lval fmt lv
   | PIP prop -> Description.pp_property fmt prop
-  | PStmt(_,stmt) | PStmtStart (_, stmt) ->
-    let p = fst @@ Cil_datatype.Stmt.loc stmt in
-    Format.fprintf fmt "Statement at %a" Filepath.pp_pos p
+  | PStmt(_,stmt) | PStmtStart (_, stmt) -> Printer.pp_stmt fmt stmt
   | PGlobal g -> Printer.pp_global fmt (decl_of g)
 
 let pp_ki_loc fmt ki =
@@ -291,7 +289,7 @@ struct
       match current_ca with
         None ->
         let active = Datatype.String.Set.of_list active_behaviors in
-        Property.Id_contract (active ,Extlib.the self#current_behavior)
+        Property.Id_contract (active ,Option.get self#current_behavior)
       | Some ca -> Property.Id_loop ca
 
     (* When [stmt] is a call, this method "inlines" the preconditions of the
@@ -347,7 +345,7 @@ struct
       if Tag.unfold current
       then self#preconditions_at_call fmt current;
       Format.fprintf fmt "@{<%s>%a@}"
-        (Tag.create (PStmt (Extlib.the self#current_kf,current)))
+        (Tag.create (PStmt (Option.get self#current_kf,current)))
         (super#next_stmt next) current
 
     method! lval fmt lv =
@@ -420,8 +418,8 @@ struct
       | AAssert _ | AInvariant _ | APragma _ | AVariant _ ->
         let ip =
           Property.ip_of_code_annot_single
-            (Extlib.the self#current_kf)
-            (Extlib.the self#current_stmt)
+            (Option.get self#current_kf)
+            (Option.get self#current_stmt)
             ca
         in
         Format.fprintf fmt "@{<%s>%a@}"
@@ -465,10 +463,10 @@ struct
         super#requires p;
 
     method! requires fmt p =
-      let b = Extlib.the self#current_behavior in
+      let b = Option.get self#current_behavior in
       let ip =
         Property.ip_of_requires
-          (Extlib.the self#current_kf) self#current_kinstr b p
+          (Option.get self#current_kf) self#current_kinstr b p
       in
       self#requires_aux fmt (ip, p)
 
@@ -476,7 +474,7 @@ struct
       Format.fprintf fmt "@{<%s>%a@}"
         (self#tag_property
            (Property.ip_of_behavior
-              (Extlib.the self#current_kf)
+              (Option.get self#current_kf)
               self#current_kinstr
               active_behaviors b))
         super#behavior b
@@ -485,21 +483,21 @@ struct
       Format.fprintf fmt "@{<%s>%a@}"
         (self#tag_property
            (Property.ip_of_decreases
-              (Extlib.the self#current_kf) self#current_kinstr t))
+              (Option.get self#current_kf) self#current_kinstr t))
         super#decreases t;
 
     method! terminates fmt t =
       Format.fprintf fmt "@{<%s>%a@}"
         (self#tag_property
            (Property.ip_of_terminates
-              (Extlib.the self#current_kf) self#current_kinstr t))
+              (Option.get self#current_kf) self#current_kinstr t))
         super#terminates t;
 
     method! complete_behaviors fmt t =
       Format.fprintf fmt "@{<%s>%a@}"
         (self#tag_property
            (Property.ip_of_complete
-              (Extlib.the self#current_kf)
+              (Option.get self#current_kf)
               self#current_kinstr
               active_behaviors
               t))
@@ -509,31 +507,31 @@ struct
       Format.fprintf fmt "@{<%s>%a@}"
         (self#tag_property
            (Property.ip_of_disjoint
-              (Extlib.the self#current_kf)
+              (Option.get self#current_kf)
               self#current_kinstr
               active_behaviors
               t))
         super#disjoint_behaviors t
 
     method! assumes fmt p =
-      let b = Extlib.the self#current_behavior in
+      let b = Option.get self#current_behavior in
       Format.fprintf fmt "@{<%s>%a@}"
         (self#tag_property
            (Property.ip_of_assumes
-              (Extlib.the self#current_kf) self#current_kinstr b p))
+              (Option.get self#current_kf) self#current_kinstr b p))
         super#assumes p;
 
     method! post_cond fmt pc =
-      let b = Extlib.the self#current_behavior in
+      let b = Option.get self#current_behavior in
       Format.fprintf fmt "@{<%s>%a@}"
         (self#tag_property
            (Property.ip_of_ensures
-              (Extlib.the self#current_kf) self#current_kinstr b pc))
+              (Option.get self#current_kf) self#current_kinstr b pc))
         super#post_cond pc;
 
     method! assigns s fmt a =
       match
-        Property.ip_of_assigns (Extlib.the self#current_kf) self#current_kinstr
+        Property.ip_of_assigns (Option.get self#current_kf) self#current_kinstr
           self#current_behavior_or_loop a
       with
         None -> super#assigns s fmt a
@@ -546,9 +544,9 @@ struct
       | FromAny -> super#from s fmt from
       | From _ ->
         let ip =
-          Extlib.the
+          Option.get
             (Property.ip_of_from
-               (Extlib.the self#current_kf) self#current_kinstr
+               (Option.get self#current_kf) self#current_kinstr
                self#current_behavior_or_loop from)
         in
         Format.fprintf fmt "@{<%s>%a@}"
@@ -563,7 +561,7 @@ struct
 
     method! allocation ~isloop fmt a =
       match
-        Property.ip_of_allocation (Extlib.the self#current_kf) self#current_kinstr
+        Property.ip_of_allocation (Option.get self#current_kf) self#current_kinstr
           self#current_behavior_or_loop a
       with
         None -> super#allocation ~isloop fmt a
@@ -574,8 +572,8 @@ struct
     method! stmtkind sattr next fmt sk =
       (* Special tag denoting the start of the statement, WITHOUT any ACSL
          assertion/statement contract, etc. *)
-      let s = Extlib.the self#current_stmt in
-      let f = Extlib.the self#current_kf in
+      let s = Option.get self#current_stmt in
+      let f = Option.get self#current_kf in
       let tag = Tag.create (PStmtStart(f,s)) in
       Format.fprintf fmt "@{<%s>%a@}" tag (super#stmtkind sattr next) sk
 
diff --git a/src/kernel_services/ast_queries/acsl_extension.ml b/src/kernel_services/ast_queries/acsl_extension.ml
index ff6f3c5060c832a34dcd6fb930718b95a4b0a352..5132e3e1540275b6b489bf52fec1e023e9a3d864 100644
--- a/src/kernel_services/ast_queries/acsl_extension.ml
+++ b/src/kernel_services/ast_queries/acsl_extension.ml
@@ -28,16 +28,36 @@ type extension_preprocessor =
   lexpr list -> lexpr list
 type extension_typer =
   typing_context -> location -> lexpr list -> acsl_extension_kind
+type extension_preprocessor_block =
+  string * extended_decl list -> string * extended_decl list
+type extension_typer_block =
+  typing_context -> location -> string * extended_decl list -> acsl_extension_kind
 type extension_visitor =
   Cil.cilVisitor -> acsl_extension_kind -> acsl_extension_kind Cil.visitAction
 type extension_printer =
   Printer_api.extensible_printer_type -> Format.formatter ->
   acsl_extension_kind -> unit
-type extension = {
-  category: ext_category ;
+type extension_single = {
+  preprocessor: extension_preprocessor ;
+  typer: extension_typer ;
   status: bool ;
+}
+type extension_block = {
+  preprocessor: extension_preprocessor_block ;
+  typer: extension_typer_block ;
+  status: bool ;
+}
+type extension_common = {
+  category: ext_category ;
+  visitor: extension_visitor ;
+  printer: extension_printer ;
+  short_printer: extension_printer ;
+}
+type extension = {
   preprocessor: extension_preprocessor ;
   typer: extension_typer ;
+  status: bool ;
+  category: ext_category ;
   visitor: extension_visitor ;
   printer: extension_printer ;
   short_printer: extension_printer ;
@@ -47,9 +67,10 @@ let default_printer printer fmt = function
   | Ext_id i -> Format.fprintf fmt "%d" i
   | Ext_terms ts -> Pretty_utils.pp_list ~sep:",@ " printer#term fmt ts
   | Ext_preds ps -> Pretty_utils.pp_list ~sep:",@ " printer#predicate fmt ps
+  | Ext_annot (_,an) -> Pretty_utils.pp_list ~pre:"@[<v 0>" ~suf:"@]@\n" ~sep:"@\n"
+                          printer#extended fmt an
 
-let default_short_printer name _printer fmt _ext_kind =
-  Format.fprintf fmt "%s" name
+let default_short_printer name _printer fmt _ext_kind = Format.fprintf fmt "%s" name
 
 let make
     name category
@@ -58,15 +79,39 @@ let make
     ?(visitor=fun _ _ -> Cil.DoChildren)
     ?(printer=default_printer)
     ?(short_printer=default_short_printer name)
-    status =
-  { category; status; preprocessor; typer; visitor; printer; short_printer }
+    status : extension_single*extension_common =
+  { preprocessor; typer; status},{ category; visitor; printer; short_printer }
+
+let make_block
+    name category
+    ?(preprocessor=Extlib.id)
+    typer
+    ?(visitor=fun _ _ -> Cil.DoChildren)
+    ?(printer=default_printer)
+    ?(short_printer=default_short_printer name)
+    status : extension_block*extension_common =
+  { preprocessor; typer; status},{ category; visitor; printer; short_printer }
 
 module Extensions = struct
+  (*hash table for  category, visitor, printer and short_printer of extensions*)
   let ext_tbl = Hashtbl.create 5
 
-  let find name =
-    try Hashtbl.find ext_tbl name
-    with Not_found ->
+  (*hash table for status, preprocessor and typer of single extensions*)
+  let ext_single_tbl = Hashtbl.create 5
+
+  (*hash table for status, preprocessor and typer of block extensions*)
+  let ext_block_tbl = Hashtbl.create 5
+
+  let find_single name :extension_single =
+    try Hashtbl.find ext_single_tbl name with Not_found ->
+      Kernel.fatal ~current:true "unsupported clause of name '%s'" name
+
+  let find_common name :extension_common =
+    try Hashtbl.find ext_tbl name with Not_found ->
+      Kernel.fatal ~current:true "unsupported clause of name '%s'" name
+
+  let find_block name :extension_block =
+    try Hashtbl.find ext_block_tbl name with Not_found ->
       Kernel.fatal ~current:true "unsupported clause of name '%s'" name
 
   (* [Logic_lexer] can ask for something that is not a category, which is not
@@ -75,21 +120,60 @@ module Extensions = struct
 
   let is_extension = Hashtbl.mem ext_tbl
 
+  let is_extension_block = Hashtbl.mem ext_block_tbl
+
   let register
       cat name ?preprocessor typer ?visitor ?printer ?short_printer status =
-    let info =
+    let info1,info2 =
       make name cat ?preprocessor typer ?visitor ?printer ?short_printer status
     in
     if is_extension name then
       Kernel.warning ~wkey:Kernel.wkey_acsl_extension
         "Trying to register ACSL extension %s twice. Ignoring second extension"
         name
-    else Hashtbl.add ext_tbl name info
+    else
+      begin
+        Hashtbl.add ext_single_tbl name info1;
+        Hashtbl.add ext_tbl name info2
+      end
 
-  let preprocess name = (find name).preprocessor
+  let register_block
+      cat name ?preprocessor typer ?visitor ?printer ?short_printer status =
+    let info1,info2 =
+      make_block name cat ?preprocessor typer ?visitor ?printer ?short_printer status
+    in
+    if is_extension name then
+      Kernel.warning ~wkey:Kernel.wkey_acsl_extension
+        "Trying to register ACSL extension %s twice. Ignoring second extension"
+        name
+    else
+      begin
+        Hashtbl.add ext_block_tbl name info1;
+        Hashtbl.add ext_tbl name info2
+      end
+
+  let preprocess name = (find_single name).preprocessor
+
+  let preprocess_block name = (find_block name).preprocessor
 
   let typing name typing_context loc es =
-    let ext_info = find name in
+    let ext_info = find_single name in
+    let status = ext_info.status in
+    let typer =  ext_info.typer in
+    let normal_error = ref false in
+    let has_error () = normal_error := true in
+    let wrapper =
+      typing_context.on_error (typer typing_context loc) has_error
+    in
+    try status, wrapper es
+    with
+    | (Log.AbortError _ | Log.AbortFatal _) as exn -> raise exn
+    | exn when not !normal_error ->
+      Kernel.fatal "Typechecking ACSL extension %s raised exception %s"
+        name (Printexc.to_string exn)
+
+  let typing_block name typing_context loc es =
+    let ext_info = find_block name in
     let status = ext_info.status in
     let typer =  ext_info.typer in
     let normal_error = ref false in
@@ -104,14 +188,18 @@ module Extensions = struct
       Kernel.fatal "Typechecking ACSL extension %s raised exception %s"
         name (Printexc.to_string exn)
 
-  let visit name = (find name).visitor
+  let visit name = (find_common name).visitor
 
   let print name printer fmt kind =
-    let pp = (find name).printer printer in
-    Format.fprintf fmt "@[<hov 2>%s %a;@]" name pp kind
+    let pp = (find_common name).printer printer in
+    match kind with
+    | Ext_annot (id,_) ->
+      Format.fprintf fmt "@[<v 2>@[%s %s {@]@\n%a}@]" name id pp kind
+    | _ ->
+      Format.fprintf fmt "@[<hov 2>%s %a;@]" name pp kind
 
   let short_print name printer fmt kind =
-    let pp = (find name).short_printer in
+    let pp = (find_common name).short_printer in
     Format.fprintf fmt "%a" (pp printer) kind
 end
 
@@ -121,6 +209,8 @@ let register_behavior =
   Extensions.register Ext_contract
 let register_global =
   Extensions.register Ext_global
+let register_global_block =
+  Extensions.register_block Ext_global
 let register_code_annot =
   Extensions.register (Ext_code_annot Ext_here)
 let register_code_annot_next_stmt =
@@ -136,10 +226,13 @@ let () =
   Logic_env.set_extension_handler
     ~category:Extensions.category
     ~is_extension: Extensions.is_extension
-    ~preprocess: Extensions.preprocess ;
+    ~preprocess: Extensions.preprocess
+    ~is_extension_block: Extensions.is_extension_block
+    ~preprocess_block: Extensions.preprocess_block;
   Logic_typing.set_extension_handler
     ~is_extension: Extensions.is_extension
-    ~typer: Extensions.typing ;
+    ~typer: Extensions.typing
+    ~typer_block: Extensions.typing_block ;
   Cil.set_extension_handler
     ~visit: Extensions.visit ;
   Cil_printer.set_extension_handler
@@ -148,21 +241,45 @@ let () =
 
 (* For Deprecation: *)
 
-let deprecated_replace name ext = Hashtbl.add Extensions.ext_tbl name ext
+let deprecated_replace name ext =
+  let info1:extension_single = {
+    preprocessor = ext.preprocessor ;
+    typer = ext.typer ;
+    status = ext.status ;
+  }
+  in
+  let info2:extension_common  = {
+    category = ext.category ;
+    visitor = ext.visitor ;
+    printer = ext.printer ;
+    short_printer = ext.printer ;
+  }
+  in
+  Hashtbl.add Extensions.ext_single_tbl name info1;
+  Hashtbl.add Extensions.ext_tbl name info2
 
 let strong_cat = Hashtbl.create 5
 
 let default_typer _typing_context _loc _l = assert false
 
+let merge ((info1:extension_single),(info2:extension_common)) :extension =
+  {preprocessor = info1.preprocessor ;
+   typer = info1.typer ;
+   status = info1.status ;
+   category = info2.category ;
+   visitor = info2.visitor ;
+   printer = info2.printer ;
+   short_printer = info2.printer}
 
 let deprecated_find ?(strong=true) name cat op_name =
-  match Hashtbl.find_opt Extensions.ext_tbl name with
+  match Hashtbl.find_opt Extensions.ext_single_tbl name with
   | None ->
     if strong then Hashtbl.add strong_cat name cat ;
-    (make name cat default_typer false)
-  | Some ext ->
+    merge (make name cat default_typer false)
+  | Some ext1 ->
+    let ext2 = Extensions.find_common name in
     if strong && Hashtbl.mem strong_cat name then begin
-      if ext.category = cat then ext
+      if ext2.category = cat then merge (ext1,ext2)
       else
         Kernel.fatal
           "Registring %s for %s: this extension already exists for another \
@@ -170,8 +287,9 @@ let deprecated_find ?(strong=true) name cat op_name =
           op_name name
     end else if strong then begin
       Hashtbl.add strong_cat name cat ;
-      { ext with category = cat }
-    end else ext
+      let ext2 = { ext2 with category = cat } in
+      merge (ext1,ext2)
+    end else merge (ext1,ext2)
 
 let deprecated_register_typing name cat status typer =
   deprecated_replace name
diff --git a/src/kernel_services/ast_queries/acsl_extension.mli b/src/kernel_services/ast_queries/acsl_extension.mli
index c2778433fb9c698c286e9948931363602a2a0b71..c615564b73e848de661706e29db19b63f931fbed 100644
--- a/src/kernel_services/ast_queries/acsl_extension.mli
+++ b/src/kernel_services/ast_queries/acsl_extension.mli
@@ -38,6 +38,10 @@ type extension_typer =
 (** Visitor functions for ACSL extensions *)
 type extension_visitor =
   Cil.cilVisitor -> acsl_extension_kind -> acsl_extension_kind Cil.visitAction
+type extension_preprocessor_block =
+  string * extended_decl list -> string * extended_decl list
+type extension_typer_block =
+  typing_context -> location -> string * extended_decl list -> acsl_extension_kind
 (** Pretty printers for ACSL extensions *)
 type extension_printer =
   Printer_api.extensible_printer_type -> Format.formatter ->
@@ -106,6 +110,16 @@ val register_global:
   ?printer:extension_printer -> ?short_printer:extension_printer -> bool ->
   unit
 
+(** Registers extension for global block annotation. See [register_behavior].
+
+    @plugin development guide
+*)
+val register_global_block:
+  string -> ?preprocessor:extension_preprocessor_block -> extension_typer_block ->
+  ?visitor:extension_visitor ->
+  ?printer:extension_printer -> ?short_printer:extension_printer -> bool ->
+  unit
+
 (** Registers extension for code annotation to be evaluated at _current_
     program point. See [register_behavior].
 
diff --git a/src/kernel_services/ast_queries/ast_info.ml b/src/kernel_services/ast_queries/ast_info.ml
index 5242bfbf931263cd07838ba48bb6512b112b532a..b283054819553df4d0046b32ef3c7e8774123ea9 100644
--- a/src/kernel_services/ast_queries/ast_info.ml
+++ b/src/kernel_services/ast_queries/ast_info.ml
@@ -34,36 +34,36 @@ let is_integral_const = function
 let rec possible_value_of_integral_const = function
   | CInt64 (i,_,_) -> Some i
   | CEnum {eival = e} -> possible_value_of_integral_expr e
-  | CChr c -> Some (Integer.of_int (Char.code c)) 
+  | CChr c -> Some (Integer.of_int (Char.code c))
   (* This is against the ISO C norm! See Cil.charConstToInt  *)
   | _ -> None
 
 and possible_value_of_integral_expr e =
   match (stripInfo e).enode with
-    | Const c -> possible_value_of_integral_const c
-    | _ -> None
+  | Const c -> possible_value_of_integral_const c
+  | _ -> None
 
 let value_of_integral_const c =
   match possible_value_of_integral_const c with
-    | None -> assert false
-    | Some i -> i
+  | None -> assert false
+  | Some i -> i
 
 let value_of_integral_expr e =
   match possible_value_of_integral_expr e with
-    | None -> assert false
-    | Some i -> i
+  | None -> assert false
+  | Some i -> i
 
 let constant_expr ~loc i = new_exp ~loc (Const(CInt64(i,IInt,None)))
 
 let rec is_null_expr e = match (stripInfo e).enode with
   | Const c when is_integral_const c ->
-      Integer.equal (value_of_integral_const c) Integer.zero
+    Integer.equal (value_of_integral_const c) Integer.zero
   | CastE(_,e) -> is_null_expr e
   | _ -> false
 
 let rec is_non_null_expr e = match (stripInfo e).enode with
   | Const c when is_integral_const c ->
-      not (Integer.equal (value_of_integral_const c) Integer.zero)
+    not (Integer.equal (value_of_integral_const c) Integer.zero)
   | CastE(_,e) -> is_non_null_expr e
   | _ -> false
 
@@ -84,24 +84,24 @@ let possible_value_of_integral_logic_const = function
 
 let value_of_integral_logic_const c =
   match possible_value_of_integral_logic_const c with
-    | None -> assert false
-    | Some i -> i
+  | None -> assert false
+  | Some i -> i
 
 let possible_value_of_integral_term t =
   match t.term_node with
-    | TConst c -> possible_value_of_integral_logic_const c
-    | _ -> None
+  | TConst c -> possible_value_of_integral_logic_const c
+  | _ -> None
 
 let term_lvals_of_term t =
   let l = ref [] in
   ignore
     (Cil.visitCilTerm
        (object
-          inherit nopCilVisitor
-          method! vterm_lval lv =
-            l := lv :: !l;
-            DoChildren
-        end)
+         inherit nopCilVisitor
+         method! vterm_lval lv =
+           l := lv :: !l;
+           DoChildren
+       end)
        t);
   !l
 
@@ -119,8 +119,8 @@ let behavior_postcondition b k =
 
 let behavior_precondition b =
   let assumes = behavior_assumes b in
-  let requires = Logic_const.pands 
-                   (List.rev_map Logic_const.pred_of_id_pred b.b_requires)
+  let requires = Logic_const.pands
+      (List.rev_map Logic_const.pred_of_id_pred b.b_requires)
   in
   Logic_const.pimplies (assumes,requires)
 
@@ -134,16 +134,18 @@ let get_named_bhv bhv_list name =
 
 let get_named_bhv_assumes spec bhv_names =
   let bhvs = match bhv_names with
-  | [] -> (* no names ==> all named behaviors *) 
-    List.filter (fun b -> not (is_default_behavior b)) spec.spec_behavior
-  | _ -> 
-    let rec get l = match l with [] -> []
-    | name::tl ->
-      match get_named_bhv spec.spec_behavior name with
-      | None -> (* TODO: warn ? *) get tl
-      | Some b -> b::(get tl)
-    in 
-    get bhv_names
+    | [] -> (* no names ==> all named behaviors *)
+      List.filter (fun b -> not (is_default_behavior b)) spec.spec_behavior
+    | _ ->
+      let rec get l =
+        match l with
+        | [] -> []
+        | name::tl ->
+          match get_named_bhv spec.spec_behavior name with
+          | None -> (* TODO: warn ? *) get tl
+          | Some b -> b::(get tl)
+      in
+      get bhv_names
   in
   List.map behavior_assumes bhvs
 
@@ -151,7 +153,7 @@ let complete_behaviors spec bhv_names =
   let bhv_assumes = get_named_bhv_assumes spec bhv_names in
   Logic_const.pors bhv_assumes
 
-let disjoint_behaviors spec bhv_names = 
+let disjoint_behaviors spec bhv_names =
   let bhv_assumes = get_named_bhv_assumes spec bhv_names in
   let mk_disj_bhv b1 b2 = (* ~ (b1 /\ b2) *)
     let p = Logic_const.pands [b1; b2] in
@@ -161,62 +163,64 @@ let disjoint_behaviors spec bhv_names =
     let lp = List.map (mk_disj_bhv b) lb in
     Logic_const.pands (prop::lp)
   in
-  let rec do_list prop l = match l with [] -> prop
-  | b::tl ->
-    let prop = do_one_with_list prop b tl in
-    do_list prop tl
-  in 
-  do_list Logic_const.ptrue bhv_assumes 
+  let rec do_list prop l =
+    match l with
+    | [] -> prop
+    | b::tl ->
+      let prop = do_one_with_list prop b tl in
+      do_list prop tl
+  in
+  do_list Logic_const.ptrue bhv_assumes
 
 let merge_assigns_internal (get:'b -> assigns) (origin:'b -> string list)
     (acc:(('a*(bool * string list))*int) option) (bhvs: 'b list) =
-  let cmp_assigns acc b = 
+  let cmp_assigns acc b =
     let a' = get b in
-      match acc,a' with 
-	| _, WritesAny -> acc
-	| None, Writes l -> 
-	    (* use the number of assigned terms as measure *)
-	    Some ((a',(false,origin b)),List.length l)
-	| (Some((a,(w,orig)),n)), Writes l -> 
-	    let w = (* warning is needed? *)
-	      w || (a != a' && a <> WritesAny) 
-	    in (* use the number of assigned terms as measure *)
-	    let m = List.length l in
-	      if n<0 || m<n then Some((a',(w,origin b)),m) else Some((a,(w,orig)),n)
+    match acc,a' with
+    | _, WritesAny -> acc
+    | None, Writes l ->
+      (* use the number of assigned terms as measure *)
+      Some ((a',(false,origin b)),List.length l)
+    | (Some((a,(w,orig)),n)), Writes l ->
+      let w = (* warning is needed? *)
+        w || (a != a' && a <> WritesAny)
+      in (* use the number of assigned terms as measure *)
+      let m = List.length l in
+      if n<0 || m<n then Some((a',(w,origin b)),m) else Some((a,(w,orig)),n)
   in List.fold_left (* find the smallest one *)
-       cmp_assigns acc bhvs
+    cmp_assigns acc bhvs
 
 (** Returns the assigns from complete behaviors and unguarded behaviors. *)
 let merge_assigns_from_complete_bhvs ?warn ?(unguarded=true) bhvs complete_bhvs =
   let merge_assigns_from_complete_bhvs bhv_names =
     try (* For merging assigns of a "complete" set of behaviors *)
       let behaviors = match bhv_names with
-	(* Extract behaviors from their names. *)
-	| [] -> (* All behaviors should be taken except the default behavior *) 
-	  List.filter (fun b -> not (Cil.is_default_behavior b)) bhvs 
-	| _ -> (* Finds the corresponding behaviors from the set *)
-	  List.map
-	    (fun b_name -> 
-	      List.find (fun b -> b.b_name = b_name) bhvs) bhv_names
+        (* Extract behaviors from their names. *)
+        | [] -> (* All behaviors should be taken except the default behavior *)
+          List.filter (fun b -> not (Cil.is_default_behavior b)) bhvs
+        | _ -> (* Finds the corresponding behaviors from the set *)
+          List.map
+            (fun b_name ->
+               List.find (fun b -> b.b_name = b_name) bhvs) bhv_names
       in
-	(* Merges the assigns of the complete behaviors.
-	   Once one of them as no assumes, that means the merge 
-	   of the unguarded behavior did already the job *)
+      (* Merges the assigns of the complete behaviors.
+         Once one of them as no assumes, that means the merge
+         of the unguarded behavior did already the job *)
       Writes
-	(List.fold_left
-	   (fun acc b -> match b.b_assigns with
-	   | Writes l when b.b_assumes <> [] -> l @ acc 
-	   | _ -> raise Not_found) [] behaviors)
-    with Not_found -> 
+        (List.fold_left
+           (fun acc b -> match b.b_assigns with
+              | Writes l when b.b_assumes <> [] -> l @ acc
+              | _ -> raise Not_found) [] behaviors)
+    with Not_found ->
       (* One of these behaviors is not found or has no assumes *)
       WritesAny
   in
   let acc =
     if unguarded then (* Looks first at unguarded behaviors. *)
-    let unguarded_bhvs = List.filter (fun b -> b.b_assumes = []) bhvs 
-    in merge_assigns_internal  (* Chooses the smallest one *)
-	(fun b -> b.b_assigns) (fun b -> [b.b_name])
-	None unguarded_bhvs
+      let unguarded_bhvs = List.filter (fun b -> b.b_assumes = []) bhvs
+      in merge_assigns_internal  (* Chooses the smallest one *)
+        (fun b -> b.b_assigns) (fun b -> [b.b_name])
+        None unguarded_bhvs
     else None
   in
   let acc = match acc with
@@ -226,28 +230,28 @@ let merge_assigns_from_complete_bhvs ?warn ?(unguarded=true) bhvs complete_bhvs
     | _ ->
       (* Look at complete behaviors *)
       merge_assigns_internal (* Chooses the smallest one *)
-	merge_assigns_from_complete_bhvs
-	(fun bhvnames -> bhvnames)
-	acc
-	complete_bhvs 
-  in 
+        merge_assigns_from_complete_bhvs
+        (fun bhvnames -> bhvnames)
+        acc
+        complete_bhvs
+  in
   match acc with
   | None -> WritesAny (* No unguarded behavior -> assigns everything *)
   | Some ((a,(w,orig)),_) -> (* The smallest one *)
-    let warn = match warn with 
+    let warn = match warn with
       | None -> w
-      | Some warn -> warn 
-    in 
+      | Some warn -> warn
+    in
     if warn then begin
-      let orig = 
-	if orig = [] then List.map (fun b -> b.b_name) bhvs else orig 
+      let orig =
+        if orig = [] then List.map (fun b -> b.b_name) bhvs else orig
       in
       Kernel.warning ~once:true ~current:true
-	"keeping only assigns from behaviors: %a" 
-	(Pretty_utils.pp_list ~sep:",@ " Format.pp_print_string) orig
+        "keeping only assigns from behaviors: %a"
+        (Pretty_utils.pp_list ~sep:",@ " Format.pp_print_string) orig
     end;
     a
-       
+
 (** Returns the assigns from complete behaviors and unguarded behaviors. *)
 let merge_assigns_from_spec ?warn (spec :funspec) =
   merge_assigns_from_complete_bhvs
@@ -256,21 +260,21 @@ let merge_assigns_from_spec ?warn (spec :funspec) =
 (** Returns the assigns of an unguarded behavior. *)
 let merge_assigns ?warn (bhvs : funbehavior list) =
   let unguarded_bhvs = List.filter (fun b -> b.b_assumes = []) bhvs in
-  let acc = merge_assigns_internal 
-    (fun b -> b.b_assigns) (fun b -> [b.b_name])
-    None unguarded_bhvs 
+  let acc = merge_assigns_internal
+      (fun b -> b.b_assigns) (fun b -> [b.b_name])
+      None unguarded_bhvs
   in
   match acc with
   | None -> WritesAny (* No unguarded behavior -> assigns everything *)
   | Some((a,(w,orig)),_) -> (* The smallest one *)
-    let warn = match warn with 
+    let warn = match warn with
       | None -> w
-      | Some warn -> warn 
-    in 
+      | Some warn -> warn
+    in
     if warn then
       Kernel.warning ~once:true ~current:true
-	"keeping only assigns from behaviors: %a" 
-	(Pretty_utils.pp_list ~sep:",@ " Format.pp_print_string) orig;
+        "keeping only assigns from behaviors: %a"
+        (Pretty_utils.pp_list ~sep:",@ " Format.pp_print_string) orig;
     a
 
 let variable_term loc v =
@@ -291,7 +295,7 @@ let constant_term loc i =
 
 let rec is_null_term t = match t.term_node with
   | TConst c when is_integral_logic_const c ->
-      Integer.equal (value_of_integral_logic_const c) Integer.zero
+    Integer.equal (value_of_integral_logic_const c) Integer.zero
   | TCastE(_,t) -> is_null_term t
   | _ -> false
 
@@ -321,9 +325,9 @@ module Function = struct
 
   let formal_args called_vinfo = match called_vinfo.vtype with
     | TFun (_,Some argl,_,_) ->
-        argl
+      argl
     | TFun _ ->
-        []
+      []
     | _ -> assert false
 
   let is_formal v fundec =
@@ -394,18 +398,18 @@ let array_type ?length ?(attr=[]) ty = TArray(ty,length,empty_size_cache (),attr
 
 let direct_array_size ty =
   match unrollType ty with
-    | TArray(_ty,Some size,_,_) -> value_of_integral_expr size
-    | TArray(_ty,None,_,_) -> Integer.zero
-    | _ -> assert false
+  | TArray(_ty,Some size,_,_) -> value_of_integral_expr size
+  | TArray(_ty,None,_,_) -> Integer.zero
+  | _ -> assert false
 
 let rec array_size ty =
   match unrollType ty with
-    | TArray(elemty,Some _,_,_) ->
-        if isArrayType elemty then
-          Integer.mul (direct_array_size ty) (array_size elemty)
-        else direct_array_size ty
-    | TArray(_,None,_,_) -> Integer.zero
-    | _ -> assert false
+  | TArray(elemty,Some _,_,_) ->
+    if isArrayType elemty then
+      Integer.mul (direct_array_size ty) (array_size elemty)
+    else direct_array_size ty
+  | TArray(_,None,_,_) -> Integer.zero
+  | _ -> assert false
 
 let direct_element_type ty = match unrollType ty with
   | TArray(eltyp,_,_,_) -> eltyp
@@ -417,18 +421,18 @@ let element_type ty =
     | _ -> ty
   in
   match unrollType ty with
-    | TArray(eltyp,_,_,_) -> elem_type eltyp
-    | _ -> assert false
+  | TArray(eltyp,_,_,_) -> elem_type eltyp
+  | _ -> assert false
 
 let direct_pointed_type ty =
   match unrollType ty with
-    | TPtr(elemty,_) -> elemty
-    | _ -> assert false
+  | TPtr(elemty,_) -> elemty
+  | _ -> assert false
 
 let pointed_type ty =
   match unrollType (direct_pointed_type ty) with
-    | TArray _ as arrty -> element_type arrty
-    | ty -> ty
+  | TArray _ as arrty -> element_type arrty
+  | ty -> ty
 
 (* ************************************************************************** *)
 (** {2 Predefined} *)
@@ -460,7 +464,7 @@ let is_frama_c_builtin n =
    is_cea_domain_function n ||
    is_cea_dump_file_function n)
 
-let () = Cil.add_special_builtin_family is_frama_c_builtin
+let () = Cil_builtins.add_special_builtin_family is_frama_c_builtin
 
 (*
 Local Variables:
diff --git a/src/kernel_services/ast_queries/ast_info.mli b/src/kernel_services/ast_queries/ast_info.mli
index 6d4ecc5dec010c913bd9890d7527ee471f25241c..22cef1f703033543f59da7d347470cd9e330fa71 100644
--- a/src/kernel_services/ast_queries/ast_info.mli
+++ b/src/kernel_services/ast_queries/ast_info.mli
@@ -62,56 +62,57 @@ val possible_value_of_integral_term: term -> Integer.t option
     @since Oxygen-20120901 *)
 
 val term_lvals_of_term: term -> term_lval list
-  (** @return the list of all the term lvals of a given term.
-      Purely syntactic function. *)
+(** @return the list of all the term lvals of a given term.
+    Purely syntactic function. *)
 
 val precondition : funspec -> predicate
-  (** Builds the precondition from [b_assumes] and [b_requires] clauses. 
-      @since Carbon-20101201 *)
+(** Builds the precondition from [b_assumes] and [b_requires] clauses.
+    @since Carbon-20101201 *)
 
 val behavior_assumes : funbehavior -> predicate
-  (** Builds the conjunction of the [b_assumes].
-      @since Nitrogen-20111001 *)
-                                        
+(** Builds the conjunction of the [b_assumes].
+    @since Nitrogen-20111001 *)
+
 val behavior_precondition : funbehavior -> predicate
-  (** Builds the precondition from [b_assumes] and [b_requires] clauses. 
-      @since Carbon-20101201 *)
+(** Builds the precondition from [b_assumes] and [b_requires] clauses.
+    @since Carbon-20101201 *)
 
 val behavior_postcondition : funbehavior -> termination_kind -> predicate
-  (** Builds the postcondition from [b_assumes] and [b_post_cond] clauses. 
-      @modify Boron-20100401 added termination kind as filtering argument. *)
+(** Builds the postcondition from [b_assumes] and [b_post_cond] clauses.
+    @modify Boron-20100401 added termination kind as filtering argument. *)
 
 val disjoint_behaviors : funspec -> string list -> predicate
-  (** Builds the [disjoint_behaviors] property for the behavior names.
-      @since Nitrogen-20111001 *)
+(** Builds the [disjoint_behaviors] property for the behavior names.
+    @since Nitrogen-20111001 *)
 
 val complete_behaviors : funspec -> string list -> predicate
-  (** Builds the [disjoint_behaviors] property for the behavior names.
-      @since Nitrogen-20111001 *)
+(** Builds the [disjoint_behaviors] property for the behavior names.
+    @since Nitrogen-20111001 *)
 
-val merge_assigns_from_complete_bhvs: 
+val merge_assigns_from_complete_bhvs:
   ?warn:bool -> ?unguarded:bool -> funbehavior list -> string list list -> assigns
-  (** @return the assigns of an unguarded behavior (when [unguarded]=true)
-      or a set of complete behaviors.
-      - the funbehaviors can come from either a statement contract or a function
-      contract. 
-      - the list of sets of behavior names can come from the contract of the
+(** @return the assigns of an unguarded behavior (when [unguarded]=true)
+    or a set of complete behaviors.
+    - the funbehaviors can come from either a statement contract or a function
+      contract.
+    - the list of sets of behavior names can come from the contract of the
       related function.
-      Optional [warn] argument can be used to force emitting or cancelation of 
-      warnings.
-      @since Oxygen-20120901 *)
+
+    Optional [warn] argument can be used to force emitting or cancelation of
+    warnings.
+    @since Oxygen-20120901 *)
 
 val merge_assigns_from_spec: ?warn:bool -> funspec -> assigns
 (** It is a shortcut for [merge_assigns_from_complete_bhvs
     spec.spec_complete_behaviors spec.spec_behavior].  Optional [warn] argument
-    can be used to force emitting or cancelation of warnings 
+    can be used to force emitting or cancelation of warnings
     @return the assigns of an unguarded behavior or a set of complete behaviors.
-    @since Oxygen-20120901 *) 
+    @since Oxygen-20120901 *)
 
 val merge_assigns: ?warn:bool -> funbehavior list -> assigns
-(** Returns the assigns of an unguarded behavior. 
+(** Returns the assigns of an unguarded behavior.
     @modify Oxygen-20120901 Optional [warn] argument added which can be used to
-    force emitting or cancelation of warnings. *) 
+    force emitting or cancelation of warnings. *)
 
 val variable_term: location -> logic_var -> term
 val constant_term: location -> Integer.t -> term
@@ -153,21 +154,21 @@ val pointed_type: typ -> typ
 (* ************************************************************************** *)
 
 val is_function_type : varinfo -> bool
-  (** Return [true] iff the type of the given varinfo is a function type. *)
+(** Return [true] iff the type of the given varinfo is a function type. *)
 
 (** Operations on cil function. *)
 module Function: sig
   val formal_args: varinfo -> (string * typ * attributes) list
-    (** Returns the list of the named formal arguments of a function.
-        Never call on a variable of non functional type.*)
+  (** Returns the list of the named formal arguments of a function.
+      Never call on a variable of non functional type.*)
 
   val is_formal: varinfo -> fundec -> bool
   val is_local: varinfo -> fundec -> bool
   val is_formal_or_local: varinfo -> fundec -> bool
   val is_formal_of_prototype:
     varinfo (* to check *) -> varinfo (* of the prototype *) -> bool
-    (** [is_formal_of_prototype v f] returns [true] iff [f] is a prototype and
-        [v] is one of its formal parameters. *)
+  (** [is_formal_of_prototype v f] returns [true] iff [f] is a prototype and
+      [v] is one of its formal parameters. *)
 
   val is_definition: cil_function -> bool
   val get_vi: cil_function -> varinfo
diff --git a/src/kernel_services/ast_queries/cil.ml b/src/kernel_services/ast_queries/cil.ml
index 71a319595cd3b794c0d6145eb6d193f94b8a24d4..821cad5670bbfe489b752afd29f22522d0774474 100644
--- a/src/kernel_services/ast_queries/cil.ml
+++ b/src/kernel_services/ast_queries/cil.ml
@@ -159,6 +159,13 @@ let theMachine = createMachine ()
 let msvcMode () = (theMachine.theMachine.compiler = "msvc")
 let gccMode () = (theMachine.theMachine.compiler = "gcc")
 
+let acceptEmptyCompinfo = ref false
+
+let set_acceptEmptyCompinfo () = acceptEmptyCompinfo := true
+
+let acceptEmptyCompinfo () =
+  msvcMode () || gccMode () || !acceptEmptyCompinfo
+
 let theMachineProject = ref (createMachine ())
 
 module Machine_datatype =
@@ -436,7 +443,9 @@ let typeHasAttributeMemoryBlock a (ty:typ): bool =
     | TNamed (r, a') -> f a' ; visit r.ttype
     | TArray(t, _, _, a') -> f a'; visit t
     | TComp (comp, _, a') -> f a';
-      List.iter (fun fi -> f fi.fattr; visit fi.ftype) comp.cfields
+      List.iter
+        (fun fi -> f fi.fattr; visit fi.ftype)
+        (Option.value ~default:[] comp.cfields)
     | TVoid a'
     | TInt (_, a')
     | TFloat (_, a')
@@ -448,7 +457,6 @@ let typeHasAttributeMemoryBlock a (ty:typ): bool =
   try visit ty; false
   with Exit -> true
 
-let typeAddVolatile typ = typeAddAttributes [Attr ("volatile", [])] typ
 let typeAddGhost typ =
   if not (typeHasAttribute "ghost" typ) then
     typeAddAttributes [Attr ("ghost", [])] typ
@@ -1721,7 +1729,7 @@ and visitCilLogicVarUse vis lv =
         we target the current project, builtins are by definition already
         tied to logic_infos and should not be copied.
      *)
-     not (Project.is_current (Extlib.the vis#project)) &&
+     not (Project.is_current (Option.get vis#project)) &&
      Logic_env.is_builtin_logic_function lv.lv_name
   then begin
     (* Do as if the variable has been declared.
@@ -1988,6 +1996,9 @@ and childrenCilExtended vis p =
   | Ext_preds preds ->
     let preds' = mapNoCopy (visitCilPredicate vis) preds in
     if preds == preds' then p else Ext_preds preds'
+  | Ext_annot (id,annots) ->
+    let annots' = mapNoCopy (visitCilExtended vis) annots in
+    if annots == annots' then p else Ext_annot (id,annots')
 
 and visitCilPredicates vis ps = mapNoCopy (visitCilIdPredicate vis) ps
 
@@ -2831,7 +2842,7 @@ let visitCilFieldInfo vis f =
   doVisitCil vis (Visitor_behavior.Memo.fieldinfo vis#behavior) vis#vfieldinfo childrenFieldInfo f
 
 let childrenCompInfo vis comp =
-  comp.cfields <- mapNoCopy (visitCilFieldInfo vis) comp.cfields;
+  comp.cfields <- optMapNoCopy (mapNoCopy (visitCilFieldInfo vis)) comp.cfields;
   comp.cattr <- visitCilAttributes vis comp.cattr;
   comp
 
@@ -4015,7 +4026,7 @@ let rec bytesAlignOf t =
         | f :: rest -> f :: dropZeros (f.fbitfield <> None) rest
         | [] -> []
       in
-      let fields = dropZeros false c.cfields in
+      let fields = dropZeros false (Option.value ~default:[] c.cfields) in
       List.fold_left
         (fun sofar f ->
            (* Bitfields with zero width do not contribute to the alignment in
@@ -4306,19 +4317,17 @@ and bitsSizeOf t =
   | TPtr _ -> 8 * theMachine.theMachine.sizeof_ptr
   | TBuiltin_va_list _ -> 8 * theMachine.theMachine.sizeof_ptr
   | TNamed (t, _) -> bitsSizeOf t.ttype
-  | TComp (comp, scache, _) when comp.cfields == [] ->
-    find_size_in_cache
-      scache
-      (fun () -> begin
-           (* sizeof() empty structs/arrays is only allowed on GCC/MSVC *)
-           if not comp.cdefined && not (gccMode () || msvcMode ()) then begin
-             raise
-               (SizeOfError
-                  (Format.sprintf "abstract type '%s'" (compFullName comp), t))
-           end else
-             0
-         end)
-
+  | TComp ({cfields=None} as comp, _, _) ->
+    raise
+      (SizeOfError
+         (Format.sprintf "abstract type '%s'" (compFullName comp), t))
+  | TComp ({cfields=Some[]}, scache,_) when acceptEmptyCompinfo() ->
+    find_size_in_cache scache (fun () -> 0)
+  | TComp ({cfields=Some[]} as comp,_,_) ->
+    (* sizeof() empty structs/arrays is only allowed on GCC/MSVC *)
+    raise
+      (SizeOfError
+         (Format.sprintf "empty struct '%s'" (compFullName comp), t))
   | TComp (comp, scache, _) when comp.cstruct -> (* Struct *)
     find_size_in_cache
       scache
@@ -4333,9 +4342,9 @@ and bitsSizeOf t =
          let lastoff =
            fold_struct_fields
              (fun ~last acc fi -> offsetOfFieldAcc ~last ~fi ~sofar:acc)
-             startAcc comp.cfields
+             startAcc (Option.get comp.cfields) (* Note: we treat None above *)
          in
-         if msvcMode () && lastoff.oaFirstFree = 0 && comp.cfields <> []
+         if msvcMode () && lastoff.oaFirstFree = 0
          then
            (* On MSVC if we have just a zero-width bitfields then the length
             * is 32 and is not padded  *)
@@ -4354,11 +4363,14 @@ and bitsSizeOf t =
              oaLastFieldWidth = 0;
              oaPrevBitPack = None;
            } in
-         let max =
-           List.fold_left (fun acc fi ->
-               let lastoff = offsetOfFieldAcc ?last:None ~fi ~sofar:startAcc in
-               if lastoff.oaFirstFree > acc then
-                 lastoff.oaFirstFree else acc) 0 comp.cfields in
+         let fold acc fi =
+           let lastoff = offsetOfFieldAcc ?last:None ~fi ~sofar:startAcc in
+           if lastoff.oaFirstFree > acc
+           then lastoff.oaFirstFree
+           else acc
+         in
+         (* Note: we treat None above *)
+         let max = List.fold_left fold 0 (Option.get comp.cfields) in
          (* Add trailing by simulating adding an extra field *)
          addTrailing max (8 * bytesAlignOf t))
 
@@ -4410,6 +4422,30 @@ and sizeOf ~loc t =
     integer ~loc ((bitsSizeOf t) lsr 3)
   with SizeOfError _ -> new_exp ~loc (SizeOf(t))
 
+and fieldBitsOffset (f : fieldinfo) : int * int =
+  if  not f.fcomp.cstruct (* union *) then
+    (* All union fields start at offset 0 *)
+    0, bitsSizeOf f.ftype
+  else begin
+    if f.foffset_in_bits = None then begin
+      let aux ~last acc fi =
+        let acc' = offsetOfFieldAcc ~last ~fi ~sofar:acc in
+        fi.fsize_in_bits <- Some acc'.oaLastFieldWidth;
+        fi.foffset_in_bits <- Some acc'.oaLastFieldStart;
+        acc'
+      in
+      ignore (
+        fold_struct_fields aux
+          { oaFirstFree      = 0;
+            oaLastFieldStart = 0;
+            oaLastFieldWidth = 0;
+            oaPrevBitPack    = None }
+          (Option.value ~default:[] f.fcomp.cfields)
+      );
+    end;
+    Option.get f.foffset_in_bits, Option.get f.fsize_in_bits
+  end
+
 and bitsOffset (baset: typ) (off: offset) : int * int =
   let rec loopOff (baset: typ) (width: int) (start: int) = function
       NoOffset -> start, width
@@ -4423,38 +4459,12 @@ and bitsOffset (baset: typ) (off: offset) : int * int =
         let bitsbt = bitsSizeOf bt in
         loopOff bt bitsbt (start + ei * bitsbt) off
       end
-    | Field(f, off) when not f.fcomp.cstruct (* union *) ->
+    | Field(f, off) ->
       if check_invariants then
-        assert (match unrollType baset with
-            | TComp (ci, _, _) -> ci == f.fcomp
-            | _ -> false);
-      (* All union fields start at offset 0 *)
-      loopOff f.ftype (bitsSizeOf f.ftype) start off
-
-    | Field(f, off) (* struct *) ->
-      if check_invariants then
-        assert (match unrollType baset with
-            | TComp (ci, _, _) -> ci == f.fcomp
-            | _ -> false);
-      if f.foffset_in_bits = None then begin
-        let aux ~last acc fi =
-          let acc' = offsetOfFieldAcc ~last ~fi ~sofar:acc in
-          fi.fsize_in_bits <- Some acc'.oaLastFieldWidth;
-          fi.foffset_in_bits <- Some acc'.oaLastFieldStart;
-          acc'
-        in
-        ignore (
-          fold_struct_fields aux
-            { oaFirstFree      = 0;
-              oaLastFieldStart = 0;
-              oaLastFieldWidth = 0;
-              oaPrevBitPack    = None }
-            f.fcomp.cfields
-        );
-      end;
-      let offsbits, size =
-        Extlib.the f.foffset_in_bits, Extlib.the f.fsize_in_bits
-      in
+        (match unrollType baset with
+         | TComp (ci, _, _) -> assert (ci == f.fcomp)
+         | _ -> assert false);
+      let offsbits, size = fieldBitsOffset f in
       loopOff f.ftype size (start + offsbits) off
   in
   loopOff baset (bitsSizeOf baset) 0 off
@@ -4481,7 +4491,7 @@ and constFold (machdep: bool) (e: exp) : exp =
         Const(CInt64(i,_ik,repr)) -> begin
           match unop with
             Neg ->
-            let repr = Extlib.opt_map (fun s -> "-" ^ s) repr in
+            let repr = Option.map (fun s -> "-" ^ s) repr in
             kinteger64 ~loc ?repr ~kind:tk (Integer.neg i)
           | BNot -> kinteger64 ~loc ~kind:tk (Integer.lognot i)
           | LNot ->
@@ -4855,387 +4865,6 @@ let interpret_character_constant char_list =
   end
 
 let invalidStmt = mkStmt (Instr (Skip Location.unknown))
-module Frama_c_builtins =
-  State_builder.Hashtbl
-    (Datatype.String.Hashtbl)
-    (Cil_datatype.Varinfo)
-    (struct
-      let name = "Cil.Frama_c_Builtins"
-      let dependencies = []
-      let size = 3
-    end)
-
-let is_builtin v = hasAttribute "FC_BUILTIN" v.vattr
-
-let is_unused_builtin v = is_builtin v && not v.vreferenced
-
-
-(* [VP] Should we projectify this ?*)
-let special_builtins_table = ref Datatype.String.Set.empty
-let special_builtins = Queue.create ()
-
-let is_special_builtin s =
-  Queue.fold (fun res f -> res || f s) false special_builtins
-
-let add_special_builtin_family f = Queue.add f special_builtins
-
-let add_special_builtin s =
-  special_builtins_table := Datatype.String.Set.add s !special_builtins_table
-
-let () = add_special_builtin_family
-    (fun s -> Datatype.String.Set.mem s !special_builtins_table)
-
-let () = List.iter add_special_builtin
-    [ "__builtin_stdarg_start"; "__builtin_va_arg";
-      "__builtin_va_start"; "__builtin_expect"; "__builtin_next_arg"; ]
-
-module Builtin_functions =
-  State_builder.Hashtbl
-    (Datatype.String.Hashtbl)
-    (Datatype.Triple(Typ)(Datatype.List(Typ))(Datatype.Bool))
-    (struct
-      let name = "Builtin_functions"
-      let dependencies = [ TheMachine.self ]
-      let size = 49
-    end)
-
-let add_builtin ?(prefix="__builtin_") s t l b =
-  Builtin_functions.add (prefix ^ s) (t, l, b)
-
-let () = registerAttribute "FC_BUILTIN" (AttrName true)
-
-(* Initialize the builtin functions after the machine has been initialized. *)
-let initGccBuiltins () : unit =
-  let sizeType = theMachine.upointType in
-  let add = add_builtin in
-  add "__fprintf_chk"
-    intType
-    (* first argument is really FILE*, not void*, but we don't want to build in
-       the definition for FILE *)
-    [ voidPtrType; intType; charConstPtrType ]
-    true;
-  add "__memcpy_chk"
-    voidPtrType
-    [ voidPtrType; voidConstPtrType; sizeType; sizeType ]
-    false;
-  add "__memmove_chk"
-    voidPtrType [ voidPtrType; voidConstPtrType; sizeType; sizeType ] false;
-  add "__mempcpy_chk"
-    voidPtrType [ voidPtrType; voidConstPtrType; sizeType; sizeType ] false;
-  add "__memset_chk"
-    voidPtrType [ voidPtrType; intType; sizeType; sizeType ] false;
-  add "__printf_chk" intType [ intType; charConstPtrType ] true;
-  add "__snprintf_chk"
-    intType [ charPtrType; sizeType; intType; sizeType; charConstPtrType ]
-    true;
-  add "__sprintf_chk"
-    intType [ charPtrType; intType; sizeType; charConstPtrType ] true;
-  add "__stpcpy_chk"
-    charPtrType [ charPtrType; charConstPtrType; sizeType ] false;
-  add "__strcat_chk"
-    charPtrType [ charPtrType; charConstPtrType; sizeType ] false;
-  add "__strcpy_chk"
-    charPtrType [ charPtrType; charConstPtrType; sizeType ] false;
-  add "__strncat_chk"
-    charPtrType [ charPtrType; charConstPtrType; sizeType; sizeType ] false;
-  add "__strncpy_chk"
-    charPtrType [ charPtrType; charConstPtrType; sizeType; sizeType ] false;
-  add "__vfprintf_chk"
-    intType
-    (* first argument is really FILE*, not void*, but we don't want to build in
-       the definition for FILE *)
-    [ voidPtrType; intType; charConstPtrType; TBuiltin_va_list [] ]
-    false;
-  add "__vprintf_chk"
-    intType [ intType; charConstPtrType; TBuiltin_va_list [] ] false;
-  add "__vsnprintf_chk"
-    intType
-    [ charPtrType; sizeType; intType; sizeType; charConstPtrType;
-      TBuiltin_va_list [] ]
-    false;
-  add "__vsprintf_chk"
-    intType
-    [ charPtrType; intType; sizeType; charConstPtrType; TBuiltin_va_list [] ]
-    false;
-
-  add "alloca" voidPtrType [ sizeType ] false;
-
-  add "acos" doubleType [ doubleType ] false;
-  add "acosf" floatType [ floatType ] false;
-  add "acosl" longDoubleType [ longDoubleType ] false;
-
-  add "asin" doubleType [ doubleType ] false;
-  add "asinf" floatType [ floatType ] false;
-  add "asinl" longDoubleType [ longDoubleType ] false;
-
-  add "atan" doubleType [ doubleType ] false;
-  add "atanf" floatType [ floatType ] false;
-  add "atanl" longDoubleType [ longDoubleType ] false;
-
-  add "atan2" doubleType [ doubleType; doubleType ] false;
-  add "atan2f" floatType [ floatType; floatType ] false;
-  add "atan2l" longDoubleType [ longDoubleType;
-                                longDoubleType ] false;
-
-  let uint16t = uint16_t () in
-  add "bswap16" uint16t [uint16t] false;
-
-  let uint32t = uint32_t () in
-  add "bswap32" uint32t [uint32t] false;
-
-  let uint64t = uint64_t () in
-  add "bswap64" uint64t [uint64t] false;
-
-  add "ceil" doubleType [ doubleType ] false;
-  add "ceilf" floatType [ floatType ] false;
-  add "ceill" longDoubleType [ longDoubleType ] false;
-
-  add "cos" doubleType [ doubleType ] false;
-  add "cosf" floatType [ floatType ] false;
-  add "cosl" longDoubleType [ longDoubleType ] false;
-
-  add "cosh" doubleType [ doubleType ] false;
-  add "coshf" floatType [ floatType ] false;
-  add "coshl" longDoubleType [ longDoubleType ] false;
-
-  add "constant_p" intType [ intType ] false;
-
-  add "exp" doubleType [ doubleType ] false;
-  add "expf" floatType [ floatType ] false;
-  add "expl" longDoubleType [ longDoubleType ] false;
-
-  add "expect" longType [ longType; longType ] false;
-
-  add "fabs" doubleType [ doubleType ] false;
-  add "fabsf" floatType [ floatType ] false;
-  add "fabsl" longDoubleType [ longDoubleType ] false;
-
-  add "ffs" intType [ uintType ] false;
-  add "ffsl" intType [ ulongType ] false;
-  add "ffsll" intType [ ulongLongType ] false;
-  add "frame_address" voidPtrType [ uintType ] false;
-
-  add "floor" doubleType [ doubleType ] false;
-  add "floorf" floatType [ floatType ] false;
-  add "floorl" longDoubleType [ longDoubleType ] false;
-
-  add "huge_val" doubleType [] false;
-  add "huge_valf" floatType [] false;
-  add "huge_vall" longDoubleType [] false;
-  add "ia32_lfence" voidType [] false;
-  add "ia32_mfence" voidType [] false;
-  add "ia32_sfence" voidType [] false;
-
-  add "inf" doubleType [] false;
-  add "inff" floatType [] false;
-  add "infl" longDoubleType [] false;
-  add "memcpy" voidPtrType [ voidPtrType; voidConstPtrType; sizeType ] false;
-  add "mempcpy" voidPtrType [ voidPtrType; voidConstPtrType; sizeType ] false;
-  add "memset" voidPtrType [ voidPtrType; intType; intType ] false;
-
-  add "fmod" doubleType [ doubleType ] false;
-  add "fmodf" floatType [ floatType ] false;
-  add "fmodl" longDoubleType [ longDoubleType ] false;
-
-  add "frexp" doubleType [ doubleType; intPtrType ] false;
-  add "frexpf" floatType [ floatType; intPtrType  ] false;
-  add "frexpl" longDoubleType [ longDoubleType; intPtrType  ] false;
-
-  add "ldexp" doubleType [ doubleType; intType ] false;
-  add "ldexpf" floatType [ floatType; intType  ] false;
-  add "ldexpl" longDoubleType [ longDoubleType; intType  ] false;
-
-  add "log" doubleType [ doubleType ] false;
-  add "logf" floatType [ floatType ] false;
-  add "logl" longDoubleType [ longDoubleType ] false;
-
-  add "log10" doubleType [ doubleType ] false;
-  add "log10f" floatType [ floatType ] false;
-  add "log10l" longDoubleType [ longDoubleType ] false;
-
-  add "modff" floatType [ floatType; TPtr(floatType,[]) ] false;
-  add "modfl"
-    longDoubleType [ longDoubleType; TPtr(longDoubleType, []) ] false;
-
-  add "nan" doubleType [ charConstPtrType ] false;
-  add "nanf" floatType [ charConstPtrType ] false;
-  add "nanl" longDoubleType [ charConstPtrType ] false;
-  add "nans" doubleType [ charConstPtrType ] false;
-  add "nansf" floatType [ charConstPtrType ] false;
-  add "nansl" longDoubleType [ charConstPtrType ] false;
-  add "object_size" sizeType [ voidPtrType; intType ] false;
-
-  add "parity" intType [ uintType ] false;
-  add "parityl" intType [ ulongType ] false;
-  add "parityll" intType [ ulongLongType ] false;
-
-  add "powi" doubleType [ doubleType; intType ] false;
-  add "powif" floatType [ floatType; intType ] false;
-  add "powil" longDoubleType [ longDoubleType; intType ] false;
-  add "prefetch" voidType [ voidConstPtrType ] true;
-  add "return" voidType [ voidConstPtrType ] false;
-  add "return_address" voidPtrType [ uintType ] false;
-
-  add "sin" doubleType [ doubleType ] false;
-  add "sinf" floatType [ floatType ] false;
-  add "sinl" longDoubleType [ longDoubleType ] false;
-
-  add "sinh" doubleType [ doubleType ] false;
-  add "sinhf" floatType [ floatType ] false;
-  add "sinhl" longDoubleType [ longDoubleType ] false;
-
-  add "sqrt" doubleType [ doubleType ] false;
-  add "sqrtf" floatType [ floatType ] false;
-  add "sqrtl" longDoubleType [ longDoubleType ] false;
-
-  add "stpcpy" charPtrType [ charPtrType; charConstPtrType ] false;
-  add "strchr" charPtrType [ charPtrType; intType ] false;
-  add "strcmp" intType [ charConstPtrType; charConstPtrType ] false;
-  add "strcpy" charPtrType [ charPtrType; charConstPtrType ] false;
-  add "strcspn" sizeType [ charConstPtrType; charConstPtrType ] false;
-  add "strncat" charPtrType [ charPtrType; charConstPtrType; sizeType ] false;
-  add "strncmp" intType [ charConstPtrType; charConstPtrType; sizeType ] false;
-  add "strncpy" charPtrType [ charPtrType; charConstPtrType; sizeType ] false;
-  add "strspn" sizeType [ charConstPtrType; charConstPtrType ] false;
-  add "strpbrk" charPtrType [ charConstPtrType; charConstPtrType ] false;
-  (* When we parse builtin_types_compatible_p, we change its interface *)
-  add "types_compatible_p"
-    intType
-    [ theMachine.typeOfSizeOf;(* Sizeof the type *)
-      theMachine.typeOfSizeOf (* Sizeof the type *) ]
-    false;
-  add "tan" doubleType [ doubleType ] false;
-  add "tanf" floatType [ floatType ] false;
-  add "tanl" longDoubleType [ longDoubleType ] false;
-
-  add "tanh" doubleType [ doubleType ] false;
-  add "tanhf" floatType [ floatType ] false;
-  add "tanhl" longDoubleType [ longDoubleType ] false;
-
-  add "unreachable" voidType [ ] false;
-
-  let int8_t = Some scharType in
-  let int16_t = try Some (int16_t ()) with Not_found -> None in
-  let int32_t = try Some (int32_t ()) with Not_found -> None in
-  let int64_t = try Some (int64_t ()) with Not_found -> None in
-  let uint8_t = Some ucharType in
-  let uint16_t = try Some (uint16_t ()) with Not_found -> None in
-  let uint32_t = try Some (uint32_t ()) with Not_found -> None in
-  let uint64_t = try Some (uint64_t ()) with Not_found -> None in
-
-  (* Binary monomorphic versions of atomic builtins *)
-  let atomic_instances =
-    [int8_t, "_int8_t";
-     int16_t,"_int16_t";
-     int32_t,"_int32_t";
-     int64_t,"_int64_t";
-     uint8_t, "_uint8_t";
-     uint16_t,"_uint16_t";
-     uint32_t,"_uint32_t";
-     uint64_t,"_uint64_t"]
-  in
-  let add_sync (typ,name) f =
-    match typ with
-    | Some typ ->
-      add ~prefix:"__sync_" (f^name) typ [ TPtr(typeAddVolatile typ,[]); typ] true
-    | None -> ()
-  in
-  let add_sync f =
-    List.iter (fun typ -> add_sync typ f) atomic_instances
-  in
-  add_sync "fetch_and_add";
-  add_sync "fetch_and_sub";
-  add_sync "fetch_and_or";
-  add_sync "fetch_and_and";
-  add_sync "fetch_and_xor";
-  add_sync "fetch_and_nand";
-  add_sync "add_and_fetch";
-  add_sync "sub_and_fetch";
-  add_sync "or_and_fetch";
-  add_sync "and_and_fetch";
-  add_sync "xor_and_fetch";
-  add_sync "nand_and_fetch";
-  add_sync "lock_test_and_set";
-  List.iter (fun (typ,n) ->
-      match typ with
-      | Some typ ->
-        add ~prefix:"" ("__sync_bool_compare_and_swap"^n)
-          intType
-          [ TPtr(typeAddVolatile typ,[]); typ ; typ]
-          true
-      | None -> ())
-    atomic_instances;
-  List.iter (fun (typ,n) ->
-      match typ with
-      | Some typ ->
-        add ~prefix:"" ("__sync_val_compare_and_swap"^n)
-          typ
-          [ TPtr(typeAddVolatile typ,[]); typ ; typ]
-          true
-      | None -> ())
-    atomic_instances;
-  List.iter (fun (typ,n) ->
-      match typ with
-      | Some typ ->
-        add ~prefix:"" ("__sync_lock_release"^n)
-          voidType
-          [ TPtr(typeAddVolatile typ,[]) ]
-          true;
-      | None -> ())
-    atomic_instances;
-  add ~prefix:"" "__sync_synchronize" voidType [] true
-;;
-
-(* Builtins related to va_list. Added to all non-msvc machdeps, because
-   Cabs2cil supposes they exist. *)
-let initVABuiltins () =
-  let hasbva = theMachine.theMachine.has__builtin_va_list in
-  let add = add_builtin in
-  add "next_arg"
-    (* When we parse builtin_next_arg we drop the second argument *)
-    (if hasbva then TBuiltin_va_list [] else voidPtrType) [] false;
-  if hasbva then begin
-    add "va_end" voidType [ TBuiltin_va_list [] ] false;
-    add "varargs_start" voidType [ TBuiltin_va_list [] ] false;
-    (* When we parse builtin_{va,stdarg}_start, we drop the second argument *)
-    add "va_start" voidType [ TBuiltin_va_list [] ] false;
-    add "stdarg_start" voidType [ TBuiltin_va_list [] ] false;
-    (* When we parse builtin_va_arg we change its interface *)
-    add "va_arg"
-      voidType
-      [ TBuiltin_va_list [];
-        theMachine.typeOfSizeOf;(* Sizeof the type *)
-        voidPtrType (* Ptr to res *) ]
-      false;
-    add "va_copy" voidType [ TBuiltin_va_list []; TBuiltin_va_list [] ] false;
-  end
-
-let initMsvcBuiltins () : unit =
-  (** Take a number of wide string literals *)
-  Builtin_functions.add "__annotation" (voidType, [ ], true)
-
-let init_common_builtins () =
-  add_builtin
-    "offsetof"
-    theMachine.typeOfSizeOf
-    [ theMachine.typeOfSizeOf ]
-    false
-
-let init_builtins () =
-  if not (TheMachine.is_computed ()) then
-    Kernel.fatal ~current:true "You must call initCIL before init_builtins" ;
-  if Builtin_functions.length () <> 0 then
-    Kernel.fatal ~current:true "Cil builtins already initialized." ;
-  init_common_builtins ();
-  if msvcMode () then
-    initMsvcBuiltins ()
-  else begin
-    initVABuiltins ();
-    if gccMode () then initGccBuiltins ();
-  end
-
-(** This is used as the location of the prototypes of builtin functions. *)
-let builtinLoc: location = Location.unknown
 
 let range_loc loc1 loc2 = fst loc1, snd loc2
 
@@ -5737,6 +5366,13 @@ let global_attributes = function
   | GAnnot (gannot,_) -> global_annotation_attributes gannot
   | GAsm _ | GText _ -> []
 
+let is_in_libc attrs =
+  hasAttribute "fc_stdlib" attrs ||
+  hasAttribute "fc_stdlib_generated" attrs
+
+let global_is_in_libc g =
+  is_in_libc (global_attributes g)
+
 (***************************************************************************)
 
 (* Convert an expression into an attribute, if possible. Otherwise raise
@@ -6109,7 +5745,9 @@ let isIntegerConstant e =
     e
 
 let getCompField cinfo fieldName =
-  List.find (fun fi -> fi.fname = fieldName) cinfo.cfields
+  List.find
+    (fun fi -> fi.fname = fieldName)
+    (Option.value ~default:[] cinfo.cfields)
 
 let mkCastT ?(force=false) ~(e: exp) ~(oldt: typ) ~(newt: typ) =
   let loc = e.eloc in
@@ -6283,7 +5921,7 @@ let existsType (f: typ -> existsAction) (t: typ) : bool =
       false
     else begin
       Hashtbl.add memo c.ckey ();
-      List.exists (fun f -> loop f.ftype) c.cfields
+      List.exists (fun f -> loop f.ftype) (Option.value ~default:[] c.cfields)
     end
   in
   loop t
@@ -6335,16 +5973,18 @@ let rec makeZeroInit ~loc (t: typ) : init =
              (Field(f, NoOffset), makeZeroInit ~loc f.ftype) :: acc
            else
              acc)
-        comp.cfields []
+        (Option.value ~default:[] comp.cfields) []
     in
     CompoundInit (t', inits)
   | TComp (comp, _, _) when not comp.cstruct ->
     (match comp.cfields with
-     | [] -> CompoundInit(t, []) (* tolerate empty initialization. *)
-     | f :: _rest ->
+     | Some [] -> CompoundInit(t, []) (* tolerate empty initialization. *)
+     | Some (f :: _rest) ->
        (* ISO C99 [6.7.8.10] says that the first field of the union
           is the one we should initialize. *)
-       CompoundInit(t, [(Field(f, NoOffset), makeZeroInit ~loc f.ftype)]))
+       CompoundInit(t, [(Field(f, NoOffset), makeZeroInit ~loc f.ftype)])
+     | None ->
+       Kernel.fatal "Initialization of incomplete struct")
   | TArray(bt, Some len, _, _) as t' ->
     let n =
       match constFoldToInt len with
@@ -6410,7 +6050,7 @@ let foldLeftCompound
                    Works because [initl] is sorted by Cabs2cil.*)
                 let good_offset i off = match off with
                   | Index (i', NoOffset) ->
-                    Integer.(equal (Extlib.the (constFoldToInt i')) (of_int i))
+                    Integer.(equal (Option.get (constFoldToInt i')) (of_int i))
                   | _ -> Kernel.fatal ~current:true
                            "Invalid initializer"
                 in
@@ -6450,8 +6090,8 @@ let has_flexible_array_member t =
     | _ -> false
   in
   match unrollType t with
-  | TComp (c,_,_) ->
-    c.cfields <> [] && is_flexible_array (Extlib.last c.cfields).ftype
+  | TComp ({ cfields = Some ((_::_) as l) },_,_) ->
+    is_flexible_array (Extlib.last l).ftype
   | _ -> false
 
 (* last_field is [true] if the given type is the type of the last field of
@@ -6472,9 +6112,9 @@ let rec isCompleteType ?allowZeroSizeArrays ?(last_field=false) t =
     is_complete_agg_member ~allowZeroSizeArrays ~last_field t
   | TArray(t, Some _, _, _) ->
     is_complete_agg_member ~allowZeroSizeArrays ~last_field t
-  | TComp (comp, _, _) -> (* Struct or union *)
-    comp.cdefined &&
-    complete_type_fields ~allowZeroSizeArrays comp.cstruct comp.cfields
+  | TComp ( { cfields = None } , _, _) -> false
+  | TComp ( { cstruct ; cfields = Some flds }, _, _) -> (* Struct or union *)
+    complete_type_fields ~allowZeroSizeArrays cstruct flds
   | TEnum({eitems = []},_) -> false
   | TEnum _ -> true
   | TInt _ | TFloat _ | TPtr _ | TBuiltin_va_list _ -> true
@@ -6602,6 +6242,8 @@ let is_case_label l = match l with
   | Case _ | Default _ -> true
   | _ -> false
 
+let init_builtins_ref : (unit -> unit) ref = Extlib.mk_fun "init_builtins_ref"
+
 let initCIL ~initLogicBuiltins machdep =
   if not (TheMachine.is_computed ()) then begin
     (* Set the machine *)
@@ -6663,7 +6305,7 @@ let initCIL ~initLogicBuiltins machdep =
     (* projectify theMachine *)
     copyMachine theMachine !theMachineProject;
 
-    init_builtins ();
+    !init_builtins_ref ();
 
     Logic_env.Builtins.extend initLogicBuiltins;
 
diff --git a/src/kernel_services/ast_queries/cil.mli b/src/kernel_services/ast_queries/cil.mli
index 52b030aafbe623ced3815a3d59b3c56c478d40f4..6a11f862895c479fd1d6c39f2db01433ac778eff 100644
--- a/src/kernel_services/ast_queries/cil.mli
+++ b/src/kernel_services/ast_queries/cil.mli
@@ -51,46 +51,6 @@
 open Cil_types
 open Cil_datatype
 
-(* ************************************************************************* *)
-(** {2 Builtins management} *)
-(* ************************************************************************* *)
-
-(** This module associates the name of a built-in function that might be used
-    during elaboration with the corresponding varinfo.  This is done when
-    parsing ${FRAMAC_SHARE}/libc/__fc_builtins.h, which is always performed
-    before processing the actual list of files provided on the command line (see
-    {!File.init_from_c_files}).  Actual list of such built-ins is managed in
-    {!Cabs2cil}. *)
-module Frama_c_builtins:
-  State_builder.Hashtbl with type key = string and type data = Cil_types.varinfo
-
-val is_builtin: Cil_types.varinfo -> bool
-(** @return true if the given variable refers to a Frama-C builtin.
-    @since Fluorine-20130401 *)
-
-val is_unused_builtin: Cil_types.varinfo -> bool
-(** @return true if the given variable refers to a Frama-C builtin that
-    is not used in the current program. Plugins may (and in fact should)
-    hide this builtin from their outputs *)
-
-val is_special_builtin: string -> bool
-(** @return [true] if the given name refers to a special built-in function.
-    A special built-in function can have any number of arguments. It is up to
-    the plug-ins to know what to do with it.
-    @since Carbon-20101201 *)
-
-(** register a new special built-in function *)
-val add_special_builtin: string -> unit
-
-(** register a new family of special built-in functions.
-    @since Carbon-20101201
-*)
-val add_special_builtin_family: (string -> bool) -> unit
-
-(** initialize the C built-ins. Should be called once per project, after the
-    machine has been set. *)
-val init_builtins: unit -> unit
-
 (** Call this function to perform some initialization, and only after you have
     set [Cil.msvcMode]. [initLogicBuiltins] is the function to call to init
     logic builtins. The [Machdeps] argument is a description of the hardware
@@ -139,6 +99,24 @@ val selfMachine_is_computed: ?project:Project.project -> unit -> bool
 val msvcMode: unit -> bool
 val gccMode: unit -> bool
 
+val set_acceptEmptyCompinfo: unit -> unit
+(** After a call to this function, empty compinfos are allowed by the kernel,
+    this must be used as a configuration step equivalent to a machdep, except
+    that it is not a user configuration.
+
+    Note that if the selected machdep is GCC or MSVC, this call has no effect
+    as these modes already allow empty compinfos.
+
+    @since Frama-C+dev
+*)
+
+val acceptEmptyCompinfo: unit -> bool
+(** whether we accept empty struct. Implied by {!Cil.msvcMode} and
+    {!Cil.gccMode}, and can be forced by {!Cil.set_acceptEmptyCompinfo}
+    otherwise.
+
+    @since Frama-C+dev
+*)
 
 (* ************************************************************************* *)
 (** {2 Values for manipulating globals} *)
@@ -266,20 +244,6 @@ val pushGlobal: global -> types: global list ref
 (** An empty statement. Used in pretty printing *)
 val invalidStmt: stmt
 
-(** A list of the built-in functions for the current compiler (GCC or
-  * MSVC, depending on [!msvcMode]).  Maps the name to the
-  * result and argument types, and whether it is vararg.
-  * Initialized by {!Cil.initCIL}
-  *
-  * This map replaces [gccBuiltins] and [msvcBuiltins] in previous
-  * versions of CIL.*)
-module Builtin_functions :
-  State_builder.Hashtbl with type key = string
-                         and type data = typ * typ list * bool
-
-(** This is used as the location of the prototypes of builtin functions. *)
-val builtinLoc: location
-
 (** Returns a location that ranges over the two locations in arguments. *)
 val range_loc: location -> location -> location
 
@@ -351,10 +315,34 @@ val ulongType: typ
 (** unsigned long long *)
 val ulongLongType: typ
 
+(** Any signed integer type of size 16 bits.
+    It is equivalent to the ISO C int16_t type but without using the
+    corresponding header.
+    Must only be called if such type exists in the current architecture.
+    @since Frama-C+dev
+*)
+val int16_t: unit -> typ
+
+(** Any signed integer type of size 32 bits.
+    It is equivalent to the ISO C int32_t type but without using the
+    corresponding header.
+    Must only be called if such type exists in the current architecture.
+    @since Frama-C+dev
+*)
+val int32_t: unit -> typ
+
+(** Any signed integer type of size 64 bits.
+    It is equivalent to the ISO C int64_t type but without using the
+    corresponding header.
+    Must only be called if such type exists in the current architecture.
+    @since Frama-C+dev
+*)
+val int64_t: unit -> typ
+
 (** Any unsigned integer type of size 16 bits.
     It is equivalent to the ISO C uint16_t type but without using the
     corresponding header.
-    Shall not be called if not such type exists in the current architecture.
+    Must only be called if such type exists in the current architecture.
     @since Nitrogen-20111001
 *)
 val uint16_t: unit -> typ
@@ -362,7 +350,7 @@ val uint16_t: unit -> typ
 (** Any unsigned integer type of size 32 bits.
     It is equivalent to the ISO C uint32_t type but without using the
     corresponding header.
-    Shall not be called if not such type exists in the current architecture.
+    Must only be called if such type exists in the current architecture.
     @since Nitrogen-20111001
 *)
 val uint32_t: unit -> typ
@@ -370,7 +358,7 @@ val uint32_t: unit -> typ
 (** Any unsigned integer type of size 64 bits.
     It is equivalent to the ISO C uint64_t type but without using the
     corresponding header.
-    Shall not be called if no such type exists in the current architecture.
+    Must only be called if such type exists in the current architecture.
     @since Nitrogen-20111001
 *)
 val uint64_t: unit -> typ
@@ -548,12 +536,12 @@ val isArithmeticType: typ -> bool
 
 (** True if the argument is a scalar type (i.e. integral, enum,
     floating point or pointer
-    @since Frama-C+dev
+    @since 22.0-Titanium
 *)
 val isScalarType: typ -> bool
 
 (** alias of isScalarType.
-    @deprecated Frama-C+dev use isScalarType instead
+    @deprecated 22.0-Titanium use isScalarType instead
 *)
 val isArithmeticOrPointerType: typ -> bool
 
@@ -1422,6 +1410,18 @@ val global_annotation_attributes: global_annotation -> attributes
 *)
 val global_attributes: global -> attributes
 
+(**
+   Whether the given attributes contain libc indicators.
+   @since Frama-C+dev
+*)
+val is_in_libc: attributes -> bool
+
+(**
+   Whether the given global contains libc indicators.
+   @since Frama-C+dev
+*)
+val global_is_in_libc: global -> bool
+
 exception NotAnAttrParam of exp
 
 (* ************************************************************************* *)
@@ -2185,6 +2185,13 @@ val intOfAttrparam: attrparam -> int option
  * this after you call {!Cil.initCIL}. *)
 val bitsOffset: typ -> offset -> int * int
 
+(** Give a field, returns the number of bits from the structure or union
+ * containing the field and the width (also expressed in bits) for the subobject
+ * denoted by the field. Raises {!Cil.SizeOfError} when it cannot compute
+ * the size. This function is architecture dependent, so you should only call
+ * this after you call {!Cil.initCIL}. *)
+val fieldBitsOffset: fieldinfo -> int * int
+
 (** Like map but try not to make a copy of the list *)
 val mapNoCopy: ('a -> 'a) -> 'a list -> 'a list
 
@@ -2340,6 +2347,12 @@ val set_deprecated_extension_handler:
            (cilVisitor -> acsl_extension_kind -> acsl_extension_kind visitAction) ->
            unit) -> unit
 
+(* ***********************************************************************)
+(** {2 Forward references} *)
+(* ***********************************************************************)
+
+val init_builtins_ref: (unit -> unit) ref
+
 (*
 Local Variables:
 compile-command: "make -C ../../.."
diff --git a/src/kernel_services/ast_queries/cil_builtins.ml b/src/kernel_services/ast_queries/cil_builtins.ml
new file mode 100644
index 0000000000000000000000000000000000000000..0ea304a242b984e9d70a524d81fde346670bf01f
--- /dev/null
+++ b/src/kernel_services/ast_queries/cil_builtins.ml
@@ -0,0 +1,703 @@
+(****************************************************************************)
+(*                                                                          *)
+(*  Copyright (C) 2001-2003                                                 *)
+(*   George C. Necula    <necula@cs.berkeley.edu>                           *)
+(*   Scott McPeak        <smcpeak@cs.berkeley.edu>                          *)
+(*   Wes Weimer          <weimer@cs.berkeley.edu>                           *)
+(*   Ben Liblit          <liblit@cs.berkeley.edu>                           *)
+(*  All rights reserved.                                                    *)
+(*                                                                          *)
+(*  Redistribution and use in source and binary forms, with or without      *)
+(*  modification, are permitted provided that the following conditions      *)
+(*  are met:                                                                *)
+(*                                                                          *)
+(*  1. Redistributions of source code must retain the above copyright       *)
+(*  notice, this list of conditions and the following disclaimer.           *)
+(*                                                                          *)
+(*  2. 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.    *)
+(*                                                                          *)
+(*  3. The names of the contributors may not 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 OWNER 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)                            *)
+(*               and INRIA (Institut National de Recherche en Informatique  *)
+(*                          et Automatique).                                *)
+(****************************************************************************)
+
+open Cil_datatype
+open Cil_types
+
+let typeAddVolatile typ = Cil.typeAddAttributes [Attr ("volatile", [])] typ
+
+module Frama_c_builtins =
+  State_builder.Hashtbl
+    (Datatype.String.Hashtbl)
+    (Cil_datatype.Varinfo)
+    (struct
+      let name = "Cil.Frama_c_Builtins"
+      let dependencies = []
+      let size = 3
+    end)
+
+let is_builtin v = Cil.hasAttribute "FC_BUILTIN" v.vattr
+
+let is_unused_builtin v = is_builtin v && not v.vreferenced
+
+
+(* [VP] Should we projectify this ?*)
+let special_builtins_table = ref Datatype.String.Set.empty
+let special_builtins = Queue.create ()
+
+let is_special_builtin s =
+  Queue.fold (fun res f -> res || f s) false special_builtins
+
+let add_special_builtin_family f = Queue.add f special_builtins
+
+let add_special_builtin s =
+  special_builtins_table := Datatype.String.Set.add s !special_builtins_table
+
+let () = add_special_builtin_family
+    (fun s -> Datatype.String.Set.mem s !special_builtins_table)
+
+let () = List.iter add_special_builtin
+    [ "__builtin_stdarg_start"; "__builtin_va_arg";
+      "__builtin_va_start"; "__builtin_expect"; "__builtin_next_arg"; ]
+
+module Builtin_functions =
+  State_builder.Hashtbl
+    (Datatype.String.Hashtbl)
+    (Datatype.Triple(Typ)(Datatype.List(Typ))(Datatype.Bool))
+    (struct
+      let name = "Builtin_functions"
+      let dependencies = [ Cil.selfMachine ]
+      let size = 49
+    end)
+
+(* [add_builtin ?prefix s t l b] adds the function [prefix ^ s] to the list of
+   built-ins. [t] is the return type and [l] is the list of parameter types.
+   [b] is true if the built-in is variadic, false otherwise. *)
+let add_builtin ?(prefix="__builtin_") s t l b =
+  Builtin_functions.add (prefix ^ s) (t, l, b)
+
+let () = Cil.registerAttribute "FC_BUILTIN" (AttrName true)
+
+let intType = Cil.intType
+let voidPtrType = Cil.voidPtrType
+let charConstPtrType = Cil.charConstPtrType
+let voidConstPtrType = Cil.voidConstPtrType
+let charPtrType = Cil.charPtrType
+let voidType = Cil.voidType
+let floatType = Cil.floatType
+let doubleType = Cil.doubleType
+let longDoubleType = Cil.longDoubleType
+let longType = Cil.longType
+let longLongType = Cil.longLongType
+let uintType = Cil.uintType
+let ulongType = Cil.ulongType
+let ulongLongType = Cil.ulongLongType
+let intPtrType = Cil.intPtrType
+
+(* Initialize the builtin functions after the machine has been initialized. *)
+let initGccBuiltins () : unit =
+  (* Complex types are unsupported so the following built-ins can't be added :
+     - cabs, cabsf, cabsh
+     - cacos, cacosf, cacosl, cacosh, cacoshf, cacoshl
+     - carg, cargf, cargl
+     - casin, casinf, casinl, casinh, casinhf, casinhl
+     - catan, catanf, catanl, catanh, catanhf, catanhl
+     - ccos, ccosf, ccosl, ccosh, ccoshf, ccoshl
+     - cexp, cexpf, cexpl
+     - cimag, cimagf, cimagl
+     - clog, clogf, clogl
+     - conj, conjf, conjl
+     - cpow, cpowf, cpowl
+     - cproj, cprojf, cprojl
+     - creal, crealf, creall
+     - csin, csinf, csinl, csinh, csinhf, csinhl
+     - csqrt, csqrtf, csqrtl
+     - ctan, ctanf, ctanl, ctanh, ctanhf, ctanhl
+  *)
+
+  (* [wint_t] isn't specified in [theMachine] so the following built-ins that
+     use this type can't be added :
+     - iswalnum
+     - iswalpha
+     - iswblank
+     - iswcntrl
+     - iswdigit
+     - iswgraph
+     - iswlower
+     - iswprint
+     - iswpunct
+     - iswspace
+     - iswupper
+     - iswxdigit
+     - towlower
+     - towupper
+  *)
+
+  let sizeType = Cil.theMachine.upointType in
+  let add = add_builtin in
+
+  add "__fprintf_chk"
+    intType
+    (* first argument is really FILE*, not void*, but we don't want to build in
+       the definition for FILE *)
+    [ voidPtrType; intType; charConstPtrType ]
+    true;
+  add "__memcpy_chk"
+    voidPtrType
+    [ voidPtrType; voidConstPtrType; sizeType; sizeType ]
+    false;
+  add "__memmove_chk"
+    voidPtrType [ voidPtrType; voidConstPtrType; sizeType; sizeType ] false;
+  add "__mempcpy_chk"
+    voidPtrType [ voidPtrType; voidConstPtrType; sizeType; sizeType ] false;
+  add "__memset_chk"
+    voidPtrType [ voidPtrType; intType; sizeType; sizeType ] false;
+  add "__printf_chk" intType [ intType; charConstPtrType ] true;
+  add "__snprintf_chk"
+    intType [ charPtrType; sizeType; intType; sizeType; charConstPtrType ]
+    true;
+  add "__sprintf_chk"
+    intType [ charPtrType; intType; sizeType; charConstPtrType ] true;
+  add "__stpcpy_chk"
+    charPtrType [ charPtrType; charConstPtrType; sizeType ] false;
+  add "__strcat_chk"
+    charPtrType [ charPtrType; charConstPtrType; sizeType ] false;
+  add "__strcpy_chk"
+    charPtrType [ charPtrType; charConstPtrType; sizeType ] false;
+  add "__strncat_chk"
+    charPtrType [ charPtrType; charConstPtrType; sizeType; sizeType ] false;
+  add "__strncpy_chk"
+    charPtrType [ charPtrType; charConstPtrType; sizeType; sizeType ] false;
+  add "__vfprintf_chk"
+    intType
+    (* first argument is really FILE*, not void*, but we don't want to build in
+       the definition for FILE *)
+    [ voidPtrType; intType; charConstPtrType; TBuiltin_va_list [] ]
+    false;
+  add "__vprintf_chk"
+    intType [ intType; charConstPtrType; TBuiltin_va_list [] ] false;
+  add "__vsnprintf_chk"
+    intType
+    [ charPtrType; sizeType; intType; sizeType; charConstPtrType;
+      TBuiltin_va_list [] ]
+    false;
+  add "__vsprintf_chk"
+    intType
+    [ charPtrType; intType; sizeType; charConstPtrType; TBuiltin_va_list [] ]
+    false;
+
+  add "_Exit" voidType [ intType ] false;
+  add "exit" voidType [ intType ] false;
+
+  add "alloca" voidPtrType [ sizeType ] false;
+
+  add "malloc" voidPtrType [ sizeType ] false;
+  add "calloc" voidPtrType [ sizeType; sizeType ] false;
+  add "realloc" voidPtrType [ voidPtrType; sizeType ] false;
+  add "free" voidType [ voidPtrType ] false;
+
+  add "abs" intType [ intType ] false;
+  add "labs" longType [ longType ] false;
+  add "llabs" longLongType [ longLongType] false;
+  (* Can't add imaxabs because it takes intmax_t as parameter *)
+
+  add "acos" doubleType [ doubleType ] false;
+  add "acosf" floatType [ floatType ] false;
+  add "acosl" longDoubleType [ longDoubleType ] false;
+  add "acosh" doubleType [ doubleType ] false;
+  add "acoshf" floatType [ floatType ] false;
+  add "acoshl" longDoubleType [ longDoubleType ] false;
+
+  add "asin" doubleType [ doubleType ] false;
+  add "asinf" floatType [ floatType ] false;
+  add "asinl" longDoubleType [ longDoubleType ] false;
+  add "asinh" doubleType [ doubleType ] false;
+  add "asinhf" floatType [ floatType ] false;
+  add "asinhl" longDoubleType [ longDoubleType ] false;
+
+  add "atan" doubleType [ doubleType ] false;
+  add "atanf" floatType [ floatType ] false;
+  add "atanl" longDoubleType [ longDoubleType ] false;
+  add "atanh" doubleType [ doubleType ] false;
+  add "atanhf" floatType [ floatType ] false;
+  add "atanhl" longDoubleType [ longDoubleType ] false;
+
+  add "atan2" doubleType [ doubleType; doubleType ] false;
+  add "atan2f" floatType [ floatType; floatType ] false;
+  add "atan2l" longDoubleType [ longDoubleType;
+                                longDoubleType ] false;
+
+  let uint16t = Cil.uint16_t () in
+  add "bswap16" uint16t [uint16t] false;
+
+  let uint32t = Cil.uint32_t () in
+  add "bswap32" uint32t [uint32t] false;
+
+  let uint64t = Cil.uint64_t () in
+  add "bswap64" uint64t [uint64t] false;
+
+  add "cbrt" doubleType [ doubleType ] false;
+  add "cbrtf" floatType [ floatType ] false;
+  add "cbrtl" longDoubleType [ longDoubleType ] false;
+
+  add "ceil" doubleType [ doubleType ] false;
+  add "ceilf" floatType [ floatType ] false;
+  add "ceill" longDoubleType [ longDoubleType ] false;
+
+  add "cos" doubleType [ doubleType ] false;
+  add "cosf" floatType [ floatType ] false;
+  add "cosl" longDoubleType [ longDoubleType ] false;
+
+  add "cosh" doubleType [ doubleType ] false;
+  add "coshf" floatType [ floatType ] false;
+  add "coshl" longDoubleType [ longDoubleType ] false;
+
+  add "constant_p" intType [ intType ] false;
+
+  add "copysign" doubleType [ doubleType; doubleType ] false;
+  add "copysignf" floatType [ floatType; floatType ] false;
+  add "copysignl" longDoubleType [ longDoubleType; longDoubleType ] false;
+
+  add "erfc" doubleType [ doubleType ] false;
+  add "erfcf" floatType [ floatType ] false;
+  add "erfcl" longDoubleType [ longDoubleType ] false;
+
+  add "erf" doubleType [ doubleType ] false;
+  add "erff" floatType [ floatType ] false;
+  add "erfl" longDoubleType [ longDoubleType ] false;
+
+  add "exp" doubleType [ doubleType ] false;
+  add "expf" floatType [ floatType ] false;
+  add "expl" longDoubleType [ longDoubleType ] false;
+
+  add "exp2" doubleType [ doubleType ] false;
+  add "exp2f" floatType [ floatType ] false;
+  add "exp2l" longDoubleType [ longDoubleType ] false;
+
+  add "expm1" doubleType [ doubleType ] false;
+  add "expm1f" floatType [ floatType ] false;
+  add "expm1l" longDoubleType [ longDoubleType ] false;
+
+  add "expect" longType [ longType; longType ] false;
+
+  add "fabs" doubleType [ doubleType ] false;
+  add "fabsf" floatType [ floatType ] false;
+  add "fabsl" longDoubleType [ longDoubleType ] false;
+
+  add "fdim" doubleType [ doubleType; doubleType ] false;
+  add "fdimf" floatType [ floatType; floatType ] false;
+  add "fdiml" longDoubleType [ longDoubleType; longDoubleType ] false;
+
+  add "ffs" intType [ uintType ] false;
+  add "ffsl" intType [ ulongType ] false;
+  add "ffsll" intType [ ulongLongType ] false;
+  add "frame_address" voidPtrType [ uintType ] false;
+
+  add "floor" doubleType [ doubleType ] false;
+  add "floorf" floatType [ floatType ] false;
+  add "floorl" longDoubleType [ longDoubleType ] false;
+
+  add "fma" doubleType [ doubleType; doubleType; doubleType ] false;
+  add "fmaf" floatType [ floatType; floatType; floatType ] false;
+  add "fmal"
+    longDoubleType [ longDoubleType; longDoubleType; longDoubleType ] false;
+
+  add "fmax" doubleType [ doubleType; doubleType ] false;
+  add "fmaxf" floatType [ floatType; floatType ] false;
+  add "fmaxl" longDoubleType [ longDoubleType; longDoubleType ] false;
+
+  add "fmin" doubleType [ doubleType; doubleType ] false;
+  add "fminf" floatType [ floatType; floatType ] false;
+  add "fminl" longDoubleType [ longDoubleType; longDoubleType ] false;
+
+  add "huge_val" doubleType [] false;
+  add "huge_valf" floatType [] false;
+  add "huge_vall" longDoubleType [] false;
+
+  add "hypot" doubleType [ doubleType; doubleType ] false;
+  add "hypotf" floatType [ floatType; floatType ] false;
+  add "hypotl" longDoubleType [ longDoubleType; longDoubleType ] false;
+
+  add "ia32_lfence" voidType [] false;
+  add "ia32_mfence" voidType [] false;
+  add "ia32_sfence" voidType [] false;
+
+  add "ilogb" doubleType [ doubleType ] false;
+  add "ilogbf" floatType [ floatType ] false;
+  add "ilogbl" longDoubleType [ longDoubleType ] false;
+
+  add "inf" doubleType [] false;
+  add "inff" floatType [] false;
+  add "infl" longDoubleType [] false;
+
+  add "isblank" intType [ intType ] false;
+  add "isalnum" intType [ intType ] false;
+  add "isalpha" intType [ intType ] false;
+  add "iscntrl" intType [ intType ] false;
+  add "isdigit" intType [ intType ] false;
+  add "isgraph" intType [ intType ] false;
+  add "islower" intType [ intType ] false;
+  add "isprint" intType [ intType ] false;
+  add "ispunct" intType [ intType ] false;
+  add "isspace" intType [ intType ] false;
+  add "isupper" intType [ intType ] false;
+  add "isxdigit" intType [ intType ] false;
+
+  add "fmod" doubleType [ doubleType ] false;
+  add "fmodf" floatType [ floatType ] false;
+  add "fmodl" longDoubleType [ longDoubleType ] false;
+
+  add "frexp" doubleType [ doubleType; intPtrType ] false;
+  add "frexpf" floatType [ floatType; intPtrType  ] false;
+  add "frexpl" longDoubleType [ longDoubleType; intPtrType  ] false;
+
+  add "ldexp" doubleType [ doubleType; intType ] false;
+  add "ldexpf" floatType [ floatType; intType  ] false;
+  add "ldexpl" longDoubleType [ longDoubleType; intType  ] false;
+
+  add "lgamma" doubleType [ doubleType ] false;
+  add "lgammaf" floatType [ floatType ] false;
+  add "lgammal" longDoubleType [ longDoubleType ] false;
+
+  add "llrint" longLongType [ doubleType ] false;
+  add "llrintf" longLongType [ floatType ] false;
+  add "llrintl" longLongType [ longDoubleType ] false;
+
+  add "llround" longLongType [ doubleType ] false;
+  add "llroundf" longLongType [ floatType ] false;
+  add "llroundl" longLongType [ longDoubleType ] false;
+
+  add "log" doubleType [ doubleType ] false;
+  add "logf" floatType [ floatType ] false;
+  add "logl" longDoubleType [ longDoubleType ] false;
+
+  add "log10" doubleType [ doubleType ] false;
+  add "log10f" floatType [ floatType ] false;
+  add "log10l" longDoubleType [ longDoubleType ] false;
+
+  add "log1p" doubleType [ doubleType ] false;
+  add "log1pf" floatType [ floatType ] false;
+  add "log1pl" longDoubleType [ longDoubleType ] false;
+
+  add "log2" doubleType [ doubleType ] false;
+  add "log2f" floatType [ floatType ] false;
+  add "log2l" longDoubleType [ longDoubleType ] false;
+
+  add "logb" doubleType [ doubleType ] false;
+  add "logbf" floatType [ floatType ] false;
+  add "logbl" longDoubleType [ longDoubleType ] false;
+
+  add "lrint" longType [ doubleType ] false;
+  add "lrintf" longType [ floatType ] false;
+  add "lrintl" longType [ longDoubleType ] false;
+
+  add "lround" longType [ doubleType ] false;
+  add "lroundf" longType [ floatType ] false;
+  add "lroundl" longType [ longDoubleType ] false;
+
+  add "memchr" voidPtrType [ voidConstPtrType; intType; sizeType ] false;
+  add "memcmp" intType [ voidConstPtrType; voidConstPtrType; sizeType ] false;
+  add "memcpy" voidPtrType [ voidPtrType; voidConstPtrType; sizeType ] false;
+  add "mempcpy" voidPtrType [ voidPtrType; voidConstPtrType; sizeType ] false;
+  add "memset" voidPtrType [ voidPtrType; intType; sizeType ] false;
+
+  add "modf" doubleType [ doubleType; TPtr(doubleType,[]) ] false;
+  add "modff" floatType [ floatType; TPtr(floatType,[]) ] false;
+  add "modfl"
+    longDoubleType [ longDoubleType; TPtr(longDoubleType, []) ] false;
+
+  add "nan" doubleType [ charConstPtrType ] false;
+  add "nanf" floatType [ charConstPtrType ] false;
+  add "nanl" longDoubleType [ charConstPtrType ] false;
+  add "nans" doubleType [ charConstPtrType ] false;
+  add "nansf" floatType [ charConstPtrType ] false;
+  add "nansl" longDoubleType [ charConstPtrType ] false;
+
+  add "nearbyint" doubleType [ doubleType ] false;
+  add "nearbyintf" floatType [ floatType ] false;
+  add "nearbyintl" longDoubleType [ longDoubleType ] false;
+
+  add "nextafter" doubleType [ doubleType; doubleType ] false;
+  add "nextafterf" floatType [ floatType; floatType ] false;
+  add "nextafterl" longDoubleType [ longDoubleType; longDoubleType ] false;
+
+  add "nexttoward" doubleType [ doubleType; longDoubleType ] false;
+  add "nexttowardf" floatType [ floatType; longDoubleType ] false;
+  add "nexttowardl" longDoubleType [ longDoubleType; longDoubleType ] false;
+
+  add "object_size" sizeType [ voidPtrType; intType ] false;
+
+  add "parity" intType [ uintType ] false;
+  add "parityl" intType [ ulongType ] false;
+  add "parityll" intType [ ulongLongType ] false;
+
+  add "pow" doubleType [ doubleType; doubleType ] false;
+  add "powf" floatType [ floatType; floatType ] false;
+  add "powl" longDoubleType [ longDoubleType; longDoubleType ] false;
+
+  add "powi" doubleType [ doubleType; intType ] false;
+  add "powif" floatType [ floatType; intType ] false;
+  add "powil" longDoubleType [ longDoubleType; intType ] false;
+
+  add "prefetch" voidType [ voidConstPtrType ] true;
+
+  add "printf" intType [ charConstPtrType ] true;
+  add "vprintf" intType [ charConstPtrType; TBuiltin_va_list [] ] false;
+  (* For [fprintf] and [vfprintf] the first argument is really FILE*, not void*,
+     but we don't want to build in the definition for FILE. *)
+  add "fprintf" intType [ voidPtrType; charConstPtrType ] true;
+  add "vfprintf"
+    intType [ voidPtrType; charConstPtrType; TBuiltin_va_list [] ] false;
+  add "sprintf" intType [ charPtrType; charConstPtrType ] true;
+  add "vsprintf"
+    intType [ charPtrType; charConstPtrType; TBuiltin_va_list [] ] false;
+  add "snprintf" intType [ charPtrType; sizeType; charConstPtrType ] true;
+  add "vsnprintf"
+    intType
+    [ charPtrType; sizeType; charConstPtrType; TBuiltin_va_list [] ]
+    false;
+
+  add "putchar" intType [ intType ] false;
+
+  add "puts" intType [ charConstPtrType ] false;
+  (* The second argument of [fputs] is really FILE*, not void*, but we
+     don't want to build in the definition for FILE. *)
+  add "fputs" intType [ charConstPtrType; voidPtrType ] false;
+
+  add "remainder" doubleType [ doubleType; doubleType ] false;
+  add "remainderf" floatType [ floatType; floatType ] false;
+  add "remainderl" longDoubleType [ longDoubleType; longDoubleType ] false;
+
+  add "remquo" doubleType [ doubleType; doubleType; intPtrType ] false;
+  add "remquof" floatType [ floatType; floatType; intPtrType ] false;
+  add "remquol"
+    longDoubleType [ longDoubleType; longDoubleType; intPtrType ] false;
+
+  add "return" voidType [ voidConstPtrType ] false;
+  add "return_address" voidPtrType [ uintType ] false;
+
+  add "rint" doubleType [ doubleType ] false;
+  add "rintf" floatType [ floatType ] false;
+  add "rintl" longDoubleType [ longDoubleType ] false;
+
+  add "round" doubleType [ doubleType ] false;
+  add "roundf" floatType [ floatType ] false;
+  add "roundl" longDoubleType [ longDoubleType ] false;
+
+  add "scalbln" doubleType [ doubleType; longType ] false;
+  add "scalblnf" floatType [ floatType; longType ] false;
+  add "scalblnl" longDoubleType [ longDoubleType; longType ] false;
+
+  add "scalbn" doubleType [ doubleType; intType ] false;
+  add "scalbnf" floatType [ floatType; intType ] false;
+  add "scalbnl" longDoubleType [ longDoubleType; intType ] false;
+
+  add "scanf" intType [ charConstPtrType ] true;
+  add "vscanf" intType [ charConstPtrType; TBuiltin_va_list [] ] false;
+  (* For [fscanf] and [vfscanf] the first argument is really FILE*, not void*,
+     but we don't want to build in the definition for FILE. *)
+  add "fscanf" intType [ voidPtrType; charConstPtrType ] true;
+  add "vfscanf"
+    intType [ voidPtrType; charConstPtrType; TBuiltin_va_list [] ] false;
+  add "sscanf" intType [ charConstPtrType; charConstPtrType ] true;
+  add "vsscanf"
+    intType [ charConstPtrType; charConstPtrType; TBuiltin_va_list [] ] false;
+
+  add "sin" doubleType [ doubleType ] false;
+  add "sinf" floatType [ floatType ] false;
+  add "sinl" longDoubleType [ longDoubleType ] false;
+
+  add "sinh" doubleType [ doubleType ] false;
+  add "sinhf" floatType [ floatType ] false;
+  add "sinhl" longDoubleType [ longDoubleType ] false;
+
+  add "sqrt" doubleType [ doubleType ] false;
+  add "sqrtf" floatType [ floatType ] false;
+  add "sqrtl" longDoubleType [ longDoubleType ] false;
+
+  add "stpcpy" charPtrType [ charPtrType; charConstPtrType ] false;
+  add "strcat" charPtrType [ charPtrType; charConstPtrType ] false;
+  add "strchr" charPtrType [ charPtrType; intType ] false;
+  add "strcmp" intType [ charConstPtrType; charConstPtrType ] false;
+  add "strcpy" charPtrType [ charPtrType; charConstPtrType ] false;
+  add "strcspn" sizeType [ charConstPtrType; charConstPtrType ] false;
+  add "strlen" sizeType [ charConstPtrType ] false;
+  add "strncat" charPtrType [ charPtrType; charConstPtrType; sizeType ] false;
+  add "strncmp" intType [ charConstPtrType; charConstPtrType; sizeType ] false;
+  add "strncpy" charPtrType [ charPtrType; charConstPtrType; sizeType ] false;
+  add "strspn" sizeType [ charConstPtrType; charConstPtrType ] false;
+  add "strpbrk" charPtrType [ charConstPtrType; charConstPtrType ] false;
+  add "strrchr" charPtrType [ charConstPtrType; intType ] false;
+  add "strstr" charPtrType [ charConstPtrType; charConstPtrType ] false;
+  (* When we parse builtin_types_compatible_p, we change its interface *)
+  add "types_compatible_p"
+    intType
+    [ Cil.theMachine.typeOfSizeOf;(* Sizeof the type *)
+      Cil.theMachine.typeOfSizeOf (* Sizeof the type *) ]
+    false;
+  add "tan" doubleType [ doubleType ] false;
+  add "tanf" floatType [ floatType ] false;
+  add "tanl" longDoubleType [ longDoubleType ] false;
+
+  add "tanh" doubleType [ doubleType ] false;
+  add "tanhf" floatType [ floatType ] false;
+  add "tanhl" longDoubleType [ longDoubleType ] false;
+
+  add "tgamma" doubleType [ doubleType ] false;
+  add "tgammaf" floatType [ floatType ] false;
+  add "tgammal" longDoubleType [ longDoubleType ] false;
+
+  add "tolower" intType [ intType ] false;
+  add "toupper" intType [ intType ] false;
+
+  add "trunc" doubleType [ doubleType ] false;
+  add "truncf" floatType [ floatType ] false;
+  add "truncl" longDoubleType [ longDoubleType ] false;
+
+  add "unreachable" voidType [ ] false;
+
+  let int8_t = Some Cil.scharType in
+  let int16_t = try Some (Cil.int16_t ()) with Not_found -> None in
+  let int32_t = try Some (Cil.int32_t ()) with Not_found -> None in
+  let int64_t = try Some (Cil.int64_t ()) with Not_found -> None in
+  let uint8_t = Some Cil.ucharType in
+  let uint16_t = try Some (Cil.uint16_t ()) with Not_found -> None in
+  let uint32_t = try Some (Cil.uint32_t ()) with Not_found -> None in
+  let uint64_t = try Some (Cil.uint64_t ()) with Not_found -> None in
+
+  (* Binary monomorphic versions of atomic builtins *)
+  let atomic_instances =
+    [int8_t, "_int8_t";
+     int16_t,"_int16_t";
+     int32_t,"_int32_t";
+     int64_t,"_int64_t";
+     uint8_t, "_uint8_t";
+     uint16_t,"_uint16_t";
+     uint32_t,"_uint32_t";
+     uint64_t,"_uint64_t"]
+  in
+  let add_sync (typ,name) f =
+    match typ with
+    | Some typ ->
+      add ~prefix:"__sync_" (f^name) typ [ TPtr(typeAddVolatile typ,[]); typ] true
+    | None -> ()
+  in
+  let add_sync f =
+    List.iter (fun typ -> add_sync typ f) atomic_instances
+  in
+  add_sync "fetch_and_add";
+  add_sync "fetch_and_sub";
+  add_sync "fetch_and_or";
+  add_sync "fetch_and_and";
+  add_sync "fetch_and_xor";
+  add_sync "fetch_and_nand";
+  add_sync "add_and_fetch";
+  add_sync "sub_and_fetch";
+  add_sync "or_and_fetch";
+  add_sync "and_and_fetch";
+  add_sync "xor_and_fetch";
+  add_sync "nand_and_fetch";
+  add_sync "lock_test_and_set";
+  List.iter (fun (typ,n) ->
+      match typ with
+      | Some typ ->
+        add ~prefix:"" ("__sync_bool_compare_and_swap"^n)
+          intType
+          [ TPtr(typeAddVolatile typ,[]); typ ; typ]
+          true
+      | None -> ())
+    atomic_instances;
+  List.iter (fun (typ,n) ->
+      match typ with
+      | Some typ ->
+        add ~prefix:"" ("__sync_val_compare_and_swap"^n)
+          typ
+          [ TPtr(typeAddVolatile typ,[]); typ ; typ]
+          true
+      | None -> ())
+    atomic_instances;
+  List.iter (fun (typ,n) ->
+      match typ with
+      | Some typ ->
+        add ~prefix:"" ("__sync_lock_release"^n)
+          voidType
+          [ TPtr(typeAddVolatile typ,[]) ]
+          true;
+      | None -> ())
+    atomic_instances;
+  add ~prefix:"" "__sync_synchronize" voidType [] true
+;;
+
+(* Builtins related to va_list. Added to all non-msvc machdeps, because
+   Cabs2cil supposes they exist. *)
+let initVABuiltins () =
+  let hasbva = Cil.theMachine.theMachine.has__builtin_va_list in
+  let add = add_builtin in
+  add "next_arg"
+    (* When we parse builtin_next_arg we drop the second argument *)
+    (if hasbva then TBuiltin_va_list [] else voidPtrType) [] false;
+  if hasbva then begin
+    add "va_end" voidType [ TBuiltin_va_list [] ] false;
+    add "varargs_start" voidType [ TBuiltin_va_list [] ] false;
+    (* When we parse builtin_{va,stdarg}_start, we drop the second argument *)
+    add "va_start" voidType [ TBuiltin_va_list [] ] false;
+    add "stdarg_start" voidType [ TBuiltin_va_list [] ] false;
+    (* When we parse builtin_va_arg we change its interface *)
+    add "va_arg"
+      voidType
+      [ TBuiltin_va_list [];
+        Cil.theMachine.typeOfSizeOf;(* Sizeof the type *)
+        voidPtrType (* Ptr to res *) ]
+      false;
+    add "va_copy" voidType [ TBuiltin_va_list []; TBuiltin_va_list [] ] false;
+  end
+
+let initMsvcBuiltins () : unit =
+  (** Take a number of wide string literals *)
+  Builtin_functions.add "__annotation" (voidType, [ ], true)
+
+let init_common_builtins () =
+  add_builtin
+    "offsetof"
+    Cil.theMachine.typeOfSizeOf
+    [ Cil.theMachine.typeOfSizeOf ]
+    false
+
+let init_builtins () =
+  if not (Cil.selfMachine_is_computed ()) then
+    Kernel.fatal ~current:true "You must call initCIL before init_builtins" ;
+  if Builtin_functions.length () <> 0 then
+    Kernel.fatal ~current:true "Cil builtins already initialized." ;
+  init_common_builtins ();
+  if Cil.msvcMode () then
+    initMsvcBuiltins ()
+  else begin
+    initVABuiltins ();
+    if Cil.gccMode () then initGccBuiltins ();
+  end
+
+(** This is used as the location of the prototypes of builtin functions. *)
+let builtinLoc: location = Location.unknown
+
+let () =
+  Cil.init_builtins_ref := init_builtins
diff --git a/src/kernel_services/ast_queries/cil_builtins.mli b/src/kernel_services/ast_queries/cil_builtins.mli
new file mode 100644
index 0000000000000000000000000000000000000000..adb9caf1eb57e165b9e9ba0d56d9bf8e9dce3670
--- /dev/null
+++ b/src/kernel_services/ast_queries/cil_builtins.mli
@@ -0,0 +1,98 @@
+(****************************************************************************)
+(*                                                                          *)
+(*  Copyright (C) 2001-2003                                                 *)
+(*   George C. Necula    <necula@cs.berkeley.edu>                           *)
+(*   Scott McPeak        <smcpeak@cs.berkeley.edu>                          *)
+(*   Wes Weimer          <weimer@cs.berkeley.edu>                           *)
+(*   Ben Liblit          <liblit@cs.berkeley.edu>                           *)
+(*  All rights reserved.                                                    *)
+(*                                                                          *)
+(*  Redistribution and use in source and binary forms, with or without      *)
+(*  modification, are permitted provided that the following conditions      *)
+(*  are met:                                                                *)
+(*                                                                          *)
+(*  1. Redistributions of source code must retain the above copyright       *)
+(*  notice, this list of conditions and the following disclaimer.           *)
+(*                                                                          *)
+(*  2. 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.    *)
+(*                                                                          *)
+(*  3. The names of the contributors may not 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 OWNER 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)                            *)
+(*               and INRIA (Institut National de Recherche en Informatique  *)
+(*                          et Automatique).                                *)
+(****************************************************************************)
+
+open Cil_types
+
+(* ************************************************************************* *)
+(** {2 Builtins management} *)
+(* ************************************************************************* *)
+
+(** This module associates the name of a built-in function that might be used
+    during elaboration with the corresponding varinfo.  This is done when
+    parsing ${FRAMAC_SHARE}/libc/__fc_builtins.h, which is always performed
+    before processing the actual list of files provided on the command line (see
+    {!File.init_from_c_files}).  Actual list of such built-ins is managed in
+    {!Cabs2cil}. *)
+module Frama_c_builtins:
+  State_builder.Hashtbl with type key = string and type data = varinfo
+
+val is_builtin: varinfo -> bool
+(** @return true if the given variable refers to a Frama-C builtin.
+    @since Fluorine-20130401 *)
+
+val is_unused_builtin: varinfo -> bool
+(** @return true if the given variable refers to a Frama-C builtin that
+    is not used in the current program. Plugins may (and in fact should)
+    hide this builtin from their outputs *)
+
+val is_special_builtin: string -> bool
+(** @return [true] if the given name refers to a special built-in function.
+    A special built-in function can have any number of arguments. It is up to
+    the plug-ins to know what to do with it.
+    @since Carbon-20101201 *)
+
+(** register a new special built-in function *)
+val add_special_builtin: string -> unit
+
+(** register a new family of special built-in functions.
+    @since Carbon-20101201
+*)
+val add_special_builtin_family: (string -> bool) -> unit
+
+(** initialize the C built-ins. Should be called once per project, after the
+    machine has been set. *)
+val init_builtins: unit -> unit
+
+(** A list of the built-in functions for the current compiler (GCC or
+  * MSVC, depending on [!msvcMode]).  Maps the name to the
+  * result and argument types, and whether it is vararg.
+  * Initialized by {!Cil.initCIL}
+  *
+  * This map replaces [gccBuiltins] and [msvcBuiltins] in previous
+  * versions of CIL.*)
+module Builtin_functions :
+  State_builder.Hashtbl with type key = string
+                         and type data = typ * typ list * bool
+
+(** This is used as the location of the prototypes of builtin functions. *)
+val builtinLoc: location
diff --git a/src/kernel_services/ast_queries/cil_const.ml b/src/kernel_services/ast_queries/cil_const.ml
index f11f85dbf1f6ca987cf761d5cc257e3b0a1806f3..ebd6fe21fa6b1402e5d6d68aa137c4440e217347 100644
--- a/src/kernel_services/ast_queries/cil_const.ml
+++ b/src/kernel_services/ast_queries/cil_const.ml
@@ -47,10 +47,10 @@ module CurrentLoc =
   State_builder.Ref
     (Cil_datatype.Location)
     (struct
-       let dependencies = []
-       let name = "CurrentLoc"
-       let default () = Cil_datatype.Location.unknown
-     end)
+      let dependencies = []
+      let name = "CurrentLoc"
+      let default () = Cil_datatype.Location.unknown
+    end)
 
 let voidType = TVoid([])
 
@@ -66,27 +66,27 @@ let copy_with_new_vid v =
   let n = Vid.next () in
   let new_v = { v with vid = n } in
   (match v.vlogic_var_assoc with
-    | None -> ()
-    | Some lv ->
-      let new_lv = { lv with lv_id = n } in
-      new_v.vlogic_var_assoc <- Some new_lv;
-      new_lv.lv_origin <- Some new_v);
+   | None -> ()
+   | Some lv ->
+     let new_lv = { lv with lv_id = n } in
+     new_v.vlogic_var_assoc <- Some new_lv;
+     new_lv.lv_origin <- Some new_v);
   new_v
 
 let change_varinfo_name vi name =
   vi.vname <- name;
   match vi.vlogic_var_assoc with
-    | None -> ()
-    | Some lv -> lv.lv_name <- name
+  | None -> ()
+  | Some lv -> lv.lv_name <- name
 
 let new_raw_id = Vid.next
 
 (* The next compindo identifier to use. Counts up. *)
- let nextCompinfoKey =
-   let module M =
-         State_builder.SharedCounter(struct let name = "compinfokey" end)
-   in
-   M.next
+let nextCompinfoKey =
+  let module M =
+    State_builder.SharedCounter(struct let name = "compinfokey" end)
+  in
+  M.next
 
 (** Creates a (potentially recursive) composite type. Make sure you add a
   * GTag for it to the file! **)
@@ -99,7 +99,7 @@ let mkCompInfo
        * the fields. The function can ignore this argument if not
        * constructing a recursive type.  *)
     (mkfspec: compinfo -> (string * typ * int option * attribute list *
-			   location) list)
+                           location) list option)
     (a: attribute list) : compinfo =
 
   (* make a new name for anonymous structs *)
@@ -110,28 +110,28 @@ let mkCompInfo
       corig_name = norig;
       cname = n;
       ckey = nextCompinfoKey ();
-      cfields = []; (* fields will be added afterwards. *)
+      cfields = None; (* fields will be added afterwards. *)
       cattr = a;
       creferenced = false;
       (* Make this compinfo undefined by default *)
-      cdefined = false; }
+    }
   in
   let flds =
-    List.map (fun (fn, ft, fb, fa, fl) ->
-	{ fcomp = comp;
-	  ftype = ft;
-	  forig_name = fn;
-	  fname = fn;
-	  fbitfield = fb;
-	  fattr = fa;
-	  floc = fl;
-	  faddrof = false;
-	  fsize_in_bits = None;
-	  foffset_in_bits = None;
-	  fpadding_in_bits = None;
-	}) (mkfspec comp) in
+    Option.map (List.mapi (fun forder (fn, ft, fb, fa, fl) ->
+        { fcomp = comp;
+          forder;
+          ftype = ft;
+          forig_name = fn;
+          fname = fn;
+          fbitfield = fb;
+          fattr = fa;
+          floc = fl;
+          faddrof = false;
+          fsize_in_bits = None;
+          foffset_in_bits = None;
+          fpadding_in_bits = None;
+        })) (mkfspec comp) in
   comp.cfields <- flds;
-  if flds <> [] then comp.cdefined <- true;
   comp
 
 (** Make a copy of a compinfo, changing the name and the key *)
@@ -139,12 +139,13 @@ let copyCompInfo ?(fresh=true) ci cname =
   let ckey = if fresh then nextCompinfoKey () else ci.ckey in
   let ci' = { ci with cname; ckey } in
   (* Copy the fields and set the new pointers to parents *)
-  ci'.cfields <- List.map (fun f -> {f with fcomp = ci'}) ci'.cfields;
+  ci'.cfields <-
+    Option.map (List.map (fun f -> {f with fcomp = ci'})) ci'.cfields;
   ci'
 
 
 let make_logic_var_kind x kind typ =
-  {lv_name = x; lv_id = new_raw_id(); lv_type = typ; lv_kind = kind; 
+  {lv_name = x; lv_id = new_raw_id(); lv_type = typ; lv_kind = kind;
    lv_origin = None; lv_attr = [] }
 
 let make_logic_var_global x t = make_logic_var_kind x LVGlobal t
@@ -153,15 +154,15 @@ let make_logic_var_quant x t = make_logic_var_kind x LVQuant t
 let make_logic_var_local x t = make_logic_var_kind x LVLocal t
 
 let make_logic_var =
-  Kernel.deprecated "Cil_const.make_logic_var" 
+  Kernel.deprecated "Cil_const.make_logic_var"
     ~now:"Use one of Cil_const.make_logic_var_* to indicate \
           the origin of the variable"
     make_logic_var_quant
 
 let make_logic_info k x =
   { l_var_info = make_logic_var_kind x k (Ctype voidType);
-      (* we should put the right type when fields
-	 l_profile, l_type will be factorized *)
+    (* we should put the right type when fields
+       l_profile, l_type will be factorized *)
     l_type = None;
     l_tparams = [];
     l_labels = [];
diff --git a/src/kernel_services/ast_queries/cil_const.mli b/src/kernel_services/ast_queries/cil_const.mli
index 58178291430fce395a9cefe0f39f2fa696ba4956..5523ae89d6f84d7ec05b6ccf7c4762e1a45c5a84 100644
--- a/src/kernel_services/ast_queries/cil_const.mli
+++ b/src/kernel_services/ast_queries/cil_const.mli
@@ -70,28 +70,30 @@ val copy_with_new_vid: varinfo -> varinfo
 val change_varinfo_name: varinfo -> string -> unit
 
 val new_raw_id: unit -> int
-  (** Generate a new ID. This will be different than any variable ID
-      that is generated by {!Cil.makeLocalVar} and friends.
-      Must not be used for setting vid: use {!set_vid} instead. *)
+(** Generate a new ID. This will be different than any variable ID
+    that is generated by {!Cil.makeLocalVar} and friends.
+    Must not be used for setting vid: use {!set_vid} instead. *)
 
 (** Creates a (potentially recursive) composite type. The arguments are:
  * (1) a boolean indicating whether it is a struct or a union, (2) the name
  * (always non-empty), (3) a function that when given a representation of the
  * structure type constructs the type of the fields recursive type (the first
  * argument is only useful when some fields need to refer to the type of the
- * structure itself), and (4) a list of attributes to be associated with the
- * composite type. The resulting compinfo has the field "cdefined" only if
- * the list of fields is non-empty. *)
+ * structure itself), and (4) an optional list of attributes to be associated
+ * with the composite type, "None" means that the struct is incomplete.
+ *
+ * @since Frama-C+dev the 4th parameter is a function that returns an option.
+ **)
 val mkCompInfo: bool ->      (* whether it is a struct or a union *)
-               string -> (* name of the composite type; cannot be empty *)
-               ?norig:string -> (* original name of the composite type, empty when anonymous *)
-               (compinfo ->
-                  (string * typ * int option * attributes * location) list) ->
-               (* a function that when given a forward
-                  representation of the structure type constructs the type of
-                  the fields. The function can ignore this argument if not
-                  constructing a recursive type.  *)
-               attributes -> compinfo
+  string -> (* name of the composite type; cannot be empty *)
+  ?norig:string -> (* original name of the composite type, empty when anonymous *)
+  (compinfo ->
+   (string * typ * int option * attributes * location) list option) ->
+  (* a function that when given a forward
+     representation of the structure type constructs the type of
+     the fields. The function can ignore this argument if not
+     constructing a recursive type.  *)
+  attributes -> compinfo
 
 (** Makes a shallow copy of a {!Cil_types.compinfo} changing the name. It also
     copies the fields, and makes sure that the copied field points back to the
@@ -107,25 +109,25 @@ val copyCompInfo: ?fresh:bool -> compinfo -> string -> compinfo
 *)
 val make_logic_var_kind : string -> logic_var_kind -> logic_type -> logic_var
 
-(** Create a fresh logical variable giving its name and type. 
-    @deprecated Fluorine-20130401 You should use a specific 
+(** Create a fresh logical variable giving its name and type.
+    @deprecated Fluorine-20130401 You should use a specific
     make_logic_var_[kind] function below, or {! Cil.cvar_to_lvar}
 *)
 val make_logic_var : string -> logic_type -> logic_var
 
-(** Create a new global logic variable 
+(** Create a new global logic variable
     @since Fluorine-20130401 *)
 val make_logic_var_global: string -> logic_type -> logic_var
 
-(** Create a new formal logic variable 
+(** Create a new formal logic variable
     @since Fluorine-20130401 *)
 val make_logic_var_formal: string -> logic_type -> logic_var
 
-(** Create a new quantified logic variable 
+(** Create a new quantified logic variable
     @since Fluorine-20130401 *)
 val make_logic_var_quant: string -> logic_type -> logic_var
 
-(** Create a new local logic variable 
+(** Create a new local logic variable
     @since Fluorine-20130401 *)
 val make_logic_var_local: string -> logic_type -> logic_var
 
diff --git a/src/kernel_services/ast_queries/cil_datatype.ml b/src/kernel_services/ast_queries/cil_datatype.ml
index e512e92b3b9929177593d9f3f538b090db862236..82f5d57783837ad5cbfdb91000694700c0dd9ce7 100644
--- a/src/kernel_services/ast_queries/cil_datatype.ml
+++ b/src/kernel_services/ast_queries/cil_datatype.ml
@@ -467,9 +467,9 @@ and compare_array_sizes e1o e2o =
     match i1, i2 with
     | None, None -> (* inconclusive. do not return 0 *)
       !compare_exp_struct_eq e1 e2
-    | _ -> Extlib.opt_compare Integer.compare i1 i2
+    | _ -> Option.compare Integer.compare i1 i2
   in
-  Extlib.opt_compare compare_non_empty_size e1o e2o
+  Option.compare compare_non_empty_size e1o e2o
 
 and compare_type config t1 t2 =
   if t1 == t2 then 0
@@ -521,7 +521,7 @@ and compare_type config t1 t2 =
       index_typ a1 - index_typ a2
 
 and compare_arg_list  config l1 l2 =
-  Extlib.opt_compare
+  Option.compare
     (compare_list
        (fun (_n1, t1, l1) (_n2, t2, l2) ->
           (compare_chain (compare_type config) t1 t2
@@ -776,9 +776,8 @@ module Compinfo = struct
               corig_name = "";
               cname = "";
               ckey = -1;
-              cfields = [];
+              cfields = None;
               cattr = [];
-              cdefined = false;
               creferenced = false } ]
         let compare v1 v2 = Datatype.Int.compare v1.ckey v2.ckey
         let hash v = Hashtbl.hash v.ckey
@@ -804,6 +803,7 @@ module Fieldinfo = struct
                     List.fold_left
                       (fun acc loc ->
                          { fcomp = ci;
+                           forder = 0;
                            forig_name = "";
                            fname = "";
                            ftype = typ;
@@ -821,7 +821,7 @@ module Fieldinfo = struct
                  Typ.reprs)
             []
             Compinfo.reprs
-        let fid fi = fi.fcomp.ckey, fi.fname
+        let fid fi = fi.fcomp.ckey, fi.forder
         let compare f1 f2 = Extlib.compare_basic (fid f1) (fid f2)
         let hash f1 = Hashtbl.hash (fid f1)
         let equal f1 f2 = (fid f1) = (fid f2)
@@ -2304,23 +2304,26 @@ module Identified_predicate = struct
       end)
 end
 
-module Funbehavior =
-  Datatype.Make
-    (struct
-      include Datatype.Serializable_undefined
-      type t = funbehavior
-      let name = "Funbehavior"
-      let reprs =
-        [ {  b_name = "default!"; (* Cil.default_behavior_name *)
-             b_requires = Identified_predicate.reprs;
-             b_assumes = Identified_predicate.reprs;
-             b_post_cond =
-               List.map (fun x -> Normal, x) Identified_predicate.reprs;
-             b_assigns = WritesAny;
-             b_allocation = FreeAllocAny;
-             b_extended = []; } ]
-      let mem_project = Datatype.never_any_project
-    end)
+module Funbehavior = struct
+  let pretty_ref = ref (fun _ _ -> assert false)
+  include Datatype.Make
+      (struct
+        include Datatype.Serializable_undefined
+        type t = funbehavior
+        let name = "Funbehavior"
+        let reprs =
+          [ {  b_name = "default!"; (* Cil.default_behavior_name *)
+               b_requires = Identified_predicate.reprs;
+               b_assumes = Identified_predicate.reprs;
+               b_post_cond =
+                 List.map (fun x -> Normal, x) Identified_predicate.reprs;
+               b_assigns = WritesAny;
+               b_allocation = FreeAllocAny;
+               b_extended = []; } ]
+        let pretty fmt x = !pretty_ref fmt x
+        let mem_project = Datatype.never_any_project
+      end)
+end
 
 module Funspec = struct
   let pretty_ref = ref (fun _ _ -> assert false)
diff --git a/src/kernel_services/ast_queries/cil_datatype.mli b/src/kernel_services/ast_queries/cil_datatype.mli
index 22b09a997e1a07f6634c988cb473e13a54338339..3370462e56180d807ee10c44c8fc415b29a801eb 100644
--- a/src/kernel_services/ast_queries/cil_datatype.mli
+++ b/src/kernel_services/ast_queries/cil_datatype.mli
@@ -73,7 +73,7 @@ module Location: sig
   (** Pretty-print both location start and end, including file, line and
       character offset.
 
-      @since Frama-C+dev
+      @since 22.0-Titanium
    *)
   val pretty_debug: t Pretty_utils.formatter
 
@@ -85,7 +85,7 @@ module Location: sig
       starting position. Compares normalized filenames, lines and columns,
       but no absolute character offsets.
 
-      @since Frama-C+dev
+      @since 22.0-Titanium
    *)
   val equal_start_semantic : location -> location -> bool
 
@@ -253,7 +253,7 @@ module Code_annotation: sig
   val loc: t -> location option
 end
 
-module Funbehavior: S with type t = funbehavior
+module Funbehavior: S_with_pretty with type t = funbehavior
 
 module Funspec: S_with_pretty with type t = funspec
 
diff --git a/src/kernel_services/ast_queries/file.ml b/src/kernel_services/ast_queries/file.ml
index 82a77b054d1e30f9e9de1f9a2565b8d70303c2b7..22735f39ed53684ab41ee83f9e389a4857c4d50b 100644
--- a/src/kernel_services/ast_queries/file.ml
+++ b/src/kernel_services/ast_queries/file.ml
@@ -208,7 +208,7 @@ end = struct
       [ Ast.self;
         Ast.UntypedFiles.self;
         Cabshelper.Comments.self;
-        Cil.Frama_c_builtins.self ]
+        Cil_builtins.Frama_c_builtins.self ]
 
   let () =
     Ast.add_linked_state Cabshelper.Comments.self
@@ -537,7 +537,7 @@ let parse_cabs cpp_command_no_output = function
       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
+    let cpp_command, ppf, supported_cpp_arch_args = Option.get cpp_command_no_output in
     Kernel.feedback "Parsing %a (with preprocessing)"
       Datatype.Filepath.pretty f;
     if Sys.command cpp_command <> 0 then begin
@@ -1188,7 +1188,7 @@ let prepare_cil_file ast =
 let fill_built_ins () =
   if Cil.selfMachine_is_computed () then begin
     Kernel.debug "Machine is computed, just fill the built-ins";
-    Cil.init_builtins ();
+    Cil_builtins.init_builtins ();
   end else begin
     Kernel.debug "Machine is not computed, initialize everything";
     Cil.initCIL (Logic_builtin.init()) (get_machdep ());
@@ -1203,7 +1203,7 @@ let init_project_from_cil_file prj file =
       State_selection.full
       (State_selection.list_union
          (List.map State_selection.with_dependencies
-            [Cil.Builtin_functions.self;
+            [Cil_builtins.Builtin_functions.self;
              Ast.self;
              Files.pre_register_state]))
   in
@@ -1631,7 +1631,7 @@ let prepare_from_c_files () =
 let init_project_from_visitor ?(reorder=false) prj
     (vis:Visitor.frama_c_visitor) =
   if not (Visitor_behavior.is_copy vis#behavior)
-  || not (Project.equal prj (Extlib.the vis#project))
+  || not (Project.equal prj (Option.get vis#project))
   then
     Kernel.fatal
       "Visitor does not copy or does not operate on correct project.";
@@ -1685,7 +1685,7 @@ let init_from_cmdline () =
     let selection =
       State_selection.list_union
         (List.map State_selection.with_dependencies
-           [ Cil.Builtin_functions.self;
+           [ Cil_builtins.Builtin_functions.self;
              Logic_env.Logic_info.self;
              Logic_env.Logic_type_info.self;
              Logic_env.Logic_ctor_info.self;
diff --git a/src/kernel_services/ast_queries/file.mli b/src/kernel_services/ast_queries/file.mli
index 52c7f9b91f229c7bb42338e6e1ce544bb6e97993..0498ef145a6f1abd70ada90149e8b6a92cfd1e54 100644
--- a/src/kernel_services/ast_queries/file.mli
+++ b/src/kernel_services/ast_queries/file.mli
@@ -31,23 +31,23 @@ type cpp_opt_kind = Gnu | Not_gnu | Unknown
           names given on the command line, without normalization. *)
 type file =
   | NeedCPP of Filepath.Normalized.t * string * cpp_opt_kind
-      (** The first string is the filename of the [.c] to preprocess.
-          The second one is the preprocessor command ([filename.c -o
-          tempfilname.i] will be appended at the end).*)
+  (** The first string is the filename of the [.c] to preprocess.
+      The second one is the preprocessor command ([filename.c -o
+      tempfilname.i] will be appended at the end).*)
   | NoCPP of Filepath.Normalized.t
-      (** Already pre-processed file [.i] *)
+  (** Already pre-processed file [.i] *)
   | External of Filepath.Normalized.t * string
-      (** file that can be translated into a Cil AST through an external
-          function, together with the recognized suffix. *)
+  (** file that can be translated into a Cil AST through an external
+      function, together with the recognized suffix. *)
 
 include Datatype.S with type t = file
 
 val new_file_type:
   string -> (string -> Cil_types.file * Cabs.file) -> unit
-  (** [new_file_type suffix func funcname] registers a new type of files (with
-      corresponding suffix) as recognized by Frama-C through [func]. 
-      @plugin development guide
-   *)
+(** [new_file_type suffix func funcname] registers a new type of files (with
+    corresponding suffix) as recognized by Frama-C through [func].
+    @plugin development guide
+*)
 
 val new_machdep: string -> Cil_types.mach -> unit
 (** [new_machdep name module] registers a new machdep name as recognized by
@@ -61,152 +61,152 @@ val new_machdep: string -> Cil_types.mach -> unit
     @plugin development guide *)
 
 val machdep_macro: string -> string
- (** [machdep_macro machine] returns the name of a macro __FC_MACHDEP_XXX so
-     that the preprocessor can select std lib definition consistent with
-     the selected machdep. This function will emit a warning if [machine] is
-     not known by default by the kernel and return __FC_MACHDEP_MACHINE in that
-     case.
-     @since Magnesium-20151001 (exported in the API)
-  *)
+(** [machdep_macro machine] returns the name of a macro __FC_MACHDEP_XXX so
+    that the preprocessor can select std lib definition consistent with
+    the selected machdep. This function will emit a warning if [machine] is
+    not known by default by the kernel and return __FC_MACHDEP_MACHINE in that
+    case.
+    @since Magnesium-20151001 (exported in the API)
+*)
 
 val list_available_machdeps: unit -> string list
 (** [list_available_machdeps ()] gives the list of the names of available
     machdeps, starting with the ones added with new_machdep and ending with
     the list of default machdeps.
-    @since Frama-C+dev *)
-  
+    @since 22.0-Titanium *)
+
 type code_transformation_category
 (** type of registered code transformations
-   @since Neon-20140301 
+    @since Neon-20140301
 *)
 
 val register_code_transformation_category:
   string -> code_transformation_category
 (** Adds a new category of code transformation *)
 
-val add_code_transformation_before_cleanup: 
+val add_code_transformation_before_cleanup:
   ?deps:(module Parameter_sig.S) list ->
   ?before:code_transformation_category list ->
   ?after:code_transformation_category list ->
   code_transformation_category -> (Cil_types.file -> unit) -> unit
-  (** [add_code_transformation_before_cleanup name hook] 
-      adds an hook in the corresponding category
-      that will be called during the normalization of a linked
-      file, before clean up and removal of temps and unused declarations.
-      If this transformation involves changing statements of a function [f],
-      [f] must be flagged with {!File.must_recompute_cfg}.
-      The optional [before] (resp [after]) categories indicates that current
-      transformation must be executed before (resp after)
-      the corresponding ones, if they exist. In case of dependencies cycle,
-      an arbitrary order will be chosen for the transformations involved in
-      the cycle.
-      The optional [deps] argument gives the list of options whose change
-      (e.g. after a [-then]) will trigger the transformation over the already
-      computed AST. If several transformations are triggered by the same
-      option, their relative order is preserved.
-
-      At this level, globals and ACSL annotations have not been registered.
-     
-      @since Neon-20140301 
-      @plugin development guide *)
+(** [add_code_transformation_before_cleanup name hook]
+    adds an hook in the corresponding category
+    that will be called during the normalization of a linked
+    file, before clean up and removal of temps and unused declarations.
+    If this transformation involves changing statements of a function [f],
+    [f] must be flagged with {!File.must_recompute_cfg}.
+    The optional [before] (resp [after]) categories indicates that current
+    transformation must be executed before (resp after)
+    the corresponding ones, if they exist. In case of dependencies cycle,
+    an arbitrary order will be chosen for the transformations involved in
+    the cycle.
+    The optional [deps] argument gives the list of options whose change
+    (e.g. after a [-then]) will trigger the transformation over the already
+    computed AST. If several transformations are triggered by the same
+    option, their relative order is preserved.
+
+    At this level, globals and ACSL annotations have not been registered.
+
+    @since Neon-20140301
+    @plugin development guide *)
 
 val add_code_transformation_after_cleanup:
   ?deps:(module Parameter_sig.S) list ->
   ?before:code_transformation_category list ->
   ?after:code_transformation_category list ->
   code_transformation_category -> (Cil_types.file -> unit) -> unit
-  (** Same as above, but the hook is applied after clean up.
-      At this level, globals and ACSL annotations have been registered. If
-      the hook adds some new globals or annotations, it must take care of
-      adding them in the appropriate tables.
-      Note that it is the responsibility of the hook to use
-      {!Ast.mark_as_changed} or {!Ast.mark_as_grown} whenever it is the case.
-      @since Neon-20140301 
-      @plugin development guide *)
+(** Same as above, but the hook is applied after clean up.
+    At this level, globals and ACSL annotations have been registered. If
+    the hook adds some new globals or annotations, it must take care of
+    adding them in the appropriate tables.
+    Note that it is the responsibility of the hook to use
+    {!Ast.mark_as_changed} or {!Ast.mark_as_grown} whenever it is the case.
+    @since Neon-20140301
+    @plugin development guide *)
 
 val constfold: code_transformation_category
 (** category for syntactic constfolding (done after cleanup)
     @since Silicon-20161101 *)
 
 val must_recompute_cfg: Cil_types.fundec -> unit
-  (** [must_recompute_cfg f] must be called by code transformation hooks
-      when they modify statements in function [f]. This will trigger a 
-      recomputation of the cfg of [f] after the transformation.
-      @since Neon-20140301 
-      @plugin development guide *)
+(** [must_recompute_cfg f] must be called by code transformation hooks
+    when they modify statements in function [f]. This will trigger a
+    recomputation of the cfg of [f] after the transformation.
+    @since Neon-20140301
+    @plugin development guide *)
 
 val get_suffixes: unit -> string list
-  (** @return the list of accepted suffixes of input source files
-      @since Boron-20100401 *)
+(** @return the list of accepted suffixes of input source files
+    @since Boron-20100401 *)
 
 val get_name: t -> string
-  (** File name (not normalized). *)
+(** File name (not normalized). *)
 
 val get_preprocessor_command: unit -> string * cpp_opt_kind
-  (** Return the preprocessor command to use. *)
+(** Return the preprocessor command to use. *)
 
 val pre_register: t -> unit
-  (** Register some file as source file before command-line files *)
+(** Register some file as source file before command-line files *)
 
 val get_all: unit -> t list
-  (** Return the list of toplevel files. *)
+(** Return the list of toplevel files. *)
 
 val from_filename: ?cpp:string -> Datatype.Filepath.t -> t
-  (** Build a file from its name. The optional argument is the preprocessor
-      command. Default is [!get_preprocessor_command ()]. *)
+(** Build a file from its name. The optional argument is the preprocessor
+    command. Default is [!get_preprocessor_command ()]. *)
 
 (* ************************************************************************* *)
 (** {2 Initializers} *)
 (* ************************************************************************* *)
 
 val prepare_from_c_files: unit -> unit
-  (** Initialize the AST of the current project according to the current
-      filename list.
-      @raise File_types.Bad_Initialization if called more than once. *)
+(** Initialize the AST of the current project according to the current
+    filename list.
+    @raise File_types.Bad_Initialization if called more than once. *)
 
 val init_from_c_files: t list -> unit
-  (** Initialize the cil file representation of the current project.
-      Should be called at most once per project.
-      @raise File_types.Bad_Initialization if called more than once.
-      @plugin development guide *)
+(** Initialize the cil file representation of the current project.
+    Should be called at most once per project.
+    @raise File_types.Bad_Initialization if called more than once.
+    @plugin development guide *)
 
 val init_project_from_cil_file: Project.t -> Cil_types.file -> unit
-  (** Initialize the cil file representation with the given file for the
-      given project from the current one.
-      Should be called at most once per project.
-      @raise File_types.Bad_Initialization if called more than once.
-      @plugin development guide *)
+(** Initialize the cil file representation with the given file for the
+    given project from the current one.
+    Should be called at most once per project.
+    @raise File_types.Bad_Initialization if called more than once.
+    @plugin development guide *)
 
 val init_project_from_visitor:
   ?reorder:bool -> Project.t -> Visitor.frama_c_visitor -> unit
-  (** [init_project_from_visitor prj vis] initialize the cil file
-      representation of [prj]. [prj] must be essentially empty: it can have
-      some options set, but not an existing cil file; [proj] is filled using
-      [vis], which must be a copy visitor that puts its results in [prj].
-      if [reorder] is [true] (default is [false]) the new AST in [prj] 
-      will be reordered.
-      @since Oxygen-20120901
-      @modify Fluorine-20130401 added reorder optional argument
-      @plugin development guide
-   *)
+(** [init_project_from_visitor prj vis] initialize the cil file
+    representation of [prj]. [prj] must be essentially empty: it can have
+    some options set, but not an existing cil file; [proj] is filled using
+    [vis], which must be a copy visitor that puts its results in [prj].
+    if [reorder] is [true] (default is [false]) the new AST in [prj]
+    will be reordered.
+    @since Oxygen-20120901
+    @modify Fluorine-20130401 added reorder optional argument
+    @plugin development guide
+*)
 
 val create_project_from_visitor:
   ?reorder:bool -> ?last:bool ->
   string ->
   (Project.t -> Visitor.frama_c_visitor) ->
   Project.t
-  (** Return a new project with a new cil file representation by visiting the
-      file of the current project. If [reorder] is [true], the globals in the
-      AST of the new project are reordered (default is [false]). If [last] is
-      [true] (by default), remember than the returned project is the last
-      created one.
-      The visitor is responsible to avoid sharing between old file and new
-      file (i.e. it should use {!Cil.copy_visit} at some point).
-      @raise File_types.Bad_Initialization if called more than once.
-      @since Beryllium-20090601-beta1
-      @modify Fluorine-20130401 added [reorder] optional argument
-      @modify Sodium-20150201 added [last] optional argument
-      @plugin development guide *)
+(** Return a new project with a new cil file representation by visiting the
+    file of the current project. If [reorder] is [true], the globals in the
+    AST of the new project are reordered (default is [false]). If [last] is
+    [true] (by default), remember than the returned project is the last
+    created one.
+    The visitor is responsible to avoid sharing between old file and new
+    file (i.e. it should use {!Cil.copy_visit} at some point).
+    @raise File_types.Bad_Initialization if called more than once.
+    @since Beryllium-20090601-beta1
+    @modify Fluorine-20130401 added [reorder] optional argument
+    @modify Sodium-20150201 added [last] optional argument
+    @plugin development guide *)
 
 val create_rebuilt_project_from_visitor:
   ?reorder:bool -> ?last:bool -> ?preprocess:bool ->
@@ -221,7 +221,7 @@ val create_rebuilt_project_from_visitor:
     NOT preprocessed by default.
 
     @raise File_types.Bad_Initialization if called more than once.
-    @since Nitrogen-20111001 
+    @since Nitrogen-20111001
     @modify Fluorine-20130401 added reorder optional argument
 *)
 
@@ -236,10 +236,10 @@ val init_from_cmdline: unit -> unit
     @plugin development guide *)
 
 val reorder_ast: unit -> unit
- (** reorder globals so that all uses of an identifier are preceded by its
-     declaration. This may introduce new declarations in the AST.
-     @since Oxygen-20120901
- *)
+(** reorder globals so that all uses of an identifier are preceded by its
+    declaration. This may introduce new declarations in the AST.
+    @since Oxygen-20120901
+*)
 
 val reorder_custom_ast: Cil_types.file -> unit
 (** @since Neon-20140301 *)
@@ -250,14 +250,14 @@ val reorder_custom_ast: Cil_types.file -> unit
 
 val pretty_machdep :
   ?fmt:Format.formatter -> ?machdep:Cil_types.mach -> unit -> unit
-  (** Prints the associated [machdep], or the current one in current project
-      by default. Default output formatter is [Log.print_on_output]. *)
+(** Prints the associated [machdep], or the current one in current project
+    by default. Default output formatter is [Log.print_on_output]. *)
 
 val pretty_ast : ?prj:Project.t -> ?fmt:Format.formatter -> unit -> unit
-  (** Print the project CIL file on the given Formatter.
-      The default project is the current one.
-      The default formatter is [Kernel.CodeOutput.get_fmt ()].
-      @raise File_types.Bad_Initialization if the file is not initialized. *)
+(** Print the project CIL file on the given Formatter.
+    The default project is the current one.
+    The default formatter is [Kernel.CodeOutput.get_fmt ()].
+    @raise File_types.Bad_Initialization if the file is not initialized. *)
 
 (*
 Local Variables:
diff --git a/src/kernel_services/ast_queries/filecheck.ml b/src/kernel_services/ast_queries/filecheck.ml
index 18ad6e32241cc8410cdefaaa9c94e4724dcff09b..d3d0c5d68d33eaa27461efbbbb0f5261d8c1ea6d 100644
--- a/src/kernel_services/ast_queries/filecheck.ml
+++ b/src/kernel_services/ast_queries/filecheck.ml
@@ -246,7 +246,7 @@ module Base_checker = struct
         self#push_behavior_stack ();
         (* Initial AST does not have kf *)
         if is_normalized then begin
-          let kf = Extlib.the self#current_kf in
+          let kf = Option.get self#current_kf in
           if not (Kernel_function.is_definition kf) then
             check_abort
               "Kernel function %a is supposed to be a prototype, but it has a body"
@@ -307,7 +307,7 @@ module Base_checker = struct
            | Some _ -> (* can only happen in normalized mode. *)
              check_abort
                "Function %a does not have a return statement in its body"
-               Kernel_function.pretty (Extlib.the self#current_kf));
+               Kernel_function.pretty (Option.get self#current_kf));
           let check_one_stmt stmt _ =
             let check_cfg_edge stmt' =
               try
@@ -409,7 +409,7 @@ module Base_checker = struct
                 self#add_spec_behavior_names spec
               | _ -> assert false (* filter should prevent anything else. *))
             contracts;
-          let kf = Extlib.the self#current_kf in
+          let kf = Option.get self#current_kf in
           let s',kf' =
             try
               Kernel_function.find_from_sid s.sid
@@ -495,12 +495,12 @@ module Base_checker = struct
              | None ->
                check_abort
                  "Found a second return statement in body of function %a"
-                 Kernel_function.pretty (Extlib.the self#current_kf)
+                 Kernel_function.pretty (Option.get self#current_kf)
              | Some s' when s != s' ->
                check_abort
                  "Function %a is supposed to have as return statement %d:@\n%a@\n\
                   Found in its body statement %d:@\n%a@\n"
-                 Kernel_function.pretty (Extlib.the self#current_kf)
+                 Kernel_function.pretty (Option.get self#current_kf)
                  s'.sid Printer.pp_stmt s'
                  s.sid Printer.pp_stmt s
              | Some _ -> return_stmt <- None
@@ -512,7 +512,7 @@ module Base_checker = struct
         let prefix fmt =
           Format.fprintf fmt "Local variable %a(%d) in function %a"
             Printer.pp_varinfo v v.vid
-            Printer.pp_varinfo (Extlib.the self#current_func).svar
+            Printer.pp_varinfo (Option.get self#current_func).svar
         in
         if v.vglob then check_abort "%t is marked as global" prefix;
         if v.vformal then check_abort "%t is marked as formal" prefix;
@@ -529,7 +529,7 @@ module Base_checker = struct
           Format.fprintf fmt
             "Local variable %a(%d) in function %a"
             Printer.pp_varinfo v v.vid
-            Printer.pp_varinfo (Extlib.the self#current_func).svar
+            Printer.pp_varinfo (Option.get self#current_func).svar
         in
         if not v.vglob then
           check_abort
@@ -897,7 +897,9 @@ module Base_checker = struct
         Compinfo.Hashtbl.add known_compinfos c c;
         Kernel.debug
           ~dkey:Kernel.dkey_check "Adding fields for type %s(%d)" c.cname c.ckey;
-        List.iter (fun x -> Fieldinfo.Hashtbl.add known_fields x x) c.cfields;
+        List.iter
+          (fun x -> Fieldinfo.Hashtbl.add known_fields x x)
+          (Option.value ~default:[] c.cfields);
         Cil.DoChildren
 
       method! vfieldinfo f =
@@ -1359,8 +1361,8 @@ let check_ast ?is_normalized ?(ast = Ast.get()) what =
   let module M = (val !current_checker : Extensible_checker) in
   Kernel.debug ~dkey:Kernel.dkey_check
     "Checking integrity of %s (%snormalized):@\n%a"
-    what (if Extlib.opt_conv true is_normalized then "" else "not ")
-    (if Extlib.opt_conv true is_normalized
+    what (if Option.value ~default:true is_normalized then "" else "not ")
+    (if Option.value ~default:true is_normalized
      then Printer.pp_file else Cil_printer.pp_file)
     ast;
   Cil.visitCilFileSameGlobals
diff --git a/src/kernel_services/ast_queries/json_compilation_database.ml b/src/kernel_services/ast_queries/json_compilation_database.ml
index eb529f3c23932565e139de9604c6d29b95bc7f10..b887b1c358aebafc60096757824855a74850f76e 100644
--- a/src/kernel_services/ast_queries/json_compilation_database.ml
+++ b/src/kernel_services/ast_queries/json_compilation_database.ml
@@ -134,7 +134,7 @@ let quote_define_argument arg = Format.sprintf "%S" arg
 let parse_entry jcdb_dir r =
   let open Yojson.Basic.Util in
   let filename = r |> member "file" |> to_string in
-  let dirname  = r |> member "directory" |> to_string_option |> Extlib.opt_conv jcdb_dir in
+  let dirname  = r |> member "directory" |> to_string_option |> Option.value ~default:jcdb_dir in
   let dirname =
     if Filename.is_relative dirname then Filename.concat jcdb_dir dirname
     else dirname
diff --git a/src/kernel_services/ast_queries/json_compilation_database.mli b/src/kernel_services/ast_queries/json_compilation_database.mli
index 5b9f18f1b087c5dc1b185eb10404de4584f0f49d..299d0ea5472228d1c37f1480c4755900bd649585 100644
--- a/src/kernel_services/ast_queries/json_compilation_database.mli
+++ b/src/kernel_services/ast_queries/json_compilation_database.mli
@@ -27,6 +27,6 @@ val get_flags : Datatype.Filepath.t -> string list
 
 (** [has_entry f] returns true iff [f] has an entry in the JSON compilation
     database. Must only be called if a JCDB file has been specified.
-    @since Frama-C+dev
+    @since 22.0-Titanium
 *)
 val has_entry : Datatype.Filepath.t -> bool
diff --git a/src/kernel_services/ast_queries/logic_const.ml b/src/kernel_services/ast_queries/logic_const.ml
index 861d64099492abe32e3cc6026ce0eee7beba3c1f..e53a0d86219e1603a6eba5af8d01d0e6d3b51ae9 100644
--- a/src/kernel_services/ast_queries/logic_const.ml
+++ b/src/kernel_services/ast_queries/logic_const.ml
@@ -98,7 +98,7 @@ let refresh_behavior b =
 let refresh_spec s =
   { spec_behavior = List.map refresh_behavior s.spec_behavior;
     spec_variant = s.spec_variant;
-    spec_terminates = Extlib.opt_map refresh_predicate s.spec_terminates;
+    spec_terminates = Option.map refresh_predicate s.spec_terminates;
     spec_complete_behaviors = s.spec_complete_behaviors;
     spec_disjoint_behaviors = s.spec_disjoint_behaviors;
   }
diff --git a/src/kernel_services/ast_queries/logic_const.mli b/src/kernel_services/ast_queries/logic_const.mli
index 9079513585804f3b4d54d1c4052eb7b30f392675..2c2ebd716d21ef10694c88d9c0e412285ceafe91 100644
--- a/src/kernel_services/ast_queries/logic_const.mli
+++ b/src/kernel_services/ast_queries/logic_const.mli
@@ -51,12 +51,12 @@ val refresh_spec: funspec -> funspec
     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
+    @since 22.0-Titanium
 *)
 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
+    @modify 22.0-Titanium add [only_check] optional parameter
  *)
 val new_predicate: ?only_check:bool -> predicate -> identified_predicate
 
diff --git a/src/kernel_services/ast_queries/logic_env.ml b/src/kernel_services/ast_queries/logic_env.ml
index dde299d846e9cc6cf30d75365c928ca4e4b006cd..18381986562fe7c5de69f1f331691a93e229792b 100644
--- a/src/kernel_services/ast_queries/logic_env.ml
+++ b/src/kernel_services/ast_queries/logic_env.ml
@@ -29,23 +29,32 @@ module Extensions = struct
   let ref_is_extension = ref (fun _ -> assert false)
   let ref_category = ref (fun _ -> assert false)
   let ref_preprocess = ref (fun _ -> assert false)
+  let ref_is_extension_block = ref (fun _ -> assert false)
+  let ref_preprocess_block = ref (fun _ -> assert false)
 
-  let set_extension_handler ~category ~is_extension ~preprocess =
+  let set_extension_handler
+      ~category ~is_extension ~preprocess ~is_extension_block ~preprocess_block =
     assert (not !initialized) ;
     ref_is_extension := is_extension ;
     ref_category := category ;
     ref_preprocess := preprocess ;
+    ref_is_extension_block := is_extension_block;
+    ref_preprocess_block := preprocess_block;
     initialized := true ;
     ()
 
   let is_extension s = !ref_is_extension s
+  let is_extension_block s = !ref_is_extension_block s
   let category s = !ref_category s
   let preprocess s = !ref_preprocess s
+  let preprocess_block s = !ref_preprocess_block s
 end
 let set_extension_handler = Extensions.set_extension_handler
 let is_extension = Extensions.is_extension
+let is_extension_block = Extensions.is_extension_block
 let extension_category = Extensions.category
 let preprocess_extension = Extensions.preprocess
+let preprocess_extension_block = Extensions.preprocess_block
 
 module CurrentLoc = Cil_const.CurrentLoc
 
diff --git a/src/kernel_services/ast_queries/logic_env.mli b/src/kernel_services/ast_queries/logic_env.mli
index 407ac539994274396bfb7ae3a489e1615fa4037e..954eb3645d1e73961b39b7cb1e0c11a9ab2cb0ff 100644
--- a/src/kernel_services/ast_queries/logic_env.mli
+++ b/src/kernel_services/ast_queries/logic_env.mli
@@ -29,12 +29,16 @@ open Cil_types
 (** {2 registered ACSL extensions } *)
 
 val is_extension: string -> bool
+val is_extension_block: string -> bool
 
 val extension_category: string -> ext_category
 
 val preprocess_extension:
   string -> Logic_ptree.lexpr list -> Logic_ptree.lexpr list
 
+val preprocess_extension_block:
+  string -> string * Logic_ptree.extended_decl list -> string * Logic_ptree.extended_decl list
+
 (** {2 Global Tables} *)
 module Logic_info: State_builder.Hashtbl
   with type key = string and type data = Cil_types.logic_info list
@@ -208,6 +212,10 @@ val set_extension_handler:
   category:(string -> ext_category) ->
   is_extension:(string -> bool) ->
   preprocess:(string -> Logic_ptree.lexpr list -> Logic_ptree.lexpr list) ->
+  is_extension_block:(string -> bool) ->
+  preprocess_block:
+    (string -> string * Logic_ptree.extended_decl list ->
+     string * Logic_ptree.extended_decl list) ->
   unit
 (** Used to setup references related to the handling of ACSL extensions.
     If your name is not [Acsl_extension], do not call this
diff --git a/src/kernel_services/ast_queries/logic_typing.ml b/src/kernel_services/ast_queries/logic_typing.ml
index 86129401b2122b383b0ef430311205fb8317452d..9cc3ddbd61863c0bf1cc3354dbc8222987f1217d 100644
--- a/src/kernel_services/ast_queries/logic_typing.ml
+++ b/src/kernel_services/ast_queries/logic_typing.ml
@@ -327,7 +327,7 @@ module Lenv = struct
   }
 
   let string_of_current_label env =
-    Extlib.opt_bind (
+    Option.bind env.current_logic_label (
       function
       | FormalLabel _ -> None
       | BuiltinLabel Init -> Some "Init"
@@ -345,7 +345,6 @@ module Lenv = struct
          | None -> None
          | Some (Label (lab,_,_)) -> Some lab
          | Some _ -> None))
-      env.current_logic_label
 
   let fresh_var env name kind typ =
     let name =
@@ -528,11 +527,13 @@ module Extensions = struct
   let initialized = ref false
   let ref_is_extension = ref (fun _ -> assert false)
   let ref_typer = ref (fun _ _ _ _ -> assert false)
+  let ref_typer_block = ref (fun _ _ _ _ -> assert false)
 
-  let set_handler ~is_extension ~typer =
+  let set_handler ~is_extension ~typer ~typer_block =
     assert (not !initialized) ;
     ref_is_extension := is_extension ;
     ref_typer := typer ;
+    ref_typer_block := typer_block;
     initialized := true
 
   let is_extension name = !ref_is_extension name
@@ -540,6 +541,9 @@ module Extensions = struct
   let typer name ~typing_context:typing_context ~loc =
     !ref_typer name typing_context loc
 
+  let typer_block name ~typing_context:typing_context ~loc =
+    !ref_typer_block name typing_context loc
+
   (* For deprecated functions *)
   let ref_deprecated_handler = ref (fun _ _ _ _  -> assert false)
 
@@ -551,6 +555,8 @@ module Extensions = struct
     !ref_deprecated_handler name category status typer
 end
 let set_extension_handler = Extensions.set_handler
+let get_typer = Extensions.typer
+let get_typer_block = Extensions.typer_block
 
 (* Deprecated ACSL extensions functions *)
 let set_deprecated_extension_handler =
@@ -791,7 +797,9 @@ struct
     with Not_found ->
       (match Cil.unrollType ty with
        | TComp(comp,_,_) ->
-         List.exists (fun x -> x.fname = f) comp.cfields
+         List.exists
+           (fun x -> x.fname = f)
+           (Option.value ~default:[] comp.cfields)
        | _ -> false)
 
   let plain_type_of_c_field loc f ty =
@@ -885,6 +893,36 @@ struct
     | Ltype _ | Linteger | Lreal | Lvar _ | Larrow _ ->
       C.error loc "not a C type"
 
+  let parseInt loc s =
+    let explode s =
+      let l = ref [] in
+      String.iter (fun c -> l:=Int64.of_int (Char.code c) :: !l) s;
+      List.rev !l
+    in
+    match String.get s 0 with
+    | 'L' -> (* L'wide_char' *)
+      let content = String.sub s 2 (String.length s - 3) in
+      let tokens = explode content in
+      let value = Cil.reduce_multichar Cil.theMachine.Cil.wcharType tokens
+      in
+      tinteger_s64 ~loc value
+    | '\'' -> (* 'char' *)
+      let content = String.sub s 1 (String.length s - 2) in
+      let tokens = explode content in
+      let value,_= Cil.interpret_character_constant tokens in
+      term ~loc (TConst (constant_to_lconstant value)) Linteger
+    | _ -> Cil.parseIntLogic ~loc s
+
+  let find_logic_label loc env l =
+    try Lenv.find_logic_label l env
+    with Not_found ->
+    (* look for a C label *)
+    try
+      let lab = C.find_label l in
+      StmtLabel lab
+    with Not_found ->
+      C.error loc "logic label `%s' not found" l
+
   let logic_type ctxt loc env t =
     (* force calls to go through ctxt *)
     let module [@warning "-60"] C = struct end in
@@ -897,7 +935,12 @@ struct
     | LTarray (ty,length) ->
       let size = match length with
         | ASnone -> None
-        | ASinteger s -> Some (parseIntExp ~loc s)
+        | ASinteger s ->
+          let t = parseInt loc s in
+          (match t.term_node with
+           | TConst lconst ->
+             Some (new_exp ~loc (Const (lconstant_to_constant lconst)))
+           | _ -> Kernel.fatal ~loc "integer literal not parsed as constant")
         | ASidentifier s ->
           let size = ctxt.type_term ctxt env
               {lexpr_node=PLvar(s);lexpr_loc=loc} in
@@ -1765,7 +1808,7 @@ struct
 
 
   let conditional_conversion loc env rel t1 t2 =
-    let is_rel = Extlib.has_some rel in
+    let is_rel = Option.is_some rel in
     (* a comparison is mainly a function of type 'a -> 'a -> Bool/Prop.
        performs the needed unifications on both sides.*)
     let var = fresh_type_var "cmp" in
@@ -1799,7 +1842,7 @@ struct
         else if isArithmeticType ty1 && isArithmeticType ty2 then begin
           if is_same_type lty1 lty2 then begin
             if is_rel then begin
-              let rel = Extlib.the rel in
+              let rel = Option.get rel in
               let kind =
                 match Cil.unrollType ty1 with
                 | TFloat (FFloat,_) -> "float"
@@ -1900,36 +1943,6 @@ struct
 
   (* Typing terms *)
 
-  let parseInt loc s =
-    let explode s =
-      let l = ref [] in
-      String.iter (fun c -> l:=Int64.of_int (Char.code c) :: !l) s;
-      List.rev !l
-    in
-    match String.get s 0 with
-    | 'L' -> (* L'wide_char' *)
-      let content = String.sub s 2 (String.length s - 3) in
-      let tokens = explode content in
-      let value = Cil.reduce_multichar Cil.theMachine.Cil.wcharType tokens
-      in
-      tinteger_s64 ~loc value
-    | '\'' -> (* 'char' *)
-      let content = String.sub s 1 (String.length s - 2) in
-      let tokens = explode content in
-      let value,_= Cil.interpret_character_constant tokens in
-      term ~loc (TConst (constant_to_lconstant value)) Linteger
-    | _ -> Cil.parseIntLogic ~loc s
-
-  let find_logic_label loc env l =
-    try Lenv.find_logic_label l env
-    with Not_found ->
-    (* look for a C label *)
-    try
-      let lab = C.find_label l in
-      StmtLabel lab
-    with Not_found ->
-      C.error loc "logic label `%s' not found" l
-
   let find_old_label loc env =
     try Lenv.find_logic_label "Old" env
     with Not_found ->
@@ -2308,14 +2321,22 @@ struct
       accept_array: bool;
       accept_models: bool;
       accept_func_ptr: bool;
+      accept_addrs: bool;
+      accept_const: bool;
     }
 
   let lval_addressable_mode =
     { accept_empty = false; accept_formal = true; accept_array = true;
-      accept_models = false; accept_func_ptr = true; }
+      accept_models = false; accept_func_ptr = true; accept_addrs = false;
+      accept_const = true; }
   let lval_assignable_mode =
     { accept_empty = true; accept_formal = true; accept_array = false;
-      accept_models = true; accept_func_ptr = false; }
+      accept_models = true; accept_func_ptr = false; accept_addrs = false;
+      accept_const = false; }
+  let lval_assigns_dependency_mode =
+    { accept_empty = true; accept_formal = true; accept_array = false;
+      accept_models = true; accept_func_ptr = false; accept_addrs = true;
+      accept_const = true; }
 
   let is_fct_ptr lv = Cil.isLogicFunctionType (Cil.typeOfTermLval lv)
 
@@ -2334,14 +2355,25 @@ struct
                else
                  false (* pure logic variable, at least as long as
                           model variables are not supported. *)
-             | Some v -> not v.vformal || m.accept_formal
+             | Some v ->
+               (not v.vformal || m.accept_formal) &&
+               (not (Cil.isConstType v.vtype) || m.accept_const)
            end
          | TResult _ -> m.accept_models
          | _ -> true) &&
         (match snd (Logic_utils.remove_term_offset loff) with
          | TModel _ -> m.accept_models
+         | TField(f, _) -> not (Cil.isConstType f.ftype) || m.accept_const
          | _ -> true)
-      | TAddrOf lv -> is_fct_ptr lv && m.accept_func_ptr
+      | TAddrOf lv when is_fct_ptr lv -> m.accept_func_ptr
+      | TAddrOf lv | TStartOf lv ->
+        m.accept_addrs &&
+        (* note that we assume that 'lv' is adressable. *)
+        begin match lv with
+          | TVar { lv_origin = Some _ }, _ | TMem _, _ -> true
+          | TVar { lv_origin = None }, _ -> false
+          | _ -> false
+        end
       | Tif (_,t1,t2) -> aux t1 && aux t2
 
       | Tunion l | Tinter l -> List.for_all aux l
@@ -2351,7 +2383,7 @@ struct
 
       | Trange _ | TConst _ | TSizeOf _ | TSizeOfE _ | TSizeOfStr _ | TAlignOf _
       | TAlignOfE _ | TUnOp (_,_) | TBinOp (_,_,_) | TCastE (_,_)
-      | TStartOf _ | Tlambda (_,_) | TDataCons (_,_) | Tbase_addr (_,_)
+      | Tlambda (_,_) | TDataCons (_,_) | Tbase_addr (_,_)
       | Toffset (_,_) | Tblock_length (_,_) | Tnull | Tapp _
       | TUpdate (_,_,_) | Ttypeof _ | Ttype _ ->
         false
@@ -2675,7 +2707,8 @@ struct
       TUnOp (BNot, t), logic_arithmetic_promotion t.term_type
     | PLunop (Uminus, t) ->
       let t = type_num_term ctxt env t in
-      TUnOp (Neg, t), logic_arithmetic_promotion t.term_type
+      let ty = logic_arithmetic_promotion t.term_type in
+      TUnOp (Neg, mk_cast t ty), ty
     | PLunop (Ustar, t) ->
       check_current_label loc env;
       (* memory access need a current label to have some semantics *)
@@ -2950,7 +2983,7 @@ struct
       if is_set_type t.term_type then begin
         ctxt.error loc "sets of sets are not supported yet"
       end else begin
-        let pred = Extlib.opt_map (predicate env) pred in
+        let pred = Option.map (predicate env) pred in
         Tcomprehension(t,quants,pred), (make_set_type t.term_type)
       end
     | PLempty
@@ -3109,6 +3142,27 @@ struct
     in
     lift_set check_lval t
 
+  and term_from f t =
+    let check_from t =
+      match t.term_node with
+      | TAddrOf lv when is_fun_ptr t.term_type ->
+        f lv
+          { t with
+            term_type = type_of_pointed t.term_type;
+            term_node = TLval lv }
+      | TLval lv
+      | TLogic_coerce(_,{term_node = TLval lv })
+      | Tat({term_node = TLval lv},_) -> f lv t
+      | TStartOf lv
+      | Tat ({term_node = TStartOf lv}, _)
+      | TAddrOf lv
+      | Tat ({term_node = TAddrOf lv}, _) ->
+        f lv t
+      | _ -> C.error t.term_loc "not a dependency value: %a"
+               Cil_printer.pp_term t
+    in
+    lift_set check_from t
+
   and type_logic_app env loc f labels ttl =
     (* support for overloading *)
     let infos =
@@ -3116,7 +3170,7 @@ struct
       with Not_found ->
         C.find_all_logic_functions f in
     match infos with
-    | [] -> C.error loc "unbound function %s" f
+    | [] -> C.error loc "unbound logic function %s" f
     | [info] ->
       begin
         let labels = List.map (find_logic_label loc env) labels in
@@ -3249,10 +3303,11 @@ struct
       (other_prms @ prms), p
     | _ -> [], ctxt.type_predicate ctxt env p0
 
-  let term_lval_assignable ctxt ~accept_formal env t =
+  let term_lval_assignable ctxt ~accept_formal ~accept_const env t =
     let module [@warning "-60"] C = struct end in
     let t = ctxt.type_term ctxt env t in
-    if not (check_lval_kind { lval_assignable_mode with accept_formal } t) then
+    let mode = { lval_assignable_mode with accept_formal ; accept_const } in
+    if not (check_lval_kind mode t) then
       ctxt.error t.term_loc "not an assignable left value: %a"
         Cil_printer.pp_term t;
     lift_set (term_lval (fun _ t -> t)) t
@@ -3448,18 +3503,26 @@ struct
     | PLcomprehension _ | PLset _ | PLunion _ | PLinter _ | PLempty ->
       ctxt.error loc "expecting a predicate and not tsets"
 
+  let term_as_dependency ctxt env t =
+    let module [@warning "-60"] C = struct end in
+    let t = ctxt.type_term ctxt env t in
+    if not (check_lval_kind lval_assigns_dependency_mode t) then
+      ctxt.error t.term_loc "not a valid dependency: %a"
+        Cil_printer.pp_term t ;
+    lift_set (term_from (fun _ t -> t)) t
+
   let type_from ctxt ~accept_formal env (l,d) =
     let module [@warning "-60"] C = struct end in
     (* Yannick: [assigns *\at(\result,Post)] should be allowed *)
     let tl =
-      term_lval_assignable ctxt ~accept_formal env l
+      term_lval_assignable ctxt ~accept_formal ~accept_const:false env l
     in
     let tl = Logic_const.new_identified_term tl in
     match d with
       FromAny -> (tl,Cil_types.FromAny)
     | From f ->
       let tf =
-        List.map (term_lval_assignable ctxt ~accept_formal:true env) f
+        List.map (term_as_dependency ctxt env) f
       in
       let tf =
         List.map
@@ -3549,18 +3612,6 @@ struct
       let accept t = accept_int t || accept_var t in
       Cil_types.Widen_hints (List.map (term_accept accept) l)
 
-  let type_annot loc ti =
-    let env = append_here_label (append_init_label (Lenv.empty())) in
-    let this_type = plain_logic_type loc env ti.this_type in
-    let v = Cil_const.make_logic_var_formal ti.this_name this_type in
-    let env = Lenv.add_var ti.this_name v env in
-    let body = predicate env ti.inv in
-    let infos = Cil_const.make_logic_info ti.inv_name in
-    infos.l_profile <- [v];
-    infos.l_labels <- [Logic_const.here_label];
-    infos.l_body <- LBpred body;
-    add_logic_function loc infos; infos
-
   let model_annot loc ti =
     let env = Lenv.empty() in
     let model_for_type =
@@ -3710,9 +3761,9 @@ struct
             loc "%s clause isn't allowed into statement contract" clause;
         x
     in
-    let v = Extlib.opt_map (type_variant env)
+    let v = Option.map (type_variant env)
         (none_for_stmt_contract "decreases" s.spec_variant) in
-    let t = Extlib.opt_map (id_predicate env)
+    let t = Option.map (id_predicate env)
         (none_for_stmt_contract "terminates" s.spec_terminates) in
     let my_names = check_unique_behavior_names loc [] b in
     let bnames = old_behaviors @ my_names in
@@ -3923,7 +3974,7 @@ struct
     in let rt_vars = ref Datatype.String.Set.empty
     in let prm_vars = ref Datatype.String.Set.empty
     in
-    ignore(Extlib.opt_map (Cil.visitCilLogicType (obj rt_vars)) return_type);
+    ignore(Option.map (Cil.visitCilLogicType (obj rt_vars)) return_type);
     List.iter
       (fun v -> ignore (Cil.visitCilLogicType (obj prm_vars) v.lv_type)) p;
     if not (Datatype.String.Set.subset !rt_vars !prm_vars) then
@@ -3985,6 +4036,15 @@ struct
     add_logic_function loc info;
     env,info
 
+  let type_annot loc ti =
+    let p = ti.this_type, ti.this_name in
+    (* Note: Logic_decl registers the logic function *)
+    let env, info = logic_decl loc ti.inv_name [] [] [p] in
+    let body = predicate env ti.inv in
+    info.l_body <- LBpred body;
+    update_info_wrt_default_label info;
+    info
+
   let type_datacons loc env type_info (name,params) =
     (try
        let info = C.find_logic_ctor name in
@@ -4116,7 +4176,7 @@ struct
         }
       in
       add_logic_type loc my_info;
-      let tdef = Extlib.opt_map (typedef loc env my_info) def in
+      let tdef = Option.map (typedef loc env my_info) def in
       if is_cyclic_typedef s tdef then
         C.error loc "Definition of %s is cyclic" s;
       my_info.lt_def <- tdef;
@@ -4147,12 +4207,17 @@ struct
       Logic_env.Lemmas.add x def;
       def
     | LDinvariant (s, e) ->
-      let env = append_here_label (append_init_label (Lenv.empty())) in
-      let p = predicate env e in
+      let labels,env = annot_env loc [] [] in
       let li = Cil_const.make_logic_info s in
-      li.l_labels <- [Logic_const.here_label];
+      let p = predicate env e in
+      let labels = match !Lenv.default_label with
+        | None -> labels
+        | Some lab -> [lab]
+      in
+      li.l_labels <- labels;
       li.l_body <- LBpred p;
       add_logic_function loc li;
+      update_info_wrt_default_label li;
       Dinvariant (li,loc)
     | LDtype_annot l ->
       Dtype_annot (type_annot loc l,loc)
@@ -4162,8 +4227,10 @@ struct
       let env = Lenv.empty () in
       let ctxt = base_ctxt env in
       let tsets =
+        let accept_formal = false in
+        let accept_const  = true in
         List.map
-          (term_lval_assignable ctxt ~accept_formal:false env) tsets
+          (term_lval_assignable ctxt ~accept_formal ~accept_const env) tsets
       in
       let checks_tsets_type fct ctyp =
         List.iter
@@ -4240,11 +4307,18 @@ struct
       let rvi_opt = get_volatile_fct checks_reads_fct rd_opt in
       let wvi_opt = get_volatile_fct checks_writes_fct wr_opt in
       Dvolatile (tsets, rvi_opt, wvi_opt, [], loc)
-    | LDextended (kind, content) ->
+    | LDextended (Ext_lexpr(kind, content)) ->
       let typing_context = base_ctxt (Lenv.empty ()) in
       let status,tcontent = Extensions.typer kind ~typing_context ~loc content in
       let textended = Logic_const.new_acsl_extension kind loc status tcontent in
       Dextended (textended, [], loc)
+    | LDextended (Ext_extension (kind, name, content)) ->
+      let typing_context = base_ctxt (Lenv.empty ()) in
+      let status,tcontent =
+        Extensions.typer_block kind ~typing_context ~loc (name,content)
+      in
+      let textended = Logic_const.new_acsl_extension kind loc status tcontent in
+      Dextended (textended, [], loc)
 
   let annot a =
     start_transaction ();
diff --git a/src/kernel_services/ast_queries/logic_typing.mli b/src/kernel_services/ast_queries/logic_typing.mli
index 3c4c2975d97d17cb65670013dba178c55868ccf5..e1c613d9e297cac4e1fdc8a18ab8a31489934bf3 100644
--- a/src/kernel_services/ast_queries/logic_typing.mli
+++ b/src/kernel_services/ast_queries/logic_typing.mli
@@ -389,12 +389,29 @@ val set_extension_handler:
   is_extension:(string -> bool) ->
   typer:(string -> typing_context -> location -> Logic_ptree.lexpr list ->
          (bool * acsl_extension_kind)) ->
+  typer_block:(string -> typing_context ->
+               Filepath.position * Filepath.position ->
+               string * Logic_ptree.extended_decl list ->
+               bool * Cil_types.acsl_extension_kind) ->
   unit
 (** Used to setup references related to the handling of ACSL extensions.
     If your name is not [Acsl_extension], do not call this
     @since 21.0-Scandium
 *)
 
+val get_typer :
+  string ->
+  typing_context:typing_context ->
+  loc:Filepath.position * Filepath.position ->
+  Logic_ptree.lexpr list -> bool * Cil_types.acsl_extension_kind
+
+val get_typer_block:
+  string ->
+  typing_context:typing_context ->
+  loc:Logic_ptree.location ->
+  string * Logic_ptree.extended_decl list ->
+  bool * Cil_types.acsl_extension_kind
+
 (**/**)
 val set_deprecated_extension_handler:
   handler:(string -> ext_category -> bool ->
diff --git a/src/kernel_services/ast_queries/logic_utils.ml b/src/kernel_services/ast_queries/logic_utils.ml
index 7fd192b397eb99793a3374823b60c8b13786f505..cf3a8f2a53fd2aa8ad7e50fc782804643f2c374d 100644
--- a/src/kernel_services/ast_queries/logic_utils.ml
+++ b/src/kernel_services/ast_queries/logic_utils.ml
@@ -354,8 +354,8 @@ and numeric_bound ltyp = function
 
 let is_zero_comparable t =
   match unroll_type t.term_type with
-  | Ctype (TInt _ | TFloat _ | TPtr _ | TArray _ | TFun _) -> true
-  | Ctype _ -> false
+  | Ctype (TInt _ | TFloat _ | TPtr _ | TArray _ | TFun _ | TEnum _) -> true
+  | Ctype (TVoid _ | TNamed _ | TComp _ | TBuiltin_va_list _) -> false
   | Linteger | Lreal -> true
   | Ltype ({lt_name},[]) -> lt_name = Utf8_logic.boolean
   | Ltype _ -> false
@@ -373,7 +373,7 @@ let scalar_term_conversion conversion t =
     let ctrue = Logic_env.Logic_ctor_info.find "\\true" in
     conversion ~loc true t (term ~loc (TDataCons(ctrue,[])) boolean_type) in
   match unroll_type t.term_type with
-  | Ctype (TInt _) -> int_conversion t
+  | Ctype (TInt _ | TEnum _) -> int_conversion t
   | Ctype (TFloat _) as ltyp -> real_conversion ~ltyp t
   | Ctype (TPtr _) -> ptr_conversion t
   | Ctype (TArray _) -> ptr_conversion t
@@ -385,7 +385,7 @@ let scalar_term_conversion conversion t =
   | Ltype ({lt_name = name},[]) when name = Utf8_logic.boolean ->
     bool_conversion t
   | Ltype _ | Lvar _ | Larrow _
-  | Ctype (TVoid _ | TNamed _ | TComp _ | TEnum _ | TBuiltin_va_list _)
+  | Ctype (TVoid _ | TNamed _ | TComp _ | TBuiltin_va_list _)
     -> Kernel.fatal
          "Cannot convert a term of type %a"
          Cil_printer.pp_logic_type t.term_type
@@ -417,7 +417,8 @@ let float_builtin prefix fkind =
   let name = match fkind with
     | FFloat -> Printf.sprintf "\\%s_float" prefix
     | FDouble -> Printf.sprintf "\\%s_double" prefix
-    | FLongDouble -> Kernel.not_yet_implemented "Builtins for long double type"
+    | FLongDouble ->
+      Kernel.not_yet_implemented ~current:true "Builtins for long double type"
   in match Logic_env.find_all_logic_functions name with
   | [ lf ] -> Some lf
   | _ -> Kernel.fatal "Missing or ambiguous builtin %S" name
@@ -1186,7 +1187,7 @@ let is_same_pragma p1 p2 =
   | Impact_pragma p1, Impact_pragma p2 -> is_same_impact_pragma p1 p2
   | (Loop_pragma _ | Slice_pragma _ | Impact_pragma _), _ -> false
 
-let is_same_extension x1 x2 =
+let rec is_same_extension x1 x2 =
   Datatype.String.equal x1.ext_name x2.ext_name &&
   (x1.ext_has_status = x2.ext_has_status) &&
   match x1.ext_kind, x2.ext_kind with
@@ -1195,7 +1196,9 @@ let is_same_extension x1 x2 =
     is_same_list is_same_term t1 t2
   | Ext_preds p1, Ext_preds p2 ->
     is_same_list is_same_predicate p1 p2
-  | (Ext_id _ | Ext_preds _ | Ext_terms _), _ -> false
+  | Ext_annot (id1, a1), Ext_annot (id2, a2) ->
+    is_same_string id1 id2 && is_same_list is_same_extension a1 a2
+  | (Ext_id _ | Ext_preds _ | Ext_terms _ | Ext_annot _ ), _ -> false
 
 let is_same_code_annotation (ca1:code_annotation) (ca2:code_annotation) =
   match ca1.annot_content, ca2.annot_content with
@@ -2575,8 +2578,8 @@ and bitsLogicOffset ltyp off : Integer.t * Integer.t =
         (* Force the computation of the fields fsize_in_bits and
            foffset_in_bits *)
         ignore (Cil.bitsOffset typ (Field (f, NoOffset)));
-        let size = Integer.of_int (Extlib.the f.fsize_in_bits) in
-        let offset_f = Integer.of_int (Extlib.the f.foffset_in_bits) in
+        let size = Integer.of_int (Option.get f.fsize_in_bits) in
+        let offset_f = Integer.of_int (Option.get f.foffset_in_bits) in
         loopOff f.ftype size (Integer.add start offset_f) off
       end
       else
@@ -2608,7 +2611,7 @@ let rec fold_itv f b e acc =
 let find_init_by_index init i =
   let same_offset (off, _) = match off with
     | Index (i', NoOffset) ->
-      Integer.equal i (Extlib.the (Cil.isInteger i'))
+      Integer.equal i (Option.get (Cil.isInteger i'))
     | _ -> false
   in
   snd (List.find same_offset init)
diff --git a/src/kernel_services/ast_queries/logic_utils.mli b/src/kernel_services/ast_queries/logic_utils.mli
index b1e4074364ff4216e5558b9c7b449678405f7df5..ae2b76fdbd2762248cd4dbcb801571c71b641951 100644
--- a/src/kernel_services/ast_queries/logic_utils.mli
+++ b/src/kernel_services/ast_queries/logic_utils.mli
@@ -315,12 +315,12 @@ val add_attribute_glob_annot:
 (** {2 Contracts } *)
 
 (** [true] if the behavior has only an assigns clause.
-    @since Frama-C+dev
+    @since 22.0-Titanium
 *)
 val behavior_has_only_assigns: behavior -> bool
 
 (** [true] if the only non-empty fields of the contract are assigns clauses
-    @since Frama-C+dev
+    @since 22.0-Titanium
 *)
 val funspec_has_only_assigns: funspec -> bool
 
diff --git a/src/kernel_services/ast_transformations/filter.ml b/src/kernel_services/ast_transformations/filter.ml
index d36b2cf000fee0b47bff693060a297d72a290f9f..15ed737f258de617c9d4fed302381f640325299d 100644
--- a/src/kernel_services/ast_transformations/filter.ml
+++ b/src/kernel_services/ast_transformations/filter.ml
@@ -354,7 +354,7 @@ end = struct
         in ok
       | _ -> false
 
-    method private get_finfo () = Extlib.the fi
+    method private get_finfo () = Option.get fi
 
     method private add_stmt_keep stmt =
       keep_stmts <- Stmt.Set.add stmt keep_stmts
@@ -432,10 +432,10 @@ end = struct
       new_locals
 
     method! vcode_annot v =
-      Extlib.may Cil.CurrentLoc.set (Cil_datatype.Code_annotation.loc v);
+      Option.iter Cil.CurrentLoc.set (Cil_datatype.Code_annotation.loc v);
       let stmt =
         Visitor_behavior.Get_orig.stmt
-          self#behavior (Extlib.the self#current_stmt)
+          self#behavior (Option.get self#current_stmt)
       in
       debug "[annotation] stmt %d : %a @."
         stmt.sid Printer.pp_code_annotation v;
@@ -712,7 +712,7 @@ end = struct
       Varinfo.Hashtbl.clear local_visible;
       Varinfo.Hashtbl.add spec_table f.svar
         (visitCilFunspec (self:>Cil.cilVisitor)
-           (Annotations.funspec ~populate:false (Extlib.the self#current_kf)));
+           (Annotations.funspec ~populate:false (Option.get self#current_kf)));
       SkipChildren
 
     method private visit_pred p =
@@ -776,7 +776,7 @@ end = struct
 
     method! vspec spec =
       debug "@[[vspec] for %a @\n@]@."
-        Kernel_function.pretty (Extlib.the self#current_kf);
+        Kernel_function.pretty (Option.get self#current_kf);
       let finfo = self#get_finfo () in
       let b = Cil.visitCilBehaviors (self:>Cil.cilVisitor) spec.spec_behavior in
       let b = List.filter (not $ Cil.is_empty_behavior) b in
@@ -808,7 +808,7 @@ end = struct
                    *)
 
     method private build_proto is_first finfo loc =
-      let kf = Extlib.the self#current_kf in
+      let kf = Option.get self#current_kf in
       fi <- Some finfo;
       let new_var = ff_var fun_vars kf finfo in
       (* we're building a prototype. *)
@@ -888,9 +888,9 @@ end = struct
       end
 
     method private compute_fct_prototypes (_fct_var,loc) =
-      let finfo_list = Info.fct_info pinfo (Extlib.the self#current_kf) in
+      let finfo_list = Info.fct_info pinfo (Option.get self#current_kf) in
       debug "@[[compute_fct_prototypes] for %a (x%d)@\n@]@."
-        Kernel_function.pretty (Extlib.the self#current_kf)
+        Kernel_function.pretty (Option.get self#current_kf)
         (List.length finfo_list);
       let build_cil_proto is_first finfo =
         self#build_proto is_first finfo loc
@@ -904,7 +904,7 @@ end = struct
 
     method private compute_fct_definitions f loc =
       let fvar = f.Cil_types.svar in
-      let kf = Extlib.the self#current_kf in
+      let kf = Option.get self#current_kf in
       let finfo_list = Info.fct_info pinfo kf in
       debug "@[[compute_fct_definitions] for %a (x%d)@\n@]@."
         Kernel_function.pretty kf (List.length finfo_list);
@@ -927,7 +927,7 @@ end = struct
           Varinfo.Hashtbl.add fi_table new_fct_var finfo;
           debug "@[[build_cil_fct] -> %s@\n@]@."
             (Info.fct_name
-               (Kernel_function.get_vi (Extlib.the self#current_kf)) finfo);
+               (Kernel_function.get_vi (Option.get self#current_kf)) finfo);
           let action () =
             Queue.add
               (fun () ->
diff --git a/src/kernel_services/ast_transformations/inline.ml b/src/kernel_services/ast_transformations/inline.ml
index 6c5bbf9293e348132b99047bd4dd3ab23efc70e8..5d6c4d4b1ffcaf0d283c5e605ed12468ff3cbf80 100644
--- a/src/kernel_services/ast_transformations/inline.ml
+++ b/src/kernel_services/ast_transformations/inline.ml
@@ -231,7 +231,7 @@ let inliner functions_to_inline = object (self)
                 let scope = Stack.top block_stack in
                 let v =
                   Cil.makeLocalVar
-                    (Extlib.the self#current_func)
+                    (Option.get self#current_func)
                     ~scope ~temp:true "__inline_tmp" rt
                 in
                 true, Some (Cil.var v), args
@@ -241,7 +241,7 @@ let inliner functions_to_inline = object (self)
               let scope = Stack.top block_stack in
               let v =
                 Cil.makeLocalVar
-                  (Extlib.the self#current_func)
+                  (Option.get self#current_func)
                   ~scope ~temp:true "__inline_tmp" t
               in
               true, Some (Cil.var v), args
@@ -258,7 +258,7 @@ let inliner functions_to_inline = object (self)
           let block =
             inline_call
               (Cil_datatype.Stmt.loc stmt)
-              (Extlib.the self#current_kf)
+              (Option.get self#current_kf)
               callee return_aux args
           in
           let fun_name = Kernel_function.get_name callee in
diff --git a/src/kernel_services/cmdline_parameters/cmdline.ml b/src/kernel_services/cmdline_parameters/cmdline.ml
index 24d333957fdef3f060d7cf605429eee20f0bfcad..81f3dcac2c96b84d05858919374dc90e820992a1 100644
--- a/src/kernel_services/cmdline_parameters/cmdline.ml
+++ b/src/kernel_services/cmdline_parameters/cmdline.ml
@@ -136,14 +136,18 @@ let protect = function
         (long_plugin_name p)
         (additional_info ())
         request_crash_report
-  | Log.FeatureRequest(p, m) ->
-      let name = long_plugin_name p in
-      Printf.sprintf
-        "%s aborted: unimplemented feature.%s\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
+  | Log.FeatureRequest(s, p, m) ->
+    let name = long_plugin_name p in
+    let pp_oloc fmt = function
+      | None -> Format.fprintf fmt ""
+      | Some loc -> Format.fprintf fmt "%a: " Filepath.pp_pos loc
+    in
+    Format.asprintf
+      "%a%s aborted: unimplemented feature.%s\n\
+       You may send a feature request at \
+       https://git.frama-c.com/pub/frama-c/issues with:\n\
+       '[%s] %s'."
+      pp_oloc s name (additional_info ()) name m
   | e ->
       let bt = get_backtrace () in
       Printf.sprintf
diff --git a/src/kernel_services/cmdline_parameters/cmdline.mli b/src/kernel_services/cmdline_parameters/cmdline.mli
index 5c3c75356662ba186d2b0f8971194a4e7698e821..bd8f6ea17b037c9f234d5ffff2928b5a5a622594 100644
--- a/src/kernel_services/cmdline_parameters/cmdline.mli
+++ b/src/kernel_services/cmdline_parameters/cmdline.mli
@@ -319,7 +319,7 @@ val add_aliases:
     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
-    @modify Frama-c+dev add [visible] and [deprecated] arguments. *)
+    @modify 22.0-Titanium add [visible] and [deprecated] arguments. *)
 
 val replace_option_setting: 
   string -> plugin:string -> group:Group.t -> option_setting -> unit
@@ -396,7 +396,7 @@ val permissive: bool
       unknown option names and invalid values for some options
       (e.g. non-existent function names).
 
-      @since Frama-C+dev *)
+      @since 22.0-Titanium *)
 
 val last_project_created_by_copy: (unit -> string option) ref
 
diff --git a/src/kernel_services/cmdline_parameters/parameter_builder.ml b/src/kernel_services/cmdline_parameters/parameter_builder.ml
index 80881489f15e2a298c73e0f316f432f1a9c5ec6b..2db615f3fd6c3860a9179899283522c8747c0d7c 100644
--- a/src/kernel_services/cmdline_parameters/parameter_builder.ml
+++ b/src/kernel_services/cmdline_parameters/parameter_builder.ml
@@ -878,7 +878,7 @@ struct
          since an element may be added, then removed later (e.g +h,-@all):
          that has to be accepted *)
       if check then begin
-        Extlib.may parse_error unparsable;
+        Option.iter parse_error unparsable;
         C.iter check_possible_value col
       end;
       col
@@ -1522,7 +1522,7 @@ struct
              let rec pp_custom_list = function
                | [] -> ()
                | v :: l ->
-                 Extlib.may
+                 Option.iter
                    (fun v -> Format.fprintf fmt ":%s" v)
                    (V.to_string ~key (Some v));
                  pp_custom_list l
diff --git a/src/kernel_services/cmdline_parameters/parameter_customize.mli b/src/kernel_services/cmdline_parameters/parameter_customize.mli
index 49e2f1433d6c778fb4c6d10de01a67bb6eb23032..b1360bc21d3727d51e469d5b3b4cbd09fc0aa4ee 100644
--- a/src/kernel_services/cmdline_parameters/parameter_customize.mli
+++ b/src/kernel_services/cmdline_parameters/parameter_customize.mli
@@ -129,7 +129,7 @@ val is_reconfigurable: unit -> unit
     only parameters corresponding to options registered at the
     {!Cmdline.Configuring} stage are reconfigurable.
     @since Nitrogen-20111001
-    @modify Frama-C+dev [do_iterate] renamed to [is_reconfigurable]
+    @modify 22.0-Titanium [do_iterate] renamed to [is_reconfigurable]
 *)
 
 val is_not_reconfigurable: unit -> unit
@@ -137,7 +137,7 @@ val is_not_reconfigurable: unit -> unit
     parameters corresponding to options registered at the
     {!Cmdline.Configuring} stage are reconfigurable.
     @since Nitrogen-20111001
-    @modify Frama-C+dev [do_iterate] renamed to [is_reconfigurable]
+    @modify 22.0-Titanium [do_iterate] renamed to [is_reconfigurable]
  *)
 
 val no_category: unit -> unit
diff --git a/src/kernel_services/cmdline_parameters/parameter_sig.ml b/src/kernel_services/cmdline_parameters/parameter_sig.ml
index 89a439f71b324967ac4c0775bf8eaf4587a86af8..d72b00e501427c26a9ac0839577841468a24994d 100644
--- a/src/kernel_services/cmdline_parameters/parameter_sig.ml
+++ b/src/kernel_services/cmdline_parameters/parameter_sig.ml
@@ -185,7 +185,7 @@ module type S_no_parameter = sig
       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. *)
+      @modify 22.0-Titanium add [visible] and [deprecated] arguments. *)
 
   (**/**)
   val is_set: unit -> bool
diff --git a/src/kernel_services/parsetree/logic_ptree.ml b/src/kernel_services/parsetree/logic_ptree.ml
index bff3332bb8dff7075b6aedd448b7caecbfb70469..ccc7a1d24afbf114b911e6d3a33ab74748ec6e48 100644
--- a/src/kernel_services/parsetree/logic_ptree.ml
+++ b/src/kernel_services/parsetree/logic_ptree.ml
@@ -248,7 +248,8 @@ and decl_node =
   | LDmodel_annot of model_annot    (** model field. *)
   | LDvolatile of lexpr list * (string option * string option)
       (** volatile clause read/write. *)
-  | LDextended of extension (** extended global annotation. *)
+  | LDextended of global_extension (** extended global annotation. *)
+
 
 (** dependencies of an assigned location. *)
 and deps =
@@ -273,6 +274,15 @@ and allocation =
 (** variant of a loop or a recursive function. *)
 and variant = lexpr * string option
 
+and global_extension =
+  | Ext_lexpr of string * lexpr list
+  | Ext_extension of string * string * extended_decl list
+
+and extended_decl = {
+  extended_node : global_extension;
+  extended_loc : location
+}
+
 (** Behavior in a specification. This type shares the name of its constructors
     with {!Cil_types.behavior}. *)
 type behavior = {
diff --git a/src/kernel_services/plugin_entry_points/db.ml b/src/kernel_services/plugin_entry_points/db.ml
index f602bf07dcbe541966723f30099c0e4fd8d7cce7..339744070b2ce9c7b7f58482accc4c2b03a2ca7b 100644
--- a/src/kernel_services/plugin_entry_points/db.ml
+++ b/src/kernel_services/plugin_entry_points/db.ml
@@ -211,7 +211,7 @@ module Value = struct
       (fun l ->
          if
            not
-             (Extlib.opt_equal ListArgs.equal (Some l) (FunArgs.get_option ()))
+             (Option.equal ListArgs.equal (Some l) (FunArgs.get_option ()))
          then begin
            !initial_state_changed ();
            FunArgs.set l
@@ -241,7 +241,7 @@ module Value = struct
         Db.Value.globals_set_initial_state\" : _ -> unit)"
       (Datatype.func Cvalue.Model.ty Datatype.unit)
       (fun state ->
-         if not (Extlib.opt_equal Cvalue.Model.equal
+         if not (Option.equal Cvalue.Model.equal
                    (Some state)
                    (VGlobals.get_option ()))
          then begin
diff --git a/src/kernel_services/plugin_entry_points/dynamic.mli b/src/kernel_services/plugin_entry_points/dynamic.mli
index 8099335c8596c10b619b2f5d477e122ac424d662..ad7545741368c917c4f8159bfd0d232043ff0cf6 100644
--- a/src/kernel_services/plugin_entry_points/dynamic.mli
+++ b/src/kernel_services/plugin_entry_points/dynamic.mli
@@ -149,9 +149,14 @@ end
 (** {2 Dynamically Loaded Modules} *)
 (* ************************************************************************* *)
 
-val load_module: string -> unit
+(** loads a list of Findlib packages
+    @since Frama-C+dev
+*)
+val load_packages: string list -> unit
+
 (** Load the module specification. See -load-module option.
     @modify Magnesium-20151001 new API. *)
+val load_module: string -> unit
 
 val load_plugin: string -> unit
 
diff --git a/src/kernel_services/plugin_entry_points/emitter.mli b/src/kernel_services/plugin_entry_points/emitter.mli
index f8a43053a482103f3fb645402705e47431d997e3..c3f30a88bc5bec315f82b5d91565a199c55d66ae 100644
--- a/src/kernel_services/plugin_entry_points/emitter.mli
+++ b/src/kernel_services/plugin_entry_points/emitter.mli
@@ -71,7 +71,7 @@ val orphan: t
       emitter that is no longer available (in particular, annotations loaded
       from a state that was generated from a different set of plug-ins than
       in current session). Should not be used outside of the kernel.
-      @since Frama-C+dev
+      @since 22.0-Titanium
   *)
 
 (** Usable emitters are the ones which can really emit something. *)
diff --git a/src/kernel_services/plugin_entry_points/journal.ml b/src/kernel_services/plugin_entry_points/journal.ml
index 9294d088ba416ff36858c5a21e8ca47ee4ffc9a8..82363e74f33c0db44609cc9f077bc286b2e32a0a 100644
--- a/src/kernel_services/plugin_entry_points/journal.ml
+++ b/src/kernel_services/plugin_entry_points/journal.ml
@@ -403,7 +403,7 @@ let catch_exn f_acc is_dyn comment ret_ty exn =
      So don't use it in OCaml code. *)
   let comment fmt =
     Format.fprintf fmt "@[<hv 2>exception %s@;raised on: @]%t" s_exn
-      (fun fmt -> Extlib.may (fun f -> f fmt) comment)
+      (fun fmt -> Option.iter (fun f -> f fmt) comment)
   in
   let print fmt =
     (* open a new box for the sentence *)
diff --git a/src/kernel_services/plugin_entry_points/kernel.ml b/src/kernel_services/plugin_entry_points/kernel.ml
index 43793cb8ddfba1753101b04a03fe18db16cbdf6a..03f0474be625500323e970a08dd98981ffb5537c 100644
--- a/src/kernel_services/plugin_entry_points/kernel.ml
+++ b/src/kernel_services/plugin_entry_points/kernel.ml
@@ -24,7 +24,6 @@
 (** {2 Kernel as an almost standard plug-in} *)
 (* ************************************************************************* *)
 
-module CamlString = String
 module FcPlugin = Plugin
 
 let () = Plugin.register_kernel ()
@@ -185,6 +184,8 @@ let wkey_no_proto = register_warn_category "typing:no-proto"
 
 let wkey_missing_spec = register_warn_category "annot:missing-spec"
 
+let wkey_multi_from = register_warn_category "annot:multi-from"
+
 let wkey_decimal_float = register_warn_category "parser:decimal-float"
 let () = set_warn_status wkey_decimal_float Log.Wonce
 
@@ -249,13 +250,6 @@ module String
       include X
     end)
 
-module String_set(X: Input_with_arg) =
-  P.String_set
-    (struct
-      let () = Parameter_customize.set_module_name X.module_name
-      include X
-    end)
-
 module String_list(X: Input_with_arg) =
   P.String_list
     (struct
@@ -604,16 +598,50 @@ module Time =
 let () = Parameter_customize.set_group messages
 let () = Parameter_customize.do_not_projectify ()
 module SymbolicPath =
-  String_set (* TODO: to be replaced by an hashtbl *)
+  Filepath_map
     (struct
       let option_name = "-add-symbolic-path"
       let module_name = "SymbolicPath"
       let arg_name = "name_1:path_1,...,name_n:path_n"
+      let existence = Filepath.Indifferent
+      let file_kind = "directory"
       let help =
-        "When displaying file locations, replace (absolute) path by the \
+        "When displaying file locations, replace (absolute) path with the \
          corresponding symbolic name"
     end)
 
+let () =
+  SymbolicPath.add_update_hook
+    (fun _old map ->
+       (* keep module [Filepath] synchronized with [SymbolicPath] *)
+       Filepath.reset_symbolic_dirs ();
+       Datatype.Filepath.Map.iter
+         (fun n p -> Filepath.add_symbolic_dir p (n :> string))
+         map)
+
+(* [SymbolicPath] is better to be not projectified,
+   but must be saved: use a fake state for saving it without projectifying it *)
+module SymbolicPathFakeState =
+  State_builder.Register
+    (Datatype.Unit)
+    (struct
+      type t = unit
+      let create () = ()
+      let clear () = ()
+      let get () = ()
+      let set () = ()
+      let clear_some_projects _f () = false
+    end)
+    (struct
+      let name = "SymbolicPathFakeState"
+      let unique_name = name
+      let dependencies = []
+    end)
+
+let () =
+  SymbolicPathFakeState.howto_marshal
+    (fun () -> SymbolicPath.get ())
+    (fun paths -> SymbolicPath.set paths)
 
 (* ************************************************************************* *)
 (** {2 Input / Output Source Code} *)
@@ -710,22 +738,6 @@ module CodeOutput = struct
 
 end
 
-let add_path s =
-  try
-    let n = CamlString.index s ':' in
-    let name = CamlString.sub s 0 n in
-    let path = CamlString.sub s (n+1) (CamlString.length s - (n+1)) in
-    Filepath.add_symbolic_dir name path
-  with Not_found ->
-    warning "%s is not a valid option argument for -add-symbolic-path. \
-             It will be ignored" s
-
-let () =
-  SymbolicPath.add_set_hook
-    (fun o n ->
-       let d = Datatype.String.Set.diff n o in
-       Datatype.String.Set.iter add_path d)
-
 let () = Parameter_customize.set_group inout_source
 let () = Parameter_customize.do_not_projectify ()
 module FloatNormal =
@@ -929,11 +941,15 @@ module Machdep =
     (struct
       let module_name = "Machdep"
       let option_name = "-machdep"
-      let default = "x86_32"
+      let default =
+        try Sys.getenv "FRAMAC_MACHDEP"
+        with Not_found -> "x86_64"
       let arg_name = "machine"
       let help =
         "use <machine> as the current machine dependent configuration. \
-         See \"-machdep help\" for a list"
+         See \"-machdep help\" for a list. The environment variable \
+         FRAMAC_MACHDEP can be used to override the default value. The command \
+         line parameter still has priority over the default value"
     end)
 
 let () = Parameter_customize.set_group parsing
diff --git a/src/kernel_services/plugin_entry_points/kernel.mli b/src/kernel_services/plugin_entry_points/kernel.mli
index c81f3efefe7163adf572bb7ff3f34d0f35e8d635..7bc32e34f8dab6d63026eb7f62aa7b3f4c49bf72 100644
--- a/src/kernel_services/plugin_entry_points/kernel.mli
+++ b/src/kernel_services/plugin_entry_points/kernel.mli
@@ -175,6 +175,8 @@ val wkey_no_proto: warn_category
 
 val wkey_missing_spec: warn_category
 
+val wkey_multi_from: warn_category
+
 val wkey_decimal_float: warn_category
 
 val wkey_acsl_extension: warn_category
@@ -240,7 +242,7 @@ module AutocompleteHelp: Parameter_sig.String_set
 
 module PrintConfigJson: Parameter_sig.Bool
 (** Behavior of option "-print-config-json"
-    @since Frama-C+dev *)
+    @since 22.0-Titanium *)
 
 (* ************************************************************************* *)
 (** {2 Output Messages} *)
@@ -304,8 +306,9 @@ module CodeOutput : sig
 end
 
 (** Behavior of option "-add-symbolic-path"
-    @since Neon-20140301 *)
-module SymbolicPath: Parameter_sig.String_set
+    @since Neon-20140301
+    @modify Frama-C+dev inversed argument order (now uses path:name) *)
+module SymbolicPath: Parameter_sig.Filepath_map with type value = string
 
 module FloatNormal: Parameter_sig.Bool
 (** Behavior of option "-float-normal" *)
diff --git a/src/kernel_services/plugin_entry_points/log.ml b/src/kernel_services/plugin_entry_points/log.ml
index aae66eac586ef30524b4a062ecc16adb150dd63e..9c1c0bcf1af53ad6f303062c4e6140c7f332d773 100644
--- a/src/kernel_services/plugin_entry_points/log.ml
+++ b/src/kernel_services/plugin_entry_points/log.ml
@@ -49,7 +49,7 @@ let kernel_label_name = "kernel"
 (* --- Exception Management                                               --- *)
 (* -------------------------------------------------------------------------- *)
 
-exception FeatureRequest of string * string
+exception FeatureRequest of Filepath.position option * string * string
 exception AbortError of string (* plug-in *)
 exception AbortFatal of string (* plug-in *)
 
@@ -519,7 +519,7 @@ let logwithfinal finally channel
                  let e = channel.emitters.(nth_kind kind) in
                  if echo && e.echo then
                    do_echo channel.terminal event ;
-                 Extlib.may (do_fire event) emitwith;
+                 Option.iter (do_fire event) emitwith;
                  if fire && not !locked_listeners then
                    begin
                      try
@@ -813,7 +813,8 @@ sig
   val fatal   : ('a,'b) pretty_aborter
   val verify  : bool -> ('a,bool) pretty_aborter
 
-  val not_yet_implemented : ('a,formatter,unit,'b) format4 -> 'a
+  val not_yet_implemented : ?current:bool -> ?source:Filepath.position ->
+    ('a,formatter,unit,'b) format4 -> 'a
   val deprecated : string -> now:string -> ('a -> 'b) -> 'a -> 'b
 
   val with_result  : (event option -> 'b) -> ('a,'b) pretty_aborter
@@ -953,7 +954,7 @@ struct
     List.rev
       (Category_trie.fold
          (fun cat status l  ->
-            (merge_category cat, Extlib.opt_conv Wactive status) :: l)
+            (merge_category cat, Option.value ~default:Wactive status) :: l)
          !warn_categories [])
 
   let is_warn_category s =
@@ -1203,12 +1204,13 @@ struct
     let em = channel.emitters.(nth_kind kd) in
     em.listeners <- em.listeners @ [f]
 
-  let not_yet_implemented text =
+  let not_yet_implemented ?(current=false) ?source text =
     let buffer = Buffer.create 80 in
+    let source = get_source current source in
     let finally fmt =
       Format.pp_print_flush fmt ();
       let msg = Buffer.contents buffer in
-      raise (FeatureRequest(channel.plugin,msg)) in
+      raise (FeatureRequest(source,channel.plugin,msg)) in
     let fmt = Format.formatter_of_buffer buffer in
     Format.kfprintf finally fmt text
 
diff --git a/src/kernel_services/plugin_entry_points/log.mli b/src/kernel_services/plugin_entry_points/log.mli
index a01c5b99e605d977136ca4867624ab02c8df0a68..20ffa81b0f5f76cdb498477f32d8262fd9e2b966 100644
--- a/src/kernel_services/plugin_entry_points/log.mli
+++ b/src/kernel_services/plugin_entry_points/log.mli
@@ -82,10 +82,13 @@ exception AbortFatal of string
     name of the plugin.
     @since Beryllium-20090601-beta1 *)
 
-exception FeatureRequest of string * string
+exception FeatureRequest of Filepath.position option * string * string
 (** Raised by [not_yet_implemented].
-    You may catch [FeatureRequest(p,r)] to support degenerated behavior.
-    The responsible plugin is 'p' and the feature request is 'r'. *)
+    You may catch [FeatureRequest(s,p,r)] to support degenerated behavior.
+    The (optional) source location is s, the responsible plugin is 'p'
+    and the feature request is 'r'.
+    @modified Frama-C+dev added source location.
+*)
 
 (* -------------------------------------------------------------------------- *)
 (** {2 Option_signature.Interface}
@@ -205,11 +208,14 @@ module type Messages = sig
       @since Beryllium-20090601-beta1
       @plugin development guide *)
 
-  val not_yet_implemented : ('a,formatter,unit,'b) format4 -> 'a
+  val not_yet_implemented : ?current:bool -> ?source:Filepath.position ->
+    ('a,formatter,unit,'b) format4 -> 'a
   (** raises [FeatureRequest] but {i does not} send any message.
       If the exception is not caught, Frama-C displays a feature-request
       message to the user.
-      @since Beryllium-20090901 *)
+      @since Beryllium-20090901
+      @modified Frama-C+dev added current and source arguments.
+  *)
 
   val deprecated: string -> now:string -> ('a -> 'b) -> ('a -> 'b)
   (** [deprecated s ~now f] indicates that the use of [f] of name [s] is now
diff --git a/src/kernel_services/plugin_entry_points/plugin.mli b/src/kernel_services/plugin_entry_points/plugin.mli
index 39798e3efef3bb17f497d9ef1ff1a7da81101dd9..6cee5207ce189c7d2e2051c085226b264b121357 100644
--- a/src/kernel_services/plugin_entry_points/plugin.mli
+++ b/src/kernel_services/plugin_entry_points/plugin.mli
@@ -71,7 +71,7 @@ module type S_no_log = sig
         [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. *)
+        @modify 22.0-Titanium add [visible] and [deprecated] arguments. *)
 end
 
 (** Provided plug-general services for plug-ins.
@@ -90,7 +90,7 @@ type plugin = private
     p_help: string;
     p_parameters: (string, Typed_parameter.t list) Hashtbl.t }
 (** @since Beryllium-20090901
-    @modify Frama-C+dev previously only "iterable" parameters were included,
+    @modify 22.0-Titanium previously only "iterable" parameters were included,
                         now all parameters are.
 *)
 
@@ -175,7 +175,7 @@ val iter_on_plugins: (plugin -> unit) -> unit
 
 val fold_on_plugins: (plugin -> 'a -> 'a) -> 'a -> 'a
 (** Fold [f] on each registered plug-in.
-    @since Frama-C+dev *)
+    @since 22.0-Titanium *)
 
 (**/**)
 (* ************************************************************************* *)
diff --git a/src/kernel_services/visitors/visitor.ml b/src/kernel_services/visitors/visitor.ml
index cc918e122f511db3fe8acf500aaaa9c701204b9f..dbda6a580bb29b8324390d9e9f2c99a5eef13238 100644
--- a/src/kernel_services/visitors/visitor.ml
+++ b/src/kernel_services/visitors/visitor.ml
@@ -48,790 +48,793 @@ end
     annotations may not be visited properly. *)
 class internal_generic_frama_c_visitor fundec queue current_kf behavior: frama_c_visitor =
 
-object(self)
-  inherit internal_genericCilVisitor fundec behavior queue
+  object(self)
+    inherit internal_genericCilVisitor fundec behavior queue
 
-  method frama_c_plain_copy =
-    new internal_generic_frama_c_visitor fundec queue current_kf behavior
+    method frama_c_plain_copy =
+      new internal_generic_frama_c_visitor fundec queue current_kf behavior
 
-  method! plain_copy_visitor =
-    assert (self#frama_c_plain_copy#get_filling_actions == 
+    method! plain_copy_visitor =
+      assert (self#frama_c_plain_copy#get_filling_actions ==
               self#get_filling_actions);
-    (self#frama_c_plain_copy :> Cil.cilVisitor)
-
-  method set_current_kf kf = current_kf := Some kf
-
-  method reset_current_kf () = current_kf := None
-
-  method current_kf = !current_kf
-
-  method! private vstmt stmt =
-    let orig_stmt = Visitor_behavior.Get_orig.stmt self#behavior stmt in
-    let annots =
-      Annotations.fold_code_annot (fun e a acc -> (e, a) :: acc) orig_stmt []
-    in
-    let res = self#vstmt_aux stmt in
-    (* Annotations will be visited and more importantly added in the
-       same order as they were in the original AST.  *)
-    let annots =
-      List.sort 
-        (fun (_,a) (_,b) -> Cil_datatype.Code_annotation.compare a b)
-        annots
-    in
-    let make_children_annot vis =
-      let add, remove =
-        List.fold_left
-          (fun (add, remove) (e, x) ->
-             let y = visitCilCodeAnnotation (vis:>cilVisitor) x in
-             (* Given x, we compute whether it must be removed from the
-                destination project, and whether we should add its copy y,
-                again in the destination project. *)
-             let is_trivial = Logic_utils.is_trivial_annotation in
-             (* we keep [y] only if it is non-trivial (non-\true), except
-                if [x] is already trivial itself. *)
-             let becomes_trivial = is_trivial y && not (is_trivial x) in
-             let curr_add, remove_curr =
-               if Visitor_behavior.is_copy vis#behavior then
-                 (* Copy visitor. We add [y], except if trivial. No sense in
-                    removing [x], since the stmt is a new one. *)
-                 (if not becomes_trivial then [e, y] else []),
-                 false
-               else
-                 (* Inplace visitor. We remove [x] if it becomes trivial, or
-                    if it has changed (because we need to add it back with the
-                    new content). We re-add [y] if [x] has changed and has
-                    not became trivial. Do not always remove then re-add, as
-                    this would mess up property statuses. *)
-                 (if x != y && not becomes_trivial then [e, y] else []),
-                 (x != y || becomes_trivial)
-             in
-             (add @ curr_add, if remove_curr then (e, x) :: remove else remove)
-          )
-          ([],[])
+      (self#frama_c_plain_copy :> Cil.cilVisitor)
+
+    method set_current_kf kf = current_kf := Some kf
+
+    method reset_current_kf () = current_kf := None
+
+    method current_kf = !current_kf
+
+    method! private vstmt stmt =
+      let orig_stmt = Visitor_behavior.Get_orig.stmt self#behavior stmt in
+      let annots =
+        Annotations.fold_code_annot (fun e a acc -> (e, a) :: acc) orig_stmt []
+      in
+      let res = self#vstmt_aux stmt in
+      (* Annotations will be visited and more importantly added in the
+         same order as they were in the original AST.  *)
+      let annots =
+        List.sort
+          (fun (_,a) (_,b) -> Cil_datatype.Code_annotation.compare a b)
           annots
       in
-      (add, remove)
-    in
-    let change_stmt stmt (add, remove) =
-      if (add <> [] || remove <> []) then begin
-        let kf = Extlib.the self#current_kf in
-        let new_kf = Visitor_behavior.Get.kernel_function self#behavior kf in
-        Queue.add
-          (fun () ->
-             List.iter
-               (fun (e, a) ->
-                  Annotations.remove_code_annot e ~kf:new_kf stmt a)
-               remove;
-             List.iter
-               (fun (e, a) ->
-                  Annotations.add_code_annot
-                    ~keep_empty:false e ~kf:new_kf stmt a)
-               add)
-          self#get_filling_actions
-      end
-    in
-    let post_action f stmt =
-      let (add, _  as new_annots) = make_children_annot self in
-      let stmt = f stmt in
-      (match stmt.skind with
-       | Block b when annots <> [] || add <> [] ->
-         stmt.skind <- Block (Cil.block_of_transient b)
-       | _ -> ());
-      change_stmt stmt new_annots;
-      stmt
-    in
-    let copy stmt =
-      change_stmt stmt(make_children_annot self#frama_c_plain_copy);
-      stmt
-    in
-    let plain_post = post_action (fun x -> x) in
-    match res with
-    | SkipChildren -> res
-    | JustCopy -> JustCopyPost copy
-    | JustCopyPost f -> JustCopyPost (f $ copy)
-    | DoChildren -> DoChildrenPost plain_post
-    | DoChildrenPost f -> DoChildrenPost (f $ plain_post)
-    | ChangeTo _ | ChangeToPost _ -> res
-    | ChangeDoChildrenPost (stmt,f) ->
-      ChangeDoChildrenPost (stmt, post_action f)
-
-  method vstmt_aux _ = DoChildren
-  method vglob_aux _ = DoChildren
-
-  method private vbehavior_annot ?e b =
-    let kf = Extlib.the self#current_kf in
-    let treat_elt emit elt acc =
-      match e with
+      let make_children_annot vis =
+        let add, remove =
+          List.fold_left
+            (fun (add, remove) (e, x) ->
+               let y = visitCilCodeAnnotation (vis:>cilVisitor) x in
+               (* Given x, we compute whether it must be removed from the
+                  destination project, and whether we should add its copy y,
+                  again in the destination project. *)
+               let is_trivial = Logic_utils.is_trivial_annotation in
+               (* we keep [y] only if it is non-trivial (non-\true), except
+                  if [x] is already trivial itself. *)
+               let becomes_trivial = is_trivial y && not (is_trivial x) in
+               let curr_add, remove_curr =
+                 if Visitor_behavior.is_copy vis#behavior then
+                   (* Copy visitor. We add [y], except if trivial. No sense in
+                      removing [x], since the stmt is a new one. *)
+                   (if not becomes_trivial then [e, y] else []),
+                   false
+                 else
+                   (* Inplace visitor. We remove [x] if it becomes trivial, or
+                      if it has changed (because we need to add it back with the
+                      new content). We re-add [y] if [x] has changed and has
+                      not became trivial. Do not always remove then re-add, as
+                      this would mess up property statuses. *)
+                   (if x != y && not becomes_trivial then [e, y] else []),
+                   (x != y || becomes_trivial)
+               in
+               (add @ curr_add, if remove_curr then (e, x) :: remove else remove)
+            )
+            ([],[])
+            annots
+        in
+        (add, remove)
+      in
+      let change_stmt stmt (add, remove) =
+        if (add <> [] || remove <> []) then begin
+          let kf = Option.get self#current_kf in
+          let new_kf = Visitor_behavior.Get.kernel_function self#behavior kf in
+          Queue.add
+            (fun () ->
+               List.iter
+                 (fun (e, a) ->
+                    Annotations.remove_code_annot e ~kf:new_kf stmt a)
+                 remove;
+               List.iter
+                 (fun (e, a) ->
+                    Annotations.add_code_annot
+                      ~keep_empty:false e ~kf:new_kf stmt a)
+                 add)
+            self#get_filling_actions
+        end
+      in
+      let post_action f stmt =
+        let (add, _  as new_annots) = make_children_annot self in
+        let stmt = f stmt in
+        (match stmt.skind with
+         | Block b when annots <> [] || add <> [] ->
+           stmt.skind <- Block (Cil.block_of_transient b)
+         | _ -> ());
+        change_stmt stmt new_annots;
+        stmt
+      in
+      let copy stmt =
+        change_stmt stmt(make_children_annot self#frama_c_plain_copy);
+        stmt
+      in
+      let plain_post = post_action (fun x -> x) in
+      match res with
+      | SkipChildren -> res
+      | JustCopy -> JustCopyPost copy
+      | JustCopyPost f -> JustCopyPost (f $ copy)
+      | DoChildren -> DoChildrenPost plain_post
+      | DoChildrenPost f -> DoChildrenPost (f $ plain_post)
+      | ChangeTo _ | ChangeToPost _ -> res
+      | ChangeDoChildrenPost (stmt,f) ->
+        ChangeDoChildrenPost (stmt, post_action f)
+
+    method vstmt_aux _ = DoChildren
+    method vglob_aux _ = DoChildren
+
+    method private vbehavior_annot ?e b =
+      let kf = Option.get self#current_kf in
+      let treat_elt emit elt acc =
+        match e with
         | None -> (emit, elt) :: acc
         | Some e when Emitter.equal e emit -> (emit, elt) :: acc
         | Some _ -> acc
-    in
-    let fold_elt fold = fold treat_elt kf b.b_name [] in
-    let old_requires = fold_elt Annotations.fold_requires in
-    let old_assumes = fold_elt Annotations.fold_assumes in
-    let old_ensures = fold_elt Annotations.fold_ensures in
-    let old_assigns = fold_elt Annotations.fold_assigns in
-    let old_allocates = fold_elt Annotations.fold_allocates in
-    let old_extended = fold_elt Annotations.fold_extended in
-    let b' =
-      if Visitor_behavior.is_copy self#behavior then
-        { b with b_name = b.b_name }
-      else b
-    in
-    let res = self#vbehavior b' in
-    let new_kf = Visitor_behavior.Get.kernel_function self#behavior kf in
-    let add_queue a = Queue.add a self#get_filling_actions in
-    let visit_clauses vis f =
-      (* Ensures that we have a table associated to new_kf in Annotations. *)
-      add_queue
-        (fun () ->
-          ignore (Annotations.behaviors ~populate:false new_kf));
-      let module Fold =
-          struct
-            type 'a t =
-                { apply: 'b. (Emitter.t -> 'a -> 'b -> 'b) ->
-                         Kernel_function.t -> string -> 'b -> 'b }
-          end
       in
-      let visit_elt visit e elt (f,acc) =
-        let new_elt = visit (vis:>Cil.cilVisitor) elt in
-        (* We'll add the elts afterwards, so as to keep lists in their
-           original order as much as we can. see fold_elt below.
-        *)
-        f ||  new_elt != elt || new_kf != kf,
-        (e,new_elt) :: acc
+      let fold_elt fold = fold treat_elt kf b.b_name [] in
+      let old_requires = fold_elt Annotations.fold_requires in
+      let old_assumes = fold_elt Annotations.fold_assumes in
+      let old_ensures = fold_elt Annotations.fold_ensures in
+      let old_assigns = fold_elt Annotations.fold_assigns in
+      let old_allocates = fold_elt Annotations.fold_allocates in
+      let old_extended = fold_elt Annotations.fold_extended in
+      let b' =
+        if Visitor_behavior.is_copy self#behavior then
+          { b with b_name = b.b_name }
+        else b
       in
-      let check_elt visit e' elt acc =
-        match e with
+      let res = self#vbehavior b' in
+      let new_kf = Visitor_behavior.Get.kernel_function self#behavior kf in
+      let add_queue a = Queue.add a self#get_filling_actions in
+      let visit_clauses vis f =
+        (* Ensures that we have a table associated to new_kf in Annotations. *)
+        add_queue
+          (fun () ->
+             ignore (Annotations.behaviors ~populate:false new_kf));
+        let module Fold =
+        struct
+          type 'a t =
+            { apply: 'b. (Emitter.t -> 'a -> 'b -> 'b) ->
+                Kernel_function.t -> string -> 'b -> 'b }
+        end
+        in
+        let visit_elt visit e elt (f,acc) =
+          let new_elt = visit (vis:>Cil.cilVisitor) elt in
+          (* We'll add the elts afterwards, so as to keep lists in their
+             original order as much as we can. see fold_elt below.
+          *)
+          f ||  new_elt != elt || new_kf != kf,
+          (e,new_elt) :: acc
+        in
+        let check_elt visit e' elt acc =
+          match e with
           | None -> visit_elt visit e' elt acc
           | Some e when Emitter.equal e e' -> visit_elt visit e' elt acc
           | Some _ -> acc
-      in
-      let fold_elt fold visit remove add append dft =
-        let (changed, res) =
-          fold.Fold.apply (check_elt visit) kf b'.b_name (false,[])
         in
-        if changed then begin
-          add_queue
-            (fun () ->
-              fold.Fold.apply
-                (fun e' x () ->
-                  match e with
-                    | None -> remove e' new_kf x
-                    | Some e when Emitter.equal e e' -> remove e' new_kf x
-                    | _ -> ())
-                new_kf b'.b_name ();
-              List.iter (fun (e,x) -> add e new_kf b'.b_name x) res)
-        end;
-        List.fold_left (fun acc (_,x) -> append x acc) dft res
-      in
-      let req =
-        fold_elt
-          { Fold.apply = Annotations.fold_requires }
-          Cil.visitCilIdPredicate
-          Annotations.remove_requires
-          (fun e kf behavior r -> Annotations.add_requires e kf ~behavior [r])
-          (fun x l -> x :: l) []
-      in
-      b'.b_requires <- req;
-      let assumes =
-        fold_elt
-          { Fold.apply = Annotations.fold_assumes }
-          Cil.visitCilIdPredicate
-          Annotations.remove_assumes
-          (fun e kf behavior a -> Annotations.add_assumes e kf ~behavior [a])
-          (fun x l -> x :: l) []
-      in
-      b'.b_assumes <- assumes;
-      let visit_ensures vis (k,p as e) =
-        let new_p = Cil.visitCilIdPredicate (vis:>Cil.cilVisitor) p in
-        if p != new_p then (k,new_p) else e
-      in
-      let ensures =
-        fold_elt
-          { Fold.apply = Annotations.fold_ensures }
-          visit_ensures
-          Annotations.remove_ensures
-          (fun e kf behavior p -> Annotations.add_ensures e kf ~behavior [p])
-          (fun x l -> x :: l) []
-      in
-      b'.b_post_cond <- ensures;
-      let add_assigns e kf behavior a =
-        match a with
+        let fold_elt fold visit remove add append dft =
+          let (changed, res) =
+            fold.Fold.apply (check_elt visit) kf b'.b_name (false,[])
+          in
+          if changed then begin
+            add_queue
+              (fun () ->
+                 fold.Fold.apply
+                   (fun e' x () ->
+                      match e with
+                      | None -> remove e' new_kf x
+                      | Some e when Emitter.equal e e' -> remove e' new_kf x
+                      | _ -> ())
+                   new_kf b'.b_name ();
+                 List.iter (fun (e,x) -> add e new_kf b'.b_name x) res)
+          end;
+          List.fold_left (fun acc (_,x) -> append x acc) dft res
+        in
+        let req =
+          fold_elt
+            { Fold.apply = Annotations.fold_requires }
+            Cil.visitCilIdPredicate
+            Annotations.remove_requires
+            (fun e kf behavior r -> Annotations.add_requires e kf ~behavior [r])
+            (fun x l -> x :: l) []
+        in
+        b'.b_requires <- req;
+        let assumes =
+          fold_elt
+            { Fold.apply = Annotations.fold_assumes }
+            Cil.visitCilIdPredicate
+            Annotations.remove_assumes
+            (fun e kf behavior a -> Annotations.add_assumes e kf ~behavior [a])
+            (fun x l -> x :: l) []
+        in
+        b'.b_assumes <- assumes;
+        let visit_ensures vis (k,p as e) =
+          let new_p = Cil.visitCilIdPredicate (vis:>Cil.cilVisitor) p in
+          if p != new_p then (k,new_p) else e
+        in
+        let ensures =
+          fold_elt
+            { Fold.apply = Annotations.fold_ensures }
+            visit_ensures
+            Annotations.remove_ensures
+            (fun e kf behavior p -> Annotations.add_ensures e kf ~behavior [p])
+            (fun x l -> x :: l) []
+        in
+        b'.b_post_cond <- ensures;
+        let add_assigns e kf behavior a =
+          match a with
           | WritesAny -> ()
           | _ -> Annotations.add_assigns ~keep_empty:false e kf ~behavior a
-      in
-      let concat_assigns new_a a =
-        match new_a, a with
+        in
+        let concat_assigns new_a a =
+          match new_a, a with
           | WritesAny, a | a, WritesAny -> a
           | Writes a1, Writes a2 -> Writes (a2 @ a1)
-      in
-      let a =
-        fold_elt
-          { Fold.apply = Annotations.fold_assigns }
-          Cil.visitCilAssigns
-          Annotations.remove_assigns
-          add_assigns
-          concat_assigns
-          WritesAny
-      in
-      b'.b_assigns <- a;
-      let concat_allocation new_a a =
-        match new_a, a with
+        in
+        let a =
+          fold_elt
+            { Fold.apply = Annotations.fold_assigns }
+            Cil.visitCilAssigns
+            Annotations.remove_assigns
+            add_assigns
+            concat_assigns
+            WritesAny
+        in
+        b'.b_assigns <- a;
+        let concat_allocation new_a a =
+          match new_a, a with
           | FreeAllocAny, a | a, FreeAllocAny -> a
           | FreeAlloc(a1,a2), FreeAlloc(a3,a4) -> FreeAlloc (a3@a1,a4@a2)
+        in
+        let a =
+          fold_elt
+            { Fold.apply = Annotations.fold_allocates }
+            Cil.visitCilAllocation
+            Annotations.remove_allocates
+            (fun e kf behavior a ->
+               Annotations.add_allocates ~keep_empty:false e kf ~behavior a)
+            concat_allocation
+            FreeAllocAny
+        in
+        b'.b_allocation <- a;
+        let ext =
+          fold_elt
+            { Fold.apply = Annotations.fold_extended }
+            Cil.visitCilExtended
+            Annotations.remove_extended
+            (fun e kf behavior ex -> Annotations.add_extended e kf ~behavior ex)
+            (fun x y -> x::y)
+            []
+        in
+        b'.b_extended <- ext;
+        f b'
+      in
+      let remove_and_add get remove add fold old b =
+        let emitter = match e with None -> Emitter.end_user | Some e -> e in
+        let elts = get b in
+        List.iter
+          (fun (e,x) ->
+             if not (List.memq x elts) then
+               add_queue (fun () -> remove e new_kf x))
+          old;
+        let module M = struct exception Found of Emitter.t end in
+        let already_there x =
+          fold (fun e y () -> if x == y then raise (M.Found e)) new_kf b.b_name ()
+        in
+        List.iter
+          (fun x ->
+             add_queue
+               (fun () ->
+                  try
+                    already_there x;
+                    add emitter new_kf b.b_name x
+                  with M.Found e ->
+                    (* We keep x at its right place inside b. *)
+                    remove e new_kf x;
+                    add e new_kf b.b_name x))
+          (List.rev elts);
       in
-      let a =
-        fold_elt
-          { Fold.apply = Annotations.fold_allocates }
-          Cil.visitCilAllocation
+      let register_annots b' f =
+        add_queue
+          (fun () -> ignore (Annotations.behaviors ~populate:false new_kf));
+        remove_and_add
+          (fun b -> b.b_requires)
+          Annotations.remove_requires
+          (fun e kf behavior r -> Annotations.add_requires e kf ~behavior [r])
+          Annotations.fold_requires
+          old_requires b';
+        remove_and_add
+          (fun b -> b.b_assumes)
+          Annotations.remove_assumes
+          (fun e kf behavior r -> Annotations.add_assumes e kf ~behavior [r])
+          Annotations.fold_assumes
+          old_assumes b';
+        remove_and_add
+          (fun b -> b.b_post_cond)
+          Annotations.remove_ensures
+          (fun e kf behavior r -> Annotations.add_ensures e kf ~behavior [r])
+          Annotations.fold_ensures
+          old_ensures b';
+        remove_and_add
+          (fun b -> match b.b_assigns with WritesAny -> [] | a -> [a])
+          Annotations.remove_assigns
+          (fun e kf behavior a ->
+             match a with
+             | WritesAny -> ()
+             | Writes _ ->
+               Annotations.add_assigns ~keep_empty:false e kf ~behavior a)
+          Annotations.fold_assigns
+          old_assigns b';
+        remove_and_add
+          (fun b -> match b.b_allocation with FreeAllocAny -> [] | a -> [a])
           Annotations.remove_allocates
           (fun e kf behavior a ->
              Annotations.add_allocates ~keep_empty:false e kf ~behavior a)
-          concat_allocation
-          FreeAllocAny
-      in
-      b'.b_allocation <- a;
-      let ext =
-        fold_elt
-          { Fold.apply = Annotations.fold_extended }
-          Cil.visitCilExtended
+          Annotations.fold_allocates
+          old_allocates b';
+        remove_and_add
+          (fun b -> b.b_extended)
           Annotations.remove_extended
           (fun e kf behavior ex -> Annotations.add_extended e kf ~behavior ex)
-          (fun x y -> x::y)
-          []
+          Annotations.fold_extended
+          old_extended b';
+        f b'
       in
-      b'.b_extended <- ext;
-      f b'
-    in
-    let remove_and_add get remove add fold old b =
-      let emitter = match e with None -> Emitter.end_user | Some e -> e in
-      let elts = get b in
-      List.iter
-        (fun (e,x) ->
-          if not (List.memq x elts) then
-            add_queue (fun () -> remove e new_kf x))
-        old;
-      let module M = struct exception Found of Emitter.t end in
-      let already_there x =
-        fold (fun e y () -> if x == y then raise (M.Found e)) new_kf b.b_name ()
-      in
-      List.iter
-        (fun x ->
-          add_queue
-            (fun () ->
-              try
-                already_there x;
-                add emitter new_kf b.b_name x
-              with M.Found e ->
-                (* We keep x at its right place inside b. *)
-                remove e new_kf x;
-                add e new_kf b.b_name x))
-        (List.rev elts);
-    in
-    let register_annots b' f =
-      add_queue
-        (fun () -> ignore (Annotations.behaviors ~populate:false new_kf));
-      remove_and_add
-        (fun b -> b.b_requires)
-        Annotations.remove_requires
-        (fun e kf behavior r -> Annotations.add_requires e kf ~behavior [r])
-        Annotations.fold_requires
-        old_requires b';
-      remove_and_add
-        (fun b -> b.b_assumes)
-        Annotations.remove_assumes
-        (fun e kf behavior r -> Annotations.add_assumes e kf ~behavior [r])
-        Annotations.fold_assumes
-        old_assumes b';
-      remove_and_add
-        (fun b -> b.b_post_cond)
-        Annotations.remove_ensures
-        (fun e kf behavior r -> Annotations.add_ensures e kf ~behavior [r])
-        Annotations.fold_ensures
-        old_ensures b';
-      remove_and_add
-        (fun b -> match b.b_assigns with WritesAny -> [] | a -> [a])
-        Annotations.remove_assigns
-        (fun e kf behavior a ->
-          match a with
-            | WritesAny -> ()
-            | Writes _ ->
-                Annotations.add_assigns ~keep_empty:false e kf ~behavior a)
-        Annotations.fold_assigns
-        old_assigns b';
-      remove_and_add
-        (fun b -> match b.b_allocation with FreeAllocAny -> [] | a -> [a])
-        Annotations.remove_allocates
-        (fun e kf behavior a ->
-           Annotations.add_allocates ~keep_empty:false e kf ~behavior a)
-        Annotations.fold_allocates
-        old_allocates b';
-      remove_and_add
-        (fun b -> b.b_extended)
-        Annotations.remove_extended
-        (fun e kf behavior ex -> Annotations.add_extended e kf ~behavior ex)
-        Annotations.fold_extended
-        old_extended b';
-      f b'
-    in
-    match res with
+      match res with
       | SkipChildren -> b
       | JustCopy -> visit_clauses self#plain_copy_visitor Extlib.id
       | JustCopyPost f -> visit_clauses self#plain_copy_visitor f
       | ChangeTo b -> register_annots b Extlib.id
       | ChangeToPost (b,f) -> register_annots b f
       | ChangeDoChildrenPost (b,f) ->
-          register_annots (Cil.childrenBehavior (self:>Cil.cilVisitor) b) f
+        register_annots (Cil.childrenBehavior (self:>Cil.cilVisitor) b) f
       | DoChildren -> visit_clauses self Extlib.id
       | DoChildrenPost f -> visit_clauses self f
 
-  method private vfunspec_annot () =
-    let kf = Extlib.the self#current_kf in
-    let new_kf = Visitor_behavior.Get.kernel_function self#behavior kf in
-    let old_behaviors =
-      Annotations.fold_behaviors (fun e b acc -> (e,b)::acc) kf []
-    in
-    let old_complete =
-      Annotations.fold_complete (fun e c acc -> (e,c)::acc) kf []
-    in
-    let old_disjoint =
-      Annotations.fold_disjoint (fun e d acc -> (e,d)::acc) kf []
-    in
-    let old_terminates =
-      Annotations.fold_terminates (fun e t _ -> Some (e,t)) kf None
-    in
-    let old_decreases =
-      Annotations.fold_decreases (fun e d _ -> Some (e,d)) kf None
-    in
-    let spec =
-      { spec_behavior = snd (List.split old_behaviors);
-        spec_complete_behaviors = snd (List.split old_complete);
-        spec_disjoint_behaviors = snd (List.split old_disjoint);
-        spec_terminates =
-          (Extlib.opt_map snd) old_terminates;
-        spec_variant = 
-          (Extlib.opt_map snd) old_decreases
-      }
-    in
-    let res = self#vspec spec in
-    let do_children () =
-      let new_behaviors =
-        List.rev_map
-          (fun (e,b) ->
-            let b' = self#vbehavior_annot ~e b in
-            if b != b' || kf != new_kf then begin
-              Queue.add
-                (fun () ->
-                  Annotations.add_behaviors
-                    ~register_children:false e new_kf [b'])
-                self#get_filling_actions;
-            end;
-            b')
-          old_behaviors
+    method private vfunspec_annot () =
+      let kf = Option.get self#current_kf in
+      let new_kf = Visitor_behavior.Get.kernel_function self#behavior kf in
+      let old_behaviors =
+        Annotations.fold_behaviors (fun e b acc -> (e,b)::acc) kf []
       in
-      let new_terminates =
-        Extlib.opt_map
-          (fun (e,t) ->
-            let t' = Cil.visitCilIdPredicate (self:>Cil.cilVisitor) t in
-            if t != t' || kf != new_kf then
-              Queue.add (fun () ->
-                Annotations.remove_terminates e new_kf;
-                Annotations.add_terminates e new_kf t')
-                self#get_filling_actions
-            ;
-          t')
-          old_terminates
+      let old_complete =
+        Annotations.fold_complete (fun e c acc -> (e,c)::acc) kf []
       in
-      let new_decreases =
-        Extlib.opt_map
-          (fun (e,(d,s as acc)) ->
-            let d' = Cil.visitCilTerm (self:>Cil.cilVisitor) d in
-            if d != d' || kf != new_kf then begin
-              let res = (d',s) in
-              Queue.add
-                (fun () ->
-                  Annotations.remove_decreases e new_kf;
-                  Annotations.add_decreases e new_kf res;
-                )
-                self#get_filling_actions;
-              res
-            end else acc
-          )
-          old_decreases
+      let old_disjoint =
+        Annotations.fold_disjoint (fun e d acc -> (e,d)::acc) kf []
       in
-      if kf != new_kf then begin
-        List.iter
-          (fun (e,c) ->
-            Queue.add (fun () -> Annotations.add_complete e new_kf c)
-              self#get_filling_actions)
-          (List.rev old_complete);
-        List.iter
-          (fun (e,d) ->
-            Queue.add (fun () -> Annotations.add_disjoint e new_kf d)
-              self#get_filling_actions)
-          (List.rev old_disjoint)
-      end;
-      { spec with
-        spec_behavior = new_behaviors;
-        spec_terminates = new_terminates;
-        spec_variant = new_decreases }
-    in
-    let change_do_children spec =
-      let new_behaviors =
-        Cil.mapNoCopy self#vbehavior_annot spec.spec_behavior
+      let old_terminates =
+        Annotations.fold_terminates (fun e t _ -> Some (e,t)) kf None
       in
-      let new_terminates =
-        Cil.optMapNoCopy (Cil.visitCilIdPredicate (self:>Cil.cilVisitor))
-          spec.spec_terminates
+      let old_decreases =
+        Annotations.fold_decreases (fun e d _ -> Some (e,d)) kf None
       in
-      let new_decreases =
-       Cil.optMapNoCopy
-          (fun (d,s as acc) ->
-            let d' = Cil.visitCilTerm (self:>Cil.cilVisitor) d in
-            if d != d' then (d',s) else acc)
-          spec.spec_variant
+      let spec =
+        { spec_behavior = snd (List.split old_behaviors);
+          spec_complete_behaviors = snd (List.split old_complete);
+          spec_disjoint_behaviors = snd (List.split old_disjoint);
+          spec_terminates =
+            (Option.map snd) old_terminates;
+          spec_variant =
+            (Option.map snd) old_decreases
+        }
       in
-      { spec with
-        spec_behavior = new_behaviors;
-        spec_terminates = new_terminates;
-        spec_variant = new_decreases }
-    in
-    let register_new_components new_spec =
-      let add_spec_components () =
-        let populate = false in
-        let new_behaviors = Annotations.behaviors ~populate new_kf in
+      let res = self#vspec spec in
+      let do_children () =
+        let new_behaviors =
+          List.rev_map
+            (fun (e,b) ->
+               let b' = self#vbehavior_annot ~e b in
+               if b != b' || kf != new_kf then begin
+                 Queue.add
+                   (fun () ->
+                      Annotations.add_behaviors
+                        ~register_children:false e new_kf [b'])
+                   self#get_filling_actions;
+               end;
+               b')
+            old_behaviors
+        in
+        let new_terminates =
+          Option.map
+            (fun (e,t) ->
+               let t' = Cil.visitCilIdPredicate (self:>Cil.cilVisitor) t in
+               if t != t' || kf != new_kf then
+                 Queue.add (fun () ->
+                     Annotations.remove_terminates e new_kf;
+                     Annotations.add_terminates e new_kf t')
+                   self#get_filling_actions
+               ;
+               t')
+            old_terminates
+        in
+        let new_decreases =
+          Option.map
+            (fun (e,(d,s as acc)) ->
+               let d' = Cil.visitCilTerm (self:>Cil.cilVisitor) d in
+               if d != d' || kf != new_kf then begin
+                 let res = (d',s) in
+                 Queue.add
+                   (fun () ->
+                      Annotations.remove_decreases e new_kf;
+                      Annotations.add_decreases e new_kf res;
+                   )
+                   self#get_filling_actions;
+                 res
+               end else acc
+            )
+            old_decreases
+        in
+        if kf != new_kf then begin
+          List.iter
+            (fun (e,c) ->
+               Queue.add (fun () -> Annotations.add_complete e new_kf c)
+                 self#get_filling_actions)
+            (List.rev old_complete);
+          List.iter
+            (fun (e,d) ->
+               Queue.add (fun () -> Annotations.add_disjoint e new_kf d)
+                 self#get_filling_actions)
+            (List.rev old_disjoint)
+        end;
+        { spec with
+          spec_behavior = new_behaviors;
+          spec_terminates = new_terminates;
+          spec_variant = new_decreases }
+      in
+      let change_do_children spec =
+        let new_behaviors =
+          Cil.mapNoCopy self#vbehavior_annot spec.spec_behavior
+        in
+        let new_terminates =
+          Cil.optMapNoCopy (Cil.visitCilIdPredicate (self:>Cil.cilVisitor))
+            spec.spec_terminates
+        in
+        let new_decreases =
+          Cil.optMapNoCopy
+            (fun (d,s as acc) ->
+               let d' = Cil.visitCilTerm (self:>Cil.cilVisitor) d in
+               if d != d' then (d',s) else acc)
+            spec.spec_variant
+        in
+        { spec with
+          spec_behavior = new_behaviors;
+          spec_terminates = new_terminates;
+          spec_variant = new_decreases }
+      in
+      let register_new_components new_spec =
+        let add_spec_components () =
+          let populate = false in
+          let new_behaviors = Annotations.behaviors ~populate new_kf in
+          List.iter
+            (fun b ->
+               if
+                 (List.for_all
+                    (fun x -> x.b_name <> b.b_name || Cil.is_empty_behavior x)
+                    new_behaviors)
+               then begin
+                 Annotations.add_behaviors ~register_children:false
+                   Emitter.end_user new_kf [b]
+               end)
+            new_spec.spec_behavior;
+          let new_complete = Annotations.complete ~populate new_kf in
+          List.iter
+            (fun c ->
+               if not (List.memq c new_complete) then begin
+                 Annotations.add_complete Emitter.end_user new_kf c
+               end)
+            new_spec.spec_complete_behaviors;
+          let new_disjoint = Annotations.disjoint ~populate new_kf in
+          List.iter
+            (fun d ->
+               if not (List.memq d new_disjoint) then
+                 Annotations.add_disjoint Emitter.end_user new_kf d)
+            new_spec.spec_disjoint_behaviors;
+          let new_terminates = Annotations.terminates ~populate new_kf in
+          (match new_terminates, new_spec.spec_terminates with
+           | None, None -> ()
+           | Some _, None -> ()
+           | None, Some p ->
+             Annotations.add_terminates Emitter.end_user new_kf p
+           | Some p1, Some p2 when p1 == p2 -> ()
+           | Some p1, Some p2 ->
+             Kernel.fatal
+               "Visit of spec of function %a gives \
+                inconsistent terminates clauses@\n\
+                Registered @[%a@]@\nReturned @[%a@]"
+               Kernel_function.pretty new_kf
+               Printer.pp_identified_predicate p1
+               Printer.pp_identified_predicate p2);
+          let new_decreases = Annotations.decreases ~populate new_kf in
+          (match new_decreases, new_spec.spec_variant with
+           | None, None -> ()
+           | Some _, None -> ()
+           | None, Some p ->
+             Annotations.add_decreases Emitter.end_user new_kf p
+           | Some p1, Some p2 when p1 == p2 -> ()
+           | Some p1, Some p2 ->
+             Kernel.fatal
+               "Visit of spec of function %a gives \
+                inconsistent variant clauses@\n\
+                Registered %d@\n%a@\nReturned %d@\n%a"
+               Kernel_function.pretty new_kf
+               (Obj.magic p1)
+               Printer.pp_decreases p1
+               (Obj.magic p2)
+               Printer.pp_decreases p2)
+        in
         List.iter
-          (fun b ->
-            if
-              (List.for_all
-                 (fun x -> x.b_name <> b.b_name || Cil.is_empty_behavior x)
-                 new_behaviors)
-            then begin
-              Annotations.add_behaviors ~register_children:false 
-                Emitter.end_user new_kf [b]
-            end)
-          new_spec.spec_behavior;
-        let new_complete = Annotations.complete ~populate new_kf in
+          (fun (e,c) ->
+             if not (List.memq c new_spec.spec_complete_behaviors) then
+               Queue.add
+                 (fun () -> Annotations.remove_complete e new_kf c)
+                 self#get_filling_actions)
+          old_complete;
         List.iter
-          (fun c ->
-            if not (List.memq c new_complete) then begin
-              Annotations.add_complete Emitter.end_user new_kf c
-            end)
-          new_spec.spec_complete_behaviors;
-        let new_disjoint = Annotations.disjoint ~populate new_kf in
+          (fun (e,d) ->
+             if not (List.memq d new_spec.spec_disjoint_behaviors) then
+               Queue.add
+                 (fun () -> Annotations.remove_disjoint e new_kf d)
+                 self#get_filling_actions)
+          old_disjoint;
         List.iter
-          (fun d ->
-            if not (List.memq d new_disjoint) then
-              Annotations.add_disjoint Emitter.end_user new_kf d)
-          new_spec.spec_disjoint_behaviors;
-        let new_terminates = Annotations.terminates ~populate new_kf in
-        (match new_terminates, new_spec.spec_terminates with
-          | None, None -> ()
-          | Some _, None -> ()
-          | None, Some p ->
-              Annotations.add_terminates Emitter.end_user new_kf p
-          | Some p1, Some p2 when p1 == p2 -> ()
-          | Some p1, Some p2 ->
-              Kernel.fatal
-                "Visit of spec of function %a gives \
-                 inconsistent terminates clauses@\n\
-                 Registered @[%a@]@\nReturned @[%a@]"
-                Kernel_function.pretty new_kf
-                Printer.pp_identified_predicate p1
-                Printer.pp_identified_predicate p2);
-        let new_decreases = Annotations.decreases ~populate new_kf in
-        (match new_decreases, new_spec.spec_variant with
-          | None, None -> ()
-          | Some _, None -> ()
-          | None, Some p ->
-              Annotations.add_decreases Emitter.end_user new_kf p
-          | Some p1, Some p2 when p1 == p2 -> ()
-          | Some p1, Some p2 ->
-              Kernel.fatal
-                "Visit of spec of function %a gives \
-                 inconsistent variant clauses@\n\
-                 Registered %d@\n%a@\nReturned %d@\n%a"
-                Kernel_function.pretty new_kf
-                (Obj.magic p1)
-                Printer.pp_decreases p1
-                (Obj.magic p2)
-                Printer.pp_decreases p2)
+          (fun (e,b) ->
+             if not (List.memq b new_spec.spec_behavior) then begin
+               Queue.add
+                 (fun () ->
+                    if
+                      List.exists (fun x -> x.b_name = b.b_name)
+                        new_spec.spec_behavior
+                    then Annotations.remove_behavior_components e new_kf b
+                    else Annotations.remove_behavior e new_kf b)
+                 self#get_filling_actions
+             end
+          )
+          old_behaviors;
+        Option.iter
+          (fun (e,t) ->
+             if not (Option.fold
+                       ~none:false ~some:(fun t' -> t == t')
+                       new_spec.spec_terminates)
+             then
+               Queue.add
+                 (fun () -> Annotations.remove_terminates e new_kf)
+                 self#get_filling_actions)
+          old_terminates;
+        Option.iter
+          (fun (e,d) ->
+             if not (Option.fold
+                       ~none:false ~some:(fun d' -> d == d')
+                       new_spec.spec_variant)
+             then
+               Queue.add
+                 (fun () -> Annotations.remove_decreases e new_kf)
+                 self#get_filling_actions)
+          old_decreases;
+        Queue.add add_spec_components self#get_filling_actions;
       in
-      List.iter
-        (fun (e,c) ->
-          if not (List.memq c new_spec.spec_complete_behaviors) then
-            Queue.add
-              (fun () -> Annotations.remove_complete e new_kf c)
-              self#get_filling_actions)
-        old_complete;
-      List.iter
-        (fun (e,d) ->
-          if not (List.memq d new_spec.spec_disjoint_behaviors) then
-            Queue.add
-              (fun () -> Annotations.remove_disjoint e new_kf d)
-              self#get_filling_actions)
-        old_disjoint;
-      List.iter
-        (fun (e,b) ->
-          if not (List.memq b new_spec.spec_behavior) then begin
-            Queue.add
-              (fun () ->
-                if
-                  List.exists (fun x -> x.b_name = b.b_name)
-                    new_spec.spec_behavior
-                then Annotations.remove_behavior_components e new_kf b
-                else Annotations.remove_behavior e new_kf b)
-              self#get_filling_actions
-          end
-        )
-        old_behaviors;
-      Extlib.may
-        (fun (e,t) ->
-          if not (Extlib.may_map
-                    ~dft:false (fun t' -> t == t') new_spec.spec_terminates)
-          then
-            Queue.add
-              (fun () -> Annotations.remove_terminates e new_kf)
-              self#get_filling_actions)
-        old_terminates;
-      Extlib.may
-        (fun (e,d) ->
-          if not (Extlib.may_map
-                    ~dft:false (fun d' -> d == d') new_spec.spec_variant)
-          then
-            Queue.add
-              (fun () -> Annotations.remove_decreases e new_kf)
-              self#get_filling_actions)
-        old_decreases;
-      Queue.add add_spec_components self#get_filling_actions;
-    in
-    match res with
+      match res with
       | SkipChildren -> register_new_components spec
       | ChangeTo spec -> register_new_components spec
-      | ChangeToPost (spec,f) -> 
-          register_new_components spec; ignore (f spec)
+      | ChangeToPost (spec,f) ->
+        register_new_components spec; ignore (f spec)
       | JustCopy ->
-          register_new_components
-            (Cil.visitCilFunspec self#plain_copy_visitor spec)
+        register_new_components
+          (Cil.visitCilFunspec self#plain_copy_visitor spec)
       | JustCopyPost f ->
-          (register_new_components
-             (Cil.visitCilFunspec self#plain_copy_visitor spec));
-          ignore (f spec)
+        (register_new_components
+           (Cil.visitCilFunspec self#plain_copy_visitor spec));
+        ignore (f spec)
       | DoChildren -> ignore (do_children ())
       | DoChildrenPost f -> ignore (f (do_children ()))
       | ChangeDoChildrenPost(spec, f) ->
-          let res = change_do_children spec in
-          register_new_components res;
-          ignore (f res)
-
-  method! vglob g =
-    let fundec, has_kf = match g with
-      | GFunDecl(_,v,_) ->
-        let ov = Visitor_behavior.Get_orig.varinfo self#behavior v in
-        let kf = try Globals.Functions.get ov with Not_found ->
-          Kernel.fatal "No kernel function for %s(%d)" v.vname v.vid
-        in
-        (* Just make a copy of current kernel function in case it is needed *)
-        let new_kf = Visitor_behavior.Memo.kernel_function self#behavior kf in
-        if Visitor_behavior.is_copy self#behavior then
-          new_kf.spec <- Cil.empty_funspec ();
-        self#set_current_kf kf;
-        None, true
-      | GFun(f,_) ->
-        let v = Visitor_behavior.Get_orig.varinfo self#behavior f.svar in
-        let kf = 
-	  try Globals.Functions.get v 
-	  with Not_found ->
-	    Kernel.fatal "Visitor does not find function %s in %a"
-	      v.vname
-	      Project.pretty (Project.current ())
-	in
-        let new_kf = Visitor_behavior.Memo.kernel_function self#behavior kf in
-        if Visitor_behavior.is_copy self#behavior then
-          new_kf.spec <- Cil.empty_funspec ();
-        self#set_current_kf kf;
-        Some f, true
-      | _ -> None, false
-    in
-    let res = self#vglob_aux g in
-    let make_funspec () = match g with
-      | GFunDecl _ | GFun _ when Ast.is_def_or_last_decl g ->
+        let res = change_do_children spec in
+        register_new_components res;
+        ignore (f res)
+
+    method! vglob g =
+      let fundec, has_kf = match g with
+        | GFunDecl(_,v,_) ->
+          let ov = Visitor_behavior.Get_orig.varinfo self#behavior v in
+          let kf = try Globals.Functions.get ov with Not_found ->
+            Kernel.fatal "No kernel function for %s(%d)" v.vname v.vid
+          in
+          (* Just make a copy of current kernel function in case it is needed *)
+          let new_kf = Visitor_behavior.Memo.kernel_function self#behavior kf in
+          if Visitor_behavior.is_copy self#behavior then
+            new_kf.spec <- Cil.empty_funspec ();
+          self#set_current_kf kf;
+          None, true
+        | GFun(f,_) ->
+          let v = Visitor_behavior.Get_orig.varinfo self#behavior f.svar in
+          let kf =
+            try Globals.Functions.get v
+            with Not_found ->
+              Kernel.fatal "Visitor does not find function %s in %a"
+                v.vname
+                Project.pretty (Project.current ())
+          in
+          let new_kf = Visitor_behavior.Memo.kernel_function self#behavior kf in
+          if Visitor_behavior.is_copy self#behavior then
+            new_kf.spec <- Cil.empty_funspec ();
+          self#set_current_kf kf;
+          Some f, true
+        | _ -> None, false
+      in
+      let res = self#vglob_aux g in
+      let make_funspec () = match g with
+        | GFunDecl _ | GFun _ when Ast.is_def_or_last_decl g ->
           self#vfunspec_annot ();
-      | _ -> ()
-    in
-    (* NB: we'll loose track of the emitter of an annotation.
-       Anyway, this is only used for SkipChildren and JustCopy/JustCopyPost
-       (and for a copy visitor)
-       If user sticks to DoChildren, s/he'll still have the proper
-       correspondence between annotations and emitters.
-    *)
-    let get_spec () = match g with
-      | GFun _ | GFunDecl _ when Ast.is_def_or_last_decl g ->
-	let spec =
-	  Annotations.funspec ~populate:false (Extlib.the self#current_kf)
-	in
-        Some (Cil.visitCilFunspec self#plain_copy_visitor spec)
-      | _ -> None
-    in
-    let change_glob ng spec =
-      let cond = Visitor_behavior.is_copy self#behavior in
-      match ng with
+        | _ -> ()
+      in
+      (* NB: we'll loose track of the emitter of an annotation.
+         Anyway, this is only used for SkipChildren and JustCopy/JustCopyPost
+         (and for a copy visitor)
+         If user sticks to DoChildren, s/he'll still have the proper
+         correspondence between annotations and emitters.
+      *)
+      let get_spec () = match g with
+        | GFun _ | GFunDecl _ when Ast.is_def_or_last_decl g ->
+          let spec =
+            Annotations.funspec ~populate:false (Option.get self#current_kf)
+          in
+          Some (Cil.visitCilFunspec self#plain_copy_visitor spec)
+        | _ -> None
+      in
+      let change_glob ng spec =
+        let cond = Visitor_behavior.is_copy self#behavior in
+        match ng with
         | GVar(vi,init,_) ->
-            if cond then
-              Queue.add
-                (fun () ->
-                  try
-                    Globals.Vars.add vi init
-                  with Globals.Vars.AlreadyExists (vi,_) ->
-                    Kernel.fatal
-                      "Visitor is trying to insert global variable %a that \
-                     already exists in current project"
-                      Cil_datatype.Varinfo.pretty vi)
-                self#get_filling_actions
+          if cond then
+            Queue.add
+              (fun () ->
+                 try
+                   Globals.Vars.add vi init
+                 with Globals.Vars.AlreadyExists (vi,_) ->
+                   Kernel.fatal
+                     "Visitor is trying to insert global variable %a that \
+                      already exists in current project"
+                     Cil_datatype.Varinfo.pretty vi)
+              self#get_filling_actions
         | GFunDecl(_,v,l) ->
-            (match self#current_kf with
-              | Some kf ->
-                  let new_kf = Visitor_behavior.Get.kernel_function self#behavior kf in
-                  if cond then begin
-                    Queue.add
-                      (fun () ->
-                        if Cil.hasAttribute "FC_BUILTIN" v.vattr then
-                          Cil.Frama_c_builtins.add v.vname v;
-                        if Cil_datatype.Varinfo.equal v
-                          (Kernel_function.get_vi new_kf)
-                        then begin
-                          let dft =
-                            Annotations.funspec ~populate:false new_kf
-                          in
-                          let dft =
-                            { dft with spec_behavior = dft.spec_behavior }
-                          in
-                          let spec = Extlib.opt_conv dft spec in
-                          Globals.Functions.register new_kf;
-                          Globals.Functions.replace_by_declaration spec v l;
+          (match self#current_kf with
+           | Some kf ->
+             let new_kf = Visitor_behavior.Get.kernel_function self#behavior kf in
+             if cond then begin
+               Queue.add
+                 (fun () ->
+                    if Cil.hasAttribute "FC_BUILTIN" v.vattr then
+                      Cil_builtins.Frama_c_builtins.add v.vname v;
+                    if Cil_datatype.Varinfo.equal v
+                        (Kernel_function.get_vi new_kf)
+                    then begin
+                      let dft =
+                        Annotations.funspec ~populate:false new_kf
+                      in
+                      let dft =
+                        { dft with spec_behavior = dft.spec_behavior }
+                      in
+                      let spec = Option.value ~default:dft spec in
+                      Globals.Functions.register new_kf;
+                      Globals.Functions.replace_by_declaration spec v l;
                       (* Format.printf "registered spec:@\n%a@." Printer.pp_funspec
                          (Annotations.funspec ~populate:false new_kf) *)
-                        end else begin
-                          Globals.Functions.replace_by_declaration
-                            (Cil.empty_funspec()) v l
-                        end)
-                      self#get_filling_actions;
-                    if
-                      Cil_datatype.Varinfo.equal v
-                        (Kernel_function.get_vi new_kf) && Extlib.has_some spec
-                    then
-                      Queue.add
-                        (fun () ->
-                          Annotations.register_funspec ~force:true new_kf)
-                        self#get_filling_actions;
-                  end
-              | None -> ()
-              (* User is responsible for registering the new function *)
-            )
-      | GVarDecl (({vstorage=Extern} as v),_) (* when not (isFunctionType
-                                                   v.vtype) *) ->
-        if cond then
-          Queue.add
-            (fun () ->
-              try
-                Globals.Vars.add_decl v
-              with Globals.Vars.AlreadyExists (vi,_) ->
-                Kernel.fatal
-                  "Visitor is trying to insert global variable %a that \
-                     already exists in current project"
-                  Cil_datatype.Varinfo.pretty vi)
-            self#get_filling_actions
-      | GFun(f,l) ->
-        if cond then begin
-          match self#current_kf with
+                    end else begin
+                      Globals.Functions.replace_by_declaration
+                        (Cil.empty_funspec()) v l
+                    end)
+                 self#get_filling_actions;
+               if
+                 Cil_datatype.Varinfo.equal v
+                   (Kernel_function.get_vi new_kf) && Option.is_some spec
+               then
+                 Queue.add
+                   (fun () ->
+                      Annotations.register_funspec ~force:true new_kf)
+                   self#get_filling_actions;
+             end
+           | None -> ()
+           (* User is responsible for registering the new function *)
+          )
+        | GVarDecl (({vstorage=Extern} as v),_) (* when not (isFunctionType
+                                                     v.vtype) *) ->
+          if cond then
+            Queue.add
+              (fun () ->
+                 try
+                   Globals.Vars.add_decl v
+                 with Globals.Vars.AlreadyExists (vi,_) ->
+                   Kernel.fatal
+                     "Visitor is trying to insert global variable %a that \
+                      already exists in current project"
+                     Cil_datatype.Varinfo.pretty vi)
+              self#get_filling_actions
+        | GFun(f,l) ->
+          if cond then begin
+            match self#current_kf with
             | Some kf ->
-                let new_kf = Visitor_behavior.Get.kernel_function self#behavior kf in
+              let new_kf = Visitor_behavior.Get.kernel_function self#behavior kf in
+              Queue.add
+                (fun () ->
+                   Kernel.debug ~dkey:Kernel.dkey_visitor
+                     "@[Adding definition %s (vid: %d) for project %s@\n\
+                      body: %a@\n@]@."
+                     f.svar.vname f.svar.vid
+                     (Project.get_name (Project.current()))
+                     Printer.pp_block f.sbody;
+                   if cond && Cil.hasAttribute "FC_BUILTIN" f.svar.vattr then
+                     Cil_builtins.Frama_c_builtins.add f.svar.vname f.svar;
+                   if  Cil_datatype.Varinfo.equal f.svar
+                       (Kernel_function.get_vi new_kf)
+                   then begin
+                     Globals.Functions.register new_kf;
+                     let spec =
+                       Option.value
+                         ~default:(Annotations.funspec ~populate:false new_kf)
+                         spec
+                     in
+                     Globals.Functions.replace_by_definition spec f l
+                   end else
+                     Globals.Functions.replace_by_definition
+                       (Cil.empty_funspec ()) f l
+                )
+                self#get_filling_actions;
+              if Cil_datatype.Varinfo.equal f.svar
+                  (Kernel_function.get_vi new_kf)
+              && Option.is_some spec
+              then
                 Queue.add
-                  (fun () ->
-                    Kernel.debug ~dkey:Kernel.dkey_visitor
-                      "@[Adding definition %s (vid: %d) for project %s@\n\
-                         body: %a@\n@]@."
-                      f.svar.vname f.svar.vid
-                      (Project.get_name (Project.current()))
-                      Printer.pp_block f.sbody;
-                    if cond && Cil.hasAttribute "FC_BUILTIN" f.svar.vattr then
-                      Cil.Frama_c_builtins.add f.svar.vname f.svar;
-                    if  Cil_datatype.Varinfo.equal f.svar
-                      (Kernel_function.get_vi new_kf)
-                    then begin
-                      Globals.Functions.register new_kf;
-                      let spec =
-                        Extlib.opt_conv
-                          (Annotations.funspec ~populate:false new_kf) spec
-                      in
-                      Globals.Functions.replace_by_definition spec f l
-                    end else
-                      Globals.Functions.replace_by_definition
-                        (Cil.empty_funspec ()) f l
-                  )
+                  (fun () -> Annotations.register_funspec ~force:true new_kf)
                   self#get_filling_actions;
-                if Cil_datatype.Varinfo.equal f.svar
-                  (Kernel_function.get_vi new_kf)
-                  && Extlib.has_some spec
-                then
-                  Queue.add
-                    (fun () -> Annotations.register_funspec ~force:true new_kf)
-                    self#get_filling_actions;
             | None -> () (* User has to register the new function *)
-        end
-      | GAnnot (na,_) when cond ->
-	let e = match g with
-          | GAnnot (a,_) -> Annotations.emitter_of_global a
-          | _ -> Emitter.end_user
-        in
-        Queue.add
-	  (fun () ->
-            try
-              (* Annotations might have already been added by the user. *)
-              ignore (Annotations.emitter_of_global na)
-            with Not_found ->
-              Annotations.unsafe_add_global e na;
-          )
-          self#get_filling_actions
-      | _ -> ()
-    in
-    let post_action g =
-      Extlib.may self#set_current_func fundec;
-      let spec = get_spec () in
-      List.iter (fun g -> change_glob g spec) g;
-      if has_kf then self#reset_current_kf();
-      Extlib.may (fun _ -> self#reset_current_func ()) fundec;
-      g
-    in
-    let post_change_to g =
-      List.iter (fun g -> change_glob g None) g;
-      if has_kf then self#reset_current_kf();
-      g
-    in
-    let post_do_children f g =
-      Extlib.may self#set_current_func fundec;
-      make_funspec ();
-      let res = f g in
-      (* Spec registration is already handled at the vfunspec level. *)
-      List.iter (fun g -> change_glob g None) res;
-      if has_kf then self#reset_current_kf();
-      Extlib.may (fun _ -> self#reset_current_func ()) fundec;
-      res
-    in
-    match res with
-    | SkipChildren ->
+          end
+        | GAnnot (na,_) when cond ->
+          let e = match g with
+            | GAnnot (a,_) -> Annotations.emitter_of_global a
+            | _ -> Emitter.end_user
+          in
+          Queue.add
+            (fun () ->
+               try
+                 (* Annotations might have already been added by the user. *)
+                 ignore (Annotations.emitter_of_global na)
+               with Not_found ->
+                 Annotations.unsafe_add_global e na;
+            )
+            self#get_filling_actions
+        | _ -> ()
+      in
+      let post_action g =
+        Option.iter self#set_current_func fundec;
+        let spec = get_spec () in
+        List.iter (fun g -> change_glob g spec) g;
+        if has_kf then self#reset_current_kf();
+        Option.iter (fun _ -> self#reset_current_func ()) fundec;
+        g
+      in
+      let post_change_to g =
+        List.iter (fun g -> change_glob g None) g;
+        if has_kf then self#reset_current_kf();
+        g
+      in
+      let post_do_children f g =
+        Option.iter self#set_current_func fundec;
+        make_funspec ();
+        let res = f g in
+        (* Spec registration is already handled at the vfunspec level. *)
+        List.iter (fun g -> change_glob g None) res;
+        if has_kf then self#reset_current_kf();
+        Option.iter (fun _ -> self#reset_current_func ()) fundec;
+        res
+      in
+      match res with
+      | SkipChildren ->
         change_glob g None;
         if has_kf then self#reset_current_kf();
         res
-    | JustCopy -> JustCopyPost post_action
-    | JustCopyPost f -> JustCopyPost (post_action $ f)
-    | DoChildren -> DoChildrenPost (post_do_children Extlib.id)
-    | DoChildrenPost f -> DoChildrenPost (post_do_children f)
-    | ChangeTo l -> ChangeToPost (l,post_change_to)
-    | ChangeToPost (l,f) -> ChangeToPost (l, post_change_to $ f)
-    | ChangeDoChildrenPost (l,f) -> ChangeDoChildrenPost (l, post_do_children f)
-end
+      | JustCopy -> JustCopyPost post_action
+      | JustCopyPost f -> JustCopyPost (post_action $ f)
+      | DoChildren -> DoChildrenPost (post_do_children Extlib.id)
+      | DoChildrenPost f -> DoChildrenPost (post_do_children f)
+      | ChangeTo l -> ChangeToPost (l,post_change_to)
+      | ChangeToPost (l,f) -> ChangeToPost (l, post_change_to $ f)
+      | ChangeDoChildrenPost (l,f) -> ChangeDoChildrenPost (l, post_do_children f)
+  end
 
 class generic_frama_c_visitor bhv =
   let current_kf = ref None in
@@ -865,7 +868,7 @@ let visitFramacFunction vis f =
   vis#set_current_kf (Globals.Functions.get orig_var);
   let f' = visitCilFunction (vis:>cilVisitor) f in
   vis#reset_current_kf ();
-  Extlib.may vis#set_current_kf old_current_kf;
+  Option.iter vis#set_current_kf old_current_kf;
   vis#fill_global_tables; f'
 
 let visitFramacKf vis kf =
diff --git a/src/kernel_services/visitors/visitor.mli b/src/kernel_services/visitors/visitor.mli
index 068752c85685180f4f8f09aa766bb2be482bf738..fc7803bc7e876e5217cb2259938b2f4aa2eb3bfb 100644
--- a/src/kernel_services/visitors/visitor.mli
+++ b/src/kernel_services/visitors/visitor.mli
@@ -35,69 +35,69 @@ open Cil_types
     {b A few hints on how to use correctly this visitor}
 
     - when initializing a new project with it
-    (see {!File.init_project_from_visitor}), use a visitor with copy behavior
+      (see {!File.init_project_from_visitor}), use a visitor with copy behavior
 
     - [SkipChildren] and [ChangeTo] must be used with extreme care in a visitor
-    with copy behavior, or some nodes may be shared between the original and
-    the copy.
+      with copy behavior, or some nodes may be shared between the original and
+      the copy.
 
     - Do not erase a statement during the visit, as there might be
-    annotations attached to it. Change it to Skip instead, the
-    [generic_frama_c_visitor] will know what to do.
+      annotations attached to it. Change it to Skip instead, the
+      [generic_frama_c_visitor] will know what to do.
 
     - Be careful if you change the [vid] or [sid]: this must be done before
-    anything has been attached to the corresponding variable or
-    statement in the new project, which means
-       - for statements, in [vstmt], for the current statement only
-       - for variables, at their declaration point. *)
+      anything has been attached to the corresponding variable or
+      statement in the new project, which means
+      -- for statements, in [vstmt], for the current statement only
+      -- for variables, at their declaration point. *)
 class type frama_c_visitor = object
 
   inherit Cil.cilVisitor
 
   method frama_c_plain_copy: frama_c_visitor
-    (** same as plain_copy_visitor but for frama-c specific methods *)
+  (** same as plain_copy_visitor but for frama-c specific methods *)
 
   method vstmt_aux: stmt -> stmt Cil.visitAction
-    (** Replacement of vstmt.
-        @plugin development guide*)
+  (** Replacement of vstmt.
+      @plugin development guide*)
 
   method vglob_aux: global -> global list Cil.visitAction
-    (** Replacement of vglob.
-        @plugin development guide*)
+  (** Replacement of vglob.
+      @plugin development guide*)
 
   method current_kf: kernel_function option
-    (** link to the kernel function currently being visited.
-        {b NB:} for copy visitors, the link is to the original kf (anyway,
-        the new kf is created only after the visit is over).
-	@plugin development guide *)
+  (** link to the kernel function currently being visited.
+      {b NB:} for copy visitors, the link is to the original kf (anyway,
+      the new kf is created only after the visit is over).
+      @plugin development guide *)
 
   method set_current_kf: kernel_function -> unit
-    (** Internal use only. *)
+  (** Internal use only. *)
 
   method reset_current_kf: unit -> unit
-    (** Internal use only. *)
+  (** Internal use only. *)
 end
 
 class frama_c_inplace: frama_c_visitor
-  (** in-place visitor; always act in the current project. 
-      @plugin development guide *)
+(** in-place visitor; always act in the current project.
+    @plugin development guide *)
 
 class frama_c_copy: Project.t -> frama_c_visitor
-  (** Copying visitor. The [Project.t] argument specifies in which project the
-      visitor creates the new values. (Technically, the method
-      [fill_global_tables] is called inside this project.)
-      See {!File.init_project_from_visitor} and [create_project_from_visitor]
-      for possible uses. *)
+(** Copying visitor. The [Project.t] argument specifies in which project the
+    visitor creates the new values. (Technically, the method
+    [fill_global_tables] is called inside this project.)
+    See {!File.init_project_from_visitor} and [create_project_from_visitor]
+    for possible uses. *)
 
 class frama_c_refresh: Project.t -> frama_c_visitor
-  (** Similar to {!frama_c_copy}, but ids will be refreshed in the copy.
-      @since Sodium-20150201
-   *)
+(** Similar to {!frama_c_copy}, but ids will be refreshed in the copy.
+    @since Sodium-20150201
+*)
 
 class generic_frama_c_visitor:
   Visitor_behavior.t ->  frama_c_visitor
-  (** Generic class that abstracts over [frama_c_inplace] and [frama_c_copy]. 
-      @plugin development guide *)
+(** Generic class that abstracts over [frama_c_inplace] and [frama_c_copy].
+    @plugin development guide *)
 
 (** Visit a file. This will re-cons all globals TWICE (so that it is
     tail-recursive). Use {!Cil.visitCilFileSameGlobals} if your visitor will
@@ -111,21 +111,21 @@ val visitFramacFile: frama_c_visitor -> file -> unit
 (** A visitor for the whole file that does not change the globals (but maybe
     changes things inside the globals). Use this function instead of
     {!Visitor.visitFramacFile} whenever appropriate because it is more
-    efficient for long files. 
+    efficient for long files.
     @plugin development guide *)
 val visitFramacFileSameGlobals: frama_c_visitor -> file -> unit
 
 (** Visit a global.
 
-{b Warning} Do not call this function during another visit using the
-same visitor, as it is not reentrant: the inner visit will leave the visitor
-in an inconsistent state for the outer visit.
+    {b Warning} Do not call this function during another visit using the
+    same visitor, as it is not reentrant: the inner visit will leave the visitor
+    in an inconsistent state for the outer visit.
 *)
 val visitFramacGlobal: frama_c_visitor -> global -> global list
 
 (** Visit a kernel_function. More precisely, the entry point for the visit
     will be the global corresponding to the last declaration/definition of
-    the kf. The returned kf is the one that has the varinfo 
+    the kf. The returned kf is the one that has the varinfo
     associated to the varinfo of the original kf. If this is a new kf, it is
     however the responsibility of the visitor to insert it in the AST at
     the appropriate place.
@@ -165,7 +165,7 @@ val visitFramacType: frama_c_visitor -> typ -> typ
 (** Visit a variable declaration *)
 val visitFramacVarDecl: frama_c_visitor -> varinfo -> varinfo
 
-(** Visit a logic variable declaration 
+(** Visit a logic variable declaration
 
     @since Magnesium-20151001
 *)
@@ -209,7 +209,7 @@ val visitFramacPredicates: frama_c_visitor -> identified_predicate list
 
 (** visit identified_term.
     @since Oxygen-20120901
- *)
+*)
 val visitFramacIdTerm: frama_c_visitor -> identified_term -> identified_term
 
 val visitFramacTerm: frama_c_visitor -> term -> term
diff --git a/src/kernel_services/visitors/visitor_behavior.ml b/src/kernel_services/visitors/visitor_behavior.ml
index a1798fec152da146f9131751eb1babc993423cdc..3b8cc057eae61061ba8188c6d4cf1e54f7528541 100644
--- a/src/kernel_services/visitors/visitor_behavior.ml
+++ b/src/kernel_services/visitors/visitor_behavior.ml
@@ -506,28 +506,39 @@ let copy_visit_gen fresh prj =
   in
   let temp_set_compinfo c new_c =
     Cil_datatype.Compinfo.Hashtbl.add compinfos c new_c;
-    List.iter2
-      (fun f new_f -> Cil_datatype.Fieldinfo.Hashtbl.add fieldinfos f new_f)
-      c.cfields new_c.cfields
+    match c.cfields, new_c.cfields with
+    | None, None -> ()
+    | Some c_flds, Some new_c_flds ->
+      List.iter2
+        (fun f new_f -> Cil_datatype.Fieldinfo.Hashtbl.add fieldinfos f new_f)
+        c_flds new_c_flds
+    | _ ->
+      Kernel.fatal "set_compinfo: structures or unions do not match"
   in
   let temp_set_orig_compinfo new_c c =
     Cil_datatype.Compinfo.Hashtbl.add orig_compinfos new_c c;
-    List.iter2
-      (fun new_f f ->
-         Cil_datatype.Fieldinfo.Hashtbl.add orig_fieldinfos new_f f)
-      new_c.cfields c.cfields
+    match new_c.cfields, c.cfields  with
+    | None, None -> ()
+    | Some new_c_flds, Some c_flds ->
+      List.iter2
+        (fun new_f f ->
+           Cil_datatype.Fieldinfo.Hashtbl.add orig_fieldinfos new_f f)
+        new_c_flds c_flds
+    | _ ->
+      Kernel.fatal "set_orig_compinfo: structures or unions do not match"
   in
   let temp_unset_compinfo c =
     Cil_datatype.Compinfo.Hashtbl.remove compinfos c;
     List.iter
-      (fun f -> Cil_datatype.Fieldinfo.Hashtbl.remove fieldinfos f) c.cfields
+      (fun f -> Cil_datatype.Fieldinfo.Hashtbl.remove fieldinfos f)
+      (Option.value ~default:[] c.cfields)
   in
   let temp_unset_orig_compinfo new_c =
     Cil_datatype.Compinfo.Hashtbl.remove orig_compinfos new_c;
     List.iter
       (fun new_f ->
          Cil_datatype.Fieldinfo.Hashtbl.remove orig_fieldinfos new_f)
-      new_c.cfields
+      (Option.value ~default:[] new_c.cfields)
   in
   let temp_memo_compinfo c =
     try Cil_datatype.Compinfo.Hashtbl.find compinfos c
diff --git a/src/libraries/project/project.ml b/src/libraries/project/project.ml
index f416ee377f170503df31f9176f437ebbf2a321f5..9533032102a61b53259833f4be70c2f3f7e2f147 100644
--- a/src/libraries/project/project.ml
+++ b/src/libraries/project/project.ml
@@ -362,7 +362,7 @@ let set_current ?(on=false) ?(selection=State_selection.full) p =
   if not (equal p (current ())) then journalized_set_current on selection p
 
 let set_current_as_last_created () =
-  Extlib.may (fun p -> set_current p) !last_created_by_copy_ref
+  Option.iter (fun p -> set_current p) !last_created_by_copy_ref
 
 (** Indicates if we should keep [p] as the current project when calling {!on p}. *)
 let keep_current: bool ref = ref false
@@ -430,7 +430,7 @@ let unjournalized_remove project =
     Set_Current_Hook_User.apply c
   end;
   (* if we removed the last created_by_copy project, there is no last one *)
-  Extlib.may
+  Option.iter
     (fun p -> if equal project p then last_created_by_copy_ref := None)
     !last_created_by_copy_ref;
   (* clear all the states of other projects referring to the delete project *)
diff --git a/src/libraries/project/state_builder.ml b/src/libraries/project/state_builder.ml
index 95f0de9613e1260c5300f401052e140c2525a69a..f5c160bdb196f52e71e19c80024fd5646b7b60bd 100644
--- a/src/libraries/project/state_builder.ml
+++ b/src/libraries/project/state_builder.ml
@@ -397,15 +397,15 @@ module Option_ref(Data:Datatype.S)(Info: Info) = struct
   let memo ?change f =
     try
       let old = get () in
-      Extlib.may_map
-        ~dft:old (fun f -> let v = f old in set v; v) change
+      Option.fold
+        ~none:old ~some:(fun f -> let v = f old in set v; v) change
     with Not_found ->
       let data = f () in
       set data;
       data
 
-  let map f = Extlib.opt_map f !(!state)
-  let may f = Extlib.may f !(!state)
+  let map f = Option.map f !(!state)
+  let may f = Option.iter f !(!state)
 
 end
 
@@ -559,8 +559,8 @@ struct
   let memo ?change f key =
     try
       let old = find key in
-      Extlib.may_map
-        ~dft:old (fun f -> let v = f old in replace key v; v) change
+      Option.fold
+        ~none:old ~some:(fun f -> let v = f old in replace key v; v) change
     with Not_found ->
       let data = f key in
       replace key data;
diff --git a/src/libraries/stdlib/extlib.ml b/src/libraries/stdlib/extlib.ml
index 04d1facd71e8c7df8b9a21aef7b9b054ff26f70b..883895c10dad56d1c6ac93cce79477040ef52620 100644
--- a/src/libraries/stdlib/extlib.ml
+++ b/src/libraries/stdlib/extlib.ml
@@ -155,11 +155,6 @@ let rec list_compare cmp_elt l1 l2 =
           let c = cmp_elt v1 v2 in
           if c = 0 then list_compare cmp_elt r1 r2 else c
 
-let list_of_opt =
-  function
-    | None -> []
-    | Some x -> [x]
-
 let opt_of_list =
   function
     | [] -> None
@@ -226,56 +221,10 @@ let list_slice ?(first = 0) ?last l =
   | None -> l
   | Some n -> list_first_n (normalize n - first) l
 
-
-(* ************************************************************************* *)
-(** {2 Arrays} *)
-(* ************************************************************************* *)
-
-let array_exists f a =
-  try
-    for i = 0 to Array.length a - 1 do
-      if f a.(i) then raise Exit
-    done;
-    false
-  with Exit -> true
-
-let array_existsi f a =
-  try
-    for i = 0 to Array.length a - 1 do
-      if f i a.(i) then raise Exit
-    done;
-    false
-  with Exit -> true
-
 (* ************************************************************************* *)
 (** {2 Options} *)
 (* ************************************************************************* *)
 
-let has_some = function None -> false | Some _ -> true
-
-let may f = function
-  | None -> ()
-  | Some x -> f x
-
-(** [may_map f ?dft x] applies [f] to the value of [x] if exists. Otherwise
-    returns the default value [dft].
-    Assume that either [x] or [dft] is defined. *)
-let may_map f ?dft x =
-  match x, dft with
-  | None, None -> assert false
-  | None, Some dft -> dft
-  | Some x, _ -> f x
-
-let opt_map f = function
-  | None -> None
-  | Some x -> Some (f x)
-
-let opt_conv default = function
-  | None -> default
-  | Some x -> x
-
-let opt_if b v = if b then None else Some v
-
 let opt_fold f o b =
   match o with
     | None -> b
@@ -287,35 +236,14 @@ let merge_opt f k o1 o2 =
     | Some x, None | None, Some x -> Some x
     | Some x1, Some x2 -> Some (f k x1 x2)
 
-let opt_bind f = function
-  | None -> None
-  | Some x -> f x
-
 let opt_filter f = function
   | None -> None
   | (Some x) as o -> if f x then o else None
 
-let the ?exn = function
-  | None ->
-    begin match exn with
-      | None -> invalid_arg "Extlib.the"
-      | Some exn -> raise exn
-    end
+let the ~exn = function
+  | None -> raise exn
   | Some x -> x
 
-let find_or_none f v = try Some(f v) with Not_found -> None
-
-let opt_equal f v1 v2 = match v1, v2 with
-  | None, None -> true
-  | Some _, None | None, Some _ -> false
-  | Some v1, Some v2 -> f v1 v2
-
-let opt_compare f v1 v2 = match v1, v2 with
-  | None, None -> 0
-  | Some _, None -> 1
-  | None, Some _ -> -1
-  | Some v1, Some v2 -> f v1 v2
-
 let opt_hash hash v = match v with
   | None -> 31179
   | Some v -> hash v
@@ -330,10 +258,7 @@ let xor x y = if x then not y else y
 (** {2 Performance} *)
 (* ************************************************************************* *)
 
-(* replace "noalloc" with [@@noalloc] for OCaml version >= 4.03.0 *)
-[@@@ warning "-3"]
-external address_of_value: 'a -> int = "address_of_value" "noalloc"
-[@@@ warning "+3"]
+external address_of_value: 'a -> int = "address_of_value" [@@noalloc]
 
 (* ************************************************************************* *)
 (** {2 Exception catcher} *)
diff --git a/src/libraries/stdlib/extlib.mli b/src/libraries/stdlib/extlib.mli
index 7a1204e843cf57bea0b27b12844c5a73774360b1..5bed3af7537fc63e8ff0aca417886287c422070a 100644
--- a/src/libraries/stdlib/extlib.mli
+++ b/src/libraries/stdlib/extlib.mli
@@ -131,10 +131,6 @@ val list_compare : ('a -> 'a -> int) -> 'a list -> 'a list -> int
       with the specified function
       @since Boron-20100401 *)
 
-val list_of_opt: 'a option -> 'a list
-  (** converts an option into a list with 0 or 1 elt.
-      @since Carbon-20111201-beta2 *)
-
 val opt_of_list: 'a list -> 'a option
   (** converts a list with 0 or 1 element into an option.
       @raise Invalid_argument on lists with more than one argument
@@ -188,39 +184,10 @@ val list_slice: ?first:int -> ?last:int -> 'a list -> 'a list
     and inverted ranges result in empty lists.
     @since 18.0-Argon *)
 
-(* ************************************************************************* *)
-(** {2 Arrays} *)
-(* ************************************************************************* *)
-
-val array_exists: ('a -> bool) -> 'a array -> bool
-val array_existsi: (int -> 'a -> bool) -> 'a array -> bool
-
 (* ************************************************************************* *)
 (** {2 Options} *)
 (* ************************************************************************* *)
 
-(** [true] iff its argument is [Some x] 
-    @since Nitrogen-20111001 *)
-val has_some: 'a option -> bool
-
-val may: ('a -> unit) -> 'a option -> unit
-  (** [may f v] applies [f] to [x] if [v = Some(x)] *)
-
-val opt_conv: 'a -> 'a option -> 'a
-  (** [opt_conv default v] returns [default] if [v] is [None] and [a] if
-      [v] is [Some a] *)
-
-val opt_if: bool -> 'a -> 'a option
-(** [opt_if cond v] returns [Some v] if [cond] is [true] and
-    [None] otherwise *)
-
-val may_map: ('a -> 'b) -> ?dft:'b -> 'a option -> 'b
-  (** [may_map f ?dft x] applies [f] to the value of [x] if exists. Otherwise
-      returns the default value [dft].
-      Assume that either [x] or [dft] is defined. *)
-
-val opt_map: ('a -> 'b) -> 'a option -> 'b option
-
 val opt_fold: ('a -> 'b -> 'b) -> 'a option -> 'b -> 'b
 (** @since Oxygen-20120901 *)
 
@@ -237,28 +204,17 @@ val opt_fold: ('a -> 'b -> 'b) -> 'a option -> 'b -> 'b
 val merge_opt:
   ('a -> 'b -> 'b -> 'b) -> 'a -> 'b option -> 'b option -> 'b option
 
-(** [opt_bind f x] returns [None] if [x] is [None] and [f y] if is [Some y]
-    (monadic bind)
-    @since Nitrogen-20111001
-*)
-val opt_bind: ('a -> 'b option) -> 'a option -> 'b option
-
 val opt_filter: ('a -> bool) -> 'a option -> 'a option
 
-val the: ?exn:exn -> 'a option -> 'a
+val the: exn:exn -> 'a option -> 'a
 (** @raise Exn if the value is [None] and [exn] is specified.
     @raise Invalid_argument if the value is [None] and [exn] is not specified.
     @return v if the value is [Some v].
     @modify Magnesium-20151001 add optional argument [exn]
+    @modify Frama-C+dev optional argument [exn] now mandatory; otherwise,
+            use [Option.get], which is equivalent.
     @plugin development guide *)
 
-val find_or_none: ('a -> 'b) -> 'a -> 'b option
-
-val opt_equal : ('a -> 'a -> bool) -> 'a option -> 'a option -> bool
-
-val opt_compare : ('a -> 'a -> int) -> 'a option -> 'a option -> int
-  (** @since Boron-20100401 *)
-
 val opt_hash: ('a -> int) -> 'a option -> int
   (** @since Sodium-20150201 *)
 
@@ -323,7 +279,7 @@ val html_escape: string -> string
 (** [format_string_of_stag stag] returns the string corresponding to [stag],
     or raises an exception if the tag extension is unsupported.
 
-    @since Frama-C+dev
+    @since 22.0-Titanium
  *)
 val format_string_of_stag: Format.stag -> string
 
@@ -331,10 +287,7 @@ val format_string_of_stag: Format.stag -> string
 (** {2 Performance} *)
 (* ************************************************************************* *)
 
-(* replace "noalloc" with [@@noalloc] for OCaml version >= 4.03.0 *)
-[@@@ warning "-3"]
-external address_of_value: 'a -> int = "address_of_value" "noalloc"
-[@@@ warning "+3"]
+external address_of_value: 'a -> int = "address_of_value" [@@noalloc]
 
 (* ************************************************************************* *)
 (** {2 Exception catcher} *)
diff --git a/src/libraries/utils/command.ml b/src/libraries/utils/command.ml
index 45ee755a10e886ebedb484f8ee313e72f0f19ffb..69c523f4b0c7a9f2beddc582af122d8be1aa28c8 100644
--- a/src/libraries/utils/command.ml
+++ b/src/libraries/utils/command.ml
@@ -111,21 +111,23 @@ let print_file file job =
 (* -------------------------------------------------------------------------- *)
 
 type timer = float ref
-type 'a result = Result of 'a | Error of exn
 let dt_max tm dt = match tm with Some r when dt > !r -> r := dt | _ -> ()
 let dt_add tm dt = match tm with Some r -> r := !r +. dt | _ -> ()
-let return = function Result x -> x | Error e -> raise e
-let catch f x = try Result(f x) with e -> Error e
 let time ?rmax ?radd job data =
-  begin
-    let t0 = Sys.time () in
-    let re = catch job data in
+  let t0 = Sys.time () in
+  try
+    let result = job data in
     let t1 = Sys.time () in
     let dt = t1 -. t0 in
     dt_max rmax dt ;
     dt_add radd dt ;
-    return re ;
-  end
+    result
+  with exn ->
+    let t1 = Sys.time () in
+    let dt = t1 -. t0 in
+    dt_max rmax dt ;
+    dt_add radd dt ;
+    raise exn
 
 (* -------------------------------------------------------------------------- *)
 (* --- Process                                                            --- *)
diff --git a/src/libraries/utils/command.mli b/src/libraries/utils/command.mli
index 0643c00007d54479b2fbf20d7b197be26bb72232..676bccd9d2ba57bc27f4ac599d39c63632db72fe 100644
--- a/src/libraries/utils/command.mli
+++ b/src/libraries/utils/command.mli
@@ -62,9 +62,7 @@ val print_file : string -> (Format.formatter -> 'a) -> 'a
 (* ************************************************************************* *)
 
 type timer = float ref
-type 'a result = Result of 'a | Error of exn
-val catch : ('a -> 'b) -> 'a -> 'b result
-val return : 'a result -> 'a
+
 val time : ?rmax:timer -> ?radd:timer -> ('a -> 'b) -> 'a -> 'b
   (** Compute the elapsed time with [Sys.time].
       The [rmax] timer is maximized and the [radd] timer is cumulated.
diff --git a/src/libraries/utils/filepath.ml b/src/libraries/utils/filepath.ml
index f8c06b34ad0296b963227ec3d3131f4372906410..cd139a8b5b16730c54700468acba81773509c532 100644
--- a/src/libraries/utils/filepath.ml
+++ b/src/libraries/utils/filepath.ml
@@ -173,6 +173,8 @@ let add_symbolic_dir name dir =
   Hashtbl.replace symbolic_dirs name dir;
   (insert cwd dir).symbolic_name <- Some name
 
+let reset_symbolic_dirs () = Hashtbl.clear symbolic_dirs
+
 let rec add_uri_path buffer path =
   let open Buffer in
   match path.symbolic_name with
@@ -267,23 +269,36 @@ module Normalized = struct
     if case_sensitive then String.compare s1 s2
     else Extlib.compare_ignore_case s1 s2
 
-  let pretty fmt p = Format.fprintf fmt "%s" (pretty p)
-  let pp_abs fmt p = Format.fprintf fmt "%s" p
   let unknown = normalize ""
   let is_unknown fp = equal fp unknown
+  let special_stdout = normalize "-"
+  let is_special_stdout fp = equal fp special_stdout
+
+  let pretty fmt p =
+    if is_special_stdout p then
+      Format.fprintf fmt "<stdout>"
+    else
+      Format.fprintf fmt "%s" (pretty p)
+  let pp_abs fmt p = Format.fprintf fmt "%s" p
   let is_file fp =
     try
       (Unix.stat (fp :> string)).Unix.st_kind = Unix.S_REG
     with _ -> false
 
   let to_base_uri name =
-    if is_relative name then None, skip_dot name
-    else begin
-      let p = insert cwd name in
-      let buf = Buffer.create 80 in
-      let res = add_uri_path buf p in
-      res, Buffer.contents buf
-    end
+    let p = insert cwd name in
+    let buf = Buffer.create 80 in
+    let res = add_uri_path buf p in
+    let uri =
+      Buffer.contents buf in
+    let uri =
+      try
+        if String.get uri 0 = '/' then
+          String.sub uri 1 (String.length uri - 1)
+        else uri
+      with Invalid_argument _ -> uri
+    in
+    res, uri
 end
 
 type position =
diff --git a/src/libraries/utils/filepath.mli b/src/libraries/utils/filepath.mli
index dae52a5ab344512dfff8b234a58b08bfd63a44da..346e3c3fc15fc20dc03b08c8fb111141957f5820 100644
--- a/src/libraries/utils/filepath.mli
+++ b/src/libraries/utils/filepath.mli
@@ -89,10 +89,14 @@ val pretty: string -> string
     printed identically in different machines. *)
 val add_symbolic_dir: string -> string -> unit
 
+(** Remove all symbolic dirs that have been added earlier.
+    @since Frama-C+dev *)
+val reset_symbolic_dirs: unit -> unit
+
 (** Returns the list of symbolic dirs added via [add_symbolic_dir], plus
     preexisting ones (e.g. FRAMAC_SHARE), as pairs (name, dir).
 
-    @since Frama-C+dev
+    @since 22.0-Titanium
 *)
 val all_symbolic_dirs: unit -> (string * string) list
 
@@ -114,7 +118,7 @@ module Normalized: sig
       resulting from the concatenation of [dir] ^ "/" ^ [file].
       The resulting path must respect [existence].
 
-      @since Frama-C+dev
+      @since 22.0-Titanium
   *)
   val concat: ?existence:existence -> t -> string -> t
 
@@ -156,10 +160,15 @@ module Normalized: sig
   (** @since 20.0-Calcium *)
   val is_unknown: t -> bool
 
+  (** [is_special_stdout f] returns [true] iff [f] is '-' (a single dash),
+      which is a special notation for 'stdout'.
+      @since Frama-C+dev *)
+  val is_special_stdout: 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 *)
+      @since 22.0-Titanium *)
   val is_file: t -> bool
 
   (** [to_base_uri path] returns a pair [prefix, rest], according to the
@@ -171,7 +180,7 @@ module Normalized: sig
         E.g. for the path "FRAMAC_SHARE/libc/string.h", returns
         ("FRAMAC_SHARE", "libc/string.h").
 
-      @since Frama-C+dev
+      @since 22.0-Titanium
   *)
   val to_base_uri: t -> string option * string
 end
diff --git a/src/libraries/utils/floating_point.ml b/src/libraries/utils/floating_point.ml
index 63c67cd7a57612bf07140f07269a0442f07bf13f..e86a8df5f1b6cb8e8f746abd8f2ea87dcffac109 100644
--- a/src/libraries/utils/floating_point.ml
+++ b/src/libraries/utils/floating_point.ml
@@ -29,17 +29,12 @@ let string_of_c_rounding_mode = function
   | FE_Downward -> "FE_DOWNWARD"
   | FE_TowardZero -> "FE_TOWARDZERO"
 
-(* replace "noalloc" with [@@noalloc] for OCaml version >= 4.03.0 *)
-[@@@ warning "-3"]
-
-external set_round_downward: unit -> unit = "set_round_downward" "noalloc"
-external set_round_upward: unit -> unit = "set_round_upward" "noalloc"
-external set_round_nearest_even: unit -> unit = "set_round_nearest_even" "noalloc"
-external set_round_toward_zero : unit -> unit = "set_round_toward_zero" "noalloc"
-external get_rounding_mode: unit -> c_rounding_mode = "get_rounding_mode" "noalloc"
-external set_rounding_mode: c_rounding_mode -> unit = "set_rounding_mode" "noalloc"
-
-[@@@ warning "+3"]
+external set_round_downward: unit -> unit = "set_round_downward" [@@noalloc]
+external set_round_upward: unit -> unit = "set_round_upward" [@@noalloc]
+external set_round_nearest_even: unit -> unit = "set_round_nearest_even" [@@noalloc]
+external set_round_toward_zero : unit -> unit = "set_round_toward_zero" [@@noalloc]
+external get_rounding_mode: unit -> c_rounding_mode = "get_rounding_mode" [@@noalloc]
+external set_rounding_mode: c_rounding_mode -> unit = "set_rounding_mode" [@@noalloc]
 
 external round_to_single_precision_float: float -> float = "round_to_float"
 external sys_single_precision_of_string: string -> float =
diff --git a/src/libraries/utils/json.mli b/src/libraries/utils/json.mli
index f374ebf853bda2feb075aa70ca7fc4a1b70922d7..80ffaf64513064f8ffcb5b9c9ae1d41f6343f2da 100644
--- a/src/libraries/utils/json.mli
+++ b/src/libraries/utils/json.mli
@@ -125,3 +125,67 @@ val field : string -> t -> t
     [Null] is considered an empty object.
     @raise Not_found if the field is absent from the object.
     @raise Invalid_argument if the object is not an [Assoc] or [Null] object. *)
+
+(** The functions below read and write to JSON files asynchronously; they are
+    intended to be called at different times during execution.
+    To avoid reopening, re-reading and rewriting the same file several times,
+    they instead operate as following:
+    - Read the file on first use, and store it in memory;
+    - Perform merge operations using the in-memory representations;
+    - Flush the final form to disk before quitting Frama-C.
+      The latter is done via function [json_flush_cache] below, which is setup
+      to run with an [at_exit] trigger.
+
+    Note: no other functions should modify the contents of [path]; any
+    modifications will be overwritten when the cache is flushed.
+
+    @since Frama-C+dev
+*)
+
+(** Exception raised by the functions below when incompatible types are
+    merged. *)
+exception CannotMerge of string
+
+(**
+   [merge_object path json_obj] recursively merges the object [json_obj] into the
+   JSON file [path]. If [path] does not exist, it is created.
+   Merge consists in combining values with the same key, e.g. if [path]
+   already contains an object {"kernel": {"options": ["a"]}}, and
+   [json_obj] is {"kernel": {"options": ["b"]}}, the result will be
+   {"kernel": {"options": ["a", "b"]}}. Cannot merge heterogeneous
+   objects, i.e. in the previous example, if "options" were associated
+   with a string in [path], trying to merge an array into it would
+   raise [JsonCannotMerge].
+   The merged object is updated in the memory cache.
+
+   @raise [CannotMerge] if the objects have conflicting types for
+   the same keys, or if the root JSON element is not an object.
+   @since Frama-C+dev
+*)
+val merge_object : Filepath.Normalized.t -> Yojson.Basic.t -> unit
+
+(**
+   [merge_list path json_array] merges the array [json_array] into the
+   JSON file [path]. See [merge_object] for more details.
+   Unlike objects, arrays are merged by simply concatenating their list
+   of elements.
+
+   @raise [CannotMerge] if the root JSON element is not an array.
+   @since Frama-C+dev
+*)
+val merge_array : Filepath.Normalized.t -> Yojson.Basic.t -> unit
+
+(**
+   [from_file path] opens [path] and stores its JSON object in
+   a memory cache, to be used by the other related functions.
+   @since Frama-C+dev
+*)
+val from_file: Filepath.Normalized.t -> Yojson.Basic.t
+
+(**
+   Flushes the JSON objects in the cache. Returns the names of the written
+   files.
+
+   @since Frama-C+dev
+*)
+val flush_cache : unit -> Filepath.Normalized.t list
diff --git a/src/libraries/utils/json.mll b/src/libraries/utils/json.mll
index f17c82ac25de8d3bc772b2ea4eb1141432190980..7368c65f3e4763bb9481816f3db45f43fd992596 100644
--- a/src/libraries/utils/json.mll
+++ b/src/libraries/utils/json.mll
@@ -296,4 +296,94 @@ let of_list xs = `List xs
 let of_array xs = `List (Array.to_list xs)
 let of_fields m = `Assoc m
 
+
+(* JSON file cache and merging *)
+
+exception CannotMerge of string
+
+(* Table of filepaths to JSON arrays, to be written at the end of a run *)
+let json_tbl = Hashtbl.create 3
+
+let rec merge_assoc_lists la lb =
+  let cmp = fun (k1, _) (k2, _) -> String.compare k1 k2 in
+  let rec aux acc l1 l2 =
+    match l1, l2 with
+    | [], [] -> acc
+    | [], l | l, [] -> List.rev_append l acc
+    | e1 :: r1, e2 :: r2 ->
+      let c = cmp e1 e2 in
+      if c < 0 then aux (e1 :: acc) r1 l2
+      else if c > 0 then aux (e2 :: acc) l1 r2
+      else (* c = 0 *)
+        let (k1, v1) = e1 in
+        let (_, v2) = e2 in
+        match v1, v2 with
+        | `Assoc a1, `Assoc a2 ->
+          let v = `Assoc (merge_assoc_lists a1 a2) in
+          aux ((k1, v) :: acc) r1 r2
+        | `List l1, `List l2 ->
+          let v = `List (l1 @ l2) in
+          aux ((k1, v) :: acc) r1 r2
+        | o1, o2 ->
+          let pp = Yojson.Basic.pretty_to_string in
+          raise (CannotMerge
+                   ("cannot merge heterogeneous objects '"
+                    ^ pp o1 ^ "' and '" ^ pp o2 ^ "'"))
+  in
+  let r = aux [] (List.sort cmp la) (List.sort cmp lb) in
+  List.rev r
+
+let merge_object path json_root_obj =
+  let open Yojson.Basic.Util in
+  let existing_root_obj =
+    try
+      match Hashtbl.find json_tbl path with
+      | `Assoc _ as root -> root
+      | _ -> raise (CannotMerge "JSON root element should be an object")
+    with Not_found ->
+      `Assoc []
+  in
+  let existing_assoc = existing_root_obj |> to_assoc in
+  let new_assoc = json_root_obj |> to_assoc in
+  let merged = merge_assoc_lists existing_assoc new_assoc in
+  let merged_obj = `Assoc merged in
+  Hashtbl.replace json_tbl path merged_obj
+
+let merge_array path json_root_array =
+  let open Yojson.Basic.Util in
+  let existing_root_array =
+    try
+      match Hashtbl.find json_tbl path with
+      | `List _ as root -> root
+      | _ -> raise (CannotMerge "JSON root element should be an array")
+    with Not_found ->
+      `List []
+  in
+  let existing_list = existing_root_array |> to_list in
+  let new_list = json_root_array |> to_list in
+  let merged_list = `List (existing_list @ new_list) in
+  Hashtbl.replace json_tbl path merged_list
+
+let flush_cache () =
+  let written =
+    Hashtbl.fold (fun (path : Filepath.Normalized.t) json acc ->
+        let oc = open_out (path:>string) in
+        Yojson.Basic.pretty_to_channel oc json;
+        output_char oc '\n'; (* ensure JSON file terminates with a newline *)
+        path :: acc
+      ) json_tbl []
+  in
+  Hashtbl.clear json_tbl;
+  List.rev written
+
+let json_cache = Hashtbl.create 3
+
+let from_file (path : Filepath.Normalized.t) =
+  try
+    Hashtbl.find json_cache path
+  with Not_found ->
+    let json = Yojson.Basic.from_file (path:>string) in
+    Hashtbl.replace json_cache path json;
+    json
+
 }
diff --git a/src/libraries/utils/pretty_utils.ml b/src/libraries/utils/pretty_utils.ml
index 2d192599aaa33325aae95373c5c550bd34c703fd..88f0292af0f64bbc76f10ecc87c2086d67edbc6e 100644
--- a/src/libraries/utils/pretty_utils.ml
+++ b/src/libraries/utils/pretty_utils.ml
@@ -34,7 +34,7 @@ let sfprintf = Format.asprintf
 let to_string ?margin pp x =
   let b = Buffer.create 20 in
   let f = Format.formatter_of_buffer b in
-  Extlib.may (Format.pp_set_margin f) margin;
+  Option.iter (Format.pp_set_margin f) margin;
   pp f x ;
   Format.pp_print_flush f () ;
   Buffer.contents b
diff --git a/src/libraries/utils/task.ml b/src/libraries/utils/task.ml
index 164a847defba67d1c9dbdbe964127a9f570c01fb..b3312aa812ac6a6f7871fff4ce9e21a350e25c8c 100644
--- a/src/libraries/utils/task.ml
+++ b/src/libraries/utils/task.ml
@@ -469,7 +469,7 @@ let schedule server q =
     done
   with Queue.Empty -> ()
 
-let rec run_server server () =
+let server_progress server () =
   begin
     server.running <- List.filter
         (fun task ->
@@ -479,30 +479,29 @@ let rec run_server server () =
                server.terminated <- succ server.terminated ; false )
         ) server.running ;
     Array.iter (schedule server) server.queue ;
-    try
-      Db.yield ();
-      fire server.activity ;
-      if server.running <> [] then
-        begin
-          if not server.waiting && is_empty server then
-            begin
-              fire server.wait ;
-              server.waiting <- true ;
-            end ;
-          true
-        end
-      else
-        begin
-          fire server.stop ;
-          server.scheduled <- 0 ;
-          server.terminated <- 0 ;
-          false
-        end
-    with _ -> (* Db.Cancel ... *)
-      cancel_all server ;
-      run_server server ()
+    let () =
+      try Db.yield ()
+      with Db.Cancel -> cancel_all server
+    in
+    fire server.activity ;
+    if server.running <> [] then
+      begin
+        if not server.waiting && is_empty server then
+          begin
+            fire server.wait ;
+            server.waiting <- true ;
+          end ;
+        true
+      end
+    else
+      begin
+        fire server.stop ;
+        server.scheduled <- 0 ;
+        server.terminated <- 0 ;
+        false
+      end
   end
 
 let launch server =
   if server.scheduled > server.terminated
-  then ( fire server.start ; !on_idle (run_server server) )
+  then ( fire server.start ; !on_idle (server_progress server) )
diff --git a/src/plugins/aorai/.gitignore b/src/plugins/aorai/.gitignore
index 5399e015e75a1830d34ad39f4e91031701ef53b5..133e7ee58791b7be412150422031b39abc704656 100644
--- a/src/plugins/aorai/.gitignore
+++ b/src/plugins/aorai/.gitignore
@@ -5,3 +5,4 @@
 /tests/*/result
 /tests/test_config_prove
 /tests/*/result_prove
+/top
diff --git a/src/plugins/aorai/Makefile.in b/src/plugins/aorai/Makefile.in
index a816d71fcd56a6f5ab7c3250b2f94e79d66c06b3..c39a616ce7e5ea1bb53d8bbd826cdc308701d539 100644
--- a/src/plugins/aorai/Makefile.in
+++ b/src/plugins/aorai/Makefile.in
@@ -51,6 +51,8 @@ PLUGIN_CMO:= bool3 \
 	path_analysis \
 	promelaoutput \
 	logic_simplification \
+	aorai_graph \
+	aorai_metavariables \
 	data_for_aorai \
 	aorai_utils \
 	ltl_output \
diff --git a/src/plugins/aorai/aorai_dataflow.ml b/src/plugins/aorai/aorai_dataflow.ml
index 554af1f3639ad3531632e0f8dfec0de3e106852b..13bf13719f7650a0b0c82d1e37f6f30cdcc42a27 100644
--- a/src/plugins/aorai/aorai_dataflow.ml
+++ b/src/plugins/aorai/aorai_dataflow.ml
@@ -265,7 +265,7 @@ let actions_to_range l =
   in List.fold_left treat_one_action Cil_datatype.Term.Map.empty l
 
 let make_start_transition ?(is_main=false) kf init_states =
-  let auto = Data_for_aorai.getAutomata () in
+  let auto = Data_for_aorai.getGraph () in
   let is_crossable = 
     if is_main then 
       Aorai_utils.isCrossableAtInit 
@@ -276,8 +276,7 @@ let make_start_transition ?(is_main=false) kf init_states =
     let my_trans = Path_analysis.get_transitions_of_state state auto in
     let treat_one_trans acc trans =
         if is_crossable trans kf then begin
-          let (_,action) = trans.cross in
-          let bindings = actions_to_range action in
+          let bindings = actions_to_range trans.actions in
           let fst_set =
             Data_for_aorai.Aorai_state.Set.singleton trans.stop
           in
@@ -303,14 +302,13 @@ let make_start_transition ?(is_main=false) kf init_states =
 let make_return_transition kf state =
   let s = Kernel_function.find_return kf in
   set_return_state s state;
-  let auto = Data_for_aorai.getAutomata () in
+  let auto = Data_for_aorai.getGraph () in
   let treat_one_state state bindings acc =
     let my_trans = Path_analysis.get_transitions_of_state state auto in
     let last = Data_for_aorai.Aorai_state.Set.singleton state in
     let treat_one_trans acc trans =
       if Aorai_utils.isCrossable trans kf Promelaast.Return then begin
-        let (_,action) = trans.cross in
-        let my_bindings = actions_to_range action in
+        let my_bindings = actions_to_range trans.actions in
         let new_bindings = compose_actions bindings (last, last, my_bindings) in
         add_or_merge trans.stop new_bindings acc
       end else acc
@@ -473,6 +471,7 @@ module Computer(I: Init) = struct
         do_call s v args d
       | Call (_,e,_,_) ->
         Aorai_option.not_yet_implemented
+          ~source:(fst e.eloc)
           "Indirect call to %a is not handled yet" Printer.pp_exp e
       | Local_init (v, ConsInit(f,args,kind),_) ->
         let args =
@@ -624,7 +623,7 @@ let compute_forward () =
   if Data_for_aorai.isIgnoredFunction (Kernel_function.get_name kf) then
     Aorai_option.abort "Main function %a is ignored by Aorai"
       Kernel_function.pretty kf;
-  let (states,_) = Data_for_aorai.getAutomata () in
+  let (states,_) = Data_for_aorai.getGraph () in
   let start = 
     List.fold_left
       (fun acc s ->
@@ -798,6 +797,7 @@ struct
       | Call (_,{ enode = Lval(Var f,NoOffset) },_,_) -> do_call s f state
       | Call (_,e,_,_) ->
         Aorai_option.not_yet_implemented
+          ~source:(fst e.eloc)
           "Indirect call to %a is not handled yet" Printer.pp_exp e
       | Local_init (_,ConsInit(f,_,_),_) -> do_call s f state
       | Local_init (_,AssignInit _,_)
@@ -833,7 +833,7 @@ let filter_possible_states kf states =
 
 let filter_return_states kf states =
   let end_state = Return_state.find (Kernel_function.find_return kf) in
-  let auto = Data_for_aorai.getAutomata () in
+  let auto = Data_for_aorai.getGraph () in
   let is_possible_state start_state state _ =
     try
       let trans = Path_analysis.get_transitions_of_state state auto in
diff --git a/src/plugins/aorai/aorai_graph.ml b/src/plugins/aorai/aorai_graph.ml
new file mode 100644
index 0000000000000000000000000000000000000000..6f957dd83458f358f0927363a17e853b328e084e
--- /dev/null
+++ b/src/plugins/aorai/aorai_graph.ml
@@ -0,0 +1,70 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  This file is part of Aorai plug-in of Frama-C.                        *)
+(*                                                                        *)
+(*  Copyright (C) 2007-2020                                               *)
+(*    CEA (Commissariat à l'énergie atomique et aux énergies              *)
+(*         alternatives)                                                  *)
+(*    INRIA (Institut National de Recherche en Informatique et en         *)
+(*           Automatique)                                                 *)
+(*    INSA  (Institut National des Sciences Appliquees)                   *)
+(*                                                                        *)
+(*  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 Promelaast
+
+type state = Promelaast.state
+type transition = Promelaast.typed_trans
+
+module Vertex =
+struct
+  type t = state
+  let compare x y = Stdlib.compare x.nums y.nums
+  let hash x = Hashtbl.hash x.nums
+  let equal x y = x.nums = y.nums
+  let default = {
+    nums = -1; name = ""; multi_state = None;
+    acceptation = Bool3.False; init = Bool3.False
+  }
+end
+
+module Edge =
+struct
+  type t = transition
+  let compare x y = Stdlib.compare x.numt y.numt
+  let default = {
+    numt = -1; start = Vertex.default; stop = Vertex.default;
+    cross = TTrue; actions = []
+  }
+end
+
+include Graph.Imperative.Digraph.ConcreteBidirectionalLabeled (Vertex) (Edge)
+
+let of_automaton auto =
+  let g = create () in
+  List.iter (fun t -> add_edge_e g (t.start,t,t.stop)) auto.trans;
+  g
+
+let states g =
+  fold_vertex (fun v acc -> v :: acc) g []
+
+let filter_states f g =
+  fold_vertex (fun v acc -> if f v then v :: acc else acc) g []
+
+let init_states g =
+  filter_states (fun v -> v.Promelaast.init = Bool3.True) g
+
+let edges g =
+  fold_edges_e (fun e acc -> e :: acc) g []
diff --git a/src/plugins/aorai/aorai_graph.mli b/src/plugins/aorai/aorai_graph.mli
new file mode 100644
index 0000000000000000000000000000000000000000..8735c3cc1e7e89a420359612647f33a25d589f95
--- /dev/null
+++ b/src/plugins/aorai/aorai_graph.mli
@@ -0,0 +1,41 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  This file is part of Aorai plug-in of Frama-C.                        *)
+(*                                                                        *)
+(*  Copyright (C) 2007-2020                                               *)
+(*    CEA (Commissariat à l'énergie atomique et aux énergies              *)
+(*         alternatives)                                                  *)
+(*    INRIA (Institut National de Recherche en Informatique et en         *)
+(*           Automatique)                                                 *)
+(*    INSA  (Institut National des Sciences Appliquees)                   *)
+(*                                                                        *)
+(*  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).            *)
+(*                                                                        *)
+(**************************************************************************)
+
+type state = Promelaast.state
+type transition = Promelaast.typed_trans
+type edge = state * transition * state
+
+include Graph.Sig.I
+  with type V.t = state
+   and type V.label = state
+   and type E.t = edge
+   and type E.label = transition
+   and type edge := edge
+
+val of_automaton : Promelaast.typed_automaton -> t
+
+val states : t -> state list
+val init_states : t -> state list
+val edges : t -> edge list
diff --git a/src/plugins/aorai/aorai_metavariables.ml b/src/plugins/aorai/aorai_metavariables.ml
new file mode 100644
index 0000000000000000000000000000000000000000..2692a1658d3b28745a43c09b89bd225610c76e13
--- /dev/null
+++ b/src/plugins/aorai/aorai_metavariables.ml
@@ -0,0 +1,161 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  This file is part of Aorai plug-in of Frama-C.                        *)
+(*                                                                        *)
+(*  Copyright (C) 2007-2020                                               *)
+(*    CEA (Commissariat à l'énergie atomique et aux énergies              *)
+(*         alternatives)                                                  *)
+(*    INRIA (Institut National de Recherche en Informatique et en         *)
+(*           Automatique)                                                 *)
+(*    INSA  (Institut National des Sciences Appliquees)                   *)
+(*                                                                        *)
+(*  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 Promelaast
+
+let dkey = Aorai_option.register_category "check-metavar"
+
+
+module VarSet = Cil_datatype.Varinfo.Set
+
+let pretty_set fmt set =
+  let l = VarSet.elements set in
+  Pretty_utils.pp_list ~sep:", " Cil_printer.pp_varinfo fmt l
+
+let pretty_state fmt st =
+  Format.pp_print_string fmt st.Promelaast.name
+
+let pretty_trans fmt tr =
+  Format.fprintf fmt "from %a to %a:@\n{ @[%a@] } %a"
+    pretty_state tr.start
+    pretty_state tr.stop
+    Promelaoutput.Typed.print_condition tr.cross
+    Promelaoutput.Typed.print_actionl tr.actions
+
+
+module type InitAnalysisParam =
+sig
+  val is_metavariable : varinfo -> bool
+end
+
+module InitAnalysis (Env : InitAnalysisParam) =
+struct
+  type vertex = Aorai_graph.E.vertex
+  type edge = Aorai_graph.E.t
+  type g = Aorai_graph.t
+
+  type data = Bottom | InitializedSet of VarSet.t
+
+  let top = InitializedSet VarSet.empty
+
+  let init v =
+    if v.Promelaast.init = Bool3.True then top else Bottom
+
+  let direction = Graph.Fixpoint.Forward
+
+  let equal d1 d2 =
+    match d1, d2 with
+    | Bottom, d | d, Bottom -> d = Bottom
+    | InitializedSet s1, InitializedSet s2 -> VarSet.equal s1 s2
+
+  let join d1 d2 =
+    match d1, d2 with
+    | Bottom, d | d, Bottom -> d
+    | InitializedSet s1, InitializedSet s2 ->
+      InitializedSet (VarSet.inter s1 s2)
+
+  let _pretty_data fmt = function
+    | Bottom -> Format.printf "Bottom"
+    | InitializedSet set -> pretty_set fmt set
+
+  let check tr used initialized =
+    let diff = VarSet.diff used initialized in
+    if not (VarSet.is_empty diff) then
+      Aorai_option.abort
+        "The metavariables %a may not be initialized before the transition %a"
+        pretty_set diff
+        pretty_trans tr
+
+  let term_mvars t =
+    let result = ref VarSet.empty in
+    let v = object
+      inherit Visitor.frama_c_inplace
+      method!vlogic_var_use lv =
+        match lv.lv_origin with
+        | Some vi when Env.is_metavariable vi ->
+          result := VarSet.add vi !result;
+          Cil.SkipChildren
+        | _ -> Cil.SkipChildren
+    end in
+    ignore (Visitor.visitFramacTerm v t);
+    !result
+
+  let rec cond_mvars = function
+    | TAnd (c1,c2) | TOr (c1,c2) -> VarSet.union (cond_mvars c1) (cond_mvars c2)
+    | TNot (c) -> cond_mvars c
+    | TRel (_,t1,t2) -> VarSet.union (term_mvars t1) (term_mvars t2)
+    | TCall _ | TReturn _ | TTrue | TFalse -> VarSet.empty
+
+  let analyze (_,tr,_) = function
+    | Bottom -> Bottom
+    | InitializedSet initialized ->
+      (* Check that the condition uses only initialized variables *)
+      check tr (cond_mvars tr.cross) (initialized);
+      (* Add initialized variables and check the right hand side *)
+      let add initialized = function
+        | Copy_value ((TVar({lv_origin = Some vi}),_),t) ->
+          check tr (term_mvars t) initialized;
+          VarSet.add vi initialized
+        | _ -> initialized
+      in
+      let initialized' = List.fold_left add initialized tr.actions in
+      Aorai_option.debug ~dkey "%a {%a} -> %a {%a}"
+        pretty_state tr.start pretty_set initialized
+        pretty_state tr.stop pretty_set initialized';
+      InitializedSet initialized'
+end
+
+
+let checkInitialization auto =
+  let module P =
+  struct
+    let is_metavariable vi =
+      let module Map = Datatype.String.Map in
+      Map.exists (fun _ -> Cil_datatype.Varinfo.equal vi) auto.metavariables
+  end
+  in
+  let module A = InitAnalysis (P) in
+  let module Fixpoint = Graph.Fixpoint.Make (Aorai_graph) (A) in
+  let g = Aorai_graph.of_automaton auto in
+  let _result = Fixpoint.analyze A.init g in
+  ()
+
+let checkSingleAssignment auto =
+  let check_action tr assigned = function
+    | Copy_value ((TVar({lv_origin = Some vi}),_),_) ->
+      if VarSet.mem vi assigned then
+        Aorai_option.abort
+          "The metavariable %a is assigned several times during the \
+           transition %a"
+          Cil_printer.pp_varinfo vi
+          pretty_trans tr;
+      VarSet.add vi assigned
+    | _ -> assigned
+  in
+  let check_trans tr =
+    ignore (List.fold_left (check_action tr) VarSet.empty tr.actions)
+  in
+  List.iter check_trans auto.trans
diff --git a/src/plugins/aorai/aorai_metavariables.mli b/src/plugins/aorai/aorai_metavariables.mli
new file mode 100644
index 0000000000000000000000000000000000000000..47c4a7a22bacdb49b1d1486d97ccc86f299ab2cc
--- /dev/null
+++ b/src/plugins/aorai/aorai_metavariables.mli
@@ -0,0 +1,28 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  This file is part of Aorai plug-in of Frama-C.                        *)
+(*                                                                        *)
+(*  Copyright (C) 2007-2020                                               *)
+(*    CEA (Commissariat à l'énergie atomique et aux énergies              *)
+(*         alternatives)                                                  *)
+(*    INRIA (Institut National de Recherche en Informatique et en         *)
+(*           Automatique)                                                 *)
+(*    INSA  (Institut National des Sciences Appliquees)                   *)
+(*                                                                        *)
+(*  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).            *)
+(*                                                                        *)
+(**************************************************************************)
+
+val checkInitialization : Promelaast.typed_automaton -> unit
+
+val checkSingleAssignment : Promelaast.typed_automaton -> unit
diff --git a/src/plugins/aorai/aorai_register.ml b/src/plugins/aorai/aorai_register.ml
index 664f3289886e08fbe4ea271b3460dbfd5f3ba63f..d60095bb840c41653edee18abf3f77432119d6c7 100644
--- a/src/plugins/aorai/aorai_register.ml
+++ b/src/plugins/aorai/aorai_register.ml
@@ -50,14 +50,14 @@ let convert_ltl_exprs t =
       | PNot c -> PNot (convert_cond c)
       | PCall _ | PReturn _ | PTrue | PFalse -> cond
       | PRel(Neq,PVar x,PCst _) ->
-        (try 
+        (try
            let (rel,t1,t2) = Hashtbl.find ltl_to_promela x in PRel(rel,t1,t2)
          with Not_found -> cond)
       | PRel _ -> cond
   in
   let rec convert_seq_elt e =
-    { e with 
-      condition = Extlib.opt_map convert_cond e.condition;
+    { e with
+      condition = Option.map convert_cond e.condition;
       nested = convert_seq e.nested; }
   and convert_seq s = List.map convert_seq_elt s in
   let convert_parsed c =
@@ -97,22 +97,45 @@ let ltl_to_ltlLight f_ltl (f_out : Filepath.Normalized.t) =
   with
   | Ltllexer.Error (loc,msg) -> syntax_error loc msg
 
-let load_ya_file f =
+let parse_error' lexbuf msg =
+  let open Lexing in
+  let start_p = Cil_datatype.Position.of_lexing_pos (lexeme_start_p lexbuf)
+  and end_p = Cil_datatype.Position.of_lexing_pos (lexeme_end_p lexbuf)
+  and lexeme = Lexing.lexeme lexbuf in
+  let start_line = start_p.Filepath.pos_lnum in
+  let abort str =
+    Aorai_option.feedback ~source:start_p "%s@.%a, before or at token: %s\n%a@."
+      str
+      Errorloc.pp_location (start_p, end_p)
+      lexeme
+      (Errorloc.pp_context_from_file ~start_line ~ctx:2) start_p;
+    raise (Log.AbortError "aorai")
+  in
+  Pretty_utils.ksfprintf abort msg
+
+let load_ya_file filename  =
+  let channel = check_and_open_in filename "invalid Ya file" in
+  let lexbuf = Lexing.from_channel channel in
+  Lexing.(lexbuf.lex_curr_p <-
+    { lexbuf.lex_curr_p with pos_fname = (filename :> string) });
   try
-    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;
+    let automata = Yaparser.main Yalexer.token lexbuf in
+    close_in channel;
+    Data_for_aorai.setAutomata automata
   with
-  | Yalexer.Error (loc,msg) -> syntax_error loc msg
+  | Parsing.Parse_error | Invalid_argument _ ->
+    parse_error' lexbuf "syntax error"
+  | Yalexer.Lexing_error msg ->
+    parse_error' lexbuf "%s" msg
+
 
 let load_promela_file f  =
   try
     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
+    let auto = Promelalexer.parse c  in
+    let trans = convert_ltl_exprs auto.trans in
     close_in c;
-    Data_for_aorai.setAutomata (s,t);
+    Data_for_aorai.setAutomata { auto with trans };
   with 
   | Promelalexer.Error(loc,msg) -> syntax_error loc msg
 
@@ -236,7 +259,7 @@ let output () =
   (* Dot file *)
   if (Aorai_option.Dot.get()) then
     begin
-      Promelaoutput.output_dot_automata (Data_for_aorai.getAutomata ())
+      Promelaoutput.Typed.output_dot_automata (Data_for_aorai.getAutomata ())
         (!dot_file:>string);
       printverb "Generating dot file    : done\n"
     end;
@@ -255,7 +278,7 @@ let output () =
           printverb "C file generation      : done\n";
         ) ()
     end;
-  
+
   printverb "Finished.\n";
   (* Some test traces. *)
   Data_for_aorai.debug_computed_state ();
@@ -302,7 +325,7 @@ let work () =
       let root = fst (Globals.entry_point ()) in
       if (Aorai_option.Axiomatization.get()) then
         begin
-            (* Step 5 : incrementing pre/post 
+            (* Step 5 : incrementing pre/post
                conditions with states and transitions information *)
           printverb "Refining pre/post      : \n";
           Aorai_dataflow.compute ();
@@ -339,7 +362,7 @@ let work () =
             (* Step 4': Computing the set of possible pre-states and post-states of each function *)
             (*          And so for pre/post transitions *)
           printverb "Abstracting pre/post   : skipped\n";
-          
+
             (* Step 5': incrementing pre/post conditions with states and transitions information *)
           printverb "Refining pre/post      : skipped\n";
 
@@ -353,7 +376,7 @@ let work () =
           Aorai_visitors.add_sync_with_buch file;
           printverb "Annotation of Cil      : partial\n"
         end;
-      
+
       (* Step 8 : clearing tables whose information has been
          invalidated by our transformations.
       *)
diff --git a/src/plugins/aorai/aorai_utils.ml b/src/plugins/aorai/aorai_utils.ml
index 453d6c4381e193fd796a073b4493ed9c8d83c45a..7bae8b34ad4fab3c19e3179626a316d3b725b09a 100644
--- a/src/plugins/aorai/aorai_utils.ml
+++ b/src/plugins/aorai/aorai_utils.ml
@@ -66,8 +66,7 @@ let isCrossable tr func st =
     | TFalse -> False
     | TRel _ -> Undefined
   in
-  let cond,_ = tr.cross in
-  let res = isCross cond <> False in
+  let res = isCross tr.cross <> False in
   Aorai_option.debug ~level:2 "Function %a %s-state, \
                                transition %s -> %s is%s possible" Kernel_function.pretty func
     (if st=Call then "pre" else "post")
@@ -223,7 +222,8 @@ let isCrossableAtInit tr func =
         match base with
         | TVar v ->
           (try
-             Extlib.opt_bind
+             Option.bind
+               v.lv_origin
                (fun v ->
                   let init = Globals.Vars.find v in
                   let init = match init.Cil_types.init with
@@ -231,7 +231,6 @@ let isCrossableAtInit tr func =
                     | Some i -> i
                   in
                   aux_init off init)
-               v.lv_origin
            with Not_found -> None)
         | TMem t ->
           (match (aux t).term_node with
@@ -307,8 +306,7 @@ let isCrossableAtInit tr func =
     | TRel(rel,t1,t2) -> eval_rel_at_init rel t1 t2
 
   in
-  let (cond,_) = tr.cross in
-  match isCross cond with
+  match isCross tr.cross with
   | Bool3.True | Bool3.Undefined -> true
   | Bool3.False -> false
 
@@ -557,7 +555,7 @@ let mk_behavior_call generated_kf kf bhv =
 (* Translate the cross condition of an automaton edge to an expression.
    Used in mk_stmt. This might generate calls to auxiliary functions, to
    take into account a guard that uses a function behavior. *)
-let crosscond_to_exp generated_kf curr_f curr_status loc (cond,_) res =
+let crosscond_to_exp generated_kf curr_f curr_status loc cond res =
   let check_current_event f status =
     Kernel_function.equal curr_f f && curr_status = status
   in
@@ -837,12 +835,14 @@ let is_state_pred state =
       (Req,one_term(),
        Logic_const.tvar (Data_for_aorai.get_state_logic_var state))
 
-let is_state_stmt (state,copy) loc =
-  if Aorai_option.Deterministic.get ()
-  then
-    mkStmtOneInstr
-      ~ghost:true (Set (Cil.var copy, int2enumstate_exp loc state.nums, loc))
-  else mkStmtOneInstr ~ghost:true (Set (Cil.var copy, Cil.one loc, loc))
+let is_state_non_det_stmt (_,copy) loc =
+  mkStmtOneInstr ~ghost:true (Set (Cil.var copy, Cil.one loc, loc))
+
+let is_state_det_stmt state loc =
+  let var = Data_for_aorai.get_varinfo curState in
+  mkStmtOneInstr
+    ~ghost:true (Set (Cil.var var, int2enumstate_exp loc state.nums, loc))
+
 
 let is_state_exp state loc =
   if Aorai_option.Deterministic.get ()
@@ -896,7 +896,7 @@ let mk_global_comment txt = mk_global (GText (txt))
 (** {b Initialization management / computation} *)
 
 let mk_global_states_init root =
-  let (states,_ as auto) = Data_for_aorai.getAutomata () in
+  let (states,_ as auto) = Data_for_aorai.getGraph () in
   let states = List.sort Data_for_aorai.Aorai_state.compare states in
   let is_possible_init state =
     state.Promelaast.init = Bool3.True &&
@@ -931,7 +931,7 @@ class visit_decl_loops_init () =
         match stmt.skind with
         | Loop _ ->
           let scope = Kernel_function.find_enclosing_block stmt in
-          let f = Extlib.the self#current_func in
+          let f = Option.get self#current_func in
           let name = Data_for_aorai.loopInit ^ "_" ^ (string_of_int stmt.sid) in
           let typ =
             Cil.typeAddAttributes
@@ -1049,7 +1049,7 @@ let pred_of_condition subst subst_res label cond =
   snd (aux None true cond)
 
 let mk_deterministic_lemma () =
-  let automaton = Data_for_aorai.getAutomata () in
+  let automaton = Data_for_aorai.getGraph () in
   let make_one_lemma state =
     let label = Cil_types.FormalLabel "L" in
     let disjoint_guards acc trans1 trans2 =
@@ -1059,10 +1059,10 @@ let mk_deterministic_lemma () =
         let subst = Cil_datatype.Logic_var.Hashtbl.create 5 in
         let subst_res = Kernel_function.Hashtbl.create 5 in
         let guard1 =
-          pred_of_condition subst subst_res label (fst trans1.cross)
+          pred_of_condition subst subst_res label trans1.cross
         in
         let guard2 =
-          pred_of_condition subst subst_res label (fst trans2.cross)
+          pred_of_condition subst subst_res label trans2.cross
         in
         let pred = Logic_const.pnot (Logic_const.pand (guard1, guard2)) in
         let quants =
@@ -1092,7 +1092,7 @@ let mk_deterministic_lemma () =
   List.iter make_one_lemma (fst automaton)
 
 let make_enum_states () =
-  let state_list =fst (Data_for_aorai.getAutomata()) in
+  let state_list =fst (Data_for_aorai.getGraph()) in
   let state_list =
     List.map (fun x -> (x.Promelaast.name, x.Promelaast.nums)) state_list
   in
@@ -1122,7 +1122,7 @@ let make_enum_states () =
 
 let getInitialState () =
   let loc = Cil_datatype.Location.unknown in
-  let states = fst (Data_for_aorai.getAutomata()) in
+  let states = fst (Data_for_aorai.getGraph()) in
   let s = List.find (fun x -> x.Promelaast.init = Bool3.True) states in
   Cil.new_exp ~loc (Const (CEnum (find_enum s.nums)))
 
@@ -1165,6 +1165,13 @@ let initGlobals root complete =
   mk_global_comment "//*";
   List.iter mk_global_var (Data_for_aorai.aux_variables());
 
+  let auto = Data_for_aorai.getAutomata () in
+  mk_global_comment "//* ";
+  mk_global_comment "//****************** ";
+  mk_global_comment "//* Metavariables";
+  mk_global_comment "//*";
+  Datatype.String.Map.iter (fun _ -> mk_global_var) auto.metavariables;
+
   if Aorai_option.Deterministic.get () then begin
     (* must flush now previous globals which are used in the lemmas in order to
        be able to put these last ones in the right places in the AST. *)
@@ -1203,7 +1210,7 @@ let automaton_locations loc =
            Logic_const.new_identified_term
              (Logic_const.tvar
                 (Data_for_aorai.get_state_logic_var state)), FromAny)
-        (fst (Data_for_aorai.getAutomata()))
+        (fst (Data_for_aorai.getGraph()))
   in
   (Logic_const.new_identified_term
      (Logic_const.tvar ~loc
@@ -1263,13 +1270,13 @@ let action_assigns trans =
            (Cil.typeOfTermLval (host,my_off)))
         acc
     | Pebble_init(_,v,c) ->
-      let cc = Extlib.the c.lv_origin in
-      let cv = Extlib.the v.lv_origin in
+      let cc = Option.get c.lv_origin in
+      let cv = Option.get v.lv_origin in
       add_if_needed cv (Logic_const.tvar v)
         (add_if_needed cc (Logic_const.tvar c) acc)
     | Pebble_move(_,v1,_,v2) ->
-      let cv1 = Extlib.the v1.lv_origin in
-      let cv2 = Extlib.the v2.lv_origin in
+      let cv1 = Option.get v1.lv_origin in
+      let cv2 = Option.get v2.lv_origin in
       add_if_needed cv1 (Logic_const.tvar v1)
         (add_if_needed cv2 (Logic_const.tvar v2) acc)
   in
@@ -1277,11 +1284,11 @@ let action_assigns trans =
   let empty_pebble =
     match trans.start.multi_state, trans.stop.multi_state with
     | Some(_,aux), None ->
-      let caux = Extlib.the aux.lv_origin in
+      let caux = Option.get aux.lv_origin in
       add_if_needed caux (Logic_const.tvar aux) empty
     | _ -> empty
   in
-  let _,res = List.fold_left treat_one_action empty_pebble (snd trans.cross) in
+  let _,res = List.fold_left treat_one_action empty_pebble trans.actions in
   Writes res
 
 let get_reachable_trans state st auto current_state =
@@ -1327,7 +1334,7 @@ let get_reachable_trans_to state st auto current_state =
 (* force that we have a crossable transition for each state in which the
    automaton might be at current event. *)
 let force_transition loc f st current_state =
-  let (states, _ as auto) = Data_for_aorai.getAutomata () in
+  let (states, _ as auto) = Data_for_aorai.getGraph () in
   (* We iterate aux on all the states, to get
      - the predicate indicating in which states the automaton cannot possibly
        be before the transition (because we can't fire a transition from there).
@@ -1347,7 +1354,7 @@ let force_transition loc f st current_state =
     *)
     let add_one_trans (has_crossable_trans, crossable_non_reject) trans =
       let has_crossable_trans =
-        Logic_simplification.tor has_crossable_trans (fst trans.cross)
+        Logic_simplification.tor has_crossable_trans trans.cross
       in
       let crossable_non_reject =
         crossable_non_reject ||
@@ -1421,7 +1428,7 @@ let partition_action trans =
                                            *)
   in
   let treat_one_trans acc tr =
-    List.fold_left (treat_one_action tr.start) acc (snd tr.cross)
+    List.fold_left (treat_one_action tr.start) acc tr.actions
   in
   List.fold_left treat_one_trans Cil_datatype.Term_lval.Map.empty trans
 
@@ -1450,7 +1457,7 @@ forces that parent states of a state with action are mutually exclusive,
 at least at pebble level.
 *)
 let incompatible_states loc st current_state =
-  let (states,_ as auto) = Data_for_aorai.getAutomata () in
+  let (states,_ as auto) = Data_for_aorai.getGraph () in
   let aux precond state =
     let trans = get_reachable_trans_to state st auto current_state in
     let actions = partition_action trans in
@@ -1523,7 +1530,8 @@ let add_behavior_pebble_actions ~loc f st behaviors state trans =
     let set = Data_for_aorai.pebble_set_at set Logic_const.here_label in
     let treat_action guard res action =
       match action with
-      | Copy_value _ | Counter_incr _ | Counter_init _ -> res
+      | Copy_value _ | Counter_incr _ | Counter_init _ ->
+        res
       | Pebble_init (_,_,v) ->
         let a = Cil_const.make_logic_var_quant aux.lv_name aux.lv_type in
         let guard = rename_pred aux a guard in
@@ -1551,9 +1559,9 @@ let add_behavior_pebble_actions ~loc f st behaviors state trans =
         :: res
     in
     let treat_one_trans acc tr =
-      let guard = crosscond_to_pred (fst tr.cross) f st in
+      let guard = crosscond_to_pred tr.cross f st in
       let guard = Logic_const.pold guard in
-      List.fold_left (treat_action guard) acc (snd tr.cross)
+      List.fold_left (treat_action guard) acc tr.actions
     in
     let res = List.fold_left treat_one_trans [] trans in
     let res = Logic_const.term (Tunion res) set.term_type in
@@ -1562,14 +1570,50 @@ let add_behavior_pebble_actions ~loc f st behaviors state trans =
     in
     Cil.mk_behavior ~name ~assumes ~post_cond () :: behaviors
 
-let mk_action ~loc a =
+(* NB: we assume that the terms coming from YA automata keep quite simple.
+   Notably that they do not introduce themselves any \at. *)
+let make_old loc init t =
+  let vis =
+    object(self)
+      inherit Visitor.frama_c_inplace
+      val is_old = Stack.create ()
+      method private is_old =
+        if Stack.is_empty is_old then false else Stack.top is_old
+      method! vterm t =
+        match t.term_node with
+        | TLval lv ->
+          if Cil_datatype.Term_lval.Set.mem lv init then begin
+            if self#is_old then begin
+              Stack.push false is_old;
+              DoChildrenPost
+                (fun t ->
+                   ignore (Stack.pop is_old);
+                   Logic_const.(tat ~loc (t,here_label)))
+            end else DoChildren
+          end
+          else begin
+            if not self#is_old then begin
+              Stack.push true is_old;
+              DoChildrenPost
+                (fun t ->
+                   ignore (Stack.pop is_old);
+                   Logic_const.told ~loc t)
+            end else DoChildren
+          end
+        | _ -> DoChildren
+    end
+  in Visitor.visitFramacTerm vis t
+
+let mk_action ~loc init a =
   let term_lval lv =
     Logic_const.term ~loc (TLval lv) (Cil.typeOfTermLval lv)
   in
+  let add_lv lv = Cil_datatype.Term_lval.Set.add lv init in
   match a with
   | Counter_init lv ->
     [Logic_const.prel ~loc
-       (Req, term_lval lv, Logic_const.tinteger ~loc 1)]
+       (Req, term_lval lv, Logic_const.tinteger ~loc 1)],
+    add_lv lv
   | Counter_incr lv ->
     [Logic_const.prel ~loc
        (Req, term_lval lv,
@@ -1577,11 +1621,13 @@ let mk_action ~loc a =
           (TBinOp (PlusA,
                    Logic_const.told ~loc (term_lval lv),
                    Logic_const.tinteger ~loc 1))
-          (Cil.typeOfTermLval lv))]
-  | Pebble_init _ | Pebble_move _ -> [] (* Treated elsewhere *)
+          (Cil.typeOfTermLval lv))],
+    add_lv lv
+  | Pebble_init _ | Pebble_move _ -> [],init (* Treated elsewhere *)
   | Copy_value (lv,t) ->
     [Logic_const.prel ~loc
-       (Req, term_lval lv, Logic_const.told t)]
+       (Req, term_lval lv, make_old loc init t)],
+    add_lv lv
 
 let is_reachable state status =
   let treat_one_state _ map = Data_for_aorai.Aorai_state.Map.mem state map in
@@ -1621,28 +1667,59 @@ let get_accessible_transitions auto state status =
   Data_for_aorai.Aorai_state.Set.fold
     (fun s acc -> Path_analysis.get_edges s state auto @ acc) previous_set []
 
+let get_aux_var_bhv_name = function
+  | TVar v, _ ->
+    Data_for_aorai.get_fresh (v.lv_name ^ "_unchanged")
+  | lv ->
+    Aorai_option.fatal "unexpected lval for action variable: %a"
+      Printer.pp_term_lval lv
+
 (* Assumes that we don't have a multi-state here.
    pebbles are handled elsewhere
 *)
-let mk_unchanged_aux_vars trans =
-  let my_aux_vars = Cil_datatype.Term_lval.Set.empty in
-  let add_one_action acc = function
-    | Counter_init lv | Counter_incr lv | Copy_value (lv,_) ->
-      Cil_datatype.Term_lval.Set.add lv acc
-    | Pebble_init _ | Pebble_move _ -> acc
+let mk_unchanged_aux_vars_bhvs loc f st status =
+  let (states,_ as auto) = Data_for_aorai.getGraph() in
+  let add_state_trans acc state =
+    let trans = get_reachable_trans state st auto status in
+    List.rev_append trans acc
   in
-  let add_one_trans acc tr =
-    let (_,actions) = tr.cross in
-    List.fold_left add_one_action acc actions
+  let crossable_trans =
+    List.fold_left add_state_trans [] states
   in
-  let my_aux_vars = List.fold_left add_one_trans my_aux_vars trans in
-  let treat_lval lv acc =
+  let add_trans_aux_var trans map = function
+    | Counter_init lv | Counter_incr lv | Copy_value (lv,_) ->
+      let other_trans =
+        match Cil_datatype.Term_lval.Map.find_opt lv map with
+        | Some l -> l
+        | None -> []
+      in
+      Cil_datatype.Term_lval.Map.add lv (trans :: other_trans) map
+    | Pebble_init _ | Pebble_move _ -> map
+  in
+  let add_trans_aux_vars map trans =
+    List.fold_left (add_trans_aux_var trans) map trans.actions
+  in
+  let possible_actions =
+    List.fold_left add_trans_aux_vars
+      Cil_datatype.Term_lval.Map.empty
+      crossable_trans
+  in
+  let out_trans trans =
+    Logic_const.new_predicate
+      (Logic_const.por ~loc
+         (is_out_of_state_pred trans.start,
+          Logic_const.pnot (crosscond_to_pred trans.cross f st)))
+  in
+  let mk_behavior lv trans acc =
+    let name = get_aux_var_bhv_name lv in
+    let assumes = List.map out_trans trans in
     let t = Data_for_aorai.tlval lv in
     let ot = Logic_const.told t in
     let p = Logic_const.prel (Req,t,ot) in
-    (Normal, Logic_const.new_predicate p) :: acc
+    let post_cond = [Normal, Logic_const.new_predicate p] in
+    Cil.mk_behavior ~name ~assumes ~post_cond () :: acc
   in
-  Cil_datatype.Term_lval.Set.fold treat_lval my_aux_vars []
+  Cil_datatype.Term_lval.Map.fold mk_behavior possible_actions []
 
 let mk_behavior ~loc auto kf e status state =
   Aorai_option.debug "analysis of state %s (%d)"
@@ -1665,15 +1742,14 @@ let mk_behavior ~loc auto kf e status state =
           List.fold_left
             (fun (in_guard, out_guard, all_assigns, action_bhvs) trans ->
                Aorai_option.debug "examining transition %d" trans.numt;
-               let (cond,actions) = trans.cross in
                Aorai_option.debug "transition %d is active" trans.numt;
-               let guard = crosscond_to_pred cond kf e in
+               let guard = crosscond_to_pred trans.cross kf e in
                let my_in_guard,my_out_guard =
                  match state.multi_state with
                  | None -> guard, Logic_const.pnot ~loc guard
                  | Some (_,aux) ->
                    let set =
-                     find_pebble_origin Logic_const.here_label actions
+                     find_pebble_origin Logic_const.here_label trans.actions
                    in
                    pebble_guard ~loc set aux guard,
                    pebble_guard_neg ~loc set aux guard
@@ -1682,7 +1758,7 @@ let mk_behavior ~loc auto kf e status state =
                  Logic_const.pand ~loc (out_guard, my_out_guard)
                in
                let in_guard, all_assigns, action_bhvs =
-                 match actions with
+                 match trans.actions with
                  | [] ->
                    (Logic_const.por ~loc (in_guard,my_in_guard),
                     all_assigns,
@@ -1702,30 +1778,34 @@ let mk_behavior ~loc auto kf e status state =
                      Normal,
                      Logic_const.new_predicate (is_state_pred state)
                    in
-                   let treat_one_action acc a =
-                     let posts = mk_action ~loc a in
+                   let treat_one_action (other_posts, init) a =
+                     let posts, init = mk_action ~loc init a in
                      match state.multi_state  with
                      | None ->
-                       acc @
+                       other_posts @
                        List.map
                          (fun x ->
                             (Normal, Logic_const.new_predicate x))
-                         posts
+                         posts,
+                       init
                      | Some (_,aux) ->
                        let set =
                          find_pebble_origin
-                           Logic_const.pre_label actions
+                           Logic_const.pre_label trans.actions
                        in
-                       acc @
+                       other_posts @
                        List.map
                          (fun x ->
                             (Normal,
                              Logic_const.new_predicate
                                (pebble_post ~loc set aux x)))
-                         posts
+                         posts,
+                       init
                    in
-                   let post_cond =
-                     List.fold_left treat_one_action [post_cond] actions
+                   let post_cond,_ =
+                     List.fold_left treat_one_action
+                       ([post_cond], Cil_datatype.Term_lval.Set.empty)
+                       trans.actions
                    in
                    let assigns = action_assigns trans in
                    let all_assigns = concat_assigns assigns all_assigns in
@@ -1773,7 +1853,7 @@ let mk_behavior ~loc auto kf e status state =
       else begin
         let post_cond =
           match state.multi_state with
-          | None -> mk_unchanged_aux_vars my_trans
+          | None -> [] (* Done elsewhere *)
           | Some (set,_) ->
             let set =
               Data_for_aorai.pebble_set_at set Logic_const.here_label
@@ -1828,7 +1908,7 @@ let auto_func_behaviors loc f st state =
   in
   Aorai_option.debug
     "func behavior for %a (%s)" Kernel_function.pretty f call_or_ret;
-  let (states, _) as auto = Data_for_aorai.getAutomata() in
+  let (states, _) as auto = Data_for_aorai.getGraph() in
   let requires = auto_func_preconditions loc f st state in
   let post_cond =
     let called_pre =
@@ -1868,11 +1948,14 @@ let auto_func_behaviors loc f st state =
   let global_behavior =
     Cil.mk_behavior ~requires ~post_cond ~assigns ()
   in
+  let non_action_behaviors =
+    mk_unchanged_aux_vars_bhvs loc f st state
+  in
   (* Keep behaviors ordered according to the states they describe *)
-  global_behavior :: (List.rev behaviors)
+  global_behavior :: (List.rev_append behaviors non_action_behaviors)
 
 
-let act_convert loc (_,act) res =
+let act_convert loc act res =
   let treat_one_act =
     function
     | Counter_init t_lval ->
@@ -1897,173 +1980,173 @@ let act_convert loc (_,act) res =
   in
   List.map treat_one_act act
 
-let copy_stmt s =
-  let vis = new Visitor.frama_c_refresh (Project.current()) in
-  Visitor.visitFramacStmt vis s
+let mk_transitions_stmt generated_kf loc f st res trans =
+  List.fold_right
+    (fun trans
+      (aux_stmts, aux_vars, new_funcs, exp_from_trans, stmt_from_action) ->
+      let (tr_stmts, tr_vars, tr_funcs, exp) =
+        crosscond_to_exp generated_kf f st loc trans.cross res
+      in
+      let cond = Cil.mkBinOp loc LAnd (is_state_exp trans.start loc) exp in
+      (tr_stmts @ aux_stmts,
+       tr_vars @ aux_vars,
+       Cil_datatype.Varinfo.Set.union tr_funcs new_funcs,
+       Cil.mkBinOp loc LOr exp_from_trans cond,
+       (Cil.copy_exp cond, act_convert loc trans.actions res)
+       :: stmt_from_action))
+    trans
+    ([],[],Cil_datatype.Varinfo.Set.empty, Cil.zero ~loc, [])
+
+let mkIfStmt loc exp1 block1 block2 =
+  Cil.mkStmt ~ghost:true (If (exp1, block1, block2, loc))
+
+let mk_deterministic_stmt
+    generated_kf loc auto f fst status ret state
+    (other_stmts, other_funcs, other_vars, trans_stmts as res) =
+  if is_reachable state status then begin
+    let trans = get_accessible_transitions auto state status in
+    let aux_stmts, aux_vars, aux_funcs, _, stmt_from_action =
+      mk_transitions_stmt generated_kf loc f fst ret trans
+    in
+    let stmts =
+      List.fold_left
+        (fun acc (cond, stmt_act) ->
+           [mkIfStmt loc cond
+              (mkBlock (is_state_det_stmt state loc :: stmt_act))
+              (mkBlock acc)])
+        trans_stmts
+        (List.rev stmt_from_action)
+    in
+    aux_stmts @ other_stmts,
+    Cil_datatype.Varinfo.Set.union aux_funcs other_funcs,
+    aux_vars @ other_vars,
+    stmts
+  end else res
 
-(* mk_stmt loc (states, tr) f fst status state
+(* mk_non_deterministic_stmt loc (states, tr) f fst status state
    Generates the statement updating the variable representing
    the state argument.
    If state is reachable, generates a "If then else" statement, else it is
    just an assignment.
    Used in auto_func_block. *)
-let mk_stmt generated_kf loc (states, tr) f fst status ((st,_) as state) res =
+let mk_non_deterministic_stmt
+    generated_kf loc (states, tr) f fst status ((st,_) as state) res =
   if is_reachable st status then begin
     let useful_trans =  get_accessible_transitions (states,tr) st status in
-    let aux_stmts, new_vars, new_funcs, exp_from_trans,stmt_from_action =
-      List.fold_right
-        (fun trans
-          (aux_stmts, aux_vars, new_funcs, exp_from_trans, stmt_from_action) ->
-          let (tr_stmts, tr_vars, tr_funcs, exp) =
-            crosscond_to_exp generated_kf f fst loc trans.cross res
-          in
-          (tr_stmts @ aux_stmts,
-           tr_vars @ aux_vars,
-           Cil_datatype.Varinfo.Set.union tr_funcs new_funcs,
-           Cil.mkBinOp loc LAnd (is_state_exp trans.start loc) exp
-           ::exp_from_trans,
-           act_convert loc trans.cross res :: stmt_from_action))
-        useful_trans
-        ([],[],Cil_datatype.Varinfo.Set.empty, [], [])
-    in
-    let mkIfStmt exp1 block1 block2 =
-      Cil.mkStmt ~ghost:true (If (exp1, block1, block2, loc))
-    in
-    let if_cond =
-      List.fold_left
-        (fun acc exp -> Cil.mkBinOp loc LOr exp acc)
-        (List.hd exp_from_trans)
-        (List.tl exp_from_trans)
-    in
-    let then_stmt = is_state_stmt state loc in
-    let else_stmt =
-      if Aorai_option.Deterministic.get () then []
-      else [is_out_of_state_stmt state loc]
+    let aux_stmts, new_vars, new_funcs, cond,stmt_from_action =
+      mk_transitions_stmt generated_kf loc f fst res useful_trans
     in
+    let then_stmt = is_state_non_det_stmt state loc in
+    let else_stmt = [is_out_of_state_stmt state loc] in
     let trans_stmts =
-      if Aorai_option.Deterministic.get () then
-        List.fold_left2
-          (fun acc cond stmt_act ->
-             [mkIfStmt cond
-                (mkBlock (copy_stmt then_stmt :: stmt_act)) (mkBlock acc)])
-          else_stmt
-          (List.rev exp_from_trans)
+      let actions =
+        List.fold_left
+          (fun acc (cond, stmt_act) ->
+             if stmt_act = [] then acc
+             else
+               (mkIfStmt loc cond (mkBlock stmt_act) (mkBlock []))::acc)
+          []
           (List.rev stmt_from_action)
-      else
-        let actions =
-          List.fold_left2
-            (fun acc cond stmt_act ->
-               if stmt_act = [] then acc
-               else
-                 (mkIfStmt cond (mkBlock stmt_act) (mkBlock []))::acc)
-            []
-            (List.rev exp_from_trans)
-            (List.rev stmt_from_action)
-        in
-        mkIfStmt if_cond (mkBlock [then_stmt]) (mkBlock else_stmt) :: actions
+      in
+      mkIfStmt loc cond (mkBlock [then_stmt]) (mkBlock else_stmt) :: actions
     in
     new_funcs, new_vars, aux_stmts @ trans_stmts
   end else
-  if Aorai_option.Deterministic.get () then
-    Cil_datatype.Varinfo.Set.empty, [], []
-  else Cil_datatype.Varinfo.Set.empty, [], [is_out_of_state_stmt state loc]
+    Cil_datatype.Varinfo.Set.empty, [], [is_out_of_state_stmt state loc]
 
-let auto_func_block generated_kf loc f st status res =
-  let dkey = func_body_dkey in
-  let call_or_ret =
-    match st with
-    | Promelaast.Call -> "call"
-    | Promelaast.Return -> "return"
+let equalsStmt lval exp loc = (* assignment *)
+  Cil.mkStmtOneInstr ~ghost:true (Set (lval, exp, loc))
+
+let mk_deterministic_body generated_kf loc f st status res =
+  let (states, _ as auto) = Data_for_aorai.getGraph() in
+  let aux_stmts, aux_funcs, aux_vars, trans_stmts =
+    List.fold_right
+      (mk_deterministic_stmt generated_kf loc auto f st status res)
+      states
+      ([], Cil_datatype.Varinfo.Set.empty, [],[])
   in
-  Aorai_option.debug
-    ~dkey "func code for %a (%s)" Kernel_function.pretty f call_or_ret;
-  let (states, _) as auto = Data_for_aorai.getAutomata() in
+  aux_funcs, aux_vars, aux_stmts @ trans_stmts
 
+let mk_non_deterministic_body generated_kf loc f st status res =
   (* For the following tests, we need a copy of every state. *)
-
+  let (states, _) as auto = Data_for_aorai.getGraph() in
   let copies, local_var =
-    if Aorai_option.Deterministic.get () then begin
-      let orig = Data_for_aorai.get_varinfo curState in
-      let copy = Cil.copyVarinfo orig (orig.vname ^ "_tmp") in
-      copy.vglob <- false;
-      List.map (fun st -> (st, copy)) states, [copy]
-    end else begin
-      let bindings =
-        List.map
-          (fun st ->
-             let state_var = Data_for_aorai.get_state_var st in
-             let copy = Cil.copyVarinfo state_var (state_var.vname ^ "_tmp") in
-             copy.vglob <- false;
-             (st,copy))
-          states
-      in bindings, snd (List.split bindings)
-    end
-  in
-  let equalsStmt lval exp = (* assignment *)
-    Cil.mkStmtOneInstr ~ghost:true (Set (lval, exp, loc))
-  in
-  let stmt_begin_list =
-
-    [
-      (* First statement : what is the current status : called or return ? *)
-      equalsStmt
-        (Cil.var (Data_for_aorai.get_varinfo Data_for_aorai.curOpStatus)) (* current status... *)
-        (Cil.new_exp loc (Const (Data_for_aorai.op_status_to_cenum st))); (* ... equals to what it is *)
-
-      (* Second statement : what is the current operation, i.e. which function ?  *)
-      equalsStmt
-        (Cil.var (Data_for_aorai.get_varinfo Data_for_aorai.curOp)) (* current operation ... *)
-        (Cil.new_exp loc (Const (Data_for_aorai.func_to_cenum (Kernel_function.get_name f)))) (* ...equals to what it is  *)
-    ]
-
+    let bindings =
+      List.map
+        (fun st ->
+           let state_var = Data_for_aorai.get_state_var st in
+           let copy = Cil.copyVarinfo state_var (state_var.vname ^ "_tmp") in
+           copy.vglob <- false;
+           (st,copy))
+        states
+    in bindings, snd (List.split bindings)
   in
-
-  (* As we work on copies, they need to be set to their actual values *)
-
   let copies_update =
-    if Aorai_option.Deterministic.get () then
-      let orig = Data_for_aorai.get_varinfo curState in
-      [ equalsStmt (Cil.var (List.hd local_var)) (Cil.evar ~loc orig) ]
-    else
-      List.map
-        (fun (st,copy) ->
-           equalsStmt (Cil.var copy)
-             (Cil.evar ~loc (Data_for_aorai.get_state_var st)))
-        copies
+    List.map
+      (fun (st,copy) ->
+         equalsStmt (Cil.var copy)
+           (Cil.evar ~loc (Data_for_aorai.get_state_var st)) loc)
+      copies
   in
-  (* For each state, we have to generate the statement that will update its copy. *)
   let new_funcs, local_var, main_stmt =
-
     List.fold_left
       (fun (new_funcs, aux_vars, stmts) state ->
          let my_funcs, my_vars, my_stmts =
-           mk_stmt generated_kf loc auto f st status state res
+           mk_non_deterministic_stmt generated_kf loc auto f st status state res
          in
          Cil_datatype.Varinfo.Set.union my_funcs new_funcs,
          my_vars @ aux_vars,
          my_stmts@stmts )
       (Cil_datatype.Varinfo.Set.empty, local_var, [])
       copies
-
   in
 
   (* Finally, we replace the state var values by the ones computed in copies. *)
   let stvar_update =
-    if Aorai_option.Deterministic.get () then
-      let orig = Data_for_aorai.get_varinfo curState in
-      [ equalsStmt (Cil.var orig) (Cil.evar (List.hd local_var))]
+    List.map
+      (fun (state,copy) ->
+         equalsStmt
+           (Cil.var (Data_for_aorai.get_state_var state))
+           (Cil.evar ~loc copy) loc)
+      copies
+  in
+  new_funcs, local_var, copies_update @ main_stmt @ stvar_update
+
+let auto_func_block generated_kf loc f st status res =
+  let dkey = func_body_dkey in
+  let call_or_ret =
+    match st with
+    | Promelaast.Call -> "call"
+    | Promelaast.Return -> "return"
+  in
+  Aorai_option.debug
+    ~dkey "func code for %a (%s)" Kernel_function.pretty f call_or_ret;
+
+  let stmt_begin_list =
+    [
+      (* First statement : what is the current status : called or return ? *)
+      equalsStmt
+        (Cil.var (Data_for_aorai.get_varinfo Data_for_aorai.curOpStatus))
+        (Cil.new_exp loc (Const (Data_for_aorai.op_status_to_cenum st))) loc;
+      (* Second statement : what is the current operation,
+         i.e. which function ?  *)
+      equalsStmt
+        (Cil.var (Data_for_aorai.get_varinfo Data_for_aorai.curOp))
+        (Cil.new_exp loc
+           (Const (Data_for_aorai.func_to_cenum (Kernel_function.get_name f))))
+        loc
+    ]
+  in
+  let new_funcs, local_var, main_stmt =
+    if Aorai_option.Deterministic.get() then
+      mk_deterministic_body generated_kf loc f st status res
     else
-      List.map
-        (fun (state,copy) ->
-           equalsStmt
-             (Cil.var (Data_for_aorai.get_state_var state))
-             (Cil.evar ~loc copy))
-        copies
+      mk_non_deterministic_body generated_kf loc f st status res
   in
   let ret = [ Cil.mkStmt ~ghost:true (Cil_types.Return(None,loc)) ] in
   let res_block =
     (Cil.mkBlock
-       ( stmt_begin_list @ copies_update @ main_stmt @ stvar_update @ ret))
+       ( stmt_begin_list @ main_stmt @ ret))
   in
   res_block.blocals <- local_var;
   Aorai_option.debug ~dkey "Generated body is:@\n%a"
@@ -2071,8 +2154,8 @@ let auto_func_block generated_kf loc f st status res =
   new_funcs,res_block,local_var
 
 let get_preds_wrt_params_reachable_states state f status =
-  let auto = Data_for_aorai.getAutomata () in
-  let treat_one_trans acc tr = Logic_simplification.tor acc (fst tr.cross) in
+  let auto = Data_for_aorai.getGraph () in
+  let treat_one_trans acc tr = Logic_simplification.tor acc tr.cross in
   let find_trans state prev tr =
     Path_analysis.get_edges prev state auto @ tr
   in
diff --git a/src/plugins/aorai/aorai_utils.mli b/src/plugins/aorai/aorai_utils.mli
index 47d4bb47275c2334d1afee6bc16bf632a8c57a0f..efb8b12df79c276e22688cf01d55f06fe5e1e61a 100644
--- a/src/plugins/aorai/aorai_utils.mli
+++ b/src/plugins/aorai/aorai_utils.mli
@@ -32,12 +32,12 @@ open Promelaast
 *)
 
 val isCrossable:
-  (typed_condition * action) trans -> kernel_function -> funcStatus -> bool
+  typed_trans -> kernel_function -> funcStatus -> bool
 
 (** Given a transition and the main entry point it returns if
     the cross condition can be satisfied at the beginning of the program. *)
 val isCrossableAtInit:
-  (typed_condition * action) trans -> kernel_function -> bool
+  typed_trans -> kernel_function -> bool
 
 (** This function rewrites a cross condition into an ACSL expression.
     Moreover, by giving current operation name and its status (call or
@@ -71,9 +71,6 @@ val host_state_term: unit -> Cil_types.term_lval
     corresponding state. *)
 val is_state_pred: state -> predicate
 
-(** Returns the statement saying the state is affected *)
-val is_state_stmt: state * Cil_types.varinfo -> location -> Cil_types.stmt
-
 (** Returns the boolean expression saying the state is affected *)
 val is_state_exp: state -> location -> Cil_types.exp
 
diff --git a/src/plugins/aorai/aorai_visitors.ml b/src/plugins/aorai/aorai_visitors.ml
index a0d12c2dc3e0d065997f9da436a1133bfefce998..f771e84066947d6ff88d6a21fa480a390b6aa254 100644
--- a/src/plugins/aorai/aorai_visitors.ml
+++ b/src/plugins/aorai/aorai_visitors.ml
@@ -33,7 +33,7 @@ open Cil
 let dkey = Aorai_option.register_category "action"
 
 let get_acceptance_pred () =
-  let (st,_) = Data_for_aorai.getAutomata () in
+  let (st,_) = Data_for_aorai.getGraph () in
   List.fold_left
     (fun acc s ->
        match s.acceptation with
@@ -46,6 +46,7 @@ let get_call_name exp = match exp.enode with
   | Lval(Var(vi),NoOffset) -> vi.vname
   | _ ->
     Aorai_option.not_yet_implemented
+      ~source:(fst exp.eloc)
       "At this time, only explicit calls are allowed by the Aorai plugin."
 
 (****************************************************************************)
@@ -120,7 +121,7 @@ class visit_adding_code_for_synchronisation =
     method! vglob_aux g =
       match g with
       | GFun (fundec,loc) ->
-        let kf = Extlib.the self#current_kf in
+        let kf = Option.get self#current_kf in
         let vi = Kernel_function.get_vi kf in
         let vi_pre = Cil_const.copy_with_new_vid vi in
         vi_pre.vname <- Data_for_aorai.get_fresh (vi_pre.vname ^ "_pre_func");
@@ -207,7 +208,7 @@ class visit_adding_code_for_synchronisation =
     method! vstmt_aux stmt =
       match stmt.skind with
       | Return (res,loc)  ->
-        let kf = Extlib.the self#current_kf in
+        let kf = Option.get self#current_kf in
         let vi = Kernel_function.get_vi kf in
         let current_function = vi.vname in
         if not (Data_for_aorai.isIgnoredFunction current_function) then begin
@@ -371,24 +372,24 @@ let pred_reachable reachable_states =
       (nb, reachable,
        Logic_const.pand (unreachable, Aorai_utils.is_out_of_state_pred state))
   in
-  let (states,_) = Data_for_aorai.getAutomata () in
+  let (states,_) = Data_for_aorai.getGraph () in
   let (nb, reachable, unreachable) =
     List.fold_left treat_one_state (0,pfalse,ptrue) states
   in
   (nb > 1, reachable, unreachable)
 
 let possible_start kf (start,int) =
-  let auto = Data_for_aorai.getAutomata () in
+  let auto = Data_for_aorai.getGraph () in
   let trans = Path_analysis.get_edges start int auto in
   let treat_one_trans cond tr =
     Logic_const.por
-      (cond, Aorai_utils.crosscond_to_pred (fst tr.cross) kf Promelaast.Call)
+      (cond, Aorai_utils.crosscond_to_pred tr.cross kf Promelaast.Call)
   in
   let cond = List.fold_left treat_one_trans Logic_const.pfalse trans in
   Logic_const.pand (Aorai_utils.is_state_pred start, cond)
 
 let neg_trans kf trans =
-  let auto = Data_for_aorai.getAutomata () in
+  let auto = Data_for_aorai.getGraph () in
   let rec aux l acc =
     match l with
     | [] -> acc
@@ -409,7 +410,7 @@ let neg_trans kf trans =
              List.fold_left
                (fun cond tr ->
                   Logic_simplification.tand
-                    cond (Logic_simplification.tnot (fst tr.cross)))
+                    cond (Logic_simplification.tnot tr.cross))
                cond trans)
           TTrue same_start
       in
@@ -527,7 +528,7 @@ class visit_adding_pre_post_from_buch treatloops =
         predicate_to_invariant kf stmt pred
       end
     in
-    let (states,_) = Data_for_aorai.getAutomata () in
+    let (states,_) = Data_for_aorai.getGraph () in
     List.iter treat_one_state states;
     if has_multiple_choice then begin
       let add_possible_state state _ acc =
@@ -584,7 +585,7 @@ class visit_adding_pre_post_from_buch treatloops =
     Data_for_aorai.Aorai_state.Map.fold treat_one_state possible_states []
   in
   let partition_pre_state map =
-    let (states,_) = Data_for_aorai.getAutomata () in
+    let (states,_) = Data_for_aorai.getGraph () in
     let is_equiv st1 st2 =
       let check_one _ o1 o2 =
         match o1, o2 with
@@ -840,7 +841,7 @@ class visit_adding_pre_post_from_buch treatloops =
               in
               (i+1,bhv :: bhvs)
           in
-          let (states,_) = Data_for_aorai.getAutomata () in
+          let (states,_) = Data_for_aorai.getGraph () in
           List.rev (snd (List.fold_left aux (0,bhvs) states))
         end
     in
@@ -906,7 +907,7 @@ class visit_adding_pre_post_from_buch treatloops =
     method private leave_block () = !(Stack.pop has_call)
 
     method! vfunc f =
-      let my_kf = Extlib.the self#current_kf in
+      let my_kf = Option.get self#current_kf in
       let vi = Kernel_function.get_vi my_kf in
       let spec = Annotations.funspec my_kf in
       let loc = Kernel_function.get_location my_kf in
@@ -939,7 +940,7 @@ class visit_adding_pre_post_from_buch treatloops =
     method! vglob_aux g =
       match g with
       | GFun(f,_)  ->
-        let my_kf = Extlib.the self#current_kf in
+        let my_kf = Option.get self#current_kf in
         (* don't use get_spec, as we'd generate default assigns,
            while we'll fill the spec just below. *)
         let vi = Kernel_function.get_vi my_kf in
@@ -980,7 +981,7 @@ class visit_adding_pre_post_from_buch treatloops =
       | _ -> DoChildren;
 
     method! vstmt_aux stmt =
-      let kf = Extlib.the self#current_kf in
+      let kf = Option.get self#current_kf in
       let treat_loop body_ref stmt =
         let init_state = Data_for_aorai.get_loop_init_state stmt in
         let inv_state = Data_for_aorai.get_loop_invariant_state stmt in
@@ -1104,7 +1105,7 @@ class visit_adding_pre_post_from_buch treatloops =
           List.iter
             (update_assigns
                (Cil_datatype.Stmt.loc stmt)
-               (Extlib.the self#current_kf)
+               (Option.get self#current_kf)
                (Kstmt stmt))
             specs;
           s
diff --git a/src/plugins/aorai/data_for_aorai.ml b/src/plugins/aorai/data_for_aorai.ml
index 1bcaa67755f6727b12a02562f4759ac52095f220..ec4242b8b794db748713326beae4166d7c5ea4fa 100644
--- a/src/plugins/aorai/data_for_aorai.ml
+++ b/src/plugins/aorai/data_for_aorai.ml
@@ -57,19 +57,18 @@ module Aorai_typed_trans =
   Datatype.Make_with_collections(
     struct
       let name = "Aorai_typed_trans"
-      type t =
-          (Promelaast.typed_condition * Promelaast.action) Promelaast.trans
+      type t = Promelaast.typed_trans
       let structural_descr = Structural_descr.t_abstract
       let reprs = [ { numt = -1; start = List.hd (Aorai_state.reprs);
                       stop = List.hd (Aorai_state.reprs);
-                      cross = (TTrue,[]); } ]
+                      cross = TTrue; actions=[]; } ]
       let equal x y = Datatype.Int.equal x.numt y.numt
       let hash x = x.numt
       let rehash = Datatype.identity
       let compare x y = Datatype.Int.compare x.numt y.numt
       let copy = Datatype.identity
       let internal_pretty_code = Datatype.undefined
-      let pretty = Promelaoutput.print_transition
+      let pretty = Promelaoutput.Typed.print_transition
       let varname _ = assert false
       let mem_project = Datatype.never_any_project
     end)
@@ -133,8 +132,10 @@ let rec is_same_expression e1 e2 =
     | PVar _,_ | _,PVar _ -> false
     | PCst cst1, PCst cst2 -> Logic_utils.is_same_pconstant cst1 cst2
     | PCst _,_ | _,PCst _ -> false
-    | PPrm (f1,x1), PPrm(f2,x2) -> f1 = x1 && f2 = x2
+    | PPrm (f1,x1), PPrm(f2,x2) -> f1 = f2 && x1 = x2
     | PPrm _,_ | _,PPrm _ -> false
+    | PMetavar x, PMetavar y -> x = y
+    | PMetavar _,_ | _,PMetavar _ -> false
     | PBinop(b1,l1,r1), PBinop(b2,l2,r2) ->
       b1 = b2 && is_same_expression l1 l2 && is_same_expression r1 r2
     | PBinop _, _ | _, PBinop _ -> false
@@ -158,7 +159,7 @@ let get_logic name =
 
 let declared_predicates = Hashtbl.create 97
 
-let add_predicate name pred_info = 
+let add_predicate name pred_info =
   Hashtbl.replace declared_predicates name pred_info
 
 let get_predicate name =
@@ -205,7 +206,7 @@ let buch_sync   = "Aorai_Sync"                           (* Deprecated ? *)
 
 (* ************************************************************************* *)
 (* Buchi automata as stored after parsing *)
-let automata = ref ([],[])
+let automata = ref None
 
 (* Each transition with a parametrized cross condition (call param access or return value access) has its parametrized part stored in this array. *)
 let cond_of_parametrizedTransitions = ref (Array.make (1) [[]])
@@ -218,13 +219,24 @@ let functions_from_c = ref []
 let ignored_functions = ref []
 
 (** Return the buchi automata as stored after parsing *)
-let getAutomata () = !automata
+let getAutomata () =
+  match !automata with
+  | Some auto -> auto
+  | None ->
+    Aorai_option.fatal "The automaton has not been compiled yet"
+
+let getGraph () =
+  let auto = getAutomata () in
+  auto.states, auto.trans
 
 (** Return the number of transitions of the automata *)
-let getNumberOfTransitions () = List.length (snd !automata)
+let getNumberOfTransitions () =
+  List.length (getAutomata ()).trans
 
 (** Return the number of states of the automata *)
-let getNumberOfStates () = List.length (fst !automata)
+let getNumberOfStates () =
+  List.length (getAutomata ()).states
+
 
 let is_c_global name =
   try ignore (Globals.Vars.find_from_astinfo name VGlobal); true
@@ -294,7 +306,7 @@ let update_condition vi1 vi2 cond =
 let pebble_set_at li lab =
   assert (li.l_profile = []);
   let labels = List.map (fun _ -> lab) li.l_labels in
-  Logic_const.term (Tapp (li,labels,[])) (Extlib.the li.l_type)
+  Logic_const.term (Tapp (li,labels,[])) (Option.get li.l_type)
 
 let memo_multi_state st =
   match st.multi_state with
@@ -315,8 +327,8 @@ let memo_multi_state st =
     | Some multi_state -> multi_state
 
 let change_bound_var st1 st2 cond =
-  if Extlib.has_some st1.multi_state then begin
-    let (_,idx1) = Extlib.the st1.multi_state in
+  if Option.is_some st1.multi_state then begin
+    let (_,idx1) = Option.get st1.multi_state in
     let (_,idx2) = memo_multi_state st2 in
     update_condition idx1 idx2 cond
   end else cond
@@ -341,11 +353,11 @@ let new_state name =
 
 let new_intermediate_state () = new_state "aorai_intermediate_state"
 
-let new_trans start stop cond =
-  { start = start; stop = stop; cross = cond; numt = TransIndex.next () }
+let new_trans start stop cross actions =
+  { start; stop; cross; actions; numt = TransIndex.next () }
 
 let check_states s =
-  let states,trans = getAutomata() in
+  let {states;trans} = getAutomata() in
   let max = getNumberOfStates () in
   List.iter
     (fun x -> if x.nums >= max then
@@ -354,7 +366,7 @@ let check_states s =
     states;
   List.iter
     (fun x ->
-      try 
+      try
         let y = List.find (fun y -> x.nums = y.nums && not (x==y)) states in
         Aorai_option.fatal "%s: State %s and %s share same id %d"
           s x.name y.name x.nums
@@ -397,25 +409,23 @@ let is_single elt =
    the entire automaton is processed by adding direct transitions from the
    starting state to the children of the end state.
 *)
-type eps_trans =
-    Normal of typed_condition * action
-  | Epsilon of typed_condition * action
-
-let print_epsilon_trans fmt = function
-  | Normal (c,a) ->
-    Format.fprintf fmt "%a%a"
-      Promelaoutput.print_condition c
-      Promelaoutput.print_action a
-  | Epsilon (c,a) ->
-    Format.fprintf fmt "epsilon-trans:@\n%a%a"
-      Promelaoutput.print_condition c
-      Promelaoutput.print_action a
+type 'a eps = Normal of 'a | Epsilon of 'a
+
+let print_eps f fmt = function
+  | Normal x -> f fmt x
+  | Epsilon x -> Format.fprintf fmt "epsilon-trans:@\n%a" f x
+      
+let print_eps_trans fmt tr =
+  Format.fprintf fmt "%s -> %s:@[%a%a@]"
+    tr.start.name tr.stop.name
+    (print_eps Promelaoutput.Typed.print_condition) tr.cross
+    Promelaoutput.Typed.print_actionl tr.actions
 
 type current_event =
   | ECall of
       kernel_function
     * Cil_types.logic_var Cil_datatype.Varinfo.Hashtbl.t
-    * eps_trans Promelaast.trans
+    * (typed_condition eps,typed_action) Promelaast.trans
   | EReturn of kernel_function
   | ECOR of kernel_function
   | ENone (* None found yet *)
@@ -481,11 +491,11 @@ let add_current_event event env cond =
 let merge_current_event env1 env2 cond1 cond2 =
   assert (List.tl env1 == List.tl env2);
   let old_env = List.tl env2 in
-  match (List.hd env1, List.hd env2) with
+  match List.hd env1, List.hd env2 with
       | ENone, _ -> env2, tor cond1 cond2
       | _, ENone -> env1, tor cond1 cond2
       | ECall(kf1,_,_), ECall(kf2,_,_)
-        when Kernel_function.equal kf1 kf2 -> env2,  tor cond1 cond2
+        when Kernel_function.equal kf1 kf2 -> env2, tor cond1 cond2
       | ECall _, ECall _ -> EMulti::old_env, tor cond1 cond2
       | ECall _, EMulti -> env2, tor cond1 cond2
       | ECall (kf1,_,_), ECOR kf2 when Kernel_function.equal kf1 kf2 ->
@@ -540,11 +550,11 @@ let memo_aux_variable tr counter used_prms vi =
     let my_lvar = Cil.cvar_to_lvar my_var in
     Cil_datatype.Varinfo.Hashtbl.add used_prms vi my_lvar;
     (match tr.cross with
-      | Normal (cond,action) ->
-        let st = Extlib.opt_map (fun _ -> tr.stop) counter in
+      | Normal _ ->
+        let st = Option.map (fun _ -> tr.stop) counter in
         let loc = get_bindings st my_lvar in
         let copy = Copy_value (loc,Logic_const.tvar (Cil.cvar_to_lvar vi)) in
-        tr.cross <- Normal(cond,copy::action)
+        tr.actions <- copy :: tr.actions
       | Epsilon _ ->
         Aorai_option.fatal "Epsilon transition used as Call event"
     );
@@ -568,6 +578,13 @@ let check_one top info counter s =
       Some (Logic_const.term (TLval (TResult rt,TNoOffset)) (Ctype rt))
     | ECOR _ | EReturn _ | EMulti | ENone -> None
 
+
+let find_metavar s metaenv =
+  try
+    Datatype.String.Map.find s metaenv
+  with Not_found ->
+    Aorai_option.abort "Metavariable %s not declared" s
+
 let find_in_env env counter s =
   let current, stack =
     match env with
@@ -682,14 +699,17 @@ end
 
 module LTyping = Logic_typing.Make(C_logic_env)
 
-let type_expr env ?tr ?current e =
+let type_expr metaenv env ?tr ?current e =
   let loc = Cil_datatype.Location.unknown in
   let rec aux env cond e =
     match e with
-        PVar s ->
-          let var = find_in_env env current s in
-          env, var, cond
+      | PVar s ->
+        let var = find_in_env env current s in
+        env, var, cond
       | PPrm(f,x) -> find_prm_in_env env ?tr current f x
+      | PMetavar s ->
+        let var = Logic_const.tvar (Cil.cvar_to_lvar (find_metavar s metaenv)) in
+        env, var, cond
       | PCst (Logic_ptree.IntConstant s) ->
         let e = Cil.parseIntLogic ~loc s in
         env, e, cond
@@ -869,13 +889,13 @@ let type_expr env ?tr ?current e =
   in
   aux env TTrue e
 
-let type_cond needs_pebble env tr cond =
+let type_cond needs_pebble metaenv env tr cond =
   let current = if needs_pebble then Some tr.stop else None in
   let rec aux pos env =
     function
       | PRel(rel,e1,e2) ->
-        let env, e1, c1 = type_expr env ~tr ?current e1 in
-        let env, e2, c2 = type_expr env ~tr ?current e2 in
+        let env, e1, c1 = type_expr metaenv env ~tr ?current e1 in
+        let env, e2, c2 = type_expr metaenv env ~tr ?current e2 in
         let call_cond = if pos then tand c1 c2 else tor (tnot c1) (tnot c2) in
         let rel = TRel(Logic_typing.type_rel rel,e1,e2) in
         let cond = if pos then tand call_cond rel else tor call_cond rel in
@@ -885,20 +905,22 @@ let type_cond needs_pebble env tr cond =
       | POr(c1,c2) ->
         let env1, c1 = aux pos env c1 in
         let env2, c2 = aux pos env c2 in
-        merge_current_event env1 env2 c1 c2
+        let env, c = merge_current_event env1 env2 c1 c2 in
+        env, c
       | PAnd(c1,c2) ->
         let env, c1 = aux pos env c1 in
         let env, c2 = aux pos env c2 in
-        env, TAnd(c1,c2)
+        env, TAnd (c1,c2)
       | PNot c ->
-        let env, c = aux (not pos) env c in env, TNot c
+        let env, c = aux (not pos) env c in
+        env, TNot c
       | PCall (s,b) ->
         let kf =
           try Globals.Functions.find_by_name s
           with Not_found -> Aorai_option.abort "No such function: %s" s
         in
         let b =
-          Extlib.opt_map
+          Option.map
             (fun b ->
               let bhvs = Annotations.behaviors ~populate:false kf in
               try List.find (fun x -> x.b_name = b) bhvs
@@ -908,18 +930,24 @@ let type_cond needs_pebble env tr cond =
             b
         in
         if pos then
-          add_current_event
+          let env, c = add_current_event
             (ECall (kf, Cil_datatype.Varinfo.Hashtbl.create 3, tr)) env
             (TCall (kf,b))
-          else env, TCall (kf,b)
+          in
+          env, c
+        else
+          env, TCall (kf,b)
       | PReturn s ->
         let kf =
           try
             Globals.Functions.find_by_name s
           with Not_found -> Aorai_option.abort "No such function %s" s
         in
-        if pos then add_current_event (EReturn kf) env (TReturn kf)
-        else env, TReturn kf
+        if pos then
+          let env,c  = add_current_event (EReturn kf) env (TReturn kf) in
+          env, c
+        else
+          env, TReturn kf
   in
   aux true (ENone::env) cond
 
@@ -941,7 +969,7 @@ let add_if_needed states st =
   then st::states
   else states
 
-let rec type_seq default_state tr env needs_pebble curr_start curr_end seq =
+let rec type_seq default_state tr metaenv env needs_pebble curr_start curr_end seq =
   let loc = Cil_datatype.Location.unknown in
   match seq with
     | [] -> (* We identify start and end. *)
@@ -959,7 +987,7 @@ let rec type_seq default_state tr env needs_pebble curr_start curr_end seq =
       in
       let might_be_zero =
         is_opt ||
-          (match Extlib.the elt.min_rep with PCst _ -> false | _ -> true)
+          (match Option.get elt.min_rep with PCst _ -> false | _ -> true)
       in
       let at_most_one =
         is_opt &&
@@ -989,12 +1017,12 @@ let rec type_seq default_state tr env needs_pebble curr_start curr_end seq =
           | _ -> new_intermediate_state ()
       in
       Aorai_option.debug "Examining single elt:@\n%s -> %s:@[%a@]"
-        curr_start.name my_end.name Promelaoutput.print_seq_elt elt;
+        curr_start.name my_end.name Promelaoutput.Parsed.print_seq_elt elt;
       let guard_exit_loop env current counter =
         if is_opt then TTrue
         else
-          let e = Extlib.the elt.min_rep in
-          let _,e,_ = type_expr env ?current e in
+          let e = Option.get elt.min_rep in
+          let _,e,_ = type_expr metaenv env ?current e in
           (* If we have done at least the lower bound of cycles, we can exit
              the loop. *)
           TRel(Cil_types.Rle,e,counter)
@@ -1009,7 +1037,7 @@ let rec type_seq default_state tr env needs_pebble curr_start curr_end seq =
             let e = Logic_const.tint ~loc i in
             TRel(Cil_types.Rlt, counter, e)
           | Some e ->
-            let _,e,_ = type_expr env ?current e in
+            let _,e,_ = type_expr metaenv env ?current e in
             Max_value_counter.replace counter e;
             (* The counter is incremented after the test: it
                must be strictly less than the upper bound to enter
@@ -1023,16 +1051,18 @@ let rec type_seq default_state tr env needs_pebble curr_start curr_end seq =
             assert (elt.nested <> []);
             (* we don't have a completely empty condition. *)
             type_seq
-              default_state tr env needs_pebble curr_start my_end elt.nested
+              default_state tr metaenv env needs_pebble curr_start my_end elt.nested
           | Some cond ->
             let seq_start =
               match elt.nested with
                   [] -> my_end
                 | _ -> new_intermediate_state ()
             in
-            let trans_start = new_trans curr_start seq_start (Normal (TTrue,[]))
+            let trans_start = new_trans curr_start seq_start (Normal TTrue) []
+            in
+            let inner_env, cond =
+              type_cond needs_pebble metaenv env trans_start cond
             in
-            let inner_env, cond = type_cond needs_pebble env trans_start cond in
             let (env,states, seq_transitions, seq_end) =
               match elt.nested with
                 | [] -> inner_env, [], [], my_end
@@ -1040,15 +1070,15 @@ let rec type_seq default_state tr env needs_pebble curr_start curr_end seq =
                   let intermediate = new_intermediate_state () in
                   let (env, states, transitions, _, seq_end) =
                     type_seq
-                      default_state tr
+                      default_state tr metaenv
                       inner_env needs_pebble seq_start intermediate elt.nested
                   in env, states, transitions, seq_end
             in
             let states = add_if_needed states curr_start in
             let transitions = trans_start :: seq_transitions in
             (match trans_start.cross with
-                | Normal (conds,action) ->
-                  trans_start.cross <- Normal(tand cond conds,action)
+                | Normal conds ->
+                  trans_start.cross <- Normal (tand cond conds)
                 | Epsilon _ ->
                   Aorai_option.fatal
                     "Transition guard translated as epsilon transition");
@@ -1058,7 +1088,7 @@ let rec type_seq default_state tr env needs_pebble curr_start curr_end seq =
                 (env, states, transitions, curr_start, seq_end)
               | EReturn kf1 :: ECall (kf2,_,_) :: tl
                   when Kernel_function.equal kf1 kf2 ->
-                (tl, states, transitions, curr_start, seq_end)
+                  tl, states, transitions, curr_start, seq_end
               | (EReturn _ | ECOR _ ) :: _ ->
                     (* If there is as mismatch (e.g. Call f; Return g), it will
                        be caught later. There are legitimate situations for
@@ -1066,20 +1096,20 @@ let rec type_seq default_state tr env needs_pebble curr_start curr_end seq =
                        in a non-empty context in particular)
                      *)
                 (env, states, transitions, curr_start, seq_end)
-              | EMulti :: env ->
-                (env, states, transitions, curr_start, seq_end))
+              | EMulti :: env_tmp ->
+                env_tmp, states, transitions, curr_start, seq_end)
       in
       let loop_end = if has_loop then new_intermediate_state () else inner_end
       in
       let (_,oth_states,oth_trans,oth_start,_) =
-        type_seq default_state tr env needs_pebble loop_end curr_end seq
+        type_seq default_state tr metaenv env needs_pebble loop_end curr_end seq
       in
       let trans = inner_trans @ oth_trans in
       let states = List.fold_left add_if_needed oth_states inner_states in
       let auto = (inner_states,inner_trans) in
       if at_most_one then begin
         (* Just adds an epsilon transition from start to end *)
-        let opt = new_trans curr_start oth_start (Epsilon (TTrue,[])) in
+        let opt = new_trans curr_start oth_start (Epsilon TTrue) [] in
         env, states, opt::trans, curr_start, curr_end
       end
       else if has_loop then begin
@@ -1117,19 +1147,12 @@ let rec type_seq default_state tr env needs_pebble curr_start curr_end seq =
                 List.fold_left
                   (fun acc tr ->
                     let init_action = Counter_init (make_counter tr.stop) in
-                    let init_cross =
-                      match tr.cross with
-                        | Normal (cond, actions) ->
-                          Normal(cond, init_action :: actions)
-                        | Epsilon(cond, actions) ->
-                          Epsilon(cond, init_action :: actions)
-                    in
-                    Aorai_option.debug "New init trans %s -> %s: %a"
-                      st.name tr.stop.name
-                      print_epsilon_trans init_cross;
+                    let init_actions = init_action :: tr.actions in
                     let init_trans =
-                      new_trans st tr.stop init_cross
+                      new_trans st tr.stop tr.cross init_actions
                     in
+                    Aorai_option.debug "New init trans %a"
+                      print_eps_trans init_trans;
                     if at_most_one then init_trans :: acc
                     else begin
                       let st =
@@ -1141,24 +1164,22 @@ let rec type_seq default_state tr env needs_pebble curr_start curr_end seq =
                             (make_counter_term curr_start)
                         else TTrue
                       in
-                      let loop_action =
-                        if needs_counter then begin
+                      let loop_actions =
+                        if needs_counter then
                           let counter = make_counter curr_start in
-                          [ Counter_incr counter ]
-                        end else []
+                          Counter_incr counter :: tr.actions
+                        else tr.actions
                       in
                       let loop_cross =
                         match tr.cross with
-                          | Normal(cond, actions) ->
-                            Normal(tand loop_cond cond, loop_action @ actions)
-                          | Epsilon(cond, actions) ->
-                            Epsilon(tand loop_cond cond, loop_action @ actions)
+                        | Normal cond -> Normal (tand loop_cond cond)
+                        | Epsilon cond -> Epsilon (tand loop_cond cond)
                       in
-                      Aorai_option.debug "New loop trans %s -> %s: %a"
-                        inner_end.name tr.stop.name
-                      print_epsilon_trans loop_cross;
                       let loop_trans =
-                        new_trans inner_end tr.stop loop_cross in
+                        new_trans inner_end tr.stop loop_cross loop_actions
+                      in
+                      Aorai_option.debug "New loop trans %a"
+                        print_eps_trans loop_trans;
                       init_trans :: loop_trans :: acc
                     end)
                   oth_trans trans
@@ -1174,11 +1195,11 @@ let rec type_seq default_state tr env needs_pebble curr_start curr_end seq =
                       if needs_pebble then Some curr_start else None
                     in
                     let _,t,_ =
-                      type_expr env ?current (Extlib.the elt.min_rep)
+                      type_expr metaenv env ?current (Option.get elt.min_rep)
                     in
                     TRel (Cil_types.Req, t, Logic_const.tinteger ~loc 0)
                 in
-                let no_seq = new_trans st oth_start (Epsilon (zero_cond,[])) in
+                let no_seq = new_trans st oth_start (Epsilon zero_cond) [] in
                 no_seq :: loop_trans
               end else loop_trans
             in
@@ -1194,11 +1215,10 @@ let rec type_seq default_state tr env needs_pebble curr_start curr_end seq =
                 guard_exit_loop env st (make_counter_term curr_end)
               else TTrue
             in
-            let min_cond = Epsilon (min_cond,[]) in
-            Aorai_option.debug "New exit trans %s -> %s: %a"
-              inner_end.name oth_start.name
-              print_epsilon_trans min_cond;
-            let exit_trans = new_trans inner_end oth_start min_cond in
+            let min_cond = Epsilon min_cond in
+            let exit_trans = new_trans inner_end oth_start min_cond [] in
+            Aorai_option.debug "New exit trans %a"
+              print_eps_trans exit_trans;
             let trans = exit_trans :: trans @ oth_trans in
             states, trans
           end else begin
@@ -1214,7 +1234,7 @@ let rec type_seq default_state tr env needs_pebble curr_start curr_end seq =
                 List.fold_left
                   (fun acc tr ->
                     match tr.cross with
-                      | Normal (cond,_) | Epsilon (cond,_) ->
+                      | Normal cond | Epsilon cond ->
                         let cond = change_bound_var tr.stop st cond in
                         tor acc cond)
                   TFalse trans
@@ -1226,7 +1246,7 @@ let rec type_seq default_state tr env needs_pebble curr_start curr_end seq =
                 | _ ->
                   let reject = get_reject_state () in
                   let states = add_if_needed states reject in
-                  let trans = new_trans st reject (Normal(cond,[])) :: trans
+                  let trans = new_trans st reject (Normal cond) [] :: trans
                   in states, trans @ oth_trans
               )
             end
@@ -1242,6 +1262,13 @@ let rec type_seq default_state tr env needs_pebble curr_start curr_end seq =
       end else
         env, states, trans, curr_start, curr_end
 
+let type_action metaenv env = function
+| Metavar_assign (s, e) ->
+  let vi = find_metavar s metaenv in
+  let _, e, _ = type_expr metaenv env e in
+  (* TODO: check type assignability *)
+  Copy_value ((TVar (Cil.cvar_to_lvar vi), TNoOffset), e)
+
 let single_path (states,transitions as auto) tr =
   Aorai_option.Deterministic.get () ||
     (let init = Path_analysis.get_init_states auto in
@@ -1258,7 +1285,7 @@ let find_otherwise_trans auto st =
   try let tr = List.find (fun x -> x.cross = Otherwise) trans in Some tr.stop
   with Not_found -> None
 
-let type_trans auto env tr =
+let type_trans auto metaenv env tr =
   let needs_pebble = not (single_path auto tr) in
   let has_siblings =
     match Path_analysis.get_transitions_of_state tr.start auto with
@@ -1269,15 +1296,26 @@ let type_trans auto env tr =
   in
   Aorai_option.debug
     "Analyzing transition %s -> %s: %a (needs pebble: %B)"
-    tr.start.name tr.stop.name Promelaoutput.print_parsed tr.cross needs_pebble;
+    tr.start.name tr.stop.name
+    Promelaoutput.Parsed.print_guard
+    tr.cross needs_pebble;
   match tr.cross with
     | Seq seq ->
       let default_state = find_otherwise_trans auto tr.start in
-      let has_default_state = Extlib.has_some default_state in
-      let _,states, transitions,_,_ =
-        type_seq has_default_state tr env needs_pebble tr.start tr.stop seq
+      let has_default_state = Option.is_some default_state in
+      let env,states, transitions,_,_ =
+        type_seq has_default_state tr metaenv env needs_pebble tr.start tr.stop seq
+      in
+      (* Insert metavariable assignments for transitions to tr.stop *)
+      let meta_actions = List.map (type_action metaenv env) tr.actions in
+      let add_meta_actions t =
+        if Aorai_state.equal t.stop tr.stop then
+          { t with actions = t.actions @ meta_actions }
+        else
+          t
       in
-      let (states, transitions) =
+      let transitions = List.map add_meta_actions transitions in    
+      let transitions =
         if List.exists (fun st -> st.multi_state <> None) states then begin
         (* We have introduced some multi-state somewhere, we have to introduce
            pebbles and propagate them from state to state. *)
@@ -1292,26 +1330,25 @@ let type_trans auto env tr =
               (fun trans ->
                 match trans.cross with
                   | Epsilon _ -> trans
-                  | Normal(cond,actions) ->
+                  | Normal _ ->
                     let (dest,d_aux) = memo_multi_state tr.stop in
                     let actions =
                       if tr.start.nums <> start.nums then begin
                         let src,s_aux = memo_multi_state tr.start in
-                        Pebble_move(dest,d_aux,src,s_aux) :: actions
+                        Pebble_move(dest,d_aux,src,s_aux) :: trans.actions
                       end else begin
                         let v = Cil.cvar_to_lvar count in
                         let incr = Counter_incr (TVar v, TNoOffset) in
                         let init = Pebble_init (dest, d_aux, v) in
-                        init::incr::actions
+                        init::incr::trans.actions
                       end
                     in
-                    { trans with
-                      cross = Normal(cond, actions) })
+                    { trans with actions })
               transitions
           in
-          states, transitions
+          transitions
         end else
-          states, transitions
+          transitions
       in
         (* For each intermediate state, add a transition
            to either the default state or a rejection state (in which we will
@@ -1326,8 +1363,8 @@ let type_trans auto env tr =
       in
       Aorai_option.debug "Resulting transitions:@\n%a"
           (Pretty_utils.pp_list ~sep:"@\n"
-             (fun fmt tr -> Format.fprintf fmt "%s -> %s:@[%a@]"
-               tr.start.name tr.stop.name print_epsilon_trans tr.cross))
+             (fun fmt tr -> Format.fprintf fmt "%a"
+               print_eps_trans tr))
           transitions;
         states, transitions, needs_default
     | Otherwise -> [],[], false (* treated directly by type_seq *)
@@ -1340,8 +1377,7 @@ let add_reject_trans auto intermediate_states =
     let cond =
       List.fold_left
         (fun acc tr ->
-          let cond,_ = tr.cross in
-          let cond = change_bound_var tr.stop st cond in
+          let cond = change_bound_var tr.stop st tr.cross in
           tor cond acc)
         TFalse my_trans
     in
@@ -1351,35 +1387,38 @@ let add_reject_trans auto intermediate_states =
       | _ ->
         Aorai_option.debug
           "Adding default transition %s -> %s: %a"
-          st.name reject_state.name Promelaoutput.print_condition cond;
-        states, new_trans st reject_state (cond,[]) :: trans
+          st.name reject_state.name Promelaoutput.Typed.print_condition cond;
+        states, new_trans st reject_state cond [] :: trans
   in
   List.fold_left treat_one_state auto intermediate_states
 
 let propagate_epsilon_transitions (states, _ as auto) =
-  let rec transitive_closure start (conds,actions) known_states curr =
+  let rec transitive_closure start conds actions known_states curr =
     let known_states = curr :: known_states in
     let trans = Path_analysis.get_transitions_of_state curr auto in
     List.fold_left
       (fun acc tr ->
         match tr.cross with
-          | Epsilon (cond,my_actions) ->
+          | Epsilon cond ->
             Aorai_option.debug "Treating epsilon trans %s -> %s"
               curr.name tr.stop.name;
             if List.exists (fun st -> st.nums = tr.stop.nums) known_states
             then acc
             else
               transitive_closure
-                start (tand cond conds, my_actions @ actions)
+                start (tand cond conds) (tr.actions @ actions)
                 known_states tr.stop @ acc
-          | Normal (cond, action) ->
+          | Normal cond ->
             Aorai_option.debug "Adding transition %s -> %s from epsilon trans"
               start.name tr.stop.name;
-            new_trans start tr.stop (tand cond conds,action @ actions) ::acc)
+            let tr =
+              new_trans start tr.stop (tand cond conds) (tr.actions @ actions)
+            in
+            tr :: acc)
       [] trans
   in
   let treat_one_state acc st =
-    acc @ transitive_closure st (TTrue,[]) [] st
+    acc @ transitive_closure st TTrue [] [] st
   in
   let trans = List.fold_left treat_one_state [] states in
   (states, trans)
@@ -1393,51 +1432,50 @@ let add_default_trans (states, transitions as auto) otherwise =
     let cond =
       List.fold_left
         (fun acc c ->
-          let (cond,_) = c.cross in
+          let cond = c.cross in
           Aorai_option.debug "considering trans %s -> %s: %a"
-            c.start.name c.stop.name Promelaoutput.print_condition cond;
+            c.start.name c.stop.name Promelaoutput.Typed.print_condition cond;
           let neg = tnot cond in
           Aorai_option.debug "negation: %a"
-            Promelaoutput.print_condition neg;
+            Promelaoutput.Typed.print_condition neg;
           Aorai_option.debug "acc: %a"
-            Promelaoutput.print_condition acc;
+            Promelaoutput.Typed.print_condition acc;
          let res = tand acc (tnot cond) in
           Aorai_option.debug "partial result: %a"
-            Promelaoutput.print_condition res;
+            Promelaoutput.Typed.print_condition res;
           res
         )
         TTrue
         my_trans
     in
     Aorai_option.debug "resulting transition: %a"
-      Promelaoutput.print_condition cond;
+      Promelaoutput.Typed.print_condition cond;
     let cond,_ = Logic_simplification.simplifyCond cond in
-    let new_trans = new_trans st tr.stop (cond,[]) in
+    let new_trans = new_trans st tr.stop cond [] in
     new_trans::acc
   in
   let transitions = List.fold_left add_one_trans transitions otherwise in
   states, transitions
 
-let type_cond_auto (st,tr as auto) =
-  let otherwise = List.filter (fun t -> t.cross = Otherwise) tr in
+let type_cond_auto auto =
+  let original_auto = auto in
+  let otherwise = List.filter (fun t -> t.cross = Otherwise) auto.trans in
   let add_if_needed acc st =
     if List.memq st acc then acc else st::acc
   in
   let type_trans (states,transitions,add_reject) tr =
-    let (intermediate_states, trans, needs_reject) = type_trans auto [] tr in
+    let (intermediate_states, trans, needs_reject) =
+      type_trans (auto.states,auto.trans) auto.metavariables [] tr
+    in
     Aorai_option.debug
       "Considering parsed transition %s -> %s" tr.start.name tr.stop.name;
     Aorai_option.debug
       "Resulting transitions:@\n%a@\nEnd of transitions"
-      (Pretty_utils.pp_list ~sep:"@\n"
-         (fun fmt tr ->
-           Format.fprintf fmt "%s -> %s: %a"
-             tr.start.name tr.stop.name print_epsilon_trans tr.cross))
-      trans;
+      (Pretty_utils.pp_list ~sep:"@\n" print_eps_trans) trans;
     let add_reject =
       if needs_reject then
-        (List.filter 
-           (fun x -> not (Aorai_state.equal tr.start x || 
+        (List.filter
+           (fun x -> not (Aorai_state.equal tr.start x ||
                             Aorai_state.equal tr.stop x))
            intermediate_states) @ add_reject
       else add_reject
@@ -1447,7 +1485,7 @@ let type_cond_auto (st,tr as auto) =
      add_reject)
   in
   let (states, trans, add_reject) =
-    List.fold_left type_trans (st,[],[]) tr
+    List.fold_left type_trans (auto.states,[],[]) auto.trans
   in
   let auto = propagate_epsilon_transitions (states, trans) in
   let auto = add_reject_trans auto add_reject in
@@ -1456,23 +1494,23 @@ let type_cond_auto (st,tr as auto) =
      must ensure that we use consecutive numbers starting from 0, or we'll
      have needlessly long arrays.
    *)
-  let (states, transitions as auto) =
+  let states, trans =
     match Reject_state.get_option () with
-      | Some state -> 
-          (states, (new_trans state state (TTrue,[])):: transitions)
+      | Some state ->
+          (states, new_trans state state TTrue [] :: transitions)
       | None -> auto
   in
+  let auto = { original_auto with states ; trans } in
   if Aorai_option.debug_atleast 1 then
-    Promelaoutput.output_dot_automata auto "aorai_debug_typed.dot";
+    Promelaoutput.Typed.output_dot_automata auto "aorai_debug_typed.dot";
   let (_,trans) =
     List.fold_left
       (fun (i,l as acc) t ->
-        let cond, action = t.cross in
-        let cond = fst (Logic_simplification.simplifyCond cond)
+        let cond = fst (Logic_simplification.simplifyCond t.cross)
         in match cond with
             TFalse -> acc
-          | _ -> (i+1,{ t with cross = (cond,action); numt = i } :: l))
-      (0,[]) transitions
+          | _ -> (i+1,{ t with cross = cond; numt = i } :: l))
+      (0,[]) trans
   in
   let _, states =
     List.fold_left
@@ -1487,29 +1525,52 @@ let type_cond_auto (st,tr as auto) =
         end else acc)
       (0,[]) states
   in
-   (List.rev states, List.rev trans)
+    { original_auto with states = List.rev states; trans = List.rev trans }
+
+
+(* Check Metavariable compatibility *)
+let checkMetavariableCompatibility auto =
+  let is_extended_trans trans =
+    match trans.cross with
+    | Otherwise -> false
+    | Seq [ elt ] ->
+      elt.nested <> [] || not (is_single elt)
+    | Seq _ -> true
+  in
+  let has_metavariables = not (Datatype.String.Map.is_empty auto.metavariables)
+  and deterministic = Aorai_option.Deterministic.get ()
+  and uses_extended_guards = List.exists is_extended_trans auto.trans in
+  if has_metavariables && (not deterministic || uses_extended_guards) then
+    Aorai_option.abort
+      "The use of metavariables is incompatible with non-deterministic \
+       automata, such as automa using extended transitions."
+
 
 (** Stores the buchi automaton and its variables and
     functions as it is returned by the parsing *)
 let setAutomata auto =
+  checkMetavariableCompatibility auto;
   let auto = type_cond_auto auto in
-  automata:=auto;
+  automata:=Some auto;
   check_states "typed automata";
   if Aorai_option.debug_atleast 1 then
-    Promelaoutput.output_dot_automata auto "aorai_debug_reduced.dot";
+    Promelaoutput.Typed.output_dot_automata auto "aorai_debug_reduced.dot";
   if (Array.length !cond_of_parametrizedTransitions) <
     (getNumberOfTransitions  ())
   then
     (* all transitions have a true parameterized guard, i.e. [[]] *)
     cond_of_parametrizedTransitions :=
-      Array.make (getNumberOfTransitions  ()) [[]]
+      Array.make (getNumberOfTransitions  ()) [[]] ;
+  Aorai_metavariables.checkInitialization auto ;
+  Aorai_metavariables.checkSingleAssignment auto
 
-let getState num = List.find (fun st -> st.nums = num) (fst !automata)
+let getState num =
+  List.find (fun st -> st.nums = num) (getAutomata ()).states
 
 let getStateName num = (getState num).name
 
 let getTransition num =
-  List.find (fun trans -> trans.numt = num) (snd !automata)
+  List.find (fun trans -> trans.numt = num) (getAutomata ()).trans
 
 (** Initializes some tables according to data from Cil AST. *)
 let setCData () =
@@ -1776,14 +1837,14 @@ let merge_bindings tbl1 tbl2 =
         | None, None -> None
         | Some tbl, None | None, Some tbl ->
             Some
-              (Cil_datatype.Term.Map.merge 
+              (Cil_datatype.Term.Map.merge
                  (merge_range loc) tbl (unchanged loc))
         | Some tbl1, Some tbl2 ->
           Some (Cil_datatype.Term.Map.merge (merge_range loc) tbl1 tbl2)
   in
   Cil_datatype.Term.Map.merge merge_vals tbl1 tbl2
 
-module End_state = 
+module End_state =
   Aorai_state.Map.Make(Datatype.Triple(Aorai_state.Set)(Aorai_state.Set)(Vals))
 
 type end_state = End_state.t
@@ -1805,7 +1866,7 @@ let pretty_end_state start fmt tbl =
         start.Promelaast.name stop.Promelaast.name;
       Aorai_state.Set.iter
         (fun state ->
-          Format.fprintf fmt "    %s -> %s@\n" 
+          Format.fprintf fmt "    %s -> %s@\n"
             start.Promelaast.name
             state.Promelaast.name)
         fst;
@@ -1850,7 +1911,7 @@ let included_state tbl1 tbl2 =
                 Cil_datatype.Term.Map.iter
                   (fun loc range1 ->
                     let range2 = Cil_datatype.Term.Map.find loc bindings2 in
-                    if not 
+                    if not
                       (included_range range1 range2) then raise Not_found)
                   bindings1)
               tbl1)
@@ -1860,7 +1921,7 @@ let included_state tbl1 tbl2 =
   with Not_found -> false
 
 let merge_end_state tbl1 tbl2 =
-  let merge_stop_state _ (fst1, last1, tbl1) (fst2, last2, tbl2) = 
+  let merge_stop_state _ (fst1, last1, tbl1) (fst2, last2, tbl2) =
     let fst = Aorai_state.Set.union fst1 fst2 in
     let last = Aorai_state.Set.union last1 last2 in
     let tbl = merge_bindings tbl1 tbl2 in
@@ -1872,12 +1933,12 @@ let merge_state tbl1 tbl2 =
   let merge_state _ = merge_end_state in
   Aorai_state.Map.merge (Extlib.merge_opt merge_state) tbl1 tbl2
 
-module Pre_state = 
+module Pre_state =
   Kernel_function.Make_Table
     (Case_state)
     (struct
         let name = "Data_for_aorai.Pre_state"
-        let dependencies = 
+        let dependencies =
           [ Ast.self; Aorai_option.Ya.self; Aorai_option.Ltl_File.self;
             Aorai_option.To_Buchi.self; Aorai_option.Deterministic.self ]
         let size = 17
@@ -1890,7 +1951,7 @@ let set_kf_init_state kf state =
 
 let dkey = Aorai_option.register_category "dataflow"
 
-let replace_kf_init_state kf state = 
+let replace_kf_init_state kf state =
   Aorai_option.debug ~dkey
     "Replacing pre-state of %a:@\n  @[%a@]"
     Kernel_function.pretty kf pretty_state state;
@@ -1901,12 +1962,12 @@ let get_kf_init_state kf =
     Pre_state.find kf
   with Not_found -> Aorai_state.Map.empty
 
-module Post_state = 
+module Post_state =
   Kernel_function.Make_Table
     (Case_state)
     (struct
         let name = "Data_for_aorai.Post_state"
-        let dependencies = 
+        let dependencies =
           [ Ast.self; Aorai_option.Ya.self; Aorai_option.Ltl_File.self;
             Aorai_option.To_Buchi.self; Aorai_option.Deterministic.self ]
         let size = 17
@@ -1973,26 +2034,26 @@ let get_loop_invariant_state stmt =
 
 let pretty_pre_state fmt =
   Pre_state.iter
-    (fun kf state -> 
+    (fun kf state ->
       Format.fprintf fmt "Function %a:@\n  @[%a@]@\n"
         Kernel_function.pretty kf pretty_state state)
 
 let pretty_post_state fmt =
   Post_state.iter
-    (fun kf state -> 
+    (fun kf state ->
       Format.fprintf fmt "Function %a:@\n  @[%a@]@\n"
         Kernel_function.pretty kf pretty_state state)
 
 let pretty_loop_init fmt =
   Loop_init_state.iter
-    (fun stmt state -> 
+    (fun stmt state ->
       let kf = Kernel_function.find_englobing_kf stmt in
       Format.fprintf fmt "Function %a, sid %d:@\n  @[%a@]@\n"
         Kernel_function.pretty kf stmt.sid pretty_state state)
 
 let pretty_loop_invariant fmt =
   Loop_invariant_state.iter
-    (fun stmt state -> 
+    (fun stmt state ->
       let kf = Kernel_function.find_englobing_kf stmt in
       Format.fprintf fmt "Function %a, sid %d:@\n  @[%a@]@\n"
         Kernel_function.pretty kf stmt.sid pretty_state state)
@@ -2006,18 +2067,19 @@ let debug_computed_state ?(dkey=dkey) () =
 (* ************************************************************************* *)
 
 let removeUnusedTransitionsAndStates () =
+  let auto = getAutomata () in
   (* Step 1 : computation of reached states and crossed transitions *)
   let treat_one_state state map set =
     Aorai_state.Map.fold
-      (fun state (fst, last, _) set -> 
-          Aorai_state.Set.add state 
+      (fun state (fst, last, _) set ->
+          Aorai_state.Set.add state
             (Aorai_state.Set.union last
                (Aorai_state.Set.union fst set)))
       map
       (Aorai_state.Set.add state set)
   in
   let reached _ state set = Aorai_state.Map.fold treat_one_state state set in
-  let init = Path_analysis.get_init_states (getAutomata ()) in
+  let init = Path_analysis.get_init_states (getGraph ()) in
   let reached_states = Pre_state.fold reached (Aorai_state.Set.of_list init) in
   let reached_states = Post_state.fold reached reached_states in
   let reached_states = Loop_init_state.fold reached reached_states in
@@ -2026,7 +2088,7 @@ let removeUnusedTransitionsAndStates () =
     raise Empty_automaton;
   (* Step 2 : computation of translation tables *)
   let state_list =
-    List.sort 
+    List.sort
       (fun x y -> Datatype.String.compare x.Promelaast.name y.Promelaast.name)
       (Aorai_state.Set.elements reached_states)
   in
@@ -2046,7 +2108,7 @@ let removeUnusedTransitionsAndStates () =
           (i+1,
            { trans with start = new_start; stop = new_stop; numt = i } :: list)
         with Not_found -> acc)
-      (0,[]) (snd (getAutomata()))
+      (0,[]) auto.trans
   in
   let state_list = List.map new_state state_list in
   Reject_state.may
@@ -2056,13 +2118,13 @@ let removeUnusedTransitionsAndStates () =
         Reject_state.set new_reject
       with Not_found -> Reject_state.clear ());
   (* Step 3 : rewriting stored information *)
-  automata:= (state_list,trans_list);
+  automata := Some { auto with states =state_list; trans = trans_list };
   check_states "reduced automata";
 
   let rewrite_state state =
     let rewrite_set set =
-      Aorai_state.Set.fold 
-        (fun s set -> Aorai_state.Set.add (new_state s) set) 
+      Aorai_state.Set.fold
+        (fun s set -> Aorai_state.Set.add (new_state s) set)
         set Aorai_state.Set.empty
     in
     let rewrite_bindings (fst_states, last_states, bindings) =
@@ -2084,7 +2146,7 @@ let removeUnusedTransitionsAndStates () =
   in
   Pre_state.iter (fun kf state -> Pre_state.replace kf (rewrite_state state));
   Post_state.iter (fun kf state -> Post_state.replace kf (rewrite_state state));
-  Loop_init_state.iter 
+  Loop_init_state.iter
     (fun s state -> Loop_init_state.replace s (rewrite_state state));
   Loop_invariant_state.iter
     (fun s state -> Loop_invariant_state.replace s (rewrite_state state))
diff --git a/src/plugins/aorai/data_for_aorai.mli b/src/plugins/aorai/data_for_aorai.mli
index 5205169d0457f927ddc590ed2df2e13daddadea9..8c7ed586075255f9c356a763d28debfe3859f17b 100644
--- a/src/plugins/aorai/data_for_aorai.mli
+++ b/src/plugins/aorai/data_for_aorai.mli
@@ -42,10 +42,8 @@ exception Empty_automaton
 
 module Aorai_state: Datatype.S_with_collections with type t = Promelaast.state
 
-module Aorai_typed_trans: 
-  Datatype.S_with_collections 
-  with 
-    type t = (Promelaast.typed_condition * Promelaast.action) Promelaast.trans
+module Aorai_typed_trans:
+  Datatype.S_with_collections with type t = Promelaast.typed_trans
 
 (** Initializes some tables according to data from Cil AST. *)
 val setCData : unit -> unit
@@ -56,7 +54,6 @@ val add_logic : string -> Cil_types.logic_info -> unit
 (** *)
 val get_logic : string -> Cil_types.logic_info
 
-
 (** *)
 val add_predicate : string -> Cil_types.logic_info -> unit
 
@@ -202,11 +199,14 @@ val buch_sync    : string
 
 val new_state: string -> state
 
-val new_trans: state -> state -> 'a -> 'a trans
+val new_trans: state -> state -> 'c -> 'a list -> ('c,'a) trans
 
 (** Return the buchi automata as stored after parsing *)
 val getAutomata : unit -> Promelaast.typed_automaton
 
+(** Return only the graph part of the automata *)
+val getGraph : unit -> state list * typed_trans list
+
 (** Type-checks the parsed automaton and stores the result.
     This might introduce new global variables in case of sequences.
 *)
@@ -247,8 +247,7 @@ val is_reject_state: state -> bool
 (** returns the transition having the corresponding id.
     @raise Not_found if this is not the case.
 *)
-val getTransition:
-  int -> (Promelaast.typed_condition * Promelaast.action) Promelaast.trans
+val getTransition: int -> Promelaast.typed_trans
 
 (* ************************************************************************* *)
 (**{b Variables information} Usually it seems very useful to access to varinfo
diff --git a/src/plugins/aorai/logic_simplification.ml b/src/plugins/aorai/logic_simplification.ml
index 88de692c01cff144bff52fc751bdf38321d14f10..9bf174dd1ae3a3f393116c1cce341f65c56c3a55 100644
--- a/src/plugins/aorai/logic_simplification.ml
+++ b/src/plugins/aorai/logic_simplification.ml
@@ -28,7 +28,7 @@ open Promelaast
 
 let pretty_clause fmt l =
   Format.fprintf fmt "@[<2>[%a@]]@\n"
-    (Pretty_utils.pp_list ~sep:",@ " Promelaoutput.print_condition) l
+    (Pretty_utils.pp_list ~sep:",@ " Promelaoutput.Typed.print_condition) l
 
 let pretty_dnf fmt l =
   Format.fprintf fmt "@[<2>[%a@]]@\n"
@@ -360,7 +360,7 @@ let simplClause clause dnf =
 *)
 let simplifyCond condition =
   Aorai_option.debug 
-    "initial condition: %a" Promelaoutput.print_condition condition;
+    "initial condition: %a" Promelaoutput.Typed.print_condition condition;
   (* Step 1 : Condition is translate into Disjunctive Normal Form *)
   let res1 = condToDNF condition in 
   Aorai_option.debug "initial dnf: %a" pretty_dnf res1;
@@ -394,14 +394,9 @@ let simplifyTrans transl =
       let (crossCond , pcond ) = simplifyCond (tr.cross) in
        (* pcond stands for parametrized condition : 
           disjunction of conjunctions of parametrized call/return *)
-      let tr'={ start = tr.start ;
-                stop  = tr.stop  ;
-                cross = crossCond ;
-                numt  = tr.numt
-              }
-      in
+      let tr'= { tr with cross = crossCond } in
       Aorai_option.debug "condition is %a, dnf is %a" 
-        Promelaoutput.print_condition crossCond pretty_dnf pcond;
+        Promelaoutput.Typed.print_condition crossCond pretty_dnf pcond;
       if tr'.cross <> TFalse then (tr'::ltr,pcond::lpcond) else (ltr,lpcond)
     ) 
     ([],[]) 
@@ -437,7 +432,7 @@ let simplifyDNFwrtCtx dnf kf1 status =
   in
   let res = tors (List.map simplCNFwrtCtx dnf) in
   Aorai_option.debug 
-    "After simplification: %a" Promelaoutput.print_condition res; res
+    "After simplification: %a" Promelaoutput.Typed.print_condition res; res
 
 (*
 Tests : 
diff --git a/src/plugins/aorai/logic_simplification.mli b/src/plugins/aorai/logic_simplification.mli
index 80956533bb63272234cc8d8270a12cbce83f7f68..6c58727222ed78367613ef7d5c86fc6c43e1ccff 100644
--- a/src/plugins/aorai/logic_simplification.mli
+++ b/src/plugins/aorai/logic_simplification.mli
@@ -45,8 +45,8 @@ val simplifyCond:
     simplifyCond done on each cross condition. Uncrossable transition are
     removed. *) 
 val simplifyTrans: 
-  Promelaast.typed_condition Promelaast.trans list -> 
-  (Promelaast.typed_condition Promelaast.trans list)*
+  Promelaast.typed_trans list ->
+  (Promelaast.typed_trans list)*
     (Promelaast.typed_condition list list list)
 
 val dnfToCond : 
diff --git a/src/plugins/aorai/promelaast.ml b/src/plugins/aorai/promelaast.ml
index 0e19f53d056b7124405d6d68da4e34612a03b096..fe0bdcfe677bb92ffb947f99580bb7814134e60f 100644
--- a/src/plugins/aorai/promelaast.ml
+++ b/src/plugins/aorai/promelaast.ml
@@ -23,12 +23,13 @@
 (*                                                                        *)
 (**************************************************************************)
 
-(** The abstract tree of promela representation. Such tree is used by promela 
+(** The abstract tree of promela representation. Such tree is used by promela
     parser/lexer before its translation into Data_for_aorai module. *)
 
 type expression =
   | PVar of string
   | PPrm of string * string (* f().N *)
+  | PMetavar of string
   | PCst of Logic_ptree.constant
   | PBinop of Logic_ptree.binop * expression * expression
   | PUnop of Logic_ptree.unop * expression
@@ -43,104 +44,114 @@ type condition =
   | POr of condition * condition
   | PAnd of condition * condition
   | PNot of condition
-  | PCall of string * string option 
-      (** Call might be done in a given behavior *)
+  | PCall of string * string option
+  (** Call might be done in a given behavior *)
   | PReturn of string
 
-and seq_elt =
-    { condition: condition option;
-      nested: sequence;
-      min_rep: expression option;
-      max_rep: expression option;
-    }
+and seq_elt = {
+  condition: condition option;
+  nested: sequence;
+  min_rep: expression option;
+  max_rep: expression option;
+}
 
 and sequence = seq_elt list
 
 (** Promela parsed abstract syntax trees. Either a sequence of event or the
-    otherwise keyword. A single condition is expressed with a singleton 
+    otherwise keyword. A single condition is expressed with a singleton
     having an empty nested sequence and min_rep and max_rep being equal to one.
 *)
-type parsed_condition = Seq of sequence | Otherwise
+type guard = Seq of sequence | Otherwise
+
+type action =
+  | Metavar_assign of string * expression
 
 type typed_condition =
-    | TOr of typed_condition * typed_condition  (** Logical OR *)
-    | TAnd of typed_condition * typed_condition (** Logical AND *)
-    | TNot of typed_condition             (** Logical NOT *)
-    | TCall of Cil_types.kernel_function * Cil_types.funbehavior option
-    (** Predicate modelling the call of an operation *)
-    | TReturn of Cil_types.kernel_function
-    (** Predicate modelling the return of an operation *)
-    | TTrue                         (** Logical constant TRUE *)
-    | TFalse                        (** Logical constant FALSE *)
-    | TRel of Cil_types.relation * Cil_types.term * Cil_types.term
-       (** Condition. If one of the terms contains TResult, TRel is in 
-           conjunction with exactly one TReturn event, and the TResult is
-           tied to the corresponding value.
-        *)
-
-type single_action =
+  | TOr of typed_condition * typed_condition  (** Logical OR *)
+  | TAnd of typed_condition * typed_condition (** Logical AND *)
+  | TNot of typed_condition             (** Logical NOT *)
+  | TCall of Cil_types.kernel_function * Cil_types.funbehavior option
+  (** Predicate modelling the call of an operation *)
+  | TReturn of Cil_types.kernel_function
+  (** Predicate modelling the return of an operation *)
+  | TTrue                         (** Logical constant TRUE *)
+  | TFalse                        (** Logical constant FALSE *)
+  | TRel of Cil_types.relation * Cil_types.term * Cil_types.term
+  (** Condition. If one of the terms contains TResult, TRel is in
+      conjunction with exactly one TReturn event, and the TResult is
+      tied to the corresponding value.
+  *)
+
+(** Additional actions to perform when crossing a transition.
+    There is at most one Pebble_* action for each transition, and
+    each transition leading to a state with multi-state has such an action.
+*)
+type typed_action =
   | Counter_init of Cil_types.term_lval
   | Counter_incr of Cil_types.term_lval
   | Pebble_init of
       Cil_types.logic_info * Cil_types.logic_var * Cil_types.logic_var
-      (** adds a new pebble. [Pebble_init(set,aux,count)] indicates that
-          pebble [count] is put in [set] whose content is governed by C
-          variable [aux].
-       *)
+  (** adds a new pebble. [Pebble_init(set,aux,count)] indicates that
+      pebble [count] is put in [set] whose content is governed by C
+      variable [aux].
+  *)
   | Pebble_move of
-      Cil_types.logic_info * 
-        Cil_types.logic_var * Cil_types.logic_info * Cil_types.logic_var
-        (** [Pebble_move(new_set,new_aux,old_set,old_aux)] 
-            moves pebbles from [old_set] to [new_set], governed by the
-            corresponding aux variables. *)
+      Cil_types.logic_info *
+      Cil_types.logic_var * Cil_types.logic_info * Cil_types.logic_var
+  (** [Pebble_move(new_set,new_aux,old_set,old_aux)]
+      moves pebbles from [old_set] to [new_set], governed by the
+      corresponding aux variables. *)
   | Copy_value of Cil_types.term_lval * Cil_types.term
-      (** copy the current value of the given term into the given location
-          so that it can be accessed by a later state. *)
+  (** copy the current value of the given term into the given location
+      so that it can be accessed by a later state. *)
 
-(** Additional actions to perform when crossing a transition.
-    There is at most one Pebble_* action for each transition, and
-    each transition leading to a state with multi-state has such an action.
- *)
-type action = single_action list
 
 (** Internal representation of a State from the Buchi automata. *)
-type state =
-    { name : string            (** State name *);
-      mutable acceptation : Bool3.t
-      (** True iff state is an acceptation state *);
-      mutable init : Bool3.t   (** True iff state is an initial state *);
-      mutable nums : int;       (** Numerical ID of the state *)
-      mutable multi_state: 
-        (Cil_types.logic_info * Cil_types.logic_var) option
-        (** Translation of some sequences might lead to some kind of pebble
-            automaton, where we need to distinguish various branches. This is
-            done by having a set of pebbles instead of just a zero/one switch
-            to know if we are in the given state. The guards apply to each
-            active pebble and are thus of the form 
-            \forall integer x; in(x,multi_state) ==> guard.
-            multi_state is the first lvar of the pair, x is the second
-         *)
-    }
+type state = {
+  name : string;                 (** State name *)
+  mutable acceptation : Bool3.t; (** True iff state is an acceptation state *)
+  mutable init : Bool3.t;        (** True iff state is an initial state *)
+  mutable nums : int;            (** Numerical ID of the state *)
+  mutable multi_state: (Cil_types.logic_info * Cil_types.logic_var) option;
+  (** Translation of some sequences might lead to some kind of pebble
+      automaton, where we need to distinguish various branches. This is
+      done by having a set of pebbles instead of just a zero/one switch
+      to know if we are in the given state. The guards apply to each
+      active pebble and are thus of the form
+      \forall integer x; in(x,multi_state) ==> guard.
+      multi_state is the first lvar of the pair, x is the second
+  *)
+}
 
 (** Internal representation of a transition from the Buchi automata. *)
-type 'condition trans = 
-    { start : state ;     (** Starting state of the transition *)
-      stop : state ;      (** Ending state of the transition *)
-      mutable cross : 'condition ; (** Cross condition of the transition *)
-      mutable numt : int  (** Numerical ID of the transition *)
-    }
+type ('c,'a) trans = {
+  start : state ;            (** Starting state of the transition *)
+  stop : state ;             (** Ending state of the transition *)
+  mutable cross : 'c;        (** Cross condition of the transition *)
+  mutable actions : 'a list; (** Actions to execute while crossing *)
+  mutable numt : int         (** Numerical ID of the transition *)
+}
+
+type parsed_trans = (guard, action) trans
+
+type typed_trans = (typed_condition, typed_action) trans
 
-(** Internal representation of a Buchi automata : a list of states and a list of transitions.*)
-type 'condition automaton = (state list) * ('condition trans list)
+(** Internal representation of a Buchi automata : a list of states and a list
+    of transitions.*)
+type ('c,'a) automaton = {
+  states: state list;
+  trans: (('c,'a) trans) list;
+  metavariables: Cil_types.varinfo Datatype.String.Map.t;
+}
 
-type parsed_automaton = parsed_condition automaton
+type parsed_automaton = (guard, action) automaton
 
-type typed_automaton = (typed_condition * action) automaton
+type typed_automaton = (typed_condition, typed_action) automaton
 
 (** An operation can have two status: currently calling or returning. *)
 type funcStatus =
-    | Call
-    | Return
+  | Call
+  | Return
 
 (*
 Local Variables:
diff --git a/src/plugins/aorai/promelaoutput.ml b/src/plugins/aorai/promelaoutput.ml
index 60570159c36468af8f37f454528ed043976b4e8a..cac471f43abbc85d4e75ee4aae2233a657a517af 100644
--- a/src/plugins/aorai/promelaoutput.ml
+++ b/src/plugins/aorai/promelaoutput.ml
@@ -30,152 +30,15 @@ open Promelaast
 open Bool3
 open Format
 
-let string_of_unop = function
-  | Uminus -> "-"
-  | Ustar -> "*"
-  | Uamp -> "&"
-  | Ubw_not -> "~"
-
-let rec print_parsed_expression fmt = function
-  | PVar s -> Format.fprintf fmt "%s" s
-  | PPrm (f,s) -> Format.fprintf fmt "%s().%s" f s
-  | PCst (IntConstant s) -> Format.fprintf fmt "%s" s
-  | PCst (FloatConstant s) -> Format.fprintf fmt "%s" s
-  | PCst (StringConstant s) -> Format.fprintf fmt "%S" s
-  | PCst (WStringConstant s) -> Format.fprintf fmt "%S" s
-  | PBinop(bop,e1,e2) ->
-    Format.fprintf fmt "(@[%a@])@ %a@ (@[%a@])"
-      print_parsed_expression e1 Printer.pp_binop (Logic_typing.type_binop bop)
-      print_parsed_expression e2
-  | PUnop(uop,e) -> Format.fprintf fmt "%s@;(@[%a@])"
-    (string_of_unop uop)
-    print_parsed_expression e
-  | PArrget(e1,e2) -> Format.fprintf fmt "%a@;[@(%a@]]"
-    print_parsed_expression e1 print_parsed_expression e2
-  | PField(e,s) -> Format.fprintf fmt "%a.%s" print_parsed_expression e s
-  | PArrow(e,s) -> Format.fprintf fmt "%a->%s" print_parsed_expression e s 
-
-let rec print_parsed_condition fmt = function
-  | PRel(rel,e1,e2) ->
-    Format.fprintf fmt "%a %a@ %a"
-      print_parsed_expression e1
-      Printer.pp_relation (Logic_typing.type_rel rel)
-      print_parsed_expression e2
-  | PTrue -> Format.pp_print_string fmt "true"
-  | PFalse -> Format.pp_print_string fmt "false"
-  | POr(e1,e2) -> Format.fprintf fmt "(@[%a@])@ or@ (@[%a@])"
-    print_parsed_condition e1 print_parsed_condition e2
-  | PAnd(e1,e2) -> Format.fprintf fmt "(@[%a@])@ and@ (@[%a@])"
-    print_parsed_condition e1 print_parsed_condition e2
-  | PNot c -> Format.fprintf fmt "not(@[%a@])"
-    print_parsed_condition c
-  | PCall (s,None) -> Format.fprintf fmt "CALL(%s)" s
-  | PCall (s, Some b) -> Format.fprintf fmt "CALL(%s::%s)" s b
-  | PReturn s -> Format.fprintf fmt "RETURN(%s)" s
-
-let rec print_seq_elt fmt elt =
-  Format.fprintf fmt "(%a%a){@[%a,%a@]}"
-    (Pretty_utils.pp_opt print_parsed_condition) elt.condition
-    print_sequence elt.nested
-    (Pretty_utils.pp_opt print_parsed_expression) elt.min_rep
-    (Pretty_utils.pp_opt print_parsed_expression) elt.max_rep
-
-and print_sequence fmt l =
-    Pretty_utils.pp_list ~pre:"[@[" ~sep:";@ " ~suf:"@]]" print_seq_elt fmt l
-
-let print_parsed fmt = function
-  | Seq l -> print_sequence fmt l
-  | Otherwise -> Format.pp_print_string fmt "Otherwise"
-
-let rec print_condition fmt = function
-  | TCall (kf,None) ->
-    Format.fprintf fmt "Call(%a)" Kernel_function.pretty kf
-  | TCall (kf, Some b) ->
-    Format.fprintf fmt "Call(%a::%s)"
-      Kernel_function.pretty kf b.Cil_types.b_name
-  | TReturn kf ->
-    Format.fprintf fmt "Return(%a)" Kernel_function.pretty kf
-  | TOr  (c1,c2) ->
-    Format.fprintf fmt "@[<hov>(@[<2>%a@])@]@ or@ @[<hov>(@[<2>%a@])@]"
-      print_condition c1 print_condition c2
-  | TAnd (c1,c2) ->
-    Format.fprintf fmt "@[<hov>(@[<2>%a@])@]@ and@ @[<hov>(@[<2>%a@])@]"
-      print_condition c1 print_condition c2
-  | TNot c ->
-    Format.fprintf fmt "@[<hov 4>@[<hov 5>not(%a@])@]" print_condition c
-  | TTrue            -> Format.pp_print_string fmt "True"
-  | TFalse           -> Format.pp_print_string fmt "False"
-  | TRel(rel,exp1,exp2) -> 
-    (* \result will be printed as such, not as f().return *)
-    Format.fprintf fmt "@[(%a)@]@ %a@ @[(%a)@]"
-      Printer.pp_term exp1
-      Printer.pp_relation rel 
-      Printer.pp_term exp2
-
-let print_one_action fmt = function
-  | Counter_init lv ->
-    Format.fprintf fmt "@[%a <- 1@]" Printer.pp_term_lval lv
-  | Counter_incr lv ->
-    Format.fprintf fmt "@[%a <- @[%a@ +@ 1@]@]" 
-      Printer.pp_term_lval lv Printer.pp_term_lval lv
-  | Pebble_init (set,_,v) ->
-    Format.fprintf fmt "@[%a <- {@[ %a @]}@]"
-      Printer.pp_logic_var set.l_var_info Printer.pp_logic_var v
-  | Pebble_move(s1,_,s2,_) ->
-    Format.fprintf fmt "@[%a <- %a@]"
-      Printer.pp_logic_var s1.l_var_info  
-      Printer.pp_logic_var s2.l_var_info
-  | Copy_value(lv,v) ->
-    Format.fprintf fmt "@[%a <- %a@]" Printer.pp_term_lval lv Printer.pp_term v
-
-let print_action fmt l =
-  Pretty_utils.pp_list ~sep:"@\n" print_one_action fmt l
-
-(* Use well-parenthesized combination of escape_newline/normal_newline*)
-let escape_newline fmt =
-  let funcs = Format.pp_get_formatter_out_functions fmt () in
-  let has_printed = ref false in
-  let out_newline () =
-    if !has_printed then funcs.Format.out_string " \\\n" 0 3
-    else funcs.Format.out_newline ()
-  in
-  let out_string s b l =
-    if String.contains (String.sub s b l) '"' then
-      has_printed:=not !has_printed;
-    funcs.Format.out_string s b l
-  in
-  Format.pp_set_formatter_out_functions fmt
-    { funcs with Format.out_newline; out_string };
-  funcs
-
-let print_full_transition fmt (cond,action) =
-  Format.fprintf fmt "%a@\n%a" print_condition cond print_action action
-
-let trans_label num = "tr"^string_of_int(num)
-
-let print_trans fmt trans =
-  Format.fprintf fmt
-    "@[<2>%s:@ %a@]" 
-    (trans_label trans.numt) print_full_transition trans.cross
+type 'a printer = Format.formatter -> 'a -> unit
 
-let state_label num = "st"^string_of_int(num)
-let print_state_label fmt st = 
-  Format.fprintf fmt "@[<2>%s:@ %s@]" (state_label st.nums) st.name
+let bool3_to_string = function
+  | True -> "True"
+  | False -> "False"
+  | Undefined -> "Undef"
 
 let print_bool3 fmt b =
-  Format.pp_print_string fmt 
-    (match b with
-      | True -> "True"
-      | False -> "False"
-      | Undefined -> "Undef")
-
-let print_transition fmt tr =
-  Format.fprintf fmt "@[<2>{@ %d:@ %s@ {%a}@ %s@]}"
-    tr.numt tr.start.name print_full_transition tr.cross tr.stop.name
-
-let print_transitionl fmt trl =
-  Format.fprintf fmt "@[<2>Transitions:@\n%a@]"
-    (Pretty_utils.pp_list ~sep:"@\n" ~suf:"@\n" print_transition) trl
+  Format.pp_print_string fmt (bool3_to_string b)
 
 let print_state fmt st =
   Format.fprintf fmt "@[<2>%s@ (acc=%a;@ init=%a;@ num=%d)@]"
@@ -185,64 +48,230 @@ let print_statel fmt stl =
   Format.fprintf fmt "@[<2>States:@\n%a@]"
     (Pretty_utils.pp_list ~sep:"@\n" ~suf:"@\n" print_state) stl
 
-let print_raw_automata fmt (stl,trl) =
-  Format.fprintf fmt "@[<2>Automaton:@\n%a%a@]"
-    print_statel stl print_transitionl trl
-
-let dot_state out st =
-  let shape =
-    if st.init = Bool3.True && st.acceptation=Bool3.True then "doubleoctagon"
-    else if st.acceptation=Bool3.True then "octagon"
-    else if st.init=Bool3.True then "doublecircle"
-    else "circle"
-  in
-  Format.fprintf out "\"%a\" [shape = %s];@\n" print_state_label st shape
-
-let dot_trans out tr =
-  let print_label fmt tr = 
-    if DotSeparatedLabels.get () then 
-      Format.pp_print_int fmt tr.numt 
-    else print_trans fmt tr
-  in
-  Format.fprintf
-    out
-    "\"%a\"@ ->@ \"%a\"@ [label = @[\"%a\"@]];@\n"
-    print_state_label tr.start
-    print_state_label tr.stop
-    print_label tr
-
-let output_dot_automata (states_l,trans_l) fichier =
-  let cout = open_out fichier in
-  let fmt = formatter_of_out_channel cout in
-  let output_functions = escape_newline fmt in
-  let one_line_comment s =
-    let l = String.length s in
-    let fill = if l >= 75 then 0 else 75 - l in 
-    let spaces = String.make fill ' ' in
-    Format.fprintf fmt "@[/* %s%s*/@\n@]" s spaces
-  in
-  one_line_comment "File generated by Aorai LTL2ACSL Plug-in";
-  one_line_comment "";
-  one_line_comment "Usage of dot files '.dot' :";
-  one_line_comment "  dot <MyFile.dot> -T<DesiredType> > <OutputFile>";
-  one_line_comment "";
-  one_line_comment "   Allowed types : canon,dot,xdot,fig,gd,gd2,";
-  one_line_comment "   gif,hpgl,imap,cmap,ismap,jpg,jpeg,mif,mp,pcl,pic,plain,";
-  one_line_comment "   plain-ext,png,ps,ps2,svg,svgz,vrml,vtx,wbmp";
-  one_line_comment "";
-  one_line_comment " Example with postscript file :";
-  one_line_comment "    dot property.dot -Tps > property.ps";
-  Format.fprintf fmt "@[<2>@\ndigraph %s {@\n@\n%a@\n%a@\n%t}@\n@]"
-    (Filename.chop_extension (Filename.basename fichier))
-    (Pretty_utils.pp_list dot_state) states_l
-    (Pretty_utils.pp_list dot_trans) trans_l
-    (fun fmt ->
+let state_label num = "st"^string_of_int(num)
+let print_state_label fmt st =
+  Format.fprintf fmt "@[<2>%s:@ %s@]" (state_label st.nums) st.name
+
+
+module Parsed =
+struct
+  let string_of_unop = function
+    | Uminus -> "-"
+    | Ustar -> "*"
+    | Uamp -> "&"
+    | Ubw_not -> "~"
+
+  let rec print_expression fmt = function
+    | PVar s -> Format.fprintf fmt "%s" s
+    | PPrm (f,s) -> Format.fprintf fmt "%s().%s" f s
+    | PMetavar s -> Format.fprintf fmt "$%s" s
+    | PCst (IntConstant s) -> Format.fprintf fmt "%s" s
+    | PCst (FloatConstant s) -> Format.fprintf fmt "%s" s
+    | PCst (StringConstant s) -> Format.fprintf fmt "%S" s
+    | PCst (WStringConstant s) -> Format.fprintf fmt "%S" s
+    | PBinop(bop,e1,e2) ->
+      Format.fprintf fmt "(@[%a@])@ %a@ (@[%a@])"
+        print_expression e1 Printer.pp_binop (Logic_typing.type_binop bop)
+        print_expression e2
+    | PUnop(uop,e) ->
+      Format.fprintf fmt "%s@;(@[%a@])"
+        (string_of_unop uop)
+        print_expression e
+    | PArrget(e1,e2) ->
+      Format.fprintf fmt "%a@;[@(%a@]]"
+        print_expression e1 print_expression e2
+    | PField(e,s) -> Format.fprintf fmt "%a.%s" print_expression e s
+    | PArrow(e,s) -> Format.fprintf fmt "%a->%s" print_expression e s
+
+  let rec print_condition fmt = function
+    | PRel(rel,e1,e2) ->
+      Format.fprintf fmt "%a %a@ %a"
+        print_expression e1
+        Printer.pp_relation (Logic_typing.type_rel rel)
+        print_expression e2
+    | PTrue -> Format.pp_print_string fmt "true"
+    | PFalse -> Format.pp_print_string fmt "false"
+    | POr(e1,e2) ->
+      Format.fprintf fmt "(@[%a@])@ or@ (@[%a@])"
+        print_condition e1 print_condition e2
+    | PAnd(e1,e2) ->
+      Format.fprintf fmt "(@[%a@])@ and@ (@[%a@])"
+        print_condition e1 print_condition e2
+    | PNot c ->
+      Format.fprintf fmt "not(@[%a@])"
+        print_condition c
+    | PCall (s,None) -> Format.fprintf fmt "CALL(%s)" s
+    | PCall (s, Some b) -> Format.fprintf fmt "CALL(%s::%s)" s b
+    | PReturn s -> Format.fprintf fmt "RETURN(%s)" s
+
+  let rec print_seq_elt fmt elt =
+    Format.fprintf fmt "(%a%a){@[%a,%a@]}"
+      (Pretty_utils.pp_opt print_condition) elt.condition
+      print_sequence elt.nested
+      (Pretty_utils.pp_opt print_expression) elt.min_rep
+      (Pretty_utils.pp_opt print_expression) elt.max_rep
+
+  and print_sequence fmt l =
+    Pretty_utils.pp_list ~pre:"[@[" ~sep:";@ " ~suf:"@]]" print_seq_elt fmt l
+
+  let print_guard fmt = function
+    | Seq l -> print_sequence fmt l
+    | Otherwise -> Format.pp_print_string fmt "Otherwise"
+
+  let print_action fmt = function
+    | Metavar_assign (s, e) ->
+      Format.fprintf fmt "@[$%s := %a@]" s print_expression e
+
+  let print_actionl fmt l =
+    Pretty_utils.pp_list ~sep:"@\n" print_action fmt l
+end
+
+
+module Typed =
+struct
+  let rec print_condition fmt = function
+    | TCall (kf,None) ->
+      Format.fprintf fmt "Call(%a)" Kernel_function.pretty kf
+    | TCall (kf, Some b) ->
+      Format.fprintf fmt "Call(%a::%s)"
+        Kernel_function.pretty kf b.Cil_types.b_name
+    | TReturn kf ->
+      Format.fprintf fmt "Return(%a)" Kernel_function.pretty kf
+    | TOr  (c1,c2) ->
+      Format.fprintf fmt "@[<hov>(@[<2>%a@])@]@ or@ @[<hov>(@[<2>%a@])@]"
+        print_condition c1 print_condition c2
+    | TAnd (c1,c2) ->
+      Format.fprintf fmt "@[<hov>(@[<2>%a@])@]@ and@ @[<hov>(@[<2>%a@])@]"
+        print_condition c1 print_condition c2
+    | TNot c ->
+      Format.fprintf fmt "@[<hov 4>@[<hov 5>not(%a@])@]" print_condition c
+    | TTrue ->
+      Format.pp_print_string fmt "True"
+    | TFalse ->
+      Format.pp_print_string fmt "False"
+    | TRel(rel,exp1,exp2) ->
+      (* \result will be printed as such, not as f().return *)
+      Format.fprintf fmt "@[(%a)@]@ %a@ @[(%a)@]"
+        Printer.pp_term exp1
+        Printer.pp_relation rel
+        Printer.pp_term exp2
+
+  let print_action fmt = function
+    | Counter_init lv ->
+      Format.fprintf fmt "@[%a <- 1@]" Printer.pp_term_lval lv
+    | Counter_incr lv ->
+      Format.fprintf fmt "@[%a <- @[%a@ +@ 1@]@]"
+        Printer.pp_term_lval lv Printer.pp_term_lval lv
+    | Pebble_init (set,_,v) ->
+      Format.fprintf fmt "@[%a <- {@[ %a @]}@]"
+        Printer.pp_logic_var set.l_var_info Printer.pp_logic_var v
+    | Pebble_move(s1,_,s2,_) ->
+      Format.fprintf fmt "@[%a <- %a@]"
+        Printer.pp_logic_var s1.l_var_info
+        Printer.pp_logic_var s2.l_var_info
+    | Copy_value(lv,v) ->
+      Format.fprintf fmt "@[%a <- %a@]" Printer.pp_term_lval lv Printer.pp_term v
+
+  let print_actionl fmt l =
+    Pretty_utils.pp_list ~sep:"@\n" print_action fmt l
+
+  (* Use well-parenthesized combination of escape_newline/normal_newline*)
+  let escape_newline fmt =
+    let funcs = Format.pp_get_formatter_out_functions fmt () in
+    let has_printed = ref false in
+    let out_newline () =
+      if !has_printed then funcs.Format.out_string " \\\n" 0 3
+      else funcs.Format.out_newline ()
+    in
+    let out_string s b l =
+      if String.contains (String.sub s b l) '"' then
+        has_printed:=not !has_printed;
+      funcs.Format.out_string s b l
+    in
+    Format.pp_set_formatter_out_functions fmt
+      { funcs with Format.out_newline; out_string };
+    funcs
+
+  let trans_label num = "tr"^string_of_int(num)
+
+  let print_trans fmt trans =
+    Format.fprintf fmt
+      "@[<2>%s:@ %a@\n%a@]"
+      (trans_label trans.numt)
+      print_condition trans.cross
+      print_actionl trans.actions
+
+  let print_transition fmt tr =
+    Format.fprintf fmt "@[<2>{@ %d:@ %s@ {%a@\n%a}@ %s@]}"
+      tr.numt
+      tr.start.name
+      print_condition tr.cross
+      print_actionl tr.actions
+      tr.stop.name
+
+  let print_transitionl fmt trl =
+    Format.fprintf fmt "@[<2>Transitions:@\n%a@]"
+      (Pretty_utils.pp_list ~sep:"@\n" ~suf:"@\n" print_transition) trl
+
+  let print_automata fmt auto =
+    Format.fprintf fmt "@[<2>Automaton:@\n%a%a@]"
+      print_statel auto.states print_transitionl auto.trans
+
+  let dot_state out st =
+    let shape =
+      if st.init = Bool3.True && st.acceptation=Bool3.True then "doubleoctagon"
+      else if st.acceptation=Bool3.True then "octagon"
+      else if st.init=Bool3.True then "doublecircle"
+      else "circle"
+    in
+    Format.fprintf out "\"%a\" [shape = %s];@\n" print_state_label st shape
+
+  let dot_trans out tr =
+    let print_label fmt tr =
       if DotSeparatedLabels.get () then
-        (Format.fprintf fmt 
-           "/* guards of transitions */@\ncomment=\"%a\";@\n"
-           (Pretty_utils.pp_list ~sep:"@\n" print_trans) trans_l));
-  Format.pp_set_formatter_out_functions fmt output_functions;
-  close_out cout
+        Format.pp_print_int fmt tr.numt
+      else print_trans fmt tr
+    in
+    Format.fprintf
+      out
+      "\"%a\"@ ->@ \"%a\"@ [label = @[\"%a\"@]];@\n"
+      print_state_label tr.start
+      print_state_label tr.stop
+      print_label tr
+
+  let output_dot_automata {states ; trans} fichier =
+    let cout = open_out fichier in
+    let fmt = formatter_of_out_channel cout in
+    let output_functions = escape_newline fmt in
+    let one_line_comment s =
+      let l = String.length s in
+      let fill = if l >= 75 then 0 else 75 - l in
+      let spaces = String.make fill ' ' in
+      Format.fprintf fmt "@[/* %s%s*/@\n@]" s spaces
+    in
+    one_line_comment "File generated by Aorai LTL2ACSL Plug-in";
+    one_line_comment "";
+    one_line_comment "Usage of dot files '.dot' :";
+    one_line_comment "  dot <MyFile.dot> -T<DesiredType> > <OutputFile>";
+    one_line_comment "";
+    one_line_comment "   Allowed types : canon,dot,xdot,fig,gd,gd2,";
+    one_line_comment "   gif,hpgl,imap,cmap,ismap,jpg,jpeg,mif,mp,pcl,pic,plain,";
+    one_line_comment "   plain-ext,png,ps,ps2,svg,svgz,vrml,vtx,wbmp";
+    one_line_comment "";
+    one_line_comment " Example with postscript file :";
+    one_line_comment "    dot property.dot -Tps > property.ps";
+    Format.fprintf fmt "@[<2>@\ndigraph %s {@\n@\n%a@\n%a@\n%t}@\n@]"
+      (Filename.chop_extension (Filename.basename fichier))
+      (Pretty_utils.pp_list dot_state) states
+      (Pretty_utils.pp_list dot_trans) trans
+      (fun fmt ->
+         if DotSeparatedLabels.get () then
+           (Format.fprintf fmt
+              "/* guards of transitions */@\ncomment=\"%a\";@\n"
+              (Pretty_utils.pp_list ~sep:"@\n" print_trans) trans));
+    Format.pp_set_formatter_out_functions fmt output_functions;
+    close_out cout
+end
 
 (*
 Local Variables:
diff --git a/src/plugins/aorai/promelaoutput.mli b/src/plugins/aorai/promelaoutput.mli
index 75dcc4bba262d1d40a0946c004be41c6e2f1e126..3edf6aabb28b442fcab77c27aa9bd6a55265a5b7 100644
--- a/src/plugins/aorai/promelaoutput.mli
+++ b/src/plugins/aorai/promelaoutput.mli
@@ -23,35 +23,35 @@
 (*                                                                        *)
 (**************************************************************************)
 
-val print_raw_automata : 
-  Format.formatter -> Promelaast.typed_automaton -> unit
+open Promelaast
+
+type 'a printer = Format.formatter -> 'a -> unit
+
+val print_state : state printer
+val print_statel : state list printer
+
+module Parsed:
+sig
+  val print_expression: expression printer
+  val print_condition: condition printer
+  val print_seq_elt: seq_elt printer
+  val print_sequence: sequence printer
+  val print_guard: guard printer
+  val print_action: action printer
+  val print_actionl: action list printer
+end
+
+module Typed:
+sig
+  val print_condition : typed_condition printer
+  val print_action: typed_action printer
+  val print_actionl: typed_action list printer
+  val print_transition: typed_trans printer
+  val print_transitionl: typed_trans list printer
+  val print_automata : typed_automaton printer
+  val output_dot_automata : typed_automaton -> string -> unit
+end
 
-val print_parsed_expression: Format.formatter -> Promelaast.expression -> unit
-
-val print_parsed_condition: Format.formatter -> Promelaast.condition -> unit
-
-val print_seq_elt: Format.formatter -> Promelaast.seq_elt -> unit
-
-val print_sequence: Format.formatter -> Promelaast.sequence -> unit
-
-val print_parsed: Format.formatter -> Promelaast.parsed_condition -> unit
-
-val print_condition: Format.formatter -> Promelaast.typed_condition -> unit
-
-val print_action: Format.formatter -> Promelaast.action -> unit
-
-val print_transition:
-  Format.formatter -> 
-  (Promelaast.typed_condition * Promelaast.action) Promelaast.trans -> unit
-
-val print_transitionl:
-  Format.formatter ->
-  (Promelaast.typed_condition * Promelaast.action) Promelaast.trans list -> unit
-
-val print_state : Format.formatter -> Promelaast.state -> unit
-val print_statel : Format.formatter -> Promelaast.state list -> unit
-
-val output_dot_automata : Promelaast.typed_automaton -> string -> unit
 
 (*
 Local Variables:
diff --git a/src/plugins/aorai/promelaparser.mly b/src/plugins/aorai/promelaparser.mly
index bae7efad71dad89aa34e2fa47ef4dea5cbda5de2..4bcac643722e16f76ec9c72423f3e4f44d030119 100644
--- a/src/plugins/aorai/promelaparser.mly
+++ b/src/plugins/aorai/promelaparser.mly
@@ -77,7 +77,7 @@ promela
                 st::l
               ) observed_states []
             in
-            (states , $3)
+            { states; trans = $3; metavariables = Datatype.String.Map.empty }
         }
         | PROMELA_NEVER PROMELA_LBRACE states PROMELA_SEMICOLON 
             PROMELA_RBRACE EOF {
@@ -91,7 +91,7 @@ promela
                   st::l
                 ) observed_states []
               in
-              (states , $3) }
+              { states; trans = $3; metavariables = Datatype.String.Map.empty } }
   ;
 
 states   
@@ -119,9 +119,9 @@ state
               trans 
             else
               let tr_list=
-                List.fold_left (fun l1 (cr,stop_st)  -> 
-                  List.fold_left (fun l2 st -> 
-                    {start=st;stop=stop_st;cross=Seq (to_seq cr);numt=(-1)}::l2
+                List.fold_left (fun l1 (cr,stop)  -> 
+                  List.fold_left (fun l2 start -> 
+                    {start;stop;cross=Seq (to_seq cr);actions=[];numt=(-1)}::l2
                   ) l1 stl
                 ) [] trl 
               in
@@ -166,7 +166,7 @@ label
               (String.compare (String.sub $1 0 10) "accept_all")=0 
             then 
               trans:=
-                {start=old;stop=old;cross=Seq (to_seq PTrue);numt=(-1)} ::
+                {start=old;stop=old;cross=Seq (to_seq PTrue);actions=[];numt=(-1)} ::
                 !trans;
             (* If the name includes accept then 
                this state is an acceptation one. *)
diff --git a/src/plugins/aorai/promelaparser_withexps.mly b/src/plugins/aorai/promelaparser_withexps.mly
index 36f93360a5037fe1805b122424f6be432fa8c681..bf852a65f3747b7a4c976151a3b593b90fe4da18 100644
--- a/src/plugins/aorai/promelaparser_withexps.mly
+++ b/src/plugins/aorai/promelaparser_withexps.mly
@@ -88,7 +88,7 @@ promela
                 st::l
               ) observed_states []
             in
-            (states , $3)
+            { states; trans = $3; metavariables = Datatype.String.Map.empty }
         }
         | PROMELA_NEVER PROMELA_LBRACE states 
             PROMELA_SEMICOLON PROMELA_RBRACE EOF {
@@ -102,7 +102,7 @@ promela
                 st::l
               ) observed_states []
             in
-            (states , $3) }
+            { states; trans = $3; metavariables = Datatype.String.Map.empty } }
   ;
 
 states   
@@ -128,9 +128,9 @@ state
               trans 
             else
               let tr_list=
-                List.fold_left (fun l1 (cr,stop_st)  -> 
-                  List.fold_left (fun l2 st -> 
-                    {start=st;stop=stop_st;cross=Seq (to_seq cr);numt=(-1)}::l2
+                List.fold_left (fun l1 (cr,stop)  -> 
+                  List.fold_left (fun l2 start -> 
+                    {start;stop;cross=Seq (to_seq cr);actions=[];numt=(-1)}::l2
                   ) l1 stl
                 ) [] trl
               in
@@ -178,7 +178,7 @@ label
               (String.compare (String.sub $1 0 10) "accept_all")=0 
             then 
               trans:=
-                {start=old;stop=old;cross=Seq (to_seq PTrue);numt=(-1)}::!trans;
+                {start=old;stop=old;cross=Seq (to_seq PTrue);actions=[];numt=(-1)}::!trans;
             
             (* If the name includes accept then this state is 
                an acceptation one. *)
diff --git a/src/plugins/aorai/tests/Aorai_test.ml b/src/plugins/aorai/tests/Aorai_test.ml
index b559eeb411ce69b62129d8bf7ba5beb05415ec3d..54d04d63939431ae669439b4b29cb5a3c8bc9f32 100644
--- a/src/plugins/aorai/tests/Aorai_test.ml
+++ b/src/plugins/aorai/tests/Aorai_test.ml
@@ -1,15 +1,15 @@
 (* Small script to test that the code generated by aorai can be parsed again
  * by frama-c.
- *)
+*)
 
 open Kernel
 
 module P = Plugin.Register
-(struct
-  let name = "aorai testing module"
-  let shortname = "aorai-test"
-  let help = "utility script for aorai regtests"
- end)
+    (struct
+      let name = "aorai testing module"
+      let shortname = "aorai-test"
+      let help = "utility script for aorai regtests"
+    end)
 
 module TestNumber =
   P.Zero
@@ -17,25 +17,25 @@ module TestNumber =
       let option_name = "-aorai-test-number"
       let help = "test number when multiple tests are run over the same file"
       let arg_name = "n"
-     end)
+    end)
 
 module InternalWpShare =
   P.Filepath(
-    struct
-      let option_name = "-aorai-test-wp-share"
-      let help = "use custom wp share dir (when in internal plugin mode)"
-      let arg_name = "dir"
-      let existence = Filepath.Must_exist
-      let file_kind = "wp share directory"
-    end)
+  struct
+    let option_name = "-aorai-test-wp-share"
+    let help = "use custom wp share dir (when in internal plugin mode)"
+    let arg_name = "dir"
+    let existence = Filepath.Must_exist
+    let file_kind = "wp share directory"
+  end)
 
 module ProveAuxSpec =
   P.False(
-    struct
-      let option_name = "-aorai-test-prove-aux-spec"
-      let help = "use WP + alt-ergo to prove that generated spec and body \
-                  of auxiliary automata functions match"
-    end)
+  struct
+    let option_name = "-aorai-test-prove-aux-spec"
+    let help = "use WP + alt-ergo to prove that generated spec and body \
+                of auxiliary automata functions match"
+  end)
 
 let ok = ref false
 
@@ -71,11 +71,17 @@ let extend () =
           wp_compute_kf kf
       in
       run f;
+      let tmpdir = Filename.get_temp_dir_name () in
+      let tmpdir =
+        match Filename.chop_suffix_opt ~suffix:"/" tmpdir with
+        | None -> tmpdir
+        | Some dir -> dir
+      in
       let tmpfile =
-        Filename.get_temp_dir_name () ^ "/aorai_" ^
-        (Filename.chop_extension
-           (Filename.basename (List.hd (Kernel.Files.get()):>string))) ^ "_" ^
-        (string_of_int (TestNumber.get ())) ^ ".i"
+        tmpdir ^ "/aorai_" ^
+        Filename.(
+          chop_extension (basename (List.hd (Kernel.Files.get()):>string))) ^
+        "_" ^ (string_of_int (TestNumber.get ())) ^ ".i"
       in
       let () =
         Extlib.safe_at_exit
@@ -93,8 +99,11 @@ let extend () =
       in
       Project.copy ~selection my_project;
       Project.set_current my_project;
-      Kernel.SymbolicPath.add ("TMPDIR:"^Filename.get_temp_dir_name());
+      Kernel.SymbolicPath.add
+        (Filepath.Normalized.of_string (Filename.get_temp_dir_name ()),
+         Some "TMPDIR");
       Files.append_after [ Filepath.Normalized.of_string tmpfile ];
+      Kernel.LogicalOperators.on ();
       Constfold.off ();
       Ast.compute();
       if ProveAuxSpec.get () then begin
diff --git a/src/plugins/aorai/tests/ltl/call_tree.ltl b/src/plugins/aorai/tests/ltl/call_tree.ltl
index 0bd3eea830baf4120895a7c01d59b371f6aa7d3a..8025745abb3fbf52be0526cd62e77aee72af7720 100644
--- a/src/plugins/aorai/tests/ltl/call_tree.ltl
+++ b/src/plugins/aorai/tests/ltl/call_tree.ltl
@@ -1 +1 @@
-CALL(main) && _X_ ((x == 0 && CALL(f) && _X_ (RETURN(f) && _X_ (CALL(g) && _X_ RETURN(g)))) || (x!=0 && (CALL(g) && _X_ RETURN(g))))
\ No newline at end of file
+CALL(main) && _X_ ((x == 0 && CALL(f) && _X_ (RETURN(f) && _X_ (CALL(g) && _X_ RETURN(g)))) || (x!=0 && (CALL(g) && _X_ RETURN(g))))
diff --git a/src/plugins/aorai/tests/ltl/oracle/test_boucle.res.oracle b/src/plugins/aorai/tests/ltl/oracle/test_boucle.res.oracle
index 43f443e26e9773bfe488435071f0953066f1112b..af9bc71a2b3a1adf94c0022438693926ffc17f6f 100644
--- a/src/plugins/aorai/tests/ltl/oracle/test_boucle.res.oracle
+++ b/src/plugins/aorai/tests/ltl/oracle/test_boucle.res.oracle
@@ -52,9 +52,8 @@ extern int call_to_an_undefined_function(void);
     T0_S2_tmp = T0_S2;
     T0_init_tmp = T0_init;
     accept_S1_tmp = accept_S1;
-    if (T0_S2 == 1) accept_S1_tmp = 1;
-    else 
-      if (accept_S1 == 1) accept_S1_tmp = 1; else accept_S1_tmp = 0;
+    if (T0_S2 == 1 || accept_S1 == 1) accept_S1_tmp = 1;
+    else accept_S1_tmp = 0;
     T0_init_tmp = 0;
     T0_S2_tmp = 0;
     T0_S2 = T0_S2_tmp;
@@ -159,9 +158,7 @@ int a(void)
     accept_S1_tmp = accept_S1;
     accept_S1_tmp = 0;
     T0_init_tmp = 0;
-    if (T0_S2 == 1) T0_S2_tmp = 1;
-    else 
-      if (accept_S1 == 1) T0_S2_tmp = 1; else T0_S2_tmp = 0;
+    if (T0_S2 == 1 || accept_S1 == 1) T0_S2_tmp = 1; else T0_S2_tmp = 0;
     T0_S2 = T0_S2_tmp;
     T0_init = T0_init_tmp;
     accept_S1 = accept_S1_tmp;
diff --git a/src/plugins/aorai/tests/ltl/oracle/test_boucle1.res.oracle b/src/plugins/aorai/tests/ltl/oracle/test_boucle1.res.oracle
index 31031e82bb479afbb18fa7e403bf822e42c7f654..9da27b6622ebd3fbb5ae7fefb8a0e694d48175d1 100644
--- a/src/plugins/aorai/tests/ltl/oracle/test_boucle1.res.oracle
+++ b/src/plugins/aorai/tests/ltl/oracle/test_boucle1.res.oracle
@@ -271,12 +271,10 @@ int commit_trans(void)
     accept_S4_tmp = accept_S4;
     accept_init_tmp = accept_init;
     accept_init_tmp = 0;
-    if (accept_S2 == 1) 
-      if (status != 0) accept_S4_tmp = 1; else accept_S4_tmp = 0;
+    if (accept_S2 == 1 && status != 0) accept_S4_tmp = 1;
     else accept_S4_tmp = 0;
     accept_S3_tmp = 0;
-    if (accept_S2 == 1) 
-      if (status == 0) accept_S2_tmp = 1; else accept_S2_tmp = 0;
+    if (accept_S2 == 1 && status == 0) accept_S2_tmp = 1;
     else accept_S2_tmp = 0;
     accept_S1_tmp = 0;
     accept_S1 = accept_S1_tmp;
diff --git a/src/plugins/aorai/tests/ltl/oracle/test_boucle2.res.oracle b/src/plugins/aorai/tests/ltl/oracle/test_boucle2.res.oracle
index e2122593e23b155dd6385ea9e1f256cf66a3157d..3b6f510bb856cc315fcedd97a9d0796d7bbf4d9a 100644
--- a/src/plugins/aorai/tests/ltl/oracle/test_boucle2.res.oracle
+++ b/src/plugins/aorai/tests/ltl/oracle/test_boucle2.res.oracle
@@ -144,9 +144,7 @@ int rr = 1;
     accept_all_tmp = 0;
     accept_S5_tmp = 0;
     accept_S4_tmp = 0;
-    if (T0_S2 == 1) 
-      if (rr == 51) accept_S3_tmp = 1; else accept_S3_tmp = 0;
-    else accept_S3_tmp = 0;
+    if (T0_S2 == 1 && rr == 51) accept_S3_tmp = 1; else accept_S3_tmp = 0;
     T0_init_tmp = 0;
     if (T0_S2 == 1) T0_S2_tmp = 1; else T0_S2_tmp = 0;
     T0_S2 = T0_S2_tmp;
diff --git a/src/plugins/aorai/tests/ltl/oracle/test_boucle3.res.oracle b/src/plugins/aorai/tests/ltl/oracle/test_boucle3.res.oracle
index 44c7d11061b5a33640e834283e79a608ac9885e1..0e2861364d6f1efef4a6191a0cd4ac2a817c7b23 100644
--- a/src/plugins/aorai/tests/ltl/oracle/test_boucle3.res.oracle
+++ b/src/plugins/aorai/tests/ltl/oracle/test_boucle3.res.oracle
@@ -236,9 +236,7 @@ void opa(void)
     accept_S3_tmp = accept_S3;
     accept_all_tmp = accept_all;
     accept_all_tmp = 0;
-    if (T1_S2 == 1) 
-      if (rr == 51) accept_S3_tmp = 1; else accept_S3_tmp = 0;
-    else accept_S3_tmp = 0;
+    if (T1_S2 == 1 && rr == 51) accept_S3_tmp = 1; else accept_S3_tmp = 0;
     T1_S2_tmp = 0;
     T0_init_tmp = 0;
     T0_S4_tmp = 0;
diff --git a/src/plugins/aorai/tests/ltl/oracle/test_factorial.res.oracle b/src/plugins/aorai/tests/ltl/oracle/test_factorial.res.oracle
index 41a681dcff82e65b2fa850c0c8f9f7485adc2a39..76309462d15d0678365eb0f899d7dc1730f6ad87 100644
--- a/src/plugins/aorai/tests/ltl/oracle/test_factorial.res.oracle
+++ b/src/plugins/aorai/tests/ltl/oracle/test_factorial.res.oracle
@@ -119,7 +119,7 @@ int decode_int(char *s)
   int __retres;
   char c;
   /*@ ghost decode_int_pre_func(s); */
-  int intmax = ~ (1 << (sizeof(int) * (unsigned int)8 - (unsigned int)1));
+  int intmax = ~ (1 << (sizeof(int) * (unsigned long)8 - (unsigned long)1));
   int cutlim = intmax % 10;
   int cutoff = intmax / 10;
   int value = 0;
@@ -217,9 +217,8 @@ int decode_int(char *s)
     accept_S2_tmp = accept_S2;
     accept_init_tmp = accept_init;
     accept_init_tmp = 0;
-    if (accept_S1 == 1) accept_S2_tmp = 1;
-    else 
-      if (accept_S2 == 1) accept_S2_tmp = 1; else accept_S2_tmp = 0;
+    if (accept_S1 == 1 || accept_S2 == 1) accept_S2_tmp = 1;
+    else accept_S2_tmp = 0;
     accept_S1_tmp = 0;
     accept_S1 = accept_S1_tmp;
     accept_S2 = accept_S2_tmp;
@@ -266,12 +265,10 @@ int decode_int(char *s)
     accept_S2_tmp = accept_S2;
     accept_init_tmp = accept_init;
     accept_init_tmp = 0;
-    if (accept_S1 == 1) accept_S2_tmp = 1;
-    else 
-      if (accept_S2 == 1) accept_S2_tmp = 1; else accept_S2_tmp = 0;
-    if (accept_S1 == 1) accept_S1_tmp = 1;
-    else 
-      if (accept_S2 == 1) accept_S1_tmp = 1; else accept_S1_tmp = 0;
+    if (accept_S1 == 1 || accept_S2 == 1) accept_S2_tmp = 1;
+    else accept_S2_tmp = 0;
+    if (accept_S1 == 1 || accept_S2 == 1) accept_S1_tmp = 1;
+    else accept_S1_tmp = 0;
     accept_S1 = accept_S1_tmp;
     accept_S2 = accept_S2_tmp;
     accept_init = accept_init_tmp;
diff --git a/src/plugins/aorai/tests/ltl/oracle/test_recursion2.0.res.oracle b/src/plugins/aorai/tests/ltl/oracle/test_recursion2.0.res.oracle
index 2a45f6df9a0c0492d43a914b3956d05da1ec92dc..fd43837e998528a1c7cfa61c0424d06e0c3d4508 100644
--- a/src/plugins/aorai/tests/ltl/oracle/test_recursion2.0.res.oracle
+++ b/src/plugins/aorai/tests/ltl/oracle/test_recursion2.0.res.oracle
@@ -106,11 +106,7 @@ int global_argc = 0;
     accept_T2_tmp = 0;
     T1_tmp = 0;
     T0_init_tmp = 0;
-    if (S1 == 1) S1_tmp = 1;
-    else 
-      if (T1 == 1) 
-        if (global_argc > 0) S1_tmp = 1; else S1_tmp = 0;
-      else S1_tmp = 0;
+    if (S1 == 1 || T1 == 1 && global_argc > 0) S1_tmp = 1; else S1_tmp = 0;
     S1 = S1_tmp;
     T0_init = T0_init_tmp;
     T1 = T1_tmp;
diff --git a/src/plugins/aorai/tests/ltl/oracle/test_recursion2.1.res.oracle b/src/plugins/aorai/tests/ltl/oracle/test_recursion2.1.res.oracle
index 741ab2d5228be77cd697851f6fb4c8a80e783e9c..a40a3eae30459dfa081154ccd2b0eed95761f1b8 100644
--- a/src/plugins/aorai/tests/ltl/oracle/test_recursion2.1.res.oracle
+++ b/src/plugins/aorai/tests/ltl/oracle/test_recursion2.1.res.oracle
@@ -106,11 +106,7 @@ int global_argc = 0;
     accept_T2_tmp = 0;
     T1_tmp = 0;
     T0_init_tmp = 0;
-    if (S1 == 1) S1_tmp = 1;
-    else 
-      if (T1 == 1) 
-        if (global_argc > 0) S1_tmp = 1; else S1_tmp = 0;
-      else S1_tmp = 0;
+    if (S1 == 1 || T1 == 1 && global_argc > 0) S1_tmp = 1; else S1_tmp = 0;
     S1 = S1_tmp;
     T0_init = T0_init_tmp;
     T1 = T1_tmp;
@@ -419,9 +415,7 @@ int sumOne(char *t, int length)
     T0_init_tmp = T0_init;
     T1_tmp = T1;
     accept_T2_tmp = accept_T2;
-    if (T1 == 1) 
-      if (res == 1) accept_T2_tmp = 1; else accept_T2_tmp = 0;
-    else accept_T2_tmp = 0;
+    if (T1 == 1 && res == 1) accept_T2_tmp = 1; else accept_T2_tmp = 0;
     if (T1 == 1) T1_tmp = 1; else T1_tmp = 0;
     T0_init_tmp = 0;
     S1_tmp = 0;
diff --git a/src/plugins/aorai/tests/ltl/oracle/test_switch3.res.oracle b/src/plugins/aorai/tests/ltl/oracle/test_switch3.res.oracle
index 98fef42772d572f1ea75d8df26c6b528b85884c1..d81509eb53661bace2a79e5e2babdface3e95275 100644
--- a/src/plugins/aorai/tests/ltl/oracle/test_switch3.res.oracle
+++ b/src/plugins/aorai/tests/ltl/oracle/test_switch3.res.oracle
@@ -58,9 +58,7 @@ enum aorai_OpStatusList {
     accept_S2_tmp = 0;
     accept_S1_tmp = 0;
     T0_init_tmp = 0;
-    if (T0_S2 == 1) T0_S2_tmp = 1;
-    else 
-      if (accept_S2 == 1) T0_S2_tmp = 1; else T0_S2_tmp = 0;
+    if (T0_S2 == 1 || accept_S2 == 1) T0_S2_tmp = 1; else T0_S2_tmp = 0;
     T0_S2 = T0_S2_tmp;
     T0_init = T0_init_tmp;
     accept_S1 = accept_S1_tmp;
@@ -249,14 +247,10 @@ int countOne(char *argv)
     T0_init_tmp = T0_init;
     accept_S1_tmp = accept_S1;
     accept_S2_tmp = accept_S2;
-    if (T0_S2 == 1) accept_S2_tmp = 1;
-    else 
-      if (accept_S2 == 1) accept_S2_tmp = 1; else accept_S2_tmp = 0;
-    if (T0_S2 == 1) accept_S1_tmp = 1;
-    else 
-      if (accept_S1 == 1) accept_S1_tmp = 1;
-      else 
-        if (accept_S2 == 1) accept_S1_tmp = 1; else accept_S1_tmp = 0;
+    if (T0_S2 == 1 || accept_S2 == 1) accept_S2_tmp = 1;
+    else accept_S2_tmp = 0;
+    if ((T0_S2 == 1 || accept_S1 == 1) || accept_S2 == 1) accept_S1_tmp = 1;
+    else accept_S1_tmp = 0;
     T0_init_tmp = 0;
     if (accept_S1 == 1) T0_S2_tmp = 1; else T0_S2_tmp = 0;
     T0_S2 = T0_S2_tmp;
diff --git a/src/plugins/aorai/tests/ltl/oracle/test_switch3_if.res.oracle b/src/plugins/aorai/tests/ltl/oracle/test_switch3_if.res.oracle
index 4666520a57e4971263d00b54bcf6e80c92189602..5cc019fcad43e0cfacafa6eb123b8055daf1dda4 100644
--- a/src/plugins/aorai/tests/ltl/oracle/test_switch3_if.res.oracle
+++ b/src/plugins/aorai/tests/ltl/oracle/test_switch3_if.res.oracle
@@ -58,9 +58,7 @@ enum aorai_OpStatusList {
     accept_S2_tmp = 0;
     accept_S1_tmp = 0;
     T0_init_tmp = 0;
-    if (T0_S2 == 1) T0_S2_tmp = 1;
-    else 
-      if (accept_S2 == 1) T0_S2_tmp = 1; else T0_S2_tmp = 0;
+    if (T0_S2 == 1 || accept_S2 == 1) T0_S2_tmp = 1; else T0_S2_tmp = 0;
     T0_S2 = T0_S2_tmp;
     T0_init = T0_init_tmp;
     accept_S1 = accept_S1_tmp;
@@ -247,14 +245,10 @@ int countOne(char *argv)
     T0_init_tmp = T0_init;
     accept_S1_tmp = accept_S1;
     accept_S2_tmp = accept_S2;
-    if (T0_S2 == 1) accept_S2_tmp = 1;
-    else 
-      if (accept_S2 == 1) accept_S2_tmp = 1; else accept_S2_tmp = 0;
-    if (T0_S2 == 1) accept_S1_tmp = 1;
-    else 
-      if (accept_S1 == 1) accept_S1_tmp = 1;
-      else 
-        if (accept_S2 == 1) accept_S1_tmp = 1; else accept_S1_tmp = 0;
+    if (T0_S2 == 1 || accept_S2 == 1) accept_S2_tmp = 1;
+    else accept_S2_tmp = 0;
+    if ((T0_S2 == 1 || accept_S1 == 1) || accept_S2 == 1) accept_S1_tmp = 1;
+    else accept_S1_tmp = 0;
     T0_init_tmp = 0;
     if (accept_S1 == 1) T0_S2_tmp = 1; else T0_S2_tmp = 0;
     T0_S2 = T0_S2_tmp;
diff --git a/src/plugins/aorai/tests/ltl/oracle/test_switch3_return.res.oracle b/src/plugins/aorai/tests/ltl/oracle/test_switch3_return.res.oracle
index 95252b378b334550da4837d9954756ec07d77f4c..0fb781bb7040975d8e51beef6328114ceb34a501 100644
--- a/src/plugins/aorai/tests/ltl/oracle/test_switch3_return.res.oracle
+++ b/src/plugins/aorai/tests/ltl/oracle/test_switch3_return.res.oracle
@@ -58,9 +58,7 @@ enum aorai_OpStatusList {
     accept_S2_tmp = 0;
     accept_S1_tmp = 0;
     T0_init_tmp = 0;
-    if (T0_S2 == 1) T0_S2_tmp = 1;
-    else 
-      if (accept_S2 == 1) T0_S2_tmp = 1; else T0_S2_tmp = 0;
+    if (T0_S2 == 1 || accept_S2 == 1) T0_S2_tmp = 1; else T0_S2_tmp = 0;
     T0_S2 = T0_S2_tmp;
     T0_init = T0_init_tmp;
     accept_S1 = accept_S1_tmp;
@@ -254,14 +252,10 @@ int countOne(char *argv)
     T0_init_tmp = T0_init;
     accept_S1_tmp = accept_S1;
     accept_S2_tmp = accept_S2;
-    if (T0_S2 == 1) accept_S2_tmp = 1;
-    else 
-      if (accept_S2 == 1) accept_S2_tmp = 1; else accept_S2_tmp = 0;
-    if (T0_S2 == 1) accept_S1_tmp = 1;
-    else 
-      if (accept_S1 == 1) accept_S1_tmp = 1;
-      else 
-        if (accept_S2 == 1) accept_S1_tmp = 1; else accept_S1_tmp = 0;
+    if (T0_S2 == 1 || accept_S2 == 1) accept_S2_tmp = 1;
+    else accept_S2_tmp = 0;
+    if ((T0_S2 == 1 || accept_S1 == 1) || accept_S2 == 1) accept_S1_tmp = 1;
+    else accept_S1_tmp = 0;
     T0_init_tmp = 0;
     if (accept_S1 == 1) T0_S2_tmp = 1; else T0_S2_tmp = 0;
     T0_S2 = T0_S2_tmp;
diff --git a/src/plugins/aorai/tests/ltl/oracle_prove/test_boucle.res.oracle b/src/plugins/aorai/tests/ltl/oracle_prove/test_boucle.res.oracle
index 6e0517bda1c07bff22106dd567c40ef03029419d..0cf6aa042e89216a12267f75a00f12f7900d45ec 100644
--- a/src/plugins/aorai/tests/ltl/oracle_prove/test_boucle.res.oracle
+++ b/src/plugins/aorai/tests/ltl/oracle_prove/test_boucle.res.oracle
@@ -4,5 +4,5 @@
 [aorai] Welcome to the Aorai plugin
 [kernel] Parsing TMPDIR/aorai_test_boucle_0.i (no preprocessing)
 [wp] Warning: Missing RTE guards
-[kernel:annot:missing-spec] TMPDIR/aorai_test_boucle_0.i:81: Warning: 
+[kernel:annot:missing-spec] TMPDIR/aorai_test_boucle_0.i:85: Warning: 
   Neither code nor specification for function call_to_an_undefined_function, generating default assigns from the prototype
diff --git a/src/plugins/aorai/tests/ltl/test_boucle.ltl b/src/plugins/aorai/tests/ltl/test_boucle.ltl
index 3e3d00c7ad41a20bd43c51c786cfad21ab60630a..9817c70f3d09927af0e37d3707357e463a24f7ab 100644
--- a/src/plugins/aorai/tests/ltl/test_boucle.ltl
+++ b/src/plugins/aorai/tests/ltl/test_boucle.ltl
@@ -1 +1 @@
-_G_(CALL(b) => (CALL_OR_RETURN(b) _U_ CALL(a)))
\ No newline at end of file
+_G_(CALL(b) => (CALL_OR_RETURN(b) _U_ CALL(a)))
diff --git a/src/plugins/aorai/tests/ya/aorai_ptr_field.i b/src/plugins/aorai/tests/ya/aorai_ptr_field.i
new file mode 100644
index 0000000000000000000000000000000000000000..9f1316be55c1e7c25305f22bdbed66a594434bb9
--- /dev/null
+++ b/src/plugins/aorai/tests/ya/aorai_ptr_field.i
@@ -0,0 +1,7 @@
+/* run.config*
+   OPT: -aorai-automata @PTEST_DIR@/@PTEST_NAME@.ya -aorai-test 1 -load-module tests/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ @PROVE_OPTIONS@
+*/
+
+struct S { int x; };
+
+void main(struct S* s) { return; }
diff --git a/src/plugins/aorai/tests/ya/aorai_ptr_field.ya b/src/plugins/aorai/tests/ya/aorai_ptr_field.ya
new file mode 100644
index 0000000000000000000000000000000000000000..617c4b721e1659ccadc999bf96982e5e9fa7092e
--- /dev/null
+++ b/src/plugins/aorai/tests/ya/aorai_ptr_field.ya
@@ -0,0 +1,6 @@
+%init: S0;
+%accept: S1;
+
+S0: { (*main().s).x >= 0 } -> S1
+  | { (main().s)->x < 0 } -> S1;
+S1: -> S1;
diff --git a/src/plugins/aorai/tests/ya/assigns.ya b/src/plugins/aorai/tests/ya/assigns.ya
index 40ca7d12a90bb165ffc2db09202323b5c7bc21f3..95e3cb481eafa8ba4ed12f75a0faaceab026b62b 100644
--- a/src/plugins/aorai/tests/ya/assigns.ya
+++ b/src/plugins/aorai/tests/ya/assigns.ya
@@ -9,4 +9,4 @@ S_in_f: { RETURN(f) } -> in_main;
 
 in_main: { RETURN(main) } -> S2;
 
-S2: -> S2;
\ No newline at end of file
+S2: -> S2;
diff --git a/src/plugins/aorai/tests/ya/assigns_det.ya b/src/plugins/aorai/tests/ya/assigns_det.ya
index 23d18f81308636a27529f070ea1bf3bb098e3f49..6169d8106572ddb4005a6acf767e0ae818149b9a 100644
--- a/src/plugins/aorai/tests/ya/assigns_det.ya
+++ b/src/plugins/aorai/tests/ya/assigns_det.ya
@@ -10,4 +10,4 @@ S_in_f: { RETURN(f) } -> in_main;
 
 in_main: { RETURN(main) } -> S2;
 
-S2: -> S2;
\ No newline at end of file
+S2: -> S2;
diff --git a/src/plugins/aorai/tests/ya/deterministic.ya b/src/plugins/aorai/tests/ya/deterministic.ya
index ab8088b4543b7d9dab8db1965049b7a05767b9f7..326a2b86485eba322838f12711fb224b339f58cc 100644
--- a/src/plugins/aorai/tests/ya/deterministic.ya
+++ b/src/plugins/aorai/tests/ya/deterministic.ya
@@ -19,4 +19,4 @@ S4: { RETURN(g) } -> S3;
 
 S5: { RETURN(g) } -> S1;
 
-Sf: -> Sf;
\ No newline at end of file
+Sf: -> Sf;
diff --git a/src/plugins/aorai/tests/ya/incorrect.ya b/src/plugins/aorai/tests/ya/incorrect.ya
index 4aec9ac2e844c4e43940e87990d026c3f7780064..5b8316b0ef0d0b1a85f91155b7ef0532ea2c3cf1 100644
--- a/src/plugins/aorai/tests/ya/incorrect.ya
+++ b/src/plugins/aorai/tests/ya/incorrect.ya
@@ -3,4 +3,4 @@
 %deterministic;
 
 s0: { f() } -> OK;
-OK: -> OK;
\ No newline at end of file
+OK: -> OK;
diff --git a/src/plugins/aorai/tests/ya/metavariables-incompatible.i b/src/plugins/aorai/tests/ya/metavariables-incompatible.i
new file mode 100644
index 0000000000000000000000000000000000000000..26744167705ea93e49e38818c96dcb32d17b623b
--- /dev/null
+++ b/src/plugins/aorai/tests/ya/metavariables-incompatible.i
@@ -0,0 +1,6 @@
+/* run.config*
+   OPT: -aorai-automata @PTEST_DIR@/@PTEST_NAME@.ya -aorai-test 1 -load-module tests/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ @PROVE_OPTIONS@
+*/
+
+void main(void) {}
+
diff --git a/src/plugins/aorai/tests/ya/metavariables-incompatible.ya b/src/plugins/aorai/tests/ya/metavariables-incompatible.ya
new file mode 100644
index 0000000000000000000000000000000000000000..1a112501655fc5b2f4a9a0b3ed80cb9aacce7288
--- /dev/null
+++ b/src/plugins/aorai/tests/ya/metavariables-incompatible.ya
@@ -0,0 +1,9 @@
+%init:		a;
+%accept:	b;
+%deterministic;
+
+$x : int;
+
+a : { [CALL(main)]* } -> b;
+
+b : -> b;
diff --git a/src/plugins/aorai/tests/ya/metavariables-right.i b/src/plugins/aorai/tests/ya/metavariables-right.i
new file mode 100644
index 0000000000000000000000000000000000000000..cff3994c1017f532d1d44db092abb5be27d1dcb8
--- /dev/null
+++ b/src/plugins/aorai/tests/ya/metavariables-right.i
@@ -0,0 +1,27 @@
+/* run.config*
+   OPT: -aorai-automata @PTEST_DIR@/@PTEST_NAME@.ya -aorai-test 1 -load-module tests/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ @PROVE_OPTIONS@
+*/
+
+void f(int x) {}
+void g(void) {}
+void h(int x) {}
+void i(void) {}
+
+void main(int t)
+{
+  if (t) {
+    f(42);
+  }
+  else {
+    g();
+    goto L;
+  }
+
+  int x = 0;
+  while (x < 100)
+  {
+    h(x);
+    L: i();
+    x++;
+  }
+}
diff --git a/src/plugins/aorai/tests/ya/metavariables-right.ya b/src/plugins/aorai/tests/ya/metavariables-right.ya
new file mode 100644
index 0000000000000000000000000000000000000000..589d2b2e697825ac06f068208e1ada57e4d64f4c
--- /dev/null
+++ b/src/plugins/aorai/tests/ya/metavariables-right.ya
@@ -0,0 +1,30 @@
+%init:		a;
+%accept:	i;
+%deterministic;
+
+$x : int;
+$y : int;
+
+a : { CALL(main) } -> b;
+
+b :
+  { CALL(f) } $x := f().x; $y := $x; -> c
+| { CALL(g) } -> d
+;
+
+c : { RETURN(f) } -> e;
+
+d : { RETURN(g) } -> g;
+
+e :
+  { CALL(h) && $x > 0 } -> f
+| { RETURN(main) } -> i
+;
+
+f : { RETURN(h) } -> g;
+
+g : { CALL(i) } -> h;
+
+h : { RETURN(i) } $y := 0; $x := 1; -> e;
+
+i : -> i;
diff --git a/src/plugins/aorai/tests/ya/metavariables-wrong.i b/src/plugins/aorai/tests/ya/metavariables-wrong.i
new file mode 100644
index 0000000000000000000000000000000000000000..09ea4b6c4bcfc15e83ef2c2a676be84c00ca294b
--- /dev/null
+++ b/src/plugins/aorai/tests/ya/metavariables-wrong.i
@@ -0,0 +1,22 @@
+/* run.config*
+   OPT: -aorai-automata @PTEST_DIR@/@PTEST_NAME@.ya -aorai-test 1 -load-module tests/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ @PROVE_OPTIONS@
+*/
+
+void f(int x) {}
+void g(void) {}
+void h(void) {}
+
+void main(void)
+{
+  int x = 0;
+  while (x < 100)
+  {
+    if (x % 2)
+      f(x);
+    else
+      g();
+    h();
+    x++;
+  }
+}
+
diff --git a/src/plugins/aorai/tests/ya/metavariables-wrong.ya b/src/plugins/aorai/tests/ya/metavariables-wrong.ya
new file mode 100644
index 0000000000000000000000000000000000000000..860f7b7cd49b9dd982d340deace5d4aad1ee7652
--- /dev/null
+++ b/src/plugins/aorai/tests/ya/metavariables-wrong.ya
@@ -0,0 +1,23 @@
+%init:		a;
+%accept:	g;
+%deterministic;
+
+$x : int;
+
+a : { CALL(main) } -> b;
+
+b :
+  { CALL(f) } $x := f().x; -> c
+| { CALL(g) } -> d
+| { RETURN(main) } -> g
+;
+
+c : { RETURN(f) } -> e;
+
+d : { RETURN(g) } -> e;
+
+e : { CALL(h) && $x > 0 } -> f;
+
+f : { RETURN(h) } -> b;
+
+g : -> g;
diff --git a/src/plugins/aorai/tests/ya/oracle/aorai_ptr_field.res.oracle b/src/plugins/aorai/tests/ya/oracle/aorai_ptr_field.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..b9750505021bd05f5fc1a55c85159b8c653a0ff2
--- /dev/null
+++ b/src/plugins/aorai/tests/ya/oracle/aorai_ptr_field.res.oracle
@@ -0,0 +1,103 @@
+[kernel] Parsing tests/ya/aorai_ptr_field.i (no preprocessing)
+[aorai] Welcome to the Aorai plugin
+[kernel] Parsing TMPDIR/aorai_aorai_ptr_field_0.i (no preprocessing)
+/* Generated by Frama-C */
+struct S {
+   int x ;
+};
+enum aorai_ListOper {
+    op_main = 0
+};
+enum aorai_OpStatusList {
+    aorai_Terminated = 1,
+    aorai_Called = 0
+};
+/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */
+/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; */
+/*@ ghost int S0 = 1; */
+/*@ ghost int S1 = 0; */
+/*@ ghost
+  /@ requires 1 ≡ S0 ∧ 0 ≡ S1;
+     requires 1 ≡ S0 ⇒ s->x < 0 ∨ s->x ≥ 0;
+     ensures aorai_CurOpStatus ≡ aorai_Called;
+     ensures aorai_CurOperation ≡ op_main;
+     assigns aorai_CurOpStatus, aorai_CurOperation, S0, S1;
+     
+     behavior buch_state_S0_out:
+       ensures 0 ≡ S0;
+     
+     behavior buch_state_S1_in:
+       assumes 1 ≡ S0 ∧ (s->x < 0 ∨ s->x ≥ 0);
+       ensures 1 ≡ S1;
+     
+     behavior buch_state_S1_out:
+       assumes 0 ≡ S0 ∨ (¬(s->x < 0) ∧ ¬(s->x ≥ 0));
+       ensures 0 ≡ S1;
+   @/
+  void main_pre_func(struct S *s)
+  {
+    int S0_tmp;
+    int S1_tmp;
+    aorai_CurOpStatus = aorai_Called;
+    aorai_CurOperation = op_main;
+    S0_tmp = S0;
+    S1_tmp = S1;
+    if (S0 == 1 && s->x >= 0 || S0 == 1 && s->x < 0) S1_tmp = 1;
+    else S1_tmp = 0;
+    S0_tmp = 0;
+    S0 = S0_tmp;
+    S1 = S1_tmp;
+    return;
+  }
+
+*/
+
+/*@ ghost
+  /@ requires 1 ≡ S1 ∧ 0 ≡ S0;
+     ensures aorai_CurOpStatus ≡ aorai_Terminated;
+     ensures aorai_CurOperation ≡ op_main;
+     assigns aorai_CurOpStatus, aorai_CurOperation, S0, S1;
+     
+     behavior buch_state_S0_out:
+       ensures 0 ≡ S0;
+     
+     behavior buch_state_S1_in:
+       assumes 1 ≡ S1;
+       ensures 1 ≡ S1;
+     
+     behavior buch_state_S1_out:
+       assumes 0 ≡ S1;
+       ensures 0 ≡ S1;
+   @/
+  void main_post_func(void)
+  {
+    int S0_tmp;
+    int S1_tmp;
+    aorai_CurOpStatus = aorai_Terminated;
+    aorai_CurOperation = op_main;
+    S0_tmp = S0;
+    S1_tmp = S1;
+    if (S1 == 1) S1_tmp = 1; else S1_tmp = 0;
+    S0_tmp = 0;
+    S0 = S0_tmp;
+    S1 = S1_tmp;
+    return;
+  }
+
+*/
+
+/*@ requires 1 ≡ S0 ∧ 0 ≡ S1;
+    requires 1 ≡ S0 ⇒ s->x < 0 ∨ s->x ≥ 0;
+    
+    behavior Buchi_property_behavior:
+      ensures 0 ≡ S0;
+      ensures 1 ≡ S1;
+ */
+void main(struct S *s)
+{
+  /*@ ghost main_pre_func(s); */
+  /*@ ghost main_post_func(); */
+  return;
+}
+
+
diff --git a/src/plugins/aorai/tests/ya/oracle/assigns.1.res.oracle b/src/plugins/aorai/tests/ya/oracle/assigns.1.res.oracle
index 7b3833fb8c530be00f93100df610e7986540081f..fd7526444df55abd2c128af76809b32c0a411955 100644
--- a/src/plugins/aorai/tests/ya/oracle/assigns.1.res.oracle
+++ b/src/plugins/aorai/tests/ya/oracle/assigns.1.res.oracle
@@ -60,12 +60,9 @@ int X;
    @/
   void f_pre_func(void)
   {
-    int aorai_CurStates_tmp;
     aorai_CurOpStatus = aorai_Called;
     aorai_CurOperation = op_f;
-    aorai_CurStates_tmp = aorai_CurStates;
-    if (3 == aorai_CurStates) aorai_CurStates_tmp = S_in_f;
-    aorai_CurStates = aorai_CurStates_tmp;
+    if (3 == aorai_CurStates) aorai_CurStates = S_in_f;
     return;
   }
 
@@ -99,12 +96,9 @@ int X;
    @/
   void f_post_func(void)
   {
-    int aorai_CurStates_tmp;
     aorai_CurOpStatus = aorai_Terminated;
     aorai_CurOperation = op_f;
-    aorai_CurStates_tmp = aorai_CurStates;
-    if (2 == aorai_CurStates) aorai_CurStates_tmp = in_main;
-    aorai_CurStates = aorai_CurStates_tmp;
+    if (2 == aorai_CurStates) aorai_CurStates = in_main;
     return;
   }
 
@@ -151,12 +145,9 @@ void f(void)
    @/
   void main_pre_func(void)
   {
-    int aorai_CurStates_tmp;
     aorai_CurOpStatus = aorai_Called;
     aorai_CurOperation = op_main;
-    aorai_CurStates_tmp = aorai_CurStates;
-    if (0 == aorai_CurStates) aorai_CurStates_tmp = Sf;
-    aorai_CurStates = aorai_CurStates_tmp;
+    if (0 == aorai_CurStates) aorai_CurStates = Sf;
     return;
   }
 
@@ -190,12 +181,9 @@ void f(void)
    @/
   void main_post_func(int res)
   {
-    int aorai_CurStates_tmp;
     aorai_CurOpStatus = aorai_Terminated;
     aorai_CurOperation = op_main;
-    aorai_CurStates_tmp = aorai_CurStates;
-    if (4 == aorai_CurStates) aorai_CurStates_tmp = S2;
-    aorai_CurStates = aorai_CurStates_tmp;
+    if (4 == aorai_CurStates) aorai_CurStates = S2;
     return;
   }
 
diff --git a/src/plugins/aorai/tests/ya/oracle/declared_function.res.oracle b/src/plugins/aorai/tests/ya/oracle/declared_function.res.oracle
index ab55916b9af828248a4309cdc6424442f8027441..7141a6e19585342e2f1f9571efaa71e68c2ba704 100644
--- a/src/plugins/aorai/tests/ya/oracle/declared_function.res.oracle
+++ b/src/plugins/aorai/tests/ya/oracle/declared_function.res.oracle
@@ -61,12 +61,9 @@ check lemma I_deterministic_trans{L}:
    @/
   void main_pre_func(void)
   {
-    int aorai_CurStates_tmp;
     aorai_CurOpStatus = aorai_Called;
     aorai_CurOperation = op_main;
-    aorai_CurStates_tmp = aorai_CurStates;
-    if (0 == aorai_CurStates) aorai_CurStates_tmp = I;
-    aorai_CurStates = aorai_CurStates_tmp;
+    if (0 == aorai_CurStates) aorai_CurStates = I;
     return;
   }
 
@@ -88,12 +85,9 @@ check lemma I_deterministic_trans{L}:
    @/
   void main_post_func(void)
   {
-    int aorai_CurStates_tmp;
     aorai_CurOpStatus = aorai_Terminated;
     aorai_CurOperation = op_main;
-    aorai_CurStates_tmp = aorai_CurStates;
-    if (0 == aorai_CurStates) aorai_CurStates_tmp = I;
-    aorai_CurStates = aorai_CurStates_tmp;
+    if (0 == aorai_CurStates) aorai_CurStates = I;
     return;
   }
 
diff --git a/src/plugins/aorai/tests/ya/oracle/deterministic.res.oracle b/src/plugins/aorai/tests/ya/oracle/deterministic.res.oracle
index 5a30e59e7d5e51dd0849a5f48c908fbe5493e073..6b9c9095bc9917c070ddd1dbf2ec9d73de8d75c4 100644
--- a/src/plugins/aorai/tests/ya/oracle/deterministic.res.oracle
+++ b/src/plugins/aorai/tests/ya/oracle/deterministic.res.oracle
@@ -105,15 +105,11 @@ check lemma S0_deterministic_trans{L}:
    @/
   void g_pre_func(int x)
   {
-    int aorai_CurStates_tmp;
     aorai_CurOpStatus = aorai_Called;
     aorai_CurOperation = op_g;
-    aorai_CurStates_tmp = aorai_CurStates;
-    if (3 == aorai_CurStates) 
-      if (x == 5) aorai_CurStates_tmp = S5;
-    if (3 == aorai_CurStates) 
-      if (x == 4) aorai_CurStates_tmp = S4;
-    aorai_CurStates = aorai_CurStates_tmp;
+    if (3 == aorai_CurStates && x == 4) aorai_CurStates = S4;
+    else 
+      if (3 == aorai_CurStates && x == 5) aorai_CurStates = S5;
     return;
   }
 
@@ -161,13 +157,11 @@ check lemma S0_deterministic_trans{L}:
    @/
   void g_post_func(void)
   {
-    int aorai_CurStates_tmp;
     aorai_CurOpStatus = aorai_Terminated;
     aorai_CurOperation = op_g;
-    aorai_CurStates_tmp = aorai_CurStates;
-    if (4 == aorai_CurStates) aorai_CurStates_tmp = S3;
-    if (5 == aorai_CurStates) aorai_CurStates_tmp = S1;
-    aorai_CurStates = aorai_CurStates_tmp;
+    if (5 == aorai_CurStates) aorai_CurStates = S1;
+    else 
+      if (4 == aorai_CurStates) aorai_CurStates = S3;
     return;
   }
 
@@ -230,13 +224,9 @@ void g(int x)
    @/
   void f_pre_func(int x)
   {
-    int aorai_CurStates_tmp;
     aorai_CurOpStatus = aorai_Called;
     aorai_CurOperation = op_f;
-    aorai_CurStates_tmp = aorai_CurStates;
-    if (1 == aorai_CurStates) 
-      if (x == 4) aorai_CurStates_tmp = S3;
-    aorai_CurStates = aorai_CurStates_tmp;
+    if (1 == aorai_CurStates && x == 4) aorai_CurStates = S3;
     return;
   }
 
@@ -280,14 +270,9 @@ void g(int x)
    @/
   void f_post_func(int res)
   {
-    int aorai_CurStates_tmp;
     aorai_CurOpStatus = aorai_Terminated;
     aorai_CurOperation = op_f;
-    aorai_CurStates_tmp = aorai_CurStates;
-    if (1 == aorai_CurStates) 
-      if (res == 0) 
-        if (X == 5) aorai_CurStates_tmp = S2;
-    aorai_CurStates = aorai_CurStates_tmp;
+    if (1 == aorai_CurStates && (res == 0 && X == 5)) aorai_CurStates = S2;
     return;
   }
 
@@ -356,15 +341,11 @@ int f(int x)
    @/
   void real_main_pre_func(int c)
   {
-    int aorai_CurStates_tmp;
     aorai_CurOpStatus = aorai_Called;
     aorai_CurOperation = op_real_main;
-    aorai_CurStates_tmp = aorai_CurStates;
-    if (0 == aorai_CurStates) 
-      if (c == 0) aorai_CurStates_tmp = S2;
-    if (0 == aorai_CurStates) 
-      if (c != 0) aorai_CurStates_tmp = S1;
-    aorai_CurStates = aorai_CurStates_tmp;
+    if (0 == aorai_CurStates && c != 0) aorai_CurStates = S1;
+    else 
+      if (0 == aorai_CurStates && c == 0) aorai_CurStates = S2;
     return;
   }
 
@@ -407,12 +388,9 @@ int f(int x)
    @/
   void real_main_post_func(int res)
   {
-    int aorai_CurStates_tmp;
     aorai_CurOpStatus = aorai_Terminated;
     aorai_CurOperation = op_real_main;
-    aorai_CurStates_tmp = aorai_CurStates;
-    if (2 == aorai_CurStates) aorai_CurStates_tmp = Sf;
-    aorai_CurStates = aorai_CurStates_tmp;
+    if (2 == aorai_CurStates) aorai_CurStates = Sf;
     return;
   }
 
@@ -471,12 +449,9 @@ int real_main(int c)
    @/
   void main_pre_func(int c)
   {
-    int aorai_CurStates_tmp;
     aorai_CurOpStatus = aorai_Called;
     aorai_CurOperation = op_main;
-    aorai_CurStates_tmp = aorai_CurStates;
-    if (7 == aorai_CurStates) aorai_CurStates_tmp = S0;
-    aorai_CurStates = aorai_CurStates_tmp;
+    if (7 == aorai_CurStates) aorai_CurStates = S0;
     return;
   }
 
@@ -519,12 +494,9 @@ int real_main(int c)
    @/
   void main_post_func(int res)
   {
-    int aorai_CurStates_tmp;
     aorai_CurOpStatus = aorai_Terminated;
     aorai_CurOperation = op_main;
-    aorai_CurStates_tmp = aorai_CurStates;
-    if (6 == aorai_CurStates) aorai_CurStates_tmp = Sf;
-    aorai_CurStates = aorai_CurStates_tmp;
+    if (6 == aorai_CurStates) aorai_CurStates = Sf;
     return;
   }
 
diff --git a/src/plugins/aorai/tests/ya/oracle/formals.res.oracle b/src/plugins/aorai/tests/ya/oracle/formals.res.oracle
index 3fa9613a782d0cd189af5fb61fae70e89db84d9f..52323f131b74b603bc960c19408f6ea80930453f 100644
--- a/src/plugins/aorai/tests/ya/oracle/formals.res.oracle
+++ b/src/plugins/aorai/tests/ya/oracle/formals.res.oracle
@@ -95,7 +95,6 @@ check lemma aorai_intermediate_state_deterministic_trans{L}:
      behavior buch_state_aorai_intermediate_state_out:
        assumes aorai_CurStates ≢ main_0 ∨ ¬(x ≡ 1);
        ensures aorai_CurStates ≢ aorai_intermediate_state;
-       ensures aorai_x ≡ \old(aorai_x);
      
      behavior buch_state_aorai_intermediate_state_0_out:
        ensures aorai_CurStates ≢ aorai_intermediate_state_0;
@@ -111,7 +110,6 @@ check lemma aorai_intermediate_state_deterministic_trans{L}:
      behavior buch_state_aorai_intermediate_state_2_out:
        assumes aorai_CurStates ≢ main_0 ∨ ¬(x ≡ 3);
        ensures aorai_CurStates ≢ aorai_intermediate_state_2;
-       ensures aorai_x_0 ≡ \old(aorai_x_0);
      
      behavior buch_state_aorai_reject_out:
        ensures aorai_CurStates ≢ aorai_reject;
@@ -121,24 +119,28 @@ check lemma aorai_intermediate_state_deterministic_trans{L}:
      
      behavior buch_state_main_0_out:
        ensures aorai_CurStates ≢ main_0;
+     
+     behavior aorai_x_0_unchanged:
+       assumes aorai_CurStates ≢ main_0 ∨ ¬(x ≡ 3);
+       ensures aorai_x_0 ≡ \old(aorai_x_0);
+     
+     behavior aorai_x_unchanged:
+       assumes aorai_CurStates ≢ main_0 ∨ ¬(x ≡ 1);
+       ensures aorai_x ≡ \old(aorai_x);
    @/
   void f_pre_func(int x)
   {
-    int aorai_CurStates_tmp;
     aorai_CurOpStatus = aorai_Called;
     aorai_CurOperation = op_f;
-    aorai_CurStates_tmp = aorai_CurStates;
-    if (7 == aorai_CurStates) 
-      if (x == 3) {
-        aorai_CurStates_tmp = aorai_intermediate_state_2;
+    if (7 == aorai_CurStates && x == 1) {
+      aorai_CurStates = aorai_intermediate_state;
+      aorai_x = x;
+    }
+    else 
+      if (7 == aorai_CurStates && x == 3) {
+        aorai_CurStates = aorai_intermediate_state_2;
         aorai_x_0 = x;
       }
-    if (7 == aorai_CurStates) 
-      if (x == 1) {
-        aorai_CurStates_tmp = aorai_intermediate_state;
-        aorai_x = x;
-      }
-    aorai_CurStates = aorai_CurStates_tmp;
     return;
   }
 
@@ -209,24 +211,15 @@ check lemma aorai_intermediate_state_deterministic_trans{L}:
    @/
   void f_post_func(int res)
   {
-    int aorai_CurStates_tmp;
     aorai_CurOpStatus = aorai_Terminated;
     aorai_CurOperation = op_f;
-    aorai_CurStates_tmp = aorai_CurStates;
-    if (4 == aorai_CurStates) {
-      if (aorai_x_0 != 3) aorai_CurStates_tmp = aorai_reject;
-      else goto _LAND;
-    }
-    else {
-      _LAND: ;
-      if (1 == aorai_CurStates) 
-        if (aorai_x != 1) aorai_CurStates_tmp = aorai_reject;
-    }
-    if (1 == aorai_CurStates) 
-      if (aorai_x == 1) aorai_CurStates_tmp = aorai_intermediate_state_0;
-    if (4 == aorai_CurStates) 
-      if (aorai_x_0 == 3) aorai_CurStates_tmp = OK;
-    aorai_CurStates = aorai_CurStates_tmp;
+    if (4 == aorai_CurStates && aorai_x_0 == 3) aorai_CurStates = OK;
+    else 
+      if (1 == aorai_CurStates && aorai_x == 1) aorai_CurStates = aorai_intermediate_state_0;
+      else 
+        if (4 == aorai_CurStates && aorai_x_0 != 3) aorai_CurStates = aorai_reject;
+        else 
+          if (1 == aorai_CurStates && aorai_x != 1) aorai_CurStates = aorai_reject;
     return;
   }
 
@@ -326,7 +319,6 @@ int f(int x)
      behavior buch_state_aorai_intermediate_state_1_out:
        assumes aorai_CurStates ≢ aorai_intermediate_state_0;
        ensures aorai_CurStates ≢ aorai_intermediate_state_1;
-       ensures aorai_y ≡ \old(aorai_y);
      
      behavior buch_state_aorai_intermediate_state_2_out:
        ensures aorai_CurStates ≢ aorai_intermediate_state_2;
@@ -344,20 +336,23 @@ int f(int x)
      
      behavior buch_state_main_0_out:
        ensures aorai_CurStates ≢ main_0;
+     
+     behavior aorai_y_unchanged:
+       assumes aorai_CurStates ≢ aorai_intermediate_state_0;
+       ensures aorai_y ≡ \old(aorai_y);
    @/
   void g_pre_func(int y)
   {
-    int aorai_CurStates_tmp;
     aorai_CurOpStatus = aorai_Called;
     aorai_CurOperation = op_g;
-    aorai_CurStates_tmp = aorai_CurStates;
-    if (5 == aorai_CurStates) aorai_CurStates_tmp = aorai_reject;
-    if (2 == aorai_CurStates) {
-      aorai_CurStates_tmp = aorai_intermediate_state_1;
-      aorai_y = y;
-    }
-    if (0 == aorai_CurStates) aorai_CurStates_tmp = OK;
-    aorai_CurStates = aorai_CurStates_tmp;
+    if (0 == aorai_CurStates) aorai_CurStates = OK;
+    else 
+      if (2 == aorai_CurStates) {
+        aorai_CurStates = aorai_intermediate_state_1;
+        aorai_y = y;
+      }
+      else 
+        if (5 == aorai_CurStates) aorai_CurStates = aorai_reject;
     return;
   }
 
@@ -420,22 +415,15 @@ int f(int x)
    @/
   void g_post_func(int res)
   {
-    int aorai_CurStates_tmp;
     aorai_CurOpStatus = aorai_Terminated;
     aorai_CurOperation = op_g;
-    aorai_CurStates_tmp = aorai_CurStates;
-    if (5 == aorai_CurStates) aorai_CurStates_tmp = aorai_reject;
+    if (3 == aorai_CurStates && aorai_y == 2) aorai_CurStates = OK;
     else 
-      if (3 == aorai_CurStates) 
-        if (aorai_y != 2) aorai_CurStates_tmp = aorai_reject;
-    if (3 == aorai_CurStates) {
-      if (aorai_y == 2) aorai_CurStates_tmp = OK; else goto _LAND;
-    }
-    else {
-      _LAND: ;
-      if (0 == aorai_CurStates) aorai_CurStates_tmp = OK;
-    }
-    aorai_CurStates = aorai_CurStates_tmp;
+      if (0 == aorai_CurStates) aorai_CurStates = OK;
+      else 
+        if (5 == aorai_CurStates) aorai_CurStates = aorai_reject;
+        else 
+          if (3 == aorai_CurStates && aorai_y != 2) aorai_CurStates = aorai_reject;
     return;
   }
 
@@ -514,12 +502,9 @@ int g(int y)
    @/
   void main_pre_func(void)
   {
-    int aorai_CurStates_tmp;
     aorai_CurOpStatus = aorai_Called;
     aorai_CurOperation = op_main;
-    aorai_CurStates_tmp = aorai_CurStates;
-    if (6 == aorai_CurStates) aorai_CurStates_tmp = main_0;
-    aorai_CurStates = aorai_CurStates_tmp;
+    if (6 == aorai_CurStates) aorai_CurStates = main_0;
     return;
   }
 
@@ -567,13 +552,11 @@ int g(int y)
    @/
   void main_post_func(int res)
   {
-    int aorai_CurStates_tmp;
     aorai_CurOpStatus = aorai_Terminated;
     aorai_CurOperation = op_main;
-    aorai_CurStates_tmp = aorai_CurStates;
-    if (5 == aorai_CurStates) aorai_CurStates_tmp = aorai_reject;
-    if (0 == aorai_CurStates) aorai_CurStates_tmp = OK;
-    aorai_CurStates = aorai_CurStates_tmp;
+    if (0 == aorai_CurStates) aorai_CurStates = OK;
+    else 
+      if (5 == aorai_CurStates) aorai_CurStates = aorai_reject;
     return;
   }
 
diff --git a/src/plugins/aorai/tests/ya/oracle/hoare_seq.res.oracle b/src/plugins/aorai/tests/ya/oracle/hoare_seq.res.oracle
index ebd409ed392d15619f4c8d0f79e744425eb21ad0..ea603b7e865bbc3a1982b4512166a5ed8cf48eb7 100644
--- a/src/plugins/aorai/tests/ya/oracle/hoare_seq.res.oracle
+++ b/src/plugins/aorai/tests/ya/oracle/hoare_seq.res.oracle
@@ -315,14 +315,10 @@ int main_bhv_bhv(int c); */
     aorai_reject_tmp = 0;
     aorai_intermediate_state_2_tmp = 0;
     aorai_intermediate_state_1_tmp = 0;
-    if (S0 == 1) 
-      if (c <= 0) aorai_intermediate_state_0_tmp = 1;
-      else aorai_intermediate_state_0_tmp = 0;
+    if (S0 == 1 && c <= 0) aorai_intermediate_state_0_tmp = 1;
     else aorai_intermediate_state_0_tmp = 0;
     bhv_aux = main_bhv_bhv(c);
-    if (S0 == 1) 
-      if (bhv_aux) aorai_intermediate_state_tmp = 1;
-      else aorai_intermediate_state_tmp = 0;
+    if (S0 == 1 && bhv_aux) aorai_intermediate_state_tmp = 1;
     else aorai_intermediate_state_tmp = 0;
     Sf_tmp = 0;
     S0_tmp = 0;
@@ -410,25 +406,17 @@ int main_bhv_bhv(int c); */
     aorai_intermediate_state_1_tmp = aorai_intermediate_state_1;
     aorai_intermediate_state_2_tmp = aorai_intermediate_state_2;
     aorai_reject_tmp = aorai_reject;
-    if (aorai_intermediate_state_0 == 1) aorai_reject_tmp = 1;
-    else 
-      if (aorai_intermediate_state_2 == 1) {
-        if (res != 0) aorai_reject_tmp = 1; else goto _LAND;
-      }
-      else {
-        _LAND: ;
-        if (aorai_reject == 1) aorai_reject_tmp = 1;
-        else aorai_reject_tmp = 0;
-      }
+    if ((aorai_intermediate_state_0 == 1 || aorai_intermediate_state_2 == 1 && 
+                                            res != 0) || aorai_reject == 1) 
+      aorai_reject_tmp = 1;
+    else aorai_reject_tmp = 0;
     aorai_intermediate_state_2_tmp = 0;
     aorai_intermediate_state_1_tmp = 0;
     aorai_intermediate_state_0_tmp = 0;
     aorai_intermediate_state_tmp = 0;
-    if (aorai_intermediate_state == 1) Sf_tmp = 1;
-    else 
-      if (aorai_intermediate_state_2 == 1) 
-        if (res == 0) Sf_tmp = 1; else Sf_tmp = 0;
-      else Sf_tmp = 0;
+    if (aorai_intermediate_state == 1 || aorai_intermediate_state_2 == 1 && 
+                                         res == 0) Sf_tmp = 1;
+    else Sf_tmp = 0;
     S0_tmp = 0;
     S0 = S0_tmp;
     Sf = Sf_tmp;
diff --git a/src/plugins/aorai/tests/ya/oracle/incorrect.res.oracle b/src/plugins/aorai/tests/ya/oracle/incorrect.res.oracle
index 3913f00e2f485fad13453eb892e7fcc28f412f75..ccfb249eba5eb4f3b759bba09f44a869117caa21 100644
--- a/src/plugins/aorai/tests/ya/oracle/incorrect.res.oracle
+++ b/src/plugins/aorai/tests/ya/oracle/incorrect.res.oracle
@@ -33,11 +33,8 @@ int f(void);
    @/
   void main_pre_func(void)
   {
-    int aorai_CurStates_tmp;
     aorai_CurOpStatus = aorai_Called;
     aorai_CurOperation = op_main;
-    aorai_CurStates_tmp = aorai_CurStates;
-    aorai_CurStates = aorai_CurStates_tmp;
     return;
   }
 
@@ -54,11 +51,8 @@ int f(void);
    @/
   void main_post_func(int res)
   {
-    int aorai_CurStates_tmp;
     aorai_CurOpStatus = aorai_Terminated;
     aorai_CurOperation = op_main;
-    aorai_CurStates_tmp = aorai_CurStates;
-    aorai_CurStates = aorai_CurStates_tmp;
     return;
   }
 
diff --git a/src/plugins/aorai/tests/ya/oracle/loop_bts1050.res.oracle b/src/plugins/aorai/tests/ya/oracle/loop_bts1050.res.oracle
index 04b434bbf6da11f31a874aaceca1c219eb90348e..ccc98a41d83d4339cb70a182bed8396973f9d901 100644
--- a/src/plugins/aorai/tests/ya/oracle/loop_bts1050.res.oracle
+++ b/src/plugins/aorai/tests/ya/oracle/loop_bts1050.res.oracle
@@ -63,13 +63,17 @@ enum aorai_OpStatusList {
          (0 ≡ aorai_intermediate_state_0 ∨ ¬(aorai_counter < 5)) ∧
          0 ≡ aorai_intermediate_state;
        ensures 0 ≡ aorai_intermediate_state_1;
-       ensures aorai_counter ≡ \old(aorai_counter);
      
      behavior buch_state_aorai_intermediate_state_2_out:
        ensures 0 ≡ aorai_intermediate_state_2;
      
      behavior buch_state_aorai_intermediate_state_3_out:
        ensures 0 ≡ aorai_intermediate_state_3;
+     
+     behavior aorai_counter_unchanged:
+       assumes 0 ≡ aorai_intermediate_state;
+       assumes 0 ≡ aorai_intermediate_state_0 ∨ ¬(aorai_counter < 5);
+       ensures aorai_counter ≡ \old(aorai_counter);
    @/
   void f_pre_func(void)
   {
@@ -91,14 +95,10 @@ enum aorai_OpStatusList {
     aorai_intermediate_state_3_tmp = aorai_intermediate_state_3;
     aorai_intermediate_state_3_tmp = 0;
     aorai_intermediate_state_2_tmp = 0;
-    if (aorai_intermediate_state == 1) aorai_intermediate_state_1_tmp = 1;
-    else 
-      if (aorai_intermediate_state_0 == 1) 
-        if (aorai_counter < 5) aorai_intermediate_state_1_tmp = 1;
-        else aorai_intermediate_state_1_tmp = 0;
-      else aorai_intermediate_state_1_tmp = 0;
-    if (aorai_intermediate_state_0 == 1) 
-      if (aorai_counter < 5) aorai_counter ++;
+    if (aorai_intermediate_state == 1 || aorai_intermediate_state_0 == 1 && 
+                                         aorai_counter < 5) aorai_intermediate_state_1_tmp = 1;
+    else aorai_intermediate_state_1_tmp = 0;
+    if (aorai_intermediate_state_0 == 1 && aorai_counter < 5) aorai_counter ++;
     if (aorai_intermediate_state == 1) aorai_counter = 1;
     aorai_intermediate_state_0_tmp = 0;
     aorai_intermediate_state_tmp = 0;
@@ -539,9 +539,9 @@ void g(void)
     aorai_intermediate_state_1_tmp = 0;
     aorai_intermediate_state_0_tmp = 0;
     aorai_intermediate_state_tmp = 0;
-    if (aorai_intermediate_state == 1) Sf_tmp = 1;
-    else 
-      if (aorai_intermediate_state_0 == 1) Sf_tmp = 1; else Sf_tmp = 0;
+    if (aorai_intermediate_state == 1 || aorai_intermediate_state_0 == 1) 
+      Sf_tmp = 1;
+    else Sf_tmp = 0;
     S0_tmp = 0;
     S0 = S0_tmp;
     Sf = Sf_tmp;
diff --git a/src/plugins/aorai/tests/ya/oracle/metavariables-incompatible.res.oracle b/src/plugins/aorai/tests/ya/oracle/metavariables-incompatible.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..57c2d7eed1ca61046277d1cbf5d005a9fde10a52
--- /dev/null
+++ b/src/plugins/aorai/tests/ya/oracle/metavariables-incompatible.res.oracle
@@ -0,0 +1,4 @@
+[kernel] Parsing tests/ya/metavariables-incompatible.i (no preprocessing)
+[aorai] Welcome to the Aorai plugin
+[aorai] User Error: The use of metavariables is incompatible with non-deterministic automata, such as automa using extended transitions.
+[kernel] Plug-in aorai aborted: invalid user input.
diff --git a/src/plugins/aorai/tests/ya/oracle/metavariables-right.res.oracle b/src/plugins/aorai/tests/ya/oracle/metavariables-right.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..39843d1a28ef389cbcc34ab6095bff3f80d0ec8a
--- /dev/null
+++ b/src/plugins/aorai/tests/ya/oracle/metavariables-right.res.oracle
@@ -0,0 +1,684 @@
+[kernel] Parsing tests/ya/metavariables-right.i (no preprocessing)
+[aorai] Welcome to the Aorai plugin
+[kernel] Parsing TMPDIR/aorai_metavariables-right_0.i (no preprocessing)
+/* Generated by Frama-C */
+enum aorai_States {
+    aorai_reject_state = -2,
+    a = 0,
+    b = 1,
+    c = 2,
+    d = 3,
+    e = 4,
+    f_0 = 5,
+    g_0 = 6,
+    h_0 = 7,
+    i_0 = 8
+};
+enum aorai_ListOper {
+    op_f = 4,
+    op_g = 3,
+    op_h = 2,
+    op_i = 1,
+    op_main = 0
+};
+enum aorai_OpStatusList {
+    aorai_Terminated = 1,
+    aorai_Called = 0
+};
+/*@ check lemma i_0_deterministic_trans{L}: \true;
+ */
+/*@ check lemma h_0_deterministic_trans{L}: \true;
+ */
+/*@ check lemma g_0_deterministic_trans{L}: \true;
+ */
+/*@ check lemma f_0_deterministic_trans{L}: \true;
+ */
+/*@ check lemma d_deterministic_trans{L}: \true;
+ */
+/*@ check lemma c_deterministic_trans{L}: \true;
+ */
+/*@ check lemma a_deterministic_trans{L}: \true;
+ */
+/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */
+/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; */
+/*@
+check lemma b_deterministic_trans{L}:
+  ¬(\at(aorai_CurOperation,L) ≡ op_g ∧
+     \at(aorai_CurOpStatus,L) ≡ aorai_Called ∧
+     \at(aorai_CurOperation,L) ≡ op_f ∧
+     \at(aorai_CurOpStatus,L) ≡ aorai_Called);
+ */
+/*@ ghost int aorai_CurStates = a; */
+/*@ ghost int aorai_x = 0; */
+/*@
+check lemma e_deterministic_trans{L}:
+  ¬(\at(aorai_CurOperation,L) ≡ op_main ∧
+     \at(aorai_CurOpStatus,L) ≡ aorai_Terminated ∧
+     \at(aorai_CurOperation,L) ≡ op_h ∧
+     \at(aorai_CurOpStatus,L) ≡ aorai_Called ∧ \at(aorai_x,L) > 0);
+ */
+/*@ ghost int aorai_y = 0; */
+/*@ ghost
+  /@ requires aorai_CurStates ≡ b;
+     ensures aorai_CurOpStatus ≡ aorai_Called;
+     ensures aorai_CurOperation ≡ op_f;
+     assigns aorai_x, aorai_y, aorai_CurOpStatus, aorai_CurOperation,
+             aorai_CurStates;
+     
+     behavior buch_state_a_out:
+       ensures aorai_CurStates ≢ a;
+     
+     behavior buch_state_b_out:
+       ensures aorai_CurStates ≢ b;
+     
+     behavior buch_state_c_in_0:
+       assumes aorai_CurStates ≡ b;
+       ensures aorai_CurStates ≡ c;
+       ensures aorai_x ≡ \old(x);
+       ensures aorai_y ≡ aorai_x;
+     
+     behavior buch_state_c_out:
+       assumes aorai_CurStates ≢ b;
+       ensures aorai_CurStates ≢ c;
+     
+     behavior buch_state_d_out:
+       ensures aorai_CurStates ≢ d;
+     
+     behavior buch_state_e_out:
+       ensures aorai_CurStates ≢ e;
+     
+     behavior buch_state_f_0_out:
+       ensures aorai_CurStates ≢ f_0;
+     
+     behavior buch_state_g_0_out:
+       ensures aorai_CurStates ≢ g_0;
+     
+     behavior buch_state_h_0_out:
+       ensures aorai_CurStates ≢ h_0;
+     
+     behavior buch_state_i_0_out:
+       ensures aorai_CurStates ≢ i_0;
+     
+     behavior aorai_y_unchanged:
+       assumes aorai_CurStates ≢ b;
+       ensures aorai_y ≡ \old(aorai_y);
+     
+     behavior aorai_x_unchanged:
+       assumes aorai_CurStates ≢ b;
+       ensures aorai_x ≡ \old(aorai_x);
+   @/
+  void f_pre_func(int x)
+  {
+    aorai_CurOpStatus = aorai_Called;
+    aorai_CurOperation = op_f;
+    if (1 == aorai_CurStates) {
+      aorai_CurStates = c;
+      aorai_x = x;
+      aorai_y = aorai_x;
+    }
+    return;
+  }
+
+*/
+
+/*@ ghost
+  /@ requires aorai_CurStates ≡ c;
+     ensures aorai_CurOpStatus ≡ aorai_Terminated;
+     ensures aorai_CurOperation ≡ op_f;
+     assigns aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates;
+     
+     behavior buch_state_a_out:
+       ensures aorai_CurStates ≢ a;
+     
+     behavior buch_state_b_out:
+       ensures aorai_CurStates ≢ b;
+     
+     behavior buch_state_c_out:
+       ensures aorai_CurStates ≢ c;
+     
+     behavior buch_state_d_out:
+       ensures aorai_CurStates ≢ d;
+     
+     behavior buch_state_e_in:
+       assumes aorai_CurStates ≡ c;
+       ensures aorai_CurStates ≡ e;
+     
+     behavior buch_state_e_out:
+       assumes aorai_CurStates ≢ c;
+       ensures aorai_CurStates ≢ e;
+     
+     behavior buch_state_f_0_out:
+       ensures aorai_CurStates ≢ f_0;
+     
+     behavior buch_state_g_0_out:
+       ensures aorai_CurStates ≢ g_0;
+     
+     behavior buch_state_h_0_out:
+       ensures aorai_CurStates ≢ h_0;
+     
+     behavior buch_state_i_0_out:
+       ensures aorai_CurStates ≢ i_0;
+   @/
+  void f_post_func(void)
+  {
+    aorai_CurOpStatus = aorai_Terminated;
+    aorai_CurOperation = op_f;
+    if (2 == aorai_CurStates) aorai_CurStates = e;
+    return;
+  }
+
+*/
+
+/*@ requires aorai_CurStates ≡ b;
+    
+    behavior Buchi_property_behavior:
+      ensures aorai_CurStates ≡ e;
+      ensures
+        \at(aorai_CurStates ≡ b,Pre) ∧ aorai_CurStates ≡ e ⇒
+        aorai_y ≡ \at(aorai_x,Pre) + 0;
+      ensures
+        \at(aorai_CurStates ≡ b,Pre) ∧ aorai_CurStates ≡ e ⇒
+        aorai_x ≡ \at(x,Pre) + 0;
+ */
+void f(int x)
+{
+  /*@ ghost f_pre_func(x); */
+  /*@ ghost f_post_func(); */
+  return;
+}
+
+/*@ ghost
+  /@ requires aorai_CurStates ≡ b;
+     ensures aorai_CurOpStatus ≡ aorai_Called;
+     ensures aorai_CurOperation ≡ op_g;
+     assigns aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates;
+     
+     behavior buch_state_a_out:
+       ensures aorai_CurStates ≢ a;
+     
+     behavior buch_state_b_out:
+       ensures aorai_CurStates ≢ b;
+     
+     behavior buch_state_c_out:
+       ensures aorai_CurStates ≢ c;
+     
+     behavior buch_state_d_in:
+       assumes aorai_CurStates ≡ b;
+       ensures aorai_CurStates ≡ d;
+     
+     behavior buch_state_d_out:
+       assumes aorai_CurStates ≢ b;
+       ensures aorai_CurStates ≢ d;
+     
+     behavior buch_state_e_out:
+       ensures aorai_CurStates ≢ e;
+     
+     behavior buch_state_f_0_out:
+       ensures aorai_CurStates ≢ f_0;
+     
+     behavior buch_state_g_0_out:
+       ensures aorai_CurStates ≢ g_0;
+     
+     behavior buch_state_h_0_out:
+       ensures aorai_CurStates ≢ h_0;
+     
+     behavior buch_state_i_0_out:
+       ensures aorai_CurStates ≢ i_0;
+   @/
+  void g_pre_func(void)
+  {
+    aorai_CurOpStatus = aorai_Called;
+    aorai_CurOperation = op_g;
+    if (1 == aorai_CurStates) aorai_CurStates = d;
+    return;
+  }
+
+*/
+
+/*@ ghost
+  /@ requires aorai_CurStates ≡ d;
+     ensures aorai_CurOpStatus ≡ aorai_Terminated;
+     ensures aorai_CurOperation ≡ op_g;
+     assigns aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates;
+     
+     behavior buch_state_a_out:
+       ensures aorai_CurStates ≢ a;
+     
+     behavior buch_state_b_out:
+       ensures aorai_CurStates ≢ b;
+     
+     behavior buch_state_c_out:
+       ensures aorai_CurStates ≢ c;
+     
+     behavior buch_state_d_out:
+       ensures aorai_CurStates ≢ d;
+     
+     behavior buch_state_e_out:
+       ensures aorai_CurStates ≢ e;
+     
+     behavior buch_state_f_0_out:
+       ensures aorai_CurStates ≢ f_0;
+     
+     behavior buch_state_g_0_in:
+       assumes aorai_CurStates ≡ d;
+       ensures aorai_CurStates ≡ g_0;
+     
+     behavior buch_state_g_0_out:
+       assumes aorai_CurStates ≢ d;
+       ensures aorai_CurStates ≢ g_0;
+     
+     behavior buch_state_h_0_out:
+       ensures aorai_CurStates ≢ h_0;
+     
+     behavior buch_state_i_0_out:
+       ensures aorai_CurStates ≢ i_0;
+   @/
+  void g_post_func(void)
+  {
+    aorai_CurOpStatus = aorai_Terminated;
+    aorai_CurOperation = op_g;
+    if (3 == aorai_CurStates) aorai_CurStates = g_0;
+    return;
+  }
+
+*/
+
+/*@ requires aorai_CurStates ≡ b;
+    
+    behavior Buchi_property_behavior:
+      ensures aorai_CurStates ≡ g_0;
+ */
+void g(void)
+{
+  /*@ ghost g_pre_func(); */
+  /*@ ghost g_post_func(); */
+  return;
+}
+
+/*@ ghost
+  /@ requires aorai_CurStates ≡ e;
+     requires aorai_CurStates ≡ e ⇒ aorai_x > 0;
+     ensures aorai_CurOpStatus ≡ aorai_Called;
+     ensures aorai_CurOperation ≡ op_h;
+     assigns aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates;
+     
+     behavior buch_state_a_out:
+       ensures aorai_CurStates ≢ a;
+     
+     behavior buch_state_b_out:
+       ensures aorai_CurStates ≢ b;
+     
+     behavior buch_state_c_out:
+       ensures aorai_CurStates ≢ c;
+     
+     behavior buch_state_d_out:
+       ensures aorai_CurStates ≢ d;
+     
+     behavior buch_state_e_out:
+       ensures aorai_CurStates ≢ e;
+     
+     behavior buch_state_f_0_in:
+       assumes aorai_CurStates ≡ e ∧ aorai_x > 0;
+       ensures aorai_CurStates ≡ f_0;
+     
+     behavior buch_state_f_0_out:
+       assumes aorai_CurStates ≢ e ∨ ¬(aorai_x > 0);
+       ensures aorai_CurStates ≢ f_0;
+     
+     behavior buch_state_g_0_out:
+       ensures aorai_CurStates ≢ g_0;
+     
+     behavior buch_state_h_0_out:
+       ensures aorai_CurStates ≢ h_0;
+     
+     behavior buch_state_i_0_out:
+       ensures aorai_CurStates ≢ i_0;
+   @/
+  void h_pre_func(int x)
+  {
+    aorai_CurOpStatus = aorai_Called;
+    aorai_CurOperation = op_h;
+    if (4 == aorai_CurStates && aorai_x > 0) aorai_CurStates = f_0;
+    return;
+  }
+
+*/
+
+/*@ ghost
+  /@ requires aorai_CurStates ≡ f_0;
+     ensures aorai_CurOpStatus ≡ aorai_Terminated;
+     ensures aorai_CurOperation ≡ op_h;
+     assigns aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates;
+     
+     behavior buch_state_a_out:
+       ensures aorai_CurStates ≢ a;
+     
+     behavior buch_state_b_out:
+       ensures aorai_CurStates ≢ b;
+     
+     behavior buch_state_c_out:
+       ensures aorai_CurStates ≢ c;
+     
+     behavior buch_state_d_out:
+       ensures aorai_CurStates ≢ d;
+     
+     behavior buch_state_e_out:
+       ensures aorai_CurStates ≢ e;
+     
+     behavior buch_state_f_0_out:
+       ensures aorai_CurStates ≢ f_0;
+     
+     behavior buch_state_g_0_in:
+       assumes aorai_CurStates ≡ f_0;
+       ensures aorai_CurStates ≡ g_0;
+     
+     behavior buch_state_g_0_out:
+       assumes aorai_CurStates ≢ f_0;
+       ensures aorai_CurStates ≢ g_0;
+     
+     behavior buch_state_h_0_out:
+       ensures aorai_CurStates ≢ h_0;
+     
+     behavior buch_state_i_0_out:
+       ensures aorai_CurStates ≢ i_0;
+   @/
+  void h_post_func(void)
+  {
+    aorai_CurOpStatus = aorai_Terminated;
+    aorai_CurOperation = op_h;
+    if (5 == aorai_CurStates) aorai_CurStates = g_0;
+    return;
+  }
+
+*/
+
+/*@ requires aorai_CurStates ≡ e;
+    requires aorai_CurStates ≡ e ⇒ aorai_x > 0;
+    
+    behavior Buchi_property_behavior:
+      ensures aorai_CurStates ≡ g_0;
+ */
+void h(int x)
+{
+  /*@ ghost h_pre_func(x); */
+  /*@ ghost h_post_func(); */
+  return;
+}
+
+/*@ ghost
+  /@ requires aorai_CurStates ≡ g_0;
+     ensures aorai_CurOpStatus ≡ aorai_Called;
+     ensures aorai_CurOperation ≡ op_i;
+     assigns aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates;
+     
+     behavior buch_state_a_out:
+       ensures aorai_CurStates ≢ a;
+     
+     behavior buch_state_b_out:
+       ensures aorai_CurStates ≢ b;
+     
+     behavior buch_state_c_out:
+       ensures aorai_CurStates ≢ c;
+     
+     behavior buch_state_d_out:
+       ensures aorai_CurStates ≢ d;
+     
+     behavior buch_state_e_out:
+       ensures aorai_CurStates ≢ e;
+     
+     behavior buch_state_f_0_out:
+       ensures aorai_CurStates ≢ f_0;
+     
+     behavior buch_state_g_0_out:
+       ensures aorai_CurStates ≢ g_0;
+     
+     behavior buch_state_h_0_in:
+       assumes aorai_CurStates ≡ g_0;
+       ensures aorai_CurStates ≡ h_0;
+     
+     behavior buch_state_h_0_out:
+       assumes aorai_CurStates ≢ g_0;
+       ensures aorai_CurStates ≢ h_0;
+     
+     behavior buch_state_i_0_out:
+       ensures aorai_CurStates ≢ i_0;
+   @/
+  void i_pre_func(void)
+  {
+    aorai_CurOpStatus = aorai_Called;
+    aorai_CurOperation = op_i;
+    if (6 == aorai_CurStates) aorai_CurStates = h_0;
+    return;
+  }
+
+*/
+
+/*@ ghost
+  /@ requires aorai_CurStates ≡ h_0;
+     ensures aorai_CurOpStatus ≡ aorai_Terminated;
+     ensures aorai_CurOperation ≡ op_i;
+     assigns aorai_y, aorai_x, aorai_CurOpStatus, aorai_CurOperation,
+             aorai_CurStates;
+     
+     behavior buch_state_a_out:
+       ensures aorai_CurStates ≢ a;
+     
+     behavior buch_state_b_out:
+       ensures aorai_CurStates ≢ b;
+     
+     behavior buch_state_c_out:
+       ensures aorai_CurStates ≢ c;
+     
+     behavior buch_state_d_out:
+       ensures aorai_CurStates ≢ d;
+     
+     behavior buch_state_e_in_0:
+       assumes aorai_CurStates ≡ h_0;
+       ensures aorai_CurStates ≡ e;
+       ensures aorai_y ≡ 0;
+       ensures aorai_x ≡ 1;
+     
+     behavior buch_state_e_out:
+       assumes aorai_CurStates ≢ h_0;
+       ensures aorai_CurStates ≢ e;
+     
+     behavior buch_state_f_0_out:
+       ensures aorai_CurStates ≢ f_0;
+     
+     behavior buch_state_g_0_out:
+       ensures aorai_CurStates ≢ g_0;
+     
+     behavior buch_state_h_0_out:
+       ensures aorai_CurStates ≢ h_0;
+     
+     behavior buch_state_i_0_out:
+       ensures aorai_CurStates ≢ i_0;
+     
+     behavior aorai_y_unchanged_0:
+       assumes aorai_CurStates ≢ h_0;
+       ensures aorai_y ≡ \old(aorai_y);
+     
+     behavior aorai_x_unchanged_0:
+       assumes aorai_CurStates ≢ h_0;
+       ensures aorai_x ≡ \old(aorai_x);
+   @/
+  void i_post_func(void)
+  {
+    aorai_CurOpStatus = aorai_Terminated;
+    aorai_CurOperation = op_i;
+    if (7 == aorai_CurStates) {
+      aorai_CurStates = e;
+      aorai_y = 0;
+      aorai_x = 1;
+    }
+    return;
+  }
+
+*/
+
+/*@ requires aorai_CurStates ≡ g_0;
+    
+    behavior Buchi_property_behavior:
+      ensures aorai_CurStates ≡ e;
+      ensures
+        \at(aorai_CurStates ≡ g_0,Pre) ∧ aorai_CurStates ≡ e ⇒
+        aorai_y ≡ 0;
+      ensures
+        \at(aorai_CurStates ≡ g_0,Pre) ∧ aorai_CurStates ≡ e ⇒
+        aorai_x ≡ \at(1,Pre) + 0;
+ */
+void i(void)
+{
+  /*@ ghost i_pre_func(); */
+  /*@ ghost i_post_func(); */
+  return;
+}
+
+/*@ ghost
+  /@ requires aorai_CurStates ≡ a;
+     ensures aorai_CurOpStatus ≡ aorai_Called;
+     ensures aorai_CurOperation ≡ op_main;
+     assigns aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates;
+     
+     behavior buch_state_a_out:
+       ensures aorai_CurStates ≢ a;
+     
+     behavior buch_state_b_in:
+       assumes aorai_CurStates ≡ a;
+       ensures aorai_CurStates ≡ b;
+     
+     behavior buch_state_b_out:
+       assumes aorai_CurStates ≢ a;
+       ensures aorai_CurStates ≢ b;
+     
+     behavior buch_state_c_out:
+       ensures aorai_CurStates ≢ c;
+     
+     behavior buch_state_d_out:
+       ensures aorai_CurStates ≢ d;
+     
+     behavior buch_state_e_out:
+       ensures aorai_CurStates ≢ e;
+     
+     behavior buch_state_f_0_out:
+       ensures aorai_CurStates ≢ f_0;
+     
+     behavior buch_state_g_0_out:
+       ensures aorai_CurStates ≢ g_0;
+     
+     behavior buch_state_h_0_out:
+       ensures aorai_CurStates ≢ h_0;
+     
+     behavior buch_state_i_0_out:
+       ensures aorai_CurStates ≢ i_0;
+   @/
+  void main_pre_func(int t)
+  {
+    aorai_CurOpStatus = aorai_Called;
+    aorai_CurOperation = op_main;
+    if (0 == aorai_CurStates) aorai_CurStates = b;
+    return;
+  }
+
+*/
+
+/*@ ghost
+  /@ requires aorai_CurStates ≡ e;
+     ensures aorai_CurOpStatus ≡ aorai_Terminated;
+     ensures aorai_CurOperation ≡ op_main;
+     assigns aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates;
+     
+     behavior buch_state_a_out:
+       ensures aorai_CurStates ≢ a;
+     
+     behavior buch_state_b_out:
+       ensures aorai_CurStates ≢ b;
+     
+     behavior buch_state_c_out:
+       ensures aorai_CurStates ≢ c;
+     
+     behavior buch_state_d_out:
+       ensures aorai_CurStates ≢ d;
+     
+     behavior buch_state_e_out:
+       ensures aorai_CurStates ≢ e;
+     
+     behavior buch_state_f_0_out:
+       ensures aorai_CurStates ≢ f_0;
+     
+     behavior buch_state_g_0_out:
+       ensures aorai_CurStates ≢ g_0;
+     
+     behavior buch_state_h_0_out:
+       ensures aorai_CurStates ≢ h_0;
+     
+     behavior buch_state_i_0_in:
+       assumes aorai_CurStates ≡ e;
+       ensures aorai_CurStates ≡ i_0;
+     
+     behavior buch_state_i_0_out:
+       assumes aorai_CurStates ≢ e;
+       ensures aorai_CurStates ≢ i_0;
+   @/
+  void main_post_func(void)
+  {
+    aorai_CurOpStatus = aorai_Terminated;
+    aorai_CurOperation = op_main;
+    if (4 == aorai_CurStates) aorai_CurStates = i_0;
+    return;
+  }
+
+*/
+
+/*@ requires aorai_CurStates ≡ a;
+    
+    behavior Buchi_property_behavior:
+      ensures aorai_CurStates ≡ i_0;
+      ensures
+        \at(aorai_CurStates ≡ a,Pre) ∧ aorai_CurStates ≡ i_0 ⇒
+        aorai_y ≡ 0 ∨ aorai_y ≡ \at(aorai_x,Pre) + 0;
+      ensures
+        \at(aorai_CurStates ≡ a,Pre) ∧ aorai_CurStates ≡ i_0 ⇒
+        aorai_x ≡ \at(1,Pre) + 0 ∨ aorai_x ≡ \at((int)42,Pre) + 0;
+ */
+void main(int t)
+{
+  /*@ ghost int aorai_Loop_Init_15; */
+  /*@ ghost main_pre_func(t); */
+  if (t) f(42);
+  else {
+    g();
+    goto L;
+  }
+  int x = 0;
+  /*@ ghost aorai_Loop_Init_15 = 1; */
+  aorai_loop_15:
+  /*@ loop invariant Aorai: aorai_CurStates ≢ a;
+      loop invariant Aorai: aorai_CurStates ≢ b;
+      loop invariant Aorai: aorai_CurStates ≢ c;
+      loop invariant Aorai: aorai_CurStates ≢ d;
+      loop invariant Aorai: aorai_CurStates ≡ e;
+      loop invariant Aorai: aorai_CurStates ≢ f_0;
+      loop invariant Aorai: aorai_CurStates ≢ g_0;
+      loop invariant Aorai: aorai_CurStates ≢ h_0;
+      loop invariant Aorai: aorai_CurStates ≢ i_0;
+      loop invariant
+        Aorai:
+          \at(aorai_CurStates ≡ e,aorai_loop_15) ∧ aorai_CurStates ≡ e ⇒
+          aorai_y ≡ 0;
+      loop invariant
+        Aorai:
+          \at(aorai_CurStates ≡ e,aorai_loop_15) ∧ aorai_CurStates ≡ e ⇒
+          aorai_x ≡ \at(1,Pre) + 0;
+  */
+  while (x < 100) {
+    /*@ ghost aorai_Loop_Init_15 = 0; */
+    h(x);
+    L: i();
+    x ++;
+  }
+  /*@ ghost main_post_func(); */
+  return;
+}
+
+
diff --git a/src/plugins/aorai/tests/ya/oracle/metavariables-wrong.res.oracle b/src/plugins/aorai/tests/ya/oracle/metavariables-wrong.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..44c1487fcf7693e627a38f17cea95e7cd8e7b492
--- /dev/null
+++ b/src/plugins/aorai/tests/ya/oracle/metavariables-wrong.res.oracle
@@ -0,0 +1,5 @@
+[kernel] Parsing tests/ya/metavariables-wrong.i (no preprocessing)
+[aorai] Welcome to the Aorai plugin
+[aorai] User Error: The metavariables aorai_x may not be initialized before the transition from e to f_0:
+  { (Call(h)) and ((aorai_x) > (0)) }
+[kernel] Plug-in aorai aborted: invalid user input.
diff --git a/src/plugins/aorai/tests/ya/oracle/monostate.res.oracle b/src/plugins/aorai/tests/ya/oracle/monostate.res.oracle
index 5df73b9c95c31edffe2319c7c773b93acfa13b23..86ceb3e991278c964faf62706c167f6710087817 100644
--- a/src/plugins/aorai/tests/ya/oracle/monostate.res.oracle
+++ b/src/plugins/aorai/tests/ya/oracle/monostate.res.oracle
@@ -64,14 +64,11 @@ check lemma Init_deterministic_trans{L}:
    @/
   void f_pre_func(void)
   {
-    int aorai_CurStates_tmp;
     aorai_CurOpStatus = aorai_Called;
     aorai_CurOperation = op_f;
-    aorai_CurStates_tmp = aorai_CurStates;
-    if (2 == aorai_CurStates) aorai_CurStates_tmp = aorai_reject;
+    if (2 == aorai_CurStates) aorai_CurStates = aorai_reject;
     else 
-      if (1 == aorai_CurStates) aorai_CurStates_tmp = aorai_reject;
-    aorai_CurStates = aorai_CurStates_tmp;
+      if (1 == aorai_CurStates) aorai_CurStates = aorai_reject;
     return;
   }
 
@@ -99,12 +96,9 @@ check lemma Init_deterministic_trans{L}:
    @/
   void f_post_func(void)
   {
-    int aorai_CurStates_tmp;
     aorai_CurOpStatus = aorai_Terminated;
     aorai_CurOperation = op_f;
-    aorai_CurStates_tmp = aorai_CurStates;
-    if (2 == aorai_CurStates) aorai_CurStates_tmp = aorai_reject;
-    aorai_CurStates = aorai_CurStates_tmp;
+    if (2 == aorai_CurStates) aorai_CurStates = aorai_reject;
     return;
   }
 
@@ -145,11 +139,8 @@ void f(void)
    @/
   void main_pre_func(void)
   {
-    int aorai_CurStates_tmp;
     aorai_CurOpStatus = aorai_Called;
     aorai_CurOperation = op_main;
-    aorai_CurStates_tmp = aorai_CurStates;
-    aorai_CurStates = aorai_CurStates_tmp;
     return;
   }
 
@@ -172,11 +163,8 @@ void f(void)
    @/
   void main_post_func(void)
   {
-    int aorai_CurStates_tmp;
     aorai_CurOpStatus = aorai_Terminated;
     aorai_CurOperation = op_main;
-    aorai_CurStates_tmp = aorai_CurStates;
-    aorai_CurStates = aorai_CurStates_tmp;
     return;
   }
 
diff --git a/src/plugins/aorai/tests/ya/oracle/not_prm.res.oracle b/src/plugins/aorai/tests/ya/oracle/not_prm.res.oracle
index fb6b465a2256fcbac162429a15459d215ef802d0..1d964840b06fc2869b27dc1f9ff1115c052861fc 100644
--- a/src/plugins/aorai/tests/ya/oracle/not_prm.res.oracle
+++ b/src/plugins/aorai/tests/ya/oracle/not_prm.res.oracle
@@ -39,9 +39,7 @@ enum aorai_OpStatusList {
     aorai_CurOperation = op_f;
     S0_tmp = S0;
     Sf_tmp = Sf;
-    if (S0 == 1) 
-      if (x >= 4) Sf_tmp = 1; else Sf_tmp = 0;
-    else Sf_tmp = 0;
+    if (S0 == 1 && x >= 4) Sf_tmp = 1; else Sf_tmp = 0;
     S0_tmp = 0;
     S0 = S0_tmp;
     Sf = Sf_tmp;
diff --git a/src/plugins/aorai/tests/ya/oracle/other.res.oracle b/src/plugins/aorai/tests/ya/oracle/other.res.oracle
index 80809ada84f52d13998c0490ccf20da3bad3ce0f..8f230ecadb224c890456d0ef3ef0415fa9db4e9a 100644
--- a/src/plugins/aorai/tests/ya/oracle/other.res.oracle
+++ b/src/plugins/aorai/tests/ya/oracle/other.res.oracle
@@ -65,42 +65,13 @@ int x = 0;
     init_tmp = init;
     last_tmp = last;
     step1_tmp = step1;
-    if (init == 1) {
-      if (x == 3) step1_tmp = 1; else goto _LAND_0;
-    }
-    else {
-      _LAND_0: ;
-      if (last == 1) {
-        if (x == 3) step1_tmp = 1; else goto _LAND;
-      }
-      else {
-        _LAND: ;
-        if (step1 == 1) 
-          if (x != 4) step1_tmp = 1; else step1_tmp = 0;
-        else step1_tmp = 0;
-      }
-    }
-    if (last == 1) {
-      if (x != 4) {
-        if (x != 3) last_tmp = 1; else goto _LAND_1;
-      }
-      else goto _LAND_1;
-    }
-    else {
-      _LAND_1: ;
-      if (step1 == 1) 
-        if (x == 4) last_tmp = 1; else last_tmp = 0;
-      else last_tmp = 0;
-    }
-    if (init == 1) {
-      if (x != 3) init_tmp = 1; else goto _LAND_2;
-    }
-    else {
-      _LAND_2: ;
-      if (last == 1) 
-        if (x == 4) init_tmp = 1; else init_tmp = 0;
-      else init_tmp = 0;
-    }
+    if ((init == 1 && x == 3 || last == 1 && x == 3) || step1 == 1 && x != 4) 
+      step1_tmp = 1;
+    else step1_tmp = 0;
+    if (last == 1 && (x != 4 && x != 3) || step1 == 1 && x == 4) last_tmp = 1;
+    else last_tmp = 0;
+    if (init == 1 && x != 3 || last == 1 && x == 4) init_tmp = 1;
+    else init_tmp = 0;
     init = init_tmp;
     last = last_tmp;
     step1 = step1_tmp;
@@ -157,42 +128,13 @@ int x = 0;
     init_tmp = init;
     last_tmp = last;
     step1_tmp = step1;
-    if (init == 1) {
-      if (x == 3) step1_tmp = 1; else goto _LAND_0;
-    }
-    else {
-      _LAND_0: ;
-      if (last == 1) {
-        if (x == 3) step1_tmp = 1; else goto _LAND;
-      }
-      else {
-        _LAND: ;
-        if (step1 == 1) 
-          if (x != 4) step1_tmp = 1; else step1_tmp = 0;
-        else step1_tmp = 0;
-      }
-    }
-    if (last == 1) {
-      if (x != 4) {
-        if (x != 3) last_tmp = 1; else goto _LAND_1;
-      }
-      else goto _LAND_1;
-    }
-    else {
-      _LAND_1: ;
-      if (step1 == 1) 
-        if (x == 4) last_tmp = 1; else last_tmp = 0;
-      else last_tmp = 0;
-    }
-    if (init == 1) {
-      if (x != 3) init_tmp = 1; else goto _LAND_2;
-    }
-    else {
-      _LAND_2: ;
-      if (last == 1) 
-        if (x == 4) init_tmp = 1; else init_tmp = 0;
-      else init_tmp = 0;
-    }
+    if ((init == 1 && x == 3 || last == 1 && x == 3) || step1 == 1 && x != 4) 
+      step1_tmp = 1;
+    else step1_tmp = 0;
+    if (last == 1 && (x != 4 && x != 3) || step1 == 1 && x == 4) last_tmp = 1;
+    else last_tmp = 0;
+    if (init == 1 && x != 3 || last == 1 && x == 4) init_tmp = 1;
+    else init_tmp = 0;
     init = init_tmp;
     last = last_tmp;
     step1 = step1_tmp;
@@ -313,42 +255,13 @@ void f(void)
     init_tmp = init;
     last_tmp = last;
     step1_tmp = step1;
-    if (init == 1) {
-      if (x == 3) step1_tmp = 1; else goto _LAND_0;
-    }
-    else {
-      _LAND_0: ;
-      if (last == 1) {
-        if (x == 3) step1_tmp = 1; else goto _LAND;
-      }
-      else {
-        _LAND: ;
-        if (step1 == 1) 
-          if (x != 4) step1_tmp = 1; else step1_tmp = 0;
-        else step1_tmp = 0;
-      }
-    }
-    if (last == 1) {
-      if (x != 4) {
-        if (x != 3) last_tmp = 1; else goto _LAND_1;
-      }
-      else goto _LAND_1;
-    }
-    else {
-      _LAND_1: ;
-      if (step1 == 1) 
-        if (x == 4) last_tmp = 1; else last_tmp = 0;
-      else last_tmp = 0;
-    }
-    if (init == 1) {
-      if (x != 3) init_tmp = 1; else goto _LAND_2;
-    }
-    else {
-      _LAND_2: ;
-      if (last == 1) 
-        if (x == 4) init_tmp = 1; else init_tmp = 0;
-      else init_tmp = 0;
-    }
+    if ((init == 1 && x == 3 || last == 1 && x == 3) || step1 == 1 && x != 4) 
+      step1_tmp = 1;
+    else step1_tmp = 0;
+    if (last == 1 && (x != 4 && x != 3) || step1 == 1 && x == 4) last_tmp = 1;
+    else last_tmp = 0;
+    if (init == 1 && x != 3 || last == 1 && x == 4) init_tmp = 1;
+    else init_tmp = 0;
     init = init_tmp;
     last = last_tmp;
     step1 = step1_tmp;
@@ -405,42 +318,13 @@ void f(void)
     init_tmp = init;
     last_tmp = last;
     step1_tmp = step1;
-    if (init == 1) {
-      if (x == 3) step1_tmp = 1; else goto _LAND_0;
-    }
-    else {
-      _LAND_0: ;
-      if (last == 1) {
-        if (x == 3) step1_tmp = 1; else goto _LAND;
-      }
-      else {
-        _LAND: ;
-        if (step1 == 1) 
-          if (x != 4) step1_tmp = 1; else step1_tmp = 0;
-        else step1_tmp = 0;
-      }
-    }
-    if (last == 1) {
-      if (x != 4) {
-        if (x != 3) last_tmp = 1; else goto _LAND_1;
-      }
-      else goto _LAND_1;
-    }
-    else {
-      _LAND_1: ;
-      if (step1 == 1) 
-        if (x == 4) last_tmp = 1; else last_tmp = 0;
-      else last_tmp = 0;
-    }
-    if (init == 1) {
-      if (x != 3) init_tmp = 1; else goto _LAND_2;
-    }
-    else {
-      _LAND_2: ;
-      if (last == 1) 
-        if (x == 4) init_tmp = 1; else init_tmp = 0;
-      else init_tmp = 0;
-    }
+    if ((init == 1 && x == 3 || last == 1 && x == 3) || step1 == 1 && x != 4) 
+      step1_tmp = 1;
+    else step1_tmp = 0;
+    if (last == 1 && (x != 4 && x != 3) || step1 == 1 && x == 4) last_tmp = 1;
+    else last_tmp = 0;
+    if (init == 1 && x != 3 || last == 1 && x == 4) init_tmp = 1;
+    else init_tmp = 0;
     init = init_tmp;
     last = last_tmp;
     step1 = step1_tmp;
@@ -548,13 +432,9 @@ void g(void)
     init_tmp = init;
     last_tmp = last;
     step1_tmp = step1;
-    if (init == 1) 
-      if (x == 3) step1_tmp = 1; else step1_tmp = 0;
-    else step1_tmp = 0;
+    if (init == 1 && x == 3) step1_tmp = 1; else step1_tmp = 0;
     last_tmp = 0;
-    if (init == 1) 
-      if (x != 3) init_tmp = 1; else init_tmp = 0;
-    else init_tmp = 0;
+    if (init == 1 && x != 3) init_tmp = 1; else init_tmp = 0;
     init = init_tmp;
     last = last_tmp;
     step1 = step1_tmp;
@@ -611,42 +491,13 @@ void g(void)
     init_tmp = init;
     last_tmp = last;
     step1_tmp = step1;
-    if (init == 1) {
-      if (x == 3) step1_tmp = 1; else goto _LAND_0;
-    }
-    else {
-      _LAND_0: ;
-      if (last == 1) {
-        if (x == 3) step1_tmp = 1; else goto _LAND;
-      }
-      else {
-        _LAND: ;
-        if (step1 == 1) 
-          if (x != 4) step1_tmp = 1; else step1_tmp = 0;
-        else step1_tmp = 0;
-      }
-    }
-    if (last == 1) {
-      if (x != 4) {
-        if (x != 3) last_tmp = 1; else goto _LAND_1;
-      }
-      else goto _LAND_1;
-    }
-    else {
-      _LAND_1: ;
-      if (step1 == 1) 
-        if (x == 4) last_tmp = 1; else last_tmp = 0;
-      else last_tmp = 0;
-    }
-    if (init == 1) {
-      if (x != 3) init_tmp = 1; else goto _LAND_2;
-    }
-    else {
-      _LAND_2: ;
-      if (last == 1) 
-        if (x == 4) init_tmp = 1; else init_tmp = 0;
-      else init_tmp = 0;
-    }
+    if ((init == 1 && x == 3 || last == 1 && x == 3) || step1 == 1 && x != 4) 
+      step1_tmp = 1;
+    else step1_tmp = 0;
+    if (last == 1 && (x != 4 && x != 3) || step1 == 1 && x == 4) last_tmp = 1;
+    else last_tmp = 0;
+    if (init == 1 && x != 3 || last == 1 && x == 4) init_tmp = 1;
+    else init_tmp = 0;
     init = init_tmp;
     last = last_tmp;
     step1 = step1_tmp;
diff --git a/src/plugins/aorai/tests/ya/oracle/seq.res.oracle b/src/plugins/aorai/tests/ya/oracle/seq.res.oracle
index ef2675cd7f075668a39ea9d309c2c53fe921c317..506dca121a3f23b957ced47740eee807cff752ec 100644
--- a/src/plugins/aorai/tests/ya/oracle/seq.res.oracle
+++ b/src/plugins/aorai/tests/ya/oracle/seq.res.oracle
@@ -253,6 +253,11 @@ void f(void)
          (0 ≡ aorai_intermediate_state_2 ∨ ¬(aorai_counter < 2)) ∧
          0 ≡ aorai_intermediate_state_0 ∧ 0 ≡ aorai_intermediate_state;
        ensures 0 ≡ aorai_intermediate_state_3;
+     
+     behavior aorai_counter_unchanged:
+       assumes 0 ≡ aorai_intermediate_state;
+       assumes 0 ≡ aorai_intermediate_state_0;
+       assumes 0 ≡ aorai_intermediate_state_2 ∨ ¬(aorai_counter < 2);
        ensures aorai_counter ≡ \old(aorai_counter);
    @/
   void g_pre_func(void)
@@ -273,16 +278,10 @@ void f(void)
     aorai_intermediate_state_1_tmp = aorai_intermediate_state_1;
     aorai_intermediate_state_2_tmp = aorai_intermediate_state_2;
     aorai_intermediate_state_3_tmp = aorai_intermediate_state_3;
-    if (aorai_intermediate_state == 1) aorai_intermediate_state_3_tmp = 1;
-    else 
-      if (aorai_intermediate_state_0 == 1) aorai_intermediate_state_3_tmp = 1;
-      else 
-        if (aorai_intermediate_state_2 == 1) 
-          if (aorai_counter < 2) aorai_intermediate_state_3_tmp = 1;
-          else aorai_intermediate_state_3_tmp = 0;
-        else aorai_intermediate_state_3_tmp = 0;
-    if (aorai_intermediate_state_2 == 1) 
-      if (aorai_counter < 2) aorai_counter ++;
+    if ((aorai_intermediate_state == 1 || aorai_intermediate_state_0 == 1) || 
+        aorai_intermediate_state_2 == 1 && aorai_counter < 2) aorai_intermediate_state_3_tmp = 1;
+    else aorai_intermediate_state_3_tmp = 0;
+    if (aorai_intermediate_state_2 == 1 && aorai_counter < 2) aorai_counter ++;
     if (aorai_intermediate_state_0 == 1) aorai_counter = 1;
     if (aorai_intermediate_state == 1) aorai_counter = 1;
     aorai_intermediate_state_2_tmp = 0;
@@ -563,8 +562,7 @@ void g(void)
     aorai_intermediate_state_1_tmp = 0;
     aorai_intermediate_state_0_tmp = 0;
     aorai_intermediate_state_tmp = 0;
-    if (aorai_intermediate_state_2 == 1) 
-      if (1 <= aorai_counter) Sf_tmp = 1; else Sf_tmp = 0;
+    if (aorai_intermediate_state_2 == 1 && 1 <= aorai_counter) Sf_tmp = 1;
     else Sf_tmp = 0;
     S0_tmp = 0;
     S0 = S0_tmp;
diff --git a/src/plugins/aorai/tests/ya/oracle/seq_loop.res.oracle b/src/plugins/aorai/tests/ya/oracle/seq_loop.res.oracle
index 3e600a02555ac40005422af1968c929809712c56..91097fdf88b9aa56ad5e7d32f14521e41cb9cbd8 100644
--- a/src/plugins/aorai/tests/ya/oracle/seq_loop.res.oracle
+++ b/src/plugins/aorai/tests/ya/oracle/seq_loop.res.oracle
@@ -63,13 +63,17 @@ enum aorai_OpStatusList {
          (0 ≡ aorai_intermediate_state_0 ∨ ¬(aorai_counter < 5)) ∧
          0 ≡ aorai_intermediate_state;
        ensures 0 ≡ aorai_intermediate_state_1;
-       ensures aorai_counter ≡ \old(aorai_counter);
      
      behavior buch_state_aorai_intermediate_state_2_out:
        ensures 0 ≡ aorai_intermediate_state_2;
      
      behavior buch_state_aorai_intermediate_state_3_out:
        ensures 0 ≡ aorai_intermediate_state_3;
+     
+     behavior aorai_counter_unchanged:
+       assumes 0 ≡ aorai_intermediate_state;
+       assumes 0 ≡ aorai_intermediate_state_0 ∨ ¬(aorai_counter < 5);
+       ensures aorai_counter ≡ \old(aorai_counter);
    @/
   void f_pre_func(void)
   {
@@ -91,14 +95,10 @@ enum aorai_OpStatusList {
     aorai_intermediate_state_3_tmp = aorai_intermediate_state_3;
     aorai_intermediate_state_3_tmp = 0;
     aorai_intermediate_state_2_tmp = 0;
-    if (aorai_intermediate_state == 1) aorai_intermediate_state_1_tmp = 1;
-    else 
-      if (aorai_intermediate_state_0 == 1) 
-        if (aorai_counter < 5) aorai_intermediate_state_1_tmp = 1;
-        else aorai_intermediate_state_1_tmp = 0;
-      else aorai_intermediate_state_1_tmp = 0;
-    if (aorai_intermediate_state_0 == 1) 
-      if (aorai_counter < 5) aorai_counter ++;
+    if (aorai_intermediate_state == 1 || aorai_intermediate_state_0 == 1 && 
+                                         aorai_counter < 5) aorai_intermediate_state_1_tmp = 1;
+    else aorai_intermediate_state_1_tmp = 0;
+    if (aorai_intermediate_state_0 == 1 && aorai_counter < 5) aorai_counter ++;
     if (aorai_intermediate_state == 1) aorai_counter = 1;
     aorai_intermediate_state_0_tmp = 0;
     aorai_intermediate_state_tmp = 0;
@@ -539,9 +539,9 @@ void g(void)
     aorai_intermediate_state_1_tmp = 0;
     aorai_intermediate_state_0_tmp = 0;
     aorai_intermediate_state_tmp = 0;
-    if (aorai_intermediate_state == 1) Sf_tmp = 1;
-    else 
-      if (aorai_intermediate_state_0 == 1) Sf_tmp = 1; else Sf_tmp = 0;
+    if (aorai_intermediate_state == 1 || aorai_intermediate_state_0 == 1) 
+      Sf_tmp = 1;
+    else Sf_tmp = 0;
     S0_tmp = 0;
     S0 = S0_tmp;
     Sf = Sf_tmp;
diff --git a/src/plugins/aorai/tests/ya/oracle/singleassignment-right.res.oracle b/src/plugins/aorai/tests/ya/oracle/singleassignment-right.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..47bd37cf3ee9430554f51b2119e5f95c25f49990
--- /dev/null
+++ b/src/plugins/aorai/tests/ya/oracle/singleassignment-right.res.oracle
@@ -0,0 +1,140 @@
+[kernel] Parsing tests/ya/singleassignment-right.i (no preprocessing)
+[aorai] Welcome to the Aorai plugin
+[kernel] Parsing TMPDIR/aorai_singleassignment-right_0.i (no preprocessing)
+/* Generated by Frama-C */
+enum aorai_States {
+    aorai_reject_state = -2,
+    a = 0,
+    b = 1,
+    c = 2
+};
+enum aorai_ListOper {
+    op_main = 0
+};
+enum aorai_OpStatusList {
+    aorai_Terminated = 1,
+    aorai_Called = 0
+};
+/*@ check lemma c_deterministic_trans{L}: \true;
+ */
+/*@ check lemma b_deterministic_trans{L}: \true;
+ */
+/*@ check lemma a_deterministic_trans{L}: \true;
+ */
+/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */
+/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; */
+/*@ ghost int aorai_CurStates = a; */
+/*@ ghost int aorai_x = 0; */
+/*@ ghost int aorai_y = 0; */
+/*@ ghost
+  /@ requires aorai_CurStates ≡ a;
+     ensures aorai_CurOpStatus ≡ aorai_Called;
+     ensures aorai_CurOperation ≡ op_main;
+     assigns aorai_x, aorai_y, aorai_CurOpStatus, aorai_CurOperation,
+             aorai_CurStates;
+     
+     behavior buch_state_a_out:
+       ensures aorai_CurStates ≢ a;
+     
+     behavior buch_state_b_in_0:
+       assumes aorai_CurStates ≡ a;
+       ensures aorai_CurStates ≡ b;
+       ensures aorai_x ≡ \old(*x);
+       ensures aorai_y ≡ \old(*y);
+     
+     behavior buch_state_b_out:
+       assumes aorai_CurStates ≢ a;
+       ensures aorai_CurStates ≢ b;
+     
+     behavior buch_state_c_out:
+       ensures aorai_CurStates ≢ c;
+     
+     behavior aorai_y_unchanged:
+       assumes aorai_CurStates ≢ a;
+       ensures aorai_y ≡ \old(aorai_y);
+     
+     behavior aorai_x_unchanged:
+       assumes aorai_CurStates ≢ a;
+       ensures aorai_x ≡ \old(aorai_x);
+   @/
+  void main_pre_func(int *x, int *y)
+  {
+    aorai_CurOpStatus = aorai_Called;
+    aorai_CurOperation = op_main;
+    if (0 == aorai_CurStates) {
+      aorai_CurStates = b;
+      aorai_x = *x;
+      aorai_y = *y;
+    }
+    return;
+  }
+
+*/
+
+/*@ ghost
+  /@ requires aorai_CurStates ≡ b;
+     ensures aorai_CurOpStatus ≡ aorai_Terminated;
+     ensures aorai_CurOperation ≡ op_main;
+     assigns aorai_x, aorai_y, aorai_CurOpStatus, aorai_CurOperation,
+             aorai_CurStates;
+     
+     behavior buch_state_a_out:
+       ensures aorai_CurStates ≢ a;
+     
+     behavior buch_state_b_out:
+       ensures aorai_CurStates ≢ b;
+     
+     behavior buch_state_c_in_0:
+       assumes aorai_CurStates ≡ b;
+       ensures aorai_CurStates ≡ c;
+       ensures aorai_x ≡ \old(aorai_y);
+       ensures aorai_y ≡ aorai_x;
+     
+     behavior buch_state_c_out:
+       assumes aorai_CurStates ≢ b;
+       ensures aorai_CurStates ≢ c;
+     
+     behavior aorai_y_unchanged_0:
+       assumes aorai_CurStates ≢ b;
+       ensures aorai_y ≡ \old(aorai_y);
+     
+     behavior aorai_x_unchanged_0:
+       assumes aorai_CurStates ≢ b;
+       ensures aorai_x ≡ \old(aorai_x);
+   @/
+  void main_post_func(void)
+  {
+    aorai_CurOpStatus = aorai_Terminated;
+    aorai_CurOperation = op_main;
+    if (1 == aorai_CurStates) {
+      aorai_CurStates = c;
+      aorai_x = aorai_y;
+      aorai_y = aorai_x;
+    }
+    return;
+  }
+
+*/
+
+/*@ requires aorai_CurStates ≡ a;
+    
+    behavior Buchi_property_behavior:
+      ensures aorai_CurStates ≡ c;
+      ensures
+        \at(aorai_CurStates ≡ a,Pre) ∧ aorai_CurStates ≡ c ⇒
+        aorai_y ≡ \at(*x,Pre) + 0;
+      ensures
+        \at(aorai_CurStates ≡ a,Pre) ∧ aorai_CurStates ≡ c ⇒
+        aorai_x ≡ \at(*y,Pre) + 0;
+ */
+void main(int *x, int *y)
+{
+  /*@ ghost main_pre_func(x,y); */
+  int t = *x;
+  *x = *y;
+  *y = t;
+  /*@ ghost main_post_func(); */
+  return;
+}
+
+
diff --git a/src/plugins/aorai/tests/ya/oracle/singleassignment-wrong.res.oracle b/src/plugins/aorai/tests/ya/oracle/singleassignment-wrong.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..a24943fca9867c96902f607deaafe3a12f1a2e71
--- /dev/null
+++ b/src/plugins/aorai/tests/ya/oracle/singleassignment-wrong.res.oracle
@@ -0,0 +1,6 @@
+[kernel] Parsing tests/ya/singleassignment-wrong.i (no preprocessing)
+[aorai] Welcome to the Aorai plugin
+[aorai] User Error: The metavariable aorai_x is assigned several times during the transition from a to b:
+  { Call(main) } aorai_x <- x
+                 aorai_x <- aorai_x + 1
+[kernel] Plug-in aorai aborted: invalid user input.
diff --git a/src/plugins/aorai/tests/ya/oracle/stack.res.oracle b/src/plugins/aorai/tests/ya/oracle/stack.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..6ca094fa00c5447876ad01b5e9f2b6297b9ecbcd
--- /dev/null
+++ b/src/plugins/aorai/tests/ya/oracle/stack.res.oracle
@@ -0,0 +1,412 @@
+[kernel] Parsing tests/ya/stack.i (no preprocessing)
+[aorai] Welcome to the Aorai plugin
+[kernel] Parsing TMPDIR/aorai_stack_0.i (no preprocessing)
+/* Generated by Frama-C */
+enum aorai_States {
+    aorai_reject_state = -2,
+    accept = 0,
+    empty_stack = 1,
+    emptying_stack = 2,
+    filled_stack = 3,
+    filling_stack = 4,
+    init = 5
+};
+enum aorai_ListOper {
+    op_main = 2,
+    op_pop = 1,
+    op_push = 0
+};
+enum aorai_OpStatusList {
+    aorai_Terminated = 1,
+    aorai_Called = 0
+};
+/*@ check lemma init_deterministic_trans{L}: \true;
+ */
+/*@ check lemma filling_stack_deterministic_trans{L}: \true;
+ */
+/*@ check lemma accept_deterministic_trans{L}: \true;
+ */
+int g = 0;
+/*@ ghost enum aorai_ListOper aorai_CurOperation = op_main; */
+/*@ ghost enum aorai_OpStatusList aorai_CurOpStatus = aorai_Called; */
+/*@
+check lemma empty_stack_deterministic_trans{L}:
+  ¬(\at(aorai_CurOperation,L) ≡ op_push ∧
+     \at(aorai_CurOpStatus,L) ≡ aorai_Called ∧
+     \at(aorai_CurOperation,L) ≡ op_main ∧
+     \at(aorai_CurOpStatus,L) ≡ aorai_Terminated);
+ */
+/*@ ghost int aorai_CurStates = init; */
+/*@ ghost int aorai_n = 0; */
+/*@
+check lemma filled_stack_deterministic_trans{L}:
+  ¬(\at(aorai_CurOperation,L) ≡ op_pop ∧
+     \at(aorai_CurOpStatus,L) ≡ aorai_Called ∧ \at(aorai_n,L) > 0 ∧
+     \at(aorai_CurOperation,L) ≡ op_push ∧
+     \at(aorai_CurOpStatus,L) ≡ aorai_Called);
+ */
+/*@
+check lemma emptying_stack_deterministic_trans{L}:
+  ¬(\at(aorai_CurOperation,L) ≡ op_pop ∧
+     \at(aorai_CurOpStatus,L) ≡ aorai_Terminated ∧
+     \at(aorai_n,L) ≡ 1 ∧ \at(aorai_CurOperation,L) ≡ op_pop ∧
+     \at(aorai_CurOpStatus,L) ≡ aorai_Terminated ∧ \at(aorai_n,L) > 1);
+ */
+/*@ ghost
+  /@ requires
+       aorai_CurStates ≡ empty_stack ∨ aorai_CurStates ≡ filled_stack;
+     ensures aorai_CurOpStatus ≡ aorai_Called;
+     ensures aorai_CurOperation ≡ op_push;
+     assigns aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates;
+     
+     behavior buch_state_accept_out:
+       ensures aorai_CurStates ≢ accept;
+     
+     behavior buch_state_empty_stack_out:
+       ensures aorai_CurStates ≢ empty_stack;
+     
+     behavior buch_state_emptying_stack_out:
+       ensures aorai_CurStates ≢ emptying_stack;
+     
+     behavior buch_state_filled_stack_out:
+       ensures aorai_CurStates ≢ filled_stack;
+     
+     behavior buch_state_filling_stack_in:
+       assumes
+         aorai_CurStates ≡ filled_stack ∨ aorai_CurStates ≡ empty_stack;
+       ensures aorai_CurStates ≡ filling_stack;
+     
+     behavior buch_state_filling_stack_out:
+       assumes
+         aorai_CurStates ≢ filled_stack ∧ aorai_CurStates ≢ empty_stack;
+       ensures aorai_CurStates ≢ filling_stack;
+     
+     behavior buch_state_init_out:
+       ensures aorai_CurStates ≢ init;
+   @/
+  void push_pre_func(void)
+  {
+    aorai_CurOpStatus = aorai_Called;
+    aorai_CurOperation = op_push;
+    if (3 == aorai_CurStates) aorai_CurStates = filling_stack;
+    else 
+      if (1 == aorai_CurStates) aorai_CurStates = filling_stack;
+    return;
+  }
+
+*/
+
+/*@ ghost
+  /@ requires aorai_CurStates ≡ filling_stack;
+     ensures aorai_CurOpStatus ≡ aorai_Terminated;
+     ensures aorai_CurOperation ≡ op_push;
+     assigns aorai_n, aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates;
+     
+     behavior buch_state_accept_out:
+       ensures aorai_CurStates ≢ accept;
+     
+     behavior buch_state_empty_stack_out:
+       ensures aorai_CurStates ≢ empty_stack;
+     
+     behavior buch_state_emptying_stack_out:
+       ensures aorai_CurStates ≢ emptying_stack;
+     
+     behavior buch_state_filled_stack_in_0:
+       assumes aorai_CurStates ≡ filling_stack;
+       ensures aorai_CurStates ≡ filled_stack;
+       ensures aorai_n ≡ \old(aorai_n) + 1;
+     
+     behavior buch_state_filled_stack_out:
+       assumes aorai_CurStates ≢ filling_stack;
+       ensures aorai_CurStates ≢ filled_stack;
+     
+     behavior buch_state_filling_stack_out:
+       ensures aorai_CurStates ≢ filling_stack;
+     
+     behavior buch_state_init_out:
+       ensures aorai_CurStates ≢ init;
+     
+     behavior aorai_n_unchanged:
+       assumes aorai_CurStates ≢ filling_stack;
+       assumes aorai_CurStates ≢ filling_stack;
+       ensures aorai_n ≡ \old(aorai_n);
+   @/
+  void push_post_func(void)
+  {
+    aorai_CurOpStatus = aorai_Terminated;
+    aorai_CurOperation = op_push;
+    if (4 == aorai_CurStates) {
+      aorai_CurStates = filled_stack;
+      aorai_n ++;
+    }
+    return;
+  }
+
+*/
+
+/*@ requires
+      aorai_CurStates ≡ empty_stack ∨ aorai_CurStates ≡ filled_stack;
+    requires
+      aorai_CurStates ≡ filled_stack ∨ aorai_CurStates ≢ filled_stack;
+    requires
+      aorai_CurStates ≡ empty_stack ∨ aorai_CurStates ≢ empty_stack;
+    
+    behavior Buchi_property_behavior:
+      ensures aorai_CurStates ≡ filled_stack;
+      ensures
+        \at(aorai_CurStates ≡ filled_stack,Pre) ∧
+        aorai_CurStates ≡ filled_stack ⇒
+        aorai_n ≡ \at(aorai_n + 1,Pre) + 0;
+      ensures
+        \at(aorai_CurStates ≡ empty_stack,Pre) ∧
+        aorai_CurStates ≡ filled_stack ⇒
+        aorai_n ≡ \at(aorai_n + 1,Pre) + 0;
+ */
+void push(void)
+{
+  /*@ ghost push_pre_func(); */
+  g ++;
+  /*@ ghost push_post_func(); */
+  return;
+}
+
+/*@ ghost
+  /@ requires aorai_CurStates ≡ filled_stack;
+     requires aorai_CurStates ≡ filled_stack ⇒ aorai_n > 0;
+     ensures aorai_CurOpStatus ≡ aorai_Called;
+     ensures aorai_CurOperation ≡ op_pop;
+     assigns aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates;
+     
+     behavior buch_state_accept_out:
+       ensures aorai_CurStates ≢ accept;
+     
+     behavior buch_state_empty_stack_out:
+       ensures aorai_CurStates ≢ empty_stack;
+     
+     behavior buch_state_emptying_stack_in:
+       assumes aorai_CurStates ≡ filled_stack ∧ aorai_n > 0;
+       ensures aorai_CurStates ≡ emptying_stack;
+     
+     behavior buch_state_emptying_stack_out:
+       assumes aorai_CurStates ≢ filled_stack ∨ ¬(aorai_n > 0);
+       ensures aorai_CurStates ≢ emptying_stack;
+     
+     behavior buch_state_filled_stack_out:
+       ensures aorai_CurStates ≢ filled_stack;
+     
+     behavior buch_state_filling_stack_out:
+       ensures aorai_CurStates ≢ filling_stack;
+     
+     behavior buch_state_init_out:
+       ensures aorai_CurStates ≢ init;
+   @/
+  void pop_pre_func(void)
+  {
+    aorai_CurOpStatus = aorai_Called;
+    aorai_CurOperation = op_pop;
+    if (3 == aorai_CurStates && aorai_n > 0) aorai_CurStates = emptying_stack;
+    return;
+  }
+
+*/
+
+/*@ ghost
+  /@ requires aorai_CurStates ≡ emptying_stack;
+     requires
+       aorai_CurStates ≡ emptying_stack ⇒ aorai_n > 1 ∨ aorai_n ≡ 1;
+     ensures aorai_CurOpStatus ≡ aorai_Terminated;
+     ensures aorai_CurOperation ≡ op_pop;
+     assigns aorai_n, aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates;
+     
+     behavior buch_state_accept_out:
+       ensures aorai_CurStates ≢ accept;
+     
+     behavior buch_state_empty_stack_in_0:
+       assumes aorai_CurStates ≡ emptying_stack ∧ aorai_n ≡ 1;
+       ensures aorai_CurStates ≡ empty_stack;
+       ensures aorai_n ≡ \old(aorai_n) - 1;
+     
+     behavior buch_state_empty_stack_out:
+       assumes aorai_CurStates ≢ emptying_stack ∨ ¬(aorai_n ≡ 1);
+       ensures aorai_CurStates ≢ empty_stack;
+     
+     behavior buch_state_emptying_stack_out:
+       ensures aorai_CurStates ≢ emptying_stack;
+     
+     behavior buch_state_filled_stack_in_0:
+       assumes aorai_CurStates ≡ emptying_stack ∧ aorai_n > 1;
+       ensures aorai_CurStates ≡ filled_stack;
+       ensures aorai_n ≡ \old(aorai_n) - 1;
+     
+     behavior buch_state_filled_stack_out:
+       assumes aorai_CurStates ≢ emptying_stack ∨ ¬(aorai_n > 1);
+       ensures aorai_CurStates ≢ filled_stack;
+     
+     behavior buch_state_filling_stack_out:
+       ensures aorai_CurStates ≢ filling_stack;
+     
+     behavior buch_state_init_out:
+       ensures aorai_CurStates ≢ init;
+     
+     behavior aorai_n_unchanged_0:
+       assumes aorai_CurStates ≢ emptying_stack ∨ ¬(aorai_n > 1);
+       assumes aorai_CurStates ≢ emptying_stack ∨ ¬(aorai_n ≡ 1);
+       ensures aorai_n ≡ \old(aorai_n);
+   @/
+  void pop_post_func(void)
+  {
+    aorai_CurOpStatus = aorai_Terminated;
+    aorai_CurOperation = op_pop;
+    if (2 == aorai_CurStates && aorai_n == 1) {
+      aorai_CurStates = empty_stack;
+      aorai_n --;
+    }
+    else 
+      if (2 == aorai_CurStates && aorai_n > 1) {
+        aorai_CurStates = filled_stack;
+        aorai_n --;
+      }
+    return;
+  }
+
+*/
+
+/*@ requires aorai_CurStates ≡ filled_stack;
+    requires aorai_CurStates ≡ filled_stack ⇒ aorai_n > 0;
+    
+    behavior Buchi_property_behavior:
+      ensures
+        (aorai_CurStates ≡ empty_stack ⇒ aorai_n ≡ 1) ∧
+        (aorai_CurStates ≡ filled_stack ⇒ aorai_n > 1);
+      ensures
+        aorai_CurStates ≡ empty_stack ∨ aorai_CurStates ≡ filled_stack;
+      ensures
+        \at(aorai_CurStates ≡ filled_stack,Pre) ∧
+        aorai_CurStates ≡ filled_stack ⇒
+        aorai_n ≡ \at(aorai_n - 1,Pre) + 0;
+      ensures
+        \at(aorai_CurStates ≡ filled_stack,Pre) ∧
+        aorai_CurStates ≡ empty_stack ⇒
+        aorai_n ≡ \at(aorai_n - 1,Pre) + 0;
+ */
+void pop(void)
+{
+  /*@ ghost pop_pre_func(); */
+  /*@ assert g > 0; */ ;
+  g --;
+  /*@ ghost pop_post_func(); */
+  return;
+}
+
+/*@ ghost
+  /@ requires aorai_CurStates ≡ init;
+     ensures aorai_CurOpStatus ≡ aorai_Called;
+     ensures aorai_CurOperation ≡ op_main;
+     assigns aorai_n, aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates;
+     
+     behavior buch_state_accept_out:
+       ensures aorai_CurStates ≢ accept;
+     
+     behavior buch_state_empty_stack_in_0:
+       assumes aorai_CurStates ≡ init;
+       ensures aorai_CurStates ≡ empty_stack;
+       ensures aorai_n ≡ 0;
+     
+     behavior buch_state_empty_stack_out:
+       assumes aorai_CurStates ≢ init;
+       ensures aorai_CurStates ≢ empty_stack;
+     
+     behavior buch_state_emptying_stack_out:
+       ensures aorai_CurStates ≢ emptying_stack;
+     
+     behavior buch_state_filled_stack_out:
+       ensures aorai_CurStates ≢ filled_stack;
+     
+     behavior buch_state_filling_stack_out:
+       ensures aorai_CurStates ≢ filling_stack;
+     
+     behavior buch_state_init_out:
+       ensures aorai_CurStates ≢ init;
+     
+     behavior aorai_n_unchanged_1:
+       assumes aorai_CurStates ≢ init;
+       ensures aorai_n ≡ \old(aorai_n);
+   @/
+  void main_pre_func(void)
+  {
+    aorai_CurOpStatus = aorai_Called;
+    aorai_CurOperation = op_main;
+    if (5 == aorai_CurStates) {
+      aorai_CurStates = empty_stack;
+      aorai_n = 0;
+    }
+    return;
+  }
+
+*/
+
+/*@ ghost
+  /@ requires aorai_CurStates ≡ empty_stack;
+     ensures aorai_CurOpStatus ≡ aorai_Terminated;
+     ensures aorai_CurOperation ≡ op_main;
+     assigns aorai_CurOpStatus, aorai_CurOperation, aorai_CurStates;
+     
+     behavior buch_state_accept_in:
+       assumes aorai_CurStates ≡ empty_stack;
+       ensures aorai_CurStates ≡ accept;
+     
+     behavior buch_state_accept_out:
+       assumes aorai_CurStates ≢ empty_stack;
+       ensures aorai_CurStates ≢ accept;
+     
+     behavior buch_state_empty_stack_out:
+       ensures aorai_CurStates ≢ empty_stack;
+     
+     behavior buch_state_emptying_stack_out:
+       ensures aorai_CurStates ≢ emptying_stack;
+     
+     behavior buch_state_filled_stack_out:
+       ensures aorai_CurStates ≢ filled_stack;
+     
+     behavior buch_state_filling_stack_out:
+       ensures aorai_CurStates ≢ filling_stack;
+     
+     behavior buch_state_init_out:
+       ensures aorai_CurStates ≢ init;
+   @/
+  void main_post_func(void)
+  {
+    aorai_CurOpStatus = aorai_Terminated;
+    aorai_CurOperation = op_main;
+    if (1 == aorai_CurStates) aorai_CurStates = accept;
+    return;
+  }
+
+*/
+
+/*@ requires aorai_CurStates ≡ init;
+    
+    behavior Buchi_property_behavior:
+      ensures aorai_CurStates ≡ accept;
+      ensures
+        \at(aorai_CurStates ≡ init,Pre) ∧ aorai_CurStates ≡ accept ⇒
+        aorai_n ≡ \at(aorai_n - 1,Pre) + 0;
+ */
+void main(void)
+{
+  /*@ ghost main_pre_func(); */
+  push();
+  pop();
+  push();
+  push();
+  pop();
+  push();
+  push();
+  pop();
+  pop();
+  pop();
+  /*@ ghost main_post_func(); */
+  return;
+}
+
+
diff --git a/src/plugins/aorai/tests/ya/oracle/test_acces_params.res.oracle b/src/plugins/aorai/tests/ya/oracle/test_acces_params.res.oracle
index 2f0841a21006211b9a4f313bf10bf689d197d285..89553036d1a684d71bccedc4dc525fe7dbcb2ed1 100644
--- a/src/plugins/aorai/tests/ya/oracle/test_acces_params.res.oracle
+++ b/src/plugins/aorai/tests/ya/oracle/test_acces_params.res.oracle
@@ -76,9 +76,7 @@ int rr = 1;
     SF_tmp = 0;
     S4_tmp = 0;
     S3_tmp = 0;
-    if (S1 == 1) 
-      if (i >= 0) S2_tmp = 1; else S2_tmp = 0;
-    else S2_tmp = 0;
+    if (S1 == 1 && i >= 0) S2_tmp = 1; else S2_tmp = 0;
     S1_tmp = 0;
     S1 = S1_tmp;
     S2 = S2_tmp;
@@ -293,9 +291,7 @@ void opa(int i, int j)
     SF_tmp = SF;
     mainst_tmp = mainst;
     mainst_tmp = 0;
-    if (S4 == 1) 
-      if (res > 0) SF_tmp = 1; else SF_tmp = 0;
-    else SF_tmp = 0;
+    if (S4 == 1 && res > 0) SF_tmp = 1; else SF_tmp = 0;
     S4_tmp = 0;
     S3_tmp = 0;
     S2_tmp = 0;
diff --git a/src/plugins/aorai/tests/ya/oracle/test_acces_params2.res.oracle b/src/plugins/aorai/tests/ya/oracle/test_acces_params2.res.oracle
index 14191d7f00b8e8d5cd13f1a5f7842b00c44a3c4b..16997723976399ec7e581375b99d0be6dc37e33e 100644
--- a/src/plugins/aorai/tests/ya/oracle/test_acces_params2.res.oracle
+++ b/src/plugins/aorai/tests/ya/oracle/test_acces_params2.res.oracle
@@ -82,9 +82,7 @@ int rr = 1;
     S6_tmp = 0;
     S5_tmp = 0;
     S4_tmp = 0;
-    if (S2 == 1) 
-      if (r >= 0) S3_tmp = 1; else S3_tmp = 0;
-    else S3_tmp = 0;
+    if (S2 == 1 && r >= 0) S3_tmp = 1; else S3_tmp = 0;
     S2_tmp = 0;
     S1_tmp = 0;
     S1 = S1_tmp;
@@ -156,9 +154,7 @@ int rr = 1;
     S7_tmp = 0;
     S6_tmp = 0;
     S5_tmp = 0;
-    if (S3 == 1) 
-      if (res <= 5000) S4_tmp = 1; else S4_tmp = 0;
-    else S4_tmp = 0;
+    if (S3 == 1 && res <= 5000) S4_tmp = 1; else S4_tmp = 0;
     S3_tmp = 0;
     S2_tmp = 0;
     S1_tmp = 0;
diff --git a/src/plugins/aorai/tests/ya/oracle/test_boucle_rechercheTableau.res.oracle b/src/plugins/aorai/tests/ya/oracle/test_boucle_rechercheTableau.res.oracle
index 862eecf00b3d95eabb6ff90430a634d16d8f3a2d..6bd1a0b39b8010458503b8e83ae36ac33f416ecf 100644
--- a/src/plugins/aorai/tests/ya/oracle/test_boucle_rechercheTableau.res.oracle
+++ b/src/plugins/aorai/tests/ya/oracle/test_boucle_rechercheTableau.res.oracle
@@ -97,13 +97,9 @@ enum aorai_OpStatusList {
     End_tmp = End;
     Idle_tmp = Idle;
     WillDoFoo_tmp = WillDoFoo;
-    if (Idle == 1) 
-      if (res == -1) WillDoFoo_tmp = 1; else WillDoFoo_tmp = 0;
-    else WillDoFoo_tmp = 0;
+    if (Idle == 1 && res == -1) WillDoFoo_tmp = 1; else WillDoFoo_tmp = 0;
     Idle_tmp = 0;
-    if (Idle == 1) 
-      if (res != -1) End_tmp = 1; else End_tmp = 0;
-    else End_tmp = 0;
+    if (Idle == 1 && res != -1) End_tmp = 1; else End_tmp = 0;
     End = End_tmp;
     Idle = Idle_tmp;
     WillDoFoo = WillDoFoo_tmp;
diff --git a/src/plugins/aorai/tests/ya/oracle/test_factorial.res.oracle b/src/plugins/aorai/tests/ya/oracle/test_factorial.res.oracle
index d3c59bb4befd891ca4a21f07b24c760adc8df894..009f14f70dd4771f190e1b6b609515a3a8316b8a 100644
--- a/src/plugins/aorai/tests/ya/oracle/test_factorial.res.oracle
+++ b/src/plugins/aorai/tests/ya/oracle/test_factorial.res.oracle
@@ -72,11 +72,11 @@ enum aorai_OpStatusList {
        ensures 0 ≡ S1;
      
      behavior buch_state_S2_in:
-       assumes 1 ≡ S1 ∧ 1 ≢ 0;
+       assumes 1 ≡ S1;
        ensures 1 ≡ S2;
      
      behavior buch_state_S2_out:
-       assumes 0 ≡ S1 ∨ 1 ≡ 0;
+       assumes 0 ≡ S1;
        ensures 0 ≡ S2;
      
      behavior buch_state_main_0_out:
@@ -106,7 +106,6 @@ enum aorai_OpStatusList {
 /*@ requires 1 ≡ S1 ∧ 0 ≡ S2 ∧ 0 ≡ main_0;
     
     behavior Buchi_property_behavior:
-      ensures 1 ≡ S2 ⇒ 1 ≢ 0;
       ensures 1 ≡ S1 ∨ 0 ≡ S1;
       ensures 1 ≡ S2 ∨ 0 ≡ S2;
       ensures 0 ≡ main_0;
@@ -118,7 +117,7 @@ int decode_int(char *s)
   int __retres;
   char c;
   /*@ ghost decode_int_pre_func(s); */
-  int intmax = ~ (1 << (sizeof(int) * (unsigned int)8 - (unsigned int)1));
+  int intmax = ~ (1 << (sizeof(int) * (unsigned long)8 - (unsigned long)1));
   int cutlim = intmax % 10;
   int cutoff = intmax / 10;
   int value = 0;
@@ -186,7 +185,6 @@ int decode_int(char *s)
 
 /*@ ghost
   /@ requires (1 ≡ S1 ∨ 1 ≡ S2) ∧ 0 ≡ main_0;
-     requires 1 ≡ S1 ⇒ 1 ≢ 0;
      ensures aorai_CurOpStatus ≡ aorai_Called;
      ensures aorai_CurOperation ≡ op_factorial;
      assigns aorai_CurOpStatus, aorai_CurOperation, S1, S2, main_0;
@@ -195,11 +193,11 @@ int decode_int(char *s)
        ensures 0 ≡ S1;
      
      behavior buch_state_S2_in:
-       assumes 1 ≡ S2 ∨ (1 ≡ S1 ∧ 1 ≢ 0);
+       assumes 1 ≡ S2 ∨ 1 ≡ S1;
        ensures 1 ≡ S2;
      
      behavior buch_state_S2_out:
-       assumes 0 ≡ S2 ∧ (0 ≡ S1 ∨ 1 ≡ 0);
+       assumes 0 ≡ S2 ∧ 0 ≡ S1;
        ensures 0 ≡ S2;
      
      behavior buch_state_main_0_out:
@@ -216,9 +214,7 @@ int decode_int(char *s)
     S2_tmp = S2;
     main_0_tmp = main_0;
     main_0_tmp = 0;
-    if (S1 == 1) S2_tmp = 1;
-    else 
-      if (S2 == 1) S2_tmp = 1; else S2_tmp = 0;
+    if (S1 == 1 || S2 == 1) S2_tmp = 1; else S2_tmp = 0;
     S1_tmp = 0;
     S1 = S1_tmp;
     S2 = S2_tmp;
@@ -243,11 +239,11 @@ int decode_int(char *s)
        ensures 0 ≡ S1;
      
      behavior buch_state_S2_in:
-       assumes 1 ≡ S2 ∨ (1 ≡ S1 ∧ 1 ≢ 0);
+       assumes 1 ≡ S2 ∨ 1 ≡ S1;
        ensures 1 ≡ S2;
      
      behavior buch_state_S2_out:
-       assumes 0 ≡ S2 ∧ (0 ≡ S1 ∨ 1 ≡ 0);
+       assumes 0 ≡ S2 ∧ 0 ≡ S1;
        ensures 0 ≡ S2;
      
      behavior buch_state_main_0_out:
@@ -264,12 +260,8 @@ int decode_int(char *s)
     S2_tmp = S2;
     main_0_tmp = main_0;
     main_0_tmp = 0;
-    if (S1 == 1) S2_tmp = 1;
-    else 
-      if (S2 == 1) S2_tmp = 1; else S2_tmp = 0;
-    if (S1 == 1) S1_tmp = 1;
-    else 
-      if (S2 == 1) S1_tmp = 1; else S1_tmp = 0;
+    if (S1 == 1 || S2 == 1) S2_tmp = 1; else S2_tmp = 0;
+    if (S1 == 1 || S2 == 1) S1_tmp = 1; else S1_tmp = 0;
     S1 = S1_tmp;
     S2 = S2_tmp;
     main_0 = main_0_tmp;
@@ -279,7 +271,6 @@ int decode_int(char *s)
 */
 
 /*@ requires (1 ≡ S1 ∨ 1 ≡ S2) ∧ 0 ≡ main_0;
-    requires 1 ≡ S1 ⇒ 1 ≢ 0;
     requires 1 ≡ S2 ∨ 0 ≡ S2;
     requires 1 ≡ S1 ∨ 0 ≡ S1;
     requires 0 ≤ value ≤ 12;
@@ -362,11 +353,11 @@ int factorial(int value)
        ensures 0 ≡ S1;
      
      behavior buch_state_S2_in:
-       assumes 1 ≡ S1 ∧ 1 ≢ 0;
+       assumes 1 ≡ S1;
        ensures 1 ≡ S2;
      
      behavior buch_state_S2_out:
-       assumes 0 ≡ S1 ∨ 1 ≡ 0;
+       assumes 0 ≡ S1;
        ensures 0 ≡ S2;
      
      behavior buch_state_main_0_out:
@@ -398,7 +389,6 @@ int factorial(int value)
     ensures \result ≡ 0 ∨ \result ≡ 1;
     
     behavior Buchi_property_behavior:
-      ensures 1 ≡ S2 ⇒ 1 ≢ 0;
       ensures 1 ≡ S1 ∨ 0 ≡ S1;
       ensures 1 ≡ S2 ∨ 0 ≡ S2;
       ensures 0 ≡ main_0;
diff --git a/src/plugins/aorai/tests/ya/oracle/test_recursion4.res.oracle b/src/plugins/aorai/tests/ya/oracle/test_recursion4.res.oracle
index 6652049d8dd0807628419b6c351661b2da4ea857..cdfe4aba74bff1e589436adad382f28f9967766a 100644
--- a/src/plugins/aorai/tests/ya/oracle/test_recursion4.res.oracle
+++ b/src/plugins/aorai/tests/ya/oracle/test_recursion4.res.oracle
@@ -100,25 +100,11 @@ enum aorai_OpStatusList {
     End_tmp = End;
     Idle_tmp = Idle;
     WillDoFoo_tmp = WillDoFoo;
-    if (Idle == 1) {
-      if (res == -1) WillDoFoo_tmp = 1; else goto _LAND;
-    }
-    else {
-      _LAND: ;
-      if (WillDoFoo == 1) 
-        if (res == -1) WillDoFoo_tmp = 1; else WillDoFoo_tmp = 0;
-      else WillDoFoo_tmp = 0;
-    }
+    if (Idle == 1 && res == -1 || WillDoFoo == 1 && res == -1) WillDoFoo_tmp = 1;
+    else WillDoFoo_tmp = 0;
     Idle_tmp = 0;
-    if (End == 1) {
-      if (res != -1) End_tmp = 1; else goto _LAND_0;
-    }
-    else {
-      _LAND_0: ;
-      if (Idle == 1) 
-        if (res != -1) End_tmp = 1; else End_tmp = 0;
-      else End_tmp = 0;
-    }
+    if (End == 1 && res != -1 || Idle == 1 && res != -1) End_tmp = 1;
+    else End_tmp = 0;
     End = End_tmp;
     Idle = Idle_tmp;
     WillDoFoo = WillDoFoo_tmp;
diff --git a/src/plugins/aorai/tests/ya/oracle/test_recursion5.res.oracle b/src/plugins/aorai/tests/ya/oracle/test_recursion5.res.oracle
index 059961889707d7edefa1fd55d1593761b0b071c2..bc9334eec11d7af2e8fcb00eb21f5fb24d1a832f 100644
--- a/src/plugins/aorai/tests/ya/oracle/test_recursion5.res.oracle
+++ b/src/plugins/aorai/tests/ya/oracle/test_recursion5.res.oracle
@@ -123,24 +123,10 @@ enum aorai_OpStatusList {
     Idle_tmp = Idle;
     IgnoreFoo_tmp = IgnoreFoo;
     WillDoFoo_tmp = WillDoFoo;
-    if (Idle == 1) {
-      if (res == -1) WillDoFoo_tmp = 1; else goto _LAND;
-    }
-    else {
-      _LAND: ;
-      if (WillDoFoo == 1) 
-        if (res == -1) WillDoFoo_tmp = 1; else WillDoFoo_tmp = 0;
-      else WillDoFoo_tmp = 0;
-    }
-    if (Idle == 1) {
-      if (res != -1) IgnoreFoo_tmp = 1; else goto _LAND_0;
-    }
-    else {
-      _LAND_0: ;
-      if (IgnoreFoo == 1) 
-        if (res != -1) IgnoreFoo_tmp = 1; else IgnoreFoo_tmp = 0;
-      else IgnoreFoo_tmp = 0;
-    }
+    if (Idle == 1 && res == -1 || WillDoFoo == 1 && res == -1) WillDoFoo_tmp = 1;
+    else WillDoFoo_tmp = 0;
+    if (Idle == 1 && res != -1 || IgnoreFoo == 1 && res != -1) IgnoreFoo_tmp = 1;
+    else IgnoreFoo_tmp = 0;
     Idle_tmp = 0;
     End_tmp = 0;
     End = End_tmp;
@@ -292,14 +278,11 @@ int isPresentRec(int *t, int i, int max, int val)
     Idle_tmp = Idle;
     IgnoreFoo_tmp = IgnoreFoo;
     WillDoFoo_tmp = WillDoFoo;
-    if (WillDoFoo == 1) 
-      if (res == -1) WillDoFoo_tmp = 1; else WillDoFoo_tmp = 0;
+    if (WillDoFoo == 1 && res == -1) WillDoFoo_tmp = 1;
     else WillDoFoo_tmp = 0;
     IgnoreFoo_tmp = 0;
     Idle_tmp = 0;
-    if (IgnoreFoo == 1) 
-      if (res != -1) End_tmp = 1; else End_tmp = 0;
-    else End_tmp = 0;
+    if (IgnoreFoo == 1 && res != -1) End_tmp = 1; else End_tmp = 0;
     End = End_tmp;
     Idle = Idle_tmp;
     IgnoreFoo = IgnoreFoo_tmp;
diff --git a/src/plugins/aorai/tests/ya/oracle/test_struct.res.oracle b/src/plugins/aorai/tests/ya/oracle/test_struct.res.oracle
index 0916e902014b3cb6b3c85b722d2a0b894c791b12..0e102ceda9633ce37d9262207c569e610ce0a69b 100644
--- a/src/plugins/aorai/tests/ya/oracle/test_struct.res.oracle
+++ b/src/plugins/aorai/tests/ya/oracle/test_struct.res.oracle
@@ -47,9 +47,7 @@ int myAge = 0;
     S1_tmp = S1;
     main_0_tmp = main_0;
     main_0_tmp = 0;
-    if (S1 == 1) 
-      if (nobody.Age == 1) S1_tmp = 1; else S1_tmp = 0;
-    else S1_tmp = 0;
+    if (S1 == 1 && nobody.Age == 1) S1_tmp = 1; else S1_tmp = 0;
     S1 = S1_tmp;
     main_0 = main_0_tmp;
     return;
@@ -84,9 +82,7 @@ int myAge = 0;
     S1_tmp = S1;
     main_0_tmp = main_0;
     main_0_tmp = 0;
-    if (S1 == 1) 
-      if (nobody.Age == 1) S1_tmp = 1; else S1_tmp = 0;
-    else S1_tmp = 0;
+    if (S1 == 1 && nobody.Age == 1) S1_tmp = 1; else S1_tmp = 0;
     S1 = S1_tmp;
     main_0 = main_0_tmp;
     return;
@@ -138,9 +134,7 @@ void increment(void)
     S1_tmp = S1;
     main_0_tmp = main_0;
     main_0_tmp = 0;
-    if (main_0 == 1) 
-      if (nobody.Age == 0) S1_tmp = 1; else S1_tmp = 0;
-    else S1_tmp = 0;
+    if (main_0 == 1 && nobody.Age == 0) S1_tmp = 1; else S1_tmp = 0;
     S1 = S1_tmp;
     main_0 = main_0_tmp;
     return;
@@ -175,9 +169,7 @@ void increment(void)
     S1_tmp = S1;
     main_0_tmp = main_0;
     main_0_tmp = 0;
-    if (S1 == 1) 
-      if (nobody.Age == 1) S1_tmp = 1; else S1_tmp = 0;
-    else S1_tmp = 0;
+    if (S1 == 1 && nobody.Age == 1) S1_tmp = 1; else S1_tmp = 0;
     S1 = S1_tmp;
     main_0 = main_0_tmp;
     return;
diff --git a/src/plugins/aorai/tests/ya/oracle_prove/aorai_ptr_field.res.oracle b/src/plugins/aorai/tests/ya/oracle_prove/aorai_ptr_field.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..5d9a38bc1e4b760ac98152b2e6c6958812759e8d
--- /dev/null
+++ b/src/plugins/aorai/tests/ya/oracle_prove/aorai_ptr_field.res.oracle
@@ -0,0 +1,4 @@
+[kernel] Parsing tests/ya/aorai_ptr_field.i (no preprocessing)
+[aorai] Welcome to the Aorai plugin
+[kernel] Parsing TMPDIR/aorai_aorai_ptr_field_0.i (no preprocessing)
+[wp] Warning: Missing RTE guards
diff --git a/src/plugins/aorai/tests/ya/oracle_prove/incorrect.res.oracle b/src/plugins/aorai/tests/ya/oracle_prove/incorrect.res.oracle
index 950cae9f7c78b63bcd69aa8acf18cd4a83ecf3d2..e5437b11cf441f0122b9d89b3ba1147984506890 100644
--- a/src/plugins/aorai/tests/ya/oracle_prove/incorrect.res.oracle
+++ b/src/plugins/aorai/tests/ya/oracle_prove/incorrect.res.oracle
@@ -3,5 +3,5 @@
 [aorai] Warning: Call to main does not follow automaton's specification. This path is assumed to be dead
 [kernel] Parsing TMPDIR/aorai_incorrect_0.i (no preprocessing)
 [wp] Warning: Missing RTE guards
-[kernel:annot:missing-spec] TMPDIR/aorai_incorrect_0.i:61: Warning: 
+[kernel:annot:missing-spec] TMPDIR/aorai_incorrect_0.i:62: Warning: 
   Neither code nor specification for function f, generating default assigns from the prototype
diff --git a/src/plugins/aorai/tests/ya/oracle_prove/metavariables-incompatible.res.oracle b/src/plugins/aorai/tests/ya/oracle_prove/metavariables-incompatible.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..57c2d7eed1ca61046277d1cbf5d005a9fde10a52
--- /dev/null
+++ b/src/plugins/aorai/tests/ya/oracle_prove/metavariables-incompatible.res.oracle
@@ -0,0 +1,4 @@
+[kernel] Parsing tests/ya/metavariables-incompatible.i (no preprocessing)
+[aorai] Welcome to the Aorai plugin
+[aorai] User Error: The use of metavariables is incompatible with non-deterministic automata, such as automa using extended transitions.
+[kernel] Plug-in aorai aborted: invalid user input.
diff --git a/src/plugins/aorai/tests/ya/oracle_prove/metavariables-right.res.oracle b/src/plugins/aorai/tests/ya/oracle_prove/metavariables-right.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..6803c149a7b942ab01ffcff164c2ae40bf6aca0d
--- /dev/null
+++ b/src/plugins/aorai/tests/ya/oracle_prove/metavariables-right.res.oracle
@@ -0,0 +1,4 @@
+[kernel] Parsing tests/ya/metavariables-right.i (no preprocessing)
+[aorai] Welcome to the Aorai plugin
+[kernel] Parsing TMPDIR/aorai_metavariables-right_0.i (no preprocessing)
+[wp] Warning: Missing RTE guards
diff --git a/src/plugins/aorai/tests/ya/oracle_prove/metavariables-wrong.res.oracle b/src/plugins/aorai/tests/ya/oracle_prove/metavariables-wrong.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..44c1487fcf7693e627a38f17cea95e7cd8e7b492
--- /dev/null
+++ b/src/plugins/aorai/tests/ya/oracle_prove/metavariables-wrong.res.oracle
@@ -0,0 +1,5 @@
+[kernel] Parsing tests/ya/metavariables-wrong.i (no preprocessing)
+[aorai] Welcome to the Aorai plugin
+[aorai] User Error: The metavariables aorai_x may not be initialized before the transition from e to f_0:
+  { (Call(h)) and ((aorai_x) > (0)) }
+[kernel] Plug-in aorai aborted: invalid user input.
diff --git a/src/plugins/aorai/tests/ya/oracle_prove/singleassignment-right.res.oracle b/src/plugins/aorai/tests/ya/oracle_prove/singleassignment-right.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..79c1ae490e64e6a010e1842eec97bd6062a2cf0d
--- /dev/null
+++ b/src/plugins/aorai/tests/ya/oracle_prove/singleassignment-right.res.oracle
@@ -0,0 +1,4 @@
+[kernel] Parsing tests/ya/singleassignment-right.i (no preprocessing)
+[aorai] Welcome to the Aorai plugin
+[kernel] Parsing TMPDIR/aorai_singleassignment-right_0.i (no preprocessing)
+[wp] Warning: Missing RTE guards
diff --git a/src/plugins/aorai/tests/ya/oracle_prove/singleassignment-wrong.res.oracle b/src/plugins/aorai/tests/ya/oracle_prove/singleassignment-wrong.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..a24943fca9867c96902f607deaafe3a12f1a2e71
--- /dev/null
+++ b/src/plugins/aorai/tests/ya/oracle_prove/singleassignment-wrong.res.oracle
@@ -0,0 +1,6 @@
+[kernel] Parsing tests/ya/singleassignment-wrong.i (no preprocessing)
+[aorai] Welcome to the Aorai plugin
+[aorai] User Error: The metavariable aorai_x is assigned several times during the transition from a to b:
+  { Call(main) } aorai_x <- x
+                 aorai_x <- aorai_x + 1
+[kernel] Plug-in aorai aborted: invalid user input.
diff --git a/src/plugins/aorai/tests/ya/oracle_prove/stack.res.oracle b/src/plugins/aorai/tests/ya/oracle_prove/stack.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..ad8ddcef2ca5c41625a8a4dec207a6a71cdf6be6
--- /dev/null
+++ b/src/plugins/aorai/tests/ya/oracle_prove/stack.res.oracle
@@ -0,0 +1,4 @@
+[kernel] Parsing tests/ya/stack.i (no preprocessing)
+[aorai] Welcome to the Aorai plugin
+[kernel] Parsing TMPDIR/aorai_stack_0.i (no preprocessing)
+[wp] Warning: Missing RTE guards
diff --git a/src/plugins/aorai/tests/ya/other.ya b/src/plugins/aorai/tests/ya/other.ya
index b09fdac2e90f18ea3354d88dbc2a1a948a92d88a..9decad039c19064deae6501be6541c906411ee43 100644
--- a/src/plugins/aorai/tests/ya/other.ya
+++ b/src/plugins/aorai/tests/ya/other.ya
@@ -11,4 +11,4 @@ step1: { x == 4 } -> last
 last: { x == 3 } -> step1
     | { x == 4 } -> init
     | other -> last
-    ;
\ No newline at end of file
+    ;
diff --git a/src/plugins/aorai/tests/ya/single_call.ya b/src/plugins/aorai/tests/ya/single_call.ya
index 0b249a798cde0ac98ddf522930d64ae366f42af5..023c136805c125f600b5aeb9730456c570991098 100644
--- a/src/plugins/aorai/tests/ya/single_call.ya
+++ b/src/plugins/aorai/tests/ya/single_call.ya
@@ -2,4 +2,4 @@
 %accept: Sf;
 
 S0: { [main()] } -> Sf;
-Sf: -> Sf;
\ No newline at end of file
+Sf: -> Sf;
diff --git a/src/plugins/aorai/tests/ya/singleassignment-right.i b/src/plugins/aorai/tests/ya/singleassignment-right.i
new file mode 100644
index 0000000000000000000000000000000000000000..943c3e5e67cf9c02fde3be2c6dc73b2fbaa07b7d
--- /dev/null
+++ b/src/plugins/aorai/tests/ya/singleassignment-right.i
@@ -0,0 +1,10 @@
+/* run.config*
+   OPT: -aorai-automata @PTEST_DIR@/@PTEST_NAME@.ya -aorai-test 1 -load-module tests/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ @PROVE_OPTIONS@
+*/
+
+void main(int *x, int *y)
+{
+  int t = *x;
+  *x = *y;
+  *y = t;
+}
diff --git a/src/plugins/aorai/tests/ya/singleassignment-right.ya b/src/plugins/aorai/tests/ya/singleassignment-right.ya
new file mode 100644
index 0000000000000000000000000000000000000000..e286ba62bec298869f7135e6aba137375426f82b
--- /dev/null
+++ b/src/plugins/aorai/tests/ya/singleassignment-right.ya
@@ -0,0 +1,12 @@
+%init:		a;
+%accept:	c;
+%deterministic;
+
+$x : int;
+$y : int;
+
+a : { CALL(main) } $x := *x; $y := *y; -> b;
+
+b : { RETURN(main) } $x := $y; $y := $x; -> c;
+
+c : -> c;
diff --git a/src/plugins/aorai/tests/ya/singleassignment-wrong.i b/src/plugins/aorai/tests/ya/singleassignment-wrong.i
new file mode 100644
index 0000000000000000000000000000000000000000..c983ce03e455dd3ac55c8baa1c76fc0785a8028f
--- /dev/null
+++ b/src/plugins/aorai/tests/ya/singleassignment-wrong.i
@@ -0,0 +1,8 @@
+/* run.config*
+   OPT: -aorai-automata @PTEST_DIR@/@PTEST_NAME@.ya -aorai-test 1 -load-module tests/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ @PROVE_OPTIONS@
+*/
+
+int main(int x)
+{
+  return x;
+}
diff --git a/src/plugins/aorai/tests/ya/singleassignment-wrong.ya b/src/plugins/aorai/tests/ya/singleassignment-wrong.ya
new file mode 100644
index 0000000000000000000000000000000000000000..2106e0d53c534bf2ad705859ea7c7ef13a719cfc
--- /dev/null
+++ b/src/plugins/aorai/tests/ya/singleassignment-wrong.ya
@@ -0,0 +1,11 @@
+%init:		a;
+%accept:	c;
+%deterministic;
+
+$x : int;
+
+a : { CALL(main) } $x := x; $x := $x + 1; -> b;
+
+b : { RETURN(main) } -> c;
+
+c : -> c;
diff --git a/src/plugins/aorai/tests/ya/stack.i b/src/plugins/aorai/tests/ya/stack.i
new file mode 100644
index 0000000000000000000000000000000000000000..b3a734178295ace67bf450f577e757095db612b1
--- /dev/null
+++ b/src/plugins/aorai/tests/ya/stack.i
@@ -0,0 +1,31 @@
+/* run.config*
+   OPT: -aorai-automata @PTEST_DIR@/@PTEST_NAME@.ya -aorai-test 1 -load-module tests/Aorai_test.cmxs -aorai-test-number @PTEST_NUMBER@ @PROVE_OPTIONS@
+*/
+
+
+int g = 0;
+
+void push(void)
+{
+  g++;
+}
+
+void pop(void)
+{
+  //@ assert g > 0;
+  g--;
+}
+
+void main(void)
+{
+  push();
+  pop();
+  push();
+  push();
+  pop();
+  push();
+  push();
+  pop();
+  pop();
+  pop();
+}
diff --git a/src/plugins/aorai/tests/ya/stack.ya b/src/plugins/aorai/tests/ya/stack.ya
new file mode 100644
index 0000000000000000000000000000000000000000..56798730da835d2f9c1e44e291b962d0db7ec64d
--- /dev/null
+++ b/src/plugins/aorai/tests/ya/stack.ya
@@ -0,0 +1,30 @@
+%init: init;
+%accept: accept;
+%deterministic;
+
+$n : int;
+
+init:
+  { CALL(main) } $n := 0; -> empty_stack
+;
+
+empty_stack:
+  { RETURN(main) } -> accept
+| { CALL(push) } -> filling_stack
+;
+
+filling_stack:
+  { RETURN(push) } $n := $n + 1; -> filled_stack
+;
+
+filled_stack:
+  { CALL(push) } -> filling_stack
+| { CALL(pop) && $n > 0 } -> emptying_stack
+;
+
+emptying_stack:
+  { RETURN(pop) && $n > 1 } $n := $n - 1; -> filled_stack
+| { RETURN(pop) && $n == 1 } $n := $n - 1; -> empty_stack
+;
+
+accept: -> accept;
diff --git a/src/plugins/aorai/tests/ya/test_factorial.ya b/src/plugins/aorai/tests/ya/test_factorial.ya
index 40b7d74fdf4ec3848c29201687a4af06a7169ad9..5591fef945d20e12264d77820ad2616fbca7ffc8 100644
--- a/src/plugins/aorai/tests/ya/test_factorial.ya
+++ b/src/plugins/aorai/tests/ya/test_factorial.ya
@@ -5,7 +5,7 @@ main : { !CALL(factorial) } -> S1
      |                      -> S2
      ;
 S1   : { !CALL(factorial) } -> S1
-     | { 1 }                -> S2
+     | { true }                -> S2
      ;
 S2   : {!CALL(factorial) && COR(factorial) } -> S1
      | { COR(factorial) }                    -> S2
diff --git a/src/plugins/aorai/utils_parser.ml b/src/plugins/aorai/utils_parser.ml
index 0b45abd1249bf2903f1642eca21e6afb0945d75d..a07de0f812ba7c064666f9f8af42cf25cb9b8491 100644
--- a/src/plugins/aorai/utils_parser.ml
+++ b/src/plugins/aorai/utils_parser.ml
@@ -75,8 +75,8 @@ let get_new_offset my_host my_offset name=
              mc
            end
          in
-
-         let field_info = get_field_info_from_name my_comp.Cil_types.cfields name in
+         let cfields = Option.value ~default:[] my_comp.Cil_types.cfields in
+         let field_info = get_field_info_from_name cfields name in
          Cil_types.Field(field_info,Cil_types.NoOffset)
 
      | _ -> Aorai_option.fatal "NOT YET IMPLEMENTED : mem is not supported"
diff --git a/src/plugins/aorai/yalexer.mll b/src/plugins/aorai/yalexer.mll
index b6809baf2e0f74566fa9d51d6817ede1ba36f1a4..54a238bc93472fcd1af25d2b8457082aa8d4be8c 100644
--- a/src/plugins/aorai/yalexer.mll
+++ b/src/plugins/aorai/yalexer.mll
@@ -27,18 +27,13 @@
 {
     open Yaparser
     open Lexing
-    exception Eof
+    exception Lexing_error of string
 
     let new_line lexbuf =
       let lcp = lexbuf.lex_curr_p in
       lexbuf.lex_curr_p <- { lcp with pos_lnum = lcp.pos_lnum + 1;
                                       pos_bol  = lcp.pos_cnum; }
     ;;
-
-  exception Error of (Lexing.position * Lexing.position) * string
-  let loc lexbuf = (lexeme_start_p lexbuf, lexeme_end_p lexbuf)
-  let raise_located loc e = raise (Error (loc, e))
-
 }
 
 let num    = ['0'-'9']
@@ -59,6 +54,7 @@ rule token = parse
   | "false"           { FALSE }
   | "\\result" as lxm { IDENTIFIER(lxm) }
   | ident as lxm      { IDENTIFIER(lxm) }
+  | '$' (ident as lxm){ METAVAR(lxm) }
   | ','               { COMMA }
   | '+'               { PLUS }
   | '-'               { MINUS }
@@ -92,30 +88,7 @@ rule token = parse
   | '^'               { CARET }
   | '?'               { QUESTION }
   | eof               { EOF }
-  | _                 { raise_located (loc lexbuf) "Unknown token" }
-
-{
-  let parse c =
-    let lb = from_channel c in
-    try
-      Yaparser.main token lb
-    with
-        Parsing.Parse_error
-      | Invalid_argument _ ->
-          (* [VP]: Does not contain more information than
-             what is in the exn. *)
-          (*let (a,b)=(loc lb) in
-            Format.print_string "Syntax error (" ;
-            Format.print_string "l" ;
-            Format.print_int a.pos_lnum ;
-            Format.print_string "c" ;
-            Format.print_int (a.pos_cnum-a.pos_bol) ;
-            Format.print_string " -> l" ;
-            Format.print_int b.pos_lnum ;
-            Format.print_string "c" ;
-            Format.print_int (b.pos_cnum-b.pos_bol) ;
-            Format.print_string ")\n" ;
-           *)
-            raise_located (loc lb) "Syntax error"
-
-}
+  | ":="              { AFF }
+  | _                 {
+    raise (Lexing_error ("unexpected character '" ^ Lexing.lexeme lexbuf ^ "'"))
+  }
diff --git a/src/plugins/aorai/yaparser.mly b/src/plugins/aorai/yaparser.mly
index cbecc1a0c520961f4909372a77339fa8bbc4cdea..3a88ed02f8f6e646fb116fe4846ee366ea58e190 100644
--- a/src/plugins/aorai/yaparser.mly
+++ b/src/plugins/aorai/yaparser.mly
@@ -27,10 +27,13 @@
 
 /* Originated from http://www.ltl2dstar.de/down/ltl2dstar-0.4.2.zip  */
 %{
+open Cil_types
 open Logic_ptree
 open Promelaast
 open Bool3
 
+type options = Deterministic | Init of string list | Accept of string list
+
 let to_seq c =
   [{ condition = Some c;
      nested = [];
@@ -39,7 +42,7 @@ let to_seq c =
    }]
 
 let is_no_repet (min,max) =
-  let is_one c = Extlib.may_map Data_for_aorai.is_cst_one ~dft:false c in
+  let is_one c = Option.fold ~some:Data_for_aorai.is_cst_one ~none:false c in
   is_one min && is_one max
 
 let observed_states      = Hashtbl.create 1
@@ -50,118 +53,124 @@ let fetch_and_create_state name =
   try
     Hashtbl.find observed_states name
   with
-    Not_found -> 
+    Not_found ->
       let s = Data_for_aorai.new_state name in
       Hashtbl.add observed_states name s; s
 ;;
 
 let prefetch_and_create_state name =
-    if (Hashtbl.mem prefetched_states name) || 
-      not (Hashtbl.mem observed_states name) 
+    if (Hashtbl.mem prefetched_states name) ||
+      not (Hashtbl.mem observed_states name)
     then
       begin
-        let s= fetch_and_create_state name in 
+        let s= fetch_and_create_state name in
         Hashtbl.add prefetched_states name name;
         s
-      end 
+      end
     else
       (fetch_and_create_state name)
 ;;
 
+let set_init_state id =
+  try
+    let state = Hashtbl.find observed_states id in
+    state.init <- True
+  with Not_found ->
+    Aorai_option.abort "no state '%s'" id
+
+let set_accept_state id =
+  try
+    let state = Hashtbl.find observed_states id in
+    state.acceptation <- True
+  with Not_found ->
+    Aorai_option.abort "no state '%s'" id
+
+let add_metavariable map (name,typename) =
+  let ty = match typename with
+    | "int" -> TInt(IInt, [])
+    | "char" -> TInt(IChar, [])
+    | "long" -> TInt(ILong, [])
+    | _ ->
+      Aorai_option.abort "Unrecognized type %s for metavariable %s"
+        typename name
+  in
+  if Datatype.String.Map.mem name map then
+    Aorai_option.abort "The metavariable %s is declared twice" name;
+  let vi = Cil.makeGlobalVar (Data_for_aorai.get_fresh ("aorai_" ^ name)) ty in
+  Datatype.String.Map.add name vi map
+
+let check_state st =
+  if st.acceptation=Undefined || st.init=Undefined then
+   Aorai_option.abort
+    "Error: the state '%s' is used but never defined." st.name
+
+let interpret_option = function
+  | Init states ->
+    List.iter set_init_state states
+  | Accept states ->
+    List.iter set_accept_state states
+  | Deterministic ->
+    Aorai_option.Deterministic.set true
+
+let build_automaton options metavariables trans =
+  let htable_to_list table = Hashtbl.fold (fun _ st l -> st :: l) table [] in
+  let states = htable_to_list observed_states
+  and undefined_states = htable_to_list prefetched_states
+  and metavariables =
+    List.fold_left add_metavariable Datatype.String.Map.empty metavariables
+  in
+  List.iter interpret_option options;
+  List.iter check_state states;
+  if not (List.exists (fun st -> st.init=True) states) then
+    Aorai_option.abort "Automaton does not declare an initial state";
+  if undefined_states <> [] then
+    Aorai_option.abort "Error: the state(s) %a are used but never defined."
+      (Pretty_utils.pp_list ~sep:"," Format.pp_print_string) undefined_states;
+  { states; trans; metavariables }
+
+
 type pre_cond = Behavior of string | Pre of Promelaast.condition
 
+
 %}
 
 %token CALL_OF  RETURN_OF  CALLORRETURN_OF
 %token <string> IDENTIFIER
+%token <string> METAVAR
 %token <string> INT
+%token AFF
 %token LCURLY RCURLY LPAREN RPAREN LSQUARE RSQUARE LBRACELBRACE RBRACERBRACE
 %token RARROW
 %token TRUE FALSE
 %token NOT DOT AMP
-%token COLON SEMI_COLON COMMA PIPE CARET QUESTION COMMA COLUMNCOLUMN
+%token COLON SEMI_COLON COMMA PIPE CARET QUESTION COLUMNCOLUMN
 %token EQ LT GT LE GE NEQ PLUS MINUS SLASH STAR PERCENT OR AND
 %token OTHERWISE
 %token EOF
 
-%nonassoc highest
-%left LPAREN RPAREN
-%left LCURLY
-%right EQ LT GT LE GE NEQ PLUS MINUS SLASH STAR PERCENT OR AND
-/* [VP] priorities taken from cparser.mly */
-%left LSQUARE RSQUARE
-%left DOT
-%nonassoc NOT TRUE FALSE
-%nonassoc QUESTION
-%right SEMICOLON
-%nonassoc lowest
+%left STAR
+%left DOT RARROW
+%left LSQUARE
 
 %type <Promelaast.parsed_automaton> main
 %start main
 %%
 
-main
-  : options states {
-  List.iter
-    (fun(key, ids) ->
-       match key with
-           "init"   ->
-             List.iter
-               (fun id -> 
-                 try
-                   (Hashtbl.find observed_states id).init <- True
-                 with
-                     Not_found ->
-                       Aorai_option.abort "Error: no state '%s'\n" id)
-               ids
-         | "accept" ->
-             List.iter
-               (fun id -> try
-                  (Hashtbl.find observed_states id).acceptation <- True
-                with Not_found ->
-                  Aorai_option.abort "no state '%s'\n" id) ids
-         | "deterministic" -> Aorai_option.Deterministic.set true;
-         | oth      -> Aorai_option.abort "unknown option '%s'\n" oth
-    ) $1;
-    let states=
-      Hashtbl.fold
-        (fun _ st l ->
-           if st.acceptation=Undefined || st.init=Undefined then
-             begin
-               Aorai_option.abort
-                 "Error: the state '%s' is used but never defined.\n" st.name
-             end;
-           st::l)
-        observed_states []
-    in
-    (try
-       Hashtbl.iter 
-         (fun _ st -> if st.init=True then raise Exit) observed_states;
-       Aorai_option.abort "Automaton does not declare an initial state"
-     with Exit -> ());
-    if Hashtbl.length prefetched_states >0 then 
-      begin
-        let r = Hashtbl.fold
-          (fun s n _ -> 
-            s^"Error: the state '"^n^"' is used but never defined.\n")
-          prefetched_states 
-          ""
-        in
-        Aorai_option.abort "%s" r
-      end;
-    (states, $2)
-  }
-  ;
-
+main : options metavars states EOF { build_automaton $1 $2 $3 }
 
 options
-  : options option { $1@[$2] }
+  : options option { $1 @ [$2] }
   | option         { [$1] }
   ;
 
 option
-  : PERCENT IDENTIFIER opt_identifiers SEMI_COLON { ($2, $3) }
-  ;
+  : PERCENT IDENTIFIER opt_identifiers SEMI_COLON { 
+    match $2 with
+    | "init" -> Init $3
+    | "accept" -> Accept $3
+    | "deterministic" -> Deterministic
+    | _ ->  Aorai_option.abort "unknown option: '%s'" $2
+  }
 
 opt_identifiers
   : /* empty */ { [] }
@@ -169,10 +178,23 @@ opt_identifiers
   ;
 
 id_list
-  : id_list COMMA IDENTIFIER { $1@[$3] }
+  : id_list COMMA IDENTIFIER { $1 @ [$3] }
   | IDENTIFIER               { [$1] }
   ;
 
+metavars
+  : /* epsilon */      { [] }
+  | non_empty_metavars { $1 }
+
+non_empty_metavars
+  : non_empty_metavars metavar { $1 @ [$2] }
+  | metavar                    { [$1] }
+  ;
+
+metavar
+  : METAVAR COLON IDENTIFIER SEMI_COLON { $1,$3 }
+  ;
+
 states
   : states state { $1@$2 }
   | state { $1 }
@@ -183,7 +205,7 @@ state
       let start_state = fetch_and_create_state $1 in
       let (_, transitions) =
         List.fold_left
-          (fun (otherwise, transitions) (cross,stop_state) ->
+          (fun (otherwise, transitions) (cross,actions,stop_state) ->
             if otherwise then
               Aorai_option.abort
                 "'other' directive in definition of %s \
@@ -191,11 +213,11 @@ state
             else begin
               let trans =
                 { start=start_state; stop=stop_state;
-                  cross=cross;       numt=(-1) }::transitions
+                  cross; actions; numt=(-1) }::transitions
               in
-              let otherwise = 
-                match cross with 
-                  | Otherwise -> true 
+              let otherwise =
+                match cross with
+                  | Otherwise -> true
                   | Seq _ -> false
               in otherwise, trans
             end)
@@ -211,10 +233,12 @@ transitions  /*=>  [transition; ...] */
 
 
 transition:  /*=>  (guard, state) */
-  | LCURLY seq_elt RCURLY RARROW IDENTIFIER 
-      { (Seq $2, prefetch_and_create_state $5) }
-  | OTHERWISE RARROW IDENTIFIER {(Otherwise, prefetch_and_create_state $3) }
-  | RARROW IDENTIFIER { (Seq (to_seq PTrue), prefetch_and_create_state $2) }
+  | LCURLY seq_elt RCURLY actions RARROW IDENTIFIER
+      { (Seq $2, $4, prefetch_and_create_state $6) }
+  | OTHERWISE actions RARROW IDENTIFIER
+      { (Otherwise, $2, prefetch_and_create_state $4) }
+  | actions RARROW IDENTIFIER
+      { (Seq (to_seq PTrue), $1, prefetch_and_create_state $3) }
   ;
 
 non_empty_seq:
@@ -228,31 +252,30 @@ seq:
 ;
 
 guard:
-  | single_cond { to_seq $1 }
   | LSQUARE non_empty_seq RSQUARE { $2 }
   | IDENTIFIER pre_cond LPAREN seq RPAREN post_cond
-      { let pre_cond = 
+      { let pre_cond =
           match $2 with
             | Behavior b -> PCall($1,Some b)
             | Pre c -> PAnd (PCall($1,None), c)
         in
-        let post_cond = 
+        let post_cond =
           match $6 with
             | None -> PReturn $1
             | Some c -> PAnd (PReturn $1,c)
         in
-        (to_seq pre_cond) @ $4 @ to_seq post_cond 
+        (to_seq pre_cond) @ $4 @ to_seq post_cond
       }
   | IDENTIFIER LPAREN non_empty_seq RPAREN post_cond
-      { let post_cond = 
+      { let post_cond =
           match $5 with
             | None -> PReturn $1
             | Some c -> PAnd (PReturn $1,c)
         in
-        (to_seq (PCall ($1, None))) @ $3 @ to_seq post_cond 
+        (to_seq (PCall ($1, None))) @ $3 @ to_seq post_cond
       }
   | IDENTIFIER LPAREN RPAREN post_cond
-      { let post_cond = 
+      { let post_cond =
           match $4 with
             | None -> PReturn $1
             | Some c -> PAnd (PReturn $1,c)
@@ -263,15 +286,16 @@ guard:
 
 pre_cond:
   | COLUMNCOLUMN IDENTIFIER { Behavior $2 }
-  | LBRACELBRACE single_cond RBRACERBRACE { Pre $2 }
+  | LBRACELBRACE cond RBRACERBRACE { Pre $2 }
 ;
 
 post_cond:
   | /* epsilon */ { None }
-  | LBRACELBRACE single_cond RBRACERBRACE { Some $2 }
+  | LBRACELBRACE cond RBRACERBRACE { Some $2 }
 ;
 
 seq_elt:
+  | cond { to_seq $1 }
   | guard repetition {
     let min, max = $2 in
     match $1 with
@@ -280,12 +304,12 @@ seq_elt:
       | l ->
         if is_no_repet (min,max) then
           l (* [ a; [b;c]; d] is equivalent to [a;b;c;d] *)
-        else [ { condition = None; nested = l; min_rep = min; max_rep = max } ] 
+        else [ { condition = None; nested = l; min_rep = min; max_rep = max } ]
   }
 ;
 
 repetition:
-  | /* empty */ %prec highest
+  | /* empty */
       { Some Data_for_aorai.cst_one, Some Data_for_aorai.cst_one }
   | PLUS { Some Data_for_aorai.cst_one, None}
   | STAR { None, None }
@@ -295,17 +319,23 @@ repetition:
   | LCURLY arith_relation COMMA RCURLY { Some $2, None }
   | LCURLY COMMA arith_relation RCURLY { None, Some $3 }
 
-single_cond:
+cond:
+  | conjunction OR cond { POr ($1,$3) }
+  | conjunction { $1 }
+
+conjunction:
+  | atomic_cond AND conjunction { PAnd($1,$3) }
+  | atomic_cond { $1 }
+
+atomic_cond:
   | CALLORRETURN_OF  LPAREN IDENTIFIER RPAREN
       { POr (PCall ($3,None), PReturn $3) }
   | CALL_OF  LPAREN IDENTIFIER RPAREN { PCall ($3,None) }
   | RETURN_OF  LPAREN IDENTIFIER RPAREN { PReturn $3 }
   | TRUE { PTrue }
   | FALSE { PFalse }
-  | NOT single_cond { PNot $2 }
-  | single_cond AND single_cond { PAnd ($1,$3) }
-  | single_cond OR single_cond { POr ($1,$3) }
-  | LPAREN single_cond RPAREN { $2 }
+  | NOT atomic_cond { PNot $2 }
+  | LPAREN cond RPAREN { $2 }
   | logic_relation { $1 }
 ;
 
@@ -316,24 +346,24 @@ logic_relation
   | arith_relation LE arith_relation { PRel(Le, $1, $3) }
   | arith_relation GE arith_relation { PRel(Ge, $1, $3) }
   | arith_relation NEQ arith_relation { PRel(Neq, $1, $3) }
-  | arith_relation %prec TRUE { PRel (Neq, $1, PCst(IntConstant "0")) }
+/*  | arith_relation { PRel (Neq, $1, PCst(IntConstant "0")) } */
   ;
 
 arith_relation
   : arith_relation_mul PLUS arith_relation { PBinop(Badd,$1,$3) }
   | arith_relation_mul MINUS arith_relation { PBinop(Bsub,$1,$3) }
-  | arith_relation_mul %prec highest { $1 }
+  | arith_relation_mul { $1 }
   ;
 
 arith_relation_mul
-  : arith_relation_mul SLASH access_or_const { PBinop(Bdiv,$1,$3) }
-  | arith_relation_mul STAR access_or_const { PBinop(Bmul, $1, $3) }
-  | arith_relation_mul PERCENT access_or_const { PBinop(Bmod, $1, $3) }
-  | arith_relation_bw %prec highest { $1 }
+  : arith_relation_mul SLASH arith_relation_bw { PBinop(Bdiv,$1,$3) }
+  | arith_relation_mul STAR arith_relation_bw { PBinop(Bmul, $1, $3) }
+  | arith_relation_mul PERCENT arith_relation_bw { PBinop(Bmod, $1, $3) }
+  | arith_relation_bw { $1 }
   ;
 
 arith_relation_bw
-  : access_or_const %prec highest { $1 }
+  : access_or_const { $1 }
   | arith_relation_bw AMP access_or_const { PBinop(Bbw_and,$1,$3) }
   | arith_relation_bw PIPE access_or_const { PBinop(Bbw_or,$1,$3) }
   | arith_relation_bw CARET access_or_const { PBinop(Bbw_xor,$1,$3) }
@@ -342,13 +372,13 @@ arith_relation_bw
 access_or_const
   : INT { PCst (IntConstant $1) }
   | MINUS INT { PUnop (Uminus, PCst (IntConstant $2)) }
-  | access %prec TRUE { $1 }
-  | LPAREN arith_relation RPAREN { $2 }
+  | access { $1 }
   ;
 
 /* returns a lval */
 access
   : access DOT IDENTIFIER { PField($1,$3) }
+  | access RARROW IDENTIFIER { PField(PUnop(Ustar,$1),$3) }
   | access LSQUARE access_or_const RSQUARE { PArrget($1,$3) }
   | access_leaf     {$1}
   ;
@@ -357,5 +387,15 @@ access_leaf
   : STAR access { PUnop (Ustar,$2) }
   | IDENTIFIER LPAREN RPAREN DOT IDENTIFIER { PPrm($1,$5) }
   | IDENTIFIER { PVar $1 }
-  | LPAREN access RPAREN { $2 }
+  | LPAREN arith_relation RPAREN { $2 }
+  | METAVAR { PMetavar $1 }
+  ;
+
+actions
+  : /* epsilon */                   { [] }
+  | action actions { $1 :: $2 }
+  ;
+
+action
+  : METAVAR AFF arith_relation SEMI_COLON { Metavar_assign ($1, $3) }
   ;
diff --git a/src/plugins/callgraph/cg.ml b/src/plugins/callgraph/cg.ml
index 36c3434ae1d7c3dc0cefaa377c56291fda6d6ee8..57bfa6b1fb80c79f4800df286fcfe6f84bd0cab3 100644
--- a/src/plugins/callgraph/cg.ml
+++ b/src/plugins/callgraph/cg.ml
@@ -133,7 +133,7 @@ let syntactic_compute g =
 
     (* add defined functions into the graph *)
     method !vfunc _f =
-      G.add_vertex g (Extlib.the self#current_kf);
+      G.add_vertex g (Option.get self#current_kf);
       Cil.DoChildren
 
     (* add edges from callers to callees into the graph *)
@@ -144,17 +144,17 @@ let syntactic_compute g =
         try Globals.Functions.get vi
         with Not_found -> assert false
       in
-      let caller = Extlib.the self#current_kf in
-      G.add_edge_e g (caller, Extlib.the self#current_stmt, callee);
+      let caller = Option.get self#current_kf in
+      G.add_edge_e g (caller, Option.get self#current_stmt, callee);
       Cil.SkipChildren
     | Call _ ->
       (* call via a function pointer: add an edge from each function which
          the address is taken to this callee. *)
       let pointed = get_pointed_kfs () in
-      let caller = Extlib.the self#current_kf in
+      let caller = Option.get self#current_kf in
       List.iter
         (fun callee ->
-          G.add_edge_e g (caller, Extlib.the self#current_stmt, callee))
+          G.add_edge_e g (caller, Option.get self#current_stmt, callee))
         pointed;
       Cil.SkipChildren
     | Local_init (_,ConsInit(v,_,_),_) ->
@@ -162,8 +162,8 @@ let syntactic_compute g =
         try Globals.Functions.get v
         with Not_found -> assert false
       in
-      let caller = Extlib.the self#current_kf in
-      G.add_edge_e g (caller, Extlib.the self#current_stmt, callee);
+      let caller = Option.get self#current_kf in
+      G.add_edge_e g (caller, Option.get self#current_stmt, callee);
       Cil.SkipChildren
     | Local_init (_, AssignInit _, _) | Set _
     | Skip _ | Asm _ | Code_annot _  ->
diff --git a/src/plugins/callgraph/cg_viewer.ml b/src/plugins/callgraph/cg_viewer.ml
index 2d314d42fa52d7076b11bc8ce746d6a5be8ed1cc..d29b123e0cbc76b13a5a75ad2b2a69ef1897c008 100644
--- a/src/plugins/callgraph/cg_viewer.ml
+++ b/src/plugins/callgraph/cg_viewer.ml
@@ -20,7 +20,7 @@
 (*                                                                        *)
 (**************************************************************************)
 
-open Dgraph
+open DGRAPH_MODULE
 
 let ($) f x = f x
 
diff --git a/src/plugins/constant_propagation/api.ml b/src/plugins/constant_propagation/api.ml
index 0323cce6722f3d18ad63a52e4529995a391c6452..ab3fa392e9d2b53efb783f0f8661a9a69802a50d 100644
--- a/src/plugins/constant_propagation/api.ml
+++ b/src/plugins/constant_propagation/api.ml
@@ -144,8 +144,8 @@ class propagate project fnames ~cast_intro = object(self)
         &&
         (* (2) [vi] is bound in this function *)
         (vi.vglob ||
-         Extlib.may_map
-           (Kernel_function.is_formal_or_local vi) ~dft:false
+         Option.fold
+           ~some:(Kernel_function.is_formal_or_local vi) ~none:false
            self#current_kf)
       in
       let change_to = match b with
diff --git a/src/plugins/dive/build.ml b/src/plugins/dive/build.ml
index 13f3bcbc5251638fb3fe846bf0642ca4825ce013..03f14617e46e368c6765897f96219deb88b58b03 100644
--- a/src/plugins/dive/build.ml
+++ b/src/plugins/dive/build.ml
@@ -62,7 +62,7 @@ struct
     | Is_nan (e,_) | Function_pointer (e,_) | Invalid_pointer e ->
       from_exp f e
     | Pointer_comparison (opt_e1,e2) ->
-      Extlib.may (from_exp f) opt_e1;
+      Option.iter (from_exp f) opt_e1;
       from_exp f e2
     | Differing_blocks (e1,e2) ->
       from_exp f e1; from_exp f e2
@@ -339,7 +339,7 @@ let build_node_writes context node =
     match Node_kind.get_base node.node_kind with
     (* TODO refine formal dependency computation for non-scalar formals *)
     | Some vi when vi.vformal ->
-      let kf = Extlib.the (Kernel_function.find_defining_kf vi) in
+      let kf = Option.get (Kernel_function.find_defining_kf vi) in
       let pos = Kernel_function.get_formal_position vi kf in
       let callsites =
         match Callstack.pop callstack with
@@ -367,6 +367,7 @@ let build_node_writes context node =
     | {skind = Return (Some {enode = Lval lval_res},_)} as return_stmt ->
       let callstack = Callstack.push (kf,stmt) callstack in
       build_lval_deps callstack return_stmt Data lval_res
+    | {skind = Return (None, _)} -> () (* return void *)
     | _ -> assert false (* Cil invariant *)
     | exception Kernel_function.No_Statement ->
       (* the function is only a prototype *)
@@ -613,7 +614,7 @@ let add_alarm context stmt alarm =
 
 let add_annotation context stmt annot =
   (* Only do something for alarms notations *)
-  Extlib.opt_map (add_alarm context stmt) (Alarms.find annot)
+  Option.map (add_alarm context stmt) (Alarms.find annot)
 
 let add_instr context stmt = function
   | Set (lval, _, _)
diff --git a/src/plugins/dive/dive_graph.ml b/src/plugins/dive/dive_graph.ml
index 32aff4d9971cfeeb831a7c85e699e3d29e6c7723..3c4221fd2afe1d354106abbdb4e281a1e552e771 100644
--- a/src/plugins/dive/dive_graph.ml
+++ b/src/plugins/dive/dive_graph.ml
@@ -194,7 +194,7 @@ let ouptput_to_dot out_channel g =
       Some {
         sg_name = "cs_" ^ (string_of_int !callstack_counter);
         sg_attributes = [build_label (Kernel_function.get_name kf)];
-        sg_parent = Extlib.opt_map (fun sg -> sg.sg_name) parent;
+        sg_parent = Option.map (fun sg -> sg.sg_name) parent;
       }
   and get_file_subgraph filename =
     FileTable.memo file_table filename build_file_subgraph
diff --git a/src/plugins/dive/node_kind.ml b/src/plugins/dive/node_kind.ml
index b52dd75817443a29118981186e3396a1b9db6304..20fd1656ee2d13e4954a0465476855e110dbcfaa 100644
--- a/src/plugins/dive/node_kind.ml
+++ b/src/plugins/dive/node_kind.ml
@@ -122,7 +122,7 @@ let to_lval = function
 
 let pretty fmt = function
   | (Scalar _ | Composite _ | Scattered _ | Unknown _) as kind ->
-    Cil_printer.pp_lval fmt (Extlib.the (to_lval kind))
+    Cil_printer.pp_lval fmt (Option.get (to_lval kind))
   | Alarm (_stmt,alarm) ->
     Cil_printer.pp_predicate fmt (Alarms.create_predicate alarm)
   | AbsoluteMemory ->
diff --git a/src/plugins/dive/server_interface.ml b/src/plugins/dive/server_interface.ml
index b428aa3c26a5505067728761cf476339de4d3d6e..7d2efc4861d4abbbff5f8d286f2798c288d75d3c 100644
--- a/src/plugins/dive/server_interface.ml
+++ b/src/plugins/dive/server_interface.ml
@@ -262,13 +262,13 @@ let finalize' context node_opt =
     | None -> ()
     | Some node ->
       let may_explore f =
-        Extlib.may (fun depth -> f ~depth context node)
+        Option.iter (fun depth -> f ~depth context node)
       in
       may_explore Build.explore_backward !global_window.perception.backward;
       may_explore Build.explore_forward !global_window.perception.forward;
       let horizon = !global_window.horizon in
-      if Extlib.has_some horizon.forward ||
-         Extlib.has_some horizon.backward
+      if Option.is_some horizon.forward ||
+         Option.is_some horizon.backward
       then
         Build.reduce_to_horizon context horizon node
   end;
diff --git a/src/plugins/dive/tests/dive/exceptional.i b/src/plugins/dive/tests/dive/exceptional.i
index c65084f9539f908baf2ac70c605ddfe4efa437d1..62791ed36e0e5d3293f1cbd97cb62eb17ac3145b 100644
--- a/src/plugins/dive/tests/dive/exceptional.i
+++ b/src/plugins/dive/tests/dive/exceptional.i
@@ -1,5 +1,5 @@
 /* run.config
-STDOPT: +"-absolute-valid-range 0x10000000-0x1fffffff -dive-from-variables main::__retres -dive-depth-limit 5"
+STDOPT: #"-machdep x86_32" +"-absolute-valid-range 0x10000000-0x1fffffff -dive-from-variables main::__retres -dive-depth-limit 5"
 */
 
 int* gm(int *p) { return (int *) ((unsigned int) p * 2 / 2); }
diff --git a/src/plugins/dive/tests/dive/manydeps.i b/src/plugins/dive/tests/dive/manydeps.i
index 490bd245b01308bb5541fd21021e61eed13c5e92..a9402cce8dfa64dcfaaf65f3cac523b293e6187b 100644
--- a/src/plugins/dive/tests/dive/manydeps.i
+++ b/src/plugins/dive/tests/dive/manydeps.i
@@ -2,13 +2,13 @@
 STDOPT: +"-dive-from-variables many_values::__retres,many_writes::x"
 */
 
-int t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14;
-int *pt[14] = {
-  &t1, &t2, &t3, &t4, &t5, &t6, &t7, &t8, &t9, &t10, &t11, &t12, &t13, &t14
-};
-
 int many_values(int x)
 {
+  int t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0, t8 = 0, t9 = 0, t10 = 0, t11 = 0, t12 = 0, t13 = 0, t14 = 0;
+  int *pt[14] = {
+    &t1, &t2, &t3, &t4, &t5, &t6, &t7, &t8, &t9, &t10, &t11, &t12, &t13, &t14
+  };
+  
   if (x >= 0 && x < 14)
     return *pt[x];
   else
@@ -17,6 +17,8 @@ int many_values(int x)
 
 int many_writes()
 {
+  int t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0, t8 = 0, t9 = 0, t10 = 0, t11 = 0, t12 = 0, t13 = 0, t14 = 0;
+
   int x = 0;
   x += t1;
   x += t2;
diff --git a/src/plugins/dive/tests/dive/oracle/manydeps.dot b/src/plugins/dive/tests/dive/oracle/manydeps.dot
index 88e1b23c12dd0692aca2aca454387139eeec13d9..90a8124631ff921f59bdd6cc81ff903c1fa9a842 100644
--- a/src/plugins/dive/tests/dive/oracle/manydeps.dot
+++ b/src/plugins/dive/tests/dive/oracle/manydeps.dot
@@ -25,12 +25,10 @@ digraph G {
   cp25 [label=<*(pt[x])>, shape=parallelogram, fillcolor="#AACCFF",
         color="#88AAFF", style="filled,dotted", ];
   
-  subgraph cluster_cs_1 { label=<many_writes>; cp2;
+  subgraph cluster_cs_1 { label=<many_writes>; cp22;cp20;cp18;cp16;cp14;cp12;cp10;cp8;cp6;cp4;cp2;
      };
   subgraph cluster_cs_2 { label=<many_values>; cp25;cp24;
      };
-  subgraph cluster_file_1 { label=<tests/dive/manydeps.i>; cp22;cp20;cp18;cp16;cp14;cp12;cp10;cp8;cp6;cp4;
-     };
   
   cp2 -> cp2 [style="bold", ];
   cp4 -> cp2;
diff --git a/src/plugins/dive/tests/dive/oracle/manydeps.res.oracle b/src/plugins/dive/tests/dive/oracle/manydeps.res.oracle
index 8ebe4f5b2d5bf17ce63248987b6847813f309718..b578ee20c8091806ebc8df0b0e4d349b7431681a 100644
--- a/src/plugins/dive/tests/dive/oracle/manydeps.res.oracle
+++ b/src/plugins/dive/tests/dive/oracle/manydeps.res.oracle
@@ -6,7 +6,7 @@
 [eva:summary] ====== ANALYSIS SUMMARY ======
   ----------------------------------------------------------------------------
   3 functions analyzed (out of 3): 100% coverage.
-  In these functions, 32 statements reached (out of 32): 100% coverage.
+  In these functions, 61 statements reached (out of 61): 100% coverage.
   ----------------------------------------------------------------------------
   No errors or warnings raised during the analysis.
   ----------------------------------------------------------------------------
diff --git a/src/plugins/e-acsl/Makefile.in b/src/plugins/e-acsl/Makefile.in
index 65408186eef27164c5d7e5f98f0d6297d33c74e4..cdf795b172ca4a20b047f8b8e7ffaf7abed40ceb 100644
--- a/src/plugins/e-acsl/Makefile.in
+++ b/src/plugins/e-acsl/Makefile.in
@@ -29,6 +29,9 @@
 ifndef FRAMAC_SHARE
 FRAMAC_SHARE  :=$(shell frama-c-config -print-share-path)
 endif
+ifndef FRAMAC_LIBDIR
+FRAMAC_LIBDIR :=$(shell frama-c-config -print-libpath)
+endif
 
 ###################
 # Plug-in sources #
@@ -41,6 +44,7 @@ SRC_LIBRARIES:= \
 	functions \
 	misc \
 	gmp_types \
+	logic_aggr \
 	varname
 SRC_LIBRARIES:=$(addprefix src/libraries/, $(SRC_LIBRARIES))
 
@@ -240,9 +244,13 @@ TEST_DEPENDENCIES:= \
 	$(EACSL_PLUGIN_DIR)/tests/ptests_config \
 	$(EACSL_PLUGIN_DIR)/tests/test_config_ci \
 	$(EACSL_PLUGIN_DIR)/tests/test_config_dev \
-	$(EACSL_PLUGIN_DIR)/tests/print.cmxs \
 	$(EACSL_PLUGIN_DIR)/tests/print.cmo
 
+ifeq ($(OCAMLBEST),opt)
+TEST_DEPENDENCIES += \
+	$(EACSL_PLUGIN_DIR)/tests/print.cmxs
+endif
+
 # Add the test dependencies to the test targets, but also to
 # `plugins_ptests_config` so that they are built along with the main target.
 plugins_ptests_config: $(TEST_DEPENDENCIES)
@@ -289,6 +297,7 @@ EACSL_DLMALLOC_LIBNAME = libeacsl-dlmalloc.a
 EACSL_DLMALLOC_LIB = $(EACSL_LIBDIR)/$(EACSL_DLMALLOC_LIBNAME)
 EACSL_DLMALLOC_SRC = $(EACSL_DLMALLOC_DIR)/dlmalloc.c
 EACSL_DLMALLOC_OBJ  = dlmalloc.o
+# Don't forget to update "e-acsl-gcc.sh" if the flags are updated
 EACSL_DLMALLOC_FLAGS = \
   -DHAVE_MORECORE=0 \
   -DHAVE_MMAP=1  \
@@ -327,6 +336,27 @@ e-acsl-distclean: clean
 	$(PRINT_RM) generated project files
 	$(RM) $(wildcard $(addprefix $(E_ACSL_DIR)/, $(EACSL_CLEANFILES)))
 
+#################################################################
+# Common variables between source distribution and installation #
+#################################################################
+
+EACSL_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
+
+EACSL_SCRIPTS := \
+	scripts/e-acsl-gcc.sh
+
+EACSL_MANPAGES := \
+	man/e-acsl-gcc.sh.1
+
 ################################
 # Building source distribution #
 ################################
@@ -334,12 +364,10 @@ e-acsl-distclean: clean
 EACSL_CONTRIB_FILES = \
   $(EACSL_DLMALLOC_REL_DIR)/dlmalloc.c
 
-EACSL_MANUAL_FILES = doc/manuals/*.pdf
-
 EACSL_DOC_FILES = \
 	doc/doxygen/doxygen.cfg.in \
 	doc/Changelog \
-	man/e-acsl-gcc.sh.1
+	$(EACSL_MANPAGES)
 
 EACSL_TEST_FILES = \
 	tests/test_config_dev.in \
@@ -360,23 +388,25 @@ EACSL_TEST_FILES = \
 EACSL_DISTRIB_TESTS = \
   $(foreach dir, $(addprefix tests/,$(PLUGIN_TESTS_DIRS)), \
       $(dir)/*.[ich] \
-      $(dir)/test_config \
-      $(dir)/oracle_ci/*.c \
-      $(dir)/oracle_ci/*.oracle \
+      $(dir)/test_config_ci \
+      $(dir)/test_config_dev \
+      $(dir)/oracle_ci/* \
+      $(dir)/oracle_dev/* \
   )
 
 EACSL_RTL_FILES = $(EACSL_RTL_SRC)
 
-EACSL_SCRIPT_FILES = scripts/e-acsl-gcc.sh
+EACSL_SCRIPT_FILES = $(EACSL_SCRIPTS)
 
 EACSL_LICENSE_FILES = \
   license/CEA_LGPL license/SPARETIMELABS \
   license/headache_config.txt license/LGPLv2.1
 
 EACSL_MISC_FILES = \
-  configure.ac Makefile.in INSTALL README
+  configure.ac Makefile.in README
 
-EACSL_SHARE_FILES = share/e-acsl/*.[ch] share/e-acsl/*/*.[ch]
+EACSL_SHARE_FILES = \
+	$(addprefix share/,$(addsuffix /*.[ch],$(EACSL_C_DIRECTORIES)))
 
 EACSL_DISTRIB_EXTERNAL =\
   $(EACSL_DISTRIB_DYNDEP) \
@@ -412,9 +442,12 @@ wc:
 
 ifneq ("$(FRAMAC_INTERNAL)","yes")
 
-EACSL_SPARETIMELABS=$(EACSL_PLUGIN_DIR)/share/e-acsl/e_acsl_printf.h
+EACSL_SPARETIMELABS= \
+	$(EACSL_PLUGIN_DIR)/share/e-acsl/internals/e_acsl_rtl_io.h \
+	$(EACSL_PLUGIN_DIR)/share/e-acsl/internals/e_acsl_rtl_io.c
 
-EACSL_SHARE_BARE= share/e-acsl/*.[ch] share/e-acsl/*/*.[ch]
+EACSL_SHARE_BARE= \
+	$(addprefix share/,$(addsuffix /*.[ch],$(EACSL_C_DIRECTORIES)))
 EACSL_SHARE=$(addprefix $(EACSL_PLUGIN_DIR)/, $(EACSL_SHARE_BARE))
 EACSL_CEA_SHARE=$(filter-out $(EACSL_SPARETIMELABS), $(wildcard $(EACSL_SHARE)))
 
@@ -453,53 +486,46 @@ include $(FRAMAC_SHARE)/Makefile.dynamic
 # Install #
 ###########
 
-EACSL_INSTALL_MANUAL_FILES=$(wildcard $(addprefix $(EACSL_PLUGIN_DIR)/, $(EACSL_MANUAL_FILES)))
+EACSL_INSTALL_SCRIPTS=$(addprefix $(E_ACSL_DIR)/,$(EACSL_SCRIPTS))
 
-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
+EACSL_INSTALL_MANPAGES=$(addprefix $(E_ACSL_DIR)/,$(EACSL_MANPAGES))
+
+EACSL_INSTALL_LIB_DIR :=$(FRAMAC_LIBDIR)/e-acsl
+
+EACSL_INSTALL_CONTRIB_DIR :=$(FRAMAC_DATADIR)/e-acsl/contrib
 
-install::
+install:: clean-install
 	$(PRINT_INSTALL) E-ACSL share files
-	for dir in $(EACSL_INSTALL_C_DIRECTORIES); do \
+	for dir in $(EACSL_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
-	$(CP) $(EACSL_INSTALL_MANUAL_FILES) $(FRAMAC_DATADIR)/manuals;
-endif
 	$(PRINT_INSTALL) E-ACSL libraries
-	$(MKDIR) $(LIBDIR)
-	$(CP) $(EACSL_LIBDIR)/libeacsl-*.a $(LIBDIR)
+	$(MKDIR) $(EACSL_INSTALL_LIB_DIR)
+	$(CP) $(EACSL_LIBDIR)/libeacsl-*.a $(EACSL_INSTALL_LIB_DIR)
+	$(MKDIR) $(EACSL_INSTALL_CONTRIB_DIR)/libdlmalloc
+	$(CP) $(EACSL_DLMALLOC_SRC) $(EACSL_INSTALL_CONTRIB_DIR)/libdlmalloc
 	$(PRINT_INSTALL) E-ACSL scripts
 	$(MKDIR) $(BINDIR)
-	$(CP) $(E_ACSL_DIR)/scripts/e-acsl-gcc.sh $(BINDIR)/
+	$(CP) $(EACSL_INSTALL_SCRIPTS) $(BINDIR)/
 	$(PRINT_INSTALL) E-ACSL man pages
 	$(MKDIR) $(MANDIR)/man1
-	$(CP) $(E_ACSL_DIR)/man/e-acsl-gcc.sh.1 $(MANDIR)/man1/
+	$(CP) $(EACSL_INSTALL_MANPAGES) $(MANDIR)/man1/
+
+
+EACSL_INSTALLED_SCRIPTS=$(addprefix $(BINDIR)/,$(notdir $(EACSL_SCRIPTS)))
+
+EACSL_INSTALLED_MANPAGES=$(addprefix $(MANDIR)/man1/,$(notdir $(EACSL_MANPAGES)))
 
 uninstall::
 	$(PRINT_RM) E-ACSL share files
 	$(RM) -r $(FRAMAC_DATADIR)/e-acsl
-	$(PRINT_RM) E-ACSL manuals
-	$(RM) $(FRAMAC_DATADIR)/manuals/*.pdf
 	$(PRINT_RM) E-ACSL libraries
-	$(RM) $(LIBDIR)/libeacsl-*.a
+	$(RM) -r $(EACSL_INSTALL_LIB_DIR)
 	$(PRINT_RM) E-ACSL scripts
-	$(RM) $(BINDIR)/e-acsl-gcc.sh
+	$(RM) $(EACSL_INSTALLED_SCRIPTS)
 	$(PRINT_RM) E-ACSL man pages
-	$(RM) $(MANDIR)/man1/e-acsl-gcc.sh.1
+	$(RM) $(EACSL_INSTALLED_MANPAGES)
 
 #####################################
 # Regenerating the Makefile on need #
diff --git a/src/plugins/e-acsl/contrib/libdlmalloc/dlmalloc.c b/src/plugins/e-acsl/contrib/libdlmalloc/dlmalloc.c
index be59fec25029ee982890a09a45d3aa4c268d56a4..1e7d5016f843628504740cf187156ff9d0cf120d 100644
--- a/src/plugins/e-acsl/contrib/libdlmalloc/dlmalloc.c
+++ b/src/plugins/e-acsl/contrib/libdlmalloc/dlmalloc.c
@@ -797,7 +797,17 @@ struct mallinfo {
   Try to persuade compilers to inline. The most critical functions for
   inlining are defined as macros, so these aren't used for them.
 */
-
+// MinGW defines `FORCEINLINE` as `__forceinline`, and defines `__forceinline`
+// with an "extern" storage class. Since the macro `FORCEINLINE` is used here
+// on `static` function, a compilation error occurs because `static` and
+// `extern` cannot be used at the same time.
+// This implementation "problem" is known to the MinGW team but is explicitely
+// marked as "won't fix": https://sourceforge.net/p/mingw-w64/bugs/269/
+// So the workaround here is to `undef FORCEINLINE` if the file is being
+// compiled by MinGW.
+#ifdef __MINGW32__ // defined for 32 bits and 64 bits MinGW
+#undef FORCEINLINE
+#endif
 #ifndef FORCEINLINE
   #if defined(__GNUC__)
 #define FORCEINLINE __inline __attribute__ ((always_inline))
diff --git a/src/plugins/e-acsl/doc/Changelog b/src/plugins/e-acsl/doc/Changelog
index 16021662988a299c7af23cf63345da8266f85b47..00529a3b01a58ef84ad700cb2328664aa05fb664 100644
--- a/src/plugins/e-acsl/doc/Changelog
+++ b/src/plugins/e-acsl/doc/Changelog
@@ -25,6 +25,21 @@
 Plugin E-ACSL <next-release>
 ############################
 
+-* E-ACSL       [2021-01-12] Fix crash when comparing two structs, which is
+                currently unsupported (frama-c/e-acsl#139).
+-* Makefile     [2021-01-05] Fix dependencies in bytecode-only compilation.
+-  E-ACSL       [2020-12-09] Add RTL support for Windows.
+-  E-ACSL       [2020-11-17] Update e-acsl-gcc.sh so that the library dlmalloc
+                can be compiled and used from sources.
+
+#############################
+Plugin E-ACSL 22.0 (Titanium)
+#############################
+
+-* E-ACSL       [2020-11-16] Fix soundness bug when checking
+                initialization of a chunk of heap memory block.
+-  E-ACSL       [2020-10-14] Add Support for Variadic generated functions in
+                the AST (frama-c/e-acsl#128).
 -  E-ACSL       [2020-10-06] Add support for the `\separated` predicate.
                 (frama-c/e-acsl#31)
 -* E-ACSL       [2020-10-06] Fix a soundness bug when translating a range with a
diff --git a/src/plugins/e-acsl/doc/Makefile.common b/src/plugins/e-acsl/doc/Makefile.common
index 98ee1d0d781dd6339e17776ef4d08bca27c3c2e8..401488851dffe90acdef46c2121e429d115d41c2 100644
--- a/src/plugins/e-acsl/doc/Makefile.common
+++ b/src/plugins/e-acsl/doc/Makefile.common
@@ -1,7 +1,9 @@
 # Common makefile for both refman and userman
 
 VERSION_FILE=$(wildcard ../../../../../VERSION)
+CODENAME_FILE=$(wildcard ../../../../../VERSION_CODENAME)
 EACSL_VERSION=$(shell cat $(VERSION_FILE))
+EACSL_CODENAME=$(shell cat $(CODENAME_FILE))
 FC_VERSION=$(shell cat $(VERSION_FILE))
 
 include $(EACSL_DIR)/doc/support/MakeLaTeXModern
@@ -10,9 +12,10 @@ include $(EACSL_DIR)/doc/support/MakeLaTeXModern
 # Generic rules #
 #################
 
-eacslversion.tex: Makefile $(VERSION_FILE)
+eacslversion.tex: Makefile $(VERSION_FILE) $(CODENAME_FILE)
 	rm -f $@
 	printf '\\newcommand{\\eacslpluginversion}{$(EACSL_VERSION)\\xspace}\n' > $@
+	printf '\\newcommand{\\eacslplugincodename}{$(EACSL_CODENAME)\\xspace}\n' >> $@
 	printf '\\newcommand{\\fcversion}{$(FC_VERSION)\\xspace}\n' >> $@
 	chmod a-w $@
 
diff --git a/src/plugins/e-acsl/doc/refman/.gitignore b/src/plugins/e-acsl/doc/refman/.gitignore
index 2c2b06ea7119f0233f24735f396c4f9bf3f4bd1c..b4014d512227c85fcc1877d8a66393172faeb8b8 100644
--- a/src/plugins/e-acsl/doc/refman/.gitignore
+++ b/src/plugins/e-acsl/doc/refman/.gitignore
@@ -1,3 +1,8 @@
+frama-c-book.cls
+frama-c-cover.pdf
+frama-c-left.pdf
+frama-c-right.pdf
+frama-c-affiliation.tex
 e-acsl.pdf
 e-acsl-implementation.pdf
 eacslversion.tex
diff --git a/src/plugins/e-acsl/doc/refman/Makefile b/src/plugins/e-acsl/doc/refman/Makefile
index 43227e2983888961de1886a8fff14b27601199ce..c71c70b01f0fbbc9d34312330f1a015a144a3c29 100644
--- a/src/plugins/e-acsl/doc/refman/Makefile
+++ b/src/plugins/e-acsl/doc/refman/Makefile
@@ -27,13 +27,13 @@ DEPS_MODERN=macros_modern.tex eacslversion.tex biblio.bib \
 e-acsl: e-acsl-implementation.pdf e-acsl.pdf
 all: e-acsl
 
-e-acsl-implementation.pdf: $(DEPS_MODERN)
+e-acsl-implementation.pdf: $(DEPS_MODERN) $(FRAMAC_MODERN)
 e-acsl-implementation.tex: $(MAIN).tex Makefile
 	rm -f $@
 	sed -e '/PrintRemarks/s/%--//' $^ > $@
 	chmod a-w $@
 
-e-acsl.pdf: $(DEPS_MODERN)
+e-acsl.pdf: $(DEPS_MODERN) $(FRAMAC_MODERN)
 e-acsl.tex: e-acsl-implementation.tex Makefile
 	rm -f $@
 	sed -e '/PrintImplementationRq/s/%--//' \
@@ -43,13 +43,6 @@ e-acsl.tex: e-acsl-implementation.tex Makefile
 
 $(MAIN).pdf: $(DEPS_MODERN)
 
-DISTRIB_DIR=$(HOME)/frama-c/doc/www/distrib
-install: e-acsl-implementation.pdf e-acsl.pdf
-	mkdir -p $(EACSL_DIR)/doc/manuals
-	cp -f $^ $(EACSL_DIR)/doc/manuals
-
-include $(EACSL_DIR)/doc/support/MakeLaTeXModern
-
 .PHONY: clean
 clean:
 	rm -rf *~ *.aux *.log *.nav *.out *.snm *.toc *.lof *.pp *.bnf \
diff --git a/src/plugins/e-acsl/doc/refman/assertions.tex b/src/plugins/e-acsl/doc/refman/assertions.tex
index cb6a92931a6f11881d2ebff24922c092a30b9a95..9758d44bec67f2d6e22fe5c76d87e16ef81ce862 100644
--- a/src/plugins/e-acsl/doc/refman/assertions.tex
+++ b/src/plugins/e-acsl/doc/refman/assertions.tex
@@ -2,7 +2,7 @@
   C-compound-statement ::= "{" declaration* statement* assertion+ "}"
         \
   C-statement ::= assertion statement \
-  assertion-kind ::= "assert" | "check" \
+  assertion-kind ::= "assert" | clause-kind \
   assertion ::= "/*@" assertion-kind pred ";" "*/" ;
   | { "/*@" "for" id ("," id)* ":" assertion-kind pred ";" "*/" } ;
 \end{syntax}
diff --git a/src/plugins/e-acsl/doc/refman/biblio.bib b/src/plugins/e-acsl/doc/refman/biblio.bib
index ee79515d0c24ac9af512b4ecbd5f71a88be3ac1f..bb7f2f66e7fdac2a5da6eec09708123e29088bd1 100644
--- a/src/plugins/e-acsl/doc/refman/biblio.bib
+++ b/src/plugins/e-acsl/doc/refman/biblio.bib
@@ -2,82 +2,82 @@
 
 @STRING{LNCS = {Lecture Notes in Computer Science}}
 
-@INPROCEEDINGS{jml,
-  author = {Gary T. Leavens and K. Rustan M. Leino and Erik Poll
+@inproceedings{jml,
+  author    = {Gary T. Leavens and K. Rustan M. Leino and Erik Poll
                  and Clyde Ruby and Bart Jacobs},
-  title = {{JML}: notations and tools supporting detailed design in {Java}},
+  title     = {{JML}: notations and tools supporting detailed design in {Java}},
   booktitle = {{OOPSLA} 2000 Companion, Minneapolis, Minnesota},
-  pages = {105--106},
-  year = 2000
+  pages     = {105--106},
+  year      = 2000,
 }
 
-@INPROCEEDINGS{chalin07,
-  author = {Patrice Chalin},
-  title = {A Sound Assertion Semantics for the Dependable Systems Evolution
+@inproceedings{chalin07,
+  author    = {Patrice Chalin},
+  title     = {A Sound Assertion Semantics for the Dependable Systems Evolution
                   Verifying Compiler},
   booktitle = {Proceedings of the International Conference on Software
                   Engineering (ICSE'07)},
-  pages = {23-33},
-  year = 2007,
-  address = {Los Alamitos, CA, USA},
-  publisher = {IEEE Computer Society}
+  pages     = {23-33},
+  year      = 2007,
+  address   = {Los Alamitos, CA, USA},
+  publisher = {IEEE Computer Society},
 }
 
-@INPROCEEDINGS{chalin05,
-  author = {Patrice Chalin},
-  title = {Reassessing {JML}'s Logical Foundation},
+@inproceedings{chalin05,
+  author    = {Patrice Chalin},
+  title     = {Reassessing {JML}'s Logical Foundation},
   booktitle = {Proceedings of the 7th Workshop on Formal Techniques for
                   Java-like Programs (FTfJP'05)},
-  year = 2005,
-  address = {Glasgow, Scotland},
-  month = JUL
+  year      = 2005,
+  address   = {Glasgow, Scotland},
+  month     = JUL,
 }
 
 @manual{acsl,
-  title = {{ACSL, ANSI/ISO C Specification Language}},
-  author = {Patrick Baudin and Pascal Cuoq and Jean-Christophe Filliâtre and 
-  Claude Marché and Benjamin Monate and Yannick Moy and Virgile Prevosto},
-  note = {Vesion 1.12. \url{http://frama-c.com/acsl.html}},
+  title  = {{ACSL, ANSI/ISO C Specification Language}},
+  author = {Patrick Baudin and Pascal Cuoq and Jean-Christophe Filliâtre and
+  Claude Marché and Benjamin Monate and Yannick Moy and Virgile Prevosto},
+  note   = {\url{https://frama-c.com/html/acsl.html}},
 }
 
 @manual{acslimplem,
-  title = {{ACSL version 1.12, Implementation in Silicon-20161101}},
-  author = {Patrick Baudin and Pascal Cuoq and Jean-Christophe Filliâtre and
- Claude Marché and Benjamin Monate and Yannick Moy and Virgile Prevosto},
-  note = {\url{http://frama-c.com/acsl.html}},
+  title  = {{ACSL, Implementation in Frama-C}},
+  author = {Patrick Baudin and Pascal Cuoq and Jean-Christophe Filliâtre and
+ Claude Marché and Benjamin Monate and Yannick Moy and Virgile Prevosto},
+  note   = {\url{https://frama-c.com/download/frama-c-acsl-implementation.pdf}},
 }
 
 @manual{framac,
-  title = {Frama-C User Manual},
-  author = {Loïc Correnson and Pascal Cuoq and Florent Kirchner and 
-André Maroneze and
+  title  = {Frama-C User Manual},
+  author = {Loïc Correnson and Pascal Cuoq and Florent Kirchner and
+André Maroneze and
 Virgile Prevosto and Armand Puccetti and Julien Signoles and Boris Yakobowski},
-  note = {\url{http://frama-c.com}},
+  note   = {\url{https://frama-c.com/download/frama-c-user-manual.pdf}},
 }
 
 @manual{eacsl-plugin,
-  title = {Frama-C's E-ACSL Plug-in},
+  title  = {Frama-C's E-ACSL Plug-in},
   author = {Julien Signoles and Kostyantyn Vorobyov},
-  note = {\url{http://frama-c.com/eacsl.html}},
+  note   = {\url{https://frama-c.com/fc-plugins/e-acsl.html}},
 }
 
 @manual{value,
-  title = {Frama-C's value analysis plug-in},
-  author = {Pascal Cuoq and Boris Yakobowski and Matthieu Lemerre and 
-André Maroneze and Valentin Perelle and Virgile Prevosto},
-  note = {\url{http://frama-c.com/value.html}},
+  title  = {Frama-C's Evolved Value Analysis analysis plug-in},
+  author = {Pascal Cuoq and Boris Yakobowski and Matthieu Lemerre and
+André Maroneze and Valentin Perelle and Virgile Prevosto},
+  note   = {\url{https://frama-c.com/fc-plugins/eva.html}},
 }
 
-@BOOK{KR88,
-  author = {Brian Kernighan and Dennis Ritchie},
-  title = {The C Programming Language (2nd Ed.)},
+@book{KR88,
+  author    = {Brian Kernighan and Dennis Ritchie},
+  title     = {The C Programming Language (2nd Ed.)},
   publisher = {Prentice-Hall},
-  year = 1988
+  year      = 1988,
 }
 
-@MANUAL{standardc99,
-  title = {The {ANSI C} standard ({C99})},
+@manual{standardc99,
+  title        = {The {ANSI C} standard ({C99})},
   organization = {International Organization for Standardization ({ISO})},
-  key = {C99},
-  note = {\url{http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1124.pdf}}
+  key          = {C99},
+  note         = {\url{http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1124.pdf}},
 }
diff --git a/src/plugins/e-acsl/doc/refman/changes_modern.tex b/src/plugins/e-acsl/doc/refman/changes_modern.tex
index 9e419b0fc1d84c7e97754ddf782071981b44aea8..4ee9e693bb09b509bdd091077322d1fd66367d13 100644
--- a/src/plugins/e-acsl/doc/refman/changes_modern.tex
+++ b/src/plugins/e-acsl/doc/refman/changes_modern.tex
@@ -1,6 +1,32 @@
 \section{Changes}
 
-\subsection*{Version \version}
+% Next version
+%\subsection*{Version \version}
+
+\subsection*{Version 1.16}
+\begin{itemize}
+  \item Update according to \acsl 1.16
+  \begin{itemize}
+    \item \changeinsection{fn-behavior}{add the \lstinline|check| and
+      \lstinline|admit| clause kinds}
+    \item \changeinsection{assertions}{add the \lstinline|check| and
+      \lstinline|admit| clause kinds}
+    \item \changeinsection{generalized-invariants}{add the \lstinline|check| and
+      \lstinline|admit| clause kinds}
+    \item \changeinsection{loop_annot}{add the \lstinline|check| and
+      \lstinline|admit| clause kinds}
+  \end{itemize}
+\end{itemize}
+
+\subsection*{Version 1.15}
+\begin{itemize}
+\item Update according to \acsl 1.15:
+  \begin{itemize}
+  \item \changeinsection{ghost}{add the \lstinline|\\ghost| qualifier}
+  \end{itemize}
+\end{itemize}
+
+\subsection*{Version 1.14}
 \begin{itemize}
 \item Update according to \acsl 1.14:
   \begin{itemize}
@@ -124,7 +150,16 @@ in \lstinline|\\at|}
     {
 \section{Changes in \eacsl Implementation}
 
-\subsection*{Version \eacslpluginversion}
+% Next version
+%\subsection*{Version \eacslplugincodename-\eacslpluginversion}
+
+\subsection*{Version \eacslplugincodename-\eacslpluginversion}
+\begin{itemize}
+\item \changeinsection{expressions}{mark logic function and predicate
+  applications as implemented}
+\end{itemize}
+
+\subsection*{Version Titanium-22}
 
 \begin{itemize}
 \item \changeinsection{expressions}{support of bitwise operations}
diff --git a/src/plugins/e-acsl/doc/refman/fn_behavior.tex b/src/plugins/e-acsl/doc/refman/fn_behavior.tex
index 6db1b9dfa974cf8e773bb668896416f3de2f282f..b97f9d8b9824ba0186852d130b9be6fa0a40fedd 100644
--- a/src/plugins/e-acsl/doc/refman/fn_behavior.tex
+++ b/src/plugins/e-acsl/doc/refman/fn_behavior.tex
@@ -3,7 +3,9 @@
                             { decreases-clause? } simple-clause*
                             named-behavior* completeness-clause*
   \
-  requires-clause ::= "requires" pred ";"
+  clause-kind ::= "check" | { "admit" }
+  \
+  requires-clause ::= clause-kind? "requires" pred ";"
   \
   { decreases-clause } ::= { "decreases" term ("for" id)? ";" }
   \
@@ -16,7 +18,7 @@
   \
   { location } ::= { tset }
   \
-  ensures-clause ::= "ensures" pred ";"
+  ensures-clause ::= clause-kind? "ensures" pred ";"
   \
   named-behavior ::= "behavior" id ":" behavior-body
   \
diff --git a/src/plugins/e-acsl/doc/refman/frama-c-book.cls b/src/plugins/e-acsl/doc/refman/frama-c-book.cls
deleted file mode 100644
index 562571271e1660418447e02673f904e42fa8ef00..0000000000000000000000000000000000000000
--- a/src/plugins/e-acsl/doc/refman/frama-c-book.cls
+++ /dev/null
@@ -1,332 +0,0 @@
-% --------------------------------------------------------------------------
-% ---  LaTeX Class for Frama-C Books                                     ---
-% --------------------------------------------------------------------------
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{frama-c-book}[2009/02/05 LaTeX Class for Frama-C Books]
-% --------------------------------------------------------------------------
-% ---  Base Class management                                             ---
-% --------------------------------------------------------------------------
-\LoadClass[a4paper,11pt,twoside,openright]{report}
-\DeclareOption{web}{\PassOptionsToPackage{colorlinks,urlcolor=blue}{hyperref}}
-\DeclareOption{paper}{\PassOptionsToPackage{pdfborder=0 0 0}{hyperref}}
-\ProcessOptions
-\RequirePackage{fullpage}
-\RequirePackage{hevea}
-\RequirePackage{ifthen}
-\RequirePackage[T1]{fontenc}
-\RequirePackage[latin1]{inputenc}
-\RequirePackage[a4paper,pdftex,pdfstartview=FitH]{hyperref}
-\RequirePackage{amssymb}
-\RequirePackage{xcolor}
-\RequirePackage[pdftex]{graphicx}
-\RequirePackage{xspace}
-\RequirePackage{makeidx}
-\RequirePackage[leftbars]{changebar}
-\RequirePackage[english]{babel}
-\RequirePackage{fancyhdr}
-\RequirePackage{titlesec}
-% --------------------------------------------------------------------------
-% ---  Page Layout                                                       ---
-% --------------------------------------------------------------------------
-\setlength{\voffset}{-6mm}
-\setlength{\headsep}{8mm}
-\setlength{\footskip}{21mm}
-\setlength{\textheight}{238mm}
-\setlength{\topmargin}{0mm}
-\setlength{\textwidth}{155mm}
-\setlength{\oddsidemargin}{2mm}
-\setlength{\evensidemargin}{-2mm}
-\setlength{\changebarsep}{0.5cm}
-\setlength{\headheight}{13.6pt}
-\def\put@bg(#1,#2)#3{\setlength\unitlength{1cm}%
-  \begin{picture}(0,0)(#1,#2)
-    \put(0,0){\includegraphics{#3}}
-  \end{picture}}
-\fancypagestyle{plain}{%
-  \fancyfoot{}
-  \fancyhead{}
-  \fancyhead[LE]{\put@bg(2.4,27.425){frama-c-left.pdf}}
-  \fancyhead[LO]{\put@bg(2.7,27.425){frama-c-right.pdf}}
-  \fancyhead[CE]{\scriptsize\textsf{\leftmark}}
-  \fancyhead[CO]{\scriptsize\textsf{\rightmark}}
-  \fancyfoot[C]{\small\textsf{\thepage}}
-  \renewcommand{\headrulewidth}{0pt}
-  \renewcommand{\footrulewidth}{0pt}
-}
-\fancypagestyle{blank}{%
-  \fancyfoot{}
-  \fancyhead{}
-  \fancyhead[LE]{\put@bg(2.4,27.425){frama-c-left.pdf}}
-  \fancyhead[LO]{\put@bg(2.7,27.425){frama-c-right.pdf}}
-}
-%% Redefinition of cleardoublepage for empty page being blank
-\def\cleardoublepagewith#1{\clearpage\if@twoside \ifodd\c@page\else
-\hbox{}
-\thispagestyle{#1}
-\newpage
-\fi\fi}
-\def\cleardoublepage{\cleardoublepagewith{blank}}
-\pagestyle{plain}
-
-% --------------------------------------------------------------------------
-% ---  Cover Page                                                        ---
-% --------------------------------------------------------------------------
-\newcommand{\coverpage}[1]{%
-\thispagestyle{empty}
-\setlength\unitlength{1cm}
-\begin{picture}(0,0)(3.27,26.75)
-\put(0,0){\includegraphics{frama-c-cover.pdf}}
-\put(2.0,20.5){\makebox[8cm][l]{\fontfamily{phv}\fontseries{m}\fontsize{24}{2}\selectfont #1}}
-\end{picture}
-}
-
-% --------------------------------------------------------------------------
-% ---  Title Page                                                        ---
-% --------------------------------------------------------------------------
-\renewenvironment{titlepage}%
-{\cleardoublepagewith{empty}\thispagestyle{empty}\begin{center}}%
-{\end{center}}
-\renewcommand{\title}[2]{
-\vspace{20mm}
-{\Huge\bfseries #1}
-
-\bigskip
-
-{\LARGE #2}
-\vspace{20mm}
-}
-\renewcommand{\author}[1]{
-\vspace{20mm}
-
-{#1}
-
-\medskip
-}
-% --------------------------------------------------------------------------
-% ---  Sectionning                                                       ---
-% --------------------------------------------------------------------------
-\titleformat{\chapter}[display]{\Huge\raggedleft}%
-{\huge\chaptertitlename\,\thechapter}{0.5em}{}
-\titleformat{\section}[hang]{\Large\bfseries}{\thesection}{1em}{}%
-[\vspace{-14pt}\rule{\textwidth}{0.1pt}\vspace{-8pt}]
-\titleformat{\subsubsection}[hang]{\bfseries}{}{}{}%
-[\vspace{-8pt}]
-
-% --------------------------------------------------------------------------
-% ---  Main Text Style                                                   ---
-% --------------------------------------------------------------------------
-%\raggedright
-\setlength\parindent{0pt}
-\setlength\parskip{1ex plus 0.3ex minus 0.2ex}
-\newenvironment{warning}[1][Warning:]{\small\paragraph{#1}\itshape}{\vspace{\parskip}}
-\def\FramaC{\textsf{Frama-C}\xspace}
-% --------------------------------------------------------------------------
-% ---  Listings                                                          ---
-% --------------------------------------------------------------------------
-\RequirePackage{listings}
-
-\lstdefinelanguage{ACSL}{%
-  morekeywords={assert,assigns,assumes,axiom,axiomatic,behavior,behaviors,
-    boolean,breaks,complete,continues,data,decreases,disjoint,ensures,
-    exit_behavior,ghost,global,inductive,integer,invariant,lemma,logic,loop,
-    model,predicate,reads,real,requires,returns,sizeof,strong,struct,terminates,type,
-    union,variant},
-%  otherkeywords={\\at,\\base_addr,\\block_length,\\false,\\fresh,\\from,
-%                 \\initialized,\\lambda,\\let,\\match,\\max,\\nothing,\\null,
-%                 \\numof,\\old,\\result,\\specified,\\strlen,\\sum,\\true,
-%                 \\valid,\\valid_range},
-  keywordsprefix={\\},
-  alsoletter={\\},
-  morecomment=[l]{//}
-}
-
-\lstloadlanguages{[ANSI]C,[Objective]Caml,csh,ACSL}
-\definecolor{lstbg}{gray}{0.98}
-\definecolor{lstfg}{gray}{0.10}
-\definecolor{lstrule}{gray}{0.6}
-\definecolor{lstnum}{gray}{0.4}
-\definecolor{lsttxt}{rgb}{0.3,0.2,0.6}
-\definecolor{lstmodule}{rgb}{0.3,0.6,0.2}%{0.6,0.6,0.2}
-\definecolor{lstspecial}{rgb}{0.2,0.6,0.0}
-\definecolor{lstfile}{gray}{0.85}
-\newcommand{\lstbrk}{\mbox{$\color{blue}\scriptstyle\cdots$}}
-\def\lp@basic{\ifmmode\normalfont\mathtt\mdseries\scriptsize\else\normalfont\ttfamily\mdseries\scriptsize\fi}
-\def\lp@inline{\ifmmode\normalfont\mathtt\scriptstyle\else\normalfont\ttfamily\mdseries\small\fi}
-\def\lp@keyword{}
-\def\lp@special{\color{lstfg}}
-\def\lp@comment{\normalfont\ttfamily\mdseries}
-\def\lp@string{\color{lstfg}} \def\lp@ident{}
-\def\lp@number{\rmfamily\tiny\color{lstnum}}
-\lstdefinestyle{frama-c-style}{%
-  basicstyle=\lp@inline,%
-  identifierstyle=\lp@ident,%
-  commentstyle=\lp@comment,%
-  keywordstyle={\ifmmode\mathsf\else\sffamily\fi},%
-  keywordstyle=[2]\lp@special,%
-  stringstyle=\lp@string,%
-  emphstyle=\lp@ident\underbar,%
-  showstringspaces=false,%
-  mathescape=true,%
-  numberstyle=\lp@number,%
-  xleftmargin=6ex,xrightmargin=2ex,%
-  framexleftmargin=1ex,%
-  frame=l,%
-  framerule=1pt,%
-  rulecolor=\color{lstrule},%
-  backgroundcolor=\color{lstbg},%
-  moredelim={*[s]{/*@}{*/}},%
-  moredelim={*[l]{//@}},
-  morecomment={[is]{//NOPP-BEGIN}{NOPP-END}},
-  mathescape=true,
-  escapechar=`
-% breaklines is broken when using a inline and background
-%  breaklines,prebreak={\lstbrk},postbreak={\lstbrk},breakindent=5ex %
-}
-
-\lstdefinestyle{c}%
-{language={[ANSI]C},alsolanguage=ACSL,style=frama-c-style}
-\lstdefinestyle{c-basic}%
-{language={[ANSI]C},alsolanguage=ACSL,style=frama-c-style,basicstyle=\lp@basic}
-
-
-% --- C/ACSL Stuff ---------------------------------------------------------
-% Make 'c' the default style
-\lstset{style=c}
-
-\newcommand{\listinginput}[3][1]%
-{\lstinputlisting[style=c-basic,numbers=left,stepnumber=#1,firstnumber=#2]{#3}}
-
-\lstnewenvironment{listing}[2][1]%
-{\lstset{style=c-basic,numbers=left,stepnumber=#1,firstnumber=#2}}{}
-
-\lstnewenvironment{listing-nonumber}%
-{\lstset{style=c,numbers=none,basicstyle=\lp@basic}}{}
-
-% --- Verbatim Stuff -------------------------------------------------------
-\lstdefinelanguage{Shell}[]{csh}%
-{identifierstyle=\lp@basic,mathescape=false,backgroundcolor=,literate={\\\$}{\$}1}
-\lstnewenvironment{shell}[1][]{\lstset{language=Shell,basicstyle=\lp@basic,#1}}{}
-
-% ---- Stdout Stuff --------------------------------------------------------
-\lstdefinelanguage{Logs}[]{csh}%
-{identifierstyle=\lp@basic,backgroundcolor=}
-\lstnewenvironment{logs}[1][]{\lstset{language=Logs,basicstyle=\lp@basic,#1}}{}
-\newcommand{\logsinput}[1]%
-{\lstinputlisting[language=Logs,basicstyle=\lp@basic]{#1}}
-
-% --------------------------------------------------------------------------
-% ---  Developer Code Stuff                                              ---
-% --------------------------------------------------------------------------
-
-\newcommand{\listingname}[1]{\colorbox{lstfile}{\footnotesize\sffamily File \bfseries #1}\vspace{-4pt}}
-
-% --- Style ----------------------------------------------------------------
-\lstdefinestyle{framac-code-style}{%
-basicstyle=\lp@inline,%
-numberstyle=\lp@number,%
-keywordstyle=[1]\sffamily\color{lstmodule},%
-keywordstyle=[2]\sffamily\color{lstspecial},%
-keywordstyle=[3]\sffamily\bfseries,%
-identifierstyle=\rmfamily,%
-stringstyle=\ttfamily\color{lstfg},%
-commentstyle=\rmfamily\bfseries\color{lsttxt},%
-}
-\lstdefinestyle{framac-shell-style}{%
-mathescape=false,%
-basicstyle=\lp@basic,%
-numberstyle=\lp@number,%
-keywordstyle=\sffamily\bfseries,%
-keywordstyle=[1]\sffamily\color{lstmodule},%
-keywordstyle=[2]\sffamily\color{lstspecial},%
-keywordstyle=[3]\sffamily\bfseries,%
-identifierstyle=\ttfamily,%
-stringstyle=\ttfamily\color{lstfg},%
-commentstyle=\rmfamily\bfseries\color{lsttxt},%
-literate={\\\$}{\$}1,%
-}
-% --- Configure ------------------------------------------------------------
-\lstdefinelanguage{Configure}[]{csh}{%
-style=framac-shell-style,%
-morekeywords={fi},%
-}
-\lstnewenvironment{configurecode}[1][]%
-{\lstset{language=Configure,#1}}{}
-\newcommand{\configureinput}[1]{\lstinputlisting[language=Configure]{#1}}
-% --- Makefile  ------------------------------------------------------------
-\lstdefinelanguage{Makefile}[]{make}{%
-style=framac-shell-style,%
-morekeywords={include},%
-}
-\lstnewenvironment{makefilecode}[1][]%
-{\lstset{language=Makefile,#1}}{}
-\newcommand{\makefileinput}[1]{\lstinputlisting[language=Makefile]{#1}}
-% --- C- for Developer  ----------------------------------------------------
-\lstdefinestyle{framac-code}%
-  {language={[ANSI]C},alsolanguage=ACSL,style=framac-code-style,basicstyle=\lp@basic}
-\lstnewenvironment{ccode}[1][]%
-{\lstset{language={[ANSI]C},alsolanguage=ACSL,style=framac-code-style,basicstyle=\lp@basic,#1}}{}
-\newcommand{\cinput}[1]%
-{\lstinputlisting[language={[ANSI]C},alsolanguage=ACSL,style=framac-code-style,basicstyle=\lp@basic]{#1}}
-\newcommand{\cinline}[1]%
-{\lstinline[style=framac-code]{#1}}
-% --- Ocaml ----------------------------------------------------------------
-\lstdefinelanguage{Ocaml}[Objective]{Caml}{%
-style=framac-code-style,%
-deletekeywords={when,module,struct,sig,begin,end},%
-morekeywords=[2]{failwith,raise,when},%
-morekeywords=[3]{module,struct,sig,begin,end},%
-literate=%
-{~}{${\scriptstyle\thicksim}$}1%
-{<}{$<$}1%
-{>}{$>$}1%
-{->}{$\rightarrow$}1%
-{<-}{$\leftarrow$}1%
-{:=}{$\leftarrow$}1%
-{<=}{$\leq$}1%
-{>=}{$\geq$}1%
-{==}{$\equiv$}1%
-{!=}{$\not\equiv$}1%
-{<>}{$\neq$}1%
-{'a}{$\alpha$}1%
-{'b}{$\beta$}1%
-{'c}{$\gamma$}1%
-{µ}{`{}}1%
-}
-
-\lstdefinestyle{ocaml-basic}%
-{language=Ocaml,basicstyle=\lp@basic}
-\newcommand{\ocamlinput}[2][]{\lstinputlisting[style=ocaml-basic,#1]{#2}}
-\lstnewenvironment{ocamlcode}[1][]{\lstset{style=ocaml-basic,#1}}{}
-% --------------------------------------------------------------------------
-\lstdefinelanguage{Why}{%
-  morekeywords={
-    type, logic, axiom, predicate, goal,
-    forall, let, in,
-  },
-  morecomment=[s]{(*}{*)},
-  alsoletter={_},
-  literate=%
-  {->}{$\Rightarrow$}1%
-  {forall}{$\forall$}1%
-  {not}{$\neg$}1%
-  {<>}{$\neq$}1%
-  {...}{$\dots$}1%
-  %{_}{\_}1%
-  %{_}{{\rule[0pt]{1ex}{.2pt}}}1%
-  }
-
-\lstdefinestyle{why-style}{%
-language=Why,%
-style=framac-code-style,%
-basicstyle=\lp@basic,%
-}
-
-\lstnewenvironment{whycode}[1][]{\lstset{style=why-style,#1}}{}
-\newcommand{\whyinput}[1]%
-{\lstinputlisting[style=why-style]{#1}}
-\newcommand{\whyinline}[1]%
-{\lstinline[style=why-style]{#1}}
-
-% --------------------------------------------------------------------------
-% ---  End.                                                              ---
-% --------------------------------------------------------------------------
diff --git a/src/plugins/e-acsl/doc/refman/frama-c-cover.pdf b/src/plugins/e-acsl/doc/refman/frama-c-cover.pdf
deleted file mode 100644
index c0b6101f8a9a665f5ca48783d8d1dfefc765ed4a..0000000000000000000000000000000000000000
Binary files a/src/plugins/e-acsl/doc/refman/frama-c-cover.pdf and /dev/null differ
diff --git a/src/plugins/e-acsl/doc/refman/frama-c-left.pdf b/src/plugins/e-acsl/doc/refman/frama-c-left.pdf
deleted file mode 100644
index 54a64f214ddc0e9dc88eec38303070540962545d..0000000000000000000000000000000000000000
Binary files a/src/plugins/e-acsl/doc/refman/frama-c-left.pdf and /dev/null differ
diff --git a/src/plugins/e-acsl/doc/refman/frama-c-right.pdf b/src/plugins/e-acsl/doc/refman/frama-c-right.pdf
deleted file mode 100644
index 13ba3e3c03fdca91713629b5b115643281f5c109..0000000000000000000000000000000000000000
Binary files a/src/plugins/e-acsl/doc/refman/frama-c-right.pdf and /dev/null differ
diff --git a/src/plugins/e-acsl/doc/refman/generalinvariants.tex b/src/plugins/e-acsl/doc/refman/generalinvariants.tex
index 246a377d67ff92011258af572e78b8bc3ecc0daf..f72665035ec6cdbece7c6aed55c522c8aac1b842 100644
--- a/src/plugins/e-acsl/doc/refman/generalinvariants.tex
+++ b/src/plugins/e-acsl/doc/refman/generalinvariants.tex
@@ -1,4 +1,4 @@
 \begin{syntax}
-  assertion ::= [ "/*@" "invariant" pred ";" "*/" ] ;
-  | [ { "/*@" "for" id ("," id)* ":" "invariant" pred ";" "*/" } ] ;
+  assertion ::= [ "/*@" clause-kind? "invariant" pred ";" "*/" ] ;
+  | [ { "/*@" "for" id ("," id)* ":" clause-kind? "invariant" pred ";" "*/" } ] ;
 \end{syntax}
diff --git a/src/plugins/e-acsl/doc/refman/ghost.tex b/src/plugins/e-acsl/doc/refman/ghost.tex
index 1d6d0e9c9e6bd8ff337f7f0f3e4ba13c4085eda5..6d5cefc68a1abf69dad33a52b5270d8cd7e782cc 100644
--- a/src/plugins/e-acsl/doc/refman/ghost.tex
+++ b/src/plugins/e-acsl/doc/refman/ghost.tex
@@ -1,5 +1,8 @@
 \begin{syntax}
 
+  C-type-qualifier ::= C-type-qualifier ;
+  | { "\ghost" } ; only in ghost
+  \
   ghost-type-specifier ::= C-type-specifier ;
   | { logic-type } \
   declaration ::= C-declaration ;
@@ -16,7 +19,8 @@
      "(" C-argument-expression-list? ")";
      {"/*@" "ghost"} ;
      {  "(" ghost-argument-expression-list ")"};
-     {  "*/"} ; call with ghosts
+     {  "*/"} ; call
+              ; with ghosts
     \
   statement ::= C-statement ;
              | statements-ghost \
diff --git a/src/plugins/e-acsl/doc/refman/loops.tex b/src/plugins/e-acsl/doc/refman/loops.tex
index 5d1fa33003cbcc7674420f0e8f2231c7e12ca625..1de09ce3a638ab6f99d83e5be39edbb0b1cf955e 100644
--- a/src/plugins/e-acsl/doc/refman/loops.tex
+++ b/src/plugins/e-acsl/doc/refman/loops.tex
@@ -16,13 +16,13 @@
   loop-clause ::= loop-invariant ;
                 | { loop-assigns }
   \
-  [ loop-invariant ] ::= [ "loop" "invariant" pred ";" ] ;
+  [ loop-invariant ] ::= { clause-kind? } [ "loop" "invariant" pred ";" ] ;
   \
   { loop-assigns } ::= { "loop" "assigns" locations ";" } ;
   \
   { loop-behavior } ::= { "for" id ("," id)* ":" } ;
-  { loop-clause* } ; \hspace{-30mm} annotation for behavior $id$
+  { loop-clause* } ; \hspace{-35mm} annotation for behavior $id$
   \
   { loop-variant } ::= { "loop" "variant" term ";" } ;
-  | { "loop" "variant" term "for" id ";" } ;  \hspace{-30mm} variant for relation $id$
+  | { "loop" "variant" term "for" id ";" } ;  \hspace{-35mm} variant for relation $id$
 \end{syntax}
diff --git a/src/plugins/e-acsl/doc/refman/macros_modern.tex b/src/plugins/e-acsl/doc/refman/macros_modern.tex
index 86b8cd8244b4805b854fb1d1ea5450ab67ab370e..0034ff0ed628dbc05d558731db395e23dc9d32cd 100644
--- a/src/plugins/e-acsl/doc/refman/macros_modern.tex
+++ b/src/plugins/e-acsl/doc/refman/macros_modern.tex
@@ -1,5 +1,5 @@
-%%% Environnements dont le corps est suprimé, et
-%%% commandes dont la définition est vide,
+%%% Environnements dont le corps est suprimé, et
+%%% commandes dont la définition est vide,
 %%% lorsque PrintRemarks=false
 
 \usepackage{comment}
@@ -105,7 +105,7 @@
   \ifthenelse{\isundefined{\myrq}}{}{\footnote{\myrq}}\end{changebar}}}%
 {\excludecomment{notreviewedenv}}
 
-%%% Commandes et environnements pour la version relative à l'implementation
+%%% Commandes et environnements pour la version relative à l'implementation
 \newcommand{\highlightnotimplemented}{%
 \ifthenelse{\boolean{ColorImplementationRq}}{\color{red}}%
            {}%
diff --git a/src/plugins/e-acsl/doc/refman/main.tex b/src/plugins/e-acsl/doc/refman/main.tex
index 4b6ad34ce838bdf222b826029e49d259cd757613..6991b746d9895195da18ac1abcf598439bea00f0 100644
--- a/src/plugins/e-acsl/doc/refman/main.tex
+++ b/src/plugins/e-acsl/doc/refman/main.tex
@@ -4,6 +4,7 @@
 \usepackage{ifthen}
 
 \input{./macros_modern}
+\input{./frama-c-affiliation.tex}
 \input{eacslversion.tex}
 %Do not touch the following line. It is used in a Makefile hack to
 %produce the ACSL documents for the ACSL working group.
@@ -24,7 +25,7 @@
 \usepackage{alltt}
 \makeindex
 
-\newcommand{\eacsllangversion}{1.14\xspace}
+\newcommand{\eacsllangversion}{1.16\xspace}
 \newcommand{\version}{\eacsllangversion\xspace}
 
 \renewcommand{\textfraction}{0.01}
@@ -52,7 +53,7 @@
 
 \author{Julien Signoles}
 
-CEA LIST, Software Reliability Laboratory\\
+\fcaffiliationen
 \vfill
 \begin{flushleft}
   \textcopyright 2011-2018 CEA LIST
diff --git a/src/plugins/e-acsl/doc/refman/predicate.tex b/src/plugins/e-acsl/doc/refman/predicate.tex
index ae1dcfb610805a2408af395f3996ce3c00116f95..c89a1ed2979a36295cb7437874e5ea21c031f883 100644
--- a/src/plugins/e-acsl/doc/refman/predicate.tex
+++ b/src/plugins/e-acsl/doc/refman/predicate.tex
@@ -3,7 +3,7 @@
        \
   pred ::= "\true" | "\false" ;
        | term (rel-op term)+ ; comparisons
-       | { id "(" term ("," term)* ")" } ; predicate application
+       | id "(" term ("," term)* ")" ; predicate application
        | "(" pred ")" ; parentheses
        | [ pred "&&" pred ] ; conjunction
        | [ pred "||" pred ] ; disjunction
diff --git a/src/plugins/e-acsl/doc/refman/speclang_modern.tex b/src/plugins/e-acsl/doc/refman/speclang_modern.tex
index 261843a39061bc86c85aa25af87979fc41abcb77..a15c8384b4a34fee6955f3a6b4bbfe4bcba1a38a 100644
--- a/src/plugins/e-acsl/doc/refman/speclang_modern.tex
+++ b/src/plugins/e-acsl/doc/refman/speclang_modern.tex
@@ -290,11 +290,6 @@ It is not possible to define logic types introduced by the specification writer
   \eacsl plug-in.
 \end{notimplementedenv}
 
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\subsection{String literals}
-\nodiff
-
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -385,7 +380,7 @@ set of all integers between 0 and 9 and between 20 and 29.
 
 \begin{notimplementedenv}
   Ranges are currently only supported in memory built-ins described in
-  Section~\ref{subsec:memory} and~\ref{sec:dangling}.
+  Section~\ref{subsec:memory},~\ref{sec:initialized} and~\ref{sec:dangling}.
 
 \begin{example}
 The predicate \lstinline|\valid(&t[0 .. 9])| is supported and denotes that
@@ -484,6 +479,7 @@ loop invariants are not inductive.
 \end{example}
 
 \subsubsection{General inductive invariant}
+\label{sec:generalized-invariants}
 
 Syntax of these kinds of invariant is shown Figure~\ref{fig:advancedinvariants}
 \begin{figure}[t]
@@ -725,7 +721,7 @@ predicates which are related to memory location.
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-\subsection{Allocation and deallocation}
+\subsection{Dynamic allocation and deallocation}
 \difficultswhy{All these constructs}{the implementation of a memory model}
 \label{sec:alloc-dealloc}
 \nodiff
@@ -852,13 +848,18 @@ same than the one of \acsl.
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-\section{Undefined values, dangling pointers}
+\section{Initialization and undefined values}
+\label{sec:initialized}
+\nodiff
+
+\difficultwhy{\lstinline|\\initialized|}{the implementation of a memory model}
+
+\section{Dangling pointers}
 \label{sec:dangling}
 \nodiff
 
-\difficultswhy{\lstinline|\\initialized| and
-  \notimplemented{\lstinline|\\dangling|}}{the implementation of a memory
-  model}
+\difficultwhy{\notimplemented{\lstinline|\\dangling|}}{the implementation of a
+  memory model}
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -867,3 +868,17 @@ same than the one of \acsl.
 \section{Well-typed pointers}
 \label{sec:typedpointers}
 \absentexperimental
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\section{Logic attribute annotations}
+\absentexperimental
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\section{Preprocessing for ACSL}
+\nodiff
diff --git a/src/plugins/e-acsl/doc/refman/term.tex b/src/plugins/e-acsl/doc/refman/term.tex
index 0582703adc5a5512f462b839fd56885c2dc1a268..67e3edea7855fd98c34194346fdc744dac7b59ab 100644
--- a/src/plugins/e-acsl/doc/refman/term.tex
+++ b/src/plugins/e-acsl/doc/refman/term.tex
@@ -26,7 +26,7 @@
        | { "{" term "\with" "."id "=" term "}" } ; field functional modifier
        | term "->" id ;
        | [ "(" type-expr ")" term ] ; cast
-       | { id "(" term ("," term)* ")" } ; function application
+       | id "(" term ("," term)* ")" ; function application
        | "(" term ")" ; parentheses
        | [ term "?" term ":" term ] ; ternary condition
        | "\let" id "=" term ";" term ; local binding
diff --git a/src/plugins/e-acsl/doc/support/MakeLaTeXModern b/src/plugins/e-acsl/doc/support/MakeLaTeXModern
index d1b204a14b1ea83265f8686f43d31cfa3f116629..bcbb0d6648b70222cf66d404bf30482d813d0efb 100644
--- a/src/plugins/e-acsl/doc/support/MakeLaTeXModern
+++ b/src/plugins/e-acsl/doc/support/MakeLaTeXModern
@@ -1,25 +1,2 @@
-FRAMAC_MODERN=frama-c-book.cls frama-c-cover.pdf frama-c-left.pdf frama-c-right.pdf
-
-frama-c-book.cls: ../frama-c-book.cls
-	@rm -f $@
-	@cp $< .
-	@chmod a-w $@
-	@echo "import $<"
-
-frama-c-cover.pdf: ../frama-c-cover.pdf
-	@rm -f $@
-	@cp $< .
-	@chmod a-w $@
-	@echo "import $<"
-
-frama-c-right.pdf: ../frama-c-right.pdf
-	@rm -f $@
-	@cp $< .
-	@chmod a-w $@
-	@echo "import $<"
-
-frama-c-left.pdf: ../frama-c-left.pdf
-	@rm -f $@
-	@cp $< .
-	@chmod a-w $@
-	@echo "import $<"
+FRAMAC_DOC_ROOT_DIR:=../../../../../doc
+include $(FRAMAC_DOC_ROOT_DIR)/MakeLaTeXModern
diff --git a/src/plugins/e-acsl/doc/userman/.gitignore b/src/plugins/e-acsl/doc/userman/.gitignore
index f0de8a3d55fd37efe5d3b79a83031b8ab3c1a1e3..3ffa44f89d754052b750df77ee3ef0975b691b4d 100644
--- a/src/plugins/e-acsl/doc/userman/.gitignore
+++ b/src/plugins/e-acsl/doc/userman/.gitignore
@@ -1 +1,6 @@
+frama-c-book.cls
+frama-c-cover.pdf
+frama-c-left.pdf
+frama-c-right.pdf
+frama-c-affiliation.tex
 main.pdf
diff --git a/src/plugins/e-acsl/doc/userman/Makefile b/src/plugins/e-acsl/doc/userman/Makefile
index 558ae875bed315e79fecefe3aac3ff02c1295a00..8486028efd975dbb02cf54f4540b6aaf3fafa1d7 100644
--- a/src/plugins/e-acsl/doc/userman/Makefile
+++ b/src/plugins/e-acsl/doc/userman/Makefile
@@ -1,8 +1,12 @@
-default: main.pdf
+default: all
 
-EACSL_DIR=../..
+EACSL_DIR:=../..
 include $(EACSL_DIR)/doc/Makefile.common
 
+##########
+# Inputs #
+##########
+
 MAIN=main
 
 C_CODE=$(wildcard examples/*.[ci])
@@ -15,11 +19,19 @@ DEPS_MODERN=eacslversion.tex biblio.bib macros.tex \
 	$(C_CODE) \
 	$(VERSION_FILE)
 
-default: main.pdf
+##############
+# Main rules #
+##############
+
+.PHONY: all main default
+$(MAIN): $(MAIN).pdf
+all: $(MAIN)
 
-main.pdf: $(DEPS_MODERN)
+$(MAIN).pdf: $(DEPS_MODERN) $(FRAMAC_MODERN)
 
-DISTRIB_DIR=$(HOME)/frama-c/doc/www/distrib
-install:
-	mkdir -p $(EACSL_DIR)/doc/manuals/
-	cp -f main.pdf $(EACSL_DIR)/doc/manuals/e-acsl-manual.pdf
+.PHONY: clean
+clean:
+	rm -rf *~ *.aux *.log *.nav *.out *.snm *.toc *.lof *.pp *.bnf \
+		*.haux  *.hbbl *.htoc \
+                *.cb *.cm? *.bbl *.blg *.idx *.ind *.ilg \
+		transf trans.ml pp.ml pp
diff --git a/src/plugins/e-acsl/doc/userman/biblio.bib b/src/plugins/e-acsl/doc/userman/biblio.bib
index 63e742e131e03df9a6f38531c3b56c3ad2b18246..dc9980cd64f8211e781542f9231e63b231e237ce 100644
--- a/src/plugins/e-acsl/doc/userman/biblio.bib
+++ b/src/plugins/e-acsl/doc/userman/biblio.bib
@@ -1,119 +1,119 @@
 @manual{userman,
   title  = {Frama-C User Manual},
-  author = {Loïc Correnson and Pascal Cuoq and Florent Kirchner and
-            André Maroneze and Virgile Prevosto and
+  author = {Loïc Correnson and Pascal Cuoq and Florent Kirchner and
+            André Maroneze and Virgile Prevosto and
             Armand Puccetti and Julien Signoles and
             Boris Yakobowski},
-  note   = {\url{http://frama-c.cea.fr/download/user-manual.pdf}}
+  note   = {\url{https://frama-c.com/download/frama-c-user-manual.pdf}},
 }
 
 @manual{plugin-dev-guide,
-  author = {Julien Signoles and Loïc Correnson and Matthieu Lemerre and 
+  author = {Julien Signoles and Loïc Correnson and Matthieu Lemerre and
             Virgile Prevosto},
   title  = {{Frama-C Plug-in Development Guide}},
-  note   = {\newline \url{http://frama-c.cea.fr/download/plugin-developer.pdf}},
+  note   = {\newline \url{https://frama-c.com/download/frama-c-plugin-development-guide.pdf}},
 }
 
 @manual{eva,
   author = {David B\"uhler and Pascal Cuoq and Boris Yakobowski and
-            Matthieu Lemerre and André Maroneze and Valentin Perelle and
+            Matthieu Lemerre and André Maroneze and Valentin Perelle and
             Virgile Prevosto},
   title  = {{EVA} -- The Evolved Value Analysis plug-in},
-  note   = {\mbox{\url{http://frama-c.cea.fr/download/value-analysis.pdf}}},
+  note   = {\mbox{\url{https://frama-c.com/download/frama-c-value-analysis.pdf}}},
 }
 
 @manual{acsl,
-  author = {Baudin, Patrick and Filli\^{a}tre, Jean-Christophe and 
+  author = {Baudin, Patrick and Filli\^{a}tre, Jean-Christophe and
             March\'{e}, Claude and Monate, Benjamin and Moy, Yannick and
             Prevosto, Virgile},
-  title = {{ACSL: ANSI/ISO C Specification Language.}},
+  title  = {{ACSL: ANSI/ISO C Specification Language.}},
 }
 
 @manual{acsl-implem,
-  author = {Baudin, Patrick and Pascal Cuoq and Filli\^{a}tre, Jean-Christophe 
+  author = {Baudin, Patrick and Pascal Cuoq and Filli\^{a}tre, Jean-Christophe
             and March\'{e}, Claude and Monate, Benjamin and Moy, Yannick and
             Prevosto, Virgile},
-  title = {ACSL: ANSI/ISO C Specification Language. --- 
+  title  = {ACSL: ANSI/ISO C Specification Language. ---
            Frama-C Silicon implementation.},
 }
 
 @manual{eacsl,
   author = {Julien Signoles},
   title  = {E-ACSL: Executable ANSI/ISO C Specification Language.},
-  note   = {\mbox{\url{http://frama-c.com/download/e-acsl/e-acsl.pdf}}}
+  note   = {\mbox{\url{http://frama-c.com/download/e-acsl/e-acsl.pdf}}},
 }
 
 @manual{eacsl-implem,
   author = {Julien Signoles},
   title  = {E-ACSL. Implementation in Frama-C Plug-in E-ACSL},
-  note   = {\mbox{\url{http://frama-c.com/download/e-acsl/e-acsl-implementation.pdf}}}
+  note   = {\mbox{\url{http://frama-c.com/download/e-acsl/e-acsl-implementation.pdf}}},
 }
 
 @habilitation{signoles18hdr,
   author = {Signoles, Julien},
-  title = {{From Static Analysis to Runtime Verification with Frama-C and E-ACSL}},
-  year = 2018,
-  month = jul,
+  title  = {{From Static Analysis to Runtime Verification with Frama-C and E-ACSL}},
+  year   = 2018,
+  month  = jul,
   school = {Universit\'e Paris-Sud, Orsay, France},
-  note = {Habilitation Thesis},
-  url = {publis/hdr.pdf}
+  note   = {Habilitation Thesis},
+  url    = {publis/hdr.pdf},
 }
 
 @inproceedings{kosmatov20rv,
-  author = {Kosmatov, Nikolai and Maurica, Fonenantsoa and Signoles, Julien},
-  title = {{Efficient Runtime Assertion Checking for Properties over
+  author    = {Kosmatov, Nikolai and Maurica, Fonenantsoa and Signoles, Julien},
+  title     = {{Efficient Runtime Assertion Checking for Properties over
              Mathematical Numbers}},
   booktitle = {International Conference on Runtime Verification (RV)},
-  year = 2020,
-  month = oct,
+  year      = 2020,
+  month     = oct,
 }
 
 @inproceedings{ly18hilt,
-  author = {Dara Ly and Nikolai Kosmatov and Fr\'ed\'eric Loulergue
+  author    = {Dara Ly and Nikolai Kosmatov and Fr\'ed\'eric Loulergue
             and Julien Signoles},
-  title = {Soundness of a Dataflow Analysis for Memory Monitoring},
+  title     = {Soundness of a Dataflow Analysis for Memory Monitoring},
   booktitle = {Workshop on Languages and Tools for Ensuring Cyber-Resilience in
 Critical Software-Intensive Systems (HILT)},
-  year = 2018,
-  month = nov,
+  year      = 2018,
+  month     = nov,
 }
 
 @inproceedings{rvcubes17tool,
-  author = {Julien Signoles and Nikolai Kosmatov and Kostyantyn Vorobyov},
-  title = {{E-ACSL, a Runtime Verification Tool for Safety and Security of C
+  author    = {Julien Signoles and Nikolai Kosmatov and Kostyantyn Vorobyov},
+  title     = {{E-ACSL, a Runtime Verification Tool for Safety and Security of C
 Programs. Tool Paper}},
   booktitle = {International Workshop on Competitions, Usability, Benchmarks,
 Evaluation, and Standardisation for Runtime Verification Tools (RV-CuBES)},
-  year = 2017,
-  month = sep,
+  year      = 2017,
+  month     = sep,
 }
 
 @inproceedings{sac13,
-  author = {Micka\"{e}l Delahaye and Nikolai Kosmatov and Julien Signoles},
-  title  = {Common Specification Language for Static and Dynamic Analysis of 
+  author    = {Micka\"{e}l Delahaye and Nikolai Kosmatov and Julien Signoles},
+  title     = {Common Specification Language for Static and Dynamic Analysis of
            {C} Programs},
   booktitle = {the 28th Annual ACM Symposium on Applied Computing ({SAC})},
   publisher = {ACM},
-  year  = 2013,
-  month = mar,
-  pages = {1230--1235},
+  year      = 2013,
+  month     = mar,
+  pages     = {1230--1235},
 }
 
 
 @inproceedings{rv13tutorial,
-  author = {Nikolaï Kosmatov and Julien Signoles},
-  title  = {A Lesson on Runtime Assertion Checking with {Frama-C}},
+  author    = {Nikolaï Kosmatov and Julien Signoles},
+  title     = {A Lesson on Runtime Assertion Checking with {Frama-C}},
   booktitle = {International Conference on Runtime Verification ({RV 2013})},
   publisher = {Springer},
-  series= {LNCS},
-  volume= {8174},
-  pages= {386--399},
-  year  = 2013,
-  month = sep,
+  series    = {LNCS},
+  volume    = {8174},
+  pages     = {386--399},
+  year      = 2013,
+  month     = sep,
 }
 
 @manual{wp,
-  author = {Patrick Baudin and François Bobot and Loïc Correnson
+  author = {Patrick Baudin and François Bobot and Loïc Correnson
             and Zaynah Dargaye},
   title  = {{Frama-C}'s {WP} plug-in},
   note   = {\mbox{\url{http://frama-c.com/download/frama-c-wp-manual.pdf}}},
@@ -126,68 +126,74 @@ Evaluation, and Standardisation for Runtime Verification Tools (RV-CuBES)},
 }
 
 @article{fac15,
-year={2015},
-month={jan},
-journal={Formal Aspects of Computing},
-title={{Frama-C: A Software Analysis Perspective}},
-publisher={Springer},
-keywords={Formal verification; Static analysis; Dynamic analysis; C},
-author={Kirchner, Florent and Kosmatov, Nikolai and Prevosto, Virgile and 
+  year      = {2015},
+  month     = {jan},
+  journal   = {Formal Aspects of Computing},
+  title     = {{Frama-C: A Software Analysis Perspective}},
+  publisher = {Springer},
+  keywords  = {Formal verification; Static analysis; Dynamic analysis; C},
+  author    = {Kirchner, Florent and Kosmatov, Nikolai and Prevosto, Virgile and
 Signoles, Julien and Yakobowski, Boris},
-pages={1-37},
+  pages     = {1-37},
 }
 
 @article{runtime-assertion-checking,
-  author    = {Lori A. Clarke and
+  author  = {Lori A. Clarke and
                David S. Rosenblum},
-  title     = {A historical perspective on runtime assertion checking in
+  title   = {A historical perspective on runtime assertion checking in
                software development},
-  journal   = {ACM SIGSOFT Software Engineering Notes},
-  volume    = {31},
-  number    = {3},
-  year      = {2006},
-  pages     = {25-37},
+  journal = {ACM SIGSOFT Software Engineering Notes},
+  volume  = {31},
+  number  = {3},
+  year    = {2006},
+  pages   = {25-37},
 }
 
 @inproceedings{rv13,
-  author = {Nikolaï Kosmatov and Guillaume Petiot and Julien Signoles},
-  title = {An Optimized Memory Monitoring for Runtime Assertion Checking of 
+  author    = {Nikolaï Kosmatov and Guillaume Petiot and Julien Signoles},
+  title     = {An Optimized Memory Monitoring for Runtime Assertion Checking of
              {C} Programs},
   booktitle = {International Conference on
               Runtime Verification ({RV 2013})},
   publisher = {Springer},
-  series = {LNCS},
-  volume = {8174},
-  pages = {167--182},
-  year = 2013,
-  month = sep,
+  series    = {LNCS},
+  volume    = {8174},
+  pages     = {167--182},
+  year      = 2013,
+  month     = sep,
 }
 
 @inproceedings{jfla15,
-  title = {{Rester statique pour devenir plus rapide, plus pr{\'e}cis et plus mince}},
-  author = {Arvid Jakobsson and Nikolai Kosmatov and Julien Signoles},
-  booktitle = {Journées Francophones des Langages Applicatifs (JFLA'15)},
-  editor = {David Baelde and Jade Alglave},
-  year = {2015},
-  month = jan,
-  note = {In French},
+  title     = {{Rester statique pour devenir plus rapide, plus pr{\'e}cis et plus mince}},
+  author    = {Arvid Jakobsson and Nikolai Kosmatov and Julien Signoles},
+  booktitle = {Journées Francophones des Langages Applicatifs (JFLA'15)},
+  editor    = {David Baelde and Jade Alglave},
+  year      = {2015},
+  month     = jan,
+  note      = {In French},
 }
 
 @article{scp16,
-  title = {{Fast as a Shadow, Expressive as a Tree: Optimized Memory Monitoring 
+  title     = {{Fast as a Shadow, Expressive as a Tree: Optimized Memory Monitoring
 for C}},
-  author = {Arvid Jakobsson and Nikolai Kosmatov and Julien Signoles},
-  journal = {Science of Computer Programming},
+  author    = {Arvid Jakobsson and Nikolai Kosmatov and Julien Signoles},
+  journal   = {Science of Computer Programming},
   publisher = {Elsevier},
-  pages = {226-246},
-  language = {English},
-  year = {2016},
-  month = oct,
-}
-
-@article{pldi16,
-  title = {{Shadow State Encoding for Efficient Monitoring of Block-level 
-Properties}},
-  author = {Kostyantyn Vorobyov and Julien Signoles and Nikolai Kosmatov},
-  note  = {Submitted for publication},
+  pages     = {226-246},
+  language  = {English},
+  year      = {2016},
+  month     = oct,
+}
+
+@inproceedings{vorobyov17ismm,
+  author    = { Vorobyov, Kostyantyn and Signoles, Julien and Kosmatov, Nikolai },
+  booktitle = { International Symposium on Memory Management (ISMM)  },
+  title     = { Shadow State Encoding for Efficient Monitoring of Block-level Properties },
+  year      = { 2017 },
+  month     = jun,
+  pages     = {47--58},
+  location  = { Barcelona, Spain },
+  doi       = { 10.1145/3092255 },
+  pdf       = {publis/2017_ismm.pdf},
+  publisher = { {ACM} },
 }
diff --git a/src/plugins/e-acsl/doc/userman/changes.tex b/src/plugins/e-acsl/doc/userman/changes.tex
index 034766eaca3e2ae51a6764834055cbb5dc55777e..0d53e9d25dceefdf9e5f1d2e1f31a7288909e102 100644
--- a/src/plugins/e-acsl/doc/userman/changes.tex
+++ b/src/plugins/e-acsl/doc/userman/changes.tex
@@ -3,9 +3,13 @@
 This chapter summarizes the changes in this documentation between each \eacsl
 release. First we list changes of the last release.
 
-\section*{E-ACSL \eacslpluginversion}
+% Next version
+%\section*{E-ACSL \eacslpluginversion \eacslplugincodename}
+
+\section*{E-ACSL 22.0 Titanium}
 
 \begin{itemize}
+\item Update every section with changes to \framac and \eacslgcc output
 \item \textbf{Simple Example}: Remove option \texttt{-e-acsl-check}
 \item \textbf{Combining E-ACSL with Other PLug-ins}: \texttt{-e-acsl-prepare} is
   no more necessary.
@@ -30,7 +34,7 @@ release. First we list changes of the last release.
   \textbf{-e-acsl-prepare}.
 \item \textbf{Known Limitations}: Replace section ``Limitations of E-ACSL
   Monitoring Libraries'' by the new section ``Supported Systems''.
-\item \textbf{Known Limitations}: Add limitation about monitoring of variables 
+\item \textbf{Known Limitations}: Add limitation about monitoring of variables
   with incomplete types.
 \end{itemize}
 
diff --git a/src/plugins/e-acsl/doc/userman/examples/assert_sign.c b/src/plugins/e-acsl/doc/userman/examples/assert_sign.c
index ce2e56c6fb9579df15f0211548e355dfcd5af08d..7d2fb1842f2799b6c9fe34eac9d7d08429086828 100644
--- a/src/plugins/e-acsl/doc/userman/examples/assert_sign.c
+++ b/src/plugins/e-acsl/doc/userman/examples/assert_sign.c
@@ -1,2 +1,2 @@
-void __e_acsl_assert(int pred, char *kind,
-                     char *func_name, char *pred_text, int line);
+void __e_acsl_assert(int pred, const char *kind, const char *func_name,
+    const char *pred_txt, const char * file, int line);
diff --git a/src/plugins/e-acsl/doc/userman/examples/instrumented_first.c b/src/plugins/e-acsl/doc/userman/examples/instrumented_first.c
index a940f8c891f99d03379b2ab99afd8c0164958126..54948acabb34603ad326da9f69746e4e096e980f 100644
--- a/src/plugins/e-acsl/doc/userman/examples/instrumented_first.c
+++ b/src/plugins/e-acsl/doc/userman/examples/instrumented_first.c
@@ -1,13 +1,14 @@
 \begin{shell}
 \$ frama-c -e-acsl first.i -then-last -print
-[kernel] Parsing FRAMAC_SHARE/e-acsl/e_acsl_gmp_api.h (with preprocessing)
-[kernel] Parsing FRAMAC_SHARE/e-acsl/e_acsl.h (with preprocessing)
 [kernel] Parsing first.i (no preprocessing)
 [e-acsl] beginning translation.
+[kernel] Parsing FRAMAC_SHARE/e-acsl/e_acsl.h (with preprocessing)
 [e-acsl] translation done in project "e-acsl".
 /* Generated by Frama-C */
+#include "stddef.h"
 #include "stdio.h"
-#include "stdlib.h"
+struct __e_acsl_contract_t;
+typedef struct __e_acsl_contract_t __attribute__((__FC_BUILTIN__)) __e_acsl_contract_t;
 struct __e_acsl_mpz_struct {
    int _mp_alloc ;
    int _mp_size ;
@@ -15,39 +16,56 @@ struct __e_acsl_mpz_struct {
 };
 typedef struct __e_acsl_mpz_struct __e_acsl_mpz_struct;
 typedef __e_acsl_mpz_struct ( __attribute__((__FC_BUILTIN__)) __e_acsl_mpz_t)[1];
-/*@ ghost extern int __e_acsl_init; */
-
+struct __e_acsl_mpq_struct {
+   __e_acsl_mpz_struct _mp_num ;
+   __e_acsl_mpz_struct _mp_den ;
+};
+typedef struct __e_acsl_mpq_struct __e_acsl_mpq_struct;
+typedef __e_acsl_mpq_struct ( __attribute__((__FC_BUILTIN__)) __e_acsl_mpq_t)[1];
+typedef unsigned long __e_acsl_mp_bitcnt_t;
 /*@ requires pred != 0;
     assigns \nothing; */
- __attribute__((__FC_BUILTIN__)) void __e_acsl_assert(int pred, char *kind,
-                                                      char *fct,
-                                                      char *pred_txt,
+ __attribute__((__FC_BUILTIN__)) void __e_acsl_assert(int pred,
+                                                      char const *kind,
+                                                      char const *fct,
+                                                      char const *pred_txt,
+                                                      char const *file,
                                                       int line);
 
-/*@ assigns \nothing; */
- __attribute__((__FC_BUILTIN__)) void __e_acsl_memory_init(int *argc_ref,
-                                                           char ***argv,
-                                                           size_t ptr_size);
-
 extern size_t __e_acsl_heap_allocation_size;
 
-/*@
-predicate diffSize{L1, L2}(integer i) =
-  \at(__e_acsl_heap_allocation_size,L1) -
-  \at(__e_acsl_heap_allocation_size,L2) == i;
+extern size_t __e_acsl_heap_allocated_blocks;
+
+/*@ ghost extern int __fc_heap_status __attribute__((__FRAMA_C_MODEL__)); */
+
+/*@ ghost extern int __e_acsl_init; */
+
+long valid_nstring(char *s, long n, int wrtbl);
+
+long valid_nwstring(wchar_t *s, long n, int wrtbl);
+
+__inline static long valid_string__fc_inline(char *s, int wrtbl)
+{
+  long tmp;
+  tmp = valid_nstring(s,(long)(-1),wrtbl);
+  return tmp;
+}
+
+__inline static long valid_wstring__fc_inline(wchar_t *s, int wrtbl)
+{
+  long tmp;
+  tmp = valid_nwstring(s,(long)(-1),wrtbl);
+  return tmp;
+}
 
-*/
 int main(void)
 {
   int __retres;
-  __e_acsl_memory_init((int *)0,(char ***)0,(size_t)4);
   int x = 0;
-  /*@ assert x == 0; */
-  __e_acsl_assert(x == 0,(char *)"Assertion",(char *)"main",(char *)"x == 0",
-                  3);
-  /*@ assert x == 1; */
-  __e_acsl_assert(x == 1,(char *)"Assertion",(char *)"main",(char *)"x == 1",
-                  4);
+  __e_acsl_assert(x == 0,"Assertion","main","x == 0","first.i",3);
+  /*@ assert x == 0; */ ;
+  __e_acsl_assert(x == 1,"Assertion","main","x == 1","first.i",4);
+  /*@ assert x == 1; */ ;
   __retres = 0;
   return __retres;
 }
diff --git a/src/plugins/e-acsl/doc/userman/examples/my_assert.c b/src/plugins/e-acsl/doc/userman/examples/my_assert.c
index c006779bc5b5b68796681f65c9055cf766483785..d6f42e6db325c3b424a3d7f3e3e6f81ada680633 100644
--- a/src/plugins/e-acsl/doc/userman/examples/my_assert.c
+++ b/src/plugins/e-acsl/doc/userman/examples/my_assert.c
@@ -2,14 +2,15 @@
 
 extern int __e_acsl_sound_verdict;
 
-void __e_acsl_assert(int pred, char *kind,
-                     char *func_name, char *pred_text, int line) {
-  printf("%s at line %d in function %s is %s (%s).\n\
+void __e_acsl_assert(int pred, const char *kind, const char *func_name,
+                     const char *pred_text, const char *file, int line) {
+  printf("%s in file %s at line %d in function %s is %s (%s).\n\
 The verified predicate was: `%s'.\n",
     kind,
+    file,
     line,
     func_name,
     pred ? "valid" : "invalid",
-    __e_acsl_sound_verdict ? "trustable" : "UNTRUSTABLE",
+    __e_acsl_sound_verdict ? "trustworthy" : "UNTRUSTWORTHY",
     pred_text);
 }
diff --git a/src/plugins/e-acsl/doc/userman/frama-c-book.cls b/src/plugins/e-acsl/doc/userman/frama-c-book.cls
deleted file mode 100644
index 47463e1cc216eb43d7a224547eac4fef99aed78b..0000000000000000000000000000000000000000
--- a/src/plugins/e-acsl/doc/userman/frama-c-book.cls
+++ /dev/null
@@ -1,332 +0,0 @@
-% --------------------------------------------------------------------------
-% ---  LaTeX Class for Frama-C Books                                     ---
-% --------------------------------------------------------------------------
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{frama-c-book}[2009/02/05 LaTeX Class for Frama-C Books]
-% --------------------------------------------------------------------------
-% ---  Base Class management                                             ---
-% --------------------------------------------------------------------------
-\LoadClass[a4paper,11pt,twoside,openright]{report}
-\DeclareOption{web}{\PassOptionsToPackage{colorlinks,urlcolor=blue}{hyperref}}
-\DeclareOption{paper}{\PassOptionsToPackage{pdfborder=0 0 0}{hyperref}}
-\ProcessOptions
-\RequirePackage{fullpage}
-\RequirePackage{hevea}
-\RequirePackage{ifthen}
-\RequirePackage[T1]{fontenc}
-\RequirePackage[latin1]{inputenc}
-\RequirePackage[a4paper,pdftex,pdfstartview=FitH]{hyperref}
-\RequirePackage{amssymb}
-\RequirePackage{xcolor}
-\RequirePackage[pdftex]{graphicx}
-\RequirePackage{xspace}
-\RequirePackage{makeidx}
-\RequirePackage[leftbars]{changebar}
-\RequirePackage[english]{babel}
-\RequirePackage{fancyhdr}
-\RequirePackage{titlesec}
-% --------------------------------------------------------------------------
-% ---  Page Layout                                                       ---
-% --------------------------------------------------------------------------
-\setlength{\voffset}{-6mm}
-\setlength{\headsep}{8mm}
-\setlength{\footskip}{21mm}
-\setlength{\textheight}{238mm}
-\setlength{\topmargin}{0mm}
-\setlength{\textwidth}{155mm}
-\setlength{\oddsidemargin}{2mm}
-\setlength{\evensidemargin}{-2mm}
-\setlength{\changebarsep}{0.5cm}
-\setlength{\headheight}{13.6pt}
-\def\put@bg(#1,#2,#3)#4{\setlength\unitlength{1cm}%
-  \begin{picture}(0,0)(#1,#2)
-    \put(0,0){\includegraphics[width=#3cm]{#4}}
-  \end{picture}}
-\fancypagestyle{plain}{%
-  \fancyfoot{}
-  \fancyhead{}
-  \fancyhead[LE]{\put@bg(2.4,27.425,21){frama-c-left.pdf}}
-  \fancyhead[LO]{\put@bg(2.7,27.425,21){frama-c-right.pdf}}
-  \fancyhead[CE]{\scriptsize\textsf{\leftmark}}
-  \fancyhead[CO]{\scriptsize\textsf{\rightmark}}
-  \fancyfoot[C]{\small\textsf{\thepage}}
-  \renewcommand{\headrulewidth}{0pt}
-  \renewcommand{\footrulewidth}{0pt}
-}
-\fancypagestyle{blank}{%
-  \fancyfoot{}
-  \fancyhead{}
-  \fancyhead[LE]{\put@bg(2.4,27.425,21){frama-c-left.pdf}}
-  \fancyhead[LO]{\put@bg(2.7,27.425,21){frama-c-right.pdf}}
-}
-%% Redefinition of cleardoublepage for empty page being blank
-\def\cleardoublepagewith#1{\clearpage\if@twoside \ifodd\c@page\else
-\hbox{}
-\thispagestyle{#1}
-\newpage
-\fi\fi}
-\def\cleardoublepage{\cleardoublepagewith{blank}}
-\pagestyle{plain}
-
-% --------------------------------------------------------------------------
-% ---  Cover Page                                                        ---
-% --------------------------------------------------------------------------
-\newcommand{\coverpage}[1]{%
-\thispagestyle{empty}
-\setlength\unitlength{1cm}
-\begin{picture}(0,0)(3.27,26.75)
-\put(0.58,0.70){\includegraphics[width=20.9cm]{frama-c-cover.pdf}}
-\put(2.0,20.5){\makebox[8cm][l]{\fontfamily{phv}\fontseries{m}\fontsize{24}{2}\selectfont #1}}
-\end{picture}
-}
-
-% --------------------------------------------------------------------------
-% ---  Title Page                                                        ---
-% --------------------------------------------------------------------------
-\renewenvironment{titlepage}%
-{\cleardoublepagewith{empty}\thispagestyle{empty}\begin{center}}%
-{\end{center}}
-\renewcommand{\title}[2]{
-\vspace{20mm}
-{\Huge\bfseries #1}
-
-\bigskip
-
-{\LARGE #2}
-\vspace{20mm}
-}
-\renewcommand{\author}[1]{
-\vspace{20mm}
-
-{#1}
-
-\medskip
-}
-% --------------------------------------------------------------------------
-% ---  Sectionning                                                       ---
-% --------------------------------------------------------------------------
-\titleformat{\chapter}[display]{\Huge\raggedleft}%
-{\huge\chaptertitlename\,\thechapter}{0.5em}{}
-\titleformat{\section}[hang]{\Large\bfseries}{\thesection}{1em}{}%
-[\vspace{-14pt}\rule{\textwidth}{0.1pt}\vspace{-8pt}]
-\titleformat{\subsubsection}[hang]{\bfseries}{}{}{}%
-[\vspace{-8pt}]
-
-% --------------------------------------------------------------------------
-% ---  Main Text Style                                                   ---
-% --------------------------------------------------------------------------
-%\raggedright
-\setlength\parindent{0pt}
-\setlength\parskip{1ex plus 0.3ex minus 0.2ex}
-\newenvironment{warning}[1][Warning:]{\small\paragraph{#1}\itshape}{\vspace{\parskip}}
-\def\FramaC{\textsf{Frama-C}\xspace}
-% --------------------------------------------------------------------------
-% ---  Listings                                                          ---
-% --------------------------------------------------------------------------
-\RequirePackage{listings}
-
-\lstdefinelanguage{ACSL}{%
-  morekeywords={allocates,assert,assigns,assumes,axiom,axiomatic,behavior,behaviors,
-    boolean,breaks,complete,continues,data,decreases,disjoint,ensures,
-    exit_behavior,frees,ghost,global,inductive,integer,invariant,lemma,logic,loop,
-    model,predicate,reads,real,requires,returns,sizeof,strong,struct,terminates,type,
-    union,variant},
-  keywordsprefix={\\},
-  alsoletter={\\},
-  morecomment=[l]{//}
-}
-
-\lstloadlanguages{[ANSI]C,[Objective]Caml,csh,ACSL}
-\definecolor{lstbg}{gray}{0.98}
-\definecolor{lstfg}{gray}{0.10}
-\definecolor{lstrule}{gray}{0.6}
-\definecolor{lstnum}{gray}{0.4}
-\definecolor{lsttxt}{rgb}{0.3,0.2,0.6}
-\definecolor{lstmodule}{rgb}{0.3,0.6,0.2}%{0.6,0.6,0.2}
-\definecolor{lstspecial}{rgb}{0.2,0.6,0.0}
-\definecolor{lstfile}{gray}{0.85}
-\newcommand{\lstbrk}{\mbox{$\color{blue}\scriptstyle\cdots$}}
-\def\lp@basic{\ifmmode\normalfont\mathtt\mdseries\scriptsize\else\normalfont\ttfamily\mdseries\scriptsize\fi}
-\def\lp@inline{\ifmmode\normalfont\mathtt\scriptstyle\else\normalfont\ttfamily\mdseries\small\fi}
-\def\lp@keyword{}
-\def\lp@special{\color{lstfg}}
-\def\lp@comment{\normalfont\ttfamily\mdseries}
-\def\lp@string{\color{lstfg}} \def\lp@ident{}
-\def\lp@number{\rmfamily\tiny\color{lstnum}}
-\lstdefinestyle{frama-c-style}{%
-  basicstyle=\lp@inline,%
-  identifierstyle=\lp@ident,%
-  commentstyle=\lp@comment,%
-  keywordstyle={\ifmmode\mathsf\else\sffamily\fi},%
-  keywordstyle=[2]\lp@special,%
-  stringstyle=\lp@string,%
-  emphstyle=\lp@ident\underbar,%
-  showstringspaces=false,%
-  mathescape=true,%
-  numberstyle=\lp@number,%
-  xleftmargin=6ex,xrightmargin=2ex,%
-  framexleftmargin=1ex,%
-  frame=l,%
-  framerule=1pt,%
-  rulecolor=\color{lstrule},%
-  backgroundcolor=\color{lstbg},%
-  moredelim={*[s]{/*@}{*/}},%
-  moredelim={*[l]{//@}},%
-  morecomment={[il]{//NOPP-LINE}},% invisible comment until end of line
-  morecomment={[is]{//NOPP-BEGIN}{NOPP-END\^^M}},% no space after NOPP-END
-  mathescape=true,
-  escapechar=`
-% breaklines is broken when using a inline and background
-%  breaklines,prebreak={\lstbrk},postbreak={\lstbrk},breakindent=5ex %
-}
-
-\lstdefinestyle{c}%
-{language={[ANSI]C},alsolanguage=ACSL,style=frama-c-style}
-\lstdefinestyle{c-basic}%
-{language={[ANSI]C},alsolanguage=ACSL,style=frama-c-style,basicstyle=\lp@basic}
-
-
-% --- C/ACSL Stuff ---------------------------------------------------------
-% Make 'c' the default style
-\lstset{style=c}
-
-\newcommand{\listinginput}[3][1]%
-{\lstinputlisting[style=c-basic,numbers=left,stepnumber=#1,firstnumber=#2]{#3}}
-
-\newcommand{\listinginputcaption}[4][1]%
-{\lstinputlisting[style=c-basic,numbers=left,stepnumber=#1,firstnumber=#2,title=#3]{#4}}
-
-\lstnewenvironment{listing}[2][1]%
-{\lstset{style=c-basic,numbers=left,stepnumber=#1,firstnumber=#2}}{}
-
-\lstnewenvironment{listing-nonumber}%
-{\lstset{style=c,numbers=none,basicstyle=\lp@basic}}{}
-
-% --- Verbatim Stuff -------------------------------------------------------
-\lstdefinelanguage{Shell}[]{csh}%
-{identifierstyle=\lp@basic,mathescape=false,backgroundcolor=,literate={\\\$}{\$}1}
-\lstnewenvironment{shell}[1][]{\lstset{language=Shell,basicstyle=\lp@basic,#1}}{}
-
-% ---- Stdout Stuff --------------------------------------------------------
-\lstdefinelanguage{Logs}[]{csh}%
-{identifierstyle=\lp@basic,backgroundcolor=}
-\lstnewenvironment{logs}[1][]{\lstset{language=Logs,basicstyle=\lp@basic,#1}}{}
-\newcommand{\logsinput}[1]%
-{\lstinputlisting[language=Logs,basicstyle=\lp@basic]{#1}}
-
-% --------------------------------------------------------------------------
-% ---  Developer Code Stuff                                              ---
-% --------------------------------------------------------------------------
-
-\newcommand{\listingname}[1]{\colorbox{lstfile}{\footnotesize\sffamily File \bfseries #1}\vspace{-4pt}}
-
-% --- Style ----------------------------------------------------------------
-\lstdefinestyle{framac-code-style}{%
-basicstyle=\lp@inline,%
-numberstyle=\lp@number,%
-keywordstyle=[1]\sffamily\color{lstmodule},%
-keywordstyle=[2]\sffamily\color{lstspecial},%
-keywordstyle=[3]\sffamily\bfseries,%
-identifierstyle=\rmfamily,%
-stringstyle=\ttfamily\color{lstfg},%
-commentstyle=\rmfamily\bfseries\color{lsttxt},%
-}
-\lstdefinestyle{framac-shell-style}{%
-mathescape=false,%
-basicstyle=\lp@basic,%
-numberstyle=\lp@number,%
-keywordstyle=\sffamily\bfseries,%
-keywordstyle=[1]\sffamily\color{lstmodule},%
-keywordstyle=[2]\sffamily\color{lstspecial},%
-keywordstyle=[3]\sffamily\bfseries,%
-identifierstyle=\ttfamily,%
-stringstyle=\ttfamily\color{lstfg},%
-commentstyle=\rmfamily\bfseries\color{lsttxt},%
-literate={\\\$}{\$}1,%
-}
-% --- Configure ------------------------------------------------------------
-\lstdefinelanguage{Configure}[]{csh}{%
-style=framac-shell-style,%
-morekeywords={fi},%
-}
-\lstnewenvironment{configurecode}[1][]%
-{\lstset{language=Configure,#1}}{}
-\newcommand{\configureinput}[1]{\lstinputlisting[language=Configure]{#1}}
-% --- Makefile  ------------------------------------------------------------
-\lstdefinelanguage{Makefile}[]{make}{%
-style=framac-shell-style,%
-morekeywords={include},%
-}
-\lstnewenvironment{makefilecode}[1][]%
-{\lstset{language=Makefile,#1}}{}
-\newcommand{\makefileinput}[1]{\lstinputlisting[language=Makefile]{#1}}
-% --- C- for Developer  ----------------------------------------------------
-\lstdefinestyle{framac-code}%
-  {language={[ANSI]C},alsolanguage=ACSL,style=framac-code-style,basicstyle=\lp@basic}
-\lstnewenvironment{ccode}[1][]%
-{\lstset{language={[ANSI]C},alsolanguage=ACSL,style=framac-code-style,basicstyle=\lp@basic,#1}}{}
-\newcommand{\cinput}[1]%
-{\lstinputlisting[language={[ANSI]C},alsolanguage=ACSL,style=framac-code-style,basicstyle=\lp@basic]{#1}}
-\newcommand{\cinline}[1]%
-{\lstinline[style=framac-code]{#1}}
-% --- Ocaml ----------------------------------------------------------------
-\lstdefinelanguage{Ocaml}[Objective]{Caml}{%
-style=framac-code-style,%
-deletekeywords={when,module,struct,sig,begin,end},%
-morekeywords=[2]{failwith,raise,when},%
-morekeywords=[3]{module,struct,sig,begin,end},%
-literate=%
-{~}{${\scriptstyle\thicksim}$}1%
-{<}{$<$}1%
-{>}{$>$}1%
-{->}{$\rightarrow$}1%
-{<-}{$\leftarrow$}1%
-{:=}{$\leftarrow$}1%
-{<=}{$\leq$}1%
-{>=}{$\geq$}1%
-{==}{$\equiv$}1%
-{!=}{$\not\equiv$}1%
-{<>}{$\neq$}1%
-{'a}{$\alpha$}1%
-{'b}{$\beta$}1%
-{'c}{$\gamma$}1%
-{µ}{`{}}1%
-}
-
-\lstdefinestyle{ocaml-basic}%
-{language=Ocaml,basicstyle=\lp@basic}
-\newcommand{\ocamlinput}[2][]{\lstinputlisting[style=ocaml-basic,#1]{#2}}
-\lstnewenvironment{ocamlcode}[1][]{\lstset{style=ocaml-basic,#1}}{}
-% --------------------------------------------------------------------------
-\lstdefinelanguage{Why}{%
-  morekeywords={
-    type, logic, axiom, predicate, goal,
-    forall, let, in,
-  },
-  morecomment=[s]{(*}{*)},
-  alsoletter={_},
-  literate=%
-  {->}{$\Rightarrow$}1%
-  {forall}{$\forall$}1%
-  {not}{$\neg$}1%
-  {<>}{$\neq$}1%
-  {...}{$\dots$}1%
-  %{_}{\_}1%
-  %{_}{{\rule[0pt]{1ex}{.2pt}}}1%
-  }
-
-\lstdefinestyle{why-style}{%
-language=Why,%
-style=framac-code-style,%
-basicstyle=\lp@inline,%
-}
-
-\lstnewenvironment{whycode}[1][]{\lstset{style=why-style,#1}}{}
-\newcommand{\whyinput}[1]%
-{\lstinputlisting[style=why-style,basicstyle=\lp@basic]{#1}}
-\newcommand{\whyinline}[1]%
-{\lstinline[style=why-style]{#1}}
-
-% --------------------------------------------------------------------------
-% ---  End.                                                              ---
-% --------------------------------------------------------------------------
diff --git a/src/plugins/e-acsl/doc/userman/frama-c-cover.pdf b/src/plugins/e-acsl/doc/userman/frama-c-cover.pdf
deleted file mode 100644
index 4e14243c8064ca92d696fd354476dcdb31092895..0000000000000000000000000000000000000000
Binary files a/src/plugins/e-acsl/doc/userman/frama-c-cover.pdf and /dev/null differ
diff --git a/src/plugins/e-acsl/doc/userman/frama-c-left.pdf b/src/plugins/e-acsl/doc/userman/frama-c-left.pdf
deleted file mode 100644
index ddf8888d292539177ab81c1b33d6411edf51c820..0000000000000000000000000000000000000000
Binary files a/src/plugins/e-acsl/doc/userman/frama-c-left.pdf and /dev/null differ
diff --git a/src/plugins/e-acsl/doc/userman/frama-c-right.pdf b/src/plugins/e-acsl/doc/userman/frama-c-right.pdf
deleted file mode 100644
index db9b236dfdb19d9a6631ec55eee63f431f8d6f0d..0000000000000000000000000000000000000000
Binary files a/src/plugins/e-acsl/doc/userman/frama-c-right.pdf and /dev/null differ
diff --git a/src/plugins/e-acsl/doc/userman/introduction.tex b/src/plugins/e-acsl/doc/userman/introduction.tex
index 08956a9c61a38d24453af8840b7fb9f146a23c35..dd28d602b2827650750e45e4e4f9c4e35b196509 100644
--- a/src/plugins/e-acsl/doc/userman/introduction.tex
+++ b/src/plugins/e-acsl/doc/userman/introduction.tex
@@ -15,7 +15,7 @@ program.
 checking''~\cite{runtime-assertion-checking}\footnote{In our context, ``runtime
   annotation checking'' would be more precise.}. This is the primary goal of
 \eacsl. Indirectly, in combination with the \rte plug-in~\cite{rte} of \framac,
-this 
+this
 usage allows the user to detect undefined behaviors in its \C code. Second, it
 allows to combine \framac and its existing analyzers with other \C analyzers
 that do not natively understand the \acsl specification language. Third, the
@@ -38,10 +38,12 @@ previous paragraph. Using \eacsl this way is therefore a fully automatic
 process. Many usages, including automatic usages, are described in companion
 research papers~\cite{rv13tutorial,rvcubes17tool,signoles18hdr}.
 
-This manual does \emph{not} explain how to install the \eacsl plug-in.  For
-installation instructions please refer to the \texttt{INSTALL} file in the
-\eacsl distribution. \index{Installation} Furthermore, even though this manual
-provides examples, it is \emph{not} a full comprehensive tutorial on
+The \eacsl plug-in is installed with \framac, but this manual does \emph{not}
+explain how to install \framac.  For installation instructions please refer to
+the \texttt{INSTALL}\footnote{
+  \url{https://git.frama-c.com/pub/frama-c/blob/master/INSTALL.md}}
+file in the \framac distribution. \index{Installation} Furthermore, even though
+this manual provides examples, it is \emph{not} a full comprehensive tutorial on
 \framac or \eacsl.
 % You can still refer to any external
 % tutorial~\cite{rv13tutorial} for additional examples.
diff --git a/src/plugins/e-acsl/doc/userman/limitations.tex b/src/plugins/e-acsl/doc/userman/limitations.tex
index 45caa5d91dc753ea7b10f85f37b2c7ed3b01dae8..1a20cd3d97cc68c063e915f3819b1d27b1404a4c 100644
--- a/src/plugins/e-acsl/doc/userman/limitations.tex
+++ b/src/plugins/e-acsl/doc/userman/limitations.tex
@@ -5,12 +5,13 @@ reference manual~\cite{eacsl} is not yet fully supported. Which annotations can
 already be translated into \C code and which cannot is defined in a separate
 document~\cite{eacsl-implem}. Second, even though we do our best to avoid them,
 bugs may exist. If you find a new one, please report it on the bug tracking
-system\footnote{\url{http://bts.frama-c.com}} (see Chapter 10 of the \framac
-User Manual~\cite{userman}). Third, there
-are some additional known limitations, which could be annoying for the user in
-some cases, but are tedious to lift. Please contact us if you are interested in
-lifting these limitations\footnote{Read \url{http://frama-c.com/support.html}
-  for additional details.}.
+system\footnote{\url{https://git.frama-c.com/pub/frama-c/-/issues}} (see Chapter
+10 of the \framac User Manual~\cite{userman}). Third, there are some additional
+known limitations, which could be annoying for the user in some cases, but are
+tedious to lift. Please contact us if you are interested in lifting these
+limitations\footnote{Read
+  \url{https://git.frama-c.com/pub/frama-c/blob/master/CONTRIBUTING.md} for
+  additional details.}.
 
 \section{Supported Systems}
 
@@ -53,8 +54,8 @@ may get no runtime error depending on your \C compiler, but the behavior is
 actually undefined because the assertion reads the uninitialized variable
 \lstinline|x|. You should be caught by the \eacsl plug-in, but that is not
 the case yet.
-\begin{shell}
 
+\begin{shell}
 \$ e-acsl-gcc.sh uninitialized.i -c -Omonitored_uninitialized
 monitored_uninitialized.i: In function 'main':
 monitored_uninitialized.i:44:16: warning: 'x' is used uninitialized in this function
@@ -98,22 +99,26 @@ Consider the following example.
 
 You can generate the instrumented program as follows.
 \begin{shell}
-\$ e-acsl-gcc.sh -ML -omonitored_valid_no_main.i valid_no_main.c
-<skip preprocessing commands>
+\$ e-acsl-gcc.sh -M -omonitored_valid_no_main.i valid_no_main.c
+[kernel] Parsing valid_no_main.c (with preprocessing)
 [e-acsl] beginning translation.
-<skip warnings about annotations from the Frama-C libc
-  which cannot be translated>
-[kernel] warning: no entry point specified:
-  you must call function `__e_acsl_memory_init' by yourself.
+[kernel] Parsing FRAMAC_SHARE/e-acsl/e_acsl.h (with preprocessing)
+[kernel] Warning: no entry point specified:
+  you must call functions `__e_acsl_globals_init', `__e_acsl_globals_clean',
+  `__e_acsl_memory_init' and `__e_acsl_memory_clean' by yourself.
 [e-acsl] translation done in project "e-acsl".
 \end{shell}
 
 The last warning states an important point: if this program is linked against
 another file containing \texttt{main} function, then this main function must
-be modified to insert a call to the function \texttt{\_\_e\_acsl\_memory\_init}
+be modified to insert a calls to the functions
+\texttt{\_\_e\_acsl\_globals\_init}
+\index{e\_acsl\_globals\_init@\texttt{\_\_e\_acsl\_globals\_init}} and
+\texttt{\_\_e\_acsl\_memory\_init}
 \index{e\_acsl\_memory\_init@\texttt{\_\_e\_acsl\_memory\_init}} at the very
-beginning. This function plays a very important role: it initializes metadata
-storage used for tracking of memory blocks. Unless this call is inserted the
+beginning. These functions play a very important role: the latter initializes
+metadata storage used for tracking of memory blocks while the former initializes
+tracking of global variables and constants. Unless these calls are inserted the
 run of a modified program is likely to fail.
 
 While it is possible to add such intrumentation manually we recommend using
@@ -125,7 +130,7 @@ While it is possible to add such intrumentation manually we recommend using
 Then just compile and run it as explained in Section~\ref{sec:memory}.
 
 \begin{shell}
-\$ e-acsl-gcc.sh -M  -omonitored_modified_main.i modified_main.c
+\$ e-acsl-gcc.sh -M -omonitored_modified_main.i modified_main.c
 \$ e-acsl-gcc.sh -C -Ovalid_no_main monitored_modified_main.i monitored_valid_no_main.i
 \$ ./valid_no_main.e-acsl
 Assertion failed at line 11 in function f.
@@ -192,7 +197,7 @@ functions.
 
 \subsection{\eacsl Namespace}
 While \eacsl uses source-to-source transformations and not binary
-instrumentations it is important that the source code provided at input does
+instrumentations it is important that the source code provided as input does
 not contain any variables or functions prefixed \T{\_\_e\_acsl\_}.  \eacsl
 reserves this namespace for its transformations, and therefore an input program
 containing such symbols beforehand may fail to be instrumented or compiled.
diff --git a/src/plugins/e-acsl/doc/userman/macros.tex b/src/plugins/e-acsl/doc/userman/macros.tex
index fd7bfa93e0321a07884ee12b0dc1c3b2853d3955..513101b9c92ffb8c0f8d08c3d0b9c41e1dd2c58f 100644
--- a/src/plugins/e-acsl/doc/userman/macros.tex
+++ b/src/plugins/e-acsl/doc/userman/macros.tex
@@ -1,5 +1,5 @@
-%%% Environnements dont le corps est suprimé, et
-%%% commandes dont la définition est vide,
+%%% Environnements dont le corps est suprimé, et
+%%% commandes dont la définition est vide,
 %%% lorsque PrintRemarks=false
 
 \usepackage{comment}
@@ -114,7 +114,7 @@ evolve in the future and/or not work as expected.}}
   \ifthenelse{\isundefined{\myrq}}{}{\footnote{\myrq}}\end{changebar}}}%
 {\excludecomment{notreviewedenv}}
 
-%%% Commandes et environnements pour la version relative à l'implementation
+%%% Commandes et environnements pour la version relative à l'implementation
 \newcommand{\highlightnotimplemented}{%
 \ifthenelse{\boolean{ColorImplementationRq}}{\color{red}}%
            {\ul}%
diff --git a/src/plugins/e-acsl/doc/userman/main.tex b/src/plugins/e-acsl/doc/userman/main.tex
index f2f73c8229cab00bfd68472c81be15710c4f45ae..e09b1f891832af3bdce652e3a6396aaebe8888c6 100644
--- a/src/plugins/e-acsl/doc/userman/main.tex
+++ b/src/plugins/e-acsl/doc/userman/main.tex
@@ -5,6 +5,7 @@
 
 \include{macros}
 \include{eacslversion}
+\input{./frama-c-affiliation.tex}
 
 \makeindex
 
@@ -17,12 +18,12 @@
 \includegraphics[height=14mm]{cealistlogo.jpg}
 \end{flushleft}
 \vfill
-\title{\eacsl Plug-in}{Release \eacslpluginversion
+\title{\eacsl Plug-in}{Release \eacslpluginversion (\eacslplugincodename)
  \ifthenelse{\equal{\eacslpluginversion}{\fcversion}}{}{%
    \\[1em] compatible with \framac \fcversion}}
-\author{Julien Signoles and Kostyantyn Vorobyov}
+\author{Julien Signoles, Basile Desloges and Kostyantyn Vorobyov}
 \begin{center}
-CEA LIST\\ Software Reliability \& Security Laboratory
+\fcaffiliationen
 \end{center}
 \vfill
 \begin{flushleft}
@@ -41,8 +42,8 @@ CEA LIST\\ Software Reliability \& Security Laboratory
 \addcontentsline{toc}{chapter}{Foreword}
 
 This is the user manual of the \framac plug-in
-\eacsl\footnote{\url{https://frama-c.com/eacsl.html}}. The contents of this
-document correspond to its version \eacslpluginversion compatible with
+\eacsl\footnote{\url{https://frama-c.com/fc-plugins/e-acsl.html}}. The contents
+of this document correspond to its version \eacslpluginversion compatible with
 \fcversion version of \framac~\cite{userman,fac15}.  The development of
 the \eacsl plug-in is still ongoing.  Features described by this document may
 evolve in the future.
@@ -50,9 +51,8 @@ evolve in the future.
 \section*{Acknowledgements}
 
 We gratefully thank the people who contributed to this document:
-Basile Desloges, Pierre-Lo\"ic Garoche, Jens Gerlach, Florent Kirchner,
-Nikola\"i Kosmatov, Andr\'e Oliveira Maroneze, Fonenantsoa Maurica, and
-Guillaume Petiot.
+Pierre-Lo\"ic Garoche, Jens Gerlach, Florent Kirchner, Nikola\"i Kosmatov,
+Andr\'e Oliveira Maroneze, Fonenantsoa Maurica, and Guillaume Petiot.
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
diff --git a/src/plugins/e-acsl/doc/userman/provides.tex b/src/plugins/e-acsl/doc/userman/provides.tex
index f9dedfdf86881ca09adbaa043b83b45d4bb5087a..f393932c92ffcd66ac781425ac4f6380ad53e955 100644
--- a/src/plugins/e-acsl/doc/userman/provides.tex
+++ b/src/plugins/e-acsl/doc/userman/provides.tex
@@ -44,13 +44,9 @@ Running \eacsl on \texttt{first.i} consists of adding \shortopt{e-acsl} option
 to the \framac command line:
 \begin{shell}
 \$ frama-c -e-acsl first.i
-[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing)
-[kernel] Parsing FRAMAC_SHARE/e-acsl/e_acsl.h (with preprocessing)
-[kernel] Parsing FRAMAC_SHARE/e-acsl/e_acsl_gmp.h (with preprocessing)
-[kernel] Parsing FRAMAC_SHARE/e-acsl/e_acsl_mmodel_api.h (with preprocessing)
 [kernel] Parsing first.i (no preprocessing)
 [e-acsl] beginning translation.
-<skip a warning when translating the Frama-C libc>
+[kernel] Parsing FRAMAC_SHARE/e-acsl/e_acsl.h (with preprocessing)
 [e-acsl] translation done in project "e-acsl".
 \end{shell}
 
@@ -58,8 +54,8 @@ Even though \texttt{first.i} has already been pre-processed, \eacsl first asks
 the \framac kernel to process and combine it against several header files
 provided by the \eacsl plug-in.  Further \eacsl translates the annotated code
 into a new \framac project named \texttt{e-acsl}\footnote{The notion of
-\emph{project} is explained in Section 8.1 of the \framac user
-manual~\cite{userman}.}. By default, the option \shortopt{e-acsl} does nothing
+  \emph{project} is explained in Section 8.1 of the \framac user
+  manual~\cite{userman}.}. By default, the option \shortopt{e-acsl} does nothing
 more. It is however possible to have a look at the generated code in the
 \framac GUI. This is also possible through the command line thanks to the
 kernel options \shortopt{then-last} and \shortopt{print}. The former
@@ -72,15 +68,15 @@ As you can see, the generated code contains additional type declarations,
 constant declarations and global \acsl annotations not present in the initial
 file \texttt{first.i}. They are part of the \eacsl monitoring library. You can
 safely ignore them for now. The translated \texttt{main} function of
-\texttt{first.i} is displayed at the end. After each \eacsl annotation,
+\texttt{first.i} is displayed at the end. Before each \eacsl annotation,
 a call to \texttt{\_\_e\_acsl\_assert}\codeidx{e\_acsl\_assert} has been added.
 
 \begin{minipage}{\linewidth}
 \begin{ccode}
-  /*@ assert x == 0; */
-  __e_acsl_assert(x == 0,(char *)"Assertion",(char *)"main",(char *)"x == 0",3);
-  /*@ assert x == 1; */
-  __e_acsl_assert(x == 1,(char *)"Assertion",(char *)"main",(char *)"x == 1",4);
+  __e_acsl_assert(x == 0,"Assertion","main","x == 0","first.i",3);
+  /*@ assert x == 0; */ ;
+  __e_acsl_assert(x == 1,"Assertion","main","x == 1","first.i",4);
+  /*@ assert x == 1; */ ;
 \end{ccode}
 \end{minipage}
 
@@ -117,15 +113,15 @@ corresponding to your compiler and your system. For instance, in a 64-bit
 machine you should also pass
 \shortopt{machdep} \texttt{x86\_64} option as follows:
 \begin{shell}
-  \$ frama-c -machdep x86_64 -e-acsl first.i -then-last \
-    -print -ocode monitored_first.c
+\$ frama-c -machdep x86_64 -e-acsl first.i -then-last \
+  -print -ocode monitored_first.c
 \end{shell}
 
 This file can be compile with a \C compiler (for instance \gcc), as follows:
 
 \lstset{escapechar=£}
 \begin{shell}
-\$  gcc -c -Wno-attributes monitored_first.c
+\$ gcc -c -Wno-attributes monitored_first.c
 \end{shell}
 
 However, creating an executable through a proper invokation to \gcc is painful
@@ -154,7 +150,7 @@ The default behaviour of \eacslgcc is to instrument an annotated C program
 with runtime assertions via a run of \framac.
 
 \begin{shell}
- \$ e-acsl-gcc.sh -omonitored_first.i first.i
+\$ e-acsl-gcc.sh -omonitored_first.i first.i
 \end{shell}
 
 The above command instruments \texttt{first.i} with runtime assertions and
@@ -167,7 +163,7 @@ Compilation and Linking of the original and the instrumented sources
 is enabled using the \shortopt{c} option.  For instance, command
 
 \begin{shell}
- \$ e-acsl-gcc.sh -c -omonitored_first.i first.i
+\$ e-acsl-gcc.sh -c -omonitored_first.i first.i
 \end{shell}
 
 instruments the code in \texttt{first.i}, outputs it to
@@ -180,18 +176,19 @@ You can execute the generate binaries, in particular \texttt{a.out.e-acsl} which
 detects at runtime the incorrect annotation.
 \begin{shell}
 \$ ./a.out.e-acsl
-Assertion failed at line 4 in function main.
-The failing predicate is:
-x == 1.
-Aborted
+first.i: In function 'main'
+first.i:4: Error: Assertion failed:
+        The failing predicate is:
+        x == 1.
+Aborted (core dumped)
 \$ echo \$?
 134
 \end{shell}
 The execution aborts with a non-zero exit code (134) and an error message
-indicating \eacsl annotation that has been violated. There is no output for the
-valid \eacsl annotation. That is, the run of an executable generated from the
-instrumented source file (i.e., \texttt{monitored\_first.i}) detects that the
-second annotation in the initial program is invalid, whereas the first
+indicating an \eacsl annotation that has been violated. There is no output for
+the valid \eacsl annotation. That is, the run of an executable generated from
+the instrumented source file (i.e., \texttt{monitored\_first.i}) detects that
+the second annotation in the initial program is invalid, whereas the first
 annotation holds for this execution.
 
 Named executables can be created using the \shortopt{O} option.  This is such
@@ -201,7 +198,7 @@ generated from the original program and the executable generated from the
 
 For example, command
 \begin{shell}
- \$ e-acsl-gcc.sh -c -omonitored_first.i -Omonitored_first first.i
+\$ e-acsl-gcc.sh -c -omonitored_first.i -Omonitored_first first.i
 \end{shell}
 names the executables generated from \texttt{first.i} and
 \texttt{monitored\_first.i}: \texttt{monitored\_first} and
@@ -213,7 +210,7 @@ plug-in.  This option is useful if one makes changes to an already
 instrumented source file by hand and only wants to recompile it.
 
 \begin{shell}
- \$ e-acsl-gcc.sh -C -Omonitored_first monitored_first.i
+\$ e-acsl-gcc.sh -C -Omonitored_first monitored_first.i
 \end{shell}
 
 The above command generates a single executable named
@@ -230,16 +227,16 @@ also be passed using \shortopt{I} and \shortopt{G} options
 respectively, for instance as follows:
 
 \begin{shell}
- \$ e-acsl-gcc.sh -I/usr/local/bin/frama-c -G/usr/bin/gcc6 foo.c
+\$ e-acsl-gcc.sh -I/usr/local/bin/frama-c -G/usr/bin/gcc6 foo.c
 \end{shell}
 
 Runs of \framac and \gcc issued by \eacslgcc can further be customized by using
 additional flags.  \framac flags can be passed using the \shortopt{F} option,
-while \shortopt{l} and \shortopt{e} options allow for passing additional
+while \shortopt{e} and \shortopt{l} options allow for passing additional
 pre-processor and linker flags during \gcc invocations.  For example, command
 
 \begin{shell}
- \$ e-acsl-gcc.sh -c -F"-unicode" -e"-I/bar -I/baz" foo.c
+\$ e-acsl-gcc.sh -c -F"-unicode" -e"-I/bar -I/baz" foo.c
 \end{shell}
 
 yields an instrumented program \texttt{a.out.frama.c} where ACSL formulas
@@ -264,7 +261,7 @@ the \framac kernel while instrumenting \texttt{foo.c} one can use the following
 command:
 
 \begin{shell}
- \$ e-acsl-gcc.sh -v5 -F"-kernel-verbose 0" foo.c
+\$ e-acsl-gcc.sh -v5 -F"-kernel-verbose 0" foo.c
 \end{shell}
 
 Verbosity of the \eacslgcc output can also be reduced using the \shortopt{q}
@@ -277,7 +274,7 @@ output during instrumentation and compilation of \texttt{foo.c} to the
 file named \texttt{/tmp/log}.
 
 \begin{shell}
- \$ e-acsl-gcc.sh -c -s/tmp/log foo.c
+\$ e-acsl-gcc.sh -c -s/tmp/log foo.c
 \end{shell}
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -304,6 +301,7 @@ One of the benefits of using the wrapper script is that it makes sure that
 further passed \shortopt{m64} or \shortopt{m32} options to generate code using
 64-bit or 32-bit ABI respectively.
 
+
 At the present stage of implementation \eacsl does not support generating
 executables with ABI different to the default one.
 
@@ -313,13 +311,13 @@ executables with ABI different to the default one.
 For full up-to-date documentation of \eacslgcc see its man page:
 
 \begin{shell}
-    \$ man e-acsl-gcc.sh
+\$ man e-acsl-gcc.sh
 \end{shell}
 
 Alternatively, you can also use the \shortopt{h} option of \eacslgcc:
 
 \begin{shell}
-    \$ man e-acsl-gcc.sh -h
+\$ e-acsl-gcc.sh -h
 \end{shell}
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -347,8 +345,8 @@ is undefined if $e$ leads to a runtime error and, consequently, the semantics of
 any term $t$ (resp. predicate $p$) containing such a construct $c$ is
 undefined as soon as $e$ has to be evaluated in order to evaluate $t$
 (resp. $p$). The \eacsl Reference Manual also states that \emph{``it is the
-responsibility of each tool which interprets \eacsl to ensure that an
-undefined term is never evaluated''}~\cite{eacsl}.
+  responsibility of each tool which interprets \eacsl to ensure that an
+  undefined term is never evaluated''}~\cite{eacsl}.
 
 Accordingly, the \eacsl plug-in prevents an undefined term from being
 evaluated. If an annotation contains such a term, \eacsl will report a proper
@@ -390,20 +388,20 @@ line.
 
 It might be particularly useful in one of the following contexts:
 \begin{itemize}
-\item several libc functions used by the analyzed program are still not defined
-  in the \framac libc; or
-\item your system libc and the \framac libc mismatch about several function
-  types (for instance, your system libc is not 100\% POSIX compliant); or
-\item several \framac lib functions get a contract and you are not interested in
-  verifying them (for instance, only checking undefine behaviors matters).
+  \item several libc functions used by the analyzed program are still not defined
+        in the \framac libc; or
+  \item your system libc and the \framac libc mismatch about several function
+        types (for instance, your system libc is not 100\% POSIX compliant); or
+  \item several \framac lib functions get a contract and you are not interested in
+        verifying them (for instance, only checking undefine behaviors matters).
 \end{itemize}
 
 \begin{important}
-Notably, \eacslgcc disables \framac libc by default. This is because most of
-its functions are annotated with \eacsl contracts and generating code for
-these contracts results in additional runtime overheads. To enforce default
-\framac contracts with \eacslgcc you can pass \shortopt{L} option to the wrapper
-script.
+  Notably, \eacslgcc disables \framac libc by default. This is because most of
+  its functions are annotated with \eacsl contracts and generating code for
+  these contracts results in additional runtime overheads. To enforce default
+  \framac contracts with \eacslgcc you can pass \shortopt{L} option to the wrapper
+  script.
 \end{important}
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -464,10 +462,11 @@ reports the violation of the second annotation:
 \begin{shell}
 \$ e-acsl-gcc.sh -c -Ovalid valid.c
 \$ ./valid.e-acsl
-Assertion failed at line 11 in function main.
-The failing predicate is:
-freed: \valid(x).
-Aborted
+valid.c: In function 'main'
+valid.c:11: Error: Assertion failed:
+        The failing predicate is:
+        freed: \valid(x).
+Aborted (core dumped)
 \end{shell}
 
 To check memory-related predicates (such as \lstinline|\valid|) \eacsl tracks
@@ -494,11 +493,10 @@ location \T{x} as belonging unallocated memory space.
 Memory tracking implemented by the \eacsl library comes in two flavours dubbed
 \I{bittree-based} and \I{segment-based} memory models. With the bittree-based
 model meta-storage is implemented as a compact prefix trie called Patricia
-trie~\cite{rv13}, whereas segment-based memory model
-\footnote{Segment-based model of \eacsl has not yet appeared in the literature.}
-is based on shadow memory~\cite{pldi16}. The functionality of the provided
-memory models is equivalent, however they differ in performance. We further
-discuss performance considerations.
+trie~\cite{rv13}, whereas segment-based memory model is based on shadow
+memory~\cite{vorobyov17ismm}. The functionality of the provided memory models is
+equivalent, however they differ in performance. We further discuss performance
+considerations.
 
 The \eacsl models allocate heap memory using a customized version of the
 \dlmalloc\footnote{\url{http://dlmalloc.net/}} memory allocator replacing
@@ -537,7 +535,7 @@ performance. The bittree-based model uses compact memory representation of
 metadata. The segment-based model on the other hand uses significantly more
 memory. You can expect over 2x times memory overheads when using it. However It
 is often an order of magnitude faster than the bittree-based
-model~\cite{pldi16}.
+model~\cite{vorobyov17ismm}.
 
 %[Need ref here with comparison of the performance. Ideally a reference to the PLDI paper].
 
@@ -553,9 +551,9 @@ feature can be enabled using the \shortopt{M} switch of \eacslgcc or
 \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
-for the time being. When handling a large piece of code, it might be necessary
-to deactivate it and systematically instrument the code as explained above.
+  The above-mentioned static analysis is probably the less robust part of \eacsl
+  for the time being. When handling a large piece of code, it might be necessary
+  to deactivate it and systematically instrument the code as explained above.
 \end{important}
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -636,7 +634,7 @@ that uses \texttt{exit(CODE)} instead of \texttt{abort}.
 For instance, the program generated using the following command
 exits with code \texttt{5} on a predicate violation.
 \begin{shell}
- \$ e-acsl-gcc.sh -c --fail-with-code=5 foo.c
+\$ e-acsl-gcc.sh -c --fail-with-code=5 foo.c
 \end{shell}
 
 Forceful termination of a monitored program can be disabled using
@@ -657,7 +655,7 @@ following signature:
 Additionally, it may depends on the global variable
 \texttt{\_\_e\_acsl\_sound\_verdict}\codeidxdef{e\_acsl\_sound\_verdict}. This
 variable of type \texttt{int} is set to \texttt{0} as soon as the verdict
-provided by \eacsl is not trustable anymore (see
+provided by \eacsl is not trustworthy anymore (see
 Section~\ref{sec:partial-instrumentation}).
 
 Below is an example which prints the validity status of each property but never
@@ -675,9 +673,9 @@ with the customized one specified in \texttt{my\_assert.c}
 \begin{shell}
 \$ e-acsl-gcc.sh -c -X first.i -Ofirst --external-assert=my_assert.c
 \$ ./first.e-acsl
-Assertion at line 3 in function main is valid (trustable).
+Assertion in file first.i at line 3 in function main is valid (trustworthy).
 The verified predicate was: `x == 0'.
-Assertion at line 4 in function main is invalid (trustable).
+Assertion in file first.i at line 4 in function main is invalid (trustworthy).
 The verified predicate was: `x == 1'.
 \end{shell}
 
@@ -716,16 +714,16 @@ Abort
 Whenever option \longopt{libc-replacements} of \eacslgcc is set, \eacsl is
 able to detect incorrect usage of the following libc functions:
 \begin{itemize}
-\item \texttt{memcmp}
-\item \texttt{memcpy}
-\item \texttt{memmove}
-\item \texttt{memset}
-\item \texttt{strcat}
-\item \texttt{strncat}
-\item \texttt{strcmp}
-\item \texttt{strcpy}
-\item \texttt{strncpy}
-\item \texttt{strlen}
+  \item \texttt{memcmp}
+  \item \texttt{memcpy}
+  \item \texttt{memmove}
+  \item \texttt{memset}
+  \item \texttt{strcat}
+  \item \texttt{strncat}
+  \item \texttt{strcmp}
+  \item \texttt{strcpy}
+  \item \texttt{strncpy}
+  \item \texttt{strlen}
 \end{itemize}
 
 For instance, the program below incorrectly uses \texttt{strcpy} because the
@@ -774,12 +772,13 @@ The instrumented code is generated as usual, even though you get an additional
 warning.
 \begin{shell}
 \$ e-acsl-gcc.sh no_main.i -omonitored_no_main.i
-<skip preprocessing command line>
+[kernel] Parsing no_main.i (no preprocessing)
 [e-acsl] beginning translation.
-[e-acsl] warning: cannot find entry point `main'.
-                  Please use option `-main' for specifying a valid entry point.
-                  The generated program may miss memory instrumentation.
-                  if there are memory-related annotations.
+[kernel] Parsing FRAMAC_SHARE/e-acsl/e_acsl.h (with preprocessing)
+[e-acsl] Warning: cannot find entry point `main'.
+  Please use option `-main' for specifying a valid entry point.
+  The generated program may miss memory instrumentation
+  if there are memory-related annotations.
 [e-acsl] translation done in project "e-acsl".
 \end{shell}
 
@@ -817,12 +816,12 @@ The instrumented code is generated as usual, even though you get an additional
 warning.
 \begin{shell}
 \$ e-acsl-gcc.sh -omonitored_no_code.i no_code.c
+[kernel] Parsing no_code.c (with preprocessing)
 [e-acsl] beginning translation.
-[e-acsl] warning: annotating undefined function `my_pow':
-                  the generated program may miss memory instrumentation
-                  if there are memory-related annotations.
-no_code.c:9:[kernel] warning: No code nor implicit assigns clause for function my_pow,
-generating default assigns from the prototype
+[e-acsl] Warning: annotating undefined function `my_pow':
+  the generated program may miss memory instrumentation
+  if there are memory-related annotations.
+[kernel] Parsing FRAMAC_SHARE/e-acsl/e_acsl.h (with preprocessing)
 [e-acsl] translation done in project "e-acsl".
 \end{shell}
 
@@ -840,10 +839,11 @@ executable by providing definition of \T{my\_pow}.
 \begin{shell}
 \$ e-acsl-gcc.sh -C -Ono_code pow.i monitored_no_code.i
 \$ ./no_code.e-acsl
-Postcondition failed at line 5 in function my_pow.
-The failing predicate is:
-\old(n % 2 == 0) ==> \result >= 1.
-Aborted
+no_code.c: In function 'my_pow'
+no_code.c:5: Error: Postcondition failed:
+        The failing predicate is:
+        even: \result >= 1.
+Aborted (core dumped)
 \end{shell}
 
 The execution of the corresponding binary fails at runtime: actually, our
@@ -896,21 +896,23 @@ One can ask to not instrument function \texttt{g} (\emph{i.e.} to instrument
 only functions \texttt{f} and \texttt{main}) through the following command.
 \begin{shell}
 \$ e-acsl-gcc.sh \
-    -c --oexec-e-acsl partial.out \
-    --e-acsl-extra="-e-acsl-instrument=+@all,-g"' \
-    partial.i
+  -c --oexec-e-acsl partial.out \
+  --e-acsl-extra="-e-acsl-instrument=+@all,-g" \
+  partial.i
 \end{shell}
 
 Therefore, running the generated executable \texttt{partial.out} leads to the
 following verdicts.
 \begin{shell}
 \$ ./partial.out
-warning: no sound verdict (guess: ok) at line 16 (function main).
-The considered predicate is:
-\initialized(&t[1]).
-warning: no sound verdict (guess: FAIL) at line 17 (function main).
-The considered predicate is:
-\initialized(&t[2]).
+partial.i: In function 'main'
+partial.i:16: Warning: no sound verdict for Assertion (guess: ok).
+        the considered predicate is:
+        \initialized(&t[1])
+partial.i: In function 'main'
+partial.i:17: Warning: no sound verdict for Assertion (guess: FAIL).
+        the considered predicate is:
+        \initialized(&t[2])
 \end{shell}
 
 First, there is no message for the first assertion about the initialization of
@@ -919,7 +921,7 @@ First, there is no message for the first assertion about the initialization of
 the complete instrumentation of functions \texttt{f} and \texttt{main}.
 
 Second, since function \texttt{g} was not instrumented, no sound verdict may be
-provided after executing it. It leads to the printed warnings for the two last
+provided after executing it. It leads to the printed warnings for the last two
 assertions. The indicated guesses (\texttt{ok} for the first assertion and
 \texttt{FAIL} for the second one) are the verdicts computed by \eacsl. They can
 be trusted if and only if the \eacsl instrumentation is not necessary for
@@ -957,15 +959,15 @@ are potential overflows in this case), just do:
 
 \begin{shell}
 \$ frama-c -rte combine.i -then -e-acsl -then-last -print
-          -ocode monitored_combine.i
-\$ e-acsl-gcc.sh -C -Ocombine  monitored_combine.i
-\$ ./combine.
+  -ocode monitored_combine.c
+\$ e-acsl-gcc.sh -C -Ocombine monitored_combine.c
+\$ ./combine.e-acsl
 \end{shell}
 
 Automatic assertion generation can also be enabled via \eacslgcc directly via
 the following command:
 \begin{shell}
-\$ e-acsl-gcc.sh -c -Ocombine -omonitored_combine.i --rte=all
+\$ e-acsl-gcc.sh -c -Ocombine -omonitored_combine.i --rte=all combine.i
 \end{shell}
 
 Note the use of \eacslgcc \longopt{rte} option which asks \framac to combine
@@ -987,13 +989,13 @@ prove that there is no potential overflow in the previous program, so the \eacsl
 plug-in does not generate additional code for checking them if you run the
 following command.
 \begin{shell}
-\$ frama-c -rte combine.i -then -val -then -e-acsl \
-          -then-last -print -ocode monitored_combine.i
+\$ frama-c -rte combine.i -then -eva -then -e-acsl \
+  -then-last -print -ocode monitored_combine.i
 \end{shell}
 The additional code will be generated with the two following command.
 \begin{shell}
-\$ frama-c -rte combine.i -then -val -then -e-acsl \
-          -e-acsl-valid -then-last -print -ocode monitored_combine.i
+\$ frama-c -rte combine.i -then -eva -then -e-acsl \
+  -e-acsl-valid -then-last -print -ocode monitored_combine.i
 \end{shell}
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -1014,10 +1016,9 @@ you can pass it using \shortopt{F} switch:
 
 \begin{shell}
 \$ e-acsl-gcc.sh -F"-e-acsl-project foobar" check.i
-<skip preprocessing commands>
+[kernel] Parsing check.i (no preprocessing)
 [e-acsl] beginning translation.
-check.i:4:[e-acsl] warning: E-ACSL construct `right shift' is not yet supported.
-  Ignoring annotation.
+[kernel] Parsing FRAMAC_SHARE/e-acsl/e_acsl.h (with preprocessing)
 [e-acsl] translation done in project "foobar".
 \end{shell}
 
@@ -1047,21 +1048,21 @@ which information is displayed according to the verbosing level. The level $n$
 also displays the information of all the lower levels.
 
 \begin{center}
-\begin{tabular}{|l|l|}
-\hline
-\shortopt{e-acsl-verbose 0}& only warnings and errors\\
-\hline
-\shortopt{e-acsl-verbose 1}& beginning and ending of the translation\\
-\hline
-\shortopt{e-acsl-verbose 2}& different parts of the translation and
-  functions-related information\\
-\hline
-\shortopt{e-acsl-verbose 3}& predicates- and statements-related information\\
-\hline
-\shortopt{e-acsl-verbose 4}& terms- and expressions-related information
-\\
-\hline
-\end{tabular}
+  \begin{tabular}{|l|l|}
+    \hline
+    \shortopt{e-acsl-verbose 0} & only warnings and errors                       \\
+    \hline
+    \shortopt{e-acsl-verbose 1} & beginning and ending of the translation        \\
+    \hline
+    \shortopt{e-acsl-verbose 2} & different parts of the translation and
+    functions-related information                                                \\
+    \hline
+    \shortopt{e-acsl-verbose 3} & predicates- and statements-related information \\
+    \hline
+    \shortopt{e-acsl-verbose 4} & terms- and expressions-related information
+    \\
+    \hline
+  \end{tabular}
 \end{center}
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -1074,19 +1075,19 @@ The kind of information to display is settable by the option
 parts of the translation, as detailed below.
 
 \begin{center}
-\begin{tabular}{|l|l|}
-\hline
-analysis & minimization of the instrumentation for memory-related annotation
-(section~\ref{sec:memory}) \\
-\hline
-duplication & duplication of functions with contracts
-(section~\ref{sec:no-code}) \\
-\hline
-translation & translation of an annotation into \C code\\
-\hline
-typing & minimization of the instrumentation for integers
-(section~\ref{sec:integers}) \\
-\hline
-\end{tabular}
+  \begin{tabular}{|l|l|}
+    \hline
+    analysis    & minimization of the instrumentation for memory-related annotation
+    (section~\ref{sec:memory})                                                      \\
+    \hline
+    preparation & duplication of functions with contracts
+    (section~\ref{sec:no-code})                                                     \\
+    \hline
+    translation & translation of an annotation into \C code                         \\
+    \hline
+    typing      & minimization of the instrumentation for integers
+    (section~\ref{sec:integers})                                                    \\
+    \hline
+  \end{tabular}
 \end{center}
 % >>>
diff --git a/src/plugins/e-acsl/headers/header_spec.txt b/src/plugins/e-acsl/headers/header_spec.txt
index cf2b2a13c0e9dec43354173a1758d67cf4a4132d..b617a2a25a6db53ae67acc05e0627d8041b58505 100644
--- a/src/plugins/e-acsl/headers/header_spec.txt
+++ b/src/plugins/e-acsl/headers/header_spec.txt
@@ -21,6 +21,7 @@ share/e-acsl/instrumentation_model/e_acsl_temporal_timestamp.h: CEA_LGPL_OR_PROP
 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_config.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
@@ -132,6 +133,8 @@ src/libraries/functions.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/libraries/functions.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/libraries/gmp_types.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/libraries/gmp_types.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+src/libraries/logic_aggr.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
+src/libraries/logic_aggr.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/libraries/misc.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/libraries/misc.mli: CEA_LGPL_OR_PROPRIETARY.E_ACSL
 src/libraries/varname.ml: CEA_LGPL_OR_PROPRIETARY.E_ACSL
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 39e15364d47e040dab2ff1715b5a31109a079ed7..884dfb189ef701e5fe8a7ebe7d234fa76d4abe90 100644
--- a/src/plugins/e-acsl/man/e-acsl-gcc.sh.1
+++ b/src/plugins/e-acsl/man/e-acsl-gcc.sh.1
@@ -123,6 +123,13 @@ alternatives that include internal runtime error checking.
 always use GMP integers instead of C integral types.
 By default the GMP integers are used on as-needed basis.
 .TP
+.B --mbits=\fI<BITS>
+architecture to compile to. Valid arguments are \fI16\fP, \fI32\fP or \fI64\fP.
+Default to the architecture of the current environment.
+This option is used to select the \fBmachdep\fP when calling \fBFrama-C\fP, and
+to pass the corresponding \fB-m16\fP, \fB-m32\fP or \fB-m64\fP flag to the
+compiler.
+.TP
 .B -l, --ld-flags=\fI<FLAGS>
 pass the specified flags to the linker.
 .TP
@@ -153,7 +160,7 @@ Valid arguments are:
   \fIfloat-to-int\fP      \- casts from floating-point to integer.
   \fIdiv\fP               \- division by zero.
   \fIshift\fP             \- left and right shifts by a value out of bounds.
-  \fpointer-call\fP       \- annotate functions calls through pointers.
+  \fIpointer-call\fP      \- annotate functions calls through pointers.
   \fIall\fP               \- all of the above.
 .TP
 .B -A, --rte-select=\fI<OPTSTRING>
@@ -212,7 +219,39 @@ launch of the \fBE-ACSL\fP plugin.
 add \fI<OPTS>\fP to the list of options that will be given to the \fBE-ACSL\fP
 analysis. Only useful when \fB--then\fP is in use, in which case \fI<OPTS>\fP
 will be placed after the \fB-then\fP on \fBFrama-C\fP's command-line. Otherwise,
-equivalent to \fB--frama-c-extra\fP
+equivalent to \fB--frama-c-extra\fP.
+.TP
+.B --ar=\fI<FILE>
+the name of the \fBAR\fP executable. Only relevant with
+\fB--dlmalloc-from-sources\fP. By default the first \fIar\fP executable found in
+the system path is used.
+.TP
+.B --ranlib=\fI<FILE>
+the name of the \fBRANLIB\fP executable. Only relevant with
+\fB--dlmalloc-from-sources\fP. By default the first \fIranlib\fP executable
+found in the system path is used.
+.TP
+.B --with-dlmalloc=\fI<FILE>
+use \fI<FILE>\fP instead of distributed dlmalloc library.
+.TP
+.B --dlmalloc-from-sources
+compile and use dlmalloc library from sources instead of using the distributed
+library. Incompatible with \fB--with-dlmalloc\fP.
+.TP
+.B --dlmalloc-compile-only
+do not instrument or compile code, only compile dlmalloc library from sources.
+Implies \fB--dlmalloc-from-sources\fP and incompatible with
+\fB--with-dlmalloc\fP.
+.TP
+.B --dlmalloc-compile-flags=\fI<FLAGS>
+compile dlmalloc library with \fI<FLAGS>\fP compile flags. Default to
+\fI-O2 -g3\fP. Unused if \fB--dlmalloc-from-sources\fP or
+\fB--dlmalloc-compile-only\fP isn't used.
+.TP
+.B --odlmalloc=\fI<FILE>
+output compiled dlmalloc library to \fI<FILE>\fP. Unused if
+\fB--dlmalloc-from-sources\fP or \fB--dlmalloc-compile-only\fP isn't used.
+
 .SH EXIT STATUS
 .TP
 .B 0
diff --git a/src/plugins/e-acsl/scripts/e-acsl-gcc.comp b/src/plugins/e-acsl/scripts/e-acsl-gcc.comp
index b05f8fe127e674e8d15bae4d8787f5c43fc8b0c4..ba42f3854cab950f8e08416fd90a90132e6bd20d 100644
--- a/src/plugins/e-acsl/scripts/e-acsl-gcc.comp
+++ b/src/plugins/e-acsl/scripts/e-acsl-gcc.comp
@@ -36,13 +36,15 @@ _eacsl_gcc() {
     --no-trace
     --ocode= --oexec= --oexec-e-acsl=
     --ld-flags= --cpp-flags= --extra-cpp-args=
-    --frama-c-extra= --frama-c= --gcc= --e-acsl-share= --memory-model=
-    --e-acsl-extra=
+    --frama-c-extra= --frama-c= --gcc= --ar= --ranlib= --mbits=
+    --e-acsl-share= --memory-model= --e-acsl-extra=
     --compile --compile-only --print-mmodels --frama-c-only --instrumented-only
     --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"
+    --heap-size --stack-size
+    --with-dlmalloc --dlmalloc-from-sources --dlmalloc-compile-only
+    --dlmalloc-compile-flags --odlmalloc"
 
   case ${prev} in
     -*)
diff --git a/src/plugins/e-acsl/scripts/e-acsl-gcc.sh b/src/plugins/e-acsl/scripts/e-acsl-gcc.sh
index 3736837fa8cfba68b6675278c63dcd4baa1af5e7..b7fa672c949cd39eeb8638075269cb4ccca39dd5 100755
--- a/src/plugins/e-acsl/scripts/e-acsl-gcc.sh
+++ b/src/plugins/e-acsl/scripts/e-acsl-gcc.sh
@@ -274,7 +274,9 @@ LONGOPTIONS="help,compile,compile-only,debug:,ocode:,oexec:,verbose:,
   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,
-  external-assert:,validate-format-strings,no-trace,libc-replacements"
+  external-assert:,validate-format-strings,no-trace,libc-replacements,
+  with-dlmalloc:,dlmalloc-from-sources,dlmalloc-compile-only,
+  dlmalloc-compile-flags:,odlmalloc:,ar:,ranlib:,mbits:"
 SHORTOPTIONS="h,c,C,d:,D,o:,O:,v:,f,E:,L,M,l:,e:,g,q,s:,F:,m:,I:,G:,X,a:,T,k,V"
 # Prefix for an error message due to wrong arguments
 ERROR="ERROR parsing arguments:"
@@ -284,7 +286,10 @@ OPTION_CFLAGS=                           # Compiler flags
 OPTION_CPPFLAGS=                         # Preprocessor flags
 OPTION_LDFLAGS=                          # Linker flags
 OPTION_FRAMAC="frama-c"                  # Frama-C executable name
+OPTION_MBITS=                            # Which architecture to compile to
 OPTION_CC="gcc"                          # GCC executable name
+OPTION_AR="ar"                           # AR executable name
+OPTION_RANLIB="ranlib"                   # RANLIB executable name
 OPTION_ECHO="set -x"                     # Echo executed commands to STDOUT
 OPTION_INSTRUMENT=1                      # Perform E-ACSL instrumentation
 OPTION_DEBUG=                            # Set Frama-C debug flag
@@ -318,6 +323,11 @@ OPTION_STACK_SIZE=32      # Size of a heap shadow space (in MB)
 OPTION_HEAP_SIZE=128      # Size of a stack shadow space (in MB)
 OPTION_KEEP_GOING=        # Report failing assertions but do not abort execution
 OPTION_EXTERNAL_ASSERT="" # Use custom definition of assert function
+OPTION_WITH_DLMALLOC=""                  # Use provided dlmalloc library
+OPTION_DLMALLOC_FROM_SOURCES=            # Compile dlmalloc from sources
+OPTION_DLMALLOC_COMPILE_ONLY=            # Only compile dlmalloc
+OPTION_DLMALLOC_COMPILE_FLAGS="-O2 -g3"  # Dlmalloc compilation flags
+OPTION_OUTPUT_DLMALLOC=""                # Name of the compiled dlmalloc
 
 SUPPORTED_MMODELS="bittree,segment" # Supported memory model names
 MIN_STACK=16 # Minimal size of a tracked program stack
@@ -352,8 +362,6 @@ Notes:
 
 # Base dir of this script
 BASEDIR="$(realpath `dirname $0`)"
-# Directory with contrib libraries of E-ACSL
-LIBDIR="$BASEDIR/../lib"
 
 # Run getopt
 ARGS=`getopt -n "$ERROR" -l "$LONGOPTIONS" -o "$SHORTOPTIONS" -- "$@"`
@@ -643,12 +651,53 @@ do
       shift
       OPTION_NO_TRACE=1
     ;;
+    --ar)
+      shift;
+      OPTION_AR="$(which $1)"
+      shift;
+    ;;
+    --ranlib)
+      shift;
+      OPTION_RANLIB="$(which $1)"
+      shift;
+    ;;
+    --with-dlmalloc)
+      shift;
+      OPTION_WITH_DLMALLOC="$1"
+      shift;
+    ;;
+    --dlmalloc-from-sources)
+      shift;
+      OPTION_DLMALLOC_FROM_SOURCES=1
+    ;;
+    --dlmalloc-compile-only)
+      shift;
+      OPTION_INSTRUMENT=
+      OPTION_DLMALLOC_COMPILE_ONLY=1
+    ;;
+    --dlmalloc-compile-flags)
+      shift;
+      OPTION_DLMALLOC_COMPILE_FLAGS="$1"
+      shift;
+    ;;
+    --odlmalloc)
+      shift;
+      OPTION_OUTPUT_DLMALLOC="$1"
+      shift;
+    ;;
+    # Architecture selection
+    --mbits)
+      shift;
+      OPTION_MBITS="$1"
+      shift;
+    ;;
   esac
 done
 shift;
 
-# Bail if no files to translate are given
-if [ -z "$1" ]; then
+# Bail if no files to translate are given and we're not trying to only compile
+# dlmalloc
+if [ -z "$1" -a "$OPTION_DLMALLOC_COMPILE_ONLY" != "1" ]; then
   error "no input files";
 fi
 
@@ -672,12 +721,30 @@ if [ -f "$BASEDIR/../E_ACSL.mli" ]; then
     `test -f "$DEVELOPMENT/META.frama-c-e_acsl" -o \
           -f "$FRAMAC_PLUGIN/META.frama-c-e_acsl"; echo $?`
   EACSL_SHARE="$DEVELOPMENT/share/e-acsl"
+  # E-ACSL should use its own dune site for getting lib and contrib
+  EACSL_LIB="$DEVELOPMENT/lib"
+  EACSL_CONTRIB="$DEVELOPMENT/contrib"
+  # Add the project directory to FRAMAC_PLUGINS,
+  # otherwise Frama-C uses an installed version
+  if test -f "$DEVELOPMENT/META.frama-c-e_acsl"; then
+    FRAMAC_FLAGS="-add-path=$DEVELOPMENT/top -add-path=$DEVELOPMENT $FRAMAC_FLAGS";
+  fi
+else
+  # Installed version. FRAMAC_SHARE should not be used here as Frama-C
+  # and E-ACSL may not be installed to the same location
+  EACSL_SHARE="$BASEDIR/../share/frama-c/e-acsl"
+  EACSL_LIB="$BASEDIR/../lib/frama-c/e-acsl"
+  EACSL_CONTRIB="$BASEDIR/../share/frama-c/e-acsl/contrib"
 fi
 
 # Architecture-dependent flags. Since by default Frama-C uses 32-bit
 # architecture we need to make sure that same architecture is used for
 # instrumentation and for compilation.
-MACHDEPFLAGS="`getconf LONG_BIT`"
+if [ -n "$OPTION_MBITS" ]; then
+  MACHDEPFLAGS="$OPTION_MBITS"
+else
+  MACHDEPFLAGS="`getconf LONG_BIT`"
+fi
 # Check if getconf gives out the value accepted by Frama-C/GCC
 echo "$MACHDEPFLAGS" | grep '16\|32\|64' 2>&1 >/dev/null \
   || error "$MACHDEPFLAGS-bit architecture not supported"
@@ -752,15 +819,90 @@ fi
 CPPFLAGS="$OPTION_CPPFLAGS"
 LDFLAGS="$OPTION_LDFLAGS"
 
+# Dlmalloc
+if [ -n "$OPTION_WITH_DLMALLOC" ]; then
+  if [ "$OPTION_DLMALLOC_FROM_SOURCES" = "1" ]; then
+    error "use either --with-dlmalloc FILE or --dlmalloc-from-sources"
+  fi
+  if [ "$OPTION_DLMALLOC_COMPILE_ONLY" = "1" ]; then
+    error "use either --with-dlmalloc FILE or --dlmalloc-compile-only"
+  fi
+
+  # Use provided dlmalloc library
+  DLMALLOC_LIB_PATH="$OPTION_WITH_DLMALLOC"
+else
+  # Use distributed dlmalloc library
+  DLMALLOC_LIB_PATH="$EACSL_LIB/libeacsl-dlmalloc.a"
+fi
+
+if [ "$OPTION_DLMALLOC_FROM_SOURCES" = "1" -o \
+     "$OPTION_DLMALLOC_COMPILE_ONLY" = "1" ]; then
+  # Check ar and ranlib tools
+  check_tool "$OPTION_AR"
+  check_tool "$OPTION_RANLIB"
+  AR="$OPTION_AR"
+  RANLIB="$OPTION_RANLIB"
+
+  # Create a temporary directory to build dlmalloc. That directory will be
+  # removed when exiting the script
+  DLMALLOC_TMP_DIR=$(mktemp -d) || error "unable to create temp directory."
+  trap 'rm -rf "$DLMALLOC_TMP_DIR"' EXIT
+
+  DLMALLOC_SRC="$EACSL_CONTRIB/libdlmalloc/dlmalloc.c"
+  DLMALLOC_OBJ="$DLMALLOC_TMP_DIR/dlmalloc.o"
+
+  if [ -n "$OPTION_OUTPUT_DLMALLOC" ]; then
+    DLMALLOC_LIB_PATH="$OPTION_OUTPUT_DLMALLOC"
+  else
+    DLMALLOC_LIB_PATH="$DLMALLOC_TMP_DIR/libeacsl-dlmalloc.a"
+  fi
+
+  DLMALLOC_FLAGS="\
+    $GCCMACHDEP \
+    -DHAVE_MORECORE=0 \
+    -DHAVE_MMAP=1  \
+    -DNO_MALLINFO=1 \
+    -DNO_MALLOC_STATS=1 \
+    -DMSPACES=1 \
+    -DONLY_MSPACES \
+    -DMALLOC_ALIGNMENT=32 \
+    -DMSPACE_PREFIX=__e_acsl_ \
+    $OPTION_DLMALLOC_COMPILE_FLAGS
+  "
+
+  # Compile dlmalloc from sources
+  ($OPTION_ECHO; \
+   $CC -c $DLMALLOC_SRC $DLMALLOC_FLAGS -o$DLMALLOC_OBJ)
+  error "fail to compile dlmalloc." $?
+  ($OPTION_ECHO; \
+   $AR crus $DLMALLOC_LIB_PATH $DLMALLOC_OBJ)
+  error "fail to create dlmalloc archive library." $?
+  ($OPTION_ECHO; \
+   $RANLIB $DLMALLOC_LIB_PATH)
+  error "fail to generate dlmalloc archive index." $?
+
+  # Exit if dlmalloc-compile-only has been used
+  if [ "$OPTION_DLMALLOC_COMPILE_ONLY" = "1" ]; then
+    # If dlmalloc-compile-only is used with instrumented-only or compile,
+    # display a warning message
+    if [ -n "$OPTION_COMPILE" -o -n "$OPTION_INSTRUMENT" -o \
+         -n "$OPTION_INSTRUMENTED_ONLY" ]; then
+      warning "--dlmalloc-compile-only was used, the instrumentation and \
+compilation of the source code won't be run."
+    fi
+
+    exit 0;
+  fi
+fi
+
 # Extra Frama-C Flags E-ACSL needs
 FRAMAC_FLAGS="$FRAMAC_FLAGS \
-  -remove-unused-specified-functions \
-  -variadic-no-translation"
+  -remove-unused-specified-functions"
 
 # C, CPP and LD flags for compilation of E-ACSL-generated sources
 EACSL_CFLAGS="$OPTION_EXTERNAL_ASSERT"
 EACSL_CPPFLAGS="-I$EACSL_SHARE"
-EACSL_LDFLAGS="$LIBDIR/libeacsl-dlmalloc.a -lgmp -lm"
+EACSL_LDFLAGS="$DLMALLOC_LIB_PATH -lgmp -lm"
 
 # Output file names
 OUTPUT_CODE="$OPTION_OUTPUT_CODE" # E-ACSL instrumented source
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 7e74611ac5ee19b82530640f0ffa594151660c7b..4317ace0b93bc35b60ff88efe31380acb44035b1 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
@@ -25,6 +25,14 @@
 # define _DEFAULT_SOURCE 1
 #endif
 
+/* On Windows, setup minimum version to Windows 8 (or Server 2012) to be able to
+   use some specific API functions.
+   Check directly for windows instead of using E_ACSL_OS_IS_WINDOWS so that it
+   can be done without including anything. */
+#if defined(WIN32) || defined(_WIN32) || defined(__WIN32)
+# define _WIN32_WINNT 0x0602
+#endif
+
 // Internals
 #include "internals/e_acsl_bits.c"
 #include "internals/e_acsl_debug.c"
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
index e9970b9edf55a846d4e161bede50adf8b0dcbe6a..46e8fe3a6ad1018564f6a782f6d6c8138e9a2011 100644
--- 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
@@ -52,4 +52,4 @@ void eacsl_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
+#endif // E_ACSL_ASSERT_H
diff --git a/src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_temporal.c b/src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_temporal.c
index 399b60cd70c2148dbe7030a37ec4b6a0f8e304fa..37c0d97959f8ba8c997ec0305dc231ba9c045cef 100644
--- a/src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_temporal.c
+++ b/src/plugins/e-acsl/share/e-acsl/instrumentation_model/e_acsl_temporal.c
@@ -138,4 +138,4 @@ int temporal_valid(void *ptr, void *addr_of_ptr) {
 }
 /* }}} */
 
-#endif // E_ACSL_TEMPORAL
\ No newline at end of file
+#endif // E_ACSL_TEMPORAL
diff --git a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_bits.h b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_bits.h
index 84a2238ffb05617a8c0aa0ecf2c14b4e6becd347..15e5702665a57864d02072e6efbeacd6d761179c 100644
--- a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_bits.h
+++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_bits.h
@@ -179,4 +179,4 @@ static inline void clearbits_right(size_t size, void *ptr) {
   clearbits64_right(size%64, *(lp-i));
 }
 
-#endif // E_ACSL_BITS_H
\ No newline at end of file
+#endif // E_ACSL_BITS_H
diff --git a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_config.h b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_config.h
new file mode 100644
index 0000000000000000000000000000000000000000..7ab971cc8b2ea03672415c85629ed54d3c755b94
--- /dev/null
+++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_config.h
@@ -0,0 +1,66 @@
+/**************************************************************************/
+/*                                                                        */
+/*  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 Internal defines for E-ACSL set according to the current environment.
+ *
+ * Instead of using complicated logic with predefined macros in the RTL, the
+ * logic should be done in this file and an E-ACSL specific define set to record
+ * the result of the logic.
+ */
+
+#ifndef E_ACSL_CONFIG_H
+#define E_ACSL_CONFIG_H
+
+// OS detection
+//  - Assign values to specific OSes
+#define E_ACSL_OS_LINUX_VALUE 1
+#define E_ACSL_OS_WINDOWS_VALUE 2
+#define E_ACSL_OS_OTHER_VALUE 999
+//  - Declare defines to test for a specific OS
+/*!
+ * \brief True if the target OS is linux, false otherwise
+ */
+#define E_ACSL_OS_IS_LINUX E_ACSL_OS == E_ACSL_OS_LINUX_VALUE
+/*!
+ * \brief True if the target OS is windows, false otherwise
+ */
+#define E_ACSL_OS_IS_WINDOWS E_ACSL_OS == E_ACSL_OS_WINDOWS_VALUE
+/*!
+ * \brief True if the target OS is unknown, false otherwise
+ */
+#define E_ACSL_OS_IS_OTHER E_ACSL_OS == E_ACSL_OS_OTHER_VALUE
+//  - Check current OS
+#ifdef __linux__
+// Linux compilation
+# define E_ACSL_OS E_ACSL_OS_LINUX_VALUE
+#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32)
+// Windows compilation
+# define E_ACSL_OS E_ACSL_OS_WINDOWS_VALUE
+#else
+// Other
+# define E_ACSL_OS E_ACSL_OS_OTHER_VALUE
+# error "Unsupported OS for E-ACSL RTL"
+#endif
+
+#endif // E_ACSL_CONFIG_H
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
index 0c42873864c1d7b89465dcc26403ac252afb3de3..0056305c84da1217fe05c768fb1d54b86d48c60c 100644
--- 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
@@ -24,6 +24,7 @@
 #include <fcntl.h>
 
 #include "../observation_model/internals/e_acsl_omodel_debug.h"
+#include "e_acsl_config.h"
 #include "e_acsl_private_assert.h"
 #include "e_acsl_rtl_io.h"
 
@@ -45,8 +46,13 @@ void initialize_report_file(int *argc, char ***argv) {
   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
+#if E_ACSL_OS_IS_LINUX
+    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);
+#elif E_ACSL_OS_IS_WINDOWS
+    dlog_fd = _open(dlog_name, _O_WRONLY | _O_CREAT | _O_TRUNC,
+      _S_IREAD | _S_IWRITE);
+#endif
   }
   if (dlog_fd == -1)
     private_abort("Cannot open file descriptor for %s\n", dlog_name);
@@ -91,4 +97,4 @@ void describe_run() {
   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/internals/e_acsl_malloc.h b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_malloc.h
index bc38137d8f566ddabdc015a3eb4236cdbbf8ceda..74b4c5a2a44eadf208b1f0ebfdeaa444d25f1cca 100644
--- 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
@@ -140,4 +140,4 @@ int is_pow_of_2(size_t x);
 
 /* }}} */
 
-#endif // E_ACSL_MALLOC_H
\ No newline at end of file
+#endif // E_ACSL_MALLOC_H
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
index 94516feab171db3523c2e71ce28f0fefd575cfb6..b5133be6fdc26828abba82fa819ce520af351ac9 100644
--- 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
@@ -20,16 +20,12 @@
 /*                                                                        */
 /**************************************************************************/
 
-/* 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_config.h"
 #include "e_acsl_rtl_io.h"
 #include "e_acsl_trace.h"
 
@@ -54,14 +50,18 @@ void raise_abort(const char *file, int line) {
 
 void private_abort_fail(const char * file, int line, char *fmt, ...) {
   va_list va;
+#if E_ACSL_OS_IS_LINUX
   sigset_t defer_abrt;
   sigemptyset(&defer_abrt);
   sigaddset(&defer_abrt,SIGABRT);
   sigprocmask(SIG_BLOCK,&defer_abrt,NULL);
+#endif // E_ACSL_OS_IS_LINUX
   va_start(va,fmt);
   rtl_veprintf(fmt, va);
   va_end(va);
+#if E_ACSL_OS_IS_LINUX
   sigprocmask(SIG_UNBLOCK,&defer_abrt,NULL);
+#endif // E_ACSL_OS_IS_LINUX
   raise_abort(file, line);
 }
 
diff --git a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_rtl_io.c b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_rtl_io.c
index 5453030b537bb3bce02c11d39873e5682b598a20..2858275b1c56a325fab73aaa05bb1d85b05e41d9 100644
--- a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_rtl_io.c
+++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_rtl_io.c
@@ -404,4 +404,4 @@ 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
index 839bfe24fb366099648c9b28fc6b3aac0058372e..8d39d57dd14023570b5d05dde72c51ea017f646f 100644
--- 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
@@ -95,4 +95,4 @@ 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
+#endif // E_ACSL_RTL_IO_H
diff --git a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_shexec.c b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_shexec.c
index e13e8dfdaa1972564d400fdb2d673294841a18cf..77f1b91237ebb27d9c8d6610089f6c2e190fd6fa 100644
--- a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_shexec.c
+++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_shexec.c
@@ -25,6 +25,11 @@
  * \brief Implementation for running shell commands
 ***************************************************************************/
 
+#include "e_acsl_config.h"
+
+// Only available on linux
+#if E_ACSL_OS_IS_LINUX
+
 #include <errno.h>
 #include <stddef.h>
 #include <sys/types.h>
@@ -201,3 +206,5 @@ ipr_t* shexec (char **data, const char *sin) {
   /* Run the command returning a pointer to `ipr_t` */
   return __shexec(ipr);
 }
+
+#endif // E_ACSL_OS_IS_LINUX
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
index 16cb2d9a1d3a0161bc39ca0159d03962d07a8a00..754cabb418656fbde4bbfc1cb8a6bd9dbc85780b 100644
--- 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
@@ -28,6 +28,11 @@
 #ifndef E_ACSL_SHEXEC_H
 #define E_ACSL_SHEXEC_H
 
+#include "e_acsl_config.h"
+
+// Only available on linux
+#if E_ACSL_OS_IS_LINUX
+
 #include <sys/types.h>
 
 /*! \class ipr_t
@@ -68,4 +73,6 @@ typedef struct {
  *  `free_ipr` function. */
 ipr_t* shexec (char **data, const char *sin);
 
+#endif // E_ACSL_OS_IS_LINUX
+
 #endif // E_ACSL_SHEXEC_H
diff --git a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_trace.c b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_trace.c
index 892f53f5c204ed69fda30a7f89bd4452384825b3..64336e758bd4f23af52d118a5a8854be7985bed3 100644
--- a/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_trace.c
+++ b/src/plugins/e-acsl/share/e-acsl/internals/e_acsl_trace.c
@@ -28,6 +28,7 @@
 #include <limits.h>
 #include <stddef.h>
 
+#include "e_acsl_config.h"
 #include "e_acsl_malloc.h"
 #include "e_acsl_rtl_io.h"
 #include "e_acsl_rtl_string.h"
@@ -35,6 +36,7 @@
 
 #include "e_acsl_trace.h"
 
+#if E_ACSL_OS_IS_LINUX
 extern void  *__libc_stack_end;
 
 struct frame_layout {
@@ -69,9 +71,10 @@ static int native_backtrace (void **array, int size) {
   }
   return cnt;
 }
+#endif
 
 void trace() {
-# ifdef __linux__
+# if E_ACSL_OS_IS_LINUX
 
   int size = 24;
   void **bb = private_malloc(sizeof(void*)*size);
@@ -107,5 +110,5 @@ void trace() {
     counter++;
   }
   STDOUT("/***************************************/\n");
-# endif /* __linux__ */
+# endif /* E_ACSL_OS_IS_LINUX */
 }
diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree.c b/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree.c
index 1ca2b8df2848a1e9b695428903b392deed3de0d2..e0dcc56094698aaf8d1c0df34008a8b6d4ee2ee6 100644
--- a/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree.c
+++ b/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree.c
@@ -25,11 +25,24 @@
  * \brief Patricia Trie API Implementation
 ***************************************************************************/
 
+#include "../../internals/e_acsl_config.h"
 #include "../../internals/e_acsl_malloc.h"
+#include "../../internals/e_acsl_private_assert.h"
 
 #include "e_acsl_bittree.h"
 
+#if E_ACSL_OS_IS_LINUX
 #define WORDBITS __WORDSIZE
+#elif E_ACSL_OS_IS_WINDOWS
+// On windows, __WORDSIZE is not available
+# ifdef _WIN64
+#   define WORDBITS 64
+# else
+#   define WORDBITS 32
+# endif
+#else
+# error "Unsupported OS"
+#endif
 
 static size_t mask(size_t, size_t);
 
@@ -160,7 +173,7 @@ static bt_node * bt_get_leaf_from_block (bt_block * ptr) {
 	    == (ptr->ptr & curr->left->mask))
       curr = curr->left;
     else
-      vassert(0, "Unreachable", NULL);
+      private_assert(0, "Unreachable", NULL);
   }
   DASSERT(curr->is_leaf);
   DASSERT(curr->leaf == ptr);
diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree_observation_model.c b/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree_observation_model.c
index b48e6e1866f1bb6aac54c5056c2ddbd072897b93..1f6296b66387b1971aa988af762766526fe9e681 100644
--- a/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree_observation_model.c
+++ b/src/plugins/e-acsl/share/e-acsl/observation_model/bittree_model/e_acsl_bittree_observation_model.c
@@ -31,7 +31,7 @@
 #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 "../internals/e_acsl_safe_locations.h"
 #include "e_acsl_bittree.h"
 
 #include "../e_acsl_observation_model.h"
@@ -231,12 +231,12 @@ int eacsl_valid(void* ptr, size_t size, void *ptr_base, void *addrof_base) {
   bt_block * blk = lookup_allocated(ptr, size, ptr_base);
   return
     size == 0
-    ||
+    || (
     blk != NULL && !blk->is_readonly
 #ifdef E_ACSL_TEMPORAL
     && temporal_valid(ptr_base, addrof_base)
 #endif
-  ;
+    );
 }
 
 /* return whether the size bytes of ptr are readable */
@@ -244,12 +244,12 @@ int eacsl_valid_read(void* ptr, size_t size, void *ptr_base, void *addrof_base)
   bt_block * blk = lookup_allocated(ptr, size, ptr_base);
   return
     size == 0
-    ||
+    || (
     blk != NULL
 #ifdef E_ACSL_TEMPORAL
     && temporal_valid(ptr_base, addrof_base)
 #endif
-  ;
+    );
 }
 
 /* return the base address of the block containing ptr */
@@ -260,7 +260,7 @@ void* eacsl_base_addr(void* ptr) {
 }
 
 /* return the offset of `ptr` within its block */
-size_t offset(void* ptr) {
+size_t eacsl_offset(void* ptr) {
   bt_block * tmp = bt_find(ptr);
   private_assert(tmp != NULL, "\\offset of unallocated memory", NULL);
   return ((uintptr_t)ptr - tmp->ptr);
@@ -585,13 +585,15 @@ void eacsl_memory_init(int *argc_ref, char ***argv_ref, size_t ptr_size) {
   /* Tracking safe locations */
   collect_safe_locations();
   int i;
-  for (i = 0; i < get_safe_location_count(); i++) {
+  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;
-    eacsl_store_block(addr, len);
-    if (loc->is_initialized)
-      eacsl_initialize(addr, len);
+    if (loc->is_on_static) {
+      void *addr = (void*)loc->address;
+      uintptr_t len = loc->length;
+      eacsl_store_block(addr, len);
+      if (loc->is_initialized)
+        eacsl_initialize(addr, len);
+    }
   }
   init_infinity_values();
 }
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
index 75a3feca780f5a2a72fec437dff74625f9651cf8..60a0b3932093a2ffa52e0238d67784e70f26e864 100644
--- 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
@@ -47,4 +47,4 @@ int readonly (void *ptr) {
 
 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/e_acsl_heap.h b/src/plugins/e-acsl/share/e-acsl/observation_model/e_acsl_heap.h
index d622c489166a7a8df533edcd45b97ca5e3330ef5..89fc0b30b91d7b27554a522b9b55d2ae38364d90 100644
--- 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
@@ -49,4 +49,4 @@ size_t eacsl_get_heap_allocation_size()
 size_t eacsl_get_heap_allocated_blocks()
   __attribute__((FC_BUILTIN));
 
-#endif // E_ACSL_HEAP
\ No newline at end of file
+#endif // E_ACSL_HEAP
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
index 0e413258b368b1aaa925b7579b4943988e11f432..9b1baa7ad970fe5d9085f12e0c179b27a69b01b7 100644
--- 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
@@ -39,7 +39,8 @@
  * otherwise.
  */
 int separated2(void * ptr1, size_t size1, void * ptr2, size_t size2) {
-  DASSERT(valid_read(ptr1, size1, base_addr(ptr1), NULL) && valid_read(ptr2, size2, base_addr(ptr2), NULL));
+  DASSERT(eacsl_valid_read(ptr1, size1, eacsl_base_addr(ptr1), NULL)
+          && eacsl_valid_read(ptr2, size2, eacsl_base_addr(ptr2), NULL));
 
   // Cast pointers to char* to be able to do pointer arithmetic without
   // triggering undefined behavior
diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_heap_tracking.h b/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_heap_tracking.h
index eb8610314f20e6899f7cd971d75f9db64b735f72..aa346323fa9fda86e4aa1f370065b0e5b2875b85 100644
--- a/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_heap_tracking.h
+++ b/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_heap_tracking.h
@@ -43,4 +43,4 @@ void update_heap_allocation(long size);
  * some allocated memory on the heap. */
 void report_heap_leacks();
 
-#endif // E_ACSL_HEAP_TRACKING
\ No newline at end of file
+#endif // E_ACSL_HEAP_TRACKING
diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_safe_locations.c b/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_safe_locations.c
index 86d1ad4e0a63e4cc6c1b927e520a7f6877e2c4cd..9c2e61b587126620383f4c16337b7a457d4a3f58 100644
--- a/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_safe_locations.c
+++ b/src/plugins/e-acsl/share/e-acsl/observation_model/internals/e_acsl_safe_locations.c
@@ -23,6 +23,7 @@
 #include <stdio.h>
 #include <errno.h>
 
+#include "../../internals/e_acsl_config.h"
 #include "e_acsl_safe_locations.h"
 
 /* An array storing safe locations up to `safe_location_counter` position.
@@ -31,18 +32,20 @@
 static memory_location safe_locations [16];
 static int safe_location_counter = 0;
 
-#define add_safe_location(_addr,_len,_init) { \
+#define add_safe_location(_addr,_len,_init,_on_static) do { \
   safe_locations[safe_location_counter].address = _addr; \
   safe_locations[safe_location_counter].length = _len; \
+  safe_locations[safe_location_counter].is_initialized = _init; \
+  safe_locations[safe_location_counter].is_on_static = _on_static; \
   safe_location_counter++; \
-}
+} while (0)
 
 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");
+  add_safe_location((uintptr_t)&errno, sizeof(int), 1, E_ACSL_OS_IS_LINUX);
+  add_safe_location((uintptr_t)stdout, sizeof(FILE), 1, E_ACSL_OS_IS_LINUX);
+  add_safe_location((uintptr_t)stderr, sizeof(FILE), 1, E_ACSL_OS_IS_LINUX);
+  add_safe_location((uintptr_t)stdin, sizeof(FILE), 1, E_ACSL_OS_IS_LINUX);
 }
 
 size_t get_safe_locations_count() {
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
index fa24ba37f875a71bbdf3d110be9d8054f47d5741..1b34dab3f464665b0b03c0ba6ac6e7a79960aada 100644
--- 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
@@ -34,11 +34,17 @@
 #include <stdint.h>
 #include <stddef.h>
 
-/* Simple representation of a safe location */
+/*! Simple representation of a safe location */
 struct memory_location {
-  uintptr_t address; /* Address */
-  uintptr_t length; /* Byte-length */
-  int is_initialized; /* Notion of initialization */
+  /*! Address */
+  uintptr_t address;
+  /*! Byte-length */
+  uintptr_t length;
+  /*! Notion of initialization */
+  int is_initialized;
+  /*! True if the address is on static memory, false if it is on dynamic
+      memory */
+  int is_on_static;
 };
 typedef struct memory_location memory_location;
 
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
index 209cd4952633a90ad4061cfedff8d974d30f0589..610c77275b0b787cb6d97aa83b576ac83d3e96b4 100644
--- 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
@@ -50,4 +50,4 @@ 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
+#endif // E_ACSL_TIMESTAMP_RETRIEVAL_H
diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_observation_model.c b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_observation_model.c
index 87e369e22b43f37edb1567fb21ffe9f4f204a764..5dfcd7efd90c29821dfd16f131c1531c90a8b7b3 100644
--- a/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_observation_model.c
+++ b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_observation_model.c
@@ -215,8 +215,8 @@ void mspaces_init() {
     describe_run();
     eacsl_make_memory_spaces(64*MB, get_heap_size());
     /* Allocate and log shadow memory layout of the execution.
-       Case of the heap, globals and tls. */
-    init_shadow_layout_heap_global_tls();
+       Case of the segments available before main. */
+    init_shadow_layout_pre_main();
     already_run = 1;
   }
 }
@@ -235,8 +235,9 @@ void eacsl_memory_init(int *argc_ref, char *** argv_ref, size_t ptr_size) {
     initialize_report_file(argc_ref, argv_ref);
     /* Lift stack limit to account for extra stack memory overhead.  */
     increase_stack_limit(get_stack_size()*2);
-    /* Allocate and log shadow memory layout of the execution. Case of stack. */
-    init_shadow_layout_stack(argc_ref, argv_ref);
+    /* Allocate and log shadow memory layout of the execution. Case of the
+       segments available after main. */
+    init_shadow_layout_main(argc_ref, argv_ref);
     //DEBUG_PRINT_LAYOUT;
     /* Make sure the layout holds */
     DVALIDATE_SHADOW_LAYOUT;
@@ -250,12 +251,14 @@ void eacsl_memory_init(int *argc_ref, char *** argv_ref, size_t ptr_size) {
     collect_safe_locations();
     int i;
     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 (loc->is_initialized)
-        eacsl_initialize(addr, len);
+      memory_location * loc = get_safe_location(i);
+      if (loc->is_on_static) {
+        void *addr = (void*)loc->address;
+        uintptr_t len = loc->length;
+        shadow_alloca(addr, len);
+        if (loc->is_initialized)
+          eacsl_initialize(addr, len);
+      }
     }
     init_infinity_values();
     already_run = 1;
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
index 9be75d5bb9e087c6eda750aed9e13e53c3fc02cd..d6be5cd96e4abbc8a2202e9fa44ad4b7b1139b0d 100644
--- 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
@@ -20,6 +20,7 @@
 /*                                                                        */
 /**************************************************************************/
 
+#include "../../internals/e_acsl_bits.h"
 #include "../../internals/e_acsl_rtl_io.h"
 #include "e_acsl_segment_tracking.h"
 #include "e_acsl_shadow_layout.h"
diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_tracking.c b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_tracking.c
index 083d015a3016899debff7f46273890665e035425..6e3011ce48c98c4637fcc3259b094df2c0cd8188 100644
--- a/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_tracking.c
+++ b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_segment_tracking.c
@@ -345,14 +345,6 @@ void shadow_freea(void *ptr) {
 
 /* Static querying {{{ */
 
-/*! \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 */
@@ -557,7 +549,7 @@ static void set_heap_segment(void *ptr, size_t size, size_t alloc_size,
   private_assert(mem_spaces.heap_end > max_addr,
     "Exceeded heap allocation limit of %luMB\n", E_ACSL_HEAP_SIZE);
 
-  DVALIDATE_MEMORY_INIT;
+  DVALIDATE_MEMORY_PRE_MAIN_INIT;
   /* Ensure the shadowed block in on the tracked heap portion */
   DVALIDATE_IS_ON_HEAP(((uintptr_t)ptr) - HEAP_SEGMENT, size);
   DVALIDATE_ALIGNMENT(ptr); /* Make sure alignment is right */
@@ -664,7 +656,7 @@ void *shadow_copy(const void *ptr, size_t size, int init) {
  * \param function - name of the de-allocation function (e.g., `free` or `cfree`)
 */
 static void unset_heap_segment(void *ptr, int init, const char *function) {
-  DVALIDATE_MEMORY_INIT;
+  DVALIDATE_MEMORY_PRE_MAIN_INIT;
   DVALIDATE_FREEABLE(((uintptr_t)ptr));
   /* Base address of shadow block */
   uintptr_t *base_shadow = (uintptr_t*)HEAP_SHADOW(ptr);
@@ -744,19 +736,76 @@ void* realloc(void *ptr, size_t size) {
          * shadow block to the size of the new allocation */
         if (old_size > size) {
           clearbits_right(
-              old_alloc_size - size,
-              old_init_shadow + old_alloc_size/8);
+              old_alloc_size - size,               // size in bits
+              old_init_shadow + old_alloc_size/8); // end of the old init shadow
         }
 
-        /* Now init shadow can be moved (if needed), keep in mind that
-         * segment base addresses are aligned at a boundary of something
-         * divisible by 8, so instead of moving actual bits here the
-         * segments are moved to avoid dealing with bit-level operations
-         * on incomplete bytes. */
+        /* Keep in mind that there is a ratio of 8 between the actual heap
+         * memory and the init shadow memory. So a byte in the actual memory
+         * corresponds to a bit in the shadow memory.
+         */
+
+        /* We need to keep the status of the init shadow up to `old_size` bits
+         * (or `size` if `size < old_size`), and we need to make sure that the
+         * bits of the init shadow correspondings to the bytes between
+         * `old_size` and `size` are set to zero if `size > old_size`. */
+
+        /* First of all, determine the number of bits in the init shadow that
+         * must be kept */
+        size_t keep_bits = (size < old_size) ? size : old_size;
+
+        /* To avoid doing too much bitwise operations, separate this size in
+         * the amount of bytes of init shadow that must be kept including any
+         * incomplete byte, and the number of bits that must be kept in the last
+         * byte if it is incomplete */
+        size_t rem_keep_bits = keep_bits%8;
+        size_t keep_bytes = keep_bits/8 + (rem_keep_bits > 0 ? 1 : 0);
+
+        /* If the pointer has been moved, then we need to copy `keep_bytes`
+         * from the old shadow to the new shadow to carry over all the needed
+         * information. Then the old init shadow can be reset. */
         if (res != ptr) {
-          size_t copy_size = (old_size > size) ? alloc_size : old_alloc_size;
-          memcpy(new_init_shadow, old_init_shadow, copy_size);
-          memset(old_init_shadow, 0, copy_size);
+          DVASSERT(keep_bytes <= alloc_size/8 && keep_bytes < old_alloc_size/8,
+            "Attempt to access out of bound init shadow. Accessing %lu bytes, \
+            old init shadow size: %lu bytes, new init shadow size: %lu bytes.",
+            keep_bytes, old_alloc_size/8, alloc_size/8);
+          memcpy(new_init_shadow, old_init_shadow, keep_bytes);
+          memset(old_init_shadow, 0, old_alloc_size/8);
+        }
+
+        if (size > old_size) {
+          // Last kept byte index
+          size_t idx = keep_bytes - 1; // idx < init_shadow_size by construction
+
+          /* If the new size is greater than the old size and the last kept byte
+           * is incomplete (`rem_keep_bits > 0`), then reset the unkept bits of
+           * the last byte in the new init shadow */
+          if (rem_keep_bits > 0) {
+            DVASSERT(idx < alloc_size/8,
+              "Attempt to access out of bound init shadow. Accessing index %lu \
+              with init shadow of size %lu bytes.", idx, alloc_size/8);
+            unsigned char mask = 0;
+            setbits64(rem_keep_bits, mask);
+            *(new_init_shadow + idx) &= mask;
+          }
+
+          /* Finally, if the new size is greater than the old size and the
+           * pointer hasn't been moved, then we need to make sure that the
+           * remaining bits of the init shadow corresponding to the memory
+           * between `old_size` and `size` are set to zero. */
+          if (res == ptr) {
+            // Index of the byte after the last kept byte
+            ++idx;
+            // Number of bytes between the index and the end of the init
+            // shadow corresponding to the new allocated memory
+            size_t count = size/8 - idx;
+
+            DVASSERT((idx+count) <= alloc_size/8,
+              "Attempt to access out of bound init shadow. Accessing %lu bytes \
+              from index %lu with init shadow of size %lu bytes.",
+              count, idx, alloc_size/8);
+            memset(new_init_shadow+idx, 0, count);
+          }
         }
       }
     } else {
@@ -895,7 +944,7 @@ int heap_initialized(uintptr_t addr, long len) {
     unsigned char mask = 0;
     setbits64_skip(set,mask,skip);
 
-    if (*shadow != mask)
+    if ((*shadow & mask) != mask)
       return 0;
   }
   if (len > 0)
@@ -1077,10 +1126,23 @@ void print_shadow_layout() {
   print_memory_partition(&mem_layout.heap);
   DLOG(">>> STACK --------------------\n");
   print_memory_partition(&mem_layout.stack);
+#if E_ACSL_OS_IS_LINUX
   DLOG(">>> GLOBAL -------------------\n");
   print_memory_partition(&mem_layout.global);
   DLOG(">>> TLS ----------------------\n");
   print_memory_partition(&mem_layout.tls);
+#elif E_ACSL_OS_IS_WINDOWS
+  DLOG(">>> TEXT ---------------------\n");
+  print_memory_partition(&mem_layout.text);
+  DLOG(">>> BSS ----------------------\n");
+  print_memory_partition(&mem_layout.bss);
+  DLOG(">>> DATA --------------------\n");
+  print_memory_partition(&mem_layout.data);
+  DLOG(">>> IDATA --------------------\n");
+  print_memory_partition(&mem_layout.idata);
+  DLOG(">>> RDATA --------------------\n");
+  print_memory_partition(&mem_layout.rdata);
+#endif
   DLOG(">>> --------------------------\n");
 }
 
@@ -1090,10 +1152,23 @@ const char* which_segment(uintptr_t addr) {
     loc = "stack";
   else if (IS_ON_HEAP(addr))
     loc = "heap";
+#if E_ACSL_OS_IS_LINUX
   else if (IS_ON_GLOBAL(addr))
     loc = "global";
   else if (IS_ON_TLS(addr))
     loc = "TLS";
+#elif E_ACSL_OS_IS_WINDOWS
+  else if (IS_ON_TEXT(addr))
+    loc = "text";
+  else if (IS_ON_BSS(addr))
+    loc = "bss";
+  else if (IS_ON_DATA(addr))
+    loc = "data";
+  else if (IS_ON_IDATA(addr))
+    loc = "idata";
+  else if (IS_ON_RDATA(addr))
+    loc = "rdata";
+#endif
   else
     loc = "untracked";
   return loc;
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
index 4379e1cda6f1baa4d0783ba51654a0a788245248..0baf6b56c0f0942270575031dadcf9756bc79db5 100644
--- 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
@@ -114,8 +114,18 @@
   DVASSERT(((uintptr_t)_addr) % HEAP_SEGMENT == 0,  \
       "Heap base address %a is unaligned", _addr)
 
+#define DVALIDATE_MEMORY_PRE_MAIN_INIT \
+  DVASSERT(mem_layout.is_initialized_pre_main != 0, \
+           "Un-initialized pre-main shadow layout", NULL)
+
+#define DVALIDATE_MEMORY_MAIN_INIT \
+  DVASSERT(mem_layout.is_initialized_main != 0, \
+           "Un-initialized main shadow layout", NULL)
+
 #define DVALIDATE_MEMORY_INIT \
-  DVASSERT(mem_layout.is_initialized != 0, "Un-initialized shadow layout", NULL)
+  DVASSERT(mem_layout.is_initialized_pre_main != 0 && \
+           mem_layout.is_initialized_main != 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. */
@@ -137,12 +147,24 @@ void validate_shadow_layout();
 /* Assert that [_addr, _addr+_size] are within stack segment */
 #define DVALIDATE_IS_ON_STACK(_addr, _size) \
   DVALIDATE_IS_ON(_addr, _size, STACK)
+#if E_ACSL_OS_IS_LINUX
 /* Assert that [_addr, _addr+_size] are within global segment */
-#define DVALIDATE_IS_ON_GLOBAL(_addr, _size) \
+# 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) \
+# define DVALIDATE_IS_ON_TLS(_addr, _size) \
   DVALIDATE_IS_ON(_addr, _size, TLS)
+#elif E_ACSL_OS_IS_WINDOWS
+/* Assert that [_addr, _addr+_size] are within text segment */
+# define DVALIDATE_IS_ON_TEXT(_addr, _size) \
+  DVALIDATE_IS_ON(_addr, _size, TEXT)
+/* Assert that [_addr, _addr+_size] are within bss segment */
+# define DVALIDATE_IS_ON_BSS(_addr, _size) \
+  DVALIDATE_IS_ON(_addr, _size, BSS)
+/* Assert that [_addr, _addr+_size] are within idata segment */
+# define DVALIDATE_IS_ON_IDATA(_addr, _size) \
+  DVALIDATE_IS_ON(_addr, _size, IDATA)
+#endif
 /* 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)
@@ -222,6 +244,8 @@ void validate_shadow_layout();
 
 #else
 /*! \cond exclude from doxygen */
+#  define DVALIDATE_MEMORY_PRE_MAIN_INIT
+#  define DVALIDATE_MEMORY_MAIN_INIT
 #  define DVALIDATE_MEMORY_INIT
 #  define DVALIDATE_SHADOW_LAYOUT
 #  define DVALIDATE_HEAP_ACCESS
@@ -231,8 +255,14 @@ void validate_shadow_layout();
 #  define DVALIDATE_IS_ON
 #  define DVALIDATE_IS_ON_HEAP
 #  define DVALIDATE_IS_ON_STACK
+#  if E_ACSL_OS_IS_LINUX
 #  define DVALIDATE_IS_ON_GLOBAL
 #  define DVALIDATE_IS_ON_TLS
+#  elif E_ACSL_OS_IS_WINDOWS
+#    define DVALIDATE_IS_ON_TEXT
+#    define DVALIDATE_IS_ON_BSS
+#    define DVALIDATE_IS_ON_IDATA
+#  endif
 #  define DVALIDATE_IS_ON_STATIC
 #  define DVALIDATE_FREEABLE
 #  define DVALIDATE_STATIC_FREE
@@ -309,6 +339,14 @@ void shadow_freea(void *ptr);
 
 /* Static querying {{{ */
 
+/*! \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 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.
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
index e070180edfc3d7f90a539120704675f210a28a6c..5ddb496007a2074e7581ad6089aca7c4fda0ce56 100644
--- 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
@@ -20,7 +20,6 @@
 /*                                                                        */
 /**************************************************************************/
 
-#include <sys/resource.h>
 #include <errno.h>
 #include <stddef.h>
 
@@ -29,8 +28,23 @@
 
 #include "e_acsl_shadow_layout.h"
 
+#if E_ACSL_OS_IS_LINUX
+
+#include <sys/resource.h>
+
 /** Program stack information {{{ */
 
+/* Symbols exported by the linker script */
+
+/*!\brief The first address past the end of the text segment. */
+extern char etext;
+/*!\brief The first address past the end of the initialized data segment. */
+extern char edata;
+/*!\brief The first address past the end of the uninitialized data segment. */
+extern char end;
+/*!\brief The first address of a program. */
+extern char __executable_start;
+
 size_t increase_stack_limit(const size_t size) {
   rlim_t stacksz = (rlim_t)size;
   struct rlimit rl;
@@ -59,7 +73,15 @@ size_t get_stack_size() {
   return rlim.rlim_cur;
 }
 
-uintptr_t get_stack_start(int *argc_ref,  char *** argv_ref) {
+
+extern char ** environ;
+
+/*! \brief Return the 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 or Clang and 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++;
@@ -72,74 +94,72 @@ uintptr_t get_stack_start(int *argc_ref,  char *** argv_ref) {
    * ::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;
-}
+  // Check that the assumption that argc and argv are stored below environ in
+  // the stack holds
+  DVASSERT(stack_start <= (uintptr_t)argc_ref
+           && (uintptr_t)argc_ref <= stack_end,
+           "Assumption that argc is stored below environ is not verified.\n\
+           \tStack: [%a - %a]\n\t&argc: %a",
+           stack_start, stack_end, argc_ref);
+  DVASSERT(stack_start <= (uintptr_t)argv_ref
+           && (uintptr_t)argv_ref <= stack_end,
+           "Assumption that argv is stored below environ is not verified.\n\
+           \tStack: [%a - %a]\n\t&argc: %a",
+           stack_start, stack_end, argc_ref);
 
-size_t get_heap_init_size() {
-  return get_heap_size()/8;
+  return stack_start;
 }
+/* }}} */
 
-uintptr_t get_global_start() {
+/** 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;
 }
 
-size_t get_global_size() {
+/*! \brief Return byte-size of global segment */
+static size_t get_global_size() {
   return ((uintptr_t)&end - get_global_start());
 }
 /** }}} */
 
-/** Shadow Layout {{{ */
+/** Thread-local storage information {{{ */
 
-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;
-}
+/*! Thread-local storage (TLS) keeps track of copies of per-thread variables.
+ * Even though at the present stage, E-ACSL's RTL is not thread-safe, some
+ * of the variables (for instance ::errno) are allocated there. In X86, TLS
+ * is typically located somewhere below the program's stack but above mmap
+ * areas. TLS is typically separated into two sections: .tdata and .tbss.
+ * Similar to globals using .data and .bss, .tdata keeps track of initialized
+ * thread-local variables, while .tbss holds uninitialized ones.
+ *
+ * Start and end addresses of TLS are obtained by taking addresses of
+ * initialized and uninitialized variables in TLS (::id_tdata and ::id_tss)
+ * and adding fixed amount of shadow space around them. Visually it looks
+ * as follows:
+ *
+ *   end TLS address (&id_tdata + TLS_SHADOW_SIZE/2)
+ *   id_tdata address
+ *   ...
+ *   id_tbss address
+ *   start TLS address (&id_bss - TLS_SHADOW_SIZE/2)
+ *
+ * HOWEVER problems can occur if PGM_TLS_SIZE is too big:
+ * see get_tls_start for details.
+ */
 
-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 = eacsl_create_mspace(seg->size + SHADOW_SEGMENT_PADDING, 0);
-  seg->start = (uintptr_t)eacsl_mspace_malloc(seg->mspace,1);
-  seg->end = seg->start + seg->size;
-  seg->shadow_offset = parent->start - seg->start;
+/*! \brief Return byte-size of the TLS segment */
+inline static size_t get_tls_size() {
+  return PGM_TLS_SIZE;
 }
 
-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;
-}
+static __thread int id_tdata = 1;
+static __thread int id_tbss;
 
-uintptr_t get_tls_start() {
+/*! \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;
@@ -173,17 +193,10 @@ uintptr_t get_tls_start() {
   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 partitions {{{ */
+static void init_shadow_layout_global() {
   memory_partition *pglobal = &mem_layout.global;
   set_application_segment(&pglobal->application, get_global_start(),
     get_global_size(), "global", NULL);
@@ -193,7 +206,9 @@ void init_shadow_layout_heap_global_tls() {
   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
+}
 
+static void init_shadow_layout_tls() {
   memory_partition *ptls = &mem_layout.tls;
   set_application_segment(&ptls->application, get_tls_start(),
     get_tls_size(), "tls", NULL);
@@ -203,12 +218,260 @@ void init_shadow_layout_heap_global_tls() {
   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
+}
+
+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
+}
+/** }}} */
+#elif E_ACSL_OS_IS_WINDOWS
+
+#include <processthreadsapi.h>
+#include <windows.h>
+#include <dbghelp.h>
+
+
+/** Program segment informations {{{ */
+typedef struct mem_loc_info {
+  uintptr_t start;
+  size_t size;
+} mem_loc_info_t;
+
+static mem_loc_info_t get_section_info(HANDLE hModule, const char * section_name) {
+  // Get the location of the module's IMAGE_NT_HEADERS structure
+  IMAGE_NT_HEADERS *pNtHdr = ImageNtHeader(hModule);
+
+  // Section table immediately follows the IMAGE_NT_HEADERS
+  IMAGE_SECTION_HEADER *pSectionHdr = (IMAGE_SECTION_HEADER *)(pNtHdr + 1);
+
+  const char* imageBase = (const char*)hModule;
+  size_t scnNameSize = sizeof(pSectionHdr->Name);
+  char scnName[scnNameSize + 1];
+  // Enforce nul-termination for scn names that are the whole length of
+  // pSectionHdr->Name[]
+  scnName[scnNameSize] = '\0';
+
+  mem_loc_info_t res = { .start = 0, .size = 0 };
+
+  for (int scn = 0; scn < pNtHdr->FileHeader.NumberOfSections; ++scn, ++pSectionHdr) {
+    // Note: pSectionHdr->Name[] is 8-byte long. If the scn name is 8-byte
+    // long, ->Name[] will not be nul-terminated. For this reason, copy it to a
+    // local buffer that is nul-terminated to be sure we only print the real scn
+    // name, and no extra garbage beyond it.
+    strncpy(scnName, (const char*)pSectionHdr->Name, scnNameSize);
+
+    if (strcmp(scnName, section_name) == 0) {
+      res.start = (uintptr_t)imageBase + pSectionHdr->VirtualAddress;
+      res.size = pSectionHdr->Misc.VirtualSize;
+      break;
+    }
+  }
+
+  return res;
+}
+/** }}} */
+
+/** Program stack information {{{ */
+static mem_loc_info_t get_stack_mem_loc_info() {
+  ULONG_PTR low;
+  ULONG_PTR high;
+  GetCurrentThreadStackLimits(&low, &high);
+  return (mem_loc_info_t) {
+    .start = low,
+    .size = high - low + 1
+  };
+}
+
+size_t increase_stack_limit(const size_t size) {
+  size_t actual_size = get_stack_size();
+  if (actual_size < size) {
+    DLOG("Increasing stack size at runtime is unsupported on Windows.\n\
+      \t   Actual stack size: %lu\n\
+      \tRequested stack size: %lu\n",
+      actual_size, size);
+  }
+  return actual_size;
+}
+
+size_t get_stack_size() {
+  return get_stack_mem_loc_info().size;
+}
+/** }}} */
+
+/** Memory partitions {{{ */
+static void init_shadow_layout_stack(int *argc_ref, char ***argv_ref) {
+  memory_partition *pstack = &mem_layout.stack;
+  mem_loc_info_t stack_loc_info = get_stack_mem_loc_info();
+  set_application_segment(&pstack->application, stack_loc_info.start,
+    stack_loc_info.size, "stack", NULL);
+  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
+}
+
+static void init_shadow_layout_text(HMODULE module) {
+  // Retrieve mem loc info for the text section
+  mem_loc_info_t text = get_section_info(module, ".text");
+
+  memory_partition *ptext = &mem_layout.text;
+  set_application_segment(&ptext->application, text.start,
+    text.size, "text", NULL);
+  set_shadow_segment(&ptext->primary, &ptext->application, 1, "text_primary");
+  set_shadow_segment(&ptext->secondary, &ptext->application, 1, "text_secondary");
+#ifdef E_ACSL_TEMPORAL
+  set_shadow_segment(&ptext->temporal_primary, &ptext->application, 1, "temporal_text_primary");
+  set_shadow_segment(&ptext->temporal_secondary, &ptext->application, 1, "temporal_text_secondary");
+#endif
+}
+
+static void init_shadow_layout_bss(HMODULE module) {
+  // Retrieve mem loc info for the uninidialized data segment
+  mem_loc_info_t bss = get_section_info(module, ".bss");
+
+  memory_partition *pbss = &mem_layout.bss;
+  set_application_segment(&pbss->application, bss.start, bss.size, "bss", NULL);
+  set_shadow_segment(&pbss->primary, &pbss->application, 1, "bss_primary");
+  set_shadow_segment(&pbss->secondary, &pbss->application, 1, "bss_secondary");
+#ifdef E_ACSL_TEMPORAL
+  set_shadow_segment(&pbss->temporal_primary, &pbss->application, 1, "temporal_bss_primary");
+  set_shadow_segment(&pbss->temporal_secondary, &pbss->application, 1, "temporal_bss_secondary");
+#endif
+}
+
+static void init_shadow_layout_data(HMODULE module) {
+  // Retrieve mem loc info for the initialized data segment
+  mem_loc_info_t data = get_section_info(module, ".data");
+
+  memory_partition *pdata = &mem_layout.data;
+  set_application_segment(&pdata->application, data.start, data.size, "data", NULL);
+  set_shadow_segment(&pdata->primary, &pdata->application, 1, "data_primary");
+  set_shadow_segment(&pdata->secondary, &pdata->application, 1, "data_secondary");
+#ifdef E_ACSL_TEMPORAL
+  set_shadow_segment(&pdata->temporal_primary, &pdata->application, 1, "temporal_data_primary");
+  set_shadow_segment(&pdata->temporal_secondary, &pdata->application, 1, "temporal_data_secondary");
+#endif
+}
+
+static void init_shadow_layout_idata(HMODULE module) {
+  // Retrieve mem loc info for the initialized data segment
+  mem_loc_info_t idata = get_section_info(module, ".idata");
+
+  memory_partition *pidata = &mem_layout.idata;
+  set_application_segment(&pidata->application, idata.start, idata.size, "idata", NULL);
+  set_shadow_segment(&pidata->primary, &pidata->application, 1, "idata_primary");
+  set_shadow_segment(&pidata->secondary, &pidata->application, 1, "idata_secondary");
+#ifdef E_ACSL_TEMPORAL
+  set_shadow_segment(&pidata->temporal_primary, &pidata->application, 1, "temporal_idata_primary");
+  set_shadow_segment(&pidata->temporal_secondary, &pidata->application, 1, "temporal_idata_secondary");
+#endif
+}
+
+static void init_shadow_layout_rdata(HMODULE module) {
+  // Retrieve mem loc info for the initialized data segment
+  mem_loc_info_t rdata = get_section_info(module, ".rdata");
+
+  memory_partition *prdata = &mem_layout.rdata;
+  set_application_segment(&prdata->application, rdata.start, rdata.size, "rdata", NULL);
+  set_shadow_segment(&prdata->primary, &prdata->application, 1, "rdata_primary");
+  set_shadow_segment(&prdata->secondary, &prdata->application, 1, "rdata_secondary");
+#ifdef E_ACSL_TEMPORAL
+  set_shadow_segment(&prdata->temporal_primary, &prdata->application, 1, "temporal_rdata_primary");
+  set_shadow_segment(&prdata->temporal_secondary, &prdata->application, 1, "temporal_rdata_secondary");
+#endif
+}
+/** }}} */
+#endif
+
+/** Program heap information {{{ */
+static uintptr_t get_heap_start() {
+  return mem_spaces.heap_start;
+}
+
+size_t get_heap_size() {
+  return PGM_HEAP_SIZE;
+}
+
+static size_t get_heap_init_size() {
+  return get_heap_size()/8;
+}
+
+static void init_shadow_layout_heap() {
+  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
+}
+/** }}} */
+
+/** 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 = eacsl_create_mspace(seg->size + SHADOW_SEGMENT_PADDING, 0);
+  seg->start = (uintptr_t)eacsl_mspace_malloc(seg->mspace,1);
+  seg->end = seg->start + seg->size;
+  seg->shadow_offset = parent->start - seg->start;
+}
+
+void init_shadow_layout_pre_main() {
+  init_shadow_layout_heap();
+
+#if E_ACSL_OS_IS_LINUX
+  init_shadow_layout_global();
+  init_shadow_layout_tls();
+#elif E_ACSL_OS_IS_WINDOWS
+  HANDLE module = GetModuleHandle(NULL);
+  init_shadow_layout_text(module);
+  init_shadow_layout_bss(module);
+  init_shadow_layout_data(module);
+  init_shadow_layout_idata(module);
+  init_shadow_layout_rdata(module);
+#endif
+
+  mem_layout.is_initialized_pre_main = 1;
+}
+
+void init_shadow_layout_main(int *argc_ref, char *** argv_ref) {
+  init_shadow_layout_stack(argc_ref, argv_ref);
 
-  mem_layout.is_initialized = 1;
+  mem_layout.is_initialized_main = 1;
 }
 
 void clean_shadow_layout() {
-  if (mem_layout.is_initialized) {
+  if (mem_layout.is_initialized_pre_main && mem_layout.is_initialized_main) {
     int i;
     for (i = 0; i < sizeof(mem_partitions)/sizeof(memory_partition*); i++) {
       if (mem_partitions[i]->primary.mspace)
diff --git a/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_shadow_layout.h b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_shadow_layout.h
index b15415383d498ef48e84b392a5e6323cbbac5912..93dc849c54d3710c0b0a95581551d5b3e9a687ef 100644
--- a/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_shadow_layout.h
+++ b/src/plugins/e-acsl/share/e-acsl/observation_model/segment_model/e_acsl_shadow_layout.h
@@ -30,6 +30,7 @@
 
 #include <stddef.h>
 #include <stdint.h>
+#include "../../internals/e_acsl_config.h"
 #include "../../internals/e_acsl_malloc.h"
 
 /* Default size of a program's heap tracked via shadow memory */
@@ -42,21 +43,6 @@
 #define E_ACSL_STACK_SIZE 64
 #endif
 
-/* Symbols exported by the linker script */
-
-/*!\brief The first address past the end of the text segment. */
-extern char etext;
-/*!\brief The first address past the end of the initialized data segment. */
-extern char edata;
-/*!\brief The first address past the end of the uninitialized data segment. */
-extern char end;
-/*!\brief The first address of a program. */
-extern char __executable_start;
-
-/* \cond */
-void *sbrk(intptr_t increment);
-char *strerror(int errnum);
-
 /* MAP_ANONYMOUS is a mmap flag indicating that the contents of allocated blocks
  * should be nullified. Set value from <bits/mman-linux.h>, if MAP_ANONYMOUS is
  * undefined */
@@ -95,43 +81,7 @@ char *strerror(int errnum);
 #define SHADOW_SEGMENT_PADDING (512*KB)
 /* }}} */
 
-/** Thread-local storage information {{{ */
-
-/*! Thread-local storage (TLS) keeps track of copies of per-thread variables.
- * Even though at the present stage RTL of E-ACSL is not thread-safe, some
- * of the variables (for instance ::errno) are allocated there. In X86 TLS
- * is typically located somewhere below the program's stack but above mmap
- * areas. TLS is typically separated into two sections: .tdata and .tbss.
- * Similar to globals using .data and .bss, .tdata keeps track of initialized
- * thread-local variables, while .tbss holds uninitialized ones.
- *
- * Start and end addresses of TLS are obtained by taking addresses of
- * initialized and uninitialized variables in TLS (::id_tdata and ::id_tss)
- * and adding fixed amount of shadow space around them. Visually it looks
- * as follows:
- *
- *   end TLS address (&id_tdata + TLS_SHADOW_SIZE/2)
- *   id_tdata address
- *   ...
- *   id_tbss address
- *   start TLS address (&id_bss - TLS_SHADOW_SIZE/2)
- *
- * HOWEVER problems can occur if PGM_TLS_SIZE is too big:
- * see get_tls_start for details.
- */
-
-/*! \brief Return byte-size of the TLS segment */
-inline static size_t get_tls_size() {
-  return PGM_TLS_SIZE;
-}
-
-static __thread int id_tdata = 1;
-static __thread int id_tbss;
-
-/* }}} */
-
 /** Program stack information {{{ */
-extern char ** environ;
 
 /*! \brief Set a new soft stack limit
  *
@@ -149,35 +99,11 @@ 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. */
 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. */
-uintptr_t get_stack_start(int *argc_ref,  char *** argv_ref);
 /* }}} */
 
 /** Program heap information {{{ */
-/*! \brief Return the start address of a program's heap. */
-uintptr_t get_heap_start();
-
 /*! \brief Return the tracked size of a program's heap. */
 size_t get_heap_size();
-
-/*! \brief Return the size of a secondary shadow region tracking
- * initialization (i.e., init shadow). */
-size_t get_heap_init_size();
-
-/** }}} */
-
-/** Program global information {{{ */
-/*! \brief Return the start address of a segment holding globals (generally
- * BSS and Data segments). */
-uintptr_t get_global_start();
-
-/*! \brief Return byte-size of global segment */
-size_t get_global_size();
 /** }}} */
 
 /** Shadow Layout {{{ */
@@ -257,20 +183,48 @@ typedef struct memory_partition memory_partition;
 struct memory_layout {
   memory_partition heap;
   memory_partition stack;
+#if E_ACSL_OS_IS_LINUX
+  // On linux
+  // The text, bss and data segments are contiguous and regrouped here in a
+  // global memory partition
   memory_partition global;
+  // The TLS is in a specific section and identifiable
   memory_partition tls;
-  int is_initialized;
+#elif E_ACSL_OS_IS_WINDOWS
+  // On windows
+  // The text, bss and data segments are not necessarily contiguous so each one
+  // is in its own memory partition
+  memory_partition text;
+  memory_partition bss;
+  memory_partition data;
+  memory_partition idata;
+  memory_partition rdata;
+  // The TLS is stored on the heap and is indistiguishable from it
+#endif
+  int is_initialized_pre_main;
+  int is_initialized_main;
 };
 
 /*! \brief Full program memory layout. */
-struct memory_layout mem_layout;
+struct memory_layout mem_layout = {
+  .is_initialized_pre_main = 0,
+  .is_initialized_main = 0,
+};
 
 /*! \brief Array of used partitions */
 memory_partition *mem_partitions [] = {
   &mem_layout.heap,
   &mem_layout.stack,
+#if E_ACSL_OS_IS_LINUX
   &mem_layout.global,
-  &mem_layout.tls
+  &mem_layout.tls,
+#elif E_ACSL_OS_IS_WINDOWS
+  &mem_layout.text,
+  &mem_layout.bss,
+  &mem_layout.data,
+  &mem_layout.idata,
+  &mem_layout.rdata,
+#endif
 };
 
 /*! \brief Initialize an application memory segment.
@@ -296,17 +250,18 @@ void set_shadow_segment(memory_segment *seg, memory_segment *parent,
 /*! \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. */
-void init_shadow_layout_stack(int *argc_ref, char ***argv_ref);
-
-/*! \brief Return start address of a program's TLS */
-uintptr_t get_tls_start();
+ *
+ * Case of segments available before main (for instance from a function marked
+ * as `__constructor__`). */
+void init_shadow_layout_pre_main();
 
 /*! \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. */
-void init_shadow_layout_heap_global_tls();
+ *
+ * Case of segments only available once inside of main (for instance the stack
+ * of the program). */
+void init_shadow_layout_main(int *argc_ref, char ***argv_ref);
 
 /*! \brief Deallocate shadow regions used by runtime analysis */
 void clean_shadow_layout();
@@ -333,10 +288,23 @@ void clean_shadow_layout();
 #define heap_secondary_offset   mem_layout.heap.secondary.shadow_offset
 #define stack_primary_offset    mem_layout.stack.primary.shadow_offset
 #define stack_secondary_offset  mem_layout.stack.secondary.shadow_offset
-#define global_primary_offset   mem_layout.global.primary.shadow_offset
-#define global_secondary_offset mem_layout.global.secondary.shadow_offset
-#define tls_primary_offset      mem_layout.tls.primary.shadow_offset
-#define tls_secondary_offset    mem_layout.tls.secondary.shadow_offset
+#if E_ACSL_OS_IS_LINUX
+# define global_primary_offset   mem_layout.global.primary.shadow_offset
+# define global_secondary_offset mem_layout.global.secondary.shadow_offset
+# define tls_primary_offset      mem_layout.tls.primary.shadow_offset
+# define tls_secondary_offset    mem_layout.tls.secondary.shadow_offset
+#elif E_ACSL_OS_IS_WINDOWS
+# define text_primary_offset mem_layout.text.primary.shadow_offset
+# define text_secondary_offset mem_layout.text.secondary.shadow_offset
+# define bss_primary_offset mem_layout.bss.primary.shadow_offset
+# define bss_secondary_offset mem_layout.bss.secondary.shadow_offset
+# define data_primary_offset mem_layout.data.primary.shadow_offset
+# define data_secondary_offset mem_layout.data.secondary.shadow_offset
+# define idata_primary_offset mem_layout.idata.primary.shadow_offset
+# define idata_secondary_offset mem_layout.idata.secondary.shadow_offset
+# define rdata_primary_offset mem_layout.rdata.primary.shadow_offset
+# define rdata_secondary_offset mem_layout.rdata.secondary.shadow_offset
+#endif
 
 /*! \brief Compute a shadow address using displacement offset
  * @param _addr - an application space address
@@ -374,29 +342,97 @@ void clean_shadow_layout();
 #define SECONDARY_STACK_SHADOW(_addr) \
   SHADOW_ACCESS(_addr, stack_secondary_offset)
 
+#if E_ACSL_OS_IS_LINUX
 /*! \brief Convert a global address into its primary shadow counterpart */
-#define PRIMARY_GLOBAL_SHADOW(_addr)  \
+# define PRIMARY_GLOBAL_SHADOW(_addr)  \
   SHADOW_ACCESS(_addr, global_primary_offset)
 
 /*! \brief Convert a global address into its secondary shadow counterpart */
-#define SECONDARY_GLOBAL_SHADOW(_addr) \
+# define SECONDARY_GLOBAL_SHADOW(_addr) \
   SHADOW_ACCESS(_addr, global_secondary_offset)
 
 /*! \brief Convert a TLS address into its primary shadow counterpart */
-#define PRIMARY_TLS_SHADOW(_addr)  \
+# define PRIMARY_TLS_SHADOW(_addr)  \
   SHADOW_ACCESS(_addr, tls_primary_offset)
 
 /*! \brief Convert a TLS address into its secondary shadow counterpart */
-#define SECONDARY_TLS_SHADOW(_addr) \
+# define SECONDARY_TLS_SHADOW(_addr) \
   SHADOW_ACCESS(_addr, tls_secondary_offset)
+#elif E_ACSL_OS_IS_WINDOWS
+/*! \brief Convert a text address into its primary shadow counterpart */
+# define PRIMARY_TEXT_SHADOW(_addr)  \
+  SHADOW_ACCESS(_addr, text_primary_offset)
+
+/*! \brief Convert a text address into its secondary shadow counterpart */
+# define SECONDARY_TEXT_SHADOW(_addr) \
+  SHADOW_ACCESS(_addr, text_secondary_offset)
+
+/*! \brief Convert a bss address into its primary shadow counterpart */
+# define PRIMARY_BSS_SHADOW(_addr)  \
+  SHADOW_ACCESS(_addr, bss_primary_offset)
+
+/*! \brief Convert a bss address into its secondary shadow counterpart */
+# define SECONDARY_BSS_SHADOW(_addr) \
+  SHADOW_ACCESS(_addr, bss_secondary_offset)
+
+/*! \brief Convert an data address into its primary shadow counterpart */
+# define PRIMARY_DATA_SHADOW(_addr)  \
+  SHADOW_ACCESS(_addr, data_primary_offset)
+
+/*! \brief Convert an data address into its secondary shadow counterpart */
+# define SECONDARY_DATA_SHADOW(_addr) \
+  SHADOW_ACCESS(_addr, data_secondary_offset)
+
+/*! \brief Convert an idata address into its primary shadow counterpart */
+# define PRIMARY_IDATA_SHADOW(_addr)  \
+  SHADOW_ACCESS(_addr, idata_primary_offset)
+
+/*! \brief Convert an idata address into its secondary shadow counterpart */
+# define SECONDARY_IDATA_SHADOW(_addr) \
+  SHADOW_ACCESS(_addr, idata_secondary_offset)
+
+/*! \brief Convert an rdata address into its primary shadow counterpart */
+# define PRIMARY_RDATA_SHADOW(_addr)  \
+  SHADOW_ACCESS(_addr, rdata_primary_offset)
+
+/*! \brief Convert an rdata address into its secondary shadow counterpart */
+# define SECONDARY_RDATA_SHADOW(_addr) \
+  SHADOW_ACCESS(_addr, rdata_secondary_offset)
+
+/*! \brief Convert a global address into its primary shadow counterpart */
+# define PRIMARY_GLOBAL_SHADOW(_addr) \
+    (IS_ON_TEXT(_addr) ? PRIMARY_TEXT_SHADOW(_addr) : \
+     IS_ON_BSS(_addr) ? PRIMARY_BSS_SHADOW(_addr) : \
+     IS_ON_DATA(_addr) ? PRIMARY_DATA_SHADOW(_addr) : \
+     IS_ON_IDATA(_addr) ? PRIMARY_IDATA_SHADOW(_addr) : \
+     IS_ON_RDATA(_addr) ? PRIMARY_RDATA_SHADOW(_addr) : (intptr_t)0)
+
+/*! \brief Convert a global address into its secondary shadow counterpart */
+# define SECONDARY_GLOBAL_SHADOW(_addr) \
+    (IS_ON_TEXT(_addr) ? SECONDARY_TEXT_SHADOW(_addr) : \
+     IS_ON_BSS(_addr) ? SECONDARY_BSS_SHADOW(_addr) : \
+     IS_ON_DATA(_addr) ? SECONDARY_DATA_SHADOW(_addr) : \
+     IS_ON_IDATA(_addr) ? SECONDARY_IDATA_SHADOW(_addr) : \
+     IS_ON_RDATA(_addr) ? SECONDARY_RDATA_SHADOW(_addr) : (intptr_t)0)
+#endif
 
 /* \brief Compute a primary or a secondary shadow address (based on the value of
  * parameter `_region`) of an address tracked via an offset-based encoding.
  * For an untracked address `0` is returned. */
-#define SHADOW_REGION_ADDRESS(_addr, _region) \
-  (IS_ON_STACK(_addr) ? _region##_STACK_SHADOW(_addr) : \
-    IS_ON_GLOBAL(_addr) ? _region##_GLOBAL_SHADOW(_addr) : \
-      IS_ON_TLS(_addr) ? _region##_TLS_SHADOW(_addr) : 0)
+#if E_ACSL_OS_IS_LINUX
+# define SHADOW_REGION_ADDRESS(_addr, _region) \
+    (IS_ON_STACK(_addr) ? _region##_STACK_SHADOW(_addr) : \
+     IS_ON_GLOBAL(_addr) ? _region##_GLOBAL_SHADOW(_addr) : \
+     IS_ON_TLS(_addr) ? _region##_TLS_SHADOW(_addr) : (intptr_t)0)
+#elif E_ACSL_OS_IS_WINDOWS
+# define SHADOW_REGION_ADDRESS(_addr, _region) \
+    (IS_ON_STACK(_addr) ? _region##_STACK_SHADOW(_addr) : \
+     IS_ON_TEXT(_addr) ? _region##_TEXT_SHADOW(_addr) : \
+     IS_ON_BSS(_addr) ? _region##_BSS_SHADOW(_addr) : \
+     IS_ON_DATA(_addr) ? _region##_DATA_SHADOW(_addr) : \
+     IS_ON_IDATA(_addr) ? _region##_IDATA_SHADOW(_addr) : \
+     IS_ON_RDATA(_addr) ? _region##_RDATA_SHADOW(_addr) : (intptr_t)0)
+#endif
 
 /*! \brief Primary shadow address of a non-dynamic region */
 #define PRIMARY_SHADOW(_addr) SHADOW_REGION_ADDRESS(_addr, PRIMARY)
@@ -422,22 +458,50 @@ void clean_shadow_layout();
 /*! \brief Evaluate to true if `_addr` is a stack address */
 #define IS_ON_STACK(_addr) IS_ON(_addr, mem_layout.stack.application)
 
+#if E_ACSL_OS_IS_LINUX
 /*! \brief Evaluate to true if `_addr` is a global address */
-#define IS_ON_GLOBAL(_addr) IS_ON(_addr, mem_layout.global.application)
+# define IS_ON_GLOBAL(_addr) IS_ON(_addr, mem_layout.global.application)
 
 /*! \brief Evaluate to true if _addr is a TLS address */
-#define IS_ON_TLS(_addr) IS_ON(_addr, mem_layout.tls.application)
+# define IS_ON_TLS(_addr) IS_ON(_addr, mem_layout.tls.application)
 
 /*! \brief Shortcut for evaluating an address via ::IS_ON_STACK,
  * ::IS_ON_GLOBAL or ::IS_ON_TLS  */
-#define IS_ON_STATIC(_addr) \
-  (IS_ON_STACK(_addr) || IS_ON_GLOBAL(_addr) || IS_ON_TLS(_addr))
+# define IS_ON_STATIC(_addr) \
+    (IS_ON_STACK(_addr) || IS_ON_GLOBAL(_addr) || IS_ON_TLS(_addr))
+#elif E_ACSL_OS_IS_WINDOWS
+/*! \brief Evaluate to true if `_addr` is a text address */
+# define IS_ON_TEXT(_addr) IS_ON(_addr, mem_layout.text.application)
+
+/*! \brief Evaluate to true if `_addr` is a bss address */
+# define IS_ON_BSS(_addr) IS_ON(_addr, mem_layout.bss.application)
+
+/*! \brief Evaluate to true if `_addr` is an idata address */
+# define IS_ON_DATA(_addr) IS_ON(_addr, mem_layout.data.application)
+
+/*! \brief Evaluate to true if `_addr` is an idata address */
+# define IS_ON_IDATA(_addr) IS_ON(_addr, mem_layout.idata.application)
+
+/*! \brief Evaluate to true if `_addr` is an rdata address */
+# define IS_ON_RDATA(_addr) IS_ON(_addr, mem_layout.rdata.application)
+
+/*! \brief Evaluate to true if `_addr` is a global address */
+# define IS_ON_GLOBAL(_addr) \
+    (IS_ON_TEXT(_addr) || IS_ON_BSS(_addr) || IS_ON_DATA(_addr) || \
+     IS_ON_IDATA(_addr) || IS_ON_RDATA(_addr))
+
+/*! \brief Shortcut for evaluating an address via ::IS_ON_STACK,
+ * ::IS_ON_TEXT, :: IS_ON_BSS, ::IS_ON_IDATA, or ::IS_ON_RDATA  */
+# define IS_ON_STATIC(_addr) \
+    (IS_ON_STACK(_addr) || IS_ON_TEXT(_addr) || IS_ON_BSS(_addr) || \
+     IS_ON_DATA(_addr) || IS_ON_IDATA(_addr) || IS_ON_RDATA(_addr))
+#endif
 
 /*! \brief Evaluate to a true value if a given address belongs to tracked
- * allocation (i.e., found within tls, stack, heap or globally) */
+ * allocation (i.e., found within static or dynamic allocation) */
 #define IS_ON_VALID(_addr) \
-  (IS_ON_STACK(_addr) || IS_ON_HEAP(_addr) || \
-   IS_ON_GLOBAL(_addr) || IS_ON_TLS(_addr))
+  (IS_ON_STATIC(_addr) || IS_ON_HEAP(_addr))
+
 /* }}} */
 
 #ifdef E_ACSL_TEMPORAL /* {{{ */
@@ -453,21 +517,79 @@ void clean_shadow_layout();
 #define TEMPORAL_SECONDARY_STACK_SHADOW(_addr) \
   SHADOW_ACCESS(_addr, mem_layout.stack.temporal_secondary.shadow_offset)
 
+#if E_ACSL_OS_IS_LINUX
 /*! \brief Convert a global address into its primary temporal shadow counterpart */
-#define TEMPORAL_PRIMARY_GLOBAL_SHADOW(_addr)  \
-  SHADOW_ACCESS(_addr, mem_layout.global.temporal_primary.shadow_offset)
+# define TEMPORAL_PRIMARY_GLOBAL_SHADOW(_addr)  \
+    SHADOW_ACCESS(_addr, mem_layout.global.temporal_primary.shadow_offset)
 
 /*! \brief Convert a global address into its primary temporal shadow counterpart */
-#define TEMPORAL_SECONDARY_GLOBAL_SHADOW(_addr)  \
-  SHADOW_ACCESS(_addr, mem_layout.global.temporal_secondary.shadow_offset)
+# define TEMPORAL_SECONDARY_GLOBAL_SHADOW(_addr)  \
+    SHADOW_ACCESS(_addr, mem_layout.global.temporal_secondary.shadow_offset)
 
 /*! \brief Convert a TLS address into its primary temporal shadow counterpart */
-#define TEMPORAL_PRIMARY_TLS_SHADOW(_addr)  \
-  SHADOW_ACCESS(_addr, mem_layout.tls.temporal_primary.shadow_offset)
+# define TEMPORAL_PRIMARY_TLS_SHADOW(_addr)  \
+    SHADOW_ACCESS(_addr, mem_layout.tls.temporal_primary.shadow_offset)
 
 /*! \brief Convert a TLS address into its secondary temporal shadow counterpart */
-#define TEMPORAL_SECONDARY_TLS_SHADOW(_addr)  \
-  SHADOW_ACCESS(_addr, mem_layout.tls.temporal_secondary.shadow_offset)
+# define TEMPORAL_SECONDARY_TLS_SHADOW(_addr)  \
+    SHADOW_ACCESS(_addr, mem_layout.tls.temporal_secondary.shadow_offset)
+#elif E_ACSL_OS_IS_WINDOWS
+/*! \brief Convert a text address into its primary temporal shadow counterpart */
+# define TEMPORAL_PRIMARY_TEXT_SHADOW(_addr)  \
+    SHADOW_ACCESS(_addr, mem_layout.text.temporal_primary.shadow_offset)
+
+/*! \brief Convert a text address into its primary temporal shadow counterpart */
+# define TEMPORAL_SECONDARY_TEXT_SHADOW(_addr)  \
+    SHADOW_ACCESS(_addr, mem_layout.text.temporal_secondary.shadow_offset)
+
+/*! \brief Convert a bss address into its primary temporal shadow counterpart */
+# define TEMPORAL_PRIMARY_BSS_SHADOW(_addr)  \
+    SHADOW_ACCESS(_addr, mem_layout.bss.temporal_primary.shadow_offset)
+
+/*! \brief Convert a bss address into its primary temporal shadow counterpart */
+# define TEMPORAL_SECONDARY_BSS_SHADOW(_addr)  \
+    SHADOW_ACCESS(_addr, mem_layout.bss.temporal_secondary.shadow_offset)
+
+/*! \brief Convert an data address into its primary temporal shadow counterpart */
+# define TEMPORAL_PRIMARY_DATA_SHADOW(_addr)  \
+    SHADOW_ACCESS(_addr, mem_layout.data.temporal_primary.shadow_offset)
+
+/*! \brief Convert an data address into its primary temporal shadow counterpart */
+# define TEMPORAL_SECONDARY_DATA_SHADOW(_addr)  \
+    SHADOW_ACCESS(_addr, mem_layout.data.temporal_secondary.shadow_offset)
+
+/*! \brief Convert an idata address into its primary temporal shadow counterpart */
+# define TEMPORAL_PRIMARY_IDATA_SHADOW(_addr)  \
+    SHADOW_ACCESS(_addr, mem_layout.idata.temporal_primary.shadow_offset)
+
+/*! \brief Convert an idata address into its primary temporal shadow counterpart */
+# define TEMPORAL_SECONDARY_IDATA_SHADOW(_addr)  \
+    SHADOW_ACCESS(_addr, mem_layout.idata.temporal_secondary.shadow_offset)
+
+/*! \brief Convert an rdata address into its primary temporal shadow counterpart */
+# define TEMPORAL_PRIMARY_RDATA_SHADOW(_addr)  \
+    SHADOW_ACCESS(_addr, mem_layout.rdata.temporal_primary.shadow_offset)
+
+/*! \brief Convert an rdata address into its primary temporal shadow counterpart */
+# define TEMPORAL_SECONDARY_RDATA_SHADOW(_addr)  \
+    SHADOW_ACCESS(_addr, mem_layout.rdata.temporal_secondary.shadow_offset)
+
+/*! \brief Convert a global address into its primary temporal shadow counterpart */
+# define TEMPORAL_PRIMARY_GLOBAL_SHADOW(_addr) \
+    (IS_ON_TEXT(_addr) ? TEMPORAL_PRIMARY_TEXT_SHADOW(_addr) : \
+     IS_ON_BSS(_addr) ? TEMPORAL_PRIMARY_BSS_SHADOW(_addr) : \
+     IS_ON_DATA(_addr) ? TEMPORAL_PRIMARY_DATA_SHADOW(_addr) : \
+     IS_ON_IDATA(_addr) ? TEMPORAL_PRIMARY_IDATA_SHADOW(_addr) : \
+     IS_ON_RDATA(_addr) ? TEMPORAL_PRIMARY_RDATA_SHADOW(_addr) : (intptr_t)0)
+
+/*! \brief Convert a global address into its primary temporal shadow counterpart */
+# define TEMPORAL_SECONDARY_GLOBAL_SHADOW(_addr) \
+    (IS_ON_TEXT(_addr) ? TEMPORAL_SECONDARY_TEXT_SHADOW(_addr) : \
+     IS_ON_BSS(_addr) ? TEMPORAL_SECONDARY_BSS_SHADOW(_addr) : \
+     IS_ON_DATA(_addr) ? TEMPORAL_SECONDARY_DATA_SHADOW(_addr) : \
+     IS_ON_IDATA(_addr) ? TEMPORAL_SECONDARY_IDATA_SHADOW(_addr) : \
+     IS_ON_RDATA(_addr) ? TEMPORAL_SECONDARY_RDATA_SHADOW(_addr) : (intptr_t)0)
+#endif
 
 /*! \brief Temporal primary shadow address of a non-dynamic region */
 #define TEMPORAL_PRIMARY_STATIC_SHADOW(_addr) \
diff --git a/src/plugins/e-acsl/src/analyses/memory_tracking.ml b/src/plugins/e-acsl/src/analyses/memory_tracking.ml
index 353db8f4f00d7be5dd60b2fdc089f6b484a61a63..cfb1f9aae8c5e55f86ca9ff094a149d0e763df88 100644
--- a/src/plugins/e-acsl/src/analyses/memory_tracking.ml
+++ b/src/plugins/e-acsl/src/analyses/memory_tracking.ml
@@ -104,7 +104,7 @@ end = struct
     type data = Varinfo.Hptset.t option
     let apply f =
       try
-        let kf = Extlib.opt_conv (Kernel_function.dummy()) !current_kf in
+        let kf = Option.value ~default:(Kernel_function.dummy()) !current_kf in
         let h = Kernel_function.Hashtbl.find tbl kf in
         f h
       with Not_found ->
@@ -641,12 +641,12 @@ end = struct
        let fundec = Kernel_function.get_definition kf in
        let stmts, returns = Dataflow.find_stmts fundec in
        if is_init then
-         Extlib.may
+         Option.iter
            (fun set ->
               List.iter
                 (fun s ->
                    let old =
-                     try Extlib.the (Stmt.Hashtbl.find tbl s)
+                     try Option.get (Stmt.Hashtbl.find tbl s)
                      with Not_found -> assert false
                    in
                    Stmt.Hashtbl.replace
@@ -657,7 +657,7 @@ end = struct
            init_set
        else begin
          List.iter (fun s -> Stmt.Hashtbl.add tbl s None) stmts;
-         Extlib.may
+         Option.iter
            (fun set ->
               List.iter
                 (fun s -> Stmt.Hashtbl.replace tbl s (Some set))
diff --git a/src/plugins/e-acsl/src/analyses/typing.ml b/src/plugins/e-acsl/src/analyses/typing.ml
index df114cc3a82e449378b97f09bed3b17ef872b5c1..55bec5e40a5738218b6d8d9e48985c596e420b34 100644
--- a/src/plugins/e-acsl/src/analyses/typing.ml
+++ b/src/plugins/e-acsl/src/analyses/typing.ml
@@ -321,7 +321,7 @@ let type_letin li li_t =
 (* type the term [t] in a context [ctx] by taking --e-acsl-gmp-only into account
    iff [use_gmp_opt] is true. *)
 let rec type_term ~use_gmp_opt ?(arith_operand=false) ?ctx t =
-  let ctx = Extlib.opt_map (mk_ctx ~use_gmp_opt) ctx in
+  let ctx = Option.map (mk_ctx ~use_gmp_opt) ctx in
   let dup ty = ty, ty in
   let compute_ctx ?ctx i =
     (* in order to get a minimal amount of generated casts for operators, the
@@ -485,8 +485,8 @@ let rec type_term ~use_gmp_opt ?(arith_operand=false) ?ctx t =
         in
         List.iter2 typ_arg li.l_profile args;
         (* [li.l_type is [None] for predicate only: not possible here.
-           Thus using [Extlib.the] is fine *)
-        dup (ty_of_logic_ty (Extlib.the li.l_type))
+           Thus using [Option.get] is fine *)
+        dup (ty_of_logic_ty (Option.get li.l_type))
       else begin
         (* TODO: what if the type of the parameter is smaller than the infered
            type of the argument? For now, it is silently ignored (both
@@ -751,12 +751,12 @@ let get_op t =
 
 let get_cast t =
   let info = Memo.get t in
-  try Extlib.opt_map typ_of_number_ty info.cast
+  try Option.map typ_of_number_ty info.cast
   with Not_a_number -> None
 
 let get_cast_of_predicate p =
   let info = type_predicate p in
-  try Extlib.opt_map typ_of_number_ty info.cast
+  try Option.map typ_of_number_ty info.cast
   with Not_a_number -> assert false
 
 let clear = Memo.clear
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 671ea306b1f641e8cacba62184345c3256d526fd..ea38062b647d72c07d3ef2942cdef132c60e8a6a 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
@@ -260,7 +260,7 @@ let to_exp ~loc kf env pot label =
              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
+               Smart_stmt.call ~loc
                  ~result:(Cil.var vi)
                  "malloc"
                  [ e_size ]
@@ -273,7 +273,7 @@ let to_exp ~loc kf env pot label =
            | Typing.(Rational | Real | Nan) ->
              Error.not_yet "quantification over non-integer type"
          in
-         let free_stmt = Smart_stmt.lib_call ~loc "free" [e] in
+         let free_stmt = Smart_stmt.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].
diff --git a/src/plugins/e-acsl/src/code_generator/env.ml b/src/plugins/e-acsl/src/code_generator/env.ml
index 595dc566e1e836413c056e3c2c462ff3fedcf11a..9017118bfb3f9907bff1c07ae98d0d2372c05e62 100644
--- a/src/plugins/e-acsl/src/code_generator/env.ml
+++ b/src/plugins/e-acsl/src/code_generator/env.ml
@@ -135,6 +135,20 @@ let generate_rte env =
   let local_env, _ = top env in
   local_env.rte
 
+let with_rte ~f env rte_value =
+  let old_rte_value = generate_rte env in
+  let env = rte env rte_value in
+  let env = f env in
+  let env = rte env old_rte_value in
+  env
+
+let with_rte_and_result ~f env rte_value =
+  let old_rte_value = generate_rte env in
+  let env = rte env rte_value in
+  let other, env = f env in
+  let env = rte env old_rte_value in
+  other, env
+
 (* ************************************************************************** *)
 
 (* eta-expansion required for typing generalisation *)
@@ -201,9 +215,9 @@ let do_new_var ~loc ?(scope=Varname.Block) ?(name="") env kf t ty mk_stmts =
         env_stack = local_env :: tl_env }
     | Varname.Block ->
       let local_env =
-        { block_info = new_block;
-          mp_tbl = extend_tbl local_env.mp_tbl;
-          rte = false (* must be already checked by mk_stmts *) }
+        { local_env with
+          block_info = new_block;
+          mp_tbl = extend_tbl local_env.mp_tbl }
       in
       { env with
         cpt = n;
@@ -213,8 +227,7 @@ let do_new_var ~loc ?(scope=Varname.Block) ?(name="") env kf t ty mk_stmts =
     let new_global_vars = (v, lscope) :: env.new_global_vars in
     let local_env =
       { local_env with
-        block_info = new_block;
-        rte = false (* must be already checked by mk_stmts *) }
+        block_info = new_block }
     in
     { env with
       new_global_vars = new_global_vars;
@@ -342,7 +355,7 @@ let add_assert kf stmt annot =
 
 let add_stmt ?(post=false) ?before env kf stmt =
   if not post then
-    Extlib.may (fun old -> E_acsl_label.move kf ~old stmt) before;
+    Option.iter (fun old -> E_acsl_label.move kf ~old stmt) before;
   let local_env, tl = top env in
   let block = local_env.block_info in
   let block =
diff --git a/src/plugins/e-acsl/src/code_generator/env.mli b/src/plugins/e-acsl/src/code_generator/env.mli
index 3a5aebf2f5d4f1a0ea67af77099032535365f8e7..cb6633546cfaaa5527c2be9d5d7ce56e470c59f9 100644
--- a/src/plugins/e-acsl/src/code_generator/env.mli
+++ b/src/plugins/e-acsl/src/code_generator/env.mli
@@ -165,7 +165,26 @@ val pop_loop: t -> predicate list * t
 (* ************************************************************************** *)
 
 val rte: t -> bool -> t
+(** [rte env x] sets RTE generation to x for the given environment *)
+
 val generate_rte: t -> bool
+(** Returns the current value of RTE generation for the given environment *)
+
+val with_rte: f:(t -> t) -> t -> bool -> t
+(** [with_rte ~f env x] executes the given closure with RTE generation set to x,
+    and reset RTE generation to its original value afterwards.
+    This function does not handle exceptions at all. The user must handle them
+    either directly in the [f] closure or around the call to the function. *)
+
+val with_rte_and_result: f:(t -> 'a * t) -> t -> bool -> 'a * t
+(** [with_rte_and_result ~f env x] executes the given closure with RTE
+    generation set to x, and reset RTE generation to its original value
+    afterwards. [f] is a closure that takes an environment an returns a pair
+    where the first member is an arbitrary value and the second member is the
+    environment. The function will return the first member of the returned pair
+    of the closure along with the updated environment.
+    This function does not handle exceptions at all. The user must handle them
+    either directly in the [f] closure or around the call to the function. *)
 
 (* ************************************************************************** *)
 (** {2 Context for error handling} *)
diff --git a/src/plugins/e-acsl/src/code_generator/gmp.ml b/src/plugins/e-acsl/src/code_generator/gmp.ml
index 8a2b5385f1cb1830a92ff5272cb14bd0cd3d7c69..cfc504740298f8517998be505a7512b21b9e50a4 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
-  Smart_stmt.lib_call ~loc (prefix ^ funname) [ e ]
+  Smart_stmt.rtl_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,7 +90,7 @@ 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
-    Smart_stmt.lib_call ~loc (fname ^ suf) (ev :: args)
+    Smart_stmt.rtl_call ~loc ~prefix:"" (fname ^ suf) (ev :: args)
   end else
     Smart_stmt.assigns ~loc:e.eloc ~result:lv e
 
@@ -111,7 +111,8 @@ let init_set ~loc lv ev e =
      | Lval elv ->
        assert (Gmp_types.Z.is_t (Cil.typeOf ev));
        let call =
-         Smart_stmt.lib_call ~loc
+         Smart_stmt.rtl_call ~loc
+           ~prefix:""
            "__gmpz_import"
            [ ev;
              Cil.one ~loc;
diff --git a/src/plugins/e-acsl/src/code_generator/injector.ml b/src/plugins/e-acsl/src/code_generator/injector.ml
index 75ec65a7b495488bd454bdf700317ad3e6ad505b..acae30bc013eeaf62599ee7ba2617d39e26fcba4 100644
--- a/src/plugins/e-acsl/src/code_generator/injector.ml
+++ b/src/plugins/e-acsl/src/code_generator/injector.ml
@@ -639,6 +639,9 @@ let inject_in_global (env, main) = function
     env, main
   | g when Rtl.Symbols.mem_global g ->
     env, main
+  (* generated function declaration: nothing to do *)
+  | GFunDecl(_, vi, _) when Misc.is_fc_stdlib_generated vi ->
+    env, main
 
   (* variable declarations *)
   | GVarDecl(vi, _) | GFunDecl(_, vi, _) ->
@@ -684,7 +687,7 @@ let inject_in_global (env, main) = function
 let surround_function_with kf fundec stmt_begin stmt_end =
   let body = fundec.sbody in
   (* Insert last statement *)
-  Extlib.may
+  Option.iter
     (fun stmt_end ->
        let last_stmts ?return_stmt () =
          match return_stmt with
@@ -825,7 +828,7 @@ let inject_mtracking_handler main =
       let clean = Smart_stmt.rtl_call loc "memory_clean" [] in
       surround_function_with main fundec init (Some clean)
     in
-    Extlib.may handle_main main
+    Option.iter handle_main main
   end
 
 let inject_in_file file =
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 95faf7ea005b9e3e44dd365f9c286d5d99695cab..c8371e3b71451cf732c2df3d50b5c5ea33308cc7 100644
--- a/src/plugins/e-acsl/src/code_generator/logic_array.ml
+++ b/src/plugins/e-acsl/src/code_generator/logic_array.ml
@@ -32,25 +32,6 @@ let translate_rte_ref:
   in
   ref func
 
-(** @return the content of the array type if [ty] is an array, or None
-    otherwise. *)
-let rec get_array_typ_opt ty =
-  if Gmp_types.is_t ty then
-    (* GMP pointer types are declared as arrays of one element. They are treated
-       as a special case here to ensure that they are not considered as arrays.
-    *)
-    None
-  else
-    match ty with
-    | TNamed (r, _) -> get_array_typ_opt r.ttype
-    | TArray (t, eo, bsot, a) -> Some (t, eo, bsot, a)
-    | _ -> None
-
-let is_array ty =
-  match get_array_typ_opt ty with
-  | Some _ -> true
-  | None -> false
-
 (** Retrieve the length of the [array] expression in a new variable [name] and
     return it as an expression.
     If the length is present in the type then the function directly assigns the
@@ -58,7 +39,7 @@ let is_array ty =
     [length = (\block_length(array) - \offset(array)) / sizeof(elem_typ)]. *)
 let length_exp ~loc kf env ~name array =
   let elem_typ, array_len =
-    match get_array_typ_opt (Cil.typeOf array) with
+    match Logic_aggr.get_array_typ_opt (Cil.typeOf array) with
     | None -> Options.fatal "Trying to retrieve the length of a non-array"
     | Some (t, len, _, _) -> t, len
   in
diff --git a/src/plugins/e-acsl/src/code_generator/logic_array.mli b/src/plugins/e-acsl/src/code_generator/logic_array.mli
index e6ca3976f85d4fba9837cafe40bd9f674d85f446..7e786d48ec1f6a029eb03734a757d5ccf90ff69a 100644
--- a/src/plugins/e-acsl/src/code_generator/logic_array.mli
+++ b/src/plugins/e-acsl/src/code_generator/logic_array.mli
@@ -22,9 +22,6 @@
 
 open Cil_types
 
-val is_array: typ -> bool
-(** @return true iff the type is an array *)
-
 val comparison_to_exp: loc:location -> kernel_function -> Env.t ->
   name:string -> binop -> exp -> exp -> exp * Env.t
 (** [comparison_to_exp ~loc kf env ~name bop e1 e2] generate the C code
diff --git a/src/plugins/e-acsl/src/code_generator/loops.ml b/src/plugins/e-acsl/src/code_generator/loops.ml
index 0018b0c8fe392b459d27335ec641e152f0e64866..287a92bda2b5777b2abe14e08712afde9b470762 100644
--- a/src/plugins/e-acsl/src/code_generator/loops.ml
+++ b/src/plugins/e-acsl/src/code_generator/loops.ml
@@ -152,7 +152,7 @@ let rec mk_nested_loops ~loc mk_innermost_block kf env lscope_vars =
       (* whenever provided, [ty] is known to be the type of the result *)
       let tone = Cil.lone ~loc () in
       let res = Logic_const.term ~loc (TBinOp(PlusA, t, tone)) Linteger in
-      Extlib.may
+      Option.iter
         (fun ty ->
            Typing.unsafe_set tone ~ctx:ty ctx;
            Typing.unsafe_set t ~ctx:ty ctx;
diff --git a/src/plugins/e-acsl/src/code_generator/memory_translate.ml b/src/plugins/e-acsl/src/code_generator/memory_translate.ml
index be6fbc2bc7a5d9b7025d7896c52e0abe2b89d2d6..524df6755b2c5334a2db69a67b89e771eda1e1c3 100644
--- a/src/plugins/e-acsl/src/code_generator/memory_translate.ml
+++ b/src/plugins/e-acsl/src/code_generator/memory_translate.ml
@@ -115,7 +115,10 @@ let rec eliminate_ranges_from_index_of_toffset ~loc toffset quantifiers =
 let call ~loc kf name ctx env t =
   assert (name = "base_addr" || name = "block_length"
           || name = "offset" || name ="freeable");
-  let e, env = !term_to_exp_ref kf (Env.rte env true) t in
+  let e, env =
+    Env.with_rte_and_result env true
+      ~f:(fun env -> !term_to_exp_ref kf env t)
+  in
   Env.rtl_call_to_new_var
     ~loc
     ~name
@@ -156,8 +159,9 @@ let gmp_to_sizet ~loc kf env size p =
       sizet
       (fun vi _ ->
          [ Smart_stmt.runtime_check Smart_stmt.RTE kf guard p;
-           Smart_stmt.lib_call ~loc
+           Smart_stmt.rtl_call ~loc
              ~result:(Cil.var vi)
+             ~prefix:""
              "__gmpz_get_ui"
              [ size ] ])
   in
@@ -194,7 +198,10 @@ let range_to_ptr_and_size ~loc kf env ptr r p =
       (Ctype typ_charptr)
   in
   Typing.type_term ~use_gmp_opt:false ~ctx:Typing.nan ptr;
-  let ptr, env = !term_to_exp_ref kf (Env.rte env true) ptr in
+  let ptr, env =
+    Env.with_rte_and_result env true
+      ~f:(fun env -> !term_to_exp_ref kf env ptr)
+  in
   (* size *)
   let size_term =
     (* Since [s] and [n1] have been typed through [ptr],
@@ -252,7 +259,10 @@ let range_to_ptr_and_size ~loc kf env ptr r p =
    expression in bytes and [env] is the current environment.
    [p] is the predicate under test. *)
 let term_to_ptr_and_size ~loc kf env t =
-  let e, env = !term_to_exp_ref kf (Env.rte env true) t in
+  let e, env =
+    Env.with_rte_and_result env true
+      ~f:(fun env -> !term_to_exp_ref kf env t)
+  in
   let ty = Misc.cty t.term_type in
   let sizeof = Smart_exp.ptr_sizeof ~loc ty in
   e, sizeof, env
diff --git a/src/plugins/e-acsl/src/code_generator/rational.ml b/src/plugins/e-acsl/src/code_generator/rational.ml
index 2f4417b0191213b6730879074147a5f66f68fe43..0af7f3b0697137395bd885f1e88f797bc4943209 100644
--- a/src/plugins/e-acsl/src/code_generator/rational.ml
+++ b/src/plugins/e-acsl/src/code_generator/rational.ml
@@ -148,8 +148,9 @@ let add_cast ~loc ?name e env kf ty =
         None
         Cil.doubleType
         (fun v _ ->
-           [ Smart_stmt.lib_call ~loc
+           [ Smart_stmt.rtl_call ~loc
                ~result:(Cil.var v)
+               ~prefix:""
                "__gmpq_get_d"
                [ e ] ])
     in
@@ -197,7 +198,11 @@ let cmp ~loc bop e1 e2 env kf t_opt =
       ~name
       Cil.intType
       (fun v _ ->
-         [ Smart_stmt.lib_call ~loc ~result:(Cil.var v) fname [ e1; e2 ] ])
+         [ Smart_stmt.rtl_call ~loc
+             ~result:(Cil.var v)
+             ~prefix:""
+             fname
+             [ e1; e2 ] ])
   in
   Cil.new_exp ~loc (BinOp(bop, e, Cil.zero ~loc, Cil.intType)), env
 
@@ -226,7 +231,10 @@ 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 = [ Smart_stmt.lib_call ~loc name [ e; e1; e2 ] ] in
+  let mk_stmts _ e = [ Smart_stmt.rtl_call ~loc
+                         ~prefix:""
+                         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/smart_stmt.ml b/src/plugins/e-acsl/src/code_generator/smart_stmt.ml
index 984188546901494f65d6ab58fc6a88919f95dc49..2c3497df87388788c01f9b46c4b751bb24bc240f 100644
--- a/src/plugins/e-acsl/src/code_generator/smart_stmt.ml
+++ b/src/plugins/e-acsl/src/code_generator/smart_stmt.ml
@@ -30,7 +30,7 @@ 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 call_instr ~loc ?result e args = instr (Call(result, e, args, loc))
 
 let assigns ~loc ~result e = instr (Set(result, e, loc))
 
@@ -68,13 +68,7 @@ let block stmt b = match b.bstmts with
 (* E-ACSL specific code *)
 (* ********************************************************************** *)
 
-let lib_call ~loc ?result fname args =
-  let vi =
-    try Rtl.Symbols.find_vi fname
-    with Rtl.Symbols.Unregistered _ as exn ->
-    try Builtins.find fname
-    with Not_found -> raise exn
-  in
+let do_call ~loc ?result vi args =
   let f = Cil.evar ~loc vi in
   vi.vreferenced <- true;
   let make_args ~variadic args param_ty =
@@ -95,7 +89,7 @@ let lib_call ~loc ?result fname args =
         Options.fatal
           "Mismatch between the number of expressions given and the number \
            of arguments in the signature when calling function '%s'"
-          fname
+          vi.vname
     in
     List.rev (make_rev_args [] args param_ty)
   in
@@ -104,10 +98,27 @@ let lib_call ~loc ?result fname args =
     | TFun(_, None, _, _) -> []
     | _ -> assert false
   in
-  call ~loc ?result f args
+  call_instr ~loc ?result f args
+
+let call ~loc ?result fname args =
+  let kf =
+    try Globals.Functions.find_by_name fname
+    with Not_found ->
+      Options.fatal "Unable to find function '%s'" fname
+  in
+  let vi = Globals.Functions.get_vi kf in
+  do_call ~loc ?result vi args
 
-let rtl_call ~loc ?result fname args =
-  lib_call ~loc ?result (Functions.RTL.mk_api_name fname) args
+let rtl_call ~loc ?result ?(prefix=Functions.RTL.api_prefix) fname args =
+  let fname = prefix ^ fname in
+  let vi =
+    try Rtl.Symbols.find_vi fname
+    with Rtl.Symbols.Unregistered _ as exn ->
+    try Builtins.find fname
+    with Not_found ->
+      raise exn
+  in
+  do_call ~loc ?result vi args
 
 (* ************************************************************************** *)
 (** {2 Handling the E-ACSL's C-libraries, part II} *)
diff --git a/src/plugins/e-acsl/src/code_generator/smart_stmt.mli b/src/plugins/e-acsl/src/code_generator/smart_stmt.mli
index 3aebb9f4cc27419db8d9337096af57fb2d3cebb6..abd797824e97d0e018a076089db1919abbab50cc 100644
--- a/src/plugins/e-acsl/src/code_generator/smart_stmt.mli
+++ b/src/plugins/e-acsl/src/code_generator/smart_stmt.mli
@@ -56,15 +56,22 @@ val break: loc:location -> stmt
 (* E-ACSL specific code: build calls to its RTL API *)
 (* ********************************************************************** *)
 
-val lib_call: loc:location -> ?result:lval -> string -> exp list -> stmt
+val call: loc:location -> ?result:lval -> string -> exp list -> stmt
+(** Construct a call to a function with the given name.
+    @raise Not_found if the given string does not represent a function in the
+    AST, for instance if the function does not exist. *)
+
+val rtl_call:
+  loc:location -> ?result:lval -> ?prefix:string -> string -> exp list -> stmt
 (** Construct a call to a library function with the given name.
+
+    [prefix] defaults to the E-ACSL RTL API prefix and can be explicitely
+    provided to call functions without this prefix.
+
     @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 rtl_call: loc:location -> ?result:lval -> string -> exp list -> stmt
-(** Special version of [lib_call] for E-ACSL's RTL functions. *)
-
 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
diff --git a/src/plugins/e-acsl/src/code_generator/temporal.ml b/src/plugins/e-acsl/src/code_generator/temporal.ml
index d0f6ced85f13d7305efda530e904f39ae1dd8cfc..a1c0843ccde0dc359b576ead5198b074e2dc31f0 100644
--- a/src/plugins/e-acsl/src/code_generator/temporal.ml
+++ b/src/plugins/e-acsl/src/code_generator/temporal.ml
@@ -75,13 +75,13 @@ module Mk: sig
 end = struct
 
   let store_reference ~loc flow lhs rhs =
+    let prefix = RTL.temporal_prefix in
     let fname = match flow with
       | Direct -> "store_nblock"
       | Indirect -> "store_nreferent"
       | Copy -> Options.fatal "Copy flow type in store_reference"
     in
-    let fname = RTL.mk_temporal_name fname in
-    Smart_stmt.lib_call ~loc fname [ Cil.mkAddrOf ~loc lhs; rhs ]
+    Smart_stmt.rtl_call ~loc ~prefix fname [ Cil.mkAddrOf ~loc lhs; rhs ]
 
   let save_param ~loc flow lhs pos =
     let infix = match flow with
@@ -89,17 +89,19 @@ end = struct
       | Indirect -> "nreferent"
       | Copy -> "copy"
     in
+    let prefix = RTL.temporal_prefix in
     let fname = "save_" ^ infix ^ "_parameter" in
-    let fname = RTL.mk_temporal_name fname in
-    Smart_stmt.lib_call ~loc fname [ lhs ; Cil.integer ~loc pos ]
+    Smart_stmt.rtl_call ~loc ~prefix fname [ lhs ; Cil.integer ~loc pos ]
 
   let pull_param ~loc vi pos =
+    let prefix = RTL.temporal_prefix in
+    let fname = "pull_parameter" in
     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
-    Smart_stmt.lib_call ~loc fname [ exp ; Cil.integer ~loc pos ; sz ]
+    Smart_stmt.rtl_call ~loc ~prefix fname [ exp ; Cil.integer ~loc pos ; sz ]
 
   let handle_return_referent ~save ~loc lhs =
+    let prefix = RTL.temporal_prefix in
     let fname = match save with
       | true -> "save_return"
       | false -> "pull_return"
@@ -108,15 +110,17 @@ end = struct
     (match (Cil.typeOf lhs) with
      | TPtr _ -> ()
      | _ -> Error.not_yet "Struct in return");
-    Smart_stmt.lib_call ~loc (RTL.mk_temporal_name fname) [ lhs ]
+    Smart_stmt.rtl_call ~loc ~prefix fname [ lhs ]
 
   let reset_return_referent ~loc =
-    Smart_stmt.lib_call ~loc (RTL.mk_temporal_name "reset_return") []
+    let prefix = RTL.temporal_prefix in
+    Smart_stmt.rtl_call ~loc ~prefix "reset_return" []
 
   let temporal_memcpy_struct ~loc lhs rhs =
-    let fname  = RTL.mk_temporal_name "memcpy" in
+    let prefix = RTL.temporal_prefix in
+    let fname  = "memcpy" in
     let size = Cil.sizeOf ~loc (Cil.typeOfLval lhs) in
-    Smart_stmt.lib_call ~loc fname [ Cil.mkAddrOf ~loc lhs; rhs; size ]
+    Smart_stmt.rtl_call ~loc ~prefix fname [ Cil.mkAddrOf ~loc lhs; rhs; size ]
 end
 (* }}} *)
 
@@ -207,7 +211,7 @@ let mk_stmt_from_assign loc lhs rhs =
     | Direct | Indirect -> Mk.store_reference ~loc flow lhs rhs
     | Copy -> Mk.temporal_memcpy_struct ~loc lhs rhs
   in
-  Extlib.opt_map fn (assign lhs rhs loc)
+  Option.map fn (assign lhs rhs loc)
 (* }}} *)
 
 (* ************************************************************************** *)
@@ -217,9 +221,9 @@ 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 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
+    Option.fold
+      ~some:(fun stmt -> Env.add_stmt ~before:current_stmt ~post env kf stmt)
+      ~none:env
       (mk_stmt_from_assign loc lhs rhs)
   else
     env
@@ -245,16 +249,16 @@ end = struct
            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)
+           Option.fold
+             ~some:(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))
+             ~none:(env, index+1)
              vals)
         (env, 0)
         args
@@ -281,32 +285,33 @@ end = struct
        been instrumented, then information about referent numbers should be
        stored in the internal data structure and it is retrieved using
        [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, (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
+    Option.fold
+      ~some:(fun (lhs, rhs, flow) ->
+          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)
+      ~none:env
       vals
 
   (* Update local environment with a statement tracking temporal metadata
      associated with memcpy/memset call *)
   let call_memxxx current_stmt loc args fexp env kf =
     if Libc.is_memcpy fexp || Libc.is_memset fexp then
+      let prefix = RTL.temporal_prefix in
       let name = match fexp.enode with
         | Lval(Var vi, _) -> vi.vname
         | _ -> Options.fatal "[Temporal.call_memxxx] not a left-value"
       in
       let stmt =
-        Smart_stmt.lib_call ~loc (RTL.mk_temporal_name name) args
+        Smart_stmt.rtl_call ~loc ~prefix name args
       in
       Env.add_stmt ~before:current_stmt ~post:false env kf stmt
     else
@@ -320,8 +325,11 @@ end = struct
        it makes sense to make this somewhat-debug-level-call. In production mode
        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 = Smart_stmt.lib_call ~loc name [] in
+    let stmt =
+      let prefix = RTL.temporal_prefix in
+      let name = "reset_parameters" in
+      Smart_stmt.rtl_call ~loc ~prefix 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
@@ -339,12 +347,12 @@ end = struct
     (* Memory allocating functions have no definitions so below expression
        should capture them *)
     let alloc = not has_def in
-    Extlib.may_map
-      (fun lhs ->
-         if Memory_tracking.must_monitor_lval ~kf lhs then
-           call_with_ret ~alloc current_stmt loc lhs env kf
-         else env)
-      ~dft:env
+    Option.fold
+      ~some:(fun lhs ->
+          if Memory_tracking.must_monitor_lval ~kf lhs then
+            call_with_ret ~alloc current_stmt loc lhs env kf
+          else env)
+      ~none:env
       ret
 end
 (* }}} *)
@@ -391,7 +399,7 @@ end
 (* Update local environment with a statement tracking temporal metadata
    associated with adding a function argument to a stack frame *)
 let track_argument ?(typ) param index env kf =
-  let typ = Extlib.opt_conv param.vtype typ in
+  let typ = Option.value ~default:param.vtype typ in
   match Cil.unrollType typ with
   | TPtr _
   | TComp _ ->
@@ -507,7 +515,7 @@ let handle_stmt stmt env kf =
     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
+      Option.fold ~some:(fun ret -> handle_return_stmt loc ret env kf) ~none: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/translate.ml b/src/plugins/e-acsl/src/code_generator/translate.ml
index 9ad2815d009281c1143843a02d583511f334e229..960cddb412e78a632121512474dde0894afc113a 100644
--- a/src/plugins/e-acsl/src/code_generator/translate.ml
+++ b/src/plugins/e-acsl/src/code_generator/translate.ml
@@ -135,7 +135,11 @@ let add_cast ~loc ?name env kf ctx strnum t_opt e =
             None
             new_ty
             (fun v _ ->
-               [ Smart_stmt.lib_call ~loc ~result:(Cil.var v) fname [ e ] ])
+               [ Smart_stmt.rtl_call ~loc
+                   ~result:(Cil.var v)
+                   ~prefix:""
+                   fname
+                   [ e ] ])
         in
         e, env
       else if Gmp_types.Q.is_t ty || strnum = Str_R then
@@ -297,7 +301,7 @@ and context_insensitive_term_to_exp kf env t =
           kf
           ~name:vname
           (Some t)
-          (fun _ ev -> [ Smart_stmt.lib_call ~loc name [ ev; e ] ])
+          (fun _ ev -> [ Smart_stmt.rtl_call ~loc ~prefix:"" name [ ev; e ] ])
       in
       e, env, C_number, ""
     else if Gmp_types.Q.is_t ty then
@@ -326,7 +330,10 @@ 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 = [ Smart_stmt.lib_call ~loc name [ e; e1; e2 ] ] in
+      let mk_stmts _ e = [ Smart_stmt.rtl_call ~loc
+                             ~prefix:""
+                             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
@@ -371,7 +378,7 @@ and context_insensitive_term_to_exp kf env t =
             p
         in
         Env.add_assert kf cond p;
-        let instr = Smart_stmt.lib_call ~loc name [ e; e1; e2 ] in
+        let instr = Smart_stmt.rtl_call ~loc ~prefix:"" name [ e; e1; e2 ] in
         [ cond; instr ]
       in
       let name = Misc.name_of_binop bop in
@@ -429,7 +436,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
-               [ Smart_stmt.lib_call ~loc ~result fname [ e2 ] ])
+               [ Smart_stmt.rtl_call ~loc ~result ~prefix:"" fname [ e2 ] ])
         in
         e, env
       in
@@ -459,7 +466,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 = Smart_stmt.lib_call ~loc ~result name [ e2 ] in
+        let instr = Smart_stmt.rtl_call ~loc ~result ~prefix:"" name [ e2 ] in
         [ coerce_guard_cond; instr ]
       in
       let name = e2_name ^ bop_name ^ "_coerced" in
@@ -478,7 +485,10 @@ 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
-        Smart_stmt.lib_call ~loc name [ result_e; e1; e2_as_bitcnt_e ]
+        Smart_stmt.rtl_call ~loc
+          ~prefix:""
+          name
+          [ result_e; e1; e2_as_bitcnt_e ]
       in
 
       (* Put t in an option to use with comparison_to_exp and
@@ -537,21 +547,28 @@ and context_insensitive_term_to_exp kf env t =
     end
   | TBinOp(LOr, t1, t2) ->
     (* t1 || t2 <==> if t1 then true else t2 *)
-    let e1, env1 = term_to_exp kf (Env.rte env true) t1 in
-    let env' = Env.push env1 in
-    let res2 = term_to_exp kf (Env.push env') t2 in
     let e, env =
-      conditional_to_exp ~name:"or" loc kf (Some t) e1 (Cil.one loc, env') res2
+      Env.with_rte_and_result env true
+        ~f:(fun env ->
+            let e1, env1 = term_to_exp kf env t1 in
+            let env' = Env.push env1 in
+            let res2 = term_to_exp kf (Env.push env') t2 in
+            conditional_to_exp
+              ~name:"or" loc kf (Some t) e1 (Cil.one loc, env') res2
+          )
     in
     e, env, C_number, ""
   | TBinOp(LAnd, t1, t2) ->
     (* t1 && t2 <==> if t1 then t2 else false *)
-    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
-    let env3 = Env.push env2 in
     let e, env =
-      conditional_to_exp
-        ~name:"and" loc kf (Some t) e1 res2 (Cil.zero loc, env3)
+      Env.with_rte_and_result env true
+        ~f:(fun env ->
+            let e1, env1 = term_to_exp kf env t1 in
+            let _, env2 as res2 = term_to_exp kf (Env.push env1) t2 in
+            let env3 = Env.push env2 in
+            conditional_to_exp
+              ~name:"and" loc kf (Some t) e1 res2 (Cil.zero loc, env3)
+          )
     in
     e, env, C_number, ""
   | TBinOp((BOr | BXor | BAnd) as bop, t1, t2) ->
@@ -562,7 +579,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 = Smart_stmt.lib_call ~loc name [ e; e1; e2 ] in
+        let instr = Smart_stmt.rtl_call ~loc ~prefix:"" name [ e; e1; e2 ] in
         [ instr ]
       in
       let name = Misc.name_of_binop bop in
@@ -639,9 +656,13 @@ and context_insensitive_term_to_exp kf env t =
           env
           kf
           (Some t)
-          (Misc.cty (Extlib.the li.l_type))
+          (Misc.cty (Option.get li.l_type))
           (fun vi _ ->
-             [ Smart_stmt.lib_call ~loc ~result:(Cil.var vi) fname args ])
+             [ Smart_stmt.rtl_call ~loc
+                 ~result:(Cil.var vi)
+                 ~prefix:""
+                 fname
+                 args ])
       else
         (* build the arguments and compute the integer_ty of the parameters *)
         let params_ty, args, env =
@@ -671,10 +692,15 @@ and context_insensitive_term_to_exp kf env t =
   | 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
-    let res3 = term_to_exp kf (Env.push env2) t3 in
-    let e, env = conditional_to_exp loc kf (Some t) e1 res2 res3 in
+    let e, env =
+      Env.with_rte_and_result env true
+        ~f:(fun env ->
+            let e1, env1 = term_to_exp kf env t1 in
+            let (_, env2 as res2) = term_to_exp kf (Env.push env1) t2 in
+            let res3 = term_to_exp kf (Env.push env2) t3 in
+            conditional_to_exp loc kf (Some t) e1 res2 res3
+          )
+    in
     e, env, C_number, ""
   | Tat(t, BuiltinLabel Here) ->
     let e, env = term_to_exp kf env t in
@@ -731,21 +757,23 @@ and term_to_exp kf env t =
   let generate_rte = Env.generate_rte env in
   Options.feedback ~dkey ~level:4 "translating term %a (rte? %b)"
     Printer.pp_term t generate_rte;
-  let env = Env.rte env false in
-  let t = match t.term_node with TLogic_coerce(_, t) -> t | _ -> t in
-  let e, env, sty, name = context_insensitive_term_to_exp kf env t in
-  let env = if generate_rte then translate_rte kf env e else env in
-  let cast = Typing.get_cast t in
-  let name = if name = "" then None else Some name in
-  add_cast
-    ~loc:t.term_loc
-    ?name
-    env
-    kf
-    cast
-    sty
-    (Some t)
-    e
+  Env.with_rte_and_result env false
+    ~f:(fun env ->
+        let t = match t.term_node with TLogic_coerce(_, t) -> t | _ -> t in
+        let e, env, sty, name = context_insensitive_term_to_exp kf env t in
+        let env = if generate_rte then translate_rte kf env e else env in
+        let cast = Typing.get_cast t in
+        let name = if name = "" then None else Some name in
+        add_cast
+          ~loc:t.term_loc
+          ?name
+          env
+          kf
+          cast
+          sty
+          (Some t)
+          e
+      )
 
 (* generate the C code equivalent to [t1 bop t2]. *)
 and comparison_to_exp
@@ -760,8 +788,8 @@ and comparison_to_exp
   let ty1 = Cil.typeOf e1 in
   let e2, env = term_to_exp kf env t2 in
   let ty2 = Cil.typeOf e2 in
-  match Logic_array.is_array ty1, Logic_array.is_array ty2 with
-  | true, true ->
+  match Logic_aggr.get_t ty1, Logic_aggr.get_t ty2 with
+  | Logic_aggr.Array, Logic_aggr.Array ->
     Logic_array.comparison_to_exp
       ~loc
       kf
@@ -770,7 +798,9 @@ and comparison_to_exp
       bop
       e1
       e2
-  | false, false -> (
+  | Logic_aggr.StructOrUnion, Logic_aggr.StructOrUnion ->
+    Env.not_yet env "comparison between two structs or unions"
+  | Logic_aggr.NotAggregate, Logic_aggr.NotAggregate -> begin
       match ity with
       | Typing.C_integer _ | Typing.C_float _ | Typing.Nan ->
         Cil.mkBinOp ~loc bop e1 e2, env
@@ -783,8 +813,9 @@ and comparison_to_exp
             ~name
             Cil.intType
             (fun v _ ->
-               [ Smart_stmt.lib_call ~loc
+               [ Smart_stmt.rtl_call ~loc
                    ~result:(Cil.var v)
+                   ~prefix:""
                    "__gmpz_cmp"
                    [ e1; e2 ] ])
         in
@@ -793,10 +824,13 @@ and comparison_to_exp
         Rational.cmp ~loc bop e1 e2 env kf t_opt
       | Typing.Real ->
         Error.not_yet "comparison involving real numbers"
-    )
+    end
   | _, _ ->
-    Options.fatal ~current:true "Comparison involving an array with something \
-                                 else."
+    Options.fatal
+      ~current:true
+      "Comparison involving incompatible types: '%a' and '%a'"
+      Printer.pp_typ ty1
+      Printer.pp_typ ty2
 
 and at_to_exp_no_lscope env kf t_opt label e =
   let stmt = E_acsl_label.get_stmt kf label in
@@ -890,19 +924,25 @@ and predicate_content_to_exp ?name kf env p =
     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 = predicate_to_exp kf (Env.rte env true) p1 in
-    let _, env2 as res2 =
-      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)
+    Env.with_rte_and_result env true
+      ~f:(fun env ->
+          let e1, env1 = predicate_to_exp kf env p1 in
+          let _, env2 as res2 =
+            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 = predicate_to_exp kf (Env.rte env true) p1 in
-    let env' = Env.push env1 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
+    Env.with_rte_and_result env true
+      ~f:(fun env ->
+          let e1, env1 = predicate_to_exp kf env p1 in
+          let env' = Env.push env1 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 _ -> Env.not_yet env "xor"
   | Pimplies(p1, p2) ->
     (* (p1 ==> p2) <==> !p1 || p2 *)
@@ -924,11 +964,14 @@ and predicate_content_to_exp ?name kf env p =
     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) =
-      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
+    Env.with_rte_and_result env true
+      ~f:(fun env ->
+          let e1, env1 = term_to_exp kf env t in
+          let (_, env2 as res2) =
+            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
@@ -1035,19 +1078,21 @@ and predicate_content_to_exp ?name kf 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 = 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
-    ~loc:p.pred_loc
-    ?name
-    env
-    kf
-    cast
-    C_number
-    None
-    e
+  Env.with_rte_and_result env false
+    ~f:(fun env ->
+        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
+          ~loc:p.pred_loc
+          ?name
+          env
+          kf
+          cast
+          C_number
+          None
+          e
+      )
 
 and generalized_untyped_predicate_to_exp ?name kf ?rte ?must_clear_typing env p =
   (* If [rte] is true, it means we're translating the root predicate of an
@@ -1083,7 +1128,10 @@ and translate_rte_annots:
                 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_predicate kf (Env.rte env false) p in
+                let env =
+                  Env.with_rte env false
+                    ~f:(fun env -> translate_predicate kf env p)
+                in
                 let env = Env.Logic_scope.set_reset env lscope_reset_old in
                 env)
              env
@@ -1168,7 +1216,7 @@ let untyped_term_to_exp typ t =
       | TFloat(fk, _) -> Typing.fkind fk
       | _ -> Typing.nan
   in
-  let ctx = Extlib.opt_map ctx_of_typ typ in
+  let ctx = Option.map ctx_of_typ typ in
   Typing.type_term ~use_gmp_opt:true ?ctx t;
   let env = Env.push Env.empty in
   let env = Env.rte env false in
diff --git a/src/plugins/e-acsl/src/code_generator/translate_annots.ml b/src/plugins/e-acsl/src/code_generator/translate_annots.ml
index a65ac3567b95ad3ee2fc4b871ae4bf8dd681b526..bc7ffca4cf1ce0942b2a0e9070d91a85b6269ea4 100644
--- a/src/plugins/e-acsl/src/code_generator/translate_annots.ml
+++ b/src/plugins/e-acsl/src/code_generator/translate_annots.ml
@@ -70,10 +70,12 @@ let pre_funspec kf kinstr env funspec =
   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
+  Env.with_rte env true
+    ~f:(fun env -> Contract.translate_preconditions kf kinstr env contract)
 
 let post_funspec kf kinstr env =
-  Contract.translate_postconditions kf kinstr env
+  Env.with_rte env true
+    ~f:(fun env -> Contract.translate_postconditions kf kinstr env)
 
 let pre_code_annotation kf stmt env annot =
   let convert env = match annot.annot_content with
@@ -82,7 +84,8 @@ let pre_code_annotation kf stmt env annot =
         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
+        Env.with_rte env true
+          ~f:(fun env -> Translate.translate_predicate kf env p.tp_statement)
       else
         env
     | AStmtSpec(l, spec) ->
@@ -90,13 +93,18 @@ let pre_code_annotation kf stmt env annot =
         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
+      Env.with_rte env true
+        ~f:(fun env ->
+            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
+        let env =
+          Env.with_rte env true
+            ~f:(fun env -> Translate.translate_predicate kf env p.tp_statement)
+        in
         if loop_invariant then
           Env.add_loop_invariant env p.tp_statement
         else env
@@ -127,7 +135,9 @@ let pre_code_annotation kf stmt env annot =
 
 let post_code_annotation kf stmt env annot =
   let convert env = match annot.annot_content with
-    | AStmtSpec(_, _) -> Contract.translate_postconditions kf (Kstmt stmt) env
+    | AStmtSpec(_, _) ->
+      Env.with_rte env true
+        ~f:(fun env -> Contract.translate_postconditions kf (Kstmt stmt) env)
     | AAssert _
     | AInvariant _
     | AVariant _
diff --git a/src/plugins/e-acsl/src/libraries/functions.ml b/src/plugins/e-acsl/src/libraries/functions.ml
index 37cf8f8319f67d966635e0704b8ed32bd6a5f91e..4a82689a9640e376c84f739cf32cf3c0b6844697 100644
--- a/src/plugins/e-acsl/src/libraries/functions.ml
+++ b/src/plugins/e-acsl/src/libraries/functions.ml
@@ -63,14 +63,14 @@ let has_fundef exp = match exp.enode with
 module RTL = struct
 
   (* prefix of all functions/variables from the public E-ACSL API *)
-  let e_acsl_api_prefix = "__e_acsl_"
+  let api_prefix = "__e_acsl_"
 
   (* prefix of temporal analysis functions of the public E-ACSL API *)
-  let e_acsl_temporal_prefix = e_acsl_api_prefix ^ "temporal_"
+  let temporal_prefix = api_prefix ^ "temporal_"
 
   (* prefix of all builtin functions/variables from the public E-ACSL API,
      Builtin functions replace original calls in programs. *)
-  let e_acsl_builtin_prefix =  e_acsl_api_prefix ^ "builtin_"
+  let e_acsl_builtin_prefix =  api_prefix ^ "builtin_"
 
   (* prefix of functions/variables generated by E-ACSL *)
   let e_acsl_gen_prefix = "__gen_e_acsl_"
@@ -78,9 +78,9 @@ module RTL = struct
   (* prefix of literal strings generated by E-ACSL *)
   let e_acsl_lit_string_prefix = e_acsl_gen_prefix ^ "literal_string"
 
-  let mk_api_name fname = e_acsl_api_prefix ^ fname
+  let mk_api_name fname = api_prefix ^ fname
 
-  let mk_temporal_name fname = e_acsl_temporal_prefix ^ fname
+  let mk_temporal_name fname = temporal_prefix ^ fname
 
   let mk_gen_name name = e_acsl_gen_prefix ^ name
 
diff --git a/src/plugins/e-acsl/src/libraries/functions.mli b/src/plugins/e-acsl/src/libraries/functions.mli
index 4963870c28539b1b89d055be1bb0285158b71366..f2d66cb65e8309f057da05db34d3338a3951c3ef 100644
--- a/src/plugins/e-acsl/src/libraries/functions.mli
+++ b/src/plugins/e-acsl/src/libraries/functions.mli
@@ -38,6 +38,12 @@ val instrument: kernel_function -> bool
 (* ************************************************************************** *)
 
 module RTL: sig
+  val api_prefix: string
+  (** Prefix used for the public API of E-ACSL runtime library. *)
+
+  val temporal_prefix:string
+  (** Prefix used for the public API of E-ACSL runtime library dealing with
+      temporal analysis. *)
 
   val mk_api_name: string -> string
   (** Prefix a name (of a variable or a function) with a string that identifies
diff --git a/src/plugins/e-acsl/src/libraries/logic_aggr.ml b/src/plugins/e-acsl/src/libraries/logic_aggr.ml
new file mode 100644
index 0000000000000000000000000000000000000000..f2f746aa44de89e77bc2fa8443712d21ded650c6
--- /dev/null
+++ b/src/plugins/e-acsl/src/libraries/logic_aggr.ml
@@ -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).            *)
+(*                                                                        *)
+(**************************************************************************)
+
+type t =
+  | StructOrUnion
+  | Array
+  | NotAggregate
+
+(** @return the content of the array type if [ty] is an array, or None
+    otherwise. *)
+let rec get_array_typ_opt ty =
+  if Gmp_types.is_t ty then
+    (* GMP pointer types are declared as arrays of one element. They are treated
+       as a special case here to ensure that they are not considered as arrays.
+    *)
+    None
+  else
+    match ty with
+    | TNamed (r, _) -> get_array_typ_opt r.ttype
+    | TArray (t, eo, bsot, a) -> Some (t, eo, bsot, a)
+    | _ -> None
+
+(** @return true iff the type is an array *)
+let is_array ty =
+  match get_array_typ_opt ty with
+  | Some _ -> true
+  | None -> false
+
+let get_t ty =
+  if is_array ty then
+    Array
+  else if Cil.isStructOrUnionType ty then
+    StructOrUnion
+  else
+    NotAggregate
diff --git a/src/plugins/e-acsl/src/libraries/logic_aggr.mli b/src/plugins/e-acsl/src/libraries/logic_aggr.mli
new file mode 100644
index 0000000000000000000000000000000000000000..f2d5340c0e75583c7a1f137de69ffb4f3132a540
--- /dev/null
+++ b/src/plugins/e-acsl/src/libraries/logic_aggr.mli
@@ -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).            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open Cil_types
+
+(** Utilities function for aggregate types. *)
+
+val get_array_typ_opt:
+  typ -> (typ * exp option * bitsSizeofTypCache * attributes) option
+(** @return the content of the array type if [ty] is an array, or None
+    otherwise. *)
+
+(** Represent the different types of aggregations. *)
+type t =
+  | StructOrUnion
+  | Array
+  | NotAggregate
+
+val get_t: typ -> t
+(** [get_t ty] returns [Array] if [ty] is an array type,
+    [StructOrUnion] if [ty] is a struct or an union type and [NotAggregate]
+    otherwise. *)
diff --git a/src/plugins/e-acsl/src/libraries/misc.ml b/src/plugins/e-acsl/src/libraries/misc.ml
index 2c123e74461384011d02b51f0066aa6f1ba157df..11c177a27354c2c1881b88aece05394544979fff 100644
--- a/src/plugins/e-acsl/src/libraries/misc.ml
+++ b/src/plugins/e-acsl/src/libraries/misc.ml
@@ -28,7 +28,7 @@ open Cil_datatype
 (* ************************************************************************** *)
 
 let is_fc_or_compiler_builtin vi =
-  Cil.is_builtin vi
+  Cil_builtins.is_builtin vi
   ||
   (let prefix_length = 10 (* number of characters in "__builtin_" *) in
    String.length vi.vname > prefix_length
@@ -36,6 +36,9 @@ let is_fc_or_compiler_builtin vi =
    let prefix = String.sub vi.vname 0 prefix_length in
    Datatype.String.equal prefix "__builtin_")
 
+let is_fc_stdlib_generated vi =
+  Cil.hasAttribute "fc_stdlib_generated" vi.vattr
+
 (* ************************************************************************** *)
 (** {2 Handling \result} *)
 (* ************************************************************************** *)
diff --git a/src/plugins/e-acsl/src/libraries/misc.mli b/src/plugins/e-acsl/src/libraries/misc.mli
index 090b237753110e5e1561cf6e1e336d818833937b..f5a2c28359790d6d6cd4a9285b30c3333944bebe 100644
--- a/src/plugins/e-acsl/src/libraries/misc.mli
+++ b/src/plugins/e-acsl/src/libraries/misc.mli
@@ -40,6 +40,10 @@ val result_vi: kernel_function -> varinfo
 
 val is_fc_or_compiler_builtin: varinfo -> bool
 
+val is_fc_stdlib_generated: varinfo -> bool
+(** Returns true if the [varinfo] is a generated stdlib function. (For instance
+    generated function by the Variadic plug-in. *)
+
 val term_addr_of: loc:location -> term_lval -> typ -> term
 
 val cty: logic_type -> typ
diff --git a/src/plugins/e-acsl/src/main.ml b/src/plugins/e-acsl/src/main.ml
index 8de1804974e4fdc9aafd6f7efd79040884f7ccba..8439a6b2b725c35b843318e35ada2accb345a919 100644
--- a/src/plugins/e-acsl/src/main.ml
+++ b/src/plugins/e-acsl/src/main.ml
@@ -42,12 +42,14 @@ let generate_code =
        Temporal.enable (Options.Temporal_validity.get ());
        if Plugin.is_present "variadic" then begin
          let opt_name = "-variadic-translation" in
-         if Dynamic.Parameter.Bool.get opt_name () then begin
+         if Dynamic.Parameter.Bool.get opt_name () &&
+            Options.Validate_format_strings.get () then begin
            if Ast.is_computed () then
              Options.abort
-               "The variadic translation must be turned off for E-ACSL. \
-                Please use option '-variadic-no-translation'";
-           Options.warning "deactivating variadic translation";
+               "The variadic translation is incompatible with E-ACSL option \
+                '%s'.@ Please use option '-variadic-no-translation'."
+               Options.Validate_format_strings.option_name
+               Options.warning "deactivating variadic translation";
            Dynamic.Parameter.Bool.off opt_name ();
          end
        end;
diff --git a/src/plugins/e-acsl/src/options.ml b/src/plugins/e-acsl/src/options.ml
index 932ff7ea662055bb9bc6a51c4aff786fa7fce132..6b6aa63f210194985e9d5c417a9d7b6f21e54c93 100644
--- a/src/plugins/e-acsl/src/options.ml
+++ b/src/plugins/e-acsl/src/options.ml
@@ -28,8 +28,7 @@ module P = Plugin.Register
       let help = "Executable ANSI/ISO C Specification Language --- runtime \
                   assertion checker generator"
     end)
-module PP = P (* [PP] required to avoid an ocamldoc error in OCaml 4.02 *)
-include PP
+include P
 
 module Run =
   False
diff --git a/src/plugins/e-acsl/src/project_initializer/prepare_ast.ml b/src/plugins/e-acsl/src/project_initializer/prepare_ast.ml
index 2f167b55c03dbf9eb5fc203cdc93d569dfcd8323..03412904536ad3accfd326822f958609c0bfc1cf 100644
--- a/src/plugins/e-acsl/src/project_initializer/prepare_ast.ml
+++ b/src/plugins/e-acsl/src/project_initializer/prepare_ast.ml
@@ -131,12 +131,12 @@ let dup_fundec loc spec sound_verdict_vi kf vi new_vi =
   in
   let return =
     Cil.mkStmt ~valid_sid:true
-      (Return(Extlib.opt_map (Cil.evar ~loc) res, loc))
+      (Return(Option.map (Cil.evar ~loc) res, loc))
   in
   let stmts =
     let l =
       [ Cil.mkStmtOneInstr ~valid_sid:true
-          (Call(Extlib.opt_map Cil.var res,
+          (Call(Option.map Cil.var res,
                 Cil.evar ~loc vi,
                 List.map (Cil.evar ~loc) new_formals,
                 loc));
@@ -392,6 +392,8 @@ let must_duplicate kf vi =
   not (is_variadic_function vi)
   && (* it is not a built-in *)
   not (Misc.is_fc_or_compiler_builtin vi)
+  && (* it is not a generated function *)
+  not (Misc.is_fc_stdlib_generated vi)
   &&
   ((* either explicitely listed as to be not instrumented *)
     not (Functions.instrument kf)
diff --git a/src/plugins/e-acsl/tests/arith/at_on-purely-logic-variables.c b/src/plugins/e-acsl/tests/arith/at_on-purely-logic-variables.c
index a289de1d5a1c02e97bd12f1f5205a24c93639039..1bfbbb986b51f3aaa1e9fccccec9397b07987c22 100644
--- a/src/plugins/e-acsl/tests/arith/at_on-purely-logic-variables.c
+++ b/src/plugins/e-acsl/tests/arith/at_on-purely-logic-variables.c
@@ -66,4 +66,4 @@ int main(void) {
         \at(n + i == 10, L); */ ;
 
   return 0;
-}
\ No newline at end of file
+}
diff --git a/src/plugins/e-acsl/tests/arith/oracle_ci/at_on-purely-logic-variables.res.oracle b/src/plugins/e-acsl/tests/arith/oracle_ci/at_on-purely-logic-variables.res.oracle
index ceb8eed7a93e5cd46801202607b737a163b9b95f..8df5dd5c3147da4920741cd471afd6512ac092fe 100644
--- a/src/plugins/e-acsl/tests/arith/oracle_ci/at_on-purely-logic-variables.res.oracle
+++ b/src/plugins/e-acsl/tests/arith/oracle_ci/at_on-purely-logic-variables.res.oracle
@@ -52,6 +52,10 @@
   function __e_acsl_assert: precondition got status unknown.
 [eva:alarm] tests/arith/at_on-purely-logic-variables.c:43: Warning: 
   assertion got status unknown.
+[eva:alarm] tests/arith/at_on-purely-logic-variables.c:7: Warning: 
+  function __e_acsl_assert: precondition got status unknown.
+[eva:alarm] tests/arith/at_on-purely-logic-variables.c:7: Warning: 
+  function __e_acsl_assert: precondition got status unknown.
 [eva:alarm] tests/arith/at_on-purely-logic-variables.c:7: Warning: 
   accessing uninitialized left-value.
   assert \initialized(__gen_e_acsl_at + (int)((int)(__gen_e_acsl_n - 1) - 1));
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 205c4799a854078e9477b9ef4546492c0726ef6b..55c43cab27b2077a3433af728a43b978e40bc6cd 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
@@ -610,19 +610,50 @@ void __gen_e_acsl_f(int *t)
   {
     int __gen_e_acsl_m_3;
     __gen_e_acsl_m_3 = 4;
-    *(__gen_e_acsl_at_4 + 0) = *(t + (__gen_e_acsl_m_3 - 4));
+    {
+      int __gen_e_acsl_valid_read_7;
+      __gen_e_acsl_valid_read_7 = __e_acsl_valid_read((void *)(t + (int)(
+                                                               __gen_e_acsl_m_3 - 4L)),
+                                                      sizeof(int),(void *)t,
+                                                      (void *)(& t));
+      __e_acsl_assert(__gen_e_acsl_valid_read_7,"RTE","f",
+                      "mem_access: \\valid_read(t + (int)(__gen_e_acsl_m_3 - 4))",
+                      "tests/arith/at_on-purely-logic-variables.c",8);
+      *(__gen_e_acsl_at_4 + 0) = *(t + (__gen_e_acsl_m_3 - 4));
+    }
   }
   {
     int __gen_e_acsl_m_2;
     __gen_e_acsl_m_2 = 4;
-    *(__gen_e_acsl_at_3 + 0) = *(t + __gen_e_acsl_m_2) == -4;
+    {
+      int __gen_e_acsl_valid_read_5;
+      __gen_e_acsl_valid_read_5 = __e_acsl_valid_read((void *)(t + __gen_e_acsl_m_2),
+                                                      sizeof(int),(void *)t,
+                                                      (void *)(& t));
+      __e_acsl_assert(__gen_e_acsl_valid_read_5,"RTE","f",
+                      "mem_access: \\valid_read(t + __gen_e_acsl_m_2)",
+                      "tests/arith/at_on-purely-logic-variables.c",8);
+      *(__gen_e_acsl_at_3 + 0) = *(t + __gen_e_acsl_m_2) == -4;
+    }
   }
   {
     int __gen_e_acsl_n_3;
     __gen_e_acsl_n_3 = 1 + 1;
     while (1) {
       if (__gen_e_acsl_n_3 <= 3) ; else break;
-      *(__gen_e_acsl_at_2 + ((__gen_e_acsl_n_3 - 1) - 1)) = *(t + (__gen_e_acsl_n_3 - 1)) > 5;
+      {
+        int __gen_e_acsl_valid_read_3;
+        __gen_e_acsl_valid_read_3 = __e_acsl_valid_read((void *)(t + (int)(
+                                                                 __gen_e_acsl_n_3 - 1L)),
+                                                        sizeof(int),
+                                                        (void *)t,
+                                                        (void *)(& t));
+        __e_acsl_assert(__gen_e_acsl_valid_read_3,"RTE","f",
+                        "mem_access: \\valid_read(t + (int)(__gen_e_acsl_n_3 - 1))",
+                        "tests/arith/at_on-purely-logic-variables.c",7);
+        *(__gen_e_acsl_at_2 + ((__gen_e_acsl_n_3 - 1) - 1)) = *(t + (
+                                                                __gen_e_acsl_n_3 - 1)) > 5;
+      }
       __gen_e_acsl_n_3 ++;
     }
   }
@@ -631,7 +662,16 @@ void __gen_e_acsl_f(int *t)
     __gen_e_acsl_n_2 = 1 + 1;
     while (1) {
       if (__gen_e_acsl_n_2 <= 3) ; else break;
-      *(__gen_e_acsl_at + ((__gen_e_acsl_n_2 - 1) - 1)) = *(t + __gen_e_acsl_n_2) == 12;
+      {
+        int __gen_e_acsl_valid_read;
+        __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)(t + __gen_e_acsl_n_2),
+                                                      sizeof(int),(void *)t,
+                                                      (void *)(& t));
+        __e_acsl_assert(__gen_e_acsl_valid_read,"RTE","f",
+                        "mem_access: \\valid_read(t + __gen_e_acsl_n_2)",
+                        "tests/arith/at_on-purely-logic-variables.c",7);
+        *(__gen_e_acsl_at + ((__gen_e_acsl_n_2 - 1) - 1)) = *(t + __gen_e_acsl_n_2) == 12;
+      }
       __gen_e_acsl_n_2 ++;
     }
   }
@@ -640,22 +680,22 @@ void __gen_e_acsl_f(int *t)
     int __gen_e_acsl_forall;
     int __gen_e_acsl_n;
     int __gen_e_acsl_m;
-    int __gen_e_acsl_valid_read_3;
+    int __gen_e_acsl_valid_read_6;
     int __gen_e_acsl_and_2;
     __gen_e_acsl_forall = 1;
     __gen_e_acsl_n = 1 + 1;
     while (1) {
       if (__gen_e_acsl_n <= 3) ; else break;
       {
-        int __gen_e_acsl_valid_read;
+        int __gen_e_acsl_valid_read_2;
         int __gen_e_acsl_and;
-        __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)(__gen_e_acsl_at + (int)(
-                                                               (long)((int)(
-                                                               __gen_e_acsl_n - 1L)) - 1L)),
-                                                      sizeof(int),
-                                                      (void *)__gen_e_acsl_at,
-                                                      (void *)(& __gen_e_acsl_at));
-        __e_acsl_assert(__gen_e_acsl_valid_read,"RTE","f",
+        __gen_e_acsl_valid_read_2 = __e_acsl_valid_read((void *)(__gen_e_acsl_at + (int)(
+                                                                 (long)((int)(
+                                                                 __gen_e_acsl_n - 1L)) - 1L)),
+                                                        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:\n  \\valid_read(__gen_e_acsl_at + (int)((int)(__gen_e_acsl_n - 1) - 1))",
                         "tests/arith/at_on-purely-logic-variables.c",7);
         /*@ assert
@@ -664,14 +704,14 @@ void __gen_e_acsl_f(int *t)
                            (int)((int)(__gen_e_acsl_n - 1) - 1));
         */
         if (*(__gen_e_acsl_at + ((__gen_e_acsl_n - 1) - 1))) {
-          int __gen_e_acsl_valid_read_2;
-          __gen_e_acsl_valid_read_2 = __e_acsl_valid_read((void *)(__gen_e_acsl_at_2 + (int)(
+          int __gen_e_acsl_valid_read_4;
+          __gen_e_acsl_valid_read_4 = __e_acsl_valid_read((void *)(__gen_e_acsl_at_2 + (int)(
                                                                    (long)((int)(
                                                                    __gen_e_acsl_n - 1L)) - 1L)),
                                                           sizeof(int),
                                                           (void *)__gen_e_acsl_at_2,
                                                           (void *)(& __gen_e_acsl_at_2));
-          __e_acsl_assert(__gen_e_acsl_valid_read_2,"RTE","f",
+          __e_acsl_assert(__gen_e_acsl_valid_read_4,"RTE","f",
                           "mem_access:\n  \\valid_read(__gen_e_acsl_at_2 + (int)((int)(__gen_e_acsl_n - 1) - 1))",
                           "tests/arith/at_on-purely-logic-variables.c",7);
           /*@ assert
@@ -695,20 +735,20 @@ void __gen_e_acsl_f(int *t)
                     "\\forall integer n;\n  1 < n <= 3 ==> \\old(*(t + n) == 12) && \\old(*(t + (n - 1)) > 5)",
                     "tests/arith/at_on-purely-logic-variables.c",6);
     __gen_e_acsl_m = 4;
-    __gen_e_acsl_valid_read_3 = __e_acsl_valid_read((void *)(__gen_e_acsl_at_3 + 0),
+    __gen_e_acsl_valid_read_6 = __e_acsl_valid_read((void *)(__gen_e_acsl_at_3 + 0),
                                                     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",
+    __e_acsl_assert(__gen_e_acsl_valid_read_6,"RTE","f",
                     "mem_access: \\valid_read(__gen_e_acsl_at_3 + 0)",
                     "tests/arith/at_on-purely-logic-variables.c",8);
     if (*(__gen_e_acsl_at_3 + 0)) {
-      int __gen_e_acsl_valid_read_4;
-      __gen_e_acsl_valid_read_4 = __e_acsl_valid_read((void *)(__gen_e_acsl_at_4 + 0),
+      int __gen_e_acsl_valid_read_8;
+      __gen_e_acsl_valid_read_8 = __e_acsl_valid_read((void *)(__gen_e_acsl_at_4 + 0),
                                                       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",
+      __e_acsl_assert(__gen_e_acsl_valid_read_8,"RTE","f",
                       "mem_access: \\valid_read(__gen_e_acsl_at_4 + 0)",
                       "tests/arith/at_on-purely-logic-variables.c",8);
       __gen_e_acsl_and_2 = *(__gen_e_acsl_at_4 + 0) == 9;
diff --git a/src/plugins/e-acsl/tests/bts/issue-eacsl-139.c b/src/plugins/e-acsl/tests/bts/issue-eacsl-139.c
new file mode 100644
index 0000000000000000000000000000000000000000..d08b64bccfe85566d22503896fa2b3f8c381f67f
--- /dev/null
+++ b/src/plugins/e-acsl/tests/bts/issue-eacsl-139.c
@@ -0,0 +1,17 @@
+/* run.config_ci, run.config_dev
+   COMMENT: While unsupported, struct comparison should fail gracefully instead
+   COMMENT: of crashing Frama-C (issue frama-c/e-acsl#139).
+ */
+struct X {
+    int i ;
+};
+
+/*@ ensures *\old(item) == \old(*item); */
+void f(struct X *item){
+}
+
+int main() {
+    struct X x = {.i = 1};
+    f(&x);
+    return 0;
+}
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/bts1398.res.oracle b/src/plugins/e-acsl/tests/bts/oracle_ci/bts1398.res.oracle
index 196be478e598103ead236a8d08d82218bc6d0d9d..efd026311297e55d8fefb674326118e6ece88624 100644
--- a/src/plugins/e-acsl/tests/bts/oracle_ci/bts1398.res.oracle
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/bts1398.res.oracle
@@ -1,4 +1,2 @@
 [e-acsl] beginning translation.
 [e-acsl] translation done in project "e-acsl".
-[kernel:annot:missing-spec] tests/bts/bts1398.c:12: Warning: 
-  Neither code nor specification for function printf, generating default assigns from the prototype
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 38075f91be9c362dc3751df207f631511135b0ae..b2502604424c79e5576efefd1144796c64e6b129 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
@@ -26,7 +26,7 @@ int main(void)
   int i = 1;
   t[0] = 1;
   t[1] = 2;
-  printf(__gen_e_acsl_literal_string,x,t[0],t[i]);
+  printf(__gen_e_acsl_literal_string,x,t[0],t[i]); /* printf_va_1 */
   __retres = 0;
   __e_acsl_memory_clean();
   return __retres;
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_issue-eacsl-139.c b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_issue-eacsl-139.c
new file mode 100644
index 0000000000000000000000000000000000000000..4340159108fe6edec6394cdbb19468f3b4ac08bd
--- /dev/null
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_issue-eacsl-139.c
@@ -0,0 +1,56 @@
+/* Generated by Frama-C */
+#include "stddef.h"
+#include "stdio.h"
+extern int __e_acsl_sound_verdict;
+
+struct X {
+   int i ;
+};
+/*@ ensures *\old(item) ≡ \old(*item); */
+void __gen_e_acsl_f(struct X *item);
+
+void f(struct X *item)
+{
+  __e_acsl_store_block((void *)(& item),(size_t)8);
+  __e_acsl_delete_block((void *)(& item));
+  return;
+}
+
+int main(void)
+{
+  int __retres;
+  __e_acsl_memory_init((int *)0,(char ***)0,(size_t)8);
+  struct X x = {.i = 1};
+  __e_acsl_store_block((void *)(& x),(size_t)4);
+  __e_acsl_full_init((void *)(& x));
+  __gen_e_acsl_f(& x);
+  __retres = 0;
+  __e_acsl_delete_block((void *)(& x));
+  __e_acsl_memory_clean();
+  return __retres;
+}
+
+/*@ ensures *\old(item) ≡ \old(*item); */
+void __gen_e_acsl_f(struct X *item)
+{
+  struct X __gen_e_acsl_at_2;
+  struct X *__gen_e_acsl_at;
+  __e_acsl_store_block((void *)(& item),(size_t)8);
+  {
+    int __gen_e_acsl_valid_read;
+    __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)item,
+                                                  sizeof(struct X),
+                                                  (void *)item,
+                                                  (void *)(& item));
+    __e_acsl_assert(__gen_e_acsl_valid_read,"RTE","f",
+                    "mem_access: \\valid_read(item)",
+                    "tests/bts/issue-eacsl-139.c",9);
+    __gen_e_acsl_at_2 = *item;
+  }
+  __gen_e_acsl_at = item;
+  f(item);
+  __e_acsl_delete_block((void *)(& item));
+  return;
+}
+
+
diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/issue-eacsl-139.res.oracle b/src/plugins/e-acsl/tests/bts/oracle_ci/issue-eacsl-139.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..ac3528903af3bd4f306a3e7a91c535efefa046e6
--- /dev/null
+++ b/src/plugins/e-acsl/tests/bts/oracle_ci/issue-eacsl-139.res.oracle
@@ -0,0 +1,8 @@
+[e-acsl] beginning translation.
+[e-acsl] tests/bts/issue-eacsl-139.c:9: Warning: 
+  E-ACSL construct `comparison between two structs or unions'
+  is not yet supported.
+  Ignoring annotation.
+[e-acsl] translation done in project "e-acsl".
+[eva:alarm] tests/bts/issue-eacsl-139.c:9: Warning: 
+  function __gen_e_acsl_f: postcondition got status unknown.
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/unsigned.err.oracle b/src/plugins/e-acsl/tests/bts/oracle_dev/issue-eacsl-139.e-acsl.err.log
similarity index 100%
rename from src/plugins/wp/tests/wp_plugin/oracle/unsigned.err.oracle
rename to src/plugins/e-acsl/tests/bts/oracle_dev/issue-eacsl-139.e-acsl.err.log
diff --git a/src/plugins/e-acsl/tests/builtin/test_config_dev b/src/plugins/e-acsl/tests/builtin/test_config_dev
index dc75e26d1876b0a817f77381d8063753cbce7dc2..a915fc61b249ed381825662eecdb83418ae70384 100644
--- a/src/plugins/e-acsl/tests/builtin/test_config_dev
+++ b/src/plugins/e-acsl/tests/builtin/test_config_dev
@@ -1 +1 @@
-MACRO: ROOT_EACSL_GCC_OPTS_EXT --libc-replacements
\ No newline at end of file
+MACRO: ROOT_EACSL_GCC_OPTS_EXT --libc-replacements
diff --git a/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_rte.c b/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_rte.c
new file mode 100644
index 0000000000000000000000000000000000000000..f12c75292b7cb7ccfb227dfe8b6f74734708cfa4
--- /dev/null
+++ b/src/plugins/e-acsl/tests/constructs/oracle_ci/gen_rte.c
@@ -0,0 +1,168 @@
+/* Generated by Frama-C */
+#include "stddef.h"
+#include "stdio.h"
+extern int __e_acsl_sound_verdict;
+
+/*@ requires 1 % a ≡ 1;
+    ensures 1 % \old(b) ≡ 1;
+    
+    behavior bhvr:
+      assumes 1 % c ≡ 1;
+      requires 1 % d ≡ 1;
+      requires 1 % f ≡ 1 ∨ 1 % g ≡ 1;
+      requires 1 % h ≡ 1 ∧ 1 % i ≡ 1;
+      requires \let var = 1; var % j ≡ 1;
+      requires ∀ ℤ var; 0 ≤ var < k ⇒ var % k ≡ var;
+      requires ∃ ℤ var; 0 ≤ var < l ∧ var % l ≡ var;
+      ensures 1 % \old(e) ≡ 1;
+ */
+void __gen_e_acsl_test(int a, int b, int c, int d, int e, int f, int g,
+                       int h, int i, int j, int k, int l);
+
+void test(int a, int b, int c, int d, int e, int f, int g, int h, int i,
+          int j, int k, int l)
+{
+  return;
+}
+
+int main(void)
+{
+  int __retres;
+  __gen_e_acsl_test(2,3,4,5,6,7,8,9,10,11,12,13);
+  __retres = 0;
+  return __retres;
+}
+
+/*@ requires 1 % a ≡ 1;
+    ensures 1 % \old(b) ≡ 1;
+    
+    behavior bhvr:
+      assumes 1 % c ≡ 1;
+      requires 1 % d ≡ 1;
+      requires 1 % f ≡ 1 ∨ 1 % g ≡ 1;
+      requires 1 % h ≡ 1 ∧ 1 % i ≡ 1;
+      requires \let var = 1; var % j ≡ 1;
+      requires ∀ ℤ var; 0 ≤ var < k ⇒ var % k ≡ var;
+      requires ∃ ℤ var; 0 ≤ var < l ∧ var % l ≡ var;
+      ensures 1 % \old(e) ≡ 1;
+ */
+void __gen_e_acsl_test(int a, int b, int c, int d, int e, int f, int g,
+                       int h, int i, int j, int k, int l)
+{
+  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;
+    __gen_e_acsl_contract = __e_acsl_contract_init((size_t)1);
+    __e_acsl_assert(c != 0,"RTE","test","division_by_zero: c != 0",
+                    "tests/constructs/rte.i",11);
+    __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)0,
+                                           1 % c == 1);
+    __e_acsl_assert(a != 0,"RTE","test","division_by_zero: a != 0",
+                    "tests/constructs/rte.i",7);
+    __e_acsl_assert(1 % a == 1,"Precondition","test","1 % a == 1",
+                    "tests/constructs/rte.i",7);
+    __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;
+      int __gen_e_acsl_and;
+      int __gen_e_acsl_var;
+      int __gen_e_acsl_forall;
+      int __gen_e_acsl_var_2;
+      int __gen_e_acsl_exists;
+      int __gen_e_acsl_var_3;
+      __e_acsl_assert(d != 0,"RTE","test","division_by_zero: d != 0",
+                      "tests/constructs/rte.i",12);
+      __e_acsl_assert(f != 0,"RTE","test","division_by_zero: f != 0",
+                      "tests/constructs/rte.i",13);
+      if (1 % f == 1) __gen_e_acsl_or = 1;
+      else {
+        __e_acsl_assert(g != 0,"RTE","test","division_by_zero: g != 0",
+                        "tests/constructs/rte.i",13);
+        __gen_e_acsl_or = 1 % g == 1;
+      }
+      __e_acsl_assert(h != 0,"RTE","test","division_by_zero: h != 0",
+                      "tests/constructs/rte.i",14);
+      if (1 % h == 1) {
+        __e_acsl_assert(i != 0,"RTE","test","division_by_zero: i != 0",
+                        "tests/constructs/rte.i",14);
+        __gen_e_acsl_and = 1 % i == 1;
+      }
+      else __gen_e_acsl_and = 0;
+      __gen_e_acsl_var = 1;
+      __e_acsl_assert(j != 0,"RTE","test","division_by_zero: j != 0",
+                      "tests/constructs/rte.i",15);
+      __gen_e_acsl_forall = 1;
+      __gen_e_acsl_var_2 = 0;
+      while (1) {
+        if (__gen_e_acsl_var_2 < k) ; else break;
+        __e_acsl_assert(k != 0,"RTE","test","division_by_zero: k != 0",
+                        "tests/constructs/rte.i",16);
+        if (__gen_e_acsl_var_2 % k == __gen_e_acsl_var_2) ;
+        else {
+          __gen_e_acsl_forall = 0;
+          goto e_acsl_end_loop1;
+        }
+        __gen_e_acsl_var_2 ++;
+      }
+      e_acsl_end_loop1: ;
+      __gen_e_acsl_exists = 0;
+      __gen_e_acsl_var_3 = 0;
+      while (1) {
+        if (__gen_e_acsl_var_3 < l) ; else break;
+        __e_acsl_assert(l != 0,"RTE","test","division_by_zero: l != 0",
+                        "tests/constructs/rte.i",17);
+        if (! (__gen_e_acsl_var_3 % l == __gen_e_acsl_var_3)) ;
+        else {
+          __gen_e_acsl_exists = 1;
+          goto e_acsl_end_loop2;
+        }
+        __gen_e_acsl_var_3 ++;
+      }
+      e_acsl_end_loop2: ;
+      __e_acsl_assert(__gen_e_acsl_exists,"Precondition","test",
+                      "bhvr: \\exists integer var; 0 <= var < l && var % l == var",
+                      "tests/constructs/rte.i",17);
+      __e_acsl_assert(__gen_e_acsl_forall,"Precondition","test",
+                      "bhvr: \\forall integer var; 0 <= var < k ==> var % k == var",
+                      "tests/constructs/rte.i",16);
+      __e_acsl_assert(__gen_e_acsl_var % j == 1,"Precondition","test",
+                      "bhvr: \\let var = 1; var % j == 1",
+                      "tests/constructs/rte.i",15);
+      __e_acsl_assert(__gen_e_acsl_and,"Precondition","test",
+                      "bhvr: 1 % h == 1 && 1 % i == 1",
+                      "tests/constructs/rte.i",14);
+      __e_acsl_assert(__gen_e_acsl_or,"Precondition","test",
+                      "bhvr: 1 % f == 1 || 1 % g == 1",
+                      "tests/constructs/rte.i",13);
+      __e_acsl_assert(1 % d == 1,"Precondition","test","bhvr: 1 % d == 1",
+                      "tests/constructs/rte.i",12);
+    }
+  }
+  __gen_e_acsl_at_2 = e;
+  __gen_e_acsl_at = b;
+  test(a,b,c,d,e,f,g,h,i,j,k,l);
+  {
+    int __gen_e_acsl_assumes_value_2;
+    __e_acsl_assert(__gen_e_acsl_at != 0,"RTE","test",
+                    "division_by_zero: __gen_e_acsl_at != 0",
+                    "tests/constructs/rte.i",8);
+    __e_acsl_assert(1 % __gen_e_acsl_at == 1,"Postcondition","test",
+                    "1 % \\old(b) == 1","tests/constructs/rte.i",8);
+    __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(__gen_e_acsl_at_2 != 0,"RTE","test",
+                      "division_by_zero: __gen_e_acsl_at_2 != 0",
+                      "tests/constructs/rte.i",18);
+      __e_acsl_assert(1 % __gen_e_acsl_at_2 == 1,"Postcondition","test",
+                      "bhvr: 1 % \\old(e) == 1","tests/constructs/rte.i",18);
+    }
+    __e_acsl_contract_clean(__gen_e_acsl_contract);
+    return;
+  }
+}
+
+
diff --git a/src/plugins/e-acsl/tests/constructs/oracle_ci/rte.res.oracle b/src/plugins/e-acsl/tests/constructs/oracle_ci/rte.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..59a91431c62c3df5798cb861bd233db93ff56dd4
--- /dev/null
+++ b/src/plugins/e-acsl/tests/constructs/oracle_ci/rte.res.oracle
@@ -0,0 +1,13 @@
+[e-acsl] beginning translation.
+[e-acsl] translation done in project "e-acsl".
+[eva:alarm] tests/constructs/rte.i:24: Warning: 
+  function __gen_e_acsl_test, behavior bhvr: precondition \let var = 1;
+                                                            var % j ≡ 1 got status unknown.
+[eva:alarm] tests/constructs/rte.i:24: Warning: 
+  function __gen_e_acsl_test, behavior bhvr: precondition ∀ ℤ var;
+                                                            0 ≤ var < k ⇒
+                                                            var % k ≡ var got status unknown.
+[eva:alarm] tests/constructs/rte.i:24: Warning: 
+  function __gen_e_acsl_test, behavior bhvr: precondition ∃ ℤ var;
+                                                            0 ≤ var < l ∧
+                                                            var % l ≡ var got status unknown.
diff --git a/tests/fc_script/oracle/flamegraph.err b/src/plugins/e-acsl/tests/constructs/oracle_dev/rte.e-acsl.err.log
similarity index 100%
rename from tests/fc_script/oracle/flamegraph.err
rename to src/plugins/e-acsl/tests/constructs/oracle_dev/rte.e-acsl.err.log
diff --git a/src/plugins/e-acsl/tests/constructs/rte.i b/src/plugins/e-acsl/tests/constructs/rte.i
new file mode 100644
index 0000000000000000000000000000000000000000..f80f978c8f7e5b359989b0639da72935e11e9c07
--- /dev/null
+++ b/src/plugins/e-acsl/tests/constructs/rte.i
@@ -0,0 +1,26 @@
+/* run.config_ci, run.config_dev
+ * COMMENT: Check that the RTE checks are generated for every part of a
+ * behavior, and are generated at the right place.
+ */
+
+/*@
+  requires 1 % a == 1;
+  ensures 1 % b == 1;
+
+  behavior bhvr:
+    assumes 1 % c == 1;
+    requires 1 % d == 1;
+    requires (1 % f == 1) || (1 % g == 1);
+    requires (1 % h == 1) && (1 % i == 1);
+    requires \let var = 1; var % j == 1;
+    requires \forall integer var; 0 <= var < k ==> var % k == var;
+    requires \exists integer var; 0 <= var < l && var % l == var;
+    ensures 1 % e == 1;
+*/
+void test(int a, int b, int c, int d, int e, int f, int g, int h, int i, int j, int k, int l) {
+}
+
+int main(void) {
+  test(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13);
+  return 0;
+}
diff --git a/src/plugins/e-acsl/tests/examples/functions_contiki.c b/src/plugins/e-acsl/tests/examples/functions_contiki.c
index 382a1a64b9ef6fd97bc358a2ca031e1238d32935..180c70afd8bb5be37581ff25f00292ca0f34df63 100644
--- a/src/plugins/e-acsl/tests/examples/functions_contiki.c
+++ b/src/plugins/e-acsl/tests/examples/functions_contiki.c
@@ -25,4 +25,4 @@ int main (void) {
   node2.next = &node3;
   struct list *l = &node1;
   /*@ assert length(l) == 3; */ ;
-}
\ No newline at end of file
+}
diff --git a/src/plugins/e-acsl/tests/format/test_config_ci b/src/plugins/e-acsl/tests/format/test_config_ci
index eeaea353f8aafc1309b0f8b93ac86c545a2dd08a..982e648c83f6de086908d60d16620fa39297cb31 100644
--- a/src/plugins/e-acsl/tests/format/test_config_ci
+++ b/src/plugins/e-acsl/tests/format/test_config_ci
@@ -1 +1 @@
-STDOPT: #"-e-acsl-validate-format-strings"
+STDOPT: #"-variadic-no-translation -e-acsl-validate-format-strings"
diff --git a/src/plugins/e-acsl/tests/format/test_config_dev b/src/plugins/e-acsl/tests/format/test_config_dev
index 636b97b921455af4ec13f54c6034decf21ba3975..aae787763c6565f6f717eb03b30a8221feb90fb6 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-mtracking
+MACRO: ROOT_EACSL_GCC_OPTS_EXT --validate-format-strings --full-mtracking -F -variadic-no-translation
 MACRO: ROOT_EACSL_EXEC_FILTER @SEDCMD@ -e "s|/.*/share/e-acsl|FRAMAC_SHARE/e-acsl|"
diff --git a/src/plugins/e-acsl/tests/full-mtracking/test_config_dev b/src/plugins/e-acsl/tests/full-mtracking/test_config_dev
index bdb600fef3fe5c8ec148408a9a4207cfb5bf1239..80a939ea02713f1e0fb539f6bfb567096a7e2510 100644
--- a/src/plugins/e-acsl/tests/full-mtracking/test_config_dev
+++ b/src/plugins/e-acsl/tests/full-mtracking/test_config_dev
@@ -1 +1 @@
-MACRO: ROOT_EACSL_GCC_OPTS_EXT --full-mtracking
\ No newline at end of file
+MACRO: ROOT_EACSL_GCC_OPTS_EXT --full-mtracking
diff --git a/src/plugins/e-acsl/tests/gmp-only/test_config_dev b/src/plugins/e-acsl/tests/gmp-only/test_config_dev
index bb73475a6fbca63d3b9c38570ba4bafd575a71a5..3a3fc2c7e601d0b97416e7f858e9ddeee944102f 100644
--- a/src/plugins/e-acsl/tests/gmp-only/test_config_dev
+++ b/src/plugins/e-acsl/tests/gmp-only/test_config_dev
@@ -1 +1 @@
-MACRO: ROOT_EACSL_GCC_OPTS_EXT --gmp
\ No newline at end of file
+MACRO: ROOT_EACSL_GCC_OPTS_EXT --gmp
diff --git a/src/plugins/e-acsl/tests/memory/initialized.c b/src/plugins/e-acsl/tests/memory/initialized.c
index 4af4918caa2b7445e02f84fe3e115ef369e3f150..34f53edb19e059c2a8ff498d9e54d9c052536f36 100644
--- a/src/plugins/e-acsl/tests/memory/initialized.c
+++ b/src/plugins/e-acsl/tests/memory/initialized.c
@@ -84,6 +84,52 @@ int main(void) {
   /*@assert ! \initialized(p); */
   /*@assert ! \initialized(q); */
 
+  /* Specially crafted calloc and realloc calls to check corner cases of
+   * initialization */
+  q = calloc(3, sizeof(int));
+  /*@ assert \initialized(&q[0..2]); */
+  q = realloc(q, 6 * sizeof(int));
+  /*@ assert \initialized(&q[0..2]); */
+  /*@ assert ! \initialized(&q[3]); */
+  /*@ assert ! \initialized(&q[4]); */
+  /*@ assert ! \initialized(&q[5]); */
+  free(q);
+  q = calloc(7, sizeof(int));
+  /*@ assert \initialized(&q[0..6]); */
+  q = realloc(q, 8 * sizeof(int));
+  /*@ assert \initialized(&q[0..6]); */
+  /*@ assert ! \initialized(&q[7]); */
+  q = realloc(q, 10 * sizeof(int));
+  /*@ assert \initialized(&q[0..6]); */
+  /*@ assert ! \initialized(&q[7]); */
+  /*@ assert ! \initialized(&q[8]); */
+  /*@ assert ! \initialized(&q[9]); */
+  free(q);
+  q = calloc(2, sizeof(int));
+  /*@ assert \initialized(&q[0..1]); */
+  q = realloc(q, 4 * sizeof(int));
+  /*@ assert \initialized(&q[0..1]); */
+  /*@ assert ! \initialized(&q[2]); */
+  /*@ assert ! \initialized(&q[3]); */
+  free(q);
+  q = calloc(6, sizeof(int));
+  /*@ assert \initialized(&q[0..5]); */
+  q = realloc(q, 3 * sizeof(int));
+  /*@ assert \initialized(&q[0..2]); */
+  free(q);
+  q = malloc(6 * sizeof(int));
+  /*@ assert ! \initialized(&q[0]); */
+  /*@ assert ! \initialized(&q[1]); */
+  /*@ assert ! \initialized(&q[2]); */
+  /*@ assert ! \initialized(&q[3]); */
+  /*@ assert ! \initialized(&q[4]); */
+  /*@ assert ! \initialized(&q[5]); */
+  q = realloc(q, 3 * sizeof(int));
+  /*@ assert ! \initialized(&q[0]); */
+  /*@ assert ! \initialized(&q[1]); */
+  /*@ assert ! \initialized(&q[2]); */
+  free(q);
+
   /* Spoofing access to a non-existing stack address */
   q = (int*)(&q - 1024*5);
   /*assert ! \initialized(q); */
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/constructor.res.oracle b/src/plugins/e-acsl/tests/memory/oracle_ci/constructor.res.oracle
index 850186d110a852c7deff7b8cb2ed345dd9a3abe3..efd026311297e55d8fefb674326118e6ece88624 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/constructor.res.oracle
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/constructor.res.oracle
@@ -1,4 +1,2 @@
 [e-acsl] beginning translation.
 [e-acsl] translation done in project "e-acsl".
-[kernel:annot:missing-spec] tests/memory/constructor.c:16: Warning: 
-  Neither code nor specification for function printf, generating default assigns from the prototype
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_constructor.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_constructor.c
index 4e43d7e9cff59e04b077b46a1e9d90fc81d9e076..22920e30cf3e971afc38fc0f5f90df42bfc023b4 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_constructor.c
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_constructor.c
@@ -7,7 +7,7 @@ char *__gen_e_acsl_literal_string;
 void f(void) __attribute__((__constructor__));
 void f(void)
 {
-  printf(__gen_e_acsl_literal_string);
+  printf(__gen_e_acsl_literal_string); /* printf_va_1 */
   char *buf = malloc((unsigned long)10 * sizeof(char));
   free((void *)buf);
   return;
@@ -36,7 +36,7 @@ int main(void)
   int __retres;
   __e_acsl_memory_init((int *)0,(char ***)0,(size_t)8);
   __e_acsl_globals_init();
-  printf(__gen_e_acsl_literal_string_2);
+  printf(__gen_e_acsl_literal_string_2); /* printf_va_2 */
   __retres = 0;
   __e_acsl_memory_clean();
   return __retres;
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 2fc7f4ff02452f9cf5ec262dc1a11a7dff556df0..dec94db6533f1ddb8db1ab53e6913dab01393817 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
@@ -319,23 +319,329 @@ int main(void)
   }
   /*@ assert ¬\initialized(q); */ ;
   __e_acsl_full_init((void *)(& q));
+  q = (int *)calloc((unsigned long)3,sizeof(int));
+  {
+    int __gen_e_acsl_size;
+    int __gen_e_acsl_if;
+    int __gen_e_acsl_initialized_32;
+    __gen_e_acsl_size = 4 * ((2 - 0) + 1);
+    if (__gen_e_acsl_size <= 0) __gen_e_acsl_if = 0;
+    else __gen_e_acsl_if = __gen_e_acsl_size;
+    __gen_e_acsl_initialized_32 = __e_acsl_initialized((void *)((char *)q + 
+                                                                4 * 0),
+                                                       (size_t)__gen_e_acsl_if);
+    __e_acsl_assert(__gen_e_acsl_initialized_32,"Assertion","main",
+                    "\\initialized(q + (0 .. 2))",
+                    "tests/memory/initialized.c",90);
+  }
+  /*@ assert \initialized(q + (0 .. 2)); */ ;
+  __e_acsl_full_init((void *)(& q));
+  q = (int *)realloc((void *)q,(unsigned long)6 * sizeof(int));
+  {
+    int __gen_e_acsl_size_2;
+    int __gen_e_acsl_if_2;
+    int __gen_e_acsl_initialized_33;
+    __gen_e_acsl_size_2 = 4 * ((2 - 0) + 1);
+    if (__gen_e_acsl_size_2 <= 0) __gen_e_acsl_if_2 = 0;
+    else __gen_e_acsl_if_2 = __gen_e_acsl_size_2;
+    __gen_e_acsl_initialized_33 = __e_acsl_initialized((void *)((char *)q + 
+                                                                4 * 0),
+                                                       (size_t)__gen_e_acsl_if_2);
+    __e_acsl_assert(__gen_e_acsl_initialized_33,"Assertion","main",
+                    "\\initialized(q + (0 .. 2))",
+                    "tests/memory/initialized.c",92);
+  }
+  /*@ assert \initialized(q + (0 .. 2)); */ ;
+  {
+    int __gen_e_acsl_initialized_34;
+    __gen_e_acsl_initialized_34 = __e_acsl_initialized((void *)(q + 3),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_34,"Assertion","main",
+                    "!\\initialized(q + 3)","tests/memory/initialized.c",93);
+  }
+  /*@ assert ¬\initialized(q + 3); */ ;
+  {
+    int __gen_e_acsl_initialized_35;
+    __gen_e_acsl_initialized_35 = __e_acsl_initialized((void *)(q + 4),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_35,"Assertion","main",
+                    "!\\initialized(q + 4)","tests/memory/initialized.c",94);
+  }
+  /*@ assert ¬\initialized(q + 4); */ ;
+  {
+    int __gen_e_acsl_initialized_36;
+    __gen_e_acsl_initialized_36 = __e_acsl_initialized((void *)(q + 5),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_36,"Assertion","main",
+                    "!\\initialized(q + 5)","tests/memory/initialized.c",95);
+  }
+  /*@ assert ¬\initialized(q + 5); */ ;
+  free((void *)q);
+  __e_acsl_full_init((void *)(& q));
+  q = (int *)calloc((unsigned long)7,sizeof(int));
+  {
+    int __gen_e_acsl_size_3;
+    int __gen_e_acsl_if_3;
+    int __gen_e_acsl_initialized_37;
+    __gen_e_acsl_size_3 = 4 * ((6 - 0) + 1);
+    if (__gen_e_acsl_size_3 <= 0) __gen_e_acsl_if_3 = 0;
+    else __gen_e_acsl_if_3 = __gen_e_acsl_size_3;
+    __gen_e_acsl_initialized_37 = __e_acsl_initialized((void *)((char *)q + 
+                                                                4 * 0),
+                                                       (size_t)__gen_e_acsl_if_3);
+    __e_acsl_assert(__gen_e_acsl_initialized_37,"Assertion","main",
+                    "\\initialized(q + (0 .. 6))",
+                    "tests/memory/initialized.c",98);
+  }
+  /*@ assert \initialized(q + (0 .. 6)); */ ;
+  __e_acsl_full_init((void *)(& q));
+  q = (int *)realloc((void *)q,(unsigned long)8 * sizeof(int));
+  {
+    int __gen_e_acsl_size_4;
+    int __gen_e_acsl_if_4;
+    int __gen_e_acsl_initialized_38;
+    __gen_e_acsl_size_4 = 4 * ((6 - 0) + 1);
+    if (__gen_e_acsl_size_4 <= 0) __gen_e_acsl_if_4 = 0;
+    else __gen_e_acsl_if_4 = __gen_e_acsl_size_4;
+    __gen_e_acsl_initialized_38 = __e_acsl_initialized((void *)((char *)q + 
+                                                                4 * 0),
+                                                       (size_t)__gen_e_acsl_if_4);
+    __e_acsl_assert(__gen_e_acsl_initialized_38,"Assertion","main",
+                    "\\initialized(q + (0 .. 6))",
+                    "tests/memory/initialized.c",100);
+  }
+  /*@ assert \initialized(q + (0 .. 6)); */ ;
+  {
+    int __gen_e_acsl_initialized_39;
+    __gen_e_acsl_initialized_39 = __e_acsl_initialized((void *)(q + 7),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_39,"Assertion","main",
+                    "!\\initialized(q + 7)","tests/memory/initialized.c",101);
+  }
+  /*@ assert ¬\initialized(q + 7); */ ;
+  __e_acsl_full_init((void *)(& q));
+  q = (int *)realloc((void *)q,(unsigned long)10 * sizeof(int));
+  {
+    int __gen_e_acsl_size_5;
+    int __gen_e_acsl_if_5;
+    int __gen_e_acsl_initialized_40;
+    __gen_e_acsl_size_5 = 4 * ((6 - 0) + 1);
+    if (__gen_e_acsl_size_5 <= 0) __gen_e_acsl_if_5 = 0;
+    else __gen_e_acsl_if_5 = __gen_e_acsl_size_5;
+    __gen_e_acsl_initialized_40 = __e_acsl_initialized((void *)((char *)q + 
+                                                                4 * 0),
+                                                       (size_t)__gen_e_acsl_if_5);
+    __e_acsl_assert(__gen_e_acsl_initialized_40,"Assertion","main",
+                    "\\initialized(q + (0 .. 6))",
+                    "tests/memory/initialized.c",103);
+  }
+  /*@ assert \initialized(q + (0 .. 6)); */ ;
+  {
+    int __gen_e_acsl_initialized_41;
+    __gen_e_acsl_initialized_41 = __e_acsl_initialized((void *)(q + 7),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_41,"Assertion","main",
+                    "!\\initialized(q + 7)","tests/memory/initialized.c",104);
+  }
+  /*@ assert ¬\initialized(q + 7); */ ;
+  {
+    int __gen_e_acsl_initialized_42;
+    __gen_e_acsl_initialized_42 = __e_acsl_initialized((void *)(q + 8),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_42,"Assertion","main",
+                    "!\\initialized(q + 8)","tests/memory/initialized.c",105);
+  }
+  /*@ assert ¬\initialized(q + 8); */ ;
+  {
+    int __gen_e_acsl_initialized_43;
+    __gen_e_acsl_initialized_43 = __e_acsl_initialized((void *)(q + 9),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_43,"Assertion","main",
+                    "!\\initialized(q + 9)","tests/memory/initialized.c",106);
+  }
+  /*@ assert ¬\initialized(q + 9); */ ;
+  free((void *)q);
+  __e_acsl_full_init((void *)(& q));
+  q = (int *)calloc((unsigned long)2,sizeof(int));
+  {
+    int __gen_e_acsl_size_6;
+    int __gen_e_acsl_if_6;
+    int __gen_e_acsl_initialized_44;
+    __gen_e_acsl_size_6 = 4 * ((1 - 0) + 1);
+    if (__gen_e_acsl_size_6 <= 0) __gen_e_acsl_if_6 = 0;
+    else __gen_e_acsl_if_6 = __gen_e_acsl_size_6;
+    __gen_e_acsl_initialized_44 = __e_acsl_initialized((void *)((char *)q + 
+                                                                4 * 0),
+                                                       (size_t)__gen_e_acsl_if_6);
+    __e_acsl_assert(__gen_e_acsl_initialized_44,"Assertion","main",
+                    "\\initialized(q + (0 .. 1))",
+                    "tests/memory/initialized.c",109);
+  }
+  /*@ assert \initialized(q + (0 .. 1)); */ ;
+  __e_acsl_full_init((void *)(& q));
+  q = (int *)realloc((void *)q,(unsigned long)4 * sizeof(int));
+  {
+    int __gen_e_acsl_size_7;
+    int __gen_e_acsl_if_7;
+    int __gen_e_acsl_initialized_45;
+    __gen_e_acsl_size_7 = 4 * ((1 - 0) + 1);
+    if (__gen_e_acsl_size_7 <= 0) __gen_e_acsl_if_7 = 0;
+    else __gen_e_acsl_if_7 = __gen_e_acsl_size_7;
+    __gen_e_acsl_initialized_45 = __e_acsl_initialized((void *)((char *)q + 
+                                                                4 * 0),
+                                                       (size_t)__gen_e_acsl_if_7);
+    __e_acsl_assert(__gen_e_acsl_initialized_45,"Assertion","main",
+                    "\\initialized(q + (0 .. 1))",
+                    "tests/memory/initialized.c",111);
+  }
+  /*@ assert \initialized(q + (0 .. 1)); */ ;
+  {
+    int __gen_e_acsl_initialized_46;
+    __gen_e_acsl_initialized_46 = __e_acsl_initialized((void *)(q + 2),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_46,"Assertion","main",
+                    "!\\initialized(q + 2)","tests/memory/initialized.c",112);
+  }
+  /*@ assert ¬\initialized(q + 2); */ ;
+  {
+    int __gen_e_acsl_initialized_47;
+    __gen_e_acsl_initialized_47 = __e_acsl_initialized((void *)(q + 3),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_47,"Assertion","main",
+                    "!\\initialized(q + 3)","tests/memory/initialized.c",113);
+  }
+  /*@ assert ¬\initialized(q + 3); */ ;
+  free((void *)q);
+  __e_acsl_full_init((void *)(& q));
+  q = (int *)calloc((unsigned long)6,sizeof(int));
+  {
+    int __gen_e_acsl_size_8;
+    int __gen_e_acsl_if_8;
+    int __gen_e_acsl_initialized_48;
+    __gen_e_acsl_size_8 = 4 * ((5 - 0) + 1);
+    if (__gen_e_acsl_size_8 <= 0) __gen_e_acsl_if_8 = 0;
+    else __gen_e_acsl_if_8 = __gen_e_acsl_size_8;
+    __gen_e_acsl_initialized_48 = __e_acsl_initialized((void *)((char *)q + 
+                                                                4 * 0),
+                                                       (size_t)__gen_e_acsl_if_8);
+    __e_acsl_assert(__gen_e_acsl_initialized_48,"Assertion","main",
+                    "\\initialized(q + (0 .. 5))",
+                    "tests/memory/initialized.c",116);
+  }
+  /*@ assert \initialized(q + (0 .. 5)); */ ;
+  __e_acsl_full_init((void *)(& q));
+  q = (int *)realloc((void *)q,(unsigned long)3 * sizeof(int));
+  {
+    int __gen_e_acsl_size_9;
+    int __gen_e_acsl_if_9;
+    int __gen_e_acsl_initialized_49;
+    __gen_e_acsl_size_9 = 4 * ((2 - 0) + 1);
+    if (__gen_e_acsl_size_9 <= 0) __gen_e_acsl_if_9 = 0;
+    else __gen_e_acsl_if_9 = __gen_e_acsl_size_9;
+    __gen_e_acsl_initialized_49 = __e_acsl_initialized((void *)((char *)q + 
+                                                                4 * 0),
+                                                       (size_t)__gen_e_acsl_if_9);
+    __e_acsl_assert(__gen_e_acsl_initialized_49,"Assertion","main",
+                    "\\initialized(q + (0 .. 2))",
+                    "tests/memory/initialized.c",118);
+  }
+  /*@ assert \initialized(q + (0 .. 2)); */ ;
+  free((void *)q);
+  __e_acsl_full_init((void *)(& q));
+  q = (int *)malloc((unsigned long)6 * sizeof(int));
+  {
+    int __gen_e_acsl_initialized_50;
+    __gen_e_acsl_initialized_50 = __e_acsl_initialized((void *)(q + 0),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_50,"Assertion","main",
+                    "!\\initialized(q + 0)","tests/memory/initialized.c",121);
+  }
+  /*@ assert ¬\initialized(q + 0); */ ;
+  {
+    int __gen_e_acsl_initialized_51;
+    __gen_e_acsl_initialized_51 = __e_acsl_initialized((void *)(q + 1),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_51,"Assertion","main",
+                    "!\\initialized(q + 1)","tests/memory/initialized.c",122);
+  }
+  /*@ assert ¬\initialized(q + 1); */ ;
+  {
+    int __gen_e_acsl_initialized_52;
+    __gen_e_acsl_initialized_52 = __e_acsl_initialized((void *)(q + 2),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_52,"Assertion","main",
+                    "!\\initialized(q + 2)","tests/memory/initialized.c",123);
+  }
+  /*@ assert ¬\initialized(q + 2); */ ;
+  {
+    int __gen_e_acsl_initialized_53;
+    __gen_e_acsl_initialized_53 = __e_acsl_initialized((void *)(q + 3),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_53,"Assertion","main",
+                    "!\\initialized(q + 3)","tests/memory/initialized.c",124);
+  }
+  /*@ assert ¬\initialized(q + 3); */ ;
+  {
+    int __gen_e_acsl_initialized_54;
+    __gen_e_acsl_initialized_54 = __e_acsl_initialized((void *)(q + 4),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_54,"Assertion","main",
+                    "!\\initialized(q + 4)","tests/memory/initialized.c",125);
+  }
+  /*@ assert ¬\initialized(q + 4); */ ;
+  {
+    int __gen_e_acsl_initialized_55;
+    __gen_e_acsl_initialized_55 = __e_acsl_initialized((void *)(q + 5),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_55,"Assertion","main",
+                    "!\\initialized(q + 5)","tests/memory/initialized.c",126);
+  }
+  /*@ assert ¬\initialized(q + 5); */ ;
+  __e_acsl_full_init((void *)(& q));
+  q = (int *)realloc((void *)q,(unsigned long)3 * sizeof(int));
+  {
+    int __gen_e_acsl_initialized_56;
+    __gen_e_acsl_initialized_56 = __e_acsl_initialized((void *)(q + 0),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_56,"Assertion","main",
+                    "!\\initialized(q + 0)","tests/memory/initialized.c",128);
+  }
+  /*@ assert ¬\initialized(q + 0); */ ;
+  {
+    int __gen_e_acsl_initialized_57;
+    __gen_e_acsl_initialized_57 = __e_acsl_initialized((void *)(q + 1),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_57,"Assertion","main",
+                    "!\\initialized(q + 1)","tests/memory/initialized.c",129);
+  }
+  /*@ assert ¬\initialized(q + 1); */ ;
+  {
+    int __gen_e_acsl_initialized_58;
+    __gen_e_acsl_initialized_58 = __e_acsl_initialized((void *)(q + 2),
+                                                       sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_58,"Assertion","main",
+                    "!\\initialized(q + 2)","tests/memory/initialized.c",130);
+  }
+  /*@ assert ¬\initialized(q + 2); */ ;
+  free((void *)q);
+  __e_acsl_full_init((void *)(& q));
   q = (int *)(& q - 1024 * 5);
   __e_acsl_full_init((void *)(& q));
   q = (int *)128;
   {
-    int __gen_e_acsl_initialized_32;
-    __gen_e_acsl_initialized_32 = __e_acsl_initialized((void *)q,sizeof(int));
-    __e_acsl_assert(! __gen_e_acsl_initialized_32,"Assertion","main",
-                    "!\\initialized(q)","tests/memory/initialized.c",93);
+    int __gen_e_acsl_initialized_59;
+    __gen_e_acsl_initialized_59 = __e_acsl_initialized((void *)q,sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_59,"Assertion","main",
+                    "!\\initialized(q)","tests/memory/initialized.c",139);
   }
   /*@ assert ¬\initialized(q); */ ;
   __e_acsl_full_init((void *)(& p));
   p = (int *)0;
   {
-    int __gen_e_acsl_initialized_33;
-    __gen_e_acsl_initialized_33 = __e_acsl_initialized((void *)p,sizeof(int));
-    __e_acsl_assert(! __gen_e_acsl_initialized_33,"Assertion","main",
-                    "!\\initialized(p)","tests/memory/initialized.c",96);
+    int __gen_e_acsl_initialized_60;
+    __gen_e_acsl_initialized_60 = __e_acsl_initialized((void *)p,sizeof(int));
+    __e_acsl_assert(! __gen_e_acsl_initialized_60,"Assertion","main",
+                    "!\\initialized(p)","tests/memory/initialized.c",142);
   }
   /*@ assert ¬\initialized(p); */ ;
   int size = 100;
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 81bdec6072509915722c0d9d9a0c646508ea620a..b21a6a07c3ecce634614db0bb2a6852bac3f7b4f 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
@@ -40,7 +40,8 @@ int main(int argc, char const **argv)
   int t = 0;
   UP: ;
   if (t == 2) {
-    printf(__gen_e_acsl_literal_string_2,t,__gen_e_acsl_literal_string);
+    printf(__gen_e_acsl_literal_string_2,t,
+           (char *)__gen_e_acsl_literal_string); /* printf_va_1 */
     goto RET;
   }
   AGAIN:
@@ -58,7 +59,8 @@ int main(int argc, char const **argv)
     }
     /*@ assert \valid(&a); */ ;
     if (t == 2) {
-      printf(__gen_e_acsl_literal_string_2,t,__gen_e_acsl_literal_string_3);
+      printf(__gen_e_acsl_literal_string_2,t,
+             (char *)__gen_e_acsl_literal_string_3); /* printf_va_2 */
       __e_acsl_delete_block((void *)(& a));
       goto UP;
     }
@@ -74,7 +76,8 @@ int main(int argc, char const **argv)
                       "tests/memory/local_goto.c",36);
     }
     /*@ assert \valid(&b); */ ;
-    printf(__gen_e_acsl_literal_string_2,t,__gen_e_acsl_literal_string_4);
+    printf(__gen_e_acsl_literal_string_2,t,
+           (char *)__gen_e_acsl_literal_string_4); /* printf_va_3 */
     __e_acsl_delete_block((void *)(& a));
     __e_acsl_delete_block((void *)(& b));
     goto AGAIN;
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/gen_struct_initialized.c b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_struct_initialized.c
new file mode 100644
index 0000000000000000000000000000000000000000..1e1047dc8b47a51c32345364e5bcb7c37dcf6ee8
--- /dev/null
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/gen_struct_initialized.c
@@ -0,0 +1,147 @@
+/* Generated by Frama-C */
+#include "stddef.h"
+#include "stdint.h"
+#include "stdio.h"
+#include "stdlib.h"
+struct __anonstruct_int32_pair_t_1 {
+   int32_t a ;
+   int32_t b ;
+};
+typedef struct __anonstruct_int32_pair_t_1 int32_pair_t;
+int main(void)
+{
+  int __retres;
+  __e_acsl_memory_init((int *)0,(char ***)0,(size_t)8);
+  {
+    int32_pair_t static_pair;
+    __e_acsl_store_block((void *)(& static_pair),(size_t)8);
+    {
+      int __gen_e_acsl_initialized;
+      __gen_e_acsl_initialized = __e_acsl_initialized((void *)(& static_pair.a),
+                                                      sizeof(int32_t));
+      __e_acsl_assert(! __gen_e_acsl_initialized,"Assertion","main",
+                      "!\\initialized(&static_pair.a)",
+                      "tests/memory/struct_initialized.c",13);
+    }
+    /*@ assert ¬\initialized(&static_pair.a); */ ;
+    {
+      int __gen_e_acsl_initialized_2;
+      __gen_e_acsl_initialized_2 = __e_acsl_initialized((void *)(& static_pair.b),
+                                                        sizeof(int32_t));
+      __e_acsl_assert(! __gen_e_acsl_initialized_2,"Assertion","main",
+                      "!\\initialized(&static_pair.b)",
+                      "tests/memory/struct_initialized.c",14);
+    }
+    /*@ assert ¬\initialized(&static_pair.b); */ ;
+    __e_acsl_initialize((void *)(& static_pair.a),sizeof(int32_t));
+    static_pair.a = 1;
+    {
+      int __gen_e_acsl_initialized_3;
+      __gen_e_acsl_initialized_3 = __e_acsl_initialized((void *)(& static_pair.a),
+                                                        sizeof(int32_t));
+      __e_acsl_assert(__gen_e_acsl_initialized_3,"Assertion","main",
+                      "\\initialized(&static_pair.a)",
+                      "tests/memory/struct_initialized.c",16);
+    }
+    /*@ assert \initialized(&static_pair.a); */ ;
+    {
+      int __gen_e_acsl_initialized_4;
+      __gen_e_acsl_initialized_4 = __e_acsl_initialized((void *)(& static_pair.b),
+                                                        sizeof(int32_t));
+      __e_acsl_assert(! __gen_e_acsl_initialized_4,"Assertion","main",
+                      "!\\initialized(&static_pair.b)",
+                      "tests/memory/struct_initialized.c",17);
+    }
+    /*@ assert ¬\initialized(&static_pair.b); */ ;
+    __e_acsl_initialize((void *)(& static_pair.b),sizeof(int32_t));
+    static_pair.b = 2;
+    {
+      int __gen_e_acsl_initialized_5;
+      __gen_e_acsl_initialized_5 = __e_acsl_initialized((void *)(& static_pair.a),
+                                                        sizeof(int32_t));
+      __e_acsl_assert(__gen_e_acsl_initialized_5,"Assertion","main",
+                      "\\initialized(&static_pair.a)",
+                      "tests/memory/struct_initialized.c",19);
+    }
+    /*@ assert \initialized(&static_pair.a); */ ;
+    {
+      int __gen_e_acsl_initialized_6;
+      __gen_e_acsl_initialized_6 = __e_acsl_initialized((void *)(& static_pair.b),
+                                                        sizeof(int32_t));
+      __e_acsl_assert(__gen_e_acsl_initialized_6,"Assertion","main",
+                      "\\initialized(&static_pair.b)",
+                      "tests/memory/struct_initialized.c",20);
+    }
+    /*@ assert \initialized(&static_pair.b); */ ;
+    __e_acsl_delete_block((void *)(& static_pair));
+  }
+  {
+    int32_pair_t *heap_pair = malloc(sizeof(int32_pair_t));
+    __e_acsl_store_block((void *)(& heap_pair),(size_t)8);
+    __e_acsl_full_init((void *)(& heap_pair));
+    {
+      int __gen_e_acsl_initialized_7;
+      __gen_e_acsl_initialized_7 = __e_acsl_initialized((void *)(& heap_pair->a),
+                                                        sizeof(int32_t));
+      __e_acsl_assert(! __gen_e_acsl_initialized_7,"Assertion","main",
+                      "!\\initialized(&heap_pair->a)",
+                      "tests/memory/struct_initialized.c",26);
+    }
+    /*@ assert ¬\initialized(&heap_pair->a); */ ;
+    {
+      int __gen_e_acsl_initialized_8;
+      __gen_e_acsl_initialized_8 = __e_acsl_initialized((void *)(& heap_pair->b),
+                                                        sizeof(int32_t));
+      __e_acsl_assert(! __gen_e_acsl_initialized_8,"Assertion","main",
+                      "!\\initialized(&heap_pair->b)",
+                      "tests/memory/struct_initialized.c",27);
+    }
+    /*@ assert ¬\initialized(&heap_pair->b); */ ;
+    __e_acsl_initialize((void *)(& heap_pair->a),sizeof(int32_t));
+    heap_pair->a = 3;
+    {
+      int __gen_e_acsl_initialized_9;
+      __gen_e_acsl_initialized_9 = __e_acsl_initialized((void *)(& heap_pair->a),
+                                                        sizeof(int32_t));
+      __e_acsl_assert(__gen_e_acsl_initialized_9,"Assertion","main",
+                      "\\initialized(&heap_pair->a)",
+                      "tests/memory/struct_initialized.c",29);
+    }
+    /*@ assert \initialized(&heap_pair->a); */ ;
+    {
+      int __gen_e_acsl_initialized_10;
+      __gen_e_acsl_initialized_10 = __e_acsl_initialized((void *)(& heap_pair->b),
+                                                         sizeof(int32_t));
+      __e_acsl_assert(! __gen_e_acsl_initialized_10,"Assertion","main",
+                      "!\\initialized(&heap_pair->b)",
+                      "tests/memory/struct_initialized.c",30);
+    }
+    /*@ assert ¬\initialized(&heap_pair->b); */ ;
+    __e_acsl_initialize((void *)(& heap_pair->b),sizeof(int32_t));
+    heap_pair->b = 4;
+    {
+      int __gen_e_acsl_initialized_11;
+      __gen_e_acsl_initialized_11 = __e_acsl_initialized((void *)(& heap_pair->a),
+                                                         sizeof(int32_t));
+      __e_acsl_assert(__gen_e_acsl_initialized_11,"Assertion","main",
+                      "\\initialized(&heap_pair->a)",
+                      "tests/memory/struct_initialized.c",32);
+    }
+    /*@ assert \initialized(&heap_pair->a); */ ;
+    {
+      int __gen_e_acsl_initialized_12;
+      __gen_e_acsl_initialized_12 = __e_acsl_initialized((void *)(& heap_pair->b),
+                                                         sizeof(int32_t));
+      __e_acsl_assert(__gen_e_acsl_initialized_12,"Assertion","main",
+                      "\\initialized(&heap_pair->b)",
+                      "tests/memory/struct_initialized.c",33);
+    }
+    /*@ assert \initialized(&heap_pair->b); */ ;
+    __e_acsl_delete_block((void *)(& heap_pair));
+  }
+  __retres = 0;
+  __e_acsl_memory_clean();
+  return __retres;
+}
+
+
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/local_goto.res.oracle b/src/plugins/e-acsl/tests/memory/oracle_ci/local_goto.res.oracle
index 142c3f2be0104e92d2deba3a08cd8d2a0b4b1f10..efd026311297e55d8fefb674326118e6ece88624 100644
--- a/src/plugins/e-acsl/tests/memory/oracle_ci/local_goto.res.oracle
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/local_goto.res.oracle
@@ -1,4 +1,2 @@
 [e-acsl] beginning translation.
 [e-acsl] translation done in project "e-acsl".
-[kernel:annot:missing-spec] tests/memory/local_goto.c:37: Warning: 
-  Neither code nor specification for function printf, generating default assigns from the prototype
diff --git a/src/plugins/e-acsl/tests/memory/oracle_ci/struct_initialized.res.oracle b/src/plugins/e-acsl/tests/memory/oracle_ci/struct_initialized.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..efd026311297e55d8fefb674326118e6ece88624
--- /dev/null
+++ b/src/plugins/e-acsl/tests/memory/oracle_ci/struct_initialized.res.oracle
@@ -0,0 +1,2 @@
+[e-acsl] beginning translation.
+[e-acsl] translation done in project "e-acsl".
diff --git a/tests/fc_script/oracle/flamegraph.res b/src/plugins/e-acsl/tests/memory/oracle_dev/struct_initialized.e-acsl.err.log
similarity index 100%
rename from tests/fc_script/oracle/flamegraph.res
rename to src/plugins/e-acsl/tests/memory/oracle_dev/struct_initialized.e-acsl.err.log
diff --git a/src/plugins/e-acsl/tests/memory/separated.c b/src/plugins/e-acsl/tests/memory/separated.c
index f63bc50c481ce6e32f517c41545ba6792b913088..872cba8db9d97a4cd3e2cf835109049747077274 100644
--- a/src/plugins/e-acsl/tests/memory/separated.c
+++ b/src/plugins/e-acsl/tests/memory/separated.c
@@ -65,4 +65,4 @@ int main() {
     }
 
     return 0;
-}
\ No newline at end of file
+}
diff --git a/src/plugins/e-acsl/tests/memory/struct_initialized.c b/src/plugins/e-acsl/tests/memory/struct_initialized.c
new file mode 100644
index 0000000000000000000000000000000000000000..87ee96337d2ebfbddd575f46715f31fbd7b338d3
--- /dev/null
+++ b/src/plugins/e-acsl/tests/memory/struct_initialized.c
@@ -0,0 +1,35 @@
+#include <stdint.h>
+#include <stdlib.h>
+
+typedef struct {
+  int32_t a;
+  int32_t b;
+} int32_pair_t;
+
+int main() {
+  // Static alloc
+  {
+    int32_pair_t static_pair;
+    //@ assert !\initialized(&static_pair.a);
+    //@ assert !\initialized(&static_pair.b);
+    static_pair.a = 1;
+    //@ assert \initialized(&static_pair.a);
+    //@ assert !\initialized(&static_pair.b);
+    static_pair.b = 2;
+    //@ assert \initialized(&static_pair.a);
+    //@ assert \initialized(&static_pair.b);
+  }
+
+  // Dynamic alloc
+  {
+    int32_pair_t * heap_pair = malloc(sizeof(int32_pair_t));
+    //@ assert !\initialized(&heap_pair->a);
+    //@ assert !\initialized(&heap_pair->b);
+    heap_pair->a = 3;
+    //@ assert \initialized(&heap_pair->a);
+    //@ assert !\initialized(&heap_pair->b);
+    heap_pair->b = 4;
+    //@ assert \initialized(&heap_pair->a);
+    //@ assert \initialized(&heap_pair->b);
+  }
+}
diff --git a/src/plugins/e-acsl/tests/special/e-acsl-bittree-model.c b/src/plugins/e-acsl/tests/special/e-acsl-bittree-model.c
new file mode 100644
index 0000000000000000000000000000000000000000..efdd82a5ee0f2c74f1cc055f005cb40cce853a5d
--- /dev/null
+++ b/src/plugins/e-acsl/tests/special/e-acsl-bittree-model.c
@@ -0,0 +1,8 @@
+/* run.config_ci, run.config_dev
+  COMMENT: Compile RTL with bittree memory model
+  STDOPT:#"-e-acsl-full-mtracking"
+  MACRO: ROOT_EACSL_GCC_OPTS_EXT --full-mtracking --memory-model bittree
+ */
+int main() {
+  return 0;
+}
diff --git a/src/plugins/e-acsl/tests/special/e-acsl-compile-dlmalloc.c b/src/plugins/e-acsl/tests/special/e-acsl-compile-dlmalloc.c
new file mode 100644
index 0000000000000000000000000000000000000000..3b5788f306a66a9598ba9e6c318fc94c8fde7aae
--- /dev/null
+++ b/src/plugins/e-acsl/tests/special/e-acsl-compile-dlmalloc.c
@@ -0,0 +1,7 @@
+/* run.config_ci, run.config_dev
+  COMMENT: Compile dlmalloc from sources with this file
+  MACRO: ROOT_EACSL_GCC_OPTS_EXT --dlmalloc-from-sources
+ */
+int main() {
+  return 0;
+}
diff --git a/src/plugins/e-acsl/tests/special/e-acsl-rt-debug.c b/src/plugins/e-acsl/tests/special/e-acsl-rt-debug.c
new file mode 100644
index 0000000000000000000000000000000000000000..8d050c12439f462c3148f4f3dcde4456249f974c
--- /dev/null
+++ b/src/plugins/e-acsl/tests/special/e-acsl-rt-debug.c
@@ -0,0 +1,8 @@
+/* run.config_ci, run.config_dev
+  COMMENT: Compile RTL with debug and debug verbose informations
+  STDOPT:#"-e-acsl-debug 1"
+  MACRO: ROOT_EACSL_GCC_OPTS_EXT --rt-debug --rt-verbose
+ */
+int main() {
+  return 0;
+}
diff --git a/src/plugins/e-acsl/tests/special/e-acsl-segment-model.c b/src/plugins/e-acsl/tests/special/e-acsl-segment-model.c
new file mode 100644
index 0000000000000000000000000000000000000000..d9bf523c54916e4d2decf42fe5b3342b3415c9ba
--- /dev/null
+++ b/src/plugins/e-acsl/tests/special/e-acsl-segment-model.c
@@ -0,0 +1,8 @@
+/* run.config_ci, run.config_dev
+  COMMENT: Compile RTL with segment memory model
+  STDOPT:#"-e-acsl-full-mtracking"
+  MACRO: ROOT_EACSL_GCC_OPTS_EXT --full-mtracking --memory-model segment
+ */
+int main() {
+  return 0;
+}
diff --git a/src/plugins/e-acsl/tests/special/oracle_ci/e-acsl-bittree-model.res.oracle b/src/plugins/e-acsl/tests/special/oracle_ci/e-acsl-bittree-model.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..efd026311297e55d8fefb674326118e6ece88624
--- /dev/null
+++ b/src/plugins/e-acsl/tests/special/oracle_ci/e-acsl-bittree-model.res.oracle
@@ -0,0 +1,2 @@
+[e-acsl] beginning translation.
+[e-acsl] translation done in project "e-acsl".
diff --git a/src/plugins/e-acsl/tests/special/oracle_ci/e-acsl-compile-dlmalloc.res.oracle b/src/plugins/e-acsl/tests/special/oracle_ci/e-acsl-compile-dlmalloc.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..efd026311297e55d8fefb674326118e6ece88624
--- /dev/null
+++ b/src/plugins/e-acsl/tests/special/oracle_ci/e-acsl-compile-dlmalloc.res.oracle
@@ -0,0 +1,2 @@
+[e-acsl] beginning translation.
+[e-acsl] translation done in project "e-acsl".
diff --git a/src/plugins/e-acsl/tests/special/oracle_ci/e-acsl-instrument.res.oracle b/src/plugins/e-acsl/tests/special/oracle_ci/e-acsl-instrument.res.oracle
index 724a37c22bbd6d1f608dad3161b784c89cec0332..efd026311297e55d8fefb674326118e6ece88624 100644
--- a/src/plugins/e-acsl/tests/special/oracle_ci/e-acsl-instrument.res.oracle
+++ b/src/plugins/e-acsl/tests/special/oracle_ci/e-acsl-instrument.res.oracle
@@ -1,12 +1,2 @@
 [e-acsl] beginning translation.
-[e-acsl] tests/special/e-acsl-instrument.c:58: Warning: 
-  ignoring effect of variadic function vol
 [e-acsl] translation done in project "e-acsl".
-[kernel:annot:missing-spec] tests/special/e-acsl-instrument.c:43: Warning: 
-  Neither code nor specification for function __builtin_va_start, generating default assigns from the prototype
-[kernel:annot:missing-spec] tests/special/e-acsl-instrument.c:44: Warning: 
-  Neither code nor specification for function __builtin_va_arg, generating default assigns from the prototype
-[eva:alarm] tests/special/e-acsl-instrument.c:44: Warning: 
-  accessing uninitialized left-value.
-  assert \initialized(&tmp);
-  (tmp from vararg)
diff --git a/src/plugins/e-acsl/tests/special/oracle_ci/e-acsl-rt-debug.res.oracle b/src/plugins/e-acsl/tests/special/oracle_ci/e-acsl-rt-debug.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..efd026311297e55d8fefb674326118e6ece88624
--- /dev/null
+++ b/src/plugins/e-acsl/tests/special/oracle_ci/e-acsl-rt-debug.res.oracle
@@ -0,0 +1,2 @@
+[e-acsl] beginning translation.
+[e-acsl] translation done in project "e-acsl".
diff --git a/src/plugins/e-acsl/tests/special/oracle_ci/e-acsl-segment-model.res.oracle b/src/plugins/e-acsl/tests/special/oracle_ci/e-acsl-segment-model.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..efd026311297e55d8fefb674326118e6ece88624
--- /dev/null
+++ b/src/plugins/e-acsl/tests/special/oracle_ci/e-acsl-segment-model.res.oracle
@@ -0,0 +1,2 @@
+[e-acsl] beginning translation.
+[e-acsl] translation done in project "e-acsl".
diff --git a/src/plugins/e-acsl/tests/special/oracle_ci/gen_e-acsl-bittree-model.c b/src/plugins/e-acsl/tests/special/oracle_ci/gen_e-acsl-bittree-model.c
new file mode 100644
index 0000000000000000000000000000000000000000..8673c9a15aa2ccbb782ab75e2700cd10b95d9cf2
--- /dev/null
+++ b/src/plugins/e-acsl/tests/special/oracle_ci/gen_e-acsl-bittree-model.c
@@ -0,0 +1,16 @@
+/* Generated by Frama-C */
+#include "stddef.h"
+#include "stdio.h"
+int main(void)
+{
+  int __retres;
+  __e_acsl_memory_init((int *)0,(char ***)0,(size_t)8);
+  __e_acsl_store_block((void *)(& __retres),(size_t)4);
+  __e_acsl_full_init((void *)(& __retres));
+  __retres = 0;
+  __e_acsl_delete_block((void *)(& __retres));
+  __e_acsl_memory_clean();
+  return __retres;
+}
+
+
diff --git a/src/plugins/e-acsl/tests/special/oracle_ci/gen_e-acsl-compile-dlmalloc.c b/src/plugins/e-acsl/tests/special/oracle_ci/gen_e-acsl-compile-dlmalloc.c
new file mode 100644
index 0000000000000000000000000000000000000000..5884b0f6c6078320062404a8fcf96f5158f24dc4
--- /dev/null
+++ b/src/plugins/e-acsl/tests/special/oracle_ci/gen_e-acsl-compile-dlmalloc.c
@@ -0,0 +1,11 @@
+/* Generated by Frama-C */
+#include "stddef.h"
+#include "stdio.h"
+int main(void)
+{
+  int __retres;
+  __retres = 0;
+  return __retres;
+}
+
+
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 f317d0df3bcefc001519a56a8c2a001604f0a30e..eb68292992dbc87694f7f832d25339504f5db263 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
@@ -77,18 +77,24 @@ int __gen_e_acsl_f(int *p)
   int __retres;
   {
     int __gen_e_acsl_initialized;
+    int __gen_e_acsl_valid_read;
     __e_acsl_store_block((void *)(& p),(size_t)8);
     __gen_e_acsl_initialized = __e_acsl_initialized((void *)p,sizeof(int));
     __e_acsl_assert(__gen_e_acsl_initialized,"Precondition","f",
                     "\\initialized(p)","tests/special/e-acsl-functions.c",7);
+    __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)p,sizeof(int),
+                                                  (void *)p,(void *)(& p));
+    __e_acsl_assert(__gen_e_acsl_valid_read,"RTE","f",
+                    "mem_access: \\valid_read(p)",
+                    "tests/special/e-acsl-functions.c",8);
     __e_acsl_assert(*p == 0,"Precondition","f","*p == 0",
                     "tests/special/e-acsl-functions.c",8);
   }
   {
-    int __gen_e_acsl_valid_read;
-    __gen_e_acsl_valid_read = __e_acsl_valid_read((void *)p,sizeof(int),
-                                                  (void *)p,(void *)(& p));
-    __e_acsl_assert(__gen_e_acsl_valid_read,"RTE","f",
+    int __gen_e_acsl_valid_read_2;
+    __gen_e_acsl_valid_read_2 = __e_acsl_valid_read((void *)p,sizeof(int),
+                                                    (void *)p,(void *)(& p));
+    __e_acsl_assert(__gen_e_acsl_valid_read_2,"RTE","f",
                     "mem_access: \\valid_read(p)",
                     "tests/special/e-acsl-functions.c",9);
     __gen_e_acsl_at = *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 2ef9690828f51e9219104f370ff96285a510a3c8..24fc369486bb2b439cc853d1e8a5d7038ea5cc52 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
@@ -4,12 +4,6 @@
 #include "stdio.h"
 extern int __e_acsl_sound_verdict;
 
-/* compiler builtin: 
-   void __builtin_va_arg(__builtin_va_list, unsigned long, void *);   */
-/* compiler builtin: 
-   void __builtin_va_end(__builtin_va_list);   */
-/* compiler builtin: 
-   void __builtin_va_start(__builtin_va_list);   */
 int __gen_e_acsl_uninstrument1(int *p);
 
 int uninstrument1(int *p)
@@ -68,17 +62,22 @@ int instrument2(int *p)
   return __retres;
 }
 
-int vol(int n , ...)
+int vol(int n, void * const *__va_params)
 {
   int __retres;
   va_list vl;
   int tmp;
-  __builtin_va_start(vl,n);
-  tmp = __builtin_va_arg (vl, int);
-  /*@ assert Eva: initialization: \initialized(&tmp); */
+  __e_acsl_store_block((void *)(& vl),(size_t)8);
+  __e_acsl_store_block((void *)(& __va_params),(size_t)8);
+  __e_acsl_full_init((void *)(& vl));
+  vl = __va_params;
+  tmp = *((int *)*vl);
+  __e_acsl_full_init((void *)(& vl));
+  vl ++;
   int r = tmp;
-  __builtin_va_end(vl);
   __retres = 0;
+  __e_acsl_delete_block((void *)(& __va_params));
+  __e_acsl_delete_block((void *)(& vl));
   return __retres;
 }
 
@@ -113,7 +112,17 @@ int main(void)
                     57);
   }
   /*@ assert \initialized(&y); */ ;
-  tmp = vol(6,1);
+  {
+    int __va_arg0 = 1;
+    __e_acsl_store_block((void *)(& __va_arg0),(size_t)4);
+    __e_acsl_full_init((void *)(& __va_arg0));
+    void *__va_args[1] = {& __va_arg0};
+    __e_acsl_store_block((void *)(__va_args),(size_t)8);
+    __e_acsl_full_init((void *)(& __va_args));
+    tmp = vol(6,(void * const *)(__va_args));
+    __e_acsl_delete_block((void *)(& __va_arg0));
+    __e_acsl_delete_block((void *)(__va_args));
+  }
   __e_acsl_delete_block((void *)(& y));
   __e_acsl_delete_block((void *)(& x));
   __e_acsl_memory_clean();
diff --git a/src/plugins/e-acsl/tests/special/oracle_ci/gen_e-acsl-rt-debug.c b/src/plugins/e-acsl/tests/special/oracle_ci/gen_e-acsl-rt-debug.c
new file mode 100644
index 0000000000000000000000000000000000000000..5884b0f6c6078320062404a8fcf96f5158f24dc4
--- /dev/null
+++ b/src/plugins/e-acsl/tests/special/oracle_ci/gen_e-acsl-rt-debug.c
@@ -0,0 +1,11 @@
+/* Generated by Frama-C */
+#include "stddef.h"
+#include "stdio.h"
+int main(void)
+{
+  int __retres;
+  __retres = 0;
+  return __retres;
+}
+
+
diff --git a/src/plugins/e-acsl/tests/special/oracle_ci/gen_e-acsl-segment-model.c b/src/plugins/e-acsl/tests/special/oracle_ci/gen_e-acsl-segment-model.c
new file mode 100644
index 0000000000000000000000000000000000000000..8673c9a15aa2ccbb782ab75e2700cd10b95d9cf2
--- /dev/null
+++ b/src/plugins/e-acsl/tests/special/oracle_ci/gen_e-acsl-segment-model.c
@@ -0,0 +1,16 @@
+/* Generated by Frama-C */
+#include "stddef.h"
+#include "stdio.h"
+int main(void)
+{
+  int __retres;
+  __e_acsl_memory_init((int *)0,(char ***)0,(size_t)8);
+  __e_acsl_store_block((void *)(& __retres),(size_t)4);
+  __e_acsl_full_init((void *)(& __retres));
+  __retres = 0;
+  __e_acsl_delete_block((void *)(& __retres));
+  __e_acsl_memory_clean();
+  return __retres;
+}
+
+
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 890e84bc928baf7442348bff76b96f4437330ebc..e611ff7fd1b7dfe6a16264968bca289f03bafaeb 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
@@ -106,19 +106,37 @@ void __gen_e_acsl_f(int *x, int *y)
   int *__gen_e_acsl_at;
   __e_acsl_contract_t *__gen_e_acsl_contract;
   {
+    int __gen_e_acsl_valid_read;
+    int __gen_e_acsl_valid_read_2;
     int __gen_e_acsl_valid;
+    int __gen_e_acsl_valid_read_3;
     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);
+    __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",15);
     __e_acsl_contract_set_behavior_assumes(__gen_e_acsl_contract,(size_t)0,
                                            *x == 1);
+    __gen_e_acsl_valid_read_2 = __e_acsl_valid_read((void *)x,sizeof(int),
+                                                    (void *)x,(void *)(& x));
+    __e_acsl_assert(__gen_e_acsl_valid_read_2,"RTE","f",
+                    "mem_access: \\valid_read(x)",
+                    "tests/special/e-acsl-valid.c",19);
     __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);
+    __gen_e_acsl_valid_read_3 = __e_acsl_valid_read((void *)x,sizeof(int),
+                                                    (void *)x,(void *)(& x));
+    __e_acsl_assert(__gen_e_acsl_valid_read_3,"RTE","f",
+                    "mem_access: \\valid_read(x)",
+                    "tests/special/e-acsl-valid.c",11);
     __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
@@ -135,10 +153,10 @@ void __gen_e_acsl_f(int *x, int *y)
   __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",
+    int __gen_e_acsl_valid_read_4;
+    __gen_e_acsl_valid_read_4 = __e_acsl_valid_read((void *)x,sizeof(int),
+                                                    (void *)x,(void *)(& x));
+    __e_acsl_assert(__gen_e_acsl_valid_read_4,"RTE","f",
                     "mem_access: \\valid_read(x)",
                     "tests/special/e-acsl-valid.c",12);
     __gen_e_acsl_at_2 = (long)*x;
@@ -146,13 +164,13 @@ void __gen_e_acsl_f(int *x, int *y)
   __gen_e_acsl_at = x;
   f(x,y);
   {
-    int __gen_e_acsl_valid_read_2;
+    int __gen_e_acsl_valid_read_5;
     int __gen_e_acsl_assumes_value;
-    __gen_e_acsl_valid_read_2 = __e_acsl_valid_read((void *)__gen_e_acsl_at,
+    __gen_e_acsl_valid_read_5 = __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",
+    __e_acsl_assert(__gen_e_acsl_valid_read_5,"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,
@@ -161,12 +179,12 @@ void __gen_e_acsl_f(int *x, int *y)
     __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,
+      int __gen_e_acsl_valid_read_6;
+      __gen_e_acsl_valid_read_6 = __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",
+      __e_acsl_assert(__gen_e_acsl_valid_read_6,"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",
@@ -175,12 +193,12 @@ void __gen_e_acsl_f(int *x, int *y)
     __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,
+      int __gen_e_acsl_valid_read_7;
+      __gen_e_acsl_valid_read_7 = __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",
+      __e_acsl_assert(__gen_e_acsl_valid_read_7,"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",
diff --git a/src/plugins/e-acsl/tests/special/oracle_dev/e-acsl-bittree-model.e-acsl.err.log b/src/plugins/e-acsl/tests/special/oracle_dev/e-acsl-bittree-model.e-acsl.err.log
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/plugins/e-acsl/tests/special/oracle_dev/e-acsl-compile-dlmalloc.e-acsl.err.log b/src/plugins/e-acsl/tests/special/oracle_dev/e-acsl-compile-dlmalloc.e-acsl.err.log
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/plugins/e-acsl/tests/special/oracle_dev/e-acsl-rt-debug.e-acsl.err.log b/src/plugins/e-acsl/tests/special/oracle_dev/e-acsl-rt-debug.e-acsl.err.log
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/plugins/e-acsl/tests/special/oracle_dev/e-acsl-segment-model.e-acsl.err.log b/src/plugins/e-acsl/tests/special/oracle_dev/e-acsl-segment-model.e-acsl.err.log
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
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 670764770e98f63c776052e30aff421eee39a713..d718f3e61f84379b9b8a5e95995335bf3cbae46f 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
@@ -58,7 +58,7 @@ int main(void)
       __e_acsl_temporal_reset_parameters();
       __e_acsl_temporal_reset_return();
       __e_acsl_temporal_save_nreferent_parameter((void *)(& p),1U);
-      printf(__gen_e_acsl_literal_string,p,counter);
+      printf(__gen_e_acsl_literal_string,(void *)p,counter); /* printf_va_1 */
       break;
     }
     __e_acsl_full_init((void *)(& p));
diff --git a/src/plugins/e-acsl/tests/test_config_ci.in b/src/plugins/e-acsl/tests/test_config_ci.in
index 2c9748e535a049455c62e15f0f0ed3469bc5df95..9b58fc5a4a9550952da1aaca405d6aec67e4899c 100644
--- a/src/plugins/e-acsl/tests/test_config_ci.in
+++ b/src/plugins/e-acsl/tests/test_config_ci.in
@@ -1,6 +1,6 @@
 MACRO: DEST @PTEST_RESULT@/gen_@PTEST_NAME@
 MACRO: MACHDEP -machdep gcc_x86_64
-MACRO: GLOBAL @MACHDEP@ -remove-unused-specified-functions -variadic-no-translation -verbose 0
+MACRO: GLOBAL @MACHDEP@ -remove-unused-specified-functions -verbose 0
 MACRO: EACSL -e-acsl -e-acsl-share ./share/e-acsl -e-acsl-verbose 1
 MACRO: EVA -eva -eva-no-alloc-returns-null -eva-no-results -eva-no-print -eva-warn-key libc:unsupported-spec=inactive
 MACRO: EVENTUALLY -print -ocode @DEST@.c -load-script ./tests/print.cmxs
diff --git a/src/plugins/from/callwise.ml b/src/plugins/from/callwise.ml
index 38efe4f744c25a49d651aab296356be8af914794..71038fdbbc65415215314d7133d10747a5dcd439 100644
--- a/src/plugins/from/callwise.ml
+++ b/src/plugins/from/callwise.ml
@@ -68,14 +68,13 @@ let call_for_individual_froms (call_type, value_initial_state, call_stack) =
   if From_parameters.ForceCallDeps.get () then begin
     let current_function, call_site = List.hd call_stack in
     let register_from froms =
-      try
-        let { table_for_calls = table } = List.hd !call_froms_stack in
-        merge_call_froms table call_site froms;
-        record_callwise_dependencies_in_db call_site froms;
-      with Failure _ ->
-        From_parameters.fatal
-          "calldeps internal error 23 empty callfromsstack %a"
-          Kernel_function.pretty current_function
+      record_callwise_dependencies_in_db call_site froms;
+      match !call_froms_stack with
+      | { table_for_calls } :: _ ->
+        merge_call_froms table_for_calls call_site froms;
+      | [] ->
+        (* Empty call stack: this is the main entry point with no call site. *)
+        assert (call_site = Cil_types.Kglobal);
     in
     let compute_from_behaviors bhv =
       let assigns = Ast_info.merge_assigns bhv in
diff --git a/src/plugins/from/from_register.ml b/src/plugins/from/from_register.ml
index 1888961c05a41e79c81eae6efd64e94d5602b830..9b82d7c782042c7b65dff23ce550f11880ea6337 100644
--- a/src/plugins/from/from_register.ml
+++ b/src/plugins/from/from_register.ml
@@ -27,7 +27,7 @@ let pretty_with_indirect fmt v =
   Function_Froms.pretty_with_type_indirect (Kernel_function.get_type v) fmt deps
 
 let display fmtopt =
-  Extlib.may (fun fmt -> Format.fprintf fmt "@[<v>") fmtopt;
+  Option.iter (fun fmt -> Format.fprintf fmt "@[<v>") fmtopt;
   Callgraph.Uses.iter_in_rev_order
     (fun kf ->
       if !Db.Value.is_called kf then
@@ -45,7 +45,7 @@ let display fmtopt =
           | Some fmt ->
             Format.fprintf fmt "@[%t@]@ @[  %a]" header pretty kf
     );
-  Extlib.may (fun fmt -> Format.fprintf fmt "@]") fmtopt
+  Option.iter (fun fmt -> Format.fprintf fmt "@]") fmtopt
 
 module SortCalls = struct
   type t = stmt
diff --git a/src/plugins/gui/GSourceView.3.ml b/src/plugins/gui/GSourceView.3.ml
index 1660cb36d9d4bdf1397c60ad75adcdafd76482f8..cf732307b385aa9bb80376169ee51ec10bed297b 100644
--- a/src/plugins/gui/GSourceView.3.ml
+++ b/src/plugins/gui/GSourceView.3.ml
@@ -32,7 +32,7 @@ let make_marker_attributes
   ?(icon_name:string option)
   () =
   let my_attributes = GSourceView3.source_mark_attributes () in
-  Extlib.may my_attributes#set_background background;
-  Extlib.may my_attributes#set_pixbuf pixbuf;
-  Extlib.may my_attributes#set_icon_name icon_name;
+  Option.iter my_attributes#set_background background;
+  Option.iter my_attributes#set_pixbuf pixbuf;
+  Option.iter my_attributes#set_icon_name icon_name;
   source#set_mark_attributes ~category my_attributes priority
diff --git a/src/plugins/gui/analyses_manager.ml b/src/plugins/gui/analyses_manager.ml
index 54881a5a289475a8e8e708044b3012d43857944d..1a94f476eb1a85a0844111949cf3092e6945d02e 100644
--- a/src/plugins/gui/analyses_manager.ml
+++ b/src/plugins/gui/analyses_manager.ml
@@ -46,7 +46,7 @@ let run title filter_name extension loader
              !Db.Main.play ();
              host_window#reset ()
            in
-           Extlib.may run dialog#filename;
+           Option.iter run dialog#filename;
        | `DELETE_EVENT | `CANCEL ->
            ());
   dialog#destroy ()
@@ -72,7 +72,7 @@ let insert (main_ui: Design.main_window_extension_points) =
       ]
   in
   default_analyses_items.(0)#add_accelerator `CONTROL 'r';
-  let stop_button = Extlib.the default_analyses_items.(2)#tool_button in
+  let stop_button = Option.get default_analyses_items.(2)#tool_button in
 
   Gtk_helper.register_locking_machinery
     ~lock_last:true
diff --git a/src/plugins/gui/debug_manager.ok.ml b/src/plugins/gui/debug_manager.ok.ml
index 3ae5cdd11d46cc172fdf75e78bb579f8635625dc..32eb2f1965f43ca1d812787c1f350caccbb754dc 100644
--- a/src/plugins/gui/debug_manager.ok.ml
+++ b/src/plugins/gui/debug_manager.ok.ml
@@ -20,9 +20,9 @@
 (*                                                                        *)
 (**************************************************************************)
 
-(* Require Dgraph included in Ocamlgraph, thus GnomeCanvas *)
+(* Require Dgraph included in OCamlgraph/Ocamlgraph_gtk, thus GnomeCanvas *)
 
-open Dgraph
+open DGRAPH_MODULE
 
 let graph_view ~packing mk_dot =
   let f =
diff --git a/src/plugins/gui/design.ml b/src/plugins/gui/design.ml
index 87952f24f7043431e9b988db6ef9adf56d9e74e3..c5a986d5802ee1663188d80d51817a05a251fdc8 100644
--- a/src/plugins/gui/design.ml
+++ b/src/plugins/gui/design.ml
@@ -602,7 +602,7 @@ let to_do_on_select
           (if vi.vaddrof then "" else "not ")
       end else begin
         main_ui#view_original vi.vdecl;
-        let kf = Extlib.the kf in
+        let kf = Option.get kf in
         main_ui#pretty_information
           "This is the declaration of %s %a in function %a%t@."
           (formal_or_local vi) Varinfo.pretty vi
@@ -1040,7 +1040,7 @@ class main_window () : main_window_extension_points =
         m
       | Some s ->
         s
-    method file_tree = Extlib.the file_tree
+    method file_tree = Option.get file_tree
     method file_tree_view = file_tree_view
     method annot_window = annot_window
 
@@ -1101,7 +1101,7 @@ class main_window () : main_window_extension_points =
            ignore (expander#drag#connect#ending (fun _ -> dragged_frame:=None));
 
            (* Refreshers *)
-           Extlib.may
+           Option.iter
              (fun refresh ->
                 to_refresh:=
                   (fun ()->
@@ -1442,7 +1442,7 @@ class main_window () : main_window_extension_points =
           begin
             let text =
               if use_dialog then
-                Extlib.opt_conv ""
+                Option.value ~default:""
                   (Gtk_helper.input_string
                      ~parent:main_window
                      ~title:"Find global" ~ok:"Find" ~cancel:"Cancel"
@@ -1486,7 +1486,7 @@ class main_window () : main_window_extension_points =
       | Some (where,viewer) ->
         let text =
           if use_dialog then
-            Extlib.opt_conv ""
+            Option.value ~default:""
               (Gtk_helper.input_string
                  ~parent:main_window
                  ~title:("Find " ^ where) ~ok:"Find" ~cancel:"Cancel"
@@ -1696,9 +1696,9 @@ class main_window () : main_window_extension_points =
           GtkMisc.Label.set_text label text
         in
         let callback e _column =
-          Extlib.may
+          Option.iter
             (fun pos ->
-               Extlib.may self#scroll (Pretty_source.loc_to_localizable pos);
+               Option.iter self#scroll (Pretty_source.loc_to_localizable pos);
                (* Note: the code below generates double scrolling:
                   the previous call to self#scroll causes the original source
                   viewer to scroll to the beginning of the function, and then
@@ -1708,14 +1708,24 @@ class main_window () : main_window_extension_points =
         in
         Warning_manager.make ~packing ~callback
       in
+      let outdated_warnings = ref false in
       let display_warnings () =
-        Messages.reset_once_flag ();
+        outdated_warnings := false ;
         Warning_manager.clear warning_manager;
         Messages.iter (fun event -> Warning_manager.append warning_manager event);
         let text = Format.sprintf "Messages (%d)" (Messages.nb_messages ()) in
         let label = GtkMisc.Label.cast warnings_tab_label#as_widget in
         GtkMisc.Label.set_text label text
       in
+      register_reset_extension (fun _ -> display_warnings ());
+      Messages.add_global_hook (fun () ->
+          if not !outdated_warnings then
+            begin
+              outdated_warnings := true ;
+              Wutil.later display_warnings
+            end
+        );
+      Messages.reset_once_flag ();
       display_warnings ();
 
       (* Management of navigation history *)
@@ -1728,7 +1738,6 @@ class main_window () : main_window_extension_points =
             self#scroll l
         );
 
-      register_reset_extension (fun _ -> display_warnings ());
       self#default_screen ();
       menu_manager#refresh ();
       Project.register_after_set_current_hook
diff --git a/src/plugins/gui/dgraph_helper.yes.ml b/src/plugins/gui/dgraph_helper.yes.ml
index 30fa88ec14d5b77eeae769521ac859bb7d8ec37d..f547f895cb8bb737ed10b9421b0db40f7a8cd064 100644
--- a/src/plugins/gui/dgraph_helper.yes.ml
+++ b/src/plugins/gui/dgraph_helper.yes.ml
@@ -20,6 +20,8 @@
 (*                                                                        *)
 (**************************************************************************)
 
+open DGRAPH_MODULE
+
 let graph_window ~parent ~title make_view =
   let height = int_of_float (float parent#default_height *. 3. /. 4.) in
   let width = int_of_float (float parent#default_width *. 3. /. 4.) in
@@ -46,13 +48,13 @@ let graph_window_through_dot ~parent ~title dot_formatter =
     Format.pp_print_flush fmt ();
     let view =
       snd
-        (Dgraph.DGraphContainer.Dot.from_dot_with_commands ~packing temp_file)
+        (DGraphContainer.Dot.from_dot_with_commands ~packing temp_file)
     in
     view
   in
   try
     graph_window ~parent ~title make_view
-  with Dgraph.DGraphModel.DotError _ as exn ->
+  with DGRAPH_ERROR _ as exn ->
     Gui_parameters.error
       "@[cannot display dot graph:@ %s@]"
       (Printexc.to_string exn)
diff --git a/src/plugins/gui/file_manager.ml b/src/plugins/gui/file_manager.ml
index f4155bc369f6cb5f01ea5c934a8468bf75234fcf..2d67756133dcb77ec81de1ba0341d365dda9d8fe 100644
--- a/src/plugins/gui/file_manager.ml
+++ b/src/plugins/gui/file_manager.ml
@@ -59,7 +59,7 @@ let reparse (host_window: Design.main_window_extension_points) =
       host_window#reset ()
     | Some old_helt, Some () ->
       let new_helt = History.translate_history_elt old_helt in
-      Extlib.may History.push new_helt;
+      Option.iter History.push new_helt;
       host_window#reset ();
       (** The buffer is not ready yet, modification of its vadjustement
           is unreliable *)
@@ -92,9 +92,9 @@ let save_file_as (host_window: Design.main_window_extension_points) =
     (fun () ->
        match dialog#run () with
        | `SAVE ->
-         Extlib.may
+         Option.iter
            (save_in host_window (dialog :> GWindow.window_skel))
-           (Extlib.opt_map Filepath.Normalized.of_string dialog#filename)
+           (Option.map Filepath.Normalized.of_string dialog#filename)
        | `DELETE_EVENT | `CANCEL -> ());
   dialog#destroy ()
 
diff --git a/src/plugins/gui/filetree.ml b/src/plugins/gui/filetree.ml
index 69b3c42024f18b6584c06ef03d58eea1b1fa78fd..48f9fe8717e8c69848fb9326da7415b0abce54f8 100644
--- a/src/plugins/gui/filetree.ml
+++ b/src/plugins/gui/filetree.ml
@@ -22,7 +22,6 @@
 
 open Cil_types
 open Cil_datatype
-open Extlib
 open Gtk_helper
 
 (* To debug performance related to height of lines *)
@@ -296,10 +295,6 @@ module MYTREE = struct
   let comes_from_share filename =
     Filepath.is_relative ~base_name:Fc_config.datadir filename
 
-  let is_stdlib_global g =
-    Cil.hasAttribute "fc_stdlib" (Cil_datatype.Global.attr g) ||
-    Cil.hasAttribute "fc_stdlib_generated" (Cil_datatype.Global.attr g)
-
   let is_function t = match t with
     | MFile _ -> false
     | MGlobal {globals = [| g |]} -> is_function_global g
@@ -457,7 +452,7 @@ module State = struct
       let is_unused = function
         | GFun ({svar = vi},_) | GFunDecl (_, vi, _)
         | GVar (vi, _, _) | GVarDecl (vi, _) ->
-          Cil.is_unused_builtin vi
+          Cil_builtins.is_unused_builtin vi
         | _ -> false
       in
       f, Extlib.filter_out is_unused all
@@ -530,7 +525,7 @@ let make (tree_view:GTree.view) =
     in
     hide_kind g
     || (MYTREE.is_builtin_global g && hide_builtins ())
-    || (MYTREE.is_stdlib_global g && hide_stdlib ())
+    || (Cil.global_is_in_libc g && hide_stdlib ())
     || (MYTREE.is_defined_global g && hide_defined ())
     || (MYTREE.is_undefined_global g && hide_undefined ())
   in
@@ -560,10 +555,10 @@ let make (tree_view:GTree.view) =
 
   let set_row model ?strikethrough ?text (path,raw_row) =
     let row = raw_row.MODEL.finfo in
-    may
+    Option.iter
       (fun b -> (MYTREE.get_storage row).MYTREE.strikethrough <- b)
       strikethrough;
-    may (fun b -> (MYTREE.get_storage row).MYTREE.name <- b) text;
+    Option.iter (fun b -> (MYTREE.get_storage row).MYTREE.name <- b) text;
     if false then model#custom_row_changed (GTree.Path.create (List.rev path)) raw_row
   in
 
@@ -835,7 +830,7 @@ let make (tree_view:GTree.view) =
         in
         try
           let {MODEL.finfo=t} =
-            Extlib.the (model_custom#custom_get_iter path) in
+            Option.get (model_custom#custom_get_iter path) in
           let selected_node = MYTREE.storage_type t in
           let was_activated = match current_node with
             | None -> false
@@ -887,7 +882,7 @@ let make (tree_view:GTree.view) =
       expand_to_path tree_view path;
       tree_view#selection#select_path path;
       (* set_cursor updates the keyboard cursor and scrolls to the element *)
-      tree_view#set_cursor path (Extlib.the name_column);
+      tree_view#set_cursor path (Option.get name_column);
       tree_view#misc#grab_focus ()
 
     (* TODO: keep the structure of the tree, ie. reexpand all the nodes that
diff --git a/src/plugins/gui/filetree.mli b/src/plugins/gui/filetree.mli
index 0cce6d677ca3f3f1f865c35ec23fbbd4eaa7e7be..bf353c76894432e5de4c568bd0bf29869aeb681b 100644
--- a/src/plugins/gui/filetree.mli
+++ b/src/plugins/gui/filetree.mli
@@ -25,70 +25,71 @@
 type filetree_node =
   | File of Datatype.Filepath.t * Cil_types.global list
   | Global of Cil_types.global
-(** Caml type for the infos on a node of the tree. Not all globals appear
-    in the filetree. Currently, the visible ones are:
-    - functions definitions, or declarations if no definition exists
-    - global variables
-    - global annotations
-    @since Nitrogen-20111001 *)
+  (** Caml type for the infos on a node of the tree. Not all globals appear
+      in the filetree. Currently, the visible ones are:
+      - functions definitions, or declarations if no definition exists
+      - global variables
+      - global annotations
+
+      @since Nitrogen-20111001 *)
 
 class type t =  object
   method model : GTree.model
 
   method flat_mode: bool
-    (** Return [true] if the filetree currently displays all globals in
-        flat mode (all children of the same node), [false] otherwise
-        (children of the file they are declared in). If [true], the methods
-        [set_file_attribute] and [get_files_globals] must not be used
+  (** Return [true] if the filetree currently displays all globals in
+      flat mode (all children of the same node), [false] otherwise
+      (children of the file they are declared in). If [true], the methods
+      [set_file_attribute] and [get_files_globals] must not be used
 
-        @since Nitrogen-20111001  *)
+      @since Nitrogen-20111001  *)
 
   method set_file_attribute:
     ?strikethrough:bool -> ?text:string -> Datatype.Filepath.t -> unit
-    (** Manually set some attributes of the given filename. *)
+  (** Manually set some attributes of the given filename. *)
 
   method set_global_attribute:
     ?strikethrough:bool -> ?text:string -> Cil_types.varinfo -> unit
-    (** Manually set some attributes of the given variable. *)
+  (** Manually set some attributes of the given variable. *)
 
   method add_global_filter:
     text:string ->
     key:string ->
     (Cil_types.global -> bool) ->
     (unit -> bool) * GMenu.check_menu_item
-    (** [add_global_filter text key f] adds a filter for the visibility of
-        the globals, according to [f]. If any of the filters registered
-        through this method returns true, the global is not displayed in the
-        filetree. [text] is used in the filetree menu, to label the entry
-        permitting to activate or deactivate the filter. [key] is used to
-        store the current state of the filter internally. The created
-        menu is returned.
-
-        @since Nitrogen-20111001
-        @modify Oxygen-20120901 Signature change for the filter argument,
-        return the menu.
-    *)
+  (** [add_global_filter text key f] adds a filter for the visibility of
+      the globals, according to [f]. If any of the filters registered
+      through this method returns true, the global is not displayed in the
+      filetree. [text] is used in the filetree menu, to label the entry
+      permitting to activate or deactivate the filter. [key] is used to
+      store the current state of the filter internally. The created
+      menu is returned.
+
+      @since Nitrogen-20111001
+      @modify Oxygen-20120901 Signature change for the filter argument,
+      return the menu.
+  *)
 
   method get_file_globals:
     Datatype.Filepath.t -> (string * bool) list
-    (** Return the names and the attributes (currently only the strikethrough
-        property) of the globals in the file passed as argument *)
+  (** Return the names and the attributes (currently only the strikethrough
+      property) of the globals in the file passed as argument *)
 
   method find_visible_global:
     string -> Cil_types.global option
-    (** [find_visible_global str] searches for the next occurrence of a visible
-        global whose name contains [str], starting at the currently selected
-        element. Returns the global found (if any).
+  (** [find_visible_global str] searches for the next occurrence of a visible
+      global whose name contains [str], starting at the currently selected
+      element. Returns the global found (if any).
 
-        @since Magnesium-20151001 *)
+      @since Magnesium-20151001 *)
 
   method add_select_function :
     (was_activated:bool -> activating:bool -> filetree_node -> unit) -> unit
-    (** Register a callback that is called whenever an element of the file tree
-        is selected or unselected.
+  (** Register a callback that is called whenever an element of the file tree
+      is selected or unselected.
 
-        @modify Nitrogen-20111001 Changed argument from a list
-        of globals to [filetree_node] *)
+      @modify Nitrogen-20111001 Changed argument from a list
+      of globals to [filetree_node] *)
 
   method append_text_column:
     title:string ->
@@ -137,27 +138,27 @@ class type t =  object
       a [varinfo]. Returns a boolean to indicate success or failure. *)
 
   method selected_globals : Cil_types.global list
-    (** @since Carbon-20101201
-        @return the list of selected globals in the treeview. *)
+  (** @since Carbon-20101201
+      @return the list of selected globals in the treeview. *)
 
   method view : GTree.view
-    (** The tree view associated in which the file tree is packed. *)
+  (** The tree view associated in which the file tree is packed. *)
 
   method reset : unit -> unit
-    (** Resynchronize the tree view with the current project state.
-        This is called in particular by the generic reset extension of
-        {!Design} *)
+  (** Resynchronize the tree view with the current project state.
+      This is called in particular by the generic reset extension of
+      {!Design} *)
 
   method register_reset_extension : (t -> unit) -> unit
   (** Register a function to be called whenever the reset method of the
       filetree is called. *)
 
   method refresh_columns : unit -> unit
-    (** Refresh the state of all the non-source columns of the filetree,
-        by hiding those that should be hidden, and displaying the
-        others. Called by [reset]
+  (** Refresh the state of all the non-source columns of the filetree,
+      by hiding those that should be hidden, and displaying the
+      others. Called by [reset]
 
-        @since Nitrogen-20111001 *)
+      @since Nitrogen-20111001 *)
 end
 
 val make : GTree.view -> t
diff --git a/src/plugins/gui/gtk_helper.ml b/src/plugins/gui/gtk_helper.ml
index a3b75c3b14278c6dd6716074e7875c2f0885daf7..dd04ec19f44f82c7a40f6600bed43e449c53c619 100644
--- a/src/plugins/gui/gtk_helper.ml
+++ b/src/plugins/gui/gtk_helper.ml
@@ -732,7 +732,7 @@ class error_manager ?reset (o_parent:GWindow.window_skel) : host =
       let w = GWindow.message_dialog
           ~message
           ~message_type:`ERROR
-          ~parent:(Extlib.opt_conv o_parent parent)
+          ~parent:(Option.value ~default:o_parent parent)
           ~buttons:GWindow.Buttons.ok
           ~title:"Error"
           ~position:`CENTER_ALWAYS
@@ -945,7 +945,7 @@ let source_files_chooser (main_ui: source_files_chooser_host) defaults f =
           (fun () -> f (get_all ()))
       | `DELETE_EVENT | `CANCEL ->
         ());
-    Extlib.may (fun f ->
+    Option.iter (fun f ->
         Configuration.set "last_opened_dir"
           (Configuration.ConfString f)) filechooser#current_folder;
     dialog#destroy ()
diff --git a/src/plugins/gui/history.ml b/src/plugins/gui/history.ml
index eae08d177a8f6aa999d1cb579c07e85894a2cc00..56b4f7dc99f3787729d7cc91a1e67b0a4e466f73 100644
--- a/src/plugins/gui/history.ml
+++ b/src/plugins/gui/history.ml
@@ -104,7 +104,7 @@ let set_display_elt_callback f = display_elt := f
 
 let show_current () =
   let h = CurrentHistory.get () in
-  Extlib.may !display_elt h.current;
+  Option.iter !display_elt h.current;
   CurrentHistory.set h
 
 let back () =
@@ -250,7 +250,7 @@ let translate_history_elt old_helt =
   in
   let open Pretty_source in
   let open Cil_datatype in
-  let global_Global g = Extlib.opt_map (fun x -> Global x) (global g) in
+  let global_Global g = Option.map (fun x -> Global x) (global g) in
   match old_helt with
   | Global old_g -> global_Global old_g
   | Localizable (PGlobal old_g) -> global_Global old_g
diff --git a/src/plugins/gui/menu_manager.ml b/src/plugins/gui/menu_manager.ml
index 1c427ab2fd58f55e80ba60ac5c9a0abf968ff191..5d835aabd1c60aef79cff1ad0118f5bf3cae62e9 100644
--- a/src/plugins/gui/menu_manager.ml
+++ b/src/plugins/gui/menu_manager.ml
@@ -88,7 +88,7 @@ class item ?menu ?menu_item ?button group = object (self)
     match button with Some b -> Some (bt_type_as_skel b) | None -> None
 
   method add_accelerator modifier c =
-    Extlib.may
+    Option.iter
       (fun (i : GMenu.menu_item_skel) ->
          i#add_accelerator
            ~group ~flags:[ `VISIBLE ] ~modi:[ modifier ] (int_of_char c)) 
@@ -138,11 +138,11 @@ class menu_manager ?packing ~host:(_:Gtk_helper.host) =
       let items = self#add_entries ?title (snd debug_item_and_menu) entries in
       let action item =
         if show () then begin
-          Extlib.may (fun i -> i#misc#show ()) item#menu_item;
-          Extlib.may (fun i -> i#misc#show ()) item#tool_button
+          Option.iter (fun i -> i#misc#show ()) item#menu_item;
+          Option.iter (fun i -> i#misc#show ()) item#tool_button
         end else begin
-          Extlib.may (fun i -> i#misc#hide ()) item#menu_item;
-          Extlib.may (fun i -> i#misc#hide ()) item#tool_button
+          Option.iter (fun i -> i#misc#hide ()) item#menu_item;
+          Option.iter (fun i -> i#misc#hide ()) item#tool_button
         end
       in
       let l = List.rev debug_actions in
diff --git a/src/plugins/gui/pretty_source.ml b/src/plugins/gui/pretty_source.ml
index fae7a1f6c75b9dad6da3f7d676e01af913aca608..91255b5d6f2a4565d67d889f5f9e2206b079970a 100644
--- a/src/plugins/gui/pretty_source.ml
+++ b/src/plugins/gui/pretty_source.ml
@@ -477,7 +477,7 @@ class pos_to_localizable =
         | _ -> false
       in
       if not skip then
-        self#add_range (Stmt.loc s) (PStmt (Extlib.the self#current_kf, s));
+        self#add_range (Stmt.loc s) (PStmt (Option.get self#current_kf, s));
       begin
         match s.skind with
         | If (exp, _, _, _) ->
diff --git a/src/plugins/gui/project_manager.ml b/src/plugins/gui/project_manager.ml
index 27bb43daed33d3205ac8c3fe78cf4771221bdae2..898ffd30bded03fbef06161f90088a1d81bd92c1 100644
--- a/src/plugins/gui/project_manager.ml
+++ b/src/plugins/gui/project_manager.ml
@@ -100,9 +100,9 @@ let save_project_as (main_ui: Design.main_window_extension_points) project =
     (fun () ->
        match dialog#run () with
        | `SAVE ->
-           Extlib.may
+           Option.iter
              (save_in main_ui (dialog :> GWindow.window_skel) project)
-             (Extlib.opt_map Filepath.Normalized.of_string dialog#filename)
+             (Option.map Filepath.Normalized.of_string dialog#filename)
        | `DELETE_EVENT | `CANCEL -> ());
   dialog#destroy ()
 
diff --git a/src/plugins/gui/property_navigator.ml b/src/plugins/gui/property_navigator.ml
index e2f62844d00d39aac3e2c09cc96e44f7b8138d3e..4ccc7150ee34e5fd96239908e934d25f9e3e9ab8 100644
--- a/src/plugins/gui/property_navigator.ml
+++ b/src/plugins/gui/property_navigator.ml
@@ -675,7 +675,7 @@ let make_panel (main_ui:main_window_extension_points) =
     | Consolidation.Unknown_but_dead _ -> dead.get ()
     | Consolidation.Inconsistent _ -> inconsistent.get ()
   in
-  let visible_status = Extlib.may_map visible_status_aux ~dft:true in
+  let visible_status = Option.fold ~some:visible_status_aux ~none:true in
   let fill_model () =
     let add_ip ip =
       if visible ip then
@@ -688,7 +688,7 @@ let make_panel (main_ui:main_window_extension_points) =
 
     (* Will the results for this kf be ultimately displayed *)
     let display kf =
-      not (Cil.is_unused_builtin (Kernel_function.get_vi kf)) &&
+      not (Cil_builtins.is_unused_builtin (Kernel_function.get_vi kf)) &&
       not (onlyCurrent.get ()) ||
       (let kfvi = Kernel_function.get_vi kf in
        List.exists
diff --git a/src/plugins/gui/source_viewer.ml b/src/plugins/gui/source_viewer.ml
index fa698fec8dd59b54fb0000447c49695434eae8ff..d1516cd81f3a84bd0f391a60308ba45385251bdf 100644
--- a/src/plugins/gui/source_viewer.ml
+++ b/src/plugins/gui/source_viewer.ml
@@ -55,7 +55,7 @@ let make ?name ~packing () =
       in
       original_source_window#set_marker_pixbuf "warning" pixbuf; *)
   original_source_window#misc#modify_font_by_name "Monospace";
-  original_source_window#misc#set_name (Extlib.opt_conv "source" name);
+  original_source_window#misc#set_name (Option.value ~default:"source" name);
   let original_source_buffer = original_source_window#source_buffer in
   set_language_to_C original_source_buffer;
 (*
diff --git a/src/plugins/impact/compute_impact.ml b/src/plugins/impact/compute_impact.ml
index dba1040204e24e481ed931b1d1c7edd7ba3851b0..001e77b06c1860df2c8dd5c4407c9055023d6858 100644
--- a/src/plugins/impact/compute_impact.ml
+++ b/src/plugins/impact/compute_impact.ml
@@ -673,7 +673,7 @@ let nodes_to_stmts ns =
     (* Do not generate a list immediately, some nodes would be duplicated *)
     NS.fold
       (fun (n, _z) acc ->
-        Extlib.may_map ~dft:acc (fun s -> Stmt.Set.add s acc) (get_stmt n)
+        Option.fold ~none:acc ~some:(fun s -> Stmt.Set.add s acc) (get_stmt n)
       ) ns  Stmt.Set.empty
   in
   Stmt.Set.elements set
diff --git a/src/plugins/inout/derefs.ml b/src/plugins/inout/derefs.ml
index e321993b1f00aea074068129cdc9533ab608f521..4cc972c9bfa94669b66323bb16d31f7ca5e8bdf3 100644
--- a/src/plugins/inout/derefs.ml
+++ b/src/plugins/inout/derefs.ml
@@ -41,7 +41,7 @@ class virtual do_it_ = object(self)
       | Var _ -> ()
       | Mem e ->
           let state =
-            Db.Value.get_state (Kstmt (Extlib.the self#current_stmt))
+            Db.Value.get_state (Kstmt (Option.get self#current_stmt))
           in
           let r = !Db.Value.eval_expr state e in
           let loc = loc_bytes_to_loc_bits r in
diff --git a/src/plugins/inout/inputs.ml b/src/plugins/inout/inputs.ml
index f5e2133a8259257fd59f1604d6764f59e8a3dfd9..653f28e727341308d379798bf943e7834ee973f8 100644
--- a/src/plugins/inout/inputs.ml
+++ b/src/plugins/inout/inputs.ml
@@ -109,7 +109,7 @@ class virtual do_it_ = object(self)
         Cil.SkipChildren
 
       | Call (lv_opt,exp,args,_) ->
-        Extlib.may self#do_assign lv_opt;
+        Option.iter self#do_assign lv_opt;
         self#do_arg_calls exp args;
         Cil.SkipChildren
       | Local_init(v, ConsInit(f, args, Plain_func), _) ->
diff --git a/src/plugins/instantiate/basic_blocks.ml b/src/plugins/instantiate/basic_blocks.ml
index 744917afbad2aef97acbe6cf1e75c29ba33873a0..87f9f09c8791f66d593e0ea00dc3f892978f25c5 100644
--- a/src/plugins/instantiate/basic_blocks.ml
+++ b/src/plugins/instantiate/basic_blocks.ml
@@ -257,7 +257,7 @@ and pall_fields_pred ?loc ?(flex_mem_len=None) depth t1 ci pred =
     | [ x ] -> [ eq flex_mem_len x ]
     | x :: l -> let x' = eq None x in x' :: (eqs_fields l)
   in
-  pands (eqs_fields ci.cfields)
+  pands (eqs_fields (Option.get ci.cfields))
 
 let punfold_flexible_struct_pred ?loc the_struct bytes_len pred =
   let struct_len = tinteger ?loc (sizeof the_struct.term_type) in
@@ -265,7 +265,7 @@ let punfold_flexible_struct_pred ?loc the_struct bytes_len pred =
     | Ctype(TComp(ci, _, _) as t) when Cil.has_flexible_array_member t -> ci
     | _ -> Options.fatal "Unfolding flexible on a non flexible structure"
   in
-  let flex_type = Ctype (Extlib.last ci.cfields).ftype in
+  let flex_type = Ctype (Extlib.last (Option.get ci.cfields)).ftype in
   let flex_len = tminus bytes_len struct_len in
   let pall_fields_pred len =
     pall_fields_pred ?loc ~flex_mem_len:(Some len) 0 the_struct ci pred
diff --git a/src/plugins/instantiate/instantiator_builder.ml b/src/plugins/instantiate/instantiator_builder.ml
index 74242ed7bb5f1a50f2fbde264954abda3404141e..e700239c933ccda3c281059325354f4fd794ebed 100644
--- a/src/plugins/instantiate/instantiator_builder.ml
+++ b/src/plugins/instantiate/instantiator_builder.ml
@@ -50,7 +50,6 @@ module type Instantiator = sig
 end
 
 let build_body caller callee args_generator =
-  let open Extlib in
   let loc  = Cil_datatype.Location.unknown in
   let ret_var = match Cil.getReturnType caller.svar.vtype with
     | t when Cil.isVoidType t -> None
@@ -59,10 +58,10 @@ let build_body caller callee args_generator =
   let call =
     let args = List.map Cil.evar caller.sformals in
     let args = args_generator args in
-    Cil.mkStmt (Instr(call_function (opt_map Cil.var ret_var) callee args))
+    Cil.mkStmt (Instr(call_function (Option.map Cil.var ret_var) callee args))
   in
-  let ret = Cil.mkStmt (Return ( (opt_map Cil.evar ret_var), loc)) in
-  { (Cil.mkBlock [call ; ret]) with blocals = list_of_opt ret_var }
+  let ret = Cil.mkStmt (Return (Option.map Cil.evar ret_var, loc)) in
+  { (Cil.mkBlock [call ; ret]) with blocals = Option.to_list ret_var }
 
 module Make_instantiator (G: Generator_sig) = struct
   include G
diff --git a/src/plugins/instantiate/stdlib/basic_alloc.ml b/src/plugins/instantiate/stdlib/basic_alloc.ml
index 42142cc28c44a5064df718b6d0499850aff7bca7..f2d749c5442aac162cd5325a85374f66f6a313c5 100644
--- a/src/plugins/instantiate/stdlib/basic_alloc.ml
+++ b/src/plugins/instantiate/stdlib/basic_alloc.ml
@@ -30,7 +30,7 @@ let unexpected = Options.fatal "Stdlib.Basic_alloc: unexpected: %s"
 let valid_size ?loc typ size =
   let p = match typ with
     | TComp (ci, _, _) when Cil.has_flexible_array_member typ ->
-      let elem = match (last ci.cfields).ftype with
+      let elem = match (last (Option.value ~default:[] ci.cfields)).ftype with
         | TArray(t, _ , _, _) -> tinteger ?loc (Cil.bytesSizeOf t)
         | _ -> unexpected "non array last field on flexible structure"
       in
@@ -73,11 +73,8 @@ let make_axiomatic_is_allocable loc () =
   let lv_i = Cil_const.make_logic_var_quant "i" Linteger in
   let t_i = tvar lv_i in
   let zero = tinteger 0 in
-  let max =
-    tinteger
-      (Integer.to_int
-         (Cil.max_unsigned_number (Cil.bitsSizeOf (size_t ()))))
-  in
+  let max_value = Cil.max_unsigned_number (Cil.bitsSizeOf (size_t ())) in
+  let max = term ~loc (TConst (Integer (max_value, None))) Linteger in
   let label = FormalLabel("L") in
   let cond = pand (prel (Rlt, t_i, zero), prel (Rgt, t_i, max)) in
   let app = pnot (papp (is_allocable,[label],[t_i])) in
diff --git a/src/plugins/instantiate/stdlib/calloc.ml b/src/plugins/instantiate/stdlib/calloc.ml
index cebc53197c970139cab11bfd44936719ff4518cb..443804eb044e4421e57b327092a23c65cf12c176 100644
--- a/src/plugins/instantiate/stdlib/calloc.ml
+++ b/src/plugins/instantiate/stdlib/calloc.ml
@@ -59,7 +59,7 @@ let generate_requires ?loc alloc_type num size =
     else
       None
   in
-  [ valid_size ?loc alloc_type size ] @ (Extlib.list_of_opt only_one)
+  [ valid_size ?loc alloc_type size ] @ (Option.to_list only_one)
 
 let pinitialized_len ?loc alloc_type num size =
   let result = tresult ?loc (ptr_of alloc_type) in
diff --git a/src/plugins/instantiate/string/mem_utils.ml b/src/plugins/instantiate/string/mem_utils.ml
index de076b1e3c029f90e6ab4698b6ffe971b07c369b..200e3f1e37eb746fb20475ec3a73c83087a810de 100644
--- a/src/plugins/instantiate/string/mem_utils.ml
+++ b/src/plugins/instantiate/string/mem_utils.ml
@@ -136,7 +136,7 @@ struct
         | _, (CPtr | Ptr), _ -> exp_type_of_pointed e
         | _, Data _ , _ -> Value_of (Cil.typeOf e)
       in
-      let lvt = Extlib.opt_map Cil.typeOfLval lval in
+      let lvt = Option.map Cil.typeOfLval lval in
       let pts = List.map2 extract args ps in
       let is_no_pointed = function No_pointed -> true | _ -> false in
       let the_typ = function
diff --git a/src/plugins/instantiate/string/memset.ml b/src/plugins/instantiate/string/memset.ml
index 1538ba32be03820bce1499f1dc1d25cdc35be6ff..92c47cab940c34d00e779f4c8f4e02a71e6f304e 100644
--- a/src/plugins/instantiate/string/memset.ml
+++ b/src/plugins/instantiate/string/memset.ml
@@ -139,9 +139,8 @@ let generate_requires loc ptr value len =
     ])
 
 let generate_assigns loc t ptr value len =
-  let open Extlib in
   let ptr_range = new_identified_term (tunref_range_bytes_len ~loc ptr len) in
-  let value = list_of_opt (opt_map new_identified_term value) in
+  let value = Option.to_list (Option.map new_identified_term value) in
   let set = ptr_range, From value in
   let result = new_identified_term (tresult t) in
   let res = result, From [ new_identified_term ptr ] in
@@ -172,7 +171,7 @@ let generate_spec (_t, e) { svar = vi } loc =
   let t = cptr.vtype in
   let ptr = cvar_to_tvar cptr in
   let len = cvar_to_tvar clen in
-  let value = Extlib.opt_map cvar_to_tvar cvalue in
+  let value = Option.map cvar_to_tvar cvalue in
   let requires = generate_requires loc ptr value len in
   let assigns  = generate_assigns loc t ptr value len in
   let ensures  = generate_ensures e loc t ptr value len in
@@ -189,7 +188,7 @@ let rec contains_union_type t =
   match Cil.unrollType t with
   | TComp({ cstruct = false }, _, _) ->
     true
-  | TComp({ cfields = fields }, _, _) ->
+  | TComp({ cfields = Some fields }, _, _) ->
     List.exists contains_union_type (List.map (fun f -> f.ftype) fields)
   | TArray(t, _, _, _) ->
     contains_union_type t
diff --git a/src/plugins/instantiate/tests/stdlib/no_fc_stdlib.c b/src/plugins/instantiate/tests/stdlib/no_fc_stdlib.c
index 21498c2ef2b5ab29516316267bc33c5af6d46bbd..81ef28cf12683af085eef8f39248f5526e97fb2d 100644
--- a/src/plugins/instantiate/tests/stdlib/no_fc_stdlib.c
+++ b/src/plugins/instantiate/tests/stdlib/no_fc_stdlib.c
@@ -9,4 +9,4 @@ void foo(void){
   int * q = calloc(2, sizeof(int));
   free(p);
   free(q);
-}
\ No newline at end of file
+}
diff --git a/src/plugins/instantiate/tests/stdlib/oracle/calloc.res.oracle b/src/plugins/instantiate/tests/stdlib/oracle/calloc.res.oracle
index 29b8fdd24bf84252e3020ae64d0681783769ae8d..ad3d5682dafb37f1db2a6bedd46f369697dacf81 100644
--- a/src/plugins/instantiate/tests/stdlib/oracle/calloc.res.oracle
+++ b/src/plugins/instantiate/tests/stdlib/oracle/calloc.res.oracle
@@ -298,17 +298,17 @@ int *calloc_int(size_t num, size_t size)
 int main(void)
 {
   int __retres;
-  int *pi = calloc_int((unsigned int)10,sizeof(int));
-  enum E *pe = calloc_e_E((unsigned int)10,sizeof(enum E));
-  float *pf = calloc_float((unsigned int)10,sizeof(float));
-  struct X *px = calloc_st_X((unsigned int)10,sizeof(struct X));
-  char *pc = calloc_char((unsigned int)10,sizeof(char));
-  int (*pa)[10] = calloc_arr10_int((unsigned int)10,sizeof(int [10]));
+  int *pi = calloc_int((unsigned long)10,sizeof(int));
+  enum E *pe = calloc_e_E((unsigned long)10,sizeof(enum E));
+  float *pf = calloc_float((unsigned long)10,sizeof(float));
+  struct X *px = calloc_st_X((unsigned long)10,sizeof(struct X));
+  char *pc = calloc_char((unsigned long)10,sizeof(char));
+  int (*pa)[10] = calloc_arr10_int((unsigned long)10,sizeof(int [10]));
   struct Flex *f =
-    calloc_st_Flex((unsigned int)1,
-                   sizeof(struct Flex) + (unsigned int)3 * sizeof(int));
-  void *v = calloc((unsigned int)10,sizeof(char));
-  struct incomplete *inc = calloc((unsigned int)10,(unsigned int)10);
+    calloc_st_Flex((unsigned long)1,
+                   sizeof(struct Flex) + (unsigned long)3 * sizeof(int));
+  void *v = calloc((unsigned long)10,sizeof(char));
+  struct incomplete *inc = calloc((unsigned long)10,(unsigned long)10);
   __retres = 0;
   return __retres;
 }
@@ -617,17 +617,17 @@ int *calloc_int(size_t num, size_t size)
 int main(void)
 {
   int __retres;
-  int *pi = calloc_int((unsigned int)10,sizeof(int));
-  enum E *pe = calloc_e_E((unsigned int)10,sizeof(enum E));
-  float *pf = calloc_float((unsigned int)10,sizeof(float));
-  struct X *px = calloc_st_X((unsigned int)10,sizeof(struct X));
-  char *pc = calloc_char((unsigned int)10,sizeof(char));
-  int (*pa)[10] = calloc_arr10_int((unsigned int)10,sizeof(int [10]));
+  int *pi = calloc_int((unsigned long)10,sizeof(int));
+  enum E *pe = calloc_e_E((unsigned long)10,sizeof(enum E));
+  float *pf = calloc_float((unsigned long)10,sizeof(float));
+  struct X *px = calloc_st_X((unsigned long)10,sizeof(struct X));
+  char *pc = calloc_char((unsigned long)10,sizeof(char));
+  int (*pa)[10] = calloc_arr10_int((unsigned long)10,sizeof(int [10]));
   struct Flex *f =
-    calloc_st_Flex((unsigned int)1,
-                   sizeof(struct Flex) + (unsigned int)3 * sizeof(int));
-  void *v = calloc((unsigned int)10,sizeof(char));
-  struct incomplete *inc = calloc((unsigned int)10,(unsigned int)10);
+    calloc_st_Flex((unsigned long)1,
+                   sizeof(struct Flex) + (unsigned long)3 * sizeof(int));
+  void *v = calloc((unsigned long)10,sizeof(char));
+  struct incomplete *inc = calloc((unsigned long)10,(unsigned long)10);
   __retres = 0;
   return __retres;
 }
diff --git a/src/plugins/instantiate/tests/stdlib/oracle/malloc.res.oracle b/src/plugins/instantiate/tests/stdlib/oracle/malloc.res.oracle
index 988a5aeae159b8f41b8b1473947f5b00dfe6fc67..0cb681b042f0cf0427350ba68efdd26ac63ed7c6 100644
--- a/src/plugins/instantiate/tests/stdlib/oracle/malloc.res.oracle
+++ b/src/plugins/instantiate/tests/stdlib/oracle/malloc.res.oracle
@@ -202,15 +202,15 @@ int *malloc_int(size_t size)
 int main(void)
 {
   int __retres;
-  int *pi = malloc_int(sizeof(int) * (unsigned int)10);
-  float *pf = malloc_float(sizeof(float) * (unsigned int)10);
-  struct X *px = malloc_st_X(sizeof(struct X) * (unsigned int)10);
-  char *pc = malloc_char((unsigned int)10);
-  int (*pa)[10] = malloc_arr10_int(sizeof(int [10]) * (unsigned int)10);
+  int *pi = malloc_int(sizeof(int) * (unsigned long)10);
+  float *pf = malloc_float(sizeof(float) * (unsigned long)10);
+  struct X *px = malloc_st_X(sizeof(struct X) * (unsigned long)10);
+  char *pc = malloc_char((unsigned long)10);
+  int (*pa)[10] = malloc_arr10_int(sizeof(int [10]) * (unsigned long)10);
   struct Flex *f =
-    malloc_st_Flex(sizeof(struct Flex) + (unsigned int)3 * sizeof(int));
-  void *v = malloc(sizeof(char) * (unsigned int)10);
-  struct incomplete *inc = malloc((unsigned int)10);
+    malloc_st_Flex(sizeof(struct Flex) + (unsigned long)3 * sizeof(int));
+  void *v = malloc(sizeof(char) * (unsigned long)10);
+  struct incomplete *inc = malloc((unsigned long)10);
   __retres = 0;
   return __retres;
 }
@@ -418,15 +418,15 @@ int *malloc_int(size_t size)
 int main(void)
 {
   int __retres;
-  int *pi = malloc_int(sizeof(int) * (unsigned int)10);
-  float *pf = malloc_float(sizeof(float) * (unsigned int)10);
-  struct X *px = malloc_st_X(sizeof(struct X) * (unsigned int)10);
-  char *pc = malloc_char((unsigned int)10);
-  int (*pa)[10] = malloc_arr10_int(sizeof(int [10]) * (unsigned int)10);
+  int *pi = malloc_int(sizeof(int) * (unsigned long)10);
+  float *pf = malloc_float(sizeof(float) * (unsigned long)10);
+  struct X *px = malloc_st_X(sizeof(struct X) * (unsigned long)10);
+  char *pc = malloc_char((unsigned long)10);
+  int (*pa)[10] = malloc_arr10_int(sizeof(int [10]) * (unsigned long)10);
   struct Flex *f =
-    malloc_st_Flex(sizeof(struct Flex) + (unsigned int)3 * sizeof(int));
-  void *v = malloc(sizeof(char) * (unsigned int)10);
-  struct incomplete *inc = malloc((unsigned int)10);
+    malloc_st_Flex(sizeof(struct Flex) + (unsigned long)3 * sizeof(int));
+  void *v = malloc(sizeof(char) * (unsigned long)10);
+  struct incomplete *inc = malloc((unsigned long)10);
   __retres = 0;
   return __retres;
 }
diff --git a/src/plugins/instantiate/tests/stdlib/oracle/no_fc_stdlib.res.oracle b/src/plugins/instantiate/tests/stdlib/oracle/no_fc_stdlib.res.oracle
index ecaf57dd07748e3d2b8f14de95ba2b3ff5fe6756..3a7114834895f05ac63ec97e7339811b5df1dd7c 100644
--- a/src/plugins/instantiate/tests/stdlib/oracle/no_fc_stdlib.res.oracle
+++ b/src/plugins/instantiate/tests/stdlib/oracle/no_fc_stdlib.res.oracle
@@ -9,7 +9,7 @@ axiomatic dynamic_allocation {
     reads __fc_heap_status;
   
   axiom never_allocable{L}:
-    ∀ ℤ i; i < 0 ∧ i > 4294967295 ⇒ ¬is_allocable(i);
+    ∀ ℤ i; i < 0 ∧ i > 18446744073709551615 ⇒ ¬is_allocable(i);
   
   }
 
@@ -117,7 +117,7 @@ int *malloc_int(size_t size)
 void foo(void)
 {
   int *p = malloc_int(sizeof(int));
-  int *q = calloc_int((unsigned int)2,sizeof(int));
+  int *q = calloc_int((unsigned long)2,sizeof(int));
   free_int(p);
   free_int(q);
   return;
@@ -135,7 +135,7 @@ axiomatic dynamic_allocation {
     reads __fc_heap_status;
   
   axiom never_allocable{L}:
-    ∀ ℤ i; i < 0 ∧ i > 4294967295 ⇒ ¬is_allocable(i);
+    ∀ ℤ i; i < 0 ∧ i > 18446744073709551615 ⇒ ¬is_allocable(i);
   
   }
 
@@ -244,7 +244,7 @@ int *malloc_int(size_t size)
 void foo(void)
 {
   int *p = malloc_int(sizeof(int));
-  int *q = calloc_int((unsigned int)2,sizeof(int));
+  int *q = calloc_int((unsigned long)2,sizeof(int));
   free_int(p);
   free_int(q);
   return;
diff --git a/src/plugins/instantiate/tests/string/oracle/memcmp.res.oracle b/src/plugins/instantiate/tests/string/oracle/memcmp.res.oracle
index 0aefc17a642399c76faabbaa837b5069fe62dd57..9fa06222300bf4a1110a300514cb1c086b84580c 100644
--- a/src/plugins/instantiate/tests/string/oracle/memcmp.res.oracle
+++ b/src/plugins/instantiate/tests/string/oracle/memcmp.res.oracle
@@ -42,14 +42,14 @@ int memcmp_int(int const *s1, int const *s2, size_t len)
 int integer(int * /*[10]*/ s1, int * /*[10]*/ s2)
 {
   int tmp;
-  tmp = memcmp_int(s1,s2,(unsigned int)10 * sizeof(int));
+  tmp = memcmp_int(s1,s2,(unsigned long)10 * sizeof(int));
   return tmp;
 }
 
 int with_named(named * /*[10]*/ s1, named * /*[10]*/ s2)
 {
   int tmp;
-  tmp = memcmp_int(s1,s2,(unsigned int)10 * sizeof(named));
+  tmp = memcmp_int(s1,s2,(unsigned long)10 * sizeof(named));
   return tmp;
 }
 
@@ -80,26 +80,26 @@ int memcmp_st_X(struct X const *s1, struct X const *s2, size_t len)
 int structure(struct X * /*[10]*/ s1, struct X * /*[10]*/ s2)
 {
   int tmp;
-  tmp = memcmp_st_X(s1,s2,(unsigned int)10 * sizeof(struct X));
+  tmp = memcmp_st_X(s1,s2,(unsigned long)10 * sizeof(struct X));
   return tmp;
 }
 
-/*@ requires aligned_end: len % 4 ≡ 0;
+/*@ requires aligned_end: len % 8 ≡ 0;
     requires
       valid_read_s1:
-        \let __fc_len = len / 4; \valid_read(s1 + (0 .. __fc_len - 1));
+        \let __fc_len = len / 8; \valid_read(s1 + (0 .. __fc_len - 1));
     requires
       valid_read_s2:
-        \let __fc_len = len / 4; \valid_read(s2 + (0 .. __fc_len - 1));
+        \let __fc_len = len / 8; \valid_read(s2 + (0 .. __fc_len - 1));
     ensures
       equals:
-        \let __fc_len = len / 4;
+        \let __fc_len = len / 8;
           \result ≡ 0 ⇔
           (∀ ℤ j0; 0 ≤ j0 < __fc_len ⇒ *(s1 + j0) ≡ *(s2 + j0));
     assigns \result;
     assigns \result
-      \from (indirect: *(s1 + (0 .. len / 4 - 1))),
-            (indirect: *(s2 + (0 .. len / 4 - 1)));
+      \from (indirect: *(s1 + (0 .. len / 8 - 1))),
+            (indirect: *(s2 + (0 .. len / 8 - 1)));
  */
 int memcmp_ptr_int(int * const *s1, int * const *s2, size_t len)
 {
@@ -111,7 +111,7 @@ int memcmp_ptr_int(int * const *s1, int * const *s2, size_t len)
 int pointers(int ** /*[10]*/ s1, int ** /*[10]*/ s2)
 {
   int tmp;
-  tmp = memcmp_ptr_int(s1,s2,(unsigned int)10 * sizeof(int *));
+  tmp = memcmp_ptr_int(s1,s2,(unsigned long)10 * sizeof(int *));
   return tmp;
 }
 
@@ -145,32 +145,32 @@ int memcmp_arr10_int(int const (*s1)[10], int const (*s2)[10], size_t len)
 int nested(int (*s1)[10], int (*s2)[10], int n)
 {
   int tmp;
-  tmp = memcmp_arr10_int(s1,s2,(unsigned int)n * sizeof(int [10]));
+  tmp = memcmp_arr10_int(s1,s2,(unsigned long)n * sizeof(int [10]));
   return tmp;
 }
 
 int with_void(void *s1, void *s2, int n)
 {
   int tmp;
-  tmp = memcmp((void const *)s1,(void const *)s2,(unsigned int)10);
+  tmp = memcmp((void const *)s1,(void const *)s2,(unsigned long)10);
   return tmp;
 }
 
 int with_incomplete(struct incomplete *s1, struct incomplete *s2, int n)
 {
   int tmp;
-  tmp = memcmp((void const *)s1,(void const *)s2,(unsigned int)n);
+  tmp = memcmp((void const *)s1,(void const *)s2,(unsigned long)n);
   return tmp;
 }
 
 void with_null_or_int(int * /*[10]*/ p)
 {
-  memcmp((void const *)0,(void const *)p,(unsigned int)10 * sizeof(int));
-  memcmp((void const *)p,(void const *)0,(unsigned int)10 * sizeof(int));
+  memcmp((void const *)0,(void const *)p,(unsigned long)10 * sizeof(int));
+  memcmp((void const *)p,(void const *)0,(unsigned long)10 * sizeof(int));
   memcmp((void const *)((int const *)42),(void const *)p,
-         (unsigned int)10 * sizeof(int));
+         (unsigned long)10 * sizeof(int));
   memcmp((void const *)p,(void const *)((int const *)42),
-         (unsigned int)10 * sizeof(int));
+         (unsigned long)10 * sizeof(int));
   return;
 }
 
@@ -215,7 +215,7 @@ int integer(int *s1, int *s2)
 {
   int tmp;
   tmp = memcmp_int((int const *)s1,(int const *)s2,
-                   (unsigned int)10 * sizeof(int));
+                   (unsigned long)10 * sizeof(int));
   return tmp;
 }
 
@@ -223,7 +223,7 @@ int with_named(named *s1, named *s2)
 {
   int tmp;
   tmp = memcmp_int((int const *)s1,(int const *)s2,
-                   (unsigned int)10 * sizeof(named));
+                   (unsigned long)10 * sizeof(named));
   return tmp;
 }
 
@@ -256,27 +256,27 @@ int structure(struct X *s1, struct X *s2)
 {
   int tmp;
   tmp = memcmp_st_X((struct X const *)s1,(struct X const *)s2,
-                    (unsigned int)10 * sizeof(struct X));
+                    (unsigned long)10 * sizeof(struct X));
   return tmp;
 }
 
-/*@ requires aligned_end: len % 4 ≡ 0;
+/*@ requires aligned_end: len % 8 ≡ 0;
     requires
       valid_read_s1:
-        \let __fc_len = len / 4; \valid_read(s1 + (0 .. __fc_len - 1));
+        \let __fc_len = len / 8; \valid_read(s1 + (0 .. __fc_len - 1));
     requires
       valid_read_s2:
-        \let __fc_len = len / 4; \valid_read(s2 + (0 .. __fc_len - 1));
+        \let __fc_len = len / 8; \valid_read(s2 + (0 .. __fc_len - 1));
     ensures
       equals:
-        \let __fc_len = \old(len) / 4;
+        \let __fc_len = \old(len) / 8;
           \result ≡ 0 ⇔
           (∀ ℤ j0;
              0 ≤ j0 < __fc_len ⇒ *(\old(s1) + j0) ≡ *(\old(s2) + j0));
     assigns \result;
     assigns \result
-      \from (indirect: *(s1 + (0 .. len / 4 - 1))),
-            (indirect: *(s2 + (0 .. len / 4 - 1)));
+      \from (indirect: *(s1 + (0 .. len / 8 - 1))),
+            (indirect: *(s2 + (0 .. len / 8 - 1)));
  */
 int memcmp_ptr_int(int * const *s1, int * const *s2, size_t len)
 {
@@ -289,7 +289,7 @@ int pointers(int **s1, int **s2)
 {
   int tmp;
   tmp = memcmp_ptr_int((int * const *)s1,(int * const *)s2,
-                       (unsigned int)10 * sizeof(int *));
+                       (unsigned long)10 * sizeof(int *));
   return tmp;
 }
 
@@ -325,32 +325,32 @@ int nested(int (*s1)[10], int (*s2)[10], int n)
 {
   int tmp;
   tmp = memcmp_arr10_int((int const (*)[10])s1,(int const (*)[10])s2,
-                         (unsigned int)n * sizeof(int [10]));
+                         (unsigned long)n * sizeof(int [10]));
   return tmp;
 }
 
 int with_void(void *s1, void *s2, int n)
 {
   int tmp;
-  tmp = memcmp((void const *)s1,(void const *)s2,(unsigned int)10);
+  tmp = memcmp((void const *)s1,(void const *)s2,(unsigned long)10);
   return tmp;
 }
 
 int with_incomplete(struct incomplete *s1, struct incomplete *s2, int n)
 {
   int tmp;
-  tmp = memcmp((void const *)s1,(void const *)s2,(unsigned int)n);
+  tmp = memcmp((void const *)s1,(void const *)s2,(unsigned long)n);
   return tmp;
 }
 
 void with_null_or_int(int *p)
 {
-  memcmp((void const *)0,(void const *)p,(unsigned int)10 * sizeof(int));
-  memcmp((void const *)p,(void const *)0,(unsigned int)10 * sizeof(int));
+  memcmp((void const *)0,(void const *)p,(unsigned long)10 * sizeof(int));
+  memcmp((void const *)p,(void const *)0,(unsigned long)10 * sizeof(int));
   memcmp((void const *)((int const *)42),(void const *)p,
-         (unsigned int)10 * sizeof(int));
+         (unsigned long)10 * sizeof(int));
   memcmp((void const *)p,(void const *)((int const *)42),
-         (unsigned int)10 * sizeof(int));
+         (unsigned long)10 * sizeof(int));
   return;
 }
 
diff --git a/src/plugins/instantiate/tests/string/oracle/memcpy.res.oracle b/src/plugins/instantiate/tests/string/oracle/memcpy.res.oracle
index 40671d2df8840e9665a4a13a03b596a53b97f8de..fab9c960a7f3a8bebb33fb4645ba44ea1256c1a6 100644
--- a/src/plugins/instantiate/tests/string/oracle/memcpy.res.oracle
+++ b/src/plugins/instantiate/tests/string/oracle/memcpy.res.oracle
@@ -45,15 +45,15 @@ int *memcpy_int(int *dest, int const *src, size_t len)
 
 void integer(int * /*[10]*/ src, int * /*[10]*/ dest)
 {
-  int *res = memcpy_int(dest,src,(unsigned int)10 * sizeof(int));
-  memcpy_int(src,res,(unsigned int)10 * sizeof(int));
+  int *res = memcpy_int(dest,src,(unsigned long)10 * sizeof(int));
+  memcpy_int(src,res,(unsigned long)10 * sizeof(int));
   return;
 }
 
 void with_named(named * /*[10]*/ src, named * /*[10]*/ dest)
 {
-  named *res = memcpy_int(dest,src,(unsigned int)10 * sizeof(named));
-  memcpy_int(src,res,(unsigned int)10 * sizeof(named));
+  named *res = memcpy_int(dest,src,(unsigned long)10 * sizeof(named));
+  memcpy_int(src,res,(unsigned long)10 * sizeof(named));
   return;
 }
 
@@ -85,28 +85,28 @@ struct X *memcpy_st_X(struct X *dest, struct X const *src, size_t len)
 
 void structure(struct X * /*[10]*/ src, struct X * /*[10]*/ dest)
 {
-  struct X *res = memcpy_st_X(dest,src,(unsigned int)10 * sizeof(struct X));
-  memcpy_st_X(src,res,(unsigned int)10 * sizeof(struct X));
+  struct X *res = memcpy_st_X(dest,src,(unsigned long)10 * sizeof(struct X));
+  memcpy_st_X(src,res,(unsigned long)10 * sizeof(struct X));
   return;
 }
 
 /*@ requires
       separation:
-        \let __fc_len = len / 4;
+        \let __fc_len = len / 8;
           \separated(dest + (0 .. __fc_len - 1), src + (0 .. __fc_len - 1));
-    requires aligned_end: len % 4 ≡ 0;
+    requires aligned_end: len % 8 ≡ 0;
     requires
-      valid_dest: \let __fc_len = len / 4; \valid(dest + (0 .. __fc_len - 1));
+      valid_dest: \let __fc_len = len / 8; \valid(dest + (0 .. __fc_len - 1));
     requires
       valid_read_src:
-        \let __fc_len = len / 4; \valid_read(src + (0 .. __fc_len - 1));
+        \let __fc_len = len / 8; \valid_read(src + (0 .. __fc_len - 1));
     ensures
       copied:
-        \let __fc_len = len / 4;
+        \let __fc_len = len / 8;
         ∀ ℤ j0; 0 ≤ j0 < __fc_len ⇒ *(dest + j0) ≡ *(src + j0);
     ensures result: \result ≡ dest;
-    assigns *(dest + (0 .. len / 4 - 1)), \result;
-    assigns *(dest + (0 .. len / 4 - 1)) \from *(src + (0 .. len / 4 - 1));
+    assigns *(dest + (0 .. len / 8 - 1)), \result;
+    assigns *(dest + (0 .. len / 8 - 1)) \from *(src + (0 .. len / 8 - 1));
     assigns \result \from dest;
  */
 int **memcpy_ptr_int(int **dest, int * const *src, size_t len)
@@ -118,8 +118,8 @@ int **memcpy_ptr_int(int **dest, int * const *src, size_t len)
 
 void pointers(int ** /*[10]*/ src, int ** /*[10]*/ dest)
 {
-  int **res = memcpy_ptr_int(dest,src,(unsigned int)10 * sizeof(int *));
-  memcpy_ptr_int(src,res,(unsigned int)10 * sizeof(int *));
+  int **res = memcpy_ptr_int(dest,src,(unsigned long)10 * sizeof(int *));
+  memcpy_ptr_int(src,res,(unsigned long)10 * sizeof(int *));
   return;
 }
 
@@ -157,32 +157,32 @@ int (*memcpy_arr10_int(int (*dest)[10], int const (*src)[10], size_t len))[10]
 void nested(int (*src)[10], int (*dest)[10], int n)
 {
   int (*res)[10] =
-    memcpy_arr10_int(dest,src,(unsigned int)n * sizeof(int [10]));
-  memcpy_arr10_int(src,res,(unsigned int)n * sizeof(int [10]));
+    memcpy_arr10_int(dest,src,(unsigned long)n * sizeof(int [10]));
+  memcpy_arr10_int(src,res,(unsigned long)n * sizeof(int [10]));
   return;
 }
 
 void with_void(void *src, void *dest, int n)
 {
-  void *res = memcpy(dest,(void const *)src,(unsigned int)n);
-  memcpy(src,(void const *)res,(unsigned int)n);
+  void *res = memcpy(dest,(void const *)src,(unsigned long)n);
+  memcpy(src,(void const *)res,(unsigned long)n);
   return;
 }
 
 void with_incomplete(struct incomplete *src, struct incomplete *dest, int n)
 {
   struct incomplete *res =
-    memcpy((void *)dest,(void const *)src,(unsigned int)n);
-  memcpy((void *)src,(void const *)res,(unsigned int)n);
+    memcpy((void *)dest,(void const *)src,(unsigned long)n);
+  memcpy((void *)src,(void const *)res,(unsigned long)n);
   return;
 }
 
 void with_null_or_int(int * /*[10]*/ p)
 {
-  memcpy((void *)0,(void const *)p,(unsigned int)10 * sizeof(int));
-  memcpy((void *)p,(void const *)0,(unsigned int)10 * sizeof(int));
-  memcpy((void *)((int *)42),(void const *)p,(unsigned int)10 * sizeof(int));
-  memcpy((void *)p,(void const *)((int *)42),(unsigned int)10 * sizeof(int));
+  memcpy((void *)0,(void const *)p,(unsigned long)10 * sizeof(int));
+  memcpy((void *)p,(void const *)0,(unsigned long)10 * sizeof(int));
+  memcpy((void *)((int *)42),(void const *)p,(unsigned long)10 * sizeof(int));
+  memcpy((void *)p,(void const *)((int *)42),(unsigned long)10 * sizeof(int));
   return;
 }
 
@@ -228,16 +228,16 @@ int *memcpy_int(int *dest, int const *src, size_t len)
 void integer(int *src, int *dest)
 {
   int *res =
-    memcpy_int(dest,(int const *)src,(unsigned int)10 * sizeof(int));
-  memcpy_int(src,(int const *)res,(unsigned int)10 * sizeof(int));
+    memcpy_int(dest,(int const *)src,(unsigned long)10 * sizeof(int));
+  memcpy_int(src,(int const *)res,(unsigned long)10 * sizeof(int));
   return;
 }
 
 void with_named(named *src, named *dest)
 {
   named *res =
-    memcpy_int(dest,(int const *)src,(unsigned int)10 * sizeof(named));
-  memcpy_int(src,(int const *)res,(unsigned int)10 * sizeof(named));
+    memcpy_int(dest,(int const *)src,(unsigned long)10 * sizeof(named));
+  memcpy_int(src,(int const *)res,(unsigned long)10 * sizeof(named));
   return;
 }
 
@@ -272,29 +272,29 @@ void structure(struct X *src, struct X *dest)
 {
   struct X *res =
     memcpy_st_X(dest,(struct X const *)src,
-                (unsigned int)10 * sizeof(struct X));
-  memcpy_st_X(src,(struct X const *)res,(unsigned int)10 * sizeof(struct X));
+                (unsigned long)10 * sizeof(struct X));
+  memcpy_st_X(src,(struct X const *)res,(unsigned long)10 * sizeof(struct X));
   return;
 }
 
 /*@ requires
       separation:
-        \let __fc_len = len / 4;
+        \let __fc_len = len / 8;
           \separated(dest + (0 .. __fc_len - 1), src + (0 .. __fc_len - 1));
-    requires aligned_end: len % 4 ≡ 0;
+    requires aligned_end: len % 8 ≡ 0;
     requires
-      valid_dest: \let __fc_len = len / 4; \valid(dest + (0 .. __fc_len - 1));
+      valid_dest: \let __fc_len = len / 8; \valid(dest + (0 .. __fc_len - 1));
     requires
       valid_read_src:
-        \let __fc_len = len / 4; \valid_read(src + (0 .. __fc_len - 1));
+        \let __fc_len = len / 8; \valid_read(src + (0 .. __fc_len - 1));
     ensures
       copied:
-        \let __fc_len = \old(len) / 4;
+        \let __fc_len = \old(len) / 8;
         ∀ ℤ j0;
           0 ≤ j0 < __fc_len ⇒ *(\old(dest) + j0) ≡ *(\old(src) + j0);
     ensures result: \result ≡ \old(dest);
-    assigns *(dest + (0 .. len / 4 - 1)), \result;
-    assigns *(dest + (0 .. len / 4 - 1)) \from *(src + (0 .. len / 4 - 1));
+    assigns *(dest + (0 .. len / 8 - 1)), \result;
+    assigns *(dest + (0 .. len / 8 - 1)) \from *(src + (0 .. len / 8 - 1));
     assigns \result \from dest;
  */
 int **memcpy_ptr_int(int **dest, int * const *src, size_t len)
@@ -307,8 +307,8 @@ int **memcpy_ptr_int(int **dest, int * const *src, size_t len)
 void pointers(int **src, int **dest)
 {
   int **res =
-    memcpy_ptr_int(dest,(int * const *)src,(unsigned int)10 * sizeof(int *));
-  memcpy_ptr_int(src,(int * const *)res,(unsigned int)10 * sizeof(int *));
+    memcpy_ptr_int(dest,(int * const *)src,(unsigned long)10 * sizeof(int *));
+  memcpy_ptr_int(src,(int * const *)res,(unsigned long)10 * sizeof(int *));
   return;
 }
 
@@ -348,33 +348,33 @@ void nested(int (*src)[10], int (*dest)[10], int n)
 {
   int (*res)[10] =
     memcpy_arr10_int(dest,(int const (*)[10])src,
-                     (unsigned int)n * sizeof(int [10]));
+                     (unsigned long)n * sizeof(int [10]));
   memcpy_arr10_int(src,(int const (*)[10])res,
-                   (unsigned int)n * sizeof(int [10]));
+                   (unsigned long)n * sizeof(int [10]));
   return;
 }
 
 void with_void(void *src, void *dest, int n)
 {
-  void *res = memcpy(dest,(void const *)src,(unsigned int)n);
-  memcpy(src,(void const *)res,(unsigned int)n);
+  void *res = memcpy(dest,(void const *)src,(unsigned long)n);
+  memcpy(src,(void const *)res,(unsigned long)n);
   return;
 }
 
 void with_incomplete(struct incomplete *src, struct incomplete *dest, int n)
 {
   struct incomplete *res =
-    memcpy((void *)dest,(void const *)src,(unsigned int)n);
-  memcpy((void *)src,(void const *)res,(unsigned int)n);
+    memcpy((void *)dest,(void const *)src,(unsigned long)n);
+  memcpy((void *)src,(void const *)res,(unsigned long)n);
   return;
 }
 
 void with_null_or_int(int *p)
 {
-  memcpy((void *)0,(void const *)p,(unsigned int)10 * sizeof(int));
-  memcpy((void *)p,(void const *)0,(unsigned int)10 * sizeof(int));
-  memcpy((void *)((int *)42),(void const *)p,(unsigned int)10 * sizeof(int));
-  memcpy((void *)p,(void const *)((int *)42),(unsigned int)10 * sizeof(int));
+  memcpy((void *)0,(void const *)p,(unsigned long)10 * sizeof(int));
+  memcpy((void *)p,(void const *)0,(unsigned long)10 * sizeof(int));
+  memcpy((void *)((int *)42),(void const *)p,(unsigned long)10 * sizeof(int));
+  memcpy((void *)p,(void const *)((int *)42),(unsigned long)10 * sizeof(int));
   return;
 }
 
diff --git a/src/plugins/instantiate/tests/string/oracle/memmove.res.oracle b/src/plugins/instantiate/tests/string/oracle/memmove.res.oracle
index 9bea14b825cb9c3d81775f5b84212031c3e6591e..e637f18a19f8872656b617d60810aa662b1a9aa9 100644
--- a/src/plugins/instantiate/tests/string/oracle/memmove.res.oracle
+++ b/src/plugins/instantiate/tests/string/oracle/memmove.res.oracle
@@ -41,15 +41,15 @@ int *memmove_int(int *dest, int const *src, size_t len)
 
 void integer(int * /*[10]*/ src, int * /*[10]*/ dest)
 {
-  int *res = memmove_int(dest,src,(unsigned int)10 * sizeof(int));
-  memmove_int(src,res,(unsigned int)10 * sizeof(int));
+  int *res = memmove_int(dest,src,(unsigned long)10 * sizeof(int));
+  memmove_int(src,res,(unsigned long)10 * sizeof(int));
   return;
 }
 
 void with_named(named * /*[10]*/ src, named * /*[10]*/ dest)
 {
-  named *res = memmove_int(dest,src,(unsigned int)10 * sizeof(named));
-  memmove_int(src,res,(unsigned int)10 * sizeof(named));
+  named *res = memmove_int(dest,src,(unsigned long)10 * sizeof(named));
+  memmove_int(src,res,(unsigned long)10 * sizeof(named));
   return;
 }
 
@@ -77,24 +77,25 @@ struct X *memmove_st_X(struct X *dest, struct X const *src, size_t len)
 
 void structure(struct X * /*[10]*/ src, struct X * /*[10]*/ dest)
 {
-  struct X *res = memmove_st_X(dest,src,(unsigned int)10 * sizeof(struct X));
-  memmove_st_X(src,res,(unsigned int)10 * sizeof(struct X));
+  struct X *res =
+    memmove_st_X(dest,src,(unsigned long)10 * sizeof(struct X));
+  memmove_st_X(src,res,(unsigned long)10 * sizeof(struct X));
   return;
 }
 
-/*@ requires aligned_end: len % 4 ≡ 0;
+/*@ requires aligned_end: len % 8 ≡ 0;
     requires
-      valid_dest: \let __fc_len = len / 4; \valid(dest + (0 .. __fc_len - 1));
+      valid_dest: \let __fc_len = len / 8; \valid(dest + (0 .. __fc_len - 1));
     requires
       valid_read_src:
-        \let __fc_len = len / 4; \valid_read(src + (0 .. __fc_len - 1));
+        \let __fc_len = len / 8; \valid_read(src + (0 .. __fc_len - 1));
     ensures
       moved:
-        \let __fc_len = len / 4;
+        \let __fc_len = len / 8;
         ∀ ℤ j0; 0 ≤ j0 < __fc_len ⇒ *(dest + j0) ≡ *(src + j0);
     ensures result: \result ≡ dest;
-    assigns *(dest + (0 .. len / 4 - 1)), \result;
-    assigns *(dest + (0 .. len / 4 - 1)) \from *(src + (0 .. len / 4 - 1));
+    assigns *(dest + (0 .. len / 8 - 1)), \result;
+    assigns *(dest + (0 .. len / 8 - 1)) \from *(src + (0 .. len / 8 - 1));
     assigns \result \from dest;
  */
 int **memmove_ptr_int(int **dest, int * const *src, size_t len)
@@ -106,8 +107,8 @@ int **memmove_ptr_int(int **dest, int * const *src, size_t len)
 
 void pointers(int ** /*[10]*/ src, int ** /*[10]*/ dest)
 {
-  int **res = memmove_ptr_int(dest,src,(unsigned int)10 * sizeof(int *));
-  memmove_ptr_int(src,res,(unsigned int)10 * sizeof(int *));
+  int **res = memmove_ptr_int(dest,src,(unsigned long)10 * sizeof(int *));
+  memmove_ptr_int(src,res,(unsigned long)10 * sizeof(int *));
   return;
 }
 
@@ -141,32 +142,34 @@ int (*memmove_arr10_int(int (*dest)[10], int const (*src)[10], size_t len))[10]
 void nested(int (*src)[10], int (*dest)[10], int n)
 {
   int (*res)[10] =
-    memmove_arr10_int(dest,src,(unsigned int)n * sizeof(int [10]));
-  memmove_arr10_int(src,res,(unsigned int)n * sizeof(int [10]));
+    memmove_arr10_int(dest,src,(unsigned long)n * sizeof(int [10]));
+  memmove_arr10_int(src,res,(unsigned long)n * sizeof(int [10]));
   return;
 }
 
 void with_void(void *src, void *dest, int n)
 {
-  void *res = memmove(dest,(void const *)src,(unsigned int)n);
-  memmove(src,(void const *)res,(unsigned int)n);
+  void *res = memmove(dest,(void const *)src,(unsigned long)n);
+  memmove(src,(void const *)res,(unsigned long)n);
   return;
 }
 
 void with_incomplete(struct incomplete *src, struct incomplete *dest, int n)
 {
   struct incomplete *res =
-    memmove((void *)dest,(void const *)src,(unsigned int)n);
-  memmove((void *)src,(void const *)res,(unsigned int)n);
+    memmove((void *)dest,(void const *)src,(unsigned long)n);
+  memmove((void *)src,(void const *)res,(unsigned long)n);
   return;
 }
 
 void with_null_or_int(int * /*[10]*/ p)
 {
-  memmove((void *)0,(void const *)p,(unsigned int)10 * sizeof(int));
-  memmove((void *)p,(void const *)0,(unsigned int)10 * sizeof(int));
-  memmove((void *)((int *)42),(void const *)p,(unsigned int)10 * sizeof(int));
-  memmove((void *)p,(void const *)((int *)42),(unsigned int)10 * sizeof(int));
+  memmove((void *)0,(void const *)p,(unsigned long)10 * sizeof(int));
+  memmove((void *)p,(void const *)0,(unsigned long)10 * sizeof(int));
+  memmove((void *)((int *)42),(void const *)p,
+          (unsigned long)10 * sizeof(int));
+  memmove((void *)p,(void const *)((int *)42),
+          (unsigned long)10 * sizeof(int));
   return;
 }
 
@@ -208,16 +211,16 @@ int *memmove_int(int *dest, int const *src, size_t len)
 void integer(int *src, int *dest)
 {
   int *res =
-    memmove_int(dest,(int const *)src,(unsigned int)10 * sizeof(int));
-  memmove_int(src,(int const *)res,(unsigned int)10 * sizeof(int));
+    memmove_int(dest,(int const *)src,(unsigned long)10 * sizeof(int));
+  memmove_int(src,(int const *)res,(unsigned long)10 * sizeof(int));
   return;
 }
 
 void with_named(named *src, named *dest)
 {
   named *res =
-    memmove_int(dest,(int const *)src,(unsigned int)10 * sizeof(named));
-  memmove_int(src,(int const *)res,(unsigned int)10 * sizeof(named));
+    memmove_int(dest,(int const *)src,(unsigned long)10 * sizeof(named));
+  memmove_int(src,(int const *)res,(unsigned long)10 * sizeof(named));
   return;
 }
 
@@ -248,25 +251,26 @@ void structure(struct X *src, struct X *dest)
 {
   struct X *res =
     memmove_st_X(dest,(struct X const *)src,
-                 (unsigned int)10 * sizeof(struct X));
-  memmove_st_X(src,(struct X const *)res,(unsigned int)10 * sizeof(struct X));
+                 (unsigned long)10 * sizeof(struct X));
+  memmove_st_X(src,(struct X const *)res,
+               (unsigned long)10 * sizeof(struct X));
   return;
 }
 
-/*@ requires aligned_end: len % 4 ≡ 0;
+/*@ requires aligned_end: len % 8 ≡ 0;
     requires
-      valid_dest: \let __fc_len = len / 4; \valid(dest + (0 .. __fc_len - 1));
+      valid_dest: \let __fc_len = len / 8; \valid(dest + (0 .. __fc_len - 1));
     requires
       valid_read_src:
-        \let __fc_len = len / 4; \valid_read(src + (0 .. __fc_len - 1));
+        \let __fc_len = len / 8; \valid_read(src + (0 .. __fc_len - 1));
     ensures
       moved:
-        \let __fc_len = \old(len) / 4;
+        \let __fc_len = \old(len) / 8;
         ∀ ℤ j0;
           0 ≤ j0 < __fc_len ⇒ *(\old(dest) + j0) ≡ *(\old(src) + j0);
     ensures result: \result ≡ \old(dest);
-    assigns *(dest + (0 .. len / 4 - 1)), \result;
-    assigns *(dest + (0 .. len / 4 - 1)) \from *(src + (0 .. len / 4 - 1));
+    assigns *(dest + (0 .. len / 8 - 1)), \result;
+    assigns *(dest + (0 .. len / 8 - 1)) \from *(src + (0 .. len / 8 - 1));
     assigns \result \from dest;
  */
 int **memmove_ptr_int(int **dest, int * const *src, size_t len)
@@ -279,8 +283,9 @@ int **memmove_ptr_int(int **dest, int * const *src, size_t len)
 void pointers(int **src, int **dest)
 {
   int **res =
-    memmove_ptr_int(dest,(int * const *)src,(unsigned int)10 * sizeof(int *));
-  memmove_ptr_int(src,(int * const *)res,(unsigned int)10 * sizeof(int *));
+    memmove_ptr_int(dest,(int * const *)src,
+                    (unsigned long)10 * sizeof(int *));
+  memmove_ptr_int(src,(int * const *)res,(unsigned long)10 * sizeof(int *));
   return;
 }
 
@@ -316,33 +321,35 @@ void nested(int (*src)[10], int (*dest)[10], int n)
 {
   int (*res)[10] =
     memmove_arr10_int(dest,(int const (*)[10])src,
-                      (unsigned int)n * sizeof(int [10]));
+                      (unsigned long)n * sizeof(int [10]));
   memmove_arr10_int(src,(int const (*)[10])res,
-                    (unsigned int)n * sizeof(int [10]));
+                    (unsigned long)n * sizeof(int [10]));
   return;
 }
 
 void with_void(void *src, void *dest, int n)
 {
-  void *res = memmove(dest,(void const *)src,(unsigned int)n);
-  memmove(src,(void const *)res,(unsigned int)n);
+  void *res = memmove(dest,(void const *)src,(unsigned long)n);
+  memmove(src,(void const *)res,(unsigned long)n);
   return;
 }
 
 void with_incomplete(struct incomplete *src, struct incomplete *dest, int n)
 {
   struct incomplete *res =
-    memmove((void *)dest,(void const *)src,(unsigned int)n);
-  memmove((void *)src,(void const *)res,(unsigned int)n);
+    memmove((void *)dest,(void const *)src,(unsigned long)n);
+  memmove((void *)src,(void const *)res,(unsigned long)n);
   return;
 }
 
 void with_null_or_int(int *p)
 {
-  memmove((void *)0,(void const *)p,(unsigned int)10 * sizeof(int));
-  memmove((void *)p,(void const *)0,(unsigned int)10 * sizeof(int));
-  memmove((void *)((int *)42),(void const *)p,(unsigned int)10 * sizeof(int));
-  memmove((void *)p,(void const *)((int *)42),(unsigned int)10 * sizeof(int));
+  memmove((void *)0,(void const *)p,(unsigned long)10 * sizeof(int));
+  memmove((void *)p,(void const *)0,(unsigned long)10 * sizeof(int));
+  memmove((void *)((int *)42),(void const *)p,
+          (unsigned long)10 * sizeof(int));
+  memmove((void *)p,(void const *)((int *)42),
+          (unsigned long)10 * sizeof(int));
   return;
 }
 
diff --git a/src/plugins/instantiate/tests/string/oracle/memset_0.res.oracle b/src/plugins/instantiate/tests/string/oracle/memset_0.res.oracle
index 94828ff53e511ca8bdbf0fabda3b6c771b815506..bdf737c2650974533771d2c2a2c61aecb298b681 100644
--- a/src/plugins/instantiate/tests/string/oracle/memset_0.res.oracle
+++ b/src/plugins/instantiate/tests/string/oracle/memset_0.res.oracle
@@ -35,8 +35,8 @@ char *memset_char(char *ptr, char value, size_t len)
 
 void chars(char * /*[10]*/ dest)
 {
-  char *res = memset_char(dest,(char)0,(unsigned int)10);
-  memset_char(res,(char)0,(unsigned int)10);
+  char *res = memset_char(dest,(char)0,(unsigned long)10);
+  memset_char(res,(char)0,(unsigned long)10);
   return;
 }
 
@@ -59,8 +59,8 @@ unsigned char *memset_uchar(unsigned char *ptr, unsigned char value,
 
 void uchars(unsigned char * /*[10]*/ dest)
 {
-  unsigned char *res = memset_uchar(dest,(unsigned char)0,(unsigned int)10);
-  memset_uchar(res,(unsigned char)0,(unsigned int)10);
+  unsigned char *res = memset_uchar(dest,(unsigned char)0,(unsigned long)10);
+  memset_uchar(res,(unsigned char)0,(unsigned long)10);
   return;
 }
 
@@ -87,8 +87,8 @@ char (*memset_arr10_char(char (*ptr)[10], char value, size_t len))[10]
 
 void nested_chars(char (* /*[10]*/ dest)[10])
 {
-  char (*res)[10] = memset_arr10_char(dest,(char)0,(unsigned int)100);
-  memset_arr10_char(res,(char)0,(unsigned int)100);
+  char (*res)[10] = memset_arr10_char(dest,(char)0,(unsigned long)100);
+  memset_arr10_char(res,(char)0,(unsigned long)100);
   return;
 }
 
@@ -113,8 +113,8 @@ int *memset_int_0(int *ptr, size_t len)
 
 void integer(int * /*[10]*/ dest)
 {
-  int *res = memset_int_0(dest,(unsigned int)10 * sizeof(int));
-  memset_int_0(res,(unsigned int)10 * sizeof(int));
+  int *res = memset_int_0(dest,(unsigned long)10 * sizeof(int));
+  memset_int_0(res,(unsigned long)10 * sizeof(int));
   return;
 }
 
@@ -139,8 +139,8 @@ enum E *memset_e_E_0(enum E *ptr, size_t len)
 
 void with_enum(enum E * /*[10]*/ dest)
 {
-  enum E *res = memset_e_E_0(dest,(unsigned int)10 * sizeof(enum E));
-  memset_e_E_0(res,(unsigned int)10 * sizeof(enum E));
+  enum E *res = memset_e_E_0(dest,(unsigned long)10 * sizeof(enum E));
+  memset_e_E_0(res,(unsigned long)10 * sizeof(enum E));
   return;
 }
 
@@ -165,15 +165,15 @@ float *memset_float_0(float *ptr, size_t len)
 
 void floats(float * /*[10]*/ dest)
 {
-  float *res = memset_float_0(dest,(unsigned int)10 * sizeof(float));
-  memset_float_0(res,(unsigned int)10 * sizeof(float));
+  float *res = memset_float_0(dest,(unsigned long)10 * sizeof(float));
+  memset_float_0(res,(unsigned long)10 * sizeof(float));
   return;
 }
 
 void with_named(named * /*[10]*/ dest)
 {
-  named *res = memset_int_0(dest,(unsigned int)10 * sizeof(named));
-  memset_int_0(res,(unsigned int)10 * sizeof(named));
+  named *res = memset_int_0(dest,(unsigned long)10 * sizeof(named));
+  memset_int_0(res,(unsigned long)10 * sizeof(named));
   return;
 }
 
@@ -199,21 +199,21 @@ struct X *memset_st_X_0(struct X *ptr, size_t len)
 
 void structure(struct X * /*[10]*/ dest)
 {
-  struct X *res = memset_st_X_0(dest,(unsigned int)10 * sizeof(struct X));
-  memset_st_X_0(res,(unsigned int)10 * sizeof(struct X));
+  struct X *res = memset_st_X_0(dest,(unsigned long)10 * sizeof(struct X));
+  memset_st_X_0(res,(unsigned long)10 * sizeof(struct X));
   return;
 }
 
-/*@ requires aligned_end: len % 4 ≡ 0;
+/*@ requires aligned_end: len % 8 ≡ 0;
     requires
-      valid_dest: \let __fc_len = len / 4; \valid(ptr + (0 .. __fc_len - 1));
+      valid_dest: \let __fc_len = len / 8; \valid(ptr + (0 .. __fc_len - 1));
     ensures
       set_content:
-        \let __fc_len = len / 4;
+        \let __fc_len = len / 8;
         ∀ ℤ j0; 0 ≤ j0 < __fc_len ⇒ *(ptr + j0) ≡ \null;
     ensures result: \result ≡ ptr;
-    assigns *(ptr + (0 .. len / 4 - 1)), \result;
-    assigns *(ptr + (0 .. len / 4 - 1)) \from \nothing;
+    assigns *(ptr + (0 .. len / 8 - 1)), \result;
+    assigns *(ptr + (0 .. len / 8 - 1)) \from \nothing;
     assigns \result \from ptr;
  */
 int **memset_ptr_int_0(int **ptr, size_t len)
@@ -225,8 +225,8 @@ int **memset_ptr_int_0(int **ptr, size_t len)
 
 void pointers(int ** /*[10]*/ dest)
 {
-  int **res = memset_ptr_int_0(dest,(unsigned int)10 * sizeof(int *));
-  memset_ptr_int_0(res,(unsigned int)10 * sizeof(int *));
+  int **res = memset_ptr_int_0(dest,(unsigned long)10 * sizeof(int *));
+  memset_ptr_int_0(res,(unsigned long)10 * sizeof(int *));
   return;
 }
 
@@ -254,22 +254,22 @@ int (*memset_arr10_int_0(int (*ptr)[10], size_t len))[10]
 void nested(int (*dest)[10], int n)
 {
   int (*res)[10] =
-    memset_arr10_int_0(dest,(unsigned int)n * sizeof(int [10]));
-  memset_arr10_int_0(res,(unsigned int)n * sizeof(int [10]));
+    memset_arr10_int_0(dest,(unsigned long)n * sizeof(int [10]));
+  memset_arr10_int_0(res,(unsigned long)n * sizeof(int [10]));
   return;
 }
 
 void with_void(void *dest)
 {
-  void *res = memset(dest,0,(unsigned int)10);
-  memset(res,0,(unsigned int)10);
+  void *res = memset(dest,0,(unsigned long)10);
+  memset(res,0,(unsigned long)10);
   return;
 }
 
 void with_null_or_int(void)
 {
-  memset((void *)0,0,(unsigned int)10);
-  memset((void *)((int *)42),0,(unsigned int)10);
+  memset((void *)0,0,(unsigned long)10);
+  memset((void *)((int *)42),0,(unsigned long)10);
   return;
 }
 
@@ -309,8 +309,8 @@ char *memset_char(char *ptr, char value, size_t len)
 
 void chars(char *dest)
 {
-  char *res = memset_char(dest,(char)0,(unsigned int)10);
-  memset_char(res,(char)0,(unsigned int)10);
+  char *res = memset_char(dest,(char)0,(unsigned long)10);
+  memset_char(res,(char)0,(unsigned long)10);
   return;
 }
 
@@ -335,8 +335,8 @@ unsigned char *memset_uchar(unsigned char *ptr, unsigned char value,
 
 void uchars(unsigned char *dest)
 {
-  unsigned char *res = memset_uchar(dest,(unsigned char)0,(unsigned int)10);
-  memset_uchar(res,(unsigned char)0,(unsigned int)10);
+  unsigned char *res = memset_uchar(dest,(unsigned char)0,(unsigned long)10);
+  memset_uchar(res,(unsigned char)0,(unsigned long)10);
   return;
 }
 
@@ -364,8 +364,8 @@ char (*memset_arr10_char(char (*ptr)[10], char value, size_t len))[10]
 
 void nested_chars(char (*dest)[10])
 {
-  char (*res)[10] = memset_arr10_char(dest,(char)0,(unsigned int)100);
-  memset_arr10_char(res,(char)0,(unsigned int)100);
+  char (*res)[10] = memset_arr10_char(dest,(char)0,(unsigned long)100);
+  memset_arr10_char(res,(char)0,(unsigned long)100);
   return;
 }
 
@@ -390,8 +390,8 @@ int *memset_int_0(int *ptr, size_t len)
 
 void integer(int *dest)
 {
-  int *res = memset_int_0(dest,(unsigned int)10 * sizeof(int));
-  memset_int_0(res,(unsigned int)10 * sizeof(int));
+  int *res = memset_int_0(dest,(unsigned long)10 * sizeof(int));
+  memset_int_0(res,(unsigned long)10 * sizeof(int));
   return;
 }
 
@@ -416,8 +416,8 @@ enum E *memset_e_E_0(enum E *ptr, size_t len)
 
 void with_enum(enum E *dest)
 {
-  enum E *res = memset_e_E_0(dest,(unsigned int)10 * sizeof(enum E));
-  memset_e_E_0(res,(unsigned int)10 * sizeof(enum E));
+  enum E *res = memset_e_E_0(dest,(unsigned long)10 * sizeof(enum E));
+  memset_e_E_0(res,(unsigned long)10 * sizeof(enum E));
   return;
 }
 
@@ -442,15 +442,15 @@ float *memset_float_0(float *ptr, size_t len)
 
 void floats(float *dest)
 {
-  float *res = memset_float_0(dest,(unsigned int)10 * sizeof(float));
-  memset_float_0(res,(unsigned int)10 * sizeof(float));
+  float *res = memset_float_0(dest,(unsigned long)10 * sizeof(float));
+  memset_float_0(res,(unsigned long)10 * sizeof(float));
   return;
 }
 
 void with_named(named *dest)
 {
-  named *res = memset_int_0(dest,(unsigned int)10 * sizeof(named));
-  memset_int_0(res,(unsigned int)10 * sizeof(named));
+  named *res = memset_int_0(dest,(unsigned long)10 * sizeof(named));
+  memset_int_0(res,(unsigned long)10 * sizeof(named));
   return;
 }
 
@@ -477,21 +477,21 @@ struct X *memset_st_X_0(struct X *ptr, size_t len)
 
 void structure(struct X *dest)
 {
-  struct X *res = memset_st_X_0(dest,(unsigned int)10 * sizeof(struct X));
-  memset_st_X_0(res,(unsigned int)10 * sizeof(struct X));
+  struct X *res = memset_st_X_0(dest,(unsigned long)10 * sizeof(struct X));
+  memset_st_X_0(res,(unsigned long)10 * sizeof(struct X));
   return;
 }
 
-/*@ requires aligned_end: len % 4 ≡ 0;
+/*@ requires aligned_end: len % 8 ≡ 0;
     requires
-      valid_dest: \let __fc_len = len / 4; \valid(ptr + (0 .. __fc_len - 1));
+      valid_dest: \let __fc_len = len / 8; \valid(ptr + (0 .. __fc_len - 1));
     ensures
       set_content:
-        \let __fc_len = \old(len) / 4;
+        \let __fc_len = \old(len) / 8;
         ∀ ℤ j0; 0 ≤ j0 < __fc_len ⇒ *(\old(ptr) + j0) ≡ \null;
     ensures result: \result ≡ \old(ptr);
-    assigns *(ptr + (0 .. len / 4 - 1)), \result;
-    assigns *(ptr + (0 .. len / 4 - 1)) \from \nothing;
+    assigns *(ptr + (0 .. len / 8 - 1)), \result;
+    assigns *(ptr + (0 .. len / 8 - 1)) \from \nothing;
     assigns \result \from ptr;
  */
 int **memset_ptr_int_0(int **ptr, size_t len)
@@ -503,8 +503,8 @@ int **memset_ptr_int_0(int **ptr, size_t len)
 
 void pointers(int **dest)
 {
-  int **res = memset_ptr_int_0(dest,(unsigned int)10 * sizeof(int *));
-  memset_ptr_int_0(res,(unsigned int)10 * sizeof(int *));
+  int **res = memset_ptr_int_0(dest,(unsigned long)10 * sizeof(int *));
+  memset_ptr_int_0(res,(unsigned long)10 * sizeof(int *));
   return;
 }
 
@@ -532,22 +532,22 @@ int (*memset_arr10_int_0(int (*ptr)[10], size_t len))[10]
 void nested(int (*dest)[10], int n)
 {
   int (*res)[10] =
-    memset_arr10_int_0(dest,(unsigned int)n * sizeof(int [10]));
-  memset_arr10_int_0(res,(unsigned int)n * sizeof(int [10]));
+    memset_arr10_int_0(dest,(unsigned long)n * sizeof(int [10]));
+  memset_arr10_int_0(res,(unsigned long)n * sizeof(int [10]));
   return;
 }
 
 void with_void(void *dest)
 {
-  void *res = memset(dest,0,(unsigned int)10);
-  memset(res,0,(unsigned int)10);
+  void *res = memset(dest,0,(unsigned long)10);
+  memset(res,0,(unsigned long)10);
   return;
 }
 
 void with_null_or_int(void)
 {
-  memset((void *)0,0,(unsigned int)10);
-  memset((void *)((int *)42),0,(unsigned int)10);
+  memset((void *)0,0,(unsigned long)10);
+  memset((void *)((int *)42),0,(unsigned long)10);
   return;
 }
 
diff --git a/src/plugins/instantiate/tests/string/oracle/memset_FF.res.oracle b/src/plugins/instantiate/tests/string/oracle/memset_FF.res.oracle
index 5521423c1b2117d7a99e1563dccc017170835b1f..83125907b609127664fe27d383eb29fb051d73dd 100644
--- a/src/plugins/instantiate/tests/string/oracle/memset_FF.res.oracle
+++ b/src/plugins/instantiate/tests/string/oracle/memset_FF.res.oracle
@@ -35,8 +35,8 @@ char *memset_char(char *ptr, char value, size_t len)
 
 void chars(char * /*[10]*/ dest)
 {
-  char *res = memset_char(dest,(char)0xFF,(unsigned int)10);
-  memset_char(res,(char)0xFF,(unsigned int)10);
+  char *res = memset_char(dest,(char)0xFF,(unsigned long)10);
+  memset_char(res,(char)0xFF,(unsigned long)10);
   return;
 }
 
@@ -60,8 +60,8 @@ unsigned char *memset_uchar(unsigned char *ptr, unsigned char value,
 void uchars(unsigned char * /*[10]*/ dest)
 {
   unsigned char *res =
-    memset_uchar(dest,(unsigned char)0xFF,(unsigned int)10);
-  memset_uchar(res,(unsigned char)0xFF,(unsigned int)10);
+    memset_uchar(dest,(unsigned char)0xFF,(unsigned long)10);
+  memset_uchar(res,(unsigned char)0xFF,(unsigned long)10);
   return;
 }
 
@@ -88,8 +88,8 @@ char (*memset_arr10_char(char (*ptr)[10], char value, size_t len))[10]
 
 void nested_chars(char (* /*[10]*/ dest)[10])
 {
-  char (*res)[10] = memset_arr10_char(dest,(char)0xFF,(unsigned int)100);
-  memset_arr10_char(res,(char)0xFF,(unsigned int)100);
+  char (*res)[10] = memset_arr10_char(dest,(char)0xFF,(unsigned long)100);
+  memset_arr10_char(res,(char)0xFF,(unsigned long)100);
   return;
 }
 
@@ -114,8 +114,8 @@ int *memset_int_FF(int *ptr, size_t len)
 
 void integer(int * /*[10]*/ dest)
 {
-  int *res = memset_int_FF(dest,(unsigned int)10 * sizeof(int));
-  memset_int_FF(res,(unsigned int)10 * sizeof(int));
+  int *res = memset_int_FF(dest,(unsigned long)10 * sizeof(int));
+  memset_int_FF(res,(unsigned long)10 * sizeof(int));
   return;
 }
 
@@ -140,8 +140,8 @@ enum E *memset_e_E_FF(enum E *ptr, size_t len)
 
 void with_enum(enum E * /*[10]*/ dest)
 {
-  enum E *res = memset_e_E_FF(dest,(unsigned int)10 * sizeof(enum E));
-  memset_e_E_FF(res,(unsigned int)10 * sizeof(enum E));
+  enum E *res = memset_e_E_FF(dest,(unsigned long)10 * sizeof(enum E));
+  memset_e_E_FF(res,(unsigned long)10 * sizeof(enum E));
   return;
 }
 
@@ -167,21 +167,21 @@ unsigned int *memset_uint_FF(unsigned int *ptr, size_t len)
 void unsigned_integer(unsigned int * /*[10]*/ dest)
 {
   unsigned int *res =
-    memset_uint_FF(dest,(unsigned int)10 * sizeof(unsigned int));
-  memset_uint_FF(res,(unsigned int)10 * sizeof(unsigned int));
+    memset_uint_FF(dest,(unsigned long)10 * sizeof(unsigned int));
+  memset_uint_FF(res,(unsigned long)10 * sizeof(unsigned int));
   return;
 }
 
-/*@ requires aligned_end: len % 4 ≡ 0;
+/*@ requires aligned_end: len % 8 ≡ 0;
     requires
-      valid_dest: \let __fc_len = len / 4; \valid(ptr + (0 .. __fc_len - 1));
+      valid_dest: \let __fc_len = len / 8; \valid(ptr + (0 .. __fc_len - 1));
     ensures
       set_content:
-        \let __fc_len = len / 4;
+        \let __fc_len = len / 8;
         ∀ ℤ j0; 0 ≤ j0 < __fc_len ⇒ *(ptr + j0) ≡ ~((long)0);
     ensures result: \result ≡ ptr;
-    assigns *(ptr + (0 .. len / 4 - 1)), \result;
-    assigns *(ptr + (0 .. len / 4 - 1)) \from \nothing;
+    assigns *(ptr + (0 .. len / 8 - 1)), \result;
+    assigns *(ptr + (0 .. len / 8 - 1)) \from \nothing;
     assigns \result \from ptr;
  */
 long *memset_long_FF(long *ptr, size_t len)
@@ -193,21 +193,22 @@ long *memset_long_FF(long *ptr, size_t len)
 
 void long_integer(long * /*[10]*/ dest)
 {
-  long *res = memset_long_FF(dest,(unsigned int)10 * sizeof(long));
-  memset_long_FF(res,(unsigned int)10 * sizeof(long));
+  long *res = memset_long_FF(dest,(unsigned long)10 * sizeof(long));
+  memset_long_FF(res,(unsigned long)10 * sizeof(long));
   return;
 }
 
-/*@ requires aligned_end: len % 4 ≡ 0;
+/*@ requires aligned_end: len % 8 ≡ 0;
     requires
-      valid_dest: \let __fc_len = len / 4; \valid(ptr + (0 .. __fc_len - 1));
+      valid_dest: \let __fc_len = len / 8; \valid(ptr + (0 .. __fc_len - 1));
     ensures
       set_content:
-        \let __fc_len = len / 4;
-        ∀ ℤ j0; 0 ≤ j0 < __fc_len ⇒ *(ptr + j0) ≡ 4294967295;
+        \let __fc_len = len / 8;
+        ∀ ℤ j0;
+          0 ≤ j0 < __fc_len ⇒ *(ptr + j0) ≡ 18446744073709551615;
     ensures result: \result ≡ ptr;
-    assigns *(ptr + (0 .. len / 4 - 1)), \result;
-    assigns *(ptr + (0 .. len / 4 - 1)) \from \nothing;
+    assigns *(ptr + (0 .. len / 8 - 1)), \result;
+    assigns *(ptr + (0 .. len / 8 - 1)) \from \nothing;
     assigns \result \from ptr;
  */
 unsigned long *memset_ulong_FF(unsigned long *ptr, size_t len)
@@ -220,8 +221,8 @@ unsigned long *memset_ulong_FF(unsigned long *ptr, size_t len)
 void unsigned_long_integer(unsigned long * /*[10]*/ dest)
 {
   unsigned long *res =
-    memset_ulong_FF(dest,(unsigned int)10 * sizeof(unsigned long));
-  memset_ulong_FF(res,(unsigned int)10 * sizeof(unsigned long));
+    memset_ulong_FF(dest,(unsigned long)10 * sizeof(unsigned long));
+  memset_ulong_FF(res,(unsigned long)10 * sizeof(unsigned long));
   return;
 }
 
@@ -247,8 +248,8 @@ long long *memset_llong_FF(long long *ptr, size_t len)
 void long_long_integer(long long * /*[10]*/ dest)
 {
   long long *res =
-    memset_llong_FF(dest,(unsigned int)10 * sizeof(long long));
-  memset_llong_FF(res,(unsigned int)10 * sizeof(long long));
+    memset_llong_FF(dest,(unsigned long)10 * sizeof(long long));
+  memset_llong_FF(res,(unsigned long)10 * sizeof(long long));
   return;
 }
 
@@ -275,8 +276,8 @@ unsigned long long *memset_ullong_FF(unsigned long long *ptr, size_t len)
 void unsigned_long_long_integer(unsigned long long * /*[10]*/ dest)
 {
   unsigned long long *res =
-    memset_ullong_FF(dest,(unsigned int)10 * sizeof(unsigned long long));
-  memset_ullong_FF(res,(unsigned int)10 * sizeof(unsigned long long));
+    memset_ullong_FF(dest,(unsigned long)10 * sizeof(unsigned long long));
+  memset_ullong_FF(res,(unsigned long)10 * sizeof(unsigned long long));
   return;
 }
 
@@ -301,15 +302,15 @@ float *memset_float_FF(float *ptr, size_t len)
 
 void floats(float * /*[10]*/ dest)
 {
-  float *res = memset_float_FF(dest,(unsigned int)10 * sizeof(float));
-  memset_float_FF(res,(unsigned int)10 * sizeof(float));
+  float *res = memset_float_FF(dest,(unsigned long)10 * sizeof(float));
+  memset_float_FF(res,(unsigned long)10 * sizeof(float));
   return;
 }
 
 void with_named(named * /*[10]*/ dest)
 {
-  named *res = memset_int_FF(dest,(unsigned int)10 * sizeof(named));
-  memset_int_FF(res,(unsigned int)10 * sizeof(named));
+  named *res = memset_int_FF(dest,(unsigned long)10 * sizeof(named));
+  memset_int_FF(res,(unsigned long)10 * sizeof(named));
   return;
 }
 
@@ -336,21 +337,21 @@ struct X *memset_st_X_FF(struct X *ptr, size_t len)
 
 void structure(struct X * /*[10]*/ dest)
 {
-  struct X *res = memset_st_X_FF(dest,(unsigned int)10 * sizeof(struct X));
-  memset_st_X_FF(res,(unsigned int)10 * sizeof(struct X));
+  struct X *res = memset_st_X_FF(dest,(unsigned long)10 * sizeof(struct X));
+  memset_st_X_FF(res,(unsigned long)10 * sizeof(struct X));
   return;
 }
 
-/*@ requires aligned_end: len % 4 ≡ 0;
+/*@ requires aligned_end: len % 8 ≡ 0;
     requires
-      valid_dest: \let __fc_len = len / 4; \valid(ptr + (0 .. __fc_len - 1));
+      valid_dest: \let __fc_len = len / 8; \valid(ptr + (0 .. __fc_len - 1));
     ensures
       set_content:
-        \let __fc_len = len / 4;
+        \let __fc_len = len / 8;
         ∀ ℤ j0; 0 ≤ j0 < __fc_len ⇒ ¬\valid_read(*(ptr + j0));
     ensures result: \result ≡ ptr;
-    assigns *(ptr + (0 .. len / 4 - 1)), \result;
-    assigns *(ptr + (0 .. len / 4 - 1)) \from \nothing;
+    assigns *(ptr + (0 .. len / 8 - 1)), \result;
+    assigns *(ptr + (0 .. len / 8 - 1)) \from \nothing;
     assigns \result \from ptr;
  */
 int **memset_ptr_int_FF(int **ptr, size_t len)
@@ -362,8 +363,8 @@ int **memset_ptr_int_FF(int **ptr, size_t len)
 
 void pointers(int ** /*[10]*/ dest)
 {
-  int **res = memset_ptr_int_FF(dest,(unsigned int)10 * sizeof(int *));
-  memset_ptr_int_FF(res,(unsigned int)10 * sizeof(int *));
+  int **res = memset_ptr_int_FF(dest,(unsigned long)10 * sizeof(int *));
+  memset_ptr_int_FF(res,(unsigned long)10 * sizeof(int *));
   return;
 }
 
@@ -391,22 +392,22 @@ int (*memset_arr10_int_FF(int (*ptr)[10], size_t len))[10]
 void nested(int (*dest)[10], int n)
 {
   int (*res)[10] =
-    memset_arr10_int_FF(dest,(unsigned int)n * sizeof(int [10]));
-  memset_arr10_int_FF(res,(unsigned int)n * sizeof(int [10]));
+    memset_arr10_int_FF(dest,(unsigned long)n * sizeof(int [10]));
+  memset_arr10_int_FF(res,(unsigned long)n * sizeof(int [10]));
   return;
 }
 
 void with_void(void *dest)
 {
-  void *res = memset(dest,0xFF,(unsigned int)10);
-  memset(res,0xFF,(unsigned int)10);
+  void *res = memset(dest,0xFF,(unsigned long)10);
+  memset(res,0xFF,(unsigned long)10);
   return;
 }
 
 void with_null_or_int(void)
 {
-  memset((void *)0,0xFF,(unsigned int)10);
-  memset((void *)((int *)42),0xFF,(unsigned int)10);
+  memset((void *)0,0xFF,(unsigned long)10);
+  memset((void *)((int *)42),0xFF,(unsigned long)10);
   return;
 }
 
@@ -446,8 +447,8 @@ char *memset_char(char *ptr, char value, size_t len)
 
 void chars(char *dest)
 {
-  char *res = memset_char(dest,(char)0xFF,(unsigned int)10);
-  memset_char(res,(char)0xFF,(unsigned int)10);
+  char *res = memset_char(dest,(char)0xFF,(unsigned long)10);
+  memset_char(res,(char)0xFF,(unsigned long)10);
   return;
 }
 
@@ -473,8 +474,8 @@ unsigned char *memset_uchar(unsigned char *ptr, unsigned char value,
 void uchars(unsigned char *dest)
 {
   unsigned char *res =
-    memset_uchar(dest,(unsigned char)0xFF,(unsigned int)10);
-  memset_uchar(res,(unsigned char)0xFF,(unsigned int)10);
+    memset_uchar(dest,(unsigned char)0xFF,(unsigned long)10);
+  memset_uchar(res,(unsigned char)0xFF,(unsigned long)10);
   return;
 }
 
@@ -502,8 +503,8 @@ char (*memset_arr10_char(char (*ptr)[10], char value, size_t len))[10]
 
 void nested_chars(char (*dest)[10])
 {
-  char (*res)[10] = memset_arr10_char(dest,(char)0xFF,(unsigned int)100);
-  memset_arr10_char(res,(char)0xFF,(unsigned int)100);
+  char (*res)[10] = memset_arr10_char(dest,(char)0xFF,(unsigned long)100);
+  memset_arr10_char(res,(char)0xFF,(unsigned long)100);
   return;
 }
 
@@ -528,8 +529,8 @@ int *memset_int_FF(int *ptr, size_t len)
 
 void integer(int *dest)
 {
-  int *res = memset_int_FF(dest,(unsigned int)10 * sizeof(int));
-  memset_int_FF(res,(unsigned int)10 * sizeof(int));
+  int *res = memset_int_FF(dest,(unsigned long)10 * sizeof(int));
+  memset_int_FF(res,(unsigned long)10 * sizeof(int));
   return;
 }
 
@@ -554,8 +555,8 @@ enum E *memset_e_E_FF(enum E *ptr, size_t len)
 
 void with_enum(enum E *dest)
 {
-  enum E *res = memset_e_E_FF(dest,(unsigned int)10 * sizeof(enum E));
-  memset_e_E_FF(res,(unsigned int)10 * sizeof(enum E));
+  enum E *res = memset_e_E_FF(dest,(unsigned long)10 * sizeof(enum E));
+  memset_e_E_FF(res,(unsigned long)10 * sizeof(enum E));
   return;
 }
 
@@ -581,21 +582,21 @@ unsigned int *memset_uint_FF(unsigned int *ptr, size_t len)
 void unsigned_integer(unsigned int *dest)
 {
   unsigned int *res =
-    memset_uint_FF(dest,(unsigned int)10 * sizeof(unsigned int));
-  memset_uint_FF(res,(unsigned int)10 * sizeof(unsigned int));
+    memset_uint_FF(dest,(unsigned long)10 * sizeof(unsigned int));
+  memset_uint_FF(res,(unsigned long)10 * sizeof(unsigned int));
   return;
 }
 
-/*@ requires aligned_end: len % 4 ≡ 0;
+/*@ requires aligned_end: len % 8 ≡ 0;
     requires
-      valid_dest: \let __fc_len = len / 4; \valid(ptr + (0 .. __fc_len - 1));
+      valid_dest: \let __fc_len = len / 8; \valid(ptr + (0 .. __fc_len - 1));
     ensures
       set_content:
-        \let __fc_len = \old(len) / 4;
+        \let __fc_len = \old(len) / 8;
         ∀ ℤ j0; 0 ≤ j0 < __fc_len ⇒ *(\old(ptr) + j0) ≡ ~((long)0);
     ensures result: \result ≡ \old(ptr);
-    assigns *(ptr + (0 .. len / 4 - 1)), \result;
-    assigns *(ptr + (0 .. len / 4 - 1)) \from \nothing;
+    assigns *(ptr + (0 .. len / 8 - 1)), \result;
+    assigns *(ptr + (0 .. len / 8 - 1)) \from \nothing;
     assigns \result \from ptr;
  */
 long *memset_long_FF(long *ptr, size_t len)
@@ -607,21 +608,22 @@ long *memset_long_FF(long *ptr, size_t len)
 
 void long_integer(long *dest)
 {
-  long *res = memset_long_FF(dest,(unsigned int)10 * sizeof(long));
-  memset_long_FF(res,(unsigned int)10 * sizeof(long));
+  long *res = memset_long_FF(dest,(unsigned long)10 * sizeof(long));
+  memset_long_FF(res,(unsigned long)10 * sizeof(long));
   return;
 }
 
-/*@ requires aligned_end: len % 4 ≡ 0;
+/*@ requires aligned_end: len % 8 ≡ 0;
     requires
-      valid_dest: \let __fc_len = len / 4; \valid(ptr + (0 .. __fc_len - 1));
+      valid_dest: \let __fc_len = len / 8; \valid(ptr + (0 .. __fc_len - 1));
     ensures
       set_content:
-        \let __fc_len = \old(len) / 4;
-        ∀ ℤ j0; 0 ≤ j0 < __fc_len ⇒ *(\old(ptr) + j0) ≡ 4294967295;
+        \let __fc_len = \old(len) / 8;
+        ∀ ℤ j0;
+          0 ≤ j0 < __fc_len ⇒ *(\old(ptr) + j0) ≡ 18446744073709551615;
     ensures result: \result ≡ \old(ptr);
-    assigns *(ptr + (0 .. len / 4 - 1)), \result;
-    assigns *(ptr + (0 .. len / 4 - 1)) \from \nothing;
+    assigns *(ptr + (0 .. len / 8 - 1)), \result;
+    assigns *(ptr + (0 .. len / 8 - 1)) \from \nothing;
     assigns \result \from ptr;
  */
 unsigned long *memset_ulong_FF(unsigned long *ptr, size_t len)
@@ -634,8 +636,8 @@ unsigned long *memset_ulong_FF(unsigned long *ptr, size_t len)
 void unsigned_long_integer(unsigned long *dest)
 {
   unsigned long *res =
-    memset_ulong_FF(dest,(unsigned int)10 * sizeof(unsigned long));
-  memset_ulong_FF(res,(unsigned int)10 * sizeof(unsigned long));
+    memset_ulong_FF(dest,(unsigned long)10 * sizeof(unsigned long));
+  memset_ulong_FF(res,(unsigned long)10 * sizeof(unsigned long));
   return;
 }
 
@@ -662,8 +664,8 @@ long long *memset_llong_FF(long long *ptr, size_t len)
 void long_long_integer(long long *dest)
 {
   long long *res =
-    memset_llong_FF(dest,(unsigned int)10 * sizeof(long long));
-  memset_llong_FF(res,(unsigned int)10 * sizeof(long long));
+    memset_llong_FF(dest,(unsigned long)10 * sizeof(long long));
+  memset_llong_FF(res,(unsigned long)10 * sizeof(long long));
   return;
 }
 
@@ -690,8 +692,8 @@ unsigned long long *memset_ullong_FF(unsigned long long *ptr, size_t len)
 void unsigned_long_long_integer(unsigned long long *dest)
 {
   unsigned long long *res =
-    memset_ullong_FF(dest,(unsigned int)10 * sizeof(unsigned long long));
-  memset_ullong_FF(res,(unsigned int)10 * sizeof(unsigned long long));
+    memset_ullong_FF(dest,(unsigned long)10 * sizeof(unsigned long long));
+  memset_ullong_FF(res,(unsigned long)10 * sizeof(unsigned long long));
   return;
 }
 
@@ -716,15 +718,15 @@ float *memset_float_FF(float *ptr, size_t len)
 
 void floats(float *dest)
 {
-  float *res = memset_float_FF(dest,(unsigned int)10 * sizeof(float));
-  memset_float_FF(res,(unsigned int)10 * sizeof(float));
+  float *res = memset_float_FF(dest,(unsigned long)10 * sizeof(float));
+  memset_float_FF(res,(unsigned long)10 * sizeof(float));
   return;
 }
 
 void with_named(named *dest)
 {
-  named *res = memset_int_FF(dest,(unsigned int)10 * sizeof(named));
-  memset_int_FF(res,(unsigned int)10 * sizeof(named));
+  named *res = memset_int_FF(dest,(unsigned long)10 * sizeof(named));
+  memset_int_FF(res,(unsigned long)10 * sizeof(named));
   return;
 }
 
@@ -752,21 +754,21 @@ struct X *memset_st_X_FF(struct X *ptr, size_t len)
 
 void structure(struct X *dest)
 {
-  struct X *res = memset_st_X_FF(dest,(unsigned int)10 * sizeof(struct X));
-  memset_st_X_FF(res,(unsigned int)10 * sizeof(struct X));
+  struct X *res = memset_st_X_FF(dest,(unsigned long)10 * sizeof(struct X));
+  memset_st_X_FF(res,(unsigned long)10 * sizeof(struct X));
   return;
 }
 
-/*@ requires aligned_end: len % 4 ≡ 0;
+/*@ requires aligned_end: len % 8 ≡ 0;
     requires
-      valid_dest: \let __fc_len = len / 4; \valid(ptr + (0 .. __fc_len - 1));
+      valid_dest: \let __fc_len = len / 8; \valid(ptr + (0 .. __fc_len - 1));
     ensures
       set_content:
-        \let __fc_len = \old(len) / 4;
+        \let __fc_len = \old(len) / 8;
         ∀ ℤ j0; 0 ≤ j0 < __fc_len ⇒ ¬\valid_read(*(\old(ptr) + j0));
     ensures result: \result ≡ \old(ptr);
-    assigns *(ptr + (0 .. len / 4 - 1)), \result;
-    assigns *(ptr + (0 .. len / 4 - 1)) \from \nothing;
+    assigns *(ptr + (0 .. len / 8 - 1)), \result;
+    assigns *(ptr + (0 .. len / 8 - 1)) \from \nothing;
     assigns \result \from ptr;
  */
 int **memset_ptr_int_FF(int **ptr, size_t len)
@@ -778,8 +780,8 @@ int **memset_ptr_int_FF(int **ptr, size_t len)
 
 void pointers(int **dest)
 {
-  int **res = memset_ptr_int_FF(dest,(unsigned int)10 * sizeof(int *));
-  memset_ptr_int_FF(res,(unsigned int)10 * sizeof(int *));
+  int **res = memset_ptr_int_FF(dest,(unsigned long)10 * sizeof(int *));
+  memset_ptr_int_FF(res,(unsigned long)10 * sizeof(int *));
   return;
 }
 
@@ -808,22 +810,22 @@ int (*memset_arr10_int_FF(int (*ptr)[10], size_t len))[10]
 void nested(int (*dest)[10], int n)
 {
   int (*res)[10] =
-    memset_arr10_int_FF(dest,(unsigned int)n * sizeof(int [10]));
-  memset_arr10_int_FF(res,(unsigned int)n * sizeof(int [10]));
+    memset_arr10_int_FF(dest,(unsigned long)n * sizeof(int [10]));
+  memset_arr10_int_FF(res,(unsigned long)n * sizeof(int [10]));
   return;
 }
 
 void with_void(void *dest)
 {
-  void *res = memset(dest,0xFF,(unsigned int)10);
-  memset(res,0xFF,(unsigned int)10);
+  void *res = memset(dest,0xFF,(unsigned long)10);
+  memset(res,0xFF,(unsigned long)10);
   return;
 }
 
 void with_null_or_int(void)
 {
-  memset((void *)0,0xFF,(unsigned int)10);
-  memset((void *)((int *)42),0xFF,(unsigned int)10);
+  memset((void *)0,0xFF,(unsigned long)10);
+  memset((void *)((int *)42),0xFF,(unsigned long)10);
   return;
 }
 
diff --git a/src/plugins/instantiate/tests/string/oracle/memset_value.res.oracle b/src/plugins/instantiate/tests/string/oracle/memset_value.res.oracle
index 649276af3705a37ee10c86a6c81581729b9bade3..0299c12492b51412377ca28446e9223f579fa11e 100644
--- a/src/plugins/instantiate/tests/string/oracle/memset_value.res.oracle
+++ b/src/plugins/instantiate/tests/string/oracle/memset_value.res.oracle
@@ -68,8 +68,8 @@ char *memset_char(char *ptr, char value, size_t len)
 
 void chars(char * /*[10]*/ dest, char value)
 {
-  char *res = memset_char(dest,value,(unsigned int)10);
-  memset_char(res,value,(unsigned int)10);
+  char *res = memset_char(dest,value,(unsigned long)10);
+  memset_char(res,value,(unsigned long)10);
   return;
 }
 
@@ -92,8 +92,8 @@ unsigned char *memset_uchar(unsigned char *ptr, unsigned char value,
 
 void uchars(char * /*[10]*/ dest, unsigned char value)
 {
-  unsigned char *res = memset_char(dest,(char)value,(unsigned int)10);
-  memset_uchar(res,value,(unsigned int)10);
+  unsigned char *res = memset_char(dest,(char)value,(unsigned long)10);
+  memset_uchar(res,value,(unsigned long)10);
   return;
 }
 
@@ -120,73 +120,74 @@ char (*memset_arr10_char(char (*ptr)[10], char value, size_t len))[10]
 
 void nested_chars(char (* /*[10]*/ dest)[10], char value)
 {
-  char (*res)[10] = memset_arr10_char(dest,value,(unsigned int)100);
-  memset_arr10_char(res,value,(unsigned int)100);
+  char (*res)[10] = memset_arr10_char(dest,value,(unsigned long)100);
+  memset_arr10_char(res,value,(unsigned long)100);
   return;
 }
 
 void integer(int * /*[10]*/ dest, int value)
 {
-  int *res = memset((void *)dest,value,(unsigned int)10 * sizeof(int));
-  memset((void *)res,value,(unsigned int)10 * sizeof(int));
+  int *res = memset((void *)dest,value,(unsigned long)10 * sizeof(int));
+  memset((void *)res,value,(unsigned long)10 * sizeof(int));
   return;
 }
 
 void with_enum(enum E * /*[10]*/ dest, int value)
 {
-  enum E *res = memset((void *)dest,value,(unsigned int)10 * sizeof(enum E));
-  memset((void *)res,value,(unsigned int)10 * sizeof(enum E));
+  enum E *res =
+    memset((void *)dest,value,(unsigned long)10 * sizeof(enum E));
+  memset((void *)res,value,(unsigned long)10 * sizeof(enum E));
   return;
 }
 
 void with_named(named * /*[10]*/ dest, int value)
 {
-  named *res = memset((void *)dest,value,(unsigned int)10 * sizeof(named));
-  memset((void *)res,value,(unsigned int)10 * sizeof(named));
+  named *res = memset((void *)dest,value,(unsigned long)10 * sizeof(named));
+  memset((void *)res,value,(unsigned long)10 * sizeof(named));
   return;
 }
 
 void structure(struct X * /*[10]*/ dest, int value)
 {
   struct X *res =
-    memset((void *)dest,value,(unsigned int)10 * sizeof(struct X));
-  memset((void *)res,value,(unsigned int)10 * sizeof(struct X));
+    memset((void *)dest,value,(unsigned long)10 * sizeof(struct X));
+  memset((void *)res,value,(unsigned long)10 * sizeof(struct X));
   return;
 }
 
 void pointers(int ** /*[10]*/ dest, int value)
 {
-  int **res = memset((void *)dest,value,(unsigned int)10 * sizeof(int *));
-  memset((void *)res,value,(unsigned int)10 * sizeof(int *));
+  int **res = memset((void *)dest,value,(unsigned long)10 * sizeof(int *));
+  memset((void *)res,value,(unsigned long)10 * sizeof(int *));
   return;
 }
 
 void nested(int (*dest)[10], int n, int value)
 {
   int (*res)[10] =
-    memset((void *)dest,value,(unsigned int)n * sizeof(int [10]));
-  memset((void *)res,value,(unsigned int)n * sizeof(int [10]));
+    memset((void *)dest,value,(unsigned long)n * sizeof(int [10]));
+  memset((void *)res,value,(unsigned long)n * sizeof(int [10]));
   return;
 }
 
 void with_void(void *dest, int value)
 {
-  void *res = memset(dest,value,(unsigned int)10);
-  memset(res,value,(unsigned int)10);
+  void *res = memset(dest,value,(unsigned long)10);
+  memset(res,value,(unsigned long)10);
   return;
 }
 
 void with_incomplete(struct incomplete *dest, int value)
 {
-  struct incomplete *res = memset((void *)dest,value,(unsigned int)10);
-  memset((void *)res,value,(unsigned int)10);
+  struct incomplete *res = memset((void *)dest,value,(unsigned long)10);
+  memset((void *)res,value,(unsigned long)10);
   return;
 }
 
 void with_null_or_int(int value)
 {
-  memset((void *)0,value,(unsigned int)10);
-  memset((void *)((int *)42),value,(unsigned int)10);
+  memset((void *)0,value,(unsigned long)10);
+  memset((void *)((int *)42),value,(unsigned long)10);
   return;
 }
 
@@ -227,8 +228,8 @@ char *memset_char(char *ptr, char value, size_t len)
 
 void chars(char *dest, char value)
 {
-  char *res = memset_char(dest,value,(unsigned int)10);
-  memset_char(res,value,(unsigned int)10);
+  char *res = memset_char(dest,value,(unsigned long)10);
+  memset_char(res,value,(unsigned long)10);
   return;
 }
 
@@ -253,8 +254,8 @@ unsigned char *memset_uchar(unsigned char *ptr, unsigned char value,
 
 void uchars(char *dest, unsigned char value)
 {
-  unsigned char *res = memset_char(dest,(char)value,(unsigned int)10);
-  memset_uchar(res,value,(unsigned int)10);
+  unsigned char *res = memset_char(dest,(char)value,(unsigned long)10);
+  memset_uchar(res,value,(unsigned long)10);
   return;
 }
 
@@ -282,73 +283,74 @@ char (*memset_arr10_char(char (*ptr)[10], char value, size_t len))[10]
 
 void nested_chars(char (*dest)[10], char value)
 {
-  char (*res)[10] = memset_arr10_char(dest,value,(unsigned int)100);
-  memset_arr10_char(res,value,(unsigned int)100);
+  char (*res)[10] = memset_arr10_char(dest,value,(unsigned long)100);
+  memset_arr10_char(res,value,(unsigned long)100);
   return;
 }
 
 void integer(int *dest, int value)
 {
-  int *res = memset((void *)dest,value,(unsigned int)10 * sizeof(int));
-  memset((void *)res,value,(unsigned int)10 * sizeof(int));
+  int *res = memset((void *)dest,value,(unsigned long)10 * sizeof(int));
+  memset((void *)res,value,(unsigned long)10 * sizeof(int));
   return;
 }
 
 void with_enum(enum E *dest, int value)
 {
-  enum E *res = memset((void *)dest,value,(unsigned int)10 * sizeof(enum E));
-  memset((void *)res,value,(unsigned int)10 * sizeof(enum E));
+  enum E *res =
+    memset((void *)dest,value,(unsigned long)10 * sizeof(enum E));
+  memset((void *)res,value,(unsigned long)10 * sizeof(enum E));
   return;
 }
 
 void with_named(named *dest, int value)
 {
-  named *res = memset((void *)dest,value,(unsigned int)10 * sizeof(named));
-  memset((void *)res,value,(unsigned int)10 * sizeof(named));
+  named *res = memset((void *)dest,value,(unsigned long)10 * sizeof(named));
+  memset((void *)res,value,(unsigned long)10 * sizeof(named));
   return;
 }
 
 void structure(struct X *dest, int value)
 {
   struct X *res =
-    memset((void *)dest,value,(unsigned int)10 * sizeof(struct X));
-  memset((void *)res,value,(unsigned int)10 * sizeof(struct X));
+    memset((void *)dest,value,(unsigned long)10 * sizeof(struct X));
+  memset((void *)res,value,(unsigned long)10 * sizeof(struct X));
   return;
 }
 
 void pointers(int **dest, int value)
 {
-  int **res = memset((void *)dest,value,(unsigned int)10 * sizeof(int *));
-  memset((void *)res,value,(unsigned int)10 * sizeof(int *));
+  int **res = memset((void *)dest,value,(unsigned long)10 * sizeof(int *));
+  memset((void *)res,value,(unsigned long)10 * sizeof(int *));
   return;
 }
 
 void nested(int (*dest)[10], int n, int value)
 {
   int (*res)[10] =
-    memset((void *)dest,value,(unsigned int)n * sizeof(int [10]));
-  memset((void *)res,value,(unsigned int)n * sizeof(int [10]));
+    memset((void *)dest,value,(unsigned long)n * sizeof(int [10]));
+  memset((void *)res,value,(unsigned long)n * sizeof(int [10]));
   return;
 }
 
 void with_void(void *dest, int value)
 {
-  void *res = memset(dest,value,(unsigned int)10);
-  memset(res,value,(unsigned int)10);
+  void *res = memset(dest,value,(unsigned long)10);
+  memset(res,value,(unsigned long)10);
   return;
 }
 
 void with_incomplete(struct incomplete *dest, int value)
 {
-  struct incomplete *res = memset((void *)dest,value,(unsigned int)10);
-  memset((void *)res,value,(unsigned int)10);
+  struct incomplete *res = memset((void *)dest,value,(unsigned long)10);
+  memset((void *)res,value,(unsigned long)10);
   return;
 }
 
 void with_null_or_int(int value)
 {
-  memset((void *)0,value,(unsigned int)10);
-  memset((void *)((int *)42),value,(unsigned int)10);
+  memset((void *)0,value,(unsigned long)10);
+  memset((void *)((int *)42),value,(unsigned long)10);
   return;
 }
 
diff --git a/src/plugins/markdown-report/.gitignore b/src/plugins/markdown-report/.gitignore
index 8a5c93484e4875417866d11841488e2b154669b2..9f63f866593fb8546d1562b3b1bef39e4b7f6bfc 100644
--- a/src/plugins/markdown-report/.gitignore
+++ b/src/plugins/markdown-report/.gitignore
@@ -1,5 +1,4 @@
 *.cm*
-META.*
 *.o
 top/
 *.check_mli_exists
diff --git a/src/plugins/markdown-report/META.in b/src/plugins/markdown-report/META.in
new file mode 100644
index 0000000000000000000000000000000000000000..28043759d7571d4c856d12af47d511f662f0a1ef
--- /dev/null
+++ b/src/plugins/markdown-report/META.in
@@ -0,0 +1,12 @@
+description = "Frama-C Markdown_report plug-in"
+version = "@VERSION@"
+requires = "frama-c.kernel ppx_deriving ppx_deriving_yojson yojson"
+archive(byte) = "top/Markdown_report.cmo"
+archive(native) = "top/Markdown_report.cmx"
+plugin(native) = "top/Markdown_report.cmxs"
+plugin(byte) = "top/Markdown_report.cmo"
+package "eva_info" (
+  requires = "frama-c-markdown_report frama-c-eva"
+  plugin(native) = "top/eva_info.cmxs"
+  plugin(byte) = "top/eva_info.cmo"
+)
diff --git a/src/plugins/markdown-report/Makefile.in b/src/plugins/markdown-report/Makefile.in
index 7b32d90509d83589749d5d54de4e917a3d34f836..08dec2b3520bd3c3cc80e203121373bce8dce2e5 100644
--- a/src/plugins/markdown-report/Makefile.in
+++ b/src/plugins/markdown-report/Makefile.in
@@ -32,17 +32,38 @@ endif
 PLUGIN_DIR ?=.
 PLUGIN_ENABLE:=@ENABLE_MDR@
 PLUGIN_NAME:=Markdown_report
+PLUGIN_HAS_META:=yes
 PLUGIN_GENERATED:=$(PLUGIN_DIR)/Markdown_report.mli
 PLUGIN_CMO:=\
-  sarif mdr_params parse_remarks \
-  eva_coverage md_gen sarif_gen mdr_register
+  sarif mdr_params parse_remarks md_gen sarif_gen mdr_register
 PLUGIN_DISTRIBUTED:=$(PLUGIN_ENABLE)
 PLUGIN_REQUIRES:=ppx_deriving ppx_deriving_yojson yojson
-PLUGIN_DISTRIB_EXTERNAL:= Makefile.in configure.ac configure share/acsl.xml
-PLUGIN_TESTS_DIRS:= eva
+PLUGIN_DISTRIB_EXTERNAL:=\
+ Makefile.in configure.ac configure share/acsl.xml META.in \
+ eva_info.ml eva_info.mli
+PLUGIN_DEPFLAGS:= $(PLUGIN_DIR)/eva_info.mli $(PLUGIN_DIR)/eva_info.ml
+PLUGIN_TESTS_DIRS:= md sarif
 
 include $(FRAMAC_SHARE)/Makefile.dynamic
 
+ifneq (@ENABLE_MDR@,no)
+ifneq ($(ENABLE_EVA), no)
+byte:: $(PLUGIN_LIB_DIR)/top/eva_info.cmo $(PLUGIN_LIB_DIR)/top/eva_info.cmi
+opt:: $(PLUGIN_LIB_DIR)/top/eva_info.cmxs $(PLUGIN_LIB_DIR)/top/eva_info.cmi
+install::
+	$(MKDIR) $(PLUGIN_INSTALL_DIR)/top
+	$(CP) $(PLUGIN_LIB_DIR)/top/eva_info.cm* $(PLUGIN_INSTALL_DIR)/top
+
+$(PLUGIN_LIB_DIR)/top/eva_info.cm%: $(Markdown_report_DIR)/eva_info.cm%
+	$(MKDIR) $(dir $@)
+	$(CP) $< $@
+
+$(Markdown_report_DIR)/eva_info.cmo: BFLAGS+=-I $(Markdown_report_DIR)
+$(Markdown_report_DIR)/eva_info.cmx: OFLAGS+=-I $(Markdown_report_DIR)
+
+endif
+endif
+
 $(Markdown_report_DIR)/Markdown_report.mli: \
   $(Markdown_report_DIR)/mdr_params.mli \
   $(Markdown_report_DIR)/md_gen.mli \
@@ -54,6 +75,14 @@ $(Markdown_report_DIR)/Markdown_report.mli: \
 	cat $(Markdown_report_DIR)/md_gen.mli >> $@
 	echo "end" >> $@
 
+VERSION:=$(shell $(CAT) $(FRAMAC_SRC)/VERSION)
+
+$(Markdown_report_DIR)/META: $(Markdown_report_DIR)/META.in $(FRAMAC_SRC)/VERSION
+	$(PRINT_MAKING) $@
+	$(RM) $@
+	$(SED) -e 's|@VERSION@|$(VERSION)|' $< > $@
+	$(CHMOD_RO) $@
+
 ifeq ("$(FRAMAC_INTERNAL)","yes")
 CONFIG_STATUS_DIR=$(FRAMAC_SRC)
 else
diff --git a/src/plugins/markdown-report/configure.ac b/src/plugins/markdown-report/configure.ac
index f9fb685d2009e4f62e42b4843106c3feab70c1df..b187dc61bc24ba6f6b6bad4032bce49f0632ea4c 100644
--- a/src/plugins/markdown-report/configure.ac
+++ b/src/plugins/markdown-report/configure.ac
@@ -35,6 +35,8 @@ m4_ifndef([FRAMAC_M4_MACROS],
 
 check_plugin(mdr,PLUGIN_RELATIVE_PATH(plugin_file),[Markdown/SARIF report plug-in],yes)
 
+plugin_use(mdr,eva)
+
 plugin_require_pkg(mdr,ppx_deriving)
 plugin_require_pkg(mdr,ppx_deriving_yojson)
 
diff --git a/src/plugins/markdown-report/dune b/src/plugins/markdown-report/dune
index a575201194ea759efc6251914f33a3b2f7e08546..dc500e00223dcd146304f2a44248117a89233be0 100644
--- a/src/plugins/markdown-report/dune
+++ b/src/plugins/markdown-report/dune
@@ -13,7 +13,7 @@
   (public_name frama-c-markdown-report.core)
   (optional)
   (flags -open Frama_c_kernel)
-  (libraries frama-c.kernel frama-c-eva.core)
+  (libraries frama-c.kernel)
   (preprocess (pps ppx_deriving_yojson))
 )
 
diff --git a/src/plugins/markdown-report/eva-info/dune b/src/plugins/markdown-report/eva-info/dune
new file mode 100644
index 0000000000000000000000000000000000000000..6a98cce2420c343fd4021d28d2a919002c898dbf
--- /dev/null
+++ b/src/plugins/markdown-report/eva-info/dune
@@ -0,0 +1,21 @@
+(rule
+ (alias frama-c-configure)
+ (deps (universe))
+ (action (progn
+          (echo "markdown-report.eva-info:" %{lib-available:frama-c-markdown-report.eva-info} "\n")
+          (echo "  - markdown-report.core:" %{lib-available:markdown-report.core} "\n")
+          (echo "  - eva.core:" %{lib-available:eva.core} "\n")
+  )
+  )
+)
+
+( library
+  (name markdown_report_eva_info)
+  (public_name frama-c-markdown-report.eva-info)
+  (optional)
+  (flags -open Frama_c_kernel)
+  (libraries frama-c.kernel frama-c-eva.core frama-c-markdown-report.core)
+  (preprocess (pps ppx_deriving_yojson))
+)
+
+(plugin (optional) (name markdown-report-eva-info) (libraries frama-c-markdown-report.eva-info) (site (frama-c plugins)))
diff --git a/src/plugins/markdown-report/eva_coverage.ml b/src/plugins/markdown-report/eva-info/eva_info.ml
similarity index 91%
rename from src/plugins/markdown-report/eva_coverage.ml
rename to src/plugins/markdown-report/eva-info/eva_info.ml
index 1308a8b29b8077af7ebb9ea5b4fd685e2b3e5f36..5df8dbbefda486fe5918bb38ab77b3b981c1bbf4 100644
--- a/src/plugins/markdown-report/eva_coverage.ml
+++ b/src/plugins/markdown-report/eva-info/eva_info.ml
@@ -56,8 +56,7 @@ let direct_call = { indirect_call with call = Direct }
 let visit info = { info with visited = true; }
 
 let is_analyzed_function vi =
-  not (Cil.hasAttribute "fc_stdlib" vi.vattr) &&
-  not (Cil.hasAttribute "fc_stdlib_generated" vi.vattr) &&
+  not (Cil.is_in_libc vi.vattr) &&
   Kernel_function.is_definition (Globals.Functions.get vi) &&
   not (List.exists
          (fun s ->
@@ -68,7 +67,7 @@ let is_analyzed_function vi =
                    vi)
               (Globals.FileIndex.get_functions
                  (Filepath.Normalized.of_string s)))
-         (Mdr_params.Stubs.get())) &&
+         (Markdown_report.Mdr_params.Stubs.get())) &&
   not (List.mem vi.vname
          (String.split_on_char ','
             (Dynamic.Parameter.String.get "-eva-use-spec" ()))) &&
@@ -114,7 +113,7 @@ class eva_coverage_vis ~from_entry_point = object(self)
       end;
       Cil.SkipChildren
     | Call(_,{ enode = Lval (Mem _,NoOffset)},_,_) ->
-      let s = Extlib.the self#current_stmt in
+      let s = Option.get self#current_stmt in
       let kfs = Db.Value.call_to_kernel_function s in
       let handle_one kf =
         let vi = Kernel_function.get_vi kf in
@@ -184,7 +183,9 @@ let nb_fundefs () =
           is_analyzed_function (Kernel_function.get_vi kf)
        then nb + 1 else nb) 0
 
-let md_gen () =
+open Markdown
+
+let coverage_md_gen () =
   let main = Kernel.MainFunction.get () in
   !Db.Value.compute ();
   let vis = new eva_coverage_vis ~from_entry_point:false in
@@ -192,7 +193,7 @@ let md_gen () =
   let summary_whole =
     Markdown.format
       "There are %d function definitions that are not stubbed. They represent \
-       %d statements, of which %d are potentially reachable through EVA, \
+       %d statements, of which %d are potentially reachable through Eva, \
        resulting in a **statement coverage of %.1f%%** with respect to the \
        entire application."
       (nb_fundefs())
@@ -220,11 +221,22 @@ let md_gen () =
     summary @
     Markdown.format
       "These functions contain %d statements, \
-       of which %d are potentially reachable according to EVA, resulting in \
+       of which %d are potentially reachable according to Eva, resulting in \
        a **statement coverage of %.1f%%** with respect to the perimeter set \
        by this entry point."
       stats.total_stmts stats.covered_stmts
       (float_of_int stats.covered_stmts *. 100. /.
        float_of_int stats.total_stmts)
   in
-  Markdown.([ Block [Text summary_whole]; Block [Text summary ]])
+  [ Block [Text summary_whole]; Block [Text summary ]]
+
+let domains_md_gen () =
+  let eva_domains = Eva.Value_parameters.enabled_domains () in
+  let domains = List.filter (fun (name, _) -> name <> "cvalue") eva_domains in
+  let aux (name, descr) = (plain "domain" @ bold name), plain descr in
+  List.map aux domains
+
+let () =
+  Markdown_report.Md_gen.Eva_info.coverage_md_gen := coverage_md_gen;
+  Markdown_report.Md_gen.Eva_info.domains_md_gen := domains_md_gen;
+  Markdown_report.Md_gen.Eva_info.loaded := true
diff --git a/src/plugins/markdown-report/eva-info/eva_info.mli b/src/plugins/markdown-report/eva-info/eva_info.mli
new file mode 100644
index 0000000000000000000000000000000000000000..7ba39b81ae472b3543306e442b123eefc3ee6340
--- /dev/null
+++ b/src/plugins/markdown-report/eva-info/eva_info.mli
@@ -0,0 +1,24 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  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).            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(** Only loaded when Eva is loaded. Nothing is exported, rather the module
+    does fill the functions of {!Md_gen.Eva_info}. *)
diff --git a/src/plugins/markdown-report/md_gen.ml b/src/plugins/markdown-report/md_gen.ml
index 2c342d7285f90966395484b127e28bdba7f74925..2930c0065138c7bf4ddedd0517ba8ccc6cd92849 100644
--- a/src/plugins/markdown-report/md_gen.ml
+++ b/src/plugins/markdown-report/md_gen.ml
@@ -23,6 +23,13 @@
 open Cil_types
 open Markdown
 
+module Eva_info = struct
+  let loaded = ref false
+  let coverage_md_gen: (unit -> elements) ref = Extlib.mk_fun "coverage_md_gen"
+  let domains_md_gen: (unit -> (text * text) list) ref=
+    Extlib.mk_fun "domains_md_gen"
+end
+
 type env =
   { is_draft: bool;
     remarks: Markdown.element list Datatype.String.Map.t; }
@@ -49,21 +56,15 @@ let plural l s =
   | [] | [ _ ] -> s
   | _::_::_ -> s ^ "s"
 
-let get_eva_domains () =
-  let eva_domains = Eva.Value_parameters.enabled_domains () in
-  let domains = List.filter (fun (name, _) -> name <> "cvalue") eva_domains in
-  let aux (name, descr) = (plain "domain" @ bold name), plain descr in
-  List.map aux domains
-
 let section_domains env =
   let anchor = "domains" in
-  let head = H3 (plain "EVA Domains", Some anchor) in
+  let head = H3 (plain "Eva Domains", Some anchor) in
   if env.is_draft then
     head
-    :: Comment "You can give more information about the choice of EVA domains"
+    :: Comment "You can give more information about the choice of Eva domains"
     :: insert_marks env anchor
   else begin
-    let l = get_eva_domains () in
+    let l = !Eva_info.domains_md_gen () in
     head
     :: Block
       (match l with
@@ -76,7 +77,7 @@ let section_domains env =
          [Text
             (plain
                "In addition to the base domain (`cvalue`), additional \
-                domains have been used by EVA");
+                domains have been used by Eva");
           DL l]
       )
     :: insert_remark env anchor
@@ -94,7 +95,6 @@ let section_stubs env =
   in
   let stubbed_kf = List.filter Kernel_function.is_definition stubbed_kf in
   let opt = Dynamic.Parameter.String.get "-eva-use-spec" () in
-  (* NB: requires OCaml >= 4.04 *)
   let l = String.split_on_char ',' opt in
   let use_spec =
     Extlib.filter_map
@@ -259,7 +259,7 @@ let gen_context env =
   H1 (plain "Context of the analysis", Some "context")
   :: gen_inputs env
   @ gen_config env
-  @ section_domains env
+  @ (if !Eva_info.loaded then section_domains env else [])
   @ H3 (plain "Stubbed Functions", Some "stubs")
     :: (
       if env.is_draft then
@@ -272,11 +272,11 @@ let gen_context env =
 let gen_coverage env =
   let anchor = "coverage" in
   let header = H1 (plain "Coverage", Some anchor) in
-  let content = Eva_coverage.md_gen () in
+  let content = !Eva_info.coverage_md_gen () in
   let content =
     if env.is_draft then
       content @
-      Comment "You can comment on the coverage obtained by EVA"
+      Comment "You can comment on the coverage obtained by Eva"
       :: insert_marks env anchor
     else
       content @ insert_remark env anchor
@@ -569,7 +569,7 @@ let gen_report ~draft:is_draft () =
   let remarks = mk_remarks is_draft in
   let env = { remarks; is_draft } in
   let context = gen_context env in
-  let coverage = gen_coverage env in
+  let coverage = if !Eva_info.loaded then gen_coverage env else [] in
   let alarms = gen_alarms env in
   let title = Mdr_params.Title.get () in
   let title =
diff --git a/src/plugins/markdown-report/md_gen.mli b/src/plugins/markdown-report/md_gen.mli
index 0a7374f90f792a6338878fe0d96fefd24d81ad81..3083a44b11acce51fddddb0ad1f9b15969d63aff 100644
--- a/src/plugins/markdown-report/md_gen.mli
+++ b/src/plugins/markdown-report/md_gen.mli
@@ -22,3 +22,10 @@
 
 (** generates the report (either final or [draft] according to the flag) *)
 val gen_report: draft:bool -> unit -> unit
+
+(** Filled when Eva is loaded. *)
+module Eva_info: sig
+  val loaded: bool ref
+  val coverage_md_gen: (unit -> Markdown.elements) ref
+  val domains_md_gen: (unit -> (Markdown.text * Markdown.text) list) ref
+end
diff --git a/src/plugins/markdown-report/mdr_params.ml b/src/plugins/markdown-report/mdr_params.ml
index ce052fa96fddda7cf1c709be133ad75ca4847083..249abea7136e46b3affad7a6143c7d7cf23897cd 100644
--- a/src/plugins/markdown-report/mdr_params.ml
+++ b/src/plugins/markdown-report/mdr_params.ml
@@ -112,3 +112,17 @@ module Stubs = String_list(
     let arg_name = "f1,...,fn"
     let help = "list of C files containing stub functions"
   end)
+
+module PrintLibc = True(
+  struct
+    let option_name = "-mdr-print-libc"
+    let help =
+      "when set (default), reports include information about libc elements."
+  end)
+
+module SarifDeterministic = False(
+  struct
+    let option_name = "-mdr-sarif-deterministic"
+    let help = "omits non-deterministic data from SARIF reports, such as \
+                absolute file URIs and timestamps."
+  end)
diff --git a/src/plugins/markdown-report/mdr_params.mli b/src/plugins/markdown-report/mdr_params.mli
index 34d405af386b627dbf467ce1ac4b6a94b921c1fa..08b54d5c06f33be1eec7d58f77e2a7c78de8c242 100644
--- a/src/plugins/markdown-report/mdr_params.mli
+++ b/src/plugins/markdown-report/mdr_params.mli
@@ -45,3 +45,9 @@ module Date: Parameter_sig.String
 
 (** Value of [-mdr-stubs]. *)
 module Stubs: Parameter_sig.String_list
+
+(** Value of [-mdr-print-libc]. *)
+module PrintLibc: Parameter_sig.Bool
+
+(** Value of [-mdr-sarif-deterministic]. *)
+module SarifDeterministic: Parameter_sig.Bool
diff --git a/src/plugins/markdown-report/mdr_register.ml b/src/plugins/markdown-report/mdr_register.ml
index 09080fadc158d0ca0aa3b28ee3cf5298753a5320..06794e0ab7f0b353b05822bedce2757aa8510124 100644
--- a/src/plugins/markdown-report/mdr_register.ml
+++ b/src/plugins/markdown-report/mdr_register.ml
@@ -30,4 +30,5 @@ let main () =
     Mdr_params.fatal "Unexpected value for option %s: %s"
       Mdr_params.Generate.option_name s
 
-let () = Db.Main.extend main
+let () =
+  Db.Main.extend main
diff --git a/src/plugins/markdown-report/sarif.ml b/src/plugins/markdown-report/sarif.ml
index e50d9262a43d86b80a48ebdccb28b14f4bc8a12c..2e7dd60ca16175d36a351fd099805734b5c540c9 100644
--- a/src/plugins/markdown-report/sarif.ml
+++ b/src/plugins/markdown-report/sarif.ml
@@ -98,10 +98,8 @@ module ArtifactLocation = struct
   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 uriBaseId, uri = Filepath.(Normalized.to_base_uri (fst loc).pos_path) in
+    create ~uri ?uriBaseId ()
 end
 
 module ArtifactLocationDictionary = Json_dictionary(ArtifactLocation)
@@ -462,6 +460,7 @@ module Driver = struct
     semanticVersion: (string [@default ""]);
     fileVersion: (string [@default ""]);
     downloadUri: (string [@default ""]);
+    informationUri: (string [@default ""]);
     sarifLoggerVersion: (string [@default ""]);
     language: (string [@default "en-US"]);
     properties: (Properties.t [@default Properties.default]);
@@ -474,13 +473,14 @@ module Driver = struct
       ?(semanticVersion="")
       ?(fileVersion="")
       ?(downloadUri="")
+      ?(informationUri="")
       ?(sarifLoggerVersion="")
       ?(language="en-US")
       ?(properties=Properties.default)
       ()
     =
     { name; fullName; version; semanticVersion; fileVersion;
-      downloadUri; sarifLoggerVersion; language; properties }
+      downloadUri; informationUri; sarifLoggerVersion; language; properties }
 
   let default = create ~name:"" ()
 end
diff --git a/src/plugins/markdown-report/sarif_gen.ml b/src/plugins/markdown-report/sarif_gen.ml
index 278073346ff33b4e1250082da7ab6c53033016af..37fd6b824e300ae8820e6581f6eea17ac26aa84a 100644
--- a/src/plugins/markdown-report/sarif_gen.ml
+++ b/src/plugins/markdown-report/sarif_gen.ml
@@ -22,14 +22,20 @@
 
 open Sarif
 
-let frama_c_sarif =
+let frama_c_sarif () =
   let name = "frama-c" in
-  let version = Fc_config.version_and_codename in
-  let semanticVersion = Fc_config.version in
+  let version, semanticVersion =
+    if Mdr_params.SarifDeterministic.get () then
+      "0+omitted-for-deterministic-output", ""
+    else
+      Fc_config.version_and_codename, Fc_config.version
+  in
   let fullName = name ^ "-" ^ version in
   let downloadUri = "https://frama-c.com/download.html" in
+  let informationUri = "https://frama-c.com" in
   Tool.create
-    (Driver.create ~name ~version ~semanticVersion ~fullName ~downloadUri ())
+    (Driver.create ~name ~version ~semanticVersion ~fullName ~downloadUri
+       ~informationUri ())
 
 let get_remarks () =
   let f = Mdr_params.Remarks.get () in
@@ -41,21 +47,46 @@ let get_remark remarks label =
   | None -> []
   | Some l -> l
 
-let command_line () = Array.to_list Sys.argv
-
+(* keep track of command line arguments for all invocations of Frama-C during
+   a save/load sequence. Note that the list is in reverse order
+   (newest invocation first).
+*)
 module Analysis_cmdline =
-  State_builder.Ref(Datatype.List(Datatype.String))
+  State_builder.List_ref(Datatype.List(Datatype.String))
     (struct
       let name = "Sarif_gen.Analysis_cmdline"
       let dependencies = []
-      let default = command_line
     end)
 
+let command_line () = Array.to_list Sys.argv
+
+let update_cmdline =
+  let already_updated = ref false in
+  fun () ->
+    if not (!already_updated) then begin
+      (* This function must be run after the loading stage, so that
+         the Analysis_cmdline state contains the list of previous launches
+         if any. However, `-then` restart the boot sequence from the loading
+         included, meaning that the hook will be replayed _also_ after each
+         `-then`. Using a _non-projectified_ boolean ref ensures that we add
+         the command line only once per run. *)
+      already_updated := true;
+      Analysis_cmdline.add (command_line())
+    end
+
+let () = Cmdline.run_after_loading_stage update_cmdline
+
 let gen_invocation () =
-  let cl = Analysis_cmdline.get () in
-  let commandLine = String.concat " " cl in
-  let arguments = List.tl cl in
-  Invocation.create ~commandLine ~arguments ()
+  let cls = Analysis_cmdline.get () in
+  let gen_one cl =
+    (* The first argument is _always_ the binary name, but to avoid printing it
+       as an absolute path to binlevel.opt, we replace it with 'frama-c' *)
+    let cl = "frama-c" :: List.tl cl in
+    let commandLine = String.concat " " cl in
+    let arguments = List.tl cl in
+    Invocation.create ~commandLine ~arguments ()
+  in
+  List.rev_map gen_one cls
 
 let gen_remark alarm =
   let open Markdown in
@@ -107,27 +138,50 @@ let make_message alarm annot remark =
   in
   Message.create ~text ~markdown ()
 
+let kf_is_in_libc kf =
+  Cil.global_is_in_libc (Kernel_function.get_global kf)
+
+let ip_is_in_libc ip =
+  match Property.get_kf ip with
+  | None ->
+    (* possibly an identified lemma; check its attributes *)
+    begin
+      match ip with
+      | IPAxiomatic {iax_attrs=attrs}
+      | IPLemma {il_attrs=attrs}
+      | IPAxiom {il_attrs=attrs} ->
+        Cil.is_in_libc attrs
+      | _ ->
+        false
+    end
+  | Some kf ->
+    kf_is_in_libc kf
+
 let opt_physical_location_of_loc loc =
   if loc = Cil_datatype.Location.unknown then []
   else [ Location.of_loc loc ]
-
+(* Cil_types *)
 let gen_results remarks =
   let treat_alarm _e kf s ~rank:_ alarm annot (i, rules, content) =
-    let prop = Property.ip_of_code_annot_single kf s annot in
-    let ruleId = Alarms.get_name alarm in
-    let rules =
-      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 = opt_physical_location_of_loc (Cil_datatype.Stmt.loc s) in
-    let res =
-      Sarif_result.create ~kind ~level ~ruleId ~message ~locations ()
-    in
-    (i+1, rules, res :: content)
+    if not (Mdr_params.PrintLibc.get ()) && kf_is_in_libc kf then
+      (* skip alarm in libc *)
+      (i, rules, content)
+    else
+      let prop = Property.ip_of_code_annot_single kf s annot in
+      let ruleId = Alarms.get_name alarm in
+      let rules =
+        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 = opt_physical_location_of_loc (Cil_datatype.Stmt.loc s) in
+      let res =
+        Sarif_result.create ~kind ~level ~ruleId ~message ~locations ()
+      in
+      (i+1, rules, res :: content)
   in
   let _, rules, content =
     Alarms.fold treat_alarm (0, Datatype.String.Map.empty,[])
@@ -135,7 +189,7 @@ let gen_results remarks =
   rules, List.rev content
 
 let is_alarm = function
-  | Property.(IPCodeAnnot { ica_ca }) -> Extlib.has_some (Alarms.find ica_ca)
+  | Property.(IPCodeAnnot { ica_ca }) -> Option.is_some (Alarms.find ica_ca)
   | _ -> false
 
 let make_ip_message ip =
@@ -153,14 +207,18 @@ let gen_status ip =
 
 let gen_statuses () =
   let f ip content =
-    if is_alarm ip then content else (gen_status ip) :: content
+    let exclude =
+      is_alarm ip ||
+      (not (Mdr_params.PrintLibc.get ()) && ip_is_in_libc ip)
+    in
+    if exclude then content else (gen_status ip) :: content
   in
   List.rev (Property_status.fold f [])
 
 let gen_artifacts () =
   let add_src_file f =
-    let uri = (f:Filepath.Normalized.t :> string) in
-    let location = ArtifactLocation.create ~uri () in
+    let uriBaseId, uri = Filepath.Normalized.to_base_uri f in
+    let location = ArtifactLocation.create ~uri ?uriBaseId () in
     let roles = [ Role.analysisTarget ] in
     let mimeType = "text/x-csrc" in
     Artifact.create ~location ~roles ~mimeType ()
@@ -176,9 +234,9 @@ let add_rule id desc l =
 let make_taxonomies rules = Datatype.String.Map.fold add_rule rules []
 
 let gen_run remarks =
-  let tool = frama_c_sarif in
+  let tool = frama_c_sarif () in
   let name = "frama-c" in
-  let invocations = [gen_invocation ()] in
+  let invocations = gen_invocation () in
   let rules, results = gen_results remarks in
   let user_annot_results = gen_statuses () in
   let rules =
@@ -192,7 +250,24 @@ let gen_run remarks =
   let taxonomies = [ToolComponent.create ~name ~rules ()] in
   let results = results @ user_annot_results in
   let artifacts = gen_artifacts () in
-  Run.create ~tool ~invocations ~results ~taxonomies ~artifacts ()
+  let uriBases = ("PWD", Sys.getcwd ()) :: Filepath.all_symbolic_dirs () in
+  let uriBasesJson =
+    List.fold_left (fun acc (name, dir) ->
+        let baseUri =
+          if Mdr_params.SarifDeterministic.get () then
+            "file:///omitted-for-deterministic-output/"
+          else  "file://" ^ dir ^ "/"
+        in
+        (name, `Assoc [("uri", `String baseUri)]) :: acc
+      ) [] uriBases
+  in
+  let originalUriBaseIds =
+    match ArtifactLocationDictionary.of_yojson (`Assoc uriBasesJson) with
+    | Ok x -> x
+    | Error s -> failwith s
+  in
+  Run.create ~tool ~invocations ~results ~taxonomies ~artifacts
+    ~originalUriBaseIds ()
 
 let generate () =
   let remarks = get_remarks () in
diff --git a/src/plugins/markdown-report/tests/eva/cwe126.c b/src/plugins/markdown-report/tests/md/cwe126.c
similarity index 89%
rename from src/plugins/markdown-report/tests/eva/cwe126.c
rename to src/plugins/markdown-report/tests/md/cwe126.c
index 7f0a46663dc7ce92200ca9275d405b9ec3a00fa1..41e14b8fb93278cb1e4eb890090332bcbeabac20 100644
--- a/src/plugins/markdown-report/tests/eva/cwe126.c
+++ b/src/plugins/markdown-report/tests/md/cwe126.c
@@ -1,5 +1,11 @@
 /* run.config
+<<<<<<< HEAD:src/plugins/markdown-report/tests/eva/cwe126.c
    STDOPT: +"-mdr-remarks %{dep:@PTEST_NAME@.remarks.md}"
+||||||| ac7807782d:src/plugins/markdown-report/tests/eva/cwe126.c
+   OPT: -mdr-remarks tests/eva/cwe126.remarks.md
+=======
+   OPT: -mdr-remarks @PTEST_DIR@/cwe126.remarks.md
+>>>>>>> origin/master:src/plugins/markdown-report/tests/md/cwe126.c
  */
 
 /* extracted from Juliet test suite v1.3 for C
diff --git a/src/plugins/markdown-report/tests/eva/cwe126.remarks.md b/src/plugins/markdown-report/tests/md/cwe126.remarks.md
similarity index 100%
rename from src/plugins/markdown-report/tests/eva/cwe126.remarks.md
rename to src/plugins/markdown-report/tests/md/cwe126.remarks.md
diff --git a/src/plugins/markdown-report/tests/eva/oracle/cwe126.0.md b/src/plugins/markdown-report/tests/md/oracle/cwe126.0.md
similarity index 84%
rename from src/plugins/markdown-report/tests/eva/oracle/cwe126.0.md
rename to src/plugins/markdown-report/tests/md/oracle/cwe126.0.md
index 27c8a338e969cbc8e5b7d9a85d04cbac815be920..4fddd3e2ba0c3414e25c1cedddfbcd8fd54241d1 100644
--- a/src/plugins/markdown-report/tests/eva/oracle/cwe126.0.md
+++ b/src/plugins/markdown-report/tests/md/oracle/cwe126.0.md
@@ -20,13 +20,13 @@ the `bad` ones have indeed an error.
 The C source files (not including the headers `.h` files)
 that have been considered during the analysis are the following:
 
-* `tests/eva/*.c`
+* `tests/md/*.c`
 
 
 
 ## Configuration {#options}
 
-### EVA Domains {#domains}
+### Eva Domains {#domains}
 
 Only the base domain (`cvalue`) has been used for the analysis
 
@@ -38,11 +38,11 @@ No stubs have been used for this analysis
 
 # Coverage {#coverage}
 
-There are 6 function definitions that are not stubbed. They represent 50 statements, of which 50 are potentially reachable through EVA, resulting in a **statement coverage of 100.0%** with respect to the entire application.
+There are 6 function definitions that are not stubbed. They represent 50 statements, of which 50 are potentially reachable through Eva, resulting in a **statement coverage of 100.0%** with respect to the entire application.
 
 
 There were potentially 6 functions syntactically reachable from main.
-These functions contain 50 statements, of which 50 are potentially reachable according to EVA, resulting in a **statement coverage of 100.0%** with respect to the perimeter set by this entry point.
+These functions contain 50 statements, of which 50 are potentially reachable according to Eva, resulting in a **statement coverage of 100.0%** with respect to the perimeter set by this entry point.
 
 
 # Warnings {#warnings}
@@ -60,10 +60,10 @@ Table: Warning reported by Frama-C
 
 | Location | Description |
 |:---------|:------------|
-| tests/eva/cwe126.c:28 | `out of bounds read. assert \valid_read(data + i);` (emitted by `eva`) |
+| tests/md/cwe126.c:28 | `out of bounds read. assert \valid_read(data + i);` (emitted by `eva`) |
 
 
-## Warning 0 (tests/eva/cwe126.c:28) {#warn-0}
+## Warning 0 (tests/md/cwe126.c:28) {#warn-0}
 
 Message:
 
@@ -87,10 +87,10 @@ Table: Alarm emitted by the analysis
 
 | No | Kind | Emitter | Function | Location |
 |:---:|:----:|:-------:|:---------|:---------|
-| [0](#alarm-0)  | `mem_access` | `Eva` | `CWE126_Buffer_Overread__malloc_char_loop_64b_badSink` | tests/eva/cwe126.c:28 |
+| [0](#alarm-0)  | `mem_access` | `Eva` | `CWE126_Buffer_Overread__malloc_char_loop_64b_badSink` | tests/md/cwe126.c:28 |
 
 
-## Alarm 0 at tests/eva/cwe126.c:28 {#Alarm-0}
+## Alarm 0 at tests/md/cwe126.c:28 {#Alarm-0}
 
 The following ACSL assertion must hold to avoid invalid pointer dereferencing
 (undefined behavior).
diff --git a/src/plugins/markdown-report/tests/eva/oracle/cwe126.res.oracle b/src/plugins/markdown-report/tests/md/oracle/cwe126.res.oracle
similarity index 56%
rename from src/plugins/markdown-report/tests/eva/oracle/cwe126.res.oracle
rename to src/plugins/markdown-report/tests/md/oracle/cwe126.res.oracle
index ada3b892d20307dab2a0b2bddbb9d9a0752f40fc..f802f141c785d0dd0999a4849fc23f5b0bf6586f 100644
--- a/src/plugins/markdown-report/tests/eva/oracle/cwe126.res.oracle
+++ b/src/plugins/markdown-report/tests/md/oracle/cwe126.res.oracle
@@ -1,18 +1,46 @@
+<<<<<<< HEAD:src/plugins/markdown-report/tests/eva/oracle/cwe126.res.oracle
 [kernel] Parsing cwe126.c (with preprocessing)
+||||||| ac7807782d:src/plugins/markdown-report/tests/eva/oracle/cwe126.res.oracle
+[kernel] Parsing tests/eva/cwe126.c (with preprocessing)
+=======
+[kernel] Parsing tests/md/cwe126.c (with preprocessing)
+>>>>>>> origin/master:src/plugins/markdown-report/tests/md/oracle/cwe126.res.oracle
 [eva] Analyzing a complete application starting at main
 [eva] Computing initial state
 [eva] Initial state computed
 [eva:initial-state] Values of globals at initialization
   
+<<<<<<< HEAD:src/plugins/markdown-report/tests/eva/oracle/cwe126.res.oracle
 [eva] cwe126.c:76: allocating variable __malloc_goodG2B_l76
+||||||| ac7807782d:src/plugins/markdown-report/tests/eva/oracle/cwe126.res.oracle
+[eva] tests/eva/cwe126.c:76: allocating variable __malloc_goodG2B_l76
+=======
+[eva] tests/md/cwe126.c:76: allocating variable __malloc_goodG2B_l76
+>>>>>>> origin/master:src/plugins/markdown-report/tests/md/oracle/cwe126.res.oracle
 [eva] using specification for function exit
 [eva] FRAMAC_SHARE/libc/string.h:118: 
   cannot evaluate ACSL term, unsupported ACSL construct: logic function memset
+<<<<<<< HEAD:src/plugins/markdown-report/tests/eva/oracle/cwe126.res.oracle
 [eva] cwe126.c:62: starting to merge loop iterations
 [eva] cwe126.c:40: 
+||||||| ac7807782d:src/plugins/markdown-report/tests/eva/oracle/cwe126.res.oracle
+[eva] tests/eva/cwe126.c:62: starting to merge loop iterations
+[eva] tests/eva/cwe126.c:40: 
+=======
+[eva] tests/md/cwe126.c:62: starting to merge loop iterations
+[eva] tests/md/cwe126.c:40: 
+>>>>>>> origin/master:src/plugins/markdown-report/tests/md/oracle/cwe126.res.oracle
   allocating variable __malloc_CWE126_Buffer_Overread__malloc_char_loop_64_bad_l40
+<<<<<<< HEAD:src/plugins/markdown-report/tests/eva/oracle/cwe126.res.oracle
 [eva] cwe126.c:26: starting to merge loop iterations
 [eva:alarm] cwe126.c:28: Warning: 
+||||||| ac7807782d:src/plugins/markdown-report/tests/eva/oracle/cwe126.res.oracle
+[eva] tests/eva/cwe126.c:26: starting to merge loop iterations
+[eva:alarm] tests/eva/cwe126.c:28: Warning: 
+=======
+[eva] tests/md/cwe126.c:26: starting to merge loop iterations
+[eva:alarm] tests/md/cwe126.c:28: Warning: 
+>>>>>>> origin/master:src/plugins/markdown-report/tests/md/oracle/cwe126.res.oracle
   out of bounds read. assert \valid_read(data + i);
 [eva] done for function main
 [eva] ====== VALUES COMPUTED ======
@@ -54,4 +82,10 @@
     Preconditions     8 valid     0 unknown     0 invalid      8 total
   100% of the logical properties reached have been proven.
   ----------------------------------------------------------------------------
+<<<<<<< HEAD:src/plugins/markdown-report/tests/eva/oracle/cwe126.res.oracle
 [mdr] Report cwe126.0.md generated
+||||||| ac7807782d:src/plugins/markdown-report/tests/eva/oracle/cwe126.res.oracle
+[mdr] Report tests/eva/result/cwe126.0.md generated
+=======
+[mdr] Report tests/md/result/cwe126.0.md generated
+>>>>>>> origin/master:src/plugins/markdown-report/tests/md/oracle/cwe126.res.oracle
diff --git a/src/plugins/markdown-report/tests/eva/test_config b/src/plugins/markdown-report/tests/md/test_config
similarity index 100%
rename from src/plugins/markdown-report/tests/eva/test_config
rename to src/plugins/markdown-report/tests/md/test_config
diff --git a/src/plugins/markdown-report/tests/sarif/cwe125.c b/src/plugins/markdown-report/tests/sarif/cwe125.c
new file mode 100644
index 0000000000000000000000000000000000000000..4e3013719a1b91a9d99f904c7fc30fc044683df5
--- /dev/null
+++ b/src/plugins/markdown-report/tests/sarif/cwe125.c
@@ -0,0 +1,38 @@
+/* run.config
+NOFRAMAC: use execnow for proper sequencing of executions
+EXECNOW: LOG @PTEST_NAME@.parse.log @frama-c@ @PTEST_FILE@ -save @PTEST_DIR@/result/@PTEST_NAME@_parse.sav > @PTEST_DIR@/result/@PTEST_NAME@.parse.log
+EXECNOW: LOG @PTEST_NAME@.eva.log @frama-c@ -load @PTEST_DIR@/result/@PTEST_NAME@_parse.sav -eva -save @PTEST_DIR@/result/@PTEST_NAME@_eva.sav > @PTEST_DIR@/result/@PTEST_NAME@.eva.log
+EXECNOW: LOG @PTEST_NAME@.sarif @frama-c@ -load @PTEST_DIR@/result/@PTEST_NAME@_eva.sav -then -mdr-out @PTEST_DIR@/result/@PTEST_NAME@.sarif -mdr-gen sarif -mdr-no-print-libc -mdr-sarif-deterministic
+*/
+#include "__fc_builtin.h"
+
+#define LENGTH 10
+
+int getValueFromArray(int *array, int len, int index) {
+
+int value;
+
+// check that the array index is less than the maximum
+
+// length of the array
+if (index < len) {
+
+// get the value at the specified index of the array
+value = array[index];
+}
+// if array index is invalid then output error message
+
+// and return value indicating error
+else {
+printf("Value is: %d\n", array[index]);
+value = -1;
+}
+
+return value;
+}
+
+int main() {
+  int arr[LENGTH] = { 0 };
+  int test = Frama_C_interval(-LENGTH,LENGTH);
+  return getValueFromArray(arr,LENGTH,test);
+}
diff --git a/src/plugins/markdown-report/tests/sarif/libc.c b/src/plugins/markdown-report/tests/sarif/libc.c
new file mode 100644
index 0000000000000000000000000000000000000000..2f7438beff35d307549bdbe6d896110fa98956c0
--- /dev/null
+++ b/src/plugins/markdown-report/tests/sarif/libc.c
@@ -0,0 +1,15 @@
+/* run.config
+   CMD: @frama-c@ @PTEST_FILE@ -no-autoload-plugins -load-module eva,from,scope,markdown_report -eva -eva-no-results -mdr-gen sarif -mdr-sarif-deterministic
+   LOG: with-libc.sarif
+   OPT: -mdr-out @PTEST_DIR@/result/with-libc.sarif
+   LOG: without-libc.sarif
+   OPT: -mdr-no-print-libc -mdr-out @PTEST_DIR@/result/without-libc.sarif
+*/
+
+#include <string.h>
+
+int main() {
+  char *s = "hello world";
+  int n = strlen(s);
+  return n;
+}
diff --git a/src/plugins/markdown-report/tests/sarif/oracle/cwe125.eva.log b/src/plugins/markdown-report/tests/sarif/oracle/cwe125.eva.log
new file mode 100644
index 0000000000000000000000000000000000000000..323a12ad49c4e847401a39ae747349b318011042
--- /dev/null
+++ b/src/plugins/markdown-report/tests/sarif/oracle/cwe125.eva.log
@@ -0,0 +1,40 @@
+[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] using specification for function Frama_C_interval
+[eva:alarm] tests/sarif/cwe125.c:21: Warning: 
+  out of bounds read. assert \valid_read(array + index);
+[eva:alarm] tests/sarif/cwe125.c:27: Warning: 
+  out of bounds read. assert \valid_read(array + index);
+[eva] done for function main
+[eva] tests/sarif/cwe125.c:27: 
+  assertion 'Eva,mem_access' got final status invalid.
+[kernel:annot:missing-spec] tests/sarif/cwe125.c:27: Warning: 
+  Neither code nor specification for function printf, generating default assigns from the prototype
+[eva] ====== VALUES COMPUTED ======
+[eva:final-states] Values at end of function getValueFromArray:
+  value ∈ {0}
+[eva:final-states] Values at end of function main:
+  Frama_C_entropy_source ∈ [--..--]
+  arr[0..9] ∈ {0}
+  test ∈ [0..9]
+[eva:summary] ====== ANALYSIS SUMMARY ======
+  ----------------------------------------------------------------------------
+  2 functions analyzed (out of 2): 100% coverage.
+  In these functions, 8 statements reached (out of 9): 88% coverage.
+  ----------------------------------------------------------------------------
+  Some errors and warnings have been raised during the analysis:
+    by the Eva analyzer:      0 errors    0 warnings
+    by the Frama-C kernel:    0 errors    2 warnings
+  ----------------------------------------------------------------------------
+  2 alarms generated by the analysis:
+       2 invalid memory accesses
+  1 of them is a sure alarm (invalid status).
+  ----------------------------------------------------------------------------
+  Evaluation of the logical properties reached by the analysis:
+    Assertions        0 valid     0 unknown     0 invalid      0 total
+    Preconditions     1 valid     0 unknown     0 invalid      1 total
+  100% of the logical properties reached have been proven.
+  ----------------------------------------------------------------------------
diff --git a/src/plugins/markdown-report/tests/sarif/oracle/cwe125.parse.log b/src/plugins/markdown-report/tests/sarif/oracle/cwe125.parse.log
new file mode 100644
index 0000000000000000000000000000000000000000..4d47a387d9d74a18432f685f935af07a67b325b9
--- /dev/null
+++ b/src/plugins/markdown-report/tests/sarif/oracle/cwe125.parse.log
@@ -0,0 +1,3 @@
+[kernel] Parsing tests/sarif/cwe125.c (with preprocessing)
+[kernel:typing:implicit-function-declaration] tests/sarif/cwe125.c:27: Warning: 
+  Calling undeclared function printf. Old style K&R code?
diff --git a/src/plugins/markdown-report/tests/sarif/oracle/cwe125.sarif b/src/plugins/markdown-report/tests/sarif/oracle/cwe125.sarif
new file mode 100644
index 0000000000000000000000000000000000000000..5855585658f0d7aee1f680420db13842a321ca1f
--- /dev/null
+++ b/src/plugins/markdown-report/tests/sarif/oracle/cwe125.sarif
@@ -0,0 +1,258 @@
+{
+  "$schema":
+    "https://github.com/oasis-tcs/sarif-spec/blob/master/Documents/CommitteeSpecificationDrafts/v2.1.0-CSD.1/sarif-schema-2.1.0.json",
+  "version": "2.1.0",
+  "runs": [
+    {
+      "tool": {
+        "driver": {
+          "name": "frama-c",
+          "fullName": "frama-c-0+omitted-for-deterministic-output",
+          "version": "0+omitted-for-deterministic-output",
+          "downloadUri": "https://frama-c.com/download.html",
+          "informationUri": "https://frama-c.com"
+        }
+      },
+      "invocations": [
+        {
+          "commandLine":
+            "frama-c -check tests/sarif/cwe125.c -save tests/sarif/result/cwe125_parse.sav",
+          "arguments": [
+            "-check", "tests/sarif/cwe125.c", "-save",
+            "tests/sarif/result/cwe125_parse.sav"
+          ],
+          "exitCode": 0,
+          "executionSuccessful": true
+        },
+        {
+          "commandLine":
+            "frama-c -check -load tests/sarif/result/cwe125_parse.sav -eva -save tests/sarif/result/cwe125_eva.sav",
+          "arguments": [
+            "-check", "-load", "tests/sarif/result/cwe125_parse.sav", "-eva",
+            "-save", "tests/sarif/result/cwe125_eva.sav"
+          ],
+          "exitCode": 0,
+          "executionSuccessful": true
+        },
+        {
+          "commandLine":
+            "frama-c -check -load tests/sarif/result/cwe125_eva.sav -then -mdr-out tests/sarif/result/cwe125.sarif -mdr-gen sarif -mdr-no-print-libc -mdr-sarif-deterministic",
+          "arguments": [
+            "-check", "-load", "tests/sarif/result/cwe125_eva.sav", "-then",
+            "-mdr-out", "tests/sarif/result/cwe125.sarif", "-mdr-gen",
+            "sarif", "-mdr-no-print-libc", "-mdr-sarif-deterministic"
+          ],
+          "exitCode": 0,
+          "executionSuccessful": true
+        }
+      ],
+      "originalUriBaseIds": {
+        "FRAMAC_SHARE": {
+          "uri": "file:///omitted-for-deterministic-output/"
+        },
+        "FRAMAC_LIB": { "uri": "file:///omitted-for-deterministic-output/" },
+        "FRAMAC_PLUGIN": {
+          "uri": "file:///omitted-for-deterministic-output/"
+        },
+        "PWD": { "uri": "file:///omitted-for-deterministic-output/" }
+      },
+      "artifacts": [
+        {
+          "location": { "uri": "tests/sarif/cwe125.c", "uriBaseId": "PWD" },
+          "roles": [ "analysisTarget" ],
+          "mimeType": "text/x-csrc"
+        }
+      ],
+      "results": [
+        {
+          "ruleId": "mem_access",
+          "kind": "open",
+          "level": "none",
+          "message": {
+            "text": "mem_access.",
+            "markdown":
+              "mem_access:\n\n```acsl\nassert mem_access: \\valid_read(array + index);\n```\n\n\n\nThis alarm represents a potential Invalid pointer dereferencing."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "tests/sarif/cwe125.c",
+                  "uriBaseId": "PWD"
+                },
+                "region": {
+                  "startLine": 21,
+                  "startColumn": 8,
+                  "endLine": 21,
+                  "endColumn": 20,
+                  "byteLength": 12
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "mem_access",
+          "level": "error",
+          "message": {
+            "text": "mem_access.",
+            "markdown":
+              "mem_access:\n\n```acsl\nassert mem_access: \\valid_read(array + index);\n```\n\n\n\nThis alarm represents a potential Invalid pointer dereferencing."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "tests/sarif/cwe125.c",
+                  "uriBaseId": "PWD"
+                },
+                "region": {
+                  "startLine": 27,
+                  "endLine": 27,
+                  "endColumn": 38,
+                  "byteLength": 38
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function printf." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "tests/sarif/cwe125.c",
+                  "uriBaseId": "PWD"
+                },
+                "region": {
+                  "startLine": 27,
+                  "endLine": 27,
+                  "endColumn": 6,
+                  "byteLength": 6
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "specialization of order at stmt 10." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "tests/sarif/cwe125.c",
+                  "uriBaseId": "PWD"
+                },
+                "region": {
+                  "startLine": 36,
+                  "startColumn": 13,
+                  "endLine": 36,
+                  "endColumn": 37,
+                  "byteLength": 24
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function printf."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "tests/sarif/cwe125.c",
+                  "uriBaseId": "PWD"
+                },
+                "region": {
+                  "startLine": 27,
+                  "endLine": 27,
+                  "endColumn": 6,
+                  "byteLength": 6
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function printf." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "tests/sarif/cwe125.c",
+                  "uriBaseId": "PWD"
+                },
+                "region": {
+                  "startLine": 27,
+                  "endLine": 27,
+                  "endColumn": 6,
+                  "byteLength": 6
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "reachability of stmt line 27 in getValueFromArray."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "tests/sarif/cwe125.c",
+                  "uriBaseId": "PWD"
+                },
+                "region": {
+                  "startLine": 27,
+                  "endLine": 27,
+                  "endColumn": 38,
+                  "byteLength": 38
+                }
+              }
+            }
+          ]
+        }
+      ],
+      "defaultSourceLanguage": "C",
+      "taxonomies": [
+        {
+          "name": "frama-c",
+          "rules": [
+            {
+              "id": "user-spec",
+              "shortDescription": {
+                "text": "User-written ACSL specification."
+              }
+            },
+            {
+              "id": "mem_access",
+              "shortDescription": {
+                "text": "Invalid pointer dereferencing."
+              }
+            }
+          ],
+          "contents": [ "nonLocalizedData" ]
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/src/plugins/markdown-report/tests/sarif/oracle/libc.0.res.oracle b/src/plugins/markdown-report/tests/sarif/oracle/libc.0.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..a64989bb4ddcb6bf0a07a2bbcc77527cdf565620
--- /dev/null
+++ b/src/plugins/markdown-report/tests/sarif/oracle/libc.0.res.oracle
@@ -0,0 +1,23 @@
+[kernel] Parsing tests/sarif/libc.c (with 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] done for function main
+[eva] ====== VALUES COMPUTED ======
+[eva:summary] ====== ANALYSIS SUMMARY ======
+  ----------------------------------------------------------------------------
+  1 function analyzed (out of 1): 100% coverage.
+  In this function, 4 statements reached (out of 4): 100% coverage.
+  ----------------------------------------------------------------------------
+  No errors or warnings raised during the analysis.
+  ----------------------------------------------------------------------------
+  0 alarms generated by the analysis.
+  ----------------------------------------------------------------------------
+  Evaluation of the logical properties reached by the analysis:
+    Assertions        0 valid     0 unknown     0 invalid      0 total
+    Preconditions     1 valid     0 unknown     0 invalid      1 total
+  100% of the logical properties reached have been proven.
+  ----------------------------------------------------------------------------
+[mdr] Report tests/sarif/result/with-libc.sarif generated
diff --git a/src/plugins/markdown-report/tests/sarif/oracle/libc.1.res.oracle b/src/plugins/markdown-report/tests/sarif/oracle/libc.1.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..48818092e724c94c15dd9d5d93d3530d80873d50
--- /dev/null
+++ b/src/plugins/markdown-report/tests/sarif/oracle/libc.1.res.oracle
@@ -0,0 +1,23 @@
+[kernel] Parsing tests/sarif/libc.c (with 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] done for function main
+[eva] ====== VALUES COMPUTED ======
+[eva:summary] ====== ANALYSIS SUMMARY ======
+  ----------------------------------------------------------------------------
+  1 function analyzed (out of 1): 100% coverage.
+  In this function, 4 statements reached (out of 4): 100% coverage.
+  ----------------------------------------------------------------------------
+  No errors or warnings raised during the analysis.
+  ----------------------------------------------------------------------------
+  0 alarms generated by the analysis.
+  ----------------------------------------------------------------------------
+  Evaluation of the logical properties reached by the analysis:
+    Assertions        0 valid     0 unknown     0 invalid      0 total
+    Preconditions     1 valid     0 unknown     0 invalid      1 total
+  100% of the logical properties reached have been proven.
+  ----------------------------------------------------------------------------
+[mdr] Report tests/sarif/result/without-libc.sarif generated
diff --git a/src/plugins/markdown-report/tests/sarif/oracle/with-libc.sarif b/src/plugins/markdown-report/tests/sarif/oracle/with-libc.sarif
new file mode 100644
index 0000000000000000000000000000000000000000..75cbdcd725df74bc9cf5732be0bcd534ed041e59
--- /dev/null
+++ b/src/plugins/markdown-report/tests/sarif/oracle/with-libc.sarif
@@ -0,0 +1,9566 @@
+{
+  "$schema":
+    "https://github.com/oasis-tcs/sarif-spec/blob/master/Documents/CommitteeSpecificationDrafts/v2.1.0-CSD.1/sarif-schema-2.1.0.json",
+  "version": "2.1.0",
+  "runs": [
+    {
+      "tool": {
+        "driver": {
+          "name": "frama-c",
+          "fullName": "frama-c-0+omitted-for-deterministic-output",
+          "version": "0+omitted-for-deterministic-output",
+          "downloadUri": "https://frama-c.com/download.html",
+          "informationUri": "https://frama-c.com"
+        }
+      },
+      "invocations": [
+        {
+          "commandLine":
+            "frama-c -check tests/sarif/libc.c -no-autoload-plugins -load-module eva,from,scope,markdown_report -eva -eva-no-results -mdr-gen sarif -mdr-sarif-deterministic -mdr-out tests/sarif/result/with-libc.sarif",
+          "arguments": [
+            "-check", "tests/sarif/libc.c", "-no-autoload-plugins",
+            "-load-module", "eva,from,scope,markdown_report", "-eva",
+            "-eva-no-results", "-mdr-gen", "sarif",
+            "-mdr-sarif-deterministic", "-mdr-out",
+            "tests/sarif/result/with-libc.sarif"
+          ],
+          "exitCode": 0,
+          "executionSuccessful": true
+        }
+      ],
+      "originalUriBaseIds": {
+        "FRAMAC_SHARE": {
+          "uri": "file:///omitted-for-deterministic-output/"
+        },
+        "FRAMAC_LIB": { "uri": "file:///omitted-for-deterministic-output/" },
+        "FRAMAC_PLUGIN": {
+          "uri": "file:///omitted-for-deterministic-output/"
+        },
+        "PWD": { "uri": "file:///omitted-for-deterministic-output/" }
+      },
+      "artifacts": [
+        {
+          "location": { "uri": "tests/sarif/libc.c", "uriBaseId": "PWD" },
+          "roles": [ "analysisTarget" ],
+          "mimeType": "text/x-csrc"
+        }
+      ],
+      "results": [
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term __fc_strtok_ptr in function strtok."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 261,
+                  "startColumn": 12,
+                  "endLine": 261,
+                  "endColumn": 27,
+                  "byteLength": 15
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strcpy."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 356,
+                  "startColumn": 12,
+                  "endLine": 356,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function strnlen." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 135,
+                  "startColumn": 14,
+                  "endLine": 135,
+                  "endColumn": 21,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strcasecmp." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/strings.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 50,
+                  "startColumn": 11,
+                  "endLine": 50,
+                  "endColumn": 21,
+                  "byteLength": 10
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strpbrk."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 214,
+                  "startColumn": 12,
+                  "endLine": 214,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strncat."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 433,
+                  "startColumn": 12,
+                  "endLine": 433,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term *(s + (0 ..)) in function strtok_r."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 288,
+                  "startColumn": 10,
+                  "endLine": 288,
+                  "endColumn": 16,
+                  "byteLength": 6
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior partial in function strncpy." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 378,
+                  "startColumn": 12,
+                  "endLine": 378,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strcat."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 414,
+                  "startColumn": 12,
+                  "endLine": 414,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default in function strrchr." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 195,
+                  "startColumn": 12,
+                  "endLine": 195,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "dest_null_terminated." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 417,
+                  "startColumn": 34,
+                  "endLine": 417,
+                  "endColumn": 77,
+                  "byteLength": 43
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function bzero." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/strings.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 40,
+                  "startColumn": 12,
+                  "endLine": 40,
+                  "endColumn": 17,
+                  "byteLength": 5
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior new_str in function strtok_r." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 327,
+                  "startColumn": 12,
+                  "endLine": 327,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term __fc_strtok_ptr in function strtok."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 272,
+                  "startColumn": 12,
+                  "endLine": 272,
+                  "endColumn": 27,
+                  "byteLength": 15
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text":
+              "from clause of term *(dest + (strlen{Old}(dest) .. strlen{Old}(dest) + n)) in function strncat."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 439,
+                  "startColumn": 12,
+                  "endLine": 439,
+                  "endColumn": 48,
+                  "byteLength": 36
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_s." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 486,
+                  "startColumn": 29,
+                  "endLine": 486,
+                  "endColumn": 49,
+                  "byteLength": 20
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "room_string." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 438,
+                  "startColumn": 26,
+                  "endLine": 438,
+                  "endColumn": 64,
+                  "byteLength": 38
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_s_or_delim_not_found." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 258,
+                  "startColumn": 6,
+                  "endLine": 260,
+                  "endColumn": 70,
+                  "byteLength": 120
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "wcslen_create_shift." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 230,
+                  "startColumn": 4,
+                  "endLine": 232,
+                  "endColumn": 63,
+                  "byteLength": 147
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "StrChr." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 168,
+                  "startColumn": 4,
+                  "endLine": 170,
+                  "endColumn": 75,
+                  "byteLength": 132
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function memmove."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 107,
+                  "startColumn": 12,
+                  "endLine": 107,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strchr." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 173,
+                  "startColumn": 12,
+                  "endLine": 173,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "wcscmp_zero." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 240,
+                  "startColumn": 4,
+                  "endLine": 244,
+                  "endColumn": 63,
+                  "byteLength": 173
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_valid_string." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 164,
+                  "startColumn": 33,
+                  "endLine": 164,
+                  "endColumn": 59,
+                  "byteLength": 26
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "equal_prefix." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 376,
+                  "startColumn": 26,
+                  "endLine": 376,
+                  "endColumn": 60,
+                  "byteLength": 34
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_ptr." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 358,
+                  "startColumn": 24,
+                  "endLine": 358,
+                  "endColumn": 39,
+                  "byteLength": 15
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_same_base." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 177,
+                  "startColumn": 30,
+                  "endLine": 177,
+                  "endColumn": 64,
+                  "byteLength": 34
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_nstring_src." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 423,
+                  "startColumn": 32,
+                  "endLine": 423,
+                  "endColumn": 58,
+                  "byteLength": 26
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strtok." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 246,
+                  "startColumn": 10,
+                  "endLine": 246,
+                  "endColumn": 16,
+                  "byteLength": 6
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "equal_after_copy." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 373,
+                  "startColumn": 30,
+                  "endLine": 373,
+                  "endColumn": 51,
+                  "byteLength": 21
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_same_base." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 79,
+                  "startColumn": 30,
+                  "endLine": 79,
+                  "endColumn": 66,
+                  "byteLength": 36
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strsignal."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 518,
+                  "startColumn": 12,
+                  "endLine": 518,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_src." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 459,
+                  "startColumn": 31,
+                  "endLine": 459,
+                  "endColumn": 53,
+                  "byteLength": 22
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strdup."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 480,
+                  "startColumn": 12,
+                  "endLine": 480,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strcoll." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 155,
+                  "startColumn": 11,
+                  "endLine": 155,
+                  "endColumn": 18,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_null_or_same_base." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 171,
+                  "startColumn": 4,
+                  "endLine": 171,
+                  "endColumn": 60,
+                  "byteLength": 56
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_s." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 131,
+                  "startColumn": 29,
+                  "endLine": 131,
+                  "endColumn": 53,
+                  "byteLength": 24
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strndup."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 493,
+                  "startColumn": 12,
+                  "endLine": 493,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "not_first_call." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 268,
+                  "startColumn": 29,
+                  "endLine": 268,
+                  "endColumn": 53,
+                  "byteLength": 24
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function memchr." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 88,
+                  "startColumn": 12,
+                  "endLine": 88,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term *saveptr in function strtok_r."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 316,
+                  "startColumn": 12,
+                  "endLine": 316,
+                  "endColumn": 20,
+                  "byteLength": 8
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "separation." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 95,
+                  "startColumn": 4,
+                  "endLine": 95,
+                  "endColumn": 62,
+                  "byteLength": 58
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "room_nstring." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 364,
+                  "startColumn": 27,
+                  "endLine": 364,
+                  "endColumn": 50,
+                  "byteLength": 23
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "acsl_c_equiv." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 127,
+                  "startColumn": 26,
+                  "endLine": 127,
+                  "endColumn": 46,
+                  "byteLength": 20
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text":
+              "from clause of term *(dest + (0 .. n - 1)) in function strncpy."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 367,
+                  "startColumn": 12,
+                  "endLine": 367,
+                  "endColumn": 26,
+                  "byteLength": 14
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "initialization." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 370,
+                  "startColumn": 28,
+                  "endLine": 370,
+                  "endColumn": 57,
+                  "byteLength": 29
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "memcmp_strlen_left." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 119,
+                  "startColumn": 4,
+                  "endLine": 121,
+                  "endColumn": 77,
+                  "byteLength": 148
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strlcat." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 451,
+                  "startColumn": 12,
+                  "endLine": 451,
+                  "endColumn": 33,
+                  "byteLength": 21
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "danglingness." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 74,
+                  "startColumn": 8,
+                  "endLine": 75,
+                  "endColumn": 61,
+                  "byteLength": 80
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_delim." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 245,
+                  "startColumn": 31,
+                  "endLine": 245,
+                  "endColumn": 55,
+                  "byteLength": 24
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "allocation." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 475,
+                  "startColumn": 24,
+                  "endLine": 475,
+                  "endColumn": 49,
+                  "byteLength": 25
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "memcmp_strlen_right." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 123,
+                  "startColumn": 4,
+                  "endLine": 125,
+                  "endColumn": 77,
+                  "byteLength": 149
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_null." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 190,
+                  "startColumn": 25,
+                  "endLine": 190,
+                  "endColumn": 41,
+                  "byteLength": 16
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text":
+              "from clause of term *((char *)dest + (0 .. n - 1)) in function memcpy."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 96,
+                  "startColumn": 12,
+                  "endLine": 96,
+                  "endColumn": 35,
+                  "byteLength": 23
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "initialization." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 71,
+                  "startColumn": 8,
+                  "endLine": 72,
+                  "endColumn": 71,
+                  "byteLength": 116
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_s1." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 151,
+                  "startColumn": 30,
+                  "endLine": 151,
+                  "endColumn": 51,
+                  "byteLength": 21
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_null." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 168,
+                  "startColumn": 25,
+                  "endLine": 168,
+                  "endColumn": 41,
+                  "byteLength": 16
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "danglingness." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 59,
+                  "startColumn": 30,
+                  "endLine": 59,
+                  "endColumn": 49,
+                  "byteLength": 19
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strerror."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 342,
+                  "startColumn": 12,
+                  "endLine": 342,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "strlen_shift." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 107,
+                  "startColumn": 4,
+                  "endLine": 109,
+                  "endColumn": 59,
+                  "byteLength": 118
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior not_found in function strrchr." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 195,
+                  "startColumn": 12,
+                  "endLine": 195,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "cannot_allocate." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 501,
+                  "startColumn": 29,
+                  "endLine": 501,
+                  "endColumn": 64,
+                  "byteLength": 35
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function strcasestr." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 239,
+                  "startColumn": 12,
+                  "endLine": 239,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "ptr_subset." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 265,
+                  "startColumn": 24,
+                  "endLine": 265,
+                  "endColumn": 57,
+                  "byteLength": 33
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strncpy." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 367,
+                  "startColumn": 12,
+                  "endLine": 367,
+                  "endColumn": 26,
+                  "byteLength": 14
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_s1." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 55,
+                  "startColumn": 23,
+                  "endLine": 55,
+                  "endColumn": 49,
+                  "byteLength": 26
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior complete in function strncat." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 444,
+                  "startColumn": 12,
+                  "endLine": 444,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_s." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 125,
+                  "startColumn": 29,
+                  "endLine": 125,
+                  "endColumn": 49,
+                  "byteLength": 20
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strcoll."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 153,
+                  "startColumn": 12,
+                  "endLine": 153,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "result_valid_string_bounded_and_same_prefix."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 497,
+                  "startColumn": 4,
+                  "endLine": 499,
+                  "endColumn": 29,
+                  "byteLength": 124
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_s." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 204,
+                  "startColumn": 29,
+                  "endLine": 204,
+                  "endColumn": 49,
+                  "byteLength": 20
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior allocation in function strndup." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 506,
+                  "startColumn": 12,
+                  "endLine": 506,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text":
+              "from clause of term *(__fc_strtok_ptr + (0 ..)) in function strtok."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 248,
+                  "startColumn": 10,
+                  "endLine": 248,
+                  "endColumn": 30,
+                  "byteLength": 20
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "char_not_found." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 189,
+                  "startColumn": 28,
+                  "endLine": 189,
+                  "endColumn": 40,
+                  "byteLength": 12
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "disjoint clause in function strtok." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 283,
+                  "startColumn": 12,
+                  "endLine": 283,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strndup."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 488,
+                  "startColumn": 12,
+                  "endLine": 488,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "s_not_null." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 256,
+                  "startColumn": 24,
+                  "endLine": 256,
+                  "endColumn": 34,
+                  "byteLength": 10
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 68,
+                  "startColumn": 9,
+                  "endLine": 69,
+                  "endColumn": 74,
+                  "byteLength": 100
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_accept." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 213,
+                  "startColumn": 34,
+                  "endLine": 213,
+                  "endColumn": 59,
+                  "byteLength": 25
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior not_found in function memchr." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 88,
+                  "startColumn": 12,
+                  "endLine": 88,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strspn." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 206,
+                  "startColumn": 12,
+                  "endLine": 206,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "initialization." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 58,
+                  "startColumn": 32,
+                  "endLine": 58,
+                  "endColumn": 68,
+                  "byteLength": 36
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "strlen_before_null." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 89,
+                  "startColumn": 4,
+                  "endLine": 90,
+                  "endColumn": 72,
+                  "byteLength": 101
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strlen." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 129,
+                  "startColumn": 14,
+                  "endLine": 129,
+                  "endColumn": 20,
+                  "byteLength": 6
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function strlcpy." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 393,
+                  "startColumn": 7,
+                  "endLine": 393,
+                  "endColumn": 14,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "separation." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 354,
+                  "startColumn": 4,
+                  "endLine": 354,
+                  "endColumn": 59,
+                  "byteLength": 55
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default in function strchr." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 173,
+                  "startColumn": 12,
+                  "endLine": 173,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "complete clause in function strtok_r." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 327,
+                  "startColumn": 12,
+                  "endLine": 327,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text":
+              "from clause of term *(dest + (strlen{Old}(dest) .. strlen{Old}(dest) + n)) in function strncat."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 425,
+                  "startColumn": 12,
+                  "endLine": 425,
+                  "endColumn": 50,
+                  "byteLength": 38
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior no_allocation in function strdup." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 484,
+                  "startColumn": 12,
+                  "endLine": 484,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function strcat." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 420,
+                  "startColumn": 12,
+                  "endLine": 420,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "StrCmp." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 143,
+                  "startColumn": 4,
+                  "endLine": 147,
+                  "endColumn": 63,
+                  "byteLength": 170
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "strlen_at_null." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 92,
+                  "startColumn": 4,
+                  "endLine": 93,
+                  "endColumn": 61,
+                  "byteLength": 86
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text":
+              "from clause of term *(*saveptr + (0 ..)) in function strtok_r."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 290,
+                  "startColumn": 10,
+                  "endLine": 290,
+                  "endColumn": 25,
+                  "byteLength": 15
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function strspn." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 210,
+                  "startColumn": 14,
+                  "endLine": 210,
+                  "endColumn": 20,
+                  "byteLength": 6
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_s2." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 138,
+                  "startColumn": 30,
+                  "endLine": 138,
+                  "endColumn": 51,
+                  "byteLength": 21
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_char." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 80,
+                  "startColumn": 25,
+                  "endLine": 80,
+                  "endColumn": 45,
+                  "byteLength": 20
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strlcpy." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 388,
+                  "startColumn": 12,
+                  "endLine": 388,
+                  "endColumn": 24,
+                  "byteLength": 12
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text":
+              "from clause of term *((char *)s + (0 .. n - 1)) in function bzero."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/strings.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 37,
+                  "startColumn": 10,
+                  "endLine": 37,
+                  "endColumn": 31,
+                  "byteLength": 21
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_in_str." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 81,
+                  "startColumn": 27,
+                  "endLine": 83,
+                  "endColumn": 54,
+                  "byteLength": 120
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "char_found." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 78,
+                  "startColumn": 24,
+                  "endLine": 78,
+                  "endColumn": 44,
+                  "byteLength": 20
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "MemChr." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 57,
+                  "startColumn": 4,
+                  "endLine": 59,
+                  "endColumn": 62,
+                  "byteLength": 134
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strtok_r."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 319,
+                  "startColumn": 12,
+                  "endLine": 319,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "char_found." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 184,
+                  "startColumn": 24,
+                  "endLine": 184,
+                  "endColumn": 35,
+                  "byteLength": 11
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strtok."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 250,
+                  "startColumn": 10,
+                  "endLine": 250,
+                  "endColumn": 17,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_src." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 396,
+                  "startColumn": 31,
+                  "endLine": 396,
+                  "endColumn": 53,
+                  "byteLength": 22
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strtok." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 269,
+                  "startColumn": 12,
+                  "endLine": 269,
+                  "endColumn": 32,
+                  "byteLength": 20
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "wcslen_at_null." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 207,
+                  "startColumn": 4,
+                  "endLine": 208,
+                  "endColumn": 65,
+                  "byteLength": 90
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_valid_string." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 187,
+                  "startColumn": 33,
+                  "endLine": 187,
+                  "endColumn": 59,
+                  "byteLength": 26
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_src_fits." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 429,
+                  "startColumn": 35,
+                  "endLine": 429,
+                  "endColumn": 77,
+                  "byteLength": 42
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_null_or_in_haystack." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 236,
+                  "startColumn": 4,
+                  "endLine": 237,
+                  "endColumn": 65,
+                  "byteLength": 82
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function memset." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 121,
+                  "startColumn": 12,
+                  "endLine": 121,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_first_occur." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 165,
+                  "startColumn": 32,
+                  "endLine": 165,
+                  "endColumn": 79,
+                  "byteLength": 47
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strtok_r." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 313,
+                  "startColumn": 12,
+                  "endLine": 313,
+                  "endColumn": 27,
+                  "byteLength": 15
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "room_string." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 430,
+                  "startColumn": 26,
+                  "endLine": 430,
+                  "endColumn": 74,
+                  "byteLength": 48
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "initialization." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 312,
+                  "startColumn": 37,
+                  "endLine": 312,
+                  "endColumn": 58,
+                  "byteLength": 21
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "WMemChr." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 183,
+                  "startColumn": 4,
+                  "endLine": 185,
+                  "endColumn": 63,
+                  "byteLength": 143
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function strcmp." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 142,
+                  "startColumn": 11,
+                  "endLine": 142,
+                  "endColumn": 17,
+                  "byteLength": 6
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_s1." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/strings.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 46,
+                  "startColumn": 28,
+                  "endLine": 46,
+                  "endColumn": 49,
+                  "byteLength": 21
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function bzero." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/strings.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 37,
+                  "startColumn": 10,
+                  "endLine": 37,
+                  "endColumn": 31,
+                  "byteLength": 21
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text":
+              "from clause of term *(dest + (0 .. strlen{Old}(src))) in function strcpy."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 355,
+                  "startColumn": 12,
+                  "endLine": 355,
+                  "endColumn": 32,
+                  "byteLength": 20
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_delim." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 286,
+                  "startColumn": 31,
+                  "endLine": 286,
+                  "endColumn": 55,
+                  "byteLength": 24
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior partial in function strncat." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 444,
+                  "startColumn": 12,
+                  "endLine": 444,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_ptr." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 418,
+                  "startColumn": 24,
+                  "endLine": 418,
+                  "endColumn": 39,
+                  "byteLength": 15
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_ptr." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 109,
+                  "startColumn": 24,
+                  "endLine": 109,
+                  "endColumn": 39,
+                  "byteLength": 15
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strdup." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 484,
+                  "startColumn": 12,
+                  "endLine": 484,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "equal_contents." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 357,
+                  "startColumn": 28,
+                  "endLine": 357,
+                  "endColumn": 49,
+                  "byteLength": 21
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strstr." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 229,
+                  "startColumn": 12,
+                  "endLine": 229,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strchrnul."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 176,
+                  "startColumn": 12,
+                  "endLine": 176,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_src." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 93,
+                  "startColumn": 24,
+                  "endLine": 93,
+                  "endColumn": 51,
+                  "byteLength": 27
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_src." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 384,
+                  "startColumn": 31,
+                  "endLine": 384,
+                  "endColumn": 53,
+                  "byteLength": 22
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strcmp."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 139,
+                  "startColumn": 12,
+                  "endLine": 139,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function strdup." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 484,
+                  "startColumn": 12,
+                  "endLine": 484,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "s_initialized." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/strings.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 38,
+                  "startColumn": 39,
+                  "endLine": 38,
+                  "endColumn": 75,
+                  "byteLength": 36
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "s_null." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 310,
+                  "startColumn": 20,
+                  "endLine": 310,
+                  "endColumn": 30,
+                  "byteLength": 10
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "WcsLen." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 230,
+                  "startColumn": 4,
+                  "endLine": 232,
+                  "endColumn": 63,
+                  "byteLength": 147
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_subset." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 306,
+                  "startColumn": 27,
+                  "endLine": 306,
+                  "endColumn": 72,
+                  "byteLength": 45
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_dest." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 424,
+                  "startColumn": 32,
+                  "endLine": 424,
+                  "endColumn": 50,
+                  "byteLength": 18
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_subset." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 321,
+                  "startColumn": 27,
+                  "endLine": 322,
+                  "endColumn": 65,
+                  "byteLength": 85
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_s." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 197,
+                  "startColumn": 29,
+                  "endLine": 197,
+                  "endColumn": 49,
+                  "byteLength": 20
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_ptr." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 99,
+                  "startColumn": 24,
+                  "endLine": 99,
+                  "endColumn": 39,
+                  "byteLength": 15
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function strlcat." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 455,
+                  "startColumn": 14,
+                  "endLine": 455,
+                  "endColumn": 21,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "disjoint clause in function strtok_r." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 327,
+                  "startColumn": 12,
+                  "endLine": 327,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text":
+              "from clause of term *(__fc_strtok_ptr + (0 ..)) in function strtok."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 269,
+                  "startColumn": 12,
+                  "endLine": 269,
+                  "endColumn": 32,
+                  "byteLength": 20
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_nstring_src." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 363,
+                  "startColumn": 32,
+                  "endLine": 363,
+                  "endColumn": 58,
+                  "byteLength": 26
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term *saveptr in function strtok_r."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 294,
+                  "startColumn": 10,
+                  "endLine": 294,
+                  "endColumn": 18,
+                  "byteLength": 8
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function stpcpy."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 401,
+                  "startColumn": 12,
+                  "endLine": 401,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function memset."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 117,
+                  "startColumn": 12,
+                  "endLine": 117,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_src." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 105,
+                  "startColumn": 24,
+                  "endLine": 105,
+                  "endColumn": 51,
+                  "byteLength": 27
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "wcslen_neg." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 199,
+                  "startColumn": 4,
+                  "endLine": 202,
+                  "endColumn": 22,
+                  "byteLength": 113
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_internal_str." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 519,
+                  "startColumn": 33,
+                  "endLine": 519,
+                  "endColumn": 60,
+                  "byteLength": 27
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function strncpy." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 378,
+                  "startColumn": 12,
+                  "endLine": 378,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_reject." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 198,
+                  "startColumn": 34,
+                  "endLine": 198,
+                  "endColumn": 59,
+                  "byteLength": 25
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "wcschr_def." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 266,
+                  "startColumn": 4,
+                  "endLine": 269,
+                  "endColumn": 29,
+                  "byteLength": 153
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "wcslen_shift." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 222,
+                  "startColumn": 4,
+                  "endLine": 224,
+                  "endColumn": 55,
+                  "byteLength": 117
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "not_first_call." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 311,
+                  "startColumn": 29,
+                  "endLine": 311,
+                  "endColumn": 46,
+                  "byteLength": 17
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_null_or_in_haystack." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 225,
+                  "startColumn": 4,
+                  "endLine": 227,
+                  "endColumn": 59,
+                  "byteLength": 141
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_s1." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 144,
+                  "startColumn": 30,
+                  "endLine": 144,
+                  "endColumn": 55,
+                  "byteLength": 25
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strtok."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 263,
+                  "startColumn": 12,
+                  "endLine": 263,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_src." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 351,
+                  "startColumn": 31,
+                  "endLine": 351,
+                  "endColumn": 53,
+                  "byteLength": 22
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_bounded." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 133,
+                  "startColumn": 28,
+                  "endLine": 133,
+                  "endColumn": 64,
+                  "byteLength": 36
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "acsl_c_equiv." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 147,
+                  "startColumn": 26,
+                  "endLine": 147,
+                  "endColumn": 53,
+                  "byteLength": 27
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "allocates/frees clause in function strndup."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 506,
+                  "startColumn": 12,
+                  "endLine": 506,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_nul_terminated." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 344,
+                  "startColumn": 35,
+                  "endLine": 344,
+                  "endColumn": 51,
+                  "byteLength": 16
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_dest." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 409,
+                  "startColumn": 32,
+                  "endLine": 409,
+                  "endColumn": 50,
+                  "byteLength": 18
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function strcpy." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 360,
+                  "startColumn": 12,
+                  "endLine": 360,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "strlen_not_zero." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 95,
+                  "startColumn": 4,
+                  "endLine": 97,
+                  "endColumn": 58,
+                  "byteLength": 120
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_null_or_same_base." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 216,
+                  "startColumn": 4,
+                  "endLine": 216,
+                  "endColumn": 60,
+                  "byteLength": 56
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strncat."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 441,
+                  "startColumn": 12,
+                  "endLine": 441,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "danglingness." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 60,
+                  "startColumn": 30,
+                  "endLine": 60,
+                  "endColumn": 49,
+                  "byteLength": 19
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text":
+              "from clause of term *(*saveptr + (0 ..)) in function strtok_r."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 313,
+                  "startColumn": 12,
+                  "endLine": 313,
+                  "endColumn": 27,
+                  "byteLength": 15
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "can_allocate." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 491,
+                  "startColumn": 26,
+                  "endLine": 491,
+                  "endColumn": 60,
+                  "byteLength": 34
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_s." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 175,
+                  "startColumn": 29,
+                  "endLine": 175,
+                  "endColumn": 49,
+                  "byteLength": 20
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_haystack." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 231,
+                  "startColumn": 36,
+                  "endLine": 231,
+                  "endColumn": 63,
+                  "byteLength": 27
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function memchr."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 76,
+                  "startColumn": 12,
+                  "endLine": 76,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strtok_r." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 288,
+                  "startColumn": 10,
+                  "endLine": 288,
+                  "endColumn": 16,
+                  "byteLength": 6
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "complete clause in function strtok." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 283,
+                  "startColumn": 12,
+                  "endLine": 283,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text":
+              "from clause of term __fc_heap_status in function strdup."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 473,
+                  "startColumn": 12,
+                  "endLine": 473,
+                  "endColumn": 28,
+                  "byteLength": 16
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_s2." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/strings.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 47,
+                  "startColumn": 28,
+                  "endLine": 47,
+                  "endColumn": 49,
+                  "byteLength": 21
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function memset." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 116,
+                  "startColumn": 12,
+                  "endLine": 116,
+                  "endColumn": 32,
+                  "byteLength": 20
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "logic_spec." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 63,
+                  "startColumn": 24,
+                  "endLine": 63,
+                  "endColumn": 73,
+                  "byteLength": 49
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function strxfrm." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 463,
+                  "startColumn": 14,
+                  "endLine": 463,
+                  "endColumn": 21,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_accept." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 205,
+                  "startColumn": 34,
+                  "endLine": 205,
+                  "endColumn": 59,
+                  "byteLength": 25
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text":
+              "from clause of term *(dest + (0 .. n - 1)) in function strxfrm."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 460,
+                  "startColumn": 12,
+                  "endLine": 460,
+                  "endColumn": 26,
+                  "byteLength": 14
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior resume_str in function strtok." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 283,
+                  "startColumn": 12,
+                  "endLine": 283,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "wcslen_create." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 226,
+                  "startColumn": 4,
+                  "endLine": 228,
+                  "endColumn": 52,
+                  "byteLength": 115
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "memchr_def." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 57,
+                  "startColumn": 4,
+                  "endLine": 59,
+                  "endColumn": 62,
+                  "byteLength": 134
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "s_null." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 267,
+                  "startColumn": 20,
+                  "endLine": 267,
+                  "endColumn": 30,
+                  "byteLength": 10
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function memcmp." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 65,
+                  "startColumn": 11,
+                  "endLine": 65,
+                  "endColumn": 17,
+                  "byteLength": 6
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strerror." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 347,
+                  "startColumn": 12,
+                  "endLine": 347,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior complete in function strncpy." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 378,
+                  "startColumn": 12,
+                  "endLine": 378,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_dest." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 92,
+                  "startColumn": 25,
+                  "endLine": 92,
+                  "endColumn": 48,
+                  "byteLength": 23
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "char_not_found." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 85,
+                  "startColumn": 28,
+                  "endLine": 85,
+                  "endColumn": 49,
+                  "byteLength": 21
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strtok_r."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 305,
+                  "startColumn": 12,
+                  "endLine": 305,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function strpbrk." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 218,
+                  "startColumn": 12,
+                  "endLine": 218,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "allocates/frees clause in function strdup." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 469,
+                  "startColumn": 14,
+                  "endLine": 469,
+                  "endColumn": 21,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_bounded." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 200,
+                  "startColumn": 28,
+                  "endLine": 200,
+                  "endColumn": 53,
+                  "byteLength": 25
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term *(s + (0 ..)) in function strtok_r."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 304,
+                  "startColumn": 12,
+                  "endLine": 304,
+                  "endColumn": 18,
+                  "byteLength": 6
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strcmp." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 142,
+                  "startColumn": 11,
+                  "endLine": 142,
+                  "endColumn": 17,
+                  "byteLength": 6
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "char_found." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 160,
+                  "startColumn": 24,
+                  "endLine": 160,
+                  "endColumn": 35,
+                  "byteLength": 11
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "saveptr_subset." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 323,
+                  "startColumn": 28,
+                  "endLine": 323,
+                  "endColumn": 67,
+                  "byteLength": 39
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_saveptr." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 287,
+                  "startColumn": 26,
+                  "endLine": 287,
+                  "endColumn": 41,
+                  "byteLength": 15
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function strndup." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 506,
+                  "startColumn": 12,
+                  "endLine": 506,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "strlen_sup." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 103,
+                  "startColumn": 4,
+                  "endLine": 105,
+                  "endColumn": 51,
+                  "byteLength": 108
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "StrLen." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 132,
+                  "startColumn": 4,
+                  "endLine": 135,
+                  "endColumn": 38,
+                  "byteLength": 185
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strncat." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 431,
+                  "startColumn": 12,
+                  "endLine": 431,
+                  "endColumn": 58,
+                  "byteLength": 46
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "dynamic_allocation." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_alloc_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 39,
+                  "startColumn": 4,
+                  "endLine": 41,
+                  "endColumn": 50,
+                  "byteLength": 99
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "s_not_null." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 298,
+                  "startColumn": 24,
+                  "endLine": 298,
+                  "endColumn": 34,
+                  "byteLength": 10
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "room_string." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 397,
+                  "startColumn": 26,
+                  "endLine": 397,
+                  "endColumn": 55,
+                  "byteLength": 29
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "saveptr_subset." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 308,
+                  "startColumn": 28,
+                  "endLine": 308,
+                  "endColumn": 54,
+                  "byteLength": 26
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function strsignal." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 523,
+                  "startColumn": 12,
+                  "endLine": 523,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function strlen." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 129,
+                  "startColumn": 14,
+                  "endLine": 129,
+                  "endColumn": 20,
+                  "byteLength": 6
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strsep." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 331,
+                  "startColumn": 12,
+                  "endLine": 331,
+                  "endColumn": 20,
+                  "byteLength": 8
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_internal_str." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 343,
+                  "startColumn": 33,
+                  "endLine": 343,
+                  "endColumn": 59,
+                  "byteLength": 26
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "MemSet." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 68,
+                  "startColumn": 4,
+                  "endLine": 70,
+                  "endColumn": 63,
+                  "byteLength": 135
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text":
+              "from clause of term *((char *)s + (0 .. n - 1)) in function memset."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 116,
+                  "startColumn": 12,
+                  "endLine": 116,
+                  "endColumn": 32,
+                  "byteLength": 20
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strrchr." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 195,
+                  "startColumn": 12,
+                  "endLine": 195,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strndup." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 506,
+                  "startColumn": 12,
+                  "endLine": 506,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_subset." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 264,
+                  "startColumn": 27,
+                  "endLine": 264,
+                  "endColumn": 72,
+                  "byteLength": 45
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "behavior no_allocation in function strndup."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 506,
+                  "startColumn": 12,
+                  "endLine": 506,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "allocates/frees clause in function strndup."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 487,
+                  "startColumn": 14,
+                  "endLine": 487,
+                  "endColumn": 21,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function strchr." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 173,
+                  "startColumn": 12,
+                  "endLine": 173,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "wcsncmp_zero." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 252,
+                  "startColumn": 4,
+                  "endLine": 256,
+                  "endColumn": 53,
+                  "byteLength": 194
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strcspn."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 199,
+                  "startColumn": 12,
+                  "endLine": 199,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function strchrnul." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 179,
+                  "startColumn": 12,
+                  "endLine": 179,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_char." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 161,
+                  "startColumn": 25,
+                  "endLine": 161,
+                  "endColumn": 44,
+                  "byteLength": 19
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "WcsChr." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 266,
+                  "startColumn": 4,
+                  "endLine": 269,
+                  "endColumn": 29,
+                  "byteLength": 153
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strlcat."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 452,
+                  "startColumn": 12,
+                  "endLine": 452,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_same_base." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 162,
+                  "startColumn": 30,
+                  "endLine": 162,
+                  "endColumn": 66,
+                  "byteLength": 36
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_s." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 157,
+                  "startColumn": 29,
+                  "endLine": 157,
+                  "endColumn": 49,
+                  "byteLength": 20
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strcspn." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 202,
+                  "startColumn": 14,
+                  "endLine": 202,
+                  "endColumn": 21,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "bounded_result." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 453,
+                  "startColumn": 28,
+                  "endLine": 453,
+                  "endColumn": 65,
+                  "byteLength": 37
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "copied_contents." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 98,
+                  "startColumn": 29,
+                  "endLine": 98,
+                  "endColumn": 76,
+                  "byteLength": 47
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_valid_string." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 345,
+                  "startColumn": 33,
+                  "endLine": 345,
+                  "endColumn": 59,
+                  "byteLength": 26
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "room_string." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 410,
+                  "startColumn": 26,
+                  "endLine": 410,
+                  "endColumn": 70,
+                  "byteLength": 44
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "strlen_zero." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 99,
+                  "startColumn": 4,
+                  "endLine": 101,
+                  "endColumn": 59,
+                  "byteLength": 117
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strdup."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 470,
+                  "startColumn": 12,
+                  "endLine": 470,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strcasestr." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 239,
+                  "startColumn": 12,
+                  "endLine": 239,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function strcasecmp." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/strings.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 50,
+                  "startColumn": 11,
+                  "endLine": 50,
+                  "endColumn": 21,
+                  "byteLength": 10
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "bounded_result." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 391,
+                  "startColumn": 28,
+                  "endLine": 391,
+                  "endColumn": 50,
+                  "byteLength": 22
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strncat." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 439,
+                  "startColumn": 12,
+                  "endLine": 439,
+                  "endColumn": 48,
+                  "byteLength": 36
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text":
+              "from clause of term *(dest + (strlen{Old}(dest) .. n)) in function strlcat."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 451,
+                  "startColumn": 12,
+                  "endLine": 451,
+                  "endColumn": 33,
+                  "byteLength": 21
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "strlen_create." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 111,
+                  "startColumn": 4,
+                  "endLine": 113,
+                  "endColumn": 51,
+                  "byteLength": 111
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strcasecmp."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/strings.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 48,
+                  "startColumn": 10,
+                  "endLine": 48,
+                  "endColumn": 17,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior resume_str in function strtok_r." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 327,
+                  "startColumn": 12,
+                  "endLine": 327,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function memmove." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 111,
+                  "startColumn": 12,
+                  "endLine": 111,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strtok_r." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 303,
+                  "startColumn": 12,
+                  "endLine": 303,
+                  "endColumn": 20,
+                  "byteLength": 8
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior found in function strrchr." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 195,
+                  "startColumn": 12,
+                  "endLine": 195,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_dest." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 449,
+                  "startColumn": 32,
+                  "endLine": 449,
+                  "endColumn": 50,
+                  "byteLength": 18
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_s." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 212,
+                  "startColumn": 29,
+                  "endLine": 212,
+                  "endColumn": 49,
+                  "byteLength": 20
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "cannot_allocate." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 479,
+                  "startColumn": 29,
+                  "endLine": 479,
+                  "endColumn": 53,
+                  "byteLength": 24
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "strlen_create_shift." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 115,
+                  "startColumn": 4,
+                  "endLine": 117,
+                  "endColumn": 62,
+                  "byteLength": 143
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strtok_r."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 292,
+                  "startColumn": 10,
+                  "endLine": 292,
+                  "endColumn": 17,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_nul_terminated." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 520,
+                  "startColumn": 35,
+                  "endLine": 520,
+                  "endColumn": 51,
+                  "byteLength": 16
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "sum_of_lengths." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 413,
+                  "startColumn": 28,
+                  "endLine": 413,
+                  "endColumn": 76,
+                  "byteLength": 48
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_null." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 86,
+                  "startColumn": 25,
+                  "endLine": 86,
+                  "endColumn": 41,
+                  "byteLength": 16
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text":
+              "from clause of term __fc_heap_status in function strndup."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 492,
+                  "startColumn": 12,
+                  "endLine": 492,
+                  "endColumn": 28,
+                  "byteLength": 16
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_s2." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 152,
+                  "startColumn": 30,
+                  "endLine": 152,
+                  "endColumn": 51,
+                  "byteLength": 21
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "separation." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 366,
+                  "startColumn": 4,
+                  "endLine": 366,
+                  "endColumn": 43,
+                  "byteLength": 39
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strchr."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 158,
+                  "startColumn": 12,
+                  "endLine": 158,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_dest." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 104,
+                  "startColumn": 25,
+                  "endLine": 104,
+                  "endColumn": 48,
+                  "byteLength": 23
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term *saveptr in function strtok_r."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 303,
+                  "startColumn": 12,
+                  "endLine": 303,
+                  "endColumn": 20,
+                  "byteLength": 8
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strtok."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 275,
+                  "startColumn": 12,
+                  "endLine": 275,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "copied_contents." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 108,
+                  "startColumn": 29,
+                  "endLine": 108,
+                  "endColumn": 76,
+                  "byteLength": 47
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function strsep." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 334,
+                  "startColumn": 12,
+                  "endLine": 334,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text":
+              "from clause of term *(dest +\n                      (strlen{Old}(dest) ..\n                                           strlen{Old}(dest) +\n                                           strlen{Old}(src))) in function strncat."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 431,
+                  "startColumn": 12,
+                  "endLine": 431,
+                  "endColumn": 58,
+                  "byteLength": 46
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "sum_of_lengths." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 434,
+                  "startColumn": 28,
+                  "endLine": 434,
+                  "endColumn": 76,
+                  "byteLength": 48
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strcpy." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 355,
+                  "startColumn": 12,
+                  "endLine": 355,
+                  "endColumn": 32,
+                  "byteLength": 20
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text":
+              "from clause of term *((char *)dest + (0 .. n - 1)) in function memmove."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 106,
+                  "startColumn": 12,
+                  "endLine": 106,
+                  "endColumn": 35,
+                  "byteLength": 23
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "wcslen_before_null." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 204,
+                  "startColumn": 4,
+                  "endLine": 205,
+                  "endColumn": 76,
+                  "byteLength": 105
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "ptr_subset." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 279,
+                  "startColumn": 24,
+                  "endLine": 279,
+                  "endColumn": 77,
+                  "byteLength": 53
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strcasestr."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 233,
+                  "startColumn": 12,
+                  "endLine": 233,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "allocates/frees clause in function strdup." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 484,
+                  "startColumn": 12,
+                  "endLine": 484,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function strncat." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 444,
+                  "startColumn": 12,
+                  "endLine": 444,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function memmove." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 106,
+                  "startColumn": 12,
+                  "endLine": 106,
+                  "endColumn": 35,
+                  "byteLength": 23
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_src." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 448,
+                  "startColumn": 31,
+                  "endLine": 448,
+                  "endColumn": 53,
+                  "byteLength": 22
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function strcspn." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 202,
+                  "startColumn": 14,
+                  "endLine": 202,
+                  "endColumn": 21,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function memcmp." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 65,
+                  "startColumn": 11,
+                  "endLine": 65,
+                  "endColumn": 17,
+                  "byteLength": 6
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strncmp." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 149,
+                  "startColumn": 11,
+                  "endLine": 149,
+                  "endColumn": 18,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strncasecmp."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/strings.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 55,
+                  "startColumn": 10,
+                  "endLine": 55,
+                  "endColumn": 17,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "memcmp_strlen_shift_left." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 127,
+                  "startColumn": 4,
+                  "endLine": 130,
+                  "endColumn": 38,
+                  "byteLength": 184
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function memcmp."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 61,
+                  "startColumn": 12,
+                  "endLine": 61,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "src_fits." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 372,
+                  "startColumn": 22,
+                  "endLine": 372,
+                  "endColumn": 37,
+                  "byteLength": 15
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strncmp."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 146,
+                  "startColumn": 12,
+                  "endLine": 146,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "memcmp_zero." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 39,
+                  "startColumn": 4,
+                  "endLine": 42,
+                  "endColumn": 70,
+                  "byteLength": 170
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_in_length." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 163,
+                  "startColumn": 30,
+                  "endLine": 163,
+                  "endColumn": 59,
+                  "byteLength": 29
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "initialization." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 57,
+                  "startColumn": 32,
+                  "endLine": 57,
+                  "endColumn": 68,
+                  "byteLength": 36
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "StrNCmp." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 155,
+                  "startColumn": 4,
+                  "endLine": 159,
+                  "endColumn": 53,
+                  "byteLength": 191
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strndup."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 502,
+                  "startColumn": 12,
+                  "endLine": 502,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function strncasecmp." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/strings.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 57,
+                  "startColumn": 11,
+                  "endLine": 57,
+                  "endColumn": 22,
+                  "byteLength": 11
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function strcoll." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 155,
+                  "startColumn": 11,
+                  "endLine": 155,
+                  "endColumn": 18,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text":
+              "from clause of term *(dest +\n                      (strlen{Old}(dest) ..\n                                           strlen{Old}(dest) +\n                                           strlen{Old}(src))) in function strcat."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 411,
+                  "startColumn": 12,
+                  "endLine": 411,
+                  "endColumn": 58,
+                  "byteLength": 46
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function memcpy." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 101,
+                  "startColumn": 12,
+                  "endLine": 101,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "separation." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 399,
+                  "startColumn": 4,
+                  "endLine": 399,
+                  "endColumn": 59,
+                  "byteLength": 55
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior new_str in function strtok." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 283,
+                  "startColumn": 12,
+                  "endLine": 283,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function memchr." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 88,
+                  "startColumn": 12,
+                  "endLine": 88,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "wcslen_sup." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 218,
+                  "startColumn": 4,
+                  "endLine": 220,
+                  "endColumn": 52,
+                  "byteLength": 112
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term *(s + (0 ..)) in function strtok."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 262,
+                  "startColumn": 12,
+                  "endLine": 262,
+                  "endColumn": 18,
+                  "byteLength": 6
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_s1." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 137,
+                  "startColumn": 30,
+                  "endLine": 137,
+                  "endColumn": 51,
+                  "byteLength": 21
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_haystack." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 220,
+                  "startColumn": 36,
+                  "endLine": 220,
+                  "endColumn": 63,
+                  "byteLength": 27
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term *stringp in function strsep."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 331,
+                  "startColumn": 12,
+                  "endLine": 331,
+                  "endColumn": 20,
+                  "byteLength": 8
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "separation." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 387,
+                  "startColumn": 4,
+                  "endLine": 387,
+                  "endColumn": 61,
+                  "byteLength": 57
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior found in function strchr." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 173,
+                  "startColumn": 12,
+                  "endLine": 173,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "strcmp_zero." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 143,
+                  "startColumn": 4,
+                  "endLine": 147,
+                  "endColumn": 63,
+                  "byteLength": 170
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_s." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 468,
+                  "startColumn": 29,
+                  "endLine": 468,
+                  "endColumn": 49,
+                  "byteLength": 20
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior not_found in function strchr." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 173,
+                  "startColumn": 12,
+                  "endLine": 173,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "WcsCmp." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 240,
+                  "startColumn": 4,
+                  "endLine": 244,
+                  "endColumn": 63,
+                  "byteLength": 173
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function strtok_r." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 327,
+                  "startColumn": 12,
+                  "endLine": 327,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_null_or_same_base." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 193,
+                  "startColumn": 4,
+                  "endLine": 193,
+                  "endColumn": 60,
+                  "byteLength": 56
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "initialization." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 416,
+                  "startColumn": 4,
+                  "endLine": 416,
+                  "endColumn": 60,
+                  "byteLength": 56
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "equal_contents." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 402,
+                  "startColumn": 28,
+                  "endLine": 402,
+                  "endColumn": 49,
+                  "byteLength": 21
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "strlen_pos_or_null." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 78,
+                  "startColumn": 4,
+                  "endLine": 82,
+                  "endColumn": 40,
+                  "byteLength": 169
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strdup." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 484,
+                  "startColumn": 12,
+                  "endLine": 484,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strdup." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 473,
+                  "startColumn": 12,
+                  "endLine": 473,
+                  "endColumn": 28,
+                  "byteLength": 16
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_valid_string_and_same_contents." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 477,
+                  "startColumn": 4,
+                  "endLine": 477,
+                  "endColumn": 51,
+                  "byteLength": 47
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function strtok." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 283,
+                  "startColumn": 12,
+                  "endLine": 283,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "room_nstring." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 450,
+                  "startColumn": 27,
+                  "endLine": 450,
+                  "endColumn": 48,
+                  "byteLength": 21
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "memcmp_strlen_shift_right." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 132,
+                  "startColumn": 4,
+                  "endLine": 135,
+                  "endColumn": 38,
+                  "byteLength": 185
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "src_too_long." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 375,
+                  "startColumn": 26,
+                  "endLine": 375,
+                  "endColumn": 42,
+                  "byteLength": 16
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strsignal." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 523,
+                  "startColumn": 12,
+                  "endLine": 523,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "can_allocate." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 472,
+                  "startColumn": 26,
+                  "endLine": 472,
+                  "endColumn": 49,
+                  "byteLength": 23
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "wcslen_pos_or_null." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 193,
+                  "startColumn": 4,
+                  "endLine": 197,
+                  "endColumn": 41,
+                  "byteLength": 174
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "strncmp_zero." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 155,
+                  "startColumn": 4,
+                  "endLine": 159,
+                  "endColumn": 53,
+                  "byteLength": 191
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_s1." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/strings.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 53,
+                  "startColumn": 28,
+                  "endLine": 53,
+                  "endColumn": 53,
+                  "byteLength": 25
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strsep."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 332,
+                  "startColumn": 12,
+                  "endLine": 332,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior allocation in function strdup." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 484,
+                  "startColumn": 12,
+                  "endLine": 484,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_s." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 181,
+                  "startColumn": 29,
+                  "endLine": 181,
+                  "endColumn": 49,
+                  "byteLength": 20
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "char_not_found." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 167,
+                  "startColumn": 28,
+                  "endLine": 167,
+                  "endColumn": 40,
+                  "byteLength": 12
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_needle." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 232,
+                  "startColumn": 34,
+                  "endLine": 232,
+                  "endColumn": 59,
+                  "byteLength": 25
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior found in function memchr." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 88,
+                  "startColumn": 12,
+                  "endLine": 88,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_same_base." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 186,
+                  "startColumn": 30,
+                  "endLine": 186,
+                  "endColumn": 66,
+                  "byteLength": 36
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_bounded." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 208,
+                  "startColumn": 28,
+                  "endLine": 208,
+                  "endColumn": 53,
+                  "byteLength": 25
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "acsl_c_equiv." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 140,
+                  "startColumn": 26,
+                  "endLine": 140,
+                  "endColumn": 50,
+                  "byteLength": 24
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "wcslen_not_zero." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 210,
+                  "startColumn": 4,
+                  "endLine": 212,
+                  "endColumn": 59,
+                  "byteLength": 124
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strdup."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 474,
+                  "startColumn": 12,
+                  "endLine": 474,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function strrchr." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 195,
+                  "startColumn": 12,
+                  "endLine": 195,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "allocation." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 495,
+                  "startColumn": 24,
+                  "endLine": 495,
+                  "endColumn": 60,
+                  "byteLength": 36
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_s2." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 145,
+                  "startColumn": 30,
+                  "endLine": 145,
+                  "endColumn": 55,
+                  "byteLength": 25
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strncat." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 425,
+                  "startColumn": 12,
+                  "endLine": 425,
+                  "endColumn": 50,
+                  "byteLength": 38
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "never_allocable." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_alloc_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 39,
+                  "startColumn": 4,
+                  "endLine": 41,
+                  "endColumn": 50,
+                  "byteLength": 99
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_null." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 504,
+                  "startColumn": 25,
+                  "endLine": 504,
+                  "endColumn": 41,
+                  "byteLength": 16
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strndup." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 506,
+                  "startColumn": 12,
+                  "endLine": 506,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "initialization." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 307,
+                  "startColumn": 28,
+                  "endLine": 307,
+                  "endColumn": 49,
+                  "byteLength": 21
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_valid_string." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 521,
+                  "startColumn": 33,
+                  "endLine": 521,
+                  "endColumn": 59,
+                  "byteLength": 26
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "WcsNCmp." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 252,
+                  "startColumn": 4,
+                  "endLine": 256,
+                  "endColumn": 53,
+                  "byteLength": 194
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "sum_of_bounded_lengths." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 442,
+                  "startColumn": 36,
+                  "endLine": 442,
+                  "endColumn": 74,
+                  "byteLength": 38
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "points_to_end." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 403,
+                  "startColumn": 27,
+                  "endLine": 403,
+                  "endColumn": 57,
+                  "byteLength": 30
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_s." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 115,
+                  "startColumn": 22,
+                  "endLine": 115,
+                  "endColumn": 42,
+                  "byteLength": 20
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strxfrm."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 461,
+                  "startColumn": 12,
+                  "endLine": 461,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function memcpy."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 97,
+                  "startColumn": 12,
+                  "endLine": 97,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "wmemchr_def." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 183,
+                  "startColumn": 4,
+                  "endLine": 185,
+                  "endColumn": 63,
+                  "byteLength": 143
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strtok." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 261,
+                  "startColumn": 12,
+                  "endLine": 261,
+                  "endColumn": 27,
+                  "byteLength": 15
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strnlen."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 132,
+                  "startColumn": 12,
+                  "endLine": 132,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text":
+              "from clause of term *(dest + (0 .. strlen{Old}(src))) in function stpcpy."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 400,
+                  "startColumn": 12,
+                  "endLine": 400,
+                  "endColumn": 32,
+                  "byteLength": 20
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_subset." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 277,
+                  "startColumn": 27,
+                  "endLine": 278,
+                  "endColumn": 72,
+                  "byteLength": 92
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strxfrm." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 460,
+                  "startColumn": 12,
+                  "endLine": 460,
+                  "endColumn": 26,
+                  "byteLength": 14
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strncasecmp." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/strings.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 57,
+                  "startColumn": 11,
+                  "endLine": 57,
+                  "endColumn": 22,
+                  "byteLength": 11
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "room_nstring." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 385,
+                  "startColumn": 27,
+                  "endLine": 385,
+                  "endColumn": 48,
+                  "byteLength": 21
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "room_string." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 352,
+                  "startColumn": 26,
+                  "endLine": 352,
+                  "endColumn": 55,
+                  "byteLength": 29
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_ptr." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 427,
+                  "startColumn": 24,
+                  "endLine": 427,
+                  "endColumn": 39,
+                  "byteLength": 15
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_dest." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 458,
+                  "startColumn": 25,
+                  "endLine": 458,
+                  "endColumn": 48,
+                  "byteLength": 23
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strspn."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 206,
+                  "startColumn": 12,
+                  "endLine": 206,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function strerror." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 347,
+                  "startColumn": 12,
+                  "endLine": 347,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_src_too_large." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 437,
+                  "startColumn": 4,
+                  "endLine": 437,
+                  "endColumn": 49,
+                  "byteLength": 45
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "MemCmp." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 39,
+                  "startColumn": 4,
+                  "endLine": 42,
+                  "endColumn": 70,
+                  "byteLength": 170
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "wcslen_zero." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 214,
+                  "startColumn": 4,
+                  "endLine": 216,
+                  "endColumn": 60,
+                  "byteLength": 121
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strncpy."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 368,
+                  "startColumn": 12,
+                  "endLine": 368,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function memcpy." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 96,
+                  "startColumn": 12,
+                  "endLine": 96,
+                  "endColumn": 35,
+                  "byteLength": 23
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "specialization of valid_string_s at stmt 2."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "tests/sarif/libc.c",
+                  "uriBaseId": "PWD"
+                },
+                "region": {
+                  "startLine": 13,
+                  "startColumn": 10,
+                  "endLine": 13,
+                  "endColumn": 19,
+                  "byteLength": 9
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_stringp." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 329,
+                  "startColumn": 35,
+                  "endLine": 329,
+                  "endColumn": 76,
+                  "byteLength": 41
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "strlen_neg." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 84,
+                  "startColumn": 4,
+                  "endLine": 87,
+                  "endColumn": 22,
+                  "byteLength": 109
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function strstr." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 229,
+                  "startColumn": 12,
+                  "endLine": 229,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_needle." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 221,
+                  "startColumn": 34,
+                  "endLine": 221,
+                  "endColumn": 59,
+                  "byteLength": 25
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "initialization." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 390,
+                  "startColumn": 28,
+                  "endLine": 390,
+                  "endColumn": 73,
+                  "byteLength": 45
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "memset_def." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 68,
+                  "startColumn": 4,
+                  "endLine": 70,
+                  "endColumn": 63,
+                  "byteLength": 135
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_ptr." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 369,
+                  "startColumn": 24,
+                  "endLine": 369,
+                  "endColumn": 39,
+                  "byteLength": 15
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strncat."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 426,
+                  "startColumn": 12,
+                  "endLine": 426,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strlcpy."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 389,
+                  "startColumn": 12,
+                  "endLine": 389,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strchrnul." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 179,
+                  "startColumn": 12,
+                  "endLine": 179,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "acsl_c_equiv." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 118,
+                  "startColumn": 26,
+                  "endLine": 118,
+                  "endColumn": 46,
+                  "byteLength": 20
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strlen."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 126,
+                  "startColumn": 12,
+                  "endLine": 126,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text":
+              "from clause of term *(dest + (0 .. n - 1)) in function strlcpy."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 388,
+                  "startColumn": 12,
+                  "endLine": 388,
+                  "endColumn": 24,
+                  "byteLength": 12
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function strncmp." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 149,
+                  "startColumn": 11,
+                  "endLine": 149,
+                  "endColumn": 18,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strndup." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 492,
+                  "startColumn": 12,
+                  "endLine": 492,
+                  "endColumn": 28,
+                  "byteLength": 16
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_delim." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 330,
+                  "startColumn": 33,
+                  "endLine": 330,
+                  "endColumn": 57,
+                  "byteLength": 24
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strpbrk." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 218,
+                  "startColumn": 12,
+                  "endLine": 218,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_null." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 482,
+                  "startColumn": 25,
+                  "endLine": 482,
+                  "endColumn": 41,
+                  "byteLength": 16
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_memory_area." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/strings.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 36,
+                  "startColumn": 32,
+                  "endLine": 36,
+                  "endColumn": 63,
+                  "byteLength": 31
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_s_or_delim_not_found." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 300,
+                  "startColumn": 6,
+                  "endLine": 302,
+                  "endColumn": 70,
+                  "byteLength": 120
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strspn."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 207,
+                  "startColumn": 12,
+                  "endLine": 207,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_ptr." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 119,
+                  "startColumn": 24,
+                  "endLine": 119,
+                  "endColumn": 36,
+                  "byteLength": 12
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term __fc_strtok_ptr in function strtok."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 252,
+                  "startColumn": 10,
+                  "endLine": 252,
+                  "endColumn": 25,
+                  "byteLength": 15
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strcat." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 411,
+                  "startColumn": 12,
+                  "endLine": 411,
+                  "endColumn": 58,
+                  "byteLength": 46
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "behavior default! in function stpcpy." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 405,
+                  "startColumn": 12,
+                  "endLine": 405,
+                  "endColumn": 13,
+                  "byteLength": 1
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "zero_initialized." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/strings.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 39,
+                  "startColumn": 28,
+                  "endLine": 39,
+                  "endColumn": 63,
+                  "byteLength": 35
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "result_char." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 185,
+                  "startColumn": 25,
+                  "endLine": 185,
+                  "endColumn": 38,
+                  "byteLength": 13
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_s2." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 56,
+                  "startColumn": 23,
+                  "endLine": 56,
+                  "endColumn": 49,
+                  "byteLength": 26
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function stpcpy." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 400,
+                  "startColumn": 12,
+                  "endLine": 400,
+                  "endColumn": 32,
+                  "byteLength": 20
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strstr."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 222,
+                  "startColumn": 12,
+                  "endLine": 222,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term \\result in function strrchr."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 182,
+                  "startColumn": 12,
+                  "endLine": 182,
+                  "endColumn": 19,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "assigns clause in function strnlen." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 135,
+                  "startColumn": 14,
+                  "endLine": 135,
+                  "endColumn": 21,
+                  "byteLength": 7
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_s2." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/strings.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 54,
+                  "startColumn": 28,
+                  "endLine": 54,
+                  "endColumn": 53,
+                  "byteLength": 25
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "from clause of term *(s + (0 ..)) in function strtok."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 246,
+                  "startColumn": 10,
+                  "endLine": 246,
+                  "endColumn": 16,
+                  "byteLength": 6
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "valid_string_src." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/string.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 408,
+                  "startColumn": 31,
+                  "endLine": 408,
+                  "endColumn": 53,
+                  "byteLength": 22
+                }
+              }
+            }
+          ]
+        },
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": { "text": "strchr_def." },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "libc/__fc_string_axiomatic.h",
+                  "uriBaseId": "FRAMAC_SHARE"
+                },
+                "region": {
+                  "startLine": 168,
+                  "startColumn": 4,
+                  "endLine": 170,
+                  "endColumn": 75,
+                  "byteLength": 132
+                }
+              }
+            }
+          ]
+        }
+      ],
+      "defaultSourceLanguage": "C",
+      "taxonomies": [
+        {
+          "name": "frama-c",
+          "rules": [
+            {
+              "id": "user-spec",
+              "shortDescription": {
+                "text": "User-written ACSL specification."
+              }
+            }
+          ],
+          "contents": [ "nonLocalizedData" ]
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/src/plugins/markdown-report/tests/sarif/oracle/without-libc.sarif b/src/plugins/markdown-report/tests/sarif/oracle/without-libc.sarif
new file mode 100644
index 0000000000000000000000000000000000000000..b22b1bf8f4209a3f890c272cdee6d5470526ac48
--- /dev/null
+++ b/src/plugins/markdown-report/tests/sarif/oracle/without-libc.sarif
@@ -0,0 +1,92 @@
+{
+  "$schema":
+    "https://github.com/oasis-tcs/sarif-spec/blob/master/Documents/CommitteeSpecificationDrafts/v2.1.0-CSD.1/sarif-schema-2.1.0.json",
+  "version": "2.1.0",
+  "runs": [
+    {
+      "tool": {
+        "driver": {
+          "name": "frama-c",
+          "fullName": "frama-c-0+omitted-for-deterministic-output",
+          "version": "0+omitted-for-deterministic-output",
+          "downloadUri": "https://frama-c.com/download.html",
+          "informationUri": "https://frama-c.com"
+        }
+      },
+      "invocations": [
+        {
+          "commandLine":
+            "frama-c -check tests/sarif/libc.c -no-autoload-plugins -load-module eva,from,scope,markdown_report -eva -eva-no-results -mdr-gen sarif -mdr-sarif-deterministic -mdr-no-print-libc -mdr-out tests/sarif/result/without-libc.sarif",
+          "arguments": [
+            "-check", "tests/sarif/libc.c", "-no-autoload-plugins",
+            "-load-module", "eva,from,scope,markdown_report", "-eva",
+            "-eva-no-results", "-mdr-gen", "sarif",
+            "-mdr-sarif-deterministic", "-mdr-no-print-libc", "-mdr-out",
+            "tests/sarif/result/without-libc.sarif"
+          ],
+          "exitCode": 0,
+          "executionSuccessful": true
+        }
+      ],
+      "originalUriBaseIds": {
+        "FRAMAC_SHARE": {
+          "uri": "file:///omitted-for-deterministic-output/"
+        },
+        "FRAMAC_LIB": { "uri": "file:///omitted-for-deterministic-output/" },
+        "FRAMAC_PLUGIN": {
+          "uri": "file:///omitted-for-deterministic-output/"
+        },
+        "PWD": { "uri": "file:///omitted-for-deterministic-output/" }
+      },
+      "artifacts": [
+        {
+          "location": { "uri": "tests/sarif/libc.c", "uriBaseId": "PWD" },
+          "roles": [ "analysisTarget" ],
+          "mimeType": "text/x-csrc"
+        }
+      ],
+      "results": [
+        {
+          "ruleId": "user-spec",
+          "kind": "pass",
+          "level": "none",
+          "message": {
+            "text": "specialization of valid_string_s at stmt 2."
+          },
+          "locations": [
+            {
+              "physicalLocation": {
+                "artifactLocation": {
+                  "uri": "tests/sarif/libc.c",
+                  "uriBaseId": "PWD"
+                },
+                "region": {
+                  "startLine": 13,
+                  "startColumn": 10,
+                  "endLine": 13,
+                  "endColumn": 19,
+                  "byteLength": 9
+                }
+              }
+            }
+          ]
+        }
+      ],
+      "defaultSourceLanguage": "C",
+      "taxonomies": [
+        {
+          "name": "frama-c",
+          "rules": [
+            {
+              "id": "user-spec",
+              "shortDescription": {
+                "text": "User-written ACSL specification."
+              }
+            }
+          ],
+          "contents": [ "nonLocalizedData" ]
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/src/plugins/metrics/metrics_acsl.ml b/src/plugins/metrics/metrics_acsl.ml
index 6e8cc4b68f7771060214537bbe16865d7ea0904f..6a7960d6e597a6b14e366713122d7ad35e9bdd41 100644
--- a/src/plugins/metrics/metrics_acsl.ml
+++ b/src/plugins/metrics/metrics_acsl.ml
@@ -315,7 +315,11 @@ let dump () =
       let fmt = Format.formatter_of_out_channel chan in
       (match Metrics_base.get_file_type out with
             | Metrics_base.Html -> dump_acsl_stats_html fmt
-            | Metrics_base.Text -> dump_acsl_stats fmt);
+            | Metrics_base.Text -> dump_acsl_stats fmt
+            | Metrics_base.Json ->
+              Metrics_parameters.not_yet_implemented
+                "JSON format for ACSL metrics"
+      );
       close_out chan
     with Sys_error s ->
       Metrics_parameters.abort "Cannot open file %s (%s)" out s
diff --git a/src/plugins/metrics/metrics_base.ml b/src/plugins/metrics/metrics_base.ml
index baf2ca5fd2b43f6e3bb9a1f82b6e8621948e722e..e1cc6633a3aaf5a0da94b4553690eb766ec501cc 100644
--- a/src/plugins/metrics/metrics_base.ml
+++ b/src/plugins/metrics/metrics_base.ml
@@ -34,7 +34,7 @@ let html_stag_functions =
       let index = String.index t ' ' in
       Format.sprintf "</%s>" (String.sub t 0 index)
     with
-      | Not_found -> Format.sprintf "</%s>" t
+    | Not_found -> Format.sprintf "</%s>" t
   and print_open_stag _ = ()
   and print_close_stag _ = ()
   in
@@ -64,7 +64,7 @@ module OptionKf =
 
 (** Defining base metrics and operations on those *)
 module BasicMetrics = struct
-(** Record type to compute cyclomatic complexity *)
+  (** Record type to compute cyclomatic complexity *)
 
   type t = {
     cfile_name : Datatype.Filepath.t;
@@ -139,11 +139,11 @@ module BasicMetrics = struct
   ;;
 
   let labels =
-      [ "Sloc"; "Decision point"; "Global variables"; "If"; "Loop";  "Goto";
-        "Assignment"; "Exit point"; "Function"; "Function call";
-        "Pointer dereferencing";
-        "Cyclomatic complexity";
-      ]
+    [ "Sloc"; "Decision point"; "Global variables"; "If"; "Loop";  "Goto";
+      "Assignment"; "Exit point"; "Function"; "Function call";
+      "Pointer dereferencing";
+      "Cyclomatic complexity";
+    ]
   ;;
 
   let str_values metrics =
@@ -162,12 +162,12 @@ module BasicMetrics = struct
   let pp_func_or_none =
     Pretty_utils.pp_opt ~none:"<none>" Kernel_function.pretty
 
-(* Pretty print metrics as text eg. in stdout *)
+  (* Pretty print metrics as text eg. in stdout *)
   let pp_base_metrics fmt metrics =
     let heading =
       if metrics.cfile_name = Datatype.Filepath.dummy &&
          metrics.cfunc = None then
-      (* It is a global metrics *)
+        (* It is a global metrics *)
         "Global metrics"
       else
         Format.asprintf "Stats for function <%a/%a>"
@@ -177,12 +177,12 @@ module BasicMetrics = struct
     Format.fprintf fmt "@[<v 0>%a @ %a@]"
       (mk_hdr 1) heading
       ((fun l1 ppf l2 ->
-        List.iter2 (fun x y -> Format.fprintf ppf "%s = %s@ " x y)
-          l1 l2) labels)
+          List.iter2 (fun x y -> Format.fprintf ppf "%s = %s@ " x y)
+            l1 l2) labels)
       (str_values metrics)
   ;;
 
-(* Dummy utility functions for pretty printing simple types *)
+  (* Dummy utility functions for pretty printing simple types *)
   let pp_int fmt n = Format.fprintf fmt "%d" n
   ;;
 
@@ -242,26 +242,28 @@ let get_suffix filename =
       String.sub filename (succ last_dot_idx) (slen - last_dot_idx - 1)
     else ""
   with
-    | Not_found -> raise No_suffix
+  | Not_found -> raise No_suffix
 ;;
 
 type output_type =
   | Html
   | Text
+  | Json
 ;;
 
 let get_file_type filename =
   try
     match get_suffix filename with
-      | "html" | "htm" -> Html
-      | "txt" | "text" -> Text
-      | s ->
-        Metrics_parameters.abort
-          "Unknown file extension %s. Cannot produce output.@." s
+    | "html" | "htm" -> Html
+    | "txt" | "text" -> Text
+    | "json" -> Json
+    | s ->
+      Metrics_parameters.abort
+        "Unknown file extension %s. Cannot produce output.@." s
   with
-    | No_suffix ->
-       Metrics_parameters.abort
-         "File %s has no suffix. Cannot produce output.@." filename
+  | No_suffix ->
+    Metrics_parameters.abort
+      "File %s has no suffix. Cannot produce output.@." filename
 
 module VarinfoByName = struct
   type t = Cil_types.varinfo
@@ -278,22 +280,29 @@ let pretty_set fmt s =
   Format.fprintf fmt "@[";
   VInfoMap.iter
     (fun f n ->
-      Format.fprintf fmt "%s %s(%d call%s);@ "
-        f.Cil_types.vname
-        (if f.vaddrof then "(address taken) " else "")
-        n (if n > 1 then "s" else ""))
+       Format.fprintf fmt "%s %s(%d call%s);@ "
+         f.Cil_types.vname
+         (if f.vaddrof then "(address taken) " else "")
+         n (if n > 1 then "s" else ""))
     s;
   Format.fprintf fmt "@]"
 
+let json_of_varinfo_map m =
+  let elems = VInfoMap.fold (fun f n acc ->
+      let calls = ("calls", `Int n) in
+      let address_taken = ("address_taken", `Bool f.vaddrof) in
+      let elem = `Assoc [(f.vname, `Assoc ([calls; address_taken]))] in
+      elem :: acc
+    ) m []
+  in
+  `List (List.rev elems)
+
 let pretty_extern_vars fmt s =
   Pretty_utils.pp_iter ~pre:"@[" ~suf:"@]" ~sep:";@ "
     VInfoSet.iter Printer.pp_varinfo fmt s
 
-let is_in_libc attrs = Cil.hasAttribute "fc_stdlib" attrs ||
-                       Cil.hasAttribute "fc_stdlib_generated" attrs
-
 let is_entry_point vinfo times_called =
-  times_called = 0 && not vinfo.vaddrof && not (is_in_libc vinfo.vattr)
+  times_called = 0 && not vinfo.vaddrof && not (Cil.is_in_libc vinfo.vattr)
 ;;
 
 let number_entry_points fs =
@@ -306,18 +315,28 @@ let pretty_entry_points  fmt fs =
   let print fmt =
     VInfoMap.iter
       (fun fvinfo n  ->
-        if is_entry_point fvinfo n
-        then Format.fprintf fmt "%s;@ " fvinfo.vname)
+         if is_entry_point fvinfo n
+         then Format.fprintf fmt "%s;@ " fvinfo.vname)
   in
   Format.fprintf fmt "@[<hov 1>%a@]" print fs;
 ;;
 
+let json_of_entry_points m =
+  `List
+    (List.rev
+       (VInfoMap.fold
+          (fun vi n acc ->
+             if is_entry_point vi n then `String vi.vname :: acc
+             else acc)
+          m [])
+    )
+
 (* Utilities for CIL ASTs *)
 
 let file_of_vinfodef fvinfo =
   let kf = Globals.Functions.get fvinfo in
   let decl_loc1, _decl_loc2 =
-  match kf.fundec with
+    match kf.fundec with
     | Definition (_, loc) -> loc
     | Declaration (_, _, _, loc) -> loc
   in decl_loc1.Filepath.pos_path
@@ -331,12 +350,12 @@ let file_of_fundef (fun_dec: Cil_types.fundec) =
 
 let extract_fundef_name sname =
   match sname with
-    | _spec, (the_name, _, _, _) -> the_name
+  | _spec, (the_name, _, _, _) -> the_name
 ;;
 
 let kf_of_cabs_name sname =
   match sname with
-    | _spec, (the_name, _, _, _) -> Globals.Functions.find_by_name the_name
+  | _spec, (the_name, _, _, _) -> Globals.Functions.find_by_name the_name
 
 let get_filename fdef =
   match fdef with
@@ -348,12 +367,12 @@ let get_filename fdef =
 let consider_function ~libc vinfo =
   not (!Db.Value.mem_builtin vinfo.vname
        || Ast_info.is_frama_c_builtin vinfo.vname
-       || Cil.is_unused_builtin vinfo
-  ) && (libc || not (is_in_libc vinfo.vattr))
+       || Cil_builtins.is_unused_builtin vinfo
+      ) && (libc || not (Cil.is_in_libc vinfo.vattr))
 
 let consider_variable ~libc vinfo =
   not (Cil.hasAttribute "FRAMA_C_MODEL" vinfo.vattr) &&
-    (libc || not (is_in_libc vinfo.vattr))
+  (libc || not (Cil.is_in_libc vinfo.vattr))
 
 let float_to_string f =
   let s = Format.sprintf "%F" f in
diff --git a/src/plugins/metrics/metrics_base.mli b/src/plugins/metrics/metrics_base.mli
index bd8b85522c181da835fdfc7c4e1fc0d628978db6..6e4b361b7bfa7c4b5d26e0234ff54b1973211aea 100644
--- a/src/plugins/metrics/metrics_base.mli
+++ b/src/plugins/metrics/metrics_base.mli
@@ -29,6 +29,7 @@ val html_stag_functions : Format.formatter_stag_functions;;
     - level 1 headers are underlined by '='
     - level 2 headers by '-'
     - level 3 headers by '~'
+
     This function is supposed to follow reStructuredText's conventions.
 *)
 val mk_hdr : int -> Format.formatter -> string -> unit;;
@@ -52,7 +53,7 @@ module BasicMetrics : sig
                                  function, possibly more for a file.*)
     cptrs: int ;             (** Access to pointers *)
     cdecision_points: int ;  (** Decision points of the program: ifs,
-                              switch cases, exception handlers, ... *)
+                                 switch cases, exception handlers, ... *)
     cglob_vars: int;         (** Global variables *)
     ccyclo: int;             (** Cyclomatic complexity *)
   }
@@ -108,6 +109,10 @@ val pretty_set : Format.formatter -> int VInfoMap.t -> unit
 
 val pretty_extern_vars: Format.formatter -> VInfoSet.t -> unit
 
+(** Build a JSON list with the varinfos in [m], each as a JSON object with
+    the varinfo name as key and additional attributes as values. *)
+val json_of_varinfo_map : int VInfoMap.t -> Yojson.t
+
 (** Handling entry points informations *)
 val number_entry_points : int VInfoMap.t -> int
 ;;
@@ -116,6 +121,8 @@ val pretty_entry_points :
   Format.formatter -> int VInfoMap.t -> unit
 ;;
 
+val json_of_entry_points : int VInfoMap.t -> Yojson.t
+
 (** Get the filename where the definition of a varinfo occurs *)
 val file_of_vinfodef: Cil_types.varinfo -> Datatype.Filepath.t;;
 
@@ -133,6 +140,7 @@ val get_filename: Cabs.definition -> Datatype.Filepath.t;;
 type output_type =
   | Html
   | Text
+  | Json
 ;;
 
 (** get_file_type [extension] sets the output type according to [extension].
@@ -157,7 +165,7 @@ val consider_variable: libc:bool -> Cil_types.varinfo -> bool
 
 (** Convert float to string with the following convention:
     - if the float is an integer (ie, it has no digits after the decimal point),
-    print it as such;
+      print it as such;
     - otherwise, print the first two digits after the decimal point.
 *)
 val float_to_string : float -> string ;;
diff --git a/src/plugins/metrics/metrics_cilast.ml b/src/plugins/metrics/metrics_cilast.ml
index 88dc82d6538964a15a5d664d9bbb345c55e59d4d..bbc73b7f5df2665503791f61581f254e42e9590c 100644
--- a/src/plugins/metrics/metrics_cilast.ml
+++ b/src/plugins/metrics/metrics_cilast.ml
@@ -662,6 +662,28 @@ let pp_funinfo fmt vis =
     Metrics_base.pretty_entry_points vis#fundef_calls
 ;;
 
+let json_of_funinfo vis =
+  let fundef =
+    ("defined-functions", json_of_varinfo_map vis#fundef_calls)
+  in
+  let funspec =
+    ("specified-only-functions", json_of_varinfo_map vis#funspec_calls)
+  in
+  let fundecl =
+    ("undefined-functions", json_of_varinfo_map vis#fundecl_calls)
+  in
+  let extern_vars =
+    VInfoSet.fold (fun vi acc -> `String vi.vname :: acc)
+      vis#extern_global_vars []
+  in
+  let extern =
+    ("extern-global-vars", `List (List.rev extern_vars))
+  in
+  let entry_points =
+    ("entry-points", json_of_entry_points vis#fundef_calls)
+  in
+  `Assoc [fundef; funspec; fundecl; extern; entry_points]
+
 let pp_with_funinfo fmt cil_visitor =
   Format.fprintf fmt "@[<v 0>%a@ %a@]"
     pp_funinfo cil_visitor
@@ -721,6 +743,10 @@ let compute_on_cilast ~libc =
         (match Metrics_base.get_file_type out_fname with
          | Html -> dump_html fmt cil_visitor
          | Text -> pp_with_funinfo fmt cil_visitor
+         | Json ->
+           let json = json_of_funinfo cil_visitor in
+           Yojson.pretty_print fmt json;
+           Format.fprintf fmt "@." (* ensure the file ends with a newline *)
         );
         close_out oc;
       with Sys_error _ ->
diff --git a/src/plugins/metrics/metrics_gui_panels.ml b/src/plugins/metrics/metrics_gui_panels.ml
index 698610666657f1044faa798300d2be53a37714cc..c544bf91e8efdc3ab3b85c591bd1a45cbb6207e7 100644
--- a/src/plugins/metrics/metrics_gui_panels.ml
+++ b/src/plugins/metrics/metrics_gui_panels.ml
@@ -116,7 +116,7 @@ let coerce_panel_to_ui panel_box _main_ui = "Metrics", panel_box#coerce, None ;;
 let register_metrics ?(apply=false) name display_function =
   add_panel_action (name, display_function);
   let metrics_panel = get_panel () in
-  GEdit.text_combo_add (Extlib.the metrics_panel.top) name;
+  GEdit.text_combo_add (Option.get metrics_panel.top) name;
   if apply
-  then display_function (Extlib.the metrics_panel.bottom);
+  then display_function (Option.get metrics_panel.bottom);
 ;;
diff --git a/src/plugins/metrics/metrics_parameters.ml b/src/plugins/metrics/metrics_parameters.ml
index 9d9127573bcc5b44b29f991cfc1417418c0af55b..5d9bd963dbf2187682089cc8b9581ef220e9c366 100644
--- a/src/plugins/metrics/metrics_parameters.ml
+++ b/src/plugins/metrics/metrics_parameters.ml
@@ -49,7 +49,8 @@ module OutputFile =
       let option_name = "-metrics-output"
       let arg_name = "filename"
       let help = "print some metrics into the specified file; \
-                  the output format is recognized through the extension."
+                  the output format is recognized through the extension: \
+                  .text/.txt for text, .html/.htm for HTML, or .json for JSON."
      end)
 
 module ValueCoverage =
diff --git a/src/plugins/metrics/register_gui.ml b/src/plugins/metrics/register_gui.ml
index 50dadd3fe7d342249e23879656d1cf9a9c3cf8a2..043fba156ce9c7d07ce83f414915f985aba57289 100644
--- a/src/plugins/metrics/register_gui.ml
+++ b/src/plugins/metrics/register_gui.ml
@@ -239,7 +239,7 @@ module ValueCoverageGUI = struct
     end;
     Metrics__Metrics_coverage.compute_coverage_by_fun ();
     !update_filetree `Contents;
-    Extlib.the !result
+    Option.get !result
 
   let decorate_filetree (main_ui: Design.main_window_extension_points) =
     let compute get = function
diff --git a/src/plugins/obfuscator/obfuscate.ml b/src/plugins/obfuscator/obfuscate.ml
index adbe1215a838a78ebd76bbfc1f087e3aa716e9be..0bb6f66958fd1999236111f37dfa58f142626b50 100644
--- a/src/plugins/obfuscator/obfuscate.ml
+++ b/src/plugins/obfuscator/obfuscate.ml
@@ -52,12 +52,12 @@ class visitor = object
 
   method! vglob_aux = function
     | GType (ty,_) ->
-      if not (Cil.typeHasAttribute "fc_stdlib" ty.ttype) then
+      if not (Cil.is_in_libc (Cil.typeAttrs ty.ttype)) then
         ty.tname <- Dictionary.fresh Obfuscator_kind.Type ty.tname;
       Cil.DoChildren
     | GVarDecl (v, _) | GVar (v, _, _)
     | GFun ({svar = v}, _) | GFunDecl (_, v, _)
-      when Cil.is_unused_builtin v ->
+      when Cil_builtins.is_unused_builtin v ->
       Cil.SkipChildren
     | _ ->
       Cil.DoChildren
@@ -101,9 +101,9 @@ class visitor = object
     else begin
       if Cil.isFunctionType vi.vtype then begin
         if vi.vname <> "main"
-        && not (Cil.is_builtin vi)
-        && not (Cil.is_special_builtin vi.vname)
-        && not (Cil.hasAttribute "fc_stdlib" vi.vattr) then
+        && not (Cil_builtins.is_builtin vi)
+        && not (Cil_builtins.is_special_builtin vi.vname)
+        && not (Cil.is_in_libc vi.vattr) then
           vi.vname <- Dictionary.fresh Obfuscator_kind.Function vi.vname
       end
       else begin
diff --git a/src/plugins/occurrence/register.ml b/src/plugins/occurrence/register.ml
index 9c9907a457f3e349e70d0ebee19bcf5ea4146486..2e6ba069d392f4eac67c74d943f136cd0baa1f56 100644
--- a/src/plugins/occurrence/register.ml
+++ b/src/plugins/occurrence/register.ml
@@ -90,7 +90,7 @@ end = struct
           Some v, [ elt ])
         (None, [])
     in
-    Extlib.may (fun v -> f v l) old
+    Option.iter (fun v -> f v l) old
 
   let fold_sorted f init =
     let map = IState.fold Varinfo.Map.add Varinfo.Map.empty in
diff --git a/src/plugins/occurrence/register_gui.ml b/src/plugins/occurrence/register_gui.ml
index d7b8da68dfc8abe36b54c7f5c9b0073c70a51d49..749c7fcfa329c7b8fee8dc6347b53d0be93e87a8 100644
--- a/src/plugins/occurrence/register_gui.ml
+++ b/src/plugins/occurrence/register_gui.ml
@@ -233,7 +233,7 @@ let file_tree_decorate (file_tree:Filetree.t) =
               match ki with
                 | Kglobal -> false
                 | Kstmt _ ->
-                  let kf = Extlib.the kf in
+                  let kf = Option.get kf in
                   let v0 = Kernel_function.get_vi kf in
                   List.exists
                     (fun glob -> match glob with
diff --git a/src/plugins/pdg/build.ml b/src/plugins/pdg/build.ml
index e761247ebc70745eeaa92b6a2cd2237e9d70eb28..e3e490fb9720377a5490d1831b638750161d54d1 100644
--- a/src/plugins/pdg/build.ml
+++ b/src/plugins/pdg/build.ml
@@ -732,6 +732,7 @@ let process_call pdg state stmt lvaloption funcexp argl _loc =
     | [] ->
        let stmt_str = Format.asprintf "%a" Printer.pp_stmt stmt in
        Pdg_parameters.not_yet_implemented
+         ~source:(fst (Cil_datatype.Stmt.loc stmt))
          "pdg with an unknown function call: %s" stmt_str
     | st :: [] -> st
     | st :: other_states ->
@@ -1024,9 +1025,9 @@ let compute_pdg kf =
     | Pdg_state.Cannot_fold ->
         Pdg_parameters.warning "too imprecise value analysis : abort" ;
         degenerated true kf
-    | Log.FeatureRequest (who, what) ->
+    | Log.FeatureRequest (source, who, what) ->
 	(* [JS 2012/08/24] nobody should catch this exception *)
-        Pdg_parameters.warning "not implemented by %s yet: %s" who what ;
+        Pdg_parameters.warning ?source "not implemented by %s yet: %s" who what;
         degenerated true kf
 
 (*
diff --git a/src/plugins/qed/logic.ml b/src/plugins/qed/logic.ml
index 5c5979042ea3885bb6b28004405381c6af693060..102fc516708d17b0c7f6adc1fa04b9a1c106491b 100644
--- a/src/plugins/qed/logic.ml
+++ b/src/plugins/qed/logic.ml
@@ -462,7 +462,7 @@ sig
         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
+        @modify 22.0-Titanium add optional [force] parameter
   *)
 
   val set_builtin' :
@@ -478,7 +478,7 @@ sig
       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
+      @modify 22.0-Titanium add optional [force] parameter
   *)
 
   val set_builtin_get :
@@ -490,7 +490,7 @@ sig
       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
+      @modify 22.0-Titanium add optional [force] parameter
   *)
 
   val set_builtin_eq :
@@ -505,7 +505,7 @@ sig
         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
+        @modify 22.0-Titanium add optional [force] parameter
   *)
 
   val set_builtin_leq :
@@ -521,7 +521,7 @@ sig
         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
+        @modify 22.0-Titanium add optional [force] parameter
   *)
 
   (** {3 Specific Patterns} *)
diff --git a/src/plugins/qed/term.ml b/src/plugins/qed/term.ml
index bc8331ad3c9efd8c9fa18a649cf7e98f0ff840a8..cb613d9f70fea864b32f8dd7eabf445ab238b4f3 100644
--- a/src/plugins/qed/term.ml
+++ b/src/plugins/qed/term.ml
@@ -641,7 +641,7 @@ struct
       if a == b then 0 else
         let cmp = cmp_struct compare a b in
         if cmp <> 0 then cmp else
-          Extlib.opt_compare Tau.compare a.tau b.tau
+          Option.compare Tau.compare a.tau b.tau
 
 
   end
@@ -715,7 +715,7 @@ struct
           | NOT p,NOT q -> p==q
           | CMP(c,a,b),CMP(c',a',b') -> c=c' && a==a' && b==b'
           | FUN(f,xs,t) , FUN(g,ys,t') -> Fun.equal f g && Hcons.equal_list (==) xs ys
-                                          && Extlib.opt_equal Tau.equal t t'
+                                          && Option.equal Tau.equal t t'
           | _ -> false
       end)
 
@@ -2239,8 +2239,10 @@ struct
     let fresh sigma t = fresh sigma.pool t
 
     let call f e =
-      let v = f e in
-      validate "Qed.Subst.add_fun" v ; v
+      if lc_closed e then
+        let v = f e in
+        validate "Qed.Subst.add_fun" v ; v
+      else raise Not_found
 
     let rec compute e = function
       | EMPTY -> raise Not_found
diff --git a/src/plugins/report/scan.ml b/src/plugins/report/scan.ml
index b55fb12883f40017a80c29a53a0646379cffd49f..20b39c16207619626ee929685e26f1d25c2d5bdb 100644
--- a/src/plugins/report/scan.ml
+++ b/src/plugins/report/scan.ml
@@ -147,7 +147,7 @@ let iter (inspector:inspector) =
         Kernel_function.Map.iter
           (fun kf ips ->
              let vi = Kernel_function.get_vi kf in
-             if not (Cil.is_unused_builtin vi) then
+             if not (Cil_builtins.is_unused_builtin vi) then
                report (fun () -> inspector#function_section kf) inspector#property !ips)
           !functions ;
         inspector#finished ;
@@ -166,13 +166,13 @@ class visit_properties (phi : Property.t -> unit) =
 
     method! vspec fspec =
       Property.ip_of_spec
-        (Extlib.the self#current_kf) self#current_kinstr ~active:[] fspec |>
+        (Option.get self#current_kf) self#current_kinstr ~active:[] fspec |>
       List.iter phi ;
       Cil.DoChildren
 
     method! vcode_annot ca =
       Property.ip_of_code_annot
-        (Extlib.the self#current_kf) (Extlib.the self#current_stmt) ca |>
+        (Option.get self#current_kf) (Option.get self#current_stmt) ca |>
       List.iter phi ;
       Cil.DoChildren
 
diff --git a/src/plugins/rte/rte.ml b/src/plugins/rte/rte.ml
index 16845eed8d574889527464bbff6a589dcd4c9b0b..8dc11f2e796e4e7dffba1812d9cedc8d4bbf644e 100644
--- a/src/plugins/rte/rte.ml
+++ b/src/plugins/rte/rte.ml
@@ -52,7 +52,7 @@ let valid_index ~remove_trivial ~on_alarm e size =
     let v_e = get_expr_val e in
     let v_size = get_expr_val size in
     let neg_ok =
-      Extlib.may_map ~dft:false (Integer.le Integer.zero) v_e
+      Option.fold ~none:false ~some:(Integer.le Integer.zero) v_e
       || Cil.isUnsignedInteger (Cil.typeOf e)
     in
     if not neg_ok then alarm Lower_bound;
@@ -111,15 +111,18 @@ let lval_initialized_assertion ~remove_trivial:_ ~on_alarm lv =
     | NoOffset ->
       begin
         match typ with
-        | TComp({cstruct = false; cfields} ,_,_) ->
+        | TComp({cstruct = false; cfields; cname} ,_,_) ->
           (match cfields with
-           | [] -> () (* empty union, supported by gcc with size 0.
-                         Trivially initialized. *)
-           | _ ->
+           | None ->
+             Options.fatal
+               "Access to an object of undefined union %a"
+               Printer.pp_varname cname
+           | Some [] -> () (* empty union, supported by gcc with size 0.
+                              Trivially initialized. *)
+           | Some l ->
              let llv =
                List.map
-                 (fun fi -> Cil.addOffsetLval (Field (fi, NoOffset)) lv)
-                 cfields
+                 (fun fi -> Cil.addOffsetLval (Field (fi, NoOffset)) lv) l
              in
              if default then
                on_alarm ~invalid:false (Alarms.Uninitialized_union llv))
@@ -451,18 +454,23 @@ let finite_float_assertion ~remove_trivial:_ ~on_alarm (fkind, exp) =
 let pointer_call ~remove_trivial:_ ~on_alarm (e, args) =
   on_alarm ~invalid:false (Alarms.Function_pointer (e, Some args))
 
+let rec is_safe_offset = function
+  | NoOffset -> true
+  | Field(fi,o) -> fi.fcomp.cstruct && not fi.faddrof && is_safe_offset o
+  | Index(_,o) -> is_safe_offset o
+
 let is_safe_pointer_value = function
   | Lval (Var vi, offset) ->
     (* Reading a pointer variable must emit an alarm if an invalid pointer value
        could have been written without previous alarm, through:
        - an union type, in which case [offset] is not NoOffset;
        - an untyped write, in which case the address of [vi] is taken. *)
-    not vi.vaddrof && offset = NoOffset
+    not vi.vaddrof && is_safe_offset offset
   | AddrOf (_, NoOffset) | StartOf (_, NoOffset) -> true
   | CastE (_typ, e) ->
     (* 0 can always be converted into a NULL pointer. *)
     let v = get_expr_val e in
-    Extlib.may_map ~dft:false Integer.(equal zero) v
+    Option.fold ~none:false ~some:Integer.(equal zero) v
   | _ -> false
 
 let pointer_value ~remove_trivial ~on_alarm expr =
diff --git a/src/plugins/rte/visit.ml b/src/plugins/rte/visit.ml
index 36c092b8a7ca1adc1f69f5179f552820a8e5644d..5d8f2564def70f0b69f299d634a23fb4fc02d2bf 100644
--- a/src/plugins/rte/visit.ml
+++ b/src/plugins/rte/visit.ml
@@ -106,7 +106,7 @@ class annot_visitor kf flags on_alarm = object (self)
     flags.Flags.bool_value && not (Generator.Bool_value.is_computed kf)
 
   method private queue_stmt_spec spec =
-    let stmt = Extlib.the (self#current_stmt) in
+    let stmt = Option.get (self#current_stmt) in
     Queue.add
       (fun () ->
          let annot = Logic_const.new_code_annotation (AStmtSpec ([], spec)) in
diff --git a/src/plugins/scope/datascope.ml b/src/plugins/scope/datascope.ml
index 1fb31afa260c5dd460f811a9024fede3e1ee27cb..481a00d4773639fdf3837ed580365eb5c6441e06 100644
--- a/src/plugins/scope/datascope.ml
+++ b/src/plugins/scope/datascope.ml
@@ -571,10 +571,10 @@ class check_annot_visitor = object(self)
   method proven () = proven
 
   method! vcode_annot annot =
-    let kf = Extlib.the self#current_kf in
+    let kf = Option.get self#current_kf in
     let stmt =
       Visitor_behavior.Get_orig.stmt
-        self#behavior (Extlib.the self#current_stmt)
+        self#behavior (Option.get self#current_stmt)
     in
     begin match annot.annot_content with
       | AAssert _ ->
@@ -591,7 +591,7 @@ class check_annot_visitor = object(self)
 
   method! vglob_aux g = match g with
     | GFun (fdec, _loc) when
-        !Db.Value.is_called (Extlib.the self#current_kf) &&
+        !Db.Value.is_called (Option.get self#current_kf) &&
         not (!Db.Value.no_results fdec)
         ->
       Cil.DoChildren
diff --git a/src/plugins/scope/defs.ml b/src/plugins/scope/defs.ml
index 20f7c9d3b2164ed2d67c60096d731431039450fa..8074c8ac1e50ed4e470b29fefc43381b18f717b5 100644
--- a/src/plugins/scope/defs.ml
+++ b/src/plugins/scope/defs.ml
@@ -170,7 +170,7 @@ let compute kf stmt lval =
   in
   !Db.Value.compute ();
   let zone = !Db.Value.lval_to_zone (Kstmt stmt) lval in
-  Extlib.opt_map extract (compute_aux kf stmt zone)
+  Option.map extract (compute_aux kf stmt zone)
 
 (* Variation of the function above. For each PDG node that has been found,
    we find whether it directly modifies [zone] through an affectation
@@ -216,7 +216,7 @@ let compute_with_def_type_zone kf stmt zone =
     let stmts = NSet.fold add_node nodes Stmt.Map.empty in
     (stmts, undef)
   in
-  Extlib.opt_map extract (compute_aux kf stmt zone)
+  Option.map extract (compute_aux kf stmt zone)
 
 let compute_with_def_type kf stmt lval =
   !Db.Value.compute ();
diff --git a/src/plugins/scope/zones.ml b/src/plugins/scope/zones.ml
index fad94b2d116a38c41b4c04cfa56acf2c4690467f..bb4292562c0cb6b5afabf476bfc9acae85ec9f47 100644
--- a/src/plugins/scope/zones.ml
+++ b/src/plugins/scope/zones.ml
@@ -329,10 +329,7 @@ let get stmt_zones stmt =
 
 let pretty fmt stmt_zones =
   let pp s d = Format.fprintf fmt "Stmt:%d -> %a@." s.sid Data.pretty d in
-  (* Sort output so that it does not depend on the OCaml hash function.
-     Can be removed when OCaml 4.01 is mandatory *)
-  let sorted = Stmt.Hashtbl.fold Stmt.Map.add stmt_zones Stmt.Map.empty in
-  Stmt.Map.iter pp sorted
+  Stmt.Hashtbl.iter_sorted pp stmt_zones
 
        (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
 
diff --git a/src/plugins/security_slicing/components.ml b/src/plugins/security_slicing/components.ml
index b6630ef83df768bbaf6a313c4a433fb3285e3f93..0768f1a60ca6c6c95edba53e6adab484b10162e0 100644
--- a/src/plugins/security_slicing/components.ml
+++ b/src/plugins/security_slicing/components.ml
@@ -695,9 +695,9 @@ Ignoring this function in the analysis (potentially incorrect results)."
     let set =
       M.fold
         (fun (n,_) _ acc ->
-           Extlib.may_map
-             ~dft:acc
-             (fun s -> Stmt.Set.add s acc)
+           Option.fold
+             ~none:acc
+             ~some:(fun s -> Stmt.Set.add s acc)
              (get_node_stmt n))
         res
         Stmt.Set.empty
@@ -715,9 +715,9 @@ Ignoring this function in the analysis (potentially incorrect results)."
       M.fold
         (fun (n,_) v acc ->
            if check v then
-             Extlib.may_map
-               ~dft:acc
-               (fun s -> Stmt.Set.add s acc)
+             Option.fold
+               ~none:acc
+               ~some:(fun s -> Stmt.Set.add s acc)
                (get_node_stmt n)
            else
              acc)
@@ -830,7 +830,7 @@ let compute, self =
            !use_ctrl_dependencies
            (fun (n, _ as elt) ->
               Nodes.add elt;
-              Extlib.may add_one (get_node_stmt n))
+              Option.iter add_one (get_node_stmt n))
            kf
            stmt
        in
diff --git a/src/plugins/server/data.ml b/src/plugins/server/data.ml
index 0dc576f61ca97541dd4e906cac794a5827f24732..1f20d6d4c36fb901dfa0745f3250418c76edc568 100644
--- a/src/plugins/server/data.ml
+++ b/src/plugins/server/data.ml
@@ -635,8 +635,8 @@ struct
   let get m a =
     try M.find a m.index
     with Not_found ->
-      let id = m.kid in
-      m.kid <- succ id ;
+      let id = succ m.kid in
+      m.kid <- id ;
       m.index <- M.add a id m.index ;
       Hashtbl.add m.lookup id a ; id
 
diff --git a/src/plugins/server/kernel_ast.ml b/src/plugins/server/kernel_ast.ml
index 832c1adce2b70ba182a4549234391d18512c4f28..dfc1510305d2ee0835c65483225a72f20f85c703 100644
--- a/src/plugins/server/kernel_ast.ml
+++ b/src/plugins/server/kernel_ast.ml
@@ -194,11 +194,19 @@ struct
         ~get:(fun (tag, _) -> Rich_text.to_string Printer_tag.pretty tag)
         model
     in
+    let () =
+      States.column
+        ~name:"sloc"
+        ~descr:(Md.plain "Source location")
+        ~data:(module Kernel_main.LogSource)
+        ~get:(fun (tag, _) -> fst (Printer_tag.loc_of_localizable tag))
+        model
+    in
     States.register_array
       ~package
       ~name:"markerInfo"
       ~descr:(Md.plain "Marker informations")
-      ~key:snd
+      ~key:snd ~keyType:Jstring
       ~iter model
 
   let create_tag = function
@@ -254,6 +262,25 @@ module Printer = Printer_tag.Make(Marker)
 (* --- Ast Data                                                           --- *)
 (* -------------------------------------------------------------------------- *)
 
+module Lval =
+struct
+  type t = kinstr * lval
+  let jtype = Marker.jlval
+  let to_json (kinstr, lval) =
+    let kf = match kinstr with
+      | Kglobal -> None
+      | Kstmt stmt -> Some (Kernel_function.find_englobing_kf stmt)
+    in
+    Marker.to_json (PLval (kf, kinstr, lval))
+  let of_json js =
+    let open Printer_tag in
+    match Marker.of_json js with
+    | PLval (_, kinstr, lval) -> kinstr, lval
+    | PVDecl (_, kinstr, vi) -> kinstr, Cil.var vi
+    | PGlobal (GVar (vi, _, _) | GVarDecl (vi, _)) -> Kglobal, Cil.var vi
+    | _ -> Data.failure "not a lval marker"
+end
+
 module Stmt =
 struct
   type t = stmt
@@ -295,7 +322,7 @@ end
 module KfMarker = struct
   type record
   let record : record Record.signature = Record.signature ()
-  let fct = Record.field record ~name:"function"
+  let fct = Record.field record ~name:"fct"
       ~descr:(Md.plain "Function") (module Kf)
   let marker = Record.field record ~name:"marker"
       ~descr:(Md.plain "Marker") (module Marker)
@@ -338,11 +365,13 @@ let () = Request.register ~package
     ~input:(module Kf) ~output:(module Jtext)
     begin fun kf ->
       let libc = Kernel.PrintLibc.get () in
-      if not libc then Kernel.PrintLibc.set true ;
-      let global = Kernel_function.get_global kf in
-      let ast = Jbuffer.to_json Printer.pp_global global in
-      if not libc then Kernel.PrintLibc.set false ;
-      ast
+      try
+        if not libc then Kernel.PrintLibc.set true ;
+        let global = Kernel_function.get_global kf in
+        let ast = Jbuffer.to_json Printer.pp_global global in
+        if not libc then Kernel.PrintLibc.set false ; ast
+      with err ->
+        if not libc then Kernel.PrintLibc.set false ; raise err
     end
 
 module Functions =
@@ -352,7 +381,30 @@ struct
 
   let signature kf =
     let global = Kernel_function.get_global kf in
-    Rich_text.to_string Printer_tag.pretty (PGlobal global)
+    let libc = Kernel.PrintLibc.get () in
+    try
+      if not libc then Kernel.PrintLibc.set true ;
+      let txt = Rich_text.to_string Printer_tag.pretty (PGlobal global) in
+      if not libc then Kernel.PrintLibc.set false ;
+      if Kernel_function.is_entry_point kf then (txt ^ " /* main */") else txt
+    with err ->
+      if not libc then Kernel.PrintLibc.set false ; raise err
+
+  let is_builtin kf =
+    Cil_builtins.is_builtin (Kernel_function.get_vi kf)
+
+  let is_stdlib kf =
+    let vi = Kernel_function.get_vi kf in
+    Cil.is_in_libc vi.vattr
+
+  let is_eva_analyzed kf =
+    if Db.Value.is_computed () then !Db.Value.is_called kf else false
+
+  let iter f =
+    Globals.Functions.iter
+      (fun kf ->
+         let name = Kernel_function.get_name kf in
+         if not (Ast_info.is_frama_c_builtin name) then f kf)
 
   let array : kernel_function States.array =
     begin
@@ -367,11 +419,46 @@ struct
         ~descr:(Md.plain "Signature")
         ~data:(module Data.Jstring)
         ~get:signature ;
+      States.column model
+        ~name:"main"
+        ~descr:(Md.plain "Is the function the main entry point")
+        ~data:(module Data.Jbool)
+        ~default:false
+        ~get:Kernel_function.is_entry_point;
+      States.column model
+        ~name:"defined"
+        ~descr:(Md.plain "Is the function defined?")
+        ~data:(module Data.Jbool)
+        ~default:false
+        ~get:Kernel_function.is_definition;
+      States.column model
+        ~name:"stdlib"
+        ~descr:(Md.plain "Is the function from the Frama-C stdlib?")
+        ~data:(module Data.Jbool)
+        ~default:false
+        ~get:is_stdlib;
+      States.column model
+        ~name:"builtin"
+        ~descr:(Md.plain "Is the function a Frama-C builtin?")
+        ~data:(module Data.Jbool)
+        ~default:false
+        ~get:is_builtin;
+      States.column model
+        ~name:"eva_analyzed"
+        ~descr:(Md.plain "Has the function been analyzed by Eva")
+        ~data:(module Data.Jbool)
+        ~default:false
+        ~get:is_eva_analyzed;
+      States.column model
+        ~name:"sloc"
+        ~descr:(Md.plain "Source location")
+        ~data:(module Kernel_main.LogSource)
+        ~get:(fun kf -> fst (Kernel_function.get_location kf));
       States.register_array model
         ~package ~key
         ~name:"functions"
         ~descr:(Md.plain "AST Functions")
-        ~iter:Globals.Functions.iter
+        ~iter
         ~add_reload_hook:Ast.add_hook_on_update ;
     end
 
diff --git a/src/plugins/server/kernel_ast.mli b/src/plugins/server/kernel_ast.mli
index 6832e10f4ed79ccfd685b8bd8f966de80c09bd63..f9e56c08f27a90fa306f789c5453704a690176c5 100644
--- a/src/plugins/server/kernel_ast.mli
+++ b/src/plugins/server/kernel_ast.mli
@@ -30,6 +30,7 @@ open Cil_types
 module Kf : Data.S with type t = kernel_function
 module Ki : Data.S with type t = kinstr
 module Stmt : Data.S with type t = stmt
+module Lval : Data.S with type t = kinstr * lval
 
 module Marker :
 sig
diff --git a/src/plugins/server/kernel_main.ml b/src/plugins/server/kernel_main.ml
index 74cda9e9c2ab4a67b54b21555eb472757099adbc..1ae78ed1b27aade17aef3861fe8ea1d7de78b11b 100644
--- a/src/plugins/server/kernel_main.ml
+++ b/src/plugins/server/kernel_main.ml
@@ -87,10 +87,15 @@ struct
 
   let to_json p =
     let path = Filepath.(Normalized.to_pretty_string p.pos_path) in
+    let file =
+      if Server_parameters.has_relative_filepath ()
+      then path
+      else (p.Filepath.pos_path :> string)
+    in
     `Assoc [
       "dir"  , `String (Filename.dirname path) ;
       "base" , `String (Filename.basename path) ;
-      "file" , `String (p.Filepath.pos_path :> string) ;
+      "file" , `String file ;
       "line" , `Int p.Filepath.pos_lnum ;
     ]
 
diff --git a/src/plugins/server/kernel_properties.ml b/src/plugins/server/kernel_properties.ml
index 9ca090505b8adc0c4cfe86d339f3c8f3abdc63ec..aca667ed895230689e9f31d7f81ee4d72edfe440 100644
--- a/src/plugins/server/kernel_properties.ml
+++ b/src/plugins/server/kernel_properties.ml
@@ -163,7 +163,7 @@ struct
 
   let t_status value name ?label descr =
     Enum.tag ~name
-      ?label:(Extlib.opt_map Md.plain label)
+      ?label:(Option.map Md.plain label)
       ~descr:(Md.plain descr) ~value status
 
   open Property_status.Feedback
@@ -281,7 +281,7 @@ let () = States.column model ~name:"status"
     ~data:(module PropStatus)
     ~get:(Property_status.Feedback.get)
 
-let () = States.column model ~name:"function"
+let () = States.column model ~name:"fct"
     ~descr:(Md.plain "Function")
     ~data:(module Joption(Kf)) ~get:Property.get_kf
 
@@ -297,24 +297,24 @@ let () = States.column model ~name:"source"
 let () = States.column model ~name:"alarm"
     ~descr:(Md.plain "Alarm name (if the property is an alarm)")
     ~data:(module Joption(Jstring))
-    ~get:(fun ip -> Extlib.opt_map Alarms.get_short_name (find_alarm ip))
+    ~get:(fun ip -> Option.map Alarms.get_short_name (find_alarm ip))
 
 let () = States.column model ~name:"alarm_descr"
     ~descr:(Md.plain "Alarm description (if the property is an alarm)")
     ~data:(module Joption(Jstring))
-    ~get:(fun ip -> Extlib.opt_map Alarms.get_description (find_alarm ip))
+    ~get:(fun ip -> Option.map Alarms.get_description (find_alarm ip))
 
 let () = States.column model ~name:"predicate"
     ~descr:(Md.plain "Predicate")
     ~data:(module Joption(Jstring))
-    ~get:(fun ip -> Extlib.opt_map snd (Description.property_kind_and_node ip))
+    ~get:(fun ip -> Option.map snd (Description.property_kind_and_node ip))
 
 let is_relevant ip =
   match Property.get_kf ip with
   | None -> true
   | Some kf ->
     not (Ast_info.is_frama_c_builtin (Kernel_function.get_name kf)
-         || Cil.is_unused_builtin (Kernel_function.get_vi kf))
+         || Cil_builtins.is_unused_builtin (Kernel_function.get_vi kf))
 
 let iter f = Property_status.iter (fun ip -> if is_relevant ip then f ip)
 let add_update_hook f =
@@ -330,6 +330,7 @@ let array =
     ~name:"status"
     ~descr:(Md.plain "Status of Registered Properties")
     ~key:(fun ip -> Kernel_ast.Marker.create (PIP ip))
+    ~keyType:Kernel_ast.Marker.jproperty
     ~iter
     ~add_update_hook
     ~add_remove_hook
diff --git a/src/plugins/server/main.ml b/src/plugins/server/main.ml
index 3ee3067e99a325a540c2c3215d768f36a80e8969..39de5801cd5a37da7994106e87fd2261263af201 100644
--- a/src/plugins/server/main.ml
+++ b/src/plugins/server/main.ml
@@ -214,7 +214,7 @@ let process_request (server : 'a server) (request : 'a request) : unit =
   | `Poll -> ()
   | `Shutdown ->
     begin
-      Extlib.may kill_exec server.running ;
+      Option.iter kill_exec server.running ;
       Queue.clear server.q_in ;
       Queue.clear server.q_out ;
       server.shutdown <- true ;
@@ -233,7 +233,7 @@ let process_request (server : 'a server) (request : 'a request) : unit =
     begin
       let set_killed = kill_request server.equal id in
       Queue.iter set_killed server.q_in ;
-      Extlib.may set_killed server.running ;
+      Option.iter set_killed server.running ;
     end
   | `Request(id,request,data) ->
     begin
@@ -271,14 +271,14 @@ let communicate server =
     Queue.clear server.q_out ;
     server.s_signal <- Sigs.empty ;
     message.callback !pool ;
-    Extlib.may raise error ; true
+    Option.iter raise error ; true
 
 (* -------------------------------------------------------------------------- *)
 (* --- Yielding & Signaling                                               --- *)
 (* -------------------------------------------------------------------------- *)
 
 let do_yield server () =
-  Extlib.may raise_if_killed server.running ;
+  Option.iter raise_if_killed server.running ;
   ignore ( communicate server )
 
 let do_signal server s =
diff --git a/src/plugins/server/package.ml b/src/plugins/server/package.ml
index 309cae632565703288b5cc95ca1a5793215cfba5..bb87b1da3d58d915060b0455fa705ae855e78eba 100644
--- a/src/plugins/server/package.ml
+++ b/src/plugins/server/package.ml
@@ -208,7 +208,7 @@ type requestInfo = {
 
 type arrayInfo = {
   arr_key: string;
-  arr_kind: string;
+  arr_kind: jtype;
 }
 
 type declKindInfo =
diff --git a/src/plugins/server/package.mli b/src/plugins/server/package.mli
index 952f0dd05659e32932bce624cb57c19fcc2e8741..30075f6243c419aca7d1e4e98ba70462c1704d1d 100644
--- a/src/plugins/server/package.mli
+++ b/src/plugins/server/package.mli
@@ -72,7 +72,7 @@ type requestInfo = {
 
 type arrayInfo = {
   arr_key: string;
-  arr_kind: string;
+  arr_kind: jtype;
 }
 
 type declKindInfo =
diff --git a/src/plugins/server/server_parameters.ml b/src/plugins/server/server_parameters.ml
index be9b5da15c6ad6f271c9bd6cb764422eee3f0cfa..74a07c43b7f08e171044e3fd0c8c0c1d8a98adff 100644
--- a/src/plugins/server/server_parameters.ml
+++ b/src/plugins/server/server_parameters.ml
@@ -73,3 +73,10 @@ let wkind = register_warn_category "inconsistent-kind"
 let wname = register_warn_category "invalid-name"
 
 (* -------------------------------------------------------------------------- *)
+(* --- Filepath Normalization                                             --- *)
+(* -------------------------------------------------------------------------- *)
+
+let use_relative_filepath = register_category "use-relative-filepath"
+let has_relative_filepath () = is_debug_key_enabled use_relative_filepath
+
+(* -------------------------------------------------------------------------- *)
diff --git a/src/plugins/server/server_parameters.mli b/src/plugins/server/server_parameters.mli
index af8c6dea9d1aa600df8d3cf09bf5fd74a9a4db6c..ba41ba164c75e313f8a74a78dd710e1e5273d704 100644
--- a/src/plugins/server/server_parameters.mli
+++ b/src/plugins/server/server_parameters.mli
@@ -32,4 +32,6 @@ val wpage : warn_category (** Inconsistent page warning *)
 val wkind : warn_category (** Inconsistent category warning *)
 val wname : warn_category (** Invalid name warning *)
 
+val has_relative_filepath: unit -> bool
+
 (**************************************************************************)
diff --git a/src/plugins/server/states.ml b/src/plugins/server/states.ml
index 5b172c2d4efdfc5e9a25b7839fa276761fb0766b..52a682f2bc7b854e86c8435201fa231ebcc3c4e6 100644
--- a/src/plugins/server/states.ml
+++ b/src/plugins/server/states.ml
@@ -92,23 +92,55 @@ let register_state (type a) ~package ~name ~descr
 (* --- Model Signature                                                    --- *)
 (* -------------------------------------------------------------------------- *)
 
-type 'a column = Package.fieldInfo * ('a -> json)
+type 'a column = Package.fieldInfo * ('a -> json option)
 
 type 'a model = 'a column list ref
 
 let model () = ref []
 
+let mkfield (model : 'a model) fd (js : 'a -> json option) =
+  let open Package in
+  let name = fd.fd_name in
+  if List.exists (fun (fd,_) -> fd.fd_name = name) !model then
+    raise (Invalid_argument "Server.States.column: duplicate name") ;
+  model := (fd , js) :: !model
+
 let column (type a b) ~name ~descr
-    ~(data: b Request.output) ~(get : a -> b) (model : a model) =
+    ~(data: b Request.output)
+    ~(get : a -> b)
+    ?(default: b option)
+    (model : a model) =
+  let module D = (val data) in
+  match default with
+  | None ->
+    let fd = Package.{
+        fd_name = name ;
+        fd_type = D.jtype ;
+        fd_descr = descr ;
+      } in
+    mkfield model fd (fun a -> Some (D.to_json (get a)))
+  | Some d ->
+    let fd = Package.{
+        fd_name = name ;
+        fd_type = Joption D.jtype ;
+        fd_descr = descr ;
+      } in
+    mkfield model fd (fun a ->
+        let v = get a in
+        if v = d then None else Some (D.to_json v)
+      )
+
+let option (type a b) ~name ~descr
+    ~(data: b Request.output) ~(get : a -> b option) (model : a model) =
   let module D = (val data) in
-  if List.exists (fun (fd,_) -> fd.Package.fd_name = name) !model then
-    raise (Invalid_argument "Server.States.column: duplicate name") ;
   let fd = Package.{
       fd_name = name ;
-      fd_type = D.jtype ;
+      fd_type = Joption D.jtype ;
       fd_descr = descr ;
     } in
-  model := (fd , fun a -> D.to_json (get a)) :: !model
+  mkfield model fd (fun a -> match get a with
+      | None -> None
+      | Some b -> Some (D.to_json b))
 
 module Kmap = Map.Make(String)
 
@@ -127,7 +159,7 @@ type 'a array = {
   fkey : string ;
   key : 'a -> string ;
   iter : ('a -> unit) -> unit ;
-  getter : (string * ('a -> json)) list ;
+  getter : (string * ('a -> json option)) list ;
   (* [LC+JS]
      The two following fields allow to keep an array in sync
      with the current project and still have a polymorphic data type. *)
@@ -206,8 +238,9 @@ type buffer = {
 
 let add_entry buffer cols fkey key v =
   let fjs = List.fold_left (fun fjs (fd,to_json) ->
-      try (fd , to_json v) :: fjs
-      with Not_found -> fjs
+      match to_json v with
+      | Some js -> (fd , js) :: fjs
+      | None | exception Not_found -> fjs
     ) [] cols in
   let row = (fkey, `String key) :: fjs in
   buffer.updated <- `Assoc row :: buffer.updated ;
@@ -260,26 +293,40 @@ let fetch array n =
 (* --- Signature Registry                                                 --- *)
 (* -------------------------------------------------------------------------- *)
 
+let rec is_keyType = function
+  | Package.Junion js -> List.for_all is_keyType js
+  | Jstring | Jalpha | Jkey _ | Jtag _ -> true
+  | _ -> false
+
 let register_array ~package ~name ~descr ~key
     ?(keyName="key")
-    ?(keyKind=name)
+    ?(keyType=Package.Jkey name)
     ~(iter : 'a callback)
     ?(add_update_hook : 'a callback option)
     ?(add_remove_hook : 'a callback option)
     ?(add_reload_hook : unit callback option)
-    model =
+    (model : 'a model) =
   let open Markdown in
   let href = link ~name () in
   let columns = List.rev !model in
-  if List.exists (fun (fd,_) -> fd.Package.fd_name = keyName) columns then
-    raise (Invalid_argument "States.array: key name overrides column name") ;
+  begin
+    if List.exists (fun (fd,_) -> fd.Package.fd_name = keyName) columns then
+      raise (Invalid_argument (
+          Printf.sprintf "States.array(%S) : invalid key %S"
+            name keyName
+        ));
+    if not (is_keyType keyType) then
+      raise (Invalid_argument (
+          Printf.sprintf "States.array(%S): invalid key type" name
+        ));
+  end ;
   let fields = Package.{
       fd_name = keyName ;
-      fd_type = Jkey keyKind ;
+      fd_type = keyType ;
       fd_descr = plain "Entry identifier." ;
     } :: List.map fst columns in
   let id = Package.declare_id ~package:package ~name:name ~descr
-      (D_array { arr_key = keyName ; arr_kind = keyKind }) in
+      (D_array { arr_key = keyName ; arr_kind = keyType }) in
   let signal = Request.signal
       ~package ~name:(Package.Derived.signal id).name
       ~descr:(plain "Signal for array" @ href) in
@@ -298,7 +345,7 @@ let register_array ~package ~name ~descr ~key
   let signature = Request.signature ~input:(module Jint) () in
   let module Jkeys = Jlist(struct
       include Jstring
-      let jtype = Package.Jkey keyKind
+      let jtype = keyType
     end) in
   let module Jrows = Jlist (struct
       include Jany
diff --git a/src/plugins/server/states.mli b/src/plugins/server/states.mli
index 3e2c681cb406e8b08cf75a0e218871525f3a9967..1f38038f83ee1d2b4ea80a1fb1704119e9bf9021 100644
--- a/src/plugins/server/states.mli
+++ b/src/plugins/server/states.mli
@@ -76,12 +76,23 @@ type 'a model (** Columns array model *)
 val model : unit -> 'a model
 
 (** Populate an array model with a new field.
-    Columns with name `"id"` and `"_index"` are reserved for internal use. *)
+    If a [~default] value is given, the field becomes optional and
+    the field is omitted when equal to the default value (compared with [=]).
+*)
 val column :
   name:string ->
   descr:Markdown.text ->
   data:('b Request.output) ->
   get:('a -> 'b) ->
+  ?default:'b ->
+  'a model -> unit
+
+(** Populate an array model with a new optional field. *)
+val option :
+  name:string ->
+  descr:Markdown.text ->
+  data:('b Request.output) ->
+  get:('a -> 'b option) ->
   'a model -> unit
 
 (** Synchronized array state. *)
@@ -125,7 +136,7 @@ val register_array :
   descr:Markdown.text ->
   key:('a -> string) ->
   ?keyName:string ->
-  ?keyKind:string ->
+  ?keyType:jtype ->
   iter:('a callback) ->
   ?add_update_hook:('a callback) ->
   ?add_remove_hook:('a callback) ->
diff --git a/src/plugins/server/tests/batch/oracle/ast_services.out.json b/src/plugins/server/tests/batch/oracle/ast_services.out.json
index 865d7d9f0c0c0821b47b4dbfefd7ef66440c82c8..a6223032cf20850343a7d0270679a14b24daee0b 100644
--- a/src/plugins/server/tests/batch/oracle/ast_services.out.json
+++ b/src/plugins/server/tests/batch/oracle/ast_services.out.json
@@ -3,8 +3,30 @@
     "id": "GET-1",
     "data": {
       "updated": [
-        { "key": "kf#24", "name": "g", "signature": "int g(int y);" },
-        { "key": "kf#20", "name": "f", "signature": "int f(int x);" }
+        {
+          "key": "kf#24",
+          "name": "g",
+          "signature": "int g(int y);",
+          "defined": true,
+          "sloc": {
+            "dir": "tests/batch",
+            "base": "ast_services.i",
+            "file": "tests/batch/ast_services.i",
+            "line": 2
+          }
+        },
+        {
+          "key": "kf#20",
+          "name": "f",
+          "signature": "int f(int x);",
+          "defined": true,
+          "sloc": {
+            "dir": "tests/batch",
+            "base": "ast_services.i",
+            "file": "tests/batch/ast_services.i",
+            "line": 1
+          }
+        }
       ],
       "removed": [],
       "reload": true,
diff --git a/src/plugins/server/tests/batch/test_config b/src/plugins/server/tests/batch/test_config
index dcc28f9c11b3006d573f834e68ebffa996e11d4d..49a750412c6bb645370569d6b06ad94d389a7070 100644
--- a/src/plugins/server/tests/batch/test_config
+++ b/src/plugins/server/tests/batch/test_config
@@ -1,3 +1,9 @@
 PLUGIN: server
 LOG: @PTEST_NAME@.out.json
+<<<<<<< HEAD
 OPT: -check -server-batch %{dep:@PTEST_NAME@.json} -server-batch-output-dir .
+||||||| ac7807782d
+OPT: -no-autoload-plugins -load-module server -check -server-batch @PTEST_DIR@/@PTEST_NAME@.json -server-batch-output-dir @PTEST_RESULT@
+=======
+OPT: -no-autoload-plugins -load-module server -check -server-batch @PTEST_DIR@/@PTEST_NAME@.json -server-batch-output-dir @PTEST_RESULT@ -server-msg-key use-relative-filepath
+>>>>>>> origin/master
diff --git a/src/plugins/slicing/gui/register_gui.ml b/src/plugins/slicing/gui/register_gui.ml
index 6247933e695463af5d2af8cd1d9a6f78b7704a66..ff195d5618e70461462f3b858f75110d20eda9ce 100644
--- a/src/plugins/slicing/gui/register_gui.ml
+++ b/src/plugins/slicing/gui/register_gui.ml
@@ -276,7 +276,7 @@ let slicing_selector (popup_factory:GMenu.menu GMenu.factory)
           let txt = get_lv lvopt
             "Input a lvalue to slice on its value before the current statement."
           in
-          Extlib.may do_with_txt txt
+          Option.iter do_with_txt txt
         in
         add_slicing_item "Slice lval" kf_ki_lv_opt ~callback);
 
@@ -302,7 +302,7 @@ let slicing_selector (popup_factory:GMenu.menu GMenu.factory)
            let txt = get_lv lvopt
              "Input a lvalue to slice on its read accesses."
            in
-           Extlib.may do_with_txt txt
+           Option.iter do_with_txt txt
          in
          add_slicing_item "Slice rd" kf_ki_lv_opt ~callback);
 
@@ -328,7 +328,7 @@ let slicing_selector (popup_factory:GMenu.menu GMenu.factory)
            let txt = get_lv lvopt
              "Input a lvalue to slice on its write accesses."
            in
-           Extlib.may do_with_txt txt
+           Option.iter do_with_txt txt
          in
         add_slicing_item "Slice wr" kf_ki_lv_opt ~callback);
 
@@ -575,7 +575,7 @@ let file_tree_decorate (file_tree:Filetree.t) =
       ~title:"Slicing"
       (fun globs ->
         SlicingState.may_map
-          ~dft:[`STOCK_ID ""]
+          ~none:[`STOCK_ID ""]
           (fun () ->
             if List.exists
               (fun glob -> match glob with
diff --git a/src/plugins/slicing/printSlice.ml b/src/plugins/slicing/printSlice.ml
index a02e5d882ccc7ec22407c6c56f7e339bd2ff6d26..8c4bae8bc798a259e19c413ffccffd05d5e508df 100644
--- a/src/plugins/slicing/printSlice.ml
+++ b/src/plugins/slicing/printSlice.ml
@@ -90,7 +90,7 @@ class printerClass optional_ff = object(self)
           else
 	    Format.fprintf fmt "@[/* %s */@]" str_m
     in
-    let s = Extlib.the self#current_stmt in
+    let s = Option.get self#current_stmt in
     try
       Format.fprintf fmt "@[<v>%a@ %a@]"
         stmt_info s
@@ -104,7 +104,7 @@ class printerClass optional_ff = object(self)
     let label_info = match opt_ff with
       | None -> "label"
       | Some ff ->
-        let m = Fct_slice.get_label_mark ff (Extlib.the self#current_stmt) l in
+        let m = Fct_slice.get_label_mark ff (Option.get self#current_stmt) l in
         SlicingMarks.mark_to_string m
     in
     Format.fprintf fmt "@[<hv>/* %s */@ %a@]"
diff --git a/src/plugins/slicing/slicingState.ml b/src/plugins/slicing/slicingState.ml
index 6f45db58b47cc80c226af7a6274df832b952f8ca..6a9408e18dec8c0996e25aa0b59336d8664ca1d0 100644
--- a/src/plugins/slicing/slicingState.ml
+++ b/src/plugins/slicing/slicingState.ml
@@ -44,8 +44,8 @@ let may f = match P.get_option () with
   | None -> ()
   | Some _ -> f ()
 
-let may_map ~dft f = match P.get_option () with
-  | None -> dft
+let may_map ~none f = match P.get_option () with
+  | None -> none
   | Some _ -> f ()
 
 let reset_slicing () =
diff --git a/src/plugins/slicing/slicingState.mli b/src/plugins/slicing/slicingState.mli
index e08bcdbfbf90d5b17116e20c1b460ff1e376c1fd..fd224768c0caee5cbf79906bc94e438c1dc6d69f 100644
--- a/src/plugins/slicing/slicingState.mli
+++ b/src/plugins/slicing/slicingState.mli
@@ -31,7 +31,7 @@ val may: (unit -> unit) -> unit
 (** apply the given closure if the slicing project has been initialized through
     {!Db.Slicing.reset_slice}. *)
 
-val may_map: dft:'a -> (unit -> 'a) -> 'a
+val may_map: none:'a -> (unit -> 'a) -> 'a
 (** apply the given closure if the slicing project has been initialized through
     {!Db.Slicing.reset_slice}, or else return the default value.*)
 
diff --git a/src/plugins/sparecode/globs.ml b/src/plugins/sparecode/globs.ml
index f35f478c8800a7a4f78e1bad7c717ff0cc55632e..60b2535c517afc6887b362d762c5df1d9ad0dab6 100644
--- a/src/plugins/sparecode/globs.ml
+++ b/src/plugins/sparecode/globs.ml
@@ -70,7 +70,7 @@ class collect_visitor = object (self)
           Hashtbl.add used_compinfo ci.cname ();
           List.iter
             (fun f -> ignore (visitCilType (self:>Cil.cilVisitor) f.ftype))
-            ci.cfields;
+            (Option.value ~default:[] ci.cfields);
           DoChildren
         end
     | _ -> DoChildren
diff --git a/src/plugins/sparecode/spare_marks.ml b/src/plugins/sparecode/spare_marks.ml
index de47a8f85f358f7929385770aab6172e3e6cbd4c..409c6b654ea44638112fcdd277d358d4e2918674 100644
--- a/src/plugins/sparecode/spare_marks.ml
+++ b/src/plugins/sparecode/spare_marks.ml
@@ -305,7 +305,7 @@ class annot_visitor ~filter pdg = object (self)
     let () =
       if filter annot then
       try
-        let stmt = Extlib.the self#current_stmt in
+        let stmt = Option.get self#current_stmt in
         debug 1 "selecting annotation : %a @."
           Printer.pp_code_annotation annot;
         let info = !Db.Pdg.find_code_annot_nodes pdg stmt annot in
diff --git a/src/plugins/studia/Makefile.in b/src/plugins/studia/Makefile.in
index 76fa49dac96432f94679700c99e724905b665c85..c49e1893f2ea65bb13148d6189f58c7b667a2de0 100644
--- a/src/plugins/studia/Makefile.in
+++ b/src/plugins/studia/Makefile.in
@@ -36,7 +36,7 @@ endif
 PLUGIN_DIR ?=.
 PLUGIN_ENABLE:=@ENABLE_STUDIA@
 PLUGIN_NAME:=Studia
-PLUGIN_CMO:= options writes reads
+PLUGIN_CMO:= options writes reads studia_request
 PLUGIN_GUI_CMO:= studia_gui
 PLUGIN_DISTRIBUTED:=$(PLUGIN_ENABLE)
 PLUGIN_DISTRIB_EXTERNAL:= Makefile.in configure.ac configure
diff --git a/src/plugins/studia/studia_request.ml b/src/plugins/studia/studia_request.ml
new file mode 100644
index 0000000000000000000000000000000000000000..0297777d9b0147d901414f4702bc43368b01fef8
--- /dev/null
+++ b/src/plugins/studia/studia_request.ml
@@ -0,0 +1,98 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  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 Server
+open Cil_types
+
+let package =
+  Package.package ~plugin:"studia" ~name:"studia" ~title:"Studia"
+    ~readme:"studia.md" ()
+
+type effects =
+  { direct: stmt list;
+    indirect: stmt list; }
+
+module Effects = struct
+  open Server.Data
+
+  type record
+  let record: record Record.signature = Record.signature ()
+
+  module Location = Data.Jpair (Kernel_ast.Kf) (Kernel_ast.Marker)
+
+  let direct = Record.field record ~name:"direct"
+      ~descr:(Markdown.plain "List of statements with direct effect.")
+      (module Data.Jlist (Location))
+  let indirect = Record.field record ~name:"indirect"
+      ~descr:(Markdown.plain "List of statements with indirect effect.")
+      (module Data.Jlist (Location))
+
+  let data = Record.publish record ~package ~name:"effects"
+      ~descr:(Markdown.plain "Statements that read or write a location.")
+
+  module R : Record.S with type r = record = (val data)
+  type t = effects
+  let jtype = R.jtype
+
+  let to_json effects =
+    let output_stmt stmt =
+      let kf = Kernel_function.find_englobing_kf stmt in
+      kf, Printer_tag.PStmtStart (kf, stmt)
+    in
+    R.default |>
+    R.set direct (List.map output_stmt effects.direct) |>
+    R.set indirect (List.map output_stmt effects.indirect) |>
+    R.to_json
+end
+
+
+type kind = Reads | Writes
+
+let compute kind zone =
+  let stmts = match kind with
+    | Reads -> Reads.compute zone
+    | Writes -> Writes.compute zone
+  in
+  let add_if b stmt acc = if b then stmt :: acc else acc in
+  let add acc (stmt, e) =
+    let direct = add_if e.Writes.direct stmt acc.direct in
+    let indirect = add_if e.Writes.indirect stmt acc.indirect in
+    { direct; indirect }
+  in
+  let empty = { direct = []; indirect = []; } in
+  List.fold_left add empty stmts
+
+let lval_location kinstr lval = !Db.Value.lval_to_zone kinstr lval
+
+let () = Request.register ~package
+    ~kind:`GET ~name:"getReadsLval"
+    ~descr:(Markdown.plain "Get the list of statements that read a lval.")
+    ~input:(module Kernel_ast.Lval)
+    ~output:(module Effects)
+    (fun (kinstr, lval) -> compute Reads (lval_location kinstr lval))
+
+let () = Request.register ~package
+    ~kind:`GET ~name:"getWritesLval"
+    ~descr:(Markdown.plain "Get the list of statements that write a lval.")
+    ~input:(module Kernel_ast.Lval)
+    ~output:(module Effects)
+    (fun (kinstr, lval) -> compute Writes (lval_location kinstr lval))
diff --git a/src/plugins/markdown-report/eva_coverage.mli b/src/plugins/studia/studia_request.mli
similarity index 94%
rename from src/plugins/markdown-report/eva_coverage.mli
rename to src/plugins/studia/studia_request.mli
index 68e7b5fb773d1772310d3059178b9d8325e0b481..182bc40a8e1af00f6d1329952d449d0f2e6808e1 100644
--- a/src/plugins/markdown-report/eva_coverage.mli
+++ b/src/plugins/studia/studia_request.mli
@@ -19,6 +19,3 @@
 (*  for more details (enclosed in the file licenses/LGPLv2.1).            *)
 (*                                                                        *)
 (**************************************************************************)
-
-(** generates a coverage summary of EVA's run*)
-val md_gen: unit -> Markdown.element list
diff --git a/src/plugins/studia/writes.ml b/src/plugins/studia/writes.ml
index a877d0735c9ee35a217da30e03876f9e4fcee3ee..938c3f01dae0f66c54c4551dd469b895f224c5a4 100644
--- a/src/plugins/studia/writes.ml
+++ b/src/plugins/studia/writes.ml
@@ -56,7 +56,7 @@ class find_write zlval = object (self)
   val mutable res = ([] : (stmt * effects) list)
 
   method! vinst i =
-    let stmt = Extlib.the self#current_stmt in
+    let stmt = Option.get self#current_stmt in
     begin
       let aux_call lvopt _kf _args _loc =
         (* Direct effect through the writing of [lvopt], or indirect inside
diff --git a/src/plugins/value/alarmset.ml b/src/plugins/value/alarmset.ml
index 4a88c3eee32a50a552c5ebe5c42ef36845f68844..3f94efd96e9bb25f502870f9e30110caef784d15 100644
--- a/src/plugins/value/alarmset.ml
+++ b/src/plugins/value/alarmset.ml
@@ -229,7 +229,7 @@ let local_printer: Printer.extensible_printer =
 
     method private pp_temporaries fmt =
       let pp_var fmt vi =
-        Format.fprintf fmt "%s from@ @[%s@]" vi.vname (Extlib.the vi.vdescr)
+        Format.fprintf fmt "%s from@ @[%s@]" vi.vname (Option.get vi.vdescr)
       in
       Pretty_utils.pp_iter Cil_datatype.Varinfo.Set.iter
         ~pre:"" ~suf:"" ~sep:",@ " pp_var fmt temporaries
diff --git a/src/plugins/value/api/general_requests.ml b/src/plugins/value/api/general_requests.ml
index abf821d1d69063f79af1cc14354030b3920ae856..bbb5c95724375e6306e6e47c70497fcd2c28e9f5 100644
--- a/src/plugins/value/api/general_requests.ml
+++ b/src/plugins/value/api/general_requests.ml
@@ -31,6 +31,12 @@ let package =
     ~readme:"eva.md"
     ()
 
+let () = Request.register ~package
+    ~kind:`GET ~name:"isComputed"
+    ~descr:(Markdown.plain "True if the Eva analysis has been done")
+    ~input:(module Data.Junit) ~output:(module Data.Jbool)
+    Db.Value.is_computed
+
 let is_computed kf =
   Db.Value.is_computed () &&
   match kf with
diff --git a/src/plugins/value/api/values_request.ml b/src/plugins/value/api/values_request.ml
index 85d2df413cded868f8088cdb2d72602a095ca4ac..e6587ea85824ad563a6d556b6d85d5c615992eda 100644
--- a/src/plugins/value/api/values_request.ml
+++ b/src/plugins/value/api/values_request.ml
@@ -23,7 +23,17 @@
 open Server
 open Data
 open Cil_types
+
+module Kmap = Kernel_function.Hashtbl
+module Smap = Cil_datatype.Stmt.Hashtbl
+module CS = Value_types.Callstack
+module CSet = CS.Set
+module CSmap = CS.Hashtbl
+
 module Md = Markdown
+module Jkf = Kernel_ast.Kf
+module Jstmt = Kernel_ast.Stmt
+module Jmarker = Kernel_ast.Marker
 
 let package =
   Package.package
@@ -33,334 +43,467 @@ let package =
     ~readme:"eva.md"
     ()
 
-type value =
-  { value: string;
-    alarm: bool; }
-
-type evaluation =
-  | Unreachable
-  | Evaluation of value
-
-type after =
-  | Unchanged
-  | Reduced of evaluation
-
-type before_after =
-  { before: evaluation;
-    after_instr: after option;
-    after_then: after option;
-    after_else: after option; }
-
-type values =
-  { values: before_after;
-    callstack: (Value_util.callstack * before_after) list option; }
-
-let get_value = function
-  | Unreachable -> "Unreachable"
-  | Evaluation { value } -> value
-
-let get_alarm = function
-  | Unreachable -> false
-  | Evaluation { alarm } -> alarm
-
-let get_after_value =
-  Extlib.opt_map
-    (function Unchanged -> "unchanged" | Reduced eval -> get_value eval)
-
-module CallStackId =
-  Data.Index
-    (Value_types.Callstack.Map)
-    (struct
-      let name = "eva-callstack-id"
-    end)
-
-(* This pretty-printer drops the toplevel kf, which is always the function
-   in which we are pretty-printing the expression/term *)
-let pretty_callstack fmt cs =
-  match cs with
-  | [_, Kglobal] -> ()
-  | (_kf_cur, Kstmt callsite) :: q -> begin
-      let rec aux callsite = function
-        | (kf, callsite') :: q -> begin
-            Format.fprintf fmt "%a (%a)"
-              Kernel_function.pretty kf
-              Cil_datatype.Location.pretty (Cil_datatype.Stmt.loc callsite);
-            match callsite' with
-            | Kglobal -> ()
-            | Kstmt callsite' ->
-              Format.fprintf fmt " ←@ ";
-              aux callsite' q
+type probe =
+  | Pexpr of exp * stmt
+  | Plval of lval * stmt
+  | Pnone
+
+type callstack = Value_types.callstack
+type truth = Abstract_interp.truth
+type step = [ `Here | `After | `Then of exp | `Else of exp ]
+
+type domain = {
+  values: ( step * string ) list ;
+  alarms: ( truth * string ) list ;
+}
+
+let signal = Request.signal ~package ~name:"changed"
+    ~descr:(Md.plain "Emitted when EVA results has changed")
+
+let () = Analysis.register_computed_hook (fun () -> Request.emit signal)
+
+(* -------------------------------------------------------------------------- *)
+(* --- Marker Utilities                                                   --- *)
+(* -------------------------------------------------------------------------- *)
+
+let next_steps s : step list =
+  match s.skind with
+  | If(cond,_,_,_) -> [ `Then cond ; `Else cond ]
+  | Instr (Set _ | Call _ | Local_init _ | Asm _ | Code_annot _)
+  | Switch _ | Loop _ | Block _ | UnspecifiedSequence _
+  | TryCatch _ | TryFinally _ | TryExcept _
+    -> [ `After ]
+  | Instr (Skip _) | Return _ | Break _ | Continue _ | Goto _ | Throw _ -> []
+
+let probe_stmt s =
+  match s.skind with
+  | Instr (Set(lv,_,_)) -> Plval(lv,s)
+  | Instr (Call(Some lr,_,_,_)) -> Plval(lr,s)
+  | Instr (Local_init(v,_,_)) -> Plval((Var v,NoOffset),s)
+  | Return (Some e,_) | If(e,_,_,_) | Switch(e,_,_,_) -> Pexpr(e,s)
+  | _ -> Pnone
+
+let probe marker =
+  let open Printer_tag in
+  match marker with
+  | PLval(_,Kstmt s,l) -> Plval(l,s)
+  | PExp(_,Kstmt s,e) -> Pexpr(e,s)
+  | PStmt(_,s) | PStmtStart(_,s) -> probe_stmt s
+  | PVDecl(_,Kstmt s,v) -> Plval((Var v,NoOffset),s)
+  | _ -> Pnone
+
+(* -------------------------------------------------------------------------- *)
+(* --- Stmt Ranking                                                       --- *)
+(* -------------------------------------------------------------------------- *)
+
+module Ranking :
+sig
+  val stmt : stmt -> int
+  val sort : callstack list -> callstack list
+end =
+struct
+
+  class ranker =
+    object(self)
+      inherit Visitor.frama_c_inplace
+      (* ranks really starts at 1 *)
+      (* rank < 0 means not computed yet *)
+      val mutable rank = (-1)
+      val rmap = Smap.create 0
+      val fmark = Kmap.create 0
+      val fqueue = Queue.create ()
+
+      method private call kf =
+        if not (Kmap.mem fmark kf) then
+          begin
+            Kmap.add fmark kf () ;
+            Queue.push kf fqueue ;
           end
-        | _ -> assert false
-      in
-      Format.fprintf fmt "@[<hv>%a" Value_types.Callstack.pretty_hash cs;
-      aux callsite q;
-      Format.fprintf fmt "@]"
+
+      method private newrank s =
+        let r = succ rank in
+        Smap.add rmap s r ;
+        rank <- r ; r
+
+      method! vlval lv =
+        begin
+          try match fst lv with
+            | Var vi -> self#call (Globals.Functions.get vi)
+            | _ -> ()
+          with Not_found -> ()
+        end ; Cil.DoChildren
+
+      method! vstmt_aux s =
+        ignore (self#newrank s) ;
+        Cil.DoChildren
+
+      method flush =
+        while not (Queue.is_empty fqueue) do
+          let kf = Queue.pop fqueue in
+          ignore (Visitor.(visitFramacKf (self :> frama_c_visitor) kf))
+        done
+
+      method compute =
+        match Globals.entry_point () with
+        | kf , _ -> self#call kf ; self#flush
+        | exception Globals.No_such_entry_point _ -> ()
+
+      method rank s =
+        if rank < 0 then (rank <- 0 ; self#compute) ;
+        try Smap.find rmap s
+        with Not_found ->
+          let kf = Kernel_function.find_englobing_kf s in
+          self#call kf ;
+          self#flush ;
+          try Smap.find rmap s
+          with Not_found -> self#newrank s
+
     end
-  | _ -> assert false
-
-(* This pretty-printer prints only the lists of the functions, not
-   the locations. *)
-let pretty_callstack_short fmt cs =
-  match cs with
-  | [_, Kglobal] -> ()
-  | (_kf_cur, Kstmt _callsite) :: q ->
-    Format.fprintf fmt "%a" Value_types.Callstack.pretty_hash cs;
-    Pretty_utils.pp_flowlist ~left:"@[" ~sep:" ←@ " ~right:"@]"
-      (fun fmt (kf, _) -> Kernel_function.pretty fmt kf) fmt q
-  | _ -> assert false
-
-module CallStack = struct
-  type record
-
-  let record: record Record.signature = Record.signature ()
-
-  let id = Record.field record ~name:"id"
-      ~descr:(Md.plain "Callstack id") (module Jint)
-  let short = Record.field record ~name:"short"
-      ~descr:(Md.plain "Short name for the callstack") (module Jstring)
-  let full = Record.field record ~name:"full"
-      ~descr:(Md.plain "Full name for the callstack") (module Jstring)
-
-  module R =
-    (val
-      (Record.publish
-         ~package
-         ~name:"callstack"
-         ~descr:(Md.plain "CallStack")
-         record) : Record.S with type r = record)
-
-  type t = Value_types.callstack option
-
-  let jtype = R.jtype
-
-  let pp_callstack ~short = function
-    | None -> if short then "all" else ""
-    | Some callstack ->
-      let pp_text =
-        if short
-        then Pretty_utils.to_string ~margin:50 pretty_callstack_short
-        else Pretty_utils.to_string pretty_callstack
-      in
-      (pp_text callstack)
-
-  let id_callstack = function
-    | None -> -1
-    | Some callstack -> CallStackId.get callstack
-
-  let to_json callstack =
-    R.default |>
-    R.set id (id_callstack callstack) |>
-    R.set short (pp_callstack ~short:true callstack) |>
-    R.set full (pp_callstack ~short:false callstack) |>
-    R.to_json
-
-  let key = function
-    | None -> "all"
-    | Some callstack -> string_of_int (CallStackId.get callstack)
+
+  let stmt = let rk = new ranker in rk#rank
+
+  let rec ranks (rks : int list) (cs : callstack) : int list =
+    match cs with
+    | [] -> rks
+    | (_,Kglobal)::wcs -> ranks rks wcs
+    | (_,Kstmt s)::wcs -> ranks (stmt s :: rks) wcs
+
+  let order : int list -> int list -> int = Stdlib.compare
+
+  let sort (wcs : callstack list) : callstack list =
+    List.map fst @@
+    List.sort (fun (_,rp) (_,rq) -> order rp rq) @@
+    List.map (fun cs -> cs , ranks [] cs) wcs
+
+end
+
+(* -------------------------------------------------------------------------- *)
+(* --- Domain Utilities                                                   --- *)
+(* -------------------------------------------------------------------------- *)
+
+module Jcallstack : S with type t = callstack =
+struct
+  module I = Data.Index
+      (Value_types.Callstack.Map)
+      (struct let name = "eva-callstack-id" end)
+  let jtype = Data.declare ~package ~name:"callstack" I.jtype
+  type t = I.t
+  let to_json = I.to_json
+  let of_json = I.of_json
 end
 
+module Jcalls : Request.Output with type t = callstack =
+struct
+
+  type t = callstack
+  let jtype = Package.(Jlist (Jrecord [
+      "callee" , Jkf.jtype ;
+      "caller" , Joption Jkf.jtype ;
+      "stmt" , Joption Jstmt.jtype ;
+      "rank" , Joption Jnumber ;
+    ]))
+
+  let rec jcallstack jcallee ki cs : json list =
+    match ki , cs with
+    | Kglobal , _ | _ , [] -> [
+        `Assoc [ "callee", jcallee ]
+      ]
+    | Kstmt stmt , (called,ki) :: cs ->
+      let jcaller = Jkf.to_json called in
+      let callsite = `Assoc [
+          "callee", jcallee ;
+          "caller", jcaller ;
+          "stmt", Jstmt.to_json stmt ;
+          "rank", Jint.to_json (Ranking.stmt stmt) ;
+        ] in
+      callsite :: jcallstack jcaller ki cs
+
+  let to_json = function
+    | [] -> `List []
+    | (callee,ki)::cs -> `List (jcallstack (Jkf.to_json callee) ki cs)
 
-let consolidated = ref None
-let table = Hashtbl.create 100
-
-let iter f =
-  if Hashtbl.length table > 1
-  then Extlib.may (fun values -> f (None, values)) !consolidated;
-  Hashtbl.iter (fun key data -> f (Some key, data)) table
-
-let array =
-  let model = States.model () in
-  let () =
-    States.column
-      ~name:"callstack"
-      ~descr:(Md.plain "CallStack")
-      ~data:(module CallStack)
-      ~get:fst
-      model
-  in
-  let () =
-    States.column
-      ~name:"value_before"
-      ~descr:(Md.plain "Value inferred just before the selected point")
-      ~data:(module Jstring)
-      ~get:(fun (_, e) -> get_value e.before)
-      model
-  in
-  let () =
-    States.column
-      ~name:"alarm"
-      ~descr:(Md.plain "Did the evaluation led to an alarm?")
-      ~data:(module Jbool)
-      ~get:(fun (_, e) -> get_alarm e.before)
-      model
-  in
-  let () =
-    States.column
-      ~name:"value_after"
-      ~descr:(Md.plain "Value inferred just after the selected point")
-      ~data:(module Joption(Jstring))
-      ~get:(fun (_, e) -> get_after_value e.after_instr)
-      model
-  in
-  States.register_array
-    ~package
-    ~name:"values"
-    ~descr:(Md.plain "Abstract values inferred by the Eva analysis")
-    ~key:(fun (cs, _) -> CallStack.key cs)
-    ~iter
-    model
-
-let update_values values =
-  Hashtbl.clear table;
-  consolidated := Some values.values;
-  let () =
-    match values.callstack with
-    | None -> ()
-    | Some by_callstack ->
-      List.iter
-        (fun (callstack, before_after) ->
-           Hashtbl.add table callstack before_after)
-        by_callstack
-  in
-  States.reload array
-
-module type S = sig
-  val evaluate: kinstr -> exp -> values
-  val lvaluate: kinstr -> lval -> values
 end
 
-module Make (Eva: Analysis.S) : S = struct
-
-  let make_before eval before =
-    let before =
-      match before with
-      | `Bottom -> Unreachable
-      | `Value state -> Evaluation (eval state)
-    in
-    { before; after_instr = None; after_then = None; after_else = None; }
-
-  let make_callstack stmt eval =
-    let before = Eva.get_stmt_state_by_callstack ~after:false stmt in
-    match before with
-    | (`Bottom | `Top) -> []
-    | `Value before ->
-      let aux callstack before acc =
-        let before_after = make_before eval (`Value before) in
-        (callstack, before_after) :: acc
-      in
-      Value_types.Callstack.Hashtbl.fold aux before []
-
-  let make_before_after eval ~before ~after =
-    match before with
-    | `Bottom ->
-      { before = Unreachable;
-        after_instr = None;
-        after_then = None;
-        after_else = None; }
-    | `Value before ->
-      let before = eval before in
-      let after_instr =
-        match after with
-        | `Bottom -> Some (Reduced Unreachable)
-        | `Value after ->
-          let after = eval after in
-          if String.equal before.value after.value
-          then Some Unchanged
-          else Some (Reduced (Evaluation after))
-      in
-      { before = Evaluation before;
-        after_instr; after_then = None; after_else = None; }
-
-  let make_instr_callstack stmt eval =
-    let before = Eva.get_stmt_state_by_callstack ~after:false stmt in
-    let after = Eva.get_stmt_state_by_callstack ~after:true stmt in
-    match before, after with
-    | (`Bottom | `Top), _
-    | _, (`Bottom | `Top) -> []
-    | `Value before, `Value after ->
-      let aux callstack before acc =
-        let before = `Value before in
-        let after =
-          try `Value (Value_types.Callstack.Hashtbl.find after callstack)
+
+
+module Jtruth : Data.S with type t = truth =
+struct
+  type t = truth
+  let jtype =
+    Package.(Junion [ Jtag "True" ; Jtag "False" ; Jtag "Unknown" ])
+  let to_json = function
+    | Abstract_interp.Unknown -> `String "Unknown"
+    | True -> `String "True"
+    | False -> `String "False"
+  let of_json = function
+    | `String "True" -> Abstract_interp.True
+    | `String "False" -> Abstract_interp.False
+    | _ -> Abstract_interp.Unknown
+end
+
+(* -------------------------------------------------------------------------- *)
+(* --- EVA Proxy                                                          --- *)
+(* -------------------------------------------------------------------------- *)
+
+module type EvaProxy =
+sig
+  val callstacks : stmt -> callstack list
+  val domain : probe -> callstack option -> domain
+end
+
+module Proxy(A : Analysis.S) : EvaProxy =
+struct
+
+  open Eval
+  type dstate = A.Dom.state or_top_or_bottom
+
+  let callstacks stmt =
+    match A.get_stmt_state_by_callstack ~after:false stmt with
+    | `Top | `Bottom -> []
+    | `Value states ->
+      CSmap.fold_sorted (fun cs _st wcs -> cs :: wcs) states []
+
+  let dstate ~after stmt callstack =
+    match callstack with
+    | None -> (A.get_stmt_state ~after stmt :> dstate)
+    | Some cs ->
+      begin match A.get_stmt_state_by_callstack ~after stmt with
+        | `Top -> `Top
+        | `Bottom -> `Bottom
+        | `Value cmap ->
+          try `Value (CSmap.find cmap cs)
           with Not_found -> `Bottom
-        in
-        let before_after = make_before_after eval ~before ~after in
-        (callstack, before_after) :: acc
-      in
-      Value_types.Callstack.Hashtbl.fold aux before []
-
-  let make eval kinstr =
-    let before = Eva.get_kinstr_state ~after:false kinstr in
-    let values, callstack =
-      match kinstr with
-      | Cil_types.Kglobal ->
-        make_before eval before, None
-      | Cil_types.Kstmt stmt ->
-        match stmt.skind with
-        | Instr _ ->
-          let after = Eva.get_kinstr_state ~after:true kinstr in
-          let values = make_before_after eval ~before ~after in
-          let callstack = make_instr_callstack stmt eval in
-          values, Some callstack
-        | _ ->
-          make_before eval before, Some (make_callstack stmt eval)
-    in
-    { values; callstack; }
-
-
-  let evaluate kinstr expr =
-    let eval state =
-      let value, alarms = Eva.eval_expr state expr in
-      let alarm = not (Alarmset.is_empty alarms) in
-      let str = Format.asprintf "%a" (Bottom.pretty Eva.Val.pretty) value in
-      { value = str; alarm }
-    in
-    make eval kinstr
-
-  let lvaluate kinstr lval =
-    let eval state =
-      let value, alarms = Eva.copy_lvalue state lval in
-      let alarm = not (Alarmset.is_empty alarms) in
-      let flagged_value = match value with
-        | `Bottom -> Eval.Flagged_Value.bottom
-        | `Value v -> v
-      in
-      let pretty = Eval.Flagged_Value.pretty Eva.Val.pretty in
-      let str = Format.asprintf "%a" pretty flagged_value in
-      { value = str; alarm }
-    in
-    make eval kinstr
+      end
+
+  let dnone = {
+    alarms = [] ;
+    values = [] ;
+  }
+
+  let dtop = {
+    alarms = [] ;
+    values = [`Here , "Not available."] ;
+  }
+
+  let dbottom = {
+    alarms = [] ;
+    values = [`Here , "Unreachable."] ;
+  }
+
+  let dalarms alarms =
+    let pool = ref [] in
+    Alarmset.iter
+      (fun alarm status ->
+         let descr = Format.asprintf "@[<hov 2>%a@]" Alarms.pretty alarm
+         in pool := (status , descr) :: !pool
+      ) alarms ;
+    List.rev !pool
+
+  let deval (eval : A.Dom.state -> string * Alarmset.t) stmt callstack =
+    match dstate ~after:false stmt callstack with
+    | `Bottom -> dbottom
+    | `Top -> dtop
+    | `Value state ->
+      let value, alarms = eval state in
+      let dnext (step : step) vs = function
+        | `Top | `Bottom -> vs
+        | `Value state ->
+          let values =
+            try fst @@ eval state
+            with exn -> Printf.sprintf "Error (%S)" (Printexc.to_string exn)
+          in (step , values) :: vs in
+      let others = List.fold_right
+          begin fun st vs ->
+            match st with
+            | `Here -> vs (* absurd *)
+            | `After -> dnext st vs @@ dstate ~after:true stmt callstack
+            | `Then cond -> dnext st vs @@ A.assume_cond stmt state cond true
+            | `Else cond -> dnext st vs @@ A.assume_cond stmt state cond false
+          end (next_steps stmt) []
+      in {
+        values = (`Here,value) :: others ;
+        alarms = dalarms alarms ;
+      }
+
+  let e_expr expr state =
+    let value, alarms = A.eval_expr state expr in
+    begin
+      Pretty_utils.to_string (Bottom.pretty A.Val.pretty) value,
+      alarms
+    end
+
+  let e_lval lval state =
+    let value, alarms = A.copy_lvalue state lval in
+    let flagged = match value with
+      | `Bottom -> Eval.Flagged_Value.bottom
+      | `Value v -> v in
+    begin
+      Pretty_utils.to_string (Eval.Flagged_Value.pretty A.Val.pretty) flagged,
+      alarms
+    end
+
+  let domain p wcs = match p with
+    | Plval(l,s) -> deval (e_lval l) s wcs
+    | Pexpr(e,s) -> deval (e_expr e) s wcs
+    | Pnone -> dnone
+
 end
 
+let proxy =
+  let make (a : (module Analysis.S)) = (module Proxy(val a) : EvaProxy) in
+  let current = ref (make @@ Analysis.current_analyzer ()) in
+  let () = Analysis.register_hook
+      begin fun a ->
+        current := make a ;
+        Request.emit signal ;
+      end
+  in current
+
+(* -------------------------------------------------------------------------- *)
+(* --- Request getCallstacks                                              --- *)
+(* -------------------------------------------------------------------------- *)
+
+let () = Request.register ~package
+    ~kind:`GET ~name:"getCallstacks"
+    ~descr:(Md.plain "Callstacks for markers")
+    ~input:(module Jlist(Jmarker))
+    ~output:(module Jlist(Jcallstack))
+    begin fun markers ->
+      let module A = (val !proxy) in
+      let cset = List.fold_left
+          (fun cset marker ->
+             match probe marker with
+             | Pexpr(_,stmt) | Plval(_,stmt) ->
+               List.fold_right CSet.add (A.callstacks stmt) cset
+             | Pnone -> cset
+          ) CSet.empty markers in
+      Ranking.sort (CSet.elements cset)
+    end
 
-let ref_request =
-  let module Analyzer = (val Analysis.current_analyzer ()) in
-  ref (module Make (Analyzer) : S)
+(* -------------------------------------------------------------------------- *)
+(* --- Request getCallstackInfo                                           --- *)
+(* -------------------------------------------------------------------------- *)
 
-let hook (module Analyzer: Analysis.S) =
-  ref_request := (module Make (Analyzer) : S)
+let () =
+  Request.register ~package
+    ~kind:`GET ~name:"getCallstackInfo"
+    ~descr:(Md.plain "Callstack Description")
+    ~input:(module Jcallstack)
+    ~output:(module Jcalls)
+    begin fun cs -> cs end
 
-let () = Analysis.register_hook hook
+(* -------------------------------------------------------------------------- *)
+(* --- Request getStmtInfo                                                --- *)
+(* -------------------------------------------------------------------------- *)
 
+let () =
+  let getStmtInfo = Request.signature ~input:(module Jstmt) () in
+  let set_fct = Request.result getStmtInfo ~name:"fct"
+      ~descr:(Md.plain "Englobing function")
+      (module Jkf) in
+  let set_rank = Request.result getStmtInfo ~name:"rank"
+      ~descr:(Md.plain "Global stmt order")
+      (module Jint) in
+  Request.register_sig ~package getStmtInfo
+    ~kind:`GET ~name:"getStmtInfo"
+    ~descr:(Md.plain "Stmt Information")
+    begin fun rq s ->
+      set_fct rq (Kernel_function.find_englobing_kf s) ;
+      set_rank rq (Ranking.stmt s) ;
+    end
 
-let update tag =
-  let module Request = (val !ref_request) in
-  match tag with
-  | Printer_tag.PExp (_kf, kinstr, expr) ->
-    update_values (Request.evaluate kinstr expr)
-  | Printer_tag.PLval (_kf, kinstr, lval) ->
-    update_values (Request.lvaluate kinstr lval)
-  | PVDecl (_kf, kinstr, varinfo) ->
-    update_values (Request.lvaluate kinstr (Var varinfo, NoOffset))
-  | _ -> ()
+(* -------------------------------------------------------------------------- *)
+(* --- Request getProbeInfo                                               --- *)
+(* -------------------------------------------------------------------------- *)
 
 let () =
-  Server.Request.register
-    ~package
-    ~kind:`GET
-    ~name:"getValues"
-    ~descr:(Md.plain "Get the abstract values computed for an expression or lvalue")
-    ~input:(module Kernel_ast.Marker)
-    ~output:(module Junit)
-    update
+  let getProbeInfo = Request.signature ~input:(module Jmarker) () in
+  let set_code = Request.result_opt getProbeInfo
+      ~name:"code" ~descr:(Md.plain "Probe source code")
+      (module Jstring) in
+  let set_stmt = Request.result_opt getProbeInfo
+      ~name:"stmt" ~descr:(Md.plain "Probe statement")
+      (module Jstmt) in
+  let set_rank = Request.result getProbeInfo
+      ~name:"rank" ~descr:(Md.plain "Probe statement rank")
+      ~default:0 (module Jint) in
+  let set_effects = Request.result getProbeInfo
+      ~name:"effects" ~descr:(Md.plain "Effectfull statement")
+      ~default:false (module Jbool) in
+  let set_condition = Request.result getProbeInfo
+      ~name:"condition" ~descr:(Md.plain "Conditional statement")
+      ~default:false (module Jbool) in
+  let set_probe rq pp p s =
+    begin
+      set_code rq (Some (Pretty_utils.to_string pp p)) ;
+      set_stmt rq (Some s) ;
+      set_rank rq (Ranking.stmt s) ;
+      List.iter
+        (function
+          | `Here -> ()
+          | `Then _ | `Else _ -> set_condition rq true
+          | `After -> set_effects rq true
+        )
+        (next_steps s)
+    end
+  in Request.register_sig ~package ~kind:`GET getProbeInfo
+    ~name:"getProbeInfo" ~descr:(Md.plain "Probe informations")
+    begin fun rq marker ->
+      match probe marker with
+      | Plval(l,s) ->
+        set_probe rq Printer.pp_lval l s ;
+      | Pexpr(e,s) ->
+        set_probe rq Printer.pp_exp e s ;
+      | Pnone -> ()
+    end
+
+(* -------------------------------------------------------------------------- *)
+(* --- Request getValues                                                  --- *)
+(* -------------------------------------------------------------------------- *)
+
+let () =
+  let getValues = Request.signature () in
+  let get_tgt = Request.param getValues ~name:"target"
+      ~descr:(Md.plain "Works with all markers containing an expression")
+      (module Jmarker) in
+  let get_cs = Request.param_opt getValues ~name:"callstack"
+      ~descr:(Md.plain "Callstack to collect (defaults to none)")
+      (module Jcallstack) in
+  let set_alarms = Request.result getValues ~name:"alarms"
+      ~descr:(Md.plain "Alarms raised during evaluation")
+      (module Jlist(Jpair(Jtruth)(Jstring))) in
+  let set_domain = Request.result_opt getValues ~name:"values"
+      ~descr:(Md.plain "Domain values")
+      (module Jstring) in
+  let set_after = Request.result_opt getValues ~name:"v_after"
+      ~descr:(Md.plain "Domain values after execution")
+      (module Jstring) in
+  let set_then = Request.result_opt getValues ~name:"v_then"
+      ~descr:(Md.plain "Domain values for true condition")
+      (module Jstring) in
+  let set_else = Request.result_opt getValues ~name:"v_else"
+      ~descr:(Md.plain "Domain values for false condition")
+      (module Jstring) in
+  Request.register_sig ~package getValues
+    ~kind:`GET ~name:"getValues"
+    ~descr:(Md.plain "Abstract values for the given marker")
+    begin fun rq () ->
+      let marker = get_tgt rq in
+      let callstack = get_cs rq in
+      let domain =
+        let module A : EvaProxy = (val !proxy) in
+        A.domain (probe marker) callstack in
+      set_alarms rq domain.alarms ;
+      List.iter
+        (fun (step,values) ->
+           let domain = Some values in
+           match step with
+           | `Here -> set_domain rq domain
+           | `After -> set_after rq domain
+           | `Then _ -> set_then rq domain
+           | `Else _ -> set_else rq domain
+        ) domain.values ;
+    end
+
+
+(* -------------------------------------------------------------------------- *)
diff --git a/src/plugins/value/domains/apron/apron_domain.ml b/src/plugins/value/domains/apron/apron_domain.ml
index c21820f2b2dfa19d7132a2b9f646c38321d72881..0fdcc234bf9fe9526b0f8d8eb6647d09eef361c1 100644
--- a/src/plugins/value/domains/apron/apron_domain.ml
+++ b/src/plugins/value/domains/apron/apron_domain.ml
@@ -329,8 +329,8 @@ let truncate_interval typ interval =
 let interval_to_ival interval =
   let inf = scalar_to_int interval.Interval.inf
   and sup = scalar_to_int interval.Interval.sup in
-  let inf = Extlib.opt_map Integer.of_int inf
-  and sup = Extlib.opt_map Integer.of_int sup in
+  let inf = Option.map Integer.of_int inf
+  and sup = Option.map Integer.of_int sup in
   Some (Ival.inject_range inf sup)
 
 let int_to_scalar positive = function
diff --git a/src/plugins/value/domains/cvalue/builtins.ml b/src/plugins/value/domains/cvalue/builtins.ml
index e8478f7c7f85c0dd5a0c5952b8ce024ff93d5480..ba5c2f99bb99deed6fa3ad25c6140ab5359c25db 100644
--- a/src/plugins/value/domains/cvalue/builtins.ml
+++ b/src/plugins/value/domains/cvalue/builtins.ml
@@ -195,7 +195,7 @@ let prepare_builtins () =
   (* Overrides builtins attribution according to the -eva-builtin option. *)
   Value_parameters.BuiltinsOverrides.iter
     (fun (kf, name) ->
-       let builtin_name = Extlib.the name in
+       let builtin_name = Option.get name in
        let f, typ, _, _ = Hashtbl.find table builtin_name in
        prepare_builtin kf builtin_name f typ)
 
diff --git a/src/plugins/value/domains/cvalue/builtins_malloc.ml b/src/plugins/value/domains/cvalue/builtins_malloc.ml
index 576d50e93ce9e1f11f25433ecae4e35b2ffce24e..2868e1b1bfbd2f7dcd28441d173cb8f87412f716 100644
--- a/src/plugins/value/domains/cvalue/builtins_malloc.ml
+++ b/src/plugins/value/domains/cvalue/builtins_malloc.ml
@@ -300,7 +300,7 @@ let add_zeroes = add_v (V_Or_Uninitialized.initialized Cvalue.V.singleton_zero)
    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
+  let returns_null = Option.value ~default:default_returns_null returns_null in
   let success = Eval_op.wrap_ptr ret, state_after_alloc in
   if returns_null
   then
diff --git a/src/plugins/value/domains/cvalue/builtins_memory.ml b/src/plugins/value/domains/cvalue/builtins_memory.ml
index 6d266b4f8a2cc85a28a4fffd1757128a5b45db9f..b3a237f7d07205c16d9243002a4a9eb59ddacd72 100644
--- a/src/plugins/value/domains/cvalue/builtins_memory.ml
+++ b/src/plugins/value/domains/cvalue/builtins_memory.ml
@@ -290,7 +290,7 @@ let frama_c_memcpy state actuals =
       if Ival.is_zero size then
         raise (Memcpy_result (state, empty_cfrom, Zone.bottom));
       let (precise_state,precise_deps_table,sure_zone) = precise_copy state in
-      if Extlib.may_map ~dft:false (Int.equal min) max then
+      if Option.fold ~none:false ~some:(Int.equal min) max then
         (let open Function_Froms in
          let c_from = { deps_table = precise_deps_table; deps_return } in
          raise (Memcpy_result (precise_state, c_from, sure_zone)));
@@ -470,16 +470,15 @@ let memset_typ_offsm_int full_typ i =
           (* Do not produce NaN or infinites here (unless they are accepted
              by the engine). *)
           if Fval.is_finite f = True then update size v' else update size v
-        | TComp ({ cstruct = true ; cfields = l}, _, _) as tcomp -> (* struct *)
+        | TComp ({ cstruct = true ; cfields = l}, _, _) -> (* struct *)
           let aux_field offsm fi =
-            let field = Field (fi, NoOffset) in
-            let offset_fi = Int.of_int (fst (Cil.bitsOffset tcomp field)) in
+            let offset_fi = Int.of_int (fst (Cil.fieldBitsOffset fi)) in
             aux fi.ftype (Int.add offset offset_fi) offsm
           in
-          List.fold_left aux_field offsm l
+          List.fold_left aux_field offsm (Option.value ~default:[] l)
         | TComp ({ cstruct = false ; cfields = l}, _, _) -> (* union *)
           (* Use only the first field. This is somewhat arbitrary *)
-          aux (List.hd l).ftype offset offsm
+          aux (List.hd (Option.get l)).ftype offset offsm
         | TArray (typelt, nb, _, _) -> begin
             let nb = Cil.lenOfArray64 nb in (* always succeeds, we computed the
                                                size of the entire type earlier *)
diff --git a/src/plugins/value/domains/cvalue/builtins_string.ml b/src/plugins/value/domains/cvalue/builtins_string.ml
index b4ac08862493c3272bd84e284c68b5995b20ba74..f5ecbc9c136338a14d037c771107aee4a1a9c3db 100644
--- a/src/plugins/value/domains/cvalue/builtins_string.ml
+++ b/src/plugins/value/domains/cvalue/builtins_string.ml
@@ -52,7 +52,7 @@ type acc =
     from: Ival.t;  (* The offsets from which the current search has begun. *)
     stop: bool; }  (* True if the search is completely done. *)
 
-let the_max_int ival = Extlib.the (Ival.max_int ival)
+let the_max_int ival = Option.get (Ival.max_int ival)
 
 let pos_min_int ival =
   match Ival.min_int ival with
@@ -230,7 +230,7 @@ let search_offsm kind ~validity ~offset ~rem offsetmap =
     | Base.Valid_range (Some (_min, max)) -> max
   in
   (* Uses [kind.limit] to bound the read. *)
-  let limit_max = Extlib.opt_bind Ival.max_int kind.limit in
+  let limit_max = Option.bind kind.limit Ival.max_int in
   let max = match Ival.max_int offset, limit_max with
     | Some max_start, Some max_limit ->
       let max = Integer.(add max_start (pred max_limit)) in
@@ -323,12 +323,12 @@ let return_top ~length str =
    to the found characters otherwise. Handles the case of a limit 0. *)
 let search_char kind ~length state str =
   let basemap =
-    if Extlib.may_map Ival.is_zero ~dft:false kind.limit
+    if Option.fold ~some:Ival.is_zero ~none:false kind.limit
     then Base.Map.empty
     else search_by_base kind str state
   in
   let alarm = Base.Map.exists (fun _base t -> t.alarm) basemap in
-  let zero = Extlib.may_map Ival.contains_zero ~dft:false kind.limit in
+  let zero = Option.fold ~some:Ival.contains_zero ~none:false kind.limit in
   if length
   then return_length kind ~zero basemap, alarm
   else return_pointer ~zero basemap, alarm
@@ -391,7 +391,7 @@ let do_search ~search ~stop_at_0 ~typ ~length ?limit = fun state args ->
         let limit = Ival.scale size (Cvalue.V.project_ival cvalue) in
         Ival.(narrow positive_integers limit)
       in
-      let limit = Extlib.opt_map interpret_limit limit in
+      let limit = Option.map interpret_limit limit in
       let kind = { search; stop_at_0; size; signed; limit } in
       let result, alarm = search_char kind ~length state str in
       result, alarm || not valid
diff --git a/src/plugins/value/domains/cvalue/cvalue_init.ml b/src/plugins/value/domains/cvalue/cvalue_init.ml
index 92786e24562cfbc1d6a0a2d5870e95b98bc88ec7..b3552f45e727f9556dbf6d4a04e73060d7b85155 100644
--- a/src/plugins/value/domains/cvalue/cvalue_init.ml
+++ b/src/plugins/value/domains/cvalue/cvalue_init.ml
@@ -98,8 +98,7 @@ let create_hidden_base ~libc ~valid ~hidden_var_name ~name_desc pointed_typ =
 let reject_empty_struct b offset typ =
   match Cil.unrollType typ with
   | TComp (ci, _, _) ->
-    if ci.cfields = [] && ci.cdefined &&
-       not (Cil.gccMode () || Cil.msvcMode ()) then
+    if ci.cfields = Some [] && not (Cil.acceptEmptyCompinfo ()) then
       Value_parameters.abort ~current:true
         "@[empty %ss@ are unsupported@ (type '%a',@ location %a%a)@ \
          in C99 (only allowed as GCC/MSVC extension).@ Aborting.@]"
@@ -133,7 +132,7 @@ let initialize_var_using_type varinfo state =
     | TPtr (typ, _) as full_typ
       when depth <= Value_parameters.AutomaticContextMaxDepth.get () ->
       let attr = Cil.typeAttrs full_typ in
-      let libc = Cil.hasAttribute "fc_stdlib" varinfo.vattr in
+      let libc = Cil.is_in_libc varinfo.vattr in
       let context_max_width =
         Value_parameters.AutomaticContextMaxWidth.get ()
       in begin
@@ -252,7 +251,7 @@ let initialize_var_using_type varinfo state =
                  The periodicity of the contents may be smaller than the size
                  of a cell; take this into account. *)
               let v, modu, offset =
-                Extlib.the (Cvalue.V_Offsetmap.fold
+                Option.get (Cvalue.V_Offsetmap.fold
                               (fun _itv v _ -> Some v) offsm_joined None)
               in
               assert (Abstract_interp.Rel.(equal offset zero));
@@ -314,7 +313,8 @@ let initialize_var_using_type varinfo state =
       in
       begin
         try
-          List.fold_left treat_field state compinfo.cfields
+          List.fold_left treat_field state
+            (Option.value ~default:[] compinfo.cfields)
         with Cil.SizeOfError (s, t) ->
           warn_unknown_size varinfo (s, t);
           bind_entire_loc Cvalue.V.top_int;
diff --git a/src/plugins/value/domains/cvalue/cvalue_specification.ml b/src/plugins/value/domains/cvalue/cvalue_specification.ml
index b67f8a616e24dae7757ca8322d4a7135c7c24355..84609e39c11e60890e0e4a020dd948ffd8e514b7 100644
--- a/src/plugins/value/domains/cvalue/cvalue_specification.ml
+++ b/src/plugins/value/domains/cvalue/cvalue_specification.ml
@@ -127,7 +127,7 @@ let check_fct_assigns kf ab ~pre_state found_froms =
        | WritesAny -> ()
        | Writes(assigns_deps) ->
          let bol = Property.Id_contract (Datatype.String.Set.empty,b) in
-         let ip = Extlib.the (Property.ip_of_assigns kf Kglobal bol b.b_assigns)
+         let ip = Option.get (Property.ip_of_assigns kf Kglobal bol b.b_assigns)
          in
          let source = fst (Property.location ip) in
          (* First, check the assigns. *)
@@ -163,7 +163,7 @@ let check_fct_assigns kf ab ~pre_state found_froms =
              let status_txt, status =
                check_from pre_state asgn assigns_zone deps found_froms
              in
-             let ip = Extlib.the (Property.ip_of_from kf Kglobal bol from) in
+             let ip = Option.get (Property.ip_of_from kf Kglobal bol from) in
              let source = fst (asgn.it_content.term_loc) in
              msg_status status ~once:true ~source
                "%a: \\from ... part in assign clause got status %s.%a%t"
diff --git a/src/plugins/value/domains/domain_builder.ml b/src/plugins/value/domains/domain_builder.ml
index af877385426edb598dce3e2d4bcdd901c516bf19..b5561d8fea2702377cc4fea563e46bd4deb46337 100644
--- a/src/plugins/value/domains/domain_builder.ml
+++ b/src/plugins/value/domains/domain_builder.ml
@@ -489,7 +489,7 @@ module Restrict
     | None -> None
     | Some (state, mode) ->
       let assign =
-        Extlib.opt_map (fun (assign, state) -> assign, get_state state) assign
+        Option.map (fun (assign, state) -> assign, get_state state) assign
       in
       Some (Domain.logic_assign assign location state, mode)
 
diff --git a/src/plugins/value/domains/domain_product.ml b/src/plugins/value/domains/domain_product.ml
index 06574e327e6fed7fb945168a33b07b20372d9f98..391b3b6a801715fbe473c2fdbcb1e0b555594202 100644
--- a/src/plugins/value/domains/domain_product.ml
+++ b/src/plugins/value/domains/domain_product.ml
@@ -112,7 +112,7 @@ module Make
       (Right.reduce_further right expr value)
 
   let lift_record side record =
-    let origin = Extlib.opt_map side record.origin in
+    let origin = Option.map side record.origin in
     let reductness =
       match record.reductness, origin with
       | Unreduced, Some (reduced, _) -> reduced
@@ -120,7 +120,7 @@ module Make
       | Reduced, Some (Created, _) -> Created
       | _ as x, _ -> x
     in
-    let origin = Extlib.may_map snd ~dft:None origin in
+    let origin = Option.fold ~some:snd ~none:None origin in
     { record with origin; reductness }
 
   let lift_valuation side valuation =
diff --git a/src/plugins/value/domains/equality/equality_domain.ml b/src/plugins/value/domains/equality/equality_domain.ml
index b04cd0ffa19955c80a0e67c183af5193509399ff..6475f861d9faca3cd2f4d47ffa940e38e16e1c6b 100644
--- a/src/plugins/value/domains/equality/equality_domain.ml
+++ b/src/plugins/value/domains/equality/equality_domain.ml
@@ -260,7 +260,7 @@ module Make
       match Deps.intersects deps zone with
       | [] -> equalities, deps, modified_zone
       | atoms ->
-        let extract_lval h = Extlib.the (HCE.to_lval h) in
+        let extract_lval h = Option.get (HCE.to_lval h) in
         let atoms = List.map extract_lval atoms in
         let process eq atom = Equality.Set.remove kt atom eq in
         let equalities' = List.fold_left process equalities atoms in
diff --git a/src/plugins/value/domains/gauges/gauges_domain.ml b/src/plugins/value/domains/gauges/gauges_domain.ml
index 2f2bcab9c4bce90fd2be0cea767426d5261b29f7..543688032b0413be769eeb7218dbadf009597c92 100644
--- a/src/plugins/value/domains/gauges/gauges_domain.ml
+++ b/src/plugins/value/domains/gauges/gauges_domain.ml
@@ -71,14 +71,14 @@ module G = struct
       Some (Integer.of_int (min n1 n2)), Some (Integer.of_int (max n1 n2))
 
     let enlarge i (b1, b2: t) : t =
-      (Extlib.opt_map (Integer.min i) b1, Extlib.opt_map (Integer.max i) b2)
+      (Option.map (Integer.min i) b1, Option.map (Integer.max i) b2)
 
     let lift fmin fmax (bmin1, bmax1: t) (bmin2, bmax2: t) : t =
       (opt2 fmin bmin1 bmin2, opt2 fmax bmax1 bmax2)
 
     let equal (bmin1, bmax1: t) (bmin2, bmax2: t) =
-      Extlib.opt_equal Integer.equal bmin1 bmin2 &&
-      Extlib.opt_equal Integer.equal bmax1 bmax2
+      Option.equal Integer.equal bmin1 bmin2 &&
+      Option.equal Integer.equal bmax1 bmax2
 
     let is_included (bmin1, bmax1: t) (bmin2, bmax2: t) =
       (match bmin1, bmin2 with
@@ -122,17 +122,17 @@ module G = struct
       | min, max -> `Value (min, max)
 
     let succ (b1, b2: t): t =
-      (Extlib.opt_map Integer.succ b1, Extlib.opt_map Integer.succ b2)
+      (Option.map Integer.succ b1, Option.map Integer.succ b2)
 
     let neg (bmin, bmax: t) : t =
-      Extlib.opt_map Integer.neg bmax, Extlib.opt_map Integer.neg bmin
+      Option.map Integer.neg bmax, Option.map Integer.neg bmin
 
     let mul_ct k (bmin, bmax: t) : t =
       let mul = Integer.mul k in
       if Integer.le k Integer.zero then
-        Extlib.opt_map mul bmax, Extlib.opt_map mul bmin
+        Option.map mul bmax, Option.map mul bmin
       else
-        Extlib.opt_map mul bmin, Extlib.opt_map mul bmax
+        Option.map mul bmin, Option.map mul bmax
 
     let mul (bmin1, bmax1: t) (bmin2, bmax2 as b2: t) : t =
       (* multiplication by infty *)
@@ -161,7 +161,7 @@ module G = struct
        widening of Ival. *)
     let widen ?threshold (min1, max1: t) (min2, max2: t) : t =
       let widen_unstable_min b1 b2 =
-        if Extlib.opt_equal Integer.equal b1 b2 then b1 else None
+        if Option.equal Integer.equal b1 b2 then b1 else None
       in
       let widen_unstable_max b1 b2 =
         match threshold with
@@ -475,7 +475,7 @@ module G = struct
              - invert this interval using the gauges domain, to
                deduce the number of iterations from which we exit
              - use the max of those values as threshold. *)
-          let threshold = Extlib.opt_map Integer.of_int threshold in
+          let threshold = Option.map Integer.of_int threshold in
           let (min, max as w) = Bounds.widen ?threshold i1.nb i2.nb in
           (* Limit min bound to 0 *)
           if min = None then (Some Integer.zero, max) else w
diff --git a/src/plugins/value/domains/offsm_domain.ml b/src/plugins/value/domains/offsm_domain.ml
index cb7c583d9e8aa74a6008cbd9a746de1f3223d8ad..3a09bd25906bc63d5b3ffc834b6b224af85af20a 100644
--- a/src/plugins/value/domains/offsm_domain.ml
+++ b/src/plugins/value/domains/offsm_domain.ml
@@ -73,7 +73,7 @@ module V_Offsetmap = struct
   include Cvalue.V_Offsetmap
 
   let pretty_generic ?typ ?pretty_v ?skip_v ?sep () fmt t =
-    let pretty_v = Extlib.opt_conv V_Or_Uninitialized.pretty_typ pretty_v in
+    let pretty_v = Option.value ~default:V_Or_Uninitialized.pretty_typ pretty_v in
     pretty_generic ?typ ~pretty_v ?skip_v ?sep () fmt t
 end
 
diff --git a/src/plugins/value/domains/printer_domain.ml b/src/plugins/value/domains/printer_domain.ml
index 5ac4d673a2a162642690a757e31bf0b130143f87..1cbaaffae5a6a4bab3db7841641161197fa750bf 100644
--- a/src/plugins/value/domains/printer_domain.ml
+++ b/src/plugins/value/domains/printer_domain.ml
@@ -34,7 +34,7 @@ module Simple : Simpler_domains.Simple_Cvalue = struct
   (* In this domain, the states contain nothing. We use [unit] as type formal
      the state and we reuse [Datatype.Unit] as a base for our domain. *)
   include Datatype.Unit
-  let name = "Printer domain"
+  let name = "printer-domain"
 
   (* --- Lattice operators --- *)
 
diff --git a/src/plugins/value/domains/traces_domain.ml b/src/plugins/value/domains/traces_domain.ml
index cc652e75bf545674a9eafecbe5c24c255c7643b6..6006597e3a143f45b6b8c79988f9786bc30980df 100644
--- a/src/plugins/value/domains/traces_domain.ml
+++ b/src/plugins/value/domains/traces_domain.ml
@@ -145,7 +145,7 @@ end = struct
       if c <> 0 then c else
         let c = Extlib.list_compare ExpStructEq.compare es1 es2 in
         if c <> 0 then c else
-          Extlib.opt_compare Lval.compare lv1 lv2
+          Option.compare Lval.compare lv1 lv2
     | Msg s1, Msg s2 ->
       String.compare s1 s2
     | Loop (stmt1, s1, g1), Loop (stmt2, s2, g2) ->
@@ -887,7 +887,7 @@ module Internal = struct
         | None -> state in
       let exps = List.map (fun arg -> arg.Eval.concrete) call.Eval.arguments in
       let state = Traces.add_trans state
-          (CallDeclared (call.Eval.kf, exps, Extlib.opt_map Cil.var var))
+          (CallDeclared (call.Eval.kf, exps, Option.map Cil.var var))
       in `Value {state with call_declared_function = true}
 
   let finalize_call _stmt call ~pre:_ ~post =
@@ -1107,7 +1107,7 @@ let rec stmts_of_cfg cfg current var_map locals return_exp acc =
 
       | CallDeclared (kf,exps,lval) ->
         let exps = List.map (subst_in_exp var_map) exps in
-        let lval = Extlib.opt_map (subst_in_lval var_map) lval in
+        let lval = Option.map (subst_in_lval var_map) lval in
         let call = Cil.evar ~loc:dummy_loc (subst_in_varinfo var_map (Kernel_function.get_vi kf)) in
         let stmt = Cil.mkStmtOneInstr ~valid_sid (Cil_types.Call(lval,call,exps,dummy_loc)) in
         stmts_of_cfg cfg n var_map locals return_exp (stmt::acc)
@@ -1200,7 +1200,7 @@ let project_of_cfg vreturn s =
 (*     State_selection.full *)
 (*     (State_selection.list_union *)
 (*        (List.map State_selection.with_dependencies *)
-(*           [Cil.Builtin_functions.self; *)
+(*           [Cil_builtins.Builtin_functions.self; *)
 (*            Ast.self; *)
 (*            Frama_c_File.files_pre_register_state])) *)
 (* in *)
diff --git a/src/plugins/value/engine/abstractions.ml b/src/plugins/value/engine/abstractions.ml
index 9e18ff813ba18eefec37dacf9f20523c10489d50..67159ad19c084c224c05344e3ecb315b9988a4d4 100644
--- a/src/plugins/value/engine/abstractions.ml
+++ b/src/plugins/value/engine/abstractions.ml
@@ -270,7 +270,7 @@ module Internal_Value = struct
         | Node (s1, s2) ->
           let set1 = set s1 and set2 = set s2 in
           fun (v1, v2) value -> set1 v1 (set2 v2 value)
-        | Option (s, default) -> fun v -> set s (Extlib.opt_conv default v)
+        | Option (s, default) -> fun v -> set s (Option.value ~default:default v)
         | Unit -> fun () value -> value
         | Void -> void_value ()
       in
@@ -280,7 +280,7 @@ module Internal_Value = struct
 
     let restrict_val =
       let rec get: type v. v structure -> Value.t -> v = function
-        | Leaf (key, _) -> Extlib.the (Value.get key)
+        | Leaf (key, _) -> Option.get (Value.get key)
         | Node (s1, s2) ->
           let get1 = get s1 and get2 = get s2 in
           fun v -> get1 v, get2 v
diff --git a/src/plugins/value/engine/analysis.ml b/src/plugins/value/engine/analysis.ml
index 06c72bf50993d410b025682e5ee4f2ab914a45a9..d1d807098e3f571860d4221bbc4f5c2912f6e10a 100644
--- a/src/plugins/value/engine/analysis.ml
+++ b/src/plugins/value/engine/analysis.ml
@@ -40,10 +40,11 @@ module type Results = sig
   val eval_lval_to_loc: state -> lval -> location evaluated
   val eval_function_exp:
     state -> ?args:exp list -> exp ->  kernel_function list evaluated
+  val assume_cond : stmt -> state -> exp -> bool -> state or_bottom
 end
 
 module type S = sig
-  include Abstractions.S
+  include Abstractions.Eva
   include Results with type state := Dom.state
                    and type value := Val.t
                    and type location := Loc.location
@@ -95,6 +96,11 @@ module Make (Abstract: Abstractions.S) = struct
   let eval_function_exp state ?args e =
     Eval.eval_function_exp e ?args state >>=: (List.map fst)
 
+  let assume_cond stmt state cond positive =
+    fst (Eval.reduce state cond positive) >>- fun valuation ->
+    let dval = Eval.to_domain_valuation valuation in
+    Dom.assume stmt cond positive dval state
+
 end
 
 
@@ -121,9 +127,16 @@ let current_analyzer () = (module (val (snd !ref_analyzer)): S)
    Useful for the GUI parts that depend on it. *)
 module Analyzer_Hook = Hook.Build (struct type t = (module S) end)
 
+(* Set of hooks called whenever the current Analyzer is computed.
+   Useful for the GUI parts that depend on it. *)
+module Computed_Hook = Hook.Build (struct type t = unit end)
+
 (* Register a new hook. *)
 let register_hook = Analyzer_Hook.extend
 
+(* Register a new computed hook. *)
+let register_computed_hook = Computed_Hook.extend
+
 (* Sets the current Analyzer module for a given configuration.
    Calls the hooks above. *)
 let set_current_analyzer config (analyzer: (module Analyzer)) =
@@ -163,7 +176,8 @@ let force_compute () =
   let kf, lib_entry = Globals.entry_point () in
   reset_analyzer ();
   let module Analyzer = (val snd !ref_analyzer) in
-  Analyzer.compute_from_entry_point ~lib_entry kf
+  Analyzer.compute_from_entry_point ~lib_entry kf ;
+  Computed_Hook.apply ()
 
 (* Resets the Analyzer when the current project is changed. *)
 let () =
diff --git a/src/plugins/value/engine/analysis.mli b/src/plugins/value/engine/analysis.mli
index e96f3ed5ea11ade74b0b3a80210df1757d26e5db..50b943ccad73a30eb0d8e41ab94a60e334e471ef 100644
--- a/src/plugins/value/engine/analysis.mli
+++ b/src/plugins/value/engine/analysis.mli
@@ -40,6 +40,7 @@ module type Results = sig
   val eval_lval_to_loc: state -> lval -> location evaluated
   val eval_function_exp:
     state -> ?args:exp list -> exp -> kernel_function list evaluated
+  val assume_cond : stmt -> state -> exp -> bool -> state or_bottom
 end
 
 
@@ -55,7 +56,7 @@ end
 
 
 module type S = sig
-  include Abstractions.S
+  include Abstractions.Eva
   include Results with type state := Dom.state
                    and type value := Val.t
                    and type location := Loc.location
@@ -69,6 +70,10 @@ val register_hook: ((module S) -> unit) -> unit
     is changed. This happens when a new analysis is run with different
     abstractions than before, or when the current project is changed. *)
 
+val register_computed_hook: (unit -> unit) -> unit
+(** Registers a hook that will be called each time the [current] analyzer
+    has been computed. *)
+
 val force_compute : unit -> unit
 (** Perform a full analysis, starting from the [main] function. *)
 
diff --git a/src/plugins/value/engine/compute_functions.ml b/src/plugins/value/engine/compute_functions.ml
index 2e3d42bdb5d29f4e24c625d3902c56a1e2b14d56..de253c37eb857c9121e644bbc185c3defd8002e2 100644
--- a/src/plugins/value/engine/compute_functions.ml
+++ b/src/plugins/value/engine/compute_functions.ml
@@ -192,7 +192,7 @@ module Make (Abstract: Abstractions.Eva) = struct
         Value_parameters.feedback ~once:true
           "@[using specification for function %a@]" Kernel_function.pretty kf;
         let vi = Kernel_function.get_vi kf in
-        if Cil.hasAttribute "fc_stdlib" vi.vattr then
+        if Cil.is_in_libc vi.vattr then
           Library_functions.warn_unsupported_spec vi.vorig_name;
         Spec.compute_using_specification ~warn:true call_kinstr call spec state,
         Value_types.Cacheable
diff --git a/src/plugins/value/engine/evaluation.ml b/src/plugins/value/engine/evaluation.ml
index d4d08981adf244d32f5bbd3fb4c3ddbd90740829..51439e74e98003d30fd65779367e96e5072b5876 100644
--- a/src/plugins/value/engine/evaluation.ml
+++ b/src/plugins/value/engine/evaluation.ml
@@ -411,7 +411,7 @@ module Make
      the comparison. *)
   let reduce_by_double_truth ~alarm (e1, v1) (e2, v2) truth =
     let reduce (new_value1, new_value2) =
-      Extlib.may (fun e1 -> reduce_argument (e1, v1) new_value1) e1;
+      Option.iter (fun e1 -> reduce_argument (e1, v1) new_value1) e1;
       reduce_argument (e2, v2) new_value2;
     in
     process_truth ~reduce ~alarm (v1, v2) truth
@@ -1044,7 +1044,7 @@ module Make
             if Integer.is_zero size
             then `Value index, Alarmset.none
             else
-              let size_expr = Extlib.the array_size in (* array_size exists *)
+              let size_expr = Option.get array_size in (* array_size exists *)
               assume_valid_index ~size ~size_expr ~index_expr index
           with
           | Cil.LenOfArray -> `Value index, Alarmset.none (* unknown array size *)
@@ -1602,10 +1602,14 @@ module Make
 
   (* Aborts the analysis when a function pointer is completely imprecise. *)
   let top_function_pointer funcexp =
+    if not (Value_parameters.Domains.mem "cvalue") then
+      Value_parameters.abort ~current:true
+        "Calls through function pointers are not supported without the cvalue \
+         domain.";
     if Mark_noresults.no_memoization_enabled () then
       Value_parameters.abort ~current:true
         "Function pointer evaluates to anything. Try deactivating \
-         option(s) -no-results, -no-results-function and -obviously-terminates."
+         option(s) -eva-no-results and -eva-no-results-function."
     else
       Value_parameters.fatal ~current:true
         "Function pointer evaluates to anything. function %a"
diff --git a/src/plugins/value/engine/initialization.ml b/src/plugins/value/engine/initialization.ml
index 112681e4f9cc3b3aa0b85ae71ba34022adc383d6..15fa2d09c749278bca530e5b7713f79ba446126a 100644
--- a/src/plugins/value/engine/initialization.ml
+++ b/src/plugins/value/engine/initialization.ml
@@ -370,8 +370,7 @@ module Make
     let print_base base =
       try
         let varinfo = Base.to_varinfo base in
-        not (Cil.hasAttribute "fc_stdlib" varinfo.vattr
-             || Cil.hasAttribute "fc_stdlib_generated" varinfo.vattr)
+        not (Cil.is_in_libc varinfo.vattr)
       with Base.Not_a_C_variable -> true
     in
     let cvalue_state =
diff --git a/src/plugins/value/engine/iterator.ml b/src/plugins/value/engine/iterator.ml
index 76aebc1ebb0ad82d3e10c70117d0f2850d625394..a7862968059399ccb8f624c7bfe34393d633bbc4 100644
--- a/src/plugins/value/engine/iterator.ml
+++ b/src/plugins/value/engine/iterator.ml
@@ -333,7 +333,7 @@ module Make_Dataflow
       match return_exp with
       | None -> id
       | Some return_exp ->
-        let vi_ret = Extlib.the (Library_functions.get_retres_vi kf) in
+        let vi_ret = Option.get (Library_functions.get_retres_vi kf) in
         let return_lval = Var vi_ret, NoOffset in
         let kstmt = Kstmt stmt in
         fun state ->
@@ -399,7 +399,7 @@ module Make_Dataflow
       | _ -> flow
     in
     (* Loop transitions *)
-    let the_stmt v = Extlib.the v.vertex_start_of in
+    let the_stmt v = Option.get v.vertex_start_of in
     let enter_loop f v =
       let f = Partition.enter_loop f (the_stmt v) in
       Partition.transfer (lift (Domain.enter_loop (the_stmt v))) f
@@ -479,7 +479,7 @@ module Make_Dataflow
              in this function. *)
           Partition.transfer (transfer_annotations stmt ~record:false) flow
         in
-        Extlib.may_map correct_over_widening ~dft:flow v.vertex_start_of
+        Option.fold ~some:correct_over_widening ~none:flow v.vertex_start_of
       end else
         flow
     in
diff --git a/src/plugins/value/engine/mem_exec.ml b/src/plugins/value/engine/mem_exec.ml
index 423bf04634fc106dc9b6031581b6467363fdd28c..31f4b9fb2150d5bcdfc16ca79fe671b187d99dbc 100644
--- a/src/plugins/value/engine/mem_exec.ml
+++ b/src/plugins/value/engine/mem_exec.ml
@@ -198,7 +198,7 @@ module Make
         (* Adds the fake varinfo used for the result of [kf] to the
            output_bases. *)
         let return_varinfo = Library_functions.get_retres_vi kf in
-        let return_base = Extlib.opt_map Base.of_varinfo return_varinfo in
+        let return_base = Option.map Base.of_varinfo return_varinfo in
         let all_output_bases =
           Extlib.opt_fold Base.Hptset.add return_base all_output_bases
         in
diff --git a/src/plugins/value/engine/subdivided_evaluation.ml b/src/plugins/value/engine/subdivided_evaluation.ml
index 42e1eec994ff1e24401c645959e19246e03eec3c..f8cd150852485631688939f48782d496a9463ce4 100644
--- a/src/plugins/value/engine/subdivided_evaluation.ml
+++ b/src/plugins/value/engine/subdivided_evaluation.ml
@@ -231,7 +231,9 @@ let compare_bound ival_compare_bound v1 v2 =
       let f1 = Cvalue.V.project_ival v1 in
       let f2 = Cvalue.V.project_ival v2 in
       ival_compare_bound f1 f2
-    with Cvalue.V.Not_based_on_null -> assert false
+    (* Cannot compare pointers. This case can however happens on subdivisions
+       of a pointer subexpression to reduce a bigger numeric expression. *)
+    with Cvalue.V.Not_based_on_null -> 0
 
 let has_greater_min_bound = compare_bound Ival.has_greater_min_bound
 let has_smaller_max_bound = compare_bound Ival.has_smaller_max_bound
diff --git a/src/plugins/value/engine/transfer_specification.ml b/src/plugins/value/engine/transfer_specification.ml
index 4521648ffbbe9efce1e5e6a20a06226aba7309fb..331556aa7aef345953d08eda98b8e79f934f3d90 100644
--- a/src/plugins/value/engine/transfer_specification.ml
+++ b/src/plugins/value/engine/transfer_specification.ml
@@ -127,9 +127,9 @@ let reduce_to_valid_location out loc =
   if Locations.(Location_Bits.(equal top loc.loc)) then
     begin
       Value_parameters.error ~once:true ~current:true
-        "Cannot@ handle@ %a,@ location@ is@ too@ imprecise@ \
-         (%a).@ Assuming@ it@ is@ not@ assigned,@ but@ be@ aware@ this\
-         @ is@ incorrect." pp_assign_free_alloc out Locations.pretty loc;
+        "@[Cannot handle@ %a,@ location is too imprecise@ (%a).@ \
+         Assuming it is not assigned,@ but be aware@ this is incorrect.@]"
+        pp_assign_free_alloc out Locations.pretty loc;
       None
     end
   else
@@ -247,7 +247,7 @@ module Make
     then retres_loc
     else
       let ploc = precise_loc_of_assign env logic_assign in
-      Extlib.opt_map (fun ploc -> set_location ploc Location.top) ploc
+      Option.map (fun ploc -> set_location ploc Location.top) ploc
 
   (* From a list of assigns, allocates or frees clauses, builds a list
      associating each clause to the location it affects. Removes clauses that
@@ -291,7 +291,7 @@ module Make
           Value_parameters.warning ~current:true ~once:true
             ~wkey:Value_parameters.wkey_garbled_mix
             "The specification of function %a has generated a garbled mix \
-             for assigns clause %a."
+             for %a."
             Kernel_function.pretty kf pp_assign_free_alloc assign
         end
     in
@@ -310,7 +310,7 @@ module Make
     States.join states >>- fun pre_state ->
     Locations.Location_Bytes.do_track_garbled_mix false;
     let behavior = List.hd behaviors in
-    let retres_loc = Extlib.opt_map Location.eval_varinfo result in
+    let retres_loc = Option.map Location.eval_varinfo result in
     let assigns = get_assigns_for_behavior spec behavior in
     let allocs = get_allocation_for_behavior spec behavior in
     let compute = apply_assigns_and_allocations retres_loc (assigns @ allocs) in
diff --git a/src/plugins/value/eval.ml b/src/plugins/value/eval.ml
index 61d51f7054a04e6b989b76bdf66036324cb77a9e..6aa0b6a0fe071bb8e1af643cac64c0a5e31918fc 100644
--- a/src/plugins/value/eval.ml
+++ b/src/plugins/value/eval.ml
@@ -158,7 +158,7 @@ let compute_englobing_subexpr ~subexpr ~expr =
           merge (compute_host host) (compute_offset offset)
         | _ -> None
       in
-      Extlib.opt_map (fun l -> expr :: l) sublist
+      Option.map (fun l -> expr :: l) sublist
   and compute_host = function
     | Var _ -> None
     | Mem e -> compute e
@@ -168,7 +168,7 @@ let compute_englobing_subexpr ~subexpr ~expr =
     | Index (index, offset) ->
       merge (compute index) (compute_offset offset)
   in
-  Extlib.opt_conv [] (compute expr)
+  Option.value ~default:[] (compute expr)
 
 module Englobing =
   Datatype.Pair_with_collections (Cil_datatype.ExpStructEq) (Cil_datatype.ExpStructEq)
diff --git a/src/plugins/value/gui_files/gui_callstacks_manager.ml b/src/plugins/value/gui_files/gui_callstacks_manager.ml
index bbb192034aa53b3582b4ecdc77789c03864cd1e8..10331bacd8e173dfa5e8479d97af336b19c5ca30 100644
--- a/src/plugins/value/gui_files/gui_callstacks_manager.ml
+++ b/src/plugins/value/gui_files/gui_callstacks_manager.ml
@@ -399,7 +399,7 @@ module Make (Input: Input) = struct
     in
     let col_empty = w#add_column_empty in
     let clear_widget remove_columns =
-      Extlib.may (fun (_, r) -> r.selected <- RUnselected) model.row_selected;
+      Option.iter (fun (_, r) -> r.selected <- RUnselected) model.row_selected;
       model.row_selected <- None;
       if remove_columns then begin
         model.all_exprs <- [];
@@ -428,7 +428,7 @@ module Make (Input: Input) = struct
       model.hidden_columns <- [];
     in
     let start_session loc ~multiple =
-      if not (multiple && Extlib.opt_equal gui_loc_equal (Some loc) model.loc)
+      if not (multiple && Option.equal gui_loc_equal (Some loc) model.loc)
       then begin
         clear_model ();
         model.loc <- Some loc;
@@ -595,7 +595,7 @@ module Make (Input: Input) = struct
     (* Callback called when a callstack is focused or unfocused *)
     let callback_focus_unfocus lcs icon () =
       let conv = List.map Gui_callstacks_filters.from_callstack in
-      let lrcs = Extlib.opt_map conv lcs in
+      let lrcs = Option.map conv lcs in
       callback_focus_callstack lrcs;
       icon ~filtered:(lcs <> None);
       model.focused_rev_callstacks <- lrcs;
@@ -603,7 +603,7 @@ module Make (Input: Input) = struct
     in
     (* Add 'Unfocus callstacks' option to menu. *)
     let add_unfocus_callstacks menu icon =
-      if Extlib.has_some model.focused_rev_callstacks then begin
+      if Option.is_some model.focused_rev_callstacks then begin
         let unfocus = GMenu.menu_item ~label:"Unfocus callstack(s)" () in
         (!!menu)#add unfocus;
         ignore (unfocus#connect#activate (callback_focus_unfocus None icon))
@@ -697,7 +697,7 @@ module Make (Input: Input) = struct
       ignore (different#connect#activate (callback_only_except false));
       (* add menu items for variables present in the selected expression *)
       let callback_display_var vi () =
-        Extlib.may (fun loc ->
+        Option.iter (fun loc ->
             let lval = Cil.var vi in
             let selection = GS_LVal lval in
             let list = Input.make_data_for_lvalue lval loc in
diff --git a/src/plugins/value/gui_files/gui_types.ml b/src/plugins/value/gui_files/gui_types.ml
index d8eea3776d22e9ad7c044a67bc97f808888f7862..e6b64d5a8e73e16f6e43b4dfbfc6f70458b5b6ee 100644
--- a/src/plugins/value/gui_files/gui_types.ml
+++ b/src/plugins/value/gui_files/gui_types.ml
@@ -148,10 +148,10 @@ module Make (V: Abstractions.Value) = struct
     | GR_Empty, GR_Empty -> true
     | GR_Offsm (o1, typ1), GR_Offsm (o2, typ2) ->
       equal_gui_offsetmap_res o1 o2 &&
-      Extlib.opt_equal Cil_datatype.Typ.equal typ1 typ2
+      Option.equal Cil_datatype.Typ.equal typ1 typ2
     | GR_Value (v1, typ1), GR_Value (v2, typ2) ->
       Eval.Flagged_Value.equal V.equal v1 v2 &&
-      Extlib.opt_equal Cil_datatype.Typ.equal typ1 typ2
+      Option.equal Cil_datatype.Typ.equal typ1 typ2
     | GR_Status s1, GR_Status s2 -> Extlib.compare_basic s1 s2 = 0
     | GR_Zone z1, GR_Zone z2 -> Locations.Zone.equal z1 z2
     | (GR_Empty | GR_Offsm _ | GR_Value _  | GR_Status _ | GR_Zone _), _ -> false
diff --git a/src/plugins/value/gui_files/register_gui.ml b/src/plugins/value/gui_files/register_gui.ml
index 19d46c75109c13781b61f0069a2258aa9b916ec6..3e6c0551b74a9198e481e71ee9f6572ffc520511 100644
--- a/src/plugins/value/gui_files/register_gui.ml
+++ b/src/plugins/value/gui_files/register_gui.ml
@@ -231,7 +231,7 @@ let cleaned_outputs kf s =
     Callgraph.Uses.accept_base ~with_formals:true ~with_locals:true kf
   in
   let filter = Locations.Zone.filter_base accept in
-  Extlib.opt_map filter outs
+  Option.map filter outs
 
 let pretty_stmt_info (main_ui:main_ui) kf stmt =
   (* Is it an accessible statement ? *)
diff --git a/src/plugins/value/legacy/eval_annots.ml b/src/plugins/value/legacy/eval_annots.ml
index 978309b89bba0f5296392d41e793d4783e1be46f..2c1c9b875bcf119b441ac20937f7a57c8d245e82 100644
--- a/src/plugins/value/legacy/eval_annots.ml
+++ b/src/plugins/value/legacy/eval_annots.ml
@@ -90,7 +90,7 @@ let mark_unreachable () =
         in
         match stmt.skind with
         | Instr (Call (_, e, _, _)) ->
-          Extlib.may mark_status (Kernel_function.get_called e)
+          Option.iter mark_status (Kernel_function.get_called e)
         | Instr(Local_init(_, ConsInit(f,_,_),_)) ->
           mark_status (Globals.Functions.get f)
         | _ -> ()
diff --git a/src/plugins/value/legacy/eval_terms.ml b/src/plugins/value/legacy/eval_terms.ml
index b3893e9dc18e6b3dfc5a5623c1221f851f26176d..462e57405d35859dd5e0aeb0028e6412250685ef 100644
--- a/src/plugins/value/legacy/eval_terms.ml
+++ b/src/plugins/value/legacy/eval_terms.ml
@@ -548,7 +548,7 @@ let constraint_trange idx size_arr =
     match idx.term_node with
     | Trange ((None as low), up) | Trange (low, (None as up)) -> begin
         let loc = idx.term_loc in
-        match Extlib.opt_bind Cil.constFoldToInt size_arr with
+        match Option.bind size_arr Cil.constFoldToInt with
         | None -> idx
         | Some size ->
           let low = match low with (* constrained l.h.s *)
@@ -576,7 +576,7 @@ let apply_logic_builtin builtin env args_list =
   match res with
   | None -> None
   | Some offsm ->
-    let v = Extlib.the (Cvalue.V_Offsetmap.single_interval_value offsm) in
+    let v = Option.get (Cvalue.V_Offsetmap.single_interval_value offsm) in
     let v = Cvalue.V_Or_Uninitialized.get_v v in
     Some (v, alarms)
 
@@ -654,11 +654,11 @@ let eval_is_allocable size =
 (* returns true iff the logic variable is defined by the
    Frama-C standard library *)
 let comes_from_fc_stdlib lvar =
-  Cil.hasAttribute "fc_stdlib" lvar.lv_attr ||
+  Cil.is_in_libc lvar.lv_attr ||
   match lvar.lv_origin with
   | None -> false
   | Some vi ->
-    Cil.hasAttribute "fc_stdlib" vi.vattr
+    Cil.is_in_libc vi.vattr
 
 (* As usual in this file, [dst_typ] may be misleading: the 'size' is
    meaningless, because [src_typ] may actually be a logic type. Thus,
@@ -1250,7 +1250,7 @@ and eval_toffset ~alarm_mode env typ toffset =
 
   | TField (fi, remaining) ->
     let size_current default =
-      try Ival.of_int (fst (Cil.bitsOffset typ (Field(fi, NoOffset))))
+      try Ival.of_int (fst (Cil.fieldBitsOffset fi))
       with Cil.SizeOfError _ -> default
     in
     let attrs = Cil.filter_qualifier_attributes (Cil.typeAttrs typ) in
diff --git a/src/plugins/value/partitioning/partition.ml b/src/plugins/value/partitioning/partition.ml
index 977dce271f250ef31d7da65a587b79bb650753f6..f51bc89c5e108f5a29c2a3b8751d5141d6cf050a 100644
--- a/src/plugins/value/partitioning/partition.ml
+++ b/src/plugins/value/partitioning/partition.ml
@@ -109,7 +109,7 @@ struct
     let compare_split (i1,_m1) (i2,_m2) =
       Integer.compare i1 i2
     in
-    Extlib.opt_compare IntPair.compare k1.ration_stamp k2.ration_stamp
+    Option.compare IntPair.compare k1.ration_stamp k2.ration_stamp
     <?> (LoopList.compare, k1.loops, k2.loops)
     <?> (ExpMap.compare compare_split, k1.static_split, k2.static_split)
     <?> (ExpMap.compare compare_split, k1.dynamic_split, k2.dynamic_split)
diff --git a/src/plugins/value/partitioning/trace_partitioning.ml b/src/plugins/value/partitioning/trace_partitioning.ml
index aa261fbfb890783b248911262389a36d58672f04..e84524ecd9f9ec1303a0b329ddd869a16a84f32d 100644
--- a/src/plugins/value/partitioning/trace_partitioning.ml
+++ b/src/plugins/value/partitioning/trace_partitioning.ml
@@ -90,7 +90,7 @@ struct
 
   let empty_widening ~(stmt : stmt option) : widening =
     {
-      widening_stmt = Extlib.opt_conv Cil.invalidStmt stmt;
+      widening_stmt = Option.value ~default:Cil.invalidStmt stmt;
       widening_partition = Partition.empty;
     }
 
@@ -286,7 +286,7 @@ struct
       let add s =
         dest.store_partition <- Partition.replace key s dest.store_partition;
       in
-      Extlib.may add state;
+      Option.iter add state;
       (* Filter out already propagated states (only at statements). *)
       if dest.store_stmt = None
       then state
@@ -294,7 +294,7 @@ struct
     in
     let flow = Flow.join_duplicate_keys flow_states in
     let flow = Flow.filter_map update flow in
-    Extlib.may (partitioning_feedback dest flow) dest.store_stmt;
+    Option.iter (partitioning_feedback dest flow) dest.store_stmt;
     flow
 
   let widen (w : widening) (flow : flow) : flow =
diff --git a/src/plugins/value/register.ml b/src/plugins/value/register.ml
index 00dc42fad17577e1bf50f5a2c2114c41342b46a7..8679669d8ecd06b45559f4c4c73016125022d21f 100644
--- a/src/plugins/value/register.ml
+++ b/src/plugins/value/register.ml
@@ -233,7 +233,7 @@ and eval_deps_offset state o = match o with
     Locations.Zone.join (eval_deps state i) (eval_deps_offset state o)
 
 let notify_opt with_alarms alarms =
-  Extlib.may (fun mode -> Alarmset.notify mode alarms) with_alarms
+  Option.iter (fun mode -> Alarmset.notify mode alarms) with_alarms
 
 let eval_expr_with_valuation ?with_alarms deps state expr=
   let state = inject_cvalue state in
@@ -379,7 +379,7 @@ module Export (Eval : Eval) = struct
         state
         lv
     in
-    Extlib.opt_conv Locations.Zone.bottom deps, r
+    Option.value ~default:Locations.Zone.bottom deps, r
 
   let lval_to_loc_with_deps kinstr ?with_alarms ~deps lv =
     let state = Db.Value.noassert_get_state kinstr in
@@ -394,7 +394,7 @@ module Export (Eval : Eval) = struct
       lval_to_precise_loc_deps_state ?with_alarms
         ~deps ~reduce_valid_index:(Kernel.SafeArrays.get ()) state lv
     in
-    let deps = Extlib.opt_conv Locations.Zone.bottom deps in
+    let deps = Option.value ~default:Locations.Zone.bottom deps in
     deps, ploc
 
   let lval_to_precise_loc_with_deps_state =
@@ -450,7 +450,7 @@ module Export (Eval : Eval) = struct
 
   let expr_to_kernel_function_state ?with_alarms state ~deps exp =
     let r, deps = resolv_func_vinfo ?with_alarms deps state exp in
-    Extlib.opt_conv Locations.Zone.bottom deps, r
+    Option.value ~default:Locations.Zone.bottom deps, r
 
   let expr_to_kernel_function kinstr ?with_alarms ~deps exp =
     let state_to_joined_kernel_function state (z_acc, kf_acc) =
diff --git a/src/plugins/value/utils/eva_annotations.ml b/src/plugins/value/utils/eva_annotations.ml
index 600a28b386b1a43bc6db77eda4d9c015471fa0bd..7fea184b5381034aae7a5889cad6705fdfe740ab 100644
--- a/src/plugins/value/utils/eva_annotations.ml
+++ b/src/plugins/value/utils/eva_annotations.ml
@@ -290,7 +290,7 @@ module Allocation = struct
           (* Be kind and return By_stack by default. Someone is bound to write a
              visitor that will simplify our term into something unrecognizable. *)
           begin match term_node with
-            | TConst (LStr s) -> Extlib.opt_conv By_stack (of_string s)
+            | TConst (LStr s) -> Option.value ~default:By_stack (of_string s)
             | _ -> By_stack
           end
         | _ -> assert false
@@ -301,7 +301,7 @@ module Allocation = struct
 
   let get stmt =
     match get stmt with
-    | [] -> Extlib.the (of_string (Value_parameters.AllocBuiltin.get ()))
+    | [] -> Option.get (of_string (Value_parameters.AllocBuiltin.get ()))
     | [x] -> x
     | x :: _ ->
       Value_parameters.warning ~current:true ~once:true
diff --git a/src/plugins/value/utils/mark_noresults.ml b/src/plugins/value/utils/mark_noresults.ml
index 954752b066e08ae1b48e0dfdd23f69a725fabe0b..f74e85308e6a440c1c54c12514fabe38d3512dbf 100644
--- a/src/plugins/value/utils/mark_noresults.ml
+++ b/src/plugins/value/utils/mark_noresults.ml
@@ -26,7 +26,8 @@ let should_memorize_function f =
          f (Value_parameters.NoResultsFunctions.get ()))
 
 let () = Db.Value.no_results :=
-    (fun fd -> not (should_memorize_function fd))
+    (fun fd -> not (should_memorize_function fd)
+               || not (Value_parameters.Domains.mem "cvalue"))
 
 (* Signal that some results are not stored. The gui, or some calls to
    Db.Value, may fail ungracefully *)
diff --git a/src/plugins/value/utils/structure.ml b/src/plugins/value/utils/structure.ml
index 197bad845fccfff841887077319631212f0f0c40..a3920f589d46a3a9d9579f9b16983de8209e6cb4 100644
--- a/src/plugins/value/utils/structure.ml
+++ b/src/plugins/value/utils/structure.ml
@@ -164,7 +164,7 @@ module Open
       KMap.union (fun _k a _b -> Some a) l r
     | Option (s, default) ->
       let l = compute_getters s in
-      KMap.map (lift_get (Extlib.opt_conv default)) l
+      KMap.map (lift_get (Option.value ~default:default)) l
 
   let getters = compute_getters M.structure
   let get (type a) (key: a Shape.key) : (M.t -> a) option =
@@ -192,7 +192,7 @@ module Open
       KMap.union (fun _k a _b -> Some a) l r
     | Option (s, _) ->
       let l = compute_setters s in
-      KMap.map (lift_set Extlib.opt_map) l
+      KMap.map (lift_set Option.map) l
 
   let setters = compute_setters M.structure
   let set (type a) (key: a Shape.key) : (a -> M.t -> M.t) =
diff --git a/src/plugins/value/utils/value_results.ml b/src/plugins/value/utils/value_results.ml
index 6138cf6f8591bf41d5e0b8f267463980879570b5..8a30f2895b3ebbfb4028458a8a10dcf4d9756dae 100644
--- a/src/plugins/value/utils/value_results.ml
+++ b/src/plugins/value/utils/value_results.ml
@@ -358,10 +358,9 @@ open Cil_types
 let plural count = if count = 1 then "" else "s"
 
 let consider_function vi =
-  not (Cil.is_builtin vi
-       || Cil.is_special_builtin vi.vname
-       || Cil.hasAttribute "fc_stdlib" vi.vattr
-       || Cil.hasAttribute "fc_stdlib_generated" vi.vattr)
+  not (Cil_builtins.is_builtin vi
+       || Cil_builtins.is_special_builtin vi.vname
+       || Cil.is_in_libc vi.vattr)
 
 let print_coverage fmt =
   let dead_function, reachable_function = ref 0, ref 0
diff --git a/src/plugins/value/utils/value_util.ml b/src/plugins/value/utils/value_util.ml
index 7b8a986b885b4b5878526fae43a99056671757cf..6a31f40a376c9bebb12bd3bab67714ca9bb6725a 100644
--- a/src/plugins/value/utils/value_util.ml
+++ b/src/plugins/value/utils/value_util.ml
@@ -335,7 +335,7 @@ and height_offset = function
 let skip_specifications kf =
   Value_parameters.SkipLibcSpecs.get () &&
   Kernel_function.is_definition kf &&
-  Cil.hasAttribute "fc_stdlib" (Kernel_function.get_vi kf).vattr
+  Cil.is_in_libc (Kernel_function.get_vi kf).vattr
 
 (*
 Local Variables:
diff --git a/src/plugins/value/utils/widen_hints_ext.ml b/src/plugins/value/utils/widen_hints_ext.ml
index bcf81060871baa6be4ebedb8cc8b013dfb035a51..449c0c6752086703c4c64693744deefdf8414abd 100644
--- a/src/plugins/value/utils/widen_hints_ext.ml
+++ b/src/plugins/value/utils/widen_hints_ext.ml
@@ -148,6 +148,7 @@ let printer _pp fmt ext =
   match ext with
   | Ext_id _ -> assert false
   | Ext_preds _ -> assert false
+  | Ext_annot _ -> assert false
   | Ext_terms terms ->
     match widen_hint_terms_of_terms terms with
     | Some (hint_lval, hint_terms) ->
diff --git a/src/plugins/value/value_parameters.ml b/src/plugins/value/value_parameters.ml
index 1446dd8d796c00da0756d64a22a00301a6bbaa0f..df4428ee75a433d53cc23d1ced1a4a1525d9a02f 100644
--- a/src/plugins/value/value_parameters.ml
+++ b/src/plugins/value/value_parameters.ml
@@ -523,7 +523,8 @@ module IgnoreRecursiveCalls =
     (struct
       let option_name = "-eva-ignore-recursive-calls"
       let help =
-        "Pretend function calls that would be recursive do not happen. Causes unsoundness"
+        "Pretend function calls that would be recursive do not happen. \
+         Causes unsoundness"
     end)
 let () = add_correctness_dep IgnoreRecursiveCalls.parameter
 
@@ -535,9 +536,9 @@ module WarnCopyIndeterminate =
       let option_name = "-eva-warn-copy-indeterminate"
       let arg_name = "f | @all"
       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'."
+                  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.Category.(set_default (all ()))
@@ -574,7 +575,8 @@ 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
@@ -586,7 +588,8 @@ 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
@@ -609,9 +612,9 @@ module InitializationPaddingGlobals =
       let option_name = "-eva-initialization-padding-globals"
       let arg_name = "yes|no|maybe"
       let help = "Specify how padding bits are initialized inside global \
-                  variables. Possible values are <yes> (padding is fully initialized), \
-                  <no> (padding is completely uninitialized), or <maybe> \
-                  (padding may be uninitialized). Default is <yes>."
+                  variables. Possible values are <yes> (padding is fully \
+                  initialized), <no> (padding is completely uninitialized), or \
+                  <maybe> (padding may be uninitialized). Default is <yes>."
     end)
 let () = InitializationPaddingGlobals.set_possible_values ["yes"; "no"; "maybe"]
 let () = add_correctness_dep InitializationPaddingGlobals.parameter
@@ -631,9 +634,9 @@ module DescendingIteration =
       let option_name = "-eva-descending-iteration"
       let arg_name = "no|exits|full"
       let help = "Experimental. After hitting a postfix point, try to improve \
-                  the precision with either a <full> iteration or an iteration from loop \
-                  head to exit paths (<exits>) or do not try anything (<no>). Default \
-                  is <no>."
+                  the precision with either a <full> iteration or an iteration \
+                  from loop head to exit paths (<exits>) or do not try anything \
+                  (<no>). Default is <no>."
     end)
 let () = DescendingIteration.set_possible_values ["no" ; "exits" ; "full"]
 let () = add_precision_dep DescendingIteration.parameter
@@ -645,9 +648,9 @@ module HierarchicalConvergence =
     (struct
       let option_name = "-eva-hierarchical-convergence"
       let help = "Experimental and unsound. Separate the convergence process \
-                  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."
+                  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)
 let () = add_precision_dep HierarchicalConvergence.parameter
 
@@ -701,13 +704,13 @@ module SlevelFunction =
       include Datatype.Int
       type key = Cil_types.kernel_function
       let of_string ~key:_ ~prev:_ s =
-        Extlib.opt_map
+        Option.map
           (fun s ->
              try int_of_string s
              with Failure _ ->
                raise (Cannot_build ("'" ^ s ^ "' is not an integer")))
           s
-      let to_string ~key:_ = Extlib.opt_map string_of_int
+      let to_string ~key:_ = Option.map string_of_int
     end)
     (struct
       let option_name = "-eva-slevel-function"
@@ -725,7 +728,7 @@ module SlevelMergeAfterLoop =
       let arg_name = "f | @all"
       let help =
         "When set, the different execution paths that originate from the body \
-         of a loop are merged before entering the next excution."
+         of a loop are merged before entering the next execution."
     end)
 let () = add_precision_dep SlevelMergeAfterLoop.parameter
 
@@ -819,11 +822,11 @@ module SplitReturnFunction =
       include Split_strategy
       type key = Cil_types.kernel_function
       let of_string ~key:_ ~prev:_ s =
-        try Extlib.opt_map Split_strategy.of_string s
+        try Option.map Split_strategy.of_string s
         with Split_strategy.ParseFailure s ->
           raise (Cannot_build ("unknown split strategy " ^ s))
       let to_string ~key:_ v =
-        Extlib.opt_map Split_strategy.to_string v
+        Option.map Split_strategy.to_string v
     end)
     (struct
       let option_name = "-eva-split-return-function"
@@ -960,13 +963,13 @@ module LinearLevelFunction =
       include Datatype.Int
       type key = Cil_types.kernel_function
       let of_string ~key:_ ~prev:_ s =
-        Extlib.opt_map
+        Option.map
           (fun s ->
              try int_of_string s
              with Failure _ ->
                raise (Cannot_build ("'" ^ s ^ "' is not an integer")))
           s
-      let to_string ~key:_ = Extlib.opt_map string_of_int
+      let to_string ~key:_ = Option.map string_of_int
     end)
     (struct
       let option_name = "-eva-subdivide-non-linear-function"
@@ -1029,8 +1032,8 @@ module ArrayPrecisionLevel =
       let option_name = "-eva-plevel"
       let arg_name = "n"
       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)"
+                  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
@@ -1054,7 +1057,8 @@ module ValShowPerf =
   False
     (struct
       let option_name = "-eva-show-perf"
-      let help = "Compute and show 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 () = Parameter_customize.set_group messages
@@ -1077,7 +1081,8 @@ module ShowSlevel =
       let option_name = "-eva-show-slevel"
       let default = 100
       let arg_name = "n"
-      let help = "Period for showing consumption of the alloted slevel during analysis"
+      let help = "Period for showing consumption of the allotted slevel during \
+                  analysis"
     end)
 let () = ShowSlevel.set_range ~min:1 ~max:max_int
 
diff --git a/src/plugins/value/values/cvalue_backward.ml b/src/plugins/value/values/cvalue_backward.ml
index e97975c050f33847eb9ab812b7681dd24ab44e3f..c62d074837875f584808bb5e3e2b0b0547fb0ebf 100644
--- a/src/plugins/value/values/cvalue_backward.ml
+++ b/src/plugins/value/values/cvalue_backward.ml
@@ -228,6 +228,34 @@ let backward_bor ~v1 ~v2 ~res =
   in
   backward_bor_aux v1 v2, backward_bor_aux v2 v1
 
+let backward_land ~v1 ~v2 ~res =
+  if V.is_zero res then
+    match V.contains_zero v1, V.contains_zero v2 with
+    | true, true -> None
+    | false, false -> Some (V.bottom, V.bottom)
+    | true, false -> Some (V.singleton_zero, v2)
+    | false, true -> Some (v1, V.singleton_zero)
+  else if V.contains_zero res then
+    None
+  else
+    let v1' = V.(diff v1 singleton_zero)
+    and v2' = V.(diff v2 singleton_zero) in
+    if V.equal v1 v1' && V.equal v2 v2' then None else Some (v1', v2')
+
+let backward_lor ~v1 ~v2 ~res =
+  if V.is_zero res then
+    if V.is_zero v1 && V.is_zero v2
+    then None
+    else Some (V.singleton_zero, V.singleton_zero)
+  else if V.contains_zero res then
+    None
+  else
+    match V.is_zero v1, V.is_zero v2 with
+    | false, false -> None
+    | true, true -> Some (V.bottom, V.bottom)
+    | true, false -> Some (v1, V.diff v2 V.singleton_zero)
+    | false, true -> Some (V.diff v1 V.singleton_zero, v2)
+
 let backward_binop ~typ_res ~res_value ~typ_e1 v1 binop v2 =
   let typ = Cil.unrollType typ_res in
   match binop, typ with
@@ -303,6 +331,9 @@ let backward_binop ~typ_res ~res_value ~typ_e1 v1 binop v2 =
 
   | BOr, TInt _ -> Some (backward_bor ~v1 ~v2 ~res:res_value)
 
+  | LAnd, TInt _ -> backward_land ~v1 ~v2 ~res:res_value
+  | LOr, TInt _ -> backward_lor ~v1 ~v2 ~res:res_value
+
   | _, _ -> None
 
 let backward_unop ~typ_arg op ~arg:_ ~res =
diff --git a/src/plugins/value/values/main_locations.ml b/src/plugins/value/values/main_locations.ml
index 30069d98a9ef24037534ee12cdc43ccb1fa508d0..298f1b1698650bbc4b667439083ee6c96c211b04 100644
--- a/src/plugins/value/values/main_locations.ml
+++ b/src/plugins/value/values/main_locations.ml
@@ -20,8 +20,6 @@
 (*                                                                        *)
 (**************************************************************************)
 
-open Cil_types
-
 module PLoc = struct
 
   type value = Cvalue.V.t
@@ -70,10 +68,10 @@ module PLoc = struct
 
   let no_offset = Precise Precise_locs.offset_zero
 
-  let forward_field typ field = function
+  let forward_field _typ field = function
     | Precise offset ->
       begin try
-          let field = fst (Cil.bitsOffset typ (Field (field, NoOffset))) in
+          let field = fst (Cil.fieldBitsOffset field) in
           let field_i = Integer.of_int field in
           Precise (Precise_locs.shift_offset_by_singleton field_i offset)
         with Cil.SizeOfError _ -> Precise (Precise_locs.offset_top)
@@ -189,12 +187,12 @@ module PLoc = struct
       then `Bottom
       else `Value (new_mem, Precise new_off)
 
-  let backward_field typ field = function
+  let backward_field _typ field = function
     | Imprecise _ as x -> `Value x
     | Precise offset ->
       begin try
           let offset_ival = Precise_locs.imprecise_offset offset in
-          let field = fst (Cil.bitsOffset typ (Field (field, NoOffset))) in
+          let field = fst (Cil.fieldBitsOffset field) in
           let field_i = Integer.of_int (- field) in
           let ival = Ival.add_singleton_int field_i offset_ival in
           if Ival.is_bottom ival
diff --git a/src/plugins/value_types/cvalue.ml b/src/plugins/value_types/cvalue.ml
index 4d817854fc534d2de8746f3568c46352a94f8707..21270215c447bb13db449dfdc217555106b93c7f 100644
--- a/src/plugins/value_types/cvalue.ml
+++ b/src/plugins/value_types/cvalue.ml
@@ -85,17 +85,17 @@ module V = struct
 
   let is_imprecise v =
     match v with
-      | Top _ -> true
-      | _ -> false
+    | Top _ -> true
+    | _ -> false
 
-  let is_topint v = equal top_int v 
+  let is_topint v = equal top_int v
 
   let is_bottom v = equal bottom v
 
   let is_isotropic v =
     match v with
-      | Top _ -> true
-      | Map _ -> is_topint v || is_bottom v || is_zero v
+    | Top _ -> true
+    | Map _ -> is_topint v || is_bottom v || is_zero v
 
   let contains_zero loc =
     let offset_contains_zero base offset =
@@ -141,7 +141,7 @@ module V = struct
      [typ]. Whenever possible, we print real addresses instead of bytes
      offsets. *)
   let pretty_base_offsets_typ typ fmt b i =
-    let typ_match = match Extlib.opt_map Cil.unrollType typ with
+    let typ_match = match Option.map Cil.unrollType typ with
       | Some (TPtr (typ_pointed, _)) ->
         if Cil.isVoidType typ_pointed then None else Some typ_pointed
       | _ -> None
@@ -192,8 +192,8 @@ module V = struct
           let o, ok = conv_offset o in
           if o = NoOffset then
             let o' = match Cil.unrollType typ_base with
-              | TArray _ -> Index (Cil.(zero builtinLoc), NoOffset)
-              | TComp (ci, _, _) -> Field (List.hd ci.cfields, NoOffset)
+              | TArray _ -> Index (Cil.(zero Cil_builtins.builtinLoc), NoOffset)
+              | TComp (ci, _, _) -> Field (List.hd (Option.get ci.cfields), NoOffset)
               | _ -> raise Bit_utils.NoMatchingOffset
             in o', ok
           else o, ok
@@ -265,23 +265,23 @@ module V = struct
     try
       let right = project_ival right in
       let result = project_ival result in
-      Ival.backward_mult_int_left ~right ~result >>-: Extlib.opt_map inject_ival
+      Ival.backward_mult_int_left ~right ~result >>-: Option.map inject_ival
     with Not_based_on_null -> `Value None
 
   let backward_rel_int_left op l r =
     let open Abstract_interp.Comp in
     match l with
-      | Top _  -> l
-      | Map m1 ->
-          try
-            let k,v2 = find_lonely_key r in
-            let v1 = find_or_bottom k m1 in
-            let v1' = Ival.backward_comp_int_left op v1 v2 in
-            let r = add k v1' l in
-            if (not (Base.equal k Base.null)) && (op = Ge || op = Gt)
-            then diff_if_one r singleton_zero
-            else r
-          with Not_found -> l
+    | Top _  -> l
+    | Map m1 ->
+      try
+        let k,v2 = find_lonely_key r in
+        let v1 = find_or_bottom k m1 in
+        let v1' = Ival.backward_comp_int_left op v1 v2 in
+        let r = add k v1' l in
+        if (not (Base.equal k Base.null)) && (op = Ge || op = Gt)
+        then diff_if_one r singleton_zero
+        else r
+      with Not_found -> l
 
   (* More aggressive reduction by relational pointer operators. This version
      assumes that \pointer_comparable alarms have been emitted, and that
@@ -313,8 +313,8 @@ module V = struct
         (* i1' and p1' are pointwise application of the comparison operator,
            and will be in the result in all cases. *)
         if debug then Kernel.result "%a %a %a %a %a -> %a %a"
-          Ival.pretty il pretty pl pretty_comp op Ival.pretty ir pretty pr
-          Ival.pretty il' pretty pl';
+            Ival.pretty il pretty pl pretty_comp op Ival.pretty ir pretty pr
+            Ival.pretty il' pretty pl';
         match op, zl, zr with
         | (Le | Lt), false, _ (*  il       + pl <~ (ir + ?0) + pr *)
         | (Ge | Gt), _, false (* (il + ?0) + pl >~  ir       + pr *) ->
@@ -375,10 +375,10 @@ module V = struct
           || (e2_zero && (op = Ge || op = Gt))
           then True (* if e1/e2 is NULL, then e2/e1 is a pointer *)
           else
-            if (e2_zero && (op = Le || op = Lt))
-            || (e1_zero && (op = Ge || op = Gt))
-            then False
-            else Unknown
+          if (e2_zero && (op = Le || op = Lt))
+          || (e1_zero && (op = Ge || op = Gt))
+          then False
+          else Unknown
         end
       end
     with Not_found -> Comp.Unknown
@@ -393,9 +393,9 @@ module V = struct
   let forward_comp_int ~signed op v1 v2 =
     let open Abstract_interp.Comp in
     match op with
-      | Eq -> forward_eq_int v1 v2
-      | Ne -> inv_truth (forward_eq_int v1 v2)
-      | Le | Ge | Lt | Gt -> forward_rel_int ~signed op v1 v2
+    | Eq -> forward_eq_int v1 v2
+    | Ne -> inv_truth (forward_eq_int v1 v2)
+    | Le | Ge | Lt | Gt -> forward_rel_int ~signed op v1 v2
 
 
   (** Casts and reinterpretation *)
@@ -428,9 +428,9 @@ module V = struct
     (* ok_garbled indicates that we do _not_ create a (new) garbled mix *)
     let pointer_part', ok_garbled =
       if Int.ge size (Int.of_int (Bit_utils.sizeofpointer ())) ||
-        is_bottom pointer_part || is_imprecise pointer_part
+         is_bottom pointer_part || is_imprecise pointer_part
       then pointer_part, true
-      else topify_arith_origin pointer_part, false      
+      else topify_arith_origin pointer_part, false
     in
     if ok_garbled && integer_part' == integer_part then
       v (* both pointer and integer part are unchanged *)
@@ -444,38 +444,38 @@ module V = struct
     to_int Ival.reinterpret_as_int ~size ~signed v
 
   let cast_float_to_int ~signed ~size v =
-   try
-     let v1 = project_ival v in
-     let r = Ival.cast_float_to_int ~signed ~size v1 in
-     inject_ival r
-   with Not_based_on_null ->
-     if is_bottom v
-     then v
-     else topify_arith_origin v
-
- let cast_float_to_int_inverse ~single_precision i =
-   try
-     let v1 = project_ival i in
-     let r = Ival.cast_float_to_int_inverse ~single_precision v1 in
-     Some (inject_ival r)
-   with Not_based_on_null -> None
-
- let cast_int_to_float kind v =
-   try
-     let i = project_ival v in
-     let r = Ival.cast_int_to_float kind i in
-     inject_ival r
-   with Not_based_on_null ->
-     if is_bottom v
-     then bottom
-     else topify_arith_origin v
-
- let cast_int_to_float_inverse ~single_precision vf =
-   try
-     let ivf = project_ival vf in
-     let i = Ival.cast_int_to_float_inverse ~single_precision ivf in
-     Some (inject_ival i)
-   with Not_based_on_null -> None
+    try
+      let v1 = project_ival v in
+      let r = Ival.cast_float_to_int ~signed ~size v1 in
+      inject_ival r
+    with Not_based_on_null ->
+      if is_bottom v
+      then v
+      else topify_arith_origin v
+
+  let cast_float_to_int_inverse ~single_precision i =
+    try
+      let v1 = project_ival i in
+      let r = Ival.cast_float_to_int_inverse ~single_precision v1 in
+      Some (inject_ival r)
+    with Not_based_on_null -> None
+
+  let cast_int_to_float kind v =
+    try
+      let i = project_ival v in
+      let r = Ival.cast_int_to_float kind i in
+      inject_ival r
+    with Not_based_on_null ->
+      if is_bottom v
+      then bottom
+      else topify_arith_origin v
+
+  let cast_int_to_float_inverse ~single_precision vf =
+    try
+      let ivf = project_ival vf in
+      let i = Ival.cast_int_to_float_inverse ~single_precision ivf in
+      Some (inject_ival i)
+    with Not_based_on_null -> None
 
   (** Binary functions *)
 
@@ -485,13 +485,13 @@ module V = struct
       let v2 = project_ival e2 in
       inject_ival (f v1 v2)
     with Not_based_on_null  ->
-      if is_bottom e1 || is_bottom e2 
+      if is_bottom e1 || is_bottom e2
       then bottom
       else begin
-	  join
-            (topify_with_origin_kind topify e1)
-            (topify_with_origin_kind topify e2)
-	end
+        join
+          (topify_with_origin_kind topify e1)
+          (topify_with_origin_kind topify e2)
+      end
 
   let arithmetic_function = import_function ~topify:Origin.K_Arith
 
@@ -520,23 +520,23 @@ module V = struct
         try
           Location_Bytes.shift (project_ival_bottom e2) e1
         with Not_based_on_null  ->
-          try (* On the off chance that someone writes [i+(int)&p]... *)
-            Location_Bytes.shift (project_ival_bottom e1) e2
-          with Not_based_on_null ->
-            join
-              (topify_with_origin_kind topify e1)
-              (topify_with_origin_kind topify e2)
+        try (* On the off chance that someone writes [i+(int)&p]... *)
+          Location_Bytes.shift (project_ival_bottom e1) e2
+        with Not_based_on_null ->
+          join
+            (topify_with_origin_kind topify e1)
+            (topify_with_origin_kind topify e2)
       end
     with Not_found ->
-      (* we end up here if the only way left to make this
-         addition is to convert e2 to an integer *)
-      try
-        let right = Ival.scale_int_base factor (project_ival_bottom e2)
-        in Location_Bytes.shift right e1
-      with Not_based_on_null  -> (* from [project_ival] *)
-        join
-          (topify_with_origin_kind topify e1)
-          (topify_with_origin_kind topify e2)
+    (* we end up here if the only way left to make this
+       addition is to convert e2 to an integer *)
+    try
+      let right = Ival.scale_int_base factor (project_ival_bottom e2)
+      in Location_Bytes.shift right e1
+    with Not_based_on_null  -> (* from [project_ival] *)
+      join
+        (topify_with_origin_kind topify e1)
+        (topify_with_origin_kind topify e2)
 
   (* Under-approximating variant of add_untyped. Takes two
      under-approximation, and returns an under-approximation.*)
@@ -544,13 +544,13 @@ module V = struct
     if Int_Base.equal factor (Int_Base.minus_one)
     then
       (* Note: we could do a "link" for each pair of matching bases in
-	 e1 and e2, so this is an underapproximation in the most
-	 common case. *)
+         e1 and e2, so this is an underapproximation in the most
+         common case. *)
       try
-	let b1, o1 = Location_Bytes.find_lonely_key e1 in
-	let b2, o2 = Location_Bytes.find_lonely_key e2 in
-	if Base.compare b1 b2 <> 0 then bottom
-	else inject_ival (Ival.sub_int_under o1 o2)
+        let b1, o1 = Location_Bytes.find_lonely_key e1 in
+        let b2, o2 = Location_Bytes.find_lonely_key e2 in
+        if Base.compare b1 b2 <> 0 then bottom
+        else inject_ival (Ival.sub_int_under o1 o2)
       with Not_found -> bottom
     else if Int_Base.equal factor Int_Base.one
     then
@@ -558,8 +558,8 @@ module V = struct
       with Not_based_on_null -> bottom
     else
       try
-	let right = Ival.scale_int_base factor (project_ival_bottom e2) in
-	Location_Bytes.shift_under right e1
+        let right = Ival.scale_int_base factor (project_ival_bottom e2) in
+        Location_Bytes.shift_under right e1
       with Not_based_on_null -> bottom
   ;;
 
@@ -648,14 +648,14 @@ module V = struct
   let merge_distinct_bits ~topify ~conflate_bottom value acc =
     if is_bottom acc || is_bottom value
     then begin
-        if conflate_bottom
-        then
-          bottom
-        else
-          join
-            (topify_with_origin_kind topify acc)
-            (topify_with_origin_kind topify value)
-      end
+      if conflate_bottom
+      then
+        bottom
+      else
+        join
+          (topify_with_origin_kind topify acc)
+          (topify_with_origin_kind topify value)
+    end
     else
       add_untyped ~topify ~factor:Int_Base.one value acc
 
@@ -668,7 +668,7 @@ module V = struct
       try
         let i = project_ival v in
         Ival.all_values ~size i
-    with Not_based_on_null -> 
+      with Not_based_on_null ->
         false
 
   let anisotropic_cast ~size v =
@@ -690,7 +690,7 @@ module V = struct
 
   let add_untyped ~factor v1 v2 =
     add_untyped ~topify:Origin.K_Arith ~factor v1 v2
-  
+
 end
 
 module V_Or_Uninitialized = struct
@@ -706,23 +706,20 @@ module V_Or_Uninitialized = struct
 
   let make ~initialized ~escaping v =
     match initialized, escaping with
-      | true, false  -> C_init_noesc v
-      | true, true   -> C_init_esc v
-      | false, false -> C_uninit_noesc v
-      | false, true  -> C_uninit_esc v
+    | true, false  -> C_init_noesc v
+    | true, true   -> C_init_esc v
+    | false, false -> C_uninit_noesc v
+    | false, true  -> C_uninit_esc v
 
   let mask_init = 2
   let mask_noesc = 1
 
-  (* replace "noalloc" with [@@noalloc] for OCaml version >= 4.03.0 *)
-  [@@@ warning "-3"]
-  external get_flags : t -> int = "caml_obj_tag" "noalloc"
-  [@@@ warning "+3"]
+  external get_flags : t -> int = "caml_obj_tag" [@@noalloc]
 
   let is_initialized v = (get_flags v land mask_init) <> 0
   let is_noesc v = (get_flags v land mask_noesc) <> 0
 
-  let get_v = function 
+  let get_v = function
     | C_uninit_esc  v
     | C_uninit_noesc v
     | C_init_esc v
@@ -740,7 +737,7 @@ module V_Or_Uninitialized = struct
     | 3 -> C_init_noesc v
     | _ -> assert false
 
-(* let (==>) = (fun x y -> (not x) || y) *)
+  (* let (==>) = (fun x y -> (not x) || y) *)
 
   type size_widen_hint = V.size_widen_hint
   type numerical_widen_hint = V.numerical_widen_hint
@@ -768,7 +765,7 @@ module V_Or_Uninitialized = struct
       (V.link (get_v t1) (get_v t2))
 
   let meet t1 t2 =
-   create
+    create
       ((get_flags t1) lor (get_flags t2))
       (V.meet (get_v t1) (get_v t2))
 
@@ -786,36 +783,36 @@ module V_Or_Uninitialized = struct
   let initialized v = C_init_noesc v
 
   let is_included t1 t2 =
-(*    (t2.initialized ==> t1.initialized) &&
-    (t2.no_escaping_adr ==> t1.no_escaping_adr) &&
-      V.is_included t1.v t2.v
-*)
+    (*    (t2.initialized ==> t1.initialized) &&
+          (t2.no_escaping_adr ==> t1.no_escaping_adr) &&
+          V.is_included t1.v t2.v
+    *)
     let flags1 = get_flags t1 in
     let flags2 = get_flags t2 in
     (lnot flags2) lor flags1 = -1 &&
-        V.is_included (get_v t1) (get_v t2)
+    V.is_included (get_v t1) (get_v t2)
 
   let pretty_aux pp fmt t =
     let no_escaping_adr = is_noesc t in
     let initialized = is_initialized t in
     let v = get_v t in
     match V.(equal bottom v), initialized, no_escaping_adr with
-      | false, false, false ->
-        Format.fprintf fmt "%a or UNINITIALIZED or ESCAPINGADDR" pp v
-      | true, false, false ->
-        Format.pp_print_string fmt "UNINITIALIZED or ESCAPINGADDR"
-      | false, false, true ->
-        Format.fprintf fmt "%a or UNINITIALIZED" pp v
-      | true, false, true ->
-        Format.pp_print_string fmt "UNINITIALIZED"
-      | false, true, false ->
-        Format.fprintf fmt "%a or ESCAPINGADDR" pp v
-      | true, true, false ->
-        Format.pp_print_string fmt "ESCAPINGADDR"
-      | false, true, true ->
-        pp fmt v
-      | true, true, true ->
-        Format.pp_print_string fmt "BOTVALUE"
+    | false, false, false ->
+      Format.fprintf fmt "%a or UNINITIALIZED or ESCAPINGADDR" pp v
+    | true, false, false ->
+      Format.pp_print_string fmt "UNINITIALIZED or ESCAPINGADDR"
+    | false, false, true ->
+      Format.fprintf fmt "%a or UNINITIALIZED" pp v
+    | true, false, true ->
+      Format.pp_print_string fmt "UNINITIALIZED"
+    | false, true, false ->
+      Format.fprintf fmt "%a or ESCAPINGADDR" pp v
+    | true, true, false ->
+      Format.pp_print_string fmt "ESCAPINGADDR"
+    | false, true, true ->
+      pp fmt v
+    | true, true, true ->
+      Format.pp_print_string fmt "BOTVALUE"
 
   let pretty fmt v = pretty_aux V.pretty fmt v
   let pretty_typ typ fmt v =
@@ -831,38 +828,38 @@ module V_Or_Uninitialized = struct
 
   include
     (Datatype.Make
-      (struct
-        type uninitialized = t
-        type t = uninitialized (* =     | C_uninit_esc of V.t
-                       | C_uninit_noesc of V.t
-                       | C_init_esc of V.t
-                       | C_init_noesc of V.t *)
-        let name = "Cvalue.V_Or_Uninitialized"
-        let structural_descr =
-	  let v = V.packed_descr in
+       (struct
+         type uninitialized = t
+         type t = uninitialized (* =     | C_uninit_esc of V.t
+                                   | C_uninit_noesc of V.t
+                                   | C_init_esc of V.t
+                                   | C_init_noesc of V.t *)
+         let name = "Cvalue.V_Or_Uninitialized"
+         let structural_descr =
+           let v = V.packed_descr in
            Structural_descr.t_sum [| [| v |]; [| v |]; [| v |]; [| v |] |]
-        let reprs =
-          List.fold_left
-            (fun acc v ->
-              List.fold_left
-                (fun acc v ->
-                  List.fold_left
-                    (fun acc v -> C_uninit_noesc v :: acc)
-                    (C_uninit_esc v :: acc)
-                    V.reprs)
-                (C_init_noesc v :: acc)
-                V.reprs)
-            (List.map (fun v -> C_init_esc v) V.reprs)
-            V.reprs
-        let hash = hash
-        let equal = equal
-        let compare = Datatype.undefined
-        let copy = Datatype.undefined
-        let rehash = Datatype.identity
-        let pretty = pretty
-        let internal_pretty_code = Datatype.undefined
-        let varname = Datatype.undefined
-        let mem_project = Datatype.never_any_project
+         let reprs =
+           List.fold_left
+             (fun acc v ->
+                List.fold_left
+                  (fun acc v ->
+                     List.fold_left
+                       (fun acc v -> C_uninit_noesc v :: acc)
+                       (C_uninit_esc v :: acc)
+                       V.reprs)
+                  (C_init_noesc v :: acc)
+                  V.reprs)
+             (List.map (fun v -> C_init_esc v) V.reprs)
+             V.reprs
+         let hash = hash
+         let equal = equal
+         let compare = Datatype.undefined
+         let copy = Datatype.undefined
+         let rehash = Datatype.identity
+         let pretty = pretty
+         let internal_pretty_code = Datatype.undefined
+         let varname = Datatype.undefined
+         let mem_project = Datatype.never_any_project
        end)
      : Datatype.S with type t := t)
 
@@ -1001,7 +998,7 @@ module V_Offsetmap = struct
   let narrow_reinterpret x y =
     try `Value (OffsetmapNarrow.narrow_reinterpret x y)
     with NarrowReturnsBottom -> `Bottom
-  
+
 end
 
 module Default_offsetmap = struct
@@ -1010,10 +1007,10 @@ module Default_offsetmap = struct
     State_builder.Int_hashtbl
       (V_Offsetmap)
       (struct
-         let name = "Cvalue.Default_offsetmap.StringOffsetmaps"
-         let dependencies = [ Ast.self ]
-         let size = 17
-       end)
+        let name = "Cvalue.Default_offsetmap.StringOffsetmaps"
+        let dependencies = [ Ast.self ]
+        let size = 17
+      end)
   let () = Ast.add_monotonic_state StringOffsetmaps.self
 
   let default_offsetmap base =
@@ -1049,7 +1046,7 @@ module Default_offsetmap = struct
        sets of locals, but is is ok to have missing ones considered as being
        bound to Bottom.
      - for dynamic allocation, the default value is indeed Bottom
-   *)
+  *)
 
   let name = "Cvalue.Default_offsetmap"
 
@@ -1080,7 +1077,7 @@ module Model = struct
   let reduce_indeterminate_binding state l v =
     assert (Locations.cardinal_zero_or_one l);
     add_binding ~exact:true state l v
-    
+
   (* Overwrites the definition of add_binding coming from Lmap, with a
      signature change. *)
   let add_binding ~exact acc loc value =
@@ -1090,18 +1087,18 @@ module Model = struct
     List.fold_left
       (fun acc block -> remove_variables block.blocals acc) state blocks
 
- let cardinal_estimate state =
-   match state with
-   | Bottom -> CardinalEstimate.zero
-   | Top -> CardinalEstimate.infinite
-   | Map(m) ->
-     let count = ref (CardinalEstimate.one) in
-     let f _ offsetmap =
-       let offsetmap_card = V_Offsetmap.cardinal_estimate offsetmap in
-       count := CardinalEstimate.mul !count offsetmap_card
-     in
-     iter f m;
-     !count
+  let cardinal_estimate state =
+    match state with
+    | Bottom -> CardinalEstimate.zero
+    | Top -> CardinalEstimate.infinite
+    | Map(m) ->
+      let count = ref (CardinalEstimate.one) in
+      let f _ offsetmap =
+        let offsetmap_card = V_Offsetmap.cardinal_estimate offsetmap in
+        count := CardinalEstimate.mul !count offsetmap_card
+      in
+      iter f m;
+      !count
 end
 
 (*
diff --git a/src/plugins/value_types/cvalue.mli b/src/plugins/value_types/cvalue.mli
index d47be466d5db8ddeedd8c7cbcb9b9ad0583f185b..a45fa3c98aa88468c603a0727c920012969407f6 100644
--- a/src/plugins/value_types/cvalue.mli
+++ b/src/plugins/value_types/cvalue.mli
@@ -26,7 +26,7 @@ open Abstract_interp
 open Locations
 
 (** Estimation of the cardinal of the concretization of an abstract state
-  or value. *)
+    or value. *)
 module CardinalEstimate: sig
   type t
   val one: t
@@ -45,15 +45,15 @@ module V : sig
     (* Too many aliases, and OCaml module system is not able to keep track
        of all of them. Use some shortcuts *)
     with type M.t = Location_Bytes.M.t
-    and type t = Location_Bytes.t
-    and type numerical_widen_hint = Location_Bytes.numerical_widen_hint
-    and type size_widen_hint = Location_Bytes.size_widen_hint
+     and type t = Location_Bytes.t
+     and type numerical_widen_hint = Location_Bytes.numerical_widen_hint
+     and type size_widen_hint = Location_Bytes.size_widen_hint
 
   include Offsetmap_lattice_with_isotropy.S
-      with type t := t
-      and type numerical_widen_hint := numerical_widen_hint
-      and type size_widen_hint := size_widen_hint
-      and type widen_hint := widen_hint
+    with type t := t
+     and type numerical_widen_hint := numerical_widen_hint
+     and type size_widen_hint := size_widen_hint
+     and type widen_hint := widen_hint
 
   val pretty_typ: Cil_types.typ option -> t Pretty_utils.formatter
 
@@ -69,7 +69,7 @@ module V : sig
 
   val project_ival_bottom: t -> Ival.t
   (* Temporary API, will be merged with project_ival later *)
-    
+
   val is_imprecise : t -> bool
   val is_topint : t -> bool
   val is_bottom : t -> bool
@@ -95,12 +95,12 @@ module V : sig
   val inject_float : Fval.t -> t
   val interp_boolean : contains_zero:bool -> contains_non_zero:bool -> t
 
-(** [cast_int_to_int ~size ~signed v] applies to the abstract value [v] the
-    conversion to the integer type described by [size] and [signed].
-    Offsets of bases other than NULL are not clipped. If they were clipped,
-    they should be clipped at the validity of the base. The C standard does
-    not say that [p+(1ULL<<32+1)] is the same as [p+1], it says that
-    [p+(1ULL<<32+1)] is invalid. *)
+  (** [cast_int_to_int ~size ~signed v] applies to the abstract value [v] the
+      conversion to the integer type described by [size] and [signed].
+      Offsets of bases other than NULL are not clipped. If they were clipped,
+      they should be clipped at the validity of the base. The C standard does
+      not say that [p+(1ULL<<32+1)] is the same as [p+1], it says that
+      [p+(1ULL<<32+1)] is invalid. *)
   val cast_int_to_int: size:Int.t -> signed:bool -> t -> t
 
   val reinterpret_as_float: Cil_types.fkind -> t -> t
@@ -174,9 +174,9 @@ module V_Or_Uninitialized : sig
 
   include Offsetmap_lattice_with_isotropy.S
     with type t := t
-    and  type size_widen_hint = Location_Bytes.size_widen_hint
-    and  type numerical_widen_hint = Location_Bytes.numerical_widen_hint
-    and  type widen_hint = Locations.Location_Bytes.widen_hint
+     and  type size_widen_hint = Location_Bytes.size_widen_hint
+     and  type numerical_widen_hint = Location_Bytes.numerical_widen_hint
+     and  type widen_hint = Locations.Location_Bytes.widen_hint
   include Lattice_type.With_Under_Approximation with type t:= t
   include Lattice_type.With_Narrow with type t := t
   include Lattice_type.With_Top with type t := t
@@ -212,32 +212,32 @@ module V_Or_Uninitialized : sig
 
   val reduce_by_initializedness : bool -> t -> t
   (** [reduce_by_initializedness initialized v] reduces [v] so that its result
-     [r] verifies [\initialized(r)] if [initialized] is [true], and
-     [!\initialized(r)] otherwise. *)
+      [r] verifies [\initialized(r)] if [initialized] is [true], and
+      [!\initialized(r)] otherwise. *)
 
   val reduce_by_danglingness : bool -> t -> t
   (** [reduce_by_danglingness dangling v] reduces [v] so that its result [r]
-     verifies [\dangling(r)] if [dangling] is [true], and
-     [!\dangling(r)] otherwise. *)
+      verifies [\dangling(r)] if [dangling] is [true], and
+      [!\dangling(r)] otherwise. *)
 
   val remove_indeterminateness: t -> t
   (** Remove 'uninitialized' and 'escaping addresses' flags from the argument *)
 
-  val unspecify_escaping_locals : 
+  val unspecify_escaping_locals :
     exact:bool -> (V.M.key -> bool) -> t -> bool * t
 
   val map: (V.t -> V.t) -> t -> t
   val map2: (V.t -> V.t -> V.t) -> t -> t -> t
   (** initialized/escaping information is the join of the information
       on each argument. *)
- end
+end
 
 (** Memory slices. They are maps from intervals to values with
     flags. All sizes and intervals are in bits. *)
 module V_Offsetmap: sig
   include Offsetmap_sig.S
-  with type v = V_Or_Uninitialized.t
-  and type widen_hint = V_Or_Uninitialized.numerical_widen_hint
+    with type v = V_Or_Uninitialized.t
+     and type widen_hint = V_Or_Uninitialized.numerical_widen_hint
 
   val narrow: t -> t -> t Bottom.Type.or_bottom
   val narrow_reinterpret: t -> t -> t Bottom.Type.or_bottom
@@ -256,8 +256,8 @@ module Model: sig
   (** Functions inherited from [Lmap_sig] interface *)
   include Lmap_sig.S
     with type v = V_Or_Uninitialized.t
-    and type offsetmap = V_Offsetmap.t
-    and type widen_hint_base = V_Or_Uninitialized.numerical_widen_hint
+     and type offsetmap = V_Offsetmap.t
+     and type widen_hint_base = V_Or_Uninitialized.numerical_widen_hint
 
   include Lattice_type.With_Narrow with type t := t
 
@@ -279,6 +279,7 @@ module Model: sig
       - if [conflate_bottom] is [false] and at least one bit pointed to by
         [l..l+loc.size-1] is not [V.bottom], the value is an approximation
         of the join of all the bits at [l..l+loc.size-1].
+
       As a rule of thumb, you must set [conflate_bottom=true] when the
       operation you abstract really accesses [loc.size] bits, and when
       undeterminate values are an error. This is typically the case when
diff --git a/src/plugins/value_types/value_types.mli b/src/plugins/value_types/value_types.mli
index 99589861241eeb1e280acc5f5abee60270ee4f0e..cdd8f86c51b15e072ea718a42cf62740ba5e5143 100644
--- a/src/plugins/value_types/value_types.mli
+++ b/src/plugins/value_types/value_types.mli
@@ -27,8 +27,23 @@ open Cil_types
 
 (* TODO: These types are already defined in Value_util. *)
 type call_site = kernel_function * kinstr
+(** Value call-site.
+    A callsite [(f,p)] represents a call at function [f] invoked
+    {i from} program point [p].
+*)
+
 type callstack = call_site list
-(** Value callstacks, as used e.g. in Db.Value hooks *)
+(** Value callstacks, as used e.g. in Db.Value hooks.
+
+    The head call site [(f,p)] is the most recent one,
+    where current function [f] has been called from program point [p].
+
+    Therefore, the tail call site is expected to be [(main,Kglobal)]
+    where [main] is the global entry point.
+
+    Moreover, given two consecutive call-sites […(_,p);(g,_)…] in a callstack,
+    program point [p] is then expected to live in function [g].
+ *)
 
 module Callsite: Datatype.S_with_collections with type t = call_site
 module Callstack: sig
diff --git a/src/plugins/value_types/widen_type.ml b/src/plugins/value_types/widen_type.ml
index d49b1a0fc6dc433bcc1b2dc1ee3f2144379ff755..92f57f012f4572c7efb29e6096013f40b7afcfe5 100644
--- a/src/plugins/value_types/widen_type.ml
+++ b/src/plugins/value_types/widen_type.ml
@@ -227,7 +227,8 @@ let hints_from_keys stmt h =
       float_hints_for_base b)
 
 let var_hints stmt prio_bases =
-  { empty with priority_bases = Stmt.Map.singleton stmt prio_bases }
+  let bases = Base.Set.filter (fun b -> not (Base.is_function b)) prio_bases in
+  { empty with priority_bases = Stmt.Map.singleton stmt bases }
 
 let num_hints stmto baseo hints =
   match stmto, baseo with
diff --git a/src/plugins/variadic/Makefile.in b/src/plugins/variadic/Makefile.in
index f4d26f31399440bec477c702582c03b69c5a07b8..09aa6cf0ce8edd403a348c7589fba305bcfa2e99 100644
--- a/src/plugins/variadic/Makefile.in
+++ b/src/plugins/variadic/Makefile.in
@@ -37,7 +37,7 @@ PLUGIN_DIR ?= .
 PLUGIN_ENABLE := @ENABLE_VARIADIC@
 PLUGIN_NAME := Variadic
 PLUGIN_CMI := format_types va_types
-PLUGIN_CMO := options extends va_build environment \
+PLUGIN_CMO := options extends va_build environment replacements \
               format_string format_pprint format_typer format_parser \
               generic standard classify translate \
               register
diff --git a/src/plugins/variadic/classify.ml b/src/plugins/variadic/classify.ml
index 2bd938cda21263d2a4fdb23d062c289fe65df8c9..1bf27b2b54704dd4d9dc598448a9440d7d0adc1b 100644
--- a/src/plugins/variadic/classify.ml
+++ b/src/plugins/variadic/classify.ml
@@ -49,38 +49,38 @@ let mk_aggregator env fun_name a_pos pname a_type =
   match find_function env fun_name with
   | None -> Misc
   | Some vi ->
-      try
-        (* Get the list of arguments *)
-        let params = Typ.params vi.vtype in
-
-        (* Check that pos is a valid position in the list *)
-        assert (a_pos >= 0);
-        if a_pos >= List.length params then begin
-          Self.warning ~current:true
-            "The standard function %s should have at least %d parameters."
-            fun_name
-            (a_pos + 1);
-            raise Exit
-        end;
-
-        (* Get the aggregate type of elements *)
-        let _,ptyp,_ = List.nth params a_pos in
-        let a_param = pname, match ptyp with
+    try
+      (* Get the list of arguments *)
+      let params = Typ.params vi.vtype in
+
+      (* Check that pos is a valid position in the list *)
+      assert (a_pos >= 0);
+      if a_pos >= List.length params then begin
+        Self.warning ~current:true
+          "The standard function %s should have at least %d parameters."
+          fun_name
+          (a_pos + 1);
+        raise Exit
+      end;
+
+      (* Get the aggregate type of elements *)
+      let _,ptyp,_ = List.nth params a_pos in
+      let a_param = pname, match ptyp with
         | TArray (typ,_,_,_)
         | TPtr (typ, _) -> typ
         | _ ->
-            Self.warning ~current:true
-              "The parameter %d of standard function %s should be \
-               of array type."
-              (a_pos + 1)
-              fun_name;
-            raise Exit
-        in
+          Self.warning ~current:true
+            "The parameter %d of standard function %s should be \
+             of array type."
+            (a_pos + 1)
+            fun_name;
+          raise Exit
+      in
 
-        Aggregator {a_target = vi; a_pos; a_type; a_param}
+      Aggregator {a_target = vi; a_pos; a_type; a_param}
 
-        (* In case of failure return Misc (apply generic translation) *)
-      with Exit -> Misc
+    (* In case of failure return Misc (apply generic translation) *)
+    with Exit -> Misc
 
 let mk_format_fun vi f_kind f_buffer ~format_pos =
   let buffer_arguments = match f_buffer with
@@ -92,16 +92,16 @@ let mk_format_fun vi f_kind f_buffer ~format_pos =
   let n_expected_args = (List.fold_left max (-1) expected_args) + 1
   and n_actual_args = List.length (Typ.params vi.vtype) in
   if n_actual_args < n_expected_args then
-  begin
-    Self.warning ~current:true
-      "The standard function %s was expected to have at least %d fixed \
-       parameters but only has %d.@ \
-       No variadic translation will be performed."
-      vi.vname
-      n_expected_args
-      n_actual_args;
-    Misc
-  end
+    begin
+      Self.warning ~current:true
+        "The standard function %s was expected to have at least %d fixed \
+         parameters but only has %d.@ \
+         No variadic translation will be performed."
+        vi.vname
+        n_expected_args
+        n_actual_args;
+      Misc
+    end
   else
     FormatFun { f_kind ; f_buffer ; f_format_pos = format_pos }
 
@@ -113,11 +113,11 @@ let mk_format_fun vi f_kind f_buffer ~format_pos =
 let classify_std env vi = match vi.vname with
   (* fcntl.h - Overloads of functions *)
   | "fcntl" -> mk_overload env
-      ["__va_fcntl_void" ; "__va_fcntl_int" ; "__va_fcntl_flock"]
+                 ["__va_fcntl_void" ; "__va_fcntl_int" ; "__va_fcntl_flock"]
   | "open" -> mk_overload env
-      ["__va_open_void" ; "__va_open_mode_t"]
+                ["__va_open_void" ; "__va_open_mode_t"]
   | "openat" -> mk_overload env
-      ["__va_openat_void" ; "__va_openat_mode_t"]
+                  ["__va_openat_void" ; "__va_openat_mode_t"]
 
   (* unistd.h *)
   | "execl"   -> mk_aggregator env "execv" 1 "argv" EndedByNull
@@ -165,4 +165,3 @@ let classify env vi =
     }
   end else
     None
-
diff --git a/src/plugins/variadic/environment.ml b/src/plugins/variadic/environment.ml
index 1165b7c21fb7f31bfb05e9bc11b0615636fc9272..c00e98d5d201115637138a8ac91a90392a780070 100644
--- a/src/plugins/variadic/environment.ml
+++ b/src/plugins/variadic/environment.ml
@@ -25,24 +25,24 @@ open Cil_types
 module Table = Datatype.String.Hashtbl
 
 type env =
-{
-  globals: varinfo Table.t;
-  functions: varinfo Table.t;
-  typedefs: typeinfo Table.t;
-  structs: compinfo Table.t;
-  unions: compinfo Table.t;
-  enums: enuminfo Table.t;
-}
+  {
+    globals: varinfo Table.t;
+    functions: varinfo Table.t;
+    typedefs: typeinfo Table.t;
+    structs: compinfo Table.t;
+    unions: compinfo Table.t;
+    enums: enuminfo Table.t;
+  }
 
 let empty () : env =
-{
-  globals = Table.create 17;
-  functions = Table.create 17;
-  typedefs = Table.create 17;
-  structs = Table.create 17;
-  unions = Table.create 17;
-  enums = Table.create 17;
-}
+  {
+    globals = Table.create 17;
+    functions = Table.create 17;
+    typedefs = Table.create 17;
+    structs = Table.create 17;
+    unions = Table.create 17;
+    enums = Table.create 17;
+  }
 
 let add_global (env : env) (vi : varinfo) : unit  =
   Table.add env.globals vi.vname vi
@@ -95,19 +95,19 @@ let from_file (file : file) : env =
   let v = object inherit Cil.nopCilVisitor
     method! vglob glob =
       begin match glob with
-      | GFunDecl(_,vi,_) | GFun ({svar = vi}, _) ->
-        add_function env vi
-      | GVarDecl (vi,_) | GVar (vi, _, _) ->
-        add_global env vi
-      | GType (typeinfo,_) ->
-        add_typeinfo env typeinfo
-      | GCompTag (compinfo,_) ->
-        add_compinfo env compinfo
-      | GEnumTag (enuminfo,_) ->
-        add_enuminfo env enuminfo
-      | _ -> ()
+        | GFunDecl(_,vi,_) | GFun ({svar = vi}, _) ->
+          add_function env vi
+        | GVarDecl (vi,_) | GVar (vi, _, _) ->
+          add_global env vi
+        | GType (typeinfo,_) ->
+          add_typeinfo env typeinfo
+        | GCompTag (compinfo,_) ->
+          add_compinfo env compinfo
+        | GEnumTag (enuminfo,_) ->
+          add_enuminfo env enuminfo
+        | _ -> ()
       end;
-      Cil.SkipChildren         
+      Cil.SkipChildren
   end in
   Cil.visitCilFile v file;
   env
diff --git a/src/plugins/variadic/extends.ml b/src/plugins/variadic/extends.ml
index 36dd5299909971e7e78d91cbadaa4172d8802014..679eb4a6c2e99eec57392e7be63a884a27b66472 100644
--- a/src/plugins/variadic/extends.ml
+++ b/src/plugins/variadic/extends.ml
@@ -70,13 +70,13 @@ module Cil = struct
   let doublePtrType = ptrType doubleType
 
   let signedIntegerTypes = [Cil.charType; shortType; Cil.intType;
-			    Cil.longType; longLongType]
+                            Cil.longType; longLongType]
   let unsignedIntegerTypes = [ucharType; ushortType; Cil.uintType;
-			      Cil.ulongType; Cil.ulongLongType]
+                              Cil.ulongType; Cil.ulongLongType]
   let signedIntegerPtrTypes = [Cil.charPtrType; shortPtrType; Cil.intPtrType;
-			       longPtrType; longlongPtrType]
+                               longPtrType; longlongPtrType]
   let unsignedIntegerPtrTypes = [ucharPtrType; ushortPtrType; Cil.uintPtrType;
-				 ulongPtrType; ulonglongPtrType]
+                                 ulongPtrType; ulonglongPtrType]
 
   let signed_integers_ranking =
     Extlib.mapi (fun i t -> (t, i)) signedIntegerTypes
@@ -95,13 +95,13 @@ module Cil = struct
   let integer_ranking_comp t1 t2 =
     let rt1, rt2 =
       if is_signed_integer_type t1 && is_signed_integer_type t2 then
-	List.assoc t1 signed_integers_ranking,
-	List.assoc t2 signed_integers_ranking
+        List.assoc t1 signed_integers_ranking,
+        List.assoc t2 signed_integers_ranking
       else if is_unsigned_integer_type t1 && is_unsigned_integer_type t2 then
-	List.assoc t1 unsigned_integers_ranking,
-	List.assoc t2 unsigned_integers_ranking
+        List.assoc t1 unsigned_integers_ranking,
+        List.assoc t2 unsigned_integers_ranking
       else
-	raise (Invalid_argument "rank_comp") in
+        raise (Invalid_argument "rank_comp") in
     rt1 - rt2
 
   let integer_promotion t1 t2 =
@@ -140,54 +140,54 @@ module List = struct
     else a :: make (n - 1) a
 
   let to_scalar = function
-  | [a] -> a
-  | _ -> failwith "to_scalar"
+    | [a] -> a
+    | _ -> failwith "to_scalar"
 
   let of_opt = function
-  | None -> []
-  | Some x -> [x]
+    | None -> []
+    | Some x -> [x]
 
   let to_opt = function
-  | [] -> None
-  | [a] -> Some a
-  | _ -> failwith "to_opt"
+    | [] -> None
+    | [a] -> Some a
+    | _ -> failwith "to_opt"
 
   let first = function
-  | [] -> failwith "first"
-  | a :: _ -> a
+    | [] -> failwith "first"
+    | a :: _ -> a
 
   exception EmptyList
 
   let rec last = function
-  | [] -> raise EmptyList
-  | [a] -> a
-  | _ :: l -> last l
+    | [] -> raise EmptyList
+    | [a] -> a
+    | _ :: l -> last l
 
   let rec take n l =
     if n <= 0 then []
     else match l with
-    | [] -> []
-    | a :: l -> a :: take (n - 1) l
+      | [] -> []
+      | a :: l -> a :: take (n - 1) l
 
   let rec drop n l =
     if n <= 0 then l
     else match l with
-    | [] -> []
-    | _ :: l -> drop (n - 1) l
+      | [] -> []
+      | _ :: l -> drop (n - 1) l
 
   let rec break n l =
     if n <= 0 then ([], l)
     else match l with
-    | [] -> ([], [])
-    | a :: l ->
+      | [] -> ([], [])
+      | a :: l ->
         let l1, l2 = break (n - 1) l in
         (a :: l1, l2)
 
   let rec filter_map f = function
-  | [] -> []
-  | a :: l -> match f a with
-    | Some r -> r :: filter_map f l
-    | None -> filter_map f l
+    | [] -> []
+    | a :: l -> match f a with
+      | Some r -> r :: filter_map f l
+      | None -> filter_map f l
 
   let iteri f l =
     let i = ref 0 in
@@ -200,45 +200,45 @@ module List = struct
   let rev_mapi f l =
     let i = ref 0 in
     let rec aux acc = function
-    | [] -> acc
-    | a :: l -> let a' = f !i a in incr i; aux (a' :: acc) l
+      | [] -> acc
+      | a :: l -> let a' = f !i a in incr i; aux (a' :: acc) l
     in aux [] l
 
   let iteri2 f l1 l2 =
     let i = ref 0 in
     let rec aux l1 l2 = match l1, l2 with
-    | [], [] -> ()
-    | a1 :: l1, a2 :: l2 -> f !i a1 a2; incr i; aux l1 l2
-    | _, _ -> invalid_arg "List.iteri2"
+      | [], [] -> ()
+      | a1 :: l1, a2 :: l2 -> f !i a1 a2; incr i; aux l1 l2
+      | _, _ -> invalid_arg "List.iteri2"
     in
     aux l1 l2
 
   let mapi2 f l1 l2 =
     let i = ref 0 in
     let rec aux l1 l2 = match l1, l2 with
-    | [], [] -> []
-    | a1 :: l1, a2 :: l2 -> let r = f !i a1 a2 in incr i; r :: aux l1 l2
-    | _, _ -> invalid_arg "List.mapi2"
+      | [], [] -> []
+      | a1 :: l1, a2 :: l2 -> let r = f !i a1 a2 in incr i; r :: aux l1 l2
+      | _, _ -> invalid_arg "List.mapi2"
     in
     aux l1 l2
 
   let reduce_left f l =
     let rec aux acc = function
-    | [] -> acc
-    | a :: l -> aux (f acc a) l
+      | [] -> acc
+      | a :: l -> aux (f acc a) l
     in match l with
     | [] -> failwith "reduce"
     | a :: l -> aux a l
 
   let rec reduce_right f = function
-  | [] -> failwith "reduce"
-  | [a] -> a
-  | a :: l -> f a (reduce_right f l)
+    | [] -> failwith "reduce"
+    | [a] -> a
+    | a :: l -> f a (reduce_right f l)
 
   let map_fold_left f acc l =
     let rec aux acc r = function
-    | [] -> List.rev r, acc
-    | a :: l ->
+      | [] -> List.rev r, acc
+      | a :: l ->
         let a, acc = f acc a in
         aux acc (a :: r) l
     in
@@ -254,9 +254,9 @@ module List = struct
 
 
   let rec unique_sorted cmp = function
-  | a1 :: a2 :: l when cmp a1 a2 = 0 -> unique_sorted cmp (a2 :: l)
-  | [] -> []
-  | a :: l -> a :: unique_sorted cmp l
+    | a1 :: a2 :: l when cmp a1 a2 = 0 -> unique_sorted cmp (a2 :: l)
+    | [] -> []
+    | a :: l -> a :: unique_sorted cmp l
 
   let sort_unique cmp l =
     unique_sorted cmp (sort cmp l)
diff --git a/src/plugins/variadic/extends.mli b/src/plugins/variadic/extends.mli
index fc4af12f94877df709ff85ce10dc91ba6a4b6bfa..a3ce5afa58afd73c2eec46a017cf4ba907a27599 100644
--- a/src/plugins/variadic/extends.mli
+++ b/src/plugins/variadic/extends.mli
@@ -144,4 +144,3 @@ module List : sig
   (** [replace i v l] returns a new list where [l.(i)] = [v] *)
   val replace : int -> 'a -> 'a list -> 'a list
 end
-
diff --git a/src/plugins/variadic/format_parser.ml b/src/plugins/variadic/format_parser.ml
index 3a31e59fe0b3c507c6b0c106ec05366089c89327..045e562125866e1012f8dbc7f19b82ee0b67018d 100644
--- a/src/plugins/variadic/format_parser.ml
+++ b/src/plugins/variadic/format_parser.ml
@@ -39,41 +39,41 @@ let check_flag spec flag =
   let cs = spec.f_conversion_specifier in
   match flag, cs with
   | FSharp, #has_alternative_form -> true
-  | FZero, #integer_specifier when Extlib.has_some spec.f_precision ->
-      warn "Flag 0 is ignored when a precision is specified"; false
+  | FZero, #integer_specifier when Option.is_some spec.f_precision ->
+    warn "Flag 0 is ignored when a precision is specified"; false
   | FZero, #numeric_specifier when List.mem FMinus spec.f_flags ->
-      warn "Flag 0 is ignored when flag - is also specified."; false
+    warn "Flag 0 is ignored when flag - is also specified."; false
   | FZero, #numeric_specifier -> true
   | FMinus, cs when cs <> `n -> true
   | FSpace, #signed_specifier when List.mem FPlus spec.f_flags ->
-      warn "Flag ' ' is ignored when flag + is also specified."; false
+    warn "Flag ' ' is ignored when flag + is also specified."; false
   | FSpace, #signed_specifier -> true
   | FPlus, (#signed_specifier | #float_specifier) -> true
-  | _ -> 
-      warn "Flag %a and conversion specififer %a are not compatibles."
-        pp_flag flag
-        pp_cs (spec.f_conversion_specifier,spec.f_capitalize);
-      raise Invalid_format
+  | _ ->
+    warn "Flag %a and conversion specififer %a are not compatibles."
+      pp_flag flag
+      pp_cs (spec.f_conversion_specifier,spec.f_capitalize);
+    raise Invalid_format
 
 let check_cs_compatibility cs capitalized has_field_width has_precision =
   match cs with
   | (`n | `c | `p) as cs when has_precision ->
-      warn "Conversion specifier %a does not expect a precision."
-        pp_cs (cs, capitalized) ;
-      raise Invalid_format
+    warn "Conversion specifier %a does not expect a precision."
+      pp_cs (cs, capitalized) ;
+    raise Invalid_format
   | `n when has_field_width ->
-      warn "Conversion specifier n does not expect a field width.";
-      raise Invalid_format
+    warn "Conversion specifier n does not expect a field width.";
+    raise Invalid_format
   | _ -> ()
 
 let rec make_flags_unique = function
   | [] -> []
   | f :: l ->
-      if List.mem f l then (
-        warn "Multiple usage of flag '%a'." pp_flag f;
-        make_flags_unique l
-      ) else
-        f :: make_flags_unique l
+    if List.mem f l then (
+      warn "Multiple usage of flag '%a'." pp_flag f;
+      make_flags_unique l
+    ) else
+      f :: make_flags_unique l
 
 (* When checking, we don't really care which type are returned but only if
    it can be returned *)
@@ -147,27 +147,27 @@ struct
   let get (s,i : t) : char =
     try let c = Format_string.get_char s !i in incr i; c
     with Format_string.OutOfBounds -> '\000'
-      |  Format_string.NotAscii _ -> '\026'
+       |  Format_string.NotAscii _ -> '\026'
 
   let last (s,i : t) : char =
     try Format_string.get_char s (!i - 1)
     with Format_string.OutOfBounds -> '\000'
-      |  Format_string.NotAscii _ -> '\026'
+       |  Format_string.NotAscii _ -> '\026'
 
   let peek (s,i : t) : char =
     try Format_string.get_char s !i
     with Format_string.OutOfBounds -> '\000'
-      |  Format_string.NotAscii _ -> '\026'
+       |  Format_string.NotAscii _ -> '\026'
 
   let getall (f : char -> bool) (s,i as b : t) : string =
     let start = !i in
     let len = ref 0 in
     begin try
-      while f (get b) do
-        incr len;
-      done;
-      back b; (* last char has not been matched *)
-    with _ -> ()
+        while f (get b) do
+          incr len;
+        done;
+        back b; (* last char has not been matched *)
+      with _ -> ()
     end;
     Format_string.sub_string s start !len
 end
@@ -203,10 +203,10 @@ let parse_assignement_suppression b =
 let rec parse_flags b =
   match Buffer.get b with
   | '-' -> FMinus :: parse_flags b
-  | '+' -> FPlus :: parse_flags b 
-  | ' ' -> FSpace :: parse_flags b 
-  | '#' -> FSharp :: parse_flags b 
-  | '0' -> FZero :: parse_flags b 
+  | '+' -> FPlus :: parse_flags b
+  | ' ' -> FSpace :: parse_flags b
+  | '#' -> FSharp :: parse_flags b
+  | '0' -> FZero :: parse_flags b
   | _ -> Buffer.back b; []
 
 let parse_f_fw b =
@@ -223,11 +223,11 @@ let parse_s_fw b =
 let parse_precision b =
   match Buffer.peek b with
   | '.' ->  Buffer.consume b; Some
-    begin match Buffer.peek b with
-    | '*' -> Buffer.consume b; PStar
-    | '-' | '0'..'9'-> PInt (parse_int b)
-    | _ -> PInt 0
-    end
+      begin match Buffer.peek b with
+        | '*' -> Buffer.consume b; PStar
+        | '-' | '0'..'9'-> PInt (parse_int b)
+        | _ -> PInt 0
+      end
   | _ -> None
 
 let parse_lm b =
@@ -244,11 +244,11 @@ let parse_lm b =
 
 let parse_brackets_interior b =
   let first = ref true and circ = ref false in
-  let matching = function 
-  | ']' when not !first -> false
-  | '^' when !first && not !circ -> circ := true; true
-  | '\000' -> warn "Unterminated brackets."; raise Invalid_format
-  | _ -> first := false; true
+  let matching = function
+    | ']' when not !first -> false
+    | '^' when !first && not !circ -> circ := true; true
+    | '\000' -> warn "Unterminated brackets."; raise Invalid_format
+    | _ -> first := false; true
   in
   let s = Buffer.getall matching b in
   Buffer.consume b;
@@ -270,14 +270,14 @@ let parse_f_cs b =
   | 'g' | 'G' -> `g
   | 'a' | 'A' -> `a
   | '\000' ->
-     warn "Missing conversion specifier at the end of format.";
-     raise Invalid_format
+    warn "Missing conversion specifier at the end of format.";
+    raise Invalid_format
   | '\026' ->
-     warn "Conversion specifiers must be ascii characters.";
-     raise Invalid_format
+    warn "Conversion specifiers must be ascii characters.";
+    raise Invalid_format
   | c ->
-     warn "Unknown conversion specifier %c." c;
-     raise Invalid_format
+    warn "Unknown conversion specifier %c." c;
+    raise Invalid_format
 
 let parse_s_cs b =
   match Buffer.peek b with
@@ -320,4 +320,3 @@ let parse_s_format s = parse_aux parse_s_spec (Buffer.create s)
 let parse_format typ s = match typ with
   | PrintfLike -> FFormat (parse_f_format s)
   | ScanfLike -> SFormat (parse_s_format s)
-
diff --git a/src/plugins/variadic/format_parser.mli b/src/plugins/variadic/format_parser.mli
index bf8937e1f7e4f1784c4cb1105c221c56c5f9b62f..10218a76d6b724d37131f218c33535f982f0cafc 100644
--- a/src/plugins/variadic/format_parser.mli
+++ b/src/plugins/variadic/format_parser.mli
@@ -33,4 +33,3 @@ val check_format : format -> format
 val parse_f_format : Format_string.t -> f_format
 val parse_s_format : Format_string.t -> s_format
 val parse_format : format_kind -> Format_string.t -> format
-
diff --git a/src/plugins/variadic/format_pprint.ml b/src/plugins/variadic/format_pprint.ml
index 90d2d42f90fcd6bedec489c7f1614af951625b72..d1890a1d2ff4cbcab949d64989aff5fc0055cf30 100644
--- a/src/plugins/variadic/format_pprint.ml
+++ b/src/plugins/variadic/format_pprint.ml
@@ -120,12 +120,12 @@ let pp_s_specification ff (spec: s_conversion_specification) =
 
 let pp_f_format ff fl =
   let fl = Extends.List.filter_map
-    (function | Specification s -> Some s | _ -> None) fl in
+      (function | Specification s -> Some s | _ -> None) fl in
   Pretty_utils.pp_list ~sep:"@." (fun ff s -> pp_f_specification ff s) ff fl
 
 let pp_s_format ff (fl: s_format) =
   let fl = Extends.List.filter_map
-    (function | Specification s -> Some s | _ -> None) fl in
+      (function | Specification s -> Some s | _ -> None) fl in
   Pretty_utils.pp_list ~sep:"@." (fun ff s -> pp_s_specification ff s) ff fl
 
 let pp_format ff = function
diff --git a/src/plugins/variadic/format_string.ml b/src/plugins/variadic/format_string.ml
index 6efa2326f69c8be67dc63949b08667bde229a421..f27b7431f4c47877fd5d507e623bd58776764d5c 100644
--- a/src/plugins/variadic/format_string.ml
+++ b/src/plugins/variadic/format_string.ml
@@ -21,8 +21,8 @@
 (**************************************************************************)
 
 type t =
-| String of string
-| WString of int64 list
+  | String of string
+  | WString of int64 list
 
 exception OutOfBounds
 exception NotAscii of int64
@@ -30,13 +30,13 @@ exception NotAscii of int64
 let get_char (s : t) (i : int) : char =
   match s with
   | String s ->
-      begin try
+    begin try
         String.get s i
       with
         Invalid_argument _ -> raise OutOfBounds
-      end
+    end
   | WString s ->
-      begin try 
+    begin try
         let c = List.nth s i in
         if (c >= Int64.zero && c<= (Int64.of_int 255)) then
           Char.chr (Int64.to_int c)
@@ -44,22 +44,22 @@ let get_char (s : t) (i : int) : char =
           raise (NotAscii c)
       with
         Failure _ -> raise OutOfBounds
-      end
+    end
 
 let get_wchar (s : t) (i : int) : int64 =
   match s with
   | String s ->
-      begin try
+    begin try
         Int64.of_int (Char.code (String.get s i))
       with
         Invalid_argument _ -> raise OutOfBounds
-      end
+    end
   | WString s ->
-      begin try 
+    begin try
         List.nth s i
       with
         Failure _ -> raise OutOfBounds
-      end
+    end
 
 let sub_string (s : t) (start : int) (len : int) : string =
   let init_char i =
diff --git a/src/plugins/variadic/format_typer.ml b/src/plugins/variadic/format_typer.ml
index 318f48b1791d25adf40b3854e22cf54ba36c19a9..d37c1ef006064bd984d5507aaec36021433b6b31 100644
--- a/src/plugins/variadic/format_typer.ml
+++ b/src/plugins/variadic/format_typer.ml
@@ -35,7 +35,7 @@ type typdef_finder = Logic_typing.type_namespace -> string -> Cil_types.typ
 
 
 let get_typedef ?(find_typedef = Globals.Types.find_type) s =
-  try 
+  try
     find_typedef Logic_typing.Typedef s
   with Not_found ->
     raise (Type_not_found s)
@@ -119,17 +119,17 @@ let type_f_format ?find_typedef format =
   let add_types spec =
     match spec with
     | Char _ -> ()
-    | Specification s -> 
-        if s.f_field_width = Some `FWStar then
-          r := (Cil.intType, `ArgIn) :: !r;
-        if s.f_precision = Some PStar then
-          r := (Cil.intType, `ArgIn) :: !r;
-        let dir = match s.f_conversion_specifier with
-          | `s -> `ArgInArray s.f_precision
-          | `n -> `ArgOut
-          | _ ->  `ArgIn
-         in
-        r := (type_f_specifier ?find_typedef s, dir) :: !r;
+    | Specification s ->
+      if s.f_field_width = Some `FWStar then
+        r := (Cil.intType, `ArgIn) :: !r;
+      if s.f_precision = Some PStar then
+        r := (Cil.intType, `ArgIn) :: !r;
+      let dir = match s.f_conversion_specifier with
+        | `s -> `ArgInArray s.f_precision
+        | `n -> `ArgOut
+        | _ ->  `ArgIn
+      in
+      r := (type_f_specifier ?find_typedef s, dir) :: !r;
   in
   List.iter add_types format;
   List.rev !r
@@ -139,13 +139,13 @@ let type_s_format ?find_typedef format =
   let add_types spec =
     match spec with
     | Char _ -> ()
-    | Specification s -> 
-        let dir = match s.s_conversion_specifier with
-          | `s -> `ArgOutArray
-          | _ -> `ArgOut
-        in
-        if not s.s_assignment_suppression then
-          r := (type_s_specifier ?find_typedef s, dir) :: !r;
+    | Specification s ->
+      let dir = match s.s_conversion_specifier with
+        | `s -> `ArgOutArray
+        | _ -> `ArgOut
+      in
+      if not s.s_assignment_suppression then
+        r := (type_s_specifier ?find_typedef s, dir) :: !r;
   in
   List.iter add_types format;
   List.rev !r
@@ -154,4 +154,3 @@ let type_s_format ?find_typedef format =
 let type_format ?find_typedef = function
   | FFormat f -> type_f_format ?find_typedef f
   | SFormat s -> type_s_format ?find_typedef s
-
diff --git a/src/plugins/variadic/format_typer.mli b/src/plugins/variadic/format_typer.mli
index bc78bb447eb3ec55920e126ebfa6991a418c8703..cb83a6fb9fbaf5c6bccbfb2325b294a588413385 100644
--- a/src/plugins/variadic/format_typer.mli
+++ b/src/plugins/variadic/format_typer.mli
@@ -38,4 +38,3 @@ val type_s_specifier : ?find_typedef : typdef_finder -> s_conversion_specificati
 val type_f_format : ?find_typedef : typdef_finder ->  f_format -> (typ * arg_dir) list
 val type_s_format : ?find_typedef : typdef_finder ->  s_format -> (typ * arg_dir) list
 val type_format : ?find_typedef : typdef_finder -> format -> (typ * arg_dir) list
-
diff --git a/src/plugins/variadic/format_types.ml b/src/plugins/variadic/format_types.ml
index 5e8a6594abee98f0da36d823283a12ee08c29696..3bd4808e6122c543124a146408bcdb1974e45cf5 100644
--- a/src/plugins/variadic/format_types.ml
+++ b/src/plugins/variadic/format_types.ml
@@ -25,7 +25,7 @@
 type flag = FMinus | FPlus | FSpace | FSharp | FZero
 type flags = flag list
 
-type f_field_width = [ `FWStar | `FWInt of int (** positive integer *)] 
+type f_field_width = [ `FWStar | `FWInt of int (** positive integer *)]
 type s_field_width = [ `FWInt of int ]
 type any_field_width = [ f_field_width | s_field_width ]
 
@@ -45,7 +45,7 @@ type f_conversion_specifier =
   [ numeric_specifier | `c | `s | `p | `n ]
 type s_conversion_specifier =
   [ f_conversion_specifier | `Brackets of string ]
-type any_conversion_specifier = 
+type any_conversion_specifier =
   [ s_conversion_specifier | f_conversion_specifier ]
 
 type f_conversion_specification = {
@@ -66,8 +66,8 @@ type s_conversion_specification = {
 
 (** A format element is either a character or a conversion specification. *)
 type 'spec token =
-| Char of char
-| Specification of 'spec
+  | Char of char
+  | Specification of 'spec
 
 type f_format = f_conversion_specification token list
 type s_format = s_conversion_specification token list
diff --git a/src/plugins/variadic/generic.ml b/src/plugins/variadic/generic.ml
index edc982c19508e3a72dd06e123079fd218e7f62ea..586d6041d62af0615c852996638b45362bfb81e5 100644
--- a/src/plugins/variadic/generic.ml
+++ b/src/plugins/variadic/generic.ml
@@ -39,7 +39,7 @@ let vpar =
 (* Translation of variadic types (not deeply) *)
 
 let translate_type = function
-| TFun (ret_typ, args, is_variadic, attributes) ->
+  | TFun (ret_typ, args, is_variadic, attributes) ->
     let new_args =
       if is_variadic
       then
@@ -47,62 +47,63 @@ let translate_type = function
         Some (ng_args @ [vpar] @ g_args)
       else args
     in
-    TFun (ret_typ, new_args, false, attributes)      
+    TFun (ret_typ, new_args, false, attributes)
 
-| TBuiltin_va_list attr -> vpar_typ attr
+  | TBuiltin_va_list attr -> vpar_typ attr
 
-| typ -> typ
+  | typ -> typ
 
 
 (* Adding the vpar parameter to variadic functions *)
 
 let add_vpar vi =
   let formals = Cil.getFormalsDecl vi in
+  let n_formals, g_formals = List.partition (fun v -> not v.vghost) formals in
   (* Add the vpar formal once *)
   if not (List.exists (fun vi -> vi.vname = vpar_name) formals) then
-  begin
-    (* Register the new formal *)
-    let new_formal = Cil.makeFormalsVarDecl vpar in
-    let new_formals = formals @ [new_formal] in
-    Cil.unsafeSetFormalsDecl vi new_formals
-  end
+    begin
+      (* Register the new formal *)
+      let new_formal = Cil.makeFormalsVarDecl vpar in
+      let new_formals = n_formals @ [new_formal] @ g_formals in
+      Cil.unsafeSetFormalsDecl vi new_formals
+    end
 
 
 (* Translation of va_* builtins  *)
 
 let translate_va_builtin caller inst =
   let vi, args, loc = match inst with
-  | Call(_, {enode = Lval(Var vi, _)}, args, loc) ->
+    | Call(_, {enode = Lval(Var vi, _)}, args, loc) ->
       vi, args, loc
-  | _ -> assert false
+    | _ -> assert false
   in
 
   let translate_va_start () =
     let va_list = match args with
-    | [{enode=Lval va_list}] -> va_list
-    | _ -> Self.fatal "Unexpected arguments to va_start"
+      | [{enode=Lval va_list}] -> va_list
+      | _ -> Self.fatal "Unexpected arguments to va_start"
     and varg =
       try Extlib.last (Cil.getFormalsDecl caller.svar)
-      with Invalid_argument _ -> Self.abort
-        "Using va_start macro in a function which is not variadic."
+      with Invalid_argument _ ->
+        Self.abort "Using va_start macro in a function which is not variadic."
     in
     [ Set (va_list, Cil.evar ~loc varg, loc) ]
   in
 
   let translate_va_copy () =
     let dest, src = match args with
-    | [{enode=Lval dest}; src] -> dest, src
-    | _ -> Self.fatal "Unexpected arguments to va_copy"
+      | [{enode=Lval dest}; src] -> dest, src
+      | _ -> Self.fatal "Unexpected arguments to va_copy"
     in
     [ Set (dest, src, loc) ]
   in
 
   let translate_va_arg () =
     let va_list, typ, lval = match args with
-    | [{enode=Lval va_list};
-       {enode=SizeOf typ};
-       {enode=CastE(_, {enode=AddrOf lval})}] -> va_list, typ, lval
-    | _ -> Self.fatal "Unexpected arguments to va_arg"
+      | [{enode=Lval va_list};
+         {enode=SizeOf typ};
+         {enode=CastE(_, {enode=AddrOf lval})}] -> va_list, typ, lval
+      | _ -> Self.fatal "Unexpected arguments to va_arg"
     in
     (* Check validity of type *)
     if Cil.isIntegralType typ then begin
@@ -119,7 +120,7 @@ let translate_va_builtin caller inst =
     (* Build the replacing instruction *)
     let mk_lval_exp lval = Cil.new_exp ~loc (Lval lval)  in
     let mk_mem exp = mk_lval_exp (Cil.mkMem ~addr:exp ~off:NoOffset) in
-    let mk_cast exp typ = Cil.mkCast ~force:false ~e:exp ~newt:typ in 
+    let mk_cast exp typ = Cil.mkCast ~force:false ~e:exp ~newt:typ in
     let src = mk_mem (mk_cast (mk_mem (mk_lval_exp va_list)) (TPtr (typ,[])))
     in
     [ Set (lval, src, loc);
@@ -127,11 +128,11 @@ let translate_va_builtin caller inst =
   in
 
   begin match vi.vname with
-  | "__builtin_va_start" -> translate_va_start ()
-  | "__builtin_va_copy" -> translate_va_copy ()
-  | "__builtin_va_arg" -> translate_va_arg ()
-  | "__builtin_va_end" -> [] (* No need to do anything for va_end *)
-  | _ -> assert false
+    | "__builtin_va_start" -> translate_va_start ()
+    | "__builtin_va_copy" -> translate_va_copy ()
+    | "__builtin_va_arg" -> translate_va_arg ()
+    | "__builtin_va_end" -> [] (* No need to do anything for va_end *)
+    | _ -> assert false
   end
 
 
@@ -166,7 +167,7 @@ let translate_call ~fundec ~ghost block loc mk_call callee pars =
   (* Build an array to store addresses *)
   let addrs = List.map Cil.mkAddrOfVi vis in
   let vargs, assigns = Build.array_init ~loc fundec ~ghost block
-    "__va_args" Cil.voidPtrType addrs
+      "__va_args" Cil.voidPtrType addrs
   in
   let instrs = instrs @ [assigns] in
 
diff --git a/src/plugins/variadic/options.ml b/src/plugins/variadic/options.ml
index 3558df1885504ed9bbfda4bb10677f9e9df04042..352a1faf08f2cb92b8667558b43e1e39593ecf64 100644
--- a/src/plugins/variadic/options.ml
+++ b/src/plugins/variadic/options.ml
@@ -21,24 +21,24 @@
 (**************************************************************************)
 
 module Self = Plugin.Register
-  (struct
-    let name = "Variadic"
-    let shortname = "variadic"
-    let help = "Variadic functions translation"
-   end)
+    (struct
+      let name = "Variadic"
+      let shortname = "variadic"
+      let help = "Variadic functions translation"
+    end)
 
 module Enabled = Self.True
-  (struct
-    let option_name = "-variadic-translation"
-    let help = "translate variadic functions and calls to semantic \
-                equivalents with only a fixed list of formal parameters"
-   end)
+    (struct
+      let option_name = "-variadic-translation"
+      let help = "translate variadic functions and calls to semantic \
+                  equivalents with only a fixed list of formal parameters"
+    end)
 
 module Strict = Self.True
-  (struct
-    let option_name = "-variadic-strict"
-    let help = "display warnings about non-portable implicit casts in the \
-                calls of standard variadic functions, i.e. casts between \
-                distinct integral types which have the same size and \
-                signedness"
-   end)
+    (struct
+      let option_name = "-variadic-strict"
+      let help = "display warnings about non-portable implicit casts in the \
+                  calls of standard variadic functions, i.e. casts between \
+                  distinct integral types which have the same size and \
+                  signedness"
+    end)
diff --git a/src/plugins/variadic/register.ml b/src/plugins/variadic/register.ml
index 475b1f181c78bac60df11e2b7e052f1f28a9d951..73bf842cff4eaf7e93329f53df1a748f4308012e 100644
--- a/src/plugins/variadic/register.ml
+++ b/src/plugins/variadic/register.ml
@@ -20,8 +20,43 @@
 (*                                                                        *)
 (**************************************************************************)
 
+open Cil_types
+
 let category = File.register_code_transformation_category "variadic"
 
+(* Variadic will create prototype and specifications for some variadic
+   functions. Since only prototypes are created, the resulting source code isn't
+   compilable. This printer will print the original functions, with the replaced
+   prototypes in comments beside the instruction. *)
+let change_printer =
+  let first = ref true in
+  fun () ->
+    if !first then begin
+      first := false;
+      let module Printer_class(X: Printer.PrinterClass) = struct
+        class printer = object
+          inherit X.printer as super
+
+          method !instr fmt i =
+            match i with
+            (* If the instruction calls a function that have been replaced,
+               then build an instruction with the old function. *)
+            | Call(res, ({ enode = Lval(Var vi, o) } as fct), args, loc)
+              when Replacements.mem vi ->
+              let old_vi = Replacements.find vi in
+              let old_vi = { vi with vname = old_vi.vname } in
+              let old_instr =
+                Call(res, { fct with enode = Lval(Var old_vi, o) }, args, loc)
+              in
+              Format.fprintf fmt "%a /* %s */" super#instr old_instr vi.vname
+            (* Otherwise keep the instruction. *)
+            | _ ->
+              super#instr fmt i
+        end
+      end in
+      Printer.update_printer (module Printer_class: Printer.PrinterExtension)
+    end
+
 let () =
   Cmdline.run_after_extended_stage
     begin fun () ->
@@ -32,8 +67,10 @@ let () =
   Cmdline.run_after_configuring_stage
     begin fun () ->
       let translate file =
-        if Options.Enabled.get () then
+        if Options.Enabled.get () then begin
+          change_printer ();
           Translate.translate_variadics file
+        end
       in
       File.add_code_transformation_before_cleanup category translate
     end
diff --git a/src/plugins/variadic/replacements.ml b/src/plugins/variadic/replacements.ml
new file mode 100644
index 0000000000000000000000000000000000000000..ff16032054668bb851749277de87c1587f946a07
--- /dev/null
+++ b/src/plugins/variadic/replacements.ml
@@ -0,0 +1,41 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  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).            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* State to store the association between a replaced function and the original
+   function. *)
+module Replacements =
+  Cil_state_builder.Varinfo_hashtbl
+    (Cil_datatype.Varinfo)
+    (struct
+      let size = 17
+      let name = "replacements"
+      let dependencies = [ Options.Enabled.self; Options.Strict.self ]
+    end)
+
+let add new_vi old_vi =
+  Replacements.add new_vi old_vi
+
+let find new_vi =
+  Replacements.find new_vi
+
+let mem new_vi =
+  Replacements.mem new_vi
diff --git a/src/plugins/variadic/replacements.mli b/src/plugins/variadic/replacements.mli
new file mode 100644
index 0000000000000000000000000000000000000000..09539a4ab346b9dcc539cb77787ce186b32abb0e
--- /dev/null
+++ b/src/plugins/variadic/replacements.mli
@@ -0,0 +1,35 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  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 Cil_types
+
+val add: varinfo -> varinfo -> unit
+(** [add replaced original] stores the association of the original and the
+    replaced functions in a project state. *)
+
+val find: varinfo -> varinfo
+(* [find fct] returns the original function for [fct] from the project state if
+   it has been replaced. Raise [Not_found] if no original function exists. *)
+
+val mem: varinfo -> bool
+(* [mem fct] returns true if an original function exists for [fct], false
+   otherwise. *)
diff --git a/src/plugins/variadic/standard.ml b/src/plugins/variadic/standard.ml
index d80886c8c0501c6b987e0e2329bb8e2461e6aad4..bd3a6e656999a09ae0bf67088be27fbbe017a165 100644
--- a/src/plugins/variadic/standard.ml
+++ b/src/plugins/variadic/standard.ml
@@ -134,7 +134,7 @@ let cast_arg i paramtyp exp =
            The argument will be cast from %a to %a."
           (i + 1)
           pretty_typ argtyp pretty_typ paramtyp
-  end;
+    end;
   Cil.mkCast ~force:false ~e:exp ~newt:paramtyp
 
 
@@ -181,12 +181,12 @@ let find_null exp_list =
 let aggregator_call
     ~fundec ~ghost {a_target; a_pos; a_type; a_param} scope loc mk_call vf args =
   let name = vf.vf_decl.vorig_name
-  and tparams = Typ.params_types a_target.vtype 
+  and tparams = Typ.params_types a_target.vtype
   and pname, ptyp = a_param in
 
   (* Check argument count *)
   let argcount = List.length args
-  and paramcount = List.length tparams in 
+  and paramcount = List.length tparams in
   if argcount < paramcount then begin
     Self.warning ~current:true
       "Not enough arguments: expected %d, given %d."
@@ -195,14 +195,14 @@ let aggregator_call
   end;
 
   (* Compute the size of the aggregation *)
-  let size = match a_type with 
-  | EndedByNull ->
+  let size = match a_type with
+    | EndedByNull ->
       begin try
-        find_null (List.drop a_pos args) + 1
-      with Not_found ->
-        Self.warning ~current:true
-          "Failed to find a sentinel (NULL pointer) in the argument list.";
-        raise Translate_call_exn;
+          find_null (List.drop a_pos args) + 1
+        with Not_found ->
+          Self.warning ~current:true
+            "Failed to find a sentinel (NULL pointer) in the argument list.";
+          raise Translate_call_exn;
       end
   in
 
@@ -272,26 +272,29 @@ let overloaded_call ~fundec overload block loc mk_call vf args =
   let tparams, new_callee =
     match filter_matching_prototypes overload args with
     | [] -> (* No matching prototype *)
-        Self.warning ~current:true
-          "@[No matching prototype found for this call to %s.@.\
-           Expected candidates:@.\
-           @[<v>       %a@]@.\
-           Given arguments:@.\
-           @[<v>       %a@]"
-          name (pp_overload name) overload
-          (pp_prototype name) (List.map Cil.typeOf args);
-        raise Translate_call_exn;
+      Self.warning ~current:true
+        "@[No matching prototype found for this call to %s.@.\
+         Expected candidates:@.\
+         @[<v>       %a@]@.\
+         Given arguments:@.\
+         @[<v>       %a@]"
+        name (pp_overload name) overload
+        (pp_prototype name) (List.map Cil.typeOf args);
+      raise Translate_call_exn;
     | [(tparams,vi)] -> (* Exactly one matching prototype *)
-        tparams, vi
+      tparams, vi
     | l -> (* Several matching prototypes *)
-        Self.warning ~current:true
-          "Ambiguous call to %s. Matching candidates are: \
-           %a"
-          name
-          (pp_overload name) l;
-        raise Translate_call_exn;
+      Self.warning ~current:true
+        "Ambiguous call to %s. Matching candidates are: \
+         %a"
+        name
+        (pp_overload name) l;
+      raise Translate_call_exn;
   in
 
+  (* Store the translation *)
+  Replacements.add new_callee vf.vf_decl;
+
   (* Rebuild the call *)
   Self.result ~current:true ~level:2
     "Translating call to the specialized version %a."
@@ -328,7 +331,7 @@ let find_predicate name =
   | [] ->
     Self.warning ~once:true
       "Unable to locate ACSL predicate %s which should be in the Frama-C LibC. \
-      Correct specifications can't be generated."
+       Correct specifications can't be generated."
       name;
     None
 
@@ -393,17 +396,17 @@ let build_fun_spec env loc vf format_fun tvparams formals =
   let add_lval ~indirect (lval,dir) =
     (* Add the lval to the list of sources/dests *)
     begin match dir with
-    | (`ArgIn | `ArgInArray _) -> insert_source ~indirect lval
-    | (`ArgOut | `ArgOutArray) -> insert_dest lval
-    | `ArgInOut -> insert_source ~indirect lval; insert_dest lval
+      | (`ArgIn | `ArgInArray _) -> insert_source ~indirect lval
+      | (`ArgOut | `ArgOutArray) -> insert_dest lval
+      | `ArgInOut -> insert_source ~indirect lval; insert_dest lval
     end
   in
   let add_var ?pos (vi,dir) =
     (* Use the appropriate logical lval *)
     let lval = match dir with
-    | `ArgIn -> Build.lvar vi
-    | (`ArgInArray _ | `ArgOutArray) -> Build.trange_from_vi ~loc vi
-    | (`ArgOut | `ArgInOut) -> Build.tvarmem ~loc vi
+      | `ArgIn -> Build.lvar vi
+      | (`ArgInArray _ | `ArgOutArray) -> Build.trange_from_vi ~loc vi
+      | (`ArgOut | `ArgInOut) -> Build.tvarmem ~loc vi
     in
     (* Build requires/ensures *)
     let term = Build.tvar ~loc vi in
@@ -430,7 +433,7 @@ let build_fun_spec env loc vf format_fun tvparams formals =
             let labels = List.map (fun _ -> here) logic_info.l_labels in
             let nterm = match precision with
               | PStar ->
-                let n_vi = List.nth vformals (Extlib.the pos) in
+                let n_vi = List.nth vformals (Option.get pos) in
                 Logic_utils.numeric_coerce Linteger (Build.tvar ~loc n_vi)
               | PInt n -> Cil.lconstant ~loc (Integer.of_int n)
             in
@@ -474,17 +477,17 @@ let build_fun_spec env loc vf format_fun tvparams formals =
     (* assigns stream->__fc_FILE_data
          \from stream->__fc_FILE_data, __fc_FILE_id *)
     begin match find_field env "__fc_FILE" "__fc_FILE_data" with
-    | Some fieldinfo ->
+      | Some fieldinfo ->
         let varfield = Build.tvarfield ~loc vi fieldinfo in
         add_lval ~indirect:false (varfield, `ArgInOut)
-    | None ->
+      | None ->
         add_var ~indirect:false (vi, `ArgInOut)
     end;
     begin match find_field env "__fc_FILE" "__fc_FILE_id" with
-    | Some fieldinfo ->
+      | Some fieldinfo ->
         let varfield = Build.tvarfield ~loc vi fieldinfo in
         add_lval ~indirect:true (varfield, `ArgIn)
-    | None -> ()
+      | None -> ()
     end
   in
 
@@ -524,31 +527,31 @@ let build_fun_spec env loc vf format_fun tvparams formals =
   in
 
   begin match format_fun.f_buffer, format_fun.f_kind with
-  | StdIO, ScanfLike ->
+    | StdIO, ScanfLike ->
       begin match find_global env "__fc_stdin" with
-      | Some vi -> add_stream vi
-      | None -> ()
+        | Some vi -> add_stream vi
+        | None -> ()
       end
-  | StdIO, PrintfLike ->
+    | StdIO, PrintfLike ->
       begin match find_global env "__fc_stdout" with
-      | Some vi -> add_stream vi
-      | None -> ()
+        | Some vi -> add_stream vi
+        | None -> ()
       end
-  | Arg (i, _), ScanfLike ->
+    | Arg (i, _), ScanfLike ->
       add_var ~indirect:true (List.nth sformals i, `ArgInArray None)
-  | Arg (i, size_pos), PrintfLike ->
+    | Arg (i, size_pos), PrintfLike ->
       add_var ~indirect:true (List.nth sformals i, `ArgOutArray);
       begin match size_pos with
-      | Some n ->
-        add_buffer (List.nth sformals i) (List.nth sformals n)
-      | None -> ()
+        | Some n ->
+          add_buffer (List.nth sformals i) (List.nth sformals n)
+        | None -> ()
       end
-  | Stream i, _ ->
+    | Stream i, _ ->
       add_stream (List.nth sformals i)
-  | File i, _ ->
+    | File i, _ ->
       let file = List.nth sformals i in
       add_var ~indirect:true (file, `ArgIn);
-  | Syslog, _ -> ()
+    | Syslog, _ -> ()
   end;
 
   (* Build the assigns clause (without \result, for now; it will be added
@@ -568,7 +571,7 @@ let build_fun_spec env loc vf format_fun tvparams formals =
 
   (* Build the default behaviour *)
   let bhv = Cil.mk_behavior ~assigns
-    ~requires:!requires ~post_cond:!ensures () in
+      ~requires:!requires ~post_cond:!ensures () in
   { (Cil.empty_funspec ()) with spec_behavior = [bhv] }
 
 
@@ -579,7 +582,7 @@ let format_fun_call ~fundec env format_fun scope loc mk_call vf args =
   and params = Typ.params vf.vf_decl.vtype in
   (* Remove the va_param parameter added during the declaration visit *)
   let fixed_params_count = Typ.params_count vf.vf_original_type in
-  let sparams = List.take fixed_params_count params in 
+  let sparams = List.take fixed_params_count params in
 
   (* Extract the format if possible *)
   let format =
@@ -635,6 +638,9 @@ let format_fun_call ~fundec env format_fun scope loc mk_call vf args =
   new_callee.vname <- new_name;
   new_globals := glob :: !new_globals;
 
+  (* Store the translation *)
+  Replacements.add new_callee vf.vf_decl;
+
   (* Translate the call *)
   Self.result ~current:true ~level:2
     "Translating call to %s to a call to the specialized version %s."
diff --git a/src/plugins/variadic/tests/defined/maintain-formals-order.i b/src/plugins/variadic/tests/defined/maintain-formals-order.i
new file mode 100644
index 0000000000000000000000000000000000000000..4c525164291ee7619d63f6e5165cfc88458ca923
--- /dev/null
+++ b/src/plugins/variadic/tests/defined/maintain-formals-order.i
@@ -0,0 +1,16 @@
+/*@ requires c == 0 && x == 1 ; */
+void f(int x,...) /*@ ghost(int c) */ {
+  /*@ ghost int g = c; */
+}
+
+/*@ requires c == 0 && x == 1 && y == 2; */
+void g(int x, int y,...) /*@ ghost(int c) */ {
+  /*@ ghost int g = c; */
+}
+
+void main(void){
+  f(1) /*@ ghost(0) */;
+  f(1, 2, 3) /*@ ghost(0) */;
+
+  g(1, 2, 3, 4) /*@ ghost(0) */;
+}
diff --git a/src/plugins/variadic/tests/defined/oracle/maintain-formals-order.res.oracle b/src/plugins/variadic/tests/defined/oracle/maintain-formals-order.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..814fcfccf9b5141dbf6b66536f66b7bafc37085d
--- /dev/null
+++ b/src/plugins/variadic/tests/defined/oracle/maintain-formals-order.res.oracle
@@ -0,0 +1,58 @@
+[variadic] tests/defined/maintain-formals-order.i:2: 
+  Declaration of variadic function f.
+[variadic] tests/defined/maintain-formals-order.i:7: 
+  Declaration of variadic function g.
+[variadic] tests/defined/maintain-formals-order.i:12: 
+  Generic translation of call to variadic function.
+[variadic] tests/defined/maintain-formals-order.i:13: 
+  Generic translation of call to variadic function.
+[variadic] tests/defined/maintain-formals-order.i:15: 
+  Generic translation of call to variadic function.
+[eva] Analyzing a complete application starting at main
+[eva] Computing initial state
+[eva] Initial state computed
+[eva] done for function main
+[eva] ====== VALUES COMPUTED ======
+[eva:final-states] Values at end of function f:
+  g_0 ∈ {0}
+[eva:final-states] Values at end of function g:
+  g_0 ∈ {0}
+[eva:final-states] Values at end of function main:
+  
+/* Generated by Frama-C */
+/*@ requires c ≡ 0 ∧ x ≡ 1; */
+void f(int x, void * const *__va_params) /*@ ghost (int c) */
+{
+  /*@ ghost int g_0 = c; */
+  return;
+}
+
+/*@ requires c ≡ 0 ∧ x ≡ 1 ∧ y ≡ 2; */
+void g(int x, int y, void * const *__va_params) /*@ ghost (int c) */
+{
+  /*@ ghost int g_0 = c; */
+  return;
+}
+
+void main(void)
+{
+  {
+    void *__va_args[1] = {(void *)0};
+    f(1,(void * const *)(__va_args)) /*@ ghost (0) */;
+  }
+  {
+    int __va_arg0 = 2;
+    int __va_arg1 = 3;
+    void *__va_args_5[2] = {& __va_arg0, & __va_arg1};
+    f(1,(void * const *)(__va_args_5)) /*@ ghost (0) */;
+  }
+  {
+    int __va_arg0_7 = 3;
+    int __va_arg1_9 = 4;
+    void *__va_args_11[2] = {& __va_arg0_7, & __va_arg1_9};
+    g(1,2,(void * const *)(__va_args_11)) /*@ ghost (0) */;
+  }
+  return;
+}
+
+
diff --git a/src/plugins/variadic/tests/defined/oracle/multiple-va_start.res.oracle b/src/plugins/variadic/tests/defined/oracle/multiple-va_start.res.oracle
index ed8db7e16c2c76851c57c5f18703ec0388a7438c..4a7f5d5fa84039e348473e24740363458d4665f9 100644
--- a/src/plugins/variadic/tests/defined/oracle/multiple-va_start.res.oracle
+++ b/src/plugins/variadic/tests/defined/oracle/multiple-va_start.res.oracle
@@ -51,7 +51,7 @@ int *pack(int first, void * const *__va_params)
     if (! tmp) break;
     size ++;
   }
-  ret = (int *)malloc(sizeof(int) * (unsigned int)(size + 1));
+  ret = (int *)malloc(sizeof(int) * (unsigned long)(size + 1));
   *(ret + 0) = first;
   list = __va_params;
   i = 0;
diff --git a/src/plugins/variadic/tests/defined/oracle/va_copy.res.oracle b/src/plugins/variadic/tests/defined/oracle/va_copy.res.oracle
index 9555e18f785dde9f7d2049cfb8c922e47ca3c056..00a66cccb7629bd6cfcd2d4f0433cb44b48cce1c 100644
--- a/src/plugins/variadic/tests/defined/oracle/va_copy.res.oracle
+++ b/src/plugins/variadic/tests/defined/oracle/va_copy.res.oracle
@@ -53,7 +53,7 @@ int *pack(int first, void * const *__va_params)
     if (! tmp) break;
     size ++;
   }
-  ret = (int *)malloc(sizeof(int) * (unsigned int)(size + 1));
+  ret = (int *)malloc(sizeof(int) * (unsigned long)(size + 1));
   *(ret + 0) = first;
   i = 0;
   while (i < size) {
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 fe7b25d331e7da82dc7d73580c6b78fec036c642..c6539a4471fbc4b95e7a5f2b26fcf1d77712bcda 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] variadic-builtin.i:5: 
   Variadic builtin Frama_C_show_each_warning left untransformed.
-[kernel] Plug-in variadic aborted: unimplemented feature.
+[kernel] tests/erroneous/variadic-builtin.i:6: Plug-in variadic aborted: unimplemented feature.
   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/known/oracle/fcntl.res.oracle b/src/plugins/variadic/tests/known/oracle/fcntl.res.oracle
index b2369bbf643aee5bf7d2d7dedb56930657f30128..2ccf2b8f797cda387a41d00fe74d8fd5bd1ea27b 100644
--- a/src/plugins/variadic/tests/known/oracle/fcntl.res.oracle
+++ b/src/plugins/variadic/tests/known/oracle/fcntl.res.oracle
@@ -57,8 +57,8 @@ int main(void)
   struct flock fl;
   int volatile choice = 0;
   int flags = __va_fcntl_void(0,1);
-  __va_fcntl_int(0,2,flags);
-  __va_fcntl_flock(0,5,& fl);
+  fcntl(0,2,flags); /* __va_fcntl_int */
+  fcntl(0,5,& fl); /* __va_fcntl_flock */
   switch (choice) {
     case 1:
     {
@@ -67,8 +67,8 @@ int main(void)
       void *__va_args[2] = {& __va_arg0, & __va_arg1};
       fcntl(0,2,(void * const *)(__va_args));
     }
-    case 2: __va_fcntl_void(0,2);
-    case 3: __va_fcntl_flock(0,2,& fl);
+    case 2: fcntl(0,2); /* __va_fcntl_void */
+    case 3: fcntl(0,2,& fl); /* __va_fcntl_flock */
     case 4:
     {
       double __va_arg0_9 = 0.5;
diff --git a/src/plugins/variadic/tests/known/oracle/ioctl.res.oracle b/src/plugins/variadic/tests/known/oracle/ioctl.res.oracle
index f7eb492e339bf8ebf8a0dc9a5b45c88dc3168ee4..fd7fdfcc32c9e86a17959de1768bb55a3c6d6826 100644
--- a/src/plugins/variadic/tests/known/oracle/ioctl.res.oracle
+++ b/src/plugins/variadic/tests/known/oracle/ioctl.res.oracle
@@ -41,8 +41,8 @@ int main(void)
   char arg = (char)42;
   int r2 = __va_ioctl_ptr(fd1,request1,(void *)(& arg));
   struct st *p = (struct st *)0;
-  __va_ioctl_ptr(fd1,request1,(void *)p);
-  __va_ioctl_int(fd1,request1,42);
+  ioctl(fd1,request1,(void *)p); /* __va_ioctl_ptr */
+  ioctl(fd1,request1,42); /* __va_ioctl_int */
   __retres = 0;
   return __retres;
 }
diff --git a/src/plugins/variadic/tests/known/oracle/openat.res.oracle b/src/plugins/variadic/tests/known/oracle/openat.res.oracle
index daaa34b4a43db6294e6e7c5409d5c36fa3a4c325..85a14fd802e8947a67b93977e1116d9e104942e2 100644
--- a/src/plugins/variadic/tests/known/oracle/openat.res.oracle
+++ b/src/plugins/variadic/tests/known/oracle/openat.res.oracle
@@ -39,8 +39,8 @@ int main(void)
   mode_t mode1 = (unsigned int)0;
   int mode2 = 0;
   char *file = (char *)"file";
-  __va_openat_mode_t(0,(char const *)file,flag,mode1);
-  __va_openat_mode_t(0,(char const *)file,flag,(mode_t)mode2);
+  openat(0,(char const *)file,flag,mode1); /* __va_openat_mode_t */
+  openat(0,(char const *)file,flag,(mode_t)mode2); /* __va_openat_mode_t */
   {
     double __va_arg0 = 3.0;
     void *__va_args[1] = {& __va_arg0};
diff --git a/src/plugins/variadic/tests/known/oracle/print_libc.pretty.c b/src/plugins/variadic/tests/known/oracle/print_libc.pretty.c
index 3a496e7bf57c8b5807bd005cfec8ac6a811db5c0..ef17d7a18c478a7a9028d3a32a614967d7f4f413 100644
--- a/src/plugins/variadic/tests/known/oracle/print_libc.pretty.c
+++ b/src/plugins/variadic/tests/known/oracle/print_libc.pretty.c
@@ -18,7 +18,7 @@ int printf_va_1(char const * __restrict format);
 int main(void)
 {
   int __retres;
-  printf_va_1("");
+  printf(""); /* printf_va_1 */
   __retres = 0;
   return __retres;
 }
@@ -41,10 +41,22 @@ int main(void)
  */
 int printf_va_1(char const * __restrict format);
 
+/*@ requires valid_read_string(format);
+    assigns \result, __fc_stdout->__fc_FILE_data;
+    assigns \result
+      \from (indirect: __fc_stdout->__fc_FILE_id),
+            (indirect: __fc_stdout->__fc_FILE_data),
+            (indirect: *(format + (0 ..)));
+    assigns __fc_stdout->__fc_FILE_data
+      \from (indirect: __fc_stdout->__fc_FILE_id),
+            __fc_stdout->__fc_FILE_data, (indirect: *(format + (0 ..)));
+ */
+int printf_va_1(char const * __restrict format);
+
 int main(void)
 {
   int __retres;
-  printf_va_1("");
+  printf(""); /* printf_va_1 */
   __retres = 0;
   return __retres;
 }
diff --git a/src/plugins/variadic/tests/known/oracle/printf.res.oracle b/src/plugins/variadic/tests/known/oracle/printf.res.oracle
index d931c3d8f5a750121e3d5de79dea3c76378a820e..176ee79595fb094630cafb8ddab13f89e9de8747 100644
--- a/src/plugins/variadic/tests/known/oracle/printf.res.oracle
+++ b/src/plugins/variadic/tests/known/oracle/printf.res.oracle
@@ -467,7 +467,7 @@ int printf_va_18(char const * __restrict format, size_t param0,
             __fc_stdout->__fc_FILE_data, (indirect: *(format + (0 ..))),
             param0;
  */
-int printf_va_19(char const * __restrict format, unsigned long long param0);
+int printf_va_19(char const * __restrict format, unsigned long param0);
 
 /*@ requires valid_read_string(format);
     assigns \result, __fc_stdout->__fc_FILE_data;
@@ -493,7 +493,7 @@ int printf_va_20(char const * __restrict format, int param0);
             __fc_stdout->__fc_FILE_data, (indirect: *(format + (0 ..))),
             param0;
  */
-int printf_va_21(char const * __restrict format, unsigned long long param0);
+int printf_va_21(char const * __restrict format, unsigned long param0);
 
 /*@ requires valid_read_string(format);
     assigns \result, __fc_stdout->__fc_FILE_data;
@@ -616,36 +616,36 @@ int main(void)
   uintmax_t uj = (unsigned long long)42;
   double f = (double)42.0f;
   long double L = 42.0l;
-  uint64_t u64 = (unsigned long long)42ul;
+  uint64_t u64 = 42ul;
   int8_t i8 = (signed char)42;
-  uint_least64_t uleast64 = (unsigned long long)42u;
+  uint_least64_t uleast64 = (unsigned long)42u;
   int_fast32_t ifast32 = 42;
-  printf_va_1("Hello world !\n");
-  printf_va_2("%s%n",string,& i);
-  printf_va_3("%ls",wstring);
-  printf_va_4("%d %hhn",i,& hh);
-  printf_va_5("%hhi %hn",(int)hh,& h);
-  printf_va_6("%hd %ln",(int)h,& l);
-  printf_va_7("%li %lln",l,& ll);
-  printf_va_8("%lld %jn",ll,& j);
-  printf_va_9("%jd %zn",j,& z);
-  printf_va_10("%zd %tn",z,& t);
-  printf_va_11("%td\n",t);
-  printf_va_12("%u ",ui);
-  printf_va_13("%hho ",(int)uhh);
-  printf_va_14("%hx ",(int)uh);
-  printf_va_15("%lX ",ul);
-  printf_va_16("%llu ",ull);
-  printf_va_17("%jo ",uj);
-  printf_va_18("%zx %tX\n",z,t);
-  printf_va_19("%llu",u64);
-  printf_va_20("%hhi",(int)i8);
-  printf_va_21("%llx",uleast64);
-  printf_va_22("%d",ifast32);
-  printf_va_23("%f %Le\n",f,L);
-  printf_va_24("%c\n",(int)c);
-  printf_va_25("%p ",(void *)string);
-  printf_va_26("%d %*.*u\n",1,- (-1),2,ui);
+  printf("Hello world !\n"); /* printf_va_1 */
+  printf("%s%n",string,& i); /* printf_va_2 */
+  printf("%ls",wstring); /* printf_va_3 */
+  printf("%d %hhn",i,& hh); /* printf_va_4 */
+  printf("%hhi %hn",(int)hh,& h); /* printf_va_5 */
+  printf("%hd %ln",(int)h,& l); /* printf_va_6 */
+  printf("%li %lln",l,& ll); /* printf_va_7 */
+  printf("%lld %jn",ll,& j); /* printf_va_8 */
+  printf("%jd %zn",j,& z); /* printf_va_9 */
+  printf("%zd %tn",z,& t); /* printf_va_10 */
+  printf("%td\n",t); /* printf_va_11 */
+  printf("%u ",ui); /* printf_va_12 */
+  printf("%hho ",(int)uhh); /* printf_va_13 */
+  printf("%hx ",(int)uh); /* printf_va_14 */
+  printf("%lX ",ul); /* printf_va_15 */
+  printf("%llu ",ull); /* printf_va_16 */
+  printf("%jo ",uj); /* printf_va_17 */
+  printf("%zx %tX\n",z,t); /* printf_va_18 */
+  printf("%lu",u64); /* printf_va_19 */
+  printf("%hhi",(int)i8); /* printf_va_20 */
+  printf("%lx",uleast64); /* printf_va_21 */
+  printf("%d",ifast32); /* printf_va_22 */
+  printf("%f %Le\n",f,L); /* printf_va_23 */
+  printf("%c\n",(int)c); /* printf_va_24 */
+  printf("%p ",(void *)string); /* printf_va_25 */
+  printf("%d %*.*u\n",1,- (-1),2,ui); /* printf_va_26 */
   {
     unsigned int __va_arg0 = ui;
     char *__va_arg1 = string;
@@ -655,8 +655,8 @@ int main(void)
            (void * const *)(__va_args));
   }
   char hashes[4] = {(char)'#', (char)'#', (char)'#', (char)'#'};
-  printf_va_27("%.*s",4,hashes);
-  printf_va_28("%.4s",hashes);
+  printf("%.*s",4,hashes); /* printf_va_27 */
+  printf("%.4s",hashes); /* printf_va_28 */
   __retres = 0;
   return __retres;
 }
diff --git a/src/plugins/variadic/tests/known/oracle/printf_garbled_mix.res.oracle b/src/plugins/variadic/tests/known/oracle/printf_garbled_mix.res.oracle
index cb86d6d7405cf929171ea9d0371269946be60937..2a608a443b94c8d904773ecc7ea4c5e128f18d37 100644
--- a/src/plugins/variadic/tests/known/oracle/printf_garbled_mix.res.oracle
+++ b/src/plugins/variadic/tests/known/oracle/printf_garbled_mix.res.oracle
@@ -23,9 +23,21 @@
 [eva] Initial state computed
 [eva] printf_garbled_mix.c:6: 
   Assigning imprecise value to b.
+<<<<<<< HEAD
   The imprecision originates from Arithmetic {printf_garbled_mix.c:6}
 [eva:alarm] printf_garbled_mix.c:7: Warning: 
   pointer downcast. assert (unsigned int)b ≤ 2147483647;
+||||||| ac7807782d
+  The imprecision originates from Arithmetic
+  {tests/known/printf_garbled_mix.c:6}
+[eva:alarm] tests/known/printf_garbled_mix.c:7: Warning: 
+  pointer downcast. assert (unsigned int)b ≤ 2147483647;
+=======
+  The imprecision originates from Arithmetic
+  {tests/known/printf_garbled_mix.c:6}
+[eva:alarm] tests/known/printf_garbled_mix.c:7: Warning: 
+  pointer downcast. assert (unsigned long)b ≤ 2147483647;
+>>>>>>> origin/master
 [eva] using specification for function printf_va_1
 [eva] printf_garbled_mix.c:8: 
   Frama_C_show_each_nb_printed: [-2147483648..2147483647]
@@ -66,8 +78,8 @@ int printf_va_1(char const * __restrict format, int param0);
 void main(void)
 {
   int a[2] = {1, 2};
-  int *b = (int *)((unsigned int)(a) * (unsigned int)2);
-  /*@ assert Eva: pointer_downcast: (unsigned int)b ≤ 2147483647; */
+  int *b = (int *)((unsigned long)(a) * (unsigned long)2);
+  /*@ assert Eva: pointer_downcast: (unsigned long)b ≤ 2147483647; */
   int nb_printed = printf_va_1("%d",(int)b);
   Frama_C_show_each_nb_printed(nb_printed);
   b = (int *)0;
diff --git a/src/plugins/variadic/tests/known/oracle/printf_redefined.res.oracle b/src/plugins/variadic/tests/known/oracle/printf_redefined.res.oracle
index a646cae3da3383e57d8dc67dab11b006c9106afd..9faf1439684319092eb39cfc339747168c607d72 100644
--- a/src/plugins/variadic/tests/known/oracle/printf_redefined.res.oracle
+++ b/src/plugins/variadic/tests/known/oracle/printf_redefined.res.oracle
@@ -24,7 +24,7 @@ int printf_va_1(char const * __restrict __format, size_t param0);
 void main(void)
 {
   long x = (long)0;
-  printf_va_1("%zd\n",(size_t)x);
+  printf("%zd\n",(size_t)x); /* printf_va_1 */
   return;
 }
 
diff --git a/src/plugins/variadic/tests/known/oracle/printf_wrong_arity.res.oracle b/src/plugins/variadic/tests/known/oracle/printf_wrong_arity.res.oracle
index 877cda5b45460b3c356af709c49547868e352bbd..46b4decb8e2db03d09501d507cd6f8d676320177 100644
--- a/src/plugins/variadic/tests/known/oracle/printf_wrong_arity.res.oracle
+++ b/src/plugins/variadic/tests/known/oracle/printf_wrong_arity.res.oracle
@@ -77,7 +77,7 @@ int main(void)
   int __retres;
   {
     int tmp = 2;
-    printf_va_1("%d",1);
+    printf("%d",1); /* printf_va_1 */
   }
   {
     int __va_arg0 = 1;
diff --git a/src/plugins/variadic/tests/known/oracle/printf_wrong_pointers.res.oracle b/src/plugins/variadic/tests/known/oracle/printf_wrong_pointers.res.oracle
index e9d4d2698cf1befb61f4079299cfbba76d15889a..68a4fce7cf76b010a73ba608a5049c637c2ca595 100644
--- a/src/plugins/variadic/tests/known/oracle/printf_wrong_pointers.res.oracle
+++ b/src/plugins/variadic/tests/known/oracle/printf_wrong_pointers.res.oracle
@@ -140,11 +140,11 @@ int main(void)
   wchar_t *wstring = (wchar_t *)L"b" "a" "r" ;
   int volatile nondet = 0;
   switch (nondet) {
-    case 0: printf_va_1("%n",(int *)(& tt));
-    case 1: printf_va_2("%n",(int *)(& ui));
-    case 2: printf_va_3("%hhn",(signed char *)string);
-    case 3: printf_va_4("%s",(char *)wstring);
-    case 4: printf_va_5("%ls",(wchar_t *)string);
+    case 0: printf("%n",(int *)(& tt)); /* printf_va_1 */
+    case 1: printf("%n",(int *)(& ui)); /* printf_va_2 */
+    case 2: printf("%hhn",(signed char *)string); /* printf_va_3 */
+    case 3: printf("%s",(char *)wstring); /* printf_va_4 */
+    case 4: printf("%ls",(wchar_t *)string); /* printf_va_5 */
   }
   __retres = 0;
   return __retres;
diff --git a/src/plugins/variadic/tests/known/oracle/printf_wrong_types.res.oracle b/src/plugins/variadic/tests/known/oracle/printf_wrong_types.res.oracle
index 5c3fe3b0d660aa0b2d9d047f37445de49b02afcc..869c89eba47e7c31206d885a9e1a08cf9cb1c456 100644
--- a/src/plugins/variadic/tests/known/oracle/printf_wrong_types.res.oracle
+++ b/src/plugins/variadic/tests/known/oracle/printf_wrong_types.res.oracle
@@ -326,23 +326,23 @@ int main(void)
   float f = 42.0f;
   long double ld = 42.0l;
   char *string = (char *)"42";
-  printf_va_1("%hhd",(int)c);
-  printf_va_2("%d",(int)ui);
-  printf_va_3("%x",(unsigned int)i);
-  printf_va_4("%ld",(long)i);
-  printf_va_5("%d",(int)li);
-  printf_va_6("%lu",(unsigned long)ui);
-  printf_va_7("%u",(unsigned int)uli);
-  printf_va_8("%p",(void *)ui);
-  printf_va_9("%f",(double)f);
-  printf_va_10("%f",(double)ld);
-  printf_va_11("%lf",(double)ld);
-  printf_va_12("%Lf",(long double)((double)f));
-  printf_va_13("%s",(char *)i);
-  printf_va_14("%d",(int)string);
+  printf("%hhd",(int)c); /* printf_va_1 */
+  printf("%d",(int)ui); /* printf_va_2 */
+  printf("%x",(unsigned int)i); /* printf_va_3 */
+  printf("%ld",(long)i); /* printf_va_4 */
+  printf("%d",(int)li); /* printf_va_5 */
+  printf("%lu",(unsigned long)ui); /* printf_va_6 */
+  printf("%u",(unsigned int)uli); /* printf_va_7 */
+  printf("%p",(void *)ui); /* printf_va_8 */
+  printf("%f",(double)f); /* printf_va_9 */
+  printf("%f",(double)ld); /* printf_va_10 */
+  printf("%lf",(double)ld); /* printf_va_11 */
+  printf("%Lf",(long double)((double)f)); /* printf_va_12 */
+  printf("%s",(char *)i); /* printf_va_13 */
+  printf("%d",(int)string); /* printf_va_14 */
   RC rc = OK;
-  printf_va_15("%u",rc);
-  printf_va_16("%d",(int)rc);
+  printf("%u",rc); /* printf_va_15 */
+  printf("%d",(int)rc); /* printf_va_16 */
   __retres = 0;
   return __retres;
 }
@@ -438,13 +438,45 @@ int main(void)
   Incorrect type for argument 2. The argument will be cast from int to unsigned int.
 [variadic] printf_wrong_types.c:21: 
   Translating call to printf to a call to the specialized version printf_va_4.
+<<<<<<< HEAD
 [variadic] printf_wrong_types.c:22: 
+||||||| ac7807782d
+[variadic] tests/known/printf_wrong_types.c:22: 
+=======
+[variadic] tests/known/printf_wrong_types.c:21: Warning: 
+  Incorrect type for argument 2. The argument will be cast from int to long.
+[variadic] tests/known/printf_wrong_types.c:22: 
+>>>>>>> origin/master
   Translating call to printf to a call to the specialized version printf_va_5.
+<<<<<<< HEAD
 [variadic] printf_wrong_types.c:23: 
+||||||| ac7807782d
+[variadic] tests/known/printf_wrong_types.c:23: 
+=======
+[variadic] tests/known/printf_wrong_types.c:22: Warning: 
+  Incorrect type for argument 2. The argument will be cast from long to int.
+[variadic] tests/known/printf_wrong_types.c:23: 
+>>>>>>> origin/master
   Translating call to printf to a call to the specialized version printf_va_6.
+<<<<<<< HEAD
 [variadic] printf_wrong_types.c:24: 
+||||||| ac7807782d
+[variadic] tests/known/printf_wrong_types.c:24: 
+=======
+[variadic] tests/known/printf_wrong_types.c:23: Warning: 
+  Incorrect type for argument 2. The argument will be cast from unsigned int to unsigned long.
+[variadic] tests/known/printf_wrong_types.c:24: 
+>>>>>>> origin/master
   Translating call to printf to a call to the specialized version printf_va_7.
+<<<<<<< HEAD
 [variadic] printf_wrong_types.c:25: 
+||||||| ac7807782d
+[variadic] tests/known/printf_wrong_types.c:25: 
+=======
+[variadic] tests/known/printf_wrong_types.c:24: Warning: 
+  Incorrect type for argument 2. The argument will be cast from unsigned long to unsigned int.
+[variadic] tests/known/printf_wrong_types.c:25: 
+>>>>>>> origin/master
   Translating call to printf to a call to the specialized version printf_va_8.
 [variadic] printf_wrong_types.c:25: Warning: 
   Incorrect type for argument 2. The argument will be cast from unsigned int to void *.
@@ -728,23 +760,23 @@ int main(void)
   float f = 42.0f;
   long double ld = 42.0l;
   char *string = (char *)"42";
-  printf_va_1("%hhd",(int)c);
-  printf_va_2("%d",(int)ui);
-  printf_va_3("%x",(unsigned int)i);
-  printf_va_4("%ld",(long)i);
-  printf_va_5("%d",(int)li);
-  printf_va_6("%lu",(unsigned long)ui);
-  printf_va_7("%u",(unsigned int)uli);
-  printf_va_8("%p",(void *)ui);
-  printf_va_9("%f",(double)f);
-  printf_va_10("%f",(double)ld);
-  printf_va_11("%lf",(double)ld);
-  printf_va_12("%Lf",(long double)((double)f));
-  printf_va_13("%s",(char *)i);
-  printf_va_14("%d",(int)string);
+  printf("%hhd",(int)c); /* printf_va_1 */
+  printf("%d",(int)ui); /* printf_va_2 */
+  printf("%x",(unsigned int)i); /* printf_va_3 */
+  printf("%ld",(long)i); /* printf_va_4 */
+  printf("%d",(int)li); /* printf_va_5 */
+  printf("%lu",(unsigned long)ui); /* printf_va_6 */
+  printf("%u",(unsigned int)uli); /* printf_va_7 */
+  printf("%p",(void *)ui); /* printf_va_8 */
+  printf("%f",(double)f); /* printf_va_9 */
+  printf("%f",(double)ld); /* printf_va_10 */
+  printf("%lf",(double)ld); /* printf_va_11 */
+  printf("%Lf",(long double)((double)f)); /* printf_va_12 */
+  printf("%s",(char *)i); /* printf_va_13 */
+  printf("%d",(int)string); /* printf_va_14 */
   RC rc = OK;
-  printf_va_15("%u",rc);
-  printf_va_16("%d",(int)rc);
+  printf("%u",rc); /* printf_va_15 */
+  printf("%d",(int)rc); /* printf_va_16 */
   __retres = 0;
   return __retres;
 }
diff --git a/src/plugins/variadic/tests/known/oracle/scanf.res.oracle b/src/plugins/variadic/tests/known/oracle/scanf.res.oracle
index d17dc46fdfc7c87f8e0a68a22364539aba92fd53..c4f6102941d44c9e1f648543b57dfb9aa2d39413 100644
--- a/src/plugins/variadic/tests/known/oracle/scanf.res.oracle
+++ b/src/plugins/variadic/tests/known/oracle/scanf.res.oracle
@@ -65,7 +65,7 @@ int main(void)
   int __retres;
   char c[10];
   int i;
-  scanf_va_1("Hello %*10le %% %10s %[^]world] %d !",c,c,& i);
+  scanf("Hello %*10le %% %10s %[^]world] %d !",c,c,& i); /* scanf_va_1 */
   __retres = 0;
   return __retres;
 }
diff --git a/src/plugins/variadic/tests/known/oracle/scanf_loop.res.oracle b/src/plugins/variadic/tests/known/oracle/scanf_loop.res.oracle
index d71ca00da1d52d361b02e2dba34e22298d815622..eea22281eec5c9cda81d1abb410fad64bc4aa027 100644
--- a/src/plugins/variadic/tests/known/oracle/scanf_loop.res.oracle
+++ b/src/plugins/variadic/tests/known/oracle/scanf_loop.res.oracle
@@ -53,7 +53,7 @@ int main(void)
   int n;
   while (1) {
     int tmp;
-    tmp = scanf_va_1("%d",& n);
+    tmp = scanf("%d",& n); /* scanf_va_1 */
     if (! (tmp > 0)) break;
     if (nondet) break;
   }
diff --git a/src/plugins/variadic/tests/known/oracle/scanf_wrong.res.oracle b/src/plugins/variadic/tests/known/oracle/scanf_wrong.res.oracle
index 7b566523a1a283f86674cb61fb69147cfc7807b5..435eb23044b93d426b07f71fca557533834effce 100644
--- a/src/plugins/variadic/tests/known/oracle/scanf_wrong.res.oracle
+++ b/src/plugins/variadic/tests/known/oracle/scanf_wrong.res.oracle
@@ -67,7 +67,7 @@ int main(void)
   char c[10];
   int i;
   /*@ assert Eva: initialization: \initialized(&d); */
-  scanf_va_1("Hello %*10le %% %10s %[^]world] %d !",(char *)d,c,& i);
+  scanf("Hello %*10le %% %10s %[^]world] %d !",(char *)d,c,& i); /* scanf_va_1 */
   __retres = 0;
   return __retres;
 }
diff --git a/src/plugins/variadic/tests/known/oracle/snprintf.res.oracle b/src/plugins/variadic/tests/known/oracle/snprintf.res.oracle
index e1ba032c95ba2f2e65c190d7121ee448a2cf9e59..01e469898179241648342fd27d667975b0196a73 100644
--- a/src/plugins/variadic/tests/known/oracle/snprintf.res.oracle
+++ b/src/plugins/variadic/tests/known/oracle/snprintf.res.oracle
@@ -84,17 +84,17 @@ int main(void)
   int __retres;
   char data[100];
   size_t tmp_0;
-  memset((void *)(data),'A',(unsigned int)99);
+  memset((void *)(data),'A',(unsigned long)99);
   data[99] = (char)0;
   char dest[50] = {(char)'\000'};
   if (nondet) {
     size_t tmp;
     tmp = strlen((char const *)(data));
-    snprintf_va_1(dest,tmp,"%s",data);
+    snprintf(dest,tmp,"%s",data); /* snprintf_va_1 */
     /*@ assert \false; */ ;
   }
   tmp_0 = strlen((char const *)(data));
-  snprintf_va_2(dest,tmp_0 / (size_t)2,"%s",data);
+  snprintf(dest,tmp_0 / (size_t)2,"%s",data); /* snprintf_va_2 */
   __retres = 0;
   return __retres;
 }
diff --git a/src/plugins/variadic/tests/known/oracle/stdio_print.res.oracle b/src/plugins/variadic/tests/known/oracle/stdio_print.res.oracle
index a724cf97b4ecb77a654712e1b1f99d0f15c021d9..3f39cfd580d5a380655b6aea25e552c7e892ef74 100644
--- a/src/plugins/variadic/tests/known/oracle/stdio_print.res.oracle
+++ b/src/plugins/variadic/tests/known/oracle/stdio_print.res.oracle
@@ -179,11 +179,11 @@ int main(void)
     void *__va_args_40[3] = {& __va_arg0_34, & __va_arg1_36, & __va_arg2_38};
     dprintf(1,(char const *)format,(void * const *)(__va_args_40));
   }
-  fprintf_va_1(stream,"%d %s %d",1,(char *)"2",3);
-  printf_va_1("%d %s %d",1,(char *)"2",3);
-  snprintf_va_1(str,size,"%d %s %d",1,(char *)"2",3);
-  sprintf_va_1(str,"%d %s %d",1,(char *)"2",3);
-  dprintf_va_1(1,"%d %s %s",1,(char *)"3",(char *)"4");
+  fprintf(stream,"%d %s %d",1,(char *)"2",3); /* fprintf_va_1 */
+  printf("%d %s %d",1,(char *)"2",3); /* printf_va_1 */
+  snprintf(str,size,"%d %s %d",1,(char *)"2",3); /* snprintf_va_1 */
+  sprintf(str,"%d %s %d",1,(char *)"2",3); /* sprintf_va_1 */
+  dprintf(1,"%d %s %s",1,(char *)"3",(char *)"4"); /* dprintf_va_1 */
   __retres = 0;
   return __retres;
 }
diff --git a/src/plugins/variadic/tests/known/oracle/stdio_scan.res.oracle b/src/plugins/variadic/tests/known/oracle/stdio_scan.res.oracle
index ed0ea023f83a8563ad53b13e35b9b3f7d6c65eda..2185bf81abb7a7d51ad0f59207d9287db4ba7a44 100644
--- a/src/plugins/variadic/tests/known/oracle/stdio_scan.res.oracle
+++ b/src/plugins/variadic/tests/known/oracle/stdio_scan.res.oracle
@@ -152,9 +152,9 @@ int main(void)
     sscanf((char const *)str,(char const *)format,
            (void * const *)(__va_args_26));
   }
-  fscanf_va_1(stream,"%d %s %d",& i,s,& j);
-  scanf_va_1("%d %s %d",& i,s,& j);
-  sscanf_va_1((char const *)str,"%d %s %d",& i,s,& j);
+  fscanf(stream,"%d %s %d",& i,s,& j); /* fscanf_va_1 */
+  scanf("%d %s %d",& i,s,& j); /* scanf_va_1 */
+  sscanf((char const *)str,"%d %s %d",& i,s,& j); /* sscanf_va_1 */
   __retres = 0;
   return __retres;
 }
diff --git a/src/plugins/variadic/tests/known/oracle/swprintf.res.oracle b/src/plugins/variadic/tests/known/oracle/swprintf.res.oracle
index 35fd0f60bf57020324921fcaf2c3aad4a35f3e24..5de7a603f53e9f25b4eb548ee75bd16e8d22f934 100644
--- a/src/plugins/variadic/tests/known/oracle/swprintf.res.oracle
+++ b/src/plugins/variadic/tests/known/oracle/swprintf.res.oracle
@@ -97,17 +97,17 @@ int main(void)
   int __retres;
   wchar_t data[100];
   size_t tmp_0;
-  wmemset(data,65,(unsigned int)99);
+  wmemset(data,65,(unsigned long)99);
   data[99] = 0;
   wchar_t dest[50] = {0};
   if (nondet) {
     size_t tmp;
     tmp = wcslen((wchar_t const *)(data));
-    swprintf_va_1(dest,tmp,(wchar_t const *)L"%" "l" "s" ,data);
+    swprintf(dest,tmp,(wchar_t const *)L"%" "l" "s" ,data); /* swprintf_va_1 */
     /*@ assert \false; */ ;
   }
   tmp_0 = wcslen((wchar_t const *)(data));
-  swprintf_va_2(dest,tmp_0 / (size_t)2,(wchar_t const *)L"%" "l" "s" ,data);
+  swprintf(dest,tmp_0 / (size_t)2,(wchar_t const *)L"%" "l" "s" ,data); /* swprintf_va_2 */
   __retres = 0;
   return __retres;
 }
diff --git a/src/plugins/variadic/tests/known/oracle/wchar.res.oracle b/src/plugins/variadic/tests/known/oracle/wchar.res.oracle
index 80c9c3d86c2ef0f43e2d7d4f02129186aa7388bb..f3f312fdca1b5de828c8d1f39607f0cd78b4164c 100644
--- a/src/plugins/variadic/tests/known/oracle/wchar.res.oracle
+++ b/src/plugins/variadic/tests/known/oracle/wchar.res.oracle
@@ -254,21 +254,21 @@ int main(void)
   int j;
   wchar_t input[0x100] =
     {102, 111, 114, 116, 121, 45, 116, 119, 111, 32, 105, 115, 0};
-  wprintf_va_1((wchar_t const *)L"%" "d" " " "%" "l" "d" "\\n" ,42,42L);
-  wprintf_va_2((wchar_t const *)L"%" "1" "0" "d" " " "%" "0" "1" "0" "d"
-               "\\n" ,42,42);
-  wprintf_va_3((wchar_t const *)L"%" "d" " " "%" "x" " " "%" "o" " " "%" "#"
-               "x" " " "%" "#" "o" "\\n" ,42,42u,42u,42u,42u);
-  wprintf_va_4((wchar_t const *)L"%" "2" "." "1" "f" " " "%" "+" "." "0" "e"
-               " " "%" "E" "\\n" ,42.0,42.0,42.0);
-  wprintf_va_5((wchar_t const *)L"%" "*" "d" " " "\\n" ,4,2);
-  wprintf_va_6((wchar_t const *)L"%" "l" "s" " " "\\n" ,(wchar_t *)L"4" "2" );
-  swprintf_va_1(wstring,(unsigned int)0x100,(wchar_t const *)L"%" "s" " " "="
-                " " "%" "d" ,(char *)L"4" "2" " " "+" " " "4" "2" ,42 + 42);
-  wscanf_va_1((wchar_t const *)L"%" "l" "s" ,wstring);
-  wscanf_va_2((wchar_t const *)L"%" "d" " " "%" "d" ,& i,& j);
-  swscanf_va_1((wchar_t const *)(input),(wchar_t const *)L"%" "l" "s" " " "%"
-               "*" "s" " " "%" "d" ,wstring,& i);
+  wprintf((wchar_t const *)L"%" "d" " " "%" "l" "d" "\\n" ,42,42L); /* wprintf_va_1 */
+  wprintf((wchar_t const *)L"%" "1" "0" "d" " " "%" "0" "1" "0" "d" "\\n" ,
+          42,42); /* wprintf_va_2 */
+  wprintf((wchar_t const *)L"%" "d" " " "%" "x" " " "%" "o" " " "%" "#" "x"
+          " " "%" "#" "o" "\\n" ,42,42u,42u,42u,42u); /* wprintf_va_3 */
+  wprintf((wchar_t const *)L"%" "2" "." "1" "f" " " "%" "+" "." "0" "e" " "
+          "%" "E" "\\n" ,42.0,42.0,42.0); /* wprintf_va_4 */
+  wprintf((wchar_t const *)L"%" "*" "d" " " "\\n" ,4,2); /* wprintf_va_5 */
+  wprintf((wchar_t const *)L"%" "l" "s" " " "\\n" ,(wchar_t *)L"4" "2" ); /* wprintf_va_6 */
+  swprintf(wstring,(unsigned long)0x100,(wchar_t const *)L"%" "s" " " "=" " "
+           "%" "d" ,(char *)L"4" "2" " " "+" " " "4" "2" ,42 + 42); /* swprintf_va_1 */
+  wscanf((wchar_t const *)L"%" "l" "s" ,wstring); /* wscanf_va_1 */
+  wscanf((wchar_t const *)L"%" "d" " " "%" "d" ,& i,& j); /* wscanf_va_2 */
+  swscanf((wchar_t const *)(input),(wchar_t const *)L"%" "l" "s" " " "%" "*"
+          "s" " " "%" "d" ,wstring,& i); /* swscanf_va_1 */
   __retres = 0;
   return __retres;
 }
diff --git a/src/plugins/variadic/translate.ml b/src/plugins/variadic/translate.ml
index 2f09a846eb26e980ea7ccc4cde8337829e466308..3ae608c093eb7d7dcf5ff55de45a546fc49ca19d 100644
--- a/src/plugins/variadic/translate.ml
+++ b/src/plugins/variadic/translate.ml
@@ -23,7 +23,6 @@
 open Cil_types
 open Va_types
 open Options
-open Extlib
 module Typ = Extends.Typ
 
 (* List of builtin function names to translate *)
@@ -45,7 +44,7 @@ let translate_variadics (file : file) =
   (* Environment filled with global symbols. *)
   let env = Environment.from_file file in
 
-  (* Table associating varinfo of variadic functions to a variadic_function 
+  (* Table associating varinfo of variadic functions to a variadic_function
      description *)
   let module Table = Cil_datatype.Varinfo.Hashtbl in
   let classification : variadic_function Table.t = Table.create 17 in
@@ -54,14 +53,14 @@ let translate_variadics (file : file) =
 
     method! vglob glob =
       begin match glob with
-      | GFunDecl(_, vi, _) | GFun ({svar = vi}, _)
-            when not (is_framac_builtin vi) ->
+        | GFunDecl(_, vi, _) | GFun ({svar = vi}, _)
+          when not (is_framac_builtin vi) ->
           if not (Table.mem classification vi) then begin
             let vf = Classify.classify env vi in
-            may (Table.add classification vi) vf
+            Option.iter (Table.add classification vi) vf
           end;
           Cil.SkipChildren
-      | _ ->
+        | _ ->
           Cil.SkipChildren
       end
   end
@@ -88,26 +87,26 @@ let translate_variadics (file : file) =
     (* Translate types and signatures *)
     method! vglob glob =
       begin match glob with
-      | GFunDecl(_, vi, _) when is_framac_builtin vi ->
+        | GFunDecl(_, vi, _) when is_framac_builtin vi ->
           Self.result ~level:2 ~current:true
             "Variadic builtin %s left untransformed." vi.vname;
           Cil.SkipChildren
 
-      | GFunDecl(_, vi, _) ->
+        | GFunDecl(_, vi, _) ->
           if Table.mem classification vi then
             Generic.add_vpar vi;
           Cil.DoChildren
 
-      | GFun ({svar = vi} as fundec, _) ->
+        | GFun ({svar = vi} as fundec, _) ->
           if Table.mem classification vi then begin
             Generic.add_vpar vi;
             fundec.sformals <- Cil.getFormalsDecl vi;
           end;
           Standard.new_globals := [];
           Cil.DoChildrenPost (fun globs ->
-            List.rev (globs @ !Standard.new_globals))
+              List.rev (globs @ !Standard.new_globals))
 
-      | _ ->
+        | _ ->
           Cil.DoChildren
       end
 
@@ -137,10 +136,10 @@ let translate_variadics (file : file) =
 
     (* Replace variadic calls *)
     method! vinst i =
-      let fundec = the self#current_func in
+      let fundec = Option.get self#current_func in
       let loc = Cil_datatype.Instr.loc i in
       let block = self#enclosing_block () in
-      let ghost = (the self#current_stmt).ghost in
+      let ghost = (Option.get self#current_stmt).ghost in
       let make_new_args mk_call f args =
         let vf = Table.find classification f in
         try
@@ -156,83 +155,91 @@ let translate_variadics (file : file) =
             ~fundec ~ghost block loc mk_call (Cil.evar ~loc f) args
       in
       begin match i with
-      | Call(_, {enode = Lval(Var vi, _)}, _, _)
-            when List.mem vi.vname va_builtins ->
+        | Call(_, {enode = Lval(Var vi, _)}, _, _)
+          when List.mem vi.vname va_builtins ->
           File.must_recompute_cfg fundec;
           Cil.ChangeTo (Generic.translate_va_builtin fundec i)
-      | Call(lv, {enode = Lval(Var vi, NoOffset)}, args, loc) ->
-        begin
-          try
+        | Call(lv, {enode = Lval(Var vi, NoOffset)}, args, loc) ->
+          begin
+            try
+              let mk_call f args = Call (lv, f, args, loc) in
+              let res = make_new_args mk_call vi args in
+              File.must_recompute_cfg fundec;
+              Cil.ChangeTo res
+            with Not_found ->
+              Cil.DoChildren
+          end
+
+        | Call(lv, callee, args, loc) ->
+          let is_variadic =
+            try
+              let args, _ = Typ.ghost_partitioned_params (Cil.typeOf callee) in
+              let last = Extends.List.last args in
+              last = Generic.vpar
+            with Extends.List.EmptyList -> false
+          in
+          if is_variadic then begin
             let mk_call f args = Call (lv, f, args, loc) in
-            let res = make_new_args mk_call vi args in
+            let res =
+              Generic.translate_call
+                ~fundec
+                ~ghost
+                block
+                loc
+                mk_call
+                callee
+                args
+            in
             File.must_recompute_cfg fundec;
             Cil.ChangeTo res
-          with Not_found ->
+          end else
             Cil.DoChildren
-        end
-
-      | Call(lv, callee, args, loc) ->
-        let is_variadic =
-          try
-            let args, _ = Typ.ghost_partitioned_params (Cil.typeOf callee) in
-            let last = Extends.List.last args in
-            last = Generic.vpar
-          with Extends.List.EmptyList -> false
-        in
-        if is_variadic then begin
-          let mk_call f args = Call (lv, f, args, loc) in
-          let res =
-            Generic.translate_call ~fundec ~ghost block loc mk_call callee args
-          in
-          File.must_recompute_cfg fundec;
-          Cil.ChangeTo res
-        end else
-          Cil.DoChildren
-      | Local_init(v, ConsInit(c, args, kind), loc) ->
-        begin
-          try
-            let mk_call f args =
-              let args =
-                match kind, args with
-                | Constructor, [] ->
-                  Options.Self.fatal
-                    "Constructor %a is expected to have at least one argument"
-                    Cil_printer.pp_varinfo c
-                | Constructor, _::tl -> tl
-                | Plain_func, args -> args
-              in
-              let f =
-                match f.enode with
-                | Lval (Var f, NoOffset) -> f
-                | _ ->
-                  Options.Self.fatal
-                    "Constructor cannot be translated as indirect call"
+        | Local_init(v, ConsInit(c, args, kind), loc) ->
+          begin
+            try
+              let mk_call f args =
+                let args =
+                  match kind, args with
+                  | Constructor, [] ->
+                    Options.Self.fatal
+                      "Constructor %a is expected to have at least one argument"
+                      Cil_printer.pp_varinfo c
+                  | Constructor, _::tl -> tl
+                  | Plain_func, args -> args
+                in
+                let f =
+                  match f.enode with
+                  | Lval (Var f, NoOffset) -> f
+                  | _ ->
+                    Options.Self.fatal
+                      "Constructor cannot be translated as indirect call"
+                in
+                Local_init(v,ConsInit(f,args,kind),loc)
               in
-              Local_init(v,ConsInit(f,args,kind),loc)
-            in
-            let args =
-              match kind with
+              let args =
+                match kind with
                 | Plain_func -> args
                 | Constructor -> Cil.mkAddrOfVi v :: args
-            in
-            let res = make_new_args mk_call c args in
-            File.must_recompute_cfg fundec;
-            Cil.ChangeTo res
-          with Not_found ->
-            Cil.DoChildren
-        end
-      | _-> Cil.DoChildren
+              in
+              let res = make_new_args mk_call c args in
+              File.must_recompute_cfg fundec;
+              Cil.ChangeTo res
+            with Not_found ->
+              Cil.DoChildren
+          end
+        | _-> Cil.DoChildren
       end
 
     method! vexpr exp =
       begin match exp.enode with
-      | AddrOf (Var vi, NoOffset)
-        when Extends.Cil.is_variadic_function vi && is_framac_builtin vi ->
+        | AddrOf (Var vi, NoOffset)
+          when Extends.Cil.is_variadic_function vi && is_framac_builtin vi ->
           Self.not_yet_implemented
+            ~source:(fst exp.eloc)
             "The variadic plugin doesn't handle calls to a pointer to the \
              variadic builtin %s."
             vi.vname
-      | _ -> Cil.DoChildren
+        | _ -> Cil.DoChildren
       end
   end
   in
diff --git a/src/plugins/variadic/va_build.ml b/src/plugins/variadic/va_build.ml
index 101a8fa5c99bd8c414b12be2ad8bd8ac47429adb..2fd7c9f260379054ac9af4fb6371e12d047d4e70 100644
--- a/src/plugins/variadic/va_build.ml
+++ b/src/plugins/variadic/va_build.ml
@@ -29,7 +29,7 @@ open Cil
 let function_declaration ?vattr ~loc name typ mk_spec =
   (* Build the varinfo *)
   let vi = makeGlobalVar ~referenced:true name typ in
-  Extlib.may (fun extra_vattr -> vi.vattr <- vi.vattr @ extra_vattr) vattr;
+  Option.iter (fun extra_vattr -> vi.vattr <- vi.vattr @ extra_vattr) vattr;
   vi.vdecl <- loc;
   (* Build the formals *)
   setFormalsDecl vi typ;
@@ -48,11 +48,11 @@ let array_init ~loc fundec ~ghost scope name elem_typ values =
   let vi = Cil.makeLocalVar fundec ~ghost ~scope name typ in
   let initl =
     match values with
-      | [] -> [ Index (Cil.zero ~loc, NoOffset), Cil.makeZeroInit ~loc elem_typ]
-      | _ ->
-        List.mapi
-          (fun i exp -> Index (Cil.integer ~loc i, NoOffset), SingleInit exp)
-          values
+    | [] -> [ Index (Cil.zero ~loc, NoOffset), Cil.makeZeroInit ~loc elem_typ]
+    | _ ->
+      List.mapi
+        (fun i exp -> Index (Cil.integer ~loc i, NoOffset), SingleInit exp)
+        values
   in
   vi.vdefined <- true;
   vi, Local_init(vi, AssignInit(CompoundInit(typ,initl)), loc)
@@ -106,7 +106,7 @@ exception NotAFunction
 
 let tapp ~loc logic_info labels args =
   let ltyp = match logic_info.l_type with
-  | None -> raise NotAFunction
-  | Some ltyp -> ltyp
+    | None -> raise NotAFunction
+    | Some ltyp -> ltyp
   in
   Logic_const.term ~loc (Tapp (logic_info, labels, args)) ltyp
diff --git a/src/plugins/variadic/va_types.ml b/src/plugins/variadic/va_types.ml
index 74aa2086327cc463e7a5a84dc456bb3b81e4a8d8..70063338550ae6ea4ca452d6c679b1c8649128ae 100644
--- a/src/plugins/variadic/va_types.ml
+++ b/src/plugins/variadic/va_types.ml
@@ -24,28 +24,28 @@ open Cil_types
 
 
 type variadic_class =
-| Unknown 
-(** Function declared and not known by Frama-C *)
-| Defined
-(** Function for which we have the definition in the project *)
-| Misc
-(** Function from the Frama-C lib *)
-| Overload of overload
-(** Function from the Frama-C lib which declines into a finite number of 
-    possible prototypes whose names are given in the list *)
-| Aggregator of aggregator
-(** Function from the Frama-C lib which has a not-variadic equivalent with
-    the variadic part replaced by an array. (The array is the aggregation of
-    the arguments from the variadic part. *)
-| FormatFun of format_fun
-(** Function from the Frama-C lib for which the argument count and type is
-    fixed by a format argument. *)
+  | Unknown
+  (** Function declared and not known by Frama-C *)
+  | Defined
+  (** Function for which we have the definition in the project *)
+  | Misc
+  (** Function from the Frama-C lib *)
+  | Overload of overload
+  (** Function from the Frama-C lib which declines into a finite number of
+      possible prototypes whose names are given in the list *)
+  | Aggregator of aggregator
+  (** Function from the Frama-C lib which has a not-variadic equivalent with
+      the variadic part replaced by an array. (The array is the aggregation of
+      the arguments from the variadic part. *)
+  | FormatFun of format_fun
+  (** Function from the Frama-C lib for which the argument count and type is
+      fixed by a format argument. *)
 
 and overload = (typ list * varinfo) list
 
 and aggregator = {
-	a_target: varinfo;
-	a_pos: int;
+  a_target: varinfo;
+  a_pos: int;
   a_type: aggregator_type;
   a_param: string * typ;
 }
@@ -59,11 +59,11 @@ and format_fun = {
 }
 
 and buffer =
-| StdIO (** Standard input/output (stdin/stdout/stderr) *)
-| Arg of int * int option (* Position of the buffer and size arguments *)
-| Stream of int (* Position of the stream argument *)
-| File of int  (* Position of the file argument *)
-| Syslog (* Output to some system log *)
+  | StdIO (** Standard input/output (stdin/stdout/stderr) *)
+  | Arg of int * int option (* Position of the buffer and size arguments *)
+  | Stream of int (* Position of the stream argument *)
+  | File of int  (* Position of the file argument *)
+  | Syslog (* Output to some system log *)
 
 
 type variadic_function = {
@@ -73,4 +73,3 @@ type variadic_function = {
   mutable vf_specialization_count: int; (* The number of specializations of
                                            this function built yet *)
 }
-
diff --git a/src/plugins/wp/CfgCompiler.ml b/src/plugins/wp/CfgCompiler.ml
index 62b804223326d9a21858e983f7004efe3817d050..5c445134f3cd8ab06163481f63a13d3397ad68d2 100644
--- a/src/plugins/wp/CfgCompiler.ml
+++ b/src/plugins/wp/CfgCompiler.ml
@@ -383,8 +383,8 @@ struct
     begin match edge with
       | Goto n1 -> pp_edge n1
       | Branch (_, n1, n2)->
-          Extlib.may pp_edge n1;
-          Extlib.may pp_edge n2
+          Option.iter pp_edge n1;
+          Option.iter pp_edge n2
       | Either ns -> List.iter pp_edge ns
       | Implies ns -> List.iter (fun (_,a) -> pp_edge a) ns
       | Effect (e, n') ->
@@ -812,9 +812,9 @@ struct
             if Node.equal n' n'' then Some e
             else Some (Goto n'')
         | Branch (c,n1,n2) ->
-            let n1' = Extlib.opt_map find n1 in
-            let n2' = Extlib.opt_map find n2 in
-            if Extlib.opt_equal Node.equal n1 n1' && Extlib.opt_equal Node.equal n2 n2'
+            let n1' = Option.map find n1 in
+            let n2' = Option.map find n2 in
+            if Option.equal Node.equal n1 n1' && Option.equal Node.equal n2 n2'
             then Some e
             else Some (Branch(c,n1',n2'))
         | Either l ->
@@ -1435,7 +1435,7 @@ struct
             to_sequence_bool ~mode pre posts env in
       let predssigmas =
         Node.Map.merge
-          (fun _ p s -> Some (Extlib.opt_conv F.p_false p, Extlib.opt_conv (S.create ()) s))
+          (fun _ p s -> Some (Option.value ~default:F.p_false p, Option.value ~default:(S.create ()) s))
           preds sigmas in
       (** readd simplified nodes *)
       let predssigmas =
diff --git a/src/plugins/wp/Cfloat.ml b/src/plugins/wp/Cfloat.ml
index 04ccb8f815113a5a3d9fb346bcac84af4a2f55b3..27904b616258b6a4b9830974c0a6dee8cc32b874 100644
--- a/src/plugins/wp/Cfloat.ml
+++ b/src/plugins/wp/Cfloat.ml
@@ -405,12 +405,17 @@ let () = Context.register
 (* --- Models                                                             --- *)
 (* -------------------------------------------------------------------------- *)
 
-let register_c_acsl_builtin name lfun ft =
+let hack_sqrt_builtin ft =
+  let choose xs =
+    match Context.get model with
+    | Real -> F.e_fun ~result:t_real Cmath.f_sqrt xs
+    | Float -> F.e_fun ~result:(ftau ft) (f_sqrt ft) xs
+  in
   let name = match ft with
-    | Float32 -> name ^ "f"
-    | Float64 -> name
+    | Float32 -> "sqrtf"
+    | Float64 -> "sqrt"
   in
-  LogicBuiltins.add_builtin name [F ft] (lfun ft)
+  LogicBuiltins.hack name choose
 
 let () =
   let open LogicBuiltins in
@@ -418,7 +423,7 @@ let () =
     add_builtin "\\model" [F ft] (f_model ft) ;
     add_builtin "\\delta" [F ft] (f_delta ft) ;
     add_builtin "\\epsilon" [F ft] (f_epsilon ft) ;
-    register_c_acsl_builtin "sqrt" f_sqrt ft
+    hack_sqrt_builtin ft
   in
   register_builtin Float32 ;
   register_builtin Float64
diff --git a/src/plugins/wp/Changelog b/src/plugins/wp/Changelog
index c2949dd2c454c7b42e9438ecc1a8d85f23653298..2d6a0264938aa29a20205f31e02c9ea059fb8163 100644
--- a/src/plugins/wp/Changelog
+++ b/src/plugins/wp/Changelog
@@ -24,11 +24,30 @@
 Plugin WP <next-release>
 #########################
 
+
+- WP          [2020-01-25] Improved -wp-unfold-assigns <depth>
+			   Now recursively applies to all compounds
+-* WP         [2020-01-20] Fixes opaque structures handling
+- TIP         [2020-11-06] New tactic: Sequence unrolling
+- TIP         [2020-11-05] New tactic: Induction
+- WP          [2020-11-04] Removed option -wp-bits (now always enabled)
+
+#########################
+Plugin WP 22.0 (Titanium)
+#########################
+
+- WP          [2020-10-14] New warning "pedantic-assigns". WP needs precise
+                           'assigns ... \from ...' specification about out
+                           pointers (\result and assigned pointers) to generate
+                           precise proof hypotheses.
+- WP          [2020-10-14] Hypotheses: out pointers (\result + written pointers)
+- WP          [2020-10-07] New tactic Bit-Test range
 - WP          [2020-09-21] Added support for Why3 interactive prover (Coq)
+- 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] New experimental option: -wp-check-memory-model
+                           Insert function 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")
diff --git a/src/plugins/wp/Cint.ml b/src/plugins/wp/Cint.ml
index ab9d1aaa714c09cae2ff0019e63ee05542569669..dbba575d2a09e5b5a7d8186869eaeece7f6c9c95 100644
--- a/src/plugins/wp/Cint.ml
+++ b/src/plugins/wp/Cint.ml
@@ -618,11 +618,11 @@ let smp_eq_with_land a b =
 let smp_eq_with_lor a b =
   let b1 = match_integer b in
   let es = match_fun f_lor a in
-  try (* b1==(a2|t22) <==> (b1^a2)==(~a2&e) *)
+  try (* b1==(a2|e) <==> (b1^a2)==(~a2&e) *)
     let a2,es = match_integer_extraction es in
     let k1 = Integer.logxor b1 a2 in
     let k2 = Integer.lognot a2 in
-    e_eq (e_zint k1) (e_fun f_land ((e_zint k2)::es))
+    e_eq (e_zint k1) (e_fun f_land [e_zint k2 ; e_fun f_lor es])
   with Not_found when b == e_zero ->
     (* 0==(a1|a2) <=> (0==a1 && 0==a2) *)
     F.e_and (List.map (e_eq b) es)
@@ -765,7 +765,7 @@ let smp_leq_with_lsr x y =
       (* p >= 0 ==> ( 0 <= (a >> p) <==> 0 <= a )*)
       e_leq e_zero a
     else
-      (* p >= 0 ==> ( x <= (a >> p) <= y <==> x <= a/(2**p) ) *)
+      (* p >= 0 ==> ( x <= (a >> p) <==> x <= a/(2**p) ) *)
       let k = two_power_k p in
       e_leq x (e_div a (e_zint k))
   with Not_found ->
@@ -800,41 +800,40 @@ type l_builtin = {
 let () =
   Context.register
     begin fun () ->
-      if Wp_parameters.Bits.get () then
-        begin
-          let mk_builtin n f ?eq ?leq smp = n, { f ; eq; leq; smp } in
-
-          (* From [smp_mk_bit_stdlib], the built-in [f_bit_stdlib] is such that there is
-             no creation of [e_fun f_bit_stdlib args] *)
-          let bi_lbit_stdlib = mk_builtin "f_bit_stdlib" f_bit_stdlib smp_mk_bit_stdlib in
-          let bi_lbit = mk_builtin "f_bit" f_bit_positive smp_bitk_positive in
-          let bi_lnot = mk_builtin "f_lnot" f_lnot ~eq:smp_eq_with_lnot
-              (smp1 Integer.lognot) in
-          let bi_lxor = mk_builtin "f_lxor" f_lxor ~eq:smp_eq_with_lxor
-              (smp2 f_lxor Integer.logxor) in
-          let bi_lor  = mk_builtin "f_lor" f_lor  ~eq:smp_eq_with_lor
-              (smp2 f_lor  Integer.logor) in
-          let bi_land = mk_builtin "f_land" f_land ~eq:smp_eq_with_land ~leq:smp_leq_with_land
-              smp_land in
-          let bi_lsl  = mk_builtin "f_lsl" f_lsl ~eq:smp_eq_with_lsl ~leq:smp_leq_with_lsl
-              (smp_shift Integer.shift_left) in
-          let bi_lsr  = mk_builtin "f_lsr" f_lsr ~eq:smp_eq_with_lsr ~leq:smp_leq_with_lsr
-              (smp_shift Integer.shift_right) in
-
-          List.iter
-            begin fun (_name, { f; eq; leq; smp }) ->
-              F.set_builtin f smp ;
-              (match eq with
-               | None -> ()
-               | Some eq -> F.set_builtin_eq f eq);
-              (match leq with
-               | None -> ()
-               | Some leq -> F.set_builtin_leq f leq)
-            end
-            [bi_lbit_stdlib ; bi_lbit; bi_lnot; bi_lxor; bi_lor; bi_land; bi_lsl; bi_lsr];
+      begin
+        let mk_builtin n f ?eq ?leq smp = n, { f ; eq; leq; smp } in
+
+        (* From [smp_mk_bit_stdlib], the built-in [f_bit_stdlib] is such that there is
+           no creation of [e_fun f_bit_stdlib args] *)
+        let bi_lbit_stdlib = mk_builtin "f_bit_stdlib" f_bit_stdlib smp_mk_bit_stdlib in
+        let bi_lbit = mk_builtin "f_bit" f_bit_positive smp_bitk_positive in
+        let bi_lnot = mk_builtin "f_lnot" f_lnot ~eq:smp_eq_with_lnot
+            (smp1 Integer.lognot) in
+        let bi_lxor = mk_builtin "f_lxor" f_lxor ~eq:smp_eq_with_lxor
+            (smp2 f_lxor Integer.logxor) in
+        let bi_lor  = mk_builtin "f_lor" f_lor  ~eq:smp_eq_with_lor
+            (smp2 f_lor  Integer.logor) in
+        let bi_land = mk_builtin "f_land" f_land ~eq:smp_eq_with_land ~leq:smp_leq_with_land
+            smp_land in
+        let bi_lsl  = mk_builtin "f_lsl" f_lsl ~eq:smp_eq_with_lsl ~leq:smp_leq_with_lsl
+            (smp_shift Integer.shift_left) in
+        let bi_lsr  = mk_builtin "f_lsr" f_lsr ~eq:smp_eq_with_lsr ~leq:smp_leq_with_lsr
+            (smp_shift Integer.shift_right) in
+
+        List.iter
+          begin fun (_name, { f; eq; leq; smp }) ->
+            F.set_builtin f smp ;
+            (match eq with
+             | None -> ()
+             | Some eq -> F.set_builtin_eq f eq);
+            (match leq with
+             | None -> ()
+             | Some leq -> F.set_builtin_leq f leq)
+          end
+          [bi_lbit_stdlib ; bi_lbit; bi_lnot; bi_lxor; bi_lor; bi_land; bi_lsl; bi_lsr];
 
-          Lang.For_export.set_builtin_eq f_land export_eq_with_land
-        end
+        Lang.For_export.set_builtin_eq f_land export_eq_with_land
+      end
     end
 
 (* ACSL Semantics *)
diff --git a/src/plugins/wp/CodeSemantics.ml b/src/plugins/wp/CodeSemantics.ml
index be4aaa052a4dbdf880a9cca401901a3ec7cb8ed4..487949a2712c7442b03d46830af062890017d121 100644
--- a/src/plugins/wp/CodeSemantics.ml
+++ b/src/plugins/wp/CodeSemantics.ml
@@ -93,10 +93,12 @@ struct
     | C_int _ -> is_zero_int (M.load sigma obj l)
     | C_float _ -> is_zero_float (M.load sigma obj l)
     | C_pointer _ -> is_zero_ptr (M.load sigma obj l)
-    | C_comp c ->
+    | C_comp { cfields = None } ->
+        Wp_parameters.fatal "0-initialization of an opaque structure"
+    | C_comp { cfields = Some fields } ->
         p_all
           (fun f -> is_zero sigma (Ctypes.object_of f.ftype) (M.field l f))
-          c.cfields
+          fields
     | C_array a ->
         (*TODO[LC] make zero-initializers model-dependent.
                    For instance, a[N][M] becomes a[N*M] in MemTyped,
@@ -113,7 +115,7 @@ struct
   let is_exp_range sigma l obj a b v =
     let x = Lang.freshvar ~basename:"k" Logic.Int in
     let k = e_var x in
-    let range = [ p_leq a k ; p_lt k b ] in
+    let range = [ p_leq a k ; p_leq k b ] in
     let init =
       match v with
       | None -> is_zero sigma obj (M.shift l obj k)
@@ -443,31 +445,35 @@ struct
         ~severe:false ~effect:"Skip initializer"
         (fun () ->
            let l = lval sigma lv in
-           match init with
-           | Some e ->
-               let v = M.load sigma obj l in
-               p_equal (val_of_exp sigma e) (cval v)
-           | None -> is_zero sigma obj l
+           let value_hyp = match init with
+             | Some e ->
+                 let v = M.load sigma obj l in
+                 p_equal (val_of_exp sigma e) (cval v)
+             | None -> is_zero sigma obj l
+           in
+           value_hyp, (M.initialized sigma (Rloc(obj, l)))
         ) () in
     match outcome with
-    | Warning.Failed warn -> warn , F.p_true
+    | Warning.Failed warn -> warn , (F.p_true, F.p_true)
     | Warning.Result(warn , hyp) -> warn , hyp
 
-  let init_range ~sigma lv typ a b value =
+  let init_range ~sigma lv typ low up value =
     let obj = Ctypes.object_of typ in
     let outcome = Warning.catch
         ~severe:false ~effect:"Skip initializer"
         (fun () ->
            let l = lval sigma lv in
-           let e = Extlib.opt_map (exp sigma) value in
-           is_exp_range sigma l obj (e_bigint a) (e_bigint b) e
+           let e = Option.map (exp sigma) value in
+           let low = e_bigint low and up = e_bigint up in
+           (is_exp_range sigma l obj low up e),
+           (M.initialized sigma (Rrange(l, obj, Some low, Some up)))
         ) () in
     match outcome with
-    | Warning.Failed warn -> warn , F.p_true
+    | Warning.Failed warn -> warn , (F.p_true, F.p_true)
     | Warning.Result(warn , hyp) -> warn , hyp
 
 
-  type warned_hyp = Warning.Set.t * Lang.F.pred
+  type warned_hyp = Warning.Set.t * (Lang.F.pred * Lang.F.pred)
 
   (* Hypothesis for initialization of one variable *)
   let rec init_variable ~sigma lv init acc =
@@ -480,8 +486,12 @@ struct
         let ct = constfold_ctyp ct in
         let acc = (* updated acc with default init of structure *)
           match ct with
-          | TComp (cp,_,_) when cp.cstruct && (* not for union... *)
-                                (List.length initl) < (List.length cp.cfields) ->
+          | TComp ( { cfields = None },_,_) ->
+              Wp_parameters.fatal
+                "Initializer for incomplete type %a" Cil_printer.pp_typ ct
+          | TComp ( { cstruct ; cfields = Some fields },_,_)
+            when cstruct && (* not for union... *)
+                 (List.length initl) < (List.length fields) ->
               (* default init for unintialized field of a struct *)
               List.fold_left
                 (fun acc f ->
@@ -497,7 +507,7 @@ struct
                          (Cil.addOffsetLval (Field(f, NoOffset)) lv)
                          f.ftype None in
                      init :: acc)
-                acc (List.rev cp.cfields)
+                acc (List.rev fields)
 
           | _ -> acc
         in
@@ -517,8 +527,7 @@ struct
               | (_,None) -> acc (* nothing was delayed *)
               | (il,Some (i0,_,exp)) when Integer.lt il i0 ->
                   (* Added pred: \forall i \in [il .. i0] ; t[i]==exp *)
-                  let i2 = Integer.succ i0 in
-                  init_range ~sigma lv ty il i2 (Some exp) :: acc
+                  init_range ~sigma lv ty il i0 (Some exp) :: acc
               | (_il,Some (_i0,off,exp)) ->
                   (* case [_il=_i0], so uses [off] corresponding to [_i0]
                      Added pred: t[i]==exp*)
@@ -531,7 +540,7 @@ struct
                   if Integer.ge i0 i1 then (* no hole *) acc
                   else (* defaults values
                           Added pred: \forall i \in [i0 .. i1[ ; t[i]==default *)
-                    init_range ~sigma lv ty i0 i1 None :: acc
+                    init_range ~sigma lv ty i0 (Integer.pred i1) None :: acc
             in
             let acc, delayed =
               List.fold_left
diff --git a/src/plugins/wp/Conditions.ml b/src/plugins/wp/Conditions.ml
index d6e531f56be84457ef273df9c4db17a9d8391ccd..1ff6550e70594e0042b4520ed530a9c3a98ef8cd 100644
--- a/src/plugins/wp/Conditions.ml
+++ b/src/plugins/wp/Conditions.ml
@@ -1595,9 +1595,11 @@ struct
     let visited = ref Tset.empty in
     let rec term_is_init_in_states states t =
       let raise_if_is_init t s =
-        match Mstate.lookup s t with
-        | Mlval(_, KInit) | Mchunk(_, KInit) -> raise Found
-        | _ -> ()
+        if Lang.F.is_primitive t then ()
+        else
+          match Mstate.lookup s t with
+          | Mlval(_, KInit) | Mchunk(_, KInit) -> raise Found
+          | _ -> ()
       in
       if Tset.mem t !visited then ()
       else begin
diff --git a/src/plugins/wp/Conditions.mli b/src/plugins/wp/Conditions.mli
index 878a73afc7608f9025682971c2580694a1aaf5c9..3e6aa0e00a2f60811af8053cbc273ec3539c9538 100644
--- a/src/plugins/wp/Conditions.mli
+++ b/src/plugins/wp/Conditions.mli
@@ -142,7 +142,7 @@ val map_sequence : (pred -> pred) -> sequence -> sequence
 (** Rewrite all root predicates in sequence *)
 
 val map_sequent : (pred -> pred) -> sequent -> sequent
-(** Rewrite all root predocates in hypotheses and goal *)
+(** Rewrite all root predicates in hypotheses and goal *)
 
 val insert : ?at:int -> step -> sequent -> sequent
 (** Insert a step in the sequent immediately [at] the specified position.
diff --git a/src/plugins/wp/Cvalues.ml b/src/plugins/wp/Cvalues.ml
index 7fba0357ad09b59802f7dbacab16d03f1678d691..1e0e459349b902e0cfca8761ebd0e9f1d3f2358a 100644
--- a/src/plugins/wp/Cvalues.ml
+++ b/src/plugins/wp/Cvalues.ml
@@ -70,21 +70,104 @@ and constant_term t =
   | TConst c -> logic_constant c
   | _ -> Warning.error "constant(%a)" Printer.pp_term t
 
+(* -------------------------------------------------------------------------- *)
+(* --- Initialization values                                              --- *)
+(* -------------------------------------------------------------------------- *)
+
+module OPAQUE_COMP_INIT = struct
+  type initialization_funs = {
+    init: lfun ;
+    uninit: lfun ;
+  }
+  include WpContext.Generator(Cil_datatype.Compinfo)
+      (struct
+        let name = "Cvalues.EmptyCompInit"
+        type key = compinfo
+        type data = initialization_funs
+        let compile c =
+          if c.cfields <> None then
+            Wp_parameters.fatal
+              "Asking for opaque struct init on non opaque struct" ;
+          let result = Lang.t_init c in
+          let generate_init name =
+            Lang.generated_f ~params:[] ~result "%s" name
+          in
+          let init = generate_init ("Initialized" ^ Lang.comp_id c) in
+          let uninit = generate_init ("Uninitialized" ^ Lang.comp_id c) in
+          (* Registration *)
+          Definitions.define_symbol {
+            d_cluster = Definitions.compinfo c ;
+            d_lfun = init ; d_types = 0 ; d_params = [] ;
+            d_definition = Logic result ;
+          } ;
+          Definitions.define_symbol {
+            d_cluster = Definitions.compinfo c ;
+            d_lfun = uninit ; d_types = 0 ; d_params = [] ;
+            d_definition = Logic result ;
+          } ;
+          { init ; uninit }
+      end)
+end
+
+let initialized_value_opaque_comp value comp =
+  let pick_fun r =
+    if value = e_true then r.OPAQUE_COMP_INIT.init
+    else r.uninit
+  in
+  Lang.F.e_fun (pick_fun (OPAQUE_COMP_INIT.get comp)) []
+
 let rec init_value value obj =
   match obj with
   | C_int _ | C_float _ | C_pointer _ -> value
-  | C_comp ci ->
-      let make_term f =
-        Cfield (f, KInit), init_value value (object_of f.ftype)
-      in
-      Lang.F.e_record (List.map make_term ci.cfields)
+  | C_comp ci -> init_comp_value value ci
   | C_array _ as arr ->
       Lang.F.e_const Lang.t_int
         (init_value value (object_of_array_elem arr))
+and init_comp_value value ci =
+  match ci.cfields with
+  | None -> initialized_value_opaque_comp value ci
+  | Some fields ->
+      let make f = Cfield (f, KInit), init_value value (object_of f.ftype) in
+      Lang.F.e_record (List.map make fields)
 
 let initialized_obj = init_value e_true
 let uninitialized_obj = init_value e_false
 
+(* -------------------------------------------------------------------------- *)
+(* --- Length of empty compinfos                                          --- *)
+(* -------------------------------------------------------------------------- *)
+
+module OPAQUE_COMP_BYTES_LENGTH = WpContext.Generator(Cil_datatype.Compinfo)
+    (struct
+      let name = "Cvalues.EmptyCompBytesLength"
+      type key = compinfo
+      type data = lfun
+      let compile c =
+        if c.cfields <> None then
+          Wp_parameters.fatal
+            "Asking for opaque struct length on non opaque struct" ;
+        let result = Lang.t_int in
+        let f_name = "BytesLength_of_" ^ (comp_id c) in
+        let l_name = "Positive_" ^ f_name in
+        let size = Lang.generated_f ~params:[] ~result "%s" f_name in
+        Definitions.define_symbol {
+          d_cluster = Definitions.compinfo c ;
+          d_lfun = size ; d_types = 0 ; d_params = [] ;
+          d_definition = Logic result ;
+        } ;
+        let min_size = if Cil.acceptEmptyCompinfo () then e_zero else e_one in
+        Definitions.define_lemma {
+          l_kind = `Axiom ; l_name ;
+          l_types = 0 ; l_triggers = [] ; l_forall = [] ;
+          l_cluster = Definitions.compinfo c ;
+          l_lemma = Lang.F.(p_leq min_size (e_fun size []))
+        } ;
+        size
+    end)
+
+let bytes_length_of_opaque_comp c =
+  Lang.F.e_fun (OPAQUE_COMP_BYTES_LENGTH.get c) []
+
 (* -------------------------------------------------------------------------- *)
 
 (* The type contains C-integers *)
@@ -98,8 +181,10 @@ and is_constrained_obj = function
   | C_array a -> is_constrained a.arr_element
   | C_comp c -> is_constrained_comp c
 
-and is_constrained_comp c =
-  List.exists (fun f -> is_constrained f.ftype) c.cfields
+and is_constrained_comp { cfields } =
+  match cfields with
+  | None -> false
+  | Some l -> List.exists (fun f -> is_constrained f.ftype) l
 
 module type CASES =
 sig
@@ -126,17 +211,14 @@ struct
 
   let array_name te ds =
     let dim = List.length ds in
+    let pp_dim fmt d = if d > 1 then Format.fprintf fmt "_d%d" d in
     match te with
     | C_int i ->
-        Format.asprintf "%sArray%d_%a" C.prefix dim model_int i
-    | C_float _ ->
-        Format.asprintf "%sArray%d_float" C.prefix dim
-    | C_pointer _ ->
-        Format.asprintf "%sArray%d_pointer" C.prefix dim
+        Format.asprintf "%sArray%a_%a" C.prefix pp_dim dim model_int i
     | C_comp c ->
-        Format.asprintf "%sArray%d%s" C.prefix dim (Lang.comp_id c)
-    | C_array _ ->
-        Wp_parameters.fatal "Unflatten array (%s %a)" C.prefix Ctypes.pretty te
+        Format.asprintf "%sArray%a_%s" C.prefix pp_dim dim (Lang.comp_id c)
+    | C_float _ | C_pointer _ | C_array _ ->
+        assert false
 
   let rec is_obj obj t =
     match obj with
@@ -159,29 +241,39 @@ struct
       (Lang.generated_p (C.prefix ^ Lang.comp_id c))
       (fun lfun ->
          let basename = if c.cstruct then "S" else "U" in
-         let s = Lang.freshvar ~basename (Lang.tau_of_comp c) in
-         let def = p_all
-             (fun f ->
-                is_typ f.ftype (e_getfield (e_var s) (Lang.Cfield (f, KValue))))
-             c.cfields
+         let s = Lang.freshvar ~basename (Lang.t_comp c) in
+         let dfun =
+           match c.cfields with
+           | None -> Logic Lang.t_prop
+           | Some fields ->
+               let value f = e_getfield (e_var s) (Lang.Cfield (f, KValue)) in
+               let def = p_all (fun f -> is_typ f.ftype (value f)) fields in
+               Predicate(Def,def)
          in {
            d_lfun = lfun ; d_types = 0 ; d_params = [s] ;
            d_cluster = Definitions.compinfo c ;
-           d_definition = Predicate(Def,def) ;
+           d_definition = dfun ;
          })
       [s]
 
-  and is_array te ds t =
+  and is_array elt ds t =
     Definitions.call_pred
-      (Lang.generated_p (array_name te ds))
+      (Lang.generated_p (array_name elt ds))
       (fun lfun ->
-         let x = Lang.freshvar ~basename:"T" (Matrix.tau te ds) in
-         let ks = List.map (fun _d -> Lang.freshvar ~basename:"k" Logic.Int) ds in
+         let cluster =
+           match elt with
+           | C_comp c -> Definitions.compinfo c
+           | _ -> Definitions.matrix () in
+         let te = Lang.tau_of_object elt in
+         let d = List.length ds in
+         let x = Lang.freshvar ~basename:"T" (Lang.t_matrix te d) in
+         let fk _d = Lang.freshvar ~basename:"k" Logic.Int in
+         let ks = List.map fk ds in
          let e = List.fold_left (fun a k -> e_get a (e_var k)) (e_var x) ks in
-         let def = p_forall ks (is_obj te e) in
+         let def = p_forall ks (is_obj elt e) in
          {
            d_lfun = lfun ; d_types = 0 ; d_params = [x] ;
-           d_cluster = Definitions.matrix te ;
+           d_cluster = cluster ;
            d_definition = Predicate(Def,def) ;
          }
       ) [t]
@@ -233,7 +325,7 @@ let ldomain ltype =
 
 let volatile ?warn () =
   Wp_parameters.Volatile.get () ||
-  ( Extlib.may
+  ( Option.iter
       (fun w -> Warning.emit ~severe:false
           ~effect:"ignore volatile attribute" "%s" w)
       warn ; false )
@@ -253,34 +345,68 @@ let rec reduce_eqcomp = function
 (* --- ACSL Array Equality                                                --- *)
 (* -------------------------------------------------------------------------- *)
 
-module EQARRAY = WpContext.Generator(Matrix.NATURAL)
+module AKEY =
+struct
+  type t = base * Matrix.t
+  and base = I | F of c_float | P | C of compinfo
+  let make elt ds =
+    let base = match elt with
+      | C_int _ -> I
+      | C_float f -> F f
+      | C_pointer _ -> P
+      | C_comp c -> C c
+      | C_array _ -> assert false
+    in base , ds
+  let key = function
+    | I -> "int"
+    | P -> "ptr"
+    | F f -> Ctypes.f_name f
+    | C c -> Lang.comp_id c
+  let cluster = function
+    | I | P | F _ -> Definitions.matrix ()
+    | C c -> Definitions.compinfo c
+  let tau = function
+    | I -> Lang.t_int
+    | F f -> Lang.t_float f
+    | P -> Lang.t_addr ()
+    | C c -> Lang.t_comp c
+  let equal = function
+    | I | F _ | P -> F.p_equal
+    | C c -> !equal_rec (C_comp c)
+  let compare (a,p) (b,q) =
+    let cmp = String.compare (key a) (key b) in
+    if cmp <> 0 then cmp else Matrix.compare p q
+  let pretty fmt (a,ds) =
+    Format.fprintf fmt "%s%a" (key a) Matrix.pp_suffix_id ds
+end
+
+module EQARRAY = WpContext.Generator(AKEY)
     (struct
-      open Matrix
       let name = "Cvalues.EqArray"
-      type key = matrix
+      type key = AKEY.t
       type data = lfun
-      let compile (te,ds) =
+      let compile (a,ds) =
         (* Contextual Symbol *)
         let lfun = Lang.generated_f
             ~context:true
             ~sort:Logic.Sprop
-            "EqArray%s_%s" (Matrix.id ds) (Matrix.natural_id te) in
+            "EqArray_%s%a" (AKEY.key a) Matrix.pp_suffix_id ds in
         (* Simplification of the symbol *)
         Lang.F.set_builtin lfun reduce_eqcomp ;
         (* Definition of the symbol *)
-        let denv = Matrix.denv ds in
-        let tau = Matrix.tau te ds in
+        let denv = Matrix.cc_env ds in
+        let tau = Matrix.cc_tau (AKEY.tau a) ds in
         let xa = Lang.freshvar ~basename:"T" tau in
         let xb = Lang.freshvar ~basename:"T" tau in
         let ta = e_var xa in
         let tb = e_var xb in
         let ta_xs = List.fold_left e_get ta denv.index_val in
         let tb_xs = List.fold_left e_get tb denv.index_val in
-        let property = p_hyps (denv.index_range) (!equal_rec te ta_xs tb_xs) in
+        let property = p_hyps (denv.index_range) (AKEY.equal a ta_xs tb_xs) in
         let definition = p_forall denv.index_var property in
         (* Registration *)
         Definitions.define_symbol {
-          d_cluster = Definitions.matrix te ;
+          d_cluster = AKEY.cluster a ;
           d_lfun = lfun ; d_types = 0 ;
           d_params = denv.size_var @ [xa ; xb ] ;
           d_definition = Predicate(Def,definition) ;
@@ -303,22 +429,28 @@ module EQCOMP = WpContext.Generator(Cil_datatype.Compinfo)
         Lang.F.set_builtin lfun reduce_eqcomp ;
         (* Definition of the symbol *)
         let basename = if c.cstruct then "S" else "U" in
-        let xa = Lang.freshvar ~basename (Lang.tau_of_comp c) in
-        let xb = Lang.freshvar ~basename (Lang.tau_of_comp c) in
+        let tc = Lang.t_comp c in
+        let xa = Lang.freshvar ~basename tc in
+        let xb = Lang.freshvar ~basename tc in
         let ra = e_var xa in
         let rb = e_var xb in
-        let def = p_all
-            (fun f ->
-               let fd = Cfield (f, KValue) in
-               !equal_rec (Ctypes.object_of f.ftype)
-                 (e_getfield ra fd) (e_getfield rb fd))
-            c.cfields
+        let d_definition =
+          match c.cfields with
+          | None -> Logic Lang.t_prop
+          | Some fields ->
+              let def = p_all
+                  (fun f ->
+                     let fd = Cfield (f, KValue) in
+                     !equal_rec (Ctypes.object_of f.ftype)
+                       (e_getfield ra fd) (e_getfield rb fd))
+                  fields
+              in Predicate(Def, def)
         in
         (* Registration *)
         Definitions.define_symbol {
           d_cluster = Definitions.compinfo c ;
           d_lfun = lfun ; d_types = 0 ; d_params = [xa;xb] ;
-          d_definition = Predicate(Def,def) ;
+          d_definition ;
         } ; lfun
     end)
 
@@ -326,17 +458,20 @@ module EQCOMP = WpContext.Generator(Cil_datatype.Compinfo)
 (* --- ACSL Equality                                                      --- *)
 (* -------------------------------------------------------------------------- *)
 
+type matrixinfo = c_object * int option list
+
 let equal_comp c a b = p_call (EQCOMP.get c) [a;b]
 let equal_array m a b =
-  match m with
-  | _obj , [None] -> p_equal a b
-  | m -> p_call (EQARRAY.get m) (Matrix.size m @ [a;b])
+  let elt,ns = m in
+  let ds = Matrix.of_dims ns in
+  let ms = Matrix.cc_dims ns in
+  p_call (EQARRAY.get @@ AKEY.make elt ds) (ms @ [a;b])
 
 let equal_object obj a b =
   match obj with
   | C_int _ | C_float _ | C_pointer _ -> p_equal a b
   | C_comp c -> equal_comp c a b
-  | C_array t -> equal_array (Matrix.of_array t) a b
+  | C_array m -> equal_array (Ctypes.array_dimensions m) a b
 
 let () = equal_rec := equal_object
 
diff --git a/src/plugins/wp/Cvalues.mli b/src/plugins/wp/Cvalues.mli
index be11dc8ad665ef103daade2f40952124abb3e1da..85276cb83150fc24443ec88f4ec74f72a058fbce 100644
--- a/src/plugins/wp/Cvalues.mli
+++ b/src/plugins/wp/Cvalues.mli
@@ -83,9 +83,11 @@ val volatile : ?warn:string -> unit -> bool
 
 (** {2 ACSL Equality} *)
 
+type matrixinfo = c_object * int option list
+
 val equal_object : c_object -> term -> term -> pred
 val equal_comp : compinfo -> term -> term -> pred
-val equal_array : Matrix.matrix -> term -> term -> pred
+val equal_array : matrixinfo -> term -> term -> pred
 
 (** {2 C and ACSL Constants} *)
 
@@ -100,6 +102,8 @@ val constant_term : Cil_types.term -> term
 val initialized_obj: c_object -> term
 val uninitialized_obj: c_object -> term
 
+val bytes_length_of_opaque_comp: compinfo -> term
+
 (** {2 Lifting Operations over Memory Values} *)
 
 val map_sloc : ('a -> 'b) -> 'a Sigs.sloc -> 'b Sigs.sloc
diff --git a/src/plugins/wp/Definitions.ml b/src/plugins/wp/Definitions.ml
index ce9733e12df81c3a6107935f569cd168bb746d98..b8bd00cd0e652d904b8ba5831a58fb8dc445377b 100644
--- a/src/plugins/wp/Definitions.ml
+++ b/src/plugins/wp/Definitions.ml
@@ -27,7 +27,6 @@
 open LogicUsage
 open Cil_types
 open Cil_datatype
-open Ctypes
 open Qed.Logic
 open Lang
 open Lang.F
@@ -255,11 +254,7 @@ let icompinfo c =
        in cluster.c_irecords <- [c] ; cluster)
     (Lang.comp_init_id c)
 
-let matrix = function
-  | C_array _ -> assert false
-  | C_comp c -> compinfo c
-  | C_int _ | C_float _ | C_pointer _ ->
-      cluster ~id:"Matrix" ~title:"Basic Arrays" ()
+let matrix () = cluster ~id:"Matrix" ~title:"Basic Arrays" ()
 
 let call_fun ~result lfun cc es =
   Symbol.compile (Lang.local cc) lfun ;
@@ -341,11 +336,13 @@ class virtual visitor main =
           let c = compinfo r in
           if self#do_local c then
             begin
-              let fts = List.map
-                  (fun f ->
-                     let t = Lang.tau_of_ctype f.ftype in
-                     self#vtau t ; Cfield (f, KValue) , t
-                  ) r.cfields
+              let fts = Option.map
+                  (List.map
+                     (fun f ->
+                        let t = Lang.tau_of_ctype f.ftype in
+                        self#vtau t ; Cfield (f, KValue) , t
+                     ))
+                  r.cfields
               in self#on_comp r fts ;
             end
         end
@@ -357,11 +354,13 @@ class virtual visitor main =
           let c = icompinfo r in
           if self#do_local c then
             begin
-              let fts = List.map
-                  (fun f ->
-                     let t = Lang.init_of_ctype f.ftype in
-                     self#vtau t ; Cfield (f, KInit) , t
-                  ) r.cfields
+              let fts = Option.map
+                  (List.map
+                     (fun f ->
+                        let t = Lang.init_of_ctype f.ftype in
+                        self#vtau t ; Cfield (f, KInit) , t
+                     ))
+                  r.cfields
               in self#on_icomp r fts ;
             end
         end
@@ -567,8 +566,8 @@ class virtual visitor main =
     method virtual on_library : string -> unit
     method virtual on_cluster : cluster -> unit
     method virtual on_type : logic_type_info -> typedef -> unit
-    method virtual on_comp : compinfo -> (field * tau) list -> unit
-    method virtual on_icomp : compinfo -> (field * tau) list -> unit
+    method virtual on_comp : compinfo -> (field * tau) list option -> unit
+    method virtual on_icomp : compinfo -> (field * tau) list option -> unit
     method virtual on_dlemma : dlemma -> unit
     method virtual on_dfun : dfun -> unit
 
diff --git a/src/plugins/wp/Definitions.mli b/src/plugins/wp/Definitions.mli
index dde165a97268e1ba874ec4097c50e6863f1e8a3c..4955747af42bdcc150ba05656f7178c419aeefcb 100644
--- a/src/plugins/wp/Definitions.mli
+++ b/src/plugins/wp/Definitions.mli
@@ -22,7 +22,6 @@
 
 open LogicUsage
 open Cil_types
-open Ctypes
 open Lang
 open Lang.F
 
@@ -33,7 +32,7 @@ val cluster : id:string -> ?title:string -> ?position:Filepath.position -> unit
 val axiomatic : axiomatic -> cluster
 val section : logic_section -> cluster
 val compinfo : compinfo -> cluster
-val matrix : c_object -> cluster
+val matrix : unit -> cluster
 
 val cluster_id : cluster -> string (** Unique *)
 val cluster_title : cluster -> string
@@ -125,13 +124,28 @@ class virtual visitor : cluster ->
 
     (** {2 Visited definitions} *)
 
-    method virtual section : string -> unit (** Comment *)
-    method virtual on_library : string -> unit (** External library to import *)
-    method virtual on_cluster : cluster -> unit (** Outer cluster to import *)
-    method virtual on_type : logic_type_info -> typedef -> unit (** This local type must be defined *)
-    method virtual on_comp : compinfo -> (field * tau) list -> unit (** This local compinfo must be defined *)
-    method virtual on_icomp : compinfo -> (field * tau) list -> unit (** This local compinfo initialization must be defined *)
-    method virtual on_dlemma : dlemma -> unit (** This local lemma must be defined *)
-    method virtual on_dfun : dfun -> unit (** This local function must be defined *)
+    method virtual section : string -> unit
+    (** Comment *)
+
+    method virtual on_library : string -> unit
+    (** External library to import *)
+
+    method virtual on_cluster : cluster -> unit
+    (** Outer cluster to import *)
+
+    method virtual on_type : logic_type_info -> typedef -> unit
+    (** This local type must be defined *)
+
+    method virtual on_comp : compinfo -> (field * tau) list option -> unit
+    (** This local compinfo must be defined *)
+
+    method virtual on_icomp : compinfo -> (field * tau) list option -> unit
+    (** This local compinfo initialization must be defined *)
+
+    method virtual on_dlemma : dlemma -> unit
+    (** This local lemma must be defined *)
+
+    method virtual on_dfun : dfun -> unit
+    (** This local function must be defined *)
 
   end
diff --git a/src/plugins/wp/Footprint.ml b/src/plugins/wp/Footprint.ml
index a05d0d02ad71ef611b02cd661930c1f72b044c42..0198e11baab73ddf075ac879d968a21867a0e00a 100644
--- a/src/plugins/wp/Footprint.ml
+++ b/src/plugins/wp/Footprint.ml
@@ -31,7 +31,8 @@ let iter f e =
   Queue.add e q ;
   while not (Queue.is_empty q) do
     let e = Queue.pop q in
-    f e ; F.lc_iter (fun e -> Queue.push e q) e
+    if F.lc_closed e then f e ;
+    F.lc_iter (fun e -> Queue.push e q) e
   done
 
 let once f e =
@@ -42,7 +43,8 @@ let once f e =
   Queue.add e q ;
   while not (Queue.is_empty q) do
     let e = Queue.pop q in
-    f e ; F.lc_iter (fun e -> if once m e then Queue.push e q) e
+    if F.lc_closed e then f e ;
+    F.lc_iter (fun e -> if once m e then Queue.push e q) e
   done
 
 (* -------------------------------------------------------------------------- *)
@@ -151,3 +153,5 @@ let lookup ~occur ~inside =
       ) inside ;
     raise Not_found
   with Found e -> e
+
+(* -------------------------------------------------------------------------- *)
diff --git a/src/plugins/wp/Footprint.mli b/src/plugins/wp/Footprint.mli
index 868824c83bf007b4a8db215e4e4ae77519e76d87..9e2e9a739a4c629dd7af9e0d3ef293b7de53281d 100644
--- a/src/plugins/wp/Footprint.mli
+++ b/src/plugins/wp/Footprint.mli
@@ -49,3 +49,5 @@ val locate : select:term -> inside:term -> occurrence
 
 (** Retrieve back the [k]-th occurrence of a footprint inside a term. *)
 val lookup : occur:occurrence -> inside:term -> term
+
+(* -------------------------------------------------------------------------- *)
diff --git a/src/plugins/wp/Generator.ml b/src/plugins/wp/Generator.ml
index 99c1c0b608920807e0c2141475fb4603e3980be5..5fde9f3ba27ff4fe28ec53f76cd9c79ca4e19d5e 100644
--- a/src/plugins/wp/Generator.ml
+++ b/src/plugins/wp/Generator.ml
@@ -108,7 +108,7 @@ let add_lemmas cc = function
 
 let compute_kf cc ?kf ?bhv ?prop () =
   begin
-    Extlib.may (add_kf cc ?bhv ?prop) kf ;
+    Option.iter (add_kf cc ?bhv ?prop) kf ;
     cc#compute
   end
 
diff --git a/src/plugins/wp/Lang.ml b/src/plugins/wp/Lang.ml
index 2c3dbf5058832c3cca154dcd2b5c66e52e9667b6..61a8123ba9d1609fb81a18b3de54a51154c9d124 100644
--- a/src/plugins/wp/Lang.ml
+++ b/src/plugins/wp/Lang.ml
@@ -180,38 +180,37 @@ let sort_of_ltype t = match Logic_utils.unroll_type ~unroll_typedef:false t with
   | Linteger -> Logic.Sint
   | Lreal -> Logic.Sreal
 
-let tau_of_comp c = Logic.Data(Comp (c, KValue),[])
-
 let t_int = Logic.Int
 let t_bool = Logic.Bool
 let t_real = Logic.Real
 let t_prop = Logic.Prop
-let t_addr () = Context.get pointer Cil.voidType
+let t_addr () = Context.get pointer
+let t_float f = Context.get floats f
+let t_comp c = Logic.Data(Comp (c, KValue),[])
+let t_init c = Logic.Data(Comp (c, KInit), [])
 let t_array a = Logic.Array(Logic.Int,a)
 let t_farray a b = Logic.Array(a,b)
 let t_datatype adt ts = Logic.Data(adt,ts)
+let rec t_matrix a n = if n > 0 then t_matrix (t_array a) (pred n) else a
 
 let rec tau_of_object = function
   | C_int _ -> Logic.Int
-  | C_float f -> Context.get floats f
-  | C_pointer t -> Context.get pointer t
-  | C_comp c -> tau_of_comp c
+  | C_float f -> t_float f
+  | C_pointer _ -> Context.get pointer
+  | C_comp c -> t_comp c
   | C_array { arr_element = typ } -> t_array (tau_of_ctype typ)
 
 and tau_of_ctype typ = tau_of_object (Ctypes.object_of typ)
 
-let init_of_comp c = Logic.Data(Comp (c, KInit), [])
-
 let poly = Context.create "Wp.Lang.poly"
 
 let rec init_of_object = function
   | C_int _ | C_float _ | C_pointer _ -> Logic.Bool
-  | C_comp c -> init_of_comp c
+  | C_comp c -> t_init c
   | C_array { arr_element = typ } -> t_array (init_of_ctype typ)
 
 and init_of_ctype typ = init_of_object (Ctypes.object_of typ)
 
-
 let rec varpoly k x = function
   | [] -> Warning.error "Unbound type parameter <%s>" x
   | y::ys -> if x = y then k else varpoly (succ k) x ys
@@ -351,7 +350,8 @@ let comp_init c = Comp (c, KInit)
 
 let fields_of_adt = function
   | Mrecord(_,r) -> r.fields
-  | Comp (c, k) -> List.map (fun f -> Cfield (f, k)) c.cfields
+  | Comp (c, k) ->
+      List.map (fun f -> Cfield (f, k)) (Option.value ~default:[] c.cfields)
   | _ -> []
 
 let fields_of_tau = function
@@ -361,7 +361,8 @@ let fields_of_tau = function
 
 let fields_of_field = function
   | Mfield(_,r,_,_) -> r.fields
-  | Cfield(f, k) -> List.map (fun f -> Cfield (f, k)) f.fcomp.cfields
+  | Cfield(f, k) ->
+      List.map (fun f -> Cfield (f, k)) (Option.value ~default:[] f.fcomp.cfields)
 
 let tau_of_field = function
   | Mfield(_,_,_,t) -> t
@@ -370,8 +371,8 @@ let tau_of_field = function
 
 let tau_of_record = function
   | Mfield(mdt,fs,_,_) -> Logic.Data(Mrecord(mdt,fs),[])
-  | Cfield(f, KValue) -> tau_of_comp f.fcomp
-  | Cfield(f, KInit) -> init_of_comp f.fcomp
+  | Cfield(f, KValue) -> t_comp f.fcomp
+  | Cfield(f, KInit) -> t_init f.fcomp
 
 module Field =
 struct
diff --git a/src/plugins/wp/Lang.mli b/src/plugins/wp/Lang.mli
index ac60a9778810dc3dc647e0b653c83732abc4358c..0b9750495aa7d679cb4a1b61c8be1f222de1820b 100644
--- a/src/plugins/wp/Lang.mli
+++ b/src/plugins/wp/Lang.mli
@@ -160,7 +160,6 @@ val extern_t:
 
 (** {2 Sorting and Typing} *)
 
-val tau_of_comp : compinfo -> tau
 val tau_of_object : c_object -> tau
 val tau_of_ctype : typ -> tau
 val tau_of_ltype : logic_type -> tau
@@ -169,7 +168,6 @@ val tau_of_lfun : lfun -> tau option list -> tau
 val tau_of_field : field -> tau
 val tau_of_record : field -> tau
 
-val init_of_comp : compinfo -> tau
 val init_of_object : c_object -> tau
 val init_of_ctype : typ -> tau
 
@@ -177,12 +175,16 @@ val t_int : tau
 val t_real : tau
 val t_bool : tau
 val t_prop : tau
-val t_addr : unit -> tau (** pointer on Void *)
+val t_addr : unit -> tau
+val t_comp : compinfo -> tau
+val t_init : compinfo -> tau
+val t_float : c_float -> tau
 val t_array : tau -> tau
 val t_farray : tau -> tau -> tau
 val t_datatype : adt -> tau list -> tau
+val t_matrix : tau -> int -> tau
 
-val pointer : (typ -> tau) Context.value (** type of pointers *)
+val pointer : tau Context.value (** type of pointers *)
 val floats : (c_float -> tau) Context.value (** type of floats *)
 val poly : string list Context.value (** polymorphism *)
 val builtin_types: (string -> t_builtin) Context.value (* builtin types *)
diff --git a/src/plugins/wp/Layout.ml b/src/plugins/wp/Layout.ml
index d1e8b5795328c83d795393ebc8b699a997b0749b..e7246abceb43a05edbd0625d2b67cf9fa7082488 100644
--- a/src/plugins/wp/Layout.ml
+++ b/src/plugins/wp/Layout.ml
@@ -70,7 +70,7 @@ struct
     match Cil.unrollType ty with
     | TArray(te,n,_,_) ->
         begin
-          match Extlib.opt_bind Ctypes.get_int n with
+          match Option.bind n Ctypes.get_int with
           | None -> failwith "Wp.Layout: unkown array size"
           | Some n -> Index(te,n)
         end
@@ -99,15 +99,12 @@ struct
       let typ = TComp(comp,Cil.empty_size_cache (),[]) in
       H.add cache comp typ ; typ
 
-  let field_offset cache fd =
-    let typ = typ_of_comp cache fd.fcomp in
-    let offset = Cil_types.(Field(fd,NoOffset)) in
-    Cil.bitsOffset typ offset
+  let field_offset _cache fd =
+    Cil.fieldBitsOffset fd
 
   let range_field cache fd =
     let typ = typ_of_comp cache fd.fcomp in
-    let offset = Cil_types.(Field(fd,NoOffset)) in
-    Cil.bitsOffset typ offset , Cil.bitsSizeOf typ
+    Cil.fieldBitsOffset fd, Cil.bitsSizeOf typ
 
   let range_index typ n =
     let len = Cil.bitsSizeOf typ * n in (0 , len) , len
@@ -385,7 +382,7 @@ struct
   let pretty ?title pp fmt rs =
     begin
       Format.fprintf fmt "@[<hv 0>" ;
-      Extlib.may (fun pp -> pp fmt) title ;
+      Option.iter (fun pp -> pp fmt) title ;
       Format.fprintf fmt "@[<hov 2>{" ;
       List.iter
         (fun rg ->
diff --git a/src/plugins/wp/LogicCompiler.ml b/src/plugins/wp/LogicCompiler.ml
index 3227e86dea2f097ef0b1922852f5faab18a5eb43..668d62a29af65aba6c17c1650a2172fb786f1d27 100644
--- a/src/plugins/wp/LogicCompiler.ml
+++ b/src/plugins/wp/LogicCompiler.ml
@@ -473,13 +473,13 @@ struct
   let cc_logic : (env -> Cil_types.term -> logic) ref
     = ref (fun _ _ -> assert false)
   let cc_region
-    : (env -> unfold:bool -> Cil_types.term -> loc Sigs.region) ref
-    = ref (fun _ ~unfold _ -> ignore unfold ; assert false)
+    : (env -> Cil_types.term -> loc Sigs.region) ref
+    = ref (fun _ -> assert false)
 
   let term env t = !cc_term env t
   let pred polarity env t = !cc_pred polarity env t
   let logic env t = !cc_logic env t
-  let region env ~unfold t = !cc_region env ~unfold t
+  let region env t = !cc_region env t
   let reads env ts = List.iter (fun t -> ignore (logic env t.it_content)) ts
 
   let bootstrap_term cc = cc_term := cc
@@ -871,7 +871,7 @@ struct
   let logic_profile phi =
     begin
       List.iter (fun x -> logic_type x.lv_type) phi.l_profile ;
-      Extlib.may logic_type phi.l_type ;
+      Option.iter logic_type phi.l_type ;
     end
 
   (* -------------------------------------------------------------------------- *)
diff --git a/src/plugins/wp/LogicCompiler.mli b/src/plugins/wp/LogicCompiler.mli
index 9a4352ba05bde4383eb022ef259cc19f452200b9..c99371121b6f6c0244ba24909dd7d777cdbb20f3 100644
--- a/src/plugins/wp/LogicCompiler.mli
+++ b/src/plugins/wp/LogicCompiler.mli
@@ -101,14 +101,12 @@ sig
   val term : env -> Cil_types.term -> term
   val pred : polarity -> env -> predicate -> pred
   val logic : env -> Cil_types.term -> logic
-  val region : env -> unfold:bool -> Cil_types.term -> M.loc Sigs.region
-  (** When [~unfold:true], decompose compound regions field by field *)
+  val region : env -> Cil_types.term -> M.loc Sigs.region
 
   val bootstrap_term : (env -> Cil_types.term -> term) -> unit
   val bootstrap_pred : (polarity -> env -> predicate -> pred) -> unit
   val bootstrap_logic : (env -> Cil_types.term -> logic) -> unit
-  val bootstrap_region :
-    (env -> unfold:bool -> Cil_types.term -> M.loc Sigs.region) -> unit
+  val bootstrap_region : (env -> Cil_types.term -> M.loc Sigs.region) -> unit
 
   (** {3 Application} *)
 
diff --git a/src/plugins/wp/LogicSemantics.ml b/src/plugins/wp/LogicSemantics.ml
index 47cbf26bed3d5f118d17114336ac8f80ad6721ef..2f18879a02c939e8fbde0266c9c982a3888bbec7 100644
--- a/src/plugins/wp/LogicSemantics.ml
+++ b/src/plugins/wp/LogicSemantics.ml
@@ -274,10 +274,12 @@ struct
     | EQ_loc
     | EQ_plain
     | EQ_float of c_float
-    | EQ_array of Matrix.matrix
+    | EQ_array of matrixinfo
     | EQ_comp of compinfo
     | EQ_incomparable
 
+  and matrixinfo = c_object * int option list
+
   let eqsort_of_type t =
     match Logic_utils.unroll_type ~unroll_typedef:false t with
     | Ltype({lt_name="set"},[_]) -> EQ_set
@@ -288,7 +290,7 @@ struct
         | C_int _ -> EQ_plain
         | C_float f -> EQ_float f
         | C_comp c -> EQ_comp c
-        | C_array a -> EQ_array (Matrix.of_array a)
+        | C_array a -> EQ_array (Ctypes.array_dimensions a)
 
   let eqsort_of_comparison a b =
     match eqsort_of_type a.term_type , eqsort_of_type b.term_type with
@@ -296,7 +298,7 @@ struct
     | EQ_loc , EQ_loc -> EQ_loc
     | EQ_comp c1 , EQ_comp c2 ->
         if Compinfo.equal c1 c2 then EQ_comp c1 else EQ_incomparable
-    | EQ_array (t1,d1) , EQ_array (t2,d2) ->
+    | EQ_array(t1,d1) , EQ_array(t2,d2) ->
         if Ctypes.equal t1 t2 then
           match Matrix.merge d1 d2 with
           | Some d -> EQ_array(t1,d)
@@ -897,37 +899,18 @@ struct
   (* --- Set of locations for a term representing a set of l-values         --- *)
   (* -------------------------------------------------------------------------- *)
 
-  let rec compound_offsets = function
-    | C_comp comp when comp.cstruct ->
-        List.fold_left
-          (fun offsets fd ->
-             List.fold_left
-               (fun offsets (obj,ofs) ->
-                  (obj , TField(fd,ofs)) :: offsets
-               ) offsets (compound_offsets (Ctypes.object_of fd.ftype))
-          ) [] comp.cfields
-    | obj -> [obj , TNoOffset]
-
-  let assignable_lval env ~unfold lv =
+  let assignable_lval env lv =
     match fst lv with
     | TResult _  | TVar{lv_name="\\exit_status"} -> [] (* special case ! *)
     | _ ->
-        let offsets =
-          let obj = Ctypes.object_of_logic_type (Cil.typeOfTermLval lv) in
-          if unfold then compound_offsets obj else [obj , TNoOffset]
-        in
-        List.concat
-          (List.map
-             (fun (obj,offset) ->
-                let lv = Logic_const.addTermOffsetLval offset lv in
-                L.region obj (addr_lval env lv))
-             offsets)
-
-  let assignable env ~unfold t =
+        let obj = Ctypes.object_of_logic_type (Cil.typeOfTermLval lv) in
+        L.region obj (addr_lval env lv)
+
+  let assignable env t =
     match t.term_node with
     | Tempty_set -> []
-    | TLval lv -> assignable_lval env ~unfold lv
-    | Tunion ts -> List.concat (List.map (C.region env ~unfold) ts)
+    | TLval lv -> assignable_lval env lv
+    | Tunion ts -> List.concat (List.map (C.region env) ts)
     | Tinter _ -> Warning.error "Intersection in assigns not implemented yet"
     | Tcomprehension(t,qs,cond) ->
         begin
@@ -943,22 +926,22 @@ struct
                | (Sarray _ | Srange _ | Sdescr _) as sloc ->
                    let ys,l,extend = L.rdescr sloc in
                    Sdescr(xs@ys,l,p_conj (extend :: conditions))
-            ) (C.region env ~unfold t)
+            ) (C.region env t)
         end
 
     | Tat(t,label) ->
-        C.region ~unfold (C.env_at env (Clabels.of_logic label)) t
+        C.region (C.env_at env (Clabels.of_logic label)) t
 
     | Tlet( { l_var_info=v ; l_body=LBterm a } , b ) ->
         let va = C.logic env a in
-        C.region ~unfold (C.env_let env v va) b
+        C.region (C.env_let env v va) b
 
     | Tlet _ ->
         Warning.error "Complex let-binding not implemented yet (%a)"
           Printer.pp_term t
 
     | TCastE (_,t)
-    | TLogic_coerce(_,t) -> C.region env ~unfold t
+    | TLogic_coerce(_,t) -> C.region env t
 
     | TBinOp _ | TUnOp _ | Trange _ | TUpdate _ | Tapp _ | Tif _
     | TConst _ | Tnull | TDataCons _ | Tlambda _
@@ -1021,8 +1004,8 @@ struct
   let logic env t =
     Context.with_current_loc t.term_loc (term_trigger env) t
 
-  let region env ~unfold t =
-    Context.with_current_loc t.term_loc (assignable env ~unfold) t
+  let region env t =
+    Context.with_current_loc t.term_loc (assignable env) t
 
   let () = C.bootstrap_pred pred
   let () = C.bootstrap_term term
@@ -1035,17 +1018,17 @@ struct
   (* --- Regions                                                            --- *)
   (* -------------------------------------------------------------------------- *)
 
-  let assigned_of_lval env ~unfold (lv : Cil_types.lval) =
-    assignable_lval env ~unfold (Logic_utils.lval_to_term_lval lv)
+  let assigned_of_lval env (lv : Cil_types.lval) =
+    assignable_lval env (Logic_utils.lval_to_term_lval lv)
 
-  let assigned_of_froms env ~unfold froms =
+  let assigned_of_froms env froms =
     List.concat
       (List.map
-         (fun ({it_content=wr},_deps) -> region env ~unfold wr) froms)
+         (fun ({it_content=wr},_deps) -> region env wr) froms)
 
-  let assigned_of_assigns env ~unfold = function
+  let assigned_of_assigns env = function
     | WritesAny -> None
-    | Writes froms -> Some (assigned_of_froms env ~unfold froms)
+    | Writes froms -> Some (assigned_of_froms env froms)
 
   let occurs_opt x = function None -> false | Some t -> F.occurs x t
 
@@ -1080,12 +1063,63 @@ struct
   (* --- CheckAssigns                                                       --- *)
   (* -------------------------------------------------------------------------- *)
 
-  let check_assigns sigma ~written ~assignable =
+  let rec assignable_region unfold reg assignable =
+    let inclusion = p_any (L.included reg) assignable in
+    if unfold = 0 then inclusion
+    else p_or inclusion (assignable_unfolded_region unfold reg assignable)
+
+  (* Note that when a region cannot be unfolded anymore (that is, when it is a
+     [Sloc] with atomic type, including unknown size arrays and opaque structs),
+     the function return [p_false]. *)
+  and assignable_unfolded_region unfold (obj, sloc) assignable =
+    let range size = Some e_zero, Some (e_sub (e_int size) e_one) in
+    match sloc with
+    | Sloc loc ->
+        begin match obj with
+          | C_pointer _ | C_int _ | C_float _
+          | C_comp { cfields = None } | C_array { arr_flat = None } ->
+              (* Nothing to unfold *)
+              p_false
+
+          | C_comp { cfields = Some fields } ->
+              let assignable_field f =
+                let reg = Ctypes.object_of f.ftype, Sloc (M.field loc f) in
+                assignable_region (unfold-1) reg assignable
+              in
+              p_conj (List.map assignable_field fields)
+
+          | C_array { arr_flat = Some { arr_size=len ; arr_cell=typ } } ->
+              let obj = Ctypes.object_of typ in
+              assignable_unfolded_range unfold loc obj (range len) assignable
+        end
+
+    | Sarray (loc, obj, len) ->
+        assignable_unfolded_range unfold loc obj (range len) assignable
+
+    | Srange (loc, obj, b, e) ->
+        assignable_unfolded_range unfold loc obj (b, e) assignable
+
+    | Sdescr (xs, loc, guard) ->
+        assignable_unfolded_descr unfold obj xs loc guard assignable
+
+  and assignable_unfolded_range unfold loc obj (low, up) =
+    let x = Lang.freshvar ~basename:"k" Lang.t_int in
+    let k = e_var x in
+    let guard = Vset.in_range k low up in
+    let loc = M.shift loc obj k in
+    assignable_unfolded_descr unfold obj [x] loc guard
+
+  and assignable_unfolded_descr unfold obj xs loc guard assignable =
+    p_forall xs
+      (p_imply guard
+         (assignable_region (unfold-1) (obj, Sloc loc) assignable))
+
+  let check_assigns ~unfold sigma ~written ~assignable =
     p_all
-      (fun seg ->
+      (fun reg ->
          p_imply
-           (p_not (L.invalid sigma seg))
-           (p_any (L.included seg) assignable)
+           (p_not (L.invalid sigma reg))
+           (assignable_region unfold reg assignable)
       ) (written : region)
 
 end
diff --git a/src/plugins/wp/LogicUsage.ml b/src/plugins/wp/LogicUsage.ml
index 93dd0512524ac2ad8fbe15e0305fdc82f81d537b..58600b88db555f358165fc22d47223d459f36c4b 100644
--- a/src/plugins/wp/LogicUsage.ml
+++ b/src/plugins/wp/LogicUsage.ml
@@ -396,6 +396,8 @@ class visitor =
 
       (* --- LOGIC INFO --- *)
 
+      | Dtype_annot(l,_)
+      | Dinvariant(l,_)
       | Dfun_or_pred(l,_) ->
           begin
             register_logic database self#section l ;
@@ -427,8 +429,6 @@ class visitor =
       (* --- OTHERS --- *)
 
       | Dvolatile _
-      | Dinvariant _
-      | Dtype_annot _
       | Dmodel_annot _
       | Dcustom_annot _
       | Dextended _
diff --git a/src/plugins/wp/Makefile.in b/src/plugins/wp/Makefile.in
index 1d5323096b59b43fd323217981be3315320eb9e1..e5d999ad78ced57995df786b11a3bbc8dbdd8f66 100644
--- a/src/plugins/wp/Makefile.in
+++ b/src/plugins/wp/Makefile.in
@@ -81,15 +81,16 @@ PLUGIN_CMO:= \
 	Sigma MemLoader \
 	MemEmpty MemZeroAlias MemVar \
 	MemMemory MemTyped MemRegion \
-	wpReached wpRTE wpAnnot \
+	wpReached wpRTE wpAnnot wpTarget \
 	CfgCompiler StmtSemantics \
 	VCS script proof wpo wpReport \
 	Footprint Tactical Strategy \
-	TacSplit TacChoice TacRange \
+	TacSplit TacChoice TacRange TacInduction \
 	TacArray TacCompound TacUnfold \
 	TacHavoc TacInstance TacLemma \
 	TacFilter TacCut WpTac TacNormalForm \
-	TacRewrite TacBitwised TacBitrange TacShift \
+	TacRewrite TacBitwised TacBitrange TacBittest TacShift \
+	TacSequence \
 	TacCongruence TacOverflow Auto \
 	ProofSession ProofScript ProofEngine \
 	ProverTask ProverErgo ProverCoq \
@@ -128,7 +129,7 @@ CEA_WP_GENEREATED= script.ml rformat.ml driver.ml
 # --------------------------------------------------------------------------
 
 PLUGIN_TESTS_DIRS:= \
-  wp wp_plugin wp_acsl wp_bts \
+  why3 wp wp_plugin wp_acsl wp_bts \
   wp_store wp_hoare wp_typed wp_usage \
   wp_gallery wp_manual wp_tip \
   wp_region
diff --git a/src/plugins/wp/Matrix.ml b/src/plugins/wp/Matrix.ml
index e850da840c55d825a226a4ae3d734c2d914244ca..4c4cdad80fcafd8afc30db6c4bda4fc1b939f621 100644
--- a/src/plugins/wp/Matrix.ml
+++ b/src/plugins/wp/Matrix.ml
@@ -24,83 +24,49 @@
 (* --- Array Dimensions                                                   --- *)
 (* -------------------------------------------------------------------------- *)
 
-open Ctypes
+(* private *)
+type t = [ `Fix | `Ext ] list
+
+let of_dims = List.map (function None -> `Ext | Some _ -> `Fix)
+
+let compare (ps : t) (qs : t) = Stdlib.compare ps qs
+
+let rec pp_hdims fmt = function
+  | [] -> ()
+  | `Fix :: ps -> pp_ndims `Fix 1 fmt ps
+  | `Ext :: ps -> pp_ndims `Ext 1 fmt ps
+
+and pp_ndims p k fmt = function
+  | q :: qs when p = q -> pp_ndims p (succ k) fmt qs
+  | ps -> pp_kdim p k fmt ; pp_hdims fmt ps
+
+and pp_kdim p k fmt =
+  begin
+    if p = `Fix then Format.pp_print_char fmt 'd' ;
+    if p = `Ext then Format.pp_print_char fmt 'w' ;
+    if k > 1 then Format.pp_print_int fmt k ;
+  end
+
+let pp_suffix_id fmt = function
+  | [] | [`Fix] -> ()
+  | ps -> Format.pp_print_char fmt '_' ; pp_hdims fmt ps
+
+let pretty fmt ps = pp_hdims fmt ps
+
+(* -------------------------------------------------------------------------- *)
+(* --- Compilation Environment                                            --- *)
+(* -------------------------------------------------------------------------- *)
+
 open Lang.F
 
-type dim = int option
-type matrix = c_object * dim list
-
-let of_array = Ctypes.array_dimensions
-
-module KEY(E : sig val compare : c_object -> c_object -> int end) =
-struct
-  type t = matrix
-
-  let compare_dim d1 d2 = match d1 , d2 with
-    | None,None -> 0
-    | Some _,None -> (-1)
-    | None,Some _ -> 1
-    | Some _,Some _ -> 0
-
-  let compare (e1,ds1) (e2,ds2) =
-    let cmp = E.compare e1 e2 in
-    if cmp = 0 then Qed.Hcons.compare_list compare_dim ds1 ds2 else cmp
-
-  let pretty fmt (obj,ds) =
-    Ctypes.pretty fmt obj ;
-    List.iter
-      (function
-        | None -> Format.pp_print_string fmt "[]"
-        | Some d -> Format.fprintf fmt "[%d]" d
-      ) ds
-end
-
-module COBJ =
-struct
-  let compare e1 e2 = match e1 , e2 with
-    | C_int _ , C_int _ -> 0
-    | C_int _ , _ -> (-1)
-    | _ , C_int _ -> 1
-    | C_float _ , C_float _ -> 0
-    | C_float _ , _ -> (-1)
-    | _ , C_float _ -> 1
-    | C_pointer _ , C_pointer _ -> 0
-    | C_pointer _ , _ -> (-1)
-    | _ , C_pointer _ -> 1
-    | C_comp a , C_comp b -> Cil_datatype.Compinfo.compare a b
-    | C_comp _ , _ -> (-1)
-    | _ , C_comp _ -> 1
-    | C_array _ , C_array _ -> assert false
-end
-
-module MACHINE = KEY(Ctypes)
-module NATURAL = KEY(COBJ)
-
-let natural_id = function
-  | C_int _ -> "int"
-  | C_float _ -> "float"
-  | C_pointer _ -> "pointer"
-  | C_array _ -> "array"
-  | C_comp c -> Lang.comp_id c
-
-let add_rank buffer k = if k > 0 then Buffer.add_string buffer (string_of_int k)
-let add_dim buffer rank = function
-  | None -> add_rank buffer rank ; Buffer.add_string buffer "w" ; 0
-  | Some _ -> succ rank
-
-let id ds =
-  let buffer = Buffer.create 8 in
-  add_rank buffer (List.fold_left (add_dim buffer) 0 ds) ;
-  Buffer.contents buffer
-
-type denv = {
+type env = {
   size_var : var list ; (* size variables *)
   size_val : term list ; (* size values *)
   index_var : var list ; (* index variables *)
   index_val : term list ; (* index values *)
   index_range : pred list ; (* indices are in range of size variables *)
-  index_offset : term list ; (* polynomial of indices *)
-  monotonic : bool ;
+  index_offset : term list ; (* polynomial of indices multiplied by previous sizes *)
+  length : term option ; (* number of array cells ; None is infinite *)
 }
 
 let rec collect rank = function
@@ -112,7 +78,7 @@ let rec collect rank = function
         index_val = [] ;
         index_range = [] ;
         index_offset = [] ;
-        monotonic = true ;
+        length = Some e_one ;
       }
   | d::ds ->
       let denv = collect (succ rank) ds in
@@ -121,43 +87,45 @@ let rec collect rank = function
       let k_val = e_var k_var in
       let k_ofs = e_prod (k_val :: denv.size_val) in
       match d with
-      | None ->
+      | `Ext ->
           { denv with
             index_var = k_var :: denv.index_var ;
             index_val = k_val :: denv.index_val ;
             index_offset = k_ofs :: denv.index_offset ;
-            monotonic = false ;
+            length = None ;
           }
-      | Some _ ->
+      | `Fix ->
           let n_base = match rank with 0 -> "n" | 1 -> "m" | _ -> "d" in
           let n_var = Lang.freshvar ~basename:n_base Qed.Logic.Int in
           let n_val = e_var n_var in
           let k_inf = p_leq e_zero k_val in
           let k_sup = p_lt k_val n_val in
-          {
+          let length = match denv.length with
+            | None -> None
+            | Some len -> Some (e_mul n_val len)
+          in {
             size_var = n_var :: denv.size_var ;
             size_val = n_val :: denv.size_val ;
             index_var = k_var :: denv.index_var ;
             index_val = k_val :: denv.index_val ;
             index_offset = k_ofs :: denv.index_offset ;
             index_range = k_inf :: k_sup :: denv.index_range ;
-            monotonic = denv.monotonic ;
+            length ;
           }
 
-let denv = collect 0
+let cc_env = collect 0
 
-let rec dval = function
+let rec cc_dims ns =
+  match ns with
   | [] -> []
-  | None :: ds -> dval ds
-  | Some n :: ds -> e_int n :: dval ds
-let size (_,ds) = dval ds
+  | Some n :: ns -> e_int n :: cc_dims ns
+  | None :: ns -> cc_dims ns
 
-let rec kind on_leaf obj = function
-  | [] -> on_leaf obj
-  | _ :: ds -> Qed.Logic.Array( Qed.Logic.Int , kind on_leaf obj ds )
+let cc_tau te ds = Lang.t_matrix te (List.length ds)
 
-let tau = kind Lang.tau_of_object
-let init = kind Lang.init_of_object
+(* -------------------------------------------------------------------------- *)
+(* --- Dimension Merging                                                  --- *)
+(* -------------------------------------------------------------------------- *)
 
 let rec do_merge ds1 ds2 =
   match ds1 , ds2 with
@@ -172,3 +140,5 @@ let rec do_merge ds1 ds2 =
 let merge ds1 ds2 =
   try Some(do_merge ds1 ds2)
   with Exit -> None
+
+(* -------------------------------------------------------------------------- *)
diff --git a/src/plugins/wp/Matrix.mli b/src/plugins/wp/Matrix.mli
index 62a58d3b6eeae7844be5e0cd8a98eabdc065516e..7ee7ac37f5589fbeff28cd3d565086f878014624 100644
--- a/src/plugins/wp/Matrix.mli
+++ b/src/plugins/wp/Matrix.mli
@@ -24,32 +24,30 @@
 (* --- Array Dimensions                                                   --- *)
 (* -------------------------------------------------------------------------- *)
 
-open Ctypes
-open Lang.F
-
-type dim = int option
-type matrix = c_object * dim list
+type t (** Matrix dimensions.
+           Encodes the number of dimensions and their kind *)
 
-module MACHINE : WpContext.Key with type t = matrix
-module NATURAL : WpContext.Key with type t = matrix
+val of_dims : int option list -> t
+val compare : t -> t -> int
+val pretty : Format.formatter -> t -> unit
+val pp_suffix_id : Format.formatter -> t -> unit
 
-val of_array : arrayinfo -> matrix
-val id : dim list -> string (** unique w.r.t [equal] *)
-val natural_id : c_object -> string (** name for elements in NATURAL *)
+val merge : int option list -> int option list -> int option list option
 
-val merge : dim list -> dim list -> dim list option
+open Lang.F
 
-type denv = {
+type env = {
   size_var : var list ; (** size variables *)
   size_val : term list ; (** size values *)
   index_var : var list ; (** index variables *)
   index_val : term list ; (** index values *)
   index_range : pred list ; (** indices are in range of size variables *)
   index_offset : term list ; (** polynomial of indices *)
-  monotonic : bool ; (** all dimensions are defined *)
+  length : term option ; (** number of cells (None is infinite) *)
 }
 
-val denv : dim list -> denv
-val size : matrix -> term list
-val tau : c_object -> dim list -> tau
-val init : c_object -> dim list -> tau
+val cc_tau : tau -> t -> tau (** Type of matrix *)
+val cc_env : t -> env (** Dimension environment *)
+val cc_dims : int option list -> term list (** Value of size variables *)
+
+(* -------------------------------------------------------------------------- *)
diff --git a/src/plugins/wp/MemEmpty.ml b/src/plugins/wp/MemEmpty.ml
index 837d3f28f39ba069e34cc8093e574fb97cedc744..1edfc12dcab461720cf3ec55016ba44aacfadb89 100644
--- a/src/plugins/wp/MemEmpty.ml
+++ b/src/plugins/wp/MemEmpty.ml
@@ -32,7 +32,7 @@ module Logic = Qed.Logic
 let datatype = "MemEmpty"
 let configure () =
   begin
-    let orig_pointer = Context.push Lang.pointer (fun _typ -> Logic.Int) in
+    let orig_pointer = Context.push Lang.pointer Logic.Int in
     let orig_null    = Context.push Cvalues.null (p_equal e_zero) in
     let rollback () =
       Context.pop Lang.pointer orig_pointer ;
diff --git a/src/plugins/wp/MemLoader.ml b/src/plugins/wp/MemLoader.ml
index b1abfb6af8f8d565f167aa4674e9632c2423a3eb..9711954f9aa5c0adb3b10230c7cd1567a9bb147d 100644
--- a/src/plugins/wp/MemLoader.ml
+++ b/src/plugins/wp/MemLoader.ml
@@ -48,7 +48,7 @@ sig
   val name : string
 
   type loc
-  val sizeof : c_object -> int
+  val sizeof : c_object -> term
   val field : loc -> fieldinfo -> loc
   val shift : loc -> c_object -> term -> loc
 
@@ -189,18 +189,24 @@ struct
           let obj = C_comp c in
           let loc = M.of_region_pointer r obj v in (* t_pointer -> loc *)
           let domain = M.value_footprint obj loc in
-          let result = Lang.tau_of_comp c in
+          let result = Lang.t_comp c in
           let lfun =
             Lang.generated_f ~result "Load%a_%s" pp_rid r (Lang.comp_id c)
           in
           (* Since its a generated it is the unique name given *)
           let xms,chunks,sigma = signature domain in
-          let def = List.map
-              (fun f ->
-                 Cfield (f, KValue) ,
-                 !loadrec sigma (object_of f.ftype) (M.field loc f)
-              ) c.cfields in
-          let dfun = Definitions.Function( result , Def , e_record def ) in
+          let dfun =
+            match c.cfields with
+            | None -> Definitions.Logic result
+            | Some fields ->
+                let def = List.map
+                    (fun f ->
+                       Cfield (f, KValue) ,
+                       !loadrec sigma (object_of f.ftype) (M.field loc f)
+                    ) fields
+                in
+                Definitions.Function( result , Def , e_record def )
+          in
           Definitions.define_symbol {
             d_lfun = lfun ; d_types = 0 ;
             d_params = x :: xms ;
@@ -217,46 +223,72 @@ struct
   (* ---  Array Loader                                                      --- *)
   (* -------------------------------------------------------------------------- *)
 
-  module ARRAY_KEY =
+  module AKEY =
   struct
-    type t = int * arrayinfo * Matrix.matrix
-    let pretty fmt (r,_,m) =
-      Format.fprintf fmt "%d:%a" r Matrix.NATURAL.pretty m
-    let compare (r1,_,m1) (r2,_,m2) =
-      if r1 = r2 then Matrix.NATURAL.compare m1 m2 else r1-r2
+    type t = int * base * Matrix.t
+    and base = I of c_int | F of c_float | P | C of compinfo
+    let make r elt ds =
+      let base = match elt with
+        | C_int i -> I i
+        | C_float f -> F f
+        | C_pointer _ -> P
+        | C_comp c -> C c
+        | C_array _ -> raise (Invalid_argument "Wp.EqArray")
+      in r, base , ds
+    let key = function
+      | I i -> Ctypes.i_name i
+      | F f -> Ctypes.f_name f
+      | P -> "ptr"
+      | C c -> Lang.comp_id c
+    let obj = function
+      | I i -> C_int i
+      | F f -> C_float f
+      | P -> C_pointer Cil.voidPtrType
+      | C c -> C_comp c
+    let tau = function
+      | I _ -> Lang.t_int
+      | F f -> Lang.t_float f
+      | P -> Lang.t_addr ()
+      | C c -> Lang.t_comp c
+    let compare (r,a,p) (s,b,q) =
+      if r = s then
+        let cmp = String.compare (key a) (key b) in
+        if cmp <> 0 then cmp else Matrix.compare p q
+      else r - s
+    let pretty fmt (r,a,ds) =
+      Format.fprintf fmt "%s%a%a" (key a) pp_rid r Matrix.pp_suffix_id ds
   end
 
-  module ARRAY = WpContext.Generator(ARRAY_KEY)
+  module ARRAY = WpContext.Generator(AKEY)
       (struct
         open Matrix
         let name = M.name ^ ".ARRAY"
-        type key = int * arrayinfo * Matrix.matrix
+        type key = AKEY.t
         type data = lfun * chunk list
 
-        let generate (r,ainfo,(obj_e,ds)) =
+        let generate (r,a,ds) =
           let x = Lang.freshvar ~basename:"p" (Lang.t_addr()) in
           let v = e_var x in
-          let obj_a = C_array ainfo in
-          let loc = M.of_region_pointer r obj_a v in (* t_pointer -> loc *)
-          let domain = M.value_footprint obj_a loc in
-          let result = Matrix.tau obj_e ds in
+          let obj = AKEY.obj a in
+          let loc = M.of_region_pointer r obj v in (* t_pointer -> loc *)
+          let domain = M.value_footprint obj loc in
+          let result = Matrix.cc_tau (AKEY.tau a) ds in
           let lfun =
-            Lang.generated_f ~result "Array%a%s_%s"
-              pp_rid r (Matrix.id ds) (Matrix.natural_id obj_e)
-          in
+            Lang.generated_f ~result "Array%a_%s%a"
+              pp_rid r (AKEY.key a) Matrix.pp_suffix_id ds in
           let prefix = Lang.Fun.debug lfun 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
-          let va = List.fold_left e_get phi denv.index_val in
-          let ofs = e_sum denv.index_offset in
-          let vm = !loadrec sigma obj_e (M.shift loc obj_e ofs) in
-          let lemma = p_hyps denv.index_range (p_equal va vm) in
+          let env = Matrix.cc_env ds in
+          let phi = e_fun lfun (v :: env.size_val @ List.map e_var xmem) in
+          let va = List.fold_left e_get phi env.index_val in
+          let ofs = e_sum env.index_offset in
+          let vm = !loadrec sigma obj (M.shift loc obj ofs) in
+          let lemma = p_hyps env.index_range (p_equal va vm) in
           let cluster = cluster () in
           Definitions.define_symbol {
             d_lfun = lfun ; d_types = 0 ;
-            d_params = x :: denv.size_var @ xmem ;
+            d_params = x :: env.size_var @ xmem ;
             d_definition = Logic result ;
             d_cluster = cluster ;
           } ;
@@ -268,10 +300,10 @@ struct
             l_lemma = lemma ;
             l_cluster = cluster ;
           } ;
-          if denv.monotonic then
+          if env.length <> None then
             begin
-              let ns = List.map F.e_var denv.size_var in
-              frame_lemmas lfun obj_a loc (v::ns) chunks
+              let ns = List.map F.e_var env.size_var in
+              frame_lemmas lfun obj loc (v::ns) chunks
             end ;
           lfun , chunks
 
@@ -288,10 +320,11 @@ struct
     F.e_fun f (p :: memories sigma m)
 
   let load_array sigma a loc =
-    let d = Matrix.of_array a in
     let r , p = M.to_region_pointer loc in
-    let f , m = ARRAY.get (r,a,d) in
-    F.e_fun f (p :: Matrix.size d @ memories sigma m)
+    let e , ns = Ctypes.array_dimensions a in
+    let ds = Matrix.of_dims ns in
+    let f , m = ARRAY.get @@ AKEY.make r e ds in
+    F.e_fun f (p :: Matrix.cc_dims ns @ memories sigma m)
 
   let loadvalue sigma obj loc =
     match obj with
@@ -318,19 +351,6 @@ struct
 
   let isinitrec = ref (fun _ _ _ -> assert false)
 
-  let initialization_lemma cluster name (sigma, obj, loc) (lfun, params) =
-    let high = p_call lfun (List.map F.e_var params) in
-    let low = M.is_init_range sigma obj loc e_one in
-    let lemma = p_equiv high low in
-    {
-      l_kind = `Axiom ;
-      l_name = name ^ "_low" ; l_types = 0 ;
-      l_forall = F.p_vars lemma ;
-      l_triggers = [] ;
-      l_lemma = lemma ;
-      l_cluster = cluster ;
-    }
-
   module IS_INIT_COMP = WpContext.Generator(COMP_KEY)
       (struct
         let name = M.name ^ ".IS_INIT_COMP"
@@ -339,69 +359,93 @@ struct
 
         let generate (r,c) =
           let x = Lang.freshvar ~basename:"p" (Lang.t_addr()) in
-          let v = e_var x in
           let obj = C_comp c in
-          let loc = M.of_region_pointer r obj v in (* t_pointer -> loc *)
+          let loc = M.of_region_pointer r obj (e_var x) in
           let domain = M.init_footprint obj loc in
           let cluster = cluster () in
-          (* Function Is_init *)
+          (* Is_init: structural definition *)
           let name =
             Format.asprintf "Is%s%a" (Lang.comp_init_id c) pp_rid r
           in
           let lfun = Lang.generated_p name in
           let xms,chunks,sigma = signature domain in
-          let def = p_all
-              (fun f -> !isinitrec sigma (object_of f.ftype) (M.field loc f))
-              c.cfields
+          let params = x :: xms in
+          let def = match c.cfields with
+            | None -> Logic Lang.t_prop
+            | Some fields ->
+                let def = p_all
+                    (fun f -> !isinitrec sigma (object_of f.ftype) (M.field loc f))
+                    fields
+                in
+                Predicate(Def, def)
           in
           Definitions.define_symbol {
             d_lfun = lfun ; d_types = 0 ;
-            d_params = x :: xms ;
-            d_definition = Predicate(Def , def) ;
+            d_params = params ;
+            d_definition = def ;
             d_cluster = cluster ;
           } ;
-          (* Lemma for low-level view of the memory *)
-          Definitions.define_lemma
-            (initialization_lemma cluster name (sigma,obj,loc) (lfun,x::xms)) ;
+          (* Is_init: full-range definition *)
+          let is_init_p = p_call lfun (List.map e_var (x :: xms)) in
+          let is_init_r = M.is_init_range sigma obj loc e_one in
+          let lemma = p_equiv is_init_p is_init_r in
+          Definitions.define_lemma {
+            l_kind = `Axiom ;
+            l_name = name ^ "_range" ; l_types = 0 ;
+            l_forall = params ;
+            l_triggers = [] ;
+            l_lemma = lemma ;
+            l_cluster = cluster ;
+          } ;
           lfun , chunks
 
         let compile = Lang.local generate
       end)
 
-  module ARRAYINIT = WpContext.Generator(ARRAY_KEY)
+  module IS_ARRAY_INIT = WpContext.Generator(AKEY)
       (struct
         open Matrix
-        let name = M.name ^ ".ARRAYINIT"
-        type key = int * arrayinfo * Matrix.matrix
+        let name = M.name ^ ".IS_ARRAY_INIT"
+        type key = AKEY.t
         type data = lfun * chunk list
 
-        let generate (r,ainfo,(obj_e,ds)) =
+        let generate (r,a,ds) =
           let x = Lang.freshvar ~basename:"p" (Lang.t_addr()) in
           let v = e_var x in
-          let obj_a = C_array ainfo in
-          let loc = M.of_region_pointer r obj_a v in (* t_pointer -> loc *)
-          let domain = M.init_footprint obj_a loc in
-          let name = Format.asprintf "IsInitArray%a%s_%s"
-              pp_rid r (Matrix.id ds) (Matrix.natural_id obj_e)
-          in
+          let obj = AKEY.obj a in
+          let loc = M.of_region_pointer r obj v in
+          let domain = M.init_footprint obj loc in
+          let name = Format.asprintf "IsInitArray%a_%s%a"
+              pp_rid r (AKEY.key a) Matrix.pp_suffix_id ds in
           let lfun = Lang.generated_p name in
           let xmem,chunks,sigma = signature domain in
-          let denv = Matrix.denv ds in
-          let ofs = e_sum denv.index_offset in
-          let vm = !isinitrec sigma obj_e (M.shift loc obj_e ofs) in
-          let def = p_forall denv.index_var (p_hyps denv.index_range vm) in
+          let env = Matrix.cc_env ds in
+          let params = x :: env.size_var @ xmem in
+          let ofs = e_sum env.index_offset in
+          let vm = !isinitrec sigma obj (M.shift loc obj ofs) in
+          let def = p_forall env.index_var (p_hyps env.index_range vm) in
           let cluster = cluster () in
+          (* Is_init: structural definition *)
           Definitions.define_symbol {
             d_lfun = lfun ; d_types = 0 ;
-            d_params = x :: denv.size_var @ xmem ;
+            d_params = params ;
             d_definition = Predicate (Def, def) ;
             d_cluster = cluster ;
           } ;
-          (* Lemma for low-level view of the memory *)
-          Definitions.define_lemma
-            (initialization_lemma cluster name
-               (sigma, obj_a, loc)
-               (lfun, x :: denv.size_var @ xmem)) ;
+          (* Is_init: range definition *)
+          begin match env.length with None -> () | Some len ->
+            let is_init_p = p_call lfun (List.map e_var params) in
+            let is_init_r = M.is_init_range sigma obj loc len in
+            let lemma = p_equiv is_init_p is_init_r in
+            Definitions.define_lemma {
+              l_kind = `Axiom ;
+              l_name = name ^ "_range" ; l_types = 0 ;
+              l_forall = params ;
+              l_triggers = [] ;
+              l_lemma = lemma ;
+              l_cluster = cluster ;
+            }
+          end ;
           lfun , chunks
 
         let compile = Lang.local generate
@@ -412,11 +456,12 @@ struct
     let f , m = IS_INIT_COMP.get (r,comp) in
     F.p_call f (p :: memories sigma m)
 
-  let initialized_array sigma a loc =
-    let d = Matrix.of_array a in
+  let initialized_array sigma ainfo loc =
     let r , p = M.to_region_pointer loc in
-    let f , m = ARRAYINIT.get (r,a,d) in
-    F.p_call f (p :: Matrix.size d @ memories sigma m)
+    let e , ns = Ctypes.array_dimensions ainfo in
+    let ds = Matrix.of_dims ns in
+    let f , m = IS_ARRAY_INIT.get @@ AKEY.make r e ds in
+    F.p_call f (p :: Matrix.cc_dims ns @ memories sigma m)
 
   let initialized_loc sigma obj loc =
     match obj with
diff --git a/src/plugins/wp/MemLoader.mli b/src/plugins/wp/MemLoader.mli
index 177e2ce96b5f08ec149f1a532d19bfe11a093924..706c697ee04e17f556e86f946203f9537ef87077 100644
--- a/src/plugins/wp/MemLoader.mli
+++ b/src/plugins/wp/MemLoader.mli
@@ -42,7 +42,7 @@ sig
   val name : string
 
   type loc
-  val sizeof : c_object -> int
+  val sizeof : c_object -> term
   val field : loc -> fieldinfo -> loc
   val shift : loc -> c_object -> term -> loc
 
diff --git a/src/plugins/wp/MemMemory.ml b/src/plugins/wp/MemMemory.ml
index c0f4455e346f80cef268f23714e327dd9427e8d3..3455e01468dc4cfa72173d8501ece03aa9fbf023 100644
--- a/src/plugins/wp/MemMemory.ml
+++ b/src/plugins/wp/MemMemory.ml
@@ -239,27 +239,28 @@ let is_separated args = F.is_true (r_separated args)
 (* --- Simplifier for 'included'                                          --- *)
 (* -------------------------------------------------------------------------- *)
 
-(*
-logic a : int
-logic b : int
+(* See: tests/why3/test_memory.why
+
+   logic a : int
+   logic b : int
 
-predicate R =     p.base = q.base
+   predicate R = p.base = q.base
               /\ (q.offset <= p.offset)
               /\ (p.offset + a <= q.offset + b)
 
-predicate included = 0 < a -> ( 0 <= b and R )
-predicate a_empty = a <= 0
-predicate b_negative = b < 0
+   predicate included = 0 < a -> ( 0 <= b and R )
+   predicate a_empty = a <= 0
+   predicate b_negative = b < 0
 
-lemma SAME_P: p=q -> (R <-> a<=b)
-lemma SAME_A: a=b -> (R <-> p=q)
+   lemma SAME_P: p=q -> (R <-> a<=b)
+   lemma SAME_A: a=b -> (R <-> p=q)
 
-goal INC_P:  p=q -> (included <-> ( 0 < a -> a <= b )) (by SAME_P)
-goal INC_A:  a=b -> 0 < a -> (included <-> R) (by SAME_A)
-goal INC_1:  a_empty -> (included <-> true)
-goal INC_2:  b_negative -> (included <-> a_empty)
-goal INC_3:  not R -> (included <-> a_empty)
-goal INC_4:  not a_empty -> not b_negative -> (included <-> R)
+   goal INC_P:  p=q -> (included <-> ( 0 < a -> a <= b )) (by SAME_P)
+   goal INC_A:  a=b -> 0 < a -> (included <-> R) (by SAME_A)
+   goal INC_1:  a_empty -> (included <-> true)
+   goal INC_2:  b_negative -> (included <-> a_empty)
+   goal INC_3:  not R -> (included <-> a_empty)
+   goal INC_4:  not a_empty -> not b_negative -> (included <-> R)
 *)
 
 let r_included = function
@@ -341,6 +342,32 @@ let phi_addr_of_int p =
     | L.Fun(f,[a]) when f == f_int_of_addr -> a
     | _ -> raise Not_found
 
+(* -------------------------------------------------------------------------- *)
+(* --- Simplifier for (in)validity                                        --- *)
+(* -------------------------------------------------------------------------- *)
+
+let null_base p = e_eq (F.e_fun f_base [p]) F.e_zero
+
+(* See: tests/why3/test_memory.why *)
+
+(* - lemma valid_rd_null: forall m n p. p.base = 0 -> (n <= 0 <-> valid_rd m p n)
+   - lemma valid_rw_null: forall m n p. p.base = 0 -> (n <= 0 <-> valid_rw m p n)
+*)
+let r_valid_unref = function
+  | [_; p; n] when F.decide (null_base p) ->
+      e_leq n e_zero
+  | _ -> raise Not_found
+
+(* - lemma valid_obj_null: forall m n. valid_obj m null n *)
+let r_valid_obj = function
+  | [_; p; _] when F.decide (e_eq p a_null) -> e_true
+  | _ -> raise Not_found
+
+(* - lemma invalid_null: forall m n p. p.base = 0 -> invalid m p n *)
+let r_invalid = function
+  | [_; p; _] when F.decide (null_base p) -> e_true
+  | _ -> raise Not_found
+
 (* -------------------------------------------------------------------------- *)
 (* --- Simplifiers Registration                                           --- *)
 (* -------------------------------------------------------------------------- *)
@@ -358,6 +385,10 @@ let () = Context.register
       F.set_builtin_get f_havoc r_get_havoc ;
       F.set_builtin_1 f_addr_of_int phi_addr_of_int ;
       F.set_builtin_1 f_int_of_addr phi_int_of_addr ;
+      F.set_builtin p_invalid r_invalid ;
+      F.set_builtin p_valid_rd r_valid_unref ;
+      F.set_builtin p_valid_rw r_valid_unref ;
+      F.set_builtin p_valid_obj r_valid_obj ;
     end
 
 (* -------------------------------------------------------------------------- *)
@@ -395,20 +426,20 @@ type range =
 
 let range ~shift ~addrof ~sizeof = function
   | Sigs.Rloc(obj,loc) ->
-      LOC( addrof loc , F.e_int (sizeof obj) )
+      LOC( addrof loc , sizeof obj )
   | Sigs.Rrange(loc,obj,Some a,Some b) ->
       let s = sizeof obj in
       let p = addrof (shift loc obj a) in
-      let n = e_fact s (e_range a b) in
+      let n = e_mul s (e_range a b) in
       LOC( p , n )
   | Sigs.Rrange(loc,_obj,None,None) ->
       RANGE( a_base (addrof loc) , Vset.range None None )
   | Sigs.Rrange(loc,obj,Some a,None) ->
       let s = sizeof obj in
-      RANGE( a_base (addrof loc) , Vset.range (Some (e_fact s a)) None )
+      RANGE( a_base (addrof loc) , Vset.range (Some (e_mul s a)) None )
   | Sigs.Rrange(loc,obj,None,Some b) ->
       let s = sizeof obj in
-      RANGE( a_base (addrof loc) , Vset.range None (Some (e_fact s b)) )
+      RANGE( a_base (addrof loc) , Vset.range None (Some (e_mul s b)) )
 
 let range_set = function
   | LOC(l,n) ->
diff --git a/src/plugins/wp/MemMemory.mli b/src/plugins/wp/MemMemory.mli
index 1a90054368b97235e381f1964d9d1ac81b24980a..318d4483ddd1481e4ac9306b25da910fc8f8cb88 100644
--- a/src/plugins/wp/MemMemory.mli
+++ b/src/plugins/wp/MemMemory.mli
@@ -112,13 +112,13 @@ val frames : addr:term -> offset:term -> sizeof:term ->
 val separated :
   shift:('a -> Ctypes.c_object -> term -> 'a) ->
   addrof:('a -> term) ->
-  sizeof:(Ctypes.c_object -> int) ->
+  sizeof:(Ctypes.c_object -> term) ->
   'a Sigs.rloc -> 'a Sigs.rloc -> pred
 
 val included :
   shift:('a -> Ctypes.c_object -> term -> 'a) ->
   addrof:('a -> term) ->
-  sizeof:(Ctypes.c_object -> int) ->
+  sizeof:(Ctypes.c_object -> term) ->
   'a Sigs.rloc -> 'a Sigs.rloc -> pred
 
 (* -------------------------------------------------------------------------- *)
diff --git a/src/plugins/wp/MemRegion.ml b/src/plugins/wp/MemRegion.ml
index eabf76e10906d2d1e513d1506aacc32776cd1727..c5a388526d6ca292e7b1026f07f821f7b87b7672 100644
--- a/src/plugins/wp/MemRegion.ml
+++ b/src/plugins/wp/MemRegion.ml
@@ -428,7 +428,7 @@ let datatype = "MemRegion"
 
 let configure () =
   begin
-    let orig_pointer = Context.push Lang.pointer (fun _ -> t_index) in
+    let orig_pointer = Context.push Lang.pointer t_index in
     let orig_null = Context.push Cvalues.null p_inull in
     let rollback () =
       Context.pop Lang.pointer orig_pointer ;
@@ -722,7 +722,7 @@ struct
   type nonrec loc = loc
   let field = field
   let shift = shift
-  let sizeof = Ctypes.bits_sizeof_object
+  let sizeof obj = Lang.F.e_int (Ctypes.bits_sizeof_object obj)
   let value_footprint = value_footprint
   let init_footprint = init_footprint
   let frames _ _ _ = []
@@ -852,7 +852,7 @@ let disjoint_region s1 s2 =
 
 
 let addrof = MODEL.to_addr
-let sizeof = Ctypes.bits_sizeof_object
+let sizeof = MODEL.sizeof
 
 let included s1 s2 =
   if disjoint_region s1 s2 then F.p_false else
diff --git a/src/plugins/wp/MemTyped.ml b/src/plugins/wp/MemTyped.ml
index b885cd1e214cbe39054649bf0aee6a2974d2116f..224fdad715bf2141892206b531aec6e1461acb2e 100644
--- a/src/plugins/wp/MemTyped.ml
+++ b/src/plugins/wp/MemTyped.ml
@@ -45,7 +45,7 @@ let datatype = "MemTyped"
 let hypotheses p = p
 let configure () =
   begin
-    let orig_pointer = Context.push Lang.pointer (fun _ -> t_addr) in
+    let orig_pointer = Context.push Lang.pointer t_addr in
     let orig_null    = Context.push Cvalues.null (p_equal a_null) in
     let rollback () =
       Context.pop Lang.pointer orig_pointer ;
@@ -200,23 +200,64 @@ let rec footprint = function
   | C_array a -> footprint (object_of a.arr_element)
   | C_comp c -> footprint_comp c
 
-and footprint_comp c =
-  List.fold_left
-    (fun ft f ->
-       Heap.Set.union ft (footprint (object_of f.ftype))
-    ) Heap.Set.empty c.cfields
+and footprint_comp { cfields } =
+  match cfields with
+  | None -> all_value_chunks ()
+  | Some fields ->
+      List.fold_left
+        (fun ft f ->
+           Heap.Set.union ft (footprint (object_of f.ftype))
+        ) Heap.Set.empty fields
+
+and all_value_chunks () =
+  let ints =
+    List.fold_left (fun l i -> M_int i :: l) []
+      [ Ctypes.CBool ;
+        SInt8 ; UInt8 ; SInt16 ; UInt16 ; SInt32 ; UInt32 ; SInt64 ; UInt64 ]
+  in
+  Heap.Set.of_list (M_pointer :: M_char :: M_f32 :: M_f64 :: ints)
 
 let init_footprint _ _ = Heap.Set.singleton T_init
 let value_footprint obj _l = footprint obj
 
+(* Note that it is the length in MemTyped and not the occupied bytes *)
+module OPAQUE_COMP_LENGTH = WpContext.Generator(Cil_datatype.Compinfo)
+    (struct
+      let name = "MemTyped.EmptyCompLength"
+      type key = compinfo
+      type data = lfun
+      let compile c =
+        if c.cfields <> None then
+          Wp_parameters.fatal
+            "Asking for opaque struct length on non opaque struct" ;
+        let result = Lang.t_int in
+        let size =
+          Lang.generated_f ~params:[] ~result "Length_of_%s" (Lang.comp_id c)
+        in
+        (* Registration *)
+        Definitions.define_symbol {
+          d_cluster = Definitions.compinfo c ;
+          d_lfun = size ; d_types = 0 ; d_params = [] ;
+          d_definition = Logic result ;
+        } ;
+        Definitions.define_lemma {
+          l_kind = `Axiom ;
+          l_name = "Positive_Length_of_" ^ Lang.comp_id c ;
+          l_types = 0 ; l_triggers = [] ; l_forall = [] ;
+          l_cluster = Definitions.compinfo c ;
+          l_lemma = Lang.F.(p_lt e_zero (e_fun size []))
+        } ;
+        size
+    end)
+
 let rec length_of_object = function
-  | C_int _ | C_float _ | C_pointer _ -> 1
+  | C_int _ | C_float _ | C_pointer _ -> e_one
   | C_comp c -> length_of_comp c
   | C_array { arr_flat = Some { arr_size = n } ; arr_element = elt } ->
-      n * (length_of_typ elt)
+      e_mul (e_int n) (length_of_typ elt)
   | C_array _ as a ->
       if Wp_parameters.ExternArrays.get () then
-        max_int
+        e_int max_int
       else
         Warning.error ~source:"Typed Model"
           "Undefined array-size (%a)" Ctypes.pretty a
@@ -224,18 +265,22 @@ let rec length_of_object = function
 and length_of_typ t = length_of_object (object_of t)
 and length_of_field f = length_of_typ f.ftype
 and length_of_comp c =
-  (* union field are considered as struct field *)
-  List.fold_left
-    (fun s f -> s + length_of_field f)
-    0 c.cfields
+  match c.cfields with
+  | None ->
+      Lang.F.e_fun (OPAQUE_COMP_LENGTH.get c) []
+  | Some fields ->
+      (* union field are considered as struct field *)
+      e_sum (List.map length_of_field fields)
 
 let position_of_field f =
   let rec fnext k f = function
     | [] -> assert false
     | g::gs ->
         if Fieldinfo.equal f g then k
-        else fnext (k + length_of_field g) f gs
-  in fnext 0 f f.fcomp.cfields
+        else fnext (e_add k (length_of_field g)) f gs
+        (* Just as we fail if the field does not exists, we fail
+           if we try to get a field position in an opaque struct. *)
+  in fnext e_zero f (Option.get f.fcomp.cfields)
 
 (* -------------------------------------------------------------------------- *)
 (* --- Utilities on loc-as-term                                           --- *)
@@ -257,19 +302,19 @@ let cluster_globals () =
   Definitions.cluster ~id:"Globals" ~title:"Global Variables" ()
 
 type shift =
-  | RS_Field of fieldinfo * int (* offset of the field *)
-  | RS_Index of int  (* size of the shift *)
+  | RS_Field of fieldinfo * term (* offset of the field *)
+  | RS_Index of term  (* size of the shift *)
 
 let phi_base = function
   | p::_ -> a_base p
   | _ -> raise Not_found
 
 let phi_field offset = function
-  | [p] -> e_add (a_offset p) (F.e_int offset)
+  | [p] -> e_add (a_offset p) offset
   | _ -> raise Not_found
 
 let phi_index size = function
-  | [p;k] -> e_add (a_offset p) (F.e_fact size k)
+  | [p;k] -> e_add (a_offset p) (F.e_mul size k)
   | _ -> raise Not_found
 
 module RegisterShift = WpContext.Static
@@ -293,7 +338,7 @@ module ShiftFieldDef = WpContext.StaticGenerator(Cil_datatype.Fieldinfo)
         (* Since its a generated it is the unique name given *)
         let xloc = Lang.freshvar ~basename:"p" t_addr in
         let loc = e_var xloc in
-        let def = a_shift loc (F.e_int position) in
+        let def = a_shift loc position in
         let dfun = Definitions.Function( result , Def , def) in
         RegisterShift.define lfun (RS_Field(f,position)) ;
         MemMemory.register ~base:phi_base ~offset:(phi_field position) lfun ;
@@ -338,7 +383,7 @@ module ShiftGen = WpContext.StaticGenerator(Cobj)
         | C_int i -> pp_int fmt i
         | C_float f -> pp_float fmt f
         | C_pointer _ -> Format.fprintf fmt "PTR"
-        | C_comp c -> Format.pp_print_string fmt c.cname
+        | C_comp c -> Format.pp_print_string fmt (Lang.comp_id c)
         | C_array a ->
             let te = object_of a.arr_element in
             match a.arr_flat with
@@ -356,7 +401,7 @@ module ShiftGen = WpContext.StaticGenerator(Cobj)
         let loc = e_var xloc in
         let xk = Lang.freshvar ~basename:"k" Qed.Logic.Int in
         let k = e_var xk in
-        let def = a_shift loc (F.e_fact size k) in
+        let def = a_shift loc (F.e_mul size k) in
         let dfun = Definitions.Function( result , Def , def) in
         RegisterShift.define shift (RS_Index size) ;
         MemMemory.register ~base:phi_base ~offset:(phi_index size)
@@ -516,14 +561,14 @@ module BASE = WpContext.Generator(Varinfo)
 
       let linked prefix x base =
         let name = prefix ^ "_linked" in
-        let size = if x.vglob then sizeof x else Some 0 in
+        let size = if x.vglob then sizeof x else Some e_zero in
         match size with
         | None -> ()
         | Some size ->
             let a = Lang.freshvar ~basename:"alloc" t_malloc in
             let m = e_var a in
             let m_linked = p_call p_linked [m] in
-            let base_size = p_equal (F.e_get m base) (e_int size) in
+            let base_size = p_equal (F.e_get m base) size in
             Definitions.define_lemma {
               l_kind = `Axiom ;
               l_name = name ; l_types = 0 ;
@@ -538,10 +583,10 @@ module BASE = WpContext.Generator(Varinfo)
             let a = Lang.freshvar ~basename:"init" t_init in
             let m = e_var a in
             let init_access =
-              if size = 1 then
+              if size = e_one then
                 p_bool (F.e_get m (a_addr base e_zero))
               else
-                F.p_call p_is_init_r [ m ; a_addr base e_zero ; e_int size ]
+                F.p_call p_is_init_r [ m ; a_addr base e_zero ; size ]
             in
             let m_init = p_call p_cinits [m] in
             let init_prop = p_forall [a] (p_imply m_init init_access) in
@@ -600,7 +645,12 @@ 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_base l) (a_offset l)
 let block_length sigma obj l =
-  e_fact (Ctypes.sizeof_object obj) (allocated sigma l)
+  let n_cells = e_div (allocated sigma l) (length_of_object obj) in
+  match obj with
+  | C_comp ({ cfields = None } as c) ->
+      e_mul (Cvalues.bytes_length_of_opaque_comp c) n_cells
+  | _ ->
+      e_fact (Ctypes.sizeof_object obj) n_cells
 
 (* -------------------------------------------------------------------------- *)
 (* --- Cast                                                               --- *)
@@ -649,7 +699,7 @@ struct
     | C_int i -> A (I i)
     | C_float f -> A (F f)
     | C_pointer t -> A (P t)
-    | C_comp ( { cfields = [f] } as c ) ->
+    | C_comp ( { cfields = Some [f] } as c ) ->
         begin (* union having only one field is equivalent to a struct *)
           match Ctypes.object_of f.ftype with
           | C_array _ -> (if c.cstruct then S c else U c)
@@ -718,8 +768,12 @@ struct
   let layout (obj : c_object) : layout = rlayout [] obj
 
   let clayout (c: Cil_types.compinfo) : layout =
-    let flayout w f = rlayout w (Ctypes.object_of f.ftype) in
-    List.fold_left flayout [] (List.rev c.cfields)
+    match c.cfields with
+    | None ->
+        rlayout [] (C_comp c)
+    | Some fields ->
+        let flayout w f = rlayout w (Ctypes.object_of f.ftype) in
+        List.fold_left flayout [] (List.rev fields)
 
   type comparison = Srem of layout | Drem of layout | Equal | Mismatch
 
@@ -908,7 +962,7 @@ let int_of_loc _ l = F.e_fun f_int_of_addr [l]
 let frames obj addr = function
   | T_alloc -> []
   | m ->
-      let offset = F.e_int (length_of_object obj) in
+      let offset = length_of_object obj in
       let sizeof = F.e_one in
       let tau = Chunk.val_of_chunk m in
       let basename = Chunk.basename_of_chunk m in
@@ -985,21 +1039,21 @@ struct
 
   let last sigma obj l =
     let n = length_of_object obj in
-    e_sub (F.e_div (allocated sigma l) (F.e_int n)) e_one
+    e_sub (F.e_div (allocated sigma l) n) e_one
 
   let havoc obj loc ~length chunk ~fresh ~current =
     if chunk <> T_alloc then
-      let n = F.e_fact (length_of_object obj) length in
+      let n = F.e_mul (length_of_object obj) length in
       F.e_fun f_havoc [fresh;current;loc;n]
     else fresh
 
   let eqmem obj loc _chunk m1 m2 =
-    F.p_call p_eqmem [m1;m2;loc;e_int (length_of_object obj)]
+    F.p_call p_eqmem [m1;m2;loc;length_of_object obj]
 
   let eqmem_forall obj loc _chunk m1 m2 =
     let xp = Lang.freshvar ~basename:"p" t_addr in
     let p = F.e_var xp in
-    let n = F.e_int (length_of_object obj) in
+    let n = length_of_object obj in
     let separated = F.p_call p_separated [p;e_one;loc;n] in
     let equal = p_equal (e_get m1 p) (e_get m2 p) in
     [xp],separated,equal
@@ -1014,11 +1068,11 @@ struct
   let is_init_atom sigma l = F.e_get (Sigma.value sigma T_init) l
 
   let is_init_range sigma obj loc length =
-    let n = F.e_fact (length_of_object obj) length in
+    let n = F.e_mul (length_of_object obj) length in
     F.p_call p_is_init_r [ Sigma.value sigma T_init ; loc ; n ]
 
   let set_init obj loc ~length _chunk ~current =
-    let n = F.e_fact (length_of_object obj) length in
+    let n = F.e_mul (length_of_object obj) length in
     F.e_fun f_set_init [current;loc;n]
 
   let monotonic_init s1 s2 =
@@ -1053,7 +1107,7 @@ let loc_lt = loc_compare p_addr_lt p_lt
 let loc_leq = loc_compare p_addr_le p_leq
 let loc_diff obj p q =
   let delta = e_sub (a_offset p) (a_offset q) in
-  let size = e_int (length_of_object obj) in
+  let size = length_of_object obj in
   e_div delta size
 
 (* -------------------------------------------------------------------------- *)
@@ -1073,10 +1127,10 @@ let s_invalid sigma p n =
 
 let segment phi = function
   | Rloc(obj,l) ->
-      phi l (e_int (length_of_object obj))
+      phi l (length_of_object obj)
   | Rrange(l,obj,Some a,Some b) ->
       let l = shift l obj a in
-      let n = e_fact (length_of_object obj) (e_range a b) in
+      let n = e_mul (length_of_object obj) (e_range a b) in
       phi l n
   | Rrange(l,_,a,b) ->
       Wp_parameters.abort ~current:true
@@ -1106,9 +1160,9 @@ let scope seq scope xs =
       List.fold_left
         (fun m x ->
            let size = match scope with
-             | Sigs.Leave -> 0
+             | Sigs.Leave -> e_zero
              | Sigs.Enter -> length_of_typ x.vtype
-           in F.e_set m (BASE.get x) (e_int size))
+           in F.e_set m (BASE.get x) size)
         (Sigma.value seq.pre T_alloc) xs in
     [ p_equal (Sigma.value seq.post T_alloc) alloc ]
 
diff --git a/src/plugins/wp/MemVar.ml b/src/plugins/wp/MemVar.ml
index 102135a390c059ec2ecddaa30e0e355e555ff18d..ddaef66c490c6877fd3924018671d699c41614f9 100644
--- a/src/plugins/wp/MemVar.ml
+++ b/src/plugins/wp/MemVar.ml
@@ -683,14 +683,18 @@ struct
     | Loc l -> M.block_length sigma.mem obj l
     | Ref x -> noref ~op:"block-length of" x
     | Val(m,x,_) ->
-        let obj = Ctypes.object_of (vtype m x) in
-        let size =
-          if Ctypes.sizeof_defined obj
-          then Ctypes.sizeof_object obj
-          else if Wp_parameters.ExternArrays.get ()
-          then max_int
-          else Warning.error ~source:"MemVar" "Unknown array-size"
-        in F.e_int size
+        begin match Ctypes.object_of (vtype m x) with
+          | C_comp ({ cfields = None } as c) ->
+              Cvalues.bytes_length_of_opaque_comp c
+          | obj ->
+              let size =
+                if Ctypes.sizeof_defined obj
+                then Ctypes.sizeof_object obj
+                else if Wp_parameters.ExternArrays.get ()
+                then max_int
+                else Warning.error ~source:"MemVar" "Unknown array-size"
+              in F.e_int size
+        end
 
   let cast obj l = Loc(M.cast obj (mloc_of_loc l))
   let loc_of_int e a = Loc(M.loc_of_int e a)
@@ -903,8 +907,8 @@ struct
     | OBJ , _ , [Shift(te,k)] -> Some(te,k,obj)
     | OBJ , C_comp c , (Field fd :: ofs) ->
         begin
-          match List.rev c.cfields with
-          | fd0::_ when Fieldinfo.equal fd fd0 ->
+          match Option.map List.rev c.cfields with
+          | Some (fd0::_) when Fieldinfo.equal fd fd0 ->
               last_field_shift acs (Ctypes.object_of fd.ftype) ofs
           | _ -> None
         end
@@ -1049,13 +1053,18 @@ struct
           | Some { arr_size } -> arr_size
         in
         initialized_range sigma obj x ofs (e_int 0)(e_int (size-1))
-    | C_comp ci ->
+    | C_comp { cfields = None } ->
+        Lang.F.p_equal
+          (access_init (get_init_term sigma x) ofs)
+          (Cvalues.initialized_obj obj)
+    | C_comp { cfields = Some fields } ->
         let mk_pred f =
           let obj = Ctypes.object_of f.ftype in
           let ofs = ofs @ [Field f] in
           initialized_loc sigma obj x ofs
         in
-        Lang.F.p_conj (List.map mk_pred ci.cfields)
+        Lang.F.p_conj (List.map mk_pred fields)
+
   and initialized_range sigma obj x ofs low up =
     match obj with
     | C_array { arr_element=t } ->
@@ -1085,11 +1094,11 @@ struct
           | Ref _ -> p_true
           | Loc l -> M.initialized sigma.mem (Rloc(obj,l))
           | Val(m,x,p) ->
-              if (x.vformal || x.vglob) then
+              if is_heap_allocated m then
+                M.initialized sigma.mem (Rloc(obj,mloc_of_loc l))
+              else if (x.vformal || x.vglob) then
                 try valid_offset RW (vobject m x) p
                 with ShiftMismatch -> shift_mismatch l
-              else if is_heap_allocated m then
-                M.initialized sigma.mem (Rloc(obj,mloc_of_loc l))
               else
                 initialized_loc sigma obj x p
         end
@@ -1099,17 +1108,26 @@ struct
           | Loc l -> M.initialized sigma.mem (Rrange(l,elt,Some a, Some b))
           | Val(m,x,p) ->
               try
-                let in_array = valid_range RW (vobject m x) p (elt, a, b) in
-                let initialized =
-                  if x.vformal || x.vglob then p_true
-                  else initialized_range sigma (vobject m x) x p a b
-                in
-                F.p_imply (F.p_leq a b) (p_and in_array initialized)
-              with ShiftMismatch ->
                 if is_heap_allocated m then
                   let l = mloc_of_loc l in
                   M.initialized sigma.mem (Rrange(l,elt,Some a, Some b))
-                else shift_mismatch l
+                else
+                  let rec normalize obj = function
+                    | [] -> [], a, b
+                    | [Shift(elt, i)] when Ctypes.equal obj elt ->
+                        [], F.e_add a i, F.e_add b i
+                    | f :: ofs ->
+                        let l, a, b = normalize obj ofs in f :: l, a, b
+                  in
+                  let p, a, b = normalize elt p in
+                  let in_array = valid_range RW (vobject m x) p (elt, a, b) in
+                  let initialized =
+                    if x.vformal || x.vglob then p_true
+                    else initialized_range sigma (vobject m x) x p a b
+                  in
+                  F.p_imply (F.p_leq a b) (p_and in_array initialized)
+              with ShiftMismatch ->
+                shift_mismatch l
         end
     | Rrange(l, _,a,b) ->
         Warning.error
@@ -1126,11 +1144,13 @@ struct
     | TInt _ | TFloat _ | TVoid _ | TEnum _ | TNamed _ | TBuiltin_va_list _
       -> F.p_true
     | TPtr _ | TFun _ -> phi v
-    | TComp({ cfields },_,_) ->
+    | TComp({ cfields = None },_,_) ->
+        F.p_true
+    | TComp({ cfields = Some fields },_,_) ->
         F.p_all
           (fun fd ->
              forall_pointers phi (e_getfield v (Cfield (fd, KValue))) fd.ftype)
-          cfields
+          fields
     | TArray(elt,_,_,_) ->
         let k = Lang.freshvar Qed.Logic.Int in
         F.p_forall [k] (forall_pointers phi (e_get v (e_var k)) elt)
@@ -1190,7 +1210,10 @@ struct
     match scope with
     | Leave -> []
     | Enter ->
-        let xs = List.filter (fun v -> not v.vformal && not v.vglob) xs in
+        let xs = List.filter
+            (fun v -> is_mvar_alloc v && not v.vformal &&
+                      not v.vglob && not v.vdefined) xs
+        in
         let uninitialized v =
           let value = Cvalues.uninitialized_obj (Ctypes.object_of v.vtype) in
           Lang.F.p_equal (access_init (get_init_term seq.post v) []) value
@@ -1237,7 +1260,9 @@ struct
                  let bg = e_getfield b cg in
                  let eqg = p_forall ys (p_equal ag bg) in
                  eqg :: hs
-            ) hs f.fcomp.cfields
+            ) hs
+            (* Note: we have field accesses, everything here is thus complete *)
+            (Option.get f.fcomp.cfields)
 
       | Shift(_,e) :: ofs ->
           let y = Lang.freshvar ~basename:"k" Qed.Logic.Int in
@@ -1308,13 +1333,17 @@ struct
           let hyp = Vset.in_range (e_var v) low up in
           let in_range = monotonic_initialized seq obj x ofs in
           Lang.F.p_forall [v] (p_imply hyp in_range)
-      | C_comp ci ->
+      | C_comp { cfields = None } ->
+          p_imply
+            (initialized_loc seq.pre obj x ofs)
+            (initialized_loc seq.post obj x ofs)
+      | C_comp { cfields = Some fields } ->
           let mk_pred f =
             let obj = Ctypes.object_of f.ftype in
             let ofs = ofs @ [Field f] in
             monotonic_initialized seq obj x ofs
           in
-          Lang.F.p_conj (List.map mk_pred ci.cfields)
+          Lang.F.p_conj (List.map mk_pred fields)
 
   let memvar_assigned seq obj loc v =
     match loc with
diff --git a/src/plugins/wp/MemZeroAlias.ml b/src/plugins/wp/MemZeroAlias.ml
index 3e185883a6dc47ecbf239c9a312ab8b8bbc1efcf..ebfae47bf09c5fddcd2f80bb06b6adc478061602 100644
--- a/src/plugins/wp/MemZeroAlias.ml
+++ b/src/plugins/wp/MemZeroAlias.ml
@@ -36,7 +36,7 @@ let datatype = "MemZeroAlias"
 
 let configure () =
   begin
-    let orig_pointer = Context.push Lang.pointer (fun _typ -> Logic.Int) in
+    let orig_pointer = Context.push Lang.pointer Logic.Int in
     let orig_null    = Context.push Cvalues.null (p_equal e_zero) in
     let rollback () =
       Context.pop Lang.pointer orig_pointer ;
diff --git a/src/plugins/wp/MemoryContext.ml b/src/plugins/wp/MemoryContext.ml
index b3012f74718fa77cdc0ff4d8e6c73e9ec2b5f40e..b9074b52fab472f4d6611bd53490b8a1f4bc573a 100644
--- a/src/plugins/wp/MemoryContext.ml
+++ b/src/plugins/wp/MemoryContext.ml
@@ -50,6 +50,7 @@ type partition = {
   globals : zone list ; (* [ &G , G[...], ... ] *)
   to_heap : zone list ; (* [ p, ... ] *)
   context : zone list ; (* [ p+(..), ... ] *)
+  by_addr : zone list ; (* [ &(x + ..), ... ] *)
 }
 
 (* -------------------------------------------------------------------------- *)
@@ -60,12 +61,13 @@ let empty = {
   globals = [] ;
   context = [] ;
   to_heap = [] ;
+  by_addr = [] ;
 }
 
 let set x p w =
   match p with
   | NotUsed -> w
-  | ByAddr -> w
+  | ByAddr -> { w with by_addr = Var x :: w.by_addr }
   | ByRef | InContext ->
       if Cil.isFunctionType x.vtype then w else
         { w with context = Ptr x :: w.context }
@@ -85,12 +87,11 @@ let set x p w =
       else w
 
 (* -------------------------------------------------------------------------- *)
-(* ANNOTS                                                                     *)
+(* --- Building Annotations                                               --- *)
 (* -------------------------------------------------------------------------- *)
 
 open Logic_const
 
-
 let rec ptr_of = function
   | Ctype t -> Ctype (TPtr(t, []))
   | t when Logic_typing.is_set_type t ->
@@ -186,20 +187,19 @@ 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 simplify ps =
+  List.sort_uniq Logic_utils.compare_predicate
+    (List.filter (fun p -> not(Logic_utils.is_trivially_true p)) ps)
 
-let context_zones partition =
-  List.map (fun z -> [z]) partition.context
+let ptrset { term_type = t } =
+  let open Logic_typing in
+  is_pointer_type t || (is_set_type t && is_pointer_type (type_of_element t))
 
-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
+(* -------------------------------------------------------------------------- *)
+(* --- Partition Helpers                                                  --- *)
+(* -------------------------------------------------------------------------- *)
 
-(* Note that this function does not return separated zone lists, but well-typed
-   zone lists.
-*)
-let heaps partition =
+let welltyped zones =
   let rec partition_by_type t acc l =
     match l, acc with
     | [], _ ->
@@ -211,8 +211,24 @@ let heaps partition =
     | x :: l, acc ->
         partition_by_type (type_of_zone x) ([x] :: acc) l
   in
-  partition_by_type Cil.voidType [] (heap_zones partition)
+  let compare_zone a b =
+    Cil_datatype.Typ.compare (type_of_zone a) (type_of_zone b) in
+  partition_by_type Cil.voidType [] (List.sort compare_zone zones)
+
+let global_zones partition =
+  List.map (fun z -> [z]) partition.globals
+
+let context_zones partition =
+  List.map (fun z -> [z]) partition.context
 
+let heaps partition = welltyped partition.to_heap
+let addr_of_vars partition = welltyped partition.by_addr
+
+(* -------------------------------------------------------------------------- *)
+(* --- Computing Separation                                               --- *)
+(* -------------------------------------------------------------------------- *)
+
+(* Memory regions shall be separated with each others *)
 let main_separation loc globals context heaps =
   match heaps, context with
   | [], [] ->
@@ -228,21 +244,18 @@ let main_separation loc globals context heaps =
       in
       List.map for_typed_heap heaps
 
+(* Filter assigns *)
 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
+  let add_assign _emitter assigns l = match assigns with
+    | WritesAny -> l
     | Writes froms -> List.fold_left add_from l froms
   in
-  Annotations.fold_assigns (add_assign kf) kf Cil.default_behavior_name []
+  Annotations.fold_assigns add_assign kf Cil.default_behavior_name []
 
+(* Locations assigned by pointer from a call *)
 let assigned_via_pointers kf =
   let rec assigned_via_pointer t =
     match t.term_node with
@@ -260,24 +273,94 @@ let assigned_via_pointers kf =
   in
   assigned_locations kf assigned_via_pointer
 
+(* Checks whether a term refers to Post *)
+let post_term t =
+  let exception Post_value in
+  let v = object
+    inherit Cil.nopCilVisitor
+    method! vlogic_label = function
+      | BuiltinLabel Post -> raise Post_value
+      | _ -> Cil.SkipChildren
+    method! vterm_lval = function
+      | TResult _, _ -> raise Post_value
+      | _ -> Cil.DoChildren
+  end in
+  try ignore (Cil.visitCilTerm v t) ; false
+  with Post_value -> true
+
+(* Computes conditions from call assigns *)
+let assigned_separation kf loc globals =
+  let addr_of t = addr_of_lval ~loc t.it_content in
+  let asgnd_ptrs = List.map addr_of (assigned_via_pointers kf) in
+  let folder (req, ens) t =
+    let sep = term_separated_from_regions loc t globals in
+    if post_term t then (req, sep :: ens) else (sep :: req, ens)
+  in
+  List.fold_left folder ([],[]) asgnd_ptrs
+
+(* Computes conditions from partition *)
 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)
+  let main_sep = main_separation loc globals (context_zones p) (heaps p) in
+  let assigns_sep_req, assigns_sep_ens = assigned_separation kf loc globals in
+  let context_validity = List.map (valid_region loc) (context_zones p) in
+  let reqs = main_sep @ assigns_sep_req @ context_validity in
+  let reqs = simplify reqs in
+  let ens = simplify assigns_sep_ens in
+  reqs, ens
+
+(* Computes conditions from return *)
+let out_pointers_separation kf loc p =
+  let ret_t = Kernel_function.get_return_type kf in
+  let addr_of t = addr_of_lval ~loc t.it_content in
+  let asgnd_ptrs =
+    Extlib.filter_map
+      (* Search assigned pointers via a pointer,
+         e.g. 'assigns *p ;' with '*p' of type pointer or set of pointers *)
+      (fun t -> ptrset t.it_content) addr_of (assigned_via_pointers kf)
+  in
+  let asgnd_ptrs =
+    if Cil.isPointerType ret_t then tresult ~loc ret_t :: asgnd_ptrs
+    else asgnd_ptrs
   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)
+  let formals_separation =
+    let formal_zone = function Var v -> v.vformal | _ -> false in
+    let formal_partition =
+      { p with by_addr = List.filter formal_zone p.by_addr }
+    in
+    let formals = addr_of_vars formal_partition in
+    List.map (fun t -> term_separated_from_regions loc t formals) asgnd_ptrs
   in
-  let context_validity =
-    List.map (valid_region loc) (context_zones p)
+  let globals_separation =
+    let globals = global_zones p in
+    List.map (fun t -> term_separated_from_regions loc t globals) asgnd_ptrs
   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
+  simplify (formals_separation @ globals_separation)
+
+(* Computes all conditions from behavior *)
+let compute_behavior kf name hypotheses_computer =
+  let partition = hypotheses_computer kf in
+  let loc = Kernel_function.get_location kf in
+  let reqs, ens = clauses_of_partition kf loc partition in
+  let ens = out_pointers_separation kf loc partition @ ens in
+  let reqs = List.map new_predicate reqs in
+  let ens = List.map (fun p -> Normal, new_predicate p) ens in
+  match reqs, ens with
+  | [], [] -> None
+  | reqs, ens ->
+      Some {
+        b_name = Annotations.fresh_behavior_name kf ("wp_" ^  name) ;
+        b_requires = reqs ;
+        b_assumes = [] ;
+        b_post_cond = ens ;
+        b_assigns = WritesAny ;
+        b_allocation = FreeAllocAny ;
+        b_extended = []
+      }
+
+(* -------------------------------------------------------------------------- *)
+(* --- Memoization                                                        --- *)
+(* -------------------------------------------------------------------------- *)
 
 module Table =
   State_builder.Hashtbl
@@ -289,35 +372,61 @@ module Table =
       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 = []
-      }
+module RegisteredHypotheses =
+  State_builder.Set_ref
+    (Cil_datatype.Kf.Set)
+    (struct
+      let name = "Wp.MemoryContext.RegisteredHypotheses"
+      let dependencies = [Ast.self]
+    end)
 
 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
+  Table.memo
+    begin fun kf ->
+      AssignsCompleteness.warn kf ;
+      compute_behavior kf name hypotheses_computer
+    end
+    kf
+
+(* -------------------------------------------------------------------------- *)
+(* --- External API                                                       --- *)
+(* -------------------------------------------------------------------------- *)
+
+let 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>/*@@@ %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 warn kf name hyp_computer =
+  match get_behavior kf name hyp_computer with
+  | None -> ()
+  | Some bhv ->
+      Wp_parameters.warning
+        ~current:false ~once:true ~source:(fst(Kernel_function.get_location kf))
+        "@[<hv 0>Memory model hypotheses for function '%s':@ %t@]"
+        (Kernel_function.get_name kf)
+        (print_memory_context kf bhv)
 
 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]
+  if RegisteredHypotheses.mem kf then ()
+  else begin
+    begin match get_behavior kf name hypotheses_computer with
+      | None -> ()
+      | Some bhv -> Annotations.add_behaviors emitter kf [bhv]
+    end ;
+    RegisteredHypotheses.add kf
+  end
+
+(* -------------------------------------------------------------------------- *)
diff --git a/src/plugins/wp/MemoryContext.mli b/src/plugins/wp/MemoryContext.mli
index 736617995ed81cf7f7ad010849e1349f9c689712..95cb1638ff8af641e39d534643fb16147dea8a44 100644
--- a/src/plugins/wp/MemoryContext.mli
+++ b/src/plugins/wp/MemoryContext.mli
@@ -35,5 +35,5 @@ val compute: string -> (kernel_function -> partition) -> unit
 
 val add_behavior:
   kernel_function -> string -> (kernel_function -> partition) -> unit
-val get_behavior:
-  kernel_function -> string -> (kernel_function -> partition) -> behavior option
+val warn:
+  kernel_function -> string -> (kernel_function -> partition) -> unit
diff --git a/src/plugins/wp/ProverCoq.ml b/src/plugins/wp/ProverCoq.ml
index 5bb7d9235d54809d171a0a58262fd7475b696f5b..ea01cad796b581823abea594d9406963515fdf0d 100644
--- a/src/plugins/wp/ProverCoq.ml
+++ b/src/plugins/wp/ProverCoq.ml
@@ -176,17 +176,22 @@ class visitor fmt c =
         engine#declare_type fmt (Lang.adt lt) (List.length lt.lt_params) def ;
       end
 
-    method on_comp c fts =
+    method private gen_on_comp kind c fts =
       begin
         self#paragraph ;
-        engine#declare_type fmt (Lang.comp c) 0 (Qed.Engine.Trec fts) ;
+        let adt = match kind with
+          | KValue -> Lang.comp c
+          | KInit -> Lang.comp_init c
+        in
+        let t = match fts with
+          | None -> Qed.Engine.Tabs
+          | Some fts -> Qed.Engine.Trec fts
+        in
+        engine#declare_type fmt adt 0 t ;
       end
 
-    method on_icomp c fts =
-      begin
-        self#paragraph ;
-        engine#declare_type fmt (Lang.comp_init c) 0 (Qed.Engine.Trec fts) ;
-      end
+    method on_comp = self#gen_on_comp KValue
+    method on_icomp = self#gen_on_comp KInit
 
     method on_dlemma l =
       begin
diff --git a/src/plugins/wp/ProverErgo.ml b/src/plugins/wp/ProverErgo.ml
index 4813da2e3cdb2221134864612885fa9e8be06a54..b5a32ca5d3a7f756d2d6db4f6d9a4702f80d67d2 100644
--- a/src/plugins/wp/ProverErgo.ml
+++ b/src/plugins/wp/ProverErgo.ml
@@ -181,17 +181,22 @@ class visitor fmt c =
         engine#declare_type fmt (Lang.adt lt) (List.length lt.lt_params) def ;
       end
 
-    method on_comp c fts =
+    method private gen_on_comp kind c fts =
       begin
         self#lines ;
-        engine#declare_type fmt (Lang.comp c) 0 (Qed.Engine.Trec fts) ;
+        let adt = match kind with
+          | KValue -> Lang.comp c
+          | KInit -> Lang.comp_init c
+        in
+        let t = match fts with
+          | None -> Qed.Engine.Tabs
+          | Some fts -> Qed.Engine.Trec fts
+        in
+        engine#declare_type fmt adt 0 t ;
       end
 
-    method on_icomp c fts =
-      begin
-        self#lines ;
-        engine#declare_type fmt (Lang.comp_init c) 0 (Qed.Engine.Trec fts) ;
-      end
+    method on_comp = self#gen_on_comp KValue
+    method on_icomp = self#gen_on_comp KInit
 
     method on_dlemma l =
       begin
diff --git a/src/plugins/wp/ProverScript.ml b/src/plugins/wp/ProverScript.ml
index 06edf050db3ce0ce5336420e15c4eed6971fce93..e5fb8cc0b8fece4ef3cc087cbee71d13e94d0e1d 100644
--- a/src/plugins/wp/ProverScript.ml
+++ b/src/plugins/wp/ProverScript.ml
@@ -312,6 +312,21 @@ and autofork env ~depth fork =
   else
     ( Env.validate env ; Task.return true )
 
+(* -------------------------------------------------------------------------- *)
+(* --- Apply Script Tactic                                                --- *)
+(* -------------------------------------------------------------------------- *)
+
+let apply env node jtactic subscripts =
+  match jfork (Env.tree env) ?node jtactic with
+  | None -> failwith "Selector not found"
+  | Some fork ->
+      let _,children = ProofEngine.commit fork in
+      reconcile children subscripts ; (*TODO: saveback forgiven script ? *)
+      let ok = List.for_all
+          (fun (_,node) -> ProofEngine.proved node)
+          children in
+      if ok then [] else children
+
 (* -------------------------------------------------------------------------- *)
 (* --- Script Crawling                                                    --- *)
 (* -------------------------------------------------------------------------- *)
@@ -348,30 +363,26 @@ let rec crawl env on_child node = function
 
   | Tactic( _ , jtactic , subscripts ) :: alternative ->
       begin
-        match jfork (Env.tree env) ?node jtactic with
-        | None ->
-            Wp_parameters.warning
-              "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 ;
-            crawl env on_child node alternative
-        | Some fork ->
-            (*TODO: saveback forgiven script *)
-            let _,children = ProofEngine.commit fork in
-            reconcile children subscripts ;
-            let residual = List.filter
-                (fun (_,node) -> not (ProofEngine.proved node))
-                children in
-            if residual = [] then
-              Env.validate env
-            else
-              List.iter (fun (_,n) -> on_child n) children ;
-            Task.return ()
+        try
+          let residual = apply env node jtactic subscripts in
+          if residual = [] then
+            Env.validate env
+          else
+            List.iter (fun (_,n) -> on_child n) residual ;
+          Task.return ()
+        with exn when Wp_parameters.protect exn ->
+          Wp_parameters.warning
+            "Script Error: on goal %a@\n\
+             can not apply '%s'@\n\
+             exception %S@\n\
+             @[<hov 2>Params: %a@]@\n\
+             @[<hov 2>Select: %a@]@."
+            WpPropId.pretty (Env.goal env node).po_pid
+            jtactic.tactic
+            (Printexc.to_string exn)
+            Json.pp jtactic.params
+            Json.pp jtactic.select ;
+          crawl env on_child node alternative
       end
 
 (* -------------------------------------------------------------------------- *)
diff --git a/src/plugins/wp/ProverSearch.ml b/src/plugins/wp/ProverSearch.ml
index 0425a46e766851c56686890a6ede10ad8f6c9eeb..85abe2d171a6276f6f6ab54d16b4d430fd557b75 100644
--- a/src/plugins/wp/ProverSearch.ml
+++ b/src/plugins/wp/ProverSearch.ml
@@ -89,8 +89,10 @@ let search tree ?anchor ?sequent heuristics =
   let anchor = ProofEngine.anchor tree ?node:anchor () in
   let sequent =
     match sequent with
-    | Some s -> s | None -> snd (Wpo.compute (ProofEngine.goal anchor)) in
+    | Some s -> s
+    | None -> snd (Wpo.compute (ProofEngine.goal anchor)) in
   let lookup h = try h#search pool#add sequent with Not_found -> () in
+  Conditions.index sequent ;
   WpContext.on_context
     (ProofEngine.node_context anchor)
     (List.iter lookup) heuristics ;
diff --git a/src/plugins/wp/ProverWhy3.ml b/src/plugins/wp/ProverWhy3.ml
index 0b298b1af9e4e5dd69999dbf664b32752554d451..54e5d9d0cbf24f3a2768a07a0f1a8a0dccca85a8 100644
--- a/src/plugins/wp/ProverWhy3.ml
+++ b/src/plugins/wp/ProverWhy3.ml
@@ -284,7 +284,7 @@ struct
       let neg = Q.sign q < 0 in
       let int,frac,exp = (group 1 s), (group 2 s), (group 3 s) in
       let exp = if String.equal exp "" then None else Some exp in
-      let ty = Extlib.the (of_tau ~cnv tau) in
+      let ty = Option.get (of_tau ~cnv tau) in
       why3_real ty ~radix:16 ~neg ~int ~frac ?exp ()
     else raise Not_found
 
@@ -895,7 +895,7 @@ class visitor (ctx:context) c =
           let decl = Why3.Decl.create_data_decl [tys,[cstr,fields]] in
           ctx.th <- Why3.Theory.add_decl ~warn:false ctx.th decl;
 
-    method private on_comp_gen kind c (fts:(Lang.field * Lang.tau) list) =
+    method private on_comp_gen kind c fts =
       begin
         let make_id = match kind with
           | Lang.KValue -> Lang.comp_id
@@ -905,7 +905,7 @@ class visitor (ctx:context) c =
           let cmp = Lang.Field.compare f g in
           if cmp = 0 then assert false (* by definition *) else cmp
         in
-        let fts = List.sort compare_field fts in
+        let fts = Option.map (List.sort compare_field) fts in
         (*TODO:NUPW: manage UNIONS *)
         let id = Why3.Ident.id_fresh (make_id c) in
         let ts = Why3.Ty.create_tysymbol id [] Why3.Ty.NoDef in
@@ -918,9 +918,15 @@ class visitor (ctx:context) c =
           let ls = Why3.Term.create_lsymbol id [ty] ty_ctr in
           (Some ls,Why3.Opt.get ty_ctr)
         in
-        let fields = List.map map fts in
-        let constr = Why3.Term.create_fsymbol ~constr:1 id (List.map snd fields) ty in
-        let decl = Why3.Decl.create_data_decl [ts,[constr,List.map fst fields]] in
+        let fields = Option.map (List.map map) fts in
+        let decl = match fields with
+          | None -> Why3.Decl.create_ty_decl ts
+          | Some fields ->
+              let constr =
+                Why3.Term.create_fsymbol ~constr:1 id (List.map snd fields) ty
+              in
+              Why3.Decl.create_data_decl [ts,[constr,List.map fst fields]]
+        in
         ctx.th <- Why3.Theory.add_decl ~warn:false ctx.th decl;
       end
 
diff --git a/src/plugins/wp/RefUsage.ml b/src/plugins/wp/RefUsage.ml
index df5426a001849e0295a5b148dd9bf4b25e12069a..148ae72e4c442d96257c5070502388736a41b368 100644
--- a/src/plugins/wp/RefUsage.ml
+++ b/src/plugins/wp/RefUsage.ml
@@ -673,6 +673,7 @@ let cfun_spec env kf =
     method !vpredicate p = update_spec_env (pred env p)
     method !vterm t = update_spec_env (vterm env t)
   end in
+  AssignsCompleteness.compute kf ;
   let spec = Annotations.funspec kf in
   ignore (Cil.visitCilFunspec (visitor:>Cil.cilVisitor) spec) ;
   (* Partitioning the accesses of the spec for formals vs globals *)
@@ -683,7 +684,7 @@ let cfun_spec env kf =
 let cfun kf =
   let env = mk_ctx () in
   (* Skipping frama-c builtins?
-     if not (Cil.is_builtin (Kernel_function.get_vi kf)) then *)
+     if not (Cil_builtins.is_builtin (Kernel_function.get_vi kf)) then *)
   begin
     if Kernel_function.is_definition kf then cfun_code env kf ;
     cfun_spec env kf
@@ -866,7 +867,7 @@ let dump () =
       in Format.fprintf fmt "@[<hv 0>Init:@ %a@]@." E.pretty a_init ;
       KFmap.iter (fun kf m ->
           (* Do not dump results for frama-c builtins *)
-          if not (Cil.is_builtin (Kernel_function.get_vi kf)) then
+          if not (Cil_builtins.is_builtin (Kernel_function.get_vi kf)) then
             Format.fprintf fmt "@[<hv 0>Function %a:@ %a@]@."
               Kernel_function.pretty kf E.pretty m ;
         ) a_usage;
diff --git a/src/plugins/wp/RegionAnnot.ml b/src/plugins/wp/RegionAnnot.ml
index fa27dd5e6da55d31ed1be0bb92353b302a2da548..6f602b86bc7b16886cd1dffe243d77e3acfd54ce 100644
--- a/src/plugins/wp/RegionAnnot.ml
+++ b/src/plugins/wp/RegionAnnot.ml
@@ -212,7 +212,7 @@ let pp_region_spec pp fmt coma spec =
   begin
     if coma then Format.fprintf fmt ",@ " ;
     Format.fprintf fmt "@[<hv 2>" ;
-    Extlib.may (Format.fprintf fmt "%s:@ ") spec.region_name ;
+    Option.iter (Format.fprintf fmt "%s:@ ") spec.region_name ;
     let coma = pp_pattern_spec fmt spec.region_pattern in
     let coma = List.fold_left (pp_path_spec pp fmt) coma spec.region_lpath in
     Format.fprintf fmt "@]" ;
@@ -238,7 +238,7 @@ let flush env =
   let region_name = env.name in env.name <- None ;
   let region_pattern = env.pattern in env.pattern <- FREE ;
   let region_lpath = List.rev env.paths in env.paths <- [] ;
-  Extlib.may (fun a -> env.declared <- a::env.declared) region_name ;
+  Option.iter (fun a -> env.declared <- a::env.declared) region_name ;
   if not (region_name = None && region_lpath = []) then
     let region = { region_name ; region_pattern ; region_lpath } in
     env.specs <- region :: env.specs
@@ -270,7 +270,7 @@ let parse_varinfo env ~loc x =
     error env ~loc "Unknown variable (or region) '%s'" x
 
 let parse_fieldinfo env ~loc comp f =
-  try List.find (fun fd -> fd.fname = f) comp.cfields
+  try List.find (fun fd -> fd.fname = f) (Option.value ~default:[] comp.cfields)
   with Not_found ->
     error env ~loc "No field '%s' in compound type '%s'" f comp.cname
 
@@ -382,17 +382,26 @@ let rec parse_lpath env e =
       let comp =
         if Compinfo.equal fa.fcomp fb.fcomp then fa.fcomp
         else error env ~loc "Range of fields from incompatible types" in
-      let fields = field_range ~inside:false fa fb comp.cfields in
+      let fields =
+        field_range ~inside:false fa fb
+          (Option.value ~default:[] comp.cfields)
+      in
       let ltype = typeof_fields fields in
       { loc ; lnode = L_field(p,fields) ; ltype }
   | PLrange( Some a , None ) ->
       let p,fd = parse_fpath env a in
-      let fields = field_range ~inside:false fd fd fd.fcomp.cfields in
+      let fields =
+        field_range ~inside:false fd fd
+          (Option.value ~default:[] fd.fcomp.cfields)
+      in
       let ltype = typeof_fields fields in
       { loc ; lnode = L_field(p,fields) ; ltype }
   | PLrange( None , Some a ) ->
       let p,fd = parse_fpath env a in
-      let fields = field_range ~inside:true fd fd fd.fcomp.cfields in
+      let fields =
+        field_range ~inside:true fd fd
+          (Option.value ~default:[] fd.fcomp.cfields)
+      in
       let ltype = typeof_fields fields in
       { loc ; lnode = L_field(p,fields) ; ltype }
   | _ ->
diff --git a/src/plugins/wp/RegionDump.ml b/src/plugins/wp/RegionDump.ml
index 0a476427ebd5dbb79d3f42eded70068ffe7fb203..8537b8dd21e7362d6000e0fdc22946ca6c0235ee 100644
--- a/src/plugins/wp/RegionDump.ml
+++ b/src/plugins/wp/RegionDump.ml
@@ -159,7 +159,7 @@ let dotregion dot map region node =
            G.link dot [node;delta;R.get target] [`Dotted]
         ) region ;
     if Wp.has_dkey offset_key then
-      Extlib.may
+      Option.iter
         (fun target ->
            let label = if Region.is_shifted target then "[..]" else "*" in
            let deref = G.inode dot (`Label label :: attr_offset) in
@@ -229,7 +229,7 @@ let dotregion dot map region node =
       (fun target ->
          G.edge dot node (R.get target) [`Color "green"]
       ) region ;
-    Extlib.may
+    Option.iter
       (fun target ->
          G.edge dot node (R.get target) [`Color "red"]
       ) (Region.get_merged map region) ;
diff --git a/src/plugins/wp/Sigs.ml b/src/plugins/wp/Sigs.ml
index e5c252e0076a78c4833cb29d0d7ed58bdbd14a0b..5474a05068ca7c5e1a429631d7654620c7976746 100644
--- a/src/plugins/wp/Sigs.ml
+++ b/src/plugins/wp/Sigs.ml
@@ -587,7 +587,7 @@ sig
      Express that all objects in a range of locations have a given value.
 
      More precisely, [is_exp_range sigma loc ty a b v] express that
-     value at [( ty* )loc + k] equals [v], forall [a <= k < b].
+     value at [( ty* )loc + k] equals [v], forall [a <= k <= b].
      Value [v=None] stands for zero.
   *)
   val is_exp_range :
@@ -598,17 +598,25 @@ sig
   val unchanged : M.sigma -> M.sigma -> varinfo -> pred
   (** Express that a given variable has the same value in two memory states. *)
 
-  type warned_hyp = Warning.Set.t * pred
+  type warned_hyp = Warning.Set.t * (pred * pred)
 
-  val init : sigma:M.sigma -> varinfo -> init option -> warned_hyp list
-  (** Express that some variable has some initial value at the
-      given memory state.
+  val init :
+    sigma:M.sigma -> varinfo -> init option -> warned_hyp list
+    (** Express that some variable has some initial value at the
+        given memory state. The first predicate states the value,
+        the second, the initialization status.
 
-      Remark: [None] initializer are interpreted as zeroes. This is consistent
-      with the [init option] associated with global variables in CIL,
-      for which the default initializer are zeroes. There is no
-      [init option] value associated with local initializers.
-  *)
+        Note: we DO NOT merge values and initialization status
+        hypotheses as the factorization performed by Qed can make
+        predicates too hard to simplify later.
+
+        Remark: [None] initializer are interpreted as zeroes. This is consistent
+        with the [init option] associated with global variables in CIL,
+        for which the default initializer are zeroes. This function is called
+        for global initializers and local initializers ([Cil.Local_init]).
+        It is not called for local variables without initializers as they do not
+        have a [Cil.init option].
+    *)
 
 end
 
@@ -765,22 +773,21 @@ sig
   val pred : polarity -> env -> Cil_types.predicate -> pred
 
   (** Compile a term representing a set of memory locations into an abstract
-      region. When [~unfold:true], compound memory locations are expanded
-      field-by-field. *)
-  val region : env -> unfold:bool -> Cil_types.term -> region
+      region.  *)
+  val region : env -> Cil_types.term -> region
 
   (** Computes the region assigned by a list of froms. *)
   val assigned_of_lval :
-    env -> unfold:bool -> Cil_types.lval -> region
+    env -> Cil_types.lval -> region
 
   (** Computes the region assigned by a list of froms. *)
   val assigned_of_froms :
-    env -> unfold:bool -> from list -> region
+    env -> from list -> region
 
   (** Computes the region assigned by an assigns clause.
       [None] means everyhting is assigned. *)
   val assigned_of_assigns :
-    env -> unfold:bool -> assigns -> region option
+    env -> assigns -> region option
 
   (** Same as [term] above but reject any set of locations. *)
   val val_of_term : env -> Cil_types.term -> term
@@ -802,9 +809,12 @@ sig
 
   (** Check assigns inclusion.
       Compute a formula that checks whether written locations are either
-      invalid (at the given memory location)
-      or included in some assignable region. *)
-  val check_assigns : sigma -> written:region -> assignable:region -> pred
+      invalid (at the given memory location) or included in some assignable
+      region. When [~unfold:n && n <> 0], compound memory locations are expanded
+      field-by-field and arrays, cell-by-cell (by quantification). Up to [n]
+      levels are unfolded, -1 means unlimited. *)
+  val check_assigns :
+    unfold:int -> sigma -> written:region -> assignable:region -> pred
 
 end
 
diff --git a/src/plugins/wp/StmtSemantics.ml b/src/plugins/wp/StmtSemantics.ml
index 28aaa51e928def28bc856f4e00b73a7a3beb52c5..f5236949e0ae9c9826c14289b87253d90caf0a88 100644
--- a/src/plugins/wp/StmtSemantics.ml
+++ b/src/plugins/wp/StmtSemantics.ml
@@ -416,7 +416,10 @@ struct
         let here = Sigma.create () in
         let next = Sigma.create () in
         (*TODO: make something of warnings *)
-        let hyp = Lang.F.p_all snd (C.init ~sigma:next vi (Some init)) in
+        let init = C.init ~sigma:next vi (Some init) in
+        let hyp_value = Lang.F.p_all (fun (_, h) -> fst h) init in
+        let hyp_init =  Lang.F.p_all (fun (_, h) -> snd h) init in
+        let hyp = Lang.F.p_and hyp_init hyp_value in
         effect (env @: Clabels.here) (Cfg.E.create {pre=here; post=next} hyp) (env @: Clabels.next)
     | Skip _ | Code_annot _ -> goto (env @: Clabels.here) (env @: Clabels.next)
 
@@ -476,7 +479,7 @@ struct
     let lenv = L.mk_env () in (* TODO: lenv for ghost code. *)
     let here = Sigma.create () in
     let authorized_region = L.in_frame frame
-        (L.assigned_of_assigns ~unfold:false lenv) a in
+        (L.assigned_of_assigns lenv) a in
     match authorized_region with
     | None -> goto (env @: Clabels.here) (env @: Clabels.next)
     | Some region ->
@@ -669,7 +672,10 @@ struct
     let cfg_init = Globals.Vars.fold_in_file_order
         (fun var initinfo cfg ->
            if var.vstorage = Extern then cfg else
-             let h = Lang.F.p_all snd (C.init ~sigma:sinit var initinfo.init) in
+             let init = C.init ~sigma:sinit var initinfo.init in
+             let hvalue = Lang.F.p_all (fun (_, h) -> fst h) init in
+             let hinit =  Lang.F.p_all (fun (_, h) -> snd h) init in
+             let h = Lang.F.p_and hvalue hinit in
              let h = Cfg.P.create
                  (Cfg.Node.Map.add ninit sinit Cfg.Node.Map.empty)
                  h
diff --git a/src/plugins/wp/TacBittest.ml b/src/plugins/wp/TacBittest.ml
new file mode 100644
index 0000000000000000000000000000000000000000..86fb2f6272389d68f94cb0d90fff0e2d82c18248
--- /dev/null
+++ b/src/plugins/wp/TacBittest.ml
@@ -0,0 +1,122 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  This file is part of WP plug-in of Frama-C.                           *)
+(*                                                                        *)
+(*  Copyright (C) 2007-2020                                               *)
+(*    CEA (Commissariat a l'energie atomique et aux energies              *)
+(*         alternatives)                                                  *)
+(*                                                                        *)
+(*  you can redistribute it and/or modify it under the terms of the GNU   *)
+(*  Lesser General Public License as published by the Free Software       *)
+(*  Foundation, version 2.1.                                              *)
+(*                                                                        *)
+(*  It is distributed in the hope that it will be useful,                 *)
+(*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *)
+(*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *)
+(*  GNU Lesser General Public License for more details.                   *)
+(*                                                                        *)
+(*  See the GNU Lesser General Public License version 2.1                 *)
+(*  for more details (enclosed in the file licenses/LGPLv2.1).            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open Lang
+
+(* -------------------------------------------------------------------------- *)
+(* --- Helpers                                                            --- *)
+(* -------------------------------------------------------------------------- *)
+
+let positive e = F.p_leq F.e_zero e (* 0 <= n *)
+let power k = F.e_bigint (Integer.two_power_of_int k)
+
+let lookup_int e =
+  let open Qed.Logic in
+  match F.repr e with
+  | Kint z -> (try Some (Integer.to_int z) with Z.Overflow -> None)
+  | _ -> None
+
+let rec lookup_bittest e =
+  match F.repr e with
+  | Not e -> lookup_bittest e
+  | Fun(f,[n;ek]) when List.memq f Cint.f_bits ->
+      begin
+        match lookup_int ek with
+        | Some k when 0 <= k && k < 128 -> Some (n,k)
+        | _ -> None
+      end
+  | _ -> None
+
+(* -------------------------------------------------------------------------- *)
+(* --- Bit-Test Range                                                     --- *)
+(* -------------------------------------------------------------------------- *)
+
+class bittestrange =
+  object
+    inherit Tactical.make
+        ~id:"Wp.bittestrange"
+        ~title:"Bit-Test Range"
+        ~descr:"Tighten Bounds with respect to bits"
+        ~params:[]
+
+    method select _feedback selection =
+      let e = Tactical.selected selection in
+      match lookup_bittest e with
+      | Some (n,k) ->
+          let bit = Cint.bit_test n k in
+          let bit_set = F.p_bool bit in
+          let bit_clear = F.p_not bit_set in
+          let pos = positive n in
+          let pk = power k in
+          let pk1 = power (succ k) in
+          let g_inf = F.p_hyps [pos] (F.p_leq pk n) in
+          let g_sup = F.p_hyps [pos;F.p_lt n pk1] (F.p_lt n pk) in
+          let name_inf = Printf.sprintf "Bit #%d (inf)" k in
+          let name_sup = Printf.sprintf "Bit #%d (sup)" k in
+          let at = Tactical.at selection in
+          Tactical.Applicable (Tactical.insert ?at [
+              name_inf , F.p_and bit_set g_inf ;
+              name_sup , F.p_and bit_clear g_sup ;
+            ])
+      | None -> Tactical.Not_applicable
+
+  end
+
+let tactical = Tactical.export (new bittestrange)
+let strategy = Strategy.make tactical ~arguments:[]
+
+(* -------------------------------------------------------------------------- *)
+(* --- Auto Bitrange                                                      --- *)
+(* -------------------------------------------------------------------------- *)
+
+let rec lookup push step e =
+  match F.repr e with
+  | And es -> List.iter (lookup push step) es
+  | Or es -> List.iter (lookup push step) es
+  | Imply (hs,p) -> List.iter (lookup push step) (p::hs)
+  | _ ->
+      begin
+        match lookup_bittest e with
+        | None -> ()
+        | Some _ ->
+            push @@ strategy ~priority:0.3 (Tactical.Inside(step,e))
+      end
+
+class autobittestrange : Strategy.heuristic =
+  object
+
+    method id = "wp:bittestrange"
+    method title = "Auto Bit-Test Range"
+    method descr = "Apply Bit-Test Range on bit-tests"
+
+    method search push (seq : Conditions.sequent) =
+      Conditions.iter
+        (fun step ->
+           let p = Conditions.head step |> F.e_prop in
+           lookup push (Tactical.Step step) p
+        ) (fst seq) ;
+      let p = snd seq in
+      lookup push (Tactical.Goal p) (F.e_prop p)
+
+  end
+
+let () = Strategy.register (new autobittestrange)
diff --git a/src/plugins/wp/TacBittest.mli b/src/plugins/wp/TacBittest.mli
new file mode 100644
index 0000000000000000000000000000000000000000..47296a7f6b69d6862eb300c60ba5bc83d8618f9a
--- /dev/null
+++ b/src/plugins/wp/TacBittest.mli
@@ -0,0 +1,31 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  This file is part of WP plug-in of Frama-C.                           *)
+(*                                                                        *)
+(*  Copyright (C) 2007-2020                                               *)
+(*    CEA (Commissariat a l'energie atomique et aux energies              *)
+(*         alternatives)                                                  *)
+(*                                                                        *)
+(*  you can redistribute it and/or modify it under the terms of the GNU   *)
+(*  Lesser General Public License as published by the Free Software       *)
+(*  Foundation, version 2.1.                                              *)
+(*                                                                        *)
+(*  It is distributed in the hope that it will be useful,                 *)
+(*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *)
+(*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *)
+(*  GNU Lesser General Public License for more details.                   *)
+(*                                                                        *)
+(*  See the GNU Lesser General Public License version 2.1                 *)
+(*  for more details (enclosed in the file licenses/LGPLv2.1).            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(** Built-in Bit-Test Range Tactical (auto-registered) *)
+
+open Tactical
+open Strategy
+
+val tactical : tactical
+val strategy : ?priority:float -> selection -> strategy
+
+(**************************************************************************)
diff --git a/src/plugins/wp/TacInduction.ml b/src/plugins/wp/TacInduction.ml
new file mode 100644
index 0000000000000000000000000000000000000000..630d6be6e535abfb3efd0624598165bb5c46d674
--- /dev/null
+++ b/src/plugins/wp/TacInduction.ml
@@ -0,0 +1,119 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  This file is part of WP plug-in of Frama-C.                           *)
+(*                                                                        *)
+(*  Copyright (C) 2007-2020                                               *)
+(*    CEA (Commissariat a l'energie atomique et aux energies              *)
+(*         alternatives)                                                  *)
+(*                                                                        *)
+(*  you can redistribute it and/or modify it under the terms of the GNU   *)
+(*  Lesser General Public License as published by the Free Software       *)
+(*  Foundation, version 2.1.                                              *)
+(*                                                                        *)
+(*  It is distributed in the hope that it will be useful,                 *)
+(*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *)
+(*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *)
+(*  GNU Lesser General Public License for more details.                   *)
+(*                                                                        *)
+(*  See the GNU Lesser General Public License version 2.1                 *)
+(*  for more details (enclosed in the file licenses/LGPLv2.1).            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open Lang
+
+type env = {
+  n : F.var ;
+  sigma : F.sigma ;
+  mutable hind : F.pred list ;
+}
+
+let rec strip env p =
+  match F.p_expr p with
+  | And ps -> F.p_all (strip env) ps
+  | _ ->
+      let p = F.p_subst env.sigma p in
+      if F.occursp env.n p then
+        ( env.hind <- p :: env.hind ; F.p_true )
+      else p
+
+let process value n0 seq =
+
+  (* Transfrom seq into: hyps => (forall n, goal) *)
+  let n = Lang.freshvar ~basename:"n" Qed.Logic.Int in
+  let i = Lang.freshvar ~basename:"i" Qed.Logic.Int in
+  let vn = F.e_var n in
+  let vi = F.e_var i in
+  let sigma = Lang.sigma () in
+  F.Subst.add sigma value vn ;
+  let env = { n ; sigma ; hind = [] } in
+  let hyps = Conditions.map_sequence (strip env) (fst seq) in
+  let goal_n = F.p_hyps env.hind @@ F.p_subst sigma (snd seq) in
+  let goal_i = F.p_subst_var n vi goal_n in
+
+  (* Base: n = n0 *)
+  let goal_base = F.p_imply (F.p_equal vn n0) goal_n in
+
+  (* Hind: n0 <= i < n *)
+  let goal_sup =
+    let hsup = [ F.p_leq n0 vi ; F.p_lt vi vn ] in
+    let hind = F.p_forall [i] (F.p_hyps hsup goal_i) in
+    F.p_hyps [F.p_lt n0 vn; hind] goal_n in
+
+  (* Hind: n < i <= n0 *)
+  let goal_inf =
+    let hinf = [ F.p_lt vn vi ; F.p_leq vi n0 ] in
+    let hind = F.p_forall [i] (F.p_hyps hinf goal_i) in
+    F.p_hyps [F.p_lt vn n0; hind] goal_n in
+
+  (* All Cases *)
+  List.map (fun (name,goal) -> name , (hyps,goal)) [
+    "Base" , goal_base ;
+    "Induction (sup)" , goal_sup ;
+    "Induction (inf)" , goal_inf ;
+  ]
+
+(* -------------------------------------------------------------------------- *)
+(* --- Induction Tactical                                                 --- *)
+(* -------------------------------------------------------------------------- *)
+
+let vbase,pbase = Tactical.composer ~id:"base"
+    ~title:"Base" ~descr:"Value of base case" ()
+
+class induction =
+  object(self)
+    inherit Tactical.make
+        ~id:"Wp.induction"
+        ~title:"Induction"
+        ~descr:"Proof by integer induction"
+        ~params:[pbase]
+
+    method private get_base () =
+      match self#get_field vbase with
+      | Tactical.Compose(Code(t, _, _))
+      | Inside(_, t) when Lang.F.typeof t = Lang.t_int ->
+          Some t
+      | Compose(Cint i) ->
+          Some (Lang.F.e_bigint i)
+      | _ ->
+          None
+
+    method select feedback (s : Tactical.selection) =
+      begin match self#get_field vbase with
+        | Empty ->
+            self#set_field vbase (Tactical.int 0) ;
+            feedback#update_field vbase
+        | _ -> ()
+      end ;
+      let value = Tactical.selected s in
+      if F.is_int value then
+        match self#get_base () with
+        | Some base -> Applicable(process value base)
+        | None -> Not_configured
+      else Not_applicable
+
+  end
+
+let tactical = Tactical.export (new induction)
+
+(* -------------------------------------------------------------------------- *)
diff --git a/src/plugins/wp/TacInduction.mli b/src/plugins/wp/TacInduction.mli
new file mode 100644
index 0000000000000000000000000000000000000000..21c817a0b338fb729bb658c15ecfe0cb907526b8
--- /dev/null
+++ b/src/plugins/wp/TacInduction.mli
@@ -0,0 +1,29 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  This file is part of WP plug-in of Frama-C.                           *)
+(*                                                                        *)
+(*  Copyright (C) 2007-2020                                               *)
+(*    CEA (Commissariat a l'energie atomique et aux energies              *)
+(*         alternatives)                                                  *)
+(*                                                                        *)
+(*  you can redistribute it and/or modify it under the terms of the GNU   *)
+(*  Lesser General Public License as published by the Free Software       *)
+(*  Foundation, version 2.1.                                              *)
+(*                                                                        *)
+(*  It is distributed in the hope that it will be useful,                 *)
+(*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *)
+(*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *)
+(*  GNU Lesser General Public License for more details.                   *)
+(*                                                                        *)
+(*  See the GNU Lesser General Public License version 2.1                 *)
+(*  for more details (enclosed in the file licenses/LGPLv2.1).            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(** Built-in Range Tactical (auto-registered) *)
+
+open Tactical
+
+val tactical : tactical
+
+(**************************************************************************)
diff --git a/src/plugins/wp/TacSequence.ml b/src/plugins/wp/TacSequence.ml
new file mode 100644
index 0000000000000000000000000000000000000000..1c711e93757918c7897d361407ad1bdf52c92162
--- /dev/null
+++ b/src/plugins/wp/TacSequence.ml
@@ -0,0 +1,92 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  This file is part of WP plug-in of Frama-C.                           *)
+(*                                                                        *)
+(*  Copyright (C) 2007-2020                                               *)
+(*    CEA (Commissariat a l'energie atomique et aux energies              *)
+(*         alternatives)                                                  *)
+(*                                                                        *)
+(*  you can redistribute it and/or modify it under the terms of the GNU   *)
+(*  Lesser General Public License as published by the Free Software       *)
+(*  Foundation, version 2.1.                                              *)
+(*                                                                        *)
+(*  It is distributed in the hope that it will be useful,                 *)
+(*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *)
+(*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *)
+(*  GNU Lesser General Public License for more details.                   *)
+(*                                                                        *)
+(*  See the GNU Lesser General Public License version 2.1                 *)
+(*  for more details (enclosed in the file licenses/LGPLv2.1).            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open Lang
+
+let negative n = F.p_leq n F.e_zero
+let positive n = F.p_leq F.e_zero n
+let concat ~result es = F.e_fun ~result Vlist.f_concat es
+let repeat ~result a n = F.e_fun ~result Vlist.f_repeat [a;n]
+let sum n = match F.repr n with
+  | Add ns -> ns
+  | _ -> [n]
+
+(* -------------------------------------------------------------------------- *)
+(* --- Induction Tactical                                                 --- *)
+(* -------------------------------------------------------------------------- *)
+
+let vmode,pmode =
+  Tactical.selector ~id:"seq.side" ~title:"Mode" ~descr:"Unrolling mode"
+    ~options:[
+      { vid = "left" ; title = "Unroll left" ;
+        descr = "Transform (A^n) into (A.A^n-1)" ; value = `Left } ;
+      { vid = "right" ; title = "Unroll right" ;
+        descr = "Transform (A^n) into (A^n-1.A)" ; value = `Right } ;
+      { vid = "sum" ; title = "Concat sum" ;
+        descr = "Transform A^(p+q) into (A^p.A^q)" ; value = `Sum }
+    ] ()
+
+class sequence =
+  object(self)
+    inherit Tactical.make
+        ~id:"Wp.sequence"
+        ~title:"Sequence"
+        ~descr:"Unroll repeat-sequence operator"
+        ~params:[pmode]
+
+    method select _feedback (s : Tactical.selection) =
+      let value = Tactical.selected s in
+      match F.repr value with
+      | Fun(f,[a;n]) when f == Vlist.f_repeat ->
+          let result = F.typeof value in
+          let at = Tactical.at s in
+          Applicable
+            begin
+              match self#get_field vmode with
+              | `Sum ->
+                  let ns = sum n in
+                  let pos = F.p_all positive ns in
+                  let cat = concat ~result (List.map (repeat ~result a) ns) in
+                  Tactical.condition "Positive" pos @@
+                  Tactical.rewrite ?at [ "Unroll" , pos , value , cat ]
+              | `Left ->
+                  let p = F.e_add n F.e_minus_one in
+                  let unroll = concat ~result [a ; repeat ~result a p] in
+                  Tactical.rewrite ?at [
+                    "Nil", negative n , value , concat ~result [] ;
+                    "Unroll", positive p , value , unroll ;
+                  ]
+              | `Right ->
+                  let p = F.e_add n F.e_minus_one in
+                  let unroll = concat ~result [repeat ~result a p ; a] in
+                  Tactical.rewrite ?at [
+                    "Nil", negative n , value , concat ~result [] ;
+                    "Unroll", positive p , value , unroll ;
+                  ]
+            end
+      | _ -> Not_applicable
+
+  end
+
+let tactical = Tactical.export (new sequence)
+
+(* -------------------------------------------------------------------------- *)
diff --git a/src/plugins/wp/TacSequence.mli b/src/plugins/wp/TacSequence.mli
new file mode 100644
index 0000000000000000000000000000000000000000..51e970bdaf1083d3ec5e9fb9f0371b8b9899532d
--- /dev/null
+++ b/src/plugins/wp/TacSequence.mli
@@ -0,0 +1,29 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  This file is part of WP plug-in of Frama-C.                           *)
+(*                                                                        *)
+(*  Copyright (C) 2007-2020                                               *)
+(*    CEA (Commissariat a l'energie atomique et aux energies              *)
+(*         alternatives)                                                  *)
+(*                                                                        *)
+(*  you can redistribute it and/or modify it under the terms of the GNU   *)
+(*  Lesser General Public License as published by the Free Software       *)
+(*  Foundation, version 2.1.                                              *)
+(*                                                                        *)
+(*  It is distributed in the hope that it will be useful,                 *)
+(*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *)
+(*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *)
+(*  GNU Lesser General Public License for more details.                   *)
+(*                                                                        *)
+(*  See the GNU Lesser General Public License version 2.1                 *)
+(*  for more details (enclosed in the file licenses/LGPLv2.1).            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(** Built-in Sequence Tactical (auto-registered) *)
+
+open Tactical
+
+val tactical : tactical
+
+(**************************************************************************)
diff --git a/src/plugins/wp/Tactical.ml b/src/plugins/wp/Tactical.ml
index 16e16203b0a791f60630800eb7b0c0e2520f4cb1..2cd4ff603fd859a645abfb13660e81440a0abde1 100644
--- a/src/plugins/wp/Tactical.ml
+++ b/src/plugins/wp/Tactical.ml
@@ -372,6 +372,9 @@ let rewrite ?at patterns sequent =
        descr , Conditions.insert ?at step sequent
     ) patterns
 
+let condition name guard process seq =
+  ( name , (fst seq , guard) ) :: process seq
+
 (* -------------------------------------------------------------------------- *)
 (* --- Tactical Engines                                                   --- *)
 (* -------------------------------------------------------------------------- *)
diff --git a/src/plugins/wp/Tactical.mli b/src/plugins/wp/Tactical.mli
index a1e8c042a1fdceae2d410103f57fe3ca6895d53d..320881d5c5b660ea4bf694a256c380f6806717a1 100644
--- a/src/plugins/wp/Tactical.mli
+++ b/src/plugins/wp/Tactical.mli
@@ -184,6 +184,9 @@ val rewrite : ?at:int -> (string * pred * term * term) list -> process
 (** For each pattern [(descr,guard,src,tgt)] replace [src] with [tgt]
     under condition [guard], inserted in position [at]. *)
 
+val condition : string -> pred -> process -> process
+(** Apply process, but only after proving some condition *)
+
 (** {2 Tactical Plug-in} *)
 
 class type tactical =
diff --git a/src/plugins/wp/Why3Provers.ml b/src/plugins/wp/Why3Provers.ml
index 3c9a5f797a62fa1879dab6209297e3bda177d835..19e8070cf06d110febdbf0a04f7c5aa471445f94 100644
--- a/src/plugins/wp/Why3Provers.ml
+++ b/src/plugins/wp/Why3Provers.ml
@@ -64,7 +64,6 @@ let find_opt s =
   try
     let config = Lazy.force cfg in
     let filter = Why3.Whyconf.parse_filter_prover s in
-    let filter = Why3.Whyconf.filter_prover_with_shortcut config filter in
     Some ((Why3.Whyconf.filter_one_prover config filter).Why3.Whyconf.prover)
   with
   | Why3.Whyconf.ProverNotFound _
@@ -78,14 +77,18 @@ let find_fallback name =
   match find_opt name with
   | Some prv -> Exact prv
   | None ->
-      match String.split_on_char ',' name with
-      | shortname :: _ :: _ ->
-          begin
-            match find_opt (String.lowercase_ascii shortname) with
-            | Some prv -> Fallback prv
-            | None -> NotFound
-          end
-      | _ -> NotFound
+      (* Why3 should deal with this intermediate case *)
+      match find_opt (String.lowercase_ascii name) with
+      | Some prv -> Exact prv
+      | None ->
+          match String.split_on_char ',' name with
+          | shortname :: _ :: _ ->
+              begin
+                match find_opt (String.lowercase_ascii shortname) with
+                | Some prv -> Fallback prv
+                | None -> NotFound
+              end
+          | _ -> NotFound
 
 let print_why3 = Why3.Whyconf.prover_parseable_format
 let print_wp s =
diff --git a/src/plugins/wp/cfgWP.ml b/src/plugins/wp/cfgWP.ml
index 93a00b75b286d86d371db4ea118b5ad6d3951fe3..10e8f697cc36b0b6661322887304f508016772cb 100644
--- a/src/plugins/wp/cfgWP.ml
+++ b/src/plugins/wp/cfgWP.ml
@@ -90,7 +90,7 @@ struct
   (* Authorized written region from an assigns specification *)
   type effect = {
     e_pid : P.t ; (* Assign Property *)
-    e_kind : a_kind ; (* Requires post effects (in case of loop-assigns) *)
+    e_post : bool ; (* Requires post effects (loop-assigns or post-assigns) *)
     e_label : c_label ; (* scope for collection *)
     e_valid : L.sigma ; (* sigma where locations are filtered for validity *)
     e_region : L.region ; (* expected from spec *)
@@ -248,11 +248,6 @@ struct
         path = path ;
       }
 
-  let assume_vcs ?descr ?filter ?init whs vc =
-    List.fold_left
-      (fun vc (warn,hyp) -> assume_vc ?descr ?filter ?init ~warn [hyp] vc)
-      vc whs
-
   (* -------------------------------------------------------------------------- *)
   (* --- Branching                                                          --- *)
   (* -------------------------------------------------------------------------- *)
@@ -442,28 +437,30 @@ struct
     let from = ainfo.WpPropId.a_label in
     let sigma = L.mem_frame from in
     let authorized_region =
-      L.assigned_of_assigns ~unfold:false
+      L.assigned_of_assigns
         (match ainfo.a_kind with
          | StmtAssigns -> L.move_at env sigma
          | LoopAssigns -> env)
         ainfo.a_assigns
     in match authorized_region with
     | None -> None
-    | Some region -> Some {
-        e_pid = pid ;
-        e_kind = ainfo.a_kind ;
-        e_label = from ;
-        e_valid = sigma ;
-        e_region = region ;
-        e_warn = Warning.Set.empty ;
-      }
+    | Some region ->
+        let post = match ainfo.a_kind with
+          | LoopAssigns -> true
+          | StmtAssigns -> NormAtLabels.has_postassigns ainfo.a_assigns
+        in Some {
+          e_pid = pid ;
+          e_post = post ;
+          e_label = from ;
+          e_valid = sigma ;
+          e_region = region ;
+          e_warn = Warning.Set.empty ;
+        }
 
   let cc_posteffect e vcs =
-    match e.e_kind with
-    | StmtAssigns -> vcs
-    | LoopAssigns ->
-        let vc = { empty_vc with vars = L.vars e.e_region } in
-        Gmap.add (Gposteffect e.e_pid) (Splitter.singleton vc) vcs
+    if not e.e_post then vcs else
+      let vc = { empty_vc with vars = L.vars e.e_region } in
+      Gmap.add (Gposteffect e.e_pid) (Splitter.singleton vc) vcs
 
   (* -------------------------------------------------------------------------- *)
   (* --- WP RULES : adding axioms, hypotheses and goals                     --- *)
@@ -520,7 +517,8 @@ struct
   (* -------------------------------------------------------------------------- *)
 
   let assigns_condition (region : L.region) (e:effect) : F.pred =
-    L.check_assigns e.e_valid ~written:region ~assignable:e.e_region
+    let unfold = Wp_parameters.UnfoldAssigns.get () in
+    L.check_assigns ~unfold e.e_valid ~written:region ~assignable:e.e_region
 
   exception COLLECTED
 
@@ -554,14 +552,13 @@ struct
              vars = xs }
          in
          let group =
-           match e.e_kind with
-           | StmtAssigns ->
-               Splitter.singleton (setup empty_vc)
-           | LoopAssigns ->
-               try Splitter.map setup (Gmap.find (Gposteffect e.e_pid) vcs)
-               with Not_found ->
-                 Wp_parameters.fatal "Missing post-effect for %a"
-                   WpPropId.pretty e.e_pid
+           if not e.e_post then
+             Splitter.singleton (setup empty_vc)
+           else
+             try Splitter.map setup (Gmap.find (Gposteffect e.e_pid) vcs)
+             with Not_found ->
+               Wp_parameters.fatal "Missing post-effect for %a"
+                 WpPropId.pretty e.e_pid
          in
          let target = match sloc with
            | None -> Gprop e.e_pid
@@ -571,8 +568,8 @@ struct
       ) effects vcs
 
   let do_assigns ?descr ?stmt ~source ?hpid ?warn sequence
-      ~assigned ?(unfolded=assigned) effects vcs =
-    let vcs = check_assigns stmt source ?warn unfolded effects vcs in
+      ~assigned effects vcs =
+    let vcs = check_assigns stmt source ?warn assigned effects vcs in
     let eqmem = A.apply_assigns sequence assigned in
     gmap (assume_vc ?descr ?hpid ?stmt ?warn eqmem) vcs
 
@@ -586,13 +583,9 @@ struct
          add_vc target ?warn F.p_false vcs)
       effects vcs
 
-  let cc_region ~unfold cc data =
-    let assigned = cc ~unfold:false data in
-    assigned , if unfold then cc ~unfold:true data else assigned
-
-  let cc_assigned env ~unfold kind froms =
+  let cc_assigned env kind froms =
     let dummy = Sigma.create () in
-    let r0 = L.assigned_of_froms ~unfold:false (L.move_at env dummy) froms in
+    let r0 = L.assigned_of_froms (L.move_at env dummy) froms in
     let d0 = A.domain r0 in
     let s1 = L.current env in
     let s0 = Sigma.havoc s1 d0 in
@@ -601,9 +594,9 @@ struct
       | LoopAssigns -> s1
     in
     let cc_assigned = L.assigned_of_froms (L.move_at env sref) in
-    let assigned,unfolded = cc_region ~unfold cc_assigned froms in
+    let assigned = cc_assigned froms in
     let sequence = { pre=s0 ; post=s1 } in
-    sequence , assigned , unfolded
+    sequence , assigned
 
   let use_assigns wenv stmt hpid ainfo wp = in_wenv wenv wp
       begin fun env wp ->
@@ -616,17 +609,16 @@ struct
 
         | Writes froms ->
             let kind = ainfo.WpPropId.a_kind in
-            let unfold = Wp_parameters.UnfoldAssigns.get () in
             let outcome =
               Warning.catch ~severe:true ~effect:"Assigns everything"
-                (cc_assigned env ~unfold kind) froms
+                (cc_assigned env kind) froms
             in
             match outcome with
-            | Warning.Result(warn,(sequence,assigned,unfolded)) ->
+            | Warning.Result(warn,(sequence,assigned)) ->
                 let vcs =
                   do_assigns ~source:FromCode
                     ?hpid ?stmt ~warn sequence
-                    ~assigned ~unfolded
+                    ~assigned
                     wp.effects wp.vcs in
                 { sigma = Some sequence.pre ; vcs=vcs ; effects = wp.effects }
             | Warning.Failed warn ->
@@ -712,14 +704,7 @@ struct
             { sigma = Some sigma ; vcs=vcs ; effects = wp.effects }
         | Warning.Result(l_warn,(obj,dom,seq,loc)) ->
             (* L-Value has been translated *)
-            let unfold = Wp_parameters.UnfoldAssigns.get () in
-            let assigned,unfolded =
-              if unfold && Ctypes.is_compound obj then
-                let env_pre = L.move_at env seq.pre in
-                cc_region ~unfold (L.assigned_of_lval env_pre) lv
-              else
-                let region = [obj,Sloc loc] in region,region
-            in
+            let assigned = [obj,Sloc loc] in
             let outcome = Warning.catch
                 ~severe:false ~effect:"Havoc l-value (unknown r-value)"
                 (cc_stored lv seq loc obj) expr in
@@ -729,7 +714,7 @@ struct
                 (* R-Value is unknown or L-Value is volatile *)
                 let warn = Warning.Set.union l_warn r_warn in
                 let vcs = do_assigns ~source:FromCode
-                    ~stmt ~warn seq ~assigned ~unfolded wp.effects wp.vcs in
+                    ~stmt ~warn seq ~assigned wp.effects wp.vcs in
                 { sigma = Some seq.pre ; vcs=vcs ; effects = wp.effects }
             | Warning.Result(r_warn,Some stored) ->
                 (* R-Value and effects has been translated *)
@@ -745,7 +730,7 @@ struct
                   else vc in
                 let vcs = gmap update wp.vcs in
                 let vcs =
-                  check_assigns (Some stmt) FromCode unfolded wp.effects vcs in
+                  check_assigns (Some stmt) FromCode assigned wp.effects vcs in
                 { sigma = Some seq.pre ; vcs=vcs ; effects = wp.effects }
       end
 
@@ -759,11 +744,23 @@ struct
     | Some exp ->
         in_wenv wenv wp
           begin fun env wp ->
-            let vr = L.result () in
-            let tr = L.return () in
-            let sigma = L.current env in
-            let returned = p_equal (C.result sigma tr vr) (C.return sigma tr exp) in
-            let vcs = gmap (assume_vc ~descr:"Return" ~stmt [returned]) wp.vcs in
+            let compile () =
+              let sigma = L.current env in
+              let vr = L.result () in
+              let tr = L.return () in
+              p_equal (C.result sigma tr vr) (C.return sigma tr exp) in
+            let outcome = Warning.catch
+                ~severe:false ~effect:"Result value discarded (unknown)"
+                compile () in
+            let warn, condition =
+              match outcome with
+              | Warning.Failed warn ->
+                  warn , p_true
+              | Warning.Result(warn,condition) ->
+                  warn , condition in
+            let vcs = gmap (
+                assume_vc ~descr:"Return" ~stmt ~warn [condition]
+              ) wp.vcs in
             { wp with vcs = vcs }
           end
 
@@ -906,13 +903,14 @@ struct
              [C.unchanged shere sinit v]
          in { wp with vcs = gmap const_vc wp.vcs })
 
-  let init wenv var init wp = in_wenv wenv wp
+  let init wenv var opt_init wp = in_wenv wenv wp
       (fun env wp ->
+         let assume = assume_vc ~descr:"Initializer" ~filter:true ~init:true in
          let sigma = L.current env in
-         let init_vc = assume_vcs
-             ~init:true ~filter:true
-             ~descr:"Initializer"
-             (C.init ~sigma var init)
+         let init_vc vc =
+           List.fold_left
+             (fun vc (warn,(hv,hi)) -> assume ~warn [hi] (assume ~warn [hv] vc))
+             vc (C.init ~sigma var opt_init)
          in { wp with vcs = gmap init_vc wp.vcs })
 
   (* -------------------------------------------------------------------------- *)
@@ -1039,8 +1037,7 @@ struct
         let env = L.move_at env0 dummy in
         let init = L.mem_at env0 Clabels.init in
         let frame = L.call_pre init (L.call kf vs) dummy in
-        let unfold = Wp_parameters.UnfoldAssigns.get () in
-        let cc_froms = L.assigned_of_froms ~unfold env in
+        let cc_froms = L.assigned_of_froms env in
         Some (A.domain (L.in_frame frame cc_froms froms))
 
   let cc_havoc d s = match d with
@@ -1093,14 +1090,12 @@ struct
         }
     | Writes froms ->
         let env = L.move_at env0 cenv.sigma_pre in
-        let unfold = Wp_parameters.UnfoldAssigns.get () in
-        let assigned,unfolded = L.in_frame cenv.frame_pre
-            (cc_region ~unfold (L.assigned_of_froms env))
-            froms in
+        let assigned = L.in_frame cenv.frame_pre
+            (L.assigned_of_froms env) froms in
         let vcs_post = do_assigns ~descr:"Call Effects" ~source:FromCall
-            ~stmt cenv.seq_post ~assigned ~unfolded wpost.effects wpost.vcs in
+            ~stmt cenv.seq_post ~assigned wpost.effects wpost.vcs in
         let vcs_exit = do_assigns ~descr:"Exit Effects" ~source:FromCall
-            ~stmt cenv.seq_exit ~assigned ~unfolded wexit.effects wexit.vcs in
+            ~stmt cenv.seq_exit ~assigned wexit.effects wexit.vcs in
         let vcs_result =
           match cenv.loc_result with
           | None -> vcs_post (* no result *)
@@ -1123,13 +1118,17 @@ struct
   let cc_result call = match call.loc_result with
     | None -> []
     | Some(tr,obj,loc) ->
-        (* [LC,VP] : the C left unspecified where to compute the lv *)
-        (* [LC,BY] : lv computed before, like in Value Analysis *)
-        let vr = M.load call.seq_result.post obj loc in
-        let re = L.in_frame call.frame_post L.result () in
-        let te = L.in_frame call.frame_post L.return () in
-        let value = C.result call.sigma_pre tr re in
-        [ C.equal_typ tr vr (C.cast tr te (Val value)) ]
+        let handler () = [ p_true ] in
+        let compile () =
+          (* [LC,VP] : the C left unspecified where to compute the lv *)
+          (* [LC,BY] : lv computed before, like in Value Analysis *)
+          let vr = M.load call.seq_result.post obj loc in
+          let re = L.in_frame call.frame_post L.result () in
+          let te = L.in_frame call.frame_post L.return () in
+          let value = C.result call.sigma_pre tr re in
+          [ C.equal_typ tr vr (C.cast tr te (Val value)) ]
+        in
+        Warning.handle ~handler ~severe:false ~effect:"Hide \\result" compile ()
 
   let cc_status f_caller f_callee =
     p_equal
@@ -1187,7 +1186,7 @@ struct
          match outcome with
          | Warning.Result(warn , wp) -> { wp with vcs = add_warnings warn wp.vcs }
          | Warning.Failed warn ->
-             let v_post = do_assigns_everything ~stmt ~warn p_post.effects p_exit.vcs in
+             let v_post = do_assigns_everything ~stmt ~warn p_post.effects p_post.vcs in
              let v_exit = do_assigns_everything ~stmt ~warn p_exit.effects p_exit.vcs in
              let effects = Eset.union p_post.effects p_exit.effects in
              let vcs = gmerge v_post v_exit in
@@ -1324,8 +1323,7 @@ struct
   (* --- WPO Grouper                                                        --- *)
   (* -------------------------------------------------------------------------- *)
 
-  (* NOTE: bug in ocamldoc in OCaml 4.02 prevents usage of 'P' here *)
-  module PMAP = Map.Make(WpPropId.PropId)
+  module PMAP = Map.Make(P)
 
   type group = {
     mutable verifs : VC_Annot.t Bag.t ;
diff --git a/src/plugins/wp/cil2cfg.ml b/src/plugins/wp/cil2cfg.ml
index 6f09908bfe3ea88747364b4bf55b7607d5b28fef..c4ee31c13b263dc9accc68da1a0de4e37df9ed72 100644
--- a/src/plugins/wp/cil2cfg.ml
+++ b/src/plugins/wp/cil2cfg.ml
@@ -806,7 +806,8 @@ let get_stmt_node env s =
   | Instr _  | Return _ ->  get_node env (Vstmt s)
   | Switch (e, _, _, _) -> get_node env (Vswitch (s, e))
   | TryExcept _ | TryFinally _ | Throw _ | TryCatch _ ->
-      Wp_parameters.not_yet_implemented "[cfg] exception handling"
+      Wp_parameters.not_yet_implemented
+        ~source:(fst (Cil_datatype.Stmt.loc s)) "[cfg] exception handling"
 
 let cfg_stmt_goto env s next =
   let node = get_node env (Vstmt s) in
@@ -942,7 +943,8 @@ and cfg_stmt env s next =
   | Switch (e, b, lstmts, _) ->
       cfg_switch env s e b lstmts next
   | TryExcept _ | TryFinally _ | Throw _ | TryCatch _ ->
-      Wp_parameters.not_yet_implemented "[cfg] exception handling"
+      Wp_parameters.not_yet_implemented
+        ~source:(fst (Cil_datatype.Stmt.loc s)) "[cfg] exception handling"
 
 and cfg_block_with ?continue ?break env bkind block next =
   let s_continue = env.node_continue in
diff --git a/src/plugins/wp/clabels.ml b/src/plugins/wp/clabels.ml
index c9f7ecf037f95fc9b6ef920628cf923778d33d05..f9e26a0db028f01cb19e437f3fc277cacd4f1fd5 100644
--- a/src/plugins/wp/clabels.ml
+++ b/src/plugins/wp/clabels.ml
@@ -74,6 +74,11 @@ let of_logic = function
   | BuiltinLabel LoopEntry -> loopentry
   | StmtLabel s -> stmt !s
 
+let is_post = function
+  | BuiltinLabel Post -> true
+  | FormalLabel a -> a = post
+  | _ -> false
+
 let name = function FormalLabel a -> a | _ -> ""
 
 let lookup labels a =
diff --git a/src/plugins/wp/clabels.mli b/src/plugins/wp/clabels.mli
index 26bdbfb4fcbdce2eb8ea16e372f9147ba91b926e..33812ec5f1377b696943adbbdfbd50cb110555cf 100644
--- a/src/plugins/wp/clabels.mli
+++ b/src/plugins/wp/clabels.mli
@@ -65,6 +65,9 @@ val of_logic : Cil_types.logic_label -> c_label
     labels. Ambiguous labels are: Old, LoopEntry and LoopCurrent, since
     they points to different program points dependending on the context. *)
 
+val is_post : Cil_types.logic_label -> bool
+(** Checks whether the logic-label is [Post] or [to_logic post] *)
+
 val pretty : Format.formatter -> c_label -> unit
 
 open Cil_types
diff --git a/src/plugins/wp/configure.ac b/src/plugins/wp/configure.ac
index 052fd1617d8adadc08240f26a10416921815c5c1..fd5332ac5852ace356de9d2701ff32bd9af1c0c6 100644
--- a/src/plugins/wp/configure.ac
+++ b/src/plugins/wp/configure.ac
@@ -85,16 +85,14 @@ if test "$ENABLE_WP" != "no"; then
     if test "$COQC" = "yes" ; then
       COQVERSION=`coqc -v | sed -n -e 's|.*version* *\([[^ ]]*\) .*$|\1|p' `
       case $COQVERSION in
-        8.7*|8.8*|8.9*|8.10*|8.11.*|8.12.*|trunk)
+        8.12.*|trunk)
           AC_MSG_RESULT(coqc version $COQVERSION found)
           ;;
         *)
-          AC_MSG_RESULT(unsupported coqc version $COQVERSION)
+          AC_MSG_RESULT(unsupported coqc version $COQVERSION for - deprecated - native backend)
           COQC="no"
           ;;
       esac
-    else
-      AC_MSG_NOTICE(rerun configure to make wp using coq 8.7.2 or higher)
     fi
   else
     COQC="no"
diff --git a/src/plugins/wp/ctypes.ml b/src/plugins/wp/ctypes.ml
index 303790f3b75d254f3e616e6b92cfa919eafbe3fb..245096cde6f403c2e4032d8f8b74a0efd38e50cb 100644
--- a/src/plugins/wp/ctypes.ml
+++ b/src/plugins/wp/ctypes.ml
@@ -226,6 +226,9 @@ let pp_object fmt = function
   | C_comp _ -> Format.pp_print_string fmt "obj-struct/union"
   | C_array _ -> Format.pp_print_string fmt "obj-array"
 
+let i_name = i_memo (Pretty_utils.to_string pp_int)
+let f_name = f_memo (Pretty_utils.to_string pp_float)
+
 (* -------------------------------------------------------------------------- *)
 (* --- Array Info                                                         --- *)
 (* -------------------------------------------------------------------------- *)
@@ -461,7 +464,7 @@ let bits_sizeof_comp cinfo = Cil.bitsSizeOf (typ_comp cinfo)
 let bits_sizeof_array ainfo =
   match ainfo.arr_flat with
   | Some a ->
-      let csize = Cil.integer ~loc:Cil.builtinLoc a.arr_cell_nbr in
+      let csize = Cil.integer ~loc:Cil_builtins.builtinLoc a.arr_cell_nbr in
       let ctype = TArray(a.arr_cell,Some csize,Cil.empty_size_cache(),[]) in
       Cil.bitsSizeOf ctype
   | None ->
@@ -486,12 +489,7 @@ let bits_sizeof_object = function
   | C_array ainfo -> bits_sizeof_array ainfo
 
 let field_offset fd =
-  if fd.fcomp.cstruct then (* C struct *)
-    let ctype = TComp(fd.fcomp,Cil.empty_size_cache(),[]) in
-    let offset = Field(fd,NoOffset) in
-    fst (Cil.bitsOffset ctype offset) / 8
-  else (* CIL invariant: all C union fields start at offset 0 *)
-    0
+  fst (Cil.fieldBitsOffset fd) / 8
 
 (* Conforms to C-ISO 6.3.1.8        *)
 (* If same sign => greater rank.    *)
@@ -525,8 +523,8 @@ let promote a1 a2 =
            "promotion between arithmetics and pointer types"
 
 let rec basename = function
-  | C_int i -> Format.asprintf "%a" pp_int i
-  | C_float f -> Format.asprintf "%a" pp_float f
+  | C_int i -> i_name i
+  | C_float f -> f_name f
   | C_pointer _ -> "pointer"
   | C_comp c -> c.cname
   | C_array a ->
diff --git a/src/plugins/wp/ctypes.mli b/src/plugins/wp/ctypes.mli
index 7efea62f13c30e9323b335affd29df2e7ebfa7af..c6dbf0bd4098686f600d1cd41ebc28d2b78e8beb 100644
--- a/src/plugins/wp/ctypes.mli
+++ b/src/plugins/wp/ctypes.mli
@@ -142,6 +142,8 @@ val pp_int : Format.formatter -> c_int -> unit
 val pp_float : Format.formatter -> c_float -> unit
 val pp_object : Format.formatter -> c_object -> unit
 
+val i_name : c_int -> string
+val f_name : c_float -> string
 val basename : c_object -> string
 val compare : c_object -> c_object -> int
 val equal : c_object -> c_object -> bool
diff --git a/src/plugins/wp/doc/.gitignore b/src/plugins/wp/doc/.gitignore
index e195051b60210ec0669af77b336478afbeb0e052..29d54294ae4a45e38bb133101ea89df7ff91d4dc 100644
--- a/src/plugins/wp/doc/.gitignore
+++ b/src/plugins/wp/doc/.gitignore
@@ -1,3 +1,8 @@
 frama-c-book.cls
+frama-c-cover.pdf
+frama-c-left.pdf
+frama-c-right.pdf
+frama-c-affiliation.tex
+cealistlogo.jpg
 feedback
 /html
diff --git a/src/plugins/wp/doc/MakeDoc b/src/plugins/wp/doc/MakeDoc
index 6ff81f5081a408126359af289823c2e404ec4c89..b646e4383b9812cac2fde373dbbb3679487199d8 100644
--- a/src/plugins/wp/doc/MakeDoc
+++ b/src/plugins/wp/doc/MakeDoc
@@ -3,7 +3,7 @@
 # --------------------------------------------------------------------------
 FRAMAC_DOC= .make-class .make-images .make-icons VERSION VERSION_CODENAME
 # --------------------------------------------------------------------------
-FRAMAC_CLASS=frama-c-book.cls frama-c-cover.pdf frama-c-left.pdf frama-c-right.pdf
+FRAMAC_CLASS=frama-c-book.cls frama-c-cover.pdf frama-c-left.pdf frama-c-right.pdf frama-c-affiliation.tex
 FRAMAC_BULLETS=never_tried.png unknown.png valid_under_hyp.png surely_valid.png
 FRAMAC_IMAGES=cealistlogo.jpg
 # --------------------------------------------------------------------------
diff --git a/src/plugins/wp/doc/coqdoc/.gitignore b/src/plugins/wp/doc/coqdoc/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..7426caf74d332c135faf80d7286cb91126bf2095
--- /dev/null
+++ b/src/plugins/wp/doc/coqdoc/.gitignore
@@ -0,0 +1,2 @@
+/VERSION
+/VERSION_CODENAME
diff --git a/src/plugins/wp/doc/coqdoc/wpcoq.tex b/src/plugins/wp/doc/coqdoc/wpcoq.tex
index a21ba54eaf2fd0cab314a58e8f1b26887b1f7f49..a6e95271c094fe91633b0d02451e303e67857e81 100644
--- a/src/plugins/wp/doc/coqdoc/wpcoq.tex
+++ b/src/plugins/wp/doc/coqdoc/wpcoq.tex
@@ -3,6 +3,8 @@
 \usepackage{pifont} 
 \usepackage{coq2latex}
 
+\input{./frama-c-affiliation.tex}
+
 \begin{document}
 \coverpage{WP Coq Handbook}
 \begin{titlepage}
@@ -11,9 +13,9 @@
 \vfill
 \title{WP Coq Handbook}%
 {Version 0.7 for Oxygen-20120901+dev}
-\author{Patrick Baudin, Loïc Correnson, Zaynah Dargaye}
+\author{Patrick Baudin, Lo�c Correnson, Zaynah Dargaye}
 \begin{center}
-CEA LIST, Software Safety Laboratory
+  \fcaffiliationen
 \end{center}
 \vfill
 \begin{flushleft}
diff --git a/src/plugins/wp/doc/manual/cealistlogo.jpg b/src/plugins/wp/doc/manual/cealistlogo.jpg
deleted file mode 100644
index 966be5a8ff6d50d9a7f50759633ca144c4c5db1c..0000000000000000000000000000000000000000
Binary files a/src/plugins/wp/doc/manual/cealistlogo.jpg and /dev/null differ
diff --git a/src/plugins/wp/doc/manual/frama-c-cover.pdf b/src/plugins/wp/doc/manual/frama-c-cover.pdf
deleted file mode 100644
index 4e14243c8064ca92d696fd354476dcdb31092895..0000000000000000000000000000000000000000
Binary files a/src/plugins/wp/doc/manual/frama-c-cover.pdf and /dev/null differ
diff --git a/src/plugins/wp/doc/manual/frama-c-left.pdf b/src/plugins/wp/doc/manual/frama-c-left.pdf
deleted file mode 100644
index ddf8888d292539177ab81c1b33d6411edf51c820..0000000000000000000000000000000000000000
Binary files a/src/plugins/wp/doc/manual/frama-c-left.pdf and /dev/null differ
diff --git a/src/plugins/wp/doc/manual/frama-c-right.pdf b/src/plugins/wp/doc/manual/frama-c-right.pdf
deleted file mode 100644
index db9b236dfdb19d9a6631ec55eee63f431f8d6f0d..0000000000000000000000000000000000000000
Binary files a/src/plugins/wp/doc/manual/frama-c-right.pdf and /dev/null differ
diff --git a/src/plugins/wp/doc/manual/wp.tex b/src/plugins/wp/doc/manual/wp.tex
index 205dddf92337c035f079f0e4411752894f3f2bec..f843fe3c40bbf4075410b24b52e4029d39f6a183 100644
--- a/src/plugins/wp/doc/manual/wp.tex
+++ b/src/plugins/wp/doc/manual/wp.tex
@@ -11,6 +11,8 @@
 \usepackage{longtable}
 \usepackage{pifont}
 
+\input{./frama-c-affiliation.tex}
+
 %\anticopyCEA{} % To comments for public version.
 \begin{document}
 \newcommand{\FCVERSION}{\input{VERSION}(\input{VERSION_CODENAME}\unskip)}
@@ -21,9 +23,9 @@
 \vfill
 \title{WP Plug-in Manual}%
 {\tt Frama-C \FCVERSION}
-\author{Patrick Baudin, François Bobot, Loïc Correnson, Zaynah Dargaye}
+\author{Patrick Baudin, François Bobot, Loïc Correnson, Zaynah Dargaye, Allan Blanchard}
 \begin{center}
-CEA LIST, Software Safety Laboratory
+  \fcaffiliationen
 \end{center}
 \vfill
 \begin{flushleft}
diff --git a/src/plugins/wp/doc/manual/wp_caveat.tex b/src/plugins/wp/doc/manual/wp_caveat.tex
index 9223f9d67dfc742606487b15eeb708de80f8c8d7..6e7afa77c066bb52273da98252d093d08b6980f3 100644
--- a/src/plugins/wp/doc/manual/wp_caveat.tex
+++ b/src/plugins/wp/doc/manual/wp_caveat.tex
@@ -34,5 +34,5 @@ the user \emph{must} check by manual code review that no aliases are
 introduced \emph{via} pointers passed to formal parameters at call sites.
 
 However, \textsf{WP} warns about the implicit separation hypotheses required by
-the memory model \textit{via} the \texttt{-wp-warn-separation} option, set
+the memory model \textit{via} the \texttt{-wp-warn-memory-model} option, set
 by default.
diff --git a/src/plugins/wp/doc/manual/wp_logic.tex b/src/plugins/wp/doc/manual/wp_logic.tex
index fb06118205256554f6819989501e20158840cbff..0bb2a2b6fc0def05c324711e4fe0bc4ffa00f7a1 100644
--- a/src/plugins/wp/doc/manual/wp_logic.tex
+++ b/src/plugins/wp/doc/manual/wp_logic.tex
@@ -178,3 +178,50 @@ detected variables are then assigned to the Hoare memory model.
 
 This optimization is not activated by default, since the non-aliasing
 assumptions at call sites are sometimes irrelevant.
+
+\section{Mixed models hypotheses}
+\label{wp-model-hypotheses}
+
+For the previously presented \textsf{Ref} model, but also for the
+\textsf{Typed}, and \textsf{Caveat} models presented later, WP lists
+the separation and validity hypotheses associated to the choice that
+it make of dispatching each pointer and variable either to the
+\lstinline{Hoare} or to the model $\cal{M}$ used for the heap.
+
+Consequently, in addition to user-defined function \lstinline{requires},
+WP also assumes, and thus states as \lstinline{requires} for the function
+caller, that:
+
+\begin{itemize}
+\item \lstinline{Hoare} variables are separated from each other,
+\item \lstinline{Hoare} variables are separated from the locations in $\cal{M}$,
+\item references are valid memory locations,
+\item locations assigned via a pointer are separated from \lstinline{Hoare}
+  variables whose address is not taken by the function (including via
+  its contract).
+\end{itemize}
+
+Furthermore, the function must ensure that:
+
+\begin{itemize}
+\item locations assigned via a pointer (including the returned value when
+  it is a pointer) are separated from \lstinline{Hoare} variables whose address
+  is not taken by the function (including via its contract),
+\item pointers assigned by the function (including the returned value when
+  it is a pointer) are separated from function parameters and \lstinline{Hoare}
+  variables whose address is not taken by the function (including via
+  its contract).
+\end{itemize}
+
+In order to precisely generate these hypotheses, WP needs precise
+\lstinline{assigns} specification. In particular each function under
+verification and all its callees needs an \lstinline{assigns} specification.
+Furthermore, if the function assigns or returns a pointer, WP needs
+a correct \lstinline{\from} specification for those pointers. If the
+specification is incomplete, a warning \lstinline{wp:pedantic-assigns} is
+triggered. Note that WP does not verify that the \lstinline{\from} is correct.
+
+The hypotheses are displayed when the option
+\lstinline{-wp-warn-memory-model} is enable (it is enabled by default).
+They can be verified by WP using the experimental option
+\lstinline{-wp-check-memory-model}.
diff --git a/src/plugins/wp/doc/manual/wp_plugin.tex b/src/plugins/wp/doc/manual/wp_plugin.tex
index baabcb0c126a097e691c2abfbb2b0f1457321b4e..c44452f15e11463a5d8e28fa88ae47ce095a7f49 100644
--- a/src/plugins/wp/doc/manual/wp_plugin.tex
+++ b/src/plugins/wp/doc/manual/wp_plugin.tex
@@ -251,26 +251,43 @@ c. Consolidating the Bench.
 
 This mode replays the automated proofs and the interactive ones, re-running Alt-Ergo on every \textsf{WP} goals and every proof tactic sub-goals. The user scripts are never modified — this is a replay mode only.
 
-\clearpage
-\subsection{Available Tactics}
+\subsection{Strategies}
+
+Strategies are heuristics that generate a prioritized bunch of tactics to be tried on the current goal.
+Few built-in strategies are provided by the \textsf{WP} plug-in ; however, the user can extends the proof editor with
+custom ones, as explained in section~\ref{wp-custom-tactics} below.
+
+To run strategies, the interactive proof editor provide a single button \texttt{Strategies} in the tactic panel.
+Configure the heuristics you want to include in your try, then click the button. The generated with highest priority is immediately applied. The proof summary now display \texttt{backtrack} buttons revealing proof nodes where alternative tactics are available. You can use those backtracking button to cycle over the generated tactics.
+
+Of course, strategies are meant to be used multiple times, in sequence. Recall that strategies apply highest priority tactic first, on the current goal. When using strategies several times, you shall see several \texttt{backtrack}ing buttons in your proof script. You backtrack from any point at any time.
+
+You shall also alternate strategies \emph{and} manually triggered tactics. Though, strategies are only used to
+\emph{infer} or \emph{suggest} interesting tactics to the user. Once your are finished with your proved, only the tactics are saved in the script, not the strategies used to find them. Hence, replaying a script generated with strategies would not involve backtracking any more. The script will directly replay your chosen alternatives.
+
+It is also possible to call strategies from the command line, with option \texttt{-wp-auto}. The strategies are tried up to some depth, and while a limited number of pending goals
+remains unproved by \textsf{Qed} or the selected provers. More precisely:
+\begin{description}
+\item[\tt -wp-auto s,...] applies strategies \texttt{s,...} recursively to unproved goals.
+\item[\tt -wp-auto-depth <$n$>] limit recursive application of strategies to depth $n$ (default is 5).
+\item[\tt -wp-auto-width <$n$>] limit application of strategies when there is less than $n$ pending goals (default is 10).
+\item[\tt -wp-auto-backtrack <$n$>] when the first tried strategies do not close a branch, allows for backtracking
+  on $n$ alternative strategies. Backtracking is performed on goals which are closed to the root proof obligation, hence
+  performing a kind of width-first search strategy, which tends to be more efficient in practice.
+  Backtracking is deactivated by default ($n=0$) and only used when \verb+-wp-auto+ is set.
+\end{description}
+
+The name of registered strategies is printed on console by using \texttt{-wp-auto '?'}. Custom strategies can be loaded by plug-ins, see below.
 
 \newcommand{\TACTIC}[2]{#1\quad\quad\triangleright\quad\quad#2}
 
+\subsection{General Tactics}
+
 \paragraph{Absurd} Contradict a Hypothesis\\
 The user can select a hypothesis $H$, and change the goal to $\neg H$:
 
 $$ \TACTIC{\Delta,H\models\,G}{\Delta\models\,\neg H} $$
 
-
-\paragraph{Array} Decompose array access-update patterns\\
-The use select an expression $e\equiv a[k_1\mapsto v][k_2]$. Then:
-
-$$ \TACTIC{\Delta\models\,G}{%
-\begin{array}[t]{ll}
-\Delta,\,k_1=k_2,\,e = v &\models G \\
-\Delta,\,k_1\neq k_2,\,e = a[k_2] &\models G
-\end{array}} $$
-
 \paragraph{Choice} Select a Goal Alternative\\
 When the goal is a disjunction, the user select one alternative and discard the others:
 $$ \TACTIC{\Delta\models\,\Gamma,G}{\Delta\models\,G} $$
@@ -280,7 +297,6 @@ When the user select an equality between two records, it is decomposed field by
 
 $$ \TACTIC{ a = b }{ \bigwedge a.f_i = b.f_i } $$
 
-
 \paragraph{Contrapose} Swap and Negate Hypothesis with Conclusion\\
 The user select a hypothesis (typically, a negation) and swap it with the goal.
 $$ \TACTIC{\Delta,H\models\,G}{\Delta,\neg G\models\,\neg H} $$
@@ -303,14 +319,14 @@ $$\TACTIC{\Delta\models\,G}{%
 \Delta,\neg C \models G
 \end{array}} $$
 
+\paragraph{Definition} Unfold predicate and logic function definition\\
+The user simply select a term $f(e_1,\ldots,e_n)$ or a predicate $P(e_1,\ldots,e_n)$ which is replaced by its definition, when available.
+
 \paragraph{Filter} Erase Hypotheses \\
 The tactic is always applicable. It removes hypotheses from the goal on a variable used basis. When variables are compounds (record and arrays) a finer heuristics is used to detect which parts of the variable is relevant. A transitive closure of dependencies is also used. However, it is always possible that too many hypotheses are removed.
 
 The tactic also have a variant where only hypotheses \emph{not relevant} to the goal are retained. This is useful to find absurd hypotheses that are completely disjoint from the goal.
 
-\paragraph{Havoc} Go Through Assigns \\
-This is a variant of the \texttt{Lemma} tactic dedicated to \texttt{Havoc} predicate generate by complex assigns clause. The user select an address, and if the address is not assigned by the \texttt{Havoc} clause, the memory at this address is unchanged.
-
 \paragraph{Instance} Instantiate properties\\
 The user selects a hypothesis with one or several $\forall$ quantifiers, or an $\exists$ quantified goal. Then, with the composer, the use choose to instantiate one or several of the quantified parameters. In case of $\forall$ quantifier over integer, a range of values can be instantiated instead.
 
@@ -323,22 +339,11 @@ $$\TACTIC{\Delta,\,\forall x\, P(x)\models G}{\Delta,P(n)\ldots P(m)\models G}$$
 When instantiating a goal with an expression $e$:
 $$\TACTIC{\Delta\models \exists x\,G(x)}{\Delta\models G(e)}$$
 
-\paragraph{Lemma} Search \& Instantiate Lemma\\
-The user start by selecting a term in the goal. Then, the search button in the tactic panel will display a list of lemma related to the term. Then, he can instantiate the parameters of the lemma, like with the Instance tactic.
-
 \paragraph{Intuition} Decompose with Conjunctive/Disjunctive Normal Form\\
 The user can select a hypothesis or a goal with nested conjunctions and disjunctions. The tactics then computes the conjunctive or disjunctive normal form of the selection and split the goal accordingly.
 
-\paragraph{Range} Enumerate a range of values for an integer term\\
-The user select any integer expression $e$ in the proof, and a range of numerical values $a\ldots b$. The proof goes by case for each $e=a\ldots e=b$, plus the side cases $e<a$ and $e>b$:
-$$\TACTIC{\Delta\models\,G}{%
-\begin{array}[t]{ll}
-\Delta,e<a &\models G \\
-\Delta,e=a &\models G \\
-&\vdots \\
-\Delta,e=b &\models G \\
-\Delta,e>b &\models G
-\end{array}} $$
+\paragraph{Lemma} Search \& Instantiate Lemma\\
+The user start by selecting a term in the goal. Then, the search button in the tactic panel will display a list of lemma related to the term. Then, he can instantiate the parameters of the lemma, like with the Instance tactic.
 
 \paragraph{Rewrite} Replace Terms\\
 This tactic uses an equality in a hypothesis to replace each occurrence of term by another one.
@@ -348,9 +353,6 @@ The original equality hypothesis is removed from the goal.
 
 $$\TACTIC{\Delta,a=b\models\,G}{\Delta[a\leftarrow b]\models\,G[a\leftarrow b]}$$
 
-\paragraph{Separated} Expand Separation Cases\\
-This tactic decompose a \texttt{separated}$(a,n,b,m)$ predicate into its four base cases: $a$ and $b$ have different bases, $a+n \leq b$, $b+m \leq a$, and $a[0..n-1]$ and $b[0..m-1]$ overlaps. The regions are separated in the first three cases, and not separated in the overlapping case. This is kind of normal disjunctive form of the separation clause.
-
 \paragraph{Split} Decompose Logical Connectives and Conditionals\\
 This is the most versatile available tactic. It decompose merely any logical operator following the sequent calculus rules. Typically:
 
@@ -376,7 +378,8 @@ When the user selects a arbitrary boolean expression $e$, the tactic is similar
 \Delta,\neg e\models G
 \end{array}} \]
 
-Finally, when the user select a arithmetic comparison over $a$ and $b$, the tactics makes a split over $a=b$, $a<b$ and $a>b$:
+Finally, when the user select a arithmetic comparison over $a$ and $b$,
+the tactics makes a split over $a=b$, $a<b$ and $a>b$:
 \[\TACTIC{\Delta\models\,G}{%
 \begin{array}[t]{ll}
 \Delta,a<b&\models G \\
@@ -384,49 +387,7 @@ Finally, when the user select a arithmetic comparison over $a$ and $b$, the tact
 \Delta,a>b&\models G
 \end{array}} \]
 
-\paragraph{Definition} Unfold predicate and logic function definition\\
-The user simply select a term $f(e_1,\ldots,e_n)$ or a predicate $P(e_1,\ldots,e_n)$ which is replaced by its definition, when available.
-
-\paragraph{Bitwise} Decompose equalities over $N$-bits\\
-The use selects an integer equality and a number of bits.
-Providing the two members of the equality are in range $0..2^N-1$,
-the equality is decomposed into $N$ bit-tests equalities:
-\[\TACTIC{\Delta\models G}{%
-\begin{array}[t]{rcl}
-\Delta\phantom{)} &\models & 0 \leq a,b < 2^N \\
-\sigma(\Delta) & \models & \sigma(G)
-\end{array}
-}\]
-where $\sigma$ is the following subsitution:
-\[ \sigma \equiv
-\left[ a=b \quad \leftarrow
-\bigwedge_{k\in 0..N-1} \mathtt{bit\_test}(a,k) = \mathtt{bit\_test}(b,k)
-\right]
-\]
-
-The \lstinline{bit_test(a,b)} function is predefined in \textsf{WP} and is equivalent
-to the \textsf{ACSL} expression \lstinline{(a & (1 << k)) != 0}. The
-\textsf{Qed} engine has many simplification rules that applies to
-such patterns, and the a tactic is good way to reason over bits.
-
-\paragraph{Shift} Transform logical shifts into arithmetics\\
-For positive integers, logical shifts such as \lstinline{a << k}
-and \lstinline{a >> k} where \lstinline$k$ is a constant can be interpreted into a multiplication or a division by $2^k$.
-
-When selecting a logical-shift, the tactic performs:
-\[\TACTIC{\Delta\models G}{%
-\begin{array}[t]{rcl}
-\Delta\phantom{)} &\models& 0 \leq a \\
-\sigma(\Delta) &\models& \sigma(G)
-\end{array}
-}\]
-where:
-\begin{tabular}[t]{ll}
-$\sigma = [ \mathtt{lsl}(a,k) \leftarrow a * 2^k ]$ &
-for left-shift, \\
-$\sigma = [ \mathtt{lsr}(a,k) \leftarrow a / 2^k ]$ &
-for right-shifts.
-\end{tabular}
+\subsection{Integers \& Bit-wised Tactics}
 
 \paragraph{BitRange} Range of logical bitwise operators \\
 This tactical applies the two following lemmas to the current goal.
@@ -453,6 +414,46 @@ to apply the theorems. Such a strategy is \emph{not} complete in general.
 Typically, $\mathtt{land}(x,y) < 38$ is true whenever both $x$ and $y$ are in range $0\ldots 31$, but this is also true
 in other cases.
 
+\paragraph{Bit-Test Range} Tighten bounds with respect to bits \\
+The \lstinline{bit_test(a,b)} function is predefined in \textsf{WP} and is equivalent
+to the \textsf{ACSL} expression \lstinline{(a & (1 << k)) != 0}. The
+\textsf{Qed} engine has many simplification rules that applies to
+such patterns.
+
+The user selects an expression $\mathtt{bit\_test}(n,k)$ with $k$
+a \emph{constant} integer value greater or equal to 0 and lower than
+128. The tactic uses this test to thighten the bounds of $n$.
+
+$$\TACTIC{\Delta\models\,G}{%
+\begin{array}[t]{ll}
+\Delta,T &\models G \\
+\Delta,F &\models G
+\end{array}} $$
+
+with
+$$\begin{array}[t]{rlcll}
+  T \equiv & \mathtt{bit\_test}(n,k) & \wedge & (0 \leq n & \Rightarrow 2^{k} \leq n) \\
+  F \equiv & \neg \mathtt{bit\_test}(n,k) & \wedge & (0 \leq n < 2^{k+1} & \Rightarrow n < 2^{k})
+  \end{array}
+$$
+
+\paragraph{Bitwise} Decompose equalities over $N$-bits\\
+The use selects an integer equality and a number of bits.
+Providing the two members of the equality are in range $0..2^N-1$,
+the equality is decomposed into $N$ bit-tests equalities:
+\[\TACTIC{\Delta\models G}{%
+\begin{array}[t]{rcl}
+\Delta\phantom{)} &\models & 0 \leq a,b < 2^N \\
+\sigma(\Delta) & \models & \sigma(G)
+\end{array}
+}\]
+where $\sigma$ is the following subsitution:
+\[ \sigma \equiv
+\left[ a=b \quad \leftarrow
+\bigwedge_{k\in 0..N-1} \mathtt{bit\_test}(a,k) = \mathtt{bit\_test}(b,k)
+\right]
+\]
+
 \paragraph{Congruence} Simplify Divisions and Products \\
 This tactic rewrites integer comparisons involving products and divisions.
 The tactic applies one of the following theorems to the current goal.
@@ -470,8 +471,23 @@ n|k, n|k', & (k/n).a = (k'/n).b &\Longleftrightarrow& k.a = k'.b
 \end{array}
 \]
 
+\paragraph{Induction} Start a proof by integer induction \\
+The user select any integer expression $e$ in the proof and a base value $b$ (which defaults to
+0). The tactic generates a proof by induction on $e$, that is, the base case
+$e = b$ and then the cases $e < b$ and $b < e$. Formally, the initial goal
+$\Delta_0\models\,G_0$ is first generalized into $\Delta,P(e)\models\,Q(e)$. The tactic
+then proceed by (strong) induction over $n$ for
+$G(n) \equiv P(n)\Longrightarrow\,Q(n)$:
+
+\[\TACTIC{\Delta\models\,G(n)}{%
+\begin{array}[t]{lll}
+\Delta,\; \quad n = b & \models G(n) \\
+\Delta,\; \forall i,\, b \leq i < n \Longrightarrow G(i) \; & \models G(n) \\
+\Delta,\; \forall i,\, n < i \leq b \Longrightarrow G(i) \; & \models G(n)
+\end{array}} \]
+
 \paragraph{Overflow} Integer Conversions \\
-This tactic rewrites machine integer conversions by identify,
+This tactic rewrites machine integer conversions by identity,
 providing the converted value is in available range. The tactic applies on expression
 with pattern $\mathtt{to\_iota(e)}$ where \texttt{iota} is a a machine-integer name,
 \emph{eg.} \texttt{to\_uint32}.
@@ -485,33 +501,106 @@ with pattern $\mathtt{to\_iota(e)}$ where \texttt{iota} is a a machine-integer n
 where $\sigma = [ \mathtt{to\_iota}(e) \mapsto e ]$ and $[a..b]$ is the range
 of the \texttt{iota} integer domain.
 
-\subsection{Strategies}
+\paragraph{Range} Enumerate a range of values for an integer term\\
+The user select any integer expression $e$ in the proof, and a range of numerical values $a\ldots b$. The proof goes by case for each $e=a\ldots e=b$, plus the side cases $e<a$ and $e>b$:
+$$\TACTIC{\Delta\models\,G}{%
+\begin{array}[t]{ll}
+\Delta,e<a &\models G \\
+\Delta,e=a &\models G \\
+&\vdots \\
+\Delta,e=b &\models G \\
+\Delta,e>b &\models G
+\end{array}} $$
 
-Strategies are heuristics that generate a prioritized bunch of tactics to be tried on the current goal.
-Few built-in strategies are provided by the \textsf{WP} plug-in ; however, the user can extends the proof editor with
-custom ones, as explained in section~\ref{wp-custom-tactics} below.
+\paragraph{Shift} Transform logical shifts into arithmetics\\
+For positive integers, logical shifts such as \lstinline{a << k}
+and \lstinline{a >> k} where \lstinline$k$ is a constant can be interpreted into a multiplication or a division by $2^k$.
 
-To run strategies, the interactive proof editor provide a single button \texttt{Strategies} in the tactic panel.
-Configure the heuristics you want to include in your try, then click the button. The generated with highest priority is immediately applied. The proof summary now display \texttt{backtrack} buttons revealing proof nodes where alternative tactics are available. You can use those backtracking button to cycle over the generated tactics.
+When selecting a logical-shift, the tactic performs:
+\[\TACTIC{\Delta\models G}{%
+\begin{array}[t]{rcl}
+\Delta\phantom{)} &\models& 0 \leq a \\
+\sigma(\Delta) &\models& \sigma(G)
+\end{array}
+}\]
+where:
+\begin{tabular}[t]{ll}
+$\sigma = [ \mathtt{lsl}(a,k) \leftarrow a * 2^k ]$ &
+for left-shift, \\
+$\sigma = [ \mathtt{lsr}(a,k) \leftarrow a / 2^k ]$ &
+for right-shifts.
+\end{tabular}
 
-Of course, strategies are meant to be used multiple times, in sequence. Recall that strategies apply highest priority tactic first, on the current goal. When using strategies several times, you shall see several \texttt{backtrack}ing buttons in your proof script. You backtrack from any point at any time.
+\subsection{Domain Specific Tactics}
 
-You shall also alternate strategies \emph{and} manually triggered tactics. Though, strategies are only used to
-\emph{infer} or \emph{suggest} interesting tactics to the user. Once your are finished with your proved, only the tactics are saved in the script, not the strategies used to find them. Hence, replaying a script generated with strategies would not involve backtracking any more. The script will directly replay your chosen alternatives.
+\paragraph{Array} Decompose array access-update patterns\\
+The use select an expression $e\equiv a[k_1\mapsto v][k_2]$. Then:
 
-It is also possible to call strategies from the command line, with option \texttt{-wp-auto}. The strategies are tried up to some depth, and while a limited number of pending goals
-remains unproved by \textsf{Qed} or the selected provers. More precisely:
-\begin{description}
-\item[\tt -wp-auto s,...] applies strategies \texttt{s,...} recursively to unproved goals.
-\item[\tt -wp-auto-depth <$n$>] limit recursive application of strategies to depth $n$ (default is 5).
-\item[\tt -wp-auto-width <$n$>] limit application of strategies when there is less than $n$ pending goals (default is 10).
-\item[\tt -wp-auto-backtrack <$n$>] when the first tried strategies do not close a branch, allows for backtracking
-  on $n$ alternative strategies. Backtracking is performed on goals which are closed to the root proof obligation, hence
-  performing a kind of width-first search strategy, which tends to be more efficient in practice.
-  Backtracking is deactivated by default ($n=0$) and only used when \verb+-wp-auto+ is set.
-\end{description}
+\[
+\TACTIC{\Delta\models\,G}{%
+\begin{array}[t]{ll}
+\Delta,\,k_1=k_2,\,e = v &\models G \\
+\Delta,\,k_1\neq k_2,\,e = a[k_2] &\models G
+\end{array}
+}\]
+
+\paragraph{Havoc} Go Through Assigns \\
+This is a variant of the \texttt{Lemma} tactic dedicated to \texttt{Havoc} predicate generate by complex assigns clause. The user select an address, and if the address is not assigned by the \texttt{Havoc} clause, the memory at this address is unchanged.
+
+\paragraph{Separated} Expand Separation Cases\\
+This tactic decompose a \texttt{separated}$(a,n,b,m)$ predicate into its four base cases: $a$ and $b$ have different bases, $a+n \leq b$, $b+m \leq a$, and $a[0..n-1]$ and $b[0..m-1]$ overlaps. The regions are separated in the first three cases, and not separated in the overlapping case. This is kind of normal disjunctive form of the separation clause.
+
+
+\paragraph{Sequence} Unroll repeat-sequence operator\\
+In this section, let us use $A^n$ for the ACSL notation \lstinline{A *^ n},
+the repeat list operation, and $A \oplus l$ for the list concatenation.
+
+This tactics is used to transform $A^n$ sequences. Threes behaviors
+can be selected:
+unroll left that rewrites the list  $A^n$ into $A \oplus A^{n-1}$,
+unroll right that rewrites the list $A^n$ into $A^{n-1} \oplus A$
+and unroll sum that rewrites the list $A ^{n_1 + ... + n_k}$
+into $A^{n_1} \oplus ... \oplus A^{n_k}$. For unroll left and right,
+a negative value leads to an empty list. For unroll sum, one must prove that all
+$nI$ are positive.
+
+Rule for unroll left:
+
+\[
+\TACTIC{\Delta\models\,G}{%
+\begin{array}[t]{lll}
+  \Delta[A^n\leftarrow A \oplus A^{n-1}],& n > 0 & \models G[A^n\leftarrow A \oplus A^{n-1}]\\
+  \Delta[A^n\leftarrow []],& n \leq 0 & \models G[A^n\leftarrow []]
+\end{array}
+}\]
+
+Rule for unroll right:
+
+\[
+\TACTIC{\Delta\models\,G}{%
+\begin{array}[t]{lll}
+  \Delta[A^n\leftarrow A^{n-1} \oplus A],& n > 0 & \models G[A^n\leftarrow A^{n-1} \oplus A]\\
+  \Delta[A^n\leftarrow []],& n \leq 0 & \models G[A^n\leftarrow []]
+\end{array}
+}\]
+
+Rule for unroll sum:
+
+\[
+\TACTIC{\Delta\models\,G}{%
+\begin{array}[t]{ll}
+  \Delta & \models\bigwedge_{i=1}^{k} 0 \leq n_i\\
+  &\\
+  \Delta[A^{\sum_{i=1}^{k}n_i}\leftarrow \bigoplus_{i=1}^{k} A^{n_i}] &
+  \models G[A^{\sum_{i=1}^{k}n_i}\leftarrow \bigoplus_{i=1}^{k} A^{n_i}]
+\end{array}
+}\]
+
+\paragraph{Validity} Unfold validity and range definitions\\
+The user selects a validity expression (\lstinline{valid_rd},
+\lstinline{valid_rw}, \lstinline{invalid} or \lstinline{included}).
+The expression is unfolded to a \textsf{Qed} term.
 
-The name of registered strategies is printed on console by using \texttt{-wp-auto '?'}. Custom strategies can be loaded by plug-ins, see below.
 
 \subsection{Custom Tactics and Strategies}
 \label{wp-custom-tactics}
@@ -823,10 +912,17 @@ The available \textsf{WP} command-line options related to model selection are:
   makes the \textsf{WP} emitting a warning on each volatile access.
 \item[\tt -wp-(no)-warn-memory-model] this option (de)activate the
   warnings about memory model hypotheses
-  for the generated proof obligations. For each model supporting this feature, and each concerned function,
+  for the generated proof obligations, as described in Section~\ref{wp-model-hypotheses}.
+  For each model supporting this feature, and each concerned function,
   an \textsf{ACSL} specification is printed on output.
   Currently, only the \texttt{Caveat}, \texttt{Typed} and \texttt{Ref} memory models support
-  this feature.
+  this feature. See also experimental option below.
+\item[\tt -wp-(no)-check-memory-model] this \emph{experimental} option generates
+  ACSL contracts for the selected memory model hypotheses, as described
+  in Section~\ref{wp-model-hypotheses} and listed by option
+  \texttt{-wp-warn-memory-model}.
+  Hence, the memory model hypothes are exposed to \textsf{WP} and other plugins.
+  Disabled by default.
 \end{description}
 
 \subsection{Computation Strategy}
@@ -860,21 +956,48 @@ weakest precondition calculus.
   a call (default is: \texttt{yes}).
 \item[\tt -wp-(no)-precond-weakening] discard pre-conditions of side behaviours (sound but
   incomplete optimisation, default is: \texttt{no}).
-\item[\tt -wp-(no)-unfold-assigns] prove assigns goal of \texttt{struct}
-  compound types field by field. This allows for proving that assigning
-  a complete structure is still included into an assignment field by field.
-  This option is not set by default, because it is generally not necessary
-  and it can generates a large number of verifications for structures
-  with many (nested) fields (defaults to \texttt{no}).
+\item[\tt -wp-unfold-assigns <{\it n}>] when proving assigns, unfold up to
+  \textit{n} levels of \texttt{struct} compounds types or access via ranges.
+  \texttt{struct} are unfolded field by field, ranges are unfolded cell by
+  cell (via a universal quantification over the index of the cell).
+  This allows for proving that assigning a complete structure is still included
+  into an assignment field by field, or that assigning a range is still included
+  in a union of subranges. This option is set to \texttt{0} by default, because
+  it is generally not necessary and it can generates a large number of
+  verifications for structures with many (nested) fields. \texttt{-1} enables
+  full unfolding.
 \item[\tt -wp-(no)-dynamic] handles calls \textit{via} function pointers
-  thanks to the dedicated \verb+@calls f1,...,fn+ code annotation.
-  For each call to a function pointer \texttt{fp}
-  in the instruction or block under the annotation,
-  \texttt{fp} is required to belongs to the set \texttt{f1,\ldots,fn} and
-  a case analysis is performed with the contract of each provided function
-  (default is: \texttt{yes}).
+  thanks to the dedicated \verb+@calls f1,...,fn+ code annotation (default is: \texttt{yes}).
 \end{description}
 
+\subsubsection{ACSL extension \texttt{@calls}}
+
+The handling of functions pointers is done via the ACSL code annotation
+extension \verb+@calls+. For each call to a function pointer \verb+fp+
+in the instruction or block under the annotation \verb+calls f1,\ldots,fn+,
+\verb+fp+ is required to belongs to the set \verb+f1,\ldots,fn+ and
+a case analysis is performed with the contract of each provided function.
+
+For example:
+
+\begin{lstlisting}[language=c, alsolanguage=acsl]
+/*@ ensures \result == x ; */
+int f1(int x);
+/*@ ensures \result == x+1 ; */
+int f2(int x);
+
+/*@ requires fp == &f1 || fp == &f2 ;
+    ensures POST: \result == 4 || \result == 5; */
+int caller(int (*fp)(int)){
+  //@ calls f1, f2 ;
+  return (*fp)(4);
+}
+\end{lstlisting}
+
+These annotations split post-conditions to the dynamic call into two sub-goals: one for call to \verb+f1+ and
+a second for the call to \verb+f2+. A last goal is generated at the call
+site: one must prove that \verb+fp+ is either \verb+f1+ or \verb+f2+.
+
 \subsection{Smoke Tests}
 
 During modular deductive verification, inconsistencies in function requirements
diff --git a/src/plugins/wp/gui/GuiPanel.ml b/src/plugins/wp/gui/GuiPanel.ml
index b24a0ca165b0113a6afb5761142d6c86f4eb22f2..320b6ed8d9d8b5cede3955092bc39d4e63381c2e 100644
--- a/src/plugins/wp/gui/GuiPanel.ml
+++ b/src/plugins/wp/gui/GuiPanel.ml
@@ -63,11 +63,45 @@ let wp_rte_generated s =
         not mem
       else false
 
+let with_model action kf =
+  let setup = Factory.parse (Wp_parameters.Model.get ()) in
+  let driver = Driver.load_driver () in
+  let model = Factory.instance setup driver in
+  let hypotheses_computer = WpContext.compute_hypotheses model in
+  let name = WpContext.MODEL.id model in
+  action kf name hypotheses_computer
+
+let warn_memory_context kfs =
+  if Wp_parameters.MemoryContext.get () then begin
+    Kernel_function.Set.iter
+      (fun kf -> with_model MemoryContext.warn kf) kfs
+  end
+
+let populate_memory_context kfs =
+  if Wp_parameters.CheckMemoryContext.get () then begin
+    Kernel_function.Set.iter
+      (fun kf -> with_model MemoryContext.add_behavior kf) kfs
+  end
+
 let spawn provers vcs =
   if not (Bag.is_empty vcs) then
     let provers = Why3.Whyconf.Sprover.elements provers#get in
     VC.command ~provers ~tip:true vcs
 
+let treat_hypotheses selection =
+  let kf = match selection with
+    | S_none -> None
+    | S_fun kf -> Some kf
+    | S_prop ip -> Property.get_kf ip
+    | S_call s -> Some (Kernel_function.find_englobing_kf s.s_stmt)
+  in
+  let kfs = match kf with
+    | Some kf -> WpTarget.with_callees kf
+    | None -> Kernel_function.Set.empty
+  in
+  warn_memory_context kfs ;
+  populate_memory_context kfs
+
 let run_and_prove
     (main:Design.main_window_extension_points)
     (provers:GuiConfig.provers)
@@ -76,6 +110,7 @@ let run_and_prove
   begin
     try
       begin
+        treat_hypotheses selection ;
         match selection with
         | S_none -> raise Stop
         | S_fun kf -> spawn provers (VC.generate_kf kf)
diff --git a/src/plugins/wp/gui/GuiTactic.ml b/src/plugins/wp/gui/GuiTactic.ml
index 0edcc8430adf32d77818ab7f4fc51f6f5345aae4..550a6caed14f304d3c20aae06570cec7a5b2f9ed 100644
--- a/src/plugins/wp/gui/GuiTactic.ml
+++ b/src/plugins/wp/gui/GuiTactic.ml
@@ -198,6 +198,7 @@ class mkcomposer
           Wutil.on filter (fun f -> wvalid <- f) ;
           Wutil.on range (fun r -> ranged <- r) ;
           ignore vmin ; ignore vmax ;
+          self#updated
         end
   end
 
diff --git a/src/plugins/wp/normAtLabels.ml b/src/plugins/wp/normAtLabels.ml
index bb41fa3dcc6df86fe0ec09c7535d61c721de45a2..197b12f968517c08056b5183ade17088df4863a3 100644
--- a/src/plugins/wp/normAtLabels.ml
+++ b/src/plugins/wp/normAtLabels.ml
@@ -210,9 +210,27 @@ let preproc_assigns labels asgns =
   let visitor = new norm_at labels in
   List.map (Visitor.visitFramacFrom visitor) asgns
 
+let has_postassigns = function
+  | WritesAny -> false
+  | Writes froms ->
+      let exception HAS_POST in
+      let visitor = new norm_at (fun l ->
+          if Clabels.is_post l then raise HAS_POST
+          else Clabels.of_logic l
+        ) in
+      try
+        List.iter
+          (fun fr -> ignore @@ Visitor.visitFramacFrom visitor fr)
+          froms ;
+        false
+      with HAS_POST ->
+        true
+
 let catch_label_error ex txt1 txt2 = match ex with
   | LabelError lab ->
       Wp_parameters.warning
         "Unexpected label %a in %s : ignored %s"
         Wp_error.pp_logic_label lab txt1 txt2
   | _ -> raise ex
+
+(* -------------------------------------------------------------------------- *)
diff --git a/src/plugins/wp/normAtLabels.mli b/src/plugins/wp/normAtLabels.mli
index 14b653d70999ee5479a490f546d475601b2726df..0dd24f825450e8170399fcf7ab9f0de90b6fd320 100644
--- a/src/plugins/wp/normAtLabels.mli
+++ b/src/plugins/wp/normAtLabels.mli
@@ -42,5 +42,5 @@ val labels_predicate : (logic_label * logic_label) list -> label_mapping
 val labels_axiom : label_mapping
 
 val preproc_annot : label_mapping -> predicate -> predicate
-
 val preproc_assigns : label_mapping -> from list -> from list
+val has_postassigns : assigns -> bool
diff --git a/src/plugins/wp/prover.ml b/src/plugins/wp/prover.ml
index 45bd15f9cb42fc358617c41bbd8378979d3d690a..87fc5241966e3870a413dad3411aded9eb3e430a 100644
--- a/src/plugins/wp/prover.ml
+++ b/src/plugins/wp/prover.ml
@@ -121,7 +121,15 @@ let spawn wpo ~delayed
             prover , task
          ) provers)
   else
-    let process = simplify ?start ?result wpo in
+    let process = simplify ?start ?result wpo >>= fun ok ->
+      begin
+        match success with
+        | None -> ()
+        | Some on_success ->
+            on_success wpo (if ok then Some VCS.Qed else None) ;
+      end ;
+      Task.return ()
+    in
     let thread = Task.thread process in
     let server = ProverTask.server () in
     Task.spawn server ?pool thread
diff --git a/src/plugins/wp/register.ml b/src/plugins/wp/register.ml
index 3c44e8509432ae1e43e07f45065ad4606b2f54f7..ccd890300bfc360414da25fbf8a71426a218ac88 100644
--- a/src/plugins/wp/register.ml
+++ b/src/plugins/wp/register.ml
@@ -89,42 +89,24 @@ 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 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>/*@@@ %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 () =
+let wp_warn_memory_context model =
   begin
-    wp_iter_model
-      begin fun kf m ->
-        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)
+    WpTarget.iter
+      begin fun kf ->
+        let hypotheses_computer = WpContext.compute_hypotheses model in
+        let model = WpContext.MODEL.id model in
+        MemoryContext.warn kf model hypotheses_computer
       end
   end
 
 let wp_insert_memory_context model =
   begin
-    Wp_parameters.iter_fct
+    WpTarget.iter
       begin fun kf ->
         let hyp_computer = WpContext.compute_hypotheses model in
         let model_id = WpContext.MODEL.id model in
@@ -157,7 +139,7 @@ let do_wp_print_for goals =
     else Log.print_on_output
         (fun fmt -> Bag.iter (Wpo.pp_goal_flow fmt) goals)
 
-let do_wp_report () =
+let do_wp_report model =
   begin
     let reports = Wp_parameters.Report.get () in
     let jreport = Wp_parameters.ReportJson.get () in
@@ -177,7 +159,7 @@ let do_wp_report () =
         List.iter (WpReport.export stats) reports ;
       end ;
     if Wp_parameters.MemoryContext.get () then
-      wp_warn_memory_context ()
+      wp_warn_memory_context model
   end
 
 (* ------------------------------------------------------------------------ *)
@@ -766,8 +748,11 @@ let cmdline_run () =
     if fct <> Wp_parameters.Fct_none then
       begin
         Wp_parameters.feedback ~ontty:`Feedback "Running WP plugin...";
+        let computer = computer () in
         Ast.compute ();
         Dyncall.compute ();
+        if Wp_parameters.RTE.get () then
+          WpRTE.generate_all computer#model ;
         if Wp_parameters.has_dkey dkey_logicusage then
           begin
             LogicUsage.compute ();
@@ -781,15 +766,15 @@ let cmdline_run () =
         let bhv = Wp_parameters.Behaviors.get () in
         let prop = Wp_parameters.Properties.get () in
         (** TODO entry point *)
-        let computer = computer () in
         if Wp_parameters.has_dkey dkey_builtins then
           begin
             WpContext.on_context (computer#model,WpContext.Global)
               LogicBuiltins.dump ();
           end ;
+        WpTarget.compute computer#model ;
         wp_compute_memory_context computer#model ;
-        if Wp_parameters.CheckModelHypotheses.get () then
-          wp_insert_memory_context computer#model fct ;
+        if Wp_parameters.CheckMemoryContext.get () then
+          wp_insert_memory_context computer#model ;
         let goals = Generator.compute_selection computer ~fct ~bhv ~prop () in
         do_wp_proofs goals ;
         begin
@@ -798,7 +783,7 @@ let cmdline_run () =
           else
             do_wp_print () ;
         end ;
-        do_wp_report () ;
+        do_wp_report computer#model ;
       end
   end
 
diff --git a/src/plugins/wp/share/why3/frama_c_wp/cint.mlw b/src/plugins/wp/share/why3/frama_c_wp/cint.mlw
index 2a8e1c460523dc755e0fff4f132f7358d51ead8b..969326b6fe91bdce835b6efaa34b84929f0936da 100644
--- a/src/plugins/wp/share/why3/frama_c_wp/cint.mlw
+++ b/src/plugins/wp/share/why3/frama_c_wp/cint.mlw
@@ -102,14 +102,14 @@ theory Cint
   meta "remove_for_" lemma is_to_uint
   meta "remove_for_" lemma is_to_sint
 
-  axiom is_to_uint8 : forall x:int [ is_uint8(to_uint8 x) ]. is_uint8 (to_uint8 x)
-  axiom is_to_sint8 : forall x:int [ is_sint8(to_sint8 x) ]. is_sint8 (to_sint8 x)
-  axiom is_to_uint16 : forall x:int [ is_uint16(to_uint16 x) ]. is_uint16 (to_uint16 x)
-  axiom is_to_sint16 : forall x:int [ is_sint16(to_sint16 x) ]. is_sint16 (to_sint16 x)
-  axiom is_to_uint32 : forall x:int [ is_uint32(to_uint32 x) ]. is_uint32 (to_uint32 x)
-  axiom is_to_sint32 : forall x:int [ is_sint32(to_sint32 x) ]. is_sint32 (to_sint32 x)
-  axiom is_to_uint64 : forall x:int [ is_uint64(to_uint64 x) ]. is_uint64 (to_uint64 x)
-  axiom is_to_sint64 : forall x:int [ is_sint64(to_sint64 x) ]. is_sint64 (to_sint64 x)
+  axiom is_to_uint8 : forall x:int. is_uint8 (to_uint8 x)
+  axiom is_to_sint8 : forall x:int. is_sint8 (to_sint8 x)
+  axiom is_to_uint16 : forall x:int. is_uint16 (to_uint16 x)
+  axiom is_to_sint16 : forall x:int. is_sint16 (to_sint16 x)
+  axiom is_to_uint32 : forall x:int. is_uint32 (to_uint32 x)
+  axiom is_to_sint32 : forall x:int. is_sint32 (to_sint32 x)
+  axiom is_to_uint64 : forall x:int. is_uint64 (to_uint64 x)
+  axiom is_to_sint64 : forall x:int. is_sint64 (to_sint64 x)
 
   (** * C-Integer Conversions are identity when in-range * **)
 
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 c2f0cc8634b86158a92d04f49095291a20c0e8b9..49a5e3e685095bc0abd0da168d87d5f9ba4db46a 100644
--- a/src/plugins/wp/share/why3/frama_c_wp/memory.mlw
+++ b/src/plugins/wp/share/why3/frama_c_wp/memory.mlw
@@ -80,7 +80,7 @@ theory Memory
              ( 0 <> p.base /\ 0 <= p.offset /\ p.offset + n <= 1 + m[p.base] ))
 
   predicate invalid (m : map int int) (p:addr) (n:int) =
-    n > 0 -> ( m[p.base] <= p.offset \/ p.offset + n <= 0 )
+    n <= 0 \/ p.base = 0 \/ m[p.base] <= p.offset \/ p.offset + n <= 0
 
   lemma valid_rw_rd :
     forall m : map int int.
@@ -152,7 +152,7 @@ theory Memory
     forall a : int.
     eqmem m1 m2 p a -> eqmem m2 m1 p a
 
-  lemma havoc_access :
+  axiom havoc_access :
     forall m0 m1 : map addr 'a.
     forall q p : addr.
     forall a : int.
@@ -168,7 +168,7 @@ theory Memory
 
   function set_init (m: map addr bool) (p:addr) (a:int) : map addr bool
 
-  lemma set_init_access :
+  axiom set_init_access :
     forall m : map addr bool.
     forall q p : addr.
     forall a : int.
diff --git a/src/plugins/wp/share/why3/frama_c_wp/vset.mlw b/src/plugins/wp/share/why3/frama_c_wp/vset.mlw
index 1e9a850621d652ac870027c530e189895df9ee6f..d18a7ffa8a40ff3a1b218dba6f23345013f13924 100644
--- a/src/plugins/wp/share/why3/frama_c_wp/vset.mlw
+++ b/src/plugins/wp/share/why3/frama_c_wp/vset.mlw
@@ -98,4 +98,4 @@ theory Vset
 
   (* -------------------------------------------------------------------------- *)
 
-end
\ No newline at end of file
+end
diff --git a/src/plugins/wp/tests/test_config b/src/plugins/wp/tests/test_config
index 0181ba49e1a2fd88c7a229e8b3b44bd8a11b95ea..f3c1a8508e46cf910d3e31dfabff2a034451093a 100644
--- a/src/plugins/wp/tests/test_config
+++ b/src/plugins/wp/tests/test_config
@@ -1,3 +1,9 @@
+<<<<<<< HEAD
 PLUGIN: rtegen,wp
 CMD: @frama-c@ -wp -wp-prover none -wp-print -wp-msg-key shell -wp-warn-key "pedantic-assigns=inactive" @OPTIONS@
+||||||| ac7807782d
+CMD: @frama-c@ -no-autoload-plugins -load-module wp -wp -wp-prover none -wp-print -wp-share ./share -wp-msg-key shell
+=======
+CMD: @frama-c@ -no-autoload-plugins -load-module wp -wp -wp-prover none -wp-print -wp-share ./share -wp-msg-key shell -wp-warn-key "pedantic-assigns=inactive"
+>>>>>>> origin/master
 OPT:
diff --git a/src/plugins/wp/tests/test_config_qualif b/src/plugins/wp/tests/test_config_qualif
index 039d6269182c1d6e61b2a70c250610b3d3cd9dd8..ee38354a5124ebd6882c8893fff2fac508d3415f 100644
--- a/src/plugins/wp/tests/test_config_qualif
+++ b/src/plugins/wp/tests/test_config_qualif
@@ -1,4 +1,10 @@
+<<<<<<< HEAD
 PLUGIN: rtegen,wp
 MACRO: WP_OPTIONS -wp -wp-par 1 -wp-share ../../../share -wp-msg-key shell -wp-warn-key pedantic-assigns=inactive -wp-report  %{dep:../../qualif.report} -wp-session ../oracle@PTEST_CONFIG@/@PTEST_NAME@.@PTEST_NUMBER@.session -wp-cache-env -wp-cache replay -wp-coq-timeout 120
 CMD: @frama-c@ @WP_OPTIONS@ @OPTIONS@
+||||||| ac7807782d
+CMD: @frama-c@ -no-autoload-plugins -load-module wp -wp -wp-par 1 -wp-share ./share -wp-msg-key shell -wp-report tests/qualif.report -wp-session @PTEST_DIR@/oracle@PTEST_CONFIG@/@PTEST_NAME@.@PTEST_NUMBER@.session -wp-cache-env -wp-cache replay @PTEST_FILE@ -wp-coq-timeout 120
+=======
+CMD: @frama-c@ -no-autoload-plugins -load-module wp -wp -wp-par 1 -wp-share ./share -wp-msg-key shell -wp-warn-key pedantic-assigns=inactive -wp-report tests/qualif.report -wp-session @PTEST_DIR@/oracle@PTEST_CONFIG@/@PTEST_NAME@.@PTEST_NUMBER@.session -wp-cache-env -wp-cache replay @PTEST_FILE@ -wp-coq-timeout 120
+>>>>>>> origin/master
 OPT:
diff --git a/src/plugins/wp/tests/why3/oracle_qualif/spec_memory.res.oracle b/src/plugins/wp/tests/why3/oracle_qualif/spec_memory.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..84dd9791cd3af005144c2029d1af4995b496b25b
--- /dev/null
+++ b/src/plugins/wp/tests/why3/oracle_qualif/spec_memory.res.oracle
@@ -0,0 +1,15 @@
+tests/why3/spec_memory.why Spec_memory check_valid_rd: Valid
+tests/why3/spec_memory.why Spec_memory check_valid: Valid
+tests/why3/spec_memory.why Spec_memory invalid_spec: Valid
+tests/why3/spec_memory.why Spec_memory invalid_null_spec: Valid
+tests/why3/spec_memory.why Spec_memory invalid_null: Valid
+tests/why3/spec_memory.why Spec_memory invalid_empty: Valid
+tests/why3/spec_memory.why Spec_memory valid_rd_null: Valid
+tests/why3/spec_memory.why Spec_memory valid_rw_null: Valid
+tests/why3/spec_memory.why Spec_memory valid_obj_null: Valid
+tests/why3/spec_memory.why Spec_memory INC_P: Valid
+tests/why3/spec_memory.why Spec_memory INC_A: Valid
+tests/why3/spec_memory.why Spec_memory INC_1: Valid
+tests/why3/spec_memory.why Spec_memory INC_2: Valid
+tests/why3/spec_memory.why Spec_memory INC_3: Valid
+tests/why3/spec_memory.why Spec_memory INC_4: Valid
diff --git a/src/plugins/wp/tests/why3/spec_memory.why b/src/plugins/wp/tests/why3/spec_memory.why
new file mode 100644
index 0000000000000000000000000000000000000000..6c1f84a465e774c3f2ce7d0961d4a9e8a9968f0e
--- /dev/null
+++ b/src/plugins/wp/tests/why3/spec_memory.why
@@ -0,0 +1,88 @@
+module Spec_memory
+
+  use int.Int
+  use map.Map
+
+  use frama_c_wp.memory.Memory
+
+  type malloc = map int int
+
+  predicate spec_valid_rd (m: malloc) (p: addr) (n: int) =
+    if n <= 0 then true else
+    if p.base = 0 then false else
+    0 <= p.offset /\ p.offset + n <= m[p.base]
+
+  predicate spec_valid_rw (m: malloc) (p: addr) (n: int) =
+    if n <= 0 then true else
+    if p.base <= 0 then false else
+    0 <= p.offset /\ p.offset + n <= m[p.base]
+
+  predicate invalid_assigns (m: malloc) (p: addr) (n: int) =
+    forall k. 0 <= k < n -> not (valid_rd m (shift p k) 1)
+
+  goal check_valid_rd:
+    forall m p n. spec_valid_rd m p n <-> valid_rd m p n
+
+  goal check_valid:
+    forall m p n. spec_valid_rd m p n <-> valid_rd m p n
+
+  goal invalid_spec:
+    forall m p n.
+      invalid m p n -> invalid_assigns m p n
+
+  goal invalid_null_spec:
+    forall m n p.
+      p.base = 0 -> invalid m p n -> invalid_assigns m p n
+
+  goal invalid_null:
+    forall m n p.
+      p.base = 0 -> invalid m p n
+
+  goal invalid_empty:
+    forall m p n.
+       n <= 0 -> not (invalid m p n) -> invalid_assigns m p n
+
+  goal valid_rd_null:
+    forall m n p. p.base = 0 -> (n <= 0 <-> valid_rd m p n)
+
+  goal valid_rw_null:
+    forall m n p. p.base = 0 -> (n <= 0 <-> valid_rw m p n)
+
+  goal valid_obj_null:
+    forall m n. valid_obj m null n
+
+  (* included simplifier *)
+  goal INC_P:
+    forall p q a b.
+      p = q -> (included p a q b <-> ( 0 < a -> a <= b ))
+
+  goal INC_A:
+    forall p q a b.
+      a = b -> 0 < a ->
+        (included p a q b <->
+          (p.base = q.base /\ q.offset <= p.offset /\
+           p.offset + a <= q.offset + b))
+
+  goal INC_1:
+    forall p q a b.
+      a <= 0 -> (included p a q b <-> true)
+
+  goal INC_2:
+    forall p q a b.
+      b < 0 -> (included p a q b <-> a <= 0)
+
+  goal INC_3:
+    forall p q a b.
+      not
+        (p.base = q.base /\ q.offset <= p.offset /\
+         p.offset + a <= q.offset + b) ->
+        (included p a q b <-> a <= 0)
+
+  goal INC_4:
+    forall p q a b.
+      not a <= 0 -> not b < 0 ->
+        (included p a q b <->
+          (p.base = q.base /\ q.offset <= p.offset /\
+           p.offset + a <= q.offset + b))
+
+end
diff --git a/src/plugins/wp/tests/why3/test_config_qualif b/src/plugins/wp/tests/why3/test_config_qualif
new file mode 100644
index 0000000000000000000000000000000000000000..48852719d4ee76c5006f7ed9ac20a998041f34f0
--- /dev/null
+++ b/src/plugins/wp/tests/why3/test_config_qualif
@@ -0,0 +1,4 @@
+FILEREG: .*\.why
+CMD: why3 -L ./share/why3 prove -P alt-ergo
+OPT:
+FILTER: sed -e 's|\(.*\)\( (.*)\)|\1|'
diff --git a/src/plugins/wp/tests/wp/bad_cast_call.i b/src/plugins/wp/tests/wp/bad_cast_call.i
new file mode 100644
index 0000000000000000000000000000000000000000..7b063ce71e58b945837d6100ad961d5a05a6600e
--- /dev/null
+++ b/src/plugins/wp/tests/wp/bad_cast_call.i
@@ -0,0 +1,10 @@
+/*@ axiomatic Ax { predicate Kept reads \nothing ; } */
+
+/*@ ensures Kept && \result == \null ; */
+char *m(void);
+
+void foo() {
+	char** pages = (void*)0;
+	pages = m();
+	/*@ assert MUST_FAIL: pages == \null ; */
+}
diff --git a/src/plugins/wp/tests/wp/oracle/bad_cast_call.res.oracle b/src/plugins/wp/tests/wp/oracle/bad_cast_call.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..5c7147cb293c70d7c676f44bc70825a1c67d2cbe
--- /dev/null
+++ b/src/plugins/wp/tests/wp/oracle/bad_cast_call.res.oracle
@@ -0,0 +1,20 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp/bad_cast_call.i (no preprocessing)
+[wp] Running WP plugin...
+[kernel] tests/wp/bad_cast_call.i:6: Warning: 
+  No code nor implicit assigns clause for function m, generating default assigns from the prototype
+[wp] Warning: Missing RTE guards
+[wp] tests/wp/bad_cast_call.i:8: Warning: 
+  Cast with incompatible pointers types (source: sint8*) (target: char**)
+------------------------------------------------------------
+  Function foo
+------------------------------------------------------------
+
+Goal Assertion 'MUST_FAIL' (file tests/wp/bad_cast_call.i, line 9):
+tests/wp/bad_cast_call.i:8: warning from Typed Model:
+ - Warning: Hide \result
+   Reason: Cast with incompatible pointers types (source: sint8*) (target: char**)
+Assume { (* Call 'm' *) Have: P_Kept. }
+Prove: null = pages_0.
+
+------------------------------------------------------------
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 6ccbb994cfcee29d9dfe8f05a0405b0b2a9951ea..4ad68916c5b3cb0f830792d24d54132b66bc5b08 100644
--- a/src/plugins/wp/tests/wp/oracle/stmtcompiler_test.res.oracle
+++ b/src/plugins/wp/tests/wp/oracle/stmtcompiler_test.res.oracle
@@ -352,7 +352,7 @@ new way
 main_assigns_global sequent:
    Assume {
      Have: foo_1 = 42.
-     Have: (Init_r_0=false) /\ (ta_r_0=true) /\ (ta_r_1=false).
+     Have: (ta_r_0=true) /\ (ta_r_1=false).
      Have: foo_2 = 1.
      Have: x = result_0.
      Have: x = foo_0.
@@ -370,7 +370,7 @@ Prove: foo_0 = 1.
 main_assigns_global sequent:
    Assume {
      Have: foo_1 = 42.
-     Have: (Init_r_0=false) /\ (ta_r_0=true) /\ (ta_r_1=false).
+     Have: (ta_r_0=true) /\ (ta_r_1=false).
      Have: foo_2 = 1.
      Have: x = result_0.
      Have: x = foo_0.
@@ -387,7 +387,7 @@ Prove: true.
 main_assigns_global sequent:
    Assume {
      Have: foo_1 = 42.
-     Have: (Init_r_0=false) /\ (ta_r_0=true) /\ (ta_r_1=false).
+     Have: (ta_r_0=true) /\ (ta_r_1=false).
      Have: foo_2 = 1.
      Have: x = result_0.
      Have: x = foo_0.
@@ -405,13 +405,12 @@ zloop sequent:
    Assume {
      Have: foo_0 = 42.
      Have: 0 <= x.
-     Have: (Init_i_0=false) /\ (ta_i_0=true) /\ (ta_i_1=false).
-     Have: i_1 = 0.
+     Have: (ta_i_0=true) /\ (ta_i_1=false).
+     Have: (Init_i_0=true) /\ (i_1 = 0).
      Have: (Init_i_1=true) /\ ((1 + i_1) = i_2).
      Have: i_2 <= 10.
      Have: i <= 10.
      Have: 10 <= i.
-     Have: 10 <= i.
      Have: i = 10.
      Have: 0 <= x.
      Have: foo_1 = 0.
@@ -428,13 +427,12 @@ zloop sequent:
    Assume {
      Have: foo_0 = 42.
      Have: 0 <= x.
-     Have: (Init_i_0=false) /\ (ta_i_0=true) /\ (ta_i_1=false).
-     Have: i = 0.
+     Have: (ta_i_0=true) /\ (ta_i_1=false).
+     Have: (Init_i_0=true) /\ (i = 0).
      Have: (Init_i_1=true) /\ ((1 + i) = i_1).
      Have: i_1 <= 10.
      Have: i_2 <= 10.
      Have: 10 <= i_2.
-     Have: 10 <= i_2.
      Have: i_2 = 10.
    }
 Prove: 0 <= x.
@@ -448,13 +446,12 @@ zloop sequent:
    Assume {
      Have: foo_0 = 42.
      Have: 0 <= x.
-     Have: (Init_i_0=false) /\ (ta_i_0=true) /\ (ta_i_1=false).
-     Have: i_1 = 0.
+     Have: (ta_i_0=true) /\ (ta_i_1=false).
+     Have: (Init_i_0=true) /\ (i_1 = 0).
      Have: (Init_i_1=true) /\ ((1 + i_1) = i_2).
      Have: i_2 <= 10.
      Have: i <= 10.
      Have: 10 <= i.
-     Have: 10 <= i.
    }
 Prove: i = 10.
 
@@ -467,6 +464,7 @@ zloop sequent:
    Assume {
      Have: foo_0 = 42.
      Have: 0 <= x.
+<<<<<<< HEAD
      Have: (Init_i_0=false) /\ (ta_i_0=true) /\ (ta_i_1=false).
      Have: i_1 = 0.
      Have: (Init_i_1=true) /\ ((1 + i_1) = i_2).
@@ -487,6 +485,31 @@ zloop sequent:
      Have: 0 <= x.
      Have: (Init_i_0=false) /\ (ta_i_0=true) /\ (ta_i_1=false).
      Have: i_1 = 0.
+||||||| ac7807782d
+     Have: (Init_i_0=false) /\ (ta_i_0=true) /\ (ta_i_1=false).
+     Have: i_1 = 0.
+     Have: (Init_i_1=true) /\ ((1 + i_1) = i_2).
+     Have: i_2 <= 10.
+     Have: i <= 10.
+     Have: 10 <= i.
+   }
+Prove: 10 <= i.
+
+Goal Assertion (file tests/wp/stmtcompiler_test.i, line 84):
+Prove: true.
+[Qed] Valid
+
+------------------------------------------------------------
+zloop sequent:
+   Assume {
+     Have: foo_0 = 42.
+     Have: 0 <= x.
+     Have: (Init_i_0=false) /\ (ta_i_0=true) /\ (ta_i_1=false).
+     Have: i_1 = 0.
+=======
+     Have: (ta_i_0=true) /\ (ta_i_1=false).
+     Have: (Init_i_0=true) /\ (i_1 = 0).
+>>>>>>> origin/master
      Have: (Init_i_1=true) /\ ((1 + i_1) = i).
    }
 Prove: i <= 10.
@@ -500,8 +523,8 @@ zloop sequent:
    Assume {
      Have: foo_0 = 42.
      Have: 0 <= x.
-     Have: (Init_i_0=false) /\ (ta_i_0=true) /\ (ta_i_1=false).
-     Have: i_1 = 0.
+     Have: (ta_i_0=true) /\ (ta_i_1=false).
+     Have: (Init_i_0=true) /\ (i_1 = 0).
      Have: (Init_i_1=true) /\ ((1 + i_1) = i_2).
      Have: i_2 <= 10.
      Have: i_3 <= 10.
@@ -520,13 +543,12 @@ zloop sequent:
    Assume {
      Have: foo_0 = 42.
      Have: 0 <= x.
-     Have: (Init_i_0=false) /\ (ta_i_0=true) /\ (ta_i_1=false).
-     Have: i = 0.
+     Have: (ta_i_0=true) /\ (ta_i_1=false).
+     Have: (Init_i_0=true) /\ (i = 0).
      Have: (Init_i_1=true) /\ ((1 + i) = i_1).
      Have: i_1 <= 10.
      Have: i_2 <= 10.
      Have: 10 <= i_2.
-     Have: 10 <= i_2.
      Have: i_2 = 10.
      Have: 0 <= x.
      If foo_1 = 0
diff --git a/src/plugins/wp/tests/wp/oracle_qualif/bad_cast_call.res.oracle b/src/plugins/wp/tests/wp/oracle_qualif/bad_cast_call.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..b53839a1e8eb2772778395e1630215450288bbf4
--- /dev/null
+++ b/src/plugins/wp/tests/wp/oracle_qualif/bad_cast_call.res.oracle
@@ -0,0 +1,16 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp/bad_cast_call.i (no preprocessing)
+[wp] Running WP plugin...
+[kernel] tests/wp/bad_cast_call.i:6: Warning: 
+  No code nor implicit assigns clause for function m, generating default assigns from the prototype
+[wp] Warning: Missing RTE guards
+[wp] tests/wp/bad_cast_call.i:8: Warning: 
+  Cast with incompatible pointers types (source: sint8*) (target: char**)
+[wp] 1 goal scheduled
+[wp] [Alt-Ergo] Goal typed_foo_assert_MUST_FAIL : Unsuccess (Stronger)
+[wp] Proved goals:    0 / 1
+  Alt-Ergo:        0  (unsuccess: 1)
+------------------------------------------------------------
+ Functions                 WP     Alt-Ergo  Total   Success
+  foo                       -        -        1       0.0%
+------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/assigned_not_initialized_memtyped.i b/src/plugins/wp/tests/wp_acsl/assigned_not_initialized_memtyped.i
index fa203195e799f12f2b2d1603defdec66bdb537b3..6c9a2d5554a89a7ceb890d3c51adff2ea0f9b1f2 100644
--- a/src/plugins/wp/tests/wp_acsl/assigned_not_initialized_memtyped.i
+++ b/src/plugins/wp/tests/wp_acsl/assigned_not_initialized_memtyped.i
@@ -59,4 +59,4 @@ void assigned_glob_array(void){
   for(int i = 0; i < 10; ++i){}
   //@ check FAIL: \initialized(pg_array);
   //@ check OK: \initialized(cg_array);
-}
\ No newline at end of file
+}
diff --git a/src/plugins/wp/tests/wp_acsl/block_length.i b/src/plugins/wp/tests/wp_acsl/block_length.i
index 69368580055659db183a691564fc33c29a2f8888..569060c83dfca27c964dc53c7148f89b0dd7efa8 100644
--- a/src/plugins/wp/tests/wp_acsl/block_length.i
+++ b/src/plugins/wp/tests/wp_acsl/block_length.i
@@ -27,3 +27,21 @@ struct S ts[4];
    ensures Pts1 : \block_length(&ts[1]) == 4* \block_length(&s);
  */
 void f(void){return;}
+
+/*@ // FORCE EVERYTHING IN MEMTYPED
+  requires pt == &t && pmat == &mat && px == &x && ps == &s && pts == &ts ;
+  ensures Pt: \block_length(pt) == 20*sizeof(int) ;
+  ensures Psiz1 : sizeof((*pmat)[1]) == 5*sizeof(int);
+  ensures Pmat1 : \block_length(&(*pmat)[1]) == 50*sizeof(int);
+  ensures Psiz2 : sizeof(*pmat) == 50*sizeof(int);
+  ensures Pmat2 : \block_length(pmat) == 50*sizeof(int);
+  ensures Ps : \block_length(ps) == \block_length(px) + 4*sizeof(int);
+  ensures Pts : \block_length(pts) == 4* \block_length(ps);
+
+  ensures Pt1: \block_length(&(*pt)[1]) == 20*sizeof(int) ;
+  ensures Pmat12 : \block_length(&(*pmat)[1][2]) == 50*sizeof(int);
+  ensures Pts1 : \block_length(&(*pts)[1]) == 4* \block_length(ps);
+*/
+void g(int (*pt)[20], int (*pmat)[10][5], int* px, struct S *ps, struct S (*pts)[4]){
+
+}
diff --git a/src/plugins/wp/tests/wp_acsl/generalized_checks.i b/src/plugins/wp/tests/wp_acsl/generalized_checks.i
index 3b34ced34e21bad22ab97aaefd60da416ce909d5..88b32e9f49a4bfc1c00b532287fa1563153e592e 100644
--- a/src/plugins/wp/tests/wp_acsl/generalized_checks.i
+++ b/src/plugins/wp/tests/wp_acsl/generalized_checks.i
@@ -64,3 +64,17 @@ int caller(int x)
 {
   return job(x); // CA2 is not proved
 }
+
+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/src/plugins/wp/tests/wp_acsl/inductive.i b/src/plugins/wp/tests/wp_acsl/inductive.i
index 5f3e2839f7510e61334ea67efb2550442f5a5b64..d55c56546d1153428145b8dfc8f73a5f7e64118c 100644
--- a/src/plugins/wp/tests/wp_acsl/inductive.i
+++ b/src/plugins/wp/tests/wp_acsl/inductive.i
@@ -65,4 +65,4 @@ typedef struct _list { int element; struct _list* next; } list;
   same_elements{L1, L2}(a, b, b1, e1) ==>
   same_elements{L2, L3}(b, a, b2, e2) ==>
     \false ;
-*/
\ No newline at end of file
+*/
diff --git a/src/plugins/wp/tests/wp_acsl/initialized_local_init.i b/src/plugins/wp/tests/wp_acsl/initialized_local_init.i
new file mode 100644
index 0000000000000000000000000000000000000000..3fe1467bc0fc358b7ca5ad95a300ae2e3d4971d3
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/initialized_local_init.i
@@ -0,0 +1,19 @@
+void l_int(void){
+  int x = 1 ;
+  //@ assert SUCCS: x == 1;
+  //@ assert SUCCS: \initialized(&x);
+  //@ check FAILS: \false ;
+}
+void l_array(void){
+  int x[3] = { 0 } ;
+  //@ assert SUCCS: x[0] == x[1] == x[2] == 0 ;
+  //@ assert SUCCS: \initialized(&x);
+  //@ check FAILS: \false ;
+}
+typedef struct { int x ; char t[2] ; } S;
+void l_struct(void){
+  S s = { 0 };
+  //@ assert SUCCS: s.x == s.t[0] == s.t[1] == 0 ;
+  //@ assert SUCCS: \initialized(&s);
+  //@ check FAILS: \false ;
+}
diff --git a/src/plugins/wp/tests/wp_acsl/initialized_memtyped.i b/src/plugins/wp/tests/wp_acsl/initialized_memtyped.i
index b9a70c9c0fa1f8ffb2e4608de7074eac98495b30..2968325323b4f5d4dbcae428ac391914c044d9ac 100644
--- a/src/plugins/wp/tests/wp_acsl/initialized_memtyped.i
+++ b/src/plugins/wp/tests/wp_acsl/initialized_memtyped.i
@@ -81,4 +81,10 @@ void formal(int x)
 {
 	int * p = &x ;
 	//@ assert provable: \initialized(p);
-}
\ No newline at end of file
+}
+
+void ptr_on_local(void){
+  int x[3] = {0} ;
+  int *p = x ;
+  //@ assert provable: \initialized(p + (0..2));
+}
diff --git a/src/plugins/wp/tests/wp_acsl/initialized_shift_array.i b/src/plugins/wp/tests/wp_acsl/initialized_shift_array.i
new file mode 100644
index 0000000000000000000000000000000000000000..9fd5ed15b2f46b36c1baa9295f3a3cad52f4c1c8
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/initialized_shift_array.i
@@ -0,0 +1,56 @@
+/*@
+  requires \initialized(buf + (0 .. count - 1));
+*/
+int test(char *buf, int count);
+
+// Success:
+
+void succ_full_first_cell(void){
+  char buf[3] = {0};
+  test(buf    , 1);
+}
+void succ_full_full(void){
+  char buf[3] = {0};
+	test(&buf[0], 3);
+}
+void succ_full_from_1(void){
+  char buf[3] = {0};
+	test(buf+1  , 2);
+}
+void succ_from_1_from_1(void){
+  char buf[3];
+	buf[1] = buf[2] = 1 ;
+	test(buf+1  , 2);
+}
+void succ_full_from_2(void){
+  char buf[3] = {0};
+	test(&buf[2], 1);
+}
+
+// Failure:
+
+void fail_cell_before(void){
+  char buf[3] = {0};
+	test(buf-1  , 1);
+}
+void fail_too_long(void){
+  char buf[3] = {0};
+	test(buf    , 4);
+}
+void fail_too_long_from_1(void){
+  char buf[3] = {0};
+	test(&buf[1], 3);
+}
+void fail_too_long_from_2(void){
+  char buf[3] = {0};
+  test(buf+2  , 2);
+}
+void fail_cell_after_end(void){
+  char buf[3] = {0};
+	test(buf+3  , 1);
+}
+void fail_partial_not_full(void){
+  char buf[3];
+	buf[0] = buf[1] = 0;
+	test(&buf[0], 3);
+}
diff --git a/src/plugins/wp/tests/wp_acsl/invalid_pointer.c b/src/plugins/wp/tests/wp_acsl/invalid_pointer.c
index 14e08fdd4b9061d204f19f7699b5b58dea6492e8..b1e5a2f0f9ad8cd393ff689c00afb36926be0c0b 100644
--- a/src/plugins/wp/tests/wp_acsl/invalid_pointer.c
+++ b/src/plugins/wp/tests/wp_acsl/invalid_pointer.c
@@ -9,6 +9,8 @@ void memvar(void)
   //@check P2:  !\object_pointer(&x+2);
 }
 
+//@ logic char* GET = \null ;
+
 void pointer(void)
 {
   int x;
@@ -18,7 +20,8 @@ void pointer(void)
   //@check P0:   \object_pointer(p);
   //@check P1:   \object_pointer(p+1);
   //@check P2:  !\object_pointer(p+2);
-  //@check NULL: \object_pointer(\null);
+  //@check qed_NULL: \object_pointer(\null);
+  //@check prover_NULL: \object_pointer(GET);
 }
 
 void array(void)
diff --git a/src/plugins/wp/tests/wp_acsl/issue_A228.c b/src/plugins/wp/tests/wp_acsl/issue_A228.c
new file mode 100644
index 0000000000000000000000000000000000000000..42d685b222fe18da00e9ca126b96c194e4da1cc5
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/issue_A228.c
@@ -0,0 +1,34 @@
+Bool A, B;
+
+/*@
+  ensures GOAL: \result ≡ 255;
+ */
+unsigned job(void)
+{
+  _Bool a0;
+  _Bool a1;
+  _Bool a2;
+  _Bool a3;
+  _Bool a4;
+  _Bool a5;
+  _Bool a6;
+  _Bool a7;
+  a0 = 1;
+  a1 = 1;
+  a2 = 1;
+  a4 = 1;
+  a3 = 1;
+  a5 = 1;
+  a6 = A;
+  a7 = B;
+  //*integrity_tests =
+  return
+    ((unsigned int)a0 << 0) |
+    ((unsigned int)a1 << 1) |
+    ((unsigned int)a2 << 2) |
+    ((unsigned int)a3 << 3) |
+    ((unsigned int)a4 << 4) |
+    ((unsigned int)a5 << 5) |
+    ((unsigned int)a6 << 6) |
+    ((unsigned int)a7 << 7);
+}
diff --git a/src/plugins/wp/tests/wp_acsl/null.c b/src/plugins/wp/tests/wp_acsl/null.c
deleted file mode 100644
index 62bcf566c7cf2af918325763e88facb763e04bef..0000000000000000000000000000000000000000
--- a/src/plugins/wp/tests/wp_acsl/null.c
+++ /dev/null
@@ -1,13 +0,0 @@
-
-#define NULL ((void*)0)
-
-//@ ensures \result == 0;
-int null_is_zero (void) {
-  void * p = NULL;
-  return (int) p;
-} 
-
-/*@ lemma valid_non_null:      !\valid     ((char *)\null); */
-/*@ lemma valid_read_non_null: !\valid_read((char *)\null); */
-
-
diff --git a/src/plugins/wp/tests/wp_acsl/null.i b/src/plugins/wp/tests/wp_acsl/null.i
new file mode 100644
index 0000000000000000000000000000000000000000..7f84ed13cc1de68b2dffe4647e1ce27150adf6c7
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/null.i
@@ -0,0 +1,33 @@
+
+//@ ensures \result == 0;
+int null_is_zero (void) {
+  void * p = (void*)0;
+  return (int) p;
+}
+
+/*@ lemma qed_not_valid_null:      !\valid     ((char *)\null); */
+/*@ lemma qed_not_valid_read_null: !\valid_read((char *)\null); */
+
+/*@ logic char* GET = \null ; */
+/*@ lemma prover_not_valid_null:      !\valid     ((char *)GET); */
+/*@ lemma prover_not_valid_read_null: !\valid_read((char *)GET); */
+
+
+// Prove null invalidity:
+
+//@ assigns *p;
+void qed_f(char *p);
+
+/*@ assigns \nothing; */
+void qed(){
+  qed_f(0);
+}
+
+//@ assigns *p;
+void prover_f(char *p);
+
+/*@ requires x == GET;
+    assigns \nothing; */
+void prover(char *x){
+  prover_f(x);
+}
diff --git a/src/plugins/wp/tests/wp_acsl/opaque_struct.i b/src/plugins/wp/tests/wp_acsl/opaque_struct.i
new file mode 100644
index 0000000000000000000000000000000000000000..208ef8612069f9516f4c82afe5911ebecf5ea455
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/opaque_struct.i
@@ -0,0 +1,65 @@
+struct S;
+
+extern struct S S1;
+extern struct S S2;
+
+/*@ axiomatic test{
+  @ check lemma fail: S1 == S2;
+  @ check lemma succeed_L1: S1 == S1;
+  @ check lemma succeed_L2: \block_length(&S1) >= 0;
+}*/
+
+/*@ assigns S1; */
+void f(void);
+
+void assigns(void){
+  f();
+  //@ check fail: S1 == \at(S1,Pre);
+  //@ check succeed: S2 == \at(S2,Pre);
+}
+
+struct S* p ;
+
+//@ assigns *p ;
+void g(void);
+
+/*@ requires \initialized(p); 
+    requires \valid(p);
+*/
+void initialized_assigns(void){
+  g();
+  //@ check succeed: \initialized(p);
+  //@ check succeed: \block_length(p) >= 0;
+  
+  // while it can be proved in Coq, this is currently
+  // too indirect for solvers.
+  // @ check succeed: \block_length(p) >= \block_length(&S1);
+}
+
+/*@ requires ! \initialized(p); */
+void uninitialized_assigns(void){
+  g();
+  /* NOTE:
+     both shoud FAIL as we cannot prove that:
+     - it is still uninitialized,
+     - it has been initialized.
+  */
+  //@ check fail: ! \initialized(p);
+  //@ check fail:   \initialized(p);
+}
+
+void assigned_via_pointer(void){
+  g();
+  //@ check fail: \at(*p, Here) == \at(*p, Pre);
+}
+
+//@ assigns *a ;
+void assign(struct S *a);
+
+//@ requires \separated(a, c);
+void assigns_effect(int* p, float* q, char* c, struct S *a){
+  assign(a);
+  //@ check fail: *p == \at(*p, Pre);
+  //@ check fail: *q == \at(*q, Pre);
+  //@ check succeed: *c == \at(*c, Pre);
+}
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 ebb140fe82bf4b365a6f6e112171998d29f86122..08fa8dba12236a1c3855a7be88327b9a7585a3e1 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
@@ -17,7 +17,7 @@ Assume {
   (* Else *)
   Have: 10 <= i.
 }
-Prove: IsInitArray1_int(array_0, 10, a).
+Prove: IsInitArray_sint32(array_0, 10, a).
 
 ------------------------------------------------------------
 ------------------------------------------------------------
@@ -37,7 +37,7 @@ Assume {
   (* Else *)
   Have: 10 <= i.
 }
-Prove: IsInitArray1_int(pg_array_0, 10, a_1).
+Prove: IsInitArray_sint32(pg_array_0, 10, a_1).
 
 ------------------------------------------------------------
 
@@ -54,7 +54,7 @@ Assume {
   (* Else *)
   Have: 10 <= i.
 }
-Prove: IsInitArray1_int(a, 10, a_2).
+Prove: IsInitArray_sint32(a, 10, a_2).
 
 ------------------------------------------------------------
 ------------------------------------------------------------
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 d8c07c96939fba09fe173ff7b690274e35b66ac2..067bd24c6b552dd3570d2f9caf30d5a7dec933f7 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
@@ -97,7 +97,8 @@ Effect at line 20
 Prove: true.
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'job':
-  /*@ behavior typed:
+[wp] tests/wp_acsl/assigns_path.i:12: Warning: 
+  Memory model hypotheses for function 'job':
+  /*@ behavior wp_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 3f1a76b4e7c2cdafd0b00bd618409f66d1bbfe43..f06695c9f125f82f6b716b56813b8ea9009772d6 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
@@ -92,7 +92,7 @@ Goal Instance of 'Pre-condition (file assigns_range.i, line 23) in 'assigns_t4_s
 Assume {
   Type: is_sint32(i) /\ is_sint32(j).
   (* Heap *)
-  Type: IsArray1_sint32(t2_0) /\ IsArray1_sint32(t3_0).
+  Type: IsArray_sint32(t2_0) /\ IsArray_sint32(t3_0).
   (* Pre-condition *)
   Have: (0 <= i) /\ (i <= j) /\ (j <= 19).
   (* Call 'assigns_t1_an_element' *)
@@ -153,7 +153,7 @@ Call Effect at line 57
 Assume {
   Type: is_sint32(i).
   (* Heap *)
-  Type: IsArray1_sint32(t2_0).
+  Type: IsArray_sint32(t2_0).
   (* Goal *)
   When: ((-2) <= i) /\ (i <= 19).
   (* Pre-condition *)
@@ -173,7 +173,7 @@ Call Effect at line 57
 Assume {
   Type: is_sint32(i).
   (* Heap *)
-  Type: IsArray1_sint32(t2_0).
+  Type: IsArray_sint32(t2_0).
   (* Goal *)
   When: ((-2) <= i) /\ (i <= 19).
   (* Pre-condition *)
@@ -204,7 +204,7 @@ Call Effect at line 65
 Assume {
   Type: is_sint32(i) /\ is_sint32(j).
   (* Heap *)
-  Type: IsArray1_sint32(t4_0).
+  Type: IsArray_sint32(t4_0).
   (* Goal *)
   When: 0 <= j.
   (* Pre-condition *)
@@ -222,7 +222,7 @@ Call Effect at line 65
 Assume {
   Type: is_sint32(i) /\ is_sint32(j).
   (* Heap *)
-  Type: IsArray1_sint32(t4_0).
+  Type: IsArray_sint32(t4_0).
   (* Goal *)
   When: 0 <= j.
   (* Pre-condition *)
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 c483a78ae3010fec77ea340f92f2a96757e791cd..94375b5a57ec197265f24a3e502b380497209296 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
@@ -55,3 +55,64 @@ Goal Post-condition 'Pts1' in 'f':
 Prove: true.
 
 ------------------------------------------------------------
+------------------------------------------------------------
+  Function g
+------------------------------------------------------------
+
+Goal Post-condition 'Pt' in 'g':
+Assume { (* Heap *) Type: linked(Malloc_0). }
+Prove: (Malloc_0[G_t_20] / 20) = 1.
+
+------------------------------------------------------------
+
+Goal Post-condition 'Psiz1' in 'g':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Post-condition 'Pmat1' in 'g':
+Assume { (* Heap *) Type: linked(Malloc_0). }
+Prove: (Malloc_0[G_mat_21] / 5) = 10.
+
+------------------------------------------------------------
+
+Goal Post-condition 'Psiz2' in 'g':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Post-condition 'Pmat2' in 'g':
+Assume { (* Heap *) Type: linked(Malloc_0). }
+Prove: (Malloc_0[G_mat_21] / 50) = 1.
+
+------------------------------------------------------------
+
+Goal Post-condition 'Ps' in 'g':
+Assume { (* Heap *) Type: linked(Malloc_0). }
+Prove: (4 + Malloc_0[G_x_22]) = (5 * (Malloc_0[G_s_23] / 5)).
+
+------------------------------------------------------------
+
+Goal Post-condition 'Pts' in 'g':
+Assume { (* Heap *) Type: linked(Malloc_0). }
+Prove: (Malloc_0[G_ts_24] / 20) = (Malloc_0[G_s_23] / 5).
+
+------------------------------------------------------------
+
+Goal Post-condition 'Pt1' in 'g':
+Assume { (* Heap *) Type: linked(Malloc_0). }
+Prove: Malloc_0[G_t_20] = 20.
+
+------------------------------------------------------------
+
+Goal Post-condition 'Pmat12' in 'g':
+Assume { (* Heap *) Type: linked(Malloc_0). }
+Prove: Malloc_0[G_mat_21] = 50.
+
+------------------------------------------------------------
+
+Goal Post-condition 'Pts1' in 'g':
+Assume { (* Heap *) Type: linked(Malloc_0). }
+Prove: (Malloc_0[G_ts_24] / 5) = (4 * (Malloc_0[G_s_23] / 5)).
+
+------------------------------------------------------------
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 be38a06db10fb4ee9ff2fd55527e002fc0699e7f..2191c2a5cf37fff75a2be2468cfefea97007bcb9 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
@@ -31,7 +31,7 @@ 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: IsArray1_sint8(x) /\ is_sint16_chunk(Mint_1) /\
+  Type: IsArray_sint8(x) /\ is_sint16_chunk(Mint_1) /\
       is_sint32_chunk(Mint_3) /\ is_sint64_chunk(Mint_5) /\
       is_sint8_chunk(Mchar_0) /\ is_uint16_chunk(Mint_2) /\
       is_uint32_chunk(Mint_4) /\ is_uint64_chunk(Mint_6) /\
@@ -1876,9 +1876,10 @@ Goal Positivity of Loop variant at loop (file chunk_typing.i, line 44):
 Prove: true.
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'function':
+[wp] tests/wp_acsl/chunk_typing.i:21: Warning: 
+  Memory model hypotheses for function 'function':
   /*@
-     behavior typed:
+     behavior wp_typed:
        requires \separated(i16 + (..), (char const *)x + (..));
        requires \separated(i32 + (..), (char const *)x + (..));
        requires \separated(i64 + (..), (char const *)x + (..));
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 1427dc4b7f1f4508815afa3d9a82f01673045b3c..35eb842490f12e75ccd01ad6ab1552f0f7e772a6 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/equal.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/equal.res.oracle
@@ -10,10 +10,10 @@ Goal Post-condition (file equal.i, line 22) in 'simple_array':
 Let x = t0_0[0].
 Let x_1 = t0_0[1].
 Assume {
-  Type: IsArray1_sint32(t0_0) /\ IsArray1_sint32(t1_0) /\ is_sint32(x) /\
+  Type: IsArray_sint32(t0_0) /\ IsArray_sint32(t1_0) /\ is_sint32(x) /\
       is_sint32(x_1).
 }
-Prove: EqArray1_int(2, t0_0, t1_0[0 <- x][1 <- x_1]).
+Prove: EqArray_int(2, t0_0, t1_0[0 <- x][1 <- x_1]).
 
 ------------------------------------------------------------
 ------------------------------------------------------------
@@ -32,10 +32,10 @@ Goal Post-condition (file equal.i, line 28) in 'with_array_struct':
 Let a = st0_0.F2_St_tab.
 Let a_1 = st1_0.F2_St_tab.
 Assume {
-  Type: IsS2_St(st0_0) /\ IsS2_St(st1_0) /\ IsArray1_sint32(a) /\
-      IsArray1_sint32(a_1).
+  Type: IsS2_St(st0_0) /\ IsS2_St(st1_0) /\ IsArray_sint32(a) /\
+      IsArray_sint32(a_1).
   (* Goal *)
-  When: EqArray1_int(10, a, a_1).
+  When: EqArray_int(10, a, a_1).
 }
 Prove: EqS2_St(st0_0, st1_0).
 
@@ -52,12 +52,12 @@ Let a_3 = q1_0.F4_Q_qs.
 Let a_4 = q0_0.F4_Q_qt.
 Let a_5 = q1_0.F4_Q_qt.
 Assume {
-  Type: IsS4_Q(q0_0) /\ IsS4_Q(q1_0) /\ IsArray1_sint32(a_4) /\
-      IsArray1_sint32(a_5) /\ IsS1_S(a_2) /\ IsS1_S(a_3).
+  Type: IsS4_Q(q0_0) /\ IsS4_Q(q1_0) /\ IsArray_sint32(a_4) /\
+      IsArray_sint32(a_5) /\ IsS1_S(a_2) /\ IsS1_S(a_3).
   (* Heap *)
   Type: (region(a_1.base) <= 0) /\ (region(a.base) <= 0).
   (* Goal *)
-  When: (a = a_1) /\ EqS1_S(a_2, a_3) /\ EqArray1_int(2, a_4, a_5).
+  When: (a = a_1) /\ EqS1_S(a_2, a_3) /\ EqArray_int(2, a_4, a_5).
 }
 Prove: EqS4_Q(q0_0, q1_0).
 
@@ -74,7 +74,7 @@ Assume {
   (* Goal *)
   When: forall i : Z. ((0 <= i) -> ((i <= 4) -> (tp1_0[i] = tp0_0[i]))).
 }
-Prove: EqArray1_pointer(5, tp0_0, tp1_0).
+Prove: EqArray_ptr(5, tp0_0, tp1_0).
 
 ------------------------------------------------------------
 ------------------------------------------------------------
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 af1aedabde197f1fbbc2119319f78ac294f57320..fe11d7a499e2ad624b4f73b192f32eeb5ce1e971 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
@@ -20,7 +20,7 @@ Let x = G[0].
 Assume {
   Type: is_sint32(i) /\ is_sint32(x) /\ is_sint32(G[1]).
   (* Heap *)
-  Type: IsArray1_sint32(G).
+  Type: IsArray_sint32(G).
   If i <= 3
   Then { (* Else *) Have: G[i] = 0. }
 }
@@ -36,7 +36,7 @@ Let x = G[0].
 Assume {
   Type: is_sint32(i) /\ is_sint32(x).
   (* Heap *)
-  Type: IsArray1_sint32(G).
+  Type: IsArray_sint32(G).
   (* Goal *)
   When: (x != 0) /\ (G[1] = 0).
   If i <= 3
@@ -62,7 +62,7 @@ Let x = G[0].
 Assume {
   Type: is_sint32(i) /\ is_sint32(x) /\ is_sint32(G[1]).
   (* Heap *)
-  Type: IsArray1_sint32(G).
+  Type: IsArray_sint32(G).
   If i <= 3
   Then { (* Else *) Have: G[i] = 0. }
 }
@@ -78,7 +78,7 @@ Let x = G[0].
 Assume {
   Type: is_sint32(i) /\ is_sint32(x).
   (* Heap *)
-  Type: IsArray1_sint32(G).
+  Type: IsArray_sint32(G).
   (* Goal *)
   When: (x != 0) /\ (G[1] = 0).
   If i <= 3
@@ -104,7 +104,7 @@ Let x = G[0].
 Assume {
   Type: is_sint32(i) /\ is_sint32(x) /\ is_sint32(G[1]).
   (* Heap *)
-  Type: IsArray1_sint32(G).
+  Type: IsArray_sint32(G).
   If i <= 3
   Then { (* Else *) Have: G[i] = 0. }
 }
@@ -120,7 +120,7 @@ Let x = G[0].
 Assume {
   Type: is_sint32(i) /\ is_sint32(x).
   (* Heap *)
-  Type: IsArray1_sint32(G).
+  Type: IsArray_sint32(G).
   (* Goal *)
   When: (x != 0) /\ (G[1] = 0).
   If i <= 3
@@ -134,3 +134,18 @@ Goal Loop assigns 'qed_ok':
 Prove: true.
 
 ------------------------------------------------------------
+[wp] tests/wp_acsl/funvar_inv.i:26: Warning: 
+  Memory model hypotheses for function 'f':
+  /*@ behavior wp_hoare:
+        ensures \separated(\result, (int *)G + (..)); */
+  int *f(void);
+[wp] tests/wp_acsl/funvar_inv.i:40: Warning: 
+  Memory model hypotheses for function 'f2':
+  /*@ behavior wp_hoare:
+        ensures \separated(\result, (int *)G + (..)); */
+  int *f2(void);
+[wp] tests/wp_acsl/funvar_inv.i:55: Warning: 
+  Memory model hypotheses for function 'g':
+  /*@ behavior wp_hoare:
+        ensures \separated(\result, (int *)G + (..)); */
+  int *g(void);
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/generalized_checks.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/generalized_checks.res.oracle
index 46ee59467ebb774e30443da27b70545a942e428a..691cf9dd8b631374d7c527ced29fd1240f159bd9 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/generalized_checks.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/generalized_checks.res.oracle
@@ -1,7 +1,13 @@
 # frama-c -wp [...]
 [kernel] Parsing generalized_checks.i (no preprocessing)
 [wp] Running WP plugin...
+[wp] tests/wp_acsl/generalized_checks.i:68: Warning: 
+  Unsupported generalized invariant, use loop invariant instead.
+  Ignored invariant 
+  check invariant \true;
 [wp] Warning: Missing RTE guards
+[wp] tests/wp_acsl/generalized_checks.i:75: Warning: 
+  Missing assigns clause (assigns 'everything' instead)
 ------------------------------------------------------------
   Axiomatic 'Th'
 ------------------------------------------------------------
@@ -136,3 +142,28 @@ Call Result at line 52
 Prove: true.
 
 ------------------------------------------------------------
+------------------------------------------------------------
+  Function loop
+------------------------------------------------------------
+
+Goal Preservation of Invariant 'false_but_preserved' (file tests/wp_acsl/generalized_checks.i, line 70):
+Assume { Type: is_sint32(i). (* Then *) Have: i <= 9. }
+Prove: false.
+
+------------------------------------------------------------
+
+Goal Establishment of Invariant 'false_but_preserved' (file tests/wp_acsl/generalized_checks.i, line 70):
+Prove: false.
+
+------------------------------------------------------------
+
+Goal Check 'implied_by_false_invariant' (file tests/wp_acsl/generalized_checks.i, line 74):
+Assume { Type: is_sint32(i). (* Else *) Have: 10 <= i. }
+Prove: false.
+
+------------------------------------------------------------
+
+Goal Loop assigns (file tests/wp_acsl/generalized_checks.i, line 71):
+Prove: true.
+
+------------------------------------------------------------
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 fc9b88c34af4dfba1468b4feb8b92e245b22a7d8..691c3847180ba24d03ef5add64ff3b6aa295330c 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
@@ -10,7 +10,7 @@
 
 Goal Post-condition 'KO' in 'extra':
 Let x = A[2].
-Assume { Type: is_sint32(x). (* Heap *) Type: IsArray1_sint32(A). }
+Assume { Type: is_sint32(x). (* Heap *) Type: IsArray_sint32(A). }
 Prove: x = 12.
 
 ------------------------------------------------------------
@@ -29,7 +29,7 @@ Prove: true.
 Goal Post-condition 'OK' in 'job':
 Let x = A[2].
 Assume {
-  Type: IsArray1_sint32(A) /\ IsArray1_sint32(A_1) /\ is_sint32(x).
+  Type: IsArray_sint32(A) /\ IsArray_sint32(A_1) /\ is_sint32(x).
   (* Initializer *)
   Init: A_1[0] = 10.
   (* Initializer *)
@@ -39,7 +39,7 @@ Assume {
   (* Initializer *)
   Init: forall i : Z. ((3 <= i) -> ((i <= 19) -> (A_1[i] = 0))).
   (* Pre-condition *)
-  Have: EqArray1_int(20, A, A_1).
+  Have: EqArray_int(20, A, A_1).
 }
 Prove: x = 12.
 
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 1cf376f224d14db9690e01b14328c29d918b8e6c..6071ee00dc7180186cdb32f3429492cf6da89d2b 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
@@ -14,7 +14,7 @@ Let x_3 = ta1_0[3].
 Assume {
   Type: is_sint32(x_1) /\ is_sint32(x_2) /\ is_sint32(x_3) /\ is_sint32(x).
   (* Heap *)
-  Type: IsArray1_sint32(ta1_0).
+  Type: IsArray_sint32(ta1_0).
   (* Initializer *)
   Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (ta1_0[i] = 0))).
   (* Initializer *)
@@ -34,7 +34,7 @@ Assume {
   Type: is_sint32(ta1_0[0]) /\ is_sint32(ta1_0[1]) /\ is_sint32(ta1_0[3]) /\
       is_sint32(x).
   (* Heap *)
-  Type: IsArray1_sint32(ta1_0).
+  Type: IsArray_sint32(ta1_0).
   (* Initializer *)
   Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (ta1_0[i] = 0))).
   (* Initializer *)
@@ -55,7 +55,7 @@ Assume {
   Type: is_sint32(ta1_0[0]) /\ is_sint32(ta1_0[1]) /\ is_sint32(x_1) /\
       is_sint32(x).
   (* Heap *)
-  Type: IsArray1_sint32(ta1_0).
+  Type: IsArray_sint32(ta1_0).
   (* Initializer *)
   Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (ta1_0[i] = 0))).
   (* Initializer *)
@@ -79,7 +79,7 @@ Let x_2 = ta2_0[4].
 Assume {
   Type: is_sint32(x) /\ is_sint32(x_1) /\ is_sint32(x_2).
   (* Heap *)
-  Type: IsArray1_sint32(ta2_0).
+  Type: IsArray_sint32(ta2_0).
   (* Initializer *)
   Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (ta2_0[i] = 0))).
   (* Initializer *)
@@ -96,7 +96,7 @@ Let x = ta2_0[4].
 Assume {
   Type: is_sint32(ta2_0[0]) /\ is_sint32(ta2_0[1]) /\ is_sint32(x).
   (* Heap *)
-  Type: IsArray1_sint32(ta2_0).
+  Type: IsArray_sint32(ta2_0).
   (* Initializer *)
   Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (ta2_0[i] = 0))).
   (* Initializer *)
@@ -113,7 +113,7 @@ Let x = ta2_0[1].
 Assume {
   Type: is_sint32(ta2_0[0]) /\ is_sint32(x) /\ is_sint32(ta2_0[4]).
   (* Heap *)
-  Type: IsArray1_sint32(ta2_0).
+  Type: IsArray_sint32(ta2_0).
   (* Initializer *)
   Init: forall i : Z. ((0 <= i) -> ((i <= 1) -> (ta2_0[i] = 0))).
   (* Initializer *)
@@ -137,8 +137,8 @@ Assume {
   Type: is_sint32(x_1) /\ is_sint32(x) /\ is_sint32(ta2_0[4]) /\
       is_sint32(x_2) /\ is_sint32(x_3).
   (* Heap *)
-  Type: IsArray1_sint32(ta1_0) /\ IsArray1_sint32(ta2_0) /\
-      IsArray1_sint32(ta3_0).
+  Type: IsArray_sint32(ta1_0) /\ IsArray_sint32(ta2_0) /\
+      IsArray_sint32(ta3_0).
   (* Initializer *)
   Init: forall i : Z. ((i <= 0) -> ((0 <= i) -> (ta3_0[i] = 0))).
   (* Initializer *)
@@ -176,8 +176,8 @@ Assume {
   Type: is_sint32(x_1) /\ is_sint32(x) /\ is_sint32(ta2_0[4]) /\
       is_sint32(x_2) /\ is_sint32(ta3_0[2]).
   (* Heap *)
-  Type: IsArray1_sint32(ta1_0) /\ IsArray1_sint32(ta2_0) /\
-      IsArray1_sint32(ta3_0).
+  Type: IsArray_sint32(ta1_0) /\ IsArray_sint32(ta2_0) /\
+      IsArray_sint32(ta3_0).
   (* Initializer *)
   Init: forall i : Z. ((i <= 0) -> ((0 <= i) -> (ta3_0[i] = 0))).
   (* Initializer *)
@@ -215,8 +215,8 @@ Assume {
   Type: is_sint32(x_1) /\ is_sint32(x) /\ is_sint32(ta2_0[4]) /\
       is_sint32(ta3_0[0]) /\ is_sint32(x_2).
   (* Heap *)
-  Type: IsArray1_sint32(ta1_0) /\ IsArray1_sint32(ta2_0) /\
-      IsArray1_sint32(ta3_0).
+  Type: IsArray_sint32(ta1_0) /\ IsArray_sint32(ta2_0) /\
+      IsArray_sint32(ta3_0).
   (* Initializer *)
   Init: forall i : Z. ((i <= 0) -> ((0 <= i) -> (ta3_0[i] = 0))).
   (* Initializer *)
@@ -254,8 +254,8 @@ Assume {
   Type: is_sint32(x_1) /\ is_sint32(x) /\ is_sint32(x_2) /\
       is_sint32(ta3_0[0]) /\ is_sint32(ta3_0[2]).
   (* Heap *)
-  Type: IsArray1_sint32(ta1_0) /\ IsArray1_sint32(ta2_0) /\
-      IsArray1_sint32(ta3_0).
+  Type: IsArray_sint32(ta1_0) /\ IsArray_sint32(ta2_0) /\
+      IsArray_sint32(ta3_0).
   (* Initializer *)
   Init: forall i : Z. ((i <= 0) -> ((0 <= i) -> (ta3_0[i] = 0))).
   (* Initializer *)
@@ -300,7 +300,7 @@ Assume {
   Type: IsS5(a_1) /\ IsS5(a_2) /\ IsS5(a_3) /\ is_sint32(a_1.F5_a) /\
       is_sint32(x_2) /\ is_sint32(x_1) /\ is_sint32(x).
   (* Heap *)
-  Type: IsArray1S5(ts1_0).
+  Type: IsArray_S5(ts1_0).
   (* Initializer *)
   Init: forall i : Z. let a_4 = ts1_0[i] in ((0 <= i) -> ((i <= 1) ->
       (((a_4.F5_a) = 0) /\ ((a_4.F5_b) = 0) /\ ((a_4.F5_c) = 0)))).
@@ -329,7 +329,7 @@ Assume {
       is_sint32(a_1.F5_a) /\ is_sint32(x_2) /\ is_sint32(x_1) /\
       is_sint32(x).
   (* Heap *)
-  Type: IsArray1S5(ts1_0).
+  Type: IsArray_S5(ts1_0).
   (* Initializer *)
   Init: forall i : Z. let a_2 = ts1_0[i] in ((0 <= i) -> ((i <= 1) ->
       (((a_2.F5_a) = 0) /\ ((a_2.F5_b) = 0) /\ ((a_2.F5_c) = 0)))).
@@ -358,7 +358,7 @@ Assume {
   Type: IsS5(a_1) /\ IsS5(ts1_0[1]) /\ IsS5(ts1_0[3]) /\ is_sint32(x_3) /\
       is_sint32(x_2) /\ is_sint32(x_1) /\ is_sint32(x).
   (* Heap *)
-  Type: IsArray1S5(ts1_0).
+  Type: IsArray_S5(ts1_0).
   (* Initializer *)
   Init: forall i : Z. let a_2 = ts1_0[i] in ((0 <= i) -> ((i <= 1) ->
       (((a_2.F5_a) = 0) /\ ((a_2.F5_b) = 0) /\ ((a_2.F5_c) = 0)))).
@@ -402,10 +402,9 @@ Assume {
       is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\
       is_sint32(a_1) /\ is_sint32(a[5]).
   (* Heap *)
-  Type: IsArray1_sint32(t) /\ IsArray1_sint32(t1_0) /\
-      IsArray1_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\
-      IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\
-      IsS3_Sc(sq0_0) /\ IsU4_U(u).
+  Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\
+      IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\
+      IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u).
   (* Initializer *)
   Init: x_5 = (-1).
   (* Initializer *)
@@ -512,10 +511,9 @@ Assume {
       is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\
       is_sint32(a_1) /\ is_sint32(a[5]).
   (* Heap *)
-  Type: IsArray1_sint32(t) /\ IsArray1_sint32(t1_0) /\
-      IsArray1_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\
-      IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\
-      IsS3_Sc(sq0_0) /\ IsU4_U(u).
+  Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\
+      IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\
+      IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u).
   (* Initializer *)
   Init: x_5 = (-1).
   (* Initializer *)
@@ -622,10 +620,9 @@ Assume {
       is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\
       is_sint32(a_1) /\ is_sint32(a[5]).
   (* Heap *)
-  Type: IsArray1_sint32(t) /\ IsArray1_sint32(t1_0) /\
-      IsArray1_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\
-      IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\
-      IsS3_Sc(sq0_0) /\ IsU4_U(u).
+  Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\
+      IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\
+      IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u).
   (* Initializer *)
   Init: x_5 = (-1).
   (* Initializer *)
@@ -733,10 +730,9 @@ Assume {
       is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\
       is_sint32(a_1) /\ is_sint32(a[5]).
   (* Heap *)
-  Type: IsArray1_sint32(t) /\ IsArray1_sint32(t1_0) /\
-      IsArray1_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\
-      IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\
-      IsS3_Sc(sq0_0) /\ IsU4_U(u).
+  Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\
+      IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\
+      IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u).
   (* Initializer *)
   Init: x_5 = (-1).
   (* Initializer *)
@@ -844,10 +840,9 @@ Assume {
       is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\
       is_sint32(a_1) /\ is_sint32(a_8).
   (* Heap *)
-  Type: IsArray1_sint32(t) /\ IsArray1_sint32(t1_0) /\
-      IsArray1_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\
-      IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\
-      IsS3_Sc(sq0_0) /\ IsU4_U(u).
+  Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\
+      IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\
+      IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u).
   (* Initializer *)
   Init: x_5 = (-1).
   (* Initializer *)
@@ -954,10 +949,9 @@ Assume {
       is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\
       is_sint32(a_1) /\ is_sint32(a[5]).
   (* Heap *)
-  Type: IsArray1_sint32(t) /\ IsArray1_sint32(t1_0) /\
-      IsArray1_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\
-      IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\
-      IsS3_Sc(sq0_0) /\ IsU4_U(u).
+  Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\
+      IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\
+      IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u).
   (* Initializer *)
   Init: x_5 = (-1).
   (* Initializer *)
@@ -1064,10 +1058,9 @@ Assume {
       is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\
       is_sint32(a_1) /\ is_sint32(a[5]).
   (* Heap *)
-  Type: IsArray1_sint32(t) /\ IsArray1_sint32(t1_0) /\
-      IsArray1_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\
-      IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\
-      IsS3_Sc(sq0_0) /\ IsU4_U(u).
+  Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\
+      IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\
+      IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u).
   (* Initializer *)
   Init: x_5 = (-1).
   (* Initializer *)
@@ -1175,10 +1168,9 @@ Assume {
       is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\ is_sint32(a_1) /\
       is_sint32(a[5]).
   (* Heap *)
-  Type: IsArray1_sint32(t) /\ IsArray1_sint32(t1_0) /\
-      IsArray1_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\
-      IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\
-      IsS3_Sc(sq0_0) /\ IsU4_U(u).
+  Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\
+      IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\
+      IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u).
   (* Initializer *)
   Init: x_5 = (-1).
   (* Initializer *)
@@ -1285,10 +1277,9 @@ Assume {
       is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\
       is_sint32(a_1) /\ is_sint32(a[5]).
   (* Heap *)
-  Type: IsArray1_sint32(t) /\ IsArray1_sint32(t1_0) /\
-      IsArray1_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\
-      IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\
-      IsS3_Sc(sq0_0) /\ IsU4_U(u).
+  Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\
+      IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\
+      IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u).
   (* Initializer *)
   Init: x_5 = (-1).
   (* Initializer *)
@@ -1395,10 +1386,9 @@ Assume {
       is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\
       is_sint32(a_1) /\ is_sint32(a[5]).
   (* Heap *)
-  Type: IsArray1_sint32(t) /\ IsArray1_sint32(t1_0) /\
-      IsArray1_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\
-      IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\
-      IsS3_Sc(sq0_0) /\ IsU4_U(u).
+  Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\
+      IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\
+      IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u).
   (* Initializer *)
   Init: x_5 = (-1).
   (* Initializer *)
@@ -1505,10 +1495,9 @@ Assume {
       is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\
       is_sint32(a_1) /\ is_sint32(a[5]).
   (* Heap *)
-  Type: IsArray1_sint32(t) /\ IsArray1_sint32(t1_0) /\
-      IsArray1_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\
-      IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\
-      IsS3_Sc(sq0_0) /\ IsU4_U(u).
+  Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\
+      IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\
+      IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u).
   (* Initializer *)
   Init: x_5 = (-1).
   (* Initializer *)
@@ -1616,10 +1605,9 @@ Assume {
       is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\
       is_sint32(a_1) /\ is_sint32(a[5]).
   (* Heap *)
-  Type: IsArray1_sint32(t) /\ IsArray1_sint32(t1_0) /\
-      IsArray1_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\
-      IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\
-      IsS3_Sc(sq0_0) /\ IsU4_U(u).
+  Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\
+      IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\
+      IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u).
   (* Initializer *)
   Init: x_5 = (-1).
   (* Initializer *)
@@ -1726,10 +1714,9 @@ Assume {
       is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\
       is_sint32(a_1) /\ is_sint32(a[5]).
   (* Heap *)
-  Type: IsArray1_sint32(t) /\ IsArray1_sint32(t1_0) /\
-      IsArray1_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\
-      IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\
-      IsS3_Sc(sq0_0) /\ IsU4_U(u).
+  Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\
+      IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\
+      IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u).
   (* Goal *)
   When: (0 <= i) /\ (i <= 31) /\ is_sint32(i).
   (* Initializer *)
@@ -1839,10 +1826,9 @@ Assume {
       is_sint32(a_6) /\ is_sint32(a_8) /\ is_sint32(a_7[2]) /\
       is_sint32(a_1) /\ is_sint32(a[5]).
   (* Heap *)
-  Type: IsArray1_sint32(t) /\ IsArray1_sint32(t1_0) /\
-      IsArray1_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\
-      IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\
-      IsS3_Sc(sq0_0) /\ IsU4_U(u).
+  Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\
+      IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\
+      IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u).
   (* Initializer *)
   Init: x_5 = (-1).
   (* Initializer *)
@@ -1950,10 +1936,9 @@ Assume {
       is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_8) /\
       is_sint32(a_1) /\ is_sint32(a[5]).
   (* Heap *)
-  Type: IsArray1_sint32(t) /\ IsArray1_sint32(t1_0) /\
-      IsArray1_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\
-      IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\
-      IsS3_Sc(sq0_0) /\ IsU4_U(u).
+  Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\
+      IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\
+      IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u).
   (* Initializer *)
   Init: x_5 = (-1).
   (* Initializer *)
@@ -2060,10 +2045,9 @@ Assume {
       is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\
       is_sint32(a_1) /\ is_sint32(a[5]).
   (* Heap *)
-  Type: IsArray1_sint32(t) /\ IsArray1_sint32(t1_0) /\
-      IsArray1_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\
-      IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\
-      IsS3_Sc(sq0_0) /\ IsU4_U(u).
+  Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\
+      IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\
+      IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u).
   (* Goal *)
   When: (0 <= i) /\ (i <= 3).
   (* Initializer *)
@@ -2173,10 +2157,9 @@ Assume {
       is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\ is_sint32(a_1) /\
       is_sint32(a[5]).
   (* Heap *)
-  Type: IsArray1_sint32(t) /\ IsArray1_sint32(t1_0) /\
-      IsArray1_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\
-      IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\
-      IsS3_Sc(sq0_0) /\ IsU4_U(u).
+  Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\
+      IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\
+      IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u).
   (* Initializer *)
   Init: x_5 = (-1).
   (* Initializer *)
@@ -2283,10 +2266,9 @@ Assume {
       is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\
       is_sint32(a_1) /\ is_sint32(a[5]).
   (* Heap *)
-  Type: IsArray1_sint32(t) /\ IsArray1_sint32(t1_0) /\
-      IsArray1_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\
-      IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\
-      IsS3_Sc(sq0_0) /\ IsU4_U(u).
+  Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\
+      IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\
+      IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u).
   (* Goal *)
   When: (6 <= i) /\ (i <= 6).
   (* Initializer *)
@@ -2395,10 +2377,9 @@ Assume {
       is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\
       is_sint32(a_1) /\ is_sint32(a[5]).
   (* Heap *)
-  Type: IsArray1_sint32(t) /\ IsArray1_sint32(t1_0) /\
-      IsArray1_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\
-      IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\
-      IsS3_Sc(sq0_0) /\ IsU4_U(u).
+  Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\
+      IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\
+      IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u).
   (* Goal *)
   When: (7 <= i) /\ (i <= 9).
   (* Initializer *)
@@ -2507,10 +2488,9 @@ Assume {
       is_sint32(a_6) /\ is_sint32(a_7[1]) /\ is_sint32(a_7[2]) /\
       is_sint32(a_1) /\ is_sint32(a[5]).
   (* Heap *)
-  Type: IsArray1_sint32(t) /\ IsArray1_sint32(t1_0) /\
-      IsArray1_uint8(tab_0) /\ IsS1_S(s) /\ IsS2_St(st_0) /\
-      IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\
-      IsS3_Sc(sq0_0) /\ IsU4_U(u).
+  Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\
+      IsS1_S(s) /\ IsS2_St(st_0) /\ IsS3_Sc(sc0_0) /\ IsS3_Sc(sc1_0) /\
+      IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsS3_Sc(sq0_0) /\ IsU4_U(u).
   (* Initializer *)
   Init: x_5 = (-1).
   (* Initializer *)
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 6bd5711a072a0ab27b8f381d1a86a2b43b32c1d9..f751ef040819de7de6ccd6c0e9e35341c41ceec5 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
@@ -14,7 +14,7 @@ Assume {
   Type: is_sint32(x) /\ is_sint32(x_1) /\ is_sint32(x_2) /\
       is_sint32(ta1_0[4]).
   (* Heap *)
-  Type: IsArray1_sint32(ta1_0).
+  Type: IsArray_sint32(ta1_0).
 }
 Prove: (x_1 = x) /\ (x_2 = x_1).
 
@@ -26,7 +26,7 @@ Assume {
   Type: is_sint32(ta1_0[0]) /\ is_sint32(ta1_0[1]) /\ is_sint32(ta1_0[3]) /\
       is_sint32(x).
   (* Heap *)
-  Type: IsArray1_sint32(ta1_0).
+  Type: IsArray_sint32(ta1_0).
 }
 Prove: x = 0.
 
@@ -38,7 +38,7 @@ Assume {
   Type: is_sint32(ta1_0[0]) /\ is_sint32(ta1_0[1]) /\ is_sint32(x) /\
       is_sint32(ta1_0[4]).
   (* Heap *)
-  Type: IsArray1_sint32(ta1_0).
+  Type: IsArray_sint32(ta1_0).
 }
 Prove: x = 1.
 
@@ -54,7 +54,7 @@ Let x_2 = ta2_0[4].
 Assume {
   Type: is_sint32(x) /\ is_sint32(x_1) /\ is_sint32(x_2).
   (* Heap *)
-  Type: IsArray1_sint32(ta2_0).
+  Type: IsArray_sint32(ta2_0).
 }
 Prove: (x_1 = x) /\ (x_2 = x_1).
 
@@ -65,7 +65,7 @@ Let x = ta2_0[4].
 Assume {
   Type: is_sint32(ta2_0[0]) /\ is_sint32(ta2_0[1]) /\ is_sint32(x).
   (* Heap *)
-  Type: IsArray1_sint32(ta2_0).
+  Type: IsArray_sint32(ta2_0).
 }
 Prove: x = 1.
 
@@ -76,7 +76,7 @@ Let x = ta2_0[1].
 Assume {
   Type: is_sint32(ta2_0[0]) /\ is_sint32(x) /\ is_sint32(ta2_0[4]).
   (* Heap *)
-  Type: IsArray1_sint32(ta2_0).
+  Type: IsArray_sint32(ta2_0).
 }
 Prove: x = 1.
 
@@ -94,8 +94,8 @@ Assume {
   Type: is_sint32(x) /\ is_sint32(x_1) /\ is_sint32(ta2_0[4]) /\
       is_sint32(x_2) /\ is_sint32(x_3).
   (* Heap *)
-  Type: IsArray1_sint32(ta1_0) /\ IsArray1_sint32(ta2_0) /\
-      IsArray1_sint32(ta3_0).
+  Type: IsArray_sint32(ta1_0) /\ IsArray_sint32(ta2_0) /\
+      IsArray_sint32(ta3_0).
 }
 Prove: (x_1 = x) /\ (x_3 = x_2).
 
@@ -107,8 +107,8 @@ Assume {
   Type: is_sint32(ta1_0[2]) /\ is_sint32(ta1_0[4]) /\ is_sint32(ta2_0[4]) /\
       is_sint32(x) /\ is_sint32(ta3_0[2]).
   (* Heap *)
-  Type: IsArray1_sint32(ta1_0) /\ IsArray1_sint32(ta2_0) /\
-      IsArray1_sint32(ta3_0).
+  Type: IsArray_sint32(ta1_0) /\ IsArray_sint32(ta2_0) /\
+      IsArray_sint32(ta3_0).
 }
 Prove: x = 1.
 
@@ -120,8 +120,8 @@ Assume {
   Type: is_sint32(ta1_0[2]) /\ is_sint32(ta1_0[4]) /\ is_sint32(ta2_0[4]) /\
       is_sint32(ta3_0[0]) /\ is_sint32(x).
   (* Heap *)
-  Type: IsArray1_sint32(ta1_0) /\ IsArray1_sint32(ta2_0) /\
-      IsArray1_sint32(ta3_0).
+  Type: IsArray_sint32(ta1_0) /\ IsArray_sint32(ta2_0) /\
+      IsArray_sint32(ta3_0).
 }
 Prove: x = 1.
 
@@ -133,8 +133,8 @@ Assume {
   Type: is_sint32(ta1_0[2]) /\ is_sint32(ta1_0[4]) /\ is_sint32(x) /\
       is_sint32(ta3_0[0]) /\ is_sint32(ta3_0[2]).
   (* Heap *)
-  Type: IsArray1_sint32(ta1_0) /\ IsArray1_sint32(ta2_0) /\
-      IsArray1_sint32(ta3_0).
+  Type: IsArray_sint32(ta1_0) /\ IsArray_sint32(ta2_0) /\
+      IsArray_sint32(ta3_0).
 }
 Prove: x = 1.
 
@@ -154,7 +154,7 @@ Assume {
   Type: IsS5(a) /\ IsS5(a_1) /\ IsS5(a_2) /\ is_sint32(a.F5_a) /\
       is_sint32(x) /\ is_sint32(x_1) /\ is_sint32(a_3.F5_c).
   (* Heap *)
-  Type: IsArray1S5(ts1_0).
+  Type: IsArray_S5(ts1_0).
 }
 Prove: (x_1 = x) /\ EqS5(a, a_1) /\ EqS5(a_1, a_2).
 
@@ -168,7 +168,7 @@ Assume {
   Type: IsS5(a) /\ IsS5(ts1_0[1]) /\ IsS5(ts1_0[3]) /\ is_sint32(a.F5_a) /\
       is_sint32(a_1.F5_a) /\ is_sint32(a_1.F5_b) /\ is_sint32(x).
   (* Heap *)
-  Type: IsArray1S5(ts1_0).
+  Type: IsArray_S5(ts1_0).
 }
 Prove: x = 1.
 
@@ -182,7 +182,7 @@ Assume {
   Type: IsS5(a) /\ IsS5(ts1_0[1]) /\ IsS5(ts1_0[3]) /\ is_sint32(x) /\
       is_sint32(a_1.F5_a) /\ is_sint32(a_1.F5_b) /\ is_sint32(a_1.F5_c).
   (* Heap *)
-  Type: IsArray1S5(ts1_0).
+  Type: IsArray_S5(ts1_0).
 }
 Prove: x = 1.
 
@@ -204,9 +204,8 @@ Assume {
       is_sint64(u.F4_U_b) /\ is_sint16((u.F4_U_t)[0]) /\ is_sint32(a_4) /\
       is_sint32(a_1).
   (* Heap *)
-  Type: IsArray1_sint32(t) /\ IsArray1_sint32(t1_0) /\
-      IsArray1_uint8(tab_0) /\ IsS2_St(st_0) /\ IsS3_Sc(sc2_0) /\
-      IsS3_Sc(sc3_0) /\ IsU4_U(u).
+  Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\
+      IsS2_St(st_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsU4_U(u).
   (* Initializer *)
   Init: (u.F4_U_a) = (-1).
   (* Initializer *)
@@ -271,9 +270,8 @@ Assume {
       is_sint64(u.F4_U_b) /\ is_sint16((u.F4_U_t)[0]) /\ is_sint32(a_4) /\
       is_sint32(a_1).
   (* Heap *)
-  Type: IsArray1_sint32(t) /\ IsArray1_sint32(t1_0) /\
-      IsArray1_uint8(tab_0) /\ IsS2_St(st_0) /\ IsS3_Sc(sc2_0) /\
-      IsS3_Sc(sc3_0) /\ IsU4_U(u).
+  Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\
+      IsS2_St(st_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsU4_U(u).
   (* Initializer *)
   Init: (u.F4_U_a) = (-1).
   (* Initializer *)
@@ -338,9 +336,8 @@ Assume {
       is_sint64(u.F4_U_b) /\ is_sint16((u.F4_U_t)[0]) /\ is_sint32(a_4) /\
       is_sint32(a_1).
   (* Heap *)
-  Type: IsArray1_sint32(t) /\ IsArray1_sint32(t1_0) /\
-      IsArray1_uint8(tab_0) /\ IsS2_St(st_0) /\ IsS3_Sc(sc2_0) /\
-      IsS3_Sc(sc3_0) /\ IsU4_U(u).
+  Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\
+      IsS2_St(st_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsU4_U(u).
   (* Initializer *)
   Init: (u.F4_U_a) = (-1).
   (* Initializer *)
@@ -406,9 +403,8 @@ Assume {
       is_sint64(u.F4_U_b) /\ is_sint16((u.F4_U_t)[0]) /\ is_sint32(a_4) /\
       is_sint32(a_1).
   (* Heap *)
-  Type: IsArray1_sint32(t) /\ IsArray1_sint32(t1_0) /\
-      IsArray1_uint8(tab_0) /\ IsS2_St(st_0) /\ IsS3_Sc(sc2_0) /\
-      IsS3_Sc(sc3_0) /\ IsU4_U(u).
+  Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\
+      IsS2_St(st_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsU4_U(u).
   (* Initializer *)
   Init: (u.F4_U_a) = (-1).
   (* Initializer *)
@@ -473,9 +469,8 @@ Assume {
       is_sint64(u.F4_U_b) /\ is_sint16((u.F4_U_t)[0]) /\ is_sint32(a_4) /\
       is_sint32(a_1).
   (* Heap *)
-  Type: IsArray1_sint32(t) /\ IsArray1_sint32(t1_0) /\
-      IsArray1_uint8(tab_0) /\ IsS2_St(st_0) /\ IsS3_Sc(sc2_0) /\
-      IsS3_Sc(sc3_0) /\ IsU4_U(u).
+  Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\
+      IsS2_St(st_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsU4_U(u).
   (* Initializer *)
   Init: (u.F4_U_a) = (-1).
   (* Initializer *)
@@ -541,9 +536,8 @@ Assume {
       is_sint64(u.F4_U_b) /\ is_sint16((u.F4_U_t)[0]) /\ is_sint32(a_4) /\
       is_sint32(a_1).
   (* Heap *)
-  Type: IsArray1_sint32(t) /\ IsArray1_sint32(t1_0) /\
-      IsArray1_uint8(tab_0) /\ IsS2_St(st_0) /\ IsS3_Sc(sc2_0) /\
-      IsS3_Sc(sc3_0) /\ IsU4_U(u).
+  Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\
+      IsS2_St(st_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsU4_U(u).
   (* Initializer *)
   Init: (u.F4_U_a) = (-1).
   (* Initializer *)
@@ -609,9 +603,8 @@ Assume {
       is_sint64(u.F4_U_b) /\ is_sint16((u.F4_U_t)[0]) /\ is_sint32(a_4) /\
       is_sint32(a_1).
   (* Heap *)
-  Type: IsArray1_sint32(t) /\ IsArray1_sint32(t1_0) /\
-      IsArray1_uint8(tab_0) /\ IsS2_St(st_0) /\ IsS3_Sc(sc2_0) /\
-      IsS3_Sc(sc3_0) /\ IsU4_U(u).
+  Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\
+      IsS2_St(st_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsU4_U(u).
   (* Initializer *)
   Init: (u.F4_U_a) = (-1).
   (* Initializer *)
@@ -677,9 +670,8 @@ Assume {
       is_sint64(x_1) /\ is_sint16((u.F4_U_t)[0]) /\ is_sint32(a_4) /\
       is_sint32(a_1).
   (* Heap *)
-  Type: IsArray1_sint32(t) /\ IsArray1_sint32(t1_0) /\
-      IsArray1_uint8(tab_0) /\ IsS2_St(st_0) /\ IsS3_Sc(sc2_0) /\
-      IsS3_Sc(sc3_0) /\ IsU4_U(u).
+  Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\
+      IsS2_St(st_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsU4_U(u).
   (* Initializer *)
   Init: (u.F4_U_a) = (-1).
   (* Initializer *)
@@ -745,9 +737,8 @@ Assume {
       is_sint64(u.F4_U_b) /\ is_sint16(a_5) /\ is_sint32(a_4) /\
       is_sint32(a_1).
   (* Heap *)
-  Type: IsArray1_sint32(t) /\ IsArray1_sint32(t1_0) /\
-      IsArray1_uint8(tab_0) /\ IsS2_St(st_0) /\ IsS3_Sc(sc2_0) /\
-      IsS3_Sc(sc3_0) /\ IsU4_U(u).
+  Type: IsArray_sint32(t) /\ IsArray_sint32(t1_0) /\ IsArray_uint8(tab_0) /\
+      IsS2_St(st_0) /\ IsS3_Sc(sc2_0) /\ IsS3_Sc(sc3_0) /\ IsU4_U(u).
   (* Initializer *)
   Init: (u.F4_U_a) = (-1).
   (* Initializer *)
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/initialized_local_init.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/initialized_local_init.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..b64e2acc93c3758f0b4fd6bc7bdcec4280dd0cbe
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/oracle/initialized_local_init.res.oracle
@@ -0,0 +1,89 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_acsl/initialized_local_init.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+------------------------------------------------------------
+  Function l_array
+------------------------------------------------------------
+
+Goal Assertion 'SUCCS' (file tests/wp_acsl/initialized_local_init.i, line 9):
+Let x_1 = x[1].
+Let x_2 = x[2].
+Assume {
+  Type: is_sint32(x_1) /\ is_sint32(x_2).
+  (* Initializer *)
+  Init: x[0] = 0.
+  (* Initializer *)
+  Init: forall i : Z. ((0 < i) -> ((i <= 2) -> (x[i] = 0))).
+}
+Prove: (x_1 = 0) /\ (x_2 = 0) /\ (x_2 = x_1).
+
+------------------------------------------------------------
+
+Goal Assertion 'SUCCS' (file tests/wp_acsl/initialized_local_init.i, line 10):
+Assume {
+  (* Goal *)
+  When: (0 <= i) /\ (i <= 2).
+  (* Initializer *)
+  Init: (Init_x_0[0]=true).
+  (* Initializer *)
+  Init: x[0] = 0.
+  (* Initializer *)
+  Init: forall i_1 : Z. ((0 < i_1) -> ((i_1 <= 2) -> (Init_x_0[i_1]=true))).
+  (* Initializer *)
+  Init: forall i_1 : Z. ((0 < i_1) -> ((i_1 <= 2) -> (x[i_1] = 0))).
+  (* Assertion 'SUCCS' *)
+  Have: (x[1] = 0) /\ (x[2] = 0).
+}
+Prove: (Init_x_0[i]=true).
+
+------------------------------------------------------------
+
+Goal Check 'FAILS' (file tests/wp_acsl/initialized_local_init.i, line 11):
+Assume {
+  (* Initializer *)
+  Init: x[0] = 0.
+  (* Initializer *)
+  Init: forall i : Z. ((0 < i) -> ((i <= 2) -> (x[i] = 0))).
+  (* Assertion 'SUCCS' *)
+  Have: (x[1] = 0) /\ (x[2] = 0).
+}
+Prove: false.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function l_int
+------------------------------------------------------------
+
+Goal Assertion 'SUCCS' (file tests/wp_acsl/initialized_local_init.i, line 3):
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assertion 'SUCCS' (file tests/wp_acsl/initialized_local_init.i, line 4):
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Check 'FAILS' (file tests/wp_acsl/initialized_local_init.i, line 5):
+Prove: false.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function l_struct
+------------------------------------------------------------
+
+Goal Assertion 'SUCCS' (file tests/wp_acsl/initialized_local_init.i, line 16):
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assertion 'SUCCS' (file tests/wp_acsl/initialized_local_init.i, line 17):
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Check 'FAILS' (file tests/wp_acsl/initialized_local_init.i, line 18):
+Prove: false.
+
+------------------------------------------------------------
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 aa7594911a47f59a359854dec0913dedc9ee437c..114705c243fdf43478ff21c5179642615ded79c6 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
@@ -50,6 +50,26 @@ Goal Post-condition 'unknown' in 'glob_var':
 Assume { (* Heap *) Type: (region(px_0.base) <= 0) /\ cinits(Init_0). }
 Prove: (Init_0[px_0]=true).
 
+------------------------------------------------------------
+------------------------------------------------------------
+  Function ptr_on_local
+------------------------------------------------------------
+
+Goal Assertion 'provable' (file tests/wp_acsl/initialized_memtyped.i, line 89):
+Let a = global(L_x_63).
+Assume {
+  (* Heap *)
+  Type: cinits(Init_0).
+  (* Goal *)
+  When: (0 <= i) /\ (i <= 2).
+  (* Initializer *)
+  Init: (Init_0[shift_sint32(a, 0)]=true).
+  (* Initializer *)
+  Init: forall i_1 : Z. ((0 < i_1) -> ((i_1 <= 2) ->
+      (Init_0[shift_sint32(a, i_1)]=true))).
+}
+Prove: (Init_0[shift_sint32(a, i)]=true).
+
 ------------------------------------------------------------
 ------------------------------------------------------------
   Function test
@@ -63,7 +83,7 @@ Prove: (Init_0[x]=true).
 
 Goal Check 'unknown' (file initialized_memtyped.i, line 13):
 Assume { (* Heap *) Type: (region(a.base) <= 0) /\ cinits(Init_0). }
-Prove: IsInitArray1_int(a, 2, Init_0).
+Prove: IsInitArray_sint32(a, 2, Init_0).
 
 ------------------------------------------------------------
 
@@ -97,7 +117,8 @@ Assume {
   (* Heap *)
   Type: (region(a.base) <= 0) /\ (region(x.base) <= 0) /\ cinits(Init_0).
 }
-Prove: IsInitArray1_int(a, 2, Init_0[x <- true][shift_sint32(a, 0) <- true]).
+Prove: IsInitArray_sint32(a, 2,
+         Init_0[x <- true][shift_sint32(a, 0) <- true]).
 
 ------------------------------------------------------------
 
@@ -116,7 +137,7 @@ Assume {
   (* Heap *)
   Type: (region(a.base) <= 0) /\ (region(x.base) <= 0) /\ cinits(Init_0).
 }
-Prove: IsInitArray1_int(a, 2,
+Prove: IsInitArray_sint32(a, 2,
          Init_0[x <- true][shift_sint32(a, 0) <- true][shift_sint32(a, 1)
            <- true]).
 
@@ -145,7 +166,7 @@ Assume {
   Type: (region(a.base) <= 0) /\ (region(c.base) <= 0) /\
       (region(x.base) <= 0) /\ cinits(Init_0).
 }
-Prove: IsInitArray1_int(shiftfield_F2_C_a(c), 10,
+Prove: IsInitArray_sint32(shiftfield_F2_C_a(c), 10,
          Init_0[x <- true][shift_sint32(a, 0) <- true][shift_sint32(a, 1)
            <- true][shiftfield_F2_C_x(c) <- true]).
 
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/initialized_shift_array.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/initialized_shift_array.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..7a9d25eed759b7fd126d959ee90cd39cb9922546
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/oracle/initialized_shift_array.res.oracle
@@ -0,0 +1,134 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_acsl/initialized_shift_array.i (no preprocessing)
+[wp] Running WP plugin...
+[kernel] tests/wp_acsl/initialized_shift_array.i:52: Warning: 
+  No code nor implicit assigns clause for function test, generating default assigns from the prototype
+[wp] Warning: Missing RTE guards
+------------------------------------------------------------
+  Function fail_cell_after_end
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition (file tests/wp_acsl/initialized_shift_array.i, line 2) in 'test'' in 'fail_cell_after_end' at call 'test' (file tests/wp_acsl/initialized_shift_array.i, line 50)
+:
+Prove: false.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function fail_cell_before
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition (file tests/wp_acsl/initialized_shift_array.i, line 2) in 'test'' in 'fail_cell_before' at call 'test' (file tests/wp_acsl/initialized_shift_array.i, line 34)
+:
+Prove: false.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function fail_partial_not_full
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition (file tests/wp_acsl/initialized_shift_array.i, line 2) in 'test'' in 'fail_partial_not_full' at call 'test' (file tests/wp_acsl/initialized_shift_array.i, line 55)
+:
+Assume { (* Goal *) When: (0 <= i) /\ (i <= 2). }
+Prove: (([false..])[1 <- true][0 <- true][i]=true).
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function fail_too_long
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition (file tests/wp_acsl/initialized_shift_array.i, line 2) in 'test'' in 'fail_too_long' at call 'test' (file tests/wp_acsl/initialized_shift_array.i, line 38)
+:
+Prove: false.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function fail_too_long_from_1
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition (file tests/wp_acsl/initialized_shift_array.i, line 2) in 'test'' in 'fail_too_long_from_1' at call 'test' (file tests/wp_acsl/initialized_shift_array.i, line 42)
+:
+Prove: false.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function fail_too_long_from_2
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition (file tests/wp_acsl/initialized_shift_array.i, line 2) in 'test'' in 'fail_too_long_from_2' at call 'test' (file tests/wp_acsl/initialized_shift_array.i, line 46)
+:
+Prove: false.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function succ_from_1_from_1
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition (file tests/wp_acsl/initialized_shift_array.i, line 2) in 'test'' in 'succ_from_1_from_1' at call 'test' (file tests/wp_acsl/initialized_shift_array.i, line 23)
+:
+Assume { (* Goal *) When: (0 < i) /\ (i <= 2). }
+Prove: (([false..])[2 <- true][1 <- true][i]=true).
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function succ_full_first_cell
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition (file tests/wp_acsl/initialized_shift_array.i, line 2) in 'test'' in 'succ_full_first_cell' at call 'test' (file tests/wp_acsl/initialized_shift_array.i, line 10)
+:
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function succ_full_from_1
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition (file tests/wp_acsl/initialized_shift_array.i, line 2) in 'test'' in 'succ_full_from_1' at call 'test' (file tests/wp_acsl/initialized_shift_array.i, line 18)
+:
+Assume {
+  (* Goal *)
+  When: (0 < i) /\ (i <= 2).
+  (* Initializer *)
+  Init: (Init_buf_0[0]=true).
+  (* Initializer *)
+  Init: forall i_1 : Z. ((0 < i_1) -> ((i_1 <= 2) ->
+      (Init_buf_0[i_1]=true))).
+}
+Prove: (Init_buf_0[i]=true).
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function succ_full_from_2
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition (file tests/wp_acsl/initialized_shift_array.i, line 2) in 'test'' in 'succ_full_from_2' at call 'test' (file tests/wp_acsl/initialized_shift_array.i, line 27)
+:
+Assume {
+  (* Goal *)
+  When: (2 <= i) /\ (i <= 2).
+  (* Initializer *)
+  Init: (Init_buf_0[0]=true).
+  (* Initializer *)
+  Init: forall i_1 : Z. ((0 < i_1) -> ((i_1 <= 2) ->
+      (Init_buf_0[i_1]=true))).
+}
+Prove: (Init_buf_0[2]=true).
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function succ_full_full
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition (file tests/wp_acsl/initialized_shift_array.i, line 2) in 'test'' in 'succ_full_full' at call 'test' (file tests/wp_acsl/initialized_shift_array.i, line 14)
+:
+Assume {
+  (* Goal *)
+  When: (0 <= i) /\ (i <= 2).
+  (* Initializer *)
+  Init: (Init_buf_0[0]=true).
+  (* Initializer *)
+  Init: forall i_1 : Z. ((0 < i_1) -> ((i_1 <= 2) ->
+      (Init_buf_0[i_1]=true))).
+}
+Prove: (Init_buf_0[i]=true).
+
+------------------------------------------------------------
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 b3c48ca80fd30dc7f14eda4351ca76de222f48e4..054e41cd77977271084757936b247f5c169f0c34 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
@@ -2,68 +2,134 @@
 [kernel] Parsing invalid_pointer.c (with preprocessing)
 [wp] Running WP plugin...
 [wp] Warning: Missing RTE guards
+<<<<<<< HEAD
 [wp] invalid_pointer.c:21: Warning: void object
+||||||| ac7807782d
+[wp] tests/wp_acsl/invalid_pointer.c:21: Warning: void object
+=======
+[wp] tests/wp_acsl/invalid_pointer.c:23: Warning: void object
+>>>>>>> origin/master
 ------------------------------------------------------------
   Function array
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Check 'ARR' (file invalid_pointer.c, line 29):
+||||||| ac7807782d
+Goal Check 'ARR' (file tests/wp_acsl/invalid_pointer.c, line 29):
+=======
+Goal Check 'ARR' (file tests/wp_acsl/invalid_pointer.c, line 32):
+>>>>>>> origin/master
 Assume { Type: is_sint32(k). (* Heap *) Type: linked(Malloc_0). }
 Prove: ((0 <= k) /\ (k <= 25)) <->
-    valid_obj(Malloc_0[L_a_32 <- 25], shift_sint32(global(L_a_32), k), 1).
+    valid_obj(Malloc_0[L_a_33 <- 25], shift_sint32(global(L_a_33), k), 1).
 
 ------------------------------------------------------------
 ------------------------------------------------------------
   Function compound
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Check 'M1' (file invalid_pointer.c, line 44):
+||||||| ac7807782d
+Goal Check 'M1' (file tests/wp_acsl/invalid_pointer.c, line 44):
+=======
+Goal Check 'M1' (file tests/wp_acsl/invalid_pointer.c, line 47):
+>>>>>>> origin/master
 Prove: true.
 
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Check 'P0' (file invalid_pointer.c, line 45):
+||||||| ac7807782d
+Goal Check 'P0' (file tests/wp_acsl/invalid_pointer.c, line 45):
+=======
+Goal Check 'P0' (file tests/wp_acsl/invalid_pointer.c, line 48):
+>>>>>>> origin/master
 Prove: true.
 
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Check 'P1' (file invalid_pointer.c, line 46):
+||||||| ac7807782d
+Goal Check 'P1' (file tests/wp_acsl/invalid_pointer.c, line 46):
+=======
+Goal Check 'P1' (file tests/wp_acsl/invalid_pointer.c, line 49):
+>>>>>>> origin/master
 Prove: true.
 
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Check 'P2' (file invalid_pointer.c, line 47):
+||||||| ac7807782d
+Goal Check 'P2' (file tests/wp_acsl/invalid_pointer.c, line 47):
+=======
+Goal Check 'P2' (file tests/wp_acsl/invalid_pointer.c, line 50):
+>>>>>>> origin/master
 Prove: true.
 
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Check 'F' (file invalid_pointer.c, line 50):
+||||||| ac7807782d
+Goal Check 'F' (file tests/wp_acsl/invalid_pointer.c, line 50):
+=======
+Goal Check 'F' (file tests/wp_acsl/invalid_pointer.c, line 53):
+>>>>>>> origin/master
 Assume { (* Heap *) Type: linked(Malloc_0). }
-Prove: valid_obj(Malloc_0[L_s_37 <- 2], shiftfield_F1_S_f(global(L_s_37)), 1).
+Prove: valid_obj(Malloc_0[L_s_38 <- 2], shiftfield_F1_S_f(global(L_s_38)), 1).
 
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Check 'G' (file invalid_pointer.c, line 51):
+||||||| ac7807782d
+Goal Check 'G' (file tests/wp_acsl/invalid_pointer.c, line 51):
+=======
+Goal Check 'G' (file tests/wp_acsl/invalid_pointer.c, line 54):
+>>>>>>> origin/master
 Assume { (* Heap *) Type: linked(Malloc_0). }
-Prove: valid_obj(Malloc_0[L_s_37 <- 2], shiftfield_F1_S_g(global(L_s_37)), 1).
+Prove: valid_obj(Malloc_0[L_s_38 <- 2], shiftfield_F1_S_g(global(L_s_38)), 1).
 
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Check 'F2' (file invalid_pointer.c, line 52):
+||||||| ac7807782d
+Goal Check 'F2' (file tests/wp_acsl/invalid_pointer.c, line 52):
+=======
+Goal Check 'F2' (file tests/wp_acsl/invalid_pointer.c, line 55):
+>>>>>>> origin/master
 Assume { (* Heap *) Type: linked(Malloc_0). }
-Prove: valid_obj(Malloc_0[L_s_37 <- 2],
-         shift_sint32(shiftfield_F1_S_f(global(L_s_37)), 2), 1).
+Prove: valid_obj(Malloc_0[L_s_38 <- 2],
+         shift_sint32(shiftfield_F1_S_f(global(L_s_38)), 2), 1).
 
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Check 'G2' (file invalid_pointer.c, line 53):
+||||||| ac7807782d
+Goal Check 'G2' (file tests/wp_acsl/invalid_pointer.c, line 53):
+=======
+Goal Check 'G2' (file tests/wp_acsl/invalid_pointer.c, line 56):
+>>>>>>> origin/master
 Assume { (* Heap *) Type: linked(Malloc_0). }
-Prove: !valid_obj(Malloc_0[L_s_37 <- 2],
-          shift_sint32(shiftfield_F1_S_g(global(L_s_37)), 2), 1).
+Prove: !valid_obj(Malloc_0[L_s_38 <- 2],
+          shift_sint32(shiftfield_F1_S_g(global(L_s_38)), 2), 1).
 
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Check 'AM' (file invalid_pointer.c, line 56):
+||||||| ac7807782d
+Goal Check 'AM' (file tests/wp_acsl/invalid_pointer.c, line 56):
+=======
+Goal Check 'AM' (file tests/wp_acsl/invalid_pointer.c, line 59):
+>>>>>>> origin/master
 Prove: true.
 
 ------------------------------------------------------------
@@ -94,32 +160,67 @@ Prove: true.
   Function pointer
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Check 'M1' (file invalid_pointer.c, line 17):
+||||||| ac7807782d
+Goal Check 'M1' (file tests/wp_acsl/invalid_pointer.c, line 17):
+=======
+Goal Check 'M1' (file tests/wp_acsl/invalid_pointer.c, line 19):
+>>>>>>> origin/master
 Assume { (* Heap *) Type: linked(Malloc_0). }
-Prove: !valid_obj(Malloc_0[L_x_27 <- 1], shift_sint32(global(L_x_27), -1), 1).
+Prove: !valid_obj(Malloc_0[L_x_28 <- 1], shift_sint32(global(L_x_28), -1), 1).
 
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Check 'P0' (file invalid_pointer.c, line 18):
+||||||| ac7807782d
+Goal Check 'P0' (file tests/wp_acsl/invalid_pointer.c, line 18):
+=======
+Goal Check 'P0' (file tests/wp_acsl/invalid_pointer.c, line 20):
+>>>>>>> origin/master
 Assume { (* Heap *) Type: linked(Malloc_0). }
-Prove: valid_obj(Malloc_0[L_x_27 <- 1], global(L_x_27), 1).
+Prove: valid_obj(Malloc_0[L_x_28 <- 1], global(L_x_28), 1).
 
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Check 'P1' (file invalid_pointer.c, line 19):
+||||||| ac7807782d
+Goal Check 'P1' (file tests/wp_acsl/invalid_pointer.c, line 19):
+=======
+Goal Check 'P1' (file tests/wp_acsl/invalid_pointer.c, line 21):
+>>>>>>> origin/master
 Assume { (* Heap *) Type: linked(Malloc_0). }
-Prove: valid_obj(Malloc_0[L_x_27 <- 1], shift_sint32(global(L_x_27), 1), 1).
+Prove: valid_obj(Malloc_0[L_x_28 <- 1], shift_sint32(global(L_x_28), 1), 1).
 
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Check 'P2' (file invalid_pointer.c, line 20):
+||||||| ac7807782d
+Goal Check 'P2' (file tests/wp_acsl/invalid_pointer.c, line 20):
+=======
+Goal Check 'P2' (file tests/wp_acsl/invalid_pointer.c, line 22):
+>>>>>>> origin/master
 Assume { (* Heap *) Type: linked(Malloc_0). }
-Prove: !valid_obj(Malloc_0[L_x_27 <- 1], shift_sint32(global(L_x_27), 2), 1).
+Prove: !valid_obj(Malloc_0[L_x_28 <- 1], shift_sint32(global(L_x_28), 2), 1).
 
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Check 'NULL' (file invalid_pointer.c, line 21):
+||||||| ac7807782d
+Goal Check 'NULL' (file tests/wp_acsl/invalid_pointer.c, line 21):
+=======
+Goal Check 'qed_NULL' (file tests/wp_acsl/invalid_pointer.c, line 23):
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Check 'prover_NULL' (file tests/wp_acsl/invalid_pointer.c, line 24):
+>>>>>>> origin/master
 Assume { (* Heap *) Type: linked(Malloc_0). }
-Prove: valid_obj(Malloc_0[L_x_27 <- 1], null, 1).
+Prove: valid_obj(Malloc_0[L_x_28 <- 1], L_GET, 1).
 
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/issue_A228.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/issue_A228.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..e1e22036ebeeb00c2a9180ae68268033e3304f15
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/oracle/issue_A228.res.oracle
@@ -0,0 +1,11 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_acsl/issue_A228.c (with preprocessing)
+[kernel] :0: 
+  syntax error:
+  Location: between <unknown> and 1:5, before or at token: A
+  
+  1     Bool A, B;
+  
+  2     
+  3     /*@
+[kernel] Frama-C aborted: invalid user input.
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 d9e9a69ba178e2f836828e6fb512f378136a75f0..b406b614209e86c889a73cd121160070d06067a1 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/logic.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/logic.res.oracle
@@ -30,9 +30,9 @@
 
 Goal Post-condition (file logic.i, line 21) in 'h':
 Let a = global(G_t_29).
-Let m = Array1_S1(shift___anonstruct_Point_1(a, 0), 3, Mint_0).
-Let m_1 = Array1_S1(a, 3, Mint_0).
-Assume { Type: IsArray1S1(m_1) /\ IsArray1S1(m). (* Call 'f' *) Have: P_P(m).
+Let m = Array_S1(shift_S1(a, 0), 3, Mint_0).
+Let m_1 = Array_S1(a, 3, Mint_0).
+Assume { Type: IsArray_S1(m_1) /\ IsArray_S1(m). (* Call 'f' *) Have: P_P(m).
 }
 Prove: P_P(m_1).
 
@@ -58,12 +58,12 @@ Prove: true.
 
 Goal Pre-condition 'qed_ok' in 'main':
 Let a = global(G_tr_35).
-Let a_1 = shift___anonstruct_Point_1(a, 2).
-Let a_2 = shift___anonstruct_Point_1(a, 1).
-Let a_3 = shift___anonstruct_Point_1(a, 0).
-Let m = Array1_S1(a, 3, Mint_0).
+Let a_1 = shift_S1(a, 2).
+Let a_2 = shift_S1(a, 1).
+Let a_3 = shift_S1(a, 0).
+Let m = Array_S1(a, 3, Mint_0).
 Assume {
-  Type: IsArray1S1(m) /\ IsArray1S1(Array1_S1(a_3, 3, Mint_0)).
+  Type: IsArray_S1(m) /\ IsArray_S1(Array_S1(a_3, 3, Mint_0)).
   (* Initializer *)
   Init: Mint_0[shiftfield_F1_x(a_3)] = 10.
   (* Initializer *)
@@ -83,12 +83,12 @@ Prove: P_P(m).
 
 Goal Pre-condition 'qed_ok' in 'main':
 Let a = global(G_tr_35).
-Let a_1 = shift___anonstruct_Point_1(a, 2).
-Let a_2 = shift___anonstruct_Point_1(a, 1).
-Let a_3 = shift___anonstruct_Point_1(a, 0).
-Let m = Array1_S1(a, 3, Mint_0).
+Let a_1 = shift_S1(a, 2).
+Let a_2 = shift_S1(a, 1).
+Let a_3 = shift_S1(a, 0).
+Let m = Array_S1(a, 3, Mint_0).
 Assume {
-  Type: IsArray1S1(m) /\ IsArray1S1(Array1_S1(a_3, 3, Mint_0)).
+  Type: IsArray_S1(m) /\ IsArray_S1(Array_S1(a_3, 3, Mint_0)).
   (* Initializer *)
   Init: Mint_0[shiftfield_F1_x(a_3)] = 10.
   (* Initializer *)
@@ -108,12 +108,12 @@ Prove: P_P(m).
 
 Goal Pre-condition 'qed_ok' in 'main':
 Let a = global(G_tr_35).
-Let a_1 = shift___anonstruct_Point_1(a, 2).
-Let a_2 = shift___anonstruct_Point_1(a, 1).
-Let a_3 = shift___anonstruct_Point_1(a, 0).
-Let m = Array1_S1(a_3, 3, Mint_0).
+Let a_1 = shift_S1(a, 2).
+Let a_2 = shift_S1(a, 1).
+Let a_3 = shift_S1(a, 0).
+Let m = Array_S1(a_3, 3, Mint_0).
 Assume {
-  Type: IsArray1S1(Array1_S1(a, 3, Mint_0)) /\ IsArray1S1(m).
+  Type: IsArray_S1(Array_S1(a, 3, Mint_0)) /\ IsArray_S1(m).
   (* Initializer *)
   Init: Mint_0[shiftfield_F1_x(a_3)] = 10.
   (* Initializer *)
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 726375fd9fe70d88951932d5a1d18f98fec27290..0b4f5a0035b5430babe2a63c5c75adc997ac2911 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/null.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/null.res.oracle
@@ -1,26 +1,81 @@
 # frama-c -wp [...]
+<<<<<<< HEAD
 [kernel] Parsing null.c (with preprocessing)
+||||||| ac7807782d
+[kernel] Parsing tests/wp_acsl/null.c (with preprocessing)
+=======
+[kernel] Parsing tests/wp_acsl/null.i (no preprocessing)
+>>>>>>> origin/master
 [wp] Running WP plugin...
 [wp] Warning: Missing RTE guards
 ------------------------------------------------------------
   Global
 ------------------------------------------------------------
 
-Lemma valid_non_null:
-Prove: not (valid_rw Malloc_0 null 1)
+Lemma prover_not_valid_null:
+Assume: 'qed_not_valid_read_null' 'qed_not_valid_null'
+Prove: not (valid_rw Malloc_0 L_GET 1)
 
 ------------------------------------------------------------
 
-Lemma valid_read_non_null:
-Assume: 'valid_non_null'
-Prove: not (valid_rd Malloc_0 null 1)
+Lemma prover_not_valid_read_null:
+Assume: 'prover_not_valid_null' 'qed_not_valid_read_null'
+  'qed_not_valid_null'
+Prove: not (valid_rd Malloc_0 L_GET 1)
+
+------------------------------------------------------------
+
+Lemma qed_not_valid_null:
+Prove: true
+
+------------------------------------------------------------
+
+Lemma qed_not_valid_read_null:
+Assume: 'qed_not_valid_null'
+Prove: true
 
 ------------------------------------------------------------
 ------------------------------------------------------------
   Function null_is_zero
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Post-condition (file null.c, line 4) in 'null_is_zero':
+||||||| ac7807782d
+Goal Post-condition (file tests/wp_acsl/null.c, line 4) in 'null_is_zero':
+=======
+Goal Post-condition (file tests/wp_acsl/null.i, line 2) in 'null_is_zero':
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function prover
+------------------------------------------------------------
+
+Goal Assigns nothing in 'prover':
+Call Effect at line 32
+Assume { (* Heap *) Type: linked(Malloc_0). }
+Prove: invalid(Malloc_0, L_GET, 1).
+
+------------------------------------------------------------
+
+Goal Assigns nothing in 'prover':
+Call Effect at line 32
+Assume { (* Heap *) Type: linked(Malloc_0). }
+Prove: invalid(Malloc_0, L_GET, 1).
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function qed
+------------------------------------------------------------
+
+Goal Assigns nothing in 'qed':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns nothing in 'qed':
+>>>>>>> origin/master
 Prove: true.
 
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/opaque_struct.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/opaque_struct.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..a5c5cf0e1819ac3fab3eb01794a33294e13656aa
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/oracle/opaque_struct.res.oracle
@@ -0,0 +1,186 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_acsl/opaque_struct.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+------------------------------------------------------------
+  Axiomatic 'test'
+------------------------------------------------------------
+
+Lemma fail:
+Prove: (EqS1_S S1_0 S2_0)
+
+------------------------------------------------------------
+
+Lemma succeed_L1:
+Prove: true
+
+------------------------------------------------------------
+
+Lemma succeed_L2:
+Prove: 0<=BytesLength_of_S1_S
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function assigned_via_pointer
+------------------------------------------------------------
+
+Goal Check 'fail' (file tests/wp_acsl/opaque_struct.i, line 53):
+Assume {
+  (* Heap *)
+  Type: (region(p.base) <= 0) /\ framed(Mptr_0) /\ sconst(Mchar_0).
+}
+Prove: EqS1_S(Load_S1_S(p, havoc(Mchar_undef_0, Mchar_0, p, Length_of_S1_S),
+                havoc(Mint_undef_0, Mint_0, p, Length_of_S1_S),
+                havoc(Mint_undef_1, Mint_1, p, Length_of_S1_S),
+                havoc(Mint_undef_2, Mint_2, p, Length_of_S1_S),
+                havoc(Mint_undef_3, Mint_3, p, Length_of_S1_S),
+                havoc(Mint_undef_4, Mint_4, p, Length_of_S1_S),
+                havoc(Mint_undef_5, Mint_5, p, Length_of_S1_S),
+                havoc(Mint_undef_6, Mint_6, p, Length_of_S1_S),
+                havoc(Mint_undef_7, Mint_7, p, Length_of_S1_S),
+                havoc(Mint_undef_8, Mint_8, p, Length_of_S1_S),
+                havoc(Mf32_undef_0, Mf32_0, p, Length_of_S1_S),
+                havoc(Mf64_undef_0, Mf64_0, p, Length_of_S1_S),
+                havoc(Mptr_undef_0, Mptr_0, p, Length_of_S1_S)),
+         Load_S1_S(p, Mchar_0, Mint_0, Mint_1, Mint_2, Mint_3, Mint_4,
+           Mint_5, Mint_6, Mint_7, Mint_8, Mf32_0, Mf64_0, Mptr_0)).
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function assigns
+------------------------------------------------------------
+
+Goal Check 'fail' (file tests/wp_acsl/opaque_struct.i, line 17):
+Prove: EqS1_S(S1_0, S1_1).
+
+------------------------------------------------------------
+
+Goal Check 'succeed' (file tests/wp_acsl/opaque_struct.i, line 18):
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function assigns_effect
+------------------------------------------------------------
+
+Goal Check 'fail' (file tests/wp_acsl/opaque_struct.i, line 62):
+Let x = Mint_0[p].
+Let a_1 = havoc(Mint_undef_0, Mint_0, a, Length_of_S1_S)[p].
+Assume {
+  Type: is_sint32(x) /\ is_sint32(a_1).
+  (* Heap *)
+  Type: (region(a.base) <= 0) /\ (region(c.base) <= 0) /\
+      (region(p.base) <= 0).
+  (* Pre-condition *)
+  Have: separated(a, Length_of_S1_S, c, 1).
+}
+Prove: a_1 = x.
+
+------------------------------------------------------------
+
+Goal Check 'fail' (file tests/wp_acsl/opaque_struct.i, line 63):
+Assume {
+  (* Heap *)
+  Type: (region(a.base) <= 0) /\ (region(c.base) <= 0) /\
+      (region(q.base) <= 0).
+  (* Pre-condition *)
+  Have: separated(a, Length_of_S1_S, c, 1).
+}
+Prove: of_f32(havoc(Mf32_undef_0, Mf32_0, a, Length_of_S1_S)[q])
+         = of_f32(Mf32_0[q]).
+
+------------------------------------------------------------
+
+Goal Check 'succeed' (file tests/wp_acsl/opaque_struct.i, line 64):
+Let x = Mchar_0[c].
+Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, Length_of_S1_S)[c].
+Assume {
+  Type: is_sint8(x) /\ is_sint8(a_1).
+  (* Heap *)
+  Type: (region(a.base) <= 0) /\ (region(c.base) <= 0) /\ sconst(Mchar_0).
+  (* Pre-condition *)
+  Have: separated(a, Length_of_S1_S, c, 1).
+}
+Prove: a_1 = x.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function initialized_assigns
+------------------------------------------------------------
+
+Goal Check 'succeed' (file tests/wp_acsl/opaque_struct.i, line 31):
+Let a = havoc(Init_undef_0, Init_0, p, Length_of_S1_S).
+Assume {
+  (* Heap *)
+  Type: (region(p.base) <= 0) /\ linked(Malloc_0) /\ cinits(Init_0).
+  (* Pre-condition *)
+  Have: IsInit_S1_S(p, Init_0) /\ valid_rw(Malloc_0, p, Length_of_S1_S).
+  (* Call Effects *)
+  Have: monotonic_init(Init_0, a).
+}
+Prove: IsInit_S1_S(p, a).
+
+------------------------------------------------------------
+
+Goal Check 'succeed' (file tests/wp_acsl/opaque_struct.i, line 32):
+Let x = p.base.
+Assume {
+  (* Heap *)
+  Type: (region(x) <= 0) /\ linked(Malloc_0).
+  (* Pre-condition *)
+  Have: valid_rw(Malloc_0, p, Length_of_S1_S).
+}
+Prove: 0 <= (BytesLength_of_S1_S * (Malloc_0[x] / Length_of_S1_S)).
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function uninitialized_assigns
+------------------------------------------------------------
+
+Goal Check 'fail' (file tests/wp_acsl/opaque_struct.i, line 47):
+Let a = havoc(Init_undef_0, Init_0, p, Length_of_S1_S).
+Assume {
+  (* Heap *)
+  Type: (region(p.base) <= 0) /\ cinits(Init_0).
+  (* Pre-condition *)
+  Have: !IsInit_S1_S(p, Init_0).
+  (* Call Effects *)
+  Have: monotonic_init(Init_0, a).
+}
+Prove: !IsInit_S1_S(p, a).
+
+------------------------------------------------------------
+
+Goal Check 'fail' (file tests/wp_acsl/opaque_struct.i, line 48):
+Let a = havoc(Init_undef_0, Init_0, p, Length_of_S1_S).
+Assume {
+  (* Heap *)
+  Type: (region(p.base) <= 0) /\ cinits(Init_0).
+  (* Pre-condition *)
+  Have: !IsInit_S1_S(p, Init_0).
+  (* Call Effects *)
+  Have: monotonic_init(Init_0, a).
+}
+Prove: IsInit_S1_S(p, a).
+
+------------------------------------------------------------
+[wp] tests/wp_acsl/opaque_struct.i:24: Warning: 
+  Memory model hypotheses for function 'g':
+  /*@ behavior wp_typed:
+        requires \separated(p, &S1, &S2, &p); */
+  void g(void);
+[wp] tests/wp_acsl/opaque_struct.i:57: Warning: 
+  Memory model hypotheses for function 'assign':
+  /*@ behavior wp_typed:
+        requires \separated(a, &S1, &S2); */
+  void assign(struct S *a);
+[wp] tests/wp_acsl/opaque_struct.i:60: Warning: 
+  Memory model hypotheses for function 'assigns_effect':
+  /*@
+     behavior wp_typed:
+       requires \separated(a, &S1, &S2);
+       requires \separated(c, &S1, &S2);
+       requires \separated(p_0, &S1, &S2);
+       requires \separated(q, &S1, &S2);
+     */
+  void assigns_effect(int *p_0, float *q, char *c, struct S *a);
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 f4928b544b2b911f88534a092738e4a00557a8c5..f4e783236baf533f767999fe9065d928998274a3 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/pointer.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/pointer.res.oracle
@@ -228,11 +228,13 @@ Goal Post-condition 'qed_ko,Eq_oracle_ko' in 'pointer':
 Prove: false.
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'compare':
-  /*@ behavior typed:
+[wp] tests/wp_acsl/pointer.i:63: Warning: 
+  Memory model hypotheses for function 'compare':
+  /*@ behavior wp_typed:
         requires \separated(q + (..), &p); */
   void compare(int *q);
-[wp] Warning: Memory model hypotheses for function 'absurd':
-  /*@ behavior typed:
+[wp] tests/wp_acsl/pointer.i:73: Warning: 
+  Memory model hypotheses for function 'absurd':
+  /*@ behavior wp_typed:
         requires \separated(q + (..), &p); */
   void absurd(int *q);
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/postassigns.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/postassigns.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..8abc928d33f1abe77a4033024acc964ece36ba7c
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/oracle/postassigns.res.oracle
@@ -0,0 +1,230 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_acsl/postassigns.c (with preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+------------------------------------------------------------
+  Function job1
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_acsl/postassigns.c, line 4) in 'job1':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_acsl/postassigns.c, line 5) in 'job1' (1/9):
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_acsl/postassigns.c, line 5) in 'job1' (2/9):
+Effect at line 10
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_acsl/postassigns.c, line 5) in 'job1' (3/9):
+Effect at line 10
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_acsl/postassigns.c, line 5) in 'job1' (4/9):
+Effect at line 11
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_acsl/postassigns.c, line 5) in 'job1' (5/9):
+Effect at line 11
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_acsl/postassigns.c, line 5) in 'job1' (6/9):
+Effect at line 12
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_acsl/postassigns.c, line 5) in 'job1' (7/9):
+Effect at line 12
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_acsl/postassigns.c, line 5) in 'job1' (8/9):
+Effect at line 13
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_acsl/postassigns.c, line 5) in 'job1' (9/9):
+Effect at line 13
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function job2
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_acsl/postassigns.c, line 19) in 'job2':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_acsl/postassigns.c, line 20) in 'job2' (1/9):
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_acsl/postassigns.c, line 20) in 'job2' (2/9):
+Effect at line 25
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_acsl/postassigns.c, line 20) in 'job2' (3/9):
+Effect at line 25
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_acsl/postassigns.c, line 20) in 'job2' (4/9):
+Effect at line 26
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_acsl/postassigns.c, line 20) in 'job2' (5/9):
+Effect at line 26
+Let x = A[1].
+Assume {
+  Type: is_sint32(x).
+  (* Heap *)
+  Type: (region(p.base) <= 0) /\ IsArray_sint32(A) /\ linked(Malloc_0).
+  (* Goal *)
+  When: !invalid(Malloc_0, shift_sint32(p, x), 1).
+}
+Prove: exists i : Z. (A[i] = x) /\ (0 <= i) /\ (i <= 3).
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_acsl/postassigns.c, line 20) in 'job2' (6/9):
+Effect at line 27
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_acsl/postassigns.c, line 20) in 'job2' (7/9):
+Effect at line 27
+Let x = A[2].
+Assume {
+  Type: is_sint32(x).
+  (* Heap *)
+  Type: (region(p.base) <= 0) /\ IsArray_sint32(A) /\ linked(Malloc_0).
+  (* Goal *)
+  When: !invalid(Malloc_0, shift_sint32(p, x), 1).
+}
+Prove: exists i : Z. (A[i] = x) /\ (0 <= i) /\ (i <= 3).
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_acsl/postassigns.c, line 20) in 'job2' (8/9):
+Effect at line 28
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_acsl/postassigns.c, line 20) in 'job2' (9/9):
+Effect at line 28
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function job3
+------------------------------------------------------------
+
+Goal Preservation of Invariant (file tests/wp_acsl/postassigns.c, line 38):
+Assume {
+  Type: is_sint32(N) /\ is_sint32(i) /\ is_sint32(1 + i).
+  (* Pre-condition *)
+  Have: 0 <= N.
+  (* Invariant *)
+  Have: (i <= N) /\ (0 <= i).
+  (* Then *)
+  Have: i < N.
+}
+Prove: (-1) <= i.
+
+------------------------------------------------------------
+
+Goal Establishment of Invariant (file tests/wp_acsl/postassigns.c, line 38):
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Loop assigns (file tests/wp_acsl/postassigns.c, line 39) (1/3):
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Loop assigns (file tests/wp_acsl/postassigns.c, line 39) (2/3):
+Effect at line 41
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Loop assigns (file tests/wp_acsl/postassigns.c, line 39) (3/3):
+Effect at line 42
+Let a = shift_sint32(p, i).
+Assume {
+  Type: is_sint32(N) /\ is_sint32(i).
+  (* Heap *)
+  Type: (region(p.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: !invalid(Malloc_0, a, 1).
+  (* Pre-condition *)
+  Have: 0 <= N.
+  (* Invariant *)
+  Have: (i <= N) /\ (0 <= i).
+  (* Then *)
+  Have: i < N.
+}
+Prove: included(a, 1, shift_sint32(p, 0), N).
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_acsl/postassigns.c, line 33) in 'job3' (1/2):
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_acsl/postassigns.c, line 33) in 'job3' (2/2):
+Effect at line 41
+Prove: true.
+
+------------------------------------------------------------
+[wp] tests/wp_acsl/postassigns.c:7: Warning: 
+  Memory model hypotheses for function 'job1':
+  /*@
+     behavior wp_typed:
+       requires \separated(p + (..), &N);
+       ensures \separated(p + (0 .. \at(N,Post) - 1), &N);
+     */
+  void job1(int *p);
+[wp] tests/wp_acsl/postassigns.c:22: Warning: 
+  Memory model hypotheses for function 'job2':
+  /*@
+     behavior wp_typed:
+       requires \separated(p + (..), (int *)A + (..), &N);
+       ensures \separated(p + A[0 .. \at(N,Post) - 1], (int *)A + (..), &N);
+     */
+  void job2(int *p);
+[wp] tests/wp_acsl/postassigns.c:35: Warning: 
+  Memory model hypotheses for function 'job3':
+  /*@
+     behavior wp_typed:
+       requires \separated(p + (..), &N);
+       ensures \separated(p + (0 .. \at(N,Post)), &N);
+     */
+  void job3(int *p);
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 3b5da5293fc0e220c42e472c97348d16d111f302..2eea042e2e47e4aab7bae28333b1e7e144550382 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/record.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/record.res.oracle
@@ -50,11 +50,11 @@ Prove: true.
 
 Goal Post-condition 'P2,qed_ok' in 'f':
 Assume {
-  Type: IsArray1_sint32(t1_0) /\ IsArray1_sint32(t2_0).
+  Type: IsArray_sint32(t1_0) /\ IsArray_sint32(t2_0).
   (* Goal *)
   When: forall i : Z. ((0 <= i) -> ((i <= 9) -> (t2_0[i] = t1_0[i]))).
 }
-Prove: EqArray1_int(10, t1_0, t2_0).
+Prove: EqArray_int(10, t1_0, t2_0).
 
 ------------------------------------------------------------
 
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/sqrt_builtins.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/sqrt_builtins.0.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..546f84fc3366d621e3b9a07d038c3439a0842160
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/oracle/sqrt_builtins.0.res.oracle
@@ -0,0 +1,22 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_acsl/sqrt_builtins.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+------------------------------------------------------------
+  Function test_sqrt
+------------------------------------------------------------
+
+Goal Assertion 'KO' (file tests/wp_acsl/sqrt_builtins.i, line 25):
+Assume { (* Call 'sqrt' *) Have: .0 <= of_f64(sqrt_f64(q)). }
+Prove: false.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function test_sqrtf
+------------------------------------------------------------
+
+Goal Assertion 'KO' (file tests/wp_acsl/sqrt_builtins.i, line 16):
+Assume { (* Call 'sqrtf' *) Have: .0 <= of_f32(sqrt_f32(q)). }
+Prove: false.
+
+------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/sqrt_builtins.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/sqrt_builtins.1.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..21bd47ad8f8b27896414422ee164c0ba892fb82f
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/oracle/sqrt_builtins.1.res.oracle
@@ -0,0 +1,22 @@
+# frama-c -wp -wp-model 'Typed (Real)' [...]
+[kernel] Parsing tests/wp_acsl/sqrt_builtins.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+------------------------------------------------------------
+  Function test_sqrt
+------------------------------------------------------------
+
+Goal Assertion 'KO' (file tests/wp_acsl/sqrt_builtins.i, line 25):
+Assume { (* Call 'sqrt' *) Have: .0 <= sqrt(q). }
+Prove: false.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function test_sqrtf
+------------------------------------------------------------
+
+Goal Assertion 'KO' (file tests/wp_acsl/sqrt_builtins.i, line 16):
+Assume { (* Call 'sqrtf' *) Have: .0 <= sqrt(q). }
+Prove: false.
+
+------------------------------------------------------------
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 e6935b4689f8ef7f1edd31b99af88b71fa96d265..529b0bd446a2f19753e3b372f7a67bd8e2d61009 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
@@ -251,9 +251,6 @@ Assume {
       is_sint8_chunk(Mchar_0).
   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 }) =
-      Init_r_0.
 }
 Prove: valid_rd(Malloc_0, p, 3).
 
@@ -273,9 +270,6 @@ Assume {
       is_sint8_chunk(Mchar_0).
   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 }) =
-      Init_r_0.
   (* Assertion 'rte,mem_access' *)
   Have: valid_rd(Malloc_0, p, 3).
   (* Initializer *)
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 6ff8f9301d1d85b27ce41eb4b805330ad34a3ace..60510bf1eaa270768d7e7af2f7660a5b898e2c7b 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
@@ -19,7 +19,8 @@
  Functions                 WP     Alt-Ergo  Total   Success
   job                       6        3        9       100%
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'job':
-  /*@ behavior typed:
+[wp] tests/wp_acsl/assigns_path.i:12: Warning: 
+  Memory model hypotheses for function 'job':
+  /*@ behavior wp_typed:
         requires \separated(b + (..), &p); */
   void job(int n, int *b);
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 ea8709779a5e0bf15215a4d68c22354079d53c54..e01d608c849aef0096684d8e8845d1882c449f80 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
@@ -2,7 +2,7 @@
 [kernel] Parsing block_length.i (no preprocessing)
 [wp] Running WP plugin...
 [wp] Warning: Missing RTE guards
-[wp] 10 goals scheduled
+[wp] 20 goals scheduled
 [wp] [Qed] Goal typed_f_ensures_Pt : Valid
 [wp] [Qed] Goal typed_f_ensures_Psiz1 : Valid
 [wp] [Qed] Goal typed_f_ensures_Pmat1 : Valid
@@ -13,9 +13,21 @@
 [wp] [Qed] Goal typed_f_ensures_Pt1 : Valid
 [wp] [Qed] Goal typed_f_ensures_Pmat12 : Valid
 [wp] [Qed] Goal typed_f_ensures_Pts1 : Valid
-[wp] Proved goals:   10 / 10
-  Qed:            10
+[wp] [Alt-Ergo] Goal typed_g_ensures_Pt : Valid
+[wp] [Qed] Goal typed_g_ensures_Psiz1 : Valid
+[wp] [Alt-Ergo] Goal typed_g_ensures_Pmat1 : Valid
+[wp] [Qed] Goal typed_g_ensures_Psiz2 : Valid
+[wp] [Alt-Ergo] Goal typed_g_ensures_Pmat2 : Valid
+[wp] [Alt-Ergo] Goal typed_g_ensures_Ps : Valid
+[wp] [Alt-Ergo] Goal typed_g_ensures_Pts : Valid
+[wp] [Alt-Ergo] Goal typed_g_ensures_Pt1 : Valid
+[wp] [Alt-Ergo] Goal typed_g_ensures_Pmat12 : Valid
+[wp] [Alt-Ergo] Goal typed_g_ensures_Pts1 : Valid
+[wp] Proved goals:   20 / 20
+  Qed:            12 
+  Alt-Ergo:        8
 ------------------------------------------------------------
  Functions                 WP     Alt-Ergo  Total   Success
   f                        10        -       10       100%
+  g                         2        8       10       100%
 ------------------------------------------------------------
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 43511c2b77fd5ae6a1d2ec621ca57cdc23409e04..78db6e4c42339aeb9d4b380f77bf2c3e21d86c33 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
@@ -49,9 +49,10 @@
  Functions                 WP     Alt-Ergo  Total   Success
   function                 20       19       39       100%
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'function':
+[wp] tests/wp_acsl/chunk_typing.i:21: Warning: 
+  Memory model hypotheses for function 'function':
   /*@
-     behavior typed:
+     behavior wp_typed:
        requires \separated(i16 + (..), (char const *)x + (..));
        requires \separated(i32 + (..), (char const *)x + (..));
        requires \separated(i64 + (..), (char const *)x + (..));
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/generalized_checks.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/generalized_checks.res.oracle
index f4f1b7e3145348d3a8fc2b2439484bc2665911ef..2a86f3089181e4f542ae392a6c49af7d3ff5e13c 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/generalized_checks.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/generalized_checks.res.oracle
@@ -1,8 +1,14 @@
 # frama-c -wp -wp-timeout 1 [...]
 [kernel] Parsing generalized_checks.i (no preprocessing)
 [wp] Running WP plugin...
+[wp] tests/wp_acsl/generalized_checks.i:68: Warning: 
+  Unsupported generalized invariant, use loop invariant instead.
+  Ignored invariant 
+  check invariant \true;
 [wp] Warning: Missing RTE guards
-[wp] 17 goals scheduled
+[wp] tests/wp_acsl/generalized_checks.i:75: Warning: 
+  Missing assigns clause (assigns 'everything' instead)
+[wp] 21 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
@@ -20,9 +26,13 @@
 [wp] [Qed] Goal typed_caller_call_job_requires_A : Valid
 [wp] [Qed] Goal typed_caller_call_job_check_requires_CA1 : Valid
 [wp] [Alt-Ergo] Goal typed_caller_call_job_check_requires_CA2_ko : Unsuccess
-[wp] Proved goals:   11 / 17
-  Qed:             9 
-  Alt-Ergo:        2  (unsuccess: 6)
+[wp] [Alt-Ergo] Goal typed_loop_check_loop_invariant_false_but_preserved_preserved : Unsuccess
+[wp] [Alt-Ergo] Goal typed_loop_check_loop_invariant_false_but_preserved_established : Unsuccess
+[wp] [Alt-Ergo] Goal typed_loop_check_implied_by_false_invariant : Unsuccess
+[wp] [Qed] Goal typed_loop_loop_assigns : Valid
+[wp] Proved goals:   12 / 21
+  Qed:            10 
+  Alt-Ergo:        2  (unsuccess: 9)
 ------------------------------------------------------------
  Axiomatics                WP     Alt-Ergo  Total   Success
   Axiomatic Th              -        -        2       0.0%
@@ -30,4 +40,5 @@
  Functions                 WP     Alt-Ergo  Total   Success
   job                       3        2        6      83.3%
   caller                    6        -        9      66.7%
+  loop                      1        -        4      25.0%
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/initialized_local_init.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/initialized_local_init.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..86800d74f72b4a1ffb6e4354f411e1a52bbee829
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/initialized_local_init.res.oracle
@@ -0,0 +1,23 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_acsl/initialized_local_init.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+[wp] 9 goals scheduled
+[wp] [Qed] Goal typed_l_int_assert_SUCCS : Valid
+[wp] [Qed] Goal typed_l_int_assert_SUCCS_2 : Valid
+[wp] [Alt-Ergo] Goal typed_l_int_check_FAILS : Unsuccess
+[wp] [Alt-Ergo] Goal typed_l_array_assert_SUCCS : Valid
+[wp] [Alt-Ergo] Goal typed_l_array_assert_SUCCS_2 : Valid
+[wp] [Alt-Ergo] Goal typed_l_array_check_FAILS : Unsuccess
+[wp] [Qed] Goal typed_l_struct_assert_SUCCS : Valid
+[wp] [Qed] Goal typed_l_struct_assert_SUCCS_2 : Valid
+[wp] [Alt-Ergo] Goal typed_l_struct_check_FAILS : Unsuccess
+[wp] Proved goals:    6 / 9
+  Qed:             4 
+  Alt-Ergo:        2  (unsuccess: 3)
+------------------------------------------------------------
+ Functions                 WP     Alt-Ergo  Total   Success
+  l_int                     2        -        3      66.7%
+  l_array                   -        2        3      66.7%
+  l_struct                  2        -        3      66.7%
+------------------------------------------------------------
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 34e09776f72a843757b71f7289eb5fbffb500180..59797277f6893195c5599adad2152d1b3bf6dba4 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
@@ -2,7 +2,7 @@
 [kernel] Parsing initialized_memtyped.i (no preprocessing)
 [wp] Running WP plugin...
 [wp] Warning: Missing RTE guards
-[wp] 28 goals scheduled
+[wp] 29 goals scheduled
 [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
@@ -31,13 +31,15 @@
 [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
+[wp] [Alt-Ergo] Goal typed_ptr_on_local_assert_provable : Valid
+[wp] Proved goals:   14 / 29
   Qed:             6 
-  Alt-Ergo:        7  (unsuccess: 15)
+  Alt-Ergo:        8  (unsuccess: 15)
 ------------------------------------------------------------
  Functions                 WP     Alt-Ergo  Total   Success
   test                      6        4       23      43.5%
   glob_var                  -        1        2      50.0%
   glob_arr                  -        1        2      50.0%
   formal                    -        1        1       100%
+  ptr_on_local              -        1        1       100%
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/initialized_shift_array.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/initialized_shift_array.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..ca01bf0f44a9041cc0a9883e59bb919b43910f63
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/initialized_shift_array.res.oracle
@@ -0,0 +1,35 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_acsl/initialized_shift_array.i (no preprocessing)
+[wp] Running WP plugin...
+[kernel] tests/wp_acsl/initialized_shift_array.i:52: Warning: 
+  No code nor implicit assigns clause for function test, generating default assigns from the prototype
+[wp] Warning: Missing RTE guards
+[wp] 11 goals scheduled
+[wp] [Qed] Goal typed_succ_full_first_cell_call_test_requires : Valid
+[wp] [Alt-Ergo] Goal typed_succ_full_full_call_test_requires : Valid
+[wp] [Alt-Ergo] Goal typed_succ_full_from_1_call_test_requires : Valid
+[wp] [Alt-Ergo] Goal typed_succ_from_1_from_1_call_test_requires : Valid
+[wp] [Alt-Ergo] Goal typed_succ_full_from_2_call_test_requires : Valid
+[wp] [Alt-Ergo] Goal typed_fail_cell_before_call_test_requires : Unsuccess
+[wp] [Alt-Ergo] Goal typed_fail_too_long_call_test_requires : Unsuccess
+[wp] [Alt-Ergo] Goal typed_fail_too_long_from_1_call_test_requires : Unsuccess
+[wp] [Alt-Ergo] Goal typed_fail_too_long_from_2_call_test_requires : Unsuccess
+[wp] [Alt-Ergo] Goal typed_fail_cell_after_end_call_test_requires : Unsuccess
+[wp] [Alt-Ergo] Goal typed_fail_partial_not_full_call_test_requires : Unsuccess
+[wp] Proved goals:    5 / 11
+  Qed:             1 
+  Alt-Ergo:        4  (unsuccess: 6)
+------------------------------------------------------------
+ Functions                 WP     Alt-Ergo  Total   Success
+  succ_full_first_cell      1        -        1       100%
+  succ_full_full            -        1        1       100%
+  succ_full_from_1          -        1        1       100%
+  succ_from_1_from_1        -        1        1       100%
+  succ_full_from_2          -        1        1       100%
+  fail_cell_before          -        -        1       0.0%
+  fail_too_long             -        -        1       0.0%
+  fail_too_long_from_1      -        -        1       0.0%
+  fail_too_long_from_2      -        -        1       0.0%
+  fail_cell_after_end       -        -        1       0.0%
+  fail_partial_not_full     -        -        1       0.0%
+------------------------------------------------------------
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 3fd3eaad360bf9ca28836bc6a48972e311306a94..5dc3d1ff40c3b13dd0d8ced4cf7486740ff65687 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
@@ -2,8 +2,16 @@
 [kernel] Parsing invalid_pointer.c (with preprocessing)
 [wp] Running WP plugin...
 [wp] Warning: Missing RTE guards
+<<<<<<< HEAD
 [wp] invalid_pointer.c:21: Warning: void object
 [wp] 19 goals scheduled
+||||||| ac7807782d
+[wp] tests/wp_acsl/invalid_pointer.c:21: Warning: void object
+[wp] 19 goals scheduled
+=======
+[wp] tests/wp_acsl/invalid_pointer.c:23: Warning: void object
+[wp] 20 goals scheduled
+>>>>>>> origin/master
 [wp] [Qed] Goal typed_memvar_check_M1 : Valid
 [wp] [Qed] Goal typed_memvar_check_P0 : Valid
 [wp] [Qed] Goal typed_memvar_check_P1 : Valid
@@ -12,7 +20,8 @@
 [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] [Qed] Goal typed_pointer_check_qed_NULL : Valid
+[wp] [Alt-Ergo] Goal typed_pointer_check_prover_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
@@ -23,13 +32,13 @@
 [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] Proved goals:   19 / 19
-  Qed:             9 
+[wp] Proved goals:   20 / 20
+  Qed:            10 
   Alt-Ergo:       10
 ------------------------------------------------------------
  Functions                 WP     Alt-Ergo  Total   Success
   memvar                    4        -        4       100%
-  pointer                   -        5        5       100%
+  pointer                   1        5        6       100%
   array                     -        1        1       100%
   compound                  5        4        9       100%
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/issue_A228.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/issue_A228.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..e1e22036ebeeb00c2a9180ae68268033e3304f15
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/issue_A228.res.oracle
@@ -0,0 +1,11 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_acsl/issue_A228.c (with preprocessing)
+[kernel] :0: 
+  syntax error:
+  Location: between <unknown> and 1:5, before or at token: A
+  
+  1     Bool A, B;
+  
+  2     
+  3     /*@
+[kernel] Frama-C aborted: invalid user input.
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 57936c31ef4ff21b2f5800f326d7b848adb6a753..dc07d3f6bbbcfde749fbc586a8621060d6a70d5b 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,18 +1,32 @@
 # frama-c -wp [...]
+<<<<<<< HEAD
 [kernel] Parsing null.c (with preprocessing)
+||||||| ac7807782d
+[kernel] Parsing tests/wp_acsl/null.c (with preprocessing)
+=======
+[kernel] Parsing tests/wp_acsl/null.i (no preprocessing)
+>>>>>>> origin/master
 [wp] Running WP plugin...
 [wp] Warning: Missing RTE guards
-[wp] 3 goals scheduled
-[wp] [Alt-Ergo] Goal typed_lemma_valid_non_null : Valid
-[wp] [Alt-Ergo] Goal typed_lemma_valid_read_non_null : Valid
+[wp] 9 goals scheduled
+[wp] [Alt-Ergo] Goal typed_lemma_prover_not_valid_null : Valid
+[wp] [Alt-Ergo] Goal typed_lemma_prover_not_valid_read_null : Valid
+[wp] [Qed] Goal typed_lemma_qed_not_valid_null : Valid
+[wp] [Qed] Goal typed_lemma_qed_not_valid_read_null : Valid
 [wp] [Qed] Goal typed_null_is_zero_ensures : Valid
-[wp] Proved goals:    3 / 3
-  Qed:             1 
-  Alt-Ergo:        2
+[wp] [Qed] Goal typed_qed_assigns_exit : Valid
+[wp] [Qed] Goal typed_qed_assigns_normal : Valid
+[wp] [Alt-Ergo] Goal typed_prover_assigns_exit : Valid
+[wp] [Alt-Ergo] Goal typed_prover_assigns_normal : Valid
+[wp] Proved goals:    9 / 9
+  Qed:             5 
+  Alt-Ergo:        4
 ------------------------------------------------------------
  Axiomatics                WP     Alt-Ergo  Total   Success
-  Lemma                     -        2        2       100%
+  Lemma                     2        2        4       100%
 ------------------------------------------------------------
  Functions                 WP     Alt-Ergo  Total   Success
   null_is_zero              1        -        1       100%
+  qed                       2        -        2       100%
+  prover                    -        2        2       100%
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/opaque_struct.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/opaque_struct.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..d8a3007152e5b4197ca3f5e108cc6fb410023cd2
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/opaque_struct.res.oracle
@@ -0,0 +1,52 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_acsl/opaque_struct.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+[wp] 13 goals scheduled
+[wp] [Alt-Ergo] Goal typed_check_lemma_fail : Unsuccess
+[wp] [Qed] Goal typed_check_lemma_succeed_L1 : Valid
+[wp] [Alt-Ergo] Goal typed_check_lemma_succeed_L2 : Valid
+[wp] [Alt-Ergo] Goal typed_assigns_check_fail : Unsuccess
+[wp] [Qed] Goal typed_assigns_check_succeed : Valid
+[wp] [Alt-Ergo] Goal typed_initialized_assigns_check_succeed : Valid
+[wp] [Alt-Ergo] Goal typed_initialized_assigns_check_succeed_2 : Valid
+[wp] [Alt-Ergo] Goal typed_uninitialized_assigns_check_fail : Unsuccess
+[wp] [Alt-Ergo] Goal typed_uninitialized_assigns_check_fail_2 : Unsuccess
+[wp] [Alt-Ergo] Goal typed_assigned_via_pointer_check_fail : Unsuccess
+[wp] [Alt-Ergo] Goal typed_assigns_effect_check_fail : Unsuccess
+[wp] [Alt-Ergo] Goal typed_assigns_effect_check_fail_2 : Unsuccess
+[wp] [Alt-Ergo] Goal typed_assigns_effect_check_succeed : Valid
+[wp] Proved goals:    6 / 13
+  Qed:             2 
+  Alt-Ergo:        4  (unsuccess: 7)
+------------------------------------------------------------
+ Axiomatics                WP     Alt-Ergo  Total   Success
+  Axiomatic test            1        1        3      66.7%
+------------------------------------------------------------
+ Functions                 WP     Alt-Ergo  Total   Success
+  assigns                   1        -        2      50.0%
+  initialized_assigns       -        2        2       100%
+  uninitialized_assigns     -        -        2       0.0%
+  assigned_via_pointer      -        -        1       0.0%
+  assigns_effect            -        1        3      33.3%
+------------------------------------------------------------
+[wp] tests/wp_acsl/opaque_struct.i:24: Warning: 
+  Memory model hypotheses for function 'g':
+  /*@ behavior wp_typed:
+        requires \separated(p, &S1, &S2, &p); */
+  void g(void);
+[wp] tests/wp_acsl/opaque_struct.i:57: Warning: 
+  Memory model hypotheses for function 'assign':
+  /*@ behavior wp_typed:
+        requires \separated(a, &S1, &S2); */
+  void assign(struct S *a);
+[wp] tests/wp_acsl/opaque_struct.i:60: Warning: 
+  Memory model hypotheses for function 'assigns_effect':
+  /*@
+     behavior wp_typed:
+       requires \separated(a, &S1, &S2);
+       requires \separated(c, &S1, &S2);
+       requires \separated(p_0, &S1, &S2);
+       requires \separated(q, &S1, &S2);
+     */
+  void assigns_effect(int *p_0, float *q, char *c, struct S *a);
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 7b8caf21e8e377e7978fa309d5516fa51ecd1a43..1a32e5fc6d99af9494ed4adf318bceecc1551ea8 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
@@ -24,7 +24,8 @@
   mixed_array_pointer       -        -        2       0.0%
   absurd                    -        -        2       0.0%
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'absurd':
-  /*@ behavior typed_ref:
+[wp] tests/wp_acsl/pointer.i:73: Warning: 
+  Memory model hypotheses for function 'absurd':
+  /*@ behavior wp_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 89230ae3df2decde5a66b784944b066430bc3fbc..3adbab10b8fd4b2146c5a3eceff8d92ef503f64e 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
@@ -24,7 +24,8 @@
   mixed_array_pointer       -        -        2       0.0%
   absurd                    -        -        2       0.0%
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'absurd':
-  /*@ behavior typed:
+[wp] tests/wp_acsl/pointer.i:73: Warning: 
+  Memory model hypotheses for function 'absurd':
+  /*@ behavior wp_typed:
         requires \separated(q + (..), &p); */
   void absurd(int *q);
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/postassigns.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/postassigns.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..ef70c9d2f6e56db04fc30ccefa62a3d4ac6c3ea5
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/postassigns.res.oracle
@@ -0,0 +1,65 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_acsl/postassigns.c (with preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+[wp] 27 goals scheduled
+[wp] [Qed] Goal typed_job1_ensures : Valid
+[wp] [Qed] Goal typed_job1_assigns_part1 : Valid
+[wp] [Qed] Goal typed_job1_assigns_part2 : Valid
+[wp] [Qed] Goal typed_job1_assigns_part3 : Valid
+[wp] [Qed] Goal typed_job1_assigns_part4 : Valid
+[wp] [Qed] Goal typed_job1_assigns_part5 : Valid
+[wp] [Qed] Goal typed_job1_assigns_part6 : Valid
+[wp] [Qed] Goal typed_job1_assigns_part7 : Valid
+[wp] [Qed] Goal typed_job1_assigns_part8 : Valid
+[wp] [Qed] Goal typed_job1_assigns_part9 : Valid
+[wp] [Qed] Goal typed_job2_ensures : 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_job2_assigns_part4 : Valid
+[wp] [Alt-Ergo] Goal typed_job2_assigns_part5 : Valid
+[wp] [Qed] Goal typed_job2_assigns_part6 : Valid
+[wp] [Alt-Ergo] Goal typed_job2_assigns_part7 : Valid
+[wp] [Qed] Goal typed_job2_assigns_part8 : Valid
+[wp] [Qed] Goal typed_job2_assigns_part9 : Valid
+[wp] [Alt-Ergo] Goal typed_job3_loop_invariant_preserved : Valid
+[wp] [Qed] Goal typed_job3_loop_invariant_established : Valid
+[wp] [Qed] Goal typed_job3_loop_assigns_part1 : Valid
+[wp] [Qed] Goal typed_job3_loop_assigns_part2 : Valid
+[wp] [Alt-Ergo] Goal typed_job3_loop_assigns_part3 : Valid
+[wp] [Qed] Goal typed_job3_assigns_part1 : Valid
+[wp] [Qed] Goal typed_job3_assigns_part2 : Valid
+[wp] Proved goals:   27 / 27
+  Qed:            23 
+  Alt-Ergo:        4
+------------------------------------------------------------
+ Functions                 WP     Alt-Ergo  Total   Success
+  job1                     10        -       10       100%
+  job2                      8        2       10       100%
+  job3                      5        2        7       100%
+------------------------------------------------------------
+[wp] tests/wp_acsl/postassigns.c:7: Warning: 
+  Memory model hypotheses for function 'job1':
+  /*@
+     behavior wp_typed:
+       requires \separated(p + (..), &N);
+       ensures \separated(p + (0 .. \at(N,Post) - 1), &N);
+     */
+  void job1(int *p);
+[wp] tests/wp_acsl/postassigns.c:22: Warning: 
+  Memory model hypotheses for function 'job2':
+  /*@
+     behavior wp_typed:
+       requires \separated(p + (..), (int *)A + (..), &N);
+       ensures \separated(p + A[0 .. \at(N,Post) - 1], (int *)A + (..), &N);
+     */
+  void job2(int *p);
+[wp] tests/wp_acsl/postassigns.c:35: Warning: 
+  Memory model hypotheses for function 'job3':
+  /*@
+     behavior wp_typed:
+       requires \separated(p + (..), &N);
+       ensures \separated(p + (0 .. \at(N,Post)), &N);
+     */
+  void job3(int *p);
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/sqrt_builtins.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/sqrt_builtins.0.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..93fd64a1995782645dac1594db41018934c5e65e
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/sqrt_builtins.0.res.oracle
@@ -0,0 +1,14 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_acsl/sqrt_builtins.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+[wp] 2 goals scheduled
+[wp] [Alt-Ergo] Goal typed_test_sqrtf_assert_KO : Unsuccess
+[wp] [Alt-Ergo] Goal typed_test_sqrt_assert_KO : Unsuccess
+[wp] Proved goals:    0 / 2
+  Alt-Ergo:        0  (unsuccess: 2)
+------------------------------------------------------------
+ Functions                 WP     Alt-Ergo  Total   Success
+  test_sqrtf                -        -        1       0.0%
+  test_sqrt                 -        -        1       0.0%
+------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/sqrt_builtins.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/sqrt_builtins.1.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..bd5e2fe0f922aad64e35d47cdb5963c8bec5cb50
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/sqrt_builtins.1.res.oracle
@@ -0,0 +1,14 @@
+# frama-c -wp -wp-model 'Typed (Real)' [...]
+[kernel] Parsing tests/wp_acsl/sqrt_builtins.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+[wp] 2 goals scheduled
+[wp] [Alt-Ergo] Goal typed_real_test_sqrtf_assert_KO : Unsuccess
+[wp] [Alt-Ergo] Goal typed_real_test_sqrt_assert_KO : Unsuccess
+[wp] Proved goals:    0 / 2
+  Alt-Ergo:        0  (unsuccess: 2)
+------------------------------------------------------------
+ Functions                 WP     Alt-Ergo  Total   Success
+  test_sqrtf                -        -        1       0.0%
+  test_sqrt                 -        -        1       0.0%
+------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/postassigns.c b/src/plugins/wp/tests/wp_acsl/postassigns.c
new file mode 100644
index 0000000000000000000000000000000000000000..a2c1b7d1ba8ca26344e485d05bf64119cac34a0c
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/postassigns.c
@@ -0,0 +1,44 @@
+int N;
+
+/*@
+  ensures N == 4;
+  assigns N, p[0..\at(N,Post)-1];
+*/
+void job1(int *p)
+{
+  N = 0;
+  p[N++] = 0;
+  p[N++] = 0;
+  p[N++] = 0;
+  p[N++] = 0;
+}
+
+int A[4];
+
+/*@
+  ensures N == 4;
+  assigns N, *(p + A[0..\at(N,Post)-1]);
+*/
+void job2(int *p)
+{
+  N = 0;
+  p[A[N++]] = 0;
+  p[A[N++]] = 0;
+  p[A[N++]] = 0;
+  p[A[N++]] = 0;
+}
+
+/*@
+  requires 0 <= N;
+  assigns N, p[0..\at(N,Post)];
+*/
+void job3(int *p)
+{
+  /*@
+    loop invariant 0 <= i <= N;
+    loop assigns i, p[0..N-1];
+   */
+  for (int i = 0; i < N; i++)
+    p[i] = 0;
+  N++;
+}
diff --git a/src/plugins/wp/tests/wp_acsl/predicates_functions.i b/src/plugins/wp/tests/wp_acsl/predicates_functions.i
index d54998f4cedefdd31991f8557bb9119e683e3430..e5aafcf45632c91ff9e1cffe561d4f8bfde41cf4 100644
--- a/src/plugins/wp/tests/wp_acsl/predicates_functions.i
+++ b/src/plugins/wp/tests/wp_acsl/predicates_functions.i
@@ -11,4 +11,4 @@
 /*@ logic integer F(integer i) = i * 2 ; */
 /*@ logic integer RF(integer i) = (i <= 0) ? 0 : F(i) + RF(i-1) ; */
 
-/*@ lemma foo: \forall integer i ; i > 0 ==> RP(RF(i)) ; */
\ No newline at end of file
+/*@ lemma foo: \forall integer i ; i > 0 ==> RP(RF(i)) ; */
diff --git a/src/plugins/wp/tests/wp_acsl/sqrt_builtins.i b/src/plugins/wp/tests/wp_acsl/sqrt_builtins.i
new file mode 100644
index 0000000000000000000000000000000000000000..a19b233d84f3f9f05c74ece32334fe7365bab66e
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/sqrt_builtins.i
@@ -0,0 +1,26 @@
+/* run.config
+   OPT:
+   OPT: -wp-model real
+*/
+/* run.config_qualif
+   OPT:
+   OPT: -wp-model real
+*/
+
+/*@ assigns \nothing;
+    ensures -0. <= sqrtf(x); */
+void sqrtf(float x);
+
+void test_sqrtf(float q){
+  sqrtf(q);
+  /*@ assert KO: \false; */
+}
+
+/*@ assigns \nothing;
+    ensures -0. <= sqrt(x); */
+void sqrt(double x);
+
+void test_sqrt(double q){
+  sqrt(q);
+  /*@ assert KO: \false; */
+}
diff --git a/src/plugins/wp/tests/wp_acsl/struct_fields.i b/src/plugins/wp/tests/wp_acsl/struct_fields.i
index 93b9c90858aaca1db67542015efe50acabd61703..9aedd854e92c42e5808382b3ecce5c4eae0f2b05 100644
--- a/src/plugins/wp/tests/wp_acsl/struct_fields.i
+++ b/src/plugins/wp/tests/wp_acsl/struct_fields.i
@@ -14,4 +14,4 @@ struct X {
 void foo(struct X* p){
   struct X r = *p ;
   *p = r ;
-}
\ No newline at end of file
+}
diff --git a/src/plugins/wp/tests/wp_acsl/unsupported_builtin.ml b/src/plugins/wp/tests/wp_acsl/unsupported_builtin.ml
index ed343f06029c748895e17bcddb6652e4ddd3a8c6..5d6b6e6dc0b2651ec70e525372b15b8a8dc65e17 100644
--- a/src/plugins/wp/tests/wp_acsl/unsupported_builtin.ml
+++ b/src/plugins/wp/tests/wp_acsl/unsupported_builtin.ml
@@ -9,4 +9,4 @@ let builtin = {
 }
 
 let () =
-  Logic_builtin.add builtin
\ No newline at end of file
+  Logic_builtin.add builtin
diff --git a/src/plugins/wp/tests/wp_bts/bts_2110.i b/src/plugins/wp/tests/wp_bts/bts_2110.i
index 431bd45052e4d02e8b1aa005223fcaed306612b9..a07afba6a5ef1a852c4d6039799bce8171b7d379 100644
--- a/src/plugins/wp/tests/wp_bts/bts_2110.i
+++ b/src/plugins/wp/tests/wp_bts/bts_2110.i
@@ -1,5 +1,11 @@
 /* run.config
+<<<<<<< HEAD
    CMD: @frama-c@ -wp -wp-msg-key shell,cluster,print-generated -wp-prover why3 -wp-gen @OPTIONS@ -wp-warn-key "pedantic-assigns=inactive"
+||||||| ac7807782d
+   CMD: @frama-c@ -wp -wp-msg-key shell,cluster,print-generated -wp-prover why3 -wp-gen -wp-share ./share
+=======
+   CMD: @frama-c@ -wp -wp-msg-key shell,cluster,print-generated -wp-prover why3 -wp-gen -wp-share ./share -wp-warn-key "pedantic-assigns=inactive"
+>>>>>>> origin/master
    OPT:
 */
 
diff --git a/src/plugins/wp/tests/wp_bts/bts_2471.i b/src/plugins/wp/tests/wp_bts/bts_2471.i
index 2419c0debd8c56f0daafc2f0bdae517aadb72fff..a25c144dafc34fea9b4067ea4e9e953d1ff1505e 100644
--- a/src/plugins/wp/tests/wp_bts/bts_2471.i
+++ b/src/plugins/wp/tests/wp_bts/bts_2471.i
@@ -4,7 +4,6 @@
 
 /* run.config_qualif
    OPT: -wp-timeout 1
-   OPT: -wp-prover native:alt-ergo -wp-timeout 1
    OPT: -wp-prover native:coq
  */
 
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 26157ff45c160d4d9c5f86bbfa3bbdf198d4c5ac..fd446a79cb1766edbb8a27afd38ca63d2a87d599 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts0843.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts0843.res.oracle
@@ -52,7 +52,8 @@ Goal Instance of 'Pre-condition (file bts0843.i, line 12) in 'f3'' in 'g3' at ca
 Prove: true.
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'f3':
-  /*@ behavior typed:
+[wp] tests/wp_bts/bts0843.i:13: Warning: 
+  Memory model hypotheses for function 'f3':
+  /*@ behavior wp_typed:
         requires \separated(&p, &p->a); */
   void f3(void);
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 a385ef5420ba9a9279a420959548cce774bf21e3..81769171e9407122e16197d78c121f482b4ad176 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts788.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts788.res.oracle
@@ -16,7 +16,7 @@ Let x = t20_0[1].
 Assume {
   Type: is_sint32(x) /\ is_sint32(t20_0[2]).
   (* Heap *)
-  Type: IsArray1_sint32(t20_0).
+  Type: IsArray_sint32(t20_0).
   (* Initializer *)
   Init: t20_0[0] = 3.
   (* Initializer *)
@@ -31,7 +31,7 @@ Let x = t20_0[2].
 Assume {
   Type: is_sint32(t20_0[1]) /\ is_sint32(x).
   (* Heap *)
-  Type: IsArray1_sint32(t20_0).
+  Type: IsArray_sint32(t20_0).
   (* Initializer *)
   Init: t20_0[0] = 3.
   (* Initializer *)
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 efe6fbf33e205bd6bd70116f55c4d427ac106b23..3c0aa5178650c839a65b373af63db2c27bc74a9c 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
@@ -65,7 +65,8 @@ Assume {
 Prove: global(L_two_24) != one_0.
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'global_frame':
-  /*@ behavior typed:
+[wp] tests/wp_bts/bts_1828.i:56: Warning: 
+  Memory model hypotheses for function 'global_frame':
+  /*@ behavior wp_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 33e43fd27122db698220f443603c909410f7d7f3..fa050b2342db5fecfafaa69000282d7011e8a75d 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
@@ -44,9 +44,10 @@ Assume {
 Prove: global(L_two_24) != one_0.
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'global_frame':
+[wp] tests/wp_bts/bts_1828.i:56: Warning: 
+  Memory model hypotheses for function 'global_frame':
   /*@
-     behavior typed_ref:
+     behavior wp_typed_ref:
        requires \separated(zero, one);
        requires \valid(one);
        requires \valid(zero);
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 5457fd667faa5e4a48456916f73b8667c45c5d7a..9cc4cff302f6eb5b52120effb9f499f803d8ce2f 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
@@ -15,11 +15,10 @@ Assume {
   (* Heap *)
   Type: (region(tbl_0.base) <= 0) /\ linked(Malloc_0).
   (* Goal *)
-  When: !invalid(Malloc_0,
-           shiftfield_F1_size(shift___anonstruct_Buckets_1(a, x)), 1).
+  When: !invalid(Malloc_0, shiftfield_F1_size(shift_S1(a, x)), 1).
   (* Pre-condition *)
   Have: (0 <= d) /\ (d <= 16) /\ valid_rw(Malloc_0, tbl_0, 35) /\
-      valid_rw(Malloc_0, shift___anonstruct_Buckets_1(a, 0), 34).
+      valid_rw(Malloc_0, shift_S1(a, 0), 34).
 }
 Prove: (x <= d) /\ (d <= x).
 
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 dc3a0c6f89ddaa6b7aa7aac81cabd82ad0549f6e..fd70e6ece7fdf60179e95c5432ab07bad27e17b2 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
@@ -15,7 +15,8 @@
   f3                        1        -        1       100%
   g3                        1        2        3       100%
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'f3':
-  /*@ behavior typed:
+[wp] tests/wp_bts/bts0843.i:13: Warning: 
+  Memory model hypotheses for function 'f3':
+  /*@ behavior wp_typed:
         requires \separated(&p, &p->a); */
   void f3(void);
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 2ad49d15f3ed765b5c4792651b80ffbb172ba298..1a659e11936ec94bd131ccb4786f07cfb6700a2f 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
@@ -17,7 +17,8 @@
   local_frame               -        1        1       100%
   global_frame              3        -        5      60.0%
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'global_frame':
-  /*@ behavior typed:
+[wp] tests/wp_bts/bts_1828.i:56: Warning: 
+  Memory model hypotheses for function 'global_frame':
+  /*@ behavior wp_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 45b60a0df05e954f7480d87da0f46c7d4871663a..393ad545767a08a975118b7cb36400cf5a29a1a9 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
@@ -17,9 +17,10 @@
   local_frame               -        1        1       100%
   global_frame              5        -        5       100%
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'global_frame':
+[wp] tests/wp_bts/bts_1828.i:56: Warning: 
+  Memory model hypotheses for function 'global_frame':
   /*@
-     behavior typed_ref:
+     behavior wp_typed_ref:
        requires \separated(zero, one);
        requires \valid(one);
        requires \valid(zero);
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 725a63572bd50abb6c1cebeaca9117219a74b625..61b5304fa8b8810802ab20109e01ef56a1767557 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,12 +1,21 @@
+<<<<<<< HEAD
 # frama-c -wp -wp-timeout 1 [...]
 [kernel] Parsing bts_2471.i (no preprocessing)
+||||||| ac7807782d
+# frama-c -wp -wp-timeout 1 [...]
+[kernel] Parsing tests/wp_bts/bts_2471.i (no preprocessing)
+=======
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_bts/bts_2471.i (no preprocessing)
+>>>>>>> origin/master
 [wp] Running WP plugin...
 [wp] Warning: Missing RTE guards
-[wp] Warning: native support for alt-ergo is deprecated, use why3 instead
+[wp] Warning: native support for coq is deprecated, use tip instead
 [wp] 1 goal scheduled
-[wp] [Alt-Ergo (native)] Goal typed_foo_assert_ko : Unsuccess
+[wp] [Coq] Goal typed_foo_assert_ko : Default tactic
+[wp] [Coq (native)] Goal typed_foo_assert_ko : Unsuccess
 [wp] Proved goals:    0 / 1
-  Alt-Ergo (native):    0  (unsuccess: 1)
+  Coq (native):    0  (unsuccess: 1)
 ------------------------------------------------------------
  Functions                 WP     Alt-Ergo  Total   Success
   foo                       -        -        1       0.0%
diff --git a/src/plugins/wp/tests/wp_gallery/frama_c_hashtbl_solved.c b/src/plugins/wp/tests/wp_gallery/frama_c_hashtbl_solved.c
deleted file mode 100644
index f52b6b9b19f46f34e7f32691ce5d112d23ce556e..0000000000000000000000000000000000000000
--- a/src/plugins/wp/tests/wp_gallery/frama_c_hashtbl_solved.c
+++ /dev/null
@@ -1,329 +0,0 @@
-/* run.config
-   OPT: -wp-no-print -wp-rte
-*/
-
-/* run.config_qualif
-   OPT: -wp-prover=script,alt-ergo -wp-prop=-left_unproved -then -wp-rte -wp -wp-prop=-left_unproved
-*/
-
-/* ******************************* */
-/* Solution de TP donné par Julien */
-/* ******************************* */
-
-/* -------------------------------------------------------------------------- */
-/*
-  Ce fichier fournit une petite librairie de tables de hachage simplifiées:
-  elles ne sont pas dynamiques et, en particulier, pas redimensionnables.
-
-  Votre but est:
-  1. écrire la spécification ACSL des fonctions fournies à partir de leurs
-  spécifications informelles (mais pas du code...)
-  2. prouver que chaque fonction satisfait la spécification écrite en 1.
-  3. prouver l'absence d'erreurs à l'exécution via l'option -wp-rte.
-*/
-/* -------------------------------------------------------------------------- */
-
-#include <limits.h>
-
-/* -------------------------------------------------------------------------- */
-/*
-  Chaines de caractères simplifiées:
-  toutes les chaînes de caractères de ce fichier seront supposées de longueurs
-  STRING_LEN.
-
-  La fonction [eq_string] est fournie avec sa spécification formelle déjà
-  prouvée. Vous n'avez donc rien à faire pour cette fonction \o/.
-
-  Astuce: le prédicat [EqString] peut éventuellement être utile...
-*/
-/* -------------------------------------------------------------------------- */
-
-#define STRING_LEN 20
-
-/*@ predicate EqString(char *s1, char *s2) =
-  @   \forall integer i; 0 <= i < STRING_LEN ==> s1[i] == s2[i];
-  @ */
-
-/*@ requires \valid_read(s1 + (0 .. STRING_LEN - 1));
-  @ requires \valid_read(s2 + (0 .. STRING_LEN - 1));
-  @ assigns \nothing;
-  @
-  @ behavior eq:
-  @   assumes EqString(s1, s2);
-  @   ensures \result == 1;
-  @
-  @ behavior not_eq:
-  @   assumes ! EqString(s1, s2);
-  @   ensures \result == 0;
-  @
-  @ complete behaviors;
-  @ disjoint behaviors;
-  @ */
-int eq_string(const char *s1, const char *s2) {
-  int i;
-  /*@ loop invariant 0 <= i <= STRING_LEN;
-    @ loop invariant \forall integer j; 0 <= j < i ==> s1[j] == s2[j];
-    @ loop assigns i;
-    @ loop variant STRING_LEN - i;
-    @*/
-  for(i = 0; i < STRING_LEN; i++)
-    if (s1[i] != s2[i]) return 0;
-  return 1;
-}
-
-/* -------------------------------------------------------------------------- */
-/*
-  Structures de données.
-
-  Les tables de hachage associent ici des clés sous forme de chaînes de
-  caractères à des valeurs entières. Une fonction de hachage sur les
-  chaînes de caractères vous est fournie.
-
-  Les tables de hachage sont représentées par leur nombre d'éléments et un
-  tableau de "buckets" de longueur HASHTBL_LEN.
-
-  Les "buckets" sont eux-même des tableaux de couples (clé, valeur)
-  (individuellement appelé "bucket") dont toutes les clés ont le même
-  haché. Chaque tableau est de longueur fixe, BUCKET_LEN, mais le nombre
-  d'éléments stockés dans celui-ci peut varier.
-*/
-/* -------------------------------------------------------------------------- */
-
-#define BUCKET_LEN 10
-#define HASHTBL_LEN 17
-
-typedef struct {
-  char *key; // clé, sous forme de chaînes de caractères (simplifiées)
-  int value; // valeur associée à la clé
-} Bucket;
-
-typedef struct {
-  Bucket buckets[BUCKET_LEN]; // tableau de couples (clé, valeur)
-  int size;                   // nombre d'éléments stockés dans le tableau
-} Buckets;
-
-typedef struct {
-  Buckets data[HASHTBL_LEN];  // tableau de buckets
-  int size;               // nombre d'éléments stockés dans la table de hachage
-} Hashtbl;
-
-/* -------------------------------------------------------------------------- */
-/*
-  Fonction de hachage fournie: vous n'avez là non plus rien à faire \o/.
-
-  La postcondition de la fonction [hash] ne peut pas être prouvée sans donner
-  une définition à la fonction logique [Hash]. Ce travail n'est pas demandé ici
-  et cette postcondition restera donc toujours non prouvée. Ce devrait être
-  la seule...
-
-  Astuce: la fonction logique [HashIndex] de l'axiomatique [Hash] n'est pas
-  donnée que pour faire jolie. Vous avez aussi le droit d'ajouter vos propres
-  définitions de prédicats et de fonctions...
-*/
-/* -------------------------------------------------------------------------- */
-
-/*@ axiomatic Hash {
-  @   logic unsigned long Hash(char *s) reads(s + (0 .. ));
-  @   // [Hash] est un modèle abstrait de la fonction de hash codée en C
-  @   // ci-dessous
-  @
-  @   logic integer HashIndex(Hashtbl *tbl, char *k) = Hash(k) % HASHTBL_LEN;
-  @ } */
-
-/*@ requires \valid_read(s + (0 .. STRING_LEN - 1));
-  @ assigns \nothing;
-  @ ensures left_unproved: \result == Hash(s);
-  @ */
-unsigned long hash(const char *s) {
-  unsigned long h = 5381;
-  int i;
-  /*@ loop invariant 0 <= i <= STRING_LEN;
-    @ loop assigns h, i;
-    @ loop variant STRING_LEN - i; */
-  for(i = 0; i < STRING_LEN; i++) {
-    if (s[i]) break;
-    h = ((h << 5) + h) + s[i];
-  }
-  return h;
-}
-
-/* -------------------------------------------------------------------------- */
-/*
-  Fonctions logiques et prédicats additionnels utiles.
-*/
-/* -------------------------------------------------------------------------- */
-
-/*@
-  @ predicate valid_tbl(Hashtbl *tbl) =
-  @   \valid(tbl->data+(0 .. HASHTBL_LEN - 1));
-  @
-  @ predicate valid_buckets(Hashtbl *tbl) =
-  @   \forall integer i;
-  @     0 <= i < HASHTBL_LEN ==>
-  @     \valid(tbl->data[i].buckets + (0 .. BUCKET_LEN - 1));
-  @
-  @ predicate valid_read_keys(Hashtbl *tbl) =
-  @   \forall integer i, j;
-  @     0 <= i < HASHTBL_LEN ==>
-  @     0 <= j < tbl->data[i].size ==>
-  @     \valid_read(tbl->data[i].buckets[j].key + (0 .. STRING_LEN - 1));
-  @
-  @ logic integer buckets_size(Hashtbl *tbl, char *k) =
-  @   tbl->data[HashIndex(tbl, k)].size;
-  @
-  @ logic Bucket bucket(Hashtbl *tbl, char *k, integer i) =
-  @   tbl->data[HashIndex(tbl, k)].buckets[i];
-  @
-  @ */
-
-/* -------------------------------------------------------------------------- */
-/*
-  Exercice 0 (échauffement):
-
-  La fonction [size] retourne le nombre d'éléments d'une table.
-*/
-/* -------------------------------------------------------------------------- */
-
-/*@ requires \valid(tbl);
-  @ assigns \nothing;
-  @ ensures \result == tbl->size;
-  @ */
-int size(const Hashtbl *tbl) {
-  return tbl->size;
-}
-
-/* -------------------------------------------------------------------------- */
-/*
-  Exercice 1:
-
-  La fonction [init] initialise une table de hachage contenant 0 élément.
-  En particulier, chaque buckets contient 0 élément.
-*/
-/* -------------------------------------------------------------------------- */
-
-/*@ requires \valid(tbl);
-  @ requires valid_tbl(tbl);
-  @ assigns tbl->size, tbl->data[0 .. HASHTBL_LEN - 1];
-  @ ensures tbl->size == 0;
-  @ ensures \forall integer i; 0 <= i < HASHTBL_LEN ==> tbl->data[i].size == 0;
-  @ */
-void init(Hashtbl *tbl){
-  int i;
-  tbl->size = 0;
-  /*@ loop invariant 0 <= i <= HASHTBL_LEN;
-    @ loop invariant \forall integer k; 0 <= k < i ==> tbl->data[k].size == 0;
-    @ loop assigns i, tbl->data[0 .. HASHTBL_LEN - 1].size;
-    @ loop variant HASHTBL_LEN - i;
-    @ */
-  for(i = 0; i < HASHTBL_LEN; i++)
-    tbl->data[i].size = 0;
-}
-
-/* -------------------------------------------------------------------------- */
-/*
-  Exercice 2:
-
-  La fonction [add] ajouter un couple (clé, valeur) dans la table de hachage
-  s'il y a suffisamment de places. Si tel est le cas, elle retourne 0.
-
-  S'il n'y a pas suffisamment de places, la fonction ne fait rien et retourne
-  -1.
-
-  Conseil: lorsque la table est modifiée, bien penser à spécifier les nouvelles
-  tailles et l'emplacement du couple ajouté.
-*/
-/* -------------------------------------------------------------------------- */
-
-/*@ requires \valid(tbl);
-  @ requires valid_tbl(tbl);
-  @ requires valid_buckets(tbl);
-  @ requires \valid_read(k + (0 .. STRING_LEN - 1));
-  @ requires 0 <= tbl->size < INT_MAX;
-  @ requires \forall integer i;
-  @   0 <= i < HASHTBL_LEN ==>
-  @   0 <= tbl->data[i].size <= BUCKET_LEN;
-  @
-  @ assigns tbl->data[HashIndex(tbl, k)], tbl->size;
-  @
-  @ behavior nominal:
-  @   assumes buckets_size(tbl, k) < BUCKET_LEN;
-  @   assigns tbl->data[HashIndex(tbl, k)], tbl->size;
-  @   ensures \result == 0;
-  @   ensures tbl->size == \old(tbl->size) + 1;
-  @   ensures buckets_size(tbl, k) == buckets_size{Old}(tbl, k) + 1;
-  @   ensures bucket(tbl, k, buckets_size{Old}(tbl, k)).key == k;
-  @   ensures bucket(tbl, k, buckets_size{Old}(tbl, k)).value == d;
-  @ behavior full:
-  @   assumes buckets_size(tbl, k) == BUCKET_LEN;
-  @   assigns \nothing;
-  @   ensures \result == -1;
-  @
-  @ complete behaviors;
-  @ disjoint behaviors;
-  @ */
-int add(Hashtbl *tbl, char *k, int d) {
-  Bucket new_entry;
-  unsigned int h = hash(k) % HASHTBL_LEN;
-  if (tbl->data[h].size >= BUCKET_LEN)
-    return -1;
-  new_entry.key = k;
-  new_entry.value = d;
-  tbl->data[h].buckets[tbl->data[h].size] = new_entry;
-  tbl->data[h].size++;
-  tbl->size++;
-  return 0;
-}
-
-/* -------------------------------------------------------------------------- */
-/*
-  Exercice 3:
-
-  La fonction [mem_binding] retourne 1 si le couple (clé, valeur) [k, v] donné
-  en entrée est présent dans la table de hachage. Elle retourne 0 sinon.
-*/
-/* -------------------------------------------------------------------------- */
-
-/*@ requires \valid(tbl);
-  @ requires valid_tbl(tbl);
-  @ requires valid_buckets(tbl);
-  @ requires valid_read_keys(tbl);
-  @ requires \valid_read(k + (0 .. STRING_LEN - 1));
-  @ requires \forall integer i;
-  @   0 <= i < HASHTBL_LEN ==>
-  @   0 <= tbl->data[i].size < BUCKET_LEN;
-  @
-  @ assigns \nothing;
-  @
-  @ behavior found:
-  @   assumes \exists integer i; 0 <= i < buckets_size(tbl, k) &&
-  @     EqString(k, bucket(tbl, k, i).key) && v == bucket(tbl, k, i).value;
-  @   ensures \result == 1;
-  @
-  @ behavior not_found:
-  @   assumes \forall integer i; 0 <= i < buckets_size(tbl, k) ==>
-  @     (! EqString(k, bucket(tbl, k, i).key)
-  @     || tbl->data[HashIndex(tbl, k)].buckets[i].value != v);
-  @     // note: Alt-Ergo does not manage to prove it if written
-  @     // bucket(tbl, k, i).value != v
-  @     // so disappointing :-(
-  @   ensures \result == 0;
-  @
-  @ complete behaviors;
-  @ disjoint behaviors;
-  @ */
-int mem_binding(const Hashtbl *tbl, const char *k, int v) {
-  int i, h = hash(k) % HASHTBL_LEN;
-  /*@ loop invariant 0 <= i <= tbl->data[h].size;
-    @ loop invariant \forall integer j; 0 <= j < i ==>
-    @  (! EqString(k, tbl->data[h].buckets[j].key)
-    @  || tbl->data[h].buckets[j].value != v);
-    @ loop assigns i;
-    @ loop variant tbl->data[h].size - i;
-    @ */
-  for(i = 0; i < tbl->data[h].size; i++) {
-    if (eq_string(k, tbl->data[h].buckets[i].key)
-        && tbl->data[h].buckets[i].value == v)
-      return 1;
-  }
-  return 0;
-}
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 c30427e3509427594dbf5465ecf6c93522d56640..0a006664b4179128b7b4db62e9ee638cad417784 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
@@ -52,9 +52,10 @@
 [wp] Goal typed_ref_equal_elements_loop_variant_positive : not tried
 [wp] Goal typed_ref_equal_elements_loop_variant_2_decrease : not tried
 [wp] Goal typed_ref_equal_elements_loop_variant_2_positive : not tried
-[wp] Warning: Memory model hypotheses for function 'equal_elements':
+[wp] tests/wp_gallery/frama_c_exo3_solved.old.c:73: Warning: 
+  Memory model hypotheses for function 'equal_elements':
   /*@
-     behavior typed_ref:
+     behavior wp_typed_ref:
        requires \separated(v1, v2, a + (..));
        requires \valid(v1);
        requires \valid(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 266e08d235f86734fe0e325c6344d1ff080bde27..98d785c7c6880aff222f59073f24cc5c333e79ab 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
@@ -53,9 +53,10 @@
 [wp] Goal typed_ref_equal_elements_loop_variant_positive : not tried
 [wp] Goal typed_ref_equal_elements_loop_variant_2_decrease : not tried
 [wp] Goal typed_ref_equal_elements_loop_variant_2_positive : not tried
-[wp] Warning: Memory model hypotheses for function 'equal_elements':
+[wp] tests/wp_gallery/frama_c_exo3_solved.old.v2.c:56: Warning: 
+  Memory model hypotheses for function 'equal_elements':
   /*@
-     behavior typed_ref:
+     behavior wp_typed_ref:
        requires \separated(v1, v2, a + (..));
        requires \valid(v1);
        requires \valid(v2);
diff --git a/src/plugins/wp/tests/wp_gallery/oracle/string-compare.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle/string-compare.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..0c5741ea36b8b38350a2110b5dbc622c93d6c527
--- /dev/null
+++ b/src/plugins/wp/tests/wp_gallery/oracle/string-compare.res.oracle
@@ -0,0 +1,67 @@
+# frama-c -wp -wp-rte [...]
+[kernel] Parsing tests/wp_gallery/string-compare.c (with preprocessing)
+[wp] Running WP plugin...
+[rte] annotating function main
+[rte] annotating function stringCompare
+[rte] annotating function stringLength
+[wp] [CFG] Goal stringCompare_exits_never : Valid (Unreachable)
+[wp] [CFG] Goal stringLength_exits_never : Valid (Unreachable)
+[wp] Goal typed_stringCompare_complete_SomeDifferent_allEqual : trivial
+[wp] Goal typed_stringCompare_disjoint_SomeDifferent_allEqual : trivial
+[wp] Goal typed_stringCompare_loop_invariant_equal_preserved : not tried
+[wp] Goal typed_stringCompare_loop_invariant_equal_established : not tried
+[wp] Goal typed_stringCompare_loop_invariant_gauge_preserved : not tried
+[wp] Goal typed_stringCompare_loop_invariant_gauge_established : not tried
+[wp] Goal typed_stringCompare_loop_invariant_gauge_s1_preserved : not tried
+[wp] Goal typed_stringCompare_loop_invariant_gauge_s1_established : not tried
+[wp] Goal typed_stringCompare_loop_invariant_gauge_s2_preserved : not tried
+[wp] Goal typed_stringCompare_loop_invariant_gauge_s2_established : not tried
+[wp] Goal typed_stringCompare_loop_invariant_not_eos_preserved : not tried
+[wp] Goal typed_stringCompare_loop_invariant_not_eos_established : not tried
+[wp] Goal typed_stringCompare_loop_invariant_strlen_s1_preserved : not tried
+[wp] Goal typed_stringCompare_loop_invariant_strlen_s1_established : not tried
+[wp] Goal typed_stringCompare_loop_invariant_strlen_s2_preserved : not tried
+[wp] Goal typed_stringCompare_loop_invariant_strlen_s2_established : not tried
+[wp] Goal typed_stringCompare_assert_rte_mem_access : not tried
+[wp] Goal typed_stringCompare_assert_rte_mem_access_2 : not tried
+[wp] Goal typed_stringCompare_assert_rte_mem_access_3 : not tried
+[wp] Goal typed_stringCompare_assert_different : not tried
+[wp] Goal typed_stringCompare_assert_rte_mem_access_4 : not tried
+[wp] Goal typed_stringCompare_assert_rte_mem_access_5 : not tried
+[wp] Goal typed_stringCompare_assert_rte_signed_overflow : not tried
+[wp] Goal typed_stringCompare_assert_rte_signed_overflow_2 : not tried
+[wp] Goal typed_stringCompare_loop_assigns_part1 : trivial
+[wp] Goal typed_stringCompare_loop_assigns_part2 : not tried
+[wp] Goal typed_stringCompare_loop_assigns_part3 : not tried
+[wp] Goal typed_stringCompare_assigns_part1 : not tried
+[wp] Goal typed_stringCompare_assigns_part2 : not tried
+[wp] Goal typed_stringCompare_assigns_part3 : not tried
+[wp] Goal typed_stringCompare_assigns_part4 : not tried
+[wp] Goal typed_stringCompare_assigns_part5 : not tried
+[wp] Goal typed_stringCompare_assigns_part6 : not tried
+[wp] Goal typed_stringCompare_assigns_part7 : not tried
+[wp] Goal typed_stringCompare_assigns_part8 : not tried
+[wp] Goal typed_stringCompare_assigns_part9 : not tried
+[wp] Goal typed_stringCompare_allEqual_ensures : not tried
+[wp] Goal typed_stringCompare_SomeDifferent_ensures : not tried
+[wp] Goal typed_stringLength_ensures_rightResult : not tried
+[wp] Goal typed_stringLength_ensures_rightEndCharacter : not tried
+[wp] Goal typed_stringLength_loop_invariant_preserved : not tried
+[wp] Goal typed_stringLength_loop_invariant_established : not tried
+[wp] Goal typed_stringLength_loop_invariant_2_preserved : not tried
+[wp] Goal typed_stringLength_loop_invariant_2_established : not tried
+[wp] Goal typed_stringLength_assert_rte_mem_access : not tried
+[wp] Goal typed_stringLength_loop_assigns_part1 : trivial
+[wp] Goal typed_stringLength_loop_assigns_part2 : not tried
+[wp] Goal typed_stringLength_assigns_part1 : not tried
+[wp] Goal typed_stringLength_assigns_part2 : not tried
+[wp] Goal typed_stringLength_assigns_part3 : not tried
+[wp] Goal typed_stringLength_assigns_part4 : not tried
+[wp] Goal typed_stringLength_assigns_part5 : not tried
+[wp] Goal typed_main_ensures : not tried
+[wp] Goal typed_main_exits_never : trivial
+[wp] Goal typed_main_assert : not tried
+[wp] Goal typed_main_assigns_exit : trivial
+[wp] Goal typed_main_assigns_normal_part1 : trivial
+[wp] Goal typed_main_assigns_normal_part2 : not tried
+[wp] Goal typed_main_call_stringCompare_requires_validStrings : not tried
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 5795b95d8a27537135312148524f359331267906..138f9b7f8c0d2d9e0d80c545e30e3cb65ce9977b 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
@@ -44,9 +44,10 @@
  Functions                 WP     Alt-Ergo  Total   Success
   equal_elements           18       16       34       100%
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'equal_elements':
+[wp] tests/wp_gallery/frama_c_exo3_solved.old.c:73: Warning: 
+  Memory model hypotheses for function 'equal_elements':
   /*@
-     behavior typed_ref:
+     behavior wp_typed_ref:
        requires \separated(v1, v2, a + (..));
        requires \valid(v1);
        requires \valid(v2);
@@ -78,11 +79,3 @@
  Functions                 WP     Alt-Ergo  Total   Success
   equal_elements           29       21       50       100%
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'equal_elements':
-  /*@
-     behavior typed_ref:
-       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 fcd4c52bc00f465c3b346ae0522c976c431174c2..853e1709565b08b3e6a32c149d0eca3c486abfb1 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
@@ -45,9 +45,10 @@
  Functions                 WP     Alt-Ergo  Total   Success
   equal_elements           17       18       35       100%
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'equal_elements':
+[wp] tests/wp_gallery/frama_c_exo3_solved.old.v2.c:56: Warning: 
+  Memory model hypotheses for function 'equal_elements':
   /*@
-     behavior typed_ref:
+     behavior wp_typed_ref:
        requires \separated(v1, v2, a + (..));
        requires \valid(v1);
        requires \valid(v2);
@@ -79,11 +80,3 @@
  Functions                 WP     Alt-Ergo  Total   Success
   equal_elements           28       23       51       100%
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'equal_elements':
-  /*@
-     behavior typed_ref:
-       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/string-compare.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle_qualif/string-compare.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..48ad48fb860195d2301df4b58092b1e8086305dc
--- /dev/null
+++ b/src/plugins/wp/tests/wp_gallery/oracle_qualif/string-compare.res.oracle
@@ -0,0 +1,89 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_gallery/string-compare.c (with preprocessing)
+[wp] Running WP plugin...
+[wp] [CFG] Goal stringCompare_exits_never : Valid (Unreachable)
+[wp] [CFG] Goal stringLength_exits_never : Valid (Unreachable)
+[wp] Warning: Missing RTE guards
+[wp] 51 goals scheduled
+[wp] [Qed] Goal typed_stringCompare_complete_SomeDifferent_allEqual : Valid
+[wp] [Qed] Goal typed_stringCompare_disjoint_SomeDifferent_allEqual : Valid
+[wp] [Alt-Ergo] Goal typed_stringCompare_loop_invariant_equal_preserved : Valid
+[wp] [Qed] Goal typed_stringCompare_loop_invariant_equal_established : Valid
+[wp] [Alt-Ergo] Goal typed_stringCompare_loop_invariant_gauge_preserved : Valid
+[wp] [Qed] Goal typed_stringCompare_loop_invariant_gauge_established : Valid
+[wp] [Alt-Ergo] Goal typed_stringCompare_loop_invariant_gauge_s1_preserved : Valid
+[wp] [Qed] Goal typed_stringCompare_loop_invariant_gauge_s1_established : Valid
+[wp] [Alt-Ergo] Goal typed_stringCompare_loop_invariant_gauge_s2_preserved : Valid
+[wp] [Qed] Goal typed_stringCompare_loop_invariant_gauge_s2_established : Valid
+[wp] [Alt-Ergo] Goal typed_stringCompare_loop_invariant_not_eos_preserved : Valid
+[wp] [Qed] Goal typed_stringCompare_loop_invariant_not_eos_established : Valid
+[wp] [Alt-Ergo] Goal typed_stringCompare_loop_invariant_strlen_s1_preserved : Valid
+[wp] [Alt-Ergo] Goal typed_stringCompare_loop_invariant_strlen_s1_established : Valid
+[wp] [Alt-Ergo] Goal typed_stringCompare_loop_invariant_strlen_s2_preserved : Valid
+[wp] [Alt-Ergo] Goal typed_stringCompare_loop_invariant_strlen_s2_established : Valid
+[wp] [Alt-Ergo] Goal typed_stringCompare_assert_different : Valid
+[wp] [Qed] Goal typed_stringCompare_loop_assigns_part1 : Valid
+[wp] [Qed] Goal typed_stringCompare_loop_assigns_part2 : Valid
+[wp] [Qed] Goal typed_stringCompare_loop_assigns_part3 : Valid
+[wp] [Qed] Goal typed_stringCompare_assigns_part1 : Valid
+[wp] [Qed] Goal typed_stringCompare_assigns_part2 : Valid
+[wp] [Qed] Goal typed_stringCompare_assigns_part3 : Valid
+[wp] [Qed] Goal typed_stringCompare_assigns_part4 : Valid
+[wp] [Qed] Goal typed_stringCompare_assigns_part5 : Valid
+[wp] [Qed] Goal typed_stringCompare_assigns_part6 : Valid
+[wp] [Qed] Goal typed_stringCompare_assigns_part7 : Valid
+[wp] [Qed] Goal typed_stringCompare_assigns_part8 : Valid
+[wp] [Qed] Goal typed_stringCompare_assigns_part9 : Valid
+[wp] [Alt-Ergo] Goal typed_stringCompare_allEqual_ensures : Valid
+[wp] [Alt-Ergo] Goal typed_stringCompare_SomeDifferent_ensures : Valid
+[wp] [Alt-Ergo] Goal typed_stringLength_ensures_rightResult : Valid
+[wp] [Alt-Ergo] Goal typed_stringLength_ensures_rightEndCharacter : Valid
+[wp] [Alt-Ergo] Goal typed_stringLength_loop_invariant_preserved : Valid
+[wp] [Qed] Goal typed_stringLength_loop_invariant_established : Valid
+[wp] [Alt-Ergo] Goal typed_stringLength_loop_invariant_2_preserved : Valid
+[wp] [Qed] Goal typed_stringLength_loop_invariant_2_established : Valid
+[wp] [Qed] Goal typed_stringLength_loop_assigns_part1 : Valid
+[wp] [Qed] Goal typed_stringLength_loop_assigns_part2 : Valid
+[wp] [Qed] Goal typed_stringLength_assigns_part1 : Valid
+[wp] [Qed] Goal typed_stringLength_assigns_part2 : Valid
+[wp] [Qed] Goal typed_stringLength_assigns_part3 : Valid
+[wp] [Qed] Goal typed_stringLength_assigns_part4 : Valid
+[wp] [Qed] Goal typed_stringLength_assigns_part5 : Valid
+[wp] [Alt-Ergo] Goal typed_main_ensures : Valid
+[wp] [Qed] Goal typed_main_exits_never : Valid
+[wp] [Qed] Goal typed_main_assert : Valid
+[wp] [Qed] Goal typed_main_assigns_exit : Valid
+[wp] [Qed] Goal typed_main_assigns_normal_part1 : Valid
+[wp] [Qed] Goal typed_main_assigns_normal_part2 : Valid
+[wp] [Alt-Ergo] Goal typed_main_call_stringCompare_requires_validStrings : Valid
+[wp] Proved goals:   51 / 51
+  Qed:            33 
+  Alt-Ergo:       18
+------------------------------------------------------------
+ Functions                 WP     Alt-Ergo  Total   Success
+  stringCompare            19       12       31       100%
+  stringLength              9        4       13       100%
+  main                      5        2        7       100%
+------------------------------------------------------------
+[wp] Running WP plugin...
+[rte] annotating function main
+[rte] annotating function stringCompare
+[rte] annotating function stringLength
+[wp] 8 goals scheduled
+[wp] [Alt-Ergo] Goal typed_stringCompare_assert_rte_mem_access : Valid
+[wp] [Alt-Ergo] Goal typed_stringCompare_assert_rte_mem_access_2 : Valid
+[wp] [Qed] Goal typed_stringCompare_assert_rte_mem_access_3 : Valid
+[wp] [Qed] Goal typed_stringCompare_assert_rte_mem_access_4 : Valid
+[wp] [Alt-Ergo] Goal typed_stringCompare_assert_rte_mem_access_5 : Valid
+[wp] [Alt-Ergo] Goal typed_stringCompare_assert_rte_signed_overflow : Valid
+[wp] [Alt-Ergo] Goal typed_stringCompare_assert_rte_signed_overflow_2 : Valid
+[wp] [Alt-Ergo] Goal typed_stringLength_assert_rte_mem_access : Valid
+[wp] Proved goals:    8 / 8
+  Qed:             2 
+  Alt-Ergo:        6
+------------------------------------------------------------
+ Functions                 WP     Alt-Ergo  Total   Success
+  stringCompare            21       17       38       100%
+  stringLength              9        5       14       100%
+  main                      5        2        7       100%
+------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_gallery/string-compare.c b/src/plugins/wp/tests/wp_gallery/string-compare.c
new file mode 100644
index 0000000000000000000000000000000000000000..950ed7f72d78a0e34da6241c20251f29787cde37
--- /dev/null
+++ b/src/plugins/wp/tests/wp_gallery/string-compare.c
@@ -0,0 +1,75 @@
+/* run.config
+   OPT: -wp-no-print -wp-rte
+*/
+
+/* run.config_qualif
+   OPT: -then -wp-rte -wp
+*/
+
+#include <stdint.h>
+#include <string.h>
+#include <stdio.h>
+
+/*@ requires validStrings: valid_read_string(s1) && valid_read_string(s2);
+    assigns \nothing ;
+    allocates \nothing ;
+    frees \nothing ;
+    exits never: \false ;
+    behavior allEqual:
+        assumes \forall integer k; 0 <= k <= strlen(s1) ==> s1[k] == s2[k];
+        ensures \result == 0;
+    behavior SomeDifferent:
+        assumes \exists integer k; 0 <= k <= strlen(s1) && s1[k] != s2[k];
+        ensures \result != 0;
+
+    disjoint behaviors;
+    complete behaviors; */
+int stringCompare(const char* s1, const char* s2) {
+    if (s1 == s2)
+        return 0;
+
+    /*@ loop invariant strlen_s1: 0 <= strlen(s1) <= \at(strlen(s1), Pre);
+        loop invariant strlen_s2: 0 <= strlen(s2) <= \at(strlen(s2), Pre);
+        loop invariant gauge_s1: s1 + strlen(s1) == \at(s1 + strlen(s1), Pre);
+        loop invariant gauge_s2: s2 + strlen(s2) == \at(s2 + strlen(s2), Pre);
+        loop invariant gauge: \at(strlen(s1), Pre) - strlen(s1) == \at(strlen(s2), Pre) - strlen(s2);
+        loop invariant equal: \forall integer j; 0<= j < \at(strlen(s1), Pre) - strlen(s1) ==> \at(s1,Pre)[j] == \at(s2,Pre)[j];
+        loop invariant not_eos: \forall integer j; 0<= j < \at(strlen(s1), Pre) - strlen(s1) ==> \at(s1,Pre)[j] != 0;
+        loop assigns s1, s2; */
+    while (*s1 == *(s2++))
+    {
+       if (*(s1++) == '\0')
+         return 0;
+    }
+
+    //@ assert different: \let k = \at(strlen(s1), Pre) - strlen(s1) ; \at(s1,Pre)[k] != \at(s2,Pre)[k];
+    return *(s1) - *(--s2);
+}
+
+/*@ requires validString: valid_string(str);
+    requires validLength: 0 <= strlen(str) < SIZE_MAX;
+    assigns \nothing ;
+    exits never: \false ;
+    ensures rightResult: \result == strlen(\old(str));
+    ensures rightEndCharacter: str[\result] == '\0' ;  */
+size_t stringLength(const char* str) {
+  const char* s = str ;
+
+  /*@ loop assigns s ;
+      loop invariant s + strlen(s) == \at(str + strlen(str),Pre);
+      loop invariant 0 <= strlen(s) <= \at(strlen(str),Pre); */
+  while (*s++ != '\0');
+  return --s - str;
+}
+
+/*@ assigns \nothing ;
+    exits never: \false ;
+    ensures \result != 0 ;*/
+int main(void) {
+
+   const char hello[] = { 'h', 'e', 'l', 'l', 'o', '\0'};
+   const char helli[] =  { 'h', 'e', 'l', 'l', 'i', '\0'};
+
+   /*@ assert \valid_read(&hello[0]) && \valid_read(&helli[0]) ; */
+   return stringCompare(hello, helli);
+} 
diff --git a/src/plugins/wp/tests/wp_hoare/alias_assigns_hypotheses.i b/src/plugins/wp/tests/wp_hoare/alias_assigns_hypotheses.i
index d92187251b3139329c7f1f93a37bd33bc2f19656..8188f732108bf5a493deeaf1ff3da39a21cb6619 100644
--- a/src/plugins/wp/tests/wp_hoare/alias_assigns_hypotheses.i
+++ b/src/plugins/wp/tests/wp_hoare/alias_assigns_hypotheses.i
@@ -1,6 +1,6 @@
 /* run.config
    OPT:
-   OPT:-wp-no-warn-memory-model -wp-check-model-hypotheses -then -print
+   OPT:-wp-no-warn-memory-model -wp-check-memory-model -then -print
 */
 
 /* run.config_qualif
diff --git a/src/plugins/wp/tests/wp_hoare/alias_escapes_hypotheses.i b/src/plugins/wp/tests/wp_hoare/alias_escapes_hypotheses.i
new file mode 100644
index 0000000000000000000000000000000000000000..596e833fd35879adb7401fa91f871b8be7b0719d
--- /dev/null
+++ b/src/plugins/wp/tests/wp_hoare/alias_escapes_hypotheses.i
@@ -0,0 +1,42 @@
+/* run.config
+   OPT:
+   OPT:-wp-no-warn-memory-model -wp-check-memory-model -then -print
+*/
+
+/* run.config_qualif
+  DONTRUN:
+*/
+
+int a ;
+
+/*@ assigns \result \from \nothing ; */
+int* f1(void){
+  a = 42 ;
+  return (void*) 0 ;
+}
+
+/*@ assigns \result \from &a ; */
+int* f2(void){
+  return &a ;
+}
+
+/*@ assigns \result \from \nothing ; */
+int* f3(int x){
+  return &x ;
+}
+
+/*@ assigns *p \from \nothing ; */
+void fp1(int** p){
+  a = 42 ;
+  *p = (void*) 0 ;
+}
+
+/*@ assigns *p \from &a ; */
+void fp2(int** p){
+  *p = &a ;
+}
+
+/*@ assigns *p \from \nothing ; */
+void fp3(int** p, int x){
+  *p = &x ;
+}
diff --git a/src/plugins/wp/tests/wp_hoare/memory_hypotheses_checking.i b/src/plugins/wp/tests/wp_hoare/memory_hypotheses_checking.i
new file mode 100644
index 0000000000000000000000000000000000000000..1edcae76dccd752b02c2566b78382670f647251d
--- /dev/null
+++ b/src/plugins/wp/tests/wp_hoare/memory_hypotheses_checking.i
@@ -0,0 +1,99 @@
+/* run.config
+   OPT:-wp-model +ref -wp-no-warn-memory-model -wp-check-memory-model -then -print
+*/
+
+/* run.config_qualif
+   OPT:-wp-model +ref -wp-no-warn-memory-model -wp-check-memory-model
+*/
+
+int g ;
+
+//@ assigns \nothing ;
+int sep(int* p){
+  return *p + g;
+}
+
+//@ assigns \nothing;
+void call_sep_ok(void){
+  int l = 42;
+  sep(&l);
+}
+
+//@ assigns \nothing ;
+void call_sep_bad_sep(void){
+  sep(&g);
+}
+
+//@ assigns \nothing ;
+void call_sep_bad_valid(void){
+  int * p ;
+  {
+    int l ;
+    p = &l ;
+  }
+  sep(p);
+}
+
+int *p;
+//@ assigns \nothing ;
+int gptr_sep(void){
+  return *p + g;
+}
+
+//@ assigns p \from \nothing ;
+void call_gptr_sep_ok(void){
+  int l = 42;
+  p = &l ;
+  gptr_sep();
+}
+
+//@ assigns p \from &g ;
+void call_gptr_sep_bad(void){
+  p = &g;
+  gptr_sep();
+}
+
+
+/*@ assigns *p ; */
+void assigns_ptr(int *p){
+  *p = g + 42 ;
+}
+
+//@ assigns \nothing;
+void call_assigns_ptr_ok(void){
+  int l = 42;
+  assigns_ptr(&l);
+}
+
+//@ assigns g ;
+void call_assigns_ptr_bad(void){
+  assigns_ptr(&g);
+}
+
+/*@
+  assigns \result \from p ;
+  assigns *p ;
+  ensures \result == p ;
+*/
+int * add_return_ok(int *p){
+  (*p) += g ;
+  return p ;
+}
+
+//@ assigns g ;
+void call_add_return_ok(void){
+  int l = 0;
+  int *p = add_return_ok(&l);
+  *p = 0;
+}
+
+//@ assigns g ;
+void call_add_return_bad(void){
+  int *p = add_return_ok(&g);
+  *p = 0;
+}
+
+//@ assigns \result \from &x ;
+int * bad_return_formal(int x){
+  return &x;
+}
diff --git a/src/plugins/wp/tests/wp_hoare/model_lookup.i b/src/plugins/wp/tests/wp_hoare/model_lookup.i
new file mode 100644
index 0000000000000000000000000000000000000000..ab8f168e9fa962f72a586f459b0671242b41c6f1
--- /dev/null
+++ b/src/plugins/wp/tests/wp_hoare/model_lookup.i
@@ -0,0 +1,14 @@
+/* run.config
+   OPT: -wp-prop C
+*/
+/* run.config_qualif
+   DONTRUN:
+*/
+
+void foo(int y){
+  int x ;
+  // This assertion SHALL BE VISIBLE in the VC generated for C
+  //@ assert 0 <= y <= 4 ==> \false ;
+  x = 1 ;
+  //@ check C: x == y ;
+}
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
index a7563068d19a59845279655762f8fe59609d31ce..d0eb464123d91d75f38383dda5015e9fb88d6c07 100644
--- 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
@@ -193,51 +193,59 @@ Effect at line 103
 Prove: true.
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'global_alias':
+[wp] tests/wp_hoare/alias_assigns_hypotheses.i:17: Warning: 
+  Memory model hypotheses for function 'global_alias':
   /*@
-     behavior typed:
+     behavior wp_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:
+[wp] tests/wp_hoare/alias_assigns_hypotheses.i:24: Warning: 
+  Memory model hypotheses for function 'global_no_alias':
+  /*@ behavior wp_typed:
         requires \separated(g_alias, &g_alias); */
   void global_no_alias(void);
-[wp] Warning: Memory model hypotheses for function 'formal_alias':
-  /*@ behavior typed:
+[wp] tests/wp_hoare/alias_assigns_hypotheses.i:32: Warning: 
+  Memory model hypotheses for function 'formal_alias':
+  /*@ behavior wp_typed:
         requires \separated(f_alias, (int *)global + (..)); */
   void formal_alias(int *f_alias);
-[wp] Warning: Memory model hypotheses for function 'formal_alias_array':
+[wp] tests/wp_hoare/alias_assigns_hypotheses.i:48: Warning: 
+  Memory model hypotheses for function 'formal_alias_array':
   /*@
-     behavior typed:
+     behavior wp_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':
+[wp] tests/wp_hoare/alias_assigns_hypotheses.i:61: Warning: 
+  Memory model hypotheses for function 'field_alias':
   /*@
-     behavior typed:
+     behavior wp_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':
+[wp] tests/wp_hoare/alias_assigns_hypotheses.i:73: Warning: 
+  Memory model hypotheses for function 'field_range_alias':
   /*@
-     behavior typed:
+     behavior wp_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':
+[wp] tests/wp_hoare/alias_assigns_hypotheses.i:81: Warning: 
+  Memory model hypotheses for function 'set_alias':
   /*@
-     behavior typed:
+     behavior wp_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':
+[wp] tests/wp_hoare/alias_assigns_hypotheses.i:92: Warning: 
+  Memory model hypotheses for function 'comprehension_alias':
   /*@
-     behavior typed:
+     behavior wp_typed:
        requires
          \separated(
            (int *)global + (..), &g_alias,
@@ -245,9 +253,10 @@ Prove: true.
            );
      */
   void comprehension_alias(void);
-[wp] Warning: Memory model hypotheses for function 'union_alias':
+[wp] tests/wp_hoare/alias_assigns_hypotheses.i:102: Warning: 
+  Memory model hypotheses for function 'union_alias':
   /*@
-     behavior typed:
+     behavior wp_typed:
        requires \separated((int *)global + (..), &g_alias, {g_alias, f_alias});
        requires \separated(f_alias, (int *)global + (..), &g_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
index 8d8b21790fbe3f8679a4e78669396e93dde80db2..6b409ad35b2cbb0a2a71d67977ef47a3f084a10f 100644
--- 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
@@ -204,7 +204,7 @@ int *g_alias;
     ensures \old(global[0]) ≡ global[0];
     assigns *g_alias;
     
-    behavior typed:
+    behavior wp_typed:
       requires \separated(g_alias, (int *)global + (..), &g_alias);
  */
 void global_alias(void)
@@ -217,7 +217,7 @@ void global_alias(void)
     ensures *g_alias ≡ 1;
     assigns *g_alias;
     
-    behavior typed:
+    behavior wp_typed:
       requires \separated(g_alias, &g_alias);
  */
 void global_no_alias(void)
@@ -231,7 +231,7 @@ void global_no_alias(void)
     ensures \old(global[0]) ≡ global[0];
     assigns *f_alias;
     
-    behavior typed:
+    behavior wp_typed:
       requires \separated(f_alias, (int *)global + (..));
  */
 void formal_alias(int *f_alias)
@@ -256,7 +256,7 @@ void formal_no_alias(int *f_alias)
     ensures \old(global[0]) ≡ global[0];
     assigns (*alias_array)[0 .. 1];
     
-    behavior typed:
+    behavior wp_typed:
       requires \separated((int *)global + (..), &(*alias_array)[0 .. 1]);
       requires \separated(alias_array + (..), (int *)global + (..));
  */
@@ -272,7 +272,7 @@ void formal_alias_array(int (*alias_array)[2])
     ensures \old(global[0]) ≡ global[0];
     assigns x->x;
     
-    behavior typed:
+    behavior wp_typed:
       requires \separated((int *)global + (..), &x->x);
       requires \separated(x, (int *)global + (..));
  */
@@ -287,7 +287,7 @@ void field_alias(struct X *x)
     ensures \old(global[0]) ≡ global[0];
     assigns (x + (0 .. 3))->x;
     
-    behavior typed:
+    behavior wp_typed:
       requires \separated((int *)global + (..), &(x + (0 .. 3))->x);
       requires \separated(x + (..), (int *)global + (..));
  */
@@ -302,7 +302,7 @@ void field_range_alias(struct X *x)
     ensures \old(global[0]) ≡ global[0];
     assigns {*g_alias, *f_alias};
     
-    behavior typed:
+    behavior wp_typed:
       requires
         \separated((int *)global + (..), &g_alias, {g_alias, f_alias});
       requires \separated(f_alias, (int *)global + (..), &g_alias);
@@ -318,7 +318,7 @@ void set_alias(int *f_alias)
     ensures \old(global[0]) ≡ global[0];
     assigns {*alias | int *alias; alias ≡ \at(g_alias,Pre)};
     
-    behavior typed:
+    behavior wp_typed:
       requires
         \separated(
           (int *)global + (..), &g_alias,
@@ -336,7 +336,7 @@ void comprehension_alias(void)
     ensures \old(global[0]) ≡ global[0];
     assigns {*g_alias, *f_alias};
     
-    behavior typed:
+    behavior wp_typed:
       requires
         \separated((int *)global + (..), &g_alias, {g_alias, f_alias});
       requires \separated(f_alias, (int *)global + (..), &g_alias);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/alias_escapes_hypotheses.0.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/alias_escapes_hypotheses.0.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..98b310d588224c1d25702c99910934bbb1190db4
--- /dev/null
+++ b/src/plugins/wp/tests/wp_hoare/oracle/alias_escapes_hypotheses.0.res.oracle
@@ -0,0 +1,91 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_hoare/alias_escapes_hypotheses.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+------------------------------------------------------------
+  Function f1
+------------------------------------------------------------
+
+Goal Assigns nothing in 'f1' (1/2):
+Effect at line 14
+Prove: false.
+
+------------------------------------------------------------
+
+Goal Assigns nothing in 'f1' (2/2):
+Effect at line 15
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function f2
+------------------------------------------------------------
+
+Goal Assigns nothing in 'f2':
+Effect at line 20
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function f3
+------------------------------------------------------------
+
+Goal Assigns nothing in 'f3':
+Effect at line 25
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function fp1
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_escapes_hypotheses.i, line 28) in 'fp1' (1/2):
+Effect at line 30
+Prove: false.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_escapes_hypotheses.i, line 28) in 'fp1' (2/2):
+Effect at line 31
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function fp2
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_escapes_hypotheses.i, line 34) in 'fp2':
+Effect at line 36
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function fp3
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_escapes_hypotheses.i, line 39) in 'fp3':
+Effect at line 41
+Prove: true.
+
+------------------------------------------------------------
+[wp] tests/wp_hoare/alias_escapes_hypotheses.i:13: Warning: 
+  Memory model hypotheses for function 'f1':
+  /*@ behavior wp_typed:
+        ensures \separated(\result, &a); */
+  int *f1(void);
+[wp] tests/wp_hoare/alias_escapes_hypotheses.i:24: Warning: 
+  Memory model hypotheses for function 'f3':
+  /*@ behavior wp_typed:
+        ensures \separated(\result, &x); */
+  int *f3(int x);
+[wp] tests/wp_hoare/alias_escapes_hypotheses.i:29: Warning: 
+  Memory model hypotheses for function 'fp1':
+  /*@ behavior wp_typed:
+        requires \separated(p, &a);
+        ensures \separated(p, &a); */
+  void fp1(int **p);
+[wp] tests/wp_hoare/alias_escapes_hypotheses.i:40: Warning: 
+  Memory model hypotheses for function 'fp3':
+  /*@ behavior wp_typed:
+        ensures \separated(p, &x); */
+  void fp3(int **p, int x);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/alias_escapes_hypotheses.1.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/alias_escapes_hypotheses.1.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..f5a09c1b43a0e2513d2fd1f2dc70f68f7801815c
--- /dev/null
+++ b/src/plugins/wp/tests/wp_hoare/oracle/alias_escapes_hypotheses.1.res.oracle
@@ -0,0 +1,176 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_hoare/alias_escapes_hypotheses.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+------------------------------------------------------------
+  Function f1
+------------------------------------------------------------
+
+Goal Assigns nothing in 'f1' (1/2):
+Effect at line 14
+Prove: false.
+
+------------------------------------------------------------
+
+Goal Assigns nothing in 'f1' (2/2):
+Effect at line 15
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function f1 with behavior wp_typed
+------------------------------------------------------------
+
+Goal Post-condition for 'wp_typed' (file tests/wp_hoare/alias_escapes_hypotheses.i, line 13) in 'f1':
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function f2
+------------------------------------------------------------
+
+Goal Assigns nothing in 'f2':
+Effect at line 20
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function f3
+------------------------------------------------------------
+
+Goal Assigns nothing in 'f3':
+Effect at line 25
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function f3 with behavior wp_typed
+------------------------------------------------------------
+
+Goal Post-condition for 'wp_typed' (file tests/wp_hoare/alias_escapes_hypotheses.i, line 24) in 'f3':
+Prove: false.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function fp1
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_escapes_hypotheses.i, line 28) in 'fp1' (1/2):
+Effect at line 30
+Prove: false.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_escapes_hypotheses.i, line 28) in 'fp1' (2/2):
+Effect at line 31
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function fp1 with behavior wp_typed
+------------------------------------------------------------
+
+Goal Post-condition for 'wp_typed' (file tests/wp_hoare/alias_escapes_hypotheses.i, line 29) in 'fp1':
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function fp2
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_escapes_hypotheses.i, line 34) in 'fp2':
+Effect at line 36
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function fp3
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/alias_escapes_hypotheses.i, line 39) in 'fp3':
+Effect at line 41
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function fp3 with behavior wp_typed
+------------------------------------------------------------
+
+Goal Post-condition for 'wp_typed' (file tests/wp_hoare/alias_escapes_hypotheses.i, line 40) in 'fp3':
+Assume { (* Heap *) Type: region(p.base) <= 0. }
+Prove: global(P_x_46) != p.
+
+------------------------------------------------------------
+/* Generated by Frama-C */
+int a;
+/*@ assigns \result;
+    assigns \result \from \nothing;
+    
+    behavior wp_typed:
+      ensures \separated(\result, &a);
+ */
+int *f1(void)
+{
+  int *__retres;
+  a = 42;
+  __retres = (int *)0;
+  return __retres;
+}
+
+/*@ assigns \result;
+    assigns \result \from &a; */
+int *f2(void)
+{
+  int *__retres;
+  __retres = & a;
+  return __retres;
+}
+
+/*@ assigns \result;
+    assigns \result \from \nothing;
+    
+    behavior wp_typed:
+      ensures \separated(\result, &x);
+ */
+int *f3(int x)
+{
+  int *__retres;
+  __retres = & x;
+  return __retres;
+}
+
+/*@ assigns *p;
+    assigns *p \from \nothing;
+    
+    behavior wp_typed:
+      requires \separated(p, &a);
+      ensures \separated(p, &a);
+ */
+void fp1(int **p)
+{
+  a = 42;
+  *p = (int *)0;
+  return;
+}
+
+/*@ assigns *p;
+    assigns *p \from &a; */
+void fp2(int **p)
+{
+  *p = & a;
+  return;
+}
+
+/*@ assigns *p;
+    assigns *p \from \nothing;
+    
+    behavior wp_typed:
+      ensures \separated(p, &x);
+ */
+void fp3(int **p, int x)
+{
+  *p = & x;
+  return;
+}
+
+
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 7e293d6784d6dfa5c7c664bd3debd11c28ae933b..66559f6e88f99e8cc382a7a77f70eb25dce80114 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
@@ -85,15 +85,18 @@ Goal Instance of 'Pre-condition (file byref.i, line 11) in 'f'' in 'wrong_withou
 Prove: true.
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'f':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/byref.i:14: Warning: 
+  Memory model hypotheses for function 'f':
+  /*@ behavior wp_typed_ref:
         requires \valid(r); */
   void f(int *r);
-[wp] Warning: Memory model hypotheses for function 'wrong_without_ref':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/byref.i:20: Warning: 
+  Memory model hypotheses for function 'wrong_without_ref':
+  /*@ behavior wp_typed_ref:
         requires \valid(q); */
   int wrong_without_ref(int *q);
-[wp] Warning: Memory model hypotheses for function 'pointer':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/byref.i:31: Warning: 
+  Memory model hypotheses for function 'pointer':
+  /*@ behavior wp_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 5ecf70e38eea266e5585b70fe06f5b276265938d..f9b5d1dd238a5a1cbfed939be2ced8cb75b6764d 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
@@ -496,11 +496,38 @@ Effect at line 46
 Prove: true.
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'ref_bd':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/dispatch_var.i:12: Warning: 
+  Memory model hypotheses for function 'ref_ctr':
+  /*@ behavior wp_typed_ref:
+        requires \valid(p); */
+  int ref_ctr(int *p);
+[wp] tests/wp_hoare/dispatch_var.i:44: Warning: 
+  Memory model hypotheses for function 'ref_bd':
+  /*@ behavior wp_typed_ref:
         requires \valid(q); */
   int ref_bd(int *q);
-[wp] Warning: Memory model hypotheses for function 'g':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/dispatch_var.i:83: Warning: 
+  Memory model hypotheses for function 'ref_valid':
+  /*@ behavior wp_typed_ref:
+        requires \valid(p1); */
+  int ref_valid(int *p1);
+[wp] tests/wp_hoare/dispatch_var.i:133: Warning: 
+  Memory model hypotheses for function 'ref_ctr_nr':
+  /*@
+     behavior wp_typed_ref:
+       requires \separated(ref, ref1, ref2);
+       requires \valid(ref);
+       requires \valid(ref1);
+       requires \valid(ref2);
+     */
+  int ref_ctr_nr(int *ref, int *ref1, int *ref2);
+[wp] tests/wp_hoare/dispatch_var.i:158: Warning: 
+  Memory model hypotheses for function 'ref_ctr_nstars':
+  /*@ behavior wp_typed_ref:
+        requires \valid(pp); */
+  int ref_ctr_nstars(int **pp);
+[wp] tests/wp_hoare/dispatch_var.i:194: Warning: 
+  Memory model hypotheses for function 'g':
+  /*@ behavior wp_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 c3108b02bc744f6f503e66fc7cab7b99c970a0de..4dd463aa0e680da007a5621ba417f1536ad02fe8 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
@@ -485,19 +485,23 @@ Goal Assigns (file dispatch_var2.i, line 13) in 'reset':
 Prove: true.
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'reset':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/dispatch_var2.i:16: Warning: 
+  Memory model hypotheses for function 'reset':
+  /*@ behavior wp_typed_ref:
         requires \valid(rp); */
   void reset(int *rp);
-[wp] Warning: Memory model hypotheses for function 'incr':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/dispatch_var2.i:23: Warning: 
+  Memory model hypotheses for function 'incr':
+  /*@ behavior wp_typed_ref:
         requires \valid(ip); */
   void incr(int *ip);
-[wp] Warning: Memory model hypotheses for function 'load':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/dispatch_var2.i:31: Warning: 
+  Memory model hypotheses for function 'load':
+  /*@ behavior wp_typed_ref:
         requires \valid(lp); */
   int load(int *lp);
-[wp] Warning: Memory model hypotheses for function 'call_param_ref':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/dispatch_var2.i:70: Warning: 
+  Memory model hypotheses for function 'call_param_ref':
+  /*@ behavior wp_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 25c2a4d8d8919b9129781a66b5970a88558301bd..bf9949e2eab9cfee2b73070f01348889a681602e 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
@@ -210,19 +210,23 @@ Goal Assigns (file dispatch_var2.i, line 13) in 'reset':
 Prove: true.
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'reset':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/dispatch_var2.i:16: Warning: 
+  Memory model hypotheses for function 'reset':
+  /*@ behavior wp_typed_ref:
         requires \valid(rp); */
   void reset(int *rp);
-[wp] Warning: Memory model hypotheses for function 'incr':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/dispatch_var2.i:23: Warning: 
+  Memory model hypotheses for function 'incr':
+  /*@ behavior wp_typed_ref:
         requires \valid(ip); */
   void incr(int *ip);
-[wp] Warning: Memory model hypotheses for function 'load':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/dispatch_var2.i:31: Warning: 
+  Memory model hypotheses for function 'load':
+  /*@ behavior wp_typed_ref:
         requires \valid(lp); */
   int load(int *lp);
-[wp] Warning: Memory model hypotheses for function 'call_param_ref':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/dispatch_var2.i:70: Warning: 
+  Memory model hypotheses for function 'call_param_ref':
+  /*@ behavior wp_typed_ref:
         requires \valid(q); */
   int call_param_ref(int *q);
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 536d759c1d2d465ff68f9297ee2310f8bf8ef29d..41764a3a172fd80c2712f1b448148bda5fa613fc 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle/logicarr.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle/logicarr.res.oracle
@@ -14,8 +14,8 @@ Let a_2 = shift_sint32(a, j).
 Let m = Mint_0[a_1 <- Mint_0[a_2]][a_2 <- x][shift_sint32(a, k) <- x].
 Assume {
   Type: is_sint32(i) /\ is_sint32(j) /\ is_sint32(k) /\
-      IsArray1_sint32(Array1_int(a, 10, Mint_0)) /\ is_sint32(x) /\
-      IsArray1_sint32(Array1_int(a, 10, m)).
+      IsArray_sint32(Array_sint32(a, 10, Mint_0)) /\ is_sint32(x) /\
+      IsArray_sint32(Array_sint32(a, 10, m)).
   (* Pre-condition *)
   Have: (0 <= i) /\ (0 <= j) /\ (0 <= k) /\ (i <= 9) /\ (j <= 9) /\ (k <= 9).
 }
@@ -25,15 +25,15 @@ Prove: P_p_pointer(m, Mint_0, shift_sint32(a, 0), i, j).
 
 Goal Post-condition 'ARR' in 'job':
 Let a = global(G_arr_35).
-Let m = Array1_int(a, 10, Mint_0).
+Let m = Array_sint32(a, 10, Mint_0).
 Let a_1 = shift_sint32(a, i).
 Let x = Mint_0[a_1].
 Let a_2 = shift_sint32(a, j).
-Let m_1 = Array1_int(a, 10,
+Let m_1 = Array_sint32(a, 10,
             Mint_0[a_1 <- Mint_0[a_2]][a_2 <- x][shift_sint32(a, k) <- x]).
 Assume {
-  Type: is_sint32(i) /\ is_sint32(j) /\ is_sint32(k) /\ IsArray1_sint32(m) /\
-      is_sint32(x) /\ IsArray1_sint32(m_1).
+  Type: is_sint32(i) /\ is_sint32(j) /\ is_sint32(k) /\ IsArray_sint32(m) /\
+      is_sint32(x) /\ IsArray_sint32(m_1).
   (* Pre-condition *)
   Have: (0 <= i) /\ (0 <= j) /\ (0 <= k) /\ (i <= 9) /\ (j <= 9) /\ (k <= 9).
 }
@@ -46,12 +46,12 @@ Let a = global(G_arr_35).
 Let a_1 = shift_sint32(a, i).
 Let x = Mint_0[a_1].
 Let a_2 = shift_sint32(a, j).
-Let m = Array1_int(a, 10,
+Let m = Array_sint32(a, 10,
           Mint_0[a_1 <- Mint_0[a_2]][a_2 <- x][shift_sint32(a, k) <- x]).
 Assume {
   Type: is_sint32(i) /\ is_sint32(j) /\ is_sint32(k) /\
-      IsArray1_sint32(Array1_int(a, 10, Mint_0)) /\ is_sint32(x) /\
-      IsArray1_sint32(m).
+      IsArray_sint32(Array_sint32(a, 10, Mint_0)) /\ is_sint32(x) /\
+      IsArray_sint32(m).
   (* Pre-condition *)
   Have: (0 <= i) /\ (0 <= j) /\ (0 <= k) /\ (i <= 9) /\ (j <= 9) /\ (k <= 9).
 }
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/memory_hypotheses_checking.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/memory_hypotheses_checking.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..380a7e0cc8ace27dc70721782cf090990ab2631b
--- /dev/null
+++ b/src/plugins/wp/tests/wp_hoare/oracle/memory_hypotheses_checking.res.oracle
@@ -0,0 +1,486 @@
+# frama-c -wp -wp-model 'Typed (Ref)' [...]
+[kernel] Parsing tests/wp_hoare/memory_hypotheses_checking.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+------------------------------------------------------------
+  Function add_return_ok
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_hoare/memory_hypotheses_checking.i, line 76) in 'add_return_ok':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/memory_hypotheses_checking.i, line 74) in 'add_return_ok':
+Effect at line 79
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function add_return_ok with behavior wp_typed_ref
+------------------------------------------------------------
+
+Goal Post-condition for 'wp_typed_ref' (file tests/wp_hoare/memory_hypotheses_checking.i, line 78) in 'add_return_ok':
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function assigns_ptr
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/memory_hypotheses_checking.i, line 57) in 'assigns_ptr':
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function bad_return_formal
+------------------------------------------------------------
+
+Goal Assigns nothing in 'bad_return_formal':
+Effect at line 98
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function bad_return_formal with behavior wp_typed_ref
+------------------------------------------------------------
+
+Goal Post-condition for 'wp_typed_ref' (file tests/wp_hoare/memory_hypotheses_checking.i, line 97) in 'bad_return_formal':
+Prove: false.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function call_add_return_bad
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/memory_hypotheses_checking.i, line 90) in 'call_add_return_bad':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/memory_hypotheses_checking.i, line 90) in 'call_add_return_bad' (1/3):
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/memory_hypotheses_checking.i, line 90) in 'call_add_return_bad' (2/3):
+Call Result at line 92
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/memory_hypotheses_checking.i, line 90) in 'call_add_return_bad' (3/3):
+Effect at line 93
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition for 'wp_typed_ref' (file tests/wp_hoare/memory_hypotheses_checking.i, line 78) in 'add_return_ok'' in 'call_add_return_bad' at initialization of 'p_0' (file tests/wp_hoare/memory_hypotheses_checking.i, line 92)
+:
+Prove: false.
+
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition for 'wp_typed_ref' (file tests/wp_hoare/memory_hypotheses_checking.i, line 78) in 'add_return_ok'' in 'call_add_return_bad' at initialization of 'p_0' (file tests/wp_hoare/memory_hypotheses_checking.i, line 92)
+:
+Prove: false.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function call_add_return_ok
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/memory_hypotheses_checking.i, line 83) in 'call_add_return_ok':
+Call Effect at line 86
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/memory_hypotheses_checking.i, line 83) in 'call_add_return_ok' (1/3):
+Call Effect at line 86
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/memory_hypotheses_checking.i, line 83) in 'call_add_return_ok' (2/3):
+Call Result at line 86
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/memory_hypotheses_checking.i, line 83) in 'call_add_return_ok' (3/3):
+Effect at line 87
+Assume { (* Heap *) Type: linked(Malloc_0). }
+Prove: invalid(Malloc_0, global(L_l_71), 1).
+
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition for 'wp_typed_ref' (file tests/wp_hoare/memory_hypotheses_checking.i, line 78) in 'add_return_ok'' in 'call_add_return_ok' at initialization of 'p_0' (file tests/wp_hoare/memory_hypotheses_checking.i, line 86)
+:
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition for 'wp_typed_ref' (file tests/wp_hoare/memory_hypotheses_checking.i, line 78) in 'add_return_ok'' in 'call_add_return_ok' at initialization of 'p_0' (file tests/wp_hoare/memory_hypotheses_checking.i, line 86)
+:
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function call_assigns_ptr_bad
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/memory_hypotheses_checking.i, line 68) in 'call_assigns_ptr_bad':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/memory_hypotheses_checking.i, line 68) in 'call_assigns_ptr_bad':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition for 'wp_typed_ref' (file tests/wp_hoare/memory_hypotheses_checking.i, line 58) in 'assigns_ptr'' in 'call_assigns_ptr_bad' at call 'assigns_ptr' (file tests/wp_hoare/memory_hypotheses_checking.i, line 70)
+:
+Prove: false.
+
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition for 'wp_typed_ref' (file tests/wp_hoare/memory_hypotheses_checking.i, line 58) in 'assigns_ptr'' in 'call_assigns_ptr_bad' at call 'assigns_ptr' (file tests/wp_hoare/memory_hypotheses_checking.i, line 70)
+:
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function call_assigns_ptr_ok
+------------------------------------------------------------
+
+Goal Assigns nothing in 'call_assigns_ptr_ok':
+Call Effect at line 65
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns nothing in 'call_assigns_ptr_ok':
+Call Effect at line 65
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition for 'wp_typed_ref' (file tests/wp_hoare/memory_hypotheses_checking.i, line 58) in 'assigns_ptr'' in 'call_assigns_ptr_ok' at call 'assigns_ptr' (file tests/wp_hoare/memory_hypotheses_checking.i, line 65)
+:
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition for 'wp_typed_ref' (file tests/wp_hoare/memory_hypotheses_checking.i, line 58) in 'assigns_ptr'' in 'call_assigns_ptr_ok' at call 'assigns_ptr' (file tests/wp_hoare/memory_hypotheses_checking.i, line 65)
+:
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function call_gptr_sep_bad
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/memory_hypotheses_checking.i, line 50) in 'call_gptr_sep_bad':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/memory_hypotheses_checking.i, line 50) in 'call_gptr_sep_bad':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition for 'wp_typed_ref' (file tests/wp_hoare/memory_hypotheses_checking.i, line 39) in 'gptr_sep'' in 'call_gptr_sep_bad' at call 'gptr_sep' (file tests/wp_hoare/memory_hypotheses_checking.i, line 53)
+:
+Prove: false.
+
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition for 'wp_typed_ref' (file tests/wp_hoare/memory_hypotheses_checking.i, line 39) in 'gptr_sep'' in 'call_gptr_sep_bad' at call 'gptr_sep' (file tests/wp_hoare/memory_hypotheses_checking.i, line 53)
+:
+Assume { (* Heap *) Type: linked(Malloc_0). }
+Prove: valid_rw(Malloc_0, global(G_g_20), 1).
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function call_gptr_sep_ok
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/memory_hypotheses_checking.i, line 43) in 'call_gptr_sep_ok':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_hoare/memory_hypotheses_checking.i, line 43) in 'call_gptr_sep_ok':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition for 'wp_typed_ref' (file tests/wp_hoare/memory_hypotheses_checking.i, line 39) in 'gptr_sep'' in 'call_gptr_sep_ok' at call 'gptr_sep' (file tests/wp_hoare/memory_hypotheses_checking.i, line 47)
+:
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition for 'wp_typed_ref' (file tests/wp_hoare/memory_hypotheses_checking.i, line 39) in 'gptr_sep'' in 'call_gptr_sep_ok' at call 'gptr_sep' (file tests/wp_hoare/memory_hypotheses_checking.i, line 47)
+:
+Assume { (* Heap *) Type: linked(Malloc_0). }
+Prove: valid_rw(Malloc_0[L_l_46 <- 1], global(L_l_46), 1).
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function call_sep_bad_sep
+------------------------------------------------------------
+
+Goal Assigns nothing in 'call_sep_bad_sep':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns nothing in 'call_sep_bad_sep':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition for 'wp_typed_ref' (file tests/wp_hoare/memory_hypotheses_checking.i, line 12) in 'sep'' in 'call_sep_bad_sep' at call 'sep' (file tests/wp_hoare/memory_hypotheses_checking.i, line 24)
+:
+Prove: false.
+
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition for 'wp_typed_ref' (file tests/wp_hoare/memory_hypotheses_checking.i, line 12) in 'sep'' in 'call_sep_bad_sep' at call 'sep' (file tests/wp_hoare/memory_hypotheses_checking.i, line 24)
+:
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function call_sep_bad_valid
+------------------------------------------------------------
+
+Goal Assigns nothing in 'call_sep_bad_valid' (1/2):
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns nothing in 'call_sep_bad_valid' (2/2):
+Effect at line 32
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns nothing in 'call_sep_bad_valid' (1/2):
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns nothing in 'call_sep_bad_valid' (2/2):
+Effect at line 32
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition for 'wp_typed_ref' (file tests/wp_hoare/memory_hypotheses_checking.i, line 12) in 'sep'' in 'call_sep_bad_valid' at call 'sep' (file tests/wp_hoare/memory_hypotheses_checking.i, line 34)
+:
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition for 'wp_typed_ref' (file tests/wp_hoare/memory_hypotheses_checking.i, line 12) in 'sep'' in 'call_sep_bad_valid' at call 'sep' (file tests/wp_hoare/memory_hypotheses_checking.i, line 34)
+:
+Assume { (* Heap *) Type: linked(Malloc_0). }
+Prove: valid_rw(Malloc_0[L_l_37 <- 0], global(L_l_37), 1).
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function call_sep_ok
+------------------------------------------------------------
+
+Goal Assigns nothing in 'call_sep_ok':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns nothing in 'call_sep_ok':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition for 'wp_typed_ref' (file tests/wp_hoare/memory_hypotheses_checking.i, line 12) in 'sep'' in 'call_sep_ok' at call 'sep' (file tests/wp_hoare/memory_hypotheses_checking.i, line 19)
+:
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Instance of 'Pre-condition for 'wp_typed_ref' (file tests/wp_hoare/memory_hypotheses_checking.i, line 12) in 'sep'' in 'call_sep_ok' at call 'sep' (file tests/wp_hoare/memory_hypotheses_checking.i, line 19)
+:
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function gptr_sep
+------------------------------------------------------------
+
+Goal Assigns nothing in 'gptr_sep':
+Effect at line 40
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function sep
+------------------------------------------------------------
+
+Goal Assigns nothing in 'sep':
+Effect at line 13
+Prove: true.
+
+------------------------------------------------------------
+/* Generated by Frama-C */
+int g;
+/*@ assigns \nothing;
+    
+    behavior wp_typed_ref:
+      requires \separated(p_0, &g);
+      requires \valid(p_0);
+ */
+int sep(int *p_0)
+{
+  int __retres;
+  __retres = *p_0 + g;
+  return __retres;
+}
+
+/*@ assigns \nothing; */
+void call_sep_ok(void)
+{
+  int l = 42;
+  sep(& l);
+  return;
+}
+
+/*@ assigns \nothing; */
+void call_sep_bad_sep(void)
+{
+  sep(& g);
+  return;
+}
+
+/*@ assigns \nothing; */
+void call_sep_bad_valid(void)
+{
+  int *p_0;
+  {
+    int l;
+    p_0 = & l;
+  }
+  sep(p_0);
+  return;
+}
+
+int *p;
+/*@ assigns \nothing;
+    
+    behavior wp_typed_ref:
+      requires \separated(p, &g);
+      requires \valid(p);
+ */
+int gptr_sep(void)
+{
+  int __retres;
+  __retres = *p + g;
+  return __retres;
+}
+
+/*@ assigns p;
+    assigns p \from \nothing; */
+void call_gptr_sep_ok(void)
+{
+  int l = 42;
+  p = & l;
+  gptr_sep();
+  return;
+}
+
+/*@ assigns p;
+    assigns p \from &g; */
+void call_gptr_sep_bad(void)
+{
+  p = & g;
+  gptr_sep();
+  return;
+}
+
+/*@ assigns *p_0;
+    
+    behavior wp_typed_ref:
+      requires \separated(p_0, &g);
+      requires \valid(p_0);
+ */
+void assigns_ptr(int *p_0)
+{
+  *p_0 = g + 42;
+  return;
+}
+
+/*@ assigns \nothing; */
+void call_assigns_ptr_ok(void)
+{
+  int l = 42;
+  assigns_ptr(& l);
+  return;
+}
+
+/*@ assigns g; */
+void call_assigns_ptr_bad(void)
+{
+  assigns_ptr(& g);
+  return;
+}
+
+/*@ ensures \result ≡ \old(p_0);
+    assigns \result, *p_0;
+    assigns \result \from p_0;
+    
+    behavior wp_typed_ref:
+      requires \separated(p_0 + (..), &g);
+      requires \separated(p_0, &g);
+      ensures \separated(\result, &g);
+ */
+int *add_return_ok(int *p_0)
+{
+  *p_0 += g;
+  return p_0;
+}
+
+/*@ assigns g; */
+void call_add_return_ok(void)
+{
+  int l = 0;
+  int *p_0 = add_return_ok(& l);
+  *p_0 = 0;
+  return;
+}
+
+/*@ assigns g; */
+void call_add_return_bad(void)
+{
+  int *p_0 = add_return_ok(& g);
+  *p_0 = 0;
+  return;
+}
+
+/*@ assigns \result;
+    assigns \result \from &x;
+    
+    behavior wp_typed_ref:
+      ensures \separated(\result, &x);
+ */
+int *bad_return_formal(int x)
+{
+  int *__retres;
+  __retres = & x;
+  return __retres;
+}
+
+
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/model_lookup.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/model_lookup.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..21c6e1bbce770fc3066946956093ce2196b4242b
--- /dev/null
+++ b/src/plugins/wp/tests/wp_hoare/oracle/model_lookup.res.oracle
@@ -0,0 +1,17 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_hoare/model_lookup.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+------------------------------------------------------------
+  Function foo
+------------------------------------------------------------
+
+Goal Check 'C' (file tests/wp_hoare/model_lookup.i, line 13):
+Assume {
+  Type: is_sint32(y).
+  (* Assertion *)
+  Have: ((0 <= y) -> ((y <= 4) -> false)).
+}
+Prove: y = 1.
+
+------------------------------------------------------------
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 9e26b3821a8ac83000ece941db30910386026504..e360c218c8044f1de95a510a3d4a0a5023a0c72c 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle/reference.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle/reference.res.oracle
@@ -141,15 +141,32 @@ Goal Assigns (file reference.i, line 57) in 'write':
 Prove: true.
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'call_f2':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/reference.i:14: Warning: 
+  Memory model hypotheses for function 'f':
+  /*@ behavior wp_typed_ref:
+        requires \valid(p); */
+  int f(int *p);
+[wp] tests/wp_hoare/reference.i:30: Warning: 
+  Memory model hypotheses for function 'f2':
+  /*@
+     behavior wp_typed_ref:
+       requires \separated(p2, q);
+       requires \valid(p2);
+       requires \valid(q);
+     */
+  int f2(int *p2, int *q);
+[wp] tests/wp_hoare/reference.i:37: Warning: 
+  Memory model hypotheses for function 'call_f2':
+  /*@ behavior wp_typed_ref:
         requires \valid(ptr); */
   int call_f2(int *ptr, int y);
-[wp] Warning: Memory model hypotheses for function 'call_global':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/reference.i:48: Warning: 
+  Memory model hypotheses for function 'call_global':
+  /*@ behavior wp_typed_ref:
         requires \valid(gl); */
   int call_global(void);
-[wp] Warning: Memory model hypotheses for function 'write':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/reference.i:60: Warning: 
+  Memory model hypotheses for function 'write':
+  /*@ behavior wp_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 9e00691a476c29f6affde9a08cad6cd0ae5472c5..c17c1fc95ce638acdd0f88d65afe155cd2b521a4 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
@@ -133,7 +133,7 @@ Prove: true.
 Goal Post-condition 'Preset_5' in 'call_reset_5':
 Assume {
   (* Heap *)
-  Type: IsArray1S1_T(ts_1).
+  Type: IsArray_S1_T(ts_1).
   (* Goal *)
   When: (0 <= i) /\ (i <= 4).
   (* Call 'reset_5' *)
@@ -170,7 +170,7 @@ Goal Post-condition 'Presset_mat' in 'call_reset_5_dim2':
 Let m = smatrix_0[1].
 Assume {
   (* Heap *)
-  Type: IsArray2S1_T(smatrix_1).
+  Type: IsArray_d2_S1_T(smatrix_1).
   (* Goal *)
   When: (0 <= i) /\ (i <= 4).
   (* Call 'reset_5' *)
@@ -204,7 +204,7 @@ Prove: true.
 
 Goal Post-condition 'Preset_5_tps' in 'call_reset_5_tps':
 Let a = tps_0[9].
-Let a_1 = shift_T(a, 0).
+Let a_1 = shift_S1_T(a, 0).
 Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, 10).
 Assume {
   (* Heap *)
@@ -215,9 +215,9 @@ Assume {
   Have: valid_rw(Malloc_0, a_1, 10).
   (* Call 'reset_5' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 4) ->
-      (a_2[shiftfield_F1_T_a(shift_T(a, i_1))] = 0))).
+      (a_2[shiftfield_F1_T_a(shift_S1_T(a, i_1))] = 0))).
 }
-Prove: a_2[shiftfield_F1_T_a(shift_T(a, i))] = 0.
+Prove: a_2[shiftfield_F1_T_a(shift_S1_T(a, i))] = 0.
 
 ------------------------------------------------------------
 
@@ -251,13 +251,22 @@ Goal Assigns (file reference_and_struct.i, line 12) in 'reset':
 Prove: true.
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'reset':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/reference_and_struct.i:15: Warning: 
+  Memory model hypotheses for function 'reset':
+  /*@ behavior wp_typed_ref:
         requires \valid(p); */
   void reset(struct T *p);
-[wp] Warning: Memory model hypotheses for function 'call_reset_5_tps':
+[wp] tests/wp_hoare/reference_and_struct.i:48: Warning: 
+  Memory model hypotheses for function 'call_reset_5_tps':
   /*@
-     behavior typed_ref:
+     behavior wp_typed_ref:
        requires \separated((struct T **)tps + (..), tps[9] + (0 .. 4));
      */
   void call_reset_5_tps(void);
+[wp] tests/wp_hoare/reference_and_struct.i:88: Warning: 
+  Memory model hypotheses for function 'load_5':
+  /*@
+     behavior wp_typed_ref:
+       requires \separated(hp + (..), (int *)reg_load + (..));
+     */
+  void load_5(int *hp);
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 175ac961943d3546564ac173347c2d5f584461eb..6934cd6684e2408971edddd39133310f09a4b787 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
@@ -10,7 +10,7 @@ Goal Post-condition (file reference_array.i, line 49) in 'add_1_5':
 Let a = shift_A5_sint32(ap_0, 0).
 Assume {
   (* Heap *)
-  Type: (region(ap_0.base) <= 0) /\ IsArray1_sint32(reg_load_0) /\
+  Type: (region(ap_0.base) <= 0) /\ IsArray_sint32(reg_load_0) /\
       linked(Malloc_0).
   (* Goal *)
   When: (0 <= i) /\ (i <= 4).
@@ -46,7 +46,7 @@ Prove: true.
 Goal Post-condition 'Pload' in 'calls_on_array_dim_1':
 Assume {
   (* Heap *)
-  Type: IsArray1_sint32(t).
+  Type: IsArray_sint32(t).
   (* Goal *)
   When: (0 <= i) /\ (i <= 4).
   (* Call 'load_5' *)
@@ -68,7 +68,7 @@ Prove: t[i] = reg_load_0[i].
 Goal Post-condition 'Preset' in 'calls_on_array_dim_1':
 Assume {
   (* Heap *)
-  Type: IsArray1_sint32(t_1).
+  Type: IsArray_sint32(t_1).
   (* Goal *)
   When: (0 <= i) /\ (i <= 4).
   (* Call 'load_5' *)
@@ -90,7 +90,7 @@ Prove: t[i] = 0.
 Goal Post-condition 'Padd' in 'calls_on_array_dim_1':
 Assume {
   (* Heap *)
-  Type: IsArray1_sint32(t).
+  Type: IsArray_sint32(t).
   (* Goal *)
   When: (0 <= i) /\ (i <= 4).
   (* Call 'load_5' *)
@@ -144,7 +144,7 @@ Goal Post-condition 'Pload' in 'calls_on_array_dim_2':
 Let m = tt_0[0].
 Assume {
   (* Heap *)
-  Type: IsArray2_sint32(tt_0).
+  Type: IsArray_d2_sint32(tt_0).
   (* Goal *)
   When: (0 <= i) /\ (i <= 4).
   (* Call 'load_1_5' *)
@@ -163,7 +163,7 @@ Prove: m[i] = reg_load_0[i].
 Goal Post-condition 'Preset' in 'calls_on_array_dim_2':
 Assume {
   (* Heap *)
-  Type: IsArray2_sint32(tt_0).
+  Type: IsArray_d2_sint32(tt_0).
   (* Goal *)
   When: (0 <= i) /\ (i <= 4).
   (* Call 'load_1_5' *)
@@ -183,7 +183,7 @@ Goal Post-condition 'Padd' in 'calls_on_array_dim_2':
 Let m = tt_0[0].
 Assume {
   (* Heap *)
-  Type: IsArray2_sint32(tt_0).
+  Type: IsArray_d2_sint32(tt_0).
   (* Goal *)
   When: (0 <= i) /\ (i <= 4).
   (* Call 'load_1_5' *)
@@ -235,7 +235,7 @@ Let m = tt_1[0].
 Let m_1 = tt_0[0].
 Assume {
   (* Heap *)
-  Type: IsArray2_sint32(tt_0).
+  Type: IsArray_d2_sint32(tt_0).
   (* Goal *)
   When: (0 <= i) /\ (i <= 4).
   (* Call 'load_5' *)
@@ -257,7 +257,7 @@ Goal Post-condition 'Preset' in 'calls_on_array_dim_2_to_1':
 Let m = tt_0[0].
 Assume {
   (* Heap *)
-  Type: IsArray2_sint32(tt_1).
+  Type: IsArray_d2_sint32(tt_1).
   (* Goal *)
   When: (0 <= i) /\ (i <= 4).
   (* Call 'load_5' *)
@@ -280,7 +280,7 @@ Let m = tt_1[0].
 Let m_1 = tt_0[0].
 Assume {
   (* Heap *)
-  Type: IsArray2_sint32(tt_0).
+  Type: IsArray_d2_sint32(tt_0).
   (* Goal *)
   When: (0 <= i) /\ (i <= 4).
   (* Call 'load_5' *)
@@ -401,15 +401,32 @@ Goal Instance of 'Pre-condition (file reference_array.i, line 9) in 'reset_5'' i
 Prove: true.
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'load_1_5':
+[wp] tests/wp_hoare/reference_array.i:24: Warning: 
+  Memory model hypotheses for function 'load_5':
   /*@
-     behavior typed_ref:
+     behavior wp_typed_ref:
+       requires \separated(hp + (..), (int *)reg_load + (..));
+     */
+  void load_5(int *hp);
+[wp] tests/wp_hoare/reference_array.i:31: Warning: 
+  Memory model hypotheses for function 'add_5':
+  /*@
+     behavior wp_typed_ref:
+       requires
+         \separated(gp + (..), (int *)reg_load + (..), (int *)reg_add + (..));
+     */
+  void add_5(int *gp);
+[wp] tests/wp_hoare/reference_array.i:45: Warning: 
+  Memory model hypotheses for function 'load_1_5':
+  /*@
+     behavior wp_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':
+[wp] tests/wp_hoare/reference_array.i:52: Warning: 
+  Memory model hypotheses for function 'add_1_5':
   /*@
-     behavior typed_ref:
+     behavior wp_typed_ref:
        requires
          \separated(ap + (..), (int *)reg_load + (..), (int *)reg_add + (..));
      */
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 3a1216bb1ed46dbf42c16b1ee2abc1b2b36db476..932c0f1b481c54606fccd84199b598b487fd9aa2 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
@@ -37,3 +37,8 @@ Goal Post-condition (file reference_array_simple.i, line 39) in 'call_f3':
 Prove: true.
 
 ------------------------------------------------------------
+[wp] tests/wp_hoare/reference_array_simple.i:40: Warning: 
+  Memory model hypotheses for function 'call_f3':
+  /*@ behavior wp_typed_ref:
+        ensures \separated(\result, (int **)tp + (..)); */
+  int *call_f3(void);
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 697ea47b596a00eabdd1cd3397cbc8db0bad30b9..f0d753a7ab60d693b1a1894c4b02409c715af15e 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle/refguards.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle/refguards.res.oracle
@@ -68,25 +68,28 @@ Assume { (* Heap *) Type: (region(c.base) <= 0) /\ (region(d.base) <= 0). }
 Prove: d != c.
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'f':
+[wp] tests/wp_hoare/refguards.i:10: Warning: 
+  Memory model hypotheses for function 'f':
   /*@
-     behavior typed_ref:
+     behavior wp_typed_ref:
        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':
+[wp] tests/wp_hoare/refguards.i:25: Warning: 
+  Memory model hypotheses for function 'h':
   /*@
-     behavior typed_ref:
+     behavior wp_typed_ref:
        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':
+[wp] tests/wp_hoare/refguards.i:39: Warning: 
+  Memory model hypotheses for function 's':
   /*@
-     behavior typed_ref:
+     behavior wp_typed_ref:
        requires \separated(c, d);
        requires \valid(c);
        requires \valid(d);
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
index 0c71166950ca540ca3883d76687323b3922c87b7..ced8d056ef8e8f8f3f1fa7c9e08d05022cdf4cb3 100644
--- 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
@@ -48,51 +48,59 @@
   comprehension_alias       3        -        3       100%
   union_alias               3        -        3       100%
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'global_alias':
+[wp] tests/wp_hoare/alias_assigns_hypotheses.i:17: Warning: 
+  Memory model hypotheses for function 'global_alias':
   /*@
-     behavior typed:
+     behavior wp_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:
+[wp] tests/wp_hoare/alias_assigns_hypotheses.i:24: Warning: 
+  Memory model hypotheses for function 'global_no_alias':
+  /*@ behavior wp_typed:
         requires \separated(g_alias, &g_alias); */
   void global_no_alias(void);
-[wp] Warning: Memory model hypotheses for function 'formal_alias':
-  /*@ behavior typed:
+[wp] tests/wp_hoare/alias_assigns_hypotheses.i:32: Warning: 
+  Memory model hypotheses for function 'formal_alias':
+  /*@ behavior wp_typed:
         requires \separated(f_alias, (int *)global + (..)); */
   void formal_alias(int *f_alias);
-[wp] Warning: Memory model hypotheses for function 'formal_alias_array':
+[wp] tests/wp_hoare/alias_assigns_hypotheses.i:48: Warning: 
+  Memory model hypotheses for function 'formal_alias_array':
   /*@
-     behavior typed:
+     behavior wp_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':
+[wp] tests/wp_hoare/alias_assigns_hypotheses.i:61: Warning: 
+  Memory model hypotheses for function 'field_alias':
   /*@
-     behavior typed:
+     behavior wp_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':
+[wp] tests/wp_hoare/alias_assigns_hypotheses.i:73: Warning: 
+  Memory model hypotheses for function 'field_range_alias':
   /*@
-     behavior typed:
+     behavior wp_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':
+[wp] tests/wp_hoare/alias_assigns_hypotheses.i:81: Warning: 
+  Memory model hypotheses for function 'set_alias':
   /*@
-     behavior typed:
+     behavior wp_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':
+[wp] tests/wp_hoare/alias_assigns_hypotheses.i:92: Warning: 
+  Memory model hypotheses for function 'comprehension_alias':
   /*@
-     behavior typed:
+     behavior wp_typed:
        requires
          \separated(
            (int *)global + (..), &g_alias,
@@ -100,9 +108,10 @@
            );
      */
   void comprehension_alias(void);
-[wp] Warning: Memory model hypotheses for function 'union_alias':
+[wp] tests/wp_hoare/alias_assigns_hypotheses.i:102: Warning: 
+  Memory model hypotheses for function 'union_alias':
   /*@
-     behavior typed:
+     behavior wp_typed:
        requires \separated((int *)global + (..), &g_alias, {g_alias, f_alias});
        requires \separated(f_alias, (int *)global + (..), &g_alias);
      */
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 5018eadab7ed616992e0fd97ed6126ab57ae8ff0..d32688793ccc713b4771461d30e7e5fe9962699a 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
@@ -26,15 +26,18 @@
   formal                    2        -        2       100%
   global                    2        -        2       100%
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'f':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/byref.i:14: Warning: 
+  Memory model hypotheses for function 'f':
+  /*@ behavior wp_typed_ref:
         requires \valid(r); */
   void f(int *r);
-[wp] Warning: Memory model hypotheses for function 'wrong_without_ref':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/byref.i:20: Warning: 
+  Memory model hypotheses for function 'wrong_without_ref':
+  /*@ behavior wp_typed_ref:
         requires \valid(q); */
   int wrong_without_ref(int *q);
-[wp] Warning: Memory model hypotheses for function 'pointer':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/byref.i:31: Warning: 
+  Memory model hypotheses for function 'pointer':
+  /*@ behavior wp_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 300ffa2c96e9ee6fa5cb61203ad60527f9bd84e7..805ec5b0acda85a3a69dbce4e871656e602c0932 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
@@ -99,11 +99,38 @@
   g                         4        -        4       100%
   array_in_struct_param     2        -        2       100%
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'ref_bd':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/dispatch_var.i:12: Warning: 
+  Memory model hypotheses for function 'ref_ctr':
+  /*@ behavior wp_typed_ref:
+        requires \valid(p); */
+  int ref_ctr(int *p);
+[wp] tests/wp_hoare/dispatch_var.i:44: Warning: 
+  Memory model hypotheses for function 'ref_bd':
+  /*@ behavior wp_typed_ref:
         requires \valid(q); */
   int ref_bd(int *q);
-[wp] Warning: Memory model hypotheses for function 'g':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/dispatch_var.i:83: Warning: 
+  Memory model hypotheses for function 'ref_valid':
+  /*@ behavior wp_typed_ref:
+        requires \valid(p1); */
+  int ref_valid(int *p1);
+[wp] tests/wp_hoare/dispatch_var.i:133: Warning: 
+  Memory model hypotheses for function 'ref_ctr_nr':
+  /*@
+     behavior wp_typed_ref:
+       requires \separated(ref, ref1, ref2);
+       requires \valid(ref);
+       requires \valid(ref1);
+       requires \valid(ref2);
+     */
+  int ref_ctr_nr(int *ref, int *ref1, int *ref2);
+[wp] tests/wp_hoare/dispatch_var.i:158: Warning: 
+  Memory model hypotheses for function 'ref_ctr_nstars':
+  /*@ behavior wp_typed_ref:
+        requires \valid(pp); */
+  int ref_ctr_nstars(int **pp);
+[wp] tests/wp_hoare/dispatch_var.i:194: Warning: 
+  Memory model hypotheses for function 'g':
+  /*@ behavior wp_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 774ebc54b577f113869aaa54fe88b5a0dcc11562..2c239c715584b5cd3cd36c370eedc62c26940531 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
@@ -49,19 +49,23 @@
   call_local                8        -        8       100%
   call_param_ref            6        -        6       100%
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'reset':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/dispatch_var2.i:16: Warning: 
+  Memory model hypotheses for function 'reset':
+  /*@ behavior wp_typed_ref:
         requires \valid(rp); */
   void reset(int *rp);
-[wp] Warning: Memory model hypotheses for function 'incr':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/dispatch_var2.i:23: Warning: 
+  Memory model hypotheses for function 'incr':
+  /*@ behavior wp_typed_ref:
         requires \valid(ip); */
   void incr(int *ip);
-[wp] Warning: Memory model hypotheses for function 'load':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/dispatch_var2.i:31: Warning: 
+  Memory model hypotheses for function 'load':
+  /*@ behavior wp_typed_ref:
         requires \valid(lp); */
   int load(int *lp);
-[wp] Warning: Memory model hypotheses for function 'call_param_ref':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/dispatch_var2.i:70: Warning: 
+  Memory model hypotheses for function 'call_param_ref':
+  /*@ behavior wp_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 250357cf24abbb54d002fa65c4133e06806591ce..5d824b02e7a43defcc77167a1f659ecf81a87328 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
@@ -49,19 +49,23 @@
   call_local                8        -        8       100%
   call_param_ref            6        -        6       100%
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'reset':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/dispatch_var2.i:16: Warning: 
+  Memory model hypotheses for function 'reset':
+  /*@ behavior wp_typed_ref:
         requires \valid(rp); */
   void reset(int *rp);
-[wp] Warning: Memory model hypotheses for function 'incr':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/dispatch_var2.i:23: Warning: 
+  Memory model hypotheses for function 'incr':
+  /*@ behavior wp_typed_ref:
         requires \valid(ip); */
   void incr(int *ip);
-[wp] Warning: Memory model hypotheses for function 'load':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/dispatch_var2.i:31: Warning: 
+  Memory model hypotheses for function 'load':
+  /*@ behavior wp_typed_ref:
         requires \valid(lp); */
   int load(int *lp);
-[wp] Warning: Memory model hypotheses for function 'call_param_ref':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/dispatch_var2.i:70: Warning: 
+  Memory model hypotheses for function 'call_param_ref':
+  /*@ behavior wp_typed_ref:
         requires \valid(q); */
   int call_param_ref(int *q);
diff --git a/src/plugins/wp/tests/wp_hoare/oracle_qualif/memory_hypotheses_checking.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle_qualif/memory_hypotheses_checking.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..6a5957ad9bc912905cd60d35a230bb32192e39ea
--- /dev/null
+++ b/src/plugins/wp/tests/wp_hoare/oracle_qualif/memory_hypotheses_checking.res.oracle
@@ -0,0 +1,75 @@
+# frama-c -wp -wp-model 'Typed (Ref)' [...]
+[kernel] Parsing tests/wp_hoare/memory_hypotheses_checking.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+[wp] 50 goals scheduled
+[wp] [Qed] Goal typed_ref_sep_assigns : Valid
+[wp] [Qed] Goal typed_ref_call_sep_ok_assigns_exit : Valid
+[wp] [Qed] Goal typed_ref_call_sep_ok_assigns_normal : Valid
+[wp] [Qed] Goal typed_ref_call_sep_ok_call_sep_wp_typed_ref_requires : Valid
+[wp] [Qed] Goal typed_ref_call_sep_ok_call_sep_wp_typed_ref_requires_2 : Valid
+[wp] [Qed] Goal typed_ref_call_sep_bad_sep_assigns_exit : Valid
+[wp] [Qed] Goal typed_ref_call_sep_bad_sep_assigns_normal : Valid
+[wp] [Alt-Ergo] Goal typed_ref_call_sep_bad_sep_call_sep_wp_typed_ref_requires : Unsuccess
+[wp] [Qed] Goal typed_ref_call_sep_bad_sep_call_sep_wp_typed_ref_requires_2 : Valid
+[wp] [Qed] Goal typed_ref_call_sep_bad_valid_assigns_exit_part1 : Valid
+[wp] [Qed] Goal typed_ref_call_sep_bad_valid_assigns_exit_part2 : Valid
+[wp] [Qed] Goal typed_ref_call_sep_bad_valid_assigns_normal_part1 : Valid
+[wp] [Qed] Goal typed_ref_call_sep_bad_valid_assigns_normal_part2 : Valid
+[wp] [Qed] Goal typed_ref_call_sep_bad_valid_call_sep_wp_typed_ref_requires : Valid
+[wp] [Alt-Ergo] Goal typed_ref_call_sep_bad_valid_call_sep_wp_typed_ref_requires_2 : Unsuccess
+[wp] [Qed] Goal typed_ref_gptr_sep_assigns : Valid
+[wp] [Qed] Goal typed_ref_call_gptr_sep_ok_assigns_exit : Valid
+[wp] [Qed] Goal typed_ref_call_gptr_sep_ok_assigns_normal : Valid
+[wp] [Qed] Goal typed_ref_call_gptr_sep_ok_call_gptr_sep_wp_typed_ref_requires : Valid
+[wp] [Alt-Ergo] Goal typed_ref_call_gptr_sep_ok_call_gptr_sep_wp_typed_ref_requires_2 : Valid
+[wp] [Qed] Goal typed_ref_call_gptr_sep_bad_assigns_exit : Valid
+[wp] [Qed] Goal typed_ref_call_gptr_sep_bad_assigns_normal : Valid
+[wp] [Alt-Ergo] Goal typed_ref_call_gptr_sep_bad_call_gptr_sep_wp_typed_ref_requires : Unsuccess
+[wp] [Alt-Ergo] Goal typed_ref_call_gptr_sep_bad_call_gptr_sep_wp_typed_ref_requires_2 : Valid
+[wp] [Qed] Goal typed_ref_assigns_ptr_assigns : Valid
+[wp] [Qed] Goal typed_ref_call_assigns_ptr_ok_assigns_exit : Valid
+[wp] [Qed] Goal typed_ref_call_assigns_ptr_ok_assigns_normal : Valid
+[wp] [Qed] Goal typed_ref_call_assigns_ptr_ok_call_assigns_ptr_wp_typed_ref_requires : Valid
+[wp] [Qed] Goal typed_ref_call_assigns_ptr_ok_call_assigns_ptr_wp_typed_ref_requires_2 : Valid
+[wp] [Qed] Goal typed_ref_call_assigns_ptr_bad_assigns_exit : Valid
+[wp] [Qed] Goal typed_ref_call_assigns_ptr_bad_assigns_normal : Valid
+[wp] [Alt-Ergo] Goal typed_ref_call_assigns_ptr_bad_call_assigns_ptr_wp_typed_ref_requires : Unsuccess
+[wp] [Qed] Goal typed_ref_call_assigns_ptr_bad_call_assigns_ptr_wp_typed_ref_requires_2 : Valid
+[wp] [Qed] Goal typed_ref_add_return_ok_ensures : Valid
+[wp] [Qed] Goal typed_ref_add_return_ok_assigns : Valid
+[wp] [Qed] Goal typed_ref_add_return_ok_wp_typed_ref_ensures : Valid
+[wp] [Qed] Goal typed_ref_call_add_return_ok_assigns_exit : Valid
+[wp] [Qed] Goal typed_ref_call_add_return_ok_assigns_normal_part1 : Valid
+[wp] [Qed] Goal typed_ref_call_add_return_ok_assigns_normal_part2 : Valid
+[wp] [Alt-Ergo] Goal typed_ref_call_add_return_ok_assigns_normal_part3 : Valid
+[wp] [Qed] Goal typed_ref_call_add_return_ok_call_add_return_ok_wp_typed_ref_requires : Valid
+[wp] [Qed] Goal typed_ref_call_add_return_ok_call_add_return_ok_wp_typed_ref_requires_2 : Valid
+[wp] [Qed] Goal typed_ref_call_add_return_bad_assigns_exit : Valid
+[wp] [Qed] Goal typed_ref_call_add_return_bad_assigns_normal_part1 : Valid
+[wp] [Qed] Goal typed_ref_call_add_return_bad_assigns_normal_part2 : Valid
+[wp] [Qed] Goal typed_ref_call_add_return_bad_assigns_normal_part3 : Valid
+[wp] [Alt-Ergo] Goal typed_ref_call_add_return_bad_call_add_return_ok_wp_typed_ref_requires : Unsuccess
+[wp] [Alt-Ergo] Goal typed_ref_call_add_return_bad_call_add_return_ok_wp_typed_ref_requires_2 : Unsuccess
+[wp] [Qed] Goal typed_ref_bad_return_formal_assigns : Valid
+[wp] [Alt-Ergo] Goal typed_ref_bad_return_formal_wp_typed_ref_ensures : Unsuccess
+[wp] Proved goals:   43 / 50
+  Qed:            40 
+  Alt-Ergo:        3  (unsuccess: 7)
+------------------------------------------------------------
+ Functions                 WP     Alt-Ergo  Total   Success
+  sep                       1        -        1       100%
+  call_sep_ok               4        -        4       100%
+  call_sep_bad_sep          3        -        4      75.0%
+  call_sep_bad_valid        5        -        6      83.3%
+  gptr_sep                  1        -        1       100%
+  call_gptr_sep_ok          3        1        4       100%
+  call_gptr_sep_bad         2        1        4      75.0%
+  assigns_ptr               1        -        1       100%
+  call_assigns_ptr_ok       4        -        4       100%
+  call_assigns_ptr_bad      3        -        4      75.0%
+  add_return_ok             3        -        3       100%
+  call_add_return_ok        5        1        6       100%
+  call_add_return_bad       4        -        6      66.7%
+  bad_return_formal         1        -        2      50.0%
+------------------------------------------------------------
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 4a8b2e9e2322b9816a7a543a874848f6d982add1..6735f58a5c0a4347c78f792e1f3318176371622f 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
@@ -36,15 +36,32 @@
   call_global               5        -        5       100%
   write                     2        -        2       100%
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'call_f2':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/reference.i:14: Warning: 
+  Memory model hypotheses for function 'f':
+  /*@ behavior wp_typed_ref:
+        requires \valid(p); */
+  int f(int *p);
+[wp] tests/wp_hoare/reference.i:30: Warning: 
+  Memory model hypotheses for function 'f2':
+  /*@
+     behavior wp_typed_ref:
+       requires \separated(p2, q);
+       requires \valid(p2);
+       requires \valid(q);
+     */
+  int f2(int *p2, int *q);
+[wp] tests/wp_hoare/reference.i:37: Warning: 
+  Memory model hypotheses for function 'call_f2':
+  /*@ behavior wp_typed_ref:
         requires \valid(ptr); */
   int call_f2(int *ptr, int y);
-[wp] Warning: Memory model hypotheses for function 'call_global':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/reference.i:48: Warning: 
+  Memory model hypotheses for function 'call_global':
+  /*@ behavior wp_typed_ref:
         requires \valid(gl); */
   int call_global(void);
-[wp] Warning: Memory model hypotheses for function 'write':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/reference.i:60: Warning: 
+  Memory model hypotheses for function 'write':
+  /*@ behavior wp_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 65ceafb33562951bf33d8bf8374e23a2ff959905..568692c82f3b0e6a8f1ced582fddaeccc8491f4d 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
@@ -49,13 +49,22 @@
   call_on_array_in_struct_global   3   1      4       100%
   call_array_in_struct_param   5     -        5       100%
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'reset':
-  /*@ behavior typed_ref:
+[wp] tests/wp_hoare/reference_and_struct.i:15: Warning: 
+  Memory model hypotheses for function 'reset':
+  /*@ behavior wp_typed_ref:
         requires \valid(p); */
   void reset(struct T *p);
-[wp] Warning: Memory model hypotheses for function 'call_reset_5_tps':
+[wp] tests/wp_hoare/reference_and_struct.i:48: Warning: 
+  Memory model hypotheses for function 'call_reset_5_tps':
   /*@
-     behavior typed_ref:
+     behavior wp_typed_ref:
        requires \separated((struct T **)tps + (..), tps[9] + (0 .. 4));
      */
   void call_reset_5_tps(void);
+[wp] tests/wp_hoare/reference_and_struct.i:88: Warning: 
+  Memory model hypotheses for function 'load_5':
+  /*@
+     behavior wp_typed_ref:
+       requires \separated(hp + (..), (int *)reg_load + (..));
+     */
+  void load_5(int *hp);
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 aa93fe826b9ac6ae17d74bb5ffbb779ec5243b58..fc5b39eedc4b787adc71abece938a4437677a4e8 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
@@ -51,15 +51,32 @@
   calls_on_array_dim_2_to_1   5      3        8       100%
   calls_on_array_dim_2      5        3        8       100%
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'load_1_5':
+[wp] tests/wp_hoare/reference_array.i:24: Warning: 
+  Memory model hypotheses for function 'load_5':
   /*@
-     behavior typed_ref:
+     behavior wp_typed_ref:
+       requires \separated(hp + (..), (int *)reg_load + (..));
+     */
+  void load_5(int *hp);
+[wp] tests/wp_hoare/reference_array.i:31: Warning: 
+  Memory model hypotheses for function 'add_5':
+  /*@
+     behavior wp_typed_ref:
+       requires
+         \separated(gp + (..), (int *)reg_load + (..), (int *)reg_add + (..));
+     */
+  void add_5(int *gp);
+[wp] tests/wp_hoare/reference_array.i:45: Warning: 
+  Memory model hypotheses for function 'load_1_5':
+  /*@
+     behavior wp_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':
+[wp] tests/wp_hoare/reference_array.i:52: Warning: 
+  Memory model hypotheses for function 'add_1_5':
   /*@
-     behavior typed_ref:
+     behavior wp_typed_ref:
        requires
          \separated(ap + (..), (int *)reg_load + (..), (int *)reg_add + (..));
      */
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 f0b5d3dee657e31d31380c14e06cb635ef756f5c..87543f5a2b33e836a9e77bfb3b4b4a35aa6f3ed7 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
@@ -14,3 +14,8 @@
   call_f2                   1        -        1       100%
   call_f3                   1        -        1       100%
 ------------------------------------------------------------
+[wp] tests/wp_hoare/reference_array_simple.i:40: Warning: 
+  Memory model hypotheses for function 'call_f3':
+  /*@ behavior wp_typed_ref:
+        ensures \separated(\result, (int **)tp + (..)); */
+  int *call_f3(void);
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 0dcc419ece02133ae2f9e587a23ce79b480c48ad..7ffbacb501bb73c4c83f18d53d89f37b45e7e2c8 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
@@ -22,25 +22,28 @@
   h                         1        -        1       100%
   s                         5        -        6      83.3%
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'f':
+[wp] tests/wp_hoare/refguards.i:10: Warning: 
+  Memory model hypotheses for function 'f':
   /*@
-     behavior typed_ref:
+     behavior wp_typed_ref:
        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':
+[wp] tests/wp_hoare/refguards.i:25: Warning: 
+  Memory model hypotheses for function 'h':
   /*@
-     behavior typed_ref:
+     behavior wp_typed_ref:
        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':
+[wp] tests/wp_hoare/refguards.i:39: Warning: 
+  Memory model hypotheses for function 's':
   /*@
-     behavior typed_ref:
+     behavior wp_typed_ref:
        requires \separated(c, d);
        requires \valid(c);
        requires \valid(d);
diff --git a/src/plugins/wp/tests/wp_plugin/abs.driver b/src/plugins/wp/tests/wp_plugin/abs.driver
index 977a8a6c7d82b7edc35c5d88087d8dc07ed1e16b..97bcd60eadc035dc88e07d7176196f32c897b3c0 100644
--- a/src/plugins/wp/tests/wp_plugin/abs.driver
+++ b/src/plugins/wp/tests/wp_plugin/abs.driver
@@ -3,4 +3,4 @@ logic integer ABS (integer) = "my_abs" ;
 
 coq.file := "Abs.v";
 altergo.file := "abs.mlw";
-why3.file := "abs.why";
\ No newline at end of file
+why3.file := "abs.why";
diff --git a/src/plugins/wp/tests/wp_plugin/bitmask0x8000.i b/src/plugins/wp/tests/wp_plugin/bitmask0x8000.i
new file mode 100644
index 0000000000000000000000000000000000000000..0b7d5eb92288c72651f118c1d584354728edfba9
--- /dev/null
+++ b/src/plugins/wp/tests/wp_plugin/bitmask0x8000.i
@@ -0,0 +1,14 @@
+/* run.config
+   DONTRUN:
+ */
+
+/* run.config_qualif
+   OPT: -wp-prover script,alt-ergo
+ */
+
+typedef unsigned short ushort;
+
+/*@
+  lemma res_n: \forall ushort off; ! (off & 0x8000) ==> off < 0x8000;
+  lemma res_y: \forall ushort off; (off & 0x8000) ==> off >= 0x8000;
+*/
diff --git a/src/plugins/wp/tests/wp_plugin/model.i b/src/plugins/wp/tests/wp_plugin/model.i
index 3f94f987be8e6f2575257e04bb137253c2c8f24e..26a9826959eff5d5e5887218507f54ed43ea4400 100644
--- a/src/plugins/wp/tests/wp_plugin/model.i
+++ b/src/plugins/wp/tests/wp_plugin/model.i
@@ -1,5 +1,11 @@
 /* run.config
+<<<<<<< HEAD
    CMD: @frama-c@ -wp-msg-key cluster,shell,print-generated -wp-prover why3 @OPTIONS@ -wp-warn-key "pedantic-assigns=inactive"
+||||||| ac7807782d
+   CMD: @frama-c@ -wp-share ./share -wp-msg-key cluster,shell,print-generated -wp-prover why3
+=======
+   CMD: @frama-c@ -wp-share ./share -wp-msg-key cluster,shell,print-generated -wp-prover why3 -wp-warn-key "pedantic-assigns=inactive"
+>>>>>>> origin/master
    OPT: -wp-model Typed -wp -wp-gen -wp-print -then -wp-model Typed+ref -wp -wp-gen -wp-print
 */
 
diff --git a/src/plugins/wp/tests/wp_plugin/nosession.i b/src/plugins/wp/tests/wp_plugin/nosession.i
index 5f7db991977eb47013617e058af16dc08d8e105e..2e420aa913c6ae15e8a4b025e5b04d6f7009f711 100644
--- a/src/plugins/wp/tests/wp_plugin/nosession.i
+++ b/src/plugins/wp/tests/wp_plugin/nosession.i
@@ -3,7 +3,13 @@
 */
 
 /* run.config_qualif
+<<<<<<< HEAD
    CMD: @frama-c@ -wp-msg-key shell @OPTIONS@ -wp-warn-key pedantic-assigns=inactive
+||||||| ac7807782d
+   CMD: @frama-c@ -no-autoload-plugins -load-module wp -wp-share ./share -wp-msg-key shell
+=======
+   CMD: @frama-c@ -no-autoload-plugins -load-module wp -wp-share ./share -wp-msg-key shell -wp-warn-key pedantic-assigns=inactive
+>>>>>>> origin/master
    OPT: -wp -wp-prover alt-ergo -wp-session shall_not_exists_dir -wp-cache offline -wp-no-cache-env
    COMMENT: The session directory shall not be created
  */
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/dynamic.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/dynamic.res.oracle
index 03d68021707791cc389033e69a27d62ab912d813..45c4c11b234cc6e5080288d18cdd0628a19c5d87 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/dynamic.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/dynamic.res.oracle
@@ -372,19 +372,23 @@ Tags: Call h1.
 Prove: true.
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'guarded_call':
-  /*@ behavior typed:
+[wp] tests/wp_plugin/dynamic.i:41: Warning: 
+  Memory model hypotheses for function 'guarded_call':
+  /*@ behavior wp_typed:
         requires \separated(p, &X); */
   void guarded_call(struct S *p);
-[wp] Warning: Memory model hypotheses for function 'behavior':
-  /*@ behavior typed:
+[wp] tests/wp_plugin/dynamic.i:63: Warning: 
+  Memory model hypotheses for function 'behavior':
+  /*@ behavior wp_typed:
         requires \separated(p + (..), &X1); */
   int behavior(int (*p)(void));
-[wp] Warning: Memory model hypotheses for function 'some_behaviors':
-  /*@ behavior typed:
+[wp] tests/wp_plugin/dynamic.i:76: Warning: 
+  Memory model hypotheses for function 'some_behaviors':
+  /*@ behavior wp_typed:
         requires \separated(p + (..), &X1); */
   int some_behaviors(int (*p)(void));
-[wp] Warning: Memory model hypotheses for function 'missing_context':
-  /*@ behavior typed:
+[wp] tests/wp_plugin/dynamic.i:85: Warning: 
+  Memory model hypotheses for function 'missing_context':
+  /*@ behavior wp_typed:
         requires \separated(p, &X1); */
   int missing_context(int (*p)(void));
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 1f0968040f74932c7dcfeeae82b3ca54c52cab50..3a8a6c1093c2eb1f9a64eb12d5a387faaca5329a 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
@@ -16,7 +16,7 @@ Assume {
   Type: is_sint32(x) /\ is_sint32(x_1) /\ is_sint32(x_2) /\ is_sint32(x_3) /\
       is_sint32(x_4).
   (* Heap *)
-  Type: IsArray1_sint32(A).
+  Type: IsArray_sint32(A).
 }
 Prove: x_4 = 6.
 
@@ -35,7 +35,7 @@ Prove: true.
 
 Goal Post-condition 'KO' in 'fC':
 Let x = A[3].
-Assume { Type: is_sint32(x). (* Heap *) Type: IsArray1_sint32(A). }
+Assume { Type: is_sint32(x). (* Heap *) Type: IsArray_sint32(A). }
 Prove: x = 0.
 
 ------------------------------------------------------------
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 ec9bd5f67e90d61fb0025c4dbe78960865fcb9b0..e1713b6d165ee866d19a39e519083f698bf60d46 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/injector.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/injector.res.oracle
@@ -91,7 +91,7 @@ Let x_1 = inp_0[0].
 Assume {
   Type: is_sint32(b) /\ is_sint32(v) /\ is_sint32(x_1) /\ is_sint32(x).
   (* Heap *)
-  Type: IsArray1_sint32(inp_1) /\ IsArray1_sint32(out_0).
+  Type: IsArray_sint32(inp_1) /\ IsArray_sint32(out_0).
   If x != 33
   Then { Have: inp_1[0 <- v] = inp_0. }
   Else { (* Call Effects *) Have: inp_1[0 <- v][1 <- b] = inp_0. }
@@ -106,7 +106,7 @@ Prove: x_1 = b.
 Goal Post-condition for 'ko_1' 'qed_ko' in 'f':
 Assume {
   (* Heap *)
-  Type: IsArray1_sint32(out_0).
+  Type: IsArray_sint32(out_0).
   (* Pre-condition for 'ko_1' *)
   Have: out_0[0] = 33.
   (* Pre-condition for 'ko_1' *)
@@ -120,7 +120,7 @@ Goal Post-condition for 'ko_1' 'qed_ko' in 'f':
 Assume {
   Type: is_sint32(b) /\ is_sint32(v).
   (* Heap *)
-  Type: IsArray1_sint32(out_0).
+  Type: IsArray_sint32(out_0).
   (* Pre-condition for 'ko_1' *)
   Have: out_0[0] = 33.
   (* Pre-condition for 'ko_1' *)
@@ -133,7 +133,7 @@ Prove: v = b.
 Goal Post-condition for 'ko_1' 'qed_ko' in 'f':
 Assume {
   (* Heap *)
-  Type: IsArray1_sint32(out_0).
+  Type: IsArray_sint32(out_0).
   (* Pre-condition for 'ko_1' *)
   Have: out_0[0] = 33.
   (* Pre-condition for 'ko_1' *)
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 e5444b2c2059346f884cdc3f567d4139705fe512..2f9f795452f4a8ead97f2b13bdf8229d29ab6a80 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/overarray.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/overarray.res.oracle
@@ -62,7 +62,7 @@ Goal Assigns nothing in 'f5_ko':
 Call Effect at line 25
 Assume {
   (* Heap *)
-  Type: IsArray1_sint32(A).
+  Type: IsArray_sint32(A).
   (* Exit Effects *)
   Have: forall i : Z. let x = 15 + i in (((-15) <= i) -> ((i <= 4) ->
       (((i < 0) \/ (10 <= i)) -> (A_1[x] = A[x])))).
@@ -75,7 +75,7 @@ Goal Assigns nothing in 'f5_ko':
 Call Effect at line 25
 Assume {
   (* Heap *)
-  Type: IsArray1_sint32(A).
+  Type: IsArray_sint32(A).
   (* Call Effects *)
   Have: forall i : Z. let x = 15 + i in (((-15) <= i) -> ((i <= 4) ->
       (((i < 0) \/ (10 <= i)) -> (A_1[x] = A[x])))).
@@ -91,7 +91,7 @@ Goal Assigns nothing in 'f6_ko':
 Call Effect at line 28
 Assume {
   (* Heap *)
-  Type: IsArray1_sint32(A).
+  Type: IsArray_sint32(A).
   (* Exit Effects *)
   Have: forall i : Z. let x = i - 5 in ((5 <= i) -> ((i <= 24) ->
       (((i < 0) \/ (10 <= i)) -> (A_1[x] = A[x])))).
@@ -104,7 +104,7 @@ Goal Assigns nothing in 'f6_ko':
 Call Effect at line 28
 Assume {
   (* Heap *)
-  Type: IsArray1_sint32(A).
+  Type: IsArray_sint32(A).
   (* Call Effects *)
   Have: forall i : Z. let x = i - 5 in ((5 <= i) -> ((i <= 24) ->
       (((i < 0) \/ (10 <= i)) -> (A_1[x] = A[x])))).
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 2a1d599dfd15200ad924b9bc5aeebe98bb5d46fc..98788bde91213ab95c6f61ee68648fbc34100f9a 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/overassign.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/overassign.res.oracle
@@ -100,11 +100,13 @@ 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:
+[wp] tests/wp_plugin/overassign.i:14: Warning: 
+  Memory model hypotheses for function 'f1_ok':
+  /*@ behavior wp_typed:
         requires \separated(p + (0 .. 9), &p); */
   void f1_ok(void);
-[wp] Warning: Memory model hypotheses for function 'f2_ok':
-  /*@ behavior typed:
+[wp] tests/wp_plugin/overassign.i:17: Warning: 
+  Memory model hypotheses for function 'f2_ok':
+  /*@ behavior wp_typed:
         requires \separated(p + (10 .. 19), &p); */
   void f2_ok(void);
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/overflow2.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/overflow2.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..b0e1722d9dc81cfbda055c5e99e3d235dad9eda0
--- /dev/null
+++ b/src/plugins/wp/tests/wp_plugin/oracle/overflow2.res.oracle
@@ -0,0 +1,106 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_plugin/overflow2.c (with preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+------------------------------------------------------------
+  Function pointers_and_companions
+------------------------------------------------------------
+
+Goal Post-condition 'post' in 'pointers_and_companions':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assertion 'a01' (file tests/wp_plugin/overflow2.c, line 27):
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assertion 'a02' (file tests/wp_plugin/overflow2.c, line 28):
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assertion 'a03' (file tests/wp_plugin/overflow2.c, line 29):
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assertion 'a04' (file tests/wp_plugin/overflow2.c, line 30):
+Assume {
+  Type: is_sint16(distance_0) /\ is_uint32(p1_off_0).
+  (* Pre-condition *)
+  Have: p1_off_0 <= 10.
+}
+Prove: (p1_off_0 + to_uint16(distance_0)) <= 65545.
+
+------------------------------------------------------------
+
+Goal Assertion 'a05' (file tests/wp_plugin/overflow2.c, line 31):
+Let x = p1_off_0 + to_uint16(distance_0).
+Assume {
+  Type: is_sint16(distance_0) /\ is_uint32(p1_off_0).
+  (* Pre-condition *)
+  Have: p1_off_0 <= 10.
+  (* Assertion 'a04' *)
+  Have: x <= 65545.
+}
+Prove: x = to_uint32(x).
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/overflow2.c, line 21) in 'pointers_and_companions':
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function pointers_and_companions_ulong
+------------------------------------------------------------
+
+Goal Post-condition 'postul' in 'pointers_and_companions_ulong':
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assertion 'a06' (file tests/wp_plugin/overflow2.c, line 46):
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assertion 'a07' (file tests/wp_plugin/overflow2.c, line 47):
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assertion 'a08' (file tests/wp_plugin/overflow2.c, line 48):
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assertion 'a09' (file tests/wp_plugin/overflow2.c, line 49):
+Assume {
+  Type: is_sint16(distance_0) /\ is_uint32(p1_off_alt_0).
+  (* Pre-condition *)
+  Have: p1_off_alt_0 <= 10.
+}
+Prove: (p1_off_alt_0 + to_uint16(distance_0)) <= 65545.
+
+------------------------------------------------------------
+
+Goal Assertion 'a10' (file tests/wp_plugin/overflow2.c, line 50):
+Let x = p1_off_alt_0 + to_uint16(distance_0).
+Assume {
+  Type: is_sint16(distance_0) /\ is_uint32(p1_off_alt_0).
+  (* Pre-condition *)
+  Have: p1_off_alt_0 <= 10.
+  (* Assertion 'a09' *)
+  Have: x <= 65545.
+}
+Prove: x = to_uint32(x).
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/overflow2.c, line 40) in 'pointers_and_companions_ulong':
+Prove: true.
+
+------------------------------------------------------------
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
index f69509e4a44ccceb58d2a621b35b3aadf2decf9b..22f830eb4d0bd9ff365a29b345026483f3a79d3a 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/post_assigns.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/post_assigns.res.oracle
@@ -32,10 +32,11 @@ Call Effect at line 14
 Prove: true.
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'receive':
+[wp] tests/wp_plugin/post_assigns.i:12: Warning: 
+  Memory model hypotheses for function 'receive':
   /*@
-     behavior typed:
+     behavior wp_typed:
        requires \separated(message + (..), &size);
-       requires \separated(message + (0 .. \at(size,Post)), &size);
+       ensures \separated(message + (0 .. \at(size,Post)), &size);
      */
   void receive(int n, char *message);
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 5453a8805d08a62eb68968b15c4931998d42734c..528d0b8dc3dcaa71ce41ad5bb2e2cec29c8fd7b6 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/sep.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/sep.res.oracle
@@ -66,50 +66,59 @@ Goal Post-condition (file sep.i, line 48) in 'f8_pq_a':
 Prove: true.
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'f2_p_a':
-  /*@ behavior typed_caveat:
+[wp] tests/wp_plugin/sep.i:18: Warning: 
+  Memory model hypotheses for function 'f2_p_a':
+  /*@ behavior wp_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, &a, &b);
-        requires \valid(p); */
+[wp] tests/wp_plugin/sep.i:22: Warning: 
+  Memory model hypotheses for function 'f3_p_ab':
+  /*@
+     behavior wp_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':
+[wp] tests/wp_plugin/sep.i:26: Warning: 
+  Memory model hypotheses for function 'f4_pq_ab':
   /*@
-     behavior typed_caveat:
+     behavior wp_typed_caveat:
        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':
+[wp] tests/wp_plugin/sep.i:30: Warning: 
+  Memory model hypotheses for function 'f5_pq':
   /*@
-     behavior typed_caveat:
+     behavior wp_typed_caveat:
        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':
+[wp] tests/wp_plugin/sep.i:34: Warning: 
+  Memory model hypotheses for function 'f6_Pa':
   /*@
-     behavior typed_caveat:
+     behavior wp_typed_caveat:
        requires \separated(p + (..), &a);
        requires \valid(p + (..));
      */
   void f6_Pa(int *p, int k);
-[wp] Warning: Memory model hypotheses for function 'f7_pq_ad':
+[wp] tests/wp_plugin/sep.i:43: Warning: 
+  Memory model hypotheses for function 'f7_pq_ad':
   /*@
-     behavior typed_caveat:
+     behavior wp_typed_caveat:
        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':
+[wp] tests/wp_plugin/sep.i:49: Warning: 
+  Memory model hypotheses for function 'f8_pq_a':
   /*@
-     behavior typed_caveat:
+     behavior wp_typed_caveat:
        requires \separated(p, q, &a);
        requires \valid(p);
        requires \valid(q);
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 470d86b6e1ffc7545e10fb21bcf052ae48f9c8b9..5d34f9b620fb720f90218cb30627b248becf6509 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
@@ -7,7 +7,7 @@ Goal Post-condition 'copied_contents' in 'memcpy':
 Let a = shift_sint8(dest_0, 0).
 Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
 Assume {
-  Type: is_uint32(i) /\ is_uint32(n).
+  Type: is_uint64(i) /\ is_uint64(n).
   (* Heap *)
   Type: (region(dest_0.base) <= 0) /\ (region(src_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
@@ -37,7 +37,7 @@ Goal Preservation of Invariant 'no_eva' (file FRAMAC_SHARE/libc/string.c, line 3
 Let a = shift_sint8(dest_0, 0).
 Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
 Assume {
-  Type: is_uint32(i) /\ is_uint32(n).
+  Type: is_uint64(i) /\ is_uint64(n).
   (* Heap *)
   Type: (region(dest_0.base) <= 0) /\ (region(src_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
@@ -53,13 +53,13 @@ Assume {
   (* Then *)
   Have: i < n.
 }
-Prove: to_uint32(1 + i) <= n.
+Prove: to_uint64(1 + i) <= n.
 
 ------------------------------------------------------------
 
 Goal Establishment of Invariant 'no_eva' (file FRAMAC_SHARE/libc/string.c, line 33):
 Assume {
-  Type: is_uint32(n).
+  Type: is_uint64(n).
   (* Heap *)
   Type: (region(dest_0.base) <= 0) /\ (region(src_0.base) <= 0) /\
       linked(Malloc_0).
@@ -77,12 +77,12 @@ Let a = shift_sint8(dest_0, 0).
 Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
 Let a_2 = a_1[shift_sint8(dest_0, i) <- a_1[shift_sint8(src_0, i)]].
 Assume {
-  Type: is_uint32(i) /\ is_uint32(n).
+  Type: is_uint64(i) /\ is_uint64(n).
   (* Heap *)
   Type: (region(dest_0.base) <= 0) /\ (region(src_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
   (* Goal *)
-  When: (0 <= i_1) /\ (i_1 < to_uint32(1 + i)).
+  When: (0 <= i_1) /\ (i_1 < to_uint64(1 + i)).
   (* Pre-condition *)
   Have: P_valid_or_empty(Malloc_0, dest_0, n) /\
       P_valid_read_or_empty(Malloc_0, src_0, n) /\
@@ -121,7 +121,7 @@ Let a = shift_sint8(dest_0, 0).
 Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
 Let a_2 = shift_sint8(dest_0, i).
 Assume {
-  Type: is_uint32(i) /\ is_uint32(n).
+  Type: is_uint64(i) /\ is_uint64(n).
   (* Heap *)
   Type: (region(dest_0.base) <= 0) /\ (region(src_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
@@ -153,7 +153,7 @@ Goal Decreasing of Loop variant at loop (file FRAMAC_SHARE/libc/string.c, line 3
 Let a = shift_sint8(dest_0, 0).
 Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
 Assume {
-  Type: is_uint32(i) /\ is_uint32(n).
+  Type: is_uint64(i) /\ is_uint64(n).
   (* Heap *)
   Type: (region(dest_0.base) <= 0) /\ (region(src_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
@@ -169,7 +169,7 @@ Assume {
   (* Then *)
   Have: i < n.
 }
-Prove: i < to_uint32(1 + i).
+Prove: i < to_uint64(1 + i).
 
 ------------------------------------------------------------
 
@@ -180,8 +180,8 @@ Prove: true.
 
 Goal Post-condition 'copied_contents' in 'memmove':
 Assume {
-  Type: is_uint32(i) /\ is_uint32(i_1) /\ is_uint32(n) /\
-      is_sint32(memoverlap_0).
+  Type: is_sint32(memoverlap_0) /\ is_uint64(i) /\ is_uint64(i_1) /\
+      is_uint64(n).
   (* Heap *)
   Type: (region(dest_0.base) <= 0) /\ (region(src_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
@@ -252,7 +252,7 @@ Let a = shift_sint8(dest_0, 0).
 Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
 Let a_2 = shift_sint8(src_0, 0).
 Assume {
-  Type: is_uint32(i) /\ is_uint32(n) /\ is_sint32(memoverlap_0).
+  Type: is_sint32(memoverlap_0) /\ is_uint64(i) /\ is_uint64(n).
   (* Heap *)
   Type: (region(dest_0.base) <= 0) /\ (region(src_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
@@ -280,7 +280,7 @@ Assume {
   (* Then *)
   Have: i < n.
 }
-Prove: to_uint32(1 + i) <= n.
+Prove: to_uint64(1 + i) <= n.
 
 ------------------------------------------------------------
 
@@ -288,7 +288,7 @@ Goal Establishment of Invariant 'no_eva' (file FRAMAC_SHARE/libc/string.c, line
 Let a = shift_sint8(d, 0).
 Let a_1 = shift_sint8(s, 0).
 Assume {
-  Type: is_uint32(n) /\ is_sint32(memoverlap_0).
+  Type: is_sint32(memoverlap_0) /\ is_uint64(n).
   (* Heap *)
   Type: (region(d.base) <= 0) /\ (region(s.base) <= 0) /\ linked(Malloc_0).
   (* Pre-condition *)
@@ -314,12 +314,12 @@ Let a = shift_sint8(d, 0).
 Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
 Let a_2 = shift_sint8(s, 0).
 Assume {
-  Type: is_uint32(i) /\ is_uint32(n) /\ is_sint32(memoverlap_0).
+  Type: is_sint32(memoverlap_0) /\ is_uint64(i) /\ is_uint64(n).
   (* Heap *)
   Type: (region(d.base) <= 0) /\ (region(s.base) <= 0) /\ linked(Malloc_0) /\
       sconst(Mchar_0).
   (* Goal *)
-  When: (0 <= i_1) /\ (i_1 < to_uint32(1 + i)).
+  When: (0 <= i_1) /\ (i_1 < to_uint64(1 + i)).
   (* Pre-condition *)
   Have: P_valid_or_empty(Malloc_0, d, n) /\
       P_valid_read_or_empty(Malloc_0, s, n).
@@ -360,12 +360,12 @@ Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
 Let a_2 = shift_sint8(s, 0).
 Let a_3 = shift_sint8(s, i_1).
 Assume {
-  Type: is_uint32(i) /\ is_uint32(n) /\ is_sint32(memoverlap_0).
+  Type: is_sint32(memoverlap_0) /\ is_uint64(i) /\ is_uint64(n).
   (* Heap *)
   Type: (region(d.base) <= 0) /\ (region(s.base) <= 0) /\ linked(Malloc_0) /\
       sconst(Mchar_0).
   (* Goal *)
-  When: (i_1 < n) /\ (to_uint32(1 + i) <= i_1).
+  When: (i_1 < n) /\ (to_uint64(1 + i) <= i_1).
   (* Pre-condition *)
   Have: P_valid_or_empty(Malloc_0, d, n) /\
       P_valid_read_or_empty(Malloc_0, s, n).
@@ -404,7 +404,7 @@ Let a = shift_sint8(dest_0, 0).
 Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
 Let a_2 = shift_sint8(src_0, 0).
 Assume {
-  Type: is_uint32(i) /\ is_uint32(n) /\ is_sint32(memoverlap_0).
+  Type: is_sint32(memoverlap_0) /\ is_uint64(i) /\ is_uint64(n).
   (* Heap *)
   Type: (region(dest_0.base) <= 0) /\ (region(src_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
@@ -432,7 +432,7 @@ Assume {
   (* Then *)
   Have: 0 < i.
 }
-Prove: to_uint32(i - 1) < n.
+Prove: to_uint64(i - 1) < n.
 
 ------------------------------------------------------------
 
@@ -440,7 +440,7 @@ Goal Establishment of Invariant 'no_eva' (file FRAMAC_SHARE/libc/string.c, line
 Let a = shift_sint8(d, 0).
 Let a_1 = shift_sint8(s, 0).
 Assume {
-  Type: is_uint32(n) /\ is_sint32(memoverlap_0).
+  Type: is_sint32(memoverlap_0) /\ is_uint64(n).
   (* Heap *)
   Type: (region(d.base) <= 0) /\ (region(s.base) <= 0) /\ linked(Malloc_0).
   (* Pre-condition *)
@@ -457,7 +457,7 @@ Assume {
   (* Else *)
   Have: 0 < memoverlap_0.
 }
-Prove: to_uint32(n - 1) < n.
+Prove: to_uint64(n - 1) < n.
 
 ------------------------------------------------------------
 
@@ -466,12 +466,12 @@ Let a = shift_sint8(d, 0).
 Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
 Let a_2 = shift_sint8(s, 0).
 Assume {
-  Type: is_uint32(i) /\ is_uint32(n) /\ is_sint32(memoverlap_0).
+  Type: is_sint32(memoverlap_0) /\ is_uint64(i) /\ is_uint64(n).
   (* Heap *)
   Type: (region(d.base) <= 0) /\ (region(s.base) <= 0) /\ linked(Malloc_0) /\
       sconst(Mchar_0).
   (* Goal *)
-  When: (i_1 < n) /\ (to_uint32(i - 1) < i_1).
+  When: (i_1 < n) /\ (to_uint64(i - 1) < i_1).
   (* Pre-condition *)
   Have: P_valid_or_empty(Malloc_0, d, n) /\
       P_valid_read_or_empty(Malloc_0, s, n).
@@ -505,12 +505,12 @@ Goal Establishment of Invariant 'no_eva' (file FRAMAC_SHARE/libc/string.c, line
 Let a = shift_sint8(dest_0, 0).
 Let a_1 = shift_sint8(src_0, 0).
 Assume {
-  Type: is_uint32(n) /\ is_sint32(memoverlap_0).
+  Type: is_sint32(memoverlap_0) /\ is_uint64(n).
   (* Heap *)
   Type: (region(dest_0.base) <= 0) /\ (region(src_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
   (* Goal *)
-  When: (i < n) /\ (to_uint32(n - 1) < i).
+  When: (i < n) /\ (to_uint64(n - 1) < i).
   (* Pre-condition *)
   Have: P_valid_or_empty(Malloc_0, dest_0, n) /\
       P_valid_read_or_empty(Malloc_0, src_0, n).
@@ -535,12 +535,12 @@ Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
 Let a_2 = shift_sint8(s, 0).
 Let a_3 = shift_sint8(s, i_1).
 Assume {
-  Type: is_uint32(i) /\ is_uint32(n) /\ is_sint32(memoverlap_0).
+  Type: is_sint32(memoverlap_0) /\ is_uint64(i) /\ is_uint64(n).
   (* Heap *)
   Type: (region(d.base) <= 0) /\ (region(s.base) <= 0) /\ linked(Malloc_0) /\
       sconst(Mchar_0).
   (* Goal *)
-  When: (0 <= i_1) /\ (i_1 <= to_uint32(i - 1)).
+  When: (0 <= i_1) /\ (i_1 <= to_uint64(i - 1)).
   (* Pre-condition *)
   Have: P_valid_or_empty(Malloc_0, d, n) /\
       P_valid_read_or_empty(Malloc_0, s, n).
@@ -592,7 +592,7 @@ Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
 Let a_2 = shift_sint8(src_0, 0).
 Let a_3 = shift_sint8(d, i).
 Assume {
-  Type: is_uint32(i) /\ is_uint32(n) /\ is_sint32(memoverlap_0).
+  Type: is_sint32(memoverlap_0) /\ is_uint64(i) /\ is_uint64(n).
   (* Heap *)
   Type: (region(d.base) <= 0) /\ (region(src_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
@@ -644,7 +644,7 @@ Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
 Let a_2 = shift_sint8(src_0, 0).
 Let a_3 = shift_sint8(d, i).
 Assume {
-  Type: is_uint32(i) /\ is_uint32(n) /\ is_sint32(memoverlap_0).
+  Type: is_sint32(memoverlap_0) /\ is_uint64(i) /\ is_uint64(n).
   (* Heap *)
   Type: (region(d.base) <= 0) /\ (region(src_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
@@ -718,7 +718,7 @@ Let a = shift_sint8(d, 0).
 Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
 Let a_2 = shift_sint8(src_0, 0).
 Assume {
-  Type: is_uint32(i) /\ is_uint32(n) /\ is_sint32(memoverlap_0).
+  Type: is_sint32(memoverlap_0) /\ is_uint64(i) /\ is_uint64(n).
   (* Heap *)
   Type: (region(d.base) <= 0) /\ (region(src_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
@@ -763,7 +763,7 @@ Let a = shift_sint8(dest_0, 0).
 Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
 Let a_2 = shift_sint8(src_0, 0).
 Assume {
-  Type: is_uint32(i) /\ is_uint32(n) /\ is_sint32(memoverlap_0).
+  Type: is_sint32(memoverlap_0) /\ is_uint64(i) /\ is_uint64(n).
   (* Heap *)
   Type: (region(dest_0.base) <= 0) /\ (region(src_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
@@ -791,7 +791,7 @@ Assume {
   (* Then *)
   Have: i < n.
 }
-Prove: i < to_uint32(1 + i).
+Prove: i < to_uint64(1 + i).
 
 ------------------------------------------------------------
 
@@ -805,7 +805,7 @@ Let a = shift_sint8(dest_0, 0).
 Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
 Let a_2 = shift_sint8(src_0, 0).
 Assume {
-  Type: is_uint32(i) /\ is_uint32(n) /\ is_sint32(memoverlap_0).
+  Type: is_sint32(memoverlap_0) /\ is_uint64(i) /\ is_uint64(n).
   (* Heap *)
   Type: (region(dest_0.base) <= 0) /\ (region(src_0.base) <= 0) /\
       linked(Malloc_0) /\ sconst(Mchar_0).
@@ -833,7 +833,7 @@ Assume {
   (* Then *)
   Have: 0 < i.
 }
-Prove: to_uint32(i - 1) < i.
+Prove: to_uint64(i - 1) < i.
 
 ------------------------------------------------------------
 
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 1ac1b33b709b1f344d3ed506ad929bb0409cf8f4..4f20e481e2ad97fe00a3d46a38286e3002d388ca 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
@@ -37,8 +37,16 @@ Assume {
   (* Assertion 'Ok_A' *)
   Have: (0 <= i) /\ (i <= 9).
   (* Call 'fopen' *)
-  Have: included(p, 2, shift___fc_FILE(global(G___fc_fopen_21), 0), 1024).
+  Have: included(p, 2, shift_S4___fc_FILE(global(G___fc_fopen_21), 0), 1024).
 }
 Prove: valid_rw(Malloc_0, p, 2).
 
 ------------------------------------------------------------
+[wp] tests/wp_plugin/subset_fopen.c:13: Warning: 
+  Memory model hypotheses for function 'fopen':
+  /*@
+     behavior wp_typed:
+       requires \separated(&_p__fc_fopen, {filename + (..), mode + (..)});
+       ensures \separated(\result, &_p__fc_fopen);
+     */
+  FILE *fopen(char const * __restrict filename, char const * __restrict mode);
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 eede34e227412cdccfb55a373883a242df5fc66f..0eb9d231f436486113138c069d470ac3e881b307 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
@@ -6,8 +6,16 @@
   Function ASSIGN_NO_UNFOLD_KO
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Assigns (file unfold_assigns.i, line 62) in 'ASSIGN_NO_UNFOLD_KO':
 Effect at line 65
+||||||| ac7807782d
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 62) in 'ASSIGN_NO_UNFOLD_KO':
+Effect at line 65
+=======
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 66) in 'ASSIGN_NO_UNFOLD_KO':
+Effect at line 69
+>>>>>>> origin/master
 Assume {
   (* Heap *)
   Type: (region(s.base) <= 0) /\ linked(Malloc_0).
@@ -21,17 +29,93 @@ Prove: false.
   Function ASSIGN_NO_UNFOLD_OK
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Assigns (file unfold_assigns.i, line 56) in 'ASSIGN_NO_UNFOLD_OK':
 Effect at line 59
+||||||| ac7807782d
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 56) in 'ASSIGN_NO_UNFOLD_OK':
+Effect at line 59
+=======
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 60) in 'ASSIGN_NO_UNFOLD_OK':
+Effect at line 63
+>>>>>>> origin/master
 Prove: true.
 
+------------------------------------------------------------
+------------------------------------------------------------
+  Function NESTED_ARRAY_STATIC
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 95) in 'NESTED_ARRAY_STATIC':
+Call Effect at line 97
+Assume {
+  (* Heap *)
+  Type: (region(s.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: !invalid(Malloc_0, s, 4).
+}
+Prove: false.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 95) in 'NESTED_ARRAY_STATIC':
+Call Effect at line 97
+Assume {
+  (* Heap *)
+  Type: (region(s.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: !invalid(Malloc_0, s, 4).
+}
+Prove: false.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function NESTED_ARRAY_VARS
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 102) in 'NESTED_ARRAY_VARS':
+Call Effect at line 104
+Assume {
+  Type: is_uint32(n).
+  (* Heap *)
+  Type: (region(s.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: !invalid(Malloc_0, s, 4).
+  (* Pre-condition *)
+  Have: 3 <= n.
+}
+Prove: included(s, 4, shift_sint32(shiftfield_F2_With_array_t(s), 1), n).
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 102) in 'NESTED_ARRAY_VARS':
+Call Effect at line 104
+Assume {
+  Type: is_uint32(n).
+  (* Heap *)
+  Type: (region(s.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: !invalid(Malloc_0, s, 4).
+  (* Pre-condition *)
+  Have: 3 <= n.
+}
+Prove: included(s, 4, shift_sint32(shiftfield_F2_With_array_t(s), 1), n).
+
 ------------------------------------------------------------
 ------------------------------------------------------------
   Function NO_UNFOLD_KO
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Assigns (file unfold_assigns.i, line 33) in 'NO_UNFOLD_KO':
 Call Effect at line 35
+||||||| ac7807782d
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 33) in 'NO_UNFOLD_KO':
+Call Effect at line 35
+=======
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 37) in 'NO_UNFOLD_KO':
+Call Effect at line 39
+>>>>>>> origin/master
 Assume {
   (* Heap *)
   Type: (region(s.base) <= 0) /\ linked(Malloc_0).
@@ -42,8 +126,16 @@ Prove: false.
 
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Assigns (file unfold_assigns.i, line 33) in 'NO_UNFOLD_KO':
 Call Effect at line 35
+||||||| ac7807782d
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 33) in 'NO_UNFOLD_KO':
+Call Effect at line 35
+=======
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 37) in 'NO_UNFOLD_KO':
+Call Effect at line 39
+>>>>>>> origin/master
 Assume {
   (* Heap *)
   Type: (region(s.base) <= 0) /\ linked(Malloc_0).
@@ -57,14 +149,30 @@ Prove: false.
   Function NO_UNFOLD_OK_1
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Assigns (file unfold_assigns.i, line 18) in 'NO_UNFOLD_OK_1':
 Call Effect at line 20
+||||||| ac7807782d
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 18) in 'NO_UNFOLD_OK_1':
+Call Effect at line 20
+=======
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 22) in 'NO_UNFOLD_OK_1':
+Call Effect at line 24
+>>>>>>> origin/master
 Prove: true.
 
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Assigns (file unfold_assigns.i, line 18) in 'NO_UNFOLD_OK_1':
 Call Effect at line 20
+||||||| ac7807782d
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 18) in 'NO_UNFOLD_OK_1':
+Call Effect at line 20
+=======
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 22) in 'NO_UNFOLD_OK_1':
+Call Effect at line 24
+>>>>>>> origin/master
 Prove: true.
 
 ------------------------------------------------------------
@@ -72,14 +180,30 @@ Prove: true.
   Function NO_UNFOLD_OK_2
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Assigns (file unfold_assigns.i, line 23) in 'NO_UNFOLD_OK_2':
 Call Effect at line 25
+||||||| ac7807782d
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 23) in 'NO_UNFOLD_OK_2':
+Call Effect at line 25
+=======
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 27) in 'NO_UNFOLD_OK_2':
+Call Effect at line 29
+>>>>>>> origin/master
 Prove: true.
 
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Assigns (file unfold_assigns.i, line 23) in 'NO_UNFOLD_OK_2':
 Call Effect at line 25
+||||||| ac7807782d
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 23) in 'NO_UNFOLD_OK_2':
+Call Effect at line 25
+=======
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 27) in 'NO_UNFOLD_OK_2':
+Call Effect at line 29
+>>>>>>> origin/master
 Prove: true.
 
 ------------------------------------------------------------
@@ -87,22 +211,190 @@ Prove: true.
   Function NO_UNFOLD_OK_3
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Assigns (file unfold_assigns.i, line 28) in 'NO_UNFOLD_OK_3':
 Call Effect at line 30
+||||||| ac7807782d
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 28) in 'NO_UNFOLD_OK_3':
+Call Effect at line 30
+=======
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 32) in 'NO_UNFOLD_OK_3':
+Call Effect at line 34
+>>>>>>> origin/master
 Prove: true.
 
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Assigns (file unfold_assigns.i, line 28) in 'NO_UNFOLD_OK_3':
 Call Effect at line 30
+||||||| ac7807782d
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 28) in 'NO_UNFOLD_OK_3':
+Call Effect at line 30
+=======
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 32) in 'NO_UNFOLD_OK_3':
+Call Effect at line 34
+>>>>>>> origin/master
 Prove: true.
 
+------------------------------------------------------------
+------------------------------------------------------------
+  Function PARTIAL_ASSIGNS_STATIC
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 75) in 'PARTIAL_ASSIGNS_STATIC':
+Call Effect at line 77
+Assume {
+  (* Heap *)
+  Type: (region(p.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: !invalid(Malloc_0, shift_sint32(p, 0), 5).
+}
+Prove: false.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 75) in 'PARTIAL_ASSIGNS_STATIC':
+Call Effect at line 77
+Assume {
+  (* Heap *)
+  Type: (region(p.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: !invalid(Malloc_0, shift_sint32(p, 0), 5).
+}
+Prove: false.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function PARTIAL_ASSIGNS_VARS
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 81) in 'PARTIAL_ASSIGNS_VARS':
+Call Effect at line 83
+Let a = shift_sint32(p, 0).
+Let x = 1 + n.
+Assume {
+  Have: 0 <= n.
+  Type: is_uint32(n).
+  (* Heap *)
+  Type: (region(p.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: !invalid(Malloc_0, a, x).
+  (* Pre-condition *)
+  Have: 5 <= n.
+}
+Prove: (n <= 0) \/ included(a, x, shift_sint32(p, 1), n - 1) \/
+    included(a, x, shift_sint32(p, n), 1).
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 81) in 'PARTIAL_ASSIGNS_VARS':
+Call Effect at line 83
+Let a = shift_sint32(p, 0).
+Let x = 1 + n.
+Assume {
+  Have: 0 <= n.
+  Type: is_uint32(n).
+  (* Heap *)
+  Type: (region(p.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: !invalid(Malloc_0, a, x).
+  (* Pre-condition *)
+  Have: 5 <= n.
+}
+Prove: (n <= 0) \/ included(a, x, shift_sint32(p, 1), n - 1) \/
+    included(a, x, shift_sint32(p, n), 1).
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function RANGE_NESTED_ARRAY_STATIC
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 111) in 'RANGE_NESTED_ARRAY_STATIC':
+Call Effect at line 116
+Assume {
+  (* Heap *)
+  Type: (region(s.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: !invalid(Malloc_0, shift_S2_With_array(s, 0), 12).
+}
+Prove: false.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 111) in 'RANGE_NESTED_ARRAY_STATIC':
+Call Effect at line 116
+Assume {
+  (* Heap *)
+  Type: (region(s.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: !invalid(Malloc_0, shift_S2_With_array(s, 0), 12).
+}
+Prove: false.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function RANGE_NESTED_ARRAY_VARS
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 121) in 'RANGE_NESTED_ARRAY_VARS':
+Call Effect at line 126
+Let a = shift_S2_With_array(s, 0).
+Let x = 4 * n.
+Let x_1 = 4 + x.
+Let a_1 = shift_S2_With_array(s, 1).
+Let a_2 = shiftfield_F2_With_array_t(a).
+Assume {
+  Type: is_uint32(m) /\ is_uint32(n).
+  (* Heap *)
+  Type: (region(s.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: !invalid(Malloc_0, a, x_1).
+  (* Pre-condition *)
+  Have: (3 <= n) /\ (4 <= m).
+}
+Prove: (n < 0) \/ included(a, x_1, shift_S2_With_array(s, 2), x - 4) \/
+    included(a, x_1, shiftfield_F2_With_array_x(a_1), 1) \/
+    included(a, x_1, shift_sint32(a_2, 0), 1) \/
+    included(a, x_1, shift_sint32(a_2, 1), m) \/
+    included(a, x_1, shift_sint32(shiftfield_F2_With_array_t(a_1), 0), 1 + m).
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 121) in 'RANGE_NESTED_ARRAY_VARS':
+Call Effect at line 126
+Let a = shift_S2_With_array(s, 0).
+Let x = 4 * n.
+Let x_1 = 4 + x.
+Let a_1 = shift_S2_With_array(s, 1).
+Let a_2 = shiftfield_F2_With_array_t(a).
+Assume {
+  Type: is_uint32(m) /\ is_uint32(n).
+  (* Heap *)
+  Type: (region(s.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: !invalid(Malloc_0, a, x_1).
+  (* Pre-condition *)
+  Have: (3 <= n) /\ (4 <= m).
+}
+Prove: (n < 0) \/ included(a, x_1, shift_S2_With_array(s, 2), x - 4) \/
+    included(a, x_1, shiftfield_F2_With_array_x(a_1), 1) \/
+    included(a, x_1, shift_sint32(a_2, 0), 1) \/
+    included(a, x_1, shift_sint32(a_2, 1), m) \/
+    included(a, x_1, shift_sint32(shiftfield_F2_With_array_t(a_1), 0), 1 + m).
+
 ------------------------------------------------------------
 ------------------------------------------------------------
   Function USE_ASSIGN_UNFOLD_KO
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Post-condition (file unfold_assigns.i, line 48) in 'USE_ASSIGN_UNFOLD_KO':
+||||||| ac7807782d
+Goal Post-condition (file tests/wp_plugin/unfold_assigns.i, line 48) in 'USE_ASSIGN_UNFOLD_KO':
+=======
+Goal Post-condition (file tests/wp_plugin/unfold_assigns.i, line 52) in 'USE_ASSIGN_UNFOLD_KO':
+>>>>>>> origin/master
 Let a = Load_S1_S(q, Mint_0).
 Let a_1 = Load_S1_S(q, havoc(Mint_undef_0, Mint_0, p, 2)).
 Assume {
@@ -116,8 +408,16 @@ Prove: EqS1_S(a_1, a).
 
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Assigns (file unfold_assigns.i, line 49) in 'USE_ASSIGN_UNFOLD_KO':
 Call Effect at line 53
+||||||| ac7807782d
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 49) in 'USE_ASSIGN_UNFOLD_KO':
+Call Effect at line 53
+=======
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 53) in 'USE_ASSIGN_UNFOLD_KO':
+Call Effect at line 57
+>>>>>>> origin/master
 Assume {
   (* Heap *)
   Type: (region(p.base) <= 0) /\ linked(Malloc_0).
@@ -128,8 +428,16 @@ Prove: false.
 
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Assigns (file unfold_assigns.i, line 49) in 'USE_ASSIGN_UNFOLD_KO':
 Call Effect at line 53
+||||||| ac7807782d
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 49) in 'USE_ASSIGN_UNFOLD_KO':
+Call Effect at line 53
+=======
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 53) in 'USE_ASSIGN_UNFOLD_KO':
+Call Effect at line 57
+>>>>>>> origin/master
 Assume {
   (* Heap *)
   Type: (region(p.base) <= 0) /\ linked(Malloc_0).
@@ -143,7 +451,13 @@ Prove: false.
   Function USE_ASSIGN_UNFOLD_OK
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Post-condition (file unfold_assigns.i, line 39) in 'USE_ASSIGN_UNFOLD_OK':
+||||||| ac7807782d
+Goal Post-condition (file tests/wp_plugin/unfold_assigns.i, line 39) in 'USE_ASSIGN_UNFOLD_OK':
+=======
+Goal Post-condition (file tests/wp_plugin/unfold_assigns.i, line 43) in 'USE_ASSIGN_UNFOLD_OK':
+>>>>>>> origin/master
 Let a = Load_S1_S(q, Mint_0).
 Let a_1 = Load_S1_S(q, havoc(Mint_undef_0, Mint_0, p, 2)).
 Assume {
@@ -157,14 +471,30 @@ Prove: EqS1_S(a_1, a).
 
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Assigns (file unfold_assigns.i, line 40) in 'USE_ASSIGN_UNFOLD_OK':
 Call Effect at line 44
+||||||| ac7807782d
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 40) in 'USE_ASSIGN_UNFOLD_OK':
+Call Effect at line 44
+=======
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 44) in 'USE_ASSIGN_UNFOLD_OK':
+Call Effect at line 48
+>>>>>>> origin/master
 Prove: true.
 
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Assigns (file unfold_assigns.i, line 40) in 'USE_ASSIGN_UNFOLD_OK':
 Call Effect at line 44
+||||||| ac7807782d
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 40) in 'USE_ASSIGN_UNFOLD_OK':
+Call Effect at line 44
+=======
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 44) in 'USE_ASSIGN_UNFOLD_OK':
+Call Effect at line 48
+>>>>>>> origin/master
 Prove: true.
 
 ------------------------------------------------------------
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 47c11530d8f3e7c46705c594a2aa433bfcebd30e..015a04fceb98603e742a1cddf8ba2bc7e8795c9d 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
@@ -6,8 +6,16 @@
   Function ASSIGN_NO_UNFOLD_KO
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Assigns (file unfold_assigns.i, line 62) in 'ASSIGN_NO_UNFOLD_KO':
 Effect at line 65
+||||||| ac7807782d
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 62) in 'ASSIGN_NO_UNFOLD_KO':
+Effect at line 65
+=======
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 66) in 'ASSIGN_NO_UNFOLD_KO':
+Effect at line 69
+>>>>>>> origin/master
 Prove: true.
 
 ------------------------------------------------------------
@@ -15,23 +23,105 @@ Prove: true.
   Function ASSIGN_NO_UNFOLD_OK
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Assigns (file unfold_assigns.i, line 56) in 'ASSIGN_NO_UNFOLD_OK':
 Effect at line 59
+||||||| ac7807782d
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 56) in 'ASSIGN_NO_UNFOLD_OK':
+Effect at line 59
+=======
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 60) in 'ASSIGN_NO_UNFOLD_OK':
+Effect at line 63
+>>>>>>> origin/master
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function NESTED_ARRAY_STATIC
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 95) in 'NESTED_ARRAY_STATIC':
+Call Effect at line 97
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 95) in 'NESTED_ARRAY_STATIC':
+Call Effect at line 97
 Prove: true.
 
+------------------------------------------------------------
+------------------------------------------------------------
+  Function NESTED_ARRAY_VARS
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 102) in 'NESTED_ARRAY_VARS':
+Call Effect at line 104
+Let a = shiftfield_F2_With_array_t(s).
+Let a_1 = shift_sint32(a, 1).
+Assume {
+  Have: 0 < i.
+  Have: i <= 2.
+  Type: is_uint32(n).
+  (* Heap *)
+  Type: (region(s.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: !invalid(Malloc_0, s, 4).
+  (* Pre-condition *)
+  Have: 3 <= n.
+}
+Prove: (i = (-1)) \/ included(s, 4, a_1, n) \/ included(a, 3, a_1, n) \/
+    included(shift_sint32(a, i), 1, a_1, n).
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 102) in 'NESTED_ARRAY_VARS':
+Call Effect at line 104
+Let a = shiftfield_F2_With_array_t(s).
+Let a_1 = shift_sint32(a, 1).
+Assume {
+  Have: 0 < i.
+  Have: i <= 2.
+  Type: is_uint32(n).
+  (* Heap *)
+  Type: (region(s.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: !invalid(Malloc_0, s, 4).
+  (* Pre-condition *)
+  Have: 3 <= n.
+}
+Prove: (i = (-1)) \/ included(s, 4, a_1, n) \/ included(a, 3, a_1, n) \/
+    included(shift_sint32(a, i), 1, a_1, n).
+
 ------------------------------------------------------------
 ------------------------------------------------------------
   Function NO_UNFOLD_KO
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Assigns (file unfold_assigns.i, line 33) in 'NO_UNFOLD_KO':
 Call Effect at line 35
+||||||| ac7807782d
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 33) in 'NO_UNFOLD_KO':
+Call Effect at line 35
+=======
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 37) in 'NO_UNFOLD_KO':
+Call Effect at line 39
+>>>>>>> origin/master
 Prove: true.
 
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Assigns (file unfold_assigns.i, line 33) in 'NO_UNFOLD_KO':
 Call Effect at line 35
+||||||| ac7807782d
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 33) in 'NO_UNFOLD_KO':
+Call Effect at line 35
+=======
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 37) in 'NO_UNFOLD_KO':
+Call Effect at line 39
+>>>>>>> origin/master
 Prove: true.
 
 ------------------------------------------------------------
@@ -39,14 +129,30 @@ Prove: true.
   Function NO_UNFOLD_OK_1
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Assigns (file unfold_assigns.i, line 18) in 'NO_UNFOLD_OK_1':
 Call Effect at line 20
+||||||| ac7807782d
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 18) in 'NO_UNFOLD_OK_1':
+Call Effect at line 20
+=======
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 22) in 'NO_UNFOLD_OK_1':
+Call Effect at line 24
+>>>>>>> origin/master
 Prove: true.
 
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Assigns (file unfold_assigns.i, line 18) in 'NO_UNFOLD_OK_1':
 Call Effect at line 20
+||||||| ac7807782d
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 18) in 'NO_UNFOLD_OK_1':
+Call Effect at line 20
+=======
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 22) in 'NO_UNFOLD_OK_1':
+Call Effect at line 24
+>>>>>>> origin/master
 Prove: true.
 
 ------------------------------------------------------------
@@ -54,14 +160,30 @@ Prove: true.
   Function NO_UNFOLD_OK_2
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Assigns (file unfold_assigns.i, line 23) in 'NO_UNFOLD_OK_2':
 Call Effect at line 25
+||||||| ac7807782d
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 23) in 'NO_UNFOLD_OK_2':
+Call Effect at line 25
+=======
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 27) in 'NO_UNFOLD_OK_2':
+Call Effect at line 29
+>>>>>>> origin/master
 Prove: true.
 
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Assigns (file unfold_assigns.i, line 23) in 'NO_UNFOLD_OK_2':
 Call Effect at line 25
+||||||| ac7807782d
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 23) in 'NO_UNFOLD_OK_2':
+Call Effect at line 25
+=======
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 27) in 'NO_UNFOLD_OK_2':
+Call Effect at line 29
+>>>>>>> origin/master
 Prove: true.
 
 ------------------------------------------------------------
@@ -69,22 +191,248 @@ Prove: true.
   Function NO_UNFOLD_OK_3
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Assigns (file unfold_assigns.i, line 28) in 'NO_UNFOLD_OK_3':
 Call Effect at line 30
+||||||| ac7807782d
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 28) in 'NO_UNFOLD_OK_3':
+Call Effect at line 30
+=======
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 32) in 'NO_UNFOLD_OK_3':
+Call Effect at line 34
+>>>>>>> origin/master
 Prove: true.
 
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Assigns (file unfold_assigns.i, line 28) in 'NO_UNFOLD_OK_3':
 Call Effect at line 30
+||||||| ac7807782d
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 28) in 'NO_UNFOLD_OK_3':
+Call Effect at line 30
+=======
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 32) in 'NO_UNFOLD_OK_3':
+Call Effect at line 34
+>>>>>>> origin/master
 Prove: true.
 
+------------------------------------------------------------
+------------------------------------------------------------
+  Function PARTIAL_ASSIGNS_STATIC
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 75) in 'PARTIAL_ASSIGNS_STATIC':
+Call Effect at line 77
+Assume {
+  (* Heap *)
+  Type: (region(p.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: (0 <= i) /\ (i <= 4) /\ (!invalid(Malloc_0, shift_sint32(p, 0), 5)).
+}
+Prove: (i = 0) \/ (i = 4) \/ ((0 < i) /\ (i <= 3)).
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 75) in 'PARTIAL_ASSIGNS_STATIC':
+Call Effect at line 77
+Assume {
+  (* Heap *)
+  Type: (region(p.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: (0 <= i) /\ (i <= 4) /\ (!invalid(Malloc_0, shift_sint32(p, 0), 5)).
+}
+Prove: (i = 0) \/ (i = 4) \/ ((0 < i) /\ (i <= 3)).
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function PARTIAL_ASSIGNS_VARS
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 81) in 'PARTIAL_ASSIGNS_VARS':
+Call Effect at line 83
+Let a = shift_sint32(p, 0).
+Let x = 1 + n.
+Let a_1 = shift_sint32(p, 1).
+Let x_1 = n - 1.
+Assume {
+  Have: 0 <= n.
+  Type: is_uint32(n).
+  (* Heap *)
+  Type: (region(p.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: (0 <= i) /\ (i <= n) /\ (!invalid(Malloc_0, a, x)).
+  (* Pre-condition *)
+  Have: 5 <= n.
+}
+Prove: (i = 0) \/ (n = i) \/ (n <= 0) \/ included(a, x, a_1, x_1) \/
+    included(a, x, shift_sint32(p, n), 1) \/
+    included(shift_sint32(p, i), 1, a_1, x_1).
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 81) in 'PARTIAL_ASSIGNS_VARS':
+Call Effect at line 83
+Let a = shift_sint32(p, 0).
+Let x = 1 + n.
+Let a_1 = shift_sint32(p, 1).
+Let x_1 = n - 1.
+Assume {
+  Have: 0 <= n.
+  Type: is_uint32(n).
+  (* Heap *)
+  Type: (region(p.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: (0 <= i) /\ (i <= n) /\ (!invalid(Malloc_0, a, x)).
+  (* Pre-condition *)
+  Have: 5 <= n.
+}
+Prove: (i = 0) \/ (n = i) \/ (n <= 0) \/ included(a, x, a_1, x_1) \/
+    included(a, x, shift_sint32(p, n), 1) \/
+    included(shift_sint32(p, i), 1, a_1, x_1).
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function RANGE_NESTED_ARRAY_STATIC
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 111) in 'RANGE_NESTED_ARRAY_STATIC':
+Call Effect at line 116
+Let x = 4 * i.
+Assume {
+  (* Heap *)
+  Type: (region(s.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: (0 <= i) /\ (i <= 2) /\
+      (!invalid(Malloc_0, shift_S2_With_array(s, 0), 12)).
+}
+Prove: (i = 2) \/
+    (((i = 0) \/ (i = 1) \/ (2 <= i)) /\
+     ((i = 1) \/ (2 <= i) \/
+      (forall i_1 : Z. let x_1 = i_1 + x in ((0 <= i_1) -> ((i_1 <= 2) ->
+       ((x_1 = (-1)) \/ (x_1 = 0) \/ (x_1 = 3) \/
+        ((0 < x_1) /\ (x_1 <= 2)) \/ ((4 <= x_1) /\ (x_1 <= 6)) \/
+        ((7 <= x_1) /\ (x_1 <= 10)))))))).
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 111) in 'RANGE_NESTED_ARRAY_STATIC':
+Call Effect at line 116
+Let x = 4 * i.
+Assume {
+  (* Heap *)
+  Type: (region(s.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: (0 <= i) /\ (i <= 2) /\
+      (!invalid(Malloc_0, shift_S2_With_array(s, 0), 12)).
+}
+Prove: (i = 2) \/
+    (((i = 0) \/ (i = 1) \/ (2 <= i)) /\
+     ((i = 1) \/ (2 <= i) \/
+      (forall i_1 : Z. let x_1 = i_1 + x in ((0 <= i_1) -> ((i_1 <= 2) ->
+       ((x_1 = (-1)) \/ (x_1 = 0) \/ (x_1 = 3) \/
+        ((0 < x_1) /\ (x_1 <= 2)) \/ ((4 <= x_1) /\ (x_1 <= 6)) \/
+        ((7 <= x_1) /\ (x_1 <= 10)))))))).
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function RANGE_NESTED_ARRAY_VARS
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 121) in 'RANGE_NESTED_ARRAY_VARS':
+Call Effect at line 126
+Let a = shift_S2_With_array(s, 0).
+Let x = 4 * n.
+Let x_1 = 4 + x.
+Let a_1 = shift_S2_With_array(s, 2).
+Let x_2 = x - 4.
+Let a_2 = shift_S2_With_array(s, i).
+Let a_3 = shift_S2_With_array(s, 1).
+Let a_4 = shiftfield_F2_With_array_t(a).
+Let a_5 = shift_sint32(a_4, 1).
+Let a_6 = shift_sint32(shiftfield_F2_With_array_t(a_3), 0).
+Let x_3 = 1 + m.
+Let a_7 = shiftfield_F2_With_array_x(a_2).
+Let a_8 = shiftfield_F2_With_array_t(a_2).
+Let x_4 = 4 * i.
+Assume {
+  Type: is_uint32(m) /\ is_uint32(n).
+  (* Heap *)
+  Type: (region(s.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: (0 <= i) /\ (i <= n) /\ (!invalid(Malloc_0, a, x_1)).
+  (* Pre-condition *)
+  Have: (3 <= n) /\ (4 <= m).
+}
+Prove: (n < 0) \/ included(a, x_1, a_1, x_2) \/ included(a_2, 4, a_1, x_2) \/
+    included(a, x_1, shiftfield_F2_With_array_x(a_3), 1) \/
+    included(a, x_1, shift_sint32(a_4, 0), 1) \/ included(a, x_1, a_5, m) \/
+    included(a, x_1, a_6, x_3) \/ included(a_2, 4, a_5, m) \/
+    included(a_2, 4, a_6, x_3) \/
+    (((i = 0) \/ (i = 1) \/ included(a_7, 1, a_1, x_2) \/
+      included(a_7, 1, a_5, m) \/ included(a_7, 1, a_6, x_3)) /\
+     (included(a_8, 3, a_1, x_2) \/ included(a_8, 3, a_5, m) \/
+      included(a_8, 3, a_6, x_3) \/
+      (forall i_1 : Z. let x_5 = i_1 + x_4 in
+       let a_9 = shift_sint32(a_8, i_1) in ((0 <= i_1) -> ((i_1 <= 2) ->
+       ((x_5 = (-1)) \/ (x_5 = 0) \/ (x_5 = 3) \/
+        included(a_9, 1, a_1, x_2) \/ included(a_9, 1, a_5, m) \/
+        included(a_9, 1, a_6, x_3))))))).
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 121) in 'RANGE_NESTED_ARRAY_VARS':
+Call Effect at line 126
+Let a = shift_S2_With_array(s, 0).
+Let x = 4 * n.
+Let x_1 = 4 + x.
+Let a_1 = shift_S2_With_array(s, 2).
+Let x_2 = x - 4.
+Let a_2 = shift_S2_With_array(s, i).
+Let a_3 = shift_S2_With_array(s, 1).
+Let a_4 = shiftfield_F2_With_array_t(a).
+Let a_5 = shift_sint32(a_4, 1).
+Let a_6 = shift_sint32(shiftfield_F2_With_array_t(a_3), 0).
+Let x_3 = 1 + m.
+Let a_7 = shiftfield_F2_With_array_x(a_2).
+Let a_8 = shiftfield_F2_With_array_t(a_2).
+Let x_4 = 4 * i.
+Assume {
+  Type: is_uint32(m) /\ is_uint32(n).
+  (* Heap *)
+  Type: (region(s.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: (0 <= i) /\ (i <= n) /\ (!invalid(Malloc_0, a, x_1)).
+  (* Pre-condition *)
+  Have: (3 <= n) /\ (4 <= m).
+}
+Prove: (n < 0) \/ included(a, x_1, a_1, x_2) \/ included(a_2, 4, a_1, x_2) \/
+    included(a, x_1, shiftfield_F2_With_array_x(a_3), 1) \/
+    included(a, x_1, shift_sint32(a_4, 0), 1) \/ included(a, x_1, a_5, m) \/
+    included(a, x_1, a_6, x_3) \/ included(a_2, 4, a_5, m) \/
+    included(a_2, 4, a_6, x_3) \/
+    (((i = 0) \/ (i = 1) \/ included(a_7, 1, a_1, x_2) \/
+      included(a_7, 1, a_5, m) \/ included(a_7, 1, a_6, x_3)) /\
+     (included(a_8, 3, a_1, x_2) \/ included(a_8, 3, a_5, m) \/
+      included(a_8, 3, a_6, x_3) \/
+      (forall i_1 : Z. let x_5 = i_1 + x_4 in
+       let a_9 = shift_sint32(a_8, i_1) in ((0 <= i_1) -> ((i_1 <= 2) ->
+       ((x_5 = (-1)) \/ (x_5 = 0) \/ (x_5 = 3) \/
+        included(a_9, 1, a_1, x_2) \/ included(a_9, 1, a_5, m) \/
+        included(a_9, 1, a_6, x_3))))))).
+
 ------------------------------------------------------------
 ------------------------------------------------------------
   Function USE_ASSIGN_UNFOLD_KO
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Post-condition (file unfold_assigns.i, line 48) in 'USE_ASSIGN_UNFOLD_KO':
+||||||| ac7807782d
+Goal Post-condition (file tests/wp_plugin/unfold_assigns.i, line 48) in 'USE_ASSIGN_UNFOLD_KO':
+=======
+Goal Post-condition (file tests/wp_plugin/unfold_assigns.i, line 52) in 'USE_ASSIGN_UNFOLD_KO':
+>>>>>>> origin/master
 Let a = Load_S1_S(q, Mint_0).
 Let a_1 = Load_S1_S(q, havoc(Mint_undef_0, Mint_0, p, 2)).
 Assume {
@@ -98,14 +446,30 @@ Prove: EqS1_S(a_1, a).
 
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Assigns (file unfold_assigns.i, line 49) in 'USE_ASSIGN_UNFOLD_KO':
 Call Effect at line 53
+||||||| ac7807782d
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 49) in 'USE_ASSIGN_UNFOLD_KO':
+Call Effect at line 53
+=======
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 53) in 'USE_ASSIGN_UNFOLD_KO':
+Call Effect at line 57
+>>>>>>> origin/master
 Prove: true.
 
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Assigns (file unfold_assigns.i, line 49) in 'USE_ASSIGN_UNFOLD_KO':
 Call Effect at line 53
+||||||| ac7807782d
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 49) in 'USE_ASSIGN_UNFOLD_KO':
+Call Effect at line 53
+=======
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 53) in 'USE_ASSIGN_UNFOLD_KO':
+Call Effect at line 57
+>>>>>>> origin/master
 Prove: true.
 
 ------------------------------------------------------------
@@ -113,7 +477,13 @@ Prove: true.
   Function USE_ASSIGN_UNFOLD_OK
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Post-condition (file unfold_assigns.i, line 39) in 'USE_ASSIGN_UNFOLD_OK':
+||||||| ac7807782d
+Goal Post-condition (file tests/wp_plugin/unfold_assigns.i, line 39) in 'USE_ASSIGN_UNFOLD_OK':
+=======
+Goal Post-condition (file tests/wp_plugin/unfold_assigns.i, line 43) in 'USE_ASSIGN_UNFOLD_OK':
+>>>>>>> origin/master
 Let a = Load_S1_S(q, Mint_0).
 Let a_1 = Load_S1_S(q, havoc(Mint_undef_0, Mint_0, p, 2)).
 Assume {
@@ -127,14 +497,30 @@ Prove: EqS1_S(a_1, a).
 
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Assigns (file unfold_assigns.i, line 40) in 'USE_ASSIGN_UNFOLD_OK':
 Call Effect at line 44
+||||||| ac7807782d
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 40) in 'USE_ASSIGN_UNFOLD_OK':
+Call Effect at line 44
+=======
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 44) in 'USE_ASSIGN_UNFOLD_OK':
+Call Effect at line 48
+>>>>>>> origin/master
 Prove: true.
 
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Assigns (file unfold_assigns.i, line 40) in 'USE_ASSIGN_UNFOLD_OK':
 Call Effect at line 44
+||||||| ac7807782d
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 40) in 'USE_ASSIGN_UNFOLD_OK':
+Call Effect at line 44
+=======
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 44) in 'USE_ASSIGN_UNFOLD_OK':
+Call Effect at line 48
+>>>>>>> origin/master
 Prove: true.
 
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.2.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.2.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..033ab3d4f1c96a2be3b8fe64a10e2e1b1d3a9d12
--- /dev/null
+++ b/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.2.res.oracle
@@ -0,0 +1,378 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_plugin/unfold_assigns.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+------------------------------------------------------------
+  Function ASSIGN_NO_UNFOLD_KO
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 66) in 'ASSIGN_NO_UNFOLD_KO':
+Effect at line 69
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function ASSIGN_NO_UNFOLD_OK
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 60) in 'ASSIGN_NO_UNFOLD_OK':
+Effect at line 63
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function NESTED_ARRAY_STATIC
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 95) in 'NESTED_ARRAY_STATIC':
+Call Effect at line 97
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 95) in 'NESTED_ARRAY_STATIC':
+Call Effect at line 97
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function NESTED_ARRAY_VARS
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 102) in 'NESTED_ARRAY_VARS':
+Call Effect at line 104
+Let a = shiftfield_F2_With_array_t(s).
+Let a_1 = shift_sint32(a, 1).
+Assume {
+  Have: 0 < i.
+  Have: i <= 2.
+  Type: is_uint32(n).
+  (* Heap *)
+  Type: (region(s.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: !invalid(Malloc_0, s, 4).
+  (* Pre-condition *)
+  Have: 3 <= n.
+}
+Prove: (i = (-1)) \/ included(s, 4, a_1, n) \/ included(a, 3, a_1, n) \/
+    included(shift_sint32(a, i), 1, a_1, n).
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 102) in 'NESTED_ARRAY_VARS':
+Call Effect at line 104
+Let a = shiftfield_F2_With_array_t(s).
+Let a_1 = shift_sint32(a, 1).
+Assume {
+  Have: 0 < i.
+  Have: i <= 2.
+  Type: is_uint32(n).
+  (* Heap *)
+  Type: (region(s.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: !invalid(Malloc_0, s, 4).
+  (* Pre-condition *)
+  Have: 3 <= n.
+}
+Prove: (i = (-1)) \/ included(s, 4, a_1, n) \/ included(a, 3, a_1, n) \/
+    included(shift_sint32(a, i), 1, a_1, n).
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function NO_UNFOLD_KO
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 37) in 'NO_UNFOLD_KO':
+Call Effect at line 39
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 37) in 'NO_UNFOLD_KO':
+Call Effect at line 39
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function NO_UNFOLD_OK_1
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 22) in 'NO_UNFOLD_OK_1':
+Call Effect at line 24
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 22) in 'NO_UNFOLD_OK_1':
+Call Effect at line 24
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function NO_UNFOLD_OK_2
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 27) in 'NO_UNFOLD_OK_2':
+Call Effect at line 29
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 27) in 'NO_UNFOLD_OK_2':
+Call Effect at line 29
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function NO_UNFOLD_OK_3
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 32) in 'NO_UNFOLD_OK_3':
+Call Effect at line 34
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 32) in 'NO_UNFOLD_OK_3':
+Call Effect at line 34
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function PARTIAL_ASSIGNS_STATIC
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 75) in 'PARTIAL_ASSIGNS_STATIC':
+Call Effect at line 77
+Assume {
+  (* Heap *)
+  Type: (region(p.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: (0 <= i) /\ (i <= 4) /\ (!invalid(Malloc_0, shift_sint32(p, 0), 5)).
+}
+Prove: (i = 0) \/ (i = 4) \/ ((0 < i) /\ (i <= 3)).
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 75) in 'PARTIAL_ASSIGNS_STATIC':
+Call Effect at line 77
+Assume {
+  (* Heap *)
+  Type: (region(p.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: (0 <= i) /\ (i <= 4) /\ (!invalid(Malloc_0, shift_sint32(p, 0), 5)).
+}
+Prove: (i = 0) \/ (i = 4) \/ ((0 < i) /\ (i <= 3)).
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function PARTIAL_ASSIGNS_VARS
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 81) in 'PARTIAL_ASSIGNS_VARS':
+Call Effect at line 83
+Let a = shift_sint32(p, 0).
+Let x = 1 + n.
+Let a_1 = shift_sint32(p, 1).
+Let x_1 = n - 1.
+Assume {
+  Have: 0 <= n.
+  Type: is_uint32(n).
+  (* Heap *)
+  Type: (region(p.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: (0 <= i) /\ (i <= n) /\ (!invalid(Malloc_0, a, x)).
+  (* Pre-condition *)
+  Have: 5 <= n.
+}
+Prove: (i = 0) \/ (n = i) \/ (n <= 0) \/ included(a, x, a_1, x_1) \/
+    included(a, x, shift_sint32(p, n), 1) \/
+    included(shift_sint32(p, i), 1, a_1, x_1).
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 81) in 'PARTIAL_ASSIGNS_VARS':
+Call Effect at line 83
+Let a = shift_sint32(p, 0).
+Let x = 1 + n.
+Let a_1 = shift_sint32(p, 1).
+Let x_1 = n - 1.
+Assume {
+  Have: 0 <= n.
+  Type: is_uint32(n).
+  (* Heap *)
+  Type: (region(p.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: (0 <= i) /\ (i <= n) /\ (!invalid(Malloc_0, a, x)).
+  (* Pre-condition *)
+  Have: 5 <= n.
+}
+Prove: (i = 0) \/ (n = i) \/ (n <= 0) \/ included(a, x, a_1, x_1) \/
+    included(a, x, shift_sint32(p, n), 1) \/
+    included(shift_sint32(p, i), 1, a_1, x_1).
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function RANGE_NESTED_ARRAY_STATIC
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 111) in 'RANGE_NESTED_ARRAY_STATIC':
+Call Effect at line 116
+Assume {
+  (* Heap *)
+  Type: (region(s.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: (0 <= i) /\ (i <= 2) /\
+      (!invalid(Malloc_0, shift_S2_With_array(s, 0), 12)).
+}
+Prove: (i = 2) \/
+    (((i = 1) \/ (2 <= i)) /\ ((i = 0) \/ (i = 1) \/ (2 <= i))).
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 111) in 'RANGE_NESTED_ARRAY_STATIC':
+Call Effect at line 116
+Assume {
+  (* Heap *)
+  Type: (region(s.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: (0 <= i) /\ (i <= 2) /\
+      (!invalid(Malloc_0, shift_S2_With_array(s, 0), 12)).
+}
+Prove: (i = 2) \/
+    (((i = 1) \/ (2 <= i)) /\ ((i = 0) \/ (i = 1) \/ (2 <= i))).
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function RANGE_NESTED_ARRAY_VARS
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 121) in 'RANGE_NESTED_ARRAY_VARS':
+Call Effect at line 126
+Let a = shift_S2_With_array(s, 0).
+Let x = 4 * n.
+Let x_1 = 4 + x.
+Let a_1 = shift_S2_With_array(s, 2).
+Let x_2 = x - 4.
+Let a_2 = shift_S2_With_array(s, i).
+Let a_3 = shift_S2_With_array(s, 1).
+Let a_4 = shiftfield_F2_With_array_t(a).
+Let a_5 = shift_sint32(a_4, 1).
+Let a_6 = shift_sint32(shiftfield_F2_With_array_t(a_3), 0).
+Let x_3 = 1 + m.
+Let a_7 = shiftfield_F2_With_array_t(a_2).
+Let a_8 = shiftfield_F2_With_array_x(a_2).
+Assume {
+  Type: is_uint32(m) /\ is_uint32(n).
+  (* Heap *)
+  Type: (region(s.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: (0 <= i) /\ (i <= n) /\ (!invalid(Malloc_0, a, x_1)).
+  (* Pre-condition *)
+  Have: (3 <= n) /\ (4 <= m).
+}
+Prove: (n < 0) \/ included(a, x_1, a_1, x_2) \/ included(a_2, 4, a_1, x_2) \/
+    included(a, x_1, shiftfield_F2_With_array_x(a_3), 1) \/
+    included(a, x_1, shift_sint32(a_4, 0), 1) \/ included(a, x_1, a_5, m) \/
+    included(a, x_1, a_6, x_3) \/ included(a_2, 4, a_5, m) \/
+    included(a_2, 4, a_6, x_3) \/
+    ((included(a_7, 3, a_1, x_2) \/ included(a_7, 3, a_5, m) \/
+      included(a_7, 3, a_6, x_3)) /\
+     ((i = 0) \/ (i = 1) \/ included(a_8, 1, a_1, x_2) \/
+      included(a_8, 1, a_5, m) \/ included(a_8, 1, a_6, x_3))).
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 121) in 'RANGE_NESTED_ARRAY_VARS':
+Call Effect at line 126
+Let a = shift_S2_With_array(s, 0).
+Let x = 4 * n.
+Let x_1 = 4 + x.
+Let a_1 = shift_S2_With_array(s, 2).
+Let x_2 = x - 4.
+Let a_2 = shift_S2_With_array(s, i).
+Let a_3 = shift_S2_With_array(s, 1).
+Let a_4 = shiftfield_F2_With_array_t(a).
+Let a_5 = shift_sint32(a_4, 1).
+Let a_6 = shift_sint32(shiftfield_F2_With_array_t(a_3), 0).
+Let x_3 = 1 + m.
+Let a_7 = shiftfield_F2_With_array_t(a_2).
+Let a_8 = shiftfield_F2_With_array_x(a_2).
+Assume {
+  Type: is_uint32(m) /\ is_uint32(n).
+  (* Heap *)
+  Type: (region(s.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: (0 <= i) /\ (i <= n) /\ (!invalid(Malloc_0, a, x_1)).
+  (* Pre-condition *)
+  Have: (3 <= n) /\ (4 <= m).
+}
+Prove: (n < 0) \/ included(a, x_1, a_1, x_2) \/ included(a_2, 4, a_1, x_2) \/
+    included(a, x_1, shiftfield_F2_With_array_x(a_3), 1) \/
+    included(a, x_1, shift_sint32(a_4, 0), 1) \/ included(a, x_1, a_5, m) \/
+    included(a, x_1, a_6, x_3) \/ included(a_2, 4, a_5, m) \/
+    included(a_2, 4, a_6, x_3) \/
+    ((included(a_7, 3, a_1, x_2) \/ included(a_7, 3, a_5, m) \/
+      included(a_7, 3, a_6, x_3)) /\
+     ((i = 0) \/ (i = 1) \/ included(a_8, 1, a_1, x_2) \/
+      included(a_8, 1, a_5, m) \/ included(a_8, 1, a_6, x_3))).
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function USE_ASSIGN_UNFOLD_KO
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_plugin/unfold_assigns.i, line 52) in 'USE_ASSIGN_UNFOLD_KO':
+Let a = Load_S1_S(q, Mint_0).
+Let a_1 = Load_S1_S(q, havoc(Mint_undef_0, Mint_0, p, 2)).
+Assume {
+  Type: IsS1_S(a) /\ IsS1_S(a_1).
+  (* Heap *)
+  Type: (region(p.base) <= 0) /\ (region(q.base) <= 0).
+  (* Goal *)
+  When: separated(p, 2, q, 2).
+}
+Prove: EqS1_S(a_1, a).
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 53) in 'USE_ASSIGN_UNFOLD_KO':
+Call Effect at line 57
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 53) in 'USE_ASSIGN_UNFOLD_KO':
+Call Effect at line 57
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function USE_ASSIGN_UNFOLD_OK
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_plugin/unfold_assigns.i, line 43) in 'USE_ASSIGN_UNFOLD_OK':
+Let a = Load_S1_S(q, Mint_0).
+Let a_1 = Load_S1_S(q, havoc(Mint_undef_0, Mint_0, p, 2)).
+Assume {
+  Type: IsS1_S(a) /\ IsS1_S(a_1).
+  (* Heap *)
+  Type: (region(p.base) <= 0) /\ (region(q.base) <= 0).
+  (* Goal *)
+  When: separated(p, 2, q, 2).
+}
+Prove: EqS1_S(a_1, a).
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 44) in 'USE_ASSIGN_UNFOLD_OK':
+Call Effect at line 48
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 44) in 'USE_ASSIGN_UNFOLD_OK':
+Call Effect at line 48
+Prove: true.
+
+------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.3.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.3.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..d6391ac676aed68ae010ebb11022285ddb5b4ced
--- /dev/null
+++ b/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.3.res.oracle
@@ -0,0 +1,370 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_plugin/unfold_assigns.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+------------------------------------------------------------
+  Function ASSIGN_NO_UNFOLD_KO
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 66) in 'ASSIGN_NO_UNFOLD_KO':
+Effect at line 69
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function ASSIGN_NO_UNFOLD_OK
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 60) in 'ASSIGN_NO_UNFOLD_OK':
+Effect at line 63
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function NESTED_ARRAY_STATIC
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 95) in 'NESTED_ARRAY_STATIC':
+Call Effect at line 97
+Assume {
+  (* Heap *)
+  Type: (region(s.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: !invalid(Malloc_0, s, 4).
+}
+Prove: false.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 95) in 'NESTED_ARRAY_STATIC':
+Call Effect at line 97
+Assume {
+  (* Heap *)
+  Type: (region(s.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: !invalid(Malloc_0, s, 4).
+}
+Prove: false.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function NESTED_ARRAY_VARS
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 102) in 'NESTED_ARRAY_VARS':
+Call Effect at line 104
+Let a = shiftfield_F2_With_array_t(s).
+Let a_1 = shift_sint32(a, 1).
+Assume {
+  Type: is_uint32(n).
+  (* Heap *)
+  Type: (region(s.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: !invalid(Malloc_0, s, 4).
+  (* Pre-condition *)
+  Have: 3 <= n.
+}
+Prove: included(s, 4, a_1, n) \/ included(a, 3, a_1, n).
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 102) in 'NESTED_ARRAY_VARS':
+Call Effect at line 104
+Let a = shiftfield_F2_With_array_t(s).
+Let a_1 = shift_sint32(a, 1).
+Assume {
+  Type: is_uint32(n).
+  (* Heap *)
+  Type: (region(s.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: !invalid(Malloc_0, s, 4).
+  (* Pre-condition *)
+  Have: 3 <= n.
+}
+Prove: included(s, 4, a_1, n) \/ included(a, 3, a_1, n).
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function NO_UNFOLD_KO
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 37) in 'NO_UNFOLD_KO':
+Call Effect at line 39
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 37) in 'NO_UNFOLD_KO':
+Call Effect at line 39
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function NO_UNFOLD_OK_1
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 22) in 'NO_UNFOLD_OK_1':
+Call Effect at line 24
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 22) in 'NO_UNFOLD_OK_1':
+Call Effect at line 24
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function NO_UNFOLD_OK_2
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 27) in 'NO_UNFOLD_OK_2':
+Call Effect at line 29
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 27) in 'NO_UNFOLD_OK_2':
+Call Effect at line 29
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function NO_UNFOLD_OK_3
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 32) in 'NO_UNFOLD_OK_3':
+Call Effect at line 34
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 32) in 'NO_UNFOLD_OK_3':
+Call Effect at line 34
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function PARTIAL_ASSIGNS_STATIC
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 75) in 'PARTIAL_ASSIGNS_STATIC':
+Call Effect at line 77
+Assume {
+  (* Heap *)
+  Type: (region(p.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: (0 <= i) /\ (i <= 4) /\ (!invalid(Malloc_0, shift_sint32(p, 0), 5)).
+}
+Prove: (i = 0) \/ (i = 4) \/ ((0 < i) /\ (i <= 3)).
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 75) in 'PARTIAL_ASSIGNS_STATIC':
+Call Effect at line 77
+Assume {
+  (* Heap *)
+  Type: (region(p.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: (0 <= i) /\ (i <= 4) /\ (!invalid(Malloc_0, shift_sint32(p, 0), 5)).
+}
+Prove: (i = 0) \/ (i = 4) \/ ((0 < i) /\ (i <= 3)).
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function PARTIAL_ASSIGNS_VARS
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 81) in 'PARTIAL_ASSIGNS_VARS':
+Call Effect at line 83
+Let a = shift_sint32(p, 0).
+Let x = 1 + n.
+Let a_1 = shift_sint32(p, 1).
+Let x_1 = n - 1.
+Assume {
+  Have: 0 <= n.
+  Type: is_uint32(n).
+  (* Heap *)
+  Type: (region(p.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: (0 <= i) /\ (i <= n) /\ (!invalid(Malloc_0, a, x)).
+  (* Pre-condition *)
+  Have: 5 <= n.
+}
+Prove: (i = 0) \/ (n = i) \/ (n <= 0) \/ included(a, x, a_1, x_1) \/
+    included(a, x, shift_sint32(p, n), 1) \/
+    included(shift_sint32(p, i), 1, a_1, x_1).
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 81) in 'PARTIAL_ASSIGNS_VARS':
+Call Effect at line 83
+Let a = shift_sint32(p, 0).
+Let x = 1 + n.
+Let a_1 = shift_sint32(p, 1).
+Let x_1 = n - 1.
+Assume {
+  Have: 0 <= n.
+  Type: is_uint32(n).
+  (* Heap *)
+  Type: (region(p.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: (0 <= i) /\ (i <= n) /\ (!invalid(Malloc_0, a, x)).
+  (* Pre-condition *)
+  Have: 5 <= n.
+}
+Prove: (i = 0) \/ (n = i) \/ (n <= 0) \/ included(a, x, a_1, x_1) \/
+    included(a, x, shift_sint32(p, n), 1) \/
+    included(shift_sint32(p, i), 1, a_1, x_1).
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function RANGE_NESTED_ARRAY_STATIC
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 111) in 'RANGE_NESTED_ARRAY_STATIC':
+Call Effect at line 116
+Assume {
+  (* Heap *)
+  Type: (region(s.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: (0 <= i) /\ (i <= 2) /\
+      (!invalid(Malloc_0, shift_S2_With_array(s, 0), 12)).
+}
+Prove: i = 2.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 111) in 'RANGE_NESTED_ARRAY_STATIC':
+Call Effect at line 116
+Assume {
+  (* Heap *)
+  Type: (region(s.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: (0 <= i) /\ (i <= 2) /\
+      (!invalid(Malloc_0, shift_S2_With_array(s, 0), 12)).
+}
+Prove: i = 2.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function RANGE_NESTED_ARRAY_VARS
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 121) in 'RANGE_NESTED_ARRAY_VARS':
+Call Effect at line 126
+Let a = shift_S2_With_array(s, 0).
+Let x = 4 * n.
+Let x_1 = 4 + x.
+Let a_1 = shift_S2_With_array(s, 2).
+Let x_2 = x - 4.
+Let a_2 = shift_S2_With_array(s, i).
+Let a_3 = shift_S2_With_array(s, 1).
+Let a_4 = shiftfield_F2_With_array_t(a).
+Let a_5 = shift_sint32(a_4, 1).
+Let a_6 = shift_sint32(shiftfield_F2_With_array_t(a_3), 0).
+Let x_3 = 1 + m.
+Assume {
+  Type: is_uint32(m) /\ is_uint32(n).
+  (* Heap *)
+  Type: (region(s.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: (0 <= i) /\ (i <= n) /\ (!invalid(Malloc_0, a, x_1)).
+  (* Pre-condition *)
+  Have: (3 <= n) /\ (4 <= m).
+}
+Prove: (n < 0) \/ included(a, x_1, a_1, x_2) \/ included(a_2, 4, a_1, x_2) \/
+    included(a, x_1, shiftfield_F2_With_array_x(a_3), 1) \/
+    included(a, x_1, shift_sint32(a_4, 0), 1) \/ included(a, x_1, a_5, m) \/
+    included(a, x_1, a_6, x_3) \/ included(a_2, 4, a_5, m) \/
+    included(a_2, 4, a_6, x_3).
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 121) in 'RANGE_NESTED_ARRAY_VARS':
+Call Effect at line 126
+Let a = shift_S2_With_array(s, 0).
+Let x = 4 * n.
+Let x_1 = 4 + x.
+Let a_1 = shift_S2_With_array(s, 2).
+Let x_2 = x - 4.
+Let a_2 = shift_S2_With_array(s, i).
+Let a_3 = shift_S2_With_array(s, 1).
+Let a_4 = shiftfield_F2_With_array_t(a).
+Let a_5 = shift_sint32(a_4, 1).
+Let a_6 = shift_sint32(shiftfield_F2_With_array_t(a_3), 0).
+Let x_3 = 1 + m.
+Assume {
+  Type: is_uint32(m) /\ is_uint32(n).
+  (* Heap *)
+  Type: (region(s.base) <= 0) /\ linked(Malloc_0).
+  (* Goal *)
+  When: (0 <= i) /\ (i <= n) /\ (!invalid(Malloc_0, a, x_1)).
+  (* Pre-condition *)
+  Have: (3 <= n) /\ (4 <= m).
+}
+Prove: (n < 0) \/ included(a, x_1, a_1, x_2) \/ included(a_2, 4, a_1, x_2) \/
+    included(a, x_1, shiftfield_F2_With_array_x(a_3), 1) \/
+    included(a, x_1, shift_sint32(a_4, 0), 1) \/ included(a, x_1, a_5, m) \/
+    included(a, x_1, a_6, x_3) \/ included(a_2, 4, a_5, m) \/
+    included(a_2, 4, a_6, x_3).
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function USE_ASSIGN_UNFOLD_KO
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_plugin/unfold_assigns.i, line 52) in 'USE_ASSIGN_UNFOLD_KO':
+Let a = Load_S1_S(q, Mint_0).
+Let a_1 = Load_S1_S(q, havoc(Mint_undef_0, Mint_0, p, 2)).
+Assume {
+  Type: IsS1_S(a) /\ IsS1_S(a_1).
+  (* Heap *)
+  Type: (region(p.base) <= 0) /\ (region(q.base) <= 0).
+  (* Goal *)
+  When: separated(p, 2, q, 2).
+}
+Prove: EqS1_S(a_1, a).
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 53) in 'USE_ASSIGN_UNFOLD_KO':
+Call Effect at line 57
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 53) in 'USE_ASSIGN_UNFOLD_KO':
+Call Effect at line 57
+Prove: true.
+
+------------------------------------------------------------
+------------------------------------------------------------
+  Function USE_ASSIGN_UNFOLD_OK
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_plugin/unfold_assigns.i, line 43) in 'USE_ASSIGN_UNFOLD_OK':
+Let a = Load_S1_S(q, Mint_0).
+Let a_1 = Load_S1_S(q, havoc(Mint_undef_0, Mint_0, p, 2)).
+Assume {
+  Type: IsS1_S(a) /\ IsS1_S(a_1).
+  (* Heap *)
+  Type: (region(p.base) <= 0) /\ (region(q.base) <= 0).
+  (* Goal *)
+  When: separated(p, 2, q, 2).
+}
+Prove: EqS1_S(a_1, a).
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 44) in 'USE_ASSIGN_UNFOLD_OK':
+Call Effect at line 48
+Prove: true.
+
+------------------------------------------------------------
+
+Goal Assigns (file tests/wp_plugin/unfold_assigns.i, line 44) in 'USE_ASSIGN_UNFOLD_OK':
+Call Effect at line 48
+Prove: true.
+
+------------------------------------------------------------
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 cba857e2063ec70dd88ae678ba4e25f6925111c9..ee45c894b59f69b7c61a85def70614021bc6d529 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
@@ -35,7 +35,8 @@ Goal Assertion 'KO_WHEN_VOLATILE' (file volatile.i, line 35):
 Prove: EqS1_st_v(w, w_1).
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'job_struct_assigns':
-  /*@ behavior typed:
+[wp] tests/wp_plugin/volatile.i:32: Warning: 
+  Memory model hypotheses for function 'job_struct_assigns':
+  /*@ behavior wp_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 484e4596c2937f86c901c339b927a1ed2048584b..fee21eec2ebf4cb638483b81661585d0f6dc035c 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
@@ -62,7 +62,8 @@ volatile.i:35: warning from wp:
 Prove: true.
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'job_struct_assigns':
-  /*@ behavior typed:
+[wp] tests/wp_plugin/volatile.i:32: Warning: 
+  Memory model hypotheses for function 'job_struct_assigns':
+  /*@ behavior wp_typed:
         requires \separated(p, &sv); */
   void job_struct_assigns(struct st_v *p);
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/bitmask0x8000.0.session/script/lemma_res_n.json b/src/plugins/wp/tests/wp_plugin/oracle_qualif/bitmask0x8000.0.session/script/lemma_res_n.json
new file mode 100644
index 0000000000000000000000000000000000000000..c1f541d00af218c3a2c837305606b0681f1e9f7d
--- /dev/null
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/bitmask0x8000.0.session/script/lemma_res_n.json
@@ -0,0 +1,8 @@
+[ { "header": "Bit-Test Range", "tactic": "Wp.bittestrange", "params": {},
+    "select": { "select": "inside-step", "at": 1, "kind": "have", "occur": 0,
+                "target": "not (bit_test off_0 15)",
+                "pattern": "!bit_test$off15" },
+    "children": { "Bit #15 (inf)": [ { "prover": "qed", "verdict": "valid" } ],
+                  "Bit #15 (sup)": [ { "prover": "Alt-Ergo:2.2.0",
+                                       "verdict": "valid", "time": 0.0263,
+                                       "steps": 32 } ] } } ]
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/bitmask0x8000.0.session/script/lemma_res_y.json b/src/plugins/wp/tests/wp_plugin/oracle_qualif/bitmask0x8000.0.session/script/lemma_res_y.json
new file mode 100644
index 0000000000000000000000000000000000000000..95cf3e5f2953bc7ed7b6c9ad5939b20299677781
--- /dev/null
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/bitmask0x8000.0.session/script/lemma_res_y.json
@@ -0,0 +1,8 @@
+[ { "header": "Bit-Test Range", "tactic": "Wp.bittestrange", "params": {},
+    "select": { "select": "inside-step", "at": 1, "kind": "have", "occur": 0,
+                "target": "(bit_test off_0 15)",
+                "pattern": "bit_test$off15" },
+    "children": { "Bit #15 (inf)": [ { "prover": "Alt-Ergo:2.2.0",
+                                       "verdict": "valid", "time": 0.0129,
+                                       "steps": 32 } ],
+                  "Bit #15 (sup)": [ { "prover": "qed", "verdict": "valid" } ] } } ]
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/bitmask0x8000.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/bitmask0x8000.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..5c4ea8084169bec24a7caa4d469727168e29a2e0
--- /dev/null
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/bitmask0x8000.res.oracle
@@ -0,0 +1,13 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_plugin/bitmask0x8000.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] 2 goals scheduled
+[wp] [Script] Goal typed_lemma_res_n : Valid
+[wp] [Script] Goal typed_lemma_res_y : Valid
+[wp] Proved goals:    2 / 2
+  Qed:             0 
+  Script:          2
+------------------------------------------------------------
+ Axiomatics                WP     Alt-Ergo  Total   Success
+  Lemma                     -        -        2       100%
+------------------------------------------------------------
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 478700185e2469d10361abcf660b596d465bae4a..7cf9f51cfe8c4dacd517908d6cc7259ceebafc21 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
@@ -67,19 +67,23 @@
   missing_context           4        -        5      80.0%
   no_call                   4        -        4       100%
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'guarded_call':
-  /*@ behavior typed:
+[wp] tests/wp_plugin/dynamic.i:41: Warning: 
+  Memory model hypotheses for function 'guarded_call':
+  /*@ behavior wp_typed:
         requires \separated(p, &X); */
   void guarded_call(struct S *p);
-[wp] Warning: Memory model hypotheses for function 'behavior':
-  /*@ behavior typed:
+[wp] tests/wp_plugin/dynamic.i:63: Warning: 
+  Memory model hypotheses for function 'behavior':
+  /*@ behavior wp_typed:
         requires \separated(p + (..), &X1); */
   int behavior(int (*p)(void));
-[wp] Warning: Memory model hypotheses for function 'some_behaviors':
-  /*@ behavior typed:
+[wp] tests/wp_plugin/dynamic.i:76: Warning: 
+  Memory model hypotheses for function 'some_behaviors':
+  /*@ behavior wp_typed:
         requires \separated(p + (..), &X1); */
   int some_behaviors(int (*p)(void));
-[wp] Warning: Memory model hypotheses for function 'missing_context':
-  /*@ behavior typed:
+[wp] tests/wp_plugin/dynamic.i:85: Warning: 
+  Memory model hypotheses for function 'missing_context':
+  /*@ behavior wp_typed:
         requires \separated(p, &X1); */
   int missing_context(int (*p)(void));
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 b80b06514e7c3ed2285c7f767c8f08197a98e437..9c057e3b1d55f4b13e1a2bba18f0d6bc5e49406a 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
@@ -27,11 +27,13 @@
   f5_ko                     -        -        2       0.0%
   f6_ko                     -        -        2       0.0%
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'f1_ok':
-  /*@ behavior typed:
+[wp] tests/wp_plugin/overassign.i:14: Warning: 
+  Memory model hypotheses for function 'f1_ok':
+  /*@ behavior wp_typed:
         requires \separated(p + (0 .. 9), &p); */
   void f1_ok(void);
-[wp] Warning: Memory model hypotheses for function 'f2_ok':
-  /*@ behavior typed:
+[wp] tests/wp_plugin/overassign.i:17: Warning: 
+  Memory model hypotheses for function 'f2_ok':
+  /*@ behavior wp_typed:
         requires \separated(p + (10 .. 19), &p); */
   void f2_ok(void);
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/overflow2.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/overflow2.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..9c2dfad26f93af7de878b0d812d73f6cfaefc23d
--- /dev/null
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/overflow2.res.oracle
@@ -0,0 +1,27 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_plugin/overflow2.c (with preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+[wp] 14 goals scheduled
+[wp] [Qed] Goal typed_pointers_and_companions_ensures_post : Valid
+[wp] [Qed] Goal typed_pointers_and_companions_assert_a01 : Valid
+[wp] [Qed] Goal typed_pointers_and_companions_assert_a02 : Valid
+[wp] [Qed] Goal typed_pointers_and_companions_assert_a03 : Valid
+[wp] [Alt-Ergo] Goal typed_pointers_and_companions_assert_a04 : Valid
+[wp] [Alt-Ergo] Goal typed_pointers_and_companions_assert_a05 : Valid
+[wp] [Qed] Goal typed_pointers_and_companions_assigns : Valid
+[wp] [Qed] Goal typed_pointers_and_companions_ulong_ensures_postul : Valid
+[wp] [Qed] Goal typed_pointers_and_companions_ulong_assert_a06 : Valid
+[wp] [Qed] Goal typed_pointers_and_companions_ulong_assert_a07 : Valid
+[wp] [Qed] Goal typed_pointers_and_companions_ulong_assert_a08 : Valid
+[wp] [Alt-Ergo] Goal typed_pointers_and_companions_ulong_assert_a09 : Valid
+[wp] [Alt-Ergo] Goal typed_pointers_and_companions_ulong_assert_a10 : Valid
+[wp] [Qed] Goal typed_pointers_and_companions_ulong_assigns : Valid
+[wp] Proved goals:   14 / 14
+  Qed:            10 
+  Alt-Ergo:        4
+------------------------------------------------------------
+ Functions                 WP     Alt-Ergo  Total   Success
+  pointers_and_companions   5        2        7       100%
+  pointers_and_companions_ulong   5   2       7       100%
+------------------------------------------------------------
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
index 125b85ed5174e692bdc852b36d027d86dbeb1143..d87694a384d8e4e8d45c5fe59cb4b089f0249d61 100644
--- 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
@@ -14,10 +14,11 @@
  Functions                 WP     Alt-Ergo  Total   Success
   receive                   5        -        5       100%
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'receive':
+[wp] tests/wp_plugin/post_assigns.i:12: Warning: 
+  Memory model hypotheses for function 'receive':
   /*@
-     behavior typed:
+     behavior wp_typed:
        requires \separated(message + (..), &size);
-       requires \separated(message + (0 .. \at(size,Post)), &size);
+       ensures \separated(message + (0 .. \at(size,Post)), &size);
      */
   void receive(int n, char *message);
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 3f4848d627f39303da8eb3c37551b976480e9c78..e98e73beae1c0e2306894a4cc9532bed4c2dc960 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
@@ -15,3 +15,11 @@
  Functions                 WP     Alt-Ergo  Total   Success
   f                         3        1        5      80.0%
 ------------------------------------------------------------
+[wp] tests/wp_plugin/subset_fopen.c:13: Warning: 
+  Memory model hypotheses for function 'fopen':
+  /*@
+     behavior wp_typed:
+       requires \separated(&_p__fc_fopen, {filename + (..), mode + (..)});
+       ensures \separated(\result, &_p__fc_fopen);
+     */
+  FILE *fopen(char const * __restrict filename, char const * __restrict mode);
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/unfold_assigns.0.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/unfold_assigns.0.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..32f7db5c4ff69fdade8bc819347b2c04b06f58a0
--- /dev/null
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/unfold_assigns.0.res.oracle
@@ -0,0 +1,53 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_plugin/unfold_assigns.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+[wp] 28 goals scheduled
+[wp] [Qed] Goal typed_NO_UNFOLD_OK_1_assigns_exit : Valid
+[wp] [Qed] Goal typed_NO_UNFOLD_OK_1_assigns_normal : Valid
+[wp] [Qed] Goal typed_NO_UNFOLD_OK_2_assigns_exit : Valid
+[wp] [Qed] Goal typed_NO_UNFOLD_OK_2_assigns_normal : Valid
+[wp] [Qed] Goal typed_NO_UNFOLD_OK_3_assigns_exit : Valid
+[wp] [Qed] Goal typed_NO_UNFOLD_OK_3_assigns_normal : Valid
+[wp] [Qed] Goal typed_NO_UNFOLD_KO_assigns_exit : Valid
+[wp] [Qed] Goal typed_NO_UNFOLD_KO_assigns_normal : Valid
+[wp] [Alt-Ergo] Goal typed_USE_ASSIGN_UNFOLD_OK_ensures : Valid
+[wp] [Qed] Goal typed_USE_ASSIGN_UNFOLD_OK_assigns_exit : Valid
+[wp] [Qed] Goal typed_USE_ASSIGN_UNFOLD_OK_assigns_normal : Valid
+[wp] [Alt-Ergo] Goal typed_USE_ASSIGN_UNFOLD_KO_ensures : Valid
+[wp] [Qed] Goal typed_USE_ASSIGN_UNFOLD_KO_assigns_exit : Valid
+[wp] [Qed] Goal typed_USE_ASSIGN_UNFOLD_KO_assigns_normal : Valid
+[wp] [Qed] Goal typed_ASSIGN_NO_UNFOLD_OK_assigns : Valid
+[wp] [Qed] Goal typed_ASSIGN_NO_UNFOLD_KO_assigns : Valid
+[wp] [Alt-Ergo] Goal typed_PARTIAL_ASSIGNS_STATIC_assigns_exit : Valid
+[wp] [Alt-Ergo] Goal typed_PARTIAL_ASSIGNS_STATIC_assigns_normal : Valid
+[wp] [Alt-Ergo] Goal typed_PARTIAL_ASSIGNS_VARS_assigns_exit : Valid
+[wp] [Alt-Ergo] Goal typed_PARTIAL_ASSIGNS_VARS_assigns_normal : Valid
+[wp] [Qed] Goal typed_NESTED_ARRAY_STATIC_assigns_exit : Valid
+[wp] [Qed] Goal typed_NESTED_ARRAY_STATIC_assigns_normal : Valid
+[wp] [Alt-Ergo] Goal typed_NESTED_ARRAY_VARS_assigns_exit : Valid
+[wp] [Alt-Ergo] Goal typed_NESTED_ARRAY_VARS_assigns_normal : Valid
+[wp] [Alt-Ergo] Goal typed_RANGE_NESTED_ARRAY_STATIC_assigns_exit : Valid
+[wp] [Alt-Ergo] Goal typed_RANGE_NESTED_ARRAY_STATIC_assigns_normal : Valid
+[wp] [Alt-Ergo] Goal typed_RANGE_NESTED_ARRAY_VARS_assigns_exit : Valid
+[wp] [Alt-Ergo] Goal typed_RANGE_NESTED_ARRAY_VARS_assigns_normal : Valid
+[wp] Proved goals:   28 / 28
+  Qed:            16 
+  Alt-Ergo:       12
+------------------------------------------------------------
+ Functions                 WP     Alt-Ergo  Total   Success
+  NO_UNFOLD_OK_1            2        -        2       100%
+  NO_UNFOLD_OK_2            2        -        2       100%
+  NO_UNFOLD_OK_3            2        -        2       100%
+  NO_UNFOLD_KO              2        -        2       100%
+  USE_ASSIGN_UNFOLD_OK      2        1        3       100%
+  USE_ASSIGN_UNFOLD_KO      2        1        3       100%
+  ASSIGN_NO_UNFOLD_OK       1        -        1       100%
+  ASSIGN_NO_UNFOLD_KO       1        -        1       100%
+  PARTIAL_ASSIGNS_STATIC    -        2        2       100%
+  PARTIAL_ASSIGNS_VARS      -        2        2       100%
+  NESTED_ARRAY_STATIC       2        -        2       100%
+  NESTED_ARRAY_VARS         -        2        2       100%
+  RANGE_NESTED_ARRAY_STATIC   -      2        2       100%
+  RANGE_NESTED_ARRAY_VARS   -        2        2       100%
+------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/unfold_assigns.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/unfold_assigns.1.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..124ab3bba6dc0b56ff61fea2cbdc4d9f9ef52a76
--- /dev/null
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/unfold_assigns.1.res.oracle
@@ -0,0 +1,53 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_plugin/unfold_assigns.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+[wp] 28 goals scheduled
+[wp] [Qed] Goal typed_NO_UNFOLD_OK_1_assigns_exit : Valid
+[wp] [Qed] Goal typed_NO_UNFOLD_OK_1_assigns_normal : Valid
+[wp] [Qed] Goal typed_NO_UNFOLD_OK_2_assigns_exit : Valid
+[wp] [Qed] Goal typed_NO_UNFOLD_OK_2_assigns_normal : Valid
+[wp] [Qed] Goal typed_NO_UNFOLD_OK_3_assigns_exit : Valid
+[wp] [Qed] Goal typed_NO_UNFOLD_OK_3_assigns_normal : Valid
+[wp] [Qed] Goal typed_NO_UNFOLD_KO_assigns_exit : Valid
+[wp] [Qed] Goal typed_NO_UNFOLD_KO_assigns_normal : Valid
+[wp] [Alt-Ergo] Goal typed_USE_ASSIGN_UNFOLD_OK_ensures : Valid
+[wp] [Qed] Goal typed_USE_ASSIGN_UNFOLD_OK_assigns_exit : Valid
+[wp] [Qed] Goal typed_USE_ASSIGN_UNFOLD_OK_assigns_normal : Valid
+[wp] [Alt-Ergo] Goal typed_USE_ASSIGN_UNFOLD_KO_ensures : Valid
+[wp] [Qed] Goal typed_USE_ASSIGN_UNFOLD_KO_assigns_exit : Valid
+[wp] [Qed] Goal typed_USE_ASSIGN_UNFOLD_KO_assigns_normal : Valid
+[wp] [Qed] Goal typed_ASSIGN_NO_UNFOLD_OK_assigns : Valid
+[wp] [Qed] Goal typed_ASSIGN_NO_UNFOLD_KO_assigns : Valid
+[wp] [Alt-Ergo] Goal typed_PARTIAL_ASSIGNS_STATIC_assigns_exit : Valid
+[wp] [Alt-Ergo] Goal typed_PARTIAL_ASSIGNS_STATIC_assigns_normal : Valid
+[wp] [Alt-Ergo] Goal typed_PARTIAL_ASSIGNS_VARS_assigns_exit : Valid
+[wp] [Alt-Ergo] Goal typed_PARTIAL_ASSIGNS_VARS_assigns_normal : Valid
+[wp] [Qed] Goal typed_NESTED_ARRAY_STATIC_assigns_exit : Valid
+[wp] [Qed] Goal typed_NESTED_ARRAY_STATIC_assigns_normal : Valid
+[wp] [Alt-Ergo] Goal typed_NESTED_ARRAY_VARS_assigns_exit : Valid
+[wp] [Alt-Ergo] Goal typed_NESTED_ARRAY_VARS_assigns_normal : Valid
+[wp] [Alt-Ergo] Goal typed_RANGE_NESTED_ARRAY_STATIC_assigns_exit : Unsuccess
+[wp] [Alt-Ergo] Goal typed_RANGE_NESTED_ARRAY_STATIC_assigns_normal : Unsuccess
+[wp] [Alt-Ergo] Goal typed_RANGE_NESTED_ARRAY_VARS_assigns_exit : Unsuccess
+[wp] [Alt-Ergo] Goal typed_RANGE_NESTED_ARRAY_VARS_assigns_normal : Unsuccess
+[wp] Proved goals:   24 / 28
+  Qed:            16 
+  Alt-Ergo:        8  (unsuccess: 4)
+------------------------------------------------------------
+ Functions                 WP     Alt-Ergo  Total   Success
+  NO_UNFOLD_OK_1            2        -        2       100%
+  NO_UNFOLD_OK_2            2        -        2       100%
+  NO_UNFOLD_OK_3            2        -        2       100%
+  NO_UNFOLD_KO              2        -        2       100%
+  USE_ASSIGN_UNFOLD_OK      2        1        3       100%
+  USE_ASSIGN_UNFOLD_KO      2        1        3       100%
+  ASSIGN_NO_UNFOLD_OK       1        -        1       100%
+  ASSIGN_NO_UNFOLD_KO       1        -        1       100%
+  PARTIAL_ASSIGNS_STATIC    -        2        2       100%
+  PARTIAL_ASSIGNS_VARS      -        2        2       100%
+  NESTED_ARRAY_STATIC       2        -        2       100%
+  NESTED_ARRAY_VARS         -        2        2       100%
+  RANGE_NESTED_ARRAY_STATIC   -      -        2       0.0%
+  RANGE_NESTED_ARRAY_VARS   -        -        2       0.0%
+------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/unfold_assigns.2.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/unfold_assigns.2.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..a31c87f8d8dfa5dca2163c934886b178a4299730
--- /dev/null
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/unfold_assigns.2.res.oracle
@@ -0,0 +1,53 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_plugin/unfold_assigns.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+[wp] 28 goals scheduled
+[wp] [Qed] Goal typed_NO_UNFOLD_OK_1_assigns_exit : Valid
+[wp] [Qed] Goal typed_NO_UNFOLD_OK_1_assigns_normal : Valid
+[wp] [Qed] Goal typed_NO_UNFOLD_OK_2_assigns_exit : Valid
+[wp] [Qed] Goal typed_NO_UNFOLD_OK_2_assigns_normal : Valid
+[wp] [Qed] Goal typed_NO_UNFOLD_OK_3_assigns_exit : Valid
+[wp] [Qed] Goal typed_NO_UNFOLD_OK_3_assigns_normal : Valid
+[wp] [Qed] Goal typed_NO_UNFOLD_KO_assigns_exit : Valid
+[wp] [Qed] Goal typed_NO_UNFOLD_KO_assigns_normal : Valid
+[wp] [Alt-Ergo] Goal typed_USE_ASSIGN_UNFOLD_OK_ensures : Valid
+[wp] [Qed] Goal typed_USE_ASSIGN_UNFOLD_OK_assigns_exit : Valid
+[wp] [Qed] Goal typed_USE_ASSIGN_UNFOLD_OK_assigns_normal : Valid
+[wp] [Alt-Ergo] Goal typed_USE_ASSIGN_UNFOLD_KO_ensures : Valid
+[wp] [Qed] Goal typed_USE_ASSIGN_UNFOLD_KO_assigns_exit : Valid
+[wp] [Qed] Goal typed_USE_ASSIGN_UNFOLD_KO_assigns_normal : Valid
+[wp] [Qed] Goal typed_ASSIGN_NO_UNFOLD_OK_assigns : Valid
+[wp] [Qed] Goal typed_ASSIGN_NO_UNFOLD_KO_assigns : Valid
+[wp] [Alt-Ergo] Goal typed_PARTIAL_ASSIGNS_STATIC_assigns_exit : Valid
+[wp] [Alt-Ergo] Goal typed_PARTIAL_ASSIGNS_STATIC_assigns_normal : Valid
+[wp] [Alt-Ergo] Goal typed_PARTIAL_ASSIGNS_VARS_assigns_exit : Valid
+[wp] [Alt-Ergo] Goal typed_PARTIAL_ASSIGNS_VARS_assigns_normal : Valid
+[wp] [Alt-Ergo] Goal typed_NESTED_ARRAY_STATIC_assigns_exit : Unsuccess
+[wp] [Alt-Ergo] Goal typed_NESTED_ARRAY_STATIC_assigns_normal : Unsuccess
+[wp] [Alt-Ergo] Goal typed_NESTED_ARRAY_VARS_assigns_exit : Unsuccess
+[wp] [Alt-Ergo] Goal typed_NESTED_ARRAY_VARS_assigns_normal : Unsuccess
+[wp] [Alt-Ergo] Goal typed_RANGE_NESTED_ARRAY_STATIC_assigns_exit : Unsuccess
+[wp] [Alt-Ergo] Goal typed_RANGE_NESTED_ARRAY_STATIC_assigns_normal : Unsuccess
+[wp] [Alt-Ergo] Goal typed_RANGE_NESTED_ARRAY_VARS_assigns_exit : Unsuccess
+[wp] [Alt-Ergo] Goal typed_RANGE_NESTED_ARRAY_VARS_assigns_normal : Unsuccess
+[wp] Proved goals:   20 / 28
+  Qed:            14 
+  Alt-Ergo:        6  (unsuccess: 8)
+------------------------------------------------------------
+ Functions                 WP     Alt-Ergo  Total   Success
+  NO_UNFOLD_OK_1            2        -        2       100%
+  NO_UNFOLD_OK_2            2        -        2       100%
+  NO_UNFOLD_OK_3            2        -        2       100%
+  NO_UNFOLD_KO              2        -        2       100%
+  USE_ASSIGN_UNFOLD_OK      2        1        3       100%
+  USE_ASSIGN_UNFOLD_KO      2        1        3       100%
+  ASSIGN_NO_UNFOLD_OK       1        -        1       100%
+  ASSIGN_NO_UNFOLD_KO       1        -        1       100%
+  PARTIAL_ASSIGNS_STATIC    -        2        2       100%
+  PARTIAL_ASSIGNS_VARS      -        2        2       100%
+  NESTED_ARRAY_STATIC       -        -        2       0.0%
+  NESTED_ARRAY_VARS         -        -        2       0.0%
+  RANGE_NESTED_ARRAY_STATIC   -      -        2       0.0%
+  RANGE_NESTED_ARRAY_VARS   -        -        2       0.0%
+------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_plugin/oracle_qualif/unfold_assigns.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle_qualif/unfold_assigns.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..32f7db5c4ff69fdade8bc819347b2c04b06f58a0
--- /dev/null
+++ b/src/plugins/wp/tests/wp_plugin/oracle_qualif/unfold_assigns.res.oracle
@@ -0,0 +1,53 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_plugin/unfold_assigns.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+[wp] 28 goals scheduled
+[wp] [Qed] Goal typed_NO_UNFOLD_OK_1_assigns_exit : Valid
+[wp] [Qed] Goal typed_NO_UNFOLD_OK_1_assigns_normal : Valid
+[wp] [Qed] Goal typed_NO_UNFOLD_OK_2_assigns_exit : Valid
+[wp] [Qed] Goal typed_NO_UNFOLD_OK_2_assigns_normal : Valid
+[wp] [Qed] Goal typed_NO_UNFOLD_OK_3_assigns_exit : Valid
+[wp] [Qed] Goal typed_NO_UNFOLD_OK_3_assigns_normal : Valid
+[wp] [Qed] Goal typed_NO_UNFOLD_KO_assigns_exit : Valid
+[wp] [Qed] Goal typed_NO_UNFOLD_KO_assigns_normal : Valid
+[wp] [Alt-Ergo] Goal typed_USE_ASSIGN_UNFOLD_OK_ensures : Valid
+[wp] [Qed] Goal typed_USE_ASSIGN_UNFOLD_OK_assigns_exit : Valid
+[wp] [Qed] Goal typed_USE_ASSIGN_UNFOLD_OK_assigns_normal : Valid
+[wp] [Alt-Ergo] Goal typed_USE_ASSIGN_UNFOLD_KO_ensures : Valid
+[wp] [Qed] Goal typed_USE_ASSIGN_UNFOLD_KO_assigns_exit : Valid
+[wp] [Qed] Goal typed_USE_ASSIGN_UNFOLD_KO_assigns_normal : Valid
+[wp] [Qed] Goal typed_ASSIGN_NO_UNFOLD_OK_assigns : Valid
+[wp] [Qed] Goal typed_ASSIGN_NO_UNFOLD_KO_assigns : Valid
+[wp] [Alt-Ergo] Goal typed_PARTIAL_ASSIGNS_STATIC_assigns_exit : Valid
+[wp] [Alt-Ergo] Goal typed_PARTIAL_ASSIGNS_STATIC_assigns_normal : Valid
+[wp] [Alt-Ergo] Goal typed_PARTIAL_ASSIGNS_VARS_assigns_exit : Valid
+[wp] [Alt-Ergo] Goal typed_PARTIAL_ASSIGNS_VARS_assigns_normal : Valid
+[wp] [Qed] Goal typed_NESTED_ARRAY_STATIC_assigns_exit : Valid
+[wp] [Qed] Goal typed_NESTED_ARRAY_STATIC_assigns_normal : Valid
+[wp] [Alt-Ergo] Goal typed_NESTED_ARRAY_VARS_assigns_exit : Valid
+[wp] [Alt-Ergo] Goal typed_NESTED_ARRAY_VARS_assigns_normal : Valid
+[wp] [Alt-Ergo] Goal typed_RANGE_NESTED_ARRAY_STATIC_assigns_exit : Valid
+[wp] [Alt-Ergo] Goal typed_RANGE_NESTED_ARRAY_STATIC_assigns_normal : Valid
+[wp] [Alt-Ergo] Goal typed_RANGE_NESTED_ARRAY_VARS_assigns_exit : Valid
+[wp] [Alt-Ergo] Goal typed_RANGE_NESTED_ARRAY_VARS_assigns_normal : Valid
+[wp] Proved goals:   28 / 28
+  Qed:            16 
+  Alt-Ergo:       12
+------------------------------------------------------------
+ Functions                 WP     Alt-Ergo  Total   Success
+  NO_UNFOLD_OK_1            2        -        2       100%
+  NO_UNFOLD_OK_2            2        -        2       100%
+  NO_UNFOLD_OK_3            2        -        2       100%
+  NO_UNFOLD_KO              2        -        2       100%
+  USE_ASSIGN_UNFOLD_OK      2        1        3       100%
+  USE_ASSIGN_UNFOLD_KO      2        1        3       100%
+  ASSIGN_NO_UNFOLD_OK       1        -        1       100%
+  ASSIGN_NO_UNFOLD_KO       1        -        1       100%
+  PARTIAL_ASSIGNS_STATIC    -        2        2       100%
+  PARTIAL_ASSIGNS_VARS      -        2        2       100%
+  NESTED_ARRAY_STATIC       2        -        2       100%
+  NESTED_ARRAY_VARS         -        2        2       100%
+  RANGE_NESTED_ARRAY_STATIC   -      2        2       100%
+  RANGE_NESTED_ARRAY_VARS   -        2        2       100%
+------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_plugin/overflow2.c b/src/plugins/wp/tests/wp_plugin/overflow2.c
new file mode 100644
index 0000000000000000000000000000000000000000..da847d4d3562491444bacd4a818ff35c4312eb34
--- /dev/null
+++ b/src/plugins/wp/tests/wp_plugin/overflow2.c
@@ -0,0 +1,51 @@
+/* run.config
+   OPT: -machdep x86_32
+*/
+/* run.config_qualif
+   OPT: -machdep x86_32
+*/
+
+/* run with: frama-c-gui -wp -wp-rte strange_work_again.c */
+// uproven: a04, a05, a09, a10
+// note that when the type of distance is ushort, all is proven
+
+typedef unsigned char uchar;
+typedef unsigned short ushort;
+typedef unsigned int uint;
+typedef unsigned long ulong;
+
+uint p1_off, p2_off;
+
+/*@
+  requires p1_off <= 10;
+  assigns p2_off;
+  ensures post: p2_off == p1_off + (ushort)distance; 	 
+*/
+void pointers_and_companions(short distance)
+{
+  p2_off = p1_off + (ushort)distance;	
+  //@ assert a01: p2_off == (uint)(p1_off + (ushort)distance);
+  //@ assert a02: (ushort)distance <= 65535;
+  //@ assert a03: p1_off <= 10;
+  //@ assert a04: p1_off + (ushort)distance <= 10 + 65535;
+  //@ assert a05: p1_off + (ushort)distance == (uint)(p1_off + (ushort)distance);
+}
+
+// the same behavior for ulong
+
+ulong p1_off_alt, p2_off_alt;
+
+/*@
+  requires p1_off_alt <= 10;
+  assigns p2_off_alt;
+  ensures postul: p2_off_alt == p1_off_alt + (ushort)distance; 	 
+*/
+void pointers_and_companions_ulong(short distance)
+{
+  p2_off_alt = p1_off_alt + (ushort)distance;
+  //@ assert a06: p2_off_alt == (uint)(p1_off_alt + (ushort)distance);
+  //@ assert a07: (ushort)distance <= 65535;
+  //@ assert a08: p1_off_alt <= 10;
+  //@ assert a09: p1_off_alt + (ushort)distance <= 10 + 65535;
+  //@ assert a10: ((ulong)(p1_off_alt + (ushort)distance)) == (p1_off_alt + (ushort)distance);
+}
diff --git a/src/plugins/wp/tests/wp_plugin/rte.i b/src/plugins/wp/tests/wp_plugin/rte.i
index b9befd3922c6f1e04b0dc913c51ad2a7fd31eb61..94d284cf296c649949ec346126be76bed3856bb6 100644
--- a/src/plugins/wp/tests/wp_plugin/rte.i
+++ b/src/plugins/wp/tests/wp_plugin/rte.i
@@ -1,5 +1,11 @@
 /* run.config
+<<<<<<< HEAD
    CMD: @frama-c@ -wp -wp-prover none -wp-msg-key shell -wp-msg-key rte @OPTIONS@ -wp-warn-key "pedantic-assigns=inactive"
+||||||| ac7807782d
+   CMD: @frama-c@ -wp -wp-prover none -wp-share ./share -wp-msg-key shell -wp-msg-key rte
+=======
+   CMD: @frama-c@ -wp -wp-prover none -wp-share ./share -wp-msg-key shell,rte -wp-warn-key "pedantic-assigns=inactive"
+>>>>>>> origin/master
    OPT: -wp-rte -no-warn-invalid-bool -then -print -no-unicode
    OPT: -wp-rte -no-warn-signed-overflow -then -print -no-unicode
    OPT: -wp-rte -warn-unsigned-overflow -then -print -no-unicode
diff --git a/src/plugins/wp/tests/wp_plugin/stmt.c b/src/plugins/wp/tests/wp_plugin/stmt.c
index b777a13d56ac4df22421b2e74d615e542435fade..228b0039058846ec8ac67a9de350643d25fd7d01 100644
--- a/src/plugins/wp/tests/wp_plugin/stmt.c
+++ b/src/plugins/wp/tests/wp_plugin/stmt.c
@@ -3,9 +3,17 @@
    OPT: -then -report
 */
 /* run.config_qualif
+<<<<<<< HEAD
    PLUGIN: @PLUGIN@ report
    OPT: -then -report
    EXECNOW: LOG stmt.log LOG f.dot LOG f_default_for_stmt_2.dot LOG g.dot LOG g_default_for_stmt_11.dot @frama-c@ -wp-precond-weakening -wp -wp-warn-key pedantic-assigns=inactive -wp-model Dump -wp-out . -wp-msg-key shell 1> stmt.log
+||||||| ac7807782d
+   OPT: -load-module report -then -report
+   EXECNOW: LOG stmt.log LOG f.dot LOG f_default_for_stmt_2.dot LOG g.dot LOG g_default_for_stmt_11.dot @frama-c@ -no-autoload-plugins -load-module wp -wp-precond-weakening -wp -wp-model Dump -wp-out tests/wp_plugin/result_qualif -wp-msg-key shell @PTEST_FILE@ 1> tests/wp_plugin/result_qualif/stmt.log
+=======
+   OPT: -load-module report -then -report
+   EXECNOW: LOG stmt.log LOG f.dot LOG f_default_for_stmt_2.dot LOG g.dot LOG g_default_for_stmt_11.dot @frama-c@ -no-autoload-plugins -load-module wp -wp-precond-weakening -wp -wp-warn-key pedantic-assigns=inactive -wp-model Dump -wp-out tests/wp_plugin/result_qualif -wp-msg-key shell @PTEST_FILE@ 1> tests/wp_plugin/result_qualif/stmt.log
+>>>>>>> origin/master
 */
 /*@ ensures a > 0 ==> \result == a + b;
   @ ensures a <= 0 ==> \result == -1;
diff --git a/src/plugins/wp/tests/wp_plugin/unfold_assigns.i b/src/plugins/wp/tests/wp_plugin/unfold_assigns.i
index 54ba848675c17ebfc2d7605e528b461568515c34..6da04abc8c6ea02b4cfa2ae5ab69a2f8067e17ec 100644
--- a/src/plugins/wp/tests/wp_plugin/unfold_assigns.i
+++ b/src/plugins/wp/tests/wp_plugin/unfold_assigns.i
@@ -1,10 +1,14 @@
 /* run.config
    OPT:
-   OPT: -wp-unfold-assigns
+   OPT: -wp-unfold-assigns -1
+   OPT: -wp-unfold-assigns 2
+   OPT: -wp-unfold-assigns 1
  */
 
 /* run.config_qualif
-   DONTRUN:
+   OPT: -wp-unfold-assigns -1
+   OPT: -wp-unfold-assigns 2
+   OPT: -wp-unfold-assigns 1
  */
 
 struct S { int a,b; };
@@ -64,3 +68,60 @@ void ASSIGN_NO_UNFOLD_KO(struct S *s) {
   struct S p = { 0,1 };
   *s = p ;
 }
+
+/*@ assigns *(p+(0..n)); */
+void f_assigns_range(int *p, unsigned n);
+
+/*@ assigns *(p+0), *(p+(1..3)), *(p+4); */
+void PARTIAL_ASSIGNS_STATIC(int *p) {
+  f_assigns_range(p, 4);
+}
+
+/*@ requires n > 4 ;
+    assigns *(p+0), *(p+(1..n-1)), *(p+n); */
+void PARTIAL_ASSIGNS_VARS(int *p, unsigned n) {
+  f_assigns_range(p, n);
+}
+
+struct With_array {
+  int x ;
+  int t [3] ;
+};
+
+//@ assigns *s ;
+void f_assigns_with_array(struct With_array* s);
+
+// FAILS AT UNFOLD LEVEL 1
+//@ assigns s->x, s->t[0], s->t[1..2] ;
+void NESTED_ARRAY_STATIC(struct With_array *s){
+  f_assigns_with_array(s);
+}
+
+// FAILS AT UNFOLD LEVEL 1
+/*@ requires n > 2 ;
+    assigns s->x, s->t[0], s->t[1..n] ; */
+void NESTED_ARRAY_VARS(struct With_array *s, unsigned n){
+  f_assigns_with_array(s);
+}
+
+//@ assigns *(s+(0..n)) ;
+void f_assigns_range_with_array(struct With_array* s, unsigned n);
+
+// FAILS AT UNFOLD LEVEL 2
+/*@ assigns s[0].x, s[0].t[0], s[0].t[1..2],
+            s[1].x, s[1].t[0..2],
+            s[2];
+*/
+void RANGE_NESTED_ARRAY_STATIC(struct With_array* s){
+  f_assigns_range_with_array(s, 2);
+}
+
+// FAILS AT UNFOLD LEVEL 2
+/*@ requires n > 2 && m > 3 ;
+    assigns s[0].x, s[0].t[0], s[0].t[1..m],
+            s[1].x, s[1].t[0..m],
+            s[2 .. n];
+*/
+void RANGE_NESTED_ARRAY_VARS(struct With_array* s, unsigned n, unsigned m){
+  f_assigns_range_with_array(s, n);
+}
diff --git a/src/plugins/wp/tests/wp_region/oracle/fb_ADD/region/job.dot b/src/plugins/wp/tests/wp_region/oracle/fb_ADD/region/job.dot
index eb1fa949b61292f0492473059be5e7da8c88292c..c6648e78e8fafdbed4725292d27a9c09e54893e1 100644
--- a/src/plugins/wp/tests/wp_region/oracle/fb_ADD/region/job.dot
+++ b/src/plugins/wp/tests/wp_region/oracle/fb_ADD/region/job.dot
@@ -15,12 +15,12 @@ digraph "job" {
   _003 [ label="roots:&fb", style="filled", color="lightblue", shape="box" ];
   { rank=same; A001; _003; }
   _003 -> A001 [ arrowhead="tee" ];
-  _004 [ shape="record", label="<_p1> 128..159: D32|<_p2> 160..191: D32" ];
+  _004 [ shape="record", label="<_p1> 256..319: D64|<_p2> 320..383: D64" ];
   _004:_p2 -> A003 [ style="dotted" ];
   _004:_p1 -> A002 [ style="dotted" ];
   A001 -> _004:w [ arrowhead="tee" ];
   A002 [ label="D", shape="oval" ];
-  _005 [ label="roots:&fb+128", style="filled", color="lightblue",
+  _005 [ label="roots:&fb+256", style="filled", color="lightblue",
     shape="box"
   ];
   { rank=same; A002; _005; }
@@ -29,7 +29,7 @@ digraph "job" {
   _006:_p1 -> A004:w [ taillabel="*", labelangle="+30", color="red" ];
   A002 -> _006:w [ arrowhead="tee" ];
   A003 [ label="D", shape="oval" ];
-  _007 [ label="roots:&fb+160", style="filled", color="lightblue",
+  _007 [ label="roots:&fb+320", style="filled", color="lightblue",
     shape="box"
   ];
   { rank=same; A003; _007; }
@@ -38,7 +38,7 @@ digraph "job" {
   _008:_p1 -> A005:w [ taillabel="*", labelangle="+30", color="red" ];
   A003 -> _008:w [ arrowhead="tee" ];
   A004 [ label="", shape="oval" ];
-  _009 [ label="roots:&fb+128", style="filled", color="lightblue",
+  _009 [ label="roots:&fb+256", style="filled", color="lightblue",
     shape="box"
   ];
   { rank=same; A004; _009; }
@@ -48,7 +48,7 @@ digraph "job" {
   _010:_p1 -> A006 [ style="dotted" ];
   A004 -> _010:w [ arrowhead="tee" ];
   A005 [ label="", shape="oval" ];
-  _011 [ label="roots:&fb+160", style="filled", color="lightblue",
+  _011 [ label="roots:&fb+320", style="filled", color="lightblue",
     shape="box"
   ];
   { rank=same; A005; _011; }
@@ -58,7 +58,7 @@ digraph "job" {
   _012:_p1 -> A008 [ style="dotted" ];
   A005 -> _012:w [ arrowhead="tee" ];
   A006 [ label="RW", shape="oval", fillcolor="green", style="filled" ];
-  _013 [ label="roots:&fb+128", style="filled", color="lightblue",
+  _013 [ label="roots:&fb+256", style="filled", color="lightblue",
     shape="box"
   ];
   { rank=same; A006; _013; }
@@ -66,7 +66,7 @@ digraph "job" {
   _014 [ shape="record", label="Var float64" ];
   A006 -> _014:w [ arrowhead="tee" ];
   A007 [ label="RW", shape="oval", fillcolor="green", style="filled" ];
-  _015 [ label="roots:&fb+192", style="filled", color="lightblue",
+  _015 [ label="roots:&fb+320", style="filled", color="lightblue",
     shape="box"
   ];
   { rank=same; A007; _015; }
@@ -74,7 +74,7 @@ digraph "job" {
   _016 [ shape="record", label="Var sint32" ];
   A007 -> _016:w [ arrowhead="tee" ];
   A008 [ label="R", shape="oval", fillcolor="green", style="filled" ];
-  _017 [ label="roots:&fb+160", style="filled", color="lightblue",
+  _017 [ label="roots:&fb+320", style="filled", color="lightblue",
     shape="box"
   ];
   { rank=same; A008; _017; }
@@ -82,7 +82,7 @@ digraph "job" {
   _018 [ shape="record", label="Var float64" ];
   A008 -> _018:w [ arrowhead="tee" ];
   A009 [ label="R", shape="oval", fillcolor="green", style="filled" ];
-  _019 [ label="roots:&fb+224", style="filled", color="lightblue",
+  _019 [ label="roots:&fb+384", style="filled", color="lightblue",
     shape="box"
   ];
   { rank=same; A009; _019; }
diff --git a/src/plugins/wp/tests/wp_region/oracle/fb_SORT/region/job.dot b/src/plugins/wp/tests/wp_region/oracle/fb_SORT/region/job.dot
index 4cbd5b27d23593f242fbdb78151766885a29f883..c278bffd20975f825e0e81a8884920114b062563 100644
--- a/src/plugins/wp/tests/wp_region/oracle/fb_SORT/region/job.dot
+++ b/src/plugins/wp/tests/wp_region/oracle/fb_SORT/region/job.dot
@@ -45,7 +45,7 @@ digraph "job" {
   { rank=same; A005; _011; }
   _011 -> A005 [ arrowhead="tee" ];
   _012 [ shape="record",
-    label="<_p1> 0..31: D32|<_p2> 32..127: D32[3]|<_p3> 128..223: D32[3]|<_p4> 224..319: D32[3]|<_p5> 320..351: D32"
+    label="<_p1> 0..63: D64|<_p2> 64..255: D64[3]|<_p3> 256..447: D64[3]|<_p4> 448..639: D64[3]|<_p5> 640..703: D64"
   ];
   _012:_p5 -> A010 [ style="dotted" ];
   _012:_p4 -> A008 [ style="dotted" ];
@@ -82,7 +82,7 @@ digraph "job" {
   _020:_p1 -> A014:w [ taillabel="*", labelangle="+30", color="red" ];
   A009 -> _020:w [ arrowhead="tee" ];
   A010 [ label="D", shape="oval" ];
-  _021 [ label="roots:&fb+320", style="filled", color="lightblue",
+  _021 [ label="roots:&fb+640", style="filled", color="lightblue",
     shape="box"
   ];
   { rank=same; A010; _021; }
@@ -122,7 +122,7 @@ digraph "job" {
   _030:_p1 -> A022 [ style="dotted" ];
   A014 -> _030:w [ arrowhead="tee" ];
   A015 [ label="", shape="oval" ];
-  _031 [ label="roots:&fb+320", style="filled", color="lightblue",
+  _031 [ label="roots:&fb+640", style="filled", color="lightblue",
     shape="box"
   ];
   { rank=same; A015; _031; }
@@ -174,7 +174,7 @@ digraph "job" {
   _046 [ shape="record", label="Var float64" ];
   A022 -> _046:w [ arrowhead="tee" ];
   A023 [ label="W", shape="oval", fillcolor="green", style="filled" ];
-  _047 [ label="roots:&fb+320", style="filled", color="lightblue",
+  _047 [ label="roots:&fb+640", style="filled", color="lightblue",
     shape="box"
   ];
   { rank=same; A023; _047; }
@@ -182,7 +182,7 @@ digraph "job" {
   _048 [ shape="record", label="Var float64" ];
   A023 -> _048:w [ arrowhead="tee" ];
   A024 [ label="W", shape="oval", fillcolor="green", style="filled" ];
-  _049 [ label="roots:&fb+384", style="filled", color="lightblue",
+  _049 [ label="roots:&fb+704", style="filled", color="lightblue",
     shape="box"
   ];
   { rank=same; A024; _049; }
diff --git a/src/plugins/wp/tests/wp_region/test_config b/src/plugins/wp/tests/wp_region/test_config
index cc353c1a3769ff673c1dad9a0e92ad473d5e41b5..d2802e471188bf3bc9465d31d93e170cba8a687b 100644
--- a/src/plugins/wp/tests/wp_region/test_config
+++ b/src/plugins/wp/tests/wp_region/test_config
@@ -1,3 +1,13 @@
+<<<<<<< HEAD
 CMD: @frama-c@ @OPTIONS@
 #LOG: @PTEST_NAME@/region/job.dot
 OPT: -wp-prover none -wp-region -wp-msg-key dot,chunk,roots,garbled -wp-warn-key pedantic-assigns=inactive -wp-out @PTEST_NAME@ -wp-fct job
+||||||| ac7807782d
+CMD: @frama-c@ -no-autoload-plugins -load-module wp
+LOG: @PTEST_NAME@/region/job.dot
+OPT: -wp-prover none -wp-region -wp-msg-key dot,chunk,roots,garbled -wp-out @PTEST_DIR@/result/@PTEST_NAME@ -wp-fct job
+=======
+CMD: @frama-c@ -no-autoload-plugins -load-module wp
+LOG: @PTEST_NAME@/region/job.dot
+OPT: -wp-prover none -wp-region -wp-msg-key dot,chunk,roots,garbled -wp-warn-key pedantic-assigns=inactive -wp-out @PTEST_DIR@/result/@PTEST_NAME@ -wp-fct job
+>>>>>>> origin/master
diff --git a/src/plugins/wp/tests/wp_tip/induction.i b/src/plugins/wp/tests/wp_tip/induction.i
new file mode 100644
index 0000000000000000000000000000000000000000..5ff948c0f86fd357cbf3cc3393e3a402887f08dd
--- /dev/null
+++ b/src/plugins/wp/tests/wp_tip/induction.i
@@ -0,0 +1,28 @@
+/* run.config
+   DONTRUN:
+*/
+
+/* run.config_qualif
+   OPT: -wp-prover script,alt-ergo -wp-timeout 1
+   OPT: -wp-prover script,alt-ergo -wp-timeout 1
+   OPT: -wp-prover script,alt-ergo -wp-timeout 1
+*/
+
+// Script 0: induction on f(x) => success
+// Script 1: induction on x => unsuccess
+// Script 2: induction on y => unsuccess
+
+/*@
+  axiomatic Inductive {
+
+  logic integer f(integer x);
+  predicate P(integer x, integer y);
+
+  axiom Hbse: \forall integer y; P(0,y);
+  axiom Hsup: \forall integer i,y; 0 <= i ==> P(i,y) ==> P(i+1,y);
+  axiom Hinf: \forall integer i,y; i <= 0 ==> P(i,y) ==> P(i-1,y);
+
+  lemma ByInd: \forall integer x,y; P(f(x),y);
+
+  }
+*/
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 4bacdb868395eb6a858b78b85f516e9b52f0b7c6..2ab8aa326ddaff2f381b05b243d494ed2eea1968 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
@@ -25,3 +25,19 @@ Assume {
 Prove: `x_2 = `x_1.
 
 ------------------------------------------------------------
+[wp] tests/wp_tip/chunk_printing.i:19: Warning: 
+  Memory model hypotheses for function 'get_int':
+  /*@
+     behavior wp_typed:
+       requires \separated(v, &y);
+       ensures \separated(\result, &y);
+     */
+  int *get_int(struct V *v);
+[wp] tests/wp_tip/chunk_printing.i:25: Warning: 
+  Memory model hypotheses for function 'get_uint':
+  /*@
+     behavior wp_typed:
+       requires \separated(v, &y);
+       ensures \separated(\result, &y);
+     */
+  unsigned int *get_uint(struct V *v);
diff --git a/src/plugins/wp/tests/wp_tip/oracle_qualif/induction.0.res.oracle b/src/plugins/wp/tests/wp_tip/oracle_qualif/induction.0.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..6a84303d1b466fcdff16540ca4971992efa2684d
--- /dev/null
+++ b/src/plugins/wp/tests/wp_tip/oracle_qualif/induction.0.res.oracle
@@ -0,0 +1,12 @@
+# frama-c -wp -wp-timeout 1 [...]
+[kernel] Parsing tests/wp_tip/induction.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] 1 goal scheduled
+[wp] [Script] Goal typed_lemma_ByInd : Valid
+[wp] Proved goals:    1 / 1
+  Qed:             0 
+  Script:          1
+------------------------------------------------------------
+ Axiomatics                WP     Alt-Ergo  Total   Success
+  Axiomatic Inductive       -        -        1       100%
+------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_tip/oracle_qualif/induction.0.session/script/lemma_ByInd.json b/src/plugins/wp/tests/wp_tip/oracle_qualif/induction.0.session/script/lemma_ByInd.json
new file mode 100644
index 0000000000000000000000000000000000000000..2a359dbab3ad22d87d88d11534edd84db6f4497e
--- /dev/null
+++ b/src/plugins/wp/tests/wp_tip/oracle_qualif/induction.0.session/script/lemma_ByInd.json
@@ -0,0 +1,12 @@
+[ { "header": "Induction", "tactic": "Wp.induction",
+    "params": { "base": { "select": "kint", "val": "0" } },
+    "select": { "select": "inside-goal", "occur": 0, "target": "(L_f x_0)",
+                "pattern": "L_f$x" },
+    "children": { "Base": [ { "prover": "Alt-Ergo:2.2.0", "verdict": "valid",
+                              "time": 0.0047, "steps": 6 } ],
+                  "Induction (sup)": [ { "prover": "Alt-Ergo:2.2.0",
+                                         "verdict": "valid", "time": 0.0041,
+                                         "steps": 21 } ],
+                  "Induction (inf)": [ { "prover": "Alt-Ergo:2.2.0",
+                                         "verdict": "valid", "time": 0.0054,
+                                         "steps": 20 } ] } } ]
diff --git a/src/plugins/wp/tests/wp_tip/oracle_qualif/induction.1.res.oracle b/src/plugins/wp/tests/wp_tip/oracle_qualif/induction.1.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..68fc7293ba5097e47a387ee3483e9d2496a1d0fb
--- /dev/null
+++ b/src/plugins/wp/tests/wp_tip/oracle_qualif/induction.1.res.oracle
@@ -0,0 +1,10 @@
+# frama-c -wp -wp-timeout 1 [...]
+[kernel] Parsing tests/wp_tip/induction.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] 1 goal scheduled
+[wp] [Script] Goal typed_lemma_ByInd : Unsuccess
+[wp] Proved goals:    0 / 1
+------------------------------------------------------------
+ Axiomatics                WP     Alt-Ergo  Total   Success
+  Axiomatic Inductive       -        -        1       0.0%
+------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_tip/oracle_qualif/induction.1.session/script/lemma_ByInd.json b/src/plugins/wp/tests/wp_tip/oracle_qualif/induction.1.session/script/lemma_ByInd.json
new file mode 100644
index 0000000000000000000000000000000000000000..d5763f40f15dd0fb0e845177f6d42085f36486ca
--- /dev/null
+++ b/src/plugins/wp/tests/wp_tip/oracle_qualif/induction.1.session/script/lemma_ByInd.json
@@ -0,0 +1,12 @@
+[ { "prover": "Alt-Ergo:2.2.0", "verdict": "unknown" },
+  { "prover": "script", "verdict": "unknown" },
+  { "header": "Induction", "tactic": "Wp.induction",
+    "params": { "base": { "select": "kint", "val": "0" } },
+    "select": { "select": "inside-goal", "occur": 0, "target": "x_0",
+                "pattern": "$x" },
+    "children": { "Base": [ { "prover": "Alt-Ergo:2.2.0",
+                              "verdict": "unknown" } ],
+                  "Induction (sup)": [ { "prover": "Alt-Ergo:2.2.0",
+                                         "verdict": "unknown" } ],
+                  "Induction (inf)": [ { "prover": "Alt-Ergo:2.2.0",
+                                         "verdict": "timeout", "time": 1. } ] } } ]
diff --git a/src/plugins/wp/tests/wp_tip/oracle_qualif/induction.2.res.oracle b/src/plugins/wp/tests/wp_tip/oracle_qualif/induction.2.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..68fc7293ba5097e47a387ee3483e9d2496a1d0fb
--- /dev/null
+++ b/src/plugins/wp/tests/wp_tip/oracle_qualif/induction.2.res.oracle
@@ -0,0 +1,10 @@
+# frama-c -wp -wp-timeout 1 [...]
+[kernel] Parsing tests/wp_tip/induction.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] 1 goal scheduled
+[wp] [Script] Goal typed_lemma_ByInd : Unsuccess
+[wp] Proved goals:    0 / 1
+------------------------------------------------------------
+ Axiomatics                WP     Alt-Ergo  Total   Success
+  Axiomatic Inductive       -        -        1       0.0%
+------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_tip/oracle_qualif/induction.2.session/script/lemma_ByInd.json b/src/plugins/wp/tests/wp_tip/oracle_qualif/induction.2.session/script/lemma_ByInd.json
new file mode 100644
index 0000000000000000000000000000000000000000..5e068a85c7f8f2ef58ef88d2b0b651607423e155
--- /dev/null
+++ b/src/plugins/wp/tests/wp_tip/oracle_qualif/induction.2.session/script/lemma_ByInd.json
@@ -0,0 +1,12 @@
+[ { "prover": "Alt-Ergo:2.2.0", "verdict": "unknown" },
+  { "prover": "script", "verdict": "unknown" },
+  { "header": "Induction", "tactic": "Wp.induction",
+    "params": { "base": { "select": "kint", "val": "0" } },
+    "select": { "select": "inside-goal", "occur": 0, "target": "y_0",
+                "pattern": "$y" },
+    "children": { "Base": [ { "prover": "Alt-Ergo:2.2.0",
+                              "verdict": "unknown" } ],
+                  "Induction (sup)": [ { "prover": "Alt-Ergo:2.2.0",
+                                         "verdict": "unknown" } ],
+                  "Induction (inf)": [ { "prover": "Alt-Ergo:2.2.0",
+                                         "verdict": "timeout", "time": 1. } ] } } ]
diff --git a/src/plugins/wp/tests/wp_tip/oracle_qualif/induction_prove.0.session/script/lemma_ByInd.json b/src/plugins/wp/tests/wp_tip/oracle_qualif/induction_prove.0.session/script/lemma_ByInd.json
new file mode 100644
index 0000000000000000000000000000000000000000..5a4345732238664a27f4c2cf710df871d69c5f6d
--- /dev/null
+++ b/src/plugins/wp/tests/wp_tip/oracle_qualif/induction_prove.0.session/script/lemma_ByInd.json
@@ -0,0 +1,13 @@
+[ { "prover": "script", "verdict": "valid", "time": 0.0549, "steps": 117 },
+  { "header": "Induction", "tactic": "Wp.induction",
+    "params": { "base": 0, "hsup": true, "hinf": true },
+    "select": { "select": "inside-goal", "occur": 0, "target": "(L_f x_0)",
+                "pattern": "L_f$x" },
+    "children": { "Base": [ { "prover": "Alt-Ergo:2.2.0", "verdict": "valid",
+                              "time": 0.0083, "steps": 6 } ],
+                  "Induction (sup)": [ { "prover": "Alt-Ergo:2.2.0",
+                                         "verdict": "valid", "time": 0.0549,
+                                         "steps": 117 } ],
+                  "Induction (inf)": [ { "prover": "Alt-Ergo:2.2.0",
+                                         "verdict": "valid", "time": 0.0274,
+                                         "steps": 86 } ] } } ]
diff --git a/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Goal_Exist_And.json b/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Goal_Exist_And.json
index 7e4bcea281b188bdcd20a782ff6423032d5941ec..260f73c47cb6ee354cdba05c71dfc9460a83c76a 100644
--- a/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Goal_Exist_And.json
+++ b/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Goal_Exist_And.json
@@ -1,24 +1,6 @@
-[ { "header": "Split", "tactic": "Wp.split", "params": {},
+[ { "prover": "script", "verdict": "unknown" },
+  { "header": "Split", "tactic": "Wp.split", "params": {},
     "select": { "select": "clause-goal",
                 "target": "exists i_0,i_1,i_2:int.\n(P_P1 i_0) /\\ (P_Q1 i_2) /\\ (P_P2 i_1 i_2)\n/\\ (exists i_3:int.\n    (P_Q2 i_0 i_3))",
-                "pattern": "\\E\\E\\E&P_P1P_Q1P_P2\\E#3#1#2#1P_Q2" },
-    "children": { "Goal 1/2": [ { "prover": "alt-ergo", "verdict": "unknown",
-                                  "time": 0.0511159896851 },
-                                { "header": "NOP", "tactic": "Wp.Test.NOP",
-                                  "params": {},
-                                  "select": { "select": "clause-goal",
-                                              "target": "exists i_0,i_1:int. (P_Q1 i_0) /\\ (P_P2 i_1 i_0)",
-                                              "pattern": "\\E\\E&P_Q1P_P2#1#0#1" },
-                                  "children": { "Nop": [ { "prover": "alt-ergo",
-                                                           "verdict": "unknown",
-                                                           "time": 0.0514709949493 } ] } } ],
-                  "Goal 2/2": [ { "prover": "alt-ergo", "verdict": "unknown",
-                                  "time": 0.0521941184998 },
-                                { "header": "NOP", "tactic": "Wp.Test.NOP",
-                                  "params": {},
-                                  "select": { "select": "clause-goal",
-                                              "target": "exists i_0:int. (P_P1 i_0) /\\ (exists i_1:int.\n                               (P_Q2 i_0 i_1))",
-                                              "pattern": "\\E&P_P1\\E#1P_Q2#1#0" },
-                                  "children": { "Nop": [ { "prover": "alt-ergo",
-                                                           "verdict": "unknown",
-                                                           "time": 0.0515058040619 } ] } } ] } } ]
+                "pattern": "\\E" },
+    "children": { "Goal 1/2": [], "Goal 2/2": [] } } ]
diff --git a/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Goal_Exist_And_bis.json b/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Goal_Exist_And_bis.json
index a908ac4adb3e577d040a3f24b4c6f0f06f56c053..212235b3fe925038ba1a99ed6b4ec08e7d3a6951 100644
--- a/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Goal_Exist_And_bis.json
+++ b/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Goal_Exist_And_bis.json
@@ -1,34 +1,6 @@
-[ { "header": "Split", "tactic": "Wp.split", "params": {},
+[ { "prover": "script", "verdict": "unknown" },
+  { "header": "Split", "tactic": "Wp.split", "params": {},
     "select": { "select": "clause-goal",
                 "target": "exists i_0,i_1,i_2,i_3:int.\n(P_Q1 1) /\\ (P_P2 i_0 i_1) /\\ (P_R2 i_1 i_2)\n/\\ (exists i_4:int.\n    (P_Q2 i_3 i_4))",
-                "pattern": "\\E\\E\\E\\E&P_Q1P_P2P_R2\\E1#4#3#3#2" },
-    "children": { "Goal 1/3": [ { "prover": "alt-ergo", "verdict": "unknown",
-                                  "time": 0.0512578487396 },
-                                { "header": "NOP", "tactic": "Wp.Test.NOP",
-                                  "params": {},
-                                  "select": { "select": "clause-goal",
-                                              "target": "exists i_0,i_1:int. (P_Q2 i_0 i_1)",
-                                              "pattern": "\\E\\EP_Q2#1#0" },
-                                  "children": { "Nop": [ { "prover": "alt-ergo",
-                                                           "verdict": "unknown",
-                                                           "time": 0.0515179634094 } ] } } ],
-                  "Goal 2/3": [ { "prover": "alt-ergo", "verdict": "unknown",
-                                  "time": 0.0517938137054 },
-                                { "header": "NOP", "tactic": "Wp.Test.NOP",
-                                  "params": {},
-                                  "select": { "select": "clause-goal",
-                                              "target": "exists i_0,i_1,i_2:int. (P_P2 i_2 i_1) /\\ (P_R2 i_1 i_0)",
-                                              "pattern": "\\E\\E\\E&P_P2P_R2#0#1#1#2" },
-                                  "children": { "Nop": [ { "prover": "alt-ergo",
-                                                           "verdict": "unknown",
-                                                           "time": 0.0515098571777 } ] } } ],
-                  "Goal 3/3": [ { "prover": "alt-ergo", "verdict": "unknown",
-                                  "time": 0.0528788566589 },
-                                { "header": "NOP", "tactic": "Wp.Test.NOP",
-                                  "params": {},
-                                  "select": { "select": "clause-goal",
-                                              "target": "(P_Q1 1)",
-                                              "pattern": "P_Q11" },
-                                  "children": { "Nop": [ { "prover": "alt-ergo",
-                                                           "verdict": "unknown",
-                                                           "time": 0.0515050888062 } ] } } ] } } ]
+                "pattern": "\\EP_Q11" },
+    "children": { "Goal 1/3": [], "Goal 2/3": [], "Goal 3/3": [] } } ]
diff --git a/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Goal_Exist_Or.json b/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Goal_Exist_Or.json
index db3e60070bdd86a16f0ee3e96303a5cbe6c4c2d6..c70dddec42c798d67d2e64caedcd77123e5f7e9c 100644
--- a/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Goal_Exist_Or.json
+++ b/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Goal_Exist_Or.json
@@ -1,16 +1,6 @@
 [ { "header": "Split", "tactic": "Wp.split", "params": {},
     "select": { "select": "clause-goal",
                 "target": "exists i_0,i_1,i_2:int.\n(P_Q1 1) \\/ (P_P1 i_0) \\/ (P_P2 i_1 i_2) \\/ (exists i_3:int.\n                                             (P_Q2 i_0 i_3))",
-                "pattern": "\\E\\E\\E|P_Q1P_P1P_P2\\E1#3#2#1P_Q2" },
-    "children": { "Distrib (exists or)": [ { "prover": "alt-ergo",
-                                             "verdict": "unknown",
-                                             "time": 0.0515348911285 },
-                                           { "header": "NOP",
-                                             "tactic": "Wp.Test.NOP",
-                                             "params": {},
-                                             "select": { "select": "clause-goal",
-                                                         "target": "(P_Q1 1) \\/ (exists i_0:int.\n             (P_P1 i_0)) \\/ (exists i_0,i_1:int.\n                             (P_P2 i_1 i_0))\n\\/ (exists i_0,i_1:int.\n    (P_Q2 i_0 i_1))",
-                                                         "pattern": "|P_Q1\\E\\E\\E1P_P1\\E\\E#0P_P2P_Q2#0" },
-                                             "children": { "Nop": [ { "prover": "alt-ergo",
-                                                                    "verdict": "unknown",
-                                                                    "time": 0.0513439178467 } ] } } ] } } ]
+                "pattern": "\\EP_Q11" },
+    "children": { "Split": [ { "prover": "Alt-Ergo:2.2.0",
+                               "verdict": "unknown" } ] } } ]
diff --git a/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Hyp_Forall_And.json b/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Hyp_Forall_And.json
index bb1f7b0cb5bf7ff1d2360fa531444508b977cf6d..5a6e83f45232bf50cfe1b17f56085bb45f633852 100644
--- a/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Hyp_Forall_And.json
+++ b/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Hyp_Forall_And.json
@@ -1,18 +1,6 @@
-[ { "header": "Split", "tactic": "Wp.split", "params": {},
+[ { "prover": "script", "verdict": "unknown" },
+  { "header": "Split", "tactic": "Wp.split", "params": {},
     "select": { "select": "clause-step", "at": 0, "kind": "have",
                 "target": "forall i_0,i_1,i_2:int.\n(P_Q1 1) /\\ (P_P1 i_0) /\\ (P_P2 i_1 i_2) /\\ (forall i_3:int.\n                                             (P_Q2 i_0 i_3))",
-                "pattern": "\\F\\F\\F&P_Q1P_P1P_P2\\F1#3#2#1P_Q2" },
-    "children": { "Distrib (forall and)": [ { "prover": "alt-ergo",
-                                              "verdict": "unknown",
-                                              "time": 0.051558971405 },
-                                            { "header": "NOP",
-                                              "tactic": "Wp.Test.NOP",
-                                              "params": {},
-                                              "select": { "select": "clause-step",
-                                                          "at": 0,
-                                                          "kind": "have",
-                                                          "target": "(P_Q1 1) /\\ (forall i_0:int.\n             (P_P1 i_0)) /\\ (forall i_0,i_1:int.\n                             (P_P2 i_1 i_0))\n/\\ (forall i_0,i_1:int.\n    (P_Q2 i_0 i_1))",
-                                                          "pattern": "&P_Q1\\F\\F\\F1P_P1\\F\\F#0P_P2P_Q2#0" },
-                                              "children": { "Nop": [ { "prover": "alt-ergo",
-                                                                    "verdict": "unknown",
-                                                                    "time": 0.0513830184937 } ] } } ] } } ]
+                "pattern": "\\FP_Q11" },
+    "children": { "Split (distrib forall and)": [] } } ]
diff --git a/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Hyp_Forall_Or_bis.json b/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Hyp_Forall_Or_bis.json
index 815a03e3dd65c3515a850fd69d37fe3eb51ae0cf..43bb875d32ba27e9ab410917a1c9789f632d467d 100644
--- a/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Hyp_Forall_Or_bis.json
+++ b/src/plugins/wp/tests/wp_tip/oracle_qualif/tac_split_quantifiers.0.session/script/split_ensures_Hyp_Forall_Or_bis.json
@@ -1,37 +1,6 @@
-[ { "header": "Split", "tactic": "Wp.split", "params": {},
+[ { "prover": "script", "verdict": "unknown" },
+  { "header": "Split", "tactic": "Wp.split", "params": {},
     "select": { "select": "clause-step", "at": 0, "kind": "have",
                 "target": "forall i_0,i_1,i_2,i_3:int.\n(P_Q1 1) \\/ (P_P2 i_0 i_1) \\/ (P_R2 i_1 i_2)\n\\/ (forall i_4:int.\n    (P_Q2 i_3 i_4))",
-                "pattern": "\\F\\F\\F\\F|P_Q1P_P2P_R2\\F1#4#3#3#2" },
-    "children": { "Goal 1/3": [ { "prover": "alt-ergo", "verdict": "unknown",
-                                  "time": 0.0511250495911 },
-                                { "header": "NOP", "tactic": "Wp.Test.NOP",
-                                  "params": {},
-                                  "select": { "select": "clause-step",
-                                              "at": 0, "kind": "have",
-                                              "target": "forall i_0,i_1:int. (P_Q2 i_0 i_1)",
-                                              "pattern": "\\F\\FP_Q2#1#0" },
-                                  "children": { "Nop": [ { "prover": "alt-ergo",
-                                                           "verdict": "unknown",
-                                                           "time": 0.0515208244324 } ] } } ],
-                  "Goal 2/3": [ { "prover": "alt-ergo", "verdict": "unknown",
-                                  "time": 0.0517539978027 },
-                                { "header": "NOP", "tactic": "Wp.Test.NOP",
-                                  "params": {},
-                                  "select": { "select": "clause-step",
-                                              "at": 0, "kind": "have",
-                                              "target": "forall i_0,i_1,i_2:int. (P_P2 i_2 i_1) \\/ (P_R2 i_1 i_0)",
-                                              "pattern": "\\F\\F\\F|P_P2P_R2#0#1#1#2" },
-                                  "children": { "Nop": [ { "prover": "alt-ergo",
-                                                           "verdict": "unknown",
-                                                           "time": 0.0515398979187 } ] } } ],
-                  "Goal 3/3": [ { "prover": "alt-ergo", "verdict": "unknown",
-                                  "time": 0.0528609752655 },
-                                { "header": "NOP", "tactic": "Wp.Test.NOP",
-                                  "params": {},
-                                  "select": { "select": "clause-step",
-                                              "at": 0, "kind": "have",
-                                              "target": "(P_Q1 1)",
-                                              "pattern": "P_Q11" },
-                                  "children": { "Nop": [ { "prover": "alt-ergo",
-                                                           "verdict": "unknown",
-                                                           "time": 0.051561832428 } ] } } ] } } ]
+                "pattern": "\\FP_Q11" },
+    "children": { "Goal 1/3": [], "Goal 2/3": [], "Goal 3/3": [] } } ]
diff --git a/src/plugins/wp/tests/wp_tip/oracle_qualif/unroll.0.session/script/lemma_LEFT.json b/src/plugins/wp/tests/wp_tip/oracle_qualif/unroll.0.session/script/lemma_LEFT.json
new file mode 100644
index 0000000000000000000000000000000000000000..885feb947bdb3b276a90fc8d54f807ae6dd76e79
--- /dev/null
+++ b/src/plugins/wp/tests/wp_tip/oracle_qualif/unroll.0.session/script/lemma_LEFT.json
@@ -0,0 +1,7 @@
+[ { "prover": "script", "verdict": "valid" },
+  { "header": "Sequence", "tactic": "Wp.sequence",
+    "params": { "seq.side": "left" },
+    "select": { "select": "inside-goal", "occur": 0,
+                "target": "(repeat a_0 n_0)", "pattern": "repeat$a$n" },
+    "children": { "Nil": [ { "prover": "qed", "verdict": "valid" } ],
+                  "Unroll": [ { "prover": "qed", "verdict": "valid" } ] } } ]
diff --git a/src/plugins/wp/tests/wp_tip/oracle_qualif/unroll.0.session/script/lemma_RIGHT.json b/src/plugins/wp/tests/wp_tip/oracle_qualif/unroll.0.session/script/lemma_RIGHT.json
new file mode 100644
index 0000000000000000000000000000000000000000..75e4064cdb6eb792772488a295e01855174a6132
--- /dev/null
+++ b/src/plugins/wp/tests/wp_tip/oracle_qualif/unroll.0.session/script/lemma_RIGHT.json
@@ -0,0 +1,7 @@
+[ { "prover": "script", "verdict": "valid" },
+  { "header": "Sequence", "tactic": "Wp.sequence",
+    "params": { "seq.side": "right" },
+    "select": { "select": "inside-goal", "occur": 0,
+                "target": "(repeat a_0 n_0)", "pattern": "repeat$a$n" },
+    "children": { "Nil": [ { "prover": "qed", "verdict": "valid" } ],
+                  "Unroll": [ { "prover": "qed", "verdict": "valid" } ] } } ]
diff --git a/src/plugins/wp/tests/wp_tip/oracle_qualif/unroll.0.session/script/lemma_SUM.json b/src/plugins/wp/tests/wp_tip/oracle_qualif/unroll.0.session/script/lemma_SUM.json
new file mode 100644
index 0000000000000000000000000000000000000000..65a87aa59ca69040135319b35d107a49d773886a
--- /dev/null
+++ b/src/plugins/wp/tests/wp_tip/oracle_qualif/unroll.0.session/script/lemma_SUM.json
@@ -0,0 +1,8 @@
+[ { "prover": "script", "verdict": "valid" },
+  { "header": "Sequence", "tactic": "Wp.sequence",
+    "params": { "seq.side": "sum" },
+    "select": { "select": "inside-goal", "occur": 0,
+                "target": "(repeat a_0 (p_0+q_0))",
+                "pattern": "repeat$a+$p$q" },
+    "children": { "Positive": [ { "prover": "qed", "verdict": "valid" } ],
+                  "Unroll": [ { "prover": "qed", "verdict": "valid" } ] } } ]
diff --git a/src/plugins/wp/tests/wp_tip/oracle_qualif/unroll.res.oracle b/src/plugins/wp/tests/wp_tip/oracle_qualif/unroll.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..d520e08daacf19a629295d7d3766e250e627005c
--- /dev/null
+++ b/src/plugins/wp/tests/wp_tip/oracle_qualif/unroll.res.oracle
@@ -0,0 +1,14 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_tip/unroll.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] 3 goals scheduled
+[wp] [Script] Goal typed_lemma_LEFT : Valid
+[wp] [Script] Goal typed_lemma_RIGHT : Valid
+[wp] [Script] Goal typed_lemma_SUM : Valid
+[wp] Proved goals:    3 / 3
+  Qed:             0 
+  Script:          3
+------------------------------------------------------------
+ Axiomatics                WP     Alt-Ergo  Total   Success
+  Lemma                     -        -        3       100%
+------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_tip/tac_split_quantifiers.i b/src/plugins/wp/tests/wp_tip/tac_split_quantifiers.i
index f0537b6bc027dd5756f3f0b3b2e58615497a6351..ad7169c9876a372729caa1fba1115badc6c41d5c 100644
--- a/src/plugins/wp/tests/wp_tip/tac_split_quantifiers.i
+++ b/src/plugins/wp/tests/wp_tip/tac_split_quantifiers.i
@@ -17,7 +17,7 @@
    predicate R2(integer a1, integer a2) reads \nothing ;
    } */
 
-/*@ ensures Goal_Exist_Or: 
+/*@ ensures Goal_Exist_Or:
        (\exists integer a, b, c ;
         P1(a) || P2(b, c) || Q1(1) || \exists integer d ; Q2(a,d)) ;
 
@@ -29,7 +29,7 @@
        (\exists integer a, b, c, d ;
         P2(a, b) && R2(b, c) && Q1(1) && \exists integer e ; Q2(d,e)) ;
 
-  @ ensures Hyp_Forall_And: 
+  @ ensures Hyp_Forall_And:
        (\forall integer a, b, c ;
         P1(a) && P2(b, c) && Q1(1) && \forall integer d ; Q2(a,d)
        ) ==>
diff --git a/src/plugins/wp/tests/wp_tip/unroll.i b/src/plugins/wp/tests/wp_tip/unroll.i
new file mode 100644
index 0000000000000000000000000000000000000000..c3392a979882d88ac32a403217b9a24fb4d55398
--- /dev/null
+++ b/src/plugins/wp/tests/wp_tip/unroll.i
@@ -0,0 +1,31 @@
+/* run.config
+   DONTRUN:
+*/
+
+/* run.config_qualif
+   OPT: -wp-prover script,none
+ */
+
+/*@
+  lemma SUM:
+    \forall \list<integer> a;
+    \forall integer p,q;
+    0 <= p ==> 0 <= q ==>
+    (a *^ (p+q)) == ((a *^ p) ^ (a *^ q)) ;
+*/
+
+/*@
+  lemma RIGHT:
+    \forall \list<integer> a;
+    \forall integer n;
+    0 < n ==>
+    (a *^ n) == ((a *^ (n-1)) ^ a) ;
+*/
+
+/*@
+  lemma LEFT:
+    \forall \list<integer> a;
+    \forall integer n;
+    0 < n ==>
+    (a *^ n) == (a ^ (a *^ (n-1))) ;
+*/
diff --git a/src/plugins/wp/tests/wp_typed/multi_matrix_types.i b/src/plugins/wp/tests/wp_typed/multi_matrix_types.i
new file mode 100644
index 0000000000000000000000000000000000000000..99d7ebf7f07638113b867be4033fabc3ae9e389d
--- /dev/null
+++ b/src/plugins/wp/tests/wp_typed/multi_matrix_types.i
@@ -0,0 +1,14 @@
+/* run.config
+   OPT:-wp-gen -wp-prover=why3 -wp-msg-key=print-generated
+*/
+/* run.config_qualif
+   DONTRUN:
+*/
+
+struct S { int f ; unsigned a[5] ; long b[5] ; };
+
+/*@ ensures *p == \old(*p) ; */
+void job(struct S *p, int v)
+{
+	p->f = v;
+}
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 fddef3a5c9cab9dd58403662be999f5b854a102b..d7fcc4902fc3ef85b6b5b673020c4bf48a391a5e 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
@@ -10,7 +10,7 @@
 Goal Assertion (file array_initialized.c, line 71):
 Assume {
   (* Heap *)
-  Type: IsArray1_sint32(g).
+  Type: IsArray_sint32(g).
   (* Goal *)
   When: (0 <= i) /\ (i <= 499).
   (* Initializer *)
@@ -26,7 +26,7 @@ Prove: g[i] = 0.
 Goal Assertion (file array_initialized.c, line 185):
 Assume {
   (* Heap *)
-  Type: IsArray1_sint32(h1_0) /\ IsArray1_sint32(h2_0).
+  Type: IsArray_sint32(h1_0) /\ IsArray_sint32(h2_0).
   (* Goal *)
   When: (0 <= i) /\ (i <= 499).
   (* Initializer *)
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 d253e6e9758ff8f66d0a608ba8d4d1dc2cd02b24..207e9befdb79fe21441383cf88a6bebadced293d 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
@@ -47,9 +47,7 @@ Prove: x_1 = x.
 
 Goal Post-condition (file cast_fits.i, line 27) in 'fits3':
 Let x = Mint_0[shiftfield_F2_i2(p)].
-Let x_1 = Mint_0
-            [shiftfield_F1_i1(shift___anonstruct_L1_1(shiftfield_F4_ic4(p),
-                                0))].
+Let x_1 = Mint_0[shiftfield_F1_i1(shift_S1(shiftfield_F4_ic4(p), 0))].
 Assume {
   Type: is_sint32(x) /\ is_sint32(x_1).
   (* Heap *)
@@ -64,9 +62,7 @@ Prove: x_1 = x.
 
 Goal Post-condition (file cast_fits.i, line 37) in 'fits4':
 Let x = Mchar_0[shiftfield_F6_c6(p)].
-Let x_1 = Mchar_0
-            [shiftfield_F3_c3(shift___anonstruct_L3_3(shiftfield_F5_ci5(p),
-                                1))].
+Let x_1 = Mchar_0[shiftfield_F3_c3(shift_S3(shiftfield_F5_ci5(p), 1))].
 Assume {
   Type: is_sint8(x) /\ is_sint32(x) /\ is_sint8(x_1).
   (* Heap *)
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 939b08f53249ea505bfcdeb4e2c6d55a3898ac51..f456415436e1c7639e50fead09a66a353db816f1 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
@@ -47,9 +47,7 @@ Prove: x_1 = x.
 
 Goal Post-condition (file cast_fits.i, line 27) in 'fits3':
 Let x = Mint_0[shiftfield_F2_i2(p)].
-Let x_1 = Mint_0
-            [shiftfield_F1_i1(shift___anonstruct_L1_1(shiftfield_F4_ic4(p),
-                                0))].
+Let x_1 = Mint_0[shiftfield_F1_i1(shift_S1(shiftfield_F4_ic4(p), 0))].
 Assume {
   Type: is_sint32(x) /\ is_sint32(x_1).
   (* Heap *)
@@ -64,9 +62,7 @@ Prove: x_1 = x.
 
 Goal Post-condition (file cast_fits.i, line 37) in 'fits4':
 Let x = Mchar_0[shiftfield_F6_c6(p)].
-Let x_1 = Mchar_0
-            [shiftfield_F3_c3(shift___anonstruct_L3_3(shiftfield_F5_ci5(p),
-                                1))].
+Let x_1 = Mchar_0[shiftfield_F3_c3(shift_S3(shiftfield_F5_ci5(p), 1))].
 Assume {
   Type: is_sint8(x) /\ is_sint32(x) /\ is_sint8(x_1).
   (* Heap *)
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 71c30b4c4b8bcb726174b6deca8fc6e4345af179..e15033feb1d7998645e2f35027ba24764ac3084e 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
@@ -10,7 +10,7 @@ Goal Assertion 'SEP' (file frame.i, line 10):
 Assume {
   Type: is_sint32(k).
   (* Heap *)
-  Type: IsArray1S1(comp_0) /\
+  Type: IsArray_S1(comp_0) /\
       (forall i : Z. region(comp_0[i].F1_ptr.base) <= 0).
   (* Pre-condition *)
   Have: (0 <= k) /\ (k <= 19).
@@ -26,7 +26,7 @@ Let x = Mint_0[a <- 4][a_1].
 Assume {
   Type: is_sint32(k) /\ is_sint32(x).
   (* Heap *)
-  Type: IsArray1S1(comp_0) /\
+  Type: IsArray_S1(comp_0) /\
       (forall i : Z. region(comp_0[i].F1_ptr.base) <= 0).
   (* Pre-condition *)
   Have: (0 <= k) /\ (k <= 19).
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 9d5d618d1103a3f81ec1363f57062e3208a26e9d..b32103a271895fc2b159d57ea545d25e6f16b875 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
@@ -10,7 +10,7 @@ Goal Assertion 'SEP' (file frame.i, line 10):
 Assume {
   Type: is_sint32(k).
   (* Heap *)
-  Type: IsArray1S1(comp_0) /\
+  Type: IsArray_S1(comp_0) /\
       (forall i : Z. region(comp_0[i].F1_ptr.base) <= 0).
   (* Pre-condition *)
   Have: (0 <= k) /\ (k <= 19).
@@ -26,7 +26,7 @@ Let x = Mint_0[a <- 4][a_1].
 Assume {
   Type: is_sint32(k) /\ is_sint32(x).
   (* Heap *)
-  Type: IsArray1S1(comp_0) /\
+  Type: IsArray_S1(comp_0) /\
       (forall i : Z. region(comp_0[i].F1_ptr.base) <= 0).
   (* Pre-condition *)
   Have: (0 <= k) /\ (k <= 19).
diff --git a/src/plugins/wp/tests/wp_typed/oracle/multi_matrix_types.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/multi_matrix_types.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..81c5c6cc27c89fb40c7d4fd8e0da2b62242ca279
--- /dev/null
+++ b/src/plugins/wp/tests/wp_typed/oracle/multi_matrix_types.res.oracle
@@ -0,0 +1,266 @@
+# frama-c -wp [...]
+[kernel] Parsing tests/wp_typed/multi_matrix_types.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Warning: Missing RTE guards
+[wp] 1 goal scheduled
+---------------------------------------------
+--- Context 'typed_job' Cluster 'Matrix' 
+---------------------------------------------
+theory Matrix
+  (* 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.cint.Cint *)
+  
+  predicate IsArray_uint32 (t:int -> int) = forall i:int. is_uint32 (get t i)
+  
+  predicate IsArray_sint64 (t:int -> int) = forall i:int. is_sint64 (get t i)
+  
+  predicate EqArray_int (n:int) (t:int -> int) (t1:int -> int) =
+    forall i:int. 0 <= i -> i < n -> get t1 i = get t i
+end
+---------------------------------------------
+--- Context 'typed_job' Cluster 'S1_S' 
+---------------------------------------------
+theory S1_S
+  (* 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 *)
+  
+  type S1_S =
+    | S1_S1 (F1_S_f:int) (F1_S_a:int -> int) (F1_S_b:int -> int)
+  
+  (* use Matrix *)
+  
+  predicate IsS1_S (s:S1_S) =
+    (IsArray_sint64 (F1_S_b s) /\ IsArray_uint32 (F1_S_a s)) /\
+    is_sint32 (F1_S_f s)
+  
+  predicate EqS1_S (s:S1_S) (s1:S1_S) =
+    (F1_S_f s1 = F1_S_f s /\ EqArray_int 5 (F1_S_a s) (F1_S_a s1)) /\
+    EqArray_int 5 (F1_S_b s) (F1_S_b s1)
+end
+---------------------------------------------
+--- Context 'typed_job' Cluster 'Compound' 
+---------------------------------------------
+theory Compound
+  (* 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 *)
+  
+  function shiftfield_F1_S_f (p:addr) : addr = shift p 0
+  
+  function shiftfield_F1_S_a (p:addr) : addr = shift p 1
+  
+  function shift_uint32 (p:addr) (k:int) : addr = shift p k
+  
+  function Array_uint32 addr int (addr -> int) : int -> int
+  
+  function shiftfield_F1_S_b (p:addr) : addr = shift p 6
+  
+  function shift_sint64 (p:addr) (k:int) : addr = shift p k
+  
+  function Array_sint64 addr int (addr -> int) : int -> int
+  
+  (* use S1_S *)
+  
+  function Load_S1_S (p:addr) (mint:addr -> int) (mint1:addr -> int) (mint2:
+    addr -> int) : S1_S =
+    S1_S1 (get mint1 (shiftfield_F1_S_f p))
+    (Array_uint32 (shiftfield_F1_S_a p) 5 mint)
+    (Array_sint64 (shiftfield_F1_S_b p) 5 mint2)
+  
+  Q_Array_uint32_access :
+    forall mint:addr -> int, i:int, n:int, p:addr
+     [get (Array_uint32 p n mint) i].
+     0 <= i ->
+     i < n -> get (Array_uint32 p n mint) i = get mint (shift_uint32 p i)
+  
+  Q_Array_uint32_update_Mint0 :
+    forall mint:addr -> int, n:int, p:addr, q:addr, v:int
+     [Array_uint32 p n (set mint q v)].
+     not q = p -> Array_uint32 p n (set mint q v) = Array_uint32 p n mint
+  
+  Q_Array_uint32_eqmem_Mint0 :
+    forall mint:addr -> int, mint1:addr -> int, n:int, n1:int, p:addr, q:addr
+     [Array_uint32 p n mint, eqmem mint mint1 q n1| Array_uint32 p n mint1,
+     eqmem mint mint1 q n1].
+     included p 1 q n1 ->
+     eqmem mint mint1 q n1 -> Array_uint32 p n mint1 = Array_uint32 p n mint
+  
+  Q_Array_uint32_havoc_Mint0 :
+    forall mint:addr -> int, mint1:addr -> int, n:int, n1:int, p:addr, q:addr
+     [Array_uint32 p n (havoc mint1 mint q n1)].
+     separated p 1 q n1 ->
+     Array_uint32 p n (havoc mint1 mint q n1) = Array_uint32 p n mint
+  
+  Q_Array_sint64_access :
+    forall mint:addr -> int, i:int, n:int, p:addr
+     [get (Array_sint64 p n mint) i].
+     0 <= i ->
+     i < n -> get (Array_sint64 p n mint) i = get mint (shift_sint64 p i)
+  
+  Q_Array_sint64_update_Mint0 :
+    forall mint:addr -> int, n:int, p:addr, q:addr, v:int
+     [Array_sint64 p n (set mint q v)].
+     not q = p -> Array_sint64 p n (set mint q v) = Array_sint64 p n mint
+  
+  Q_Array_sint64_eqmem_Mint0 :
+    forall mint:addr -> int, mint1:addr -> int, n:int, n1:int, p:addr, q:addr
+     [Array_sint64 p n mint, eqmem mint mint1 q n1| Array_sint64 p n mint1,
+     eqmem mint mint1 q n1].
+     included p 1 q n1 ->
+     eqmem mint mint1 q n1 -> Array_sint64 p n mint1 = Array_sint64 p n mint
+  
+  Q_Array_sint64_havoc_Mint0 :
+    forall mint:addr -> int, mint1:addr -> int, n:int, n1:int, p:addr, q:addr
+     [Array_sint64 p n (havoc mint1 mint q n1)].
+     separated p 1 q n1 ->
+     Array_sint64 p n (havoc mint1 mint q n1) = Array_sint64 p n mint
+  
+  Q_Load_S1_S_update_Mint0 :
+    forall mint:addr -> int, mint1:addr -> int, mint2:addr -> int, p:addr, q:
+     addr, v:int [Load_S1_S p (set mint q v) mint1 mint2].
+     separated p 11 q 1 ->
+     Load_S1_S p (set mint q v) mint1 mint2 = Load_S1_S p mint mint1 mint2
+  
+  Q_Load_S1_S_eqmem_Mint0 :
+    forall mint:addr -> int, mint1:addr -> int, mint2:addr -> int, mint3:addr
+     -> int, n:int, p:addr, q:addr [Load_S1_S p mint mint2 mint3,
+     eqmem mint mint1 q n| Load_S1_S p mint1 mint2 mint3,
+     eqmem mint mint1 q n].
+     included p 11 q n ->
+     eqmem mint mint1 q n ->
+     Load_S1_S p mint1 mint2 mint3 = Load_S1_S p mint mint2 mint3
+  
+  Q_Load_S1_S_havoc_Mint0 :
+    forall mint:addr -> int, mint1:addr -> int, mint2:addr -> int, mint3:addr
+     -> int, n:int, p:addr, q:addr
+     [Load_S1_S p (havoc mint1 mint q n) mint2 mint3].
+     separated p 11 q n ->
+     Load_S1_S p (havoc mint1 mint q n) mint2 mint3
+     = Load_S1_S p mint mint2 mint3
+  
+  Q_Load_S1_S_update_Mint1 :
+    forall mint:addr -> int, mint1:addr -> int, mint2:addr -> int, p:addr, q:
+     addr, v:int [Load_S1_S p mint2 (set mint1 q v) mint].
+     separated p 11 q 1 ->
+     Load_S1_S p mint2 (set mint1 q v) mint = Load_S1_S p mint2 mint1 mint
+  
+  Q_Load_S1_S_eqmem_Mint1 :
+    forall mint:addr -> int, mint1:addr -> int, mint2:addr -> int, mint3:addr
+     -> int, n:int, p:addr, q:addr [Load_S1_S p mint3 mint1 mint,
+     eqmem mint1 mint2 q n| Load_S1_S p mint3 mint2 mint,
+     eqmem mint1 mint2 q n].
+     included p 11 q n ->
+     eqmem mint1 mint2 q n ->
+     Load_S1_S p mint3 mint2 mint = Load_S1_S p mint3 mint1 mint
+  
+  Q_Load_S1_S_havoc_Mint1 :
+    forall mint:addr -> int, mint1:addr -> int, mint2:addr -> int, mint3:addr
+     -> int, n:int, p:addr, q:addr
+     [Load_S1_S p mint3 (havoc mint2 mint1 q n) mint].
+     separated p 11 q n ->
+     Load_S1_S p mint3 (havoc mint2 mint1 q n) mint
+     = Load_S1_S p mint3 mint1 mint
+  
+  Q_Load_S1_S_update_Mint2 :
+    forall mint:addr -> int, mint1:addr -> int, mint2:addr -> int, p:addr, q:
+     addr, v:int [Load_S1_S p mint1 mint (set mint2 q v)].
+     separated p 11 q 1 ->
+     Load_S1_S p mint1 mint (set mint2 q v) = Load_S1_S p mint1 mint mint2
+  
+  Q_Load_S1_S_eqmem_Mint2 :
+    forall mint:addr -> int, mint1:addr -> int, mint2:addr -> int, mint3:addr
+     -> int, n:int, p:addr, q:addr [Load_S1_S p mint1 mint mint2,
+     eqmem mint2 mint3 q n| Load_S1_S p mint1 mint mint3,
+     eqmem mint2 mint3 q n].
+     included p 11 q n ->
+     eqmem mint2 mint3 q n ->
+     Load_S1_S p mint1 mint mint3 = Load_S1_S p mint1 mint mint2
+  
+  Q_Load_S1_S_havoc_Mint2 :
+    forall mint:addr -> int, mint1:addr -> int, mint2:addr -> int, mint3:addr
+     -> int, n:int, p:addr, q:addr
+     [Load_S1_S p mint1 mint (havoc mint3 mint2 q n)].
+     separated p 11 q n ->
+     Load_S1_S p mint1 mint (havoc mint3 mint2 q n)
+     = Load_S1_S p mint1 mint mint2
+end
+[wp:print-generated] 
+  theory WP
+    (* 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 S1_S *)
+    
+    (* use Compound *)
+    
+    goal wp_goal :
+      forall t:addr -> int, t1:addr -> int, t2:addr -> int, a:addr, i:int.
+       let a1 = Load_S1_S a t t2 t1 in
+       let a2 = Load_S1_S a t (set t2 (shiftfield_F1_S_f a) i) t1 in
+       region (base a) <= 0 -> IsS1_S a1 -> IsS1_S a2 -> EqS1_S a2 a1
+  end
+[wp] 1 goal generated
+------------------------------------------------------------
+  Function job
+------------------------------------------------------------
+
+Goal Post-condition (file tests/wp_typed/multi_matrix_types.i, line 10) in 'job':
+Let a = Load_S1_S(p, Mint_0, Mint_1, Mint_2).
+Let a_1 = Load_S1_S(p, Mint_0, Mint_1[shiftfield_F1_S_f(p) <- v], Mint_2).
+Assume {
+  Type: IsS1_S(a) /\ IsS1_S(a_1).
+  (* Heap *)
+  Type: region(p.base) <= 0.
+}
+Prove: EqS1_S(a_1, a).
+
+------------------------------------------------------------
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 9329e0d434c5dbfb04fdfafb3d17c89687807415..9d6c18fab596f27861e65f216df4941ef78d6e20 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
@@ -11,10 +11,18 @@
 Goal Post-condition (file mvar.i, line 12) in 'Job':
 Assume {
   (* Heap *)
-  Type: IsArray1_sint8(A).
+  Type: IsArray_sint8(A).
   (* Call 'Write' *)
   Have: A[0] = 1.
 }
 Prove: P_equal(1, 1).
 
 ------------------------------------------------------------
+[wp] tests/wp_typed/mvar.i:8: Warning: 
+  Memory model hypotheses for function 'Write':
+  /*@
+     behavior wp_typed:
+       requires \separated(p + (..), (char *)A + (..));
+       requires \separated(p + (0 ..), (char *)A + (..));
+     */
+  extern void Write(char *p, int n);
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 f9d32dbb40e66f0761f13d1008f0f45420bc97a8..f2eaa006d64082b2de91aad1fbea1de69aa29fc4 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
@@ -11,10 +11,18 @@
 Goal Post-condition (file mvar.i, line 12) in 'Job':
 Assume {
   (* Heap *)
-  Type: IsArray1_sint8(A).
+  Type: IsArray_sint8(A).
   (* Call 'Write' *)
   Have: A[0] = 1.
 }
 Prove: P_equal(1, 1).
 
 ------------------------------------------------------------
+[wp] tests/wp_typed/mvar.i:8: Warning: 
+  Memory model hypotheses for function 'Write':
+  /*@
+     behavior wp_typed_ref:
+       requires \separated(p + (..), (char *)A + (..));
+       requires \separated(p + (0 ..), (char *)A + (..));
+     */
+  extern void Write(char *p, int n);
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 3832218916bc56f958f6e453f684d501a2d67860..3161feeff647794efb090e0c7c0f7395ff304a68 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
@@ -11,8 +11,8 @@ Let x = Mint_0[shiftfield_F2_s_d(p)].
 Let a = shiftfield_F2_s_u(p).
 Assume {
   Type: is_sint32(x) /\ is_sint32(Mint_0[shiftfield_F2_s_e(p)]) /\
-      is_sint32(Mint_0[shiftfield_F1_t_c(shift_t(a, 0))]) /\
-      is_sint32(Mint_0[shiftfield_F1_t_c(shift_t(a, 1))]).
+      is_sint32(Mint_0[shiftfield_F1_t_c(shift_S1_t(a, 0))]) /\
+      is_sint32(Mint_0[shiftfield_F1_t_c(shift_S1_t(a, 1))]).
   (* Heap *)
   Type: region(p.base) <= 0.
   (* Pre-condition *)
@@ -26,8 +26,8 @@ Goal Assertion (file shift_lemma.i, line 22):
 Let a = shiftfield_F2_s_u(p).
 Assume {
   Type: is_sint32(Mint_0[shiftfield_F2_s_e(p)]) /\
-      is_sint32(Mint_0[shiftfield_F1_t_c(shift_t(a, 0))]) /\
-      is_sint32(Mint_0[shiftfield_F1_t_c(shift_t(a, 1))]).
+      is_sint32(Mint_0[shiftfield_F1_t_c(shift_S1_t(a, 0))]) /\
+      is_sint32(Mint_0[shiftfield_F1_t_c(shift_S1_t(a, 1))]).
   (* Heap *)
   Type: region(p.base) <= 0.
   (* Goal *)
@@ -37,7 +37,7 @@ Assume {
   (* Assertion *)
   Have: Mint_0[shiftfield_F2_s_d(p)] = 0.
 }
-Prove: Mint_0[shiftfield_F1_t_c(shift_t(a, i))] = 0.
+Prove: Mint_0[shiftfield_F1_t_c(shift_S1_t(a, i))] = 0.
 
 ------------------------------------------------------------
 
@@ -63,7 +63,7 @@ Assume {
   Have: Mint_0[shiftfield_F2_s_d(p)] = 0.
   (* Assertion *)
   Have: forall i : Z. ((0 <= i) -> ((i <= 9) ->
-      (Mint_0[shiftfield_F1_t_c(shift_t(shiftfield_F2_s_u(p), i))] = 0))).
+      (Mint_0[shiftfield_F1_t_c(shift_S1_t(shiftfield_F2_s_u(p), i))] = 0))).
 }
 Prove: x = 0.
 
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 af825a10c5bb8ef4dfd72e659a652cb2dbd7e77d..67d2f08869b917c50e09654bbfbf7710c24b16eb 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
@@ -11,8 +11,8 @@ Let x = Mint_0[shiftfield_F2_s_d(p)].
 Let a = shiftfield_F2_s_u(p).
 Assume {
   Type: is_sint32(x) /\ is_sint32(Mint_0[shiftfield_F2_s_e(p)]) /\
-      is_sint32(Mint_0[shiftfield_F1_t_c(shift_t(a, 0))]) /\
-      is_sint32(Mint_0[shiftfield_F1_t_c(shift_t(a, 1))]).
+      is_sint32(Mint_0[shiftfield_F1_t_c(shift_S1_t(a, 0))]) /\
+      is_sint32(Mint_0[shiftfield_F1_t_c(shift_S1_t(a, 1))]).
   (* Heap *)
   Type: region(p.base) <= 0.
   (* Pre-condition *)
@@ -26,8 +26,8 @@ Goal Assertion (file shift_lemma.i, line 22):
 Let a = shiftfield_F2_s_u(p).
 Assume {
   Type: is_sint32(Mint_0[shiftfield_F2_s_e(p)]) /\
-      is_sint32(Mint_0[shiftfield_F1_t_c(shift_t(a, 0))]) /\
-      is_sint32(Mint_0[shiftfield_F1_t_c(shift_t(a, 1))]).
+      is_sint32(Mint_0[shiftfield_F1_t_c(shift_S1_t(a, 0))]) /\
+      is_sint32(Mint_0[shiftfield_F1_t_c(shift_S1_t(a, 1))]).
   (* Heap *)
   Type: region(p.base) <= 0.
   (* Goal *)
@@ -37,7 +37,7 @@ Assume {
   (* Assertion *)
   Have: Mint_0[shiftfield_F2_s_d(p)] = 0.
 }
-Prove: Mint_0[shiftfield_F1_t_c(shift_t(a, i))] = 0.
+Prove: Mint_0[shiftfield_F1_t_c(shift_S1_t(a, i))] = 0.
 
 ------------------------------------------------------------
 
@@ -63,7 +63,7 @@ Assume {
   Have: Mint_0[shiftfield_F2_s_d(p)] = 0.
   (* Assertion *)
   Have: forall i : Z. ((0 <= i) -> ((i <= 9) ->
-      (Mint_0[shiftfield_F1_t_c(shift_t(shiftfield_F2_s_u(p), i))] = 0))).
+      (Mint_0[shiftfield_F1_t_c(shift_S1_t(shiftfield_F2_s_u(p), i))] = 0))).
 }
 Prove: x = 0.
 
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 32e372b1fc5b9fa816fd153114efd0c27f7b17c0..fcad38e3bded9994b481dafa9245a4d90beed2c5 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
@@ -23,8 +23,7 @@ theory Matrix
   
   (* use frama_c_wp.cint.Cint *)
   
-  predicate IsArray1_sint32 (t:int -> int) =
-    forall i:int. is_sint32 (get t i)
+  predicate IsArray_sint32 (t:int -> int) = forall i:int. is_sint32 (get t i)
 end
 ---------------------------------------------
 --- Context 'typed_f' Cluster 'S1_s' 
@@ -50,9 +49,9 @@ theory S1_s
   (* use Matrix *)
   
   predicate IsS1_s (s:S1_s) =
-    IsArray1_sint32 (F1_s_a s) /\ IsArray1_sint32 (F1_s_b s)
+    IsArray_sint32 (F1_s_a s) /\ IsArray_sint32 (F1_s_b s)
   
-  predicate IsArray1S1_s (t:int -> S1_s) = forall i:int. IsS1_s (get t i)
+  predicate IsArray_S1_s (t:int -> S1_s) = forall i:int. IsS1_s (get t i)
 end
 [wp:print-generated] 
   theory WP
@@ -81,7 +80,7 @@ end
        0 <= i ->
        a1 < a2 ->
        i <= 9 ->
-       IsArray1S1_s t ->
+       IsArray_S1_s t ->
        is_uint32 i ->
        is_sint32 a2 ->
        is_sint32 a1 -> is_sint32 ((1 + ((- 1) * a1)) + a3) -> (2 * a1) <= a3
@@ -100,7 +99,7 @@ Assume {
   Type: is_uint32(SynchroId_0) /\ is_sint32(a_2) /\ is_sint32(a_1) /\
       is_sint32(1 + a_3 - a_1).
   (* Heap *)
-  Type: IsArray1S1_s(t).
+  Type: IsArray_S1_s(t).
   (* Residual *)
   When: a_1 < a_2.
   (* Pre-condition *)
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 438c113a8daac098d7f4cc01116a79694a0221fb..2d5d4a5af58d608d09647d8e09bdfcb2e490a328 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
@@ -59,3 +59,8 @@ Assume {
 Prove: !valid_rw(Malloc_0[L_y_25 <- 0], a, 1).
 
 ------------------------------------------------------------
+[wp] tests/wp_typed/unit_alloc.i:34: Warning: 
+  Memory model hypotheses for function 'h':
+  /*@ behavior wp_typed:
+        ensures \separated(\result, &x); */
+  int *h(int x);
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 c7ca5b835edc0d71505d8bfb6463af57182b6857..c11e66ea5d97dcf04869cb5c759f54c859054614 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
@@ -59,3 +59,8 @@ Assume {
 Prove: !valid_rw(Malloc_0[L_y_25 <- 0], a, 1).
 
 ------------------------------------------------------------
+[wp] tests/wp_typed/unit_alloc.i:34: Warning: 
+  Memory model hypotheses for function 'h':
+  /*@ behavior wp_typed_ref:
+        ensures \separated(\result, &x); */
+  int *h(int x);
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 8d65c6966da5d12f53d789715d58ea004de4cce3..7be4b7879ca6391b3f1881d1115e0374bc107aa8 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
@@ -174,8 +174,16 @@ Prove: true.
 
 ------------------------------------------------------------
 
+<<<<<<< HEAD
 Goal Assertion 'ok' (file unit_bitwise.c, line 170):
 Let x = land(1, a). Assume { Type: is_uint32(a) /\ is_uint32(x). }
+||||||| ac7807782d
+Goal Assertion 'ok' (file tests/wp_typed/unit_bitwise.c, line 170):
+Let x = land(1, a). Assume { Type: is_uint32(a) /\ is_uint32(x). }
+=======
+Goal Assertion 'ok' (file tests/wp_typed/unit_bitwise.c, line 170):
+Let x = land(1, a). Assume { Type: is_uint64(a) /\ is_uint64(x). }
+>>>>>>> origin/master
 Prove: 0 <= x.
 
 ------------------------------------------------------------
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 2f7aa71d3d33574b1569f125e4c54209d0abf2e8..dd93bdae2de8e96ce37d3cc46d120b84d114a7df 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
@@ -10,7 +10,8 @@ Goal Post-condition (file unit_ite.i, line 2) in 'check':
 Prove: true.
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'check':
-  /*@ behavior typed_ref:
+[wp] tests/wp_typed/unit_ite.i:3: Warning: 
+  Memory model hypotheses for function 'check':
+  /*@ behavior wp_typed_ref:
         requires \valid(p); */
   void check(int x, int *p);
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 ed5563bc4c51388d1b74ec6e040d7b46ea7fb135..724ace600b0d314e3ad4b26242e9ffe9e6e315c1 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
@@ -26,9 +26,10 @@ Goal Assertion 'PJ' (file unit_labels.i, line 10):
 Prove: true.
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'duplet':
+[wp] tests/wp_typed/unit_labels.i:7: Warning: 
+  Memory model hypotheses for function 'duplet':
   /*@
-     behavior typed_ref:
+     behavior wp_typed_ref:
        requires \separated(pi, pj, a + (..));
        requires \valid(pi);
        requires \valid(pj);
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 2082ace73480781792a239e0ec1f4ff264b80646..169991a0b304ede42e8559545d14b3de18a25e7b 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
@@ -17,7 +17,8 @@ Goal Establishment of Invariant (file unit_loopscope.i, line 13):
 Prove: false.
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'f':
-  /*@ behavior typed_ref:
+[wp] tests/wp_typed/unit_loopscope.i:9: Warning: 
+  Memory model hypotheses for function 'f':
+  /*@ behavior wp_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 078baf8538d6797c84503ac7ce013c24f1cc2e24..fa61d28b56e52ec05f148f6bd82563603935b0ab 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
@@ -13,7 +13,7 @@ Assume {
   Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(c) /\ is_sint32(d) /\
       is_sint32(x).
   (* Heap *)
-  Type: IsArray2_sint32(t).
+  Type: IsArray_d2_sint32(t).
   (* Goal *)
   When: c != a.
 }
@@ -33,7 +33,7 @@ Assume {
   Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(c) /\ is_sint32(d) /\
       is_sint32(x).
   (* Heap *)
-  Type: IsArray2_sint32(t).
+  Type: IsArray_d2_sint32(t).
 }
 Prove: x = 1.
 
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 cef2454bc57aad86d51082815bc6b42d2f565cc1..4d8ff2e76991621d6f6a408c22236cee5c4d6f34 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
@@ -13,7 +13,7 @@ Assume {
   Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(c) /\ is_sint32(d) /\
       is_sint32(x).
   (* Heap *)
-  Type: IsArray2_sint32(t).
+  Type: IsArray_d2_sint32(t).
   (* Goal *)
   When: c != a.
 }
@@ -33,7 +33,7 @@ Assume {
   Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(c) /\ is_sint32(d) /\
       is_sint32(x).
   (* Heap *)
-  Type: IsArray2_sint32(t).
+  Type: IsArray_d2_sint32(t).
 }
 Prove: x = 1.
 
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 e1e6368d2d764506d388a7674ae06a3229a2ddf4..4f262f161254f1b344217bfc2758b944c554031c 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
@@ -16,15 +16,15 @@ Let x = k - 1.
 Let m = p[x <- v].
 Let m_1 = m[k <- v_1].
 Assume {
-  Type: IsArray1_sint32(p) /\ is_sint32(k) /\ is_sint32(v_1) /\
+  Type: IsArray_sint32(p) /\ is_sint32(k) /\ is_sint32(v_1) /\
       is_sint32(v) /\ is_sint32(x1_0) /\ is_sint32(x2_0) /\ is_sint32(x) /\
-      is_sint32(1 + k) /\ IsArray1_sint32(m) /\ IsArray1_sint32(m_1).
+      is_sint32(1 + k) /\ IsArray_sint32(m) /\ IsArray_sint32(m_1).
   (* Pre-condition *)
   Have: (0 < k) /\ (k <= 9).
   (* Call 'job' *)
-  Have: (k <= 10) /\ EqArray1_int(10, m, p[x <- x1_0]).
+  Have: (k <= 10) /\ EqArray_int(10, m, p[x <- x1_0]).
   (* Call 'job' *)
-  Have: EqArray1_int(10, m_1, m[k <- x2_0]).
+  Have: EqArray_int(10, m_1, m[k <- x2_0]).
 }
 Prove: x1_0 = v.
 
@@ -35,15 +35,15 @@ Let x = k - 1.
 Let m = p[x <- v_1].
 Let m_1 = m[k <- v].
 Assume {
-  Type: IsArray1_sint32(p) /\ is_sint32(k) /\ is_sint32(v) /\
+  Type: IsArray_sint32(p) /\ is_sint32(k) /\ is_sint32(v) /\
       is_sint32(v_1) /\ is_sint32(x1_0) /\ is_sint32(x2_0) /\ is_sint32(x) /\
-      is_sint32(1 + k) /\ IsArray1_sint32(m) /\ IsArray1_sint32(m_1).
+      is_sint32(1 + k) /\ IsArray_sint32(m) /\ IsArray_sint32(m_1).
   (* Pre-condition *)
   Have: (0 < k) /\ (k <= 9).
   (* Call 'job' *)
-  Have: (k <= 10) /\ EqArray1_int(10, m, p[x <- x1_0]).
+  Have: (k <= 10) /\ EqArray_int(10, m, p[x <- x1_0]).
   (* Call 'job' *)
-  Have: EqArray1_int(10, m_1, m[k <- x2_0]).
+  Have: EqArray_int(10, m_1, m[k <- x2_0]).
 }
 Prove: x2_0 = v.
 
@@ -61,12 +61,12 @@ Goal Instance of 'Pre-condition (file user_collect.i, line 15) in 'job'' in 'cal
 :
 Let m = p[k <- v].
 Assume {
-  Type: IsArray1_sint32(p) /\ is_sint32(k) /\ is_sint32(x1_0) /\
-      IsArray1_sint32(m) /\ is_sint32(1 + k).
+  Type: IsArray_sint32(p) /\ is_sint32(k) /\ is_sint32(x1_0) /\
+      IsArray_sint32(m) /\ is_sint32(1 + k).
   (* Pre-condition *)
   Have: (0 <= k) /\ (k <= 8).
   (* Call 'job' *)
-  Have: (k <= 9) /\ EqArray1_int(10, m, p[k <- x1_0]).
+  Have: (k <= 9) /\ EqArray_int(10, m, p[k <- x1_0]).
 }
 Prove: (-1) <= k.
 
@@ -85,15 +85,15 @@ Let x = k - 1.
 Let m = q[x <- v].
 Let m_1 = m[k <- v_1].
 Assume {
-  Type: IsArray1S1_S(q) /\ IsS1_S(s1_0) /\ IsS1_S(s2_0) /\ IsS1_S(v_1) /\
+  Type: IsArray_S1_S(q) /\ IsS1_S(s1_0) /\ IsS1_S(s2_0) /\ IsS1_S(v_1) /\
       IsS1_S(v) /\ is_sint32(k) /\ is_sint32(x) /\ is_sint32(1 + k) /\
-      IsArray1S1_S(m) /\ IsArray1S1_S(m_1).
+      IsArray_S1_S(m) /\ IsArray_S1_S(m_1).
   (* Pre-condition *)
   Have: (0 < k) /\ (k <= 9).
   (* Call 'job2' *)
-  Have: (k <= 10) /\ EqArray1_S1_S(10, m, q[x <- s1_0]).
+  Have: (k <= 10) /\ EqArray_S1_S(10, m, q[x <- s1_0]).
   (* Call 'job2' *)
-  Have: EqArray1_S1_S(10, m_1, m[k <- s2_0]).
+  Have: EqArray_S1_S(10, m_1, m[k <- s2_0]).
 }
 Prove: EqS1_S(v, s1_0).
 
@@ -104,15 +104,15 @@ Let x = k - 1.
 Let m = q[x <- v_1].
 Let m_1 = m[k <- v].
 Assume {
-  Type: IsArray1S1_S(q) /\ IsS1_S(s1_0) /\ IsS1_S(s2_0) /\ IsS1_S(v) /\
+  Type: IsArray_S1_S(q) /\ IsS1_S(s1_0) /\ IsS1_S(s2_0) /\ IsS1_S(v) /\
       IsS1_S(v_1) /\ is_sint32(k) /\ is_sint32(x) /\ is_sint32(1 + k) /\
-      IsArray1S1_S(m) /\ IsArray1S1_S(m_1).
+      IsArray_S1_S(m) /\ IsArray_S1_S(m_1).
   (* Pre-condition *)
   Have: (0 < k) /\ (k <= 9).
   (* Call 'job2' *)
-  Have: (k <= 10) /\ EqArray1_S1_S(10, m, q[x <- s1_0]).
+  Have: (k <= 10) /\ EqArray_S1_S(10, m, q[x <- s1_0]).
   (* Call 'job2' *)
-  Have: EqArray1_S1_S(10, m_1, m[k <- s2_0]).
+  Have: EqArray_S1_S(10, m_1, m[k <- s2_0]).
 }
 Prove: EqS1_S(v, s2_0).
 
@@ -124,17 +124,17 @@ Let m = q[x <- v].
 Let m_1 = m[k <- v_1].
 Let m_2 = q[x <- s1_0].
 Assume {
-  Type: IsArray1S1_S(q) /\ IsS1_S(s1_0) /\ IsS1_S(s2_0) /\ IsS1_S(v_1) /\
+  Type: IsArray_S1_S(q) /\ IsS1_S(s1_0) /\ IsS1_S(s2_0) /\ IsS1_S(v_1) /\
       IsS1_S(v) /\ is_sint32(k) /\ is_sint32(x) /\ is_sint32(1 + k) /\
-      IsArray1S1_S(m) /\ IsArray1S1_S(m_1).
+      IsArray_S1_S(m) /\ IsArray_S1_S(m_1).
   (* Pre-condition *)
   Have: (0 < k) /\ (k <= 9).
   (* Call 'job2' *)
-  Have: (k <= 10) /\ EqArray1_S1_S(10, m, m_2).
+  Have: (k <= 10) /\ EqArray_S1_S(10, m, m_2).
   (* Call 'job2' *)
-  Have: EqArray1_S1_S(10, m_1, m[k <- s2_0]).
+  Have: EqArray_S1_S(10, m_1, m[k <- s2_0]).
 }
-Prove: EqArray1_S1_S(10, m_1, m_2[k <- s2_0]).
+Prove: EqArray_S1_S(10, m_1, m_2[k <- s2_0]).
 
 ------------------------------------------------------------
 
@@ -150,12 +150,12 @@ Goal Instance of 'Pre-condition (file user_collect.i, line 26) in 'job2'' in 'ca
 :
 Let m = q[k <- v].
 Assume {
-  Type: IsArray1S1_S(q) /\ IsS1_S(s1_0) /\ is_sint32(k) /\ IsArray1S1_S(m) /\
+  Type: IsArray_S1_S(q) /\ IsS1_S(s1_0) /\ is_sint32(k) /\ IsArray_S1_S(m) /\
       is_sint32(1 + k).
   (* Pre-condition *)
   Have: (0 <= k) /\ (k <= 8).
   (* Call 'job2' *)
-  Have: (k <= 9) /\ EqArray1_S1_S(10, m, q[k <- s1_0]).
+  Have: (k <= 9) /\ EqArray_S1_S(10, m, q[k <- s1_0]).
 }
 Prove: (-1) <= k.
 
@@ -174,15 +174,15 @@ Let x = k - 1.
 Let m = q[x <- v].
 Let m_1 = m[k <- v_1].
 Assume {
-  Type: IsArray1S1_S(q) /\ IsS1_S(s1_0) /\ IsS1_S(s2_0) /\ IsS1_S(v_1) /\
+  Type: IsArray_S1_S(q) /\ IsS1_S(s1_0) /\ IsS1_S(s2_0) /\ IsS1_S(v_1) /\
       IsS1_S(v) /\ is_sint32(k) /\ is_sint32(x) /\ is_sint32(1 + k) /\
-      IsArray1S1_S(m) /\ IsArray1S1_S(m_1).
+      IsArray_S1_S(m) /\ IsArray_S1_S(m_1).
   (* Pre-condition *)
   Have: (0 < k) /\ (k <= 9).
   (* Call 'job3' *)
-  Have: (k <= 10) /\ EqArray1_S1_S(10, m, q[x <- s1_0]).
+  Have: (k <= 10) /\ EqArray_S1_S(10, m, q[x <- s1_0]).
   (* Call 'job3' *)
-  Have: EqArray1_S1_S(10, m_1, m[k <- s2_0]).
+  Have: EqArray_S1_S(10, m_1, m[k <- s2_0]).
 }
 Prove: EqS1_S(v, s1_0).
 
@@ -193,15 +193,15 @@ Let x = k - 1.
 Let m = q[x <- v_1].
 Let m_1 = m[k <- v].
 Assume {
-  Type: IsArray1S1_S(q) /\ IsS1_S(s1_0) /\ IsS1_S(s2_0) /\ IsS1_S(v) /\
+  Type: IsArray_S1_S(q) /\ IsS1_S(s1_0) /\ IsS1_S(s2_0) /\ IsS1_S(v) /\
       IsS1_S(v_1) /\ is_sint32(k) /\ is_sint32(x) /\ is_sint32(1 + k) /\
-      IsArray1S1_S(m) /\ IsArray1S1_S(m_1).
+      IsArray_S1_S(m) /\ IsArray_S1_S(m_1).
   (* Pre-condition *)
   Have: (0 < k) /\ (k <= 9).
   (* Call 'job3' *)
-  Have: (k <= 10) /\ EqArray1_S1_S(10, m, q[x <- s1_0]).
+  Have: (k <= 10) /\ EqArray_S1_S(10, m, q[x <- s1_0]).
   (* Call 'job3' *)
-  Have: EqArray1_S1_S(10, m_1, m[k <- s2_0]).
+  Have: EqArray_S1_S(10, m_1, m[k <- s2_0]).
 }
 Prove: EqS1_S(v, s2_0).
 
@@ -213,17 +213,17 @@ Let m = q[x <- v].
 Let m_1 = m[k <- v_1].
 Let m_2 = q[x <- s1_0].
 Assume {
-  Type: IsArray1S1_S(q) /\ IsS1_S(s1_0) /\ IsS1_S(s2_0) /\ IsS1_S(v_1) /\
+  Type: IsArray_S1_S(q) /\ IsS1_S(s1_0) /\ IsS1_S(s2_0) /\ IsS1_S(v_1) /\
       IsS1_S(v) /\ is_sint32(k) /\ is_sint32(x) /\ is_sint32(1 + k) /\
-      IsArray1S1_S(m) /\ IsArray1S1_S(m_1).
+      IsArray_S1_S(m) /\ IsArray_S1_S(m_1).
   (* Pre-condition *)
   Have: (0 < k) /\ (k <= 9).
   (* Call 'job3' *)
-  Have: (k <= 10) /\ EqArray1_S1_S(10, m, m_2).
+  Have: (k <= 10) /\ EqArray_S1_S(10, m, m_2).
   (* Call 'job3' *)
-  Have: EqArray1_S1_S(10, m_1, m[k <- s2_0]).
+  Have: EqArray_S1_S(10, m_1, m[k <- s2_0]).
 }
-Prove: EqArray1_S1_S(10, m_1, m_2[k <- s2_0]).
+Prove: EqArray_S1_S(10, m_1, m_2[k <- s2_0]).
 
 ------------------------------------------------------------
 
@@ -239,12 +239,12 @@ Goal Instance of 'Pre-condition (file user_collect.i, line 37) in 'job3'' in 'ca
 :
 Let m = q[k <- v].
 Assume {
-  Type: IsArray1S1_S(q) /\ IsS1_S(s1_0) /\ is_sint32(k) /\ IsArray1S1_S(m) /\
+  Type: IsArray_S1_S(q) /\ IsS1_S(s1_0) /\ is_sint32(k) /\ IsArray_S1_S(m) /\
       is_sint32(1 + k).
   (* Pre-condition *)
   Have: (0 <= k) /\ (k <= 8).
   (* Call 'job3' *)
-  Have: (k <= 9) /\ EqArray1_S1_S(10, m, q[k <- s1_0]).
+  Have: (k <= 9) /\ EqArray_S1_S(10, m, q[k <- s1_0]).
 }
 Prove: (-1) <= k.
 
@@ -322,11 +322,11 @@ Goal Post-condition 'Q' in 'job3':
 Let a = s.F1_S_f.
 Let m = q[k <- { F1_S_f = (q[k].F1_S_f)[0 <- a[0]][1 <- a[1]] }].
 Assume {
-  Type: IsArray1S1_S(q) /\ IsS1_S(s) /\ is_sint32(k) /\ IsArray1S1_S(m).
+  Type: IsArray_S1_S(q) /\ IsS1_S(s) /\ is_sint32(k) /\ IsArray_S1_S(m).
   (* Pre-condition *)
   Have: (0 <= k) /\ (k <= 9).
 }
-Prove: EqArray1_S1_S(10, m, q[k <- s]).
+Prove: EqArray_S1_S(10, m, q[k <- s]).
 
 ------------------------------------------------------------
 
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 ac2a7f76c9282ac4f0d699087e7dbce8812b53e4..a96c98731e45f72d2106339b9b9ca016604b8ded 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
@@ -16,15 +16,15 @@ Let x = k - 1.
 Let m = p[x <- v].
 Let m_1 = m[k <- v_1].
 Assume {
-  Type: IsArray1_sint32(p) /\ is_sint32(k) /\ is_sint32(v_1) /\
+  Type: IsArray_sint32(p) /\ is_sint32(k) /\ is_sint32(v_1) /\
       is_sint32(v) /\ is_sint32(x1_0) /\ is_sint32(x2_0) /\ is_sint32(x) /\
-      is_sint32(1 + k) /\ IsArray1_sint32(m) /\ IsArray1_sint32(m_1).
+      is_sint32(1 + k) /\ IsArray_sint32(m) /\ IsArray_sint32(m_1).
   (* Pre-condition *)
   Have: (0 < k) /\ (k <= 9).
   (* Call 'job' *)
-  Have: (k <= 10) /\ EqArray1_int(10, m, p[x <- x1_0]).
+  Have: (k <= 10) /\ EqArray_int(10, m, p[x <- x1_0]).
   (* Call 'job' *)
-  Have: EqArray1_int(10, m_1, m[k <- x2_0]).
+  Have: EqArray_int(10, m_1, m[k <- x2_0]).
 }
 Prove: x1_0 = v.
 
@@ -35,15 +35,15 @@ Let x = k - 1.
 Let m = p[x <- v_1].
 Let m_1 = m[k <- v].
 Assume {
-  Type: IsArray1_sint32(p) /\ is_sint32(k) /\ is_sint32(v) /\
+  Type: IsArray_sint32(p) /\ is_sint32(k) /\ is_sint32(v) /\
       is_sint32(v_1) /\ is_sint32(x1_0) /\ is_sint32(x2_0) /\ is_sint32(x) /\
-      is_sint32(1 + k) /\ IsArray1_sint32(m) /\ IsArray1_sint32(m_1).
+      is_sint32(1 + k) /\ IsArray_sint32(m) /\ IsArray_sint32(m_1).
   (* Pre-condition *)
   Have: (0 < k) /\ (k <= 9).
   (* Call 'job' *)
-  Have: (k <= 10) /\ EqArray1_int(10, m, p[x <- x1_0]).
+  Have: (k <= 10) /\ EqArray_int(10, m, p[x <- x1_0]).
   (* Call 'job' *)
-  Have: EqArray1_int(10, m_1, m[k <- x2_0]).
+  Have: EqArray_int(10, m_1, m[k <- x2_0]).
 }
 Prove: x2_0 = v.
 
@@ -61,12 +61,12 @@ Goal Instance of 'Pre-condition (file user_collect.i, line 15) in 'job'' in 'cal
 :
 Let m = p[k <- v].
 Assume {
-  Type: IsArray1_sint32(p) /\ is_sint32(k) /\ is_sint32(x1_0) /\
-      IsArray1_sint32(m) /\ is_sint32(1 + k).
+  Type: IsArray_sint32(p) /\ is_sint32(k) /\ is_sint32(x1_0) /\
+      IsArray_sint32(m) /\ is_sint32(1 + k).
   (* Pre-condition *)
   Have: (0 <= k) /\ (k <= 8).
   (* Call 'job' *)
-  Have: (k <= 9) /\ EqArray1_int(10, m, p[k <- x1_0]).
+  Have: (k <= 9) /\ EqArray_int(10, m, p[k <- x1_0]).
 }
 Prove: (-1) <= k.
 
@@ -85,15 +85,15 @@ Let x = k - 1.
 Let m = q[x <- v].
 Let m_1 = m[k <- v_1].
 Assume {
-  Type: IsArray1S1_S(q) /\ IsS1_S(s1_0) /\ IsS1_S(s2_0) /\ IsS1_S(v_1) /\
+  Type: IsArray_S1_S(q) /\ IsS1_S(s1_0) /\ IsS1_S(s2_0) /\ IsS1_S(v_1) /\
       IsS1_S(v) /\ is_sint32(k) /\ is_sint32(x) /\ is_sint32(1 + k) /\
-      IsArray1S1_S(m) /\ IsArray1S1_S(m_1).
+      IsArray_S1_S(m) /\ IsArray_S1_S(m_1).
   (* Pre-condition *)
   Have: (0 < k) /\ (k <= 9).
   (* Call 'job2' *)
-  Have: (k <= 10) /\ EqArray1_S1_S(10, m, q[x <- s1_0]).
+  Have: (k <= 10) /\ EqArray_S1_S(10, m, q[x <- s1_0]).
   (* Call 'job2' *)
-  Have: EqArray1_S1_S(10, m_1, m[k <- s2_0]).
+  Have: EqArray_S1_S(10, m_1, m[k <- s2_0]).
 }
 Prove: EqS1_S(v, s1_0).
 
@@ -104,15 +104,15 @@ Let x = k - 1.
 Let m = q[x <- v_1].
 Let m_1 = m[k <- v].
 Assume {
-  Type: IsArray1S1_S(q) /\ IsS1_S(s1_0) /\ IsS1_S(s2_0) /\ IsS1_S(v) /\
+  Type: IsArray_S1_S(q) /\ IsS1_S(s1_0) /\ IsS1_S(s2_0) /\ IsS1_S(v) /\
       IsS1_S(v_1) /\ is_sint32(k) /\ is_sint32(x) /\ is_sint32(1 + k) /\
-      IsArray1S1_S(m) /\ IsArray1S1_S(m_1).
+      IsArray_S1_S(m) /\ IsArray_S1_S(m_1).
   (* Pre-condition *)
   Have: (0 < k) /\ (k <= 9).
   (* Call 'job2' *)
-  Have: (k <= 10) /\ EqArray1_S1_S(10, m, q[x <- s1_0]).
+  Have: (k <= 10) /\ EqArray_S1_S(10, m, q[x <- s1_0]).
   (* Call 'job2' *)
-  Have: EqArray1_S1_S(10, m_1, m[k <- s2_0]).
+  Have: EqArray_S1_S(10, m_1, m[k <- s2_0]).
 }
 Prove: EqS1_S(v, s2_0).
 
@@ -124,17 +124,17 @@ Let m = q[x <- v].
 Let m_1 = m[k <- v_1].
 Let m_2 = q[x <- s1_0].
 Assume {
-  Type: IsArray1S1_S(q) /\ IsS1_S(s1_0) /\ IsS1_S(s2_0) /\ IsS1_S(v_1) /\
+  Type: IsArray_S1_S(q) /\ IsS1_S(s1_0) /\ IsS1_S(s2_0) /\ IsS1_S(v_1) /\
       IsS1_S(v) /\ is_sint32(k) /\ is_sint32(x) /\ is_sint32(1 + k) /\
-      IsArray1S1_S(m) /\ IsArray1S1_S(m_1).
+      IsArray_S1_S(m) /\ IsArray_S1_S(m_1).
   (* Pre-condition *)
   Have: (0 < k) /\ (k <= 9).
   (* Call 'job2' *)
-  Have: (k <= 10) /\ EqArray1_S1_S(10, m, m_2).
+  Have: (k <= 10) /\ EqArray_S1_S(10, m, m_2).
   (* Call 'job2' *)
-  Have: EqArray1_S1_S(10, m_1, m[k <- s2_0]).
+  Have: EqArray_S1_S(10, m_1, m[k <- s2_0]).
 }
-Prove: EqArray1_S1_S(10, m_1, m_2[k <- s2_0]).
+Prove: EqArray_S1_S(10, m_1, m_2[k <- s2_0]).
 
 ------------------------------------------------------------
 
@@ -150,12 +150,12 @@ Goal Instance of 'Pre-condition (file user_collect.i, line 26) in 'job2'' in 'ca
 :
 Let m = q[k <- v].
 Assume {
-  Type: IsArray1S1_S(q) /\ IsS1_S(s1_0) /\ is_sint32(k) /\ IsArray1S1_S(m) /\
+  Type: IsArray_S1_S(q) /\ IsS1_S(s1_0) /\ is_sint32(k) /\ IsArray_S1_S(m) /\
       is_sint32(1 + k).
   (* Pre-condition *)
   Have: (0 <= k) /\ (k <= 8).
   (* Call 'job2' *)
-  Have: (k <= 9) /\ EqArray1_S1_S(10, m, q[k <- s1_0]).
+  Have: (k <= 9) /\ EqArray_S1_S(10, m, q[k <- s1_0]).
 }
 Prove: (-1) <= k.
 
@@ -174,15 +174,15 @@ Let x = k - 1.
 Let m = q[x <- v].
 Let m_1 = m[k <- v_1].
 Assume {
-  Type: IsArray1S1_S(q) /\ IsS1_S(s1_0) /\ IsS1_S(s2_0) /\ IsS1_S(v_1) /\
+  Type: IsArray_S1_S(q) /\ IsS1_S(s1_0) /\ IsS1_S(s2_0) /\ IsS1_S(v_1) /\
       IsS1_S(v) /\ is_sint32(k) /\ is_sint32(x) /\ is_sint32(1 + k) /\
-      IsArray1S1_S(m) /\ IsArray1S1_S(m_1).
+      IsArray_S1_S(m) /\ IsArray_S1_S(m_1).
   (* Pre-condition *)
   Have: (0 < k) /\ (k <= 9).
   (* Call 'job3' *)
-  Have: (k <= 10) /\ EqArray1_S1_S(10, m, q[x <- s1_0]).
+  Have: (k <= 10) /\ EqArray_S1_S(10, m, q[x <- s1_0]).
   (* Call 'job3' *)
-  Have: EqArray1_S1_S(10, m_1, m[k <- s2_0]).
+  Have: EqArray_S1_S(10, m_1, m[k <- s2_0]).
 }
 Prove: EqS1_S(v, s1_0).
 
@@ -193,15 +193,15 @@ Let x = k - 1.
 Let m = q[x <- v_1].
 Let m_1 = m[k <- v].
 Assume {
-  Type: IsArray1S1_S(q) /\ IsS1_S(s1_0) /\ IsS1_S(s2_0) /\ IsS1_S(v) /\
+  Type: IsArray_S1_S(q) /\ IsS1_S(s1_0) /\ IsS1_S(s2_0) /\ IsS1_S(v) /\
       IsS1_S(v_1) /\ is_sint32(k) /\ is_sint32(x) /\ is_sint32(1 + k) /\
-      IsArray1S1_S(m) /\ IsArray1S1_S(m_1).
+      IsArray_S1_S(m) /\ IsArray_S1_S(m_1).
   (* Pre-condition *)
   Have: (0 < k) /\ (k <= 9).
   (* Call 'job3' *)
-  Have: (k <= 10) /\ EqArray1_S1_S(10, m, q[x <- s1_0]).
+  Have: (k <= 10) /\ EqArray_S1_S(10, m, q[x <- s1_0]).
   (* Call 'job3' *)
-  Have: EqArray1_S1_S(10, m_1, m[k <- s2_0]).
+  Have: EqArray_S1_S(10, m_1, m[k <- s2_0]).
 }
 Prove: EqS1_S(v, s2_0).
 
@@ -213,17 +213,17 @@ Let m = q[x <- v].
 Let m_1 = m[k <- v_1].
 Let m_2 = q[x <- s1_0].
 Assume {
-  Type: IsArray1S1_S(q) /\ IsS1_S(s1_0) /\ IsS1_S(s2_0) /\ IsS1_S(v_1) /\
+  Type: IsArray_S1_S(q) /\ IsS1_S(s1_0) /\ IsS1_S(s2_0) /\ IsS1_S(v_1) /\
       IsS1_S(v) /\ is_sint32(k) /\ is_sint32(x) /\ is_sint32(1 + k) /\
-      IsArray1S1_S(m) /\ IsArray1S1_S(m_1).
+      IsArray_S1_S(m) /\ IsArray_S1_S(m_1).
   (* Pre-condition *)
   Have: (0 < k) /\ (k <= 9).
   (* Call 'job3' *)
-  Have: (k <= 10) /\ EqArray1_S1_S(10, m, m_2).
+  Have: (k <= 10) /\ EqArray_S1_S(10, m, m_2).
   (* Call 'job3' *)
-  Have: EqArray1_S1_S(10, m_1, m[k <- s2_0]).
+  Have: EqArray_S1_S(10, m_1, m[k <- s2_0]).
 }
-Prove: EqArray1_S1_S(10, m_1, m_2[k <- s2_0]).
+Prove: EqArray_S1_S(10, m_1, m_2[k <- s2_0]).
 
 ------------------------------------------------------------
 
@@ -239,12 +239,12 @@ Goal Instance of 'Pre-condition (file user_collect.i, line 37) in 'job3'' in 'ca
 :
 Let m = q[k <- v].
 Assume {
-  Type: IsArray1S1_S(q) /\ IsS1_S(s1_0) /\ is_sint32(k) /\ IsArray1S1_S(m) /\
+  Type: IsArray_S1_S(q) /\ IsS1_S(s1_0) /\ is_sint32(k) /\ IsArray_S1_S(m) /\
       is_sint32(1 + k).
   (* Pre-condition *)
   Have: (0 <= k) /\ (k <= 8).
   (* Call 'job3' *)
-  Have: (k <= 9) /\ EqArray1_S1_S(10, m, q[k <- s1_0]).
+  Have: (k <= 9) /\ EqArray_S1_S(10, m, q[k <- s1_0]).
 }
 Prove: (-1) <= k.
 
@@ -322,11 +322,11 @@ Goal Post-condition 'Q' in 'job3':
 Let a = s.F1_S_f.
 Let m = q[k <- { F1_S_f = (q[k].F1_S_f)[0 <- a[0]][1 <- a[1]] }].
 Assume {
-  Type: IsArray1S1_S(q) /\ IsS1_S(s) /\ is_sint32(k) /\ IsArray1S1_S(m).
+  Type: IsArray_S1_S(q) /\ IsS1_S(s) /\ is_sint32(k) /\ IsArray_S1_S(m).
   (* Pre-condition *)
   Have: (0 <= k) /\ (k <= 9).
 }
-Prove: EqArray1_S1_S(10, m, q[k <- s]).
+Prove: EqArray_S1_S(10, m, q[k <- s]).
 
 ------------------------------------------------------------
 
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 8df663247c2e9c441d561d00df1e3ecdb2fc96cc..a6a1b74cdc96b57382c1a66b8938f2e1b10feaa1 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
@@ -795,7 +795,7 @@ Prove: true.
 Goal Post-condition (file user_init.i, line 39) in 'init_t2_v1':
 Assume {
   (* Heap *)
-  Type: IsArray2_sint32(t2_1).
+  Type: IsArray_d2_sint32(t2_1).
   (* Goal *)
   When: (0 <= i) /\ (0 <= i_1) /\ (i <= 9) /\ (i_1 <= 19).
   (* Loop assigns 'lack,Zone_i' *)
@@ -816,7 +816,7 @@ Let m = t2_0[i].
 Assume {
   Type: is_uint32(i).
   (* Heap *)
-  Type: IsArray2_sint32(t2_1).
+  Type: IsArray_d2_sint32(t2_1).
   (* Goal *)
   When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 < to_uint32(1 + i)) /\ (i_2 <= 19).
   (* Loop assigns 'lack,Zone_i' *)
@@ -855,7 +855,7 @@ Goal Preservation of Invariant 'Range_i' (file user_init.i, line 47):
 Assume {
   Type: is_uint32(i).
   (* Heap *)
-  Type: IsArray2_sint32(t2_0).
+  Type: IsArray_d2_sint32(t2_0).
   (* Loop assigns 'lack,Zone_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) ->
       ((i_1 <= 19) ->
@@ -893,7 +893,7 @@ Let m = t2_0[i].
 Assume {
   Type: is_uint32(i) /\ is_uint32(j).
   (* Heap *)
-  Type: IsArray2_sint32(t2_1).
+  Type: IsArray_d2_sint32(t2_1).
   (* Goal *)
   When: (0 <= i_1) /\ (i_1 < to_uint32(1 + j)).
   (* Loop assigns 'lack,Zone_i' *)
@@ -937,7 +937,7 @@ Let m = t2_0[i].
 Assume {
   Type: is_uint32(i) /\ is_uint32(j).
   (* Heap *)
-  Type: IsArray2_sint32(t2_2).
+  Type: IsArray_d2_sint32(t2_2).
   (* Goal *)
   When: (0 <= i_1) /\ (i_1 < i) /\ (0 <= i_2) /\ (i_2 <= 19).
   (* Loop assigns 'lack,Zone_i' *)
@@ -980,7 +980,7 @@ Goal Preservation of Invariant 'Range_j' (file user_init.i, line 53):
 Assume {
   Type: is_uint32(i) /\ is_uint32(j).
   (* Heap *)
-  Type: IsArray2_sint32(t2_0).
+  Type: IsArray_d2_sint32(t2_0).
   (* Loop assigns 'lack,Zone_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) ->
       ((i_1 <= 19) ->
@@ -1037,7 +1037,7 @@ Effect at line 51
 Assume {
   Type: is_uint32(i_2).
   (* Heap *)
-  Type: IsArray2_sint32(t2_0).
+  Type: IsArray_d2_sint32(t2_0).
   (* Goal *)
   When: (0 <= i_3) /\ (0 <= i_4) /\ (0 <= i_5) /\ (0 <= i_6) /\ (0 <= i) /\
       (0 <= i_1) /\ (i_3 <= 9) /\ (i_5 <= 9) /\ (i <= 9) /\ (i_4 <= 19) /\
@@ -1076,7 +1076,7 @@ Effect at line 58
 Assume {
   Type: is_uint32(i_2).
   (* Heap *)
-  Type: IsArray2_sint32(t2_0).
+  Type: IsArray_d2_sint32(t2_0).
   (* Goal *)
   When: (0 <= i_3) /\ (0 <= i_4) /\ (0 <= i_5) /\ (0 <= i_6) /\ (0 <= i) /\
       (0 <= i_1) /\ (i_3 <= 9) /\ (i_5 <= 9) /\ (i <= 9) /\ (i_4 <= 19) /\
@@ -1120,7 +1120,7 @@ Effect at line 58
 Assume {
   Type: is_uint32(i_2) /\ is_uint32(j).
   (* Heap *)
-  Type: IsArray2_sint32(t2_0).
+  Type: IsArray_d2_sint32(t2_0).
   (* Goal *)
   When: (0 <= i_3) /\ (0 <= i_4) /\ (0 <= i_5) /\ (0 <= i_6) /\ (0 <= i) /\
       (0 <= i_1) /\ (i_3 <= 9) /\ (i_5 <= 9) /\ (i <= 9) /\ (i_4 <= 19) /\
@@ -1162,7 +1162,7 @@ Effect at line 59
 Assume {
   Type: is_uint32(i) /\ is_uint32(j).
   (* Heap *)
-  Type: IsArray2_sint32(t2_0).
+  Type: IsArray_d2_sint32(t2_0).
   (* Goal *)
   When: (0 <= i) /\ (0 <= j) /\ (i <= 9) /\ (j <= 19).
   (* Loop assigns 'lack,Zone_i' *)
@@ -1211,7 +1211,7 @@ Assume {
   Have: i <= 9.
   Have: i_1 <= 19.
   (* Heap *)
-  Type: IsArray2_sint32(t2_0).
+  Type: IsArray_d2_sint32(t2_0).
   (* Loop assigns 'lack,Zone_i' *)
   Have: forall i_5,i_4 : Z. ((0 <= i_5) -> ((0 <= i_4) -> ((i_5 <= 9) ->
       ((i_4 <= 19) ->
@@ -1227,7 +1227,7 @@ Goal Decreasing of Loop variant at loop (file user_init.i, line 51):
 Assume {
   Type: is_uint32(i).
   (* Heap *)
-  Type: IsArray2_sint32(t2_0).
+  Type: IsArray_d2_sint32(t2_0).
   (* Loop assigns 'lack,Zone_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) ->
       ((i_1 <= 19) ->
@@ -1264,7 +1264,7 @@ Goal Decreasing of Loop variant at loop (file user_init.i, line 58):
 Assume {
   Type: is_uint32(i) /\ is_uint32(j).
   (* Heap *)
-  Type: IsArray2_sint32(t2_0).
+  Type: IsArray_d2_sint32(t2_0).
   (* Loop assigns 'lack,Zone_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) ->
       ((i_1 <= 19) ->
@@ -1680,8 +1680,8 @@ Prove: P_MemSet20(t2_0[i], 20, v).
 
 Goal Preservation of Invariant 'Partial_i' (file user_init.i, line 108):
 Assume {
-  Type: IsArray1_sint32(v) /\ is_uint32(i) /\ is_sint32(v_1) /\
-      IsArray1_sint32(t2_0[i]).
+  Type: IsArray_sint32(v) /\ is_uint32(i) /\ is_sint32(v_1) /\
+      IsArray_sint32(t2_0[i]).
   (* Goal *)
   When: (0 <= i_1) /\ (i_1 < to_uint32(1 + i)).
   (* Invariant 'Partial_i' *)
@@ -1705,8 +1705,8 @@ Prove: true.
 
 Goal Preservation of Invariant 'Range_i' (file user_init.i, line 107):
 Assume {
-  Type: IsArray1_sint32(v) /\ is_uint32(i) /\ is_sint32(v_1) /\
-      IsArray1_sint32(t2_0[i]).
+  Type: IsArray_sint32(v) /\ is_uint32(i) /\ is_sint32(v_1) /\
+      IsArray_sint32(t2_0[i]).
   (* Invariant 'Partial_i' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       P_MemSet20(t2_0[i_1], 20, v_1))).
@@ -1729,8 +1729,8 @@ Prove: true.
 Goal Preservation of Invariant 'Partial_j' (file user_init.i, line 114):
 Let m = v[j <- v_1].
 Assume {
-  Type: IsArray1_sint32(v) /\ is_uint32(i) /\ is_uint32(j) /\
-      is_sint32(v_1) /\ IsArray1_sint32(t2_0[i]) /\ IsArray1_sint32(m).
+  Type: IsArray_sint32(v) /\ is_uint32(i) /\ is_uint32(j) /\
+      is_sint32(v_1) /\ IsArray_sint32(t2_0[i]) /\ IsArray_sint32(m).
   (* Invariant 'Partial_i' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       P_MemSet20(t2_0[i_1], 20, v_1))).
@@ -1752,7 +1752,7 @@ Prove: P_MemSet20(m, to_uint32(1 + j), v_1).
 Goal Establishment of Invariant 'Partial_j' (file user_init.i, line 114):
 Let m = t2_0[i].
 Assume {
-  Type: is_uint32(i) /\ is_sint32(v) /\ IsArray1_sint32(m).
+  Type: is_uint32(i) /\ is_sint32(v) /\ IsArray_sint32(m).
   (* Invariant 'Partial_i' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       P_MemSet20(t2_0[i_1], 20, v))).
@@ -1767,8 +1767,8 @@ Prove: P_MemSet20(m, 0, v).
 
 Goal Preservation of Invariant 'Range_j' (file user_init.i, line 113):
 Assume {
-  Type: IsArray1_sint32(v) /\ is_uint32(i) /\ is_uint32(j) /\
-      is_sint32(v_1) /\ IsArray1_sint32(t2_0[i]).
+  Type: IsArray_sint32(v) /\ is_uint32(i) /\ is_uint32(j) /\
+      is_sint32(v_1) /\ IsArray_sint32(t2_0[i]).
   (* Invariant 'Partial_i' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       P_MemSet20(t2_0[i_1], 20, v_1))).
@@ -1810,8 +1810,8 @@ Prove: true.
 Goal Loop assigns 'tactic,Zone_i' (2/3):
 Effect at line 111
 Assume {
-  Type: IsArray1_sint32(v) /\ is_uint32(i_2) /\ is_sint32(v_1) /\
-      IsArray1_sint32(t2_0[i_2]).
+  Type: IsArray_sint32(v) /\ is_uint32(i_2) /\ is_sint32(v_1) /\
+      IsArray_sint32(t2_0[i_2]).
   (* Goal *)
   When: (0 <= i_3) /\ (0 <= i_4) /\ (0 <= i_5) /\ (0 <= i) /\ (i_3 <= 9) /\
       (i_5 <= 9) /\ (i <= 9) /\ (i_4 <= 19).
@@ -1833,8 +1833,8 @@ Prove: exists i_7,i_6 : Z. (i_7 <= i) /\ (i_6 <= i_1) /\ (0 <= i_7) /\
 Goal Loop assigns 'tactic,Zone_i' (3/3):
 Effect at line 117
 Assume {
-  Type: IsArray1_sint32(v) /\ is_uint32(i) /\ is_sint32(v_1) /\
-      IsArray1_sint32(t2_0[i]).
+  Type: IsArray_sint32(v) /\ is_uint32(i) /\ is_sint32(v_1) /\
+      IsArray_sint32(t2_0[i]).
   (* Goal *)
   When: (0 <= i) /\ (0 <= i_1) /\ (i <= 9) /\ (i_1 <= 19).
   (* Invariant 'Partial_i' *)
@@ -1884,8 +1884,8 @@ Prove: exists i_5,i_4 : Z. (i_5 <= i) /\ (i_4 <= i_1) /\ (0 <= i_5) /\
 
 Goal Decreasing of Loop variant at loop (file user_init.i, line 111):
 Assume {
-  Type: IsArray1_sint32(v) /\ is_uint32(i) /\ is_sint32(v_1) /\
-      IsArray1_sint32(t2_0[i]).
+  Type: IsArray_sint32(v) /\ is_uint32(i) /\ is_sint32(v_1) /\
+      IsArray_sint32(t2_0[i]).
   (* Invariant 'Partial_i' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       P_MemSet20(t2_0[i_1], 20, v_1))).
@@ -1907,8 +1907,8 @@ Prove: true.
 
 Goal Decreasing of Loop variant at loop (file user_init.i, line 117):
 Assume {
-  Type: IsArray1_sint32(v) /\ is_uint32(i) /\ is_uint32(j) /\
-      is_sint32(v_1) /\ IsArray1_sint32(t2_0[i]).
+  Type: IsArray_sint32(v) /\ is_uint32(i) /\ is_uint32(j) /\
+      is_sint32(v_1) /\ IsArray_sint32(t2_0[i]).
   (* Invariant 'Partial_i' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       P_MemSet20(t2_0[i_1], 20, v_1))).
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 49de109ec1d567fbc7e691ee31a699d464329a9f..ca7ade04db567ff37d9c3f094536e813fb2f8da3 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
@@ -795,7 +795,7 @@ Prove: true.
 Goal Post-condition (file user_init.i, line 39) in 'init_t2_v1':
 Assume {
   (* Heap *)
-  Type: IsArray2_sint32(t2_1).
+  Type: IsArray_d2_sint32(t2_1).
   (* Goal *)
   When: (0 <= i) /\ (0 <= i_1) /\ (i <= 9) /\ (i_1 <= 19).
   (* Loop assigns 'lack,Zone_i' *)
@@ -816,7 +816,7 @@ Let m = t2_0[i].
 Assume {
   Type: is_uint32(i).
   (* Heap *)
-  Type: IsArray2_sint32(t2_1).
+  Type: IsArray_d2_sint32(t2_1).
   (* Goal *)
   When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 < to_uint32(1 + i)) /\ (i_2 <= 19).
   (* Loop assigns 'lack,Zone_i' *)
@@ -855,7 +855,7 @@ Goal Preservation of Invariant 'Range_i' (file user_init.i, line 47):
 Assume {
   Type: is_uint32(i).
   (* Heap *)
-  Type: IsArray2_sint32(t2_0).
+  Type: IsArray_d2_sint32(t2_0).
   (* Loop assigns 'lack,Zone_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) ->
       ((i_1 <= 19) ->
@@ -893,7 +893,7 @@ Let m = t2_0[i].
 Assume {
   Type: is_uint32(i) /\ is_uint32(j).
   (* Heap *)
-  Type: IsArray2_sint32(t2_1).
+  Type: IsArray_d2_sint32(t2_1).
   (* Goal *)
   When: (0 <= i_1) /\ (i_1 < to_uint32(1 + j)).
   (* Loop assigns 'lack,Zone_i' *)
@@ -937,7 +937,7 @@ Let m = t2_0[i].
 Assume {
   Type: is_uint32(i) /\ is_uint32(j).
   (* Heap *)
-  Type: IsArray2_sint32(t2_2).
+  Type: IsArray_d2_sint32(t2_2).
   (* Goal *)
   When: (0 <= i_1) /\ (i_1 < i) /\ (0 <= i_2) /\ (i_2 <= 19).
   (* Loop assigns 'lack,Zone_i' *)
@@ -980,7 +980,7 @@ Goal Preservation of Invariant 'Range_j' (file user_init.i, line 53):
 Assume {
   Type: is_uint32(i) /\ is_uint32(j).
   (* Heap *)
-  Type: IsArray2_sint32(t2_0).
+  Type: IsArray_d2_sint32(t2_0).
   (* Loop assigns 'lack,Zone_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) ->
       ((i_1 <= 19) ->
@@ -1037,7 +1037,7 @@ Effect at line 51
 Assume {
   Type: is_uint32(i_2).
   (* Heap *)
-  Type: IsArray2_sint32(t2_0).
+  Type: IsArray_d2_sint32(t2_0).
   (* Goal *)
   When: (0 <= i_3) /\ (0 <= i_4) /\ (0 <= i_5) /\ (0 <= i_6) /\ (0 <= i) /\
       (0 <= i_1) /\ (i_3 <= 9) /\ (i_5 <= 9) /\ (i <= 9) /\ (i_4 <= 19) /\
@@ -1076,7 +1076,7 @@ Effect at line 58
 Assume {
   Type: is_uint32(i_2).
   (* Heap *)
-  Type: IsArray2_sint32(t2_0).
+  Type: IsArray_d2_sint32(t2_0).
   (* Goal *)
   When: (0 <= i_3) /\ (0 <= i_4) /\ (0 <= i_5) /\ (0 <= i_6) /\ (0 <= i) /\
       (0 <= i_1) /\ (i_3 <= 9) /\ (i_5 <= 9) /\ (i <= 9) /\ (i_4 <= 19) /\
@@ -1120,7 +1120,7 @@ Effect at line 58
 Assume {
   Type: is_uint32(i_2) /\ is_uint32(j).
   (* Heap *)
-  Type: IsArray2_sint32(t2_0).
+  Type: IsArray_d2_sint32(t2_0).
   (* Goal *)
   When: (0 <= i_3) /\ (0 <= i_4) /\ (0 <= i_5) /\ (0 <= i_6) /\ (0 <= i) /\
       (0 <= i_1) /\ (i_3 <= 9) /\ (i_5 <= 9) /\ (i <= 9) /\ (i_4 <= 19) /\
@@ -1162,7 +1162,7 @@ Effect at line 59
 Assume {
   Type: is_uint32(i) /\ is_uint32(j).
   (* Heap *)
-  Type: IsArray2_sint32(t2_0).
+  Type: IsArray_d2_sint32(t2_0).
   (* Goal *)
   When: (0 <= i) /\ (0 <= j) /\ (i <= 9) /\ (j <= 19).
   (* Loop assigns 'lack,Zone_i' *)
@@ -1211,7 +1211,7 @@ Assume {
   Have: i <= 9.
   Have: i_1 <= 19.
   (* Heap *)
-  Type: IsArray2_sint32(t2_0).
+  Type: IsArray_d2_sint32(t2_0).
   (* Loop assigns 'lack,Zone_i' *)
   Have: forall i_5,i_4 : Z. ((0 <= i_5) -> ((0 <= i_4) -> ((i_5 <= 9) ->
       ((i_4 <= 19) ->
@@ -1227,7 +1227,7 @@ Goal Decreasing of Loop variant at loop (file user_init.i, line 51):
 Assume {
   Type: is_uint32(i).
   (* Heap *)
-  Type: IsArray2_sint32(t2_0).
+  Type: IsArray_d2_sint32(t2_0).
   (* Loop assigns 'lack,Zone_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) ->
       ((i_1 <= 19) ->
@@ -1264,7 +1264,7 @@ Goal Decreasing of Loop variant at loop (file user_init.i, line 58):
 Assume {
   Type: is_uint32(i) /\ is_uint32(j).
   (* Heap *)
-  Type: IsArray2_sint32(t2_0).
+  Type: IsArray_d2_sint32(t2_0).
   (* Loop assigns 'lack,Zone_i' *)
   Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) ->
       ((i_1 <= 19) ->
@@ -1680,8 +1680,8 @@ Prove: P_MemSet20(t2_0[i], 20, v).
 
 Goal Preservation of Invariant 'Partial_i' (file user_init.i, line 108):
 Assume {
-  Type: IsArray1_sint32(v) /\ is_uint32(i) /\ is_sint32(v_1) /\
-      IsArray1_sint32(t2_0[i]).
+  Type: IsArray_sint32(v) /\ is_uint32(i) /\ is_sint32(v_1) /\
+      IsArray_sint32(t2_0[i]).
   (* Goal *)
   When: (0 <= i_1) /\ (i_1 < to_uint32(1 + i)).
   (* Invariant 'Partial_i' *)
@@ -1705,8 +1705,8 @@ Prove: true.
 
 Goal Preservation of Invariant 'Range_i' (file user_init.i, line 107):
 Assume {
-  Type: IsArray1_sint32(v) /\ is_uint32(i) /\ is_sint32(v_1) /\
-      IsArray1_sint32(t2_0[i]).
+  Type: IsArray_sint32(v) /\ is_uint32(i) /\ is_sint32(v_1) /\
+      IsArray_sint32(t2_0[i]).
   (* Invariant 'Partial_i' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       P_MemSet20(t2_0[i_1], 20, v_1))).
@@ -1729,8 +1729,8 @@ Prove: true.
 Goal Preservation of Invariant 'Partial_j' (file user_init.i, line 114):
 Let m = v[j <- v_1].
 Assume {
-  Type: IsArray1_sint32(v) /\ is_uint32(i) /\ is_uint32(j) /\
-      is_sint32(v_1) /\ IsArray1_sint32(t2_0[i]) /\ IsArray1_sint32(m).
+  Type: IsArray_sint32(v) /\ is_uint32(i) /\ is_uint32(j) /\
+      is_sint32(v_1) /\ IsArray_sint32(t2_0[i]) /\ IsArray_sint32(m).
   (* Invariant 'Partial_i' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       P_MemSet20(t2_0[i_1], 20, v_1))).
@@ -1752,7 +1752,7 @@ Prove: P_MemSet20(m, to_uint32(1 + j), v_1).
 Goal Establishment of Invariant 'Partial_j' (file user_init.i, line 114):
 Let m = t2_0[i].
 Assume {
-  Type: is_uint32(i) /\ is_sint32(v) /\ IsArray1_sint32(m).
+  Type: is_uint32(i) /\ is_sint32(v) /\ IsArray_sint32(m).
   (* Invariant 'Partial_i' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       P_MemSet20(t2_0[i_1], 20, v))).
@@ -1767,8 +1767,8 @@ Prove: P_MemSet20(m, 0, v).
 
 Goal Preservation of Invariant 'Range_j' (file user_init.i, line 113):
 Assume {
-  Type: IsArray1_sint32(v) /\ is_uint32(i) /\ is_uint32(j) /\
-      is_sint32(v_1) /\ IsArray1_sint32(t2_0[i]).
+  Type: IsArray_sint32(v) /\ is_uint32(i) /\ is_uint32(j) /\
+      is_sint32(v_1) /\ IsArray_sint32(t2_0[i]).
   (* Invariant 'Partial_i' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       P_MemSet20(t2_0[i_1], 20, v_1))).
@@ -1810,8 +1810,8 @@ Prove: true.
 Goal Loop assigns 'tactic,Zone_i' (2/3):
 Effect at line 111
 Assume {
-  Type: IsArray1_sint32(v) /\ is_uint32(i_2) /\ is_sint32(v_1) /\
-      IsArray1_sint32(t2_0[i_2]).
+  Type: IsArray_sint32(v) /\ is_uint32(i_2) /\ is_sint32(v_1) /\
+      IsArray_sint32(t2_0[i_2]).
   (* Goal *)
   When: (0 <= i_3) /\ (0 <= i_4) /\ (0 <= i_5) /\ (0 <= i) /\ (i_3 <= 9) /\
       (i_5 <= 9) /\ (i <= 9) /\ (i_4 <= 19).
@@ -1833,8 +1833,8 @@ Prove: exists i_7,i_6 : Z. (i_7 <= i) /\ (i_6 <= i_1) /\ (0 <= i_7) /\
 Goal Loop assigns 'tactic,Zone_i' (3/3):
 Effect at line 117
 Assume {
-  Type: IsArray1_sint32(v) /\ is_uint32(i) /\ is_sint32(v_1) /\
-      IsArray1_sint32(t2_0[i]).
+  Type: IsArray_sint32(v) /\ is_uint32(i) /\ is_sint32(v_1) /\
+      IsArray_sint32(t2_0[i]).
   (* Goal *)
   When: (0 <= i) /\ (0 <= i_1) /\ (i <= 9) /\ (i_1 <= 19).
   (* Invariant 'Partial_i' *)
@@ -1884,8 +1884,8 @@ Prove: exists i_5,i_4 : Z. (i_5 <= i) /\ (i_4 <= i_1) /\ (0 <= i_5) /\
 
 Goal Decreasing of Loop variant at loop (file user_init.i, line 111):
 Assume {
-  Type: IsArray1_sint32(v) /\ is_uint32(i) /\ is_sint32(v_1) /\
-      IsArray1_sint32(t2_0[i]).
+  Type: IsArray_sint32(v) /\ is_uint32(i) /\ is_sint32(v_1) /\
+      IsArray_sint32(t2_0[i]).
   (* Invariant 'Partial_i' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       P_MemSet20(t2_0[i_1], 20, v_1))).
@@ -1907,8 +1907,8 @@ Prove: true.
 
 Goal Decreasing of Loop variant at loop (file user_init.i, line 117):
 Assume {
-  Type: IsArray1_sint32(v) /\ is_uint32(i) /\ is_uint32(j) /\
-      is_sint32(v_1) /\ IsArray1_sint32(t2_0[i]).
+  Type: IsArray_sint32(v) /\ is_uint32(i) /\ is_uint32(j) /\
+      is_sint32(v_1) /\ IsArray_sint32(t2_0[i]).
   (* Invariant 'Partial_i' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
       P_MemSet20(t2_0[i_1], 20, v_1))).
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 3e61ee834a8cfe2e33899d898b8fd2a972f2af85..99c9a56265120f89722642a48fafe7529490f284 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
@@ -115,9 +115,10 @@ Effect at line 68
 Prove: true.
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'job':
+[wp] tests/wp_typed/user_injector.i:58: Warning: 
+  Memory model hypotheses for function 'job':
   /*@
-     behavior typed:
+     behavior wp_typed:
        requires
          \separated(
            error, (int *)service_id + (..), (int *)service_result + (..), &seq,
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 2ef511de80db5da2e249089f99693978bdec0ce3..500cc79e58c0139da53f55a44709914993ca7230 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
@@ -40,9 +40,10 @@ Goal Assigns 'E' in 'swap':
 Prove: true.
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'swap':
+[wp] tests/wp_typed/user_swap.i:13: Warning: 
+  Memory model hypotheses for function 'swap':
   /*@
-     behavior typed_ref:
+     behavior wp_typed_ref:
        requires \separated(a, b);
        requires \valid(a);
        requires \valid(b);
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 6d550e0e6c72a18991068a6457109d9d4d6104d8..392be30f56614bfda3b31e3ad18cb935accdbcda 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
@@ -13,3 +13,11 @@
  Functions                 WP     Alt-Ergo  Total   Success
   Job                       -        1        1       100%
 ------------------------------------------------------------
+[wp] tests/wp_typed/mvar.i:8: Warning: 
+  Memory model hypotheses for function 'Write':
+  /*@
+     behavior wp_typed:
+       requires \separated(p + (..), (char *)A + (..));
+       requires \separated(p + (0 ..), (char *)A + (..));
+     */
+  extern void Write(char *p, int n);
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 6b3405cdb27e70a210dcf8301d139bcc3628a5ee..db65db757329710f7728a4de842f1764a295e242 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
@@ -20,3 +20,8 @@
   g                         1        -        1       100%
   h                         -        1        1       100%
 ------------------------------------------------------------
+[wp] tests/wp_typed/unit_alloc.i:34: Warning: 
+  Memory model hypotheses for function 'h':
+  /*@ behavior wp_typed:
+        ensures \separated(\result, &x); */
+  int *h(int x);
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 57de44fd76abb78d88db3c569f106b5eafb156ab..b375c9ca9e24eef1d10545a44da7b6630c4ccb09 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
@@ -20,3 +20,8 @@
   g                         1        -        1       100%
   h                         -        1        1       100%
 ------------------------------------------------------------
+[wp] tests/wp_typed/unit_alloc.i:34: Warning: 
+  Memory model hypotheses for function 'h':
+  /*@ behavior wp_typed_ref:
+        ensures \separated(\result, &x); */
+  int *h(int x);
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 2d96ea195b78348a5e8a5988269de806023f6071..e62fb1542bd8576f84fcc5669c8138a688af1cd0 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
@@ -14,7 +14,8 @@
  Functions                 WP     Alt-Ergo  Total   Success
   f                         1        -        2      50.0%
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'f':
-  /*@ behavior typed_ref:
+[wp] tests/wp_typed/unit_loopscope.i:9: Warning: 
+  Memory model hypotheses for function 'f':
+  /*@ behavior wp_typed_ref:
         requires \valid(written); */
   void f(unsigned int *written);
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 a5f8a971b9f1229e8509d038e8f7451dafdfa9f7..139c4b84bd1e576dc0599b4e37e84f80df85cf87 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_assigns_exit_part2.json
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_assigns_exit_part2.json
@@ -1,10 +1,10 @@
 [ { "header": "Split", "tactic": "Wp.split", "params": {},
     "select": { "select": "clause-goal",
                 "target": "exists i_0,i_1:int.\n(i_0<=i_136) /\\ (i_1<=i_137) /\\ (0<=i_0) /\\ (i_136<=i_0) /\\ (i_137<=i_1)\n/\\ (i_0<=9)",
-                "pattern": "\\E\\E&<=<=<=<=<=<=#1$i#0$i0#1$i#1" },
+                "pattern": "\\E$i$i0$i$i9" },
     "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.017,
+                                  "verdict": "valid", "time": 0.0072,
                                   "steps": 22 } ],
                   "Goal 2/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.0148,
+                                  "verdict": "valid", "time": 0.0051,
                                   "steps": 22 } ] } } ]
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 a5f8a971b9f1229e8509d038e8f7451dafdfa9f7..139c4b84bd1e576dc0599b4e37e84f80df85cf87 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_assigns_normal_part2.json
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_assigns_normal_part2.json
@@ -1,10 +1,10 @@
 [ { "header": "Split", "tactic": "Wp.split", "params": {},
     "select": { "select": "clause-goal",
                 "target": "exists i_0,i_1:int.\n(i_0<=i_136) /\\ (i_1<=i_137) /\\ (0<=i_0) /\\ (i_136<=i_0) /\\ (i_137<=i_1)\n/\\ (i_0<=9)",
-                "pattern": "\\E\\E&<=<=<=<=<=<=#1$i#0$i0#1$i#1" },
+                "pattern": "\\E$i$i0$i$i9" },
     "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.017,
+                                  "verdict": "valid", "time": 0.0072,
                                   "steps": 22 } ],
                   "Goal 2/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.0148,
+                                  "verdict": "valid", "time": 0.0051,
                                   "steps": 22 } ] } } ]
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 1a1c4c0451c01821da44f4cd61861b8ebeee4f02..df90f71b8c97a99931e505509ad421ffe9e78911 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
@@ -1,10 +1,10 @@
 [ { "header": "Split", "tactic": "Wp.split", "params": {},
     "select": { "select": "clause-goal",
                 "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" },
+                "pattern": "\\E$i$i0$i$i9" },
     "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.0236,
+                                  "verdict": "valid", "time": 0.0151,
                                   "steps": 41 } ],
                   "Goal 2/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.0251,
+                                  "verdict": "valid", "time": 0.0147,
                                   "steps": 41 } ] } } ]
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 398a69be748b427406223332d1c8447708dc51e1..ab6c0d166bbb3cbc8605279fe510b720a5b8f879 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_loop_assigns_part3.json
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_bis_v2_loop_assigns_part3.json
@@ -1,10 +1,10 @@
 [ { "header": "Split", "tactic": "Wp.split", "params": {},
     "select": { "select": "clause-goal",
                 "target": "exists i_1,i_2:int.\n(i_1<=i_0) /\\ (i_2<=i_3) /\\ (0<=i_1) /\\ (i_0<=i_1) /\\ (i_3<=i_2) /\\ (i_1<=9)",
-                "pattern": "\\E\\E&<=<=<=<=<=<=#1$i#0$i0#1$i#1" },
+                "pattern": "\\E$i$i0$i$i9" },
     "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.018,
+                                  "verdict": "valid", "time": 0.0115,
                                   "steps": 29 } ],
                   "Goal 2/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.022,
+                                  "verdict": "valid", "time": 0.0117,
                                   "steps": 29 } ] } } ]
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_assigns_part2.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_assigns_part2.json
index d7d87cb0431b99609b2b733ee68bb9ac2cdc04e6..2ee61e01ef268896d390d325575ef4051af1088e 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_assigns_part2.json
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_assigns_part2.json
@@ -1,7 +1,7 @@
 [ { "header": "Split", "tactic": "Wp.split", "params": {},
     "select": { "select": "clause-goal",
                 "target": "exists i_0,i_1:int.\n(i_0<=i_156) /\\ (i_1<=i_157) /\\ (0<=i_0) /\\ (i_156<=i_0) /\\ (i_157<=i_1)\n/\\ (i_0<=9)",
-                "pattern": "\\E\\E&<=<=<=<=<=<=#1$i#0$i0#1$i#1" },
+                "pattern": "\\E$i$i0$i$i9" },
     "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0",
                                   "verdict": "valid", "time": 0.011,
                                   "steps": 16 } ],
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_2_part2.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_2_part2.json
index 9927a473006bfd0846ae22f978f724ca10e5e553..6a684ed4e4fa19eaae36dd09d3b7717df0c65a0e 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_2_part2.json
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_2_part2.json
@@ -1,9 +1,9 @@
 [ { "header": "Split", "tactic": "Wp.split", "params": {},
     "select": { "select": "clause-goal",
                 "target": "exists i_0,i_1:int.\n(i_0<=i_13) /\\ (i_1<=i_14) /\\ (0<=i_0) /\\ (i_13<=i_0) /\\ (i_14<=i_1)\n/\\ (i_0<=9)",
-                "pattern": "\\E\\E&<=<=<=<=<=<=#1$i#0$i0#1$i#1" },
+                "pattern": "\\E$i$i0$i$i9" },
     "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.0177,
+                                  "verdict": "valid", "time": 0.0202,
                                   "steps": 40 } ],
                   "Goal 2/2": [ { "prover": "Alt-Ergo:2.2.0",
                                   "verdict": "valid", "time": 0.0177,
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_2_part3.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_2_part3.json
index e43bf2a0c07c931be6a637bc59d7981d08afa12f..578ffb9958aef6bacf33cb5680b0ecbafe0f5efe 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_2_part3.json
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_2_part3.json
@@ -1,10 +1,10 @@
 [ { "header": "Split", "tactic": "Wp.split", "params": {},
     "select": { "select": "clause-goal",
                 "target": "exists i_0,i_2:int.\n(i_0<=i_1) /\\ (0<=i_0) /\\ (i_1<=i_0) /\\ (j_0<=i_2) /\\ (i_2<=j_0) /\\ (i_0<=9)",
-                "pattern": "\\E\\E&<=<=<=<=<=<=#1$i0#1$i#1$j#0" },
+                "pattern": "\\E$i0$i$j$j9" },
     "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.0154,
+                                  "verdict": "valid", "time": 0.0143,
                                   "steps": 24 } ],
                   "Goal 2/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.0157,
+                                  "verdict": "valid", "time": 0.0146,
                                   "steps": 24 } ] } } ]
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_part2.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_part2.json
index 8138f144480b3491b3bd4e0ba6074c5cd9988c62..72b93b5526df3a049e39f88a0d1809d9e3ec6941 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_part2.json
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_part2.json
@@ -1,10 +1,10 @@
 [ { "header": "Split", "tactic": "Wp.split", "params": {},
     "select": { "select": "clause-goal",
                 "target": "exists i_0,i_1:int.\n(i_0<=i_21) /\\ (i_1<=i_22) /\\ (0<=i_0) /\\ (i_21<=i_0) /\\ (i_22<=i_1)\n/\\ (i_0<=9)",
-                "pattern": "\\E\\E&<=<=<=<=<=<=#1$i#0$i0#1$i#1" },
+                "pattern": "\\E$i$i0$i$i9" },
     "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.0167,
+                                  "verdict": "valid", "time": 0.016,
                                   "steps": 33 } ],
                   "Goal 2/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.0171,
+                                  "verdict": "valid", "time": 0.0161,
                                   "steps": 33 } ] } } ]
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_part3.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_part3.json
index c110027873b58604a7e9b1f4add93925e424cd1f..09755e2c851424c8871e943d93a05b0253bf1db9 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_part3.json
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v2_loop_assigns_part3.json
@@ -1,10 +1,10 @@
 [ { "header": "Split", "tactic": "Wp.split", "params": {},
     "select": { "select": "clause-goal",
                 "target": "exists i_0,i_1:int.\n(i_0<=i_8) /\\ (i_1<=i_9) /\\ (0<=i_0) /\\ (i_8<=i_0) /\\ (i_9<=i_1) /\\ (i_0<=9)",
-                "pattern": "\\E\\E&<=<=<=<=<=<=#1$i#0$i0#1$i#1" },
+                "pattern": "\\E$i$i0$i$i9" },
     "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.0167,
+                                  "verdict": "valid", "time": 0.016,
                                   "steps": 33 } ],
                   "Goal 2/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.0171,
+                                  "verdict": "valid", "time": 0.0161,
                                   "steps": 33 } ] } } ]
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_assigns_part2.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_assigns_part2.json
index 2f0e9f12c125589ccbe9b513e6c1145d72b89497..cb380dd3e39f3d5b41787e5481e2eb7b62264873 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_assigns_part2.json
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_assigns_part2.json
@@ -1,7 +1,7 @@
 [ { "header": "Split", "tactic": "Wp.split", "params": {},
     "select": { "select": "clause-goal",
                 "target": "exists i_0,i_1:int.\n(i_0<=i_148) /\\ (i_1<=i_149) /\\ (0<=i_0) /\\ (i_148<=i_0) /\\ (i_149<=i_1)\n/\\ (i_0<=9)",
-                "pattern": "\\E\\E&<=<=<=<=<=<=#1$i#0$i0#1$i#1" },
+                "pattern": "\\E$i$i0$i$i9" },
     "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0",
                                   "verdict": "valid", "time": 0.011,
                                   "steps": 16 } ],
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_loop_assigns_part2.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_loop_assigns_part2.json
index 0f331f4933d265794ca3c72277892cdaeef876be..706eac2712b2643fdff1c6caaea6ca9725f711ad 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_loop_assigns_part2.json
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_loop_assigns_part2.json
@@ -1,10 +1,10 @@
 [ { "header": "Split", "tactic": "Wp.split", "params": {},
     "select": { "select": "clause-goal",
                 "target": "exists i_0,i_1:int.\n(i_0<=i_13) /\\ (i_1<=i_14) /\\ (0<=i_0) /\\ (i_13<=i_0) /\\ (i_14<=i_1)\n/\\ (i_0<=9)",
-                "pattern": "\\E\\E&<=<=<=<=<=<=#1$i#0$i0#1$i#1" },
+                "pattern": "\\E$i$i0$i$i9" },
     "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.0196,
+                                  "verdict": "valid", "time": 0.0209,
                                   "steps": 39 } ],
                   "Goal 2/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.0223,
+                                  "verdict": "valid", "time": 0.0184,
                                   "steps": 39 } ] } } ]
diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_loop_assigns_part3.json b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_loop_assigns_part3.json
index 9fc6a77f392331e6771b07d65d55ebfb62b84ae8..d035bcd5046d5abb9450a6bd66795f980f87369f 100644
--- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_loop_assigns_part3.json
+++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.1.session/script/init_t2_v3_loop_assigns_part3.json
@@ -1,10 +1,10 @@
 [ { "header": "Split", "tactic": "Wp.split", "params": {},
     "select": { "select": "clause-goal",
                 "target": "exists i_0,i_1:int.\n(i_0<=i_4) /\\ (i_1<=i_6) /\\ (0<=i_0) /\\ (i_4<=i_0) /\\ (i_6<=i_1) /\\ (i_0<=9)",
-                "pattern": "\\E\\E&<=<=<=<=<=<=#1$i#0$i0#1$i#1" },
+                "pattern": "\\E$i$i0$i$i9" },
     "children": { "Goal 1/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.0152,
+                                  "verdict": "valid", "time": 0.0146,
                                   "steps": 27 } ],
                   "Goal 2/2": [ { "prover": "Alt-Ergo:2.2.0",
-                                  "verdict": "valid", "time": 0.0151,
+                                  "verdict": "valid", "time": 0.0143,
                                   "steps": 27 } ] } } ]
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 e23e6bc5d4aff76c266dee07139f818107c37582..1d6848a4d68a002e1f9c3d7f1c97f24a81b7b276 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
@@ -29,9 +29,10 @@
  Functions                 WP     Alt-Ergo  Total   Success
   job                      20        -       20       100%
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'job':
+[wp] tests/wp_typed/user_injector.i:58: Warning: 
+  Memory model hypotheses for function 'job':
   /*@
-     behavior typed:
+     behavior wp_typed:
        requires
          \separated(
            error, (int *)service_id + (..), (int *)service_result + (..), &seq,
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 de2aed2143a8819fa642f3ed08d01a4bb5909063..45930d0ce8482ad9124ac93339df0a01133e083e 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
@@ -25,9 +25,10 @@
  Functions                 WP     Alt-Ergo  Total   Success
   job                      16        -       16       100%
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'job':
+[wp] tests/wp_typed/user_injector.i:58: Warning: 
+  Memory model hypotheses for function 'job':
   /*@
-     behavior typed_ref:
+     behavior wp_typed_ref:
        requires
          \separated(
            error, (int *)service_id + (..), (int *)service_result + (..), &seq,
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 7bafc3fee380c48558dd637ab19ee0e5b5cb2e5f..157e4dabbba94a0d4d62ed6c5d874e74dab511ca 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
@@ -16,9 +16,10 @@
   swap                      3        -        3       100%
   main                      3        -        3       100%
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'swap':
+[wp] tests/wp_typed/user_swap.i:13: Warning: 
+  Memory model hypotheses for function 'swap':
   /*@
-     behavior typed_ref:
+     behavior wp_typed_ref:
        requires \separated(a, b);
        requires \valid(a);
        requires \valid(b);
diff --git a/src/plugins/wp/tests/wp_typed/user_string.i b/src/plugins/wp/tests/wp_typed/user_string.i
index ccadee77578d841643733fd8ebae1cc3bee7d6ce..228942a2a3778ab4f79800bcb2cca303f5504707 100644
--- a/src/plugins/wp/tests/wp_typed/user_string.i
+++ b/src/plugins/wp/tests/wp_typed/user_string.i
@@ -22,7 +22,7 @@
    assigns \nothing;
    ensures \exists integer i; Length_of_str_is(s,i) && \result == i;
  @*/
-int strlen(const char *s) {
+long long strlen(const char *s) {
   const char *ss = s;
   /*@
       loop invariant BASE: \base_addr(s) == \base_addr(ss) ;
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 c2a4c441ca7fe3bbfdd1592fa8fd9711f9f2b6d3..73c458738b62461d77a78f2dac5d0c315e00318f 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
@@ -68,25 +68,28 @@ Assume {
 Prove: P_OBS(x_2, x_3, x_4).
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'implicit':
+[wp] tests/wp_usage/caveat.i:17: Warning: 
+  Memory model hypotheses for function 'implicit':
   /*@
-     behavior typed_caveat:
+     behavior wp_typed_caveat:
        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':
+[wp] tests/wp_usage/caveat.i:32: Warning: 
+  Memory model hypotheses for function 'explicit':
   /*@
-     behavior typed_caveat:
+     behavior wp_typed_caveat:
        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':
+[wp] tests/wp_usage/caveat.i:47: Warning: 
+  Memory model hypotheses for function 'observer':
   /*@
-     behavior typed_caveat:
+     behavior wp_typed_caveat:
        requires \separated(a, r);
        requires \valid(a);
        requires \valid(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 0a50a6a8eba7bb11d114ffc897e4783e9df1df6a..ed02e9b1d95a08a38d8c65b000fd9499fb34e97e 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/caveat2.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle/caveat2.res.oracle
@@ -97,9 +97,10 @@ Effect at line 25
 Prove: true.
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'job':
+[wp] tests/wp_usage/caveat2.i:17: Warning: 
+  Memory model hypotheses for function 'job':
   /*@
-     behavior typed_caveat:
+     behavior wp_typed_caveat:
        requires \separated(p, b + (..));
        requires \valid(b + (..));
        requires \valid(p);
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 7b8dd0b27ee585634560b8ed91daef539e2e0c23..4bef898fb7366088610c08bfd2933aa45bc01fd4 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
@@ -8,59 +8,59 @@
 
 Goal Post-condition (file caveat_range.i, line 12) in 'reset':
 Let a = global(G_p_22).
-Let a_1 = havoc(Mint_undef_0, Mint_0, shift_S(a, 0), 20).
+Let a_1 = havoc(Mint_undef_0, Mint_0, shift_S1_S(a, 0), 20).
 Assume {
   Type: is_sint32(i_1).
   (* Goal *)
   When: (0 <= i) /\ (i <= 9).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
-      (a_1[shiftfield_F1_S_g(shift_S(a, i_2))] = 2))).
+      (a_1[shiftfield_F1_S_g(shift_S1_S(a, i_2))] = 2))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
-      (a_1[shiftfield_F1_S_f(shift_S(a, i_2))] = 1))).
+      (a_1[shiftfield_F1_S_f(shift_S1_S(a, i_2))] = 1))).
   (* Invariant *)
   Have: (0 <= i_1) /\ (i_1 <= 10).
   (* Else *)
   Have: 10 <= i_1.
 }
-Prove: a_1[shiftfield_F1_S_f(shift_S(a, i))] = 1.
+Prove: a_1[shiftfield_F1_S_f(shift_S1_S(a, i))] = 1.
 
 ------------------------------------------------------------
 
 Goal Post-condition (file caveat_range.i, line 13) in 'reset':
 Let a = global(G_p_22).
-Let a_1 = havoc(Mint_undef_0, Mint_0, shift_S(a, 0), 20).
+Let a_1 = havoc(Mint_undef_0, Mint_0, shift_S1_S(a, 0), 20).
 Assume {
   Type: is_sint32(i_1).
   (* Goal *)
   When: (0 <= i) /\ (i <= 9).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
-      (a_1[shiftfield_F1_S_g(shift_S(a, i_2))] = 2))).
+      (a_1[shiftfield_F1_S_g(shift_S1_S(a, i_2))] = 2))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
-      (a_1[shiftfield_F1_S_f(shift_S(a, i_2))] = 1))).
+      (a_1[shiftfield_F1_S_f(shift_S1_S(a, i_2))] = 1))).
   (* Invariant *)
   Have: (0 <= i_1) /\ (i_1 <= 10).
   (* Else *)
   Have: 10 <= i_1.
 }
-Prove: a_1[shiftfield_F1_S_g(shift_S(a, i))] = 2.
+Prove: a_1[shiftfield_F1_S_g(shift_S1_S(a, i))] = 2.
 
 ------------------------------------------------------------
 
 Goal Preservation of Invariant (file caveat_range.i, line 19):
 Let a = global(G_p_22).
-Let a_1 = havoc(Mint_undef_0, Mint_0, shift_S(a, 0), 20).
+Let a_1 = havoc(Mint_undef_0, Mint_0, shift_S1_S(a, 0), 20).
 Assume {
   Type: is_sint32(i) /\ is_sint32(1 + i).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_1[shiftfield_F1_S_g(shift_S(a, i_1))] = 2))).
+      (a_1[shiftfield_F1_S_g(shift_S1_S(a, i_1))] = 2))).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (a_1[shiftfield_F1_S_f(shift_S(a, i_1))] = 1))).
+      (a_1[shiftfield_F1_S_f(shift_S1_S(a, i_1))] = 1))).
   (* Invariant *)
   Have: (0 <= i) /\ (i <= 10).
   (* Then *)
@@ -77,24 +77,24 @@ Prove: true.
 
 Goal Preservation of Invariant (file caveat_range.i, line 20):
 Let a = global(G_p_22).
-Let a_1 = havoc(Mint_undef_0, Mint_0, shift_S(a, 0), 20).
+Let a_1 = havoc(Mint_undef_0, Mint_0, shift_S1_S(a, 0), 20).
 Assume {
   Type: is_sint32(i) /\ is_sint32(1 + i).
   (* Goal *)
   When: (0 <= i_1) /\ (i_1 <= i).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_1[shiftfield_F1_S_g(shift_S(a, i_2))] = 2))).
+      (a_1[shiftfield_F1_S_g(shift_S1_S(a, i_2))] = 2))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_1[shiftfield_F1_S_f(shift_S(a, i_2))] = 1))).
+      (a_1[shiftfield_F1_S_f(shift_S1_S(a, i_2))] = 1))).
   (* Invariant *)
   Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
 }
-Prove: a_1[shiftfield_F1_S_f(shift_S(a, i)) <- 1]
-         [shiftfield_F1_S_f(shift_S(a, i_1))] = 1.
+Prove: a_1[shiftfield_F1_S_f(shift_S1_S(a, i)) <- 1]
+         [shiftfield_F1_S_f(shift_S1_S(a, i_1))] = 1.
 
 ------------------------------------------------------------
 
@@ -105,25 +105,25 @@ Prove: true.
 
 Goal Preservation of Invariant (file caveat_range.i, line 21):
 Let a = global(G_p_22).
-Let a_1 = havoc(Mint_undef_0, Mint_0, shift_S(a, 0), 20).
-Let a_2 = shift_S(a, i).
+Let a_1 = havoc(Mint_undef_0, Mint_0, shift_S1_S(a, 0), 20).
+Let a_2 = shift_S1_S(a, i).
 Assume {
   Type: is_sint32(i) /\ is_sint32(1 + i).
   (* Goal *)
   When: (0 <= i_1) /\ (i_1 <= i).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_1[shiftfield_F1_S_g(shift_S(a, i_2))] = 2))).
+      (a_1[shiftfield_F1_S_g(shift_S1_S(a, i_2))] = 2))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_1[shiftfield_F1_S_f(shift_S(a, i_2))] = 1))).
+      (a_1[shiftfield_F1_S_f(shift_S1_S(a, i_2))] = 1))).
   (* Invariant *)
   Have: (0 <= i) /\ (i <= 10).
   (* Then *)
   Have: i <= 9.
 }
 Prove: a_1[shiftfield_F1_S_f(a_2) <- 1][shiftfield_F1_S_g(a_2) <- 2]
-         [shiftfield_F1_S_g(shift_S(a, i_1))] = 2.
+         [shiftfield_F1_S_g(shift_S1_S(a, i_1))] = 2.
 
 ------------------------------------------------------------
 
@@ -154,7 +154,8 @@ Effect at line 24
 Prove: true.
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'reset':
-  /*@ behavior typed_caveat:
+[wp] tests/wp_usage/caveat_range.i:16: Warning: 
+  Memory model hypotheses for function 'reset':
+  /*@ behavior wp_typed_caveat:
         requires \valid(p + (..)); */
   void reset(struct S *p);
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 d1dd69d4cce0ad1ffca1a1e9eee666fb3c6a351a..c82a670ced2202843b939c38001b04227286c093 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
@@ -19,7 +19,8 @@ Goal Instance of 'Pre-condition (file global.c, line 14) in 'foo'' in 'main' at
 Prove: true.
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'foo':
-  /*@ behavior typed:
+[wp] tests/wp_usage/global.c:16: Warning: 
+  Memory model hypotheses for function 'foo':
+  /*@ behavior wp_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 841ffa672f58f242a9ffa6c7141c7a376fac34f9..feea5d14acfe602ffc7b5aff2210b33ed744fcce 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
@@ -19,8 +19,11 @@ Goal Instance of 'Pre-condition (file global.c, line 14) in 'foo'' in 'main' at
 Prove: true.
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'foo':
-  /*@ behavior typed_ref:
-        requires \separated(a, &GLOBAL);
-        requires \valid(a); */
+[wp] tests/wp_usage/global.c:16: Warning: 
+  Memory model hypotheses for function 'foo':
+  /*@
+     behavior wp_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.1.res.oracle b/src/plugins/wp/tests/wp_usage/oracle/issue-189-bis.1.res.oracle
index 49a6eb1832fc02446f5bd11ba62067b22d25e98e..6305bfeb4e613f28efcb889be1579d9b6d77aa1d 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
@@ -167,9 +167,10 @@ Effect at line 59
 Prove: true.
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'memcpy_context_vars':
+[wp] tests/wp_usage/issue-189-bis.i:48: Warning: 
+  Memory model hypotheses for function 'memcpy_context_vars':
   /*@
-     behavior typed:
+     behavior wp_typed:
        requires \separated(src, dst);
        requires \valid(dst);
        requires \valid(src);
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 20ae799412b3a1868cb48c3d1d887014cfe9c094..d99cc89de9e2773a2eb1e489e0fbe1142f0cb55d 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
@@ -22,9 +22,10 @@ Effect at line 17
 Prove: true.
 
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'f':
+[wp] tests/wp_usage/issue-189.i:16: Warning: 
+  Memory model hypotheses for function 'f':
   /*@
-     behavior typed_caveat:
+     behavior wp_typed_caveat:
        requires \separated(ptr, src);
        requires \valid(ptr);
      */
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
index bf8b9be6b7764394a9f814261dfb77ea6d813dbe..0992229d6ac4be1ca7082c62607401811a0711a8 100644
--- 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
@@ -17,3 +17,8 @@ Goal Pre-condition (file ref-usage-lemmas.i, line 30) in 'main':
 Prove: true.
 
 ------------------------------------------------------------
+[wp] tests/wp_usage/ref-usage-lemmas.i:26: Warning: 
+  Memory model hypotheses for function 'foo':
+  /*@ behavior wp_typed:
+        requires \separated(x, &b); */
+  void foo(int *x);
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 d1e9944cf8bb66c1f1085a1d2716b40e9358e185..d70b5a49d866a74412c427fba0a990efc124921b 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
@@ -20,9 +20,10 @@
  Functions                 WP     Alt-Ergo  Total   Success
   job                       6        3        9       100%
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'job':
+[wp] tests/wp_usage/caveat2.i:17: Warning: 
+  Memory model hypotheses for function 'job':
   /*@
-     behavior typed_caveat:
+     behavior wp_typed_caveat:
        requires \separated(p, b + (..));
        requires \valid(b + (..));
        requires \valid(p);
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 6c4b5a892b5731439e828fb6a96476fc1c17a9c2..633bbedbeec19b9129f8d8dad457fb20e65df5cf 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
@@ -22,7 +22,8 @@
  Functions                 WP     Alt-Ergo  Total   Success
   reset                     7        5       12       100%
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'reset':
-  /*@ behavior typed_caveat:
+[wp] tests/wp_usage/caveat_range.i:16: Warning: 
+  Memory model hypotheses for function 'reset':
+  /*@ behavior wp_typed_caveat:
         requires \valid(p + (..)); */
   void reset(struct S *p);
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 a51a55e4fdf293716eb461ae0a728a45f9337fe1..9d2df71aa3fc7108076b5bd9e5573f5eefa37202 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
@@ -20,9 +20,10 @@
  Functions                 WP     Alt-Ergo  Total   Success
   memcpy_context_vars       7        3       10       100%
 ------------------------------------------------------------
-[wp] Warning: Memory model hypotheses for function 'memcpy_context_vars':
+[wp] tests/wp_usage/issue-189-bis.i:48: Warning: 
+  Memory model hypotheses for function 'memcpy_context_vars':
   /*@
-     behavior typed:
+     behavior wp_typed:
        requires \separated(src, dst);
        requires \valid(dst);
        requires \valid(src);
diff --git a/src/plugins/wp/tests/wp_usage/save_load.i b/src/plugins/wp/tests/wp_usage/save_load.i
index 8e5b245ddd4a8b4f520dc04b340b2fa169125ba1..498b42d3655bea34c0fb2e674ccb919baa19a6f1 100644
--- a/src/plugins/wp/tests/wp_usage/save_load.i
+++ b/src/plugins/wp/tests/wp_usage/save_load.i
@@ -1,6 +1,14 @@
 /* run.config
+<<<<<<< HEAD
    EXECNOW: LOG save_load.sav.res LOG save_load.sav.err BIN @PTEST_NAME@.sav @frama-c@ -wp -wp-warn-key pedantic-assigns=inactive -wp-print -wp-prover none -save @PTEST_NAME@.sav > @PTEST_NAME@.sav.res 2> @PTEST_NAME@.sav.err
    CMD: @frama-c@ -load %{dep:@PTEST_NAME@.sav} @OPTIONS@ -wp-warn-key pedantic-assigns=inactive
+||||||| ac7807782d
+   EXECNOW: LOG save_load.sav.res LOG save_load.sav.err BIN @PTEST_NAME@.sav @frama-c@ -no-autoload-plugins -load-module wp -wp-share ./share -wp -wp-print -wp-prover none @PTEST_FILE@ -save @PTEST_DIR@/@PTEST_NAME@.sav > @PTEST_DIR@/result/@PTEST_NAME@.sav.res 2> @PTEST_DIR@/result/@PTEST_NAME@.sav.err
+   CMD: @frama-c@ -no-autoload-plugins -load-module wp -load @PTEST_DIR@/@PTEST_NAME@.sav
+=======
+   EXECNOW: LOG save_load.sav.res LOG save_load.sav.err BIN @PTEST_NAME@.sav @frama-c@ -no-autoload-plugins -load-module wp -wp-warn-key pedantic-assigns=inactive -wp-share ./share -wp -wp-print -wp-prover none @PTEST_FILE@ -save @PTEST_DIR@/@PTEST_NAME@.sav > @PTEST_DIR@/result/@PTEST_NAME@.sav.res 2> @PTEST_DIR@/result/@PTEST_NAME@.sav.err
+   CMD: @frama-c@ -no-autoload-plugins -load-module wp -load @PTEST_DIR@/@PTEST_NAME@.sav -wp-warn-key pedantic-assigns=inactive
+>>>>>>> origin/master
    OPT: -print
    OPT: -wp -wp-prover none -wp-print
 */
diff --git a/src/plugins/wp/wp.ml b/src/plugins/wp/wp.ml
index b98ab116339ab6942898142a42e1dd8ee1e3e8fd..3e23f8723a39e02c34edb5d4ee493180a0c0d261 100644
--- a/src/plugins/wp/wp.ml
+++ b/src/plugins/wp/wp.ml
@@ -81,3 +81,4 @@ module WpStrategy = WpStrategy
 module Why3Provers = Why3Provers
 module ProverWhy3 = ProverWhy3
 module Cache = Cache
+module WpTarget = WpTarget
diff --git a/src/plugins/wp/wpPropId.ml b/src/plugins/wp/wpPropId.ml
index 441d8cbfb9a77ad409cac7eaec0ee71afb1318db..a95b4a864909dffb1047d8539b10948a51d73d00 100644
--- a/src/plugins/wp/wpPropId.ml
+++ b/src/plugins/wp/wpPropId.ml
@@ -121,12 +121,12 @@ let mk_var_pos_id    kf s ca = mk_prop PKVarPos  (mk_annot_id kf s ca)
 
 let mk_loop_from_id kf s ca from =
   let id = Property.ip_of_from kf (Kstmt s) (Property.Id_loop ca) from in
-  mk_prop PKPropLoop (Extlib.the id)
+  mk_prop PKPropLoop (Option.get id)
 
 let mk_bhv_from_id kf ki a bhv from =
   let a = Datatype.String.Set.of_list a in
   let id = Property.ip_of_from kf ki (Property.Id_contract (a,bhv)) from in
-  mk_prop PKProp (Extlib.the id)
+  mk_prop PKProp (Option.get id)
 
 let get_kind_for_tk kf tkind = match tkind with
   | Normal ->
@@ -138,7 +138,7 @@ let mk_fct_from_id kf bhv tkind from =
   let contract_info = Property.Id_contract(Datatype.String.Set.empty,bhv) in
   let id = Property.ip_of_from kf Kglobal contract_info from in
   let kind = get_kind_for_tk kf tkind in
-  mk_prop kind (Extlib.the id)
+  mk_prop kind (Option.get id)
 
 let mk_disj_bhv_id (kf,ki,active,disj)  =
   mk_prop PKProp (Property.ip_of_disjoint kf ki active disj)
@@ -153,18 +153,18 @@ let mk_stmt_assigns_id kf s active b a =
   let active = Datatype.String.Set.of_list active in
   let b = Property.Id_contract (active,b) in
   let p = Property.ip_of_assigns kf (Kstmt s) b (Writes a) in
-  Extlib.opt_map (mk_prop PKProp) p
+  Option.map (mk_prop PKProp) p
 
 let mk_loop_assigns_id kf s ca a =
   let ca = Property.Id_loop ca in
   let p = Property.ip_of_assigns kf (Kstmt s) ca (Writes a) in
-  Extlib.opt_map (mk_prop PKPropLoop) p
+  Option.map (mk_prop PKPropLoop) p
 
 let mk_fct_assigns_id kf b tkind a =
   let b = Property.Id_contract(Datatype.String.Set.empty,b) in
   let kind = get_kind_for_tk kf tkind in
   let p = Property.ip_of_assigns kf Kglobal b (Writes a) in
-  Extlib.opt_map (mk_prop kind) p
+  Option.map (mk_prop kind) p
 
 let mk_pre_id kf ki b p =
   mk_prop PKProp (Property.ip_of_requires kf ki b p)
@@ -418,7 +418,7 @@ struct
         (** remove name of callee kernel function given by get_ip *)
         let ip_string = get_ip pre in
         let ip_string =
-          Extlib.opt_conv ip_string
+          Option.value ~default:ip_string
             (Extlib.string_del_prefix
                ((Kernel_function.get_name callee_kf)^"_")
                ip_string)
@@ -521,6 +521,22 @@ let user_prop_names p =
   | IPGlobalInvariant _
   | IPOther _ -> []
 
+let user_bhv_names p =
+  let open Property in
+  let fors = match p with
+    | Property.IPCodeAnnot { ica_ca } ->
+        let fors = match ica_ca.annot_content with
+          | Cil_types.AAssert (fors, _)
+          | Cil_types.AStmtSpec (fors, _)
+          | Cil_types.AInvariant (fors, _, _)
+          | Cil_types.AAssigns (fors, _)
+          | Cil_types.AAllocation (fors, _)
+          | Cil_types.AExtended (fors, _, _) -> fors
+          | _ -> []
+        in fors
+    | _ -> []
+  in Option.fold ~none:fors ~some:(fun b -> b.b_name :: fors) (get_behavior p)
+
 let string_of_termination_kind = function
     Normal -> "post"
   | Exits -> "exits"
@@ -772,8 +788,7 @@ let select_default pid =
   let names = user_prop_pid pid in
   not (List.mem "no_wp" names)
 
-let select_by_name asked_names pid =
-  let names = user_prop_pid pid in
+let are_selected_names asked names =
   if List.mem "no_wp" names then false
   else
     let is_minus s = try s.[0] = '-' with _ -> false in
@@ -791,10 +806,16 @@ let select_by_name asked_names pid =
                then a && (not (eval ()))
                else a || (eval ()))
     in
-    match List.fold_left eval None asked_names with
+    match List.fold_left eval None asked with
     | Some false -> false
     | _ -> true
 
+
+let select_by_name asked_names pid =
+  let names = user_prop_pid pid in
+  are_selected_names asked_names names
+
+
 let select_call_pre s_call asked_pre pid =
   match pid.p_kind with
   | PKPre (_, p_stmt, p_prop) ->
diff --git a/src/plugins/wp/wpPropId.mli b/src/plugins/wp/wpPropId.mli
index c0020de8a10f437c2e9dabf26dd57814e7e60cfc..29098180bbefd8e1aff6209038722fc25eb84660 100644
--- a/src/plugins/wp/wpPropId.mli
+++ b/src/plugins/wp/wpPropId.mli
@@ -80,6 +80,12 @@ val get_propid : prop_id -> string (** Unique identifier of [prop_id] *)
 val get_legacy : prop_id -> string (** Unique legacy identifier of [prop_id] *)
 val pp_propid : Format.formatter -> prop_id -> unit (** Print unique id of [prop_id] *)
 
+val user_bhv_names: Property.identified_property -> string list
+val user_prop_names: Property.identified_property -> string list
+val are_selected_names: string list -> string list -> bool
+(** [are_selected_names asked names] checks if [names] of a property are
+    selected according to [asked] names. *)
+
 type prop_kind =
   | PKTactic      (** tactical sub-goal *)
   | PKCheck       (** internal check *)
diff --git a/src/plugins/wp/wpRTE.ml b/src/plugins/wp/wpRTE.ml
index 74e6fdd198f0571fc00914d254d51eacbe7e330e..a6bc0690c67b02c398b4a689d52472dda12c11fb 100644
--- a/src/plugins/wp/wpRTE.ml
+++ b/src/plugins/wp/wpRTE.ml
@@ -102,6 +102,9 @@ let generate model kf =
   List.iter (configure ~update ~generate:true kf cint) generator ;
   if !update then !Db.RteGen.annotate_kf kf
 
+let generate_all model =
+  Wp_parameters.iter_kf (generate model)
+
 let missing_guards model kf =
   let update = ref false in
   let cint = WpContext.on_context (model,WpContext.Kf kf) Cint.current () in
diff --git a/src/plugins/wp/wpRTE.mli b/src/plugins/wp/wpRTE.mli
index 53b0fc8eb4bedfaa029cf571b2a7bb01f75ea752..86ce77c668afd0e0d5c608baa35653d5e0b6c809 100644
--- a/src/plugins/wp/wpRTE.mli
+++ b/src/plugins/wp/wpRTE.mli
@@ -24,6 +24,9 @@
     for the given function and model. *)
 val generate : WpContext.model -> Kernel_function.t -> unit
 
+(** Invoke RTE on all selected functions *)
+val generate_all : WpContext.model -> unit
+
 (** Returns [true] if RTE annotations should be generated for
     the given function and model (and are not generated yet). *)
 val missing_guards : WpContext.model -> Kernel_function.t -> bool
diff --git a/src/plugins/wp/wpReport.ml b/src/plugins/wp/wpReport.ml
index 6bdd9397a04e55018e96370fa42afd2ce900c248..d555742566b2550c7115616c56d79300cb7f37fa 100644
--- a/src/plugins/wp/wpReport.ml
+++ b/src/plugins/wp/wpReport.ml
@@ -493,7 +493,7 @@ let iter_stat ?first ?sep ?last ~from start next=
           | Some app -> app v
         in
         let next app =
-          let item = (Extlib.the !items) in
+          let item = (Option.get !items) in
           apply item app;
           items := next item
         in
diff --git a/src/plugins/wp/wpStrategy.ml b/src/plugins/wp/wpStrategy.ml
index 96f589da256b9329369a41a49b171e172f687230..7026d2402035f301bee12cf740d9b92663f712f0 100644
--- a/src/plugins/wp/wpStrategy.ml
+++ b/src/plugins/wp/wpStrategy.ml
@@ -318,6 +318,11 @@ let add_prop_dead_call kf stmt acc_posts acc_exits =
 
 (* -------------------------------------------------------------------------- *)
 
+let from_has_deps = function _, FromAny -> false | _, From _ -> true
+let assigns_has_deps = function
+  | WritesAny -> false
+  | Writes l -> List.exists from_has_deps l
+
 let add_assigns acc kind id a_desc =
   let take_assigns () =
     debug "take %a %a" WpPropId.pp_propid id WpPropId.pp_assigns_desc a_desc;
@@ -334,6 +339,11 @@ let add_assigns acc kind id a_desc =
     | Agoal -> true, {info with a_goal = take_assigns ()}
     | _ -> Wp_parameters.fatal "Assigns prop can only be Hyp or Goal"
   in let acc = { acc with info = info } in
+  if goal && assigns_has_deps a_desc.a_assigns then
+    Wp_parameters.warning
+      ~once: true ~current:false ~wkey:AssignsCompleteness.wkey_pedantic
+      "WP uses \\from to generate precise hypotheses, however their proof is \
+       not supported yet" ;
   if goal then { acc with has_asgn_goal = true} else acc
 
 let add_assigns_any acc kind asgn =
diff --git a/src/plugins/wp/wpTarget.ml b/src/plugins/wp/wpTarget.ml
new file mode 100644
index 0000000000000000000000000000000000000000..470ab2a09821a0f3f19260703243b2b0c2c70e73
--- /dev/null
+++ b/src/plugins/wp/wpTarget.ml
@@ -0,0 +1,170 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  This file is part of WP plug-in of Frama-C.                           *)
+(*                                                                        *)
+(*  Copyright (C) 2007-2020                                               *)
+(*    CEA (Commissariat a l'energie atomique et aux energies              *)
+(*         alternatives)                                                  *)
+(*                                                                        *)
+(*  you can redistribute it and/or modify it under the terms of the GNU   *)
+(*  Lesser General Public License as published by the Free Software       *)
+(*  Foundation, version 2.1.                                              *)
+(*                                                                        *)
+(*  It is distributed in the hope that it will be useful,                 *)
+(*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *)
+(*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *)
+(*  GNU Lesser General Public License for more details.                   *)
+(*                                                                        *)
+(*  See the GNU Lesser General Public License version 2.1                 *)
+(*  for more details (enclosed in the file licenses/LGPLv2.1).            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open Cil_types
+
+module Fct = Cil_datatype.Kf.Set
+
+module TargetKfs =
+  State_builder.Set_ref
+    (Fct)
+    (struct
+      let dependencies = [ Ast.self ]
+      let name = "WpTarget.TargetKfs"
+    end)
+
+let get_called_stmt stmt =
+  match stmt.skind with
+  | Instr (Call(_, fct, _, _)) ->
+      begin match Kernel_function.get_called fct with
+        | Some kf -> [kf]
+        | None -> Option.value ~default:[]
+                    (Option.map snd (Dyncall.get stmt))
+      end
+  | Instr (Local_init (_,ConsInit(vi,_,_),_)) -> [ Globals.Functions.get vi ]
+  | _ -> []
+
+module Callees =
+  State_builder.Hashtbl
+    (Cil_datatype.Kf.Hashtbl)
+    (Fct)
+    (struct
+      let dependencies = [Ast.self]
+      let name = "WpTarget.Callees"
+      let size = 17
+    end)
+
+(** Note: we add the kf received in parameter in the set only if it has a
+    definition (and thus if it does not have one, we add nothing as it has
+    no visible callee).
+
+    This prevent to warn on prototypes that have a contract but are unused. If
+    the function is used, it will be added to the set via its caller(s) if they
+    are under verification.
+*)
+let with_callees kf =
+  try
+    let stmts = (Kernel_function.get_definition kf).sallstmts in
+    let fold s stmt =
+      List.fold_left (fun s kf -> Fct.add kf s) s (get_called_stmt stmt)
+    in
+    List.fold_left fold (Fct.singleton kf) stmts
+  with Kernel_function.No_Definition -> Fct.empty
+
+let with_callees = Callees.memo with_callees
+
+let add_with_callees kf =
+  Fct.iter TargetKfs.add (with_callees kf)
+
+exception Found
+
+let check_properties behaviors props kf =
+  let open Property in
+  let exists_selected_behavior l =
+    behaviors = [] || List.exists (fun b -> List.mem b behaviors) l
+  in
+  let check_ip ip =
+    if exists_selected_behavior (WpPropId.user_bhv_names ip) then
+      let names = WpPropId.user_prop_names ip in
+      if props = [] || WpPropId.are_selected_names props names then raise Found
+  in
+  let check_bhv_requires kf kinstr bv =
+    List.iter (fun p -> check_ip (ip_of_requires kf kinstr bv p)) bv.b_requires
+  in
+  let check_bhv_ensures kf kinstr bv =
+    List.iter (fun p -> check_ip (ip_of_ensures kf kinstr bv p)) bv.b_post_cond
+  in
+  let opt_check = function None -> () | Some p -> check_ip p in
+  let check_bhv_assigns kf kinstr bv =
+    opt_check (ip_assigns_of_behavior kf kinstr ~active:[] bv)
+  in
+  let check_bhv_allocation kf kinstr bv =
+    opt_check (ip_allocation_of_behavior kf kinstr ~active:[] bv)
+  in
+  let check_complete_disjoint kf kinstr =
+    try
+      let spec = Annotations.funspec kf in
+      let comp = ip_complete_of_spec kf kinstr ~active:[] spec in
+      let disj = ip_disjoint_of_spec kf kinstr ~active:[] spec in
+      List.iter check_ip comp ;
+      List.iter check_ip disj ;
+    with Annotations.No_funspec _ -> ()
+  in
+  let check_bhv kf kinstr bv =
+    check_bhv_assigns kf kinstr bv ;
+    check_bhv_allocation kf kinstr bv ;
+    check_bhv_ensures kf kinstr bv ;
+    check_complete_disjoint kf kinstr
+  in
+  let check_code () =
+    let stmts =
+      try (Kernel_function.get_definition kf).sallstmts
+      with Kernel_function.No_Definition -> []
+    in
+    let check stmt _ ca =
+      List.iter check_ip (ip_of_code_annot kf stmt ca)
+    in
+    let check_call stmt =
+      let check_callee kf =
+        let kf_behaviors = Annotations.behaviors kf in
+        List.iter (check_bhv_requires kf Kglobal) kf_behaviors
+      in
+      List.iter check_callee (get_called_stmt stmt)
+    in
+    let check_stmt stmt =
+      check_call stmt ;
+      Annotations.iter_code_annot (check stmt) stmt
+    in
+    List.iter check_stmt stmts
+  in
+  let check_funbhv _ bv = check_bhv kf Kglobal bv in
+  Annotations.iter_behaviors check_funbhv kf ;
+  check_code ()
+
+let add_with_behaviors behaviors props kf =
+  if behaviors = [] && props = [] then
+    add_with_callees kf
+  else begin
+    try check_properties behaviors props kf
+    with Found -> add_with_callees kf
+  end
+
+let compute model =
+  let insert_rte kf =
+    if Wp_parameters.RTE.get () then
+      WpRTE.generate model kf
+  in
+  let behaviors = Wp_parameters.Behaviors.get() in
+  let props = Wp_parameters.Properties.get () in
+  let add_kf kf =
+    insert_rte kf ;
+    add_with_behaviors behaviors props kf
+  in
+  Wp_parameters.iter_kf add_kf
+
+let compute model =
+  if not (TargetKfs.is_computed ()) then begin
+    compute model ;
+    TargetKfs.mark_as_computed ()
+  end
+
+let iter = TargetKfs.iter
diff --git a/src/plugins/wp/wpTarget.mli b/src/plugins/wp/wpTarget.mli
new file mode 100644
index 0000000000000000000000000000000000000000..22cc8ce147b8d85376c77e84a550fc1c1af629fa
--- /dev/null
+++ b/src/plugins/wp/wpTarget.mli
@@ -0,0 +1,43 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  This file is part of WP plug-in of Frama-C.                           *)
+(*                                                                        *)
+(*  Copyright (C) 2007-2020                                               *)
+(*    CEA (Commissariat a l'energie atomique et aux energies              *)
+(*         alternatives)                                                  *)
+(*                                                                        *)
+(*  you can redistribute it and/or modify it under the terms of the GNU   *)
+(*  Lesser General Public License as published by the Free Software       *)
+(*  Foundation, version 2.1.                                              *)
+(*                                                                        *)
+(*  It is distributed in the hope that it will be useful,                 *)
+(*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *)
+(*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *)
+(*  GNU Lesser General Public License for more details.                   *)
+(*                                                                        *)
+(*  See the GNU Lesser General Public License version 2.1                 *)
+(*  for more details (enclosed in the file licenses/LGPLv2.1).            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(** This module computes the set of kernel functions that are considered by
+    the command line options transmitted to WP. That is:
+
+    - all functions on which a verification must be tried,
+    - all functions that are called by the previous ones,
+    - including those parameterized via the 'calls' clause.
+
+    It takes in account the options -wp-bhv and -wp-props so that if all
+    functions are initially selected but in fact some of them are filtered out
+    by these options, they are not considered.
+*)
+
+val compute: WpContext.model -> unit
+val iter: (Kernel_function.t -> unit) -> unit
+
+
+val with_callees: Kernel_function.t -> Kernel_function.Set.t
+(** @returns the set composed of the given kernel_function together with its
+    callees. If this function does not have a definition, the empty set is
+    returned.
+*)
diff --git a/src/plugins/wp/wp_parameters.ml b/src/plugins/wp/wp_parameters.ml
index 5e73241073d5cee2ff1cd408f24cd9712c57e1f8..3eda801f373ba0d25e4ad615970b9363c3976ae9 100644
--- a/src/plugins/wp/wp_parameters.ml
+++ b/src/plugins/wp/wp_parameters.ml
@@ -415,9 +415,12 @@ module Split =
 
 let () = Parameter_customize.set_group wp_strategy
 module UnfoldAssigns =
-  False(struct
+  Int(struct
     let option_name = "-wp-unfold-assigns"
-    let help = "Unfold aggregates in assigns."
+    let default = 0
+    let arg_name = "n"
+    let help = "Unfold up to <n> levels of aggregates and arrays in assigns.\n\
+                Value -1 means unlimited depth (default 0)"
   end)
 
 let () = Parameter_customize.set_group wp_strategy
@@ -543,13 +546,6 @@ module Prenex =
     let help = "Normalize nested foralls into prenex-form"
   end)
 
-let () = Parameter_customize.set_group wp_simplifier
-module Bits =
-  True(struct
-    let option_name = "-wp-bits"
-    let help = "Use bit-test simplifications."
-  end)
-
 let () = Parameter_customize.set_group wp_simplifier
 module SimplifyIsCint =
   True(struct
@@ -1065,25 +1061,17 @@ 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 =
+module CheckMemoryContext =
   False
     (struct
-      let option_name = "-wp-check-model-hypotheses"
+      let option_name = "-wp-check-memory-model"
       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
@@ -1239,3 +1227,13 @@ let print_generated ?header file =
     end
 
 (* -------------------------------------------------------------------------- *)
+(* --- Debugging                                                          --- *)
+(* -------------------------------------------------------------------------- *)
+
+let protect e =
+  if debug_atleast 1 then false else
+    match e with
+    | Db.Cancel | Log.AbortError _ | Log.AbortFatal _ -> false
+    | _ -> true
+
+(* -------------------------------------------------------------------------- *)
diff --git a/src/plugins/wp/wp_parameters.mli b/src/plugins/wp/wp_parameters.mli
index a37b5e895a7470f21a738e3c69a5c15dc9566796..c8f5803dd2f37e3e59713d6786841327edcfe1fe 100644
--- a/src/plugins/wp/wp_parameters.mli
+++ b/src/plugins/wp/wp_parameters.mli
@@ -85,11 +85,10 @@ module Clean: Parameter_sig.Bool
 module Filter: Parameter_sig.Bool
 module Parasite: Parameter_sig.Bool
 module Prenex: Parameter_sig.Bool
-module Bits: Parameter_sig.Bool
 module Ground: Parameter_sig.Bool
 module Reduce: Parameter_sig.Bool
 module ExtEqual : Parameter_sig.Bool
-module UnfoldAssigns : Parameter_sig.Bool
+module UnfoldAssigns : Parameter_sig.Int
 module Split: Parameter_sig.Bool
 module SplitMax: Parameter_sig.Int
 module SplitDepth: Parameter_sig.Int
@@ -150,14 +149,12 @@ 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 CheckMemoryContext: 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
@@ -175,3 +172,5 @@ val print_generated: ?header:string -> string -> unit
 (** print the given file if the debugging category
     "print-generated" is set *)
 val cat_print_generated: category
+
+val protect : exn -> bool
diff --git a/src/plugins/wp/wpo.ml b/src/plugins/wp/wpo.ml
index a36b16398193812618864a7ab292f6d1d012b751..e5459e75b894fda2a88fd783408471bef27d773b 100644
--- a/src/plugins/wp/wpo.ml
+++ b/src/plugins/wp/wpo.ml
@@ -190,7 +190,14 @@ struct
 
   let is_trivial g = Conditions.is_trivial g.sequent
 
-  let apply phi g = g.sequent <- phi g.sequent
+  let apply option phi g =
+    try g.sequent <- phi g.sequent
+    with exn when Wp_parameters.protect exn ->
+      Wp_parameters.warning ~current:false ~once:true
+        "Goal simplification aborted (%s):@\n\
+         Exception %S@\n\
+         Re-run with debug level 1+ for details."
+        option (Printexc.to_string exn)
 
   let default_simplifiers = [
     Wp_parameters.SimplifyIsCint.get, Cint.is_cint_simplifier ;
@@ -200,23 +207,23 @@ struct
   let preprocess g =
     if Wp_parameters.Let.get () then
       begin
-        apply Conditions.introduction_eq g ;
+        apply "introcution" Conditions.introduction_eq g ;
         let fold acc (get,solver) = if get () then solver::acc else acc in
         let solvers = List.fold_left fold [] default_simplifiers in
-        apply (Conditions.simplify ~solvers) g ;
+        apply "-wp-simplify-*" (Conditions.simplify ~solvers) g ;
         if Wp_parameters.FilterInit.get ()
-        then apply Conditions.init_filter g ;
+        then apply "-wp-filter-init" Conditions.init_filter g ;
         if Wp_parameters.Prune.get ()
-        then apply (Conditions.pruning ~solvers) g ;
+        then apply "-wp-pruning" (Conditions.pruning ~solvers) g ;
         if Wp_parameters.Filter.get ()
-        then apply Conditions.filter g ;
+        then apply "-wp-filter" Conditions.filter g ;
         if Wp_parameters.Parasite.get ()
-        then apply Conditions.parasite g ;
+        then apply "-wp-parasite" Conditions.parasite g ;
       end
     else
       begin
         if Wp_parameters.Clean.get ()
-        then apply Conditions.clean g ;
+        then apply "-wp-clean" Conditions.clean g ;
       end ;
     if Conditions.is_trivial g.sequent then
       g.sequent <- Conditions.trivial ;
diff --git a/tests/builtins/.gitignore b/tests/builtins/.gitignore
index a2232653a6f719442070e6f515728d7e0a863c46..5de45901ce62a18d26c6309c170b943215b78b67 100644
--- a/tests/builtins/.gitignore
+++ b/tests/builtins/.gitignore
@@ -1 +1 @@
-/oracle_*
\ No newline at end of file
+/oracle_*
diff --git a/tests/builtins/diff_apron b/tests/builtins/diff_apron
index 6f12ff9748e13f38a596443fa799e074e79ca2b5..70280ccca2e510f2efb64c181f50cc4a9d5bea21 100644
--- a/tests/builtins/diff_apron
+++ b/tests/builtins/diff_apron
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
 diff oracle/Longinit_sequencer.res.oracle oracle_apron/Longinit_sequencer.res.oracle
 59,62c59,78
 < [eva] long_init.c:29: Reusing old results for call to subanalyze
@@ -130,6 +131,142 @@ diff oracle/Longinit_sequencer.res.oracle oracle_apron/Longinit_sequencer.res.or
 > [eva] Recording results for subanalyze
 > [eva] Done for function subanalyze
 diff oracle/allocated.0.res.oracle oracle_apron/allocated.0.res.oracle
+||||||| ac7807782d
+diff tests/builtins/oracle/Longinit_sequencer.res.oracle tests/builtins/oracle_apron/Longinit_sequencer.res.oracle
+59,62c59,78
+< [eva] tests/builtins/long_init.c:29: Reusing old results for call to subanalyze
+< [eva] tests/builtins/long_init.c:29: Reusing old results for call to subanalyze
+< [eva] tests/builtins/long_init.c:29: Reusing old results for call to subanalyze
+< [eva] tests/builtins/long_init.c:29: Reusing old results for call to subanalyze
+---
+> [eva] computing for function subanalyze <- analyze <- init_inner <- init_outer <- 
+>                           main.
+>   Called from tests/builtins/long_init.c:29.
+> [eva] Recording results for subanalyze
+> [eva] Done for function subanalyze
+> [eva] computing for function subanalyze <- analyze <- init_inner <- init_outer <- 
+>                           main.
+>   Called from tests/builtins/long_init.c:29.
+> [eva] Recording results for subanalyze
+> [eva] Done for function subanalyze
+> [eva] computing for function subanalyze <- analyze <- init_inner <- init_outer <- 
+>                           main.
+>   Called from tests/builtins/long_init.c:29.
+> [eva] Recording results for subanalyze
+> [eva] Done for function subanalyze
+> [eva] computing for function subanalyze <- analyze <- init_inner <- init_outer <- 
+>                           main.
+>   Called from tests/builtins/long_init.c:29.
+> [eva] Recording results for subanalyze
+> [eva] Done for function subanalyze
+148,149c164,211
+< [eva] tests/builtins/long_init.c:93: Reusing old results for call to analyze
+< [eva] tests/builtins/long_init.c:94: Reusing old results for call to analyze
+---
+> [eva] computing for function analyze <- main.
+>   Called from tests/builtins/long_init.c:93.
+> [eva] computing for function subanalyze <- analyze <- main.
+>   Called from tests/builtins/long_init.c:29.
+> [eva] Recording results for subanalyze
+> [eva] Done for function subanalyze
+> [eva] computing for function subanalyze <- analyze <- main.
+>   Called from tests/builtins/long_init.c:29.
+> [eva] Recording results for subanalyze
+> [eva] Done for function subanalyze
+> [eva] computing for function subanalyze <- analyze <- main.
+>   Called from tests/builtins/long_init.c:29.
+> [eva] Recording results for subanalyze
+> [eva] Done for function subanalyze
+> [eva] computing for function subanalyze <- analyze <- main.
+>   Called from tests/builtins/long_init.c:29.
+> [eva] Recording results for subanalyze
+> [eva] Done for function subanalyze
+> [eva] computing for function subanalyze <- analyze <- main.
+>   Called from tests/builtins/long_init.c:29.
+> [eva] Recording results for subanalyze
+> [eva] Done for function subanalyze
+> [eva] Recording results for analyze
+> [eva] Done for function analyze
+> [eva] computing for function analyze <- main.
+>   Called from tests/builtins/long_init.c:94.
+> [eva] computing for function subanalyze <- analyze <- main.
+>   Called from tests/builtins/long_init.c:29.
+> [eva] Recording results for subanalyze
+> [eva] Done for function subanalyze
+> [eva] computing for function subanalyze <- analyze <- main.
+>   Called from tests/builtins/long_init.c:29.
+> [eva] Recording results for subanalyze
+> [eva] Done for function subanalyze
+> [eva] computing for function subanalyze <- analyze <- main.
+>   Called from tests/builtins/long_init.c:29.
+> [eva] Recording results for subanalyze
+> [eva] Done for function subanalyze
+> [eva] computing for function subanalyze <- analyze <- main.
+>   Called from tests/builtins/long_init.c:29.
+> [eva] Recording results for subanalyze
+> [eva] Done for function subanalyze
+> [eva] computing for function subanalyze <- analyze <- main.
+>   Called from tests/builtins/long_init.c:29.
+> [eva] Recording results for subanalyze
+> [eva] Done for function subanalyze
+> [eva] Recording results for analyze
+> [eva] Done for function analyze
+320c382
+<   tests/builtins/result/Longinit_sequencer.sav
+---
+>   tests/builtins/result_apron/Longinit_sequencer.sav
+411,414c473,488
+< [eva] tests/builtins/long_init2.c:29: Reusing old results for call to subanalyze
+< [eva] tests/builtins/long_init2.c:29: Reusing old results for call to subanalyze
+< [eva] tests/builtins/long_init2.c:29: Reusing old results for call to subanalyze
+< [eva] tests/builtins/long_init2.c:29: Reusing old results for call to subanalyze
+---
+> [eva] computing for function subanalyze <- analyze <- main.
+>   Called from tests/builtins/long_init2.c:29.
+> [eva] Recording results for subanalyze
+> [eva] Done for function subanalyze
+> [eva] computing for function subanalyze <- analyze <- main.
+>   Called from tests/builtins/long_init2.c:29.
+> [eva] Recording results for subanalyze
+> [eva] Done for function subanalyze
+> [eva] computing for function subanalyze <- analyze <- main.
+>   Called from tests/builtins/long_init2.c:29.
+> [eva] Recording results for subanalyze
+> [eva] Done for function subanalyze
+> [eva] computing for function subanalyze <- analyze <- main.
+>   Called from tests/builtins/long_init2.c:29.
+> [eva] Recording results for subanalyze
+> [eva] Done for function subanalyze
+556c630
+<   tests/builtins/result/Longinit_sequencer.sav
+---
+>   tests/builtins/result_apron/Longinit_sequencer.sav
+643,646c717,732
+< [eva] tests/builtins/long_init3.c:29: Reusing old results for call to subanalyze
+< [eva] tests/builtins/long_init3.c:29: Reusing old results for call to subanalyze
+< [eva] tests/builtins/long_init3.c:29: Reusing old results for call to subanalyze
+< [eva] tests/builtins/long_init3.c:29: Reusing old results for call to subanalyze
+---
+> [eva] computing for function subanalyze <- analyze <- main.
+>   Called from tests/builtins/long_init3.c:29.
+> [eva] Recording results for subanalyze
+> [eva] Done for function subanalyze
+> [eva] computing for function subanalyze <- analyze <- main.
+>   Called from tests/builtins/long_init3.c:29.
+> [eva] Recording results for subanalyze
+> [eva] Done for function subanalyze
+> [eva] computing for function subanalyze <- analyze <- main.
+>   Called from tests/builtins/long_init3.c:29.
+> [eva] Recording results for subanalyze
+> [eva] Done for function subanalyze
+> [eva] computing for function subanalyze <- analyze <- main.
+>   Called from tests/builtins/long_init3.c:29.
+> [eva] Recording results for subanalyze
+> [eva] Done for function subanalyze
+diff tests/builtins/oracle/allocated.0.res.oracle tests/builtins/oracle_apron/allocated.0.res.oracle
+=======
+diff tests/builtins/oracle/allocated.0.res.oracle tests/builtins/oracle_apron/allocated.0.res.oracle
+>>>>>>> origin/master
 260a261,263
 > [eva] allocated.c:127: Call to builtin __fc_vla_alloc
 > [eva:malloc] allocated.c:127: 
diff --git a/tests/builtins/diff_bitwise b/tests/builtins/diff_bitwise
index 64d3ec3ca31fdc27f733d14928ba02e946bc39f6..1d0599adc64b3db9143879fa543f8c48fb51d18f 100644
--- a/tests/builtins/diff_bitwise
+++ b/tests/builtins/diff_bitwise
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
 diff oracle/Longinit_sequencer.res.oracle oracle_bitwise/Longinit_sequencer.res.oracle
 320c320
 <   result/Longinit_sequencer.sav
@@ -8,6 +9,20 @@ diff oracle/Longinit_sequencer.res.oracle oracle_bitwise/Longinit_sequencer.res.
 ---
 >   result_bitwise/Longinit_sequencer.sav
 diff oracle/allocated.0.res.oracle oracle_bitwise/allocated.0.res.oracle
+||||||| ac7807782d
+diff tests/builtins/oracle/Longinit_sequencer.res.oracle tests/builtins/oracle_bitwise/Longinit_sequencer.res.oracle
+320c320
+<   tests/builtins/result/Longinit_sequencer.sav
+---
+>   tests/builtins/result_bitwise/Longinit_sequencer.sav
+556c556
+<   tests/builtins/result/Longinit_sequencer.sav
+---
+>   tests/builtins/result_bitwise/Longinit_sequencer.sav
+diff tests/builtins/oracle/allocated.0.res.oracle tests/builtins/oracle_bitwise/allocated.0.res.oracle
+=======
+diff tests/builtins/oracle/allocated.0.res.oracle tests/builtins/oracle_bitwise/allocated.0.res.oracle
+>>>>>>> origin/master
 260a261,263
 > [eva] allocated.c:127: Call to builtin __fc_vla_alloc
 > [eva:malloc] allocated.c:127: 
diff --git a/tests/builtins/diff_equalities b/tests/builtins/diff_equalities
index 8a16517c445ac0d87ddb88eea02614059b9ada3f..05e100d6a0038c446e4844ed7790a7f570699a8a 100644
--- a/tests/builtins/diff_equalities
+++ b/tests/builtins/diff_equalities
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
 diff oracle/Longinit_sequencer.res.oracle oracle_equalities/Longinit_sequencer.res.oracle
 320c320
 <   result/Longinit_sequencer.sav
@@ -8,6 +9,20 @@ diff oracle/Longinit_sequencer.res.oracle oracle_equalities/Longinit_sequencer.r
 ---
 >   result_equalities/Longinit_sequencer.sav
 diff oracle/alloc_weak.res.oracle oracle_equalities/alloc_weak.res.oracle
+||||||| ac7807782d
+diff tests/builtins/oracle/Longinit_sequencer.res.oracle tests/builtins/oracle_equalities/Longinit_sequencer.res.oracle
+320c320
+<   tests/builtins/result/Longinit_sequencer.sav
+---
+>   tests/builtins/result_equalities/Longinit_sequencer.sav
+556c556
+<   tests/builtins/result/Longinit_sequencer.sav
+---
+>   tests/builtins/result_equalities/Longinit_sequencer.sav
+diff tests/builtins/oracle/alloc_weak.res.oracle tests/builtins/oracle_equalities/alloc_weak.res.oracle
+=======
+diff tests/builtins/oracle/alloc_weak.res.oracle tests/builtins/oracle_equalities/alloc_weak.res.oracle
+>>>>>>> origin/master
 36,37d35
 < [eva:alarm] alloc_weak.c:30: Warning: 
 <   accessing uninitialized left-value. assert \initialized(p);
diff --git a/tests/builtins/diff_gauges b/tests/builtins/diff_gauges
index a6d82c55b9dc30cad85badd6e7f5ee8504323a28..a0b7d356ded674f462ef2eedacf7028a0f361db2 100644
--- a/tests/builtins/diff_gauges
+++ b/tests/builtins/diff_gauges
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
 diff oracle/Longinit_sequencer.res.oracle oracle_gauges/Longinit_sequencer.res.oracle
 320c320
 <   result/Longinit_sequencer.sav
@@ -8,6 +9,20 @@ diff oracle/Longinit_sequencer.res.oracle oracle_gauges/Longinit_sequencer.res.o
 ---
 >   result_gauges/Longinit_sequencer.sav
 diff oracle/linked_list.0.res.oracle oracle_gauges/linked_list.0.res.oracle
+||||||| ac7807782d
+diff tests/builtins/oracle/Longinit_sequencer.res.oracle tests/builtins/oracle_gauges/Longinit_sequencer.res.oracle
+320c320
+<   tests/builtins/result/Longinit_sequencer.sav
+---
+>   tests/builtins/result_gauges/Longinit_sequencer.sav
+556c556
+<   tests/builtins/result/Longinit_sequencer.sav
+---
+>   tests/builtins/result_gauges/Longinit_sequencer.sav
+diff tests/builtins/oracle/linked_list.0.res.oracle tests/builtins/oracle_gauges/linked_list.0.res.oracle
+=======
+diff tests/builtins/oracle/linked_list.0.res.oracle tests/builtins/oracle_gauges/linked_list.0.res.oracle
+>>>>>>> origin/master
 1122a1123,1128
 > [eva] computing for function printf_va_1 <- main.
 >   Called from linked_list.c:51.
diff --git a/tests/builtins/diff_octagons b/tests/builtins/diff_octagons
index 4c9c7da3a6d81e3e33d6fc7364ad7ebf99a33f4e..797a12def3f992a2027197cc25c8fe88e65462e9 100644
--- a/tests/builtins/diff_octagons
+++ b/tests/builtins/diff_octagons
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
 diff oracle/Longinit_sequencer.res.oracle oracle_octagons/Longinit_sequencer.res.oracle
 320c320
 <   result/Longinit_sequencer.sav
@@ -8,6 +9,20 @@ diff oracle/Longinit_sequencer.res.oracle oracle_octagons/Longinit_sequencer.res
 ---
 >   result_octagons/Longinit_sequencer.sav
 diff oracle/allocated.0.res.oracle oracle_octagons/allocated.0.res.oracle
+||||||| ac7807782d
+diff tests/builtins/oracle/Longinit_sequencer.res.oracle tests/builtins/oracle_octagons/Longinit_sequencer.res.oracle
+320c320
+<   tests/builtins/result/Longinit_sequencer.sav
+---
+>   tests/builtins/result_octagons/Longinit_sequencer.sav
+556c556
+<   tests/builtins/result/Longinit_sequencer.sav
+---
+>   tests/builtins/result_octagons/Longinit_sequencer.sav
+diff tests/builtins/oracle/allocated.0.res.oracle tests/builtins/oracle_octagons/allocated.0.res.oracle
+=======
+diff tests/builtins/oracle/allocated.0.res.oracle tests/builtins/oracle_octagons/allocated.0.res.oracle
+>>>>>>> origin/master
 273c273
 <   j ∈ [1..2147483647]
 ---
diff --git a/tests/builtins/diff_symblocs b/tests/builtins/diff_symblocs
index 7db32df446de90a102809c3a1964f9d224c88900..4772c73639e671638807abb79ba117f466d7a225 100644
--- a/tests/builtins/diff_symblocs
+++ b/tests/builtins/diff_symblocs
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
 diff oracle/Longinit_sequencer.res.oracle oracle_symblocs/Longinit_sequencer.res.oracle
 320c320
 <   result/Longinit_sequencer.sav
@@ -8,6 +9,20 @@ diff oracle/Longinit_sequencer.res.oracle oracle_symblocs/Longinit_sequencer.res
 ---
 >   result_symblocs/Longinit_sequencer.sav
 diff oracle/alloc_weak.res.oracle oracle_symblocs/alloc_weak.res.oracle
+||||||| ac7807782d
+diff tests/builtins/oracle/Longinit_sequencer.res.oracle tests/builtins/oracle_symblocs/Longinit_sequencer.res.oracle
+320c320
+<   tests/builtins/result/Longinit_sequencer.sav
+---
+>   tests/builtins/result_symblocs/Longinit_sequencer.sav
+556c556
+<   tests/builtins/result/Longinit_sequencer.sav
+---
+>   tests/builtins/result_symblocs/Longinit_sequencer.sav
+diff tests/builtins/oracle/alloc_weak.res.oracle tests/builtins/oracle_symblocs/alloc_weak.res.oracle
+=======
+diff tests/builtins/oracle/alloc_weak.res.oracle tests/builtins/oracle_symblocs/alloc_weak.res.oracle
+>>>>>>> origin/master
 36,37d35
 < [eva:alarm] alloc_weak.c:30: Warning: 
 <   accessing uninitialized left-value. assert \initialized(p);
diff --git a/tests/builtins/long_init.c b/tests/builtins/long_init.c
deleted file mode 100644
index c244b17b5e377a30cd1b3c1707309d7afd422031..0000000000000000000000000000000000000000
--- a/tests/builtins/long_init.c
+++ /dev/null
@@ -1,108 +0,0 @@
-/* run.config*
-   DONTRUN: tests run by Longinit_sequencer.i
-*/
-
-#include <stdlib.h>
-
-#define N1 10
-#define N2 50
-#define N3 10
-
-volatile int nondet;
-
-int a1[N1];
-struct st {
-  unsigned long t[N2];
-  double d[N3];
-} stuff;
-
-double subanalyze(double *d) {
-  return *d < 15 ? 1.0 : *d / 15.0;
-}
-
-double analyze(int *a, unsigned long *b, double *c) {
-  int i;
-  double res = 0.0;
-  /*@ slevel 5; */
-  for (i = 0; i < 5; i++) {
-    res += a[i + 3] + b[i * 2] + c[i + 1];
-    res += subanalyze(&c[i + 1]);
-  }
-  return res;
-}
-
-char garbled_mix = (char) "abc";
-char *s = "abc";
-//int another_global = 42; // from init_global2.c
-//int yet_another_global = 43; // from init_global3.c
-double *pr, *pr2, *pr_escaping, **ppr;
-int *alloc1, *alloc2, *alloc3;
-
-double dmin(double *pd1, double *pd2) {
-  if (*pd1 < *pd2) return *pd1;
-  else return *pd2;
-}
-
-int fun(int k) {
-  return k+1;
-}
-
-typedef int (*i_fp_i)(int);
-i_fp_i fp = &fun;
-
-/*@ assigns a1[..], stuff, pr, pr2, pr_escaping, alloc1, alloc2
-      \from \nothing; */
-void init_inner(int n, char const *tea) {
-  int i;
-  /*@ slevel N3; */
-  for (i = 0; i < N1; i++) {
-    a1[i] = i;
-  }
-  for (i = 0; i < N2; i++) {
-    stuff.t[i] = a1[i/5] + 3;
-  }
-  for (i = 0; i < N3; i++) {
-    stuff.d[i] = 3.125 * i;
-  }
-  /*@ slevel 0; */
-  double r = analyze(a1, stuff.t, stuff.d);
-  double r2 = analyze(a1, stuff.t+1, stuff.d+1);
-  pr = nondet ? &r : &r2;
-  pr2 = &r2;
-  pr_escaping = &r2;
-  alloc1 = malloc(sizeof(int*));
-  *alloc1 = (int) alloc1;
-  alloc2 = malloc(2*sizeof(int));
-  *alloc2 = 37;
-  free(alloc2);
-}
-
-int inited;
-
-/*@ assigns a1[..], stuff, pr, pr2, pr_escaping, alloc1, alloc2, inited
-      \from \nothing; */
-void init_outer() {
-    init_inner(13, "tea");
-    inited = 1;
-}
-
-int main() {
-  init_outer();
-  char *sa = s;
-  Frama_C_dump_each();
-  double r = analyze(a1, stuff.t, stuff.d);
-  double r2 = analyze(a1, stuff.t+1, stuff.d+1);
-  pr = nondet ? &r : &r2;
-  pr2 = nondet ? &r : &r2;
-  ppr = nondet ? &pr : &pr2;
-  double dm = dmin(pr, *ppr);
-  int res_from_fp = (*fp)(31);
-  int res = (int)r % 256;
-  *alloc1 = inited;
-  int local = *alloc1;
-  free(alloc1);
-  alloc3 = malloc(sizeof(int));
-  //local = another_global; // from init_global2.c
-  //int local2 = yet_another_global; // from init_global3.c
-  return 0;
-}
diff --git a/tests/builtins/long_init2.c b/tests/builtins/long_init2.c
deleted file mode 100644
index 065358b2e68c111dec1dbeaaa9636b5bc9ee7e69..0000000000000000000000000000000000000000
--- a/tests/builtins/long_init2.c
+++ /dev/null
@@ -1,108 +0,0 @@
-/* run.config*
-   DONTRUN: tests run by Longinit_sequencer.i
-*/
-
-#include <stdlib.h>
-
-#define N1 10
-#define N2 50
-#define N3 10
-
-volatile int nondet;
-
-int a1[N1];
-struct st {
-  unsigned long t[N2];
-  double d[N3];
-} stuff;
-
-double subanalyze(double *d) {
-  return *d < 15 ? 1.0 : *d / 15.0;
-}
-
-double analyze(int *a, unsigned long *b, double *c) {
-  int i;
-  double res = 0.0;
-  /*@ slevel 5; */
-  for (i = 0; i < 5; i++) {
-    res += a[i + 3] + b[i * 2] + c[i + 1];
-    res += subanalyze(&c[i + 1]);
-  }
-  return res;
-}
-
-char garbled_mix = (char) "abc";
-char *s = "abc";
-int another_global = 42;
-//int yet_another_global = 43; // from init_global3.c
-double *pr, *pr2, *pr_escaping, **ppr;
-int *alloc1, *alloc2, *alloc3;
-
-double dmin(double *pd1, double *pd2) {
-  if (*pd1 < *pd2) return *pd1;
-  else return *pd2;
-}
-
-int fun(int k) {
-  return k+1;
-}
-
-typedef int (*i_fp_i)(int);
-i_fp_i fp = &fun;
-
-/*@ assigns a1[..], stuff, pr, pr2, pr_escaping, alloc1, alloc2
-      \from \nothing; */
-void init_inner(int n, char const *tea) {
-  int i;
-  /*@ slevel N3; */
-  for (i = 0; i < N1; i++) {
-    a1[i] = i;
-  }
-  for (i = 0; i < N2; i++) {
-    stuff.t[i] = a1[i/5] + 3;
-  }
-  for (i = 0; i < N3; i++) {
-    stuff.d[i] = 3.125 * i;
-  }
-  /*@ slevel 0; */
-  double r = analyze(a1, stuff.t, stuff.d);
-  double r2 = analyze(a1, stuff.t+1, stuff.d+1);
-  pr = nondet ? &r : &r2;
-  pr2 = &r2;
-  pr_escaping = &r2;
-  alloc1 = malloc(sizeof(int*));
-  *alloc1 = (int) alloc1;
-  alloc2 = malloc(2*sizeof(int));
-  *alloc2 = 37;
-  free(alloc2);
-}
-
-int inited;
-
-/*@ assigns a1[..], stuff, pr, pr2, pr_escaping, alloc1, alloc2, inited
-      \from \nothing; */
-void init_outer() {
-    init_inner(13, "tea");
-    inited = 1;
-}
-
-int main() {
-  init_outer();
-  char *sa = s;
-  Frama_C_dump_each();
-  double r = analyze(a1, stuff.t, stuff.d);
-  double r2 = analyze(a1, stuff.t+1, stuff.d+1);
-  pr = nondet ? &r : &r2;
-  pr2 = nondet ? &r : &r2;
-  ppr = nondet ? &pr : &pr2;
-  double dm = dmin(pr, *ppr);
-  int res_from_fp = (*fp)(31);
-  int res = (int)r % 256;
-  *alloc1 = inited;
-  int local = *alloc1;
-  free(alloc1);
-  alloc3 = malloc(sizeof(int));
-  local = another_global;
-  //int local2 = yet_another_global; // from init_global3.c
-  return 0;
-}
diff --git a/tests/builtins/long_init3.c b/tests/builtins/long_init3.c
deleted file mode 100644
index b3b97e7aee3843079508e5a32d403045ec253e08..0000000000000000000000000000000000000000
--- a/tests/builtins/long_init3.c
+++ /dev/null
@@ -1,108 +0,0 @@
-/* run.config*
-   DONTRUN: tests run by Longinit_sequencer.i
-*/
-
-#include <stdlib.h>
-
-#define N1 10
-#define N2 50
-#define N3 10
-
-volatile int nondet;
-
-int a1[N1];
-struct st {
-  unsigned long t[N2];
-  double d[N3];
-} stuff;
-
-double subanalyze(double *d) {
-  return *d < 15 ? 1.0 : *d / 15.0;
-}
-
-double analyze(int *a, unsigned long *b, double *c) {
-  int i;
-  double res = 0.0;
-  /*@ slevel 5; */
-  for (i = 0; i < 5; i++) {
-    res += a[i + 3] + b[i * 2] + c[i + 1];
-    res += subanalyze(&c[i + 1]);
-  }
-  return res;
-}
-
-char garbled_mix = (char) "abc";
-char *s = "abc";
-int another_global = 42;
-int yet_another_global = 43;
-double *pr, *pr2, *pr_escaping, **ppr;
-int *alloc1, *alloc2, *alloc3;
-
-double dmin(double *pd1, double *pd2) {
-  if (*pd1 < *pd2) return *pd1;
-  else return *pd2;
-}
-
-int fun(int k) {
-  return k+1;
-}
-
-typedef int (*i_fp_i)(int);
-i_fp_i fp = &fun;
-
-/*@ assigns a1[..], stuff, pr, pr2, pr_escaping, alloc1, alloc2
-      \from \nothing; */
-void init_inner(int n, char const *tea) {
-  int i;
-  /*@ slevel N3; */
-  for (i = 0; i < N1; i++) {
-    a1[i] = i;
-  }
-  for (i = 0; i < N2; i++) {
-    stuff.t[i] = a1[i/5] + 3;
-  }
-  for (i = 0; i < N3; i++) {
-    stuff.d[i] = 3.125 * i;
-  }
-  /*@ slevel 0; */
-  double r = analyze(a1, stuff.t, stuff.d);
-  double r2 = analyze(a1, stuff.t+1, stuff.d+1);
-  pr = nondet ? &r : &r2;
-  pr2 = &r2;
-  pr_escaping = &r2;
-  alloc1 = malloc(sizeof(int*));
-  *alloc1 = (int) alloc1;
-  alloc2 = malloc(2*sizeof(int));
-  *alloc2 = 37;
-  free(alloc2);
-}
-
-int inited;
-
-/*@ assigns a1[..], stuff, pr, pr2, pr_escaping, alloc1, alloc2, inited
-      \from \nothing; */
-void init_outer() {
-    init_inner(13, "tea");
-    inited = 1;
-}
-
-int main() {
-  init_outer();
-  char *sa = s;
-  Frama_C_dump_each();
-  double r = analyze(a1, stuff.t, stuff.d);
-  double r2 = analyze(a1, stuff.t+1, stuff.d+1);
-  pr = nondet ? &r : &r2;
-  pr2 = nondet ? &r : &r2;
-  ppr = nondet ? &pr : &pr2;
-  double dm = dmin(pr, *ppr);
-  int res_from_fp = (*fp)(31);
-  int res = (int)r % 256;
-  *alloc1 = inited;
-  int local = *alloc1;
-  free(alloc1);
-  alloc3 = malloc(sizeof(int));
-  local = another_global;
-  int local2 = yet_another_global;
-  return 0;
-}
diff --git a/tests/builtins/test_config b/tests/builtins/test_config
index 6d3bfef239211cad7bf4c69404e1f56dd58d6442..d2c59d2b6ca5b9b3ad806f3e6187140a6581058d 100644
--- a/tests/builtins/test_config
+++ b/tests/builtins/test_config
@@ -1,3 +1,9 @@
 MACRO: EVA_OPTIONS @EVA_OPTIONS@ -eva-msg-key malloc -eva-warn-key malloc:weak=feedback -eva-no-alloc-returns-null
+<<<<<<< HEAD
 MACRO: EVA_CONFIG @EVA_OPTIONS@ -machdep x86_32
+||||||| ac7807782d
+MACRO: EVA_CONFIG @EVA_OPTIONS@ -no-autoload-plugins -load-module from,inout,eva,scope,variadic
+=======
+MACRO: EVA_CONFIG @EVA_OPTIONS@ -no-autoload-plugins -load-module from,inout,eva,scope,variadic -machdep x86_32
+>>>>>>> origin/master
 OPT: -eva @EVA_CONFIG@ -journal-disable -out -input -deps
diff --git a/tests/cil/Change_formals.ml b/tests/cil/Change_formals.ml
index 9250a3ea364ce6647f2c15c194aa065fed4500cc..b3d74892a22f649625c5754913a78c594e63deb9 100644
--- a/tests/cil/Change_formals.ml
+++ b/tests/cil/Change_formals.ml
@@ -32,7 +32,7 @@ class transform prj = object(_self)
       let mk_gvar_decl = function l -> 
 	begin match l with
 	  | (GFunDecl (_fspec, vi, _loc) as g) :: [] ->
-	    if not (Cil.Frama_c_builtins.mem vi.vname) then
+	    if not (Cil_builtins.Frama_c_builtins.mem vi.vname) then
 	      begin match vi.vtype with
 		| TFun(typ, args, varity, attr) ->
 		  let vtype = Cil.argsToList args in
diff --git a/tests/cil/mkBinOp.i b/tests/cil/mkBinOp.i
index 4cd4dae871825623cf523d43735f2ef9bb04ecdf..cce6e6f7f28cc8e39340722927c5a08f4f53ef1a 100644
--- a/tests/cil/mkBinOp.i
+++ b/tests/cil/mkBinOp.i
@@ -1,6 +1,14 @@
 /* run.config
+<<<<<<< HEAD
 MODULE: @PTEST_NAME@
 STDOPT: +"-machdep x86_32 -constfold"
+||||||| ac7807782d
+EXECNOW: make -s @PTEST_DIR@/@PTEST_NAME@.cmxs
+OPT: -no-autoload-plugins -load-module @PTEST_DIR@/@PTEST_NAME@.cmxs -print -constfold
+=======
+EXECNOW: make -s @PTEST_DIR@/@PTEST_NAME@.cmxs
+OPT: -machdep x86_32 -no-autoload-plugins -load-module @PTEST_DIR@/@PTEST_NAME@.cmxs -print -constfold
+>>>>>>> origin/master
 */
 
 int main(void) {
diff --git a/tests/compliance/check-json.i b/tests/compliance/check-json.i
new file mode 100644
index 0000000000000000000000000000000000000000..c59b0b2c74f7090f056a290caacb42bc506b2a26
--- /dev/null
+++ b/tests/compliance/check-json.i
@@ -0,0 +1,7 @@
+/*run.config
+  NOFRAMAC:
+  EXECNOW: python3 -m json.tool < share/compliance/c11_functions.json >/dev/null
+  EXECNOW: python3 -m json.tool < share/compliance/glibc_functions.json >/dev/null
+  EXECNOW: python3 -m json.tool < share/compliance/nonstandard_identifiers.json >/dev/null
+  EXECNOW: python3 -m json.tool < share/compliance/posix_identifiers.json >/dev/null
+*/
diff --git a/tests/constant_propagation/const_globals.c b/tests/constant_propagation/const_globals.c
index 41d302fc9106813b0a3da4c52b48ffac1de18349..355a01b498734788a754838b8bde297d78ced63c 100644
--- a/tests/constant_propagation/const_globals.c
+++ b/tests/constant_propagation/const_globals.c
@@ -1,5 +1,5 @@
 /* run.config
-   OPT: -constfold -print -journal-disable
+   OPT: -constfold -print -journal-disable -machdep x86_32
 */
 
 #include <stddef.h>
diff --git a/tests/constant_propagation/test_config b/tests/constant_propagation/test_config
index f9f75f643906372c3a5863294c1aef9b95c24d6d..9d1023ac883e141680254b3769e5eda3d321d19b 100644
--- a/tests/constant_propagation/test_config
+++ b/tests/constant_propagation/test_config
@@ -1,2 +1,8 @@
+<<<<<<< HEAD
 PLUGIN: constant_propagation @PLUGIN@
 OPT: -journal-disable -scf @EVA_OPTIONS@ -machdep x86_32
+||||||| ac7807782d
+OPT: -journal-disable -scf @EVA_OPTIONS@
+=======
+OPT: -journal-disable -scf @EVA_OPTIONS@ -machdep x86_32
+>>>>>>> origin/master
diff --git a/tests/crowbar/complete_type.ml b/tests/crowbar/complete_type.ml
index ecb714035683bfb1c9e03c068ca70d4348474610..3cae6790456519071aa9351c84a579e9a6c67317 100644
--- a/tests/crowbar/complete_type.ml
+++ b/tests/crowbar/complete_type.ml
@@ -42,7 +42,7 @@ let mk_array_type (is_gcc, typ, types, kind) length =
     | Complete, Some _ -> Complete
   in
   let length =
-    Extlib.opt_map (Cil.kinteger ~loc Cil.(theMachine.kindOfSizeOf)) length
+    Option.map (Cil.kinteger ~loc Cil.(theMachine.kindOfSizeOf)) length
   in
   (is_gcc, TArray (typ, length, { scache = Not_Computed }, []), types, kind)
 
@@ -58,12 +58,12 @@ let mk_comp_type
   in
   let mk_fields compinfo =
     match nb_fields with
-    | 0 -> compinfo.cdefined <- false; []
-    | 1 -> compinfo.cdefined <- true; [ mk_field typ1 ]
-    | _ -> compinfo.cdefined <- true; [ mk_field typ1; mk_field typ2 ]
+    | 0 -> None
+    | 1 -> Some [ mk_field typ1 ]
+    | _ -> Some [ mk_field typ1; mk_field typ2 ]
   in
   let compinfo =
-    Cil.mkCompInfo cstruct (type_name()) mk_fields []
+    Cil_const.mkCompInfo cstruct (type_name()) mk_fields []
   in
   let kind =
    match cstruct, nb_fields, kind1, kind2 with
diff --git a/tests/crowbar/input/testcase b/tests/crowbar/input/testcase
index e0a6c6668c4b093cc3bcdf79b05693c024daa46f..56a2a5ae6dd90f45b6ec161eac41cf0e693f669d 100644
--- a/tests/crowbar/input/testcase
+++ b/tests/crowbar/input/testcase
@@ -1 +1 @@
-fo
\ No newline at end of file
+fo
diff --git a/tests/crowbar/mutable.ml b/tests/crowbar/mutable.ml
index 51db8a6fc686bee354e40a6f1230fd85050cbdf6..2ce2ae6d5995f0bcdb2ccd5ed4aadacbb1164d28 100644
--- a/tests/crowbar/mutable.ml
+++ b/tests/crowbar/mutable.ml
@@ -39,9 +39,9 @@ let mk_type ftype attr =
   let tname = struct_name () in
   let fname = field_name () in
   let mk_type _ =
-    [ fname, ftype, None, attr, Cil_datatype.Location.unknown ]
+    Some [ fname, ftype, None, attr, Cil_datatype.Location.unknown ]
   in
-  Cil.mkCompInfo true tname ~norig:tname mk_type []
+  Cil_const.mkCompInfo true tname ~norig:tname mk_type []
 
 let mk_int_type field_kind =
   let field_attr = attr_of_kind field_kind in
@@ -144,5 +144,5 @@ let test (types, kind) =
     end;
     true
 
-let () = Crowbar.add_test ~name:"mutable typeOffset" [ gen_type ] @@ 
+let () = Crowbar.add_test ~name:"mutable typeOffset" [ gen_type ] @@
   (fun x -> Crowbar.check (test x))
diff --git a/tests/crowbar/offset_anonymous_field.ml b/tests/crowbar/offset_anonymous_field.ml
index 15b7277f26d6dbb4837a6a6691699b4c5765e3eb..a5357631574cfa2344a05507563a68a669d39dc5 100644
--- a/tests/crowbar/offset_anonymous_field.ml
+++ b/tests/crowbar/offset_anonymous_field.ml
@@ -24,7 +24,7 @@ let struct_name =
 
 let mk_compinfo cstruct field1 field2 field3 =
   let tname = struct_name () in
-  let mk_type _ = [ field1; field2; field3 ] in
+  let mk_type _ = Some [ field1; field2; field3 ] in
   Cil.mkCompInfo cstruct tname ~norig:tname mk_type []
 
 type result =
diff --git a/tests/dynamic_plugin/apply.ml b/tests/dynamic_plugin/apply.ml
deleted file mode 100644
index b0fe38a0def5fdf824cf69fe6b7f8c124f1cf6bb..0000000000000000000000000000000000000000
--- a/tests/dynamic_plugin/apply.ml
+++ /dev/null
@@ -1,32 +0,0 @@
-open Datatype
-
-module Param =
-  Plugin.Register
-    (struct
-       let name = "apply"
-       let shortname = "apply"
-       let help = "testing purpose"
-     end)
-
-module Test =
-  Param.False
-    (struct
-       let option_name = "-dynamic-test"
-       let help = "print dynamic test"
-     end)
-
-let main () =
-  if Dynamic.Parameter.Bool.get "-dynamic-test" () then begin
-    ignore (Dynamic.get ~plugin:"Register_mod2" "g_test" (func int int) 41);
-    try
-      Dynamic.get ~plugin:"Register_mod2" "g_test"
-	(func int (func (list char) (func (pair string float) unit)))
-	42 ['a'] ("r",6.8)
-    with Dynamic.Incompatible_type s ->
-      Param.feedback "%s" s;
-      try Dynamic.get ~plugin:"Register_mod2" "unknown" (func unit unit) ()
-      with Dynamic.Unbound_value s ->
-	Param.feedback "value %S not registered" s
-  end
-
-let () = Db.Main.extend main
diff --git a/tests/dynamic_plugin/register_mod1.ml b/tests/dynamic_plugin/register_mod1.ml
deleted file mode 100644
index fbd56ffd670b02c730a570ff4a2332e72acba30e..0000000000000000000000000000000000000000
--- a/tests/dynamic_plugin/register_mod1.ml
+++ /dev/null
@@ -1,13 +0,0 @@
-module L = List
-open Datatype
-module List = L
-
-(* Test with a mutual recursive function *)
-let f_test i j=
-  Format.printf "Use f_test %d %d@." i j;
-  if i = 0 then j
-  else Dynamic.get ~plugin:"Register_mod2" "g_test" (func int int) (j-1)
-
-let __ : int =
-  Dynamic.register ~plugin:"Register_mod1" "f_test" ~journalize:false
-    (func int (func int int)) f_test 3 4
diff --git a/tests/dynamic_plugin/register_mod2.ml b/tests/dynamic_plugin/register_mod2.ml
deleted file mode 100644
index fbe442a3e35e2a72244f13c3d8100fb32ea44367..0000000000000000000000000000000000000000
--- a/tests/dynamic_plugin/register_mod2.ml
+++ /dev/null
@@ -1,18 +0,0 @@
-module L = List
-open Datatype
-module List = L
-
-(* Test with a mutual recursive function *)
-let g_test j=
-  Format.printf "Use g_test %d@." j;
-  if j mod 3 = 0 then j
-  else
-    Dynamic.get ~plugin:"Register_mod1" "f_test"
-      (func int (func int int))
-      (j-1)
-      j
-
-let __ : int -> int =
-  Dynamic.register ~journalize:false ~plugin:"Register_mod2" "g_test"
-    (func int int)
-    g_test
diff --git a/tests/fc_script/main.c b/tests/fc_script/main.c
index 97b7d281575192c385a17f7d477ea60496a20a21..fbdc5eef20124fe9e9f252ada7061ade0576b0b4 100644
--- a/tests/fc_script/main.c
+++ b/tests/fc_script/main.c
@@ -1,5 +1,6 @@
 /* run.config
    NOFRAMAC: testing frama-c-script, not frama-c itself
+<<<<<<< HEAD
    DEPS: for-find-fun2.c for-find-fun.c main.c main2.c main3.c
    EXECNOW: LOG GNUmakefile LOG make_template.res LOG make_template.err PTESTS_TESTING= %{bin:frama-c-script} make-template . < %{dep:make_template.input} > make_template.res 2> make_template.err
    EXECNOW: LOG list_files.res LOG list_files.err %{bin:frama-c-script} list-files %{dep:list_files.json} > list_files.res 2> list_files.err
@@ -7,6 +8,20 @@
    EXECNOW: LOG find_fun1.res LOG find_fun1.err %{bin:frama-c-script} find-fun main2 . > find_fun1.res 2> find_fun1.err
    EXECNOW: LOG find_fun2.res LOG find_fun2.err %{bin:frama-c-script} find-fun main3 . > find_fun2.res 2> find_fun2.err
    EXECNOW: LOG find_fun3.res LOG find_fun3.err %{bin:frama-c-script} find-fun false_positive . > find_fun3.res 2> find_fun3.err
+||||||| ac7807782d
+   EXECNOW: LOG GNUmakefile LOG make_template.res LOG make_template.err cd @PTEST_DIR@ && PTESTS_TESTING= ../../bin/frama-c-script make-template result < make_template.input > result/make_template.res 2> result/make_template.err
+   EXECNOW: LOG list_files.res LOG list_files.err bin/frama-c-script list-files @PTEST_DIR@/list_files.json > @PTEST_DIR@/result/list_files.res 2> @PTEST_DIR@/result/list_files.err
+   EXECNOW: LOG flamegraph.html LOG flamegraph.res LOG flamegraph.err NOGUI=1 bin/frama-c-script flamegraph @PTEST_DIR@/flamegraph.txt @PTEST_DIR@/result > @PTEST_DIR@/result/flamegraph.res 2> @PTEST_DIR@/result/flamegraph.err && rm -f @PTEST_DIR@/result/flamegraph.svg
+   EXECNOW: LOG find_fun1.res LOG find_fun1.err bin/frama-c-script find-fun main2 @PTEST_DIR@ > @PTEST_DIR@/result/find_fun1.res 2> @PTEST_DIR@/result/find_fun1.err
+   EXECNOW: LOG find_fun2.res LOG find_fun2.err bin/frama-c-script find-fun main3 @PTEST_DIR@ > @PTEST_DIR@/result/find_fun2.res 2> @PTEST_DIR@/result/find_fun2.err
+   EXECNOW: LOG find_fun3.res LOG find_fun3.err bin/frama-c-script find-fun false_positive @PTEST_DIR@ > @PTEST_DIR@/result/find_fun3.res 2> @PTEST_DIR@/result/find_fun3.err
+=======
+   EXECNOW: LOG GNUmakefile LOG make_template.res LOG make_template.err cd @PTEST_DIR@ && PTESTS_TESTING= ../../bin/frama-c-script make-template result < make_template.input > result/make_template.res 2> result/make_template.err
+   EXECNOW: LOG list_files.res LOG list_files.err bin/frama-c-script list-files @PTEST_DIR@/list_files.json > @PTEST_DIR@/result/list_files.res 2> @PTEST_DIR@/result/list_files.err
+   EXECNOW: LOG find_fun1.res LOG find_fun1.err bin/frama-c-script find-fun main2 @PTEST_DIR@ > @PTEST_DIR@/result/find_fun1.res 2> @PTEST_DIR@/result/find_fun1.err
+   EXECNOW: LOG find_fun2.res LOG find_fun2.err bin/frama-c-script find-fun main3 @PTEST_DIR@ > @PTEST_DIR@/result/find_fun2.res 2> @PTEST_DIR@/result/find_fun2.err
+   EXECNOW: LOG find_fun3.res LOG find_fun3.err bin/frama-c-script find-fun false_positive @PTEST_DIR@ > @PTEST_DIR@/result/find_fun3.res 2> @PTEST_DIR@/result/find_fun3.err
+>>>>>>> origin/master
  */
 
 void main() {
diff --git a/tests/fc_script/make-for-make-wrapper.mk b/tests/fc_script/make-for-make-wrapper.mk
new file mode 100644
index 0000000000000000000000000000000000000000..983f2a16d9f1be8dcaaaa332626afa7c6c54ffee
--- /dev/null
+++ b/tests/fc_script/make-for-make-wrapper.mk
@@ -0,0 +1,22 @@
+# Customized makefile template for testing 'frama-c-script make-wrapper'.
+
+include $(shell $(FRAMAC) -no-autoload-plugins -print-share-path)/analysis-scripts/prologue.mk
+
+FCFLAGS     += \
+  -kernel-warn-key annot:missing-spec=abort \
+  -kernel-warn-key typing:implicit-function-declaration=abort \
+
+EVAFLAGS    += \
+  -eva-warn-key builtins:missing-spec=abort \
+
+## Analysis targets (suffixed with .eva)
+TARGETS = make-for-make-wrapper.eva
+
+make-for-make-wrapper.parse: \
+  make-wrapper.c \
+  make-wrapper2.c \
+  # make-wrapper3.c is deliberately absent of this list
+
+### Epilogue. Do not modify this block. #######################################
+include $(shell $(FRAMAC) -no-autoload-plugins -print-share-path)/analysis-scripts/epilogue.mk
+###############################################################################
diff --git a/tests/fc_script/make-wrapper.c b/tests/fc_script/make-wrapper.c
new file mode 100644
index 0000000000000000000000000000000000000000..9fdf20fa96c49dccd7692f09ad85e2f37242c7eb
--- /dev/null
+++ b/tests/fc_script/make-wrapper.c
@@ -0,0 +1,18 @@
+/* run.config
+   NOFRAMAC: testing frama-c-script
+   COMMENT: we must filter 'make:' output lines, since they differ when run by the CI (e.g. mention to jobserver)
+   EXECNOW: LOG make-wrapper.res LOG make-wrapper.err cd @PTEST_DIR@ && touch make-wrapper2.c && touch make-wrapper3.c && FRAMAC=../../bin/frama-c ../../bin/frama-c-script make-wrapper --make-dir . -f make-for-make-wrapper.mk | sed -e "s:$PWD:PWD:g" | grep -v "^make.*" | grep -v "recipe for target.*failed" > result/make-wrapper.res 2> result/make-wrapper.err && rm -rf make-for-make-wrapper.parse make-for-make-wrapper.eva
+*/
+
+int defined(int a);
+
+int specified(int a);
+
+int external(int a);
+
+int main() {
+  int a = 42;
+  a = defined(a);
+  a = specified(a);
+  a = external(a);
+}
diff --git a/tests/fc_script/make-wrapper2.c b/tests/fc_script/make-wrapper2.c
new file mode 100644
index 0000000000000000000000000000000000000000..0f97864c1b8f7a6192590aa232ac04e7e4ca3090
--- /dev/null
+++ b/tests/fc_script/make-wrapper2.c
@@ -0,0 +1,16 @@
+/* run.config
+   DONTRUN: part of the test in make-wrapper.c
+*/
+
+int defined(int a) {
+  return a + 1;
+}
+
+/*@
+  assigns \result \from a;
+  ensures \result == a + 2;
+ */
+int specified(int a);
+
+// defined in another, non-included, file
+int external(int a);
diff --git a/tests/fc_script/make-wrapper3.c b/tests/fc_script/make-wrapper3.c
new file mode 100644
index 0000000000000000000000000000000000000000..83ed541f1db724dc886d6bb865491c47d866d0e2
--- /dev/null
+++ b/tests/fc_script/make-wrapper3.c
@@ -0,0 +1,9 @@
+/* run.config
+   DONTRUN: part of the test in make-wrapper.c
+*/
+
+// This file contains a definition for function 'external', but it is _not_
+// included when parsing 'make-wrapper.c'. This triggers a make-wrapper message.
+int external(int a) {
+  return a + 3;
+}
diff --git a/tests/fc_script/oracle/GNUmakefile b/tests/fc_script/oracle/GNUmakefile
index a824473331f8b9c665634043c86b81d55b10102a..d18dafec17ed06384c86b96b49bc9f8afb9e359d 100644
--- a/tests/fc_script/oracle/GNUmakefile
+++ b/tests/fc_script/oracle/GNUmakefile
@@ -21,7 +21,13 @@ CPPFLAGS    += \
 FCFLAGS     += \
   -json-compilation-database ./compile_commands.json \
   -main eva_main \
+<<<<<<< HEAD
   -add-symbolic-path=.:. \
+||||||| ac7807782d
+  -add-symbolic-path=.:.. \
+=======
+  -add-symbolic-path=..:. \
+>>>>>>> origin/master
   -kernel-warn-key annot:missing-spec=abort \
   -kernel-warn-key typing:implicit-function-declaration=abort \
 
@@ -31,7 +37,12 @@ EVAFLAGS    += \
 
 ## GUI-only flags
 FCGUIFLAGS += \
+<<<<<<< HEAD
   -add-symbolic-path=.:. \
+||||||| ac7807782d
+  -add-symbolic-path=.:.. \
+=======
+>>>>>>> origin/master
 
 ## Analysis targets (suffixed with .eva)
 TARGETS = fc_script_main.eva
diff --git a/tests/fc_script/oracle/find_fun1.res b/tests/fc_script/oracle/find_fun1.res
index 0c6b67f1e5fdb531b85f9042f1c3c19dcdba655f..d795a9d007c7c8f621a6cbc569aab3fb244352e6 100644
--- a/tests/fc_script/oracle/find_fun1.res
+++ b/tests/fc_script/oracle/find_fun1.res
@@ -1,4 +1,4 @@
-Looking for 'main2' inside 5 file(s)...
+Looking for 'main2' inside 8 file(s)...
 Possible declarations for function 'main2' in the following file(s):
   for-find-fun.c
 Possible definitions for function 'main2' in the following file(s):
diff --git a/tests/fc_script/oracle/find_fun2.res b/tests/fc_script/oracle/find_fun2.res
index 37ddfed3cf669dfcd027047f220b034a522c47a0..02a92e78f96b74dc332419b7f927491f7e4400c8 100644
--- a/tests/fc_script/oracle/find_fun2.res
+++ b/tests/fc_script/oracle/find_fun2.res
@@ -1,4 +1,4 @@
-Looking for 'main3' inside 5 file(s)...
+Looking for 'main3' inside 8 file(s)...
 Possible declarations for function 'main3' in the following file(s):
   for-find-fun2.c
 Possible definitions for function 'main3' in the following file(s):
diff --git a/tests/fc_script/oracle/find_fun3.res b/tests/fc_script/oracle/find_fun3.res
index a7059bd1c963ad064b030a17ef9782873c397b0d..65fc349325d2406ea212025ed38e51347b09217f 100644
--- a/tests/fc_script/oracle/find_fun3.res
+++ b/tests/fc_script/oracle/find_fun3.res
@@ -1,2 +1,2 @@
-Looking for 'false_positive' inside 5 file(s)...
+Looking for 'false_positive' inside 8 file(s)...
 No declaration/definition found for function 'false_positive'
diff --git a/tests/fc_script/oracle/flamegraph.html b/tests/fc_script/oracle/flamegraph.html
deleted file mode 100644
index 8414168d8da8b91746896d9448f88a29c5bc4a6b..0000000000000000000000000000000000000000
--- a/tests/fc_script/oracle/flamegraph.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-  <head>
-    <meta charset="utf-8">
-    <title>Eva Flamegraph</title>
-  </head>
-  <body>
-    <embed src="flamegraph.svg" style="max-width:100%;width:1400px;min-width:1000px">
-  </body>
-</html>
diff --git a/tests/fc_script/oracle/make-wrapper.err b/tests/fc_script/oracle/make-wrapper.err
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/tests/fc_script/oracle/make-wrapper.res b/tests/fc_script/oracle/make-wrapper.res
new file mode 100644
index 0000000000000000000000000000000000000000..18747999ef64bba9e9fd47673c4c03caacef85f2
--- /dev/null
+++ b/tests/fc_script/oracle/make-wrapper.res
@@ -0,0 +1,26 @@
+
+Command: ../../bin/frama-c -kernel-warn-key annot:missing-spec=abort -kernel-warn-key typing:implicit-function-declaration=abort -cpp-extra-args= make-wrapper.c make-wrapper2.c
+
+[kernel] Parsing make-wrapper.c (with preprocessing)
+[kernel] Parsing make-wrapper2.c (with preprocessing)
+
+Command: ../../bin/frama-c -kernel-warn-key annot:missing-spec=abort -kernel-warn-key typing:implicit-function-declaration=abort -eva -eva-no-print -eva-no-show-progress -eva-msg-key=-initial-state -eva-print-callstacks -eva-warn-key alarm=inactive -no-deps-print -no-calldeps-print -eva-warn-key garbled-mix -calldeps -from-verbose 0 -eva-warn-key builtins:missing-spec=abort
+
+[eva] Analyzing a complete application starting at main
+[eva] Computing initial state
+[eva] Initial state computed
+[eva] using specification for function specified
+[kernel:annot:missing-spec] make-wrapper.c:17: Warning: 
+  Neither code nor specification for function external, generating default assigns from the prototype
+[kernel] User Error: warning annot:missing-spec treated as fatal error.
+[kernel] Frama-C aborted: invalid user input.
+[kernel] Warning: attempting to save on non-zero exit code: modifying filename into `PWD/make-for-make-wrapper.eva/framac.sav.error'.
+
+***** make-wrapper recommendations *****
+
+*** recommendation #1 ***
+
+1. Found function with missing spec: external
+   Looking for files defining it...
+Add the following file to the list of sources to be parsed:
+  make-wrapper3.c
diff --git a/tests/fc_script/oracle/make_template.res b/tests/fc_script/oracle/make_template.res
index 1c380ce5ac17a9c2ffd878e305eb82a5d28d0fb0..97acf520da407b531a6bb7804ecb6866935553c9 100644
--- a/tests/fc_script/oracle/make_template.res
+++ b/tests/fc_script/oracle/make_template.res
@@ -10,7 +10,16 @@ warning: GNUmakefile already exists. Overwrite? [y/N] Main target name: Source f
 warning: 'main' seems to be defined multiple times.
 Is this ok? [Y/n] compile_commands.json exists, add option -json-compilation-database? [Y/n] Add stub for function main (only needed if it uses command-line arguments)? [y/N] Please define the architectural model (machdep) of the target machine.
 Known machdeps: x86_16 x86_32 x86_64 gcc_x86_16 gcc_x86_32 gcc_x86_64 ppc_32 msvc_x86_64
+<<<<<<< HEAD
 Please enter the machdep [x86_32]: 'invalid_machdep' is not a standard machdep. Proceed anyway? [y/N]Please enter the machdep [x86_32]: warning: fc_stubs.c already exists. Overwrite? [y/N] Created stub for main function: fc_stubs.c
 Template created: GNUmakefile
 Path to Frama-C binaries written to: path.mk
+||||||| ac7807782d
+Please enter the machdep [x86_32]: 'invalid_machdep' is not a standard machdep. Proceed anyway? [y/N]Please enter the machdep [x86_32]: warning: result/fc_stubs.c already exists. Overwrite? [y/N] Created stub for main function: result/fc_stubs.c
+Template created: result/GNUmakefile
+=======
+Please enter the machdep [x86_64]: 'invalid_machdep' is not a standard machdep. Proceed anyway? [y/N]Please enter the machdep [x86_64]: warning: result/fc_stubs.c already exists. Overwrite? [y/N] Created stub for main function: result/fc_stubs.c
+Template created: result/GNUmakefile
+Path to Frama-C binaries written to: result/path.mk
+>>>>>>> origin/master
 Running ptests: cleaning up after tests...
diff --git a/tests/float/.gitignore b/tests/float/.gitignore
index a2232653a6f719442070e6f515728d7e0a863c46..5de45901ce62a18d26c6309c170b943215b78b67 100644
--- a/tests/float/.gitignore
+++ b/tests/float/.gitignore
@@ -1 +1 @@
-/oracle_*
\ No newline at end of file
+/oracle_*
diff --git a/tests/float/sqrt.c b/tests/float/sqrt.c
index f1cfd10a543687b29631da0c807f25a69fe4223b..5164d15353f3b7de3e8d88d96e72821f3ef53280 100644
--- a/tests/float/sqrt.c
+++ b/tests/float/sqrt.c
@@ -27,5 +27,5 @@ void main() {
 
   for (k=0; k<8; k++)
     c[k] = ((unsigned char*)&i)[k];
-   
+
 }
diff --git a/tests/idct/.gitignore b/tests/idct/.gitignore
index a2232653a6f719442070e6f515728d7e0a863c46..5de45901ce62a18d26c6309c170b943215b78b67 100644
--- a/tests/idct/.gitignore
+++ b/tests/idct/.gitignore
@@ -1 +1 @@
-/oracle_*
\ No newline at end of file
+/oracle_*
diff --git a/tests/idct/oracle/ieee_1180_1990.res.oracle b/tests/idct/oracle/ieee_1180_1990.res.oracle
index 3e8fa0a0b0ecdb3ac5aa2a63b9d3762726ef52d2..085959786a75274df54c3012e15fce4a7d6c1983 100644
--- a/tests/idct/oracle/ieee_1180_1990.res.oracle
+++ b/tests/idct/oracle/ieee_1180_1990.res.oracle
@@ -3351,6 +3351,58 @@
             default behavior
             by Frama-C kernel.
 
+--------------------------------------------------------------------------------
+--- Properties of Function '__finitef'
+--------------------------------------------------------------------------------
+
+[ Extern  ] Post-condition for 'finite' 'nonzero_result'
+            ensures nonzero_result: \result > 0 ∨ \result < 0
+            Unverifiable but considered Valid.
+[ Extern  ] Post-condition for 'nonfinite' 'zero_result'
+            ensures zero_result: \result ≡ 0
+            Unverifiable but considered Valid.
+[ Extern  ] Assigns nothing
+            assigns \nothing;
+            Unverifiable but considered Valid.
+[ Extern  ] Froms (file share/libc/math.h, line 706)
+            assigns \result \from f;
+            Unverifiable but considered Valid.
+[  Valid  ] Default behavior
+            default behavior
+            by Frama-C kernel.
+[  Valid  ] Behavior 'finite'
+            behavior finite
+            by Frama-C kernel.
+[  Valid  ] Behavior 'nonfinite'
+            behavior nonfinite
+            by Frama-C kernel.
+
+--------------------------------------------------------------------------------
+--- Properties of Function '__finite'
+--------------------------------------------------------------------------------
+
+[ Extern  ] Post-condition for 'finite' 'nonzero_result'
+            ensures nonzero_result: \result > 0 ∨ \result < 0
+            Unverifiable but considered Valid.
+[ Extern  ] Post-condition for 'nonfinite' 'zero_result'
+            ensures zero_result: \result ≡ 0
+            Unverifiable but considered Valid.
+[ Extern  ] Assigns nothing
+            assigns \nothing;
+            Unverifiable but considered Valid.
+[ Extern  ] Froms (file share/libc/math.h, line 719)
+            assigns \result \from d;
+            Unverifiable but considered Valid.
+[  Valid  ] Default behavior
+            default behavior
+            by Frama-C kernel.
+[  Valid  ] Behavior 'finite'
+            behavior finite
+            by Frama-C kernel.
+[  Valid  ] Behavior 'nonfinite'
+            behavior nonfinite
+            by Frama-C kernel.
+
 --------------------------------------------------------------------------------
 --- Properties of Function '__fc_infinity'
 --------------------------------------------------------------------------------
@@ -3361,7 +3413,13 @@
 [ Extern  ] Assigns nothing
             assigns \nothing;
             Unverifiable but considered Valid.
+<<<<<<< HEAD
 [ Extern  ] Froms (file FRAMAC_SHARE/libc/math.h, line 724)
+||||||| ac7807782d
+[ Extern  ] Froms (file share/libc/math.h, line 724)
+=======
+[ Extern  ] Froms (file share/libc/math.h, line 746)
+>>>>>>> origin/master
             assigns \result \from \nothing;
             Unverifiable but considered Valid.
 [  Valid  ] Default behavior
@@ -3378,7 +3436,13 @@
 [ Extern  ] Assigns nothing
             assigns \nothing;
             Unverifiable but considered Valid.
+<<<<<<< HEAD
 [ Extern  ] Froms (file FRAMAC_SHARE/libc/math.h, line 730)
+||||||| ac7807782d
+[ Extern  ] Froms (file share/libc/math.h, line 730)
+=======
+[ Extern  ] Froms (file share/libc/math.h, line 752)
+>>>>>>> origin/master
             assigns \result \from \nothing;
             Unverifiable but considered Valid.
 [  Valid  ] Default behavior
@@ -3740,9 +3804,9 @@
 --------------------------------------------------------------------------------
 --- Status Report Summary
 --------------------------------------------------------------------------------
-   169 Completely validated
+   175 Completely validated
     16 Locally validated
-   454 Considered valid
+   462 Considered valid
     56 To be validated
-   695 Total
+   709 Total
 --------------------------------------------------------------------------------
diff --git a/tests/libc/check_compliance.ml b/tests/libc/check_compliance.ml
index 6fa7f52646edde6a534679816ff750640fffbb95..978fd6574cad91d274e209449d05983a938717a7 100644
--- a/tests/libc/check_compliance.ml
+++ b/tests/libc/check_compliance.ml
@@ -45,45 +45,41 @@ let run_once = ref false
 
 module StringSet = Set.Make(String)
 
-let get_idents dir f =
-  let file = Filename.concat dir f in
-  let open Yojson.Basic.Util in
-  Kernel.feedback "parsing %s" f;
-  let json = Yojson.Basic.from_file file in
-  let elements = json |> member "data" |> to_list in
-  List.fold_left (fun acc e ->
-      let ident = e |> member "ident" |> to_string in
-      StringSet.add ident acc
-    ) StringSet.empty elements
+module Json =
+struct
+  open Yojson.Basic
+  open Util
 
-let get_ident_headers dir f =
-  let file = Filename.concat dir f in
-  let idents = Hashtbl.create 500 in
-  let open Yojson.Basic.Util in
-  Kernel.feedback "parsing %s" f;
-  let json = Yojson.Basic.from_file file in
-  let elements = json |> member "data" |> to_list in
-  List.iter (fun e ->
-      let ident = e |> member "ident" |> to_string in
-      let header = e |> member "header" |> to_string in
-      Hashtbl.replace idents ident header
-    ) elements;
-  idents
+  let parse dir f =
+    let file = Filename.concat dir f in
+    Kernel.feedback "Parsing %s" f;
+    let json = Yojson.Basic.from_file file in
+    member "data" json
 
-let get_ident_headers_and_extensions dir f =
-  let file = Filename.concat dir f in
-  let idents = Hashtbl.create 500 in
-  let open Yojson.Basic.Util in
-  Kernel.feedback "parsing %s" f;
-  let json = Yojson.Basic.from_file file in
-  let elements = json |> member "data" |> to_list in
-  List.iter (fun e ->
-      let ident = e |> member "ident" |> to_string in
-      let header = e |> member "header" |> to_string in
-      let extensions = e |> member "extensions" |> to_list in
-      Hashtbl.replace idents ident (header, extensions)
-    ) elements;
-  idents
+  let to_set (json : t) : StringSet.t =
+    json |> to_list |> List.map to_string |> StringSet.of_list
+
+  let keys (json : t) : StringSet.t =
+    json |> to_assoc |> List.map fst |> StringSet.of_list
+
+  type _ table_format =
+    | HeadersOnly : string table_format
+    | HeadersAndExtensions : (string*t list) table_format
+
+  let to_table : type a. a table_format -> t -> (string,a) Hashtbl.t =
+    let convert json : a table_format -> a = function
+      | HeadersOnly ->
+        json |> member "header" |> to_string
+      | HeadersAndExtensions ->
+        json |> member "header" |> to_string,
+        json |> member "extensions" |> to_list
+    in
+    fun format json ->
+      let table = Hashtbl.create 500 in
+      json |> to_assoc |> List.iter (fun (ident, values) ->
+        Hashtbl.replace table ident (convert values format));
+      table
+end
 
 let () =
   Db.Main.extend (fun () ->
@@ -93,10 +89,11 @@ let () =
         ignore (Visitor.visitFramacFile (vis :> Visitor.frama_c_visitor) (Ast.get ()));
         let fc_stdlib_idents = vis#get_idents in
         let dir = Filename.concat Fc_config.datadir "compliance" in
-        let c11_idents = get_ident_headers dir "c11_functions.json" in
-        let glibc_idents = get_idents dir "glibc_functions.json" in
-        let posix_idents = get_ident_headers_and_extensions dir "posix_identifiers.json" in
-        let nonstandard_idents = get_idents dir "nonstandard_identifiers.json" in
+        let c11_idents = Json.(to_table HeadersOnly (parse dir "c11_functions.json"))
+        and c11_headers = Json.(to_set (parse dir "c11_headers.json"))
+        and glibc_idents = Json.(to_set (parse dir "glibc_functions.json"))
+        and posix_idents = Json.(to_table HeadersAndExtensions (parse dir "posix_identifiers.json"))
+        and nonstandard_idents = Json.(keys (parse dir "nonstandard_identifiers.json")) in
         Hashtbl.iter (fun id headers ->
             if not (Extlib.string_prefix "__" id) &&
                not (Extlib.string_prefix "Frama_C" id) &&
@@ -107,13 +104,14 @@ let () =
               let id_in_posix = Hashtbl.mem posix_idents id in
               let id_in_glibc = StringSet.mem id glibc_idents in
               let id_in_nonstd = StringSet.mem id nonstandard_idents in
+              let header_in_c11 h = StringSet.mem h c11_headers in
               if id_in_c11 then begin
                 (* Check that the header is the expected one.
                    Note that some symbols may appear in more than one header,
                    possibly due to collisions
                    (e.g. 'flock' as type and function). *)
                 let h = Hashtbl.find c11_idents id in
-                if not (List.mem h headers) then
+                if not (header_in_c11 h) then
                   Kernel.warning "<%a>:%s : C11 says %s"
                     (Pretty_utils.pp_list ~sep:"," Format.pp_print_string) headers
                     id h
diff --git a/tests/libc/check_libc_anonymous_tags.ml b/tests/libc/check_libc_anonymous_tags.ml
index 62bb754fb908f86bb3bbb7bdb0fc903341eb20f4..96910a7f5614aff8ce8eb1fd6ea2a5364f454540 100644
--- a/tests/libc/check_libc_anonymous_tags.ml
+++ b/tests/libc/check_libc_anonymous_tags.ml
@@ -8,7 +8,7 @@ class tags_visitor = object
   val in_stdlib = ref false
 
   method! vglob_aux g =
-    if Cil.hasAttribute "fc_stdlib" (Cil.global_attributes g) then
+    if Cil.global_is_in_libc g then
       begin
         in_stdlib := true;
         begin
diff --git a/tests/libc/check_libc_naming_conventions.ml b/tests/libc/check_libc_naming_conventions.ml
index c928b21109bbdf51e6ef14a7d61d59db44b7fd73..b4f0bdbd1988e9dee39c410f4e17810aab53f5d8 100644
--- a/tests/libc/check_libc_naming_conventions.ml
+++ b/tests/libc/check_libc_naming_conventions.ml
@@ -55,7 +55,7 @@ let () =
               | Definition (fd, _) -> fd.svar.vattr
               | Declaration (_, vi, _, _) -> vi.vattr
             in
-            if Cil.hasAttribute "fc_stdlib" fun_attrs then begin
+            if Cil.is_in_libc fun_attrs then begin
               Annotations.iter_behaviors (fun _emitter bhv ->
                   List.iter (fun ip ->
                       let pred = Logic_const.pred_of_id_pred ip in
diff --git a/tests/libc/fc_libc.c b/tests/libc/fc_libc.c
index cf60494482ace1fc64556e8b763f568be70b237c..6ac81ce2fed1b8cbf42a6db43355c0c212eb58c8 100644
--- a/tests/libc/fc_libc.c
+++ b/tests/libc/fc_libc.c
@@ -1,4 +1,5 @@
 /* run.config*
+<<<<<<< HEAD
    CMXS: check_libc_naming_conventions
    CMXS: check_const
    CMXS: check_parsing_individual_headers
@@ -12,6 +13,31 @@
    OPT: -load-module %{dep:check_compliance.cmxs} -kernel-msg-key printer:attrs
    DEPS: ./check_full_libc.sh
    CMD: ./check_full_libc.sh
+||||||| ac7807782d
+   EXECNOW: make -s @PTEST_DIR@/check_libc_naming_conventions.cmxs
+   EXECNOW: make -s @PTEST_DIR@/check_const.cmxs
+   EXECNOW: make -s @PTEST_DIR@/check_parsing_individual_headers.cmxs
+   EXECNOW: make -s @PTEST_DIR@/check_libc_anonymous_tags.cmxs
+   EXECNOW: make -s @PTEST_DIR@/check_compliance.cmxs
+   OPT: -load-module @PTEST_DIR@/check_libc_naming_conventions -print -cpp-extra-args='-nostdinc -Ishare/libc' -metrics -metrics-libc -load-module @PTEST_DIR@/check_const -load-module metrics -eva @EVA_CONFIG@ -then -lib-entry -no-print -metrics-no-libc
+   OPT: -print -print-libc
+   OPT: -load-module @PTEST_DIR@/check_parsing_individual_headers
+   OPT: -load-module @PTEST_DIR@/check_libc_anonymous_tags
+   OPT: -load-module @PTEST_DIR@/check_compliance -kernel-msg-key printer:attrs
+   CMD: ./tests/libc/check_full_libc.sh
+=======
+   EXECNOW: make -s @PTEST_DIR@/check_libc_naming_conventions.cmxs
+   EXECNOW: make -s @PTEST_DIR@/check_const.cmxs
+   EXECNOW: make -s @PTEST_DIR@/check_parsing_individual_headers.cmxs
+   EXECNOW: make -s @PTEST_DIR@/check_libc_anonymous_tags.cmxs
+   EXECNOW: make -s @PTEST_DIR@/check_compliance.cmxs
+   OPT: -load-module @PTEST_DIR@/check_libc_naming_conventions -print -cpp-extra-args='-nostdinc -Ishare/libc' -metrics -metrics-libc -load-module @PTEST_DIR@/check_const -load-module metrics -eva @EVA_CONFIG@ -then -lib-entry -no-print -metrics-no-libc
+   OPT: -print -print-libc -machdep x86_32
+   OPT: -load-module @PTEST_DIR@/check_parsing_individual_headers
+   OPT: -load-module @PTEST_DIR@/check_libc_anonymous_tags
+   OPT: -load-module @PTEST_DIR@/check_compliance -kernel-msg-key printer:attrs
+   CMD: ./tests/libc/check_full_libc.sh
+>>>>>>> origin/master
    OPT:
 **/
 #define __FC_REG_TEST
diff --git a/tests/libc/inttypes_h2.c b/tests/libc/inttypes_h2.c
index afc8226a0cdc3812504ac1abf0abae80d6ba3fd9..331ffd2e80d647d430ef76709ffa4105fc6c0c12 100644
--- a/tests/libc/inttypes_h2.c
+++ b/tests/libc/inttypes_h2.c
@@ -22,4 +22,11 @@ void main() {
   r = imaxdiv(a, b);
   //@ assert r.quot == 2;
   //@ assert r.rem == 1;
+
+  a = imaxabs(INTMAX_MAX);
+  //@ assert a == INTMAX_MAX;
+  a = imaxabs(INTMAX_MIN + 1);
+  //@ assert a >= 0;
+  a = imaxabs(0);
+  //@ assert a == 0;
 }
diff --git a/tests/libc/math_h.c b/tests/libc/math_h.c
index 95ded2bf103805d967ffae4a1525e5a4bc828ae6..b88b61298587fe81bc0644190254c9237d4625d7 100644
--- a/tests/libc/math_h.c
+++ b/tests/libc/math_h.c
@@ -1,5 +1,6 @@
 /* run.config
-   STDOPT: #"-warn-special-float none" #"-cpp-extra-args=\"-DNONFINITE\""
+   FILTER: sed -E -e '/atanf_/ s/([0-9][.][0-9]{6})[0-9]+/\1/g'
+   STDOPT: #"-warn-special-float none" #"-cpp-extra-args=\"-DNONFINITE\"" #"-eva-slevel 4"
 */
 #include <math.h>
 const double pi = 3.14159265358979323846264338327950288;
@@ -29,7 +30,6 @@ const double fp_ilogb0 = FP_ILOGB0;
 const double fp_ilogbnan = FP_ILOGBNAN;
 
 #define TEST_VAL(type,f,c) type f##_##c = f(c)
-
 #define TEST_FUN(type,f,prefix)                 \
   TEST_VAL(type,f,prefix##pi);                  \
   TEST_VAL(type,f,prefix##half_pi);             \
@@ -48,4 +48,20 @@ int main() {
   TEST_FUN(double,fabs,);
   TEST_FUN(float,fabsf,f_);
   TEST_FUN(long double,fabsl,ld_);
+
+#ifdef NONFINITE
+  int r;
+  r = isfinite(pi);
+  //@ assert r;
+  r = isfinite(large);
+  //@ assert r;
+  r = isfinite(0.0f);
+  //@ assert r;
+  r = isfinite(huge_val);
+  //@ assert !r;
+  r = isfinite(-INFINITY);
+  //@ assert !r;
+  r = isfinite(NAN);
+  //@ assert !r;
+#endif
 }
diff --git a/tests/libc/oracle/fc_libc.0.res.oracle b/tests/libc/oracle/fc_libc.0.res.oracle
index d25877b1c9451da78f4f32d3ed6a402e329d44a3..901359259fba060688320b66012b4ea1fdf1a11b 100644
--- a/tests/libc/oracle/fc_libc.0.res.oracle
+++ b/tests/libc/oracle/fc_libc.0.res.oracle
@@ -1,4 +1,12 @@
+<<<<<<< HEAD
 [kernel] Parsing fc_libc.c (with preprocessing)
+||||||| ac7807782d
+[kernel] Parsing tests/libc/fc_libc.c (with preprocessing)
+=======
+[kernel] Parsing tests/libc/fc_libc.c (with preprocessing)
+[kernel] share/libc/sys/socket.h:451: Warning: 
+  clause with '\initialized' must contain name 'initialization'
+>>>>>>> origin/master
 [eva] Analyzing a complete application starting at main
 [eva] Computing initial state
 [eva] Initial state computed
@@ -41,7 +49,13 @@
    wcscpy (0 call); wcslen (2 calls); wcsncat (0 call); wcsncpy (0 call);
    wmemcpy (0 call); wmemset (0 call); 
   
+<<<<<<< HEAD
   Specified-only functions (414)
+||||||| ac7807782d
+  Specified-only functions (411)
+=======
+  Specified-only functions (413)
+>>>>>>> origin/master
   ==============================
    FD_CLR (0 call); FD_ISSET (0 call); FD_SET (0 call); FD_ZERO (0 call);
    Frama_C_abstract_cardinal (0 call); Frama_C_abstract_max (0 call);
@@ -134,49 +148,51 @@
    putchar (0 call); putchar_unlocked (0 call); puts (0 call); qsort (0 call);
    quick_exit (0 call); raise (0 call); rand (0 call); random (0 call);
    read (0 call); readdir (0 call); readv (0 call); realloc (3 calls);
-   recv (0 call); recvmsg (0 call); remove (0 call); rename (0 call);
-   rewind (0 call); round (0 call); roundf (0 call); roundl (0 call);
-   seed48 (0 call); select (0 call); send (0 call); setbuf (0 call);
-   setegid (0 call); seteuid (0 call); setgid (0 call); sethostname (0 call);
-   setitimer (0 call); setjmp (0 call); setlogmask (0 call); setpgid (0 call);
-   setpriority (0 call); setregid (0 call); setresgid (0 call);
-   setresuid (0 call); setreuid (0 call); setrlimit (0 call); setsid (0 call);
-   setsockopt (0 call); settimeofday (0 call); setuid (0 call);
-   setvbuf (0 call); shutdown (0 call); sigaction (0 call); sigaddset (0 call);
-   sigdelset (0 call); sigemptyset (0 call); sigfillset (0 call);
-   sigismember (0 call); siglongjmp (0 call); signal (0 call);
-   sigprocmask (0 call); sin (0 call); sinf (0 call); sinl (0 call);
-   socket (0 call); socketpair (0 call); sqrt (0 call); sqrtf (0 call);
-   sqrtl (0 call); srand (0 call); srand48 (0 call); srandom (0 call);
-   stat (0 call); stpcpy (0 call); strcasestr (0 call); strchrnul (0 call);
-   strcoll (0 call); strcspn (0 call); strftime (0 call); strlcat (0 call);
-   strlcpy (0 call); strncasecmp (0 call); strpbrk (0 call); strsep (0 call);
-   strspn (0 call); strtod (0 call); strtof (0 call); strtoimax (0 call);
-   strtok (0 call); strtok_r (0 call); strtol (0 call); strtold (0 call);
-   strtoll (0 call); strtoul (0 call); strtoull (0 call); strxfrm (0 call);
-   sync (0 call); sysconf (0 call); syslog (0 call); system (0 call);
-   tcflush (0 call); tcgetattr (0 call); tcsetattr (0 call); time (0 call);
-   times (0 call); tmpfile (0 call); tmpnam (0 call); trunc (0 call);
-   truncf (0 call); truncl (0 call); ttyname (0 call); tzset (0 call);
-   umask (0 call); uname (0 call); ungetc (0 call); unlink (0 call);
-   usleep (0 call); utimes (0 call); vfprintf (0 call); vfscanf (0 call);
-   vprintf (0 call); vscanf (0 call); vsnprintf (0 call); vsprintf (0 call);
-   vsyslog (0 call); wait (0 call); waitpid (0 call); wcschr (0 call);
-   wcscmp (0 call); wcscspn (0 call); wcslcat (0 call); wcslcpy (0 call);
-   wcsncmp (0 call); wcspbrk (0 call); wcsrchr (0 call); wcsspn (0 call);
-   wcsstr (0 call); wcstombs (0 call); wctomb (0 call); wmemchr (0 call);
-   wmemcmp (0 call); wmemmove (0 call); write (0 call); 
+   recv (0 call); recvfrom (0 call); recvmsg (0 call); remove (0 call);
+   rename (0 call); rewind (0 call); round (0 call); roundf (0 call);
+   roundl (0 call); seed48 (0 call); select (0 call); send (0 call);
+   sendto (0 call); setbuf (0 call); setegid (0 call); seteuid (0 call);
+   setgid (0 call); sethostname (0 call); setitimer (0 call); setjmp (0 call);
+   setlogmask (0 call); setpgid (0 call); setpriority (0 call);
+   setregid (0 call); setresgid (0 call); setresuid (0 call);
+   setreuid (0 call); setrlimit (0 call); setsid (0 call); setsockopt (0 call);
+   settimeofday (0 call); setuid (0 call); setvbuf (0 call); shutdown (0 call);
+   sigaction (0 call); sigaddset (0 call); sigdelset (0 call);
+   sigemptyset (0 call); sigfillset (0 call); sigismember (0 call);
+   siglongjmp (0 call); signal (0 call); sigprocmask (0 call); sin (0 call);
+   sinf (0 call); sinl (0 call); socket (0 call); socketpair (0 call);
+   sqrt (0 call); sqrtf (0 call); sqrtl (0 call); srand (0 call);
+   srand48 (0 call); srandom (0 call); stat (0 call); stpcpy (0 call);
+   strcasestr (0 call); strchrnul (0 call); strcoll (0 call); strcspn (0 call);
+   strftime (0 call); strlcat (0 call); strlcpy (0 call); strncasecmp (0 call);
+   strpbrk (0 call); strsep (0 call); strspn (0 call); strtod (0 call);
+   strtof (0 call); strtoimax (0 call); strtok (0 call); strtok_r (0 call);
+   strtol (0 call); strtold (0 call); strtoll (0 call); strtoul (0 call);
+   strtoull (0 call); strxfrm (0 call); sync (0 call); sysconf (0 call);
+   syslog (0 call); system (0 call); tcflush (0 call); tcgetattr (0 call);
+   tcsetattr (0 call); time (0 call); times (0 call); tmpfile (0 call);
+   tmpnam (0 call); trunc (0 call); truncf (0 call); truncl (0 call);
+   ttyname (0 call); tzset (0 call); umask (0 call); uname (0 call);
+   ungetc (0 call); unlink (0 call); usleep (0 call); utimes (0 call);
+   vfprintf (0 call); vfscanf (0 call); vprintf (0 call); vscanf (0 call);
+   vsnprintf (0 call); vsprintf (0 call); vsyslog (0 call); wait (0 call);
+   waitpid (0 call); wcschr (0 call); wcscmp (0 call); wcscspn (0 call);
+   wcslcat (0 call); wcslcpy (0 call); wcsncmp (0 call); wcspbrk (0 call);
+   wcsrchr (0 call); wcsspn (0 call); wcsstr (0 call); wcstombs (0 call);
+   wctomb (0 call); wmemchr (0 call); wmemcmp (0 call); wmemmove (0 call);
+   write (0 call); 
   
   Undefined and unspecified functions (1)
   =======================================
    __builtin_abort (1 call); 
   
-  'Extern' global variables (16)
+  'Extern' global variables (20)
   ==============================
    __fc_basename; __fc_dirname; __fc_getpwuid_pw_dir; __fc_getpwuid_pw_name;
-   __fc_getpwuid_pw_passwd; __fc_getpwuid_pw_shell; __fc_hostname; __fc_locale;
-   __fc_locale_names; __fc_mblen_state; __fc_mbtowc_state; __fc_wctomb_state;
-   optarg; opterr; optopt; tzname
+   __fc_getpwuid_pw_passwd; __fc_getpwuid_pw_shell; __fc_heap_status;
+   __fc_hostname; __fc_locale; __fc_locale_names; __fc_mblen_state;
+   __fc_mbtowc_state; __fc_random_counter; __fc_stack_status; __fc_tz;
+   __fc_wctomb_state; optarg; opterr; optopt; tzname
   
   Potential entry points (1)
   ==========================
@@ -186,13 +202,19 @@
   ============== 
   Sloc = 1127
   Decision point = 213
-  Global variables = 70
+  Global variables = 85
   If = 198
   Loop = 43
   Goto = 97
   Assignment = 459
   Exit point = 83
+<<<<<<< HEAD
   Function = 498
+||||||| ac7807782d
+  Function = 495
+=======
+  Function = 497
+>>>>>>> origin/master
   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 793a4fbfe522236730dc947e7185341734fc91b0..0bf9f4d6c0df042dd3d20465c2f1985872eb6ac1 100644
--- a/tests/libc/oracle/fc_libc.1.res.oracle
+++ b/tests/libc/oracle/fc_libc.1.res.oracle
@@ -380,8 +380,7 @@ struct termios {
    tcflag_t c_lflag ;
    cc_t c_cc[32] ;
 };
-int volatile Frama_C_entropy_source __attribute__((__unused__,
-                                                   __FRAMA_C_MODEL__));
+int volatile Frama_C_entropy_source __attribute__((__unused__));
 void Frama_C_make_unknown(char *p, size_t l);
 
 int Frama_C_nondet(int a, int b);
@@ -1129,8 +1128,7 @@ int feholdexcept(fenv_t *envp);
 
 int fesetenv(fenv_t const *envp);
 
-static int volatile fetestexcept___fc_random_fetestexcept __attribute__((
-  __FRAMA_C_MODEL__));
+static int volatile fetestexcept___fc_random_fetestexcept;
 int fetestexcept(int excepts)
 {
   int __retres;
@@ -1138,7 +1136,7 @@ int fetestexcept(int excepts)
   return __retres;
 }
 
-fenv_t volatile __fc_fenv_state __attribute__((__FRAMA_C_MODEL__));
+fenv_t volatile __fc_fenv_state;
 int feholdexcept(fenv_t *envp)
 {
   int __retres;
@@ -1913,7 +1911,7 @@ int glob(char const *pattern, int flags,
 
 void globfree(glob_t *pglob);
 
-/*@ ghost extern int __fc_heap_status __attribute__((__FRAMA_C_MODEL__)); */
+/*@ ghost extern int __fc_heap_status; */
 
 /*@
 axiomatic dynamic_allocation {
@@ -2179,9 +2177,7 @@ extern unsigned long strtoul(char const * __restrict nptr,
 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__));
-*/
+/*@ ghost extern int __fc_random_counter __attribute__((__unused__)); */
 
 unsigned long const __fc_rand_max = (unsigned long)32767;
 /*@ ensures result_range: 0 ≤ \result ≤ __fc_rand_max;
@@ -2205,8 +2201,8 @@ extern long random(void);
     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__));
+int __fc_random48_init;
+unsigned short __fc_random48_counter[3];
 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;
@@ -2398,7 +2394,7 @@ extern  __attribute__((__noreturn__)) void exit(int status);
     assigns \nothing; */
 extern  __attribute__((__noreturn__)) void _Exit(int status);
 
-char *__fc_env[4096] __attribute__((__FRAMA_C_MODEL__));
+char *__fc_env[4096];
 char *getenv(char const *name);
 
 int putenv(char *string);
@@ -2675,7 +2671,11 @@ imaxdiv_t imaxdiv(intmax_t numer, intmax_t denom);
 extern intmax_t strtoimax(char const * __restrict nptr,
                           char ** __restrict endptr, int base);
 
-/*@ requires abs_representable: (long long)(-c) ≢ c;
+/*@ requires abs_representable: c > -9223372036854775807LL - 1LL;
+    ensures positive_result: \result ≥ 0.;
+    ensures
+      equal_magnitude_result: \result ≡ \old(c) ∨ \result ≡ -\old(c);
+    ensures logical_abs_result: \result ≡ \abs(\old(c));
     assigns \result;
     assigns \result \from c;
  */
@@ -3394,6 +3394,20 @@ float fabsf(float x)
   return_label: return __retres;
 }
 
+/*@ assigns \result;
+    assigns \result \from f;
+    
+    behavior finite:
+      assumes isfinite_f: \is_finite(f);
+      ensures nonzero_result: \result > 0 ∨ \result < 0;
+    
+    behavior nonfinite:
+      assumes nonfinite_f: ¬\is_finite(f);
+      ensures zero_result: \result ≡ 0;
+    
+    complete behaviors nonfinite, finite;
+    disjoint behaviors nonfinite, finite;
+ */
 int __finitef(float f)
 {
   int __retres;
@@ -3406,6 +3420,20 @@ int __finitef(float f)
   return __retres;
 }
 
+/*@ assigns \result;
+    assigns \result \from d;
+    
+    behavior finite:
+      assumes isfinite_d: \is_finite(d);
+      ensures nonzero_result: \result > 0 ∨ \result < 0;
+    
+    behavior nonfinite:
+      assumes nonfinite_d: ¬\is_finite(d);
+      ensures zero_result: \result ≡ 0;
+    
+    complete behaviors nonfinite, finite;
+    disjoint behaviors nonfinite, finite;
+ */
 int __finite(double d)
 {
   int __retres;
@@ -3686,6 +3714,40 @@ extern int listen(int sockfd, int backlog);
  */
 extern ssize_t recv(int sockfd, void *buf, size_t len, int flags);
 
+/*@ requires valid_sockfd: 0 ≤ sockfd < 1024;
+    requires valid_buffer_length: \valid((char *)buf + (0 .. len - 1));
+    requires
+      valid_addrbuf_or_null:
+        (\valid(addrbuf_len) ∧ \initialized(addrbuf_len) ∧
+         \valid((char *)addrbuf + (0 .. *addrbuf_len - 1))) ∨
+        (addrbuf ≡ \null ∧ addrbuf_len ≡ \null);
+    ensures
+      result_error_or_received_length:
+        \result ≡ -1 ∨ (0 ≤ \result ≤ \old(len));
+    ensures
+      initialization: buf:
+        \initialized((char *)\old(buf) + (0 .. \result - 1));
+    ensures
+      initialization: addrbuf:
+        \old(addrbuf) ≢ \null ⇒
+        \initialized((char *)\old(addrbuf) + (0 .. \old(*addrbuf_len) - 1));
+    assigns *((char *)buf + (0 .. len - 1)), __fc_sockfds[sockfd], \result,
+            *addrbuf_len, *((char *)addrbuf + (0 .. \old(*addrbuf_len) - 1));
+    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];
+    assigns *addrbuf_len
+      \from (indirect: sockfd), (indirect: len), (indirect: flags),
+            __fc_sockfds[sockfd];
+    assigns *((char *)addrbuf + (0 .. \old(*addrbuf_len) - 1))
+      \from (indirect: sockfd), (indirect: len), (indirect: flags),
+            __fc_sockfds[sockfd];
+ */
+extern ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
+                        struct sockaddr *addrbuf, socklen_t *addrbuf_len);
+
 /*@ requires valid_sockfd: 0 ≤ sockfd < 1024;
     requires
       msg_control_has_room:
@@ -3737,6 +3799,23 @@ extern ssize_t recvmsg(int sockfd, struct msghdr *hdr, int flags);
  */
 extern ssize_t send(int sockfd, void const *buf, size_t len, 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 sendto(int sockfd, void const *buf, size_t len, int flags,
+                      struct sockaddr const *address, socklen_t address_len);
+
 /*@ requires valid_sockfd: 0 ≤ sockfd < 1024;
     requires
       optval_null_or_has_room:
@@ -3943,7 +4022,7 @@ 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;
     assigns \result \from *(s + (0 ..)), *(accept + (0 ..));
     assigns \result
       \from (indirect: *(s + (0 ..))), (indirect: *(accept + (0 ..)));
@@ -6241,8 +6320,7 @@ char *strsignal(int signum)
   return __retres;
 }
 
-/*@ ghost unsigned int volatile __fc_time __attribute__((__FRAMA_C_MODEL__));
-  */
+/*@ ghost unsigned int volatile __fc_time; */
 /*@ assigns \result;
     assigns \result \from __fc_time; */
 extern clock_t clock(void);
@@ -6380,8 +6458,7 @@ axiomatic nanosleep_predicates {
   }
 
 */
-/*@ ghost int volatile __fc_interrupted __attribute__((__FRAMA_C_MODEL__));
-  */
+/*@ ghost int volatile __fc_interrupted; */
 /*@ requires valid_request: \valid_read(rqtp);
     requires
       initialization: initialized_request:
@@ -6890,7 +6967,7 @@ wchar_t *wcsncat(wchar_t *dest, wchar_t const *src, size_t n)
   return dest;
 }
 
-/*@ ghost extern int __fc_stack_status __attribute__((__FRAMA_C_MODEL__)); */
+/*@ ghost extern int __fc_stack_status; */
 
 /*@ ensures allocation: \fresh{Old, Here}(\result,\old(size));
     assigns __fc_stack_status, \result;
@@ -7372,7 +7449,7 @@ extern int __va_openat_void(int dirfd, char const *filename, int flags);
 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__)); */
+/*@ ghost extern int __fc_tz; */
 
 /*@ requires valid_path: valid_read_string(path);
     requires
@@ -7456,15 +7533,9 @@ extern int gettimeofday(struct timeval * __restrict tv, void * __restrict 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__));
-  */
+/*@ ghost struct itimerval volatile __fc_itimer_real; */
+/*@ ghost struct itimerval volatile __fc_itimer_virtual; */
+/*@ ghost struct itimerval volatile __fc_itimer_prof; */
 /*@ requires valid_curr_value: \valid(curr_value);
     ensures initialization: curr_value: \initialized(\old(curr_value));
     assigns \result, *curr_value;
diff --git a/tests/libc/oracle/fc_libc.4.res.oracle b/tests/libc/oracle/fc_libc.4.res.oracle
index c69a0a2cd6c8a01f2c0bd8934ae6ef1c0cd28b6b..e1704e664e99e9a68a2b6315657c0b21e86a0931 100644
--- a/tests/libc/oracle/fc_libc.4.res.oracle
+++ b/tests/libc/oracle/fc_libc.4.res.oracle
@@ -1,5 +1,20 @@
+<<<<<<< HEAD
 [kernel] Parsing fc_libc.c (with preprocessing)
 [kernel] parsing c11_functions.json
 [kernel] parsing glibc_functions.json
 [kernel] parsing posix_identifiers.json
 [kernel] parsing nonstandard_identifiers.json
+||||||| ac7807782d
+[kernel] Parsing tests/libc/fc_libc.c (with preprocessing)
+[kernel] parsing c11_functions.json
+[kernel] parsing glibc_functions.json
+[kernel] parsing posix_identifiers.json
+[kernel] parsing nonstandard_identifiers.json
+=======
+[kernel] Parsing tests/libc/fc_libc.c (with preprocessing)
+[kernel] Parsing c11_functions.json
+[kernel] Parsing c11_headers.json
+[kernel] Parsing glibc_functions.json
+[kernel] Parsing posix_identifiers.json
+[kernel] Parsing nonstandard_identifiers.json
+>>>>>>> origin/master
diff --git a/tests/libc/oracle/inttypes_h.0.res.oracle b/tests/libc/oracle/inttypes_h.0.res.oracle
index f3033c0b8b93df7a385fe2b39d8c3c844409a9ff..bef94d501952891872074a7bd4ef498f713a72aa 100644
--- a/tests/libc/oracle/inttypes_h.0.res.oracle
+++ b/tests/libc/oracle/inttypes_h.0.res.oracle
@@ -2531,255 +2531,255 @@ int main(void)
   int __retres;
   {
     int8_t x;
-    scanf_va_1("%hhd",(signed char *)(& x));
-    printf_va_1("%hhd",(int)x);
-    scanf_va_2("%hhi",(signed char *)(& x));
-    printf_va_2("%hhi",(int)x);
+    scanf("%hhd",(signed char *)(& x)); /* scanf_va_1 */
+    printf("%hhd",(int)x); /* printf_va_1 */
+    scanf("%hhi",(signed char *)(& x)); /* scanf_va_2 */
+    printf("%hhi",(int)x); /* printf_va_2 */
   }
   {
     uint8_t x_0;
-    scanf_va_3("%hho",(unsigned char *)(& x_0));
-    printf_va_3("%hho",(int)x_0);
-    scanf_va_4("%hhu",(unsigned char *)(& x_0));
-    printf_va_4("%hhu",(int)x_0);
-    scanf_va_5("%hhx",(unsigned char *)(& x_0));
-    printf_va_5("%hhx",(int)x_0);
-    scanf_va_6("%hhx",(unsigned char *)(& x_0));
-    printf_va_6("%hhX",(int)x_0);
+    scanf("%hho",(unsigned char *)(& x_0)); /* scanf_va_3 */
+    printf("%hho",(int)x_0); /* printf_va_3 */
+    scanf("%hhu",(unsigned char *)(& x_0)); /* scanf_va_4 */
+    printf("%hhu",(int)x_0); /* printf_va_4 */
+    scanf("%hhx",(unsigned char *)(& x_0)); /* scanf_va_5 */
+    printf("%hhx",(int)x_0); /* printf_va_5 */
+    scanf("%hhx",(unsigned char *)(& x_0)); /* scanf_va_6 */
+    printf("%hhX",(int)x_0); /* printf_va_6 */
   }
   {
     int16_t x_1;
-    scanf_va_7("%hd",(short *)(& x_1));
-    printf_va_7("%hd",(int)x_1);
-    scanf_va_8("%hi",(short *)(& x_1));
-    printf_va_8("%hi",(int)x_1);
+    scanf("%hd",(short *)(& x_1)); /* scanf_va_7 */
+    printf("%hd",(int)x_1); /* printf_va_7 */
+    scanf("%hi",(short *)(& x_1)); /* scanf_va_8 */
+    printf("%hi",(int)x_1); /* printf_va_8 */
   }
   {
     uint16_t x_2;
-    scanf_va_9("%ho",(unsigned short *)(& x_2));
-    printf_va_9("%ho",(unsigned int)x_2);
-    scanf_va_10("%hu",(unsigned short *)(& x_2));
-    printf_va_10("%hu",(unsigned int)x_2);
-    scanf_va_11("%hx",(unsigned short *)(& x_2));
-    printf_va_11("%hx",(unsigned int)x_2);
-    scanf_va_12("%hx",(unsigned short *)(& x_2));
-    printf_va_12("%hX",(unsigned int)x_2);
+    scanf("%ho",(unsigned short *)(& x_2)); /* scanf_va_9 */
+    printf("%ho",(unsigned int)x_2); /* printf_va_9 */
+    scanf("%hu",(unsigned short *)(& x_2)); /* scanf_va_10 */
+    printf("%hu",(unsigned int)x_2); /* printf_va_10 */
+    scanf("%hx",(unsigned short *)(& x_2)); /* scanf_va_11 */
+    printf("%hx",(unsigned int)x_2); /* printf_va_11 */
+    scanf("%hx",(unsigned short *)(& x_2)); /* scanf_va_12 */
+    printf("%hX",(unsigned int)x_2); /* printf_va_12 */
   }
   {
     int32_t x_3;
-    scanf_va_13("%ld",(long *)(& x_3));
-    printf_va_13("%ld",x_3);
-    scanf_va_14("%li",(long *)(& x_3));
-    printf_va_14("%li",x_3);
+    scanf("%ld",(long *)(& x_3)); /* scanf_va_13 */
+    printf("%ld",x_3); /* printf_va_13 */
+    scanf("%li",(long *)(& x_3)); /* scanf_va_14 */
+    printf("%li",x_3); /* printf_va_14 */
   }
   {
     uint32_t x_4;
-    scanf_va_15("%lo",(unsigned long *)(& x_4));
-    printf_va_15("%lo",x_4);
-    scanf_va_16("%lu",(unsigned long *)(& x_4));
-    printf_va_16("%lu",x_4);
-    scanf_va_17("%lx",(unsigned long *)(& x_4));
-    printf_va_17("%lx",x_4);
-    scanf_va_18("%lx",(unsigned long *)(& x_4));
-    printf_va_18("%lX",x_4);
+    scanf("%lo",(unsigned long *)(& x_4)); /* scanf_va_15 */
+    printf("%lo",x_4); /* printf_va_15 */
+    scanf("%lu",(unsigned long *)(& x_4)); /* scanf_va_16 */
+    printf("%lu",x_4); /* printf_va_16 */
+    scanf("%lx",(unsigned long *)(& x_4)); /* scanf_va_17 */
+    printf("%lx",x_4); /* printf_va_17 */
+    scanf("%lx",(unsigned long *)(& x_4)); /* scanf_va_18 */
+    printf("%lX",x_4); /* printf_va_18 */
   }
   {
     int64_t x_5;
-    scanf_va_19("%lld",(long long *)(& x_5));
-    printf_va_19("%lld",x_5);
-    scanf_va_20("%lli",(long long *)(& x_5));
-    printf_va_20("%lli",x_5);
+    scanf("%lld",(long long *)(& x_5)); /* scanf_va_19 */
+    printf("%lld",x_5); /* printf_va_19 */
+    scanf("%lli",(long long *)(& x_5)); /* scanf_va_20 */
+    printf("%lli",x_5); /* printf_va_20 */
   }
   {
     uint64_t x_6;
-    scanf_va_21("%llo",(unsigned long long *)(& x_6));
-    printf_va_21("%llo",x_6);
-    scanf_va_22("%llu",(unsigned long long *)(& x_6));
-    printf_va_22("%llu",x_6);
-    scanf_va_23("%llx",(unsigned long long *)(& x_6));
-    printf_va_23("%llx",x_6);
-    scanf_va_24("%llx",(unsigned long long *)(& x_6));
-    printf_va_24("%llX",x_6);
+    scanf("%llo",(unsigned long long *)(& x_6)); /* scanf_va_21 */
+    printf("%llo",x_6); /* printf_va_21 */
+    scanf("%llu",(unsigned long long *)(& x_6)); /* scanf_va_22 */
+    printf("%llu",x_6); /* printf_va_22 */
+    scanf("%llx",(unsigned long long *)(& x_6)); /* scanf_va_23 */
+    printf("%llx",x_6); /* printf_va_23 */
+    scanf("%llx",(unsigned long long *)(& x_6)); /* scanf_va_24 */
+    printf("%llX",x_6); /* printf_va_24 */
   }
   {
     int_least8_t x_7;
-    scanf_va_25("%hhd",(signed char *)(& x_7));
-    printf_va_25("%hhd",(int)x_7);
-    scanf_va_26("%hhi",(signed char *)(& x_7));
-    printf_va_26("%hhi",(int)x_7);
+    scanf("%hhd",(signed char *)(& x_7)); /* scanf_va_25 */
+    printf("%hhd",(int)x_7); /* printf_va_25 */
+    scanf("%hhi",(signed char *)(& x_7)); /* scanf_va_26 */
+    printf("%hhi",(int)x_7); /* printf_va_26 */
   }
   {
     uint_least8_t x_8;
-    scanf_va_27("%hho",(unsigned char *)(& x_8));
-    printf_va_27("%hho",(int)x_8);
-    scanf_va_28("%hhu",(unsigned char *)(& x_8));
-    printf_va_28("%hhu",(int)x_8);
-    scanf_va_29("%hhx",(unsigned char *)(& x_8));
-    printf_va_29("%hhx",(int)x_8);
-    scanf_va_30("%hhx",(unsigned char *)(& x_8));
-    printf_va_30("%hhX",(int)x_8);
+    scanf("%hho",(unsigned char *)(& x_8)); /* scanf_va_27 */
+    printf("%hho",(int)x_8); /* printf_va_27 */
+    scanf("%hhu",(unsigned char *)(& x_8)); /* scanf_va_28 */
+    printf("%hhu",(int)x_8); /* printf_va_28 */
+    scanf("%hhx",(unsigned char *)(& x_8)); /* scanf_va_29 */
+    printf("%hhx",(int)x_8); /* printf_va_29 */
+    scanf("%hhx",(unsigned char *)(& x_8)); /* scanf_va_30 */
+    printf("%hhX",(int)x_8); /* printf_va_30 */
   }
   {
     int_least16_t x_9;
-    scanf_va_31("%hd",(short *)(& x_9));
-    printf_va_31("%hd",(int)x_9);
-    scanf_va_32("%hi",(short *)(& x_9));
-    printf_va_32("%hi",(int)x_9);
+    scanf("%hd",(short *)(& x_9)); /* scanf_va_31 */
+    printf("%hd",(int)x_9); /* printf_va_31 */
+    scanf("%hi",(short *)(& x_9)); /* scanf_va_32 */
+    printf("%hi",(int)x_9); /* printf_va_32 */
   }
   {
     uint_least16_t x_10;
-    scanf_va_33("%ho",(unsigned short *)(& x_10));
-    printf_va_33("%ho",(unsigned int)x_10);
-    scanf_va_34("%hu",(unsigned short *)(& x_10));
-    printf_va_34("%hu",(unsigned int)x_10);
-    scanf_va_35("%hx",(unsigned short *)(& x_10));
-    printf_va_35("%hx",(unsigned int)x_10);
-    scanf_va_36("%hx",(unsigned short *)(& x_10));
-    printf_va_36("%hX",(unsigned int)x_10);
+    scanf("%ho",(unsigned short *)(& x_10)); /* scanf_va_33 */
+    printf("%ho",(unsigned int)x_10); /* printf_va_33 */
+    scanf("%hu",(unsigned short *)(& x_10)); /* scanf_va_34 */
+    printf("%hu",(unsigned int)x_10); /* printf_va_34 */
+    scanf("%hx",(unsigned short *)(& x_10)); /* scanf_va_35 */
+    printf("%hx",(unsigned int)x_10); /* printf_va_35 */
+    scanf("%hx",(unsigned short *)(& x_10)); /* scanf_va_36 */
+    printf("%hX",(unsigned int)x_10); /* printf_va_36 */
   }
   {
     int_least32_t x_11;
-    scanf_va_37("%ld",(long *)(& x_11));
-    printf_va_37("%ld",x_11);
-    scanf_va_38("%li",(long *)(& x_11));
-    printf_va_38("%li",x_11);
+    scanf("%ld",(long *)(& x_11)); /* scanf_va_37 */
+    printf("%ld",x_11); /* printf_va_37 */
+    scanf("%li",(long *)(& x_11)); /* scanf_va_38 */
+    printf("%li",x_11); /* printf_va_38 */
   }
   {
     uint_least32_t x_12;
-    scanf_va_39("%lo",(unsigned long *)(& x_12));
-    printf_va_39("%lo",x_12);
-    scanf_va_40("%lu",(unsigned long *)(& x_12));
-    printf_va_40("%lu",x_12);
-    scanf_va_41("%lx",(unsigned long *)(& x_12));
-    printf_va_41("%lx",x_12);
-    scanf_va_42("%lx",(unsigned long *)(& x_12));
-    printf_va_42("%lX",x_12);
+    scanf("%lo",(unsigned long *)(& x_12)); /* scanf_va_39 */
+    printf("%lo",x_12); /* printf_va_39 */
+    scanf("%lu",(unsigned long *)(& x_12)); /* scanf_va_40 */
+    printf("%lu",x_12); /* printf_va_40 */
+    scanf("%lx",(unsigned long *)(& x_12)); /* scanf_va_41 */
+    printf("%lx",x_12); /* printf_va_41 */
+    scanf("%lx",(unsigned long *)(& x_12)); /* scanf_va_42 */
+    printf("%lX",x_12); /* printf_va_42 */
   }
   {
     int_least64_t x_13;
-    scanf_va_43("%lld",(long long *)(& x_13));
-    printf_va_43("%lld",x_13);
-    scanf_va_44("%lli",(long long *)(& x_13));
-    printf_va_44("%lli",x_13);
+    scanf("%lld",(long long *)(& x_13)); /* scanf_va_43 */
+    printf("%lld",x_13); /* printf_va_43 */
+    scanf("%lli",(long long *)(& x_13)); /* scanf_va_44 */
+    printf("%lli",x_13); /* printf_va_44 */
   }
   {
     uint_least64_t x_14;
-    scanf_va_45("%llo",(unsigned long long *)(& x_14));
-    printf_va_45("%llo",x_14);
-    scanf_va_46("%llu",(unsigned long long *)(& x_14));
-    printf_va_46("%llu",x_14);
-    scanf_va_47("%llx",(unsigned long long *)(& x_14));
-    printf_va_47("%llx",x_14);
-    scanf_va_48("%llx",(unsigned long long *)(& x_14));
-    printf_va_48("%llX",x_14);
+    scanf("%llo",(unsigned long long *)(& x_14)); /* scanf_va_45 */
+    printf("%llo",x_14); /* printf_va_45 */
+    scanf("%llu",(unsigned long long *)(& x_14)); /* scanf_va_46 */
+    printf("%llu",x_14); /* printf_va_46 */
+    scanf("%llx",(unsigned long long *)(& x_14)); /* scanf_va_47 */
+    printf("%llx",x_14); /* printf_va_47 */
+    scanf("%llx",(unsigned long long *)(& x_14)); /* scanf_va_48 */
+    printf("%llX",x_14); /* printf_va_48 */
   }
   {
     int_fast8_t x_15;
-    scanf_va_49("%hhd",(signed char *)(& x_15));
-    printf_va_49("%hhd",(int)x_15);
-    scanf_va_50("%hhi",(signed char *)(& x_15));
-    printf_va_50("%hhi",(int)x_15);
+    scanf("%hhd",(signed char *)(& x_15)); /* scanf_va_49 */
+    printf("%hhd",(int)x_15); /* printf_va_49 */
+    scanf("%hhi",(signed char *)(& x_15)); /* scanf_va_50 */
+    printf("%hhi",(int)x_15); /* printf_va_50 */
   }
   {
     uint_fast8_t x_16;
-    scanf_va_51("%hho",(unsigned char *)(& x_16));
-    printf_va_51("%hho",(int)x_16);
-    scanf_va_52("%hhu",(unsigned char *)(& x_16));
-    printf_va_52("%hhu",(int)x_16);
-    scanf_va_53("%hhx",(unsigned char *)(& x_16));
-    printf_va_53("%hhx",(int)x_16);
-    scanf_va_54("%hhx",(unsigned char *)(& x_16));
-    printf_va_54("%hhX",(int)x_16);
+    scanf("%hho",(unsigned char *)(& x_16)); /* scanf_va_51 */
+    printf("%hho",(int)x_16); /* printf_va_51 */
+    scanf("%hhu",(unsigned char *)(& x_16)); /* scanf_va_52 */
+    printf("%hhu",(int)x_16); /* printf_va_52 */
+    scanf("%hhx",(unsigned char *)(& x_16)); /* scanf_va_53 */
+    printf("%hhx",(int)x_16); /* printf_va_53 */
+    scanf("%hhx",(unsigned char *)(& x_16)); /* scanf_va_54 */
+    printf("%hhX",(int)x_16); /* printf_va_54 */
   }
   {
     int_fast16_t x_17;
-    scanf_va_55("%d",(int *)(& x_17));
-    printf_va_55("%d",x_17);
-    scanf_va_56("%i",(int *)(& x_17));
-    printf_va_56("%i",x_17);
+    scanf("%d",(int *)(& x_17)); /* scanf_va_55 */
+    printf("%d",x_17); /* printf_va_55 */
+    scanf("%i",(int *)(& x_17)); /* scanf_va_56 */
+    printf("%i",x_17); /* printf_va_56 */
   }
   {
     uint_fast16_t x_18;
-    scanf_va_57("%o",(unsigned int *)(& x_18));
-    printf_va_57("%o",x_18);
-    scanf_va_58("%u",(unsigned int *)(& x_18));
-    printf_va_58("%u",x_18);
-    scanf_va_59("%x",(unsigned int *)(& x_18));
-    printf_va_59("%x",x_18);
-    scanf_va_60("%x",(unsigned int *)(& x_18));
-    printf_va_60("%X",x_18);
+    scanf("%o",(unsigned int *)(& x_18)); /* scanf_va_57 */
+    printf("%o",x_18); /* printf_va_57 */
+    scanf("%u",(unsigned int *)(& x_18)); /* scanf_va_58 */
+    printf("%u",x_18); /* printf_va_58 */
+    scanf("%x",(unsigned int *)(& x_18)); /* scanf_va_59 */
+    printf("%x",x_18); /* printf_va_59 */
+    scanf("%x",(unsigned int *)(& x_18)); /* scanf_va_60 */
+    printf("%X",x_18); /* printf_va_60 */
   }
   {
     int_fast32_t x_19;
-    scanf_va_61("%ld",(long *)(& x_19));
-    printf_va_61("%ld",x_19);
-    scanf_va_62("%li",(long *)(& x_19));
-    printf_va_62("%li",x_19);
+    scanf("%ld",(long *)(& x_19)); /* scanf_va_61 */
+    printf("%ld",x_19); /* printf_va_61 */
+    scanf("%li",(long *)(& x_19)); /* scanf_va_62 */
+    printf("%li",x_19); /* printf_va_62 */
   }
   {
     uint_fast32_t x_20;
-    scanf_va_63("%lo",(unsigned long *)(& x_20));
-    printf_va_63("%lo",x_20);
-    scanf_va_64("%lu",(unsigned long *)(& x_20));
-    printf_va_64("%lu",x_20);
-    scanf_va_65("%lx",(unsigned long *)(& x_20));
-    printf_va_65("%lx",x_20);
-    scanf_va_66("%lx",(unsigned long *)(& x_20));
-    printf_va_66("%lX",x_20);
+    scanf("%lo",(unsigned long *)(& x_20)); /* scanf_va_63 */
+    printf("%lo",x_20); /* printf_va_63 */
+    scanf("%lu",(unsigned long *)(& x_20)); /* scanf_va_64 */
+    printf("%lu",x_20); /* printf_va_64 */
+    scanf("%lx",(unsigned long *)(& x_20)); /* scanf_va_65 */
+    printf("%lx",x_20); /* printf_va_65 */
+    scanf("%lx",(unsigned long *)(& x_20)); /* scanf_va_66 */
+    printf("%lX",x_20); /* printf_va_66 */
   }
   {
     int_fast64_t x_21;
-    scanf_va_67("%lld",(long long *)(& x_21));
-    printf_va_67("%lld",x_21);
-    scanf_va_68("%lli",(long long *)(& x_21));
-    printf_va_68("%lli",x_21);
+    scanf("%lld",(long long *)(& x_21)); /* scanf_va_67 */
+    printf("%lld",x_21); /* printf_va_67 */
+    scanf("%lli",(long long *)(& x_21)); /* scanf_va_68 */
+    printf("%lli",x_21); /* printf_va_68 */
   }
   {
     uint_fast64_t x_22;
-    scanf_va_69("%llo",(unsigned long long *)(& x_22));
-    printf_va_69("%llo",x_22);
-    scanf_va_70("%llu",(unsigned long long *)(& x_22));
-    printf_va_70("%llu",x_22);
-    scanf_va_71("%llx",(unsigned long long *)(& x_22));
-    printf_va_71("%llx",x_22);
-    scanf_va_72("%llx",(unsigned long long *)(& x_22));
-    printf_va_72("%llX",x_22);
+    scanf("%llo",(unsigned long long *)(& x_22)); /* scanf_va_69 */
+    printf("%llo",x_22); /* printf_va_69 */
+    scanf("%llu",(unsigned long long *)(& x_22)); /* scanf_va_70 */
+    printf("%llu",x_22); /* printf_va_70 */
+    scanf("%llx",(unsigned long long *)(& x_22)); /* scanf_va_71 */
+    printf("%llx",x_22); /* printf_va_71 */
+    scanf("%llx",(unsigned long long *)(& x_22)); /* scanf_va_72 */
+    printf("%llX",x_22); /* printf_va_72 */
   }
   {
     intmax_t x_23;
-    scanf_va_73("%lld",(long long *)(& x_23));
-    printf_va_73("%lld",x_23);
-    scanf_va_74("%lli",(long long *)(& x_23));
-    printf_va_74("%lli",x_23);
+    scanf("%lld",(long long *)(& x_23)); /* scanf_va_73 */
+    printf("%lld",x_23); /* printf_va_73 */
+    scanf("%lli",(long long *)(& x_23)); /* scanf_va_74 */
+    printf("%lli",x_23); /* printf_va_74 */
   }
   {
     uintmax_t x_24;
-    scanf_va_75("%llo",(unsigned long long *)(& x_24));
-    printf_va_75("%llo",x_24);
-    scanf_va_76("%llu",(unsigned long long *)(& x_24));
-    printf_va_76("%llu",x_24);
-    scanf_va_77("%llx",(unsigned long long *)(& x_24));
-    printf_va_77("%llx",x_24);
-    scanf_va_78("%llx",(unsigned long long *)(& x_24));
-    printf_va_78("%llX",x_24);
+    scanf("%llo",(unsigned long long *)(& x_24)); /* scanf_va_75 */
+    printf("%llo",x_24); /* printf_va_75 */
+    scanf("%llu",(unsigned long long *)(& x_24)); /* scanf_va_76 */
+    printf("%llu",x_24); /* printf_va_76 */
+    scanf("%llx",(unsigned long long *)(& x_24)); /* scanf_va_77 */
+    printf("%llx",x_24); /* printf_va_77 */
+    scanf("%llx",(unsigned long long *)(& x_24)); /* scanf_va_78 */
+    printf("%llX",x_24); /* printf_va_78 */
   }
   {
     intptr_t x_25;
-    scanf_va_79("%ld",(long *)(& x_25));
-    printf_va_79("%ld",x_25);
-    scanf_va_80("%li",(long *)(& x_25));
-    printf_va_80("%li",x_25);
+    scanf("%ld",(long *)(& x_25)); /* scanf_va_79 */
+    printf("%ld",x_25); /* printf_va_79 */
+    scanf("%li",(long *)(& x_25)); /* scanf_va_80 */
+    printf("%li",x_25); /* printf_va_80 */
   }
   {
     uintptr_t x_26;
-    scanf_va_81("%lo",(unsigned long *)(& x_26));
-    printf_va_81("%lo",x_26);
-    scanf_va_82("%lu",(unsigned long *)(& x_26));
-    printf_va_82("%lu",x_26);
-    scanf_va_83("%lx",(unsigned long *)(& x_26));
-    printf_va_83("%lx",x_26);
-    scanf_va_84("%lx",(unsigned long *)(& x_26));
-    printf_va_84("%lX",x_26);
+    scanf("%lo",(unsigned long *)(& x_26)); /* scanf_va_81 */
+    printf("%lo",x_26); /* printf_va_81 */
+    scanf("%lu",(unsigned long *)(& x_26)); /* scanf_va_82 */
+    printf("%lu",x_26); /* printf_va_82 */
+    scanf("%lx",(unsigned long *)(& x_26)); /* scanf_va_83 */
+    printf("%lx",x_26); /* printf_va_83 */
+    scanf("%lx",(unsigned long *)(& x_26)); /* scanf_va_84 */
+    printf("%lX",x_26); /* printf_va_84 */
   }
   __retres = 0;
   return __retres;
diff --git a/tests/libc/oracle/inttypes_h.1.res.oracle b/tests/libc/oracle/inttypes_h.1.res.oracle
index fdb3e620cbe42aef466f175602aaf3a2ce30aa52..ef6788e60221327a88e6b7600beabb3445b00628 100644
--- a/tests/libc/oracle/inttypes_h.1.res.oracle
+++ b/tests/libc/oracle/inttypes_h.1.res.oracle
@@ -2531,255 +2531,255 @@ int main(void)
   int __retres;
   {
     int8_t x;
-    scanf_va_1("%hhd",(signed char *)(& x));
-    printf_va_1("%hhd",(int)x);
-    scanf_va_2("%hhi",(signed char *)(& x));
-    printf_va_2("%hhi",(int)x);
+    scanf("%hhd",(signed char *)(& x)); /* scanf_va_1 */
+    printf("%hhd",(int)x); /* printf_va_1 */
+    scanf("%hhi",(signed char *)(& x)); /* scanf_va_2 */
+    printf("%hhi",(int)x); /* printf_va_2 */
   }
   {
     uint8_t x_0;
-    scanf_va_3("%hho",(unsigned char *)(& x_0));
-    printf_va_3("%hho",(int)x_0);
-    scanf_va_4("%hhu",(unsigned char *)(& x_0));
-    printf_va_4("%hhu",(int)x_0);
-    scanf_va_5("%hhx",(unsigned char *)(& x_0));
-    printf_va_5("%hhx",(int)x_0);
-    scanf_va_6("%hhx",(unsigned char *)(& x_0));
-    printf_va_6("%hhX",(int)x_0);
+    scanf("%hho",(unsigned char *)(& x_0)); /* scanf_va_3 */
+    printf("%hho",(int)x_0); /* printf_va_3 */
+    scanf("%hhu",(unsigned char *)(& x_0)); /* scanf_va_4 */
+    printf("%hhu",(int)x_0); /* printf_va_4 */
+    scanf("%hhx",(unsigned char *)(& x_0)); /* scanf_va_5 */
+    printf("%hhx",(int)x_0); /* printf_va_5 */
+    scanf("%hhx",(unsigned char *)(& x_0)); /* scanf_va_6 */
+    printf("%hhX",(int)x_0); /* printf_va_6 */
   }
   {
     int16_t x_1;
-    scanf_va_7("%hd",(short *)(& x_1));
-    printf_va_7("%hd",(int)x_1);
-    scanf_va_8("%hi",(short *)(& x_1));
-    printf_va_8("%hi",(int)x_1);
+    scanf("%hd",(short *)(& x_1)); /* scanf_va_7 */
+    printf("%hd",(int)x_1); /* printf_va_7 */
+    scanf("%hi",(short *)(& x_1)); /* scanf_va_8 */
+    printf("%hi",(int)x_1); /* printf_va_8 */
   }
   {
     uint16_t x_2;
-    scanf_va_9("%ho",(unsigned short *)(& x_2));
-    printf_va_9("%ho",(int)x_2);
-    scanf_va_10("%hu",(unsigned short *)(& x_2));
-    printf_va_10("%hu",(int)x_2);
-    scanf_va_11("%hx",(unsigned short *)(& x_2));
-    printf_va_11("%hx",(int)x_2);
-    scanf_va_12("%hx",(unsigned short *)(& x_2));
-    printf_va_12("%hX",(int)x_2);
+    scanf("%ho",(unsigned short *)(& x_2)); /* scanf_va_9 */
+    printf("%ho",(int)x_2); /* printf_va_9 */
+    scanf("%hu",(unsigned short *)(& x_2)); /* scanf_va_10 */
+    printf("%hu",(int)x_2); /* printf_va_10 */
+    scanf("%hx",(unsigned short *)(& x_2)); /* scanf_va_11 */
+    printf("%hx",(int)x_2); /* printf_va_11 */
+    scanf("%hx",(unsigned short *)(& x_2)); /* scanf_va_12 */
+    printf("%hX",(int)x_2); /* printf_va_12 */
   }
   {
     int32_t x_3;
-    scanf_va_13("%d",(int *)(& x_3));
-    printf_va_13("%d",x_3);
-    scanf_va_14("%i",(int *)(& x_3));
-    printf_va_14("%i",x_3);
+    scanf("%d",(int *)(& x_3)); /* scanf_va_13 */
+    printf("%d",x_3); /* printf_va_13 */
+    scanf("%i",(int *)(& x_3)); /* scanf_va_14 */
+    printf("%i",x_3); /* printf_va_14 */
   }
   {
     uint32_t x_4;
-    scanf_va_15("%o",(unsigned int *)(& x_4));
-    printf_va_15("%o",x_4);
-    scanf_va_16("%u",(unsigned int *)(& x_4));
-    printf_va_16("%u",x_4);
-    scanf_va_17("%x",(unsigned int *)(& x_4));
-    printf_va_17("%x",x_4);
-    scanf_va_18("%x",(unsigned int *)(& x_4));
-    printf_va_18("%X",x_4);
+    scanf("%o",(unsigned int *)(& x_4)); /* scanf_va_15 */
+    printf("%o",x_4); /* printf_va_15 */
+    scanf("%u",(unsigned int *)(& x_4)); /* scanf_va_16 */
+    printf("%u",x_4); /* printf_va_16 */
+    scanf("%x",(unsigned int *)(& x_4)); /* scanf_va_17 */
+    printf("%x",x_4); /* printf_va_17 */
+    scanf("%x",(unsigned int *)(& x_4)); /* scanf_va_18 */
+    printf("%X",x_4); /* printf_va_18 */
   }
   {
     int64_t x_5;
-    scanf_va_19("%lld",(long long *)(& x_5));
-    printf_va_19("%lld",x_5);
-    scanf_va_20("%lli",(long long *)(& x_5));
-    printf_va_20("%lli",x_5);
+    scanf("%lld",(long long *)(& x_5)); /* scanf_va_19 */
+    printf("%lld",x_5); /* printf_va_19 */
+    scanf("%lli",(long long *)(& x_5)); /* scanf_va_20 */
+    printf("%lli",x_5); /* printf_va_20 */
   }
   {
     uint64_t x_6;
-    scanf_va_21("%llo",(unsigned long long *)(& x_6));
-    printf_va_21("%llo",x_6);
-    scanf_va_22("%llu",(unsigned long long *)(& x_6));
-    printf_va_22("%llu",x_6);
-    scanf_va_23("%llx",(unsigned long long *)(& x_6));
-    printf_va_23("%llx",x_6);
-    scanf_va_24("%llx",(unsigned long long *)(& x_6));
-    printf_va_24("%llX",x_6);
+    scanf("%llo",(unsigned long long *)(& x_6)); /* scanf_va_21 */
+    printf("%llo",x_6); /* printf_va_21 */
+    scanf("%llu",(unsigned long long *)(& x_6)); /* scanf_va_22 */
+    printf("%llu",x_6); /* printf_va_22 */
+    scanf("%llx",(unsigned long long *)(& x_6)); /* scanf_va_23 */
+    printf("%llx",x_6); /* printf_va_23 */
+    scanf("%llx",(unsigned long long *)(& x_6)); /* scanf_va_24 */
+    printf("%llX",x_6); /* printf_va_24 */
   }
   {
     int_least8_t x_7;
-    scanf_va_25("%hhd",(signed char *)(& x_7));
-    printf_va_25("%hhd",(int)x_7);
-    scanf_va_26("%hhi",(signed char *)(& x_7));
-    printf_va_26("%hhi",(int)x_7);
+    scanf("%hhd",(signed char *)(& x_7)); /* scanf_va_25 */
+    printf("%hhd",(int)x_7); /* printf_va_25 */
+    scanf("%hhi",(signed char *)(& x_7)); /* scanf_va_26 */
+    printf("%hhi",(int)x_7); /* printf_va_26 */
   }
   {
     uint_least8_t x_8;
-    scanf_va_27("%hho",(unsigned char *)(& x_8));
-    printf_va_27("%hho",(int)x_8);
-    scanf_va_28("%hhu",(unsigned char *)(& x_8));
-    printf_va_28("%hhu",(int)x_8);
-    scanf_va_29("%hhx",(unsigned char *)(& x_8));
-    printf_va_29("%hhx",(int)x_8);
-    scanf_va_30("%hhx",(unsigned char *)(& x_8));
-    printf_va_30("%hhX",(int)x_8);
+    scanf("%hho",(unsigned char *)(& x_8)); /* scanf_va_27 */
+    printf("%hho",(int)x_8); /* printf_va_27 */
+    scanf("%hhu",(unsigned char *)(& x_8)); /* scanf_va_28 */
+    printf("%hhu",(int)x_8); /* printf_va_28 */
+    scanf("%hhx",(unsigned char *)(& x_8)); /* scanf_va_29 */
+    printf("%hhx",(int)x_8); /* printf_va_29 */
+    scanf("%hhx",(unsigned char *)(& x_8)); /* scanf_va_30 */
+    printf("%hhX",(int)x_8); /* printf_va_30 */
   }
   {
     int_least16_t x_9;
-    scanf_va_31("%hd",(short *)(& x_9));
-    printf_va_31("%hd",(int)x_9);
-    scanf_va_32("%hi",(short *)(& x_9));
-    printf_va_32("%hi",(int)x_9);
+    scanf("%hd",(short *)(& x_9)); /* scanf_va_31 */
+    printf("%hd",(int)x_9); /* printf_va_31 */
+    scanf("%hi",(short *)(& x_9)); /* scanf_va_32 */
+    printf("%hi",(int)x_9); /* printf_va_32 */
   }
   {
     uint_least16_t x_10;
-    scanf_va_33("%ho",(unsigned short *)(& x_10));
-    printf_va_33("%ho",(int)x_10);
-    scanf_va_34("%hu",(unsigned short *)(& x_10));
-    printf_va_34("%hu",(int)x_10);
-    scanf_va_35("%hx",(unsigned short *)(& x_10));
-    printf_va_35("%hx",(int)x_10);
-    scanf_va_36("%hx",(unsigned short *)(& x_10));
-    printf_va_36("%hX",(int)x_10);
+    scanf("%ho",(unsigned short *)(& x_10)); /* scanf_va_33 */
+    printf("%ho",(int)x_10); /* printf_va_33 */
+    scanf("%hu",(unsigned short *)(& x_10)); /* scanf_va_34 */
+    printf("%hu",(int)x_10); /* printf_va_34 */
+    scanf("%hx",(unsigned short *)(& x_10)); /* scanf_va_35 */
+    printf("%hx",(int)x_10); /* printf_va_35 */
+    scanf("%hx",(unsigned short *)(& x_10)); /* scanf_va_36 */
+    printf("%hX",(int)x_10); /* printf_va_36 */
   }
   {
     int_least32_t x_11;
-    scanf_va_37("%d",(int *)(& x_11));
-    printf_va_37("%d",x_11);
-    scanf_va_38("%i",(int *)(& x_11));
-    printf_va_38("%i",x_11);
+    scanf("%d",(int *)(& x_11)); /* scanf_va_37 */
+    printf("%d",x_11); /* printf_va_37 */
+    scanf("%i",(int *)(& x_11)); /* scanf_va_38 */
+    printf("%i",x_11); /* printf_va_38 */
   }
   {
     uint_least32_t x_12;
-    scanf_va_39("%o",(unsigned int *)(& x_12));
-    printf_va_39("%o",x_12);
-    scanf_va_40("%u",(unsigned int *)(& x_12));
-    printf_va_40("%u",x_12);
-    scanf_va_41("%x",(unsigned int *)(& x_12));
-    printf_va_41("%x",x_12);
-    scanf_va_42("%x",(unsigned int *)(& x_12));
-    printf_va_42("%X",x_12);
+    scanf("%o",(unsigned int *)(& x_12)); /* scanf_va_39 */
+    printf("%o",x_12); /* printf_va_39 */
+    scanf("%u",(unsigned int *)(& x_12)); /* scanf_va_40 */
+    printf("%u",x_12); /* printf_va_40 */
+    scanf("%x",(unsigned int *)(& x_12)); /* scanf_va_41 */
+    printf("%x",x_12); /* printf_va_41 */
+    scanf("%x",(unsigned int *)(& x_12)); /* scanf_va_42 */
+    printf("%X",x_12); /* printf_va_42 */
   }
   {
     int_least64_t x_13;
-    scanf_va_43("%lld",(long long *)(& x_13));
-    printf_va_43("%lld",x_13);
-    scanf_va_44("%lli",(long long *)(& x_13));
-    printf_va_44("%lli",x_13);
+    scanf("%lld",(long long *)(& x_13)); /* scanf_va_43 */
+    printf("%lld",x_13); /* printf_va_43 */
+    scanf("%lli",(long long *)(& x_13)); /* scanf_va_44 */
+    printf("%lli",x_13); /* printf_va_44 */
   }
   {
     uint_least64_t x_14;
-    scanf_va_45("%llo",(unsigned long long *)(& x_14));
-    printf_va_45("%llo",x_14);
-    scanf_va_46("%llu",(unsigned long long *)(& x_14));
-    printf_va_46("%llu",x_14);
-    scanf_va_47("%llx",(unsigned long long *)(& x_14));
-    printf_va_47("%llx",x_14);
-    scanf_va_48("%llx",(unsigned long long *)(& x_14));
-    printf_va_48("%llX",x_14);
+    scanf("%llo",(unsigned long long *)(& x_14)); /* scanf_va_45 */
+    printf("%llo",x_14); /* printf_va_45 */
+    scanf("%llu",(unsigned long long *)(& x_14)); /* scanf_va_46 */
+    printf("%llu",x_14); /* printf_va_46 */
+    scanf("%llx",(unsigned long long *)(& x_14)); /* scanf_va_47 */
+    printf("%llx",x_14); /* printf_va_47 */
+    scanf("%llx",(unsigned long long *)(& x_14)); /* scanf_va_48 */
+    printf("%llX",x_14); /* printf_va_48 */
   }
   {
     int_fast8_t x_15;
-    scanf_va_49("%hhd",(signed char *)(& x_15));
-    printf_va_49("%hhd",(int)x_15);
-    scanf_va_50("%hhi",(signed char *)(& x_15));
-    printf_va_50("%hhi",(int)x_15);
+    scanf("%hhd",(signed char *)(& x_15)); /* scanf_va_49 */
+    printf("%hhd",(int)x_15); /* printf_va_49 */
+    scanf("%hhi",(signed char *)(& x_15)); /* scanf_va_50 */
+    printf("%hhi",(int)x_15); /* printf_va_50 */
   }
   {
     uint_fast8_t x_16;
-    scanf_va_51("%hho",(unsigned char *)(& x_16));
-    printf_va_51("%hho",(int)x_16);
-    scanf_va_52("%hhu",(unsigned char *)(& x_16));
-    printf_va_52("%hhu",(int)x_16);
-    scanf_va_53("%hhx",(unsigned char *)(& x_16));
-    printf_va_53("%hhx",(int)x_16);
-    scanf_va_54("%hhx",(unsigned char *)(& x_16));
-    printf_va_54("%hhX",(int)x_16);
+    scanf("%hho",(unsigned char *)(& x_16)); /* scanf_va_51 */
+    printf("%hho",(int)x_16); /* printf_va_51 */
+    scanf("%hhu",(unsigned char *)(& x_16)); /* scanf_va_52 */
+    printf("%hhu",(int)x_16); /* printf_va_52 */
+    scanf("%hhx",(unsigned char *)(& x_16)); /* scanf_va_53 */
+    printf("%hhx",(int)x_16); /* printf_va_53 */
+    scanf("%hhx",(unsigned char *)(& x_16)); /* scanf_va_54 */
+    printf("%hhX",(int)x_16); /* printf_va_54 */
   }
   {
     int_fast16_t x_17;
-    scanf_va_55("%d",(int *)(& x_17));
-    printf_va_55("%d",x_17);
-    scanf_va_56("%i",(int *)(& x_17));
-    printf_va_56("%i",x_17);
+    scanf("%d",(int *)(& x_17)); /* scanf_va_55 */
+    printf("%d",x_17); /* printf_va_55 */
+    scanf("%i",(int *)(& x_17)); /* scanf_va_56 */
+    printf("%i",x_17); /* printf_va_56 */
   }
   {
     uint_fast16_t x_18;
-    scanf_va_57("%o",(unsigned int *)(& x_18));
-    printf_va_57("%o",x_18);
-    scanf_va_58("%u",(unsigned int *)(& x_18));
-    printf_va_58("%u",x_18);
-    scanf_va_59("%x",(unsigned int *)(& x_18));
-    printf_va_59("%x",x_18);
-    scanf_va_60("%x",(unsigned int *)(& x_18));
-    printf_va_60("%X",x_18);
+    scanf("%o",(unsigned int *)(& x_18)); /* scanf_va_57 */
+    printf("%o",x_18); /* printf_va_57 */
+    scanf("%u",(unsigned int *)(& x_18)); /* scanf_va_58 */
+    printf("%u",x_18); /* printf_va_58 */
+    scanf("%x",(unsigned int *)(& x_18)); /* scanf_va_59 */
+    printf("%x",x_18); /* printf_va_59 */
+    scanf("%x",(unsigned int *)(& x_18)); /* scanf_va_60 */
+    printf("%X",x_18); /* printf_va_60 */
   }
   {
     int_fast32_t x_19;
-    scanf_va_61("%d",(int *)(& x_19));
-    printf_va_61("%d",x_19);
-    scanf_va_62("%i",(int *)(& x_19));
-    printf_va_62("%i",x_19);
+    scanf("%d",(int *)(& x_19)); /* scanf_va_61 */
+    printf("%d",x_19); /* printf_va_61 */
+    scanf("%i",(int *)(& x_19)); /* scanf_va_62 */
+    printf("%i",x_19); /* printf_va_62 */
   }
   {
     uint_fast32_t x_20;
-    scanf_va_63("%o",(unsigned int *)(& x_20));
-    printf_va_63("%o",x_20);
-    scanf_va_64("%u",(unsigned int *)(& x_20));
-    printf_va_64("%u",x_20);
-    scanf_va_65("%x",(unsigned int *)(& x_20));
-    printf_va_65("%x",x_20);
-    scanf_va_66("%x",(unsigned int *)(& x_20));
-    printf_va_66("%X",x_20);
+    scanf("%o",(unsigned int *)(& x_20)); /* scanf_va_63 */
+    printf("%o",x_20); /* printf_va_63 */
+    scanf("%u",(unsigned int *)(& x_20)); /* scanf_va_64 */
+    printf("%u",x_20); /* printf_va_64 */
+    scanf("%x",(unsigned int *)(& x_20)); /* scanf_va_65 */
+    printf("%x",x_20); /* printf_va_65 */
+    scanf("%x",(unsigned int *)(& x_20)); /* scanf_va_66 */
+    printf("%X",x_20); /* printf_va_66 */
   }
   {
     int_fast64_t x_21;
-    scanf_va_67("%lld",(long long *)(& x_21));
-    printf_va_67("%lld",x_21);
-    scanf_va_68("%lli",(long long *)(& x_21));
-    printf_va_68("%lli",x_21);
+    scanf("%lld",(long long *)(& x_21)); /* scanf_va_67 */
+    printf("%lld",x_21); /* printf_va_67 */
+    scanf("%lli",(long long *)(& x_21)); /* scanf_va_68 */
+    printf("%lli",x_21); /* printf_va_68 */
   }
   {
     uint_fast64_t x_22;
-    scanf_va_69("%llo",(unsigned long long *)(& x_22));
-    printf_va_69("%llo",x_22);
-    scanf_va_70("%llu",(unsigned long long *)(& x_22));
-    printf_va_70("%llu",x_22);
-    scanf_va_71("%llx",(unsigned long long *)(& x_22));
-    printf_va_71("%llx",x_22);
-    scanf_va_72("%llx",(unsigned long long *)(& x_22));
-    printf_va_72("%llX",x_22);
+    scanf("%llo",(unsigned long long *)(& x_22)); /* scanf_va_69 */
+    printf("%llo",x_22); /* printf_va_69 */
+    scanf("%llu",(unsigned long long *)(& x_22)); /* scanf_va_70 */
+    printf("%llu",x_22); /* printf_va_70 */
+    scanf("%llx",(unsigned long long *)(& x_22)); /* scanf_va_71 */
+    printf("%llx",x_22); /* printf_va_71 */
+    scanf("%llx",(unsigned long long *)(& x_22)); /* scanf_va_72 */
+    printf("%llX",x_22); /* printf_va_72 */
   }
   {
     intmax_t x_23;
-    scanf_va_73("%lld",(long long *)(& x_23));
-    printf_va_73("%lld",x_23);
-    scanf_va_74("%lli",(long long *)(& x_23));
-    printf_va_74("%lli",x_23);
+    scanf("%lld",(long long *)(& x_23)); /* scanf_va_73 */
+    printf("%lld",x_23); /* printf_va_73 */
+    scanf("%lli",(long long *)(& x_23)); /* scanf_va_74 */
+    printf("%lli",x_23); /* printf_va_74 */
   }
   {
     uintmax_t x_24;
-    scanf_va_75("%llo",(unsigned long long *)(& x_24));
-    printf_va_75("%llo",x_24);
-    scanf_va_76("%llu",(unsigned long long *)(& x_24));
-    printf_va_76("%llu",x_24);
-    scanf_va_77("%llx",(unsigned long long *)(& x_24));
-    printf_va_77("%llx",x_24);
-    scanf_va_78("%llx",(unsigned long long *)(& x_24));
-    printf_va_78("%llX",x_24);
+    scanf("%llo",(unsigned long long *)(& x_24)); /* scanf_va_75 */
+    printf("%llo",x_24); /* printf_va_75 */
+    scanf("%llu",(unsigned long long *)(& x_24)); /* scanf_va_76 */
+    printf("%llu",x_24); /* printf_va_76 */
+    scanf("%llx",(unsigned long long *)(& x_24)); /* scanf_va_77 */
+    printf("%llx",x_24); /* printf_va_77 */
+    scanf("%llx",(unsigned long long *)(& x_24)); /* scanf_va_78 */
+    printf("%llX",x_24); /* printf_va_78 */
   }
   {
     intptr_t x_25;
-    scanf_va_79("%d",(int *)(& x_25));
-    printf_va_79("%d",x_25);
-    scanf_va_80("%i",(int *)(& x_25));
-    printf_va_80("%i",x_25);
+    scanf("%d",(int *)(& x_25)); /* scanf_va_79 */
+    printf("%d",x_25); /* printf_va_79 */
+    scanf("%i",(int *)(& x_25)); /* scanf_va_80 */
+    printf("%i",x_25); /* printf_va_80 */
   }
   {
     uintptr_t x_26;
-    scanf_va_81("%o",(unsigned int *)(& x_26));
-    printf_va_81("%o",x_26);
-    scanf_va_82("%u",(unsigned int *)(& x_26));
-    printf_va_82("%u",x_26);
-    scanf_va_83("%x",(unsigned int *)(& x_26));
-    printf_va_83("%x",x_26);
-    scanf_va_84("%x",(unsigned int *)(& x_26));
-    printf_va_84("%X",x_26);
+    scanf("%o",(unsigned int *)(& x_26)); /* scanf_va_81 */
+    printf("%o",x_26); /* printf_va_81 */
+    scanf("%u",(unsigned int *)(& x_26)); /* scanf_va_82 */
+    printf("%u",x_26); /* printf_va_82 */
+    scanf("%x",(unsigned int *)(& x_26)); /* scanf_va_83 */
+    printf("%x",x_26); /* printf_va_83 */
+    scanf("%x",(unsigned int *)(& x_26)); /* scanf_va_84 */
+    printf("%X",x_26); /* printf_va_84 */
   }
   __retres = 0;
   return __retres;
diff --git a/tests/libc/oracle/inttypes_h.2.res.oracle b/tests/libc/oracle/inttypes_h.2.res.oracle
index e519da6336564250bf581e6e928c34c5cb64e888..1a3ec0c939e6cdca229303b069fb316a58f21a9c 100644
--- a/tests/libc/oracle/inttypes_h.2.res.oracle
+++ b/tests/libc/oracle/inttypes_h.2.res.oracle
@@ -2531,255 +2531,255 @@ int main(void)
   int __retres;
   {
     int8_t x;
-    scanf_va_1("%hhd",(signed char *)(& x));
-    printf_va_1("%hhd",(int)x);
-    scanf_va_2("%hhi",(signed char *)(& x));
-    printf_va_2("%hhi",(int)x);
+    scanf("%hhd",(signed char *)(& x)); /* scanf_va_1 */
+    printf("%hhd",(int)x); /* printf_va_1 */
+    scanf("%hhi",(signed char *)(& x)); /* scanf_va_2 */
+    printf("%hhi",(int)x); /* printf_va_2 */
   }
   {
     uint8_t x_0;
-    scanf_va_3("%hho",(unsigned char *)(& x_0));
-    printf_va_3("%hho",(int)x_0);
-    scanf_va_4("%hhu",(unsigned char *)(& x_0));
-    printf_va_4("%hhu",(int)x_0);
-    scanf_va_5("%hhx",(unsigned char *)(& x_0));
-    printf_va_5("%hhx",(int)x_0);
-    scanf_va_6("%hhx",(unsigned char *)(& x_0));
-    printf_va_6("%hhX",(int)x_0);
+    scanf("%hho",(unsigned char *)(& x_0)); /* scanf_va_3 */
+    printf("%hho",(int)x_0); /* printf_va_3 */
+    scanf("%hhu",(unsigned char *)(& x_0)); /* scanf_va_4 */
+    printf("%hhu",(int)x_0); /* printf_va_4 */
+    scanf("%hhx",(unsigned char *)(& x_0)); /* scanf_va_5 */
+    printf("%hhx",(int)x_0); /* printf_va_5 */
+    scanf("%hhx",(unsigned char *)(& x_0)); /* scanf_va_6 */
+    printf("%hhX",(int)x_0); /* printf_va_6 */
   }
   {
     int16_t x_1;
-    scanf_va_7("%hd",(short *)(& x_1));
-    printf_va_7("%hd",(int)x_1);
-    scanf_va_8("%hi",(short *)(& x_1));
-    printf_va_8("%hi",(int)x_1);
+    scanf("%hd",(short *)(& x_1)); /* scanf_va_7 */
+    printf("%hd",(int)x_1); /* printf_va_7 */
+    scanf("%hi",(short *)(& x_1)); /* scanf_va_8 */
+    printf("%hi",(int)x_1); /* printf_va_8 */
   }
   {
     uint16_t x_2;
-    scanf_va_9("%ho",(unsigned short *)(& x_2));
-    printf_va_9("%ho",(int)x_2);
-    scanf_va_10("%hu",(unsigned short *)(& x_2));
-    printf_va_10("%hu",(int)x_2);
-    scanf_va_11("%hx",(unsigned short *)(& x_2));
-    printf_va_11("%hx",(int)x_2);
-    scanf_va_12("%hx",(unsigned short *)(& x_2));
-    printf_va_12("%hX",(int)x_2);
+    scanf("%ho",(unsigned short *)(& x_2)); /* scanf_va_9 */
+    printf("%ho",(int)x_2); /* printf_va_9 */
+    scanf("%hu",(unsigned short *)(& x_2)); /* scanf_va_10 */
+    printf("%hu",(int)x_2); /* printf_va_10 */
+    scanf("%hx",(unsigned short *)(& x_2)); /* scanf_va_11 */
+    printf("%hx",(int)x_2); /* printf_va_11 */
+    scanf("%hx",(unsigned short *)(& x_2)); /* scanf_va_12 */
+    printf("%hX",(int)x_2); /* printf_va_12 */
   }
   {
     int32_t x_3;
-    scanf_va_13("%d",(int *)(& x_3));
-    printf_va_13("%d",x_3);
-    scanf_va_14("%i",(int *)(& x_3));
-    printf_va_14("%i",x_3);
+    scanf("%d",(int *)(& x_3)); /* scanf_va_13 */
+    printf("%d",x_3); /* printf_va_13 */
+    scanf("%i",(int *)(& x_3)); /* scanf_va_14 */
+    printf("%i",x_3); /* printf_va_14 */
   }
   {
     uint32_t x_4;
-    scanf_va_15("%o",(unsigned int *)(& x_4));
-    printf_va_15("%o",x_4);
-    scanf_va_16("%u",(unsigned int *)(& x_4));
-    printf_va_16("%u",x_4);
-    scanf_va_17("%x",(unsigned int *)(& x_4));
-    printf_va_17("%x",x_4);
-    scanf_va_18("%x",(unsigned int *)(& x_4));
-    printf_va_18("%X",x_4);
+    scanf("%o",(unsigned int *)(& x_4)); /* scanf_va_15 */
+    printf("%o",x_4); /* printf_va_15 */
+    scanf("%u",(unsigned int *)(& x_4)); /* scanf_va_16 */
+    printf("%u",x_4); /* printf_va_16 */
+    scanf("%x",(unsigned int *)(& x_4)); /* scanf_va_17 */
+    printf("%x",x_4); /* printf_va_17 */
+    scanf("%x",(unsigned int *)(& x_4)); /* scanf_va_18 */
+    printf("%X",x_4); /* printf_va_18 */
   }
   {
     int64_t x_5;
-    scanf_va_19("%ld",(long *)(& x_5));
-    printf_va_19("%ld",x_5);
-    scanf_va_20("%li",(long *)(& x_5));
-    printf_va_20("%li",x_5);
+    scanf("%ld",(long *)(& x_5)); /* scanf_va_19 */
+    printf("%ld",x_5); /* printf_va_19 */
+    scanf("%li",(long *)(& x_5)); /* scanf_va_20 */
+    printf("%li",x_5); /* printf_va_20 */
   }
   {
     uint64_t x_6;
-    scanf_va_21("%lo",(unsigned long *)(& x_6));
-    printf_va_21("%lo",x_6);
-    scanf_va_22("%lu",(unsigned long *)(& x_6));
-    printf_va_22("%lu",x_6);
-    scanf_va_23("%lx",(unsigned long *)(& x_6));
-    printf_va_23("%lx",x_6);
-    scanf_va_24("%lx",(unsigned long *)(& x_6));
-    printf_va_24("%lX",x_6);
+    scanf("%lo",(unsigned long *)(& x_6)); /* scanf_va_21 */
+    printf("%lo",x_6); /* printf_va_21 */
+    scanf("%lu",(unsigned long *)(& x_6)); /* scanf_va_22 */
+    printf("%lu",x_6); /* printf_va_22 */
+    scanf("%lx",(unsigned long *)(& x_6)); /* scanf_va_23 */
+    printf("%lx",x_6); /* printf_va_23 */
+    scanf("%lx",(unsigned long *)(& x_6)); /* scanf_va_24 */
+    printf("%lX",x_6); /* printf_va_24 */
   }
   {
     int_least8_t x_7;
-    scanf_va_25("%hhd",(signed char *)(& x_7));
-    printf_va_25("%hhd",(int)x_7);
-    scanf_va_26("%hhi",(signed char *)(& x_7));
-    printf_va_26("%hhi",(int)x_7);
+    scanf("%hhd",(signed char *)(& x_7)); /* scanf_va_25 */
+    printf("%hhd",(int)x_7); /* printf_va_25 */
+    scanf("%hhi",(signed char *)(& x_7)); /* scanf_va_26 */
+    printf("%hhi",(int)x_7); /* printf_va_26 */
   }
   {
     uint_least8_t x_8;
-    scanf_va_27("%hho",(unsigned char *)(& x_8));
-    printf_va_27("%hho",(int)x_8);
-    scanf_va_28("%hhu",(unsigned char *)(& x_8));
-    printf_va_28("%hhu",(int)x_8);
-    scanf_va_29("%hhx",(unsigned char *)(& x_8));
-    printf_va_29("%hhx",(int)x_8);
-    scanf_va_30("%hhx",(unsigned char *)(& x_8));
-    printf_va_30("%hhX",(int)x_8);
+    scanf("%hho",(unsigned char *)(& x_8)); /* scanf_va_27 */
+    printf("%hho",(int)x_8); /* printf_va_27 */
+    scanf("%hhu",(unsigned char *)(& x_8)); /* scanf_va_28 */
+    printf("%hhu",(int)x_8); /* printf_va_28 */
+    scanf("%hhx",(unsigned char *)(& x_8)); /* scanf_va_29 */
+    printf("%hhx",(int)x_8); /* printf_va_29 */
+    scanf("%hhx",(unsigned char *)(& x_8)); /* scanf_va_30 */
+    printf("%hhX",(int)x_8); /* printf_va_30 */
   }
   {
     int_least16_t x_9;
-    scanf_va_31("%hd",(short *)(& x_9));
-    printf_va_31("%hd",(int)x_9);
-    scanf_va_32("%hi",(short *)(& x_9));
-    printf_va_32("%hi",(int)x_9);
+    scanf("%hd",(short *)(& x_9)); /* scanf_va_31 */
+    printf("%hd",(int)x_9); /* printf_va_31 */
+    scanf("%hi",(short *)(& x_9)); /* scanf_va_32 */
+    printf("%hi",(int)x_9); /* printf_va_32 */
   }
   {
     uint_least16_t x_10;
-    scanf_va_33("%ho",(unsigned short *)(& x_10));
-    printf_va_33("%ho",(int)x_10);
-    scanf_va_34("%hu",(unsigned short *)(& x_10));
-    printf_va_34("%hu",(int)x_10);
-    scanf_va_35("%hx",(unsigned short *)(& x_10));
-    printf_va_35("%hx",(int)x_10);
-    scanf_va_36("%hx",(unsigned short *)(& x_10));
-    printf_va_36("%hX",(int)x_10);
+    scanf("%ho",(unsigned short *)(& x_10)); /* scanf_va_33 */
+    printf("%ho",(int)x_10); /* printf_va_33 */
+    scanf("%hu",(unsigned short *)(& x_10)); /* scanf_va_34 */
+    printf("%hu",(int)x_10); /* printf_va_34 */
+    scanf("%hx",(unsigned short *)(& x_10)); /* scanf_va_35 */
+    printf("%hx",(int)x_10); /* printf_va_35 */
+    scanf("%hx",(unsigned short *)(& x_10)); /* scanf_va_36 */
+    printf("%hX",(int)x_10); /* printf_va_36 */
   }
   {
     int_least32_t x_11;
-    scanf_va_37("%d",(int *)(& x_11));
-    printf_va_37("%d",x_11);
-    scanf_va_38("%i",(int *)(& x_11));
-    printf_va_38("%i",x_11);
+    scanf("%d",(int *)(& x_11)); /* scanf_va_37 */
+    printf("%d",x_11); /* printf_va_37 */
+    scanf("%i",(int *)(& x_11)); /* scanf_va_38 */
+    printf("%i",x_11); /* printf_va_38 */
   }
   {
     uint_least32_t x_12;
-    scanf_va_39("%o",(unsigned int *)(& x_12));
-    printf_va_39("%o",x_12);
-    scanf_va_40("%u",(unsigned int *)(& x_12));
-    printf_va_40("%u",x_12);
-    scanf_va_41("%x",(unsigned int *)(& x_12));
-    printf_va_41("%x",x_12);
-    scanf_va_42("%x",(unsigned int *)(& x_12));
-    printf_va_42("%X",x_12);
+    scanf("%o",(unsigned int *)(& x_12)); /* scanf_va_39 */
+    printf("%o",x_12); /* printf_va_39 */
+    scanf("%u",(unsigned int *)(& x_12)); /* scanf_va_40 */
+    printf("%u",x_12); /* printf_va_40 */
+    scanf("%x",(unsigned int *)(& x_12)); /* scanf_va_41 */
+    printf("%x",x_12); /* printf_va_41 */
+    scanf("%x",(unsigned int *)(& x_12)); /* scanf_va_42 */
+    printf("%X",x_12); /* printf_va_42 */
   }
   {
     int_least64_t x_13;
-    scanf_va_43("%ld",(long *)(& x_13));
-    printf_va_43("%ld",x_13);
-    scanf_va_44("%li",(long *)(& x_13));
-    printf_va_44("%li",x_13);
+    scanf("%ld",(long *)(& x_13)); /* scanf_va_43 */
+    printf("%ld",x_13); /* printf_va_43 */
+    scanf("%li",(long *)(& x_13)); /* scanf_va_44 */
+    printf("%li",x_13); /* printf_va_44 */
   }
   {
     uint_least64_t x_14;
-    scanf_va_45("%lo",(unsigned long *)(& x_14));
-    printf_va_45("%lo",x_14);
-    scanf_va_46("%lu",(unsigned long *)(& x_14));
-    printf_va_46("%lu",x_14);
-    scanf_va_47("%lx",(unsigned long *)(& x_14));
-    printf_va_47("%lx",x_14);
-    scanf_va_48("%lx",(unsigned long *)(& x_14));
-    printf_va_48("%lX",x_14);
+    scanf("%lo",(unsigned long *)(& x_14)); /* scanf_va_45 */
+    printf("%lo",x_14); /* printf_va_45 */
+    scanf("%lu",(unsigned long *)(& x_14)); /* scanf_va_46 */
+    printf("%lu",x_14); /* printf_va_46 */
+    scanf("%lx",(unsigned long *)(& x_14)); /* scanf_va_47 */
+    printf("%lx",x_14); /* printf_va_47 */
+    scanf("%lx",(unsigned long *)(& x_14)); /* scanf_va_48 */
+    printf("%lX",x_14); /* printf_va_48 */
   }
   {
     int_fast8_t x_15;
-    scanf_va_49("%hhd",(signed char *)(& x_15));
-    printf_va_49("%hhd",(int)x_15);
-    scanf_va_50("%hhi",(signed char *)(& x_15));
-    printf_va_50("%hhi",(int)x_15);
+    scanf("%hhd",(signed char *)(& x_15)); /* scanf_va_49 */
+    printf("%hhd",(int)x_15); /* printf_va_49 */
+    scanf("%hhi",(signed char *)(& x_15)); /* scanf_va_50 */
+    printf("%hhi",(int)x_15); /* printf_va_50 */
   }
   {
     uint_fast8_t x_16;
-    scanf_va_51("%hho",(unsigned char *)(& x_16));
-    printf_va_51("%hho",(int)x_16);
-    scanf_va_52("%hhu",(unsigned char *)(& x_16));
-    printf_va_52("%hhu",(int)x_16);
-    scanf_va_53("%hhx",(unsigned char *)(& x_16));
-    printf_va_53("%hhx",(int)x_16);
-    scanf_va_54("%hhx",(unsigned char *)(& x_16));
-    printf_va_54("%hhX",(int)x_16);
+    scanf("%hho",(unsigned char *)(& x_16)); /* scanf_va_51 */
+    printf("%hho",(int)x_16); /* printf_va_51 */
+    scanf("%hhu",(unsigned char *)(& x_16)); /* scanf_va_52 */
+    printf("%hhu",(int)x_16); /* printf_va_52 */
+    scanf("%hhx",(unsigned char *)(& x_16)); /* scanf_va_53 */
+    printf("%hhx",(int)x_16); /* printf_va_53 */
+    scanf("%hhx",(unsigned char *)(& x_16)); /* scanf_va_54 */
+    printf("%hhX",(int)x_16); /* printf_va_54 */
   }
   {
     int_fast16_t x_17;
-    scanf_va_55("%d",(int *)(& x_17));
-    printf_va_55("%d",x_17);
-    scanf_va_56("%i",(int *)(& x_17));
-    printf_va_56("%i",x_17);
+    scanf("%d",(int *)(& x_17)); /* scanf_va_55 */
+    printf("%d",x_17); /* printf_va_55 */
+    scanf("%i",(int *)(& x_17)); /* scanf_va_56 */
+    printf("%i",x_17); /* printf_va_56 */
   }
   {
     uint_fast16_t x_18;
-    scanf_va_57("%o",(unsigned int *)(& x_18));
-    printf_va_57("%o",x_18);
-    scanf_va_58("%u",(unsigned int *)(& x_18));
-    printf_va_58("%u",x_18);
-    scanf_va_59("%x",(unsigned int *)(& x_18));
-    printf_va_59("%x",x_18);
-    scanf_va_60("%x",(unsigned int *)(& x_18));
-    printf_va_60("%X",x_18);
+    scanf("%o",(unsigned int *)(& x_18)); /* scanf_va_57 */
+    printf("%o",x_18); /* printf_va_57 */
+    scanf("%u",(unsigned int *)(& x_18)); /* scanf_va_58 */
+    printf("%u",x_18); /* printf_va_58 */
+    scanf("%x",(unsigned int *)(& x_18)); /* scanf_va_59 */
+    printf("%x",x_18); /* printf_va_59 */
+    scanf("%x",(unsigned int *)(& x_18)); /* scanf_va_60 */
+    printf("%X",x_18); /* printf_va_60 */
   }
   {
     int_fast32_t x_19;
-    scanf_va_61("%d",(int *)(& x_19));
-    printf_va_61("%d",x_19);
-    scanf_va_62("%i",(int *)(& x_19));
-    printf_va_62("%i",x_19);
+    scanf("%d",(int *)(& x_19)); /* scanf_va_61 */
+    printf("%d",x_19); /* printf_va_61 */
+    scanf("%i",(int *)(& x_19)); /* scanf_va_62 */
+    printf("%i",x_19); /* printf_va_62 */
   }
   {
     uint_fast32_t x_20;
-    scanf_va_63("%o",(unsigned int *)(& x_20));
-    printf_va_63("%o",x_20);
-    scanf_va_64("%u",(unsigned int *)(& x_20));
-    printf_va_64("%u",x_20);
-    scanf_va_65("%x",(unsigned int *)(& x_20));
-    printf_va_65("%x",x_20);
-    scanf_va_66("%x",(unsigned int *)(& x_20));
-    printf_va_66("%X",x_20);
+    scanf("%o",(unsigned int *)(& x_20)); /* scanf_va_63 */
+    printf("%o",x_20); /* printf_va_63 */
+    scanf("%u",(unsigned int *)(& x_20)); /* scanf_va_64 */
+    printf("%u",x_20); /* printf_va_64 */
+    scanf("%x",(unsigned int *)(& x_20)); /* scanf_va_65 */
+    printf("%x",x_20); /* printf_va_65 */
+    scanf("%x",(unsigned int *)(& x_20)); /* scanf_va_66 */
+    printf("%X",x_20); /* printf_va_66 */
   }
   {
     int_fast64_t x_21;
-    scanf_va_67("%ld",(long *)(& x_21));
-    printf_va_67("%ld",x_21);
-    scanf_va_68("%li",(long *)(& x_21));
-    printf_va_68("%li",x_21);
+    scanf("%ld",(long *)(& x_21)); /* scanf_va_67 */
+    printf("%ld",x_21); /* printf_va_67 */
+    scanf("%li",(long *)(& x_21)); /* scanf_va_68 */
+    printf("%li",x_21); /* printf_va_68 */
   }
   {
     uint_fast64_t x_22;
-    scanf_va_69("%lo",(unsigned long *)(& x_22));
-    printf_va_69("%lo",x_22);
-    scanf_va_70("%lu",(unsigned long *)(& x_22));
-    printf_va_70("%lu",x_22);
-    scanf_va_71("%lx",(unsigned long *)(& x_22));
-    printf_va_71("%lx",x_22);
-    scanf_va_72("%lx",(unsigned long *)(& x_22));
-    printf_va_72("%lX",x_22);
+    scanf("%lo",(unsigned long *)(& x_22)); /* scanf_va_69 */
+    printf("%lo",x_22); /* printf_va_69 */
+    scanf("%lu",(unsigned long *)(& x_22)); /* scanf_va_70 */
+    printf("%lu",x_22); /* printf_va_70 */
+    scanf("%lx",(unsigned long *)(& x_22)); /* scanf_va_71 */
+    printf("%lx",x_22); /* printf_va_71 */
+    scanf("%lx",(unsigned long *)(& x_22)); /* scanf_va_72 */
+    printf("%lX",x_22); /* printf_va_72 */
   }
   {
     intmax_t x_23;
-    scanf_va_73("%lld",(long long *)(& x_23));
-    printf_va_73("%lld",x_23);
-    scanf_va_74("%lli",(long long *)(& x_23));
-    printf_va_74("%lli",x_23);
+    scanf("%lld",(long long *)(& x_23)); /* scanf_va_73 */
+    printf("%lld",x_23); /* printf_va_73 */
+    scanf("%lli",(long long *)(& x_23)); /* scanf_va_74 */
+    printf("%lli",x_23); /* printf_va_74 */
   }
   {
     uintmax_t x_24;
-    scanf_va_75("%llo",(unsigned long long *)(& x_24));
-    printf_va_75("%llo",x_24);
-    scanf_va_76("%llu",(unsigned long long *)(& x_24));
-    printf_va_76("%llu",x_24);
-    scanf_va_77("%llx",(unsigned long long *)(& x_24));
-    printf_va_77("%llx",x_24);
-    scanf_va_78("%llx",(unsigned long long *)(& x_24));
-    printf_va_78("%llX",x_24);
+    scanf("%llo",(unsigned long long *)(& x_24)); /* scanf_va_75 */
+    printf("%llo",x_24); /* printf_va_75 */
+    scanf("%llu",(unsigned long long *)(& x_24)); /* scanf_va_76 */
+    printf("%llu",x_24); /* printf_va_76 */
+    scanf("%llx",(unsigned long long *)(& x_24)); /* scanf_va_77 */
+    printf("%llx",x_24); /* printf_va_77 */
+    scanf("%llx",(unsigned long long *)(& x_24)); /* scanf_va_78 */
+    printf("%llX",x_24); /* printf_va_78 */
   }
   {
     intptr_t x_25;
-    scanf_va_79("%ld",(long *)(& x_25));
-    printf_va_79("%ld",x_25);
-    scanf_va_80("%li",(long *)(& x_25));
-    printf_va_80("%li",x_25);
+    scanf("%ld",(long *)(& x_25)); /* scanf_va_79 */
+    printf("%ld",x_25); /* printf_va_79 */
+    scanf("%li",(long *)(& x_25)); /* scanf_va_80 */
+    printf("%li",x_25); /* printf_va_80 */
   }
   {
     uintptr_t x_26;
-    scanf_va_81("%lo",(unsigned long *)(& x_26));
-    printf_va_81("%lo",x_26);
-    scanf_va_82("%lu",(unsigned long *)(& x_26));
-    printf_va_82("%lu",x_26);
-    scanf_va_83("%lx",(unsigned long *)(& x_26));
-    printf_va_83("%lx",x_26);
-    scanf_va_84("%lx",(unsigned long *)(& x_26));
-    printf_va_84("%lX",x_26);
+    scanf("%lo",(unsigned long *)(& x_26)); /* scanf_va_81 */
+    printf("%lo",x_26); /* printf_va_81 */
+    scanf("%lu",(unsigned long *)(& x_26)); /* scanf_va_82 */
+    printf("%lu",x_26); /* printf_va_82 */
+    scanf("%lx",(unsigned long *)(& x_26)); /* scanf_va_83 */
+    printf("%lx",x_26); /* printf_va_83 */
+    scanf("%lx",(unsigned long *)(& x_26)); /* scanf_va_84 */
+    printf("%lX",x_26); /* printf_va_84 */
   }
   __retres = 0;
   return __retres;
diff --git a/tests/libc/oracle/inttypes_h.3.res.oracle b/tests/libc/oracle/inttypes_h.3.res.oracle
index f3033c0b8b93df7a385fe2b39d8c3c844409a9ff..bef94d501952891872074a7bd4ef498f713a72aa 100644
--- a/tests/libc/oracle/inttypes_h.3.res.oracle
+++ b/tests/libc/oracle/inttypes_h.3.res.oracle
@@ -2531,255 +2531,255 @@ int main(void)
   int __retres;
   {
     int8_t x;
-    scanf_va_1("%hhd",(signed char *)(& x));
-    printf_va_1("%hhd",(int)x);
-    scanf_va_2("%hhi",(signed char *)(& x));
-    printf_va_2("%hhi",(int)x);
+    scanf("%hhd",(signed char *)(& x)); /* scanf_va_1 */
+    printf("%hhd",(int)x); /* printf_va_1 */
+    scanf("%hhi",(signed char *)(& x)); /* scanf_va_2 */
+    printf("%hhi",(int)x); /* printf_va_2 */
   }
   {
     uint8_t x_0;
-    scanf_va_3("%hho",(unsigned char *)(& x_0));
-    printf_va_3("%hho",(int)x_0);
-    scanf_va_4("%hhu",(unsigned char *)(& x_0));
-    printf_va_4("%hhu",(int)x_0);
-    scanf_va_5("%hhx",(unsigned char *)(& x_0));
-    printf_va_5("%hhx",(int)x_0);
-    scanf_va_6("%hhx",(unsigned char *)(& x_0));
-    printf_va_6("%hhX",(int)x_0);
+    scanf("%hho",(unsigned char *)(& x_0)); /* scanf_va_3 */
+    printf("%hho",(int)x_0); /* printf_va_3 */
+    scanf("%hhu",(unsigned char *)(& x_0)); /* scanf_va_4 */
+    printf("%hhu",(int)x_0); /* printf_va_4 */
+    scanf("%hhx",(unsigned char *)(& x_0)); /* scanf_va_5 */
+    printf("%hhx",(int)x_0); /* printf_va_5 */
+    scanf("%hhx",(unsigned char *)(& x_0)); /* scanf_va_6 */
+    printf("%hhX",(int)x_0); /* printf_va_6 */
   }
   {
     int16_t x_1;
-    scanf_va_7("%hd",(short *)(& x_1));
-    printf_va_7("%hd",(int)x_1);
-    scanf_va_8("%hi",(short *)(& x_1));
-    printf_va_8("%hi",(int)x_1);
+    scanf("%hd",(short *)(& x_1)); /* scanf_va_7 */
+    printf("%hd",(int)x_1); /* printf_va_7 */
+    scanf("%hi",(short *)(& x_1)); /* scanf_va_8 */
+    printf("%hi",(int)x_1); /* printf_va_8 */
   }
   {
     uint16_t x_2;
-    scanf_va_9("%ho",(unsigned short *)(& x_2));
-    printf_va_9("%ho",(unsigned int)x_2);
-    scanf_va_10("%hu",(unsigned short *)(& x_2));
-    printf_va_10("%hu",(unsigned int)x_2);
-    scanf_va_11("%hx",(unsigned short *)(& x_2));
-    printf_va_11("%hx",(unsigned int)x_2);
-    scanf_va_12("%hx",(unsigned short *)(& x_2));
-    printf_va_12("%hX",(unsigned int)x_2);
+    scanf("%ho",(unsigned short *)(& x_2)); /* scanf_va_9 */
+    printf("%ho",(unsigned int)x_2); /* printf_va_9 */
+    scanf("%hu",(unsigned short *)(& x_2)); /* scanf_va_10 */
+    printf("%hu",(unsigned int)x_2); /* printf_va_10 */
+    scanf("%hx",(unsigned short *)(& x_2)); /* scanf_va_11 */
+    printf("%hx",(unsigned int)x_2); /* printf_va_11 */
+    scanf("%hx",(unsigned short *)(& x_2)); /* scanf_va_12 */
+    printf("%hX",(unsigned int)x_2); /* printf_va_12 */
   }
   {
     int32_t x_3;
-    scanf_va_13("%ld",(long *)(& x_3));
-    printf_va_13("%ld",x_3);
-    scanf_va_14("%li",(long *)(& x_3));
-    printf_va_14("%li",x_3);
+    scanf("%ld",(long *)(& x_3)); /* scanf_va_13 */
+    printf("%ld",x_3); /* printf_va_13 */
+    scanf("%li",(long *)(& x_3)); /* scanf_va_14 */
+    printf("%li",x_3); /* printf_va_14 */
   }
   {
     uint32_t x_4;
-    scanf_va_15("%lo",(unsigned long *)(& x_4));
-    printf_va_15("%lo",x_4);
-    scanf_va_16("%lu",(unsigned long *)(& x_4));
-    printf_va_16("%lu",x_4);
-    scanf_va_17("%lx",(unsigned long *)(& x_4));
-    printf_va_17("%lx",x_4);
-    scanf_va_18("%lx",(unsigned long *)(& x_4));
-    printf_va_18("%lX",x_4);
+    scanf("%lo",(unsigned long *)(& x_4)); /* scanf_va_15 */
+    printf("%lo",x_4); /* printf_va_15 */
+    scanf("%lu",(unsigned long *)(& x_4)); /* scanf_va_16 */
+    printf("%lu",x_4); /* printf_va_16 */
+    scanf("%lx",(unsigned long *)(& x_4)); /* scanf_va_17 */
+    printf("%lx",x_4); /* printf_va_17 */
+    scanf("%lx",(unsigned long *)(& x_4)); /* scanf_va_18 */
+    printf("%lX",x_4); /* printf_va_18 */
   }
   {
     int64_t x_5;
-    scanf_va_19("%lld",(long long *)(& x_5));
-    printf_va_19("%lld",x_5);
-    scanf_va_20("%lli",(long long *)(& x_5));
-    printf_va_20("%lli",x_5);
+    scanf("%lld",(long long *)(& x_5)); /* scanf_va_19 */
+    printf("%lld",x_5); /* printf_va_19 */
+    scanf("%lli",(long long *)(& x_5)); /* scanf_va_20 */
+    printf("%lli",x_5); /* printf_va_20 */
   }
   {
     uint64_t x_6;
-    scanf_va_21("%llo",(unsigned long long *)(& x_6));
-    printf_va_21("%llo",x_6);
-    scanf_va_22("%llu",(unsigned long long *)(& x_6));
-    printf_va_22("%llu",x_6);
-    scanf_va_23("%llx",(unsigned long long *)(& x_6));
-    printf_va_23("%llx",x_6);
-    scanf_va_24("%llx",(unsigned long long *)(& x_6));
-    printf_va_24("%llX",x_6);
+    scanf("%llo",(unsigned long long *)(& x_6)); /* scanf_va_21 */
+    printf("%llo",x_6); /* printf_va_21 */
+    scanf("%llu",(unsigned long long *)(& x_6)); /* scanf_va_22 */
+    printf("%llu",x_6); /* printf_va_22 */
+    scanf("%llx",(unsigned long long *)(& x_6)); /* scanf_va_23 */
+    printf("%llx",x_6); /* printf_va_23 */
+    scanf("%llx",(unsigned long long *)(& x_6)); /* scanf_va_24 */
+    printf("%llX",x_6); /* printf_va_24 */
   }
   {
     int_least8_t x_7;
-    scanf_va_25("%hhd",(signed char *)(& x_7));
-    printf_va_25("%hhd",(int)x_7);
-    scanf_va_26("%hhi",(signed char *)(& x_7));
-    printf_va_26("%hhi",(int)x_7);
+    scanf("%hhd",(signed char *)(& x_7)); /* scanf_va_25 */
+    printf("%hhd",(int)x_7); /* printf_va_25 */
+    scanf("%hhi",(signed char *)(& x_7)); /* scanf_va_26 */
+    printf("%hhi",(int)x_7); /* printf_va_26 */
   }
   {
     uint_least8_t x_8;
-    scanf_va_27("%hho",(unsigned char *)(& x_8));
-    printf_va_27("%hho",(int)x_8);
-    scanf_va_28("%hhu",(unsigned char *)(& x_8));
-    printf_va_28("%hhu",(int)x_8);
-    scanf_va_29("%hhx",(unsigned char *)(& x_8));
-    printf_va_29("%hhx",(int)x_8);
-    scanf_va_30("%hhx",(unsigned char *)(& x_8));
-    printf_va_30("%hhX",(int)x_8);
+    scanf("%hho",(unsigned char *)(& x_8)); /* scanf_va_27 */
+    printf("%hho",(int)x_8); /* printf_va_27 */
+    scanf("%hhu",(unsigned char *)(& x_8)); /* scanf_va_28 */
+    printf("%hhu",(int)x_8); /* printf_va_28 */
+    scanf("%hhx",(unsigned char *)(& x_8)); /* scanf_va_29 */
+    printf("%hhx",(int)x_8); /* printf_va_29 */
+    scanf("%hhx",(unsigned char *)(& x_8)); /* scanf_va_30 */
+    printf("%hhX",(int)x_8); /* printf_va_30 */
   }
   {
     int_least16_t x_9;
-    scanf_va_31("%hd",(short *)(& x_9));
-    printf_va_31("%hd",(int)x_9);
-    scanf_va_32("%hi",(short *)(& x_9));
-    printf_va_32("%hi",(int)x_9);
+    scanf("%hd",(short *)(& x_9)); /* scanf_va_31 */
+    printf("%hd",(int)x_9); /* printf_va_31 */
+    scanf("%hi",(short *)(& x_9)); /* scanf_va_32 */
+    printf("%hi",(int)x_9); /* printf_va_32 */
   }
   {
     uint_least16_t x_10;
-    scanf_va_33("%ho",(unsigned short *)(& x_10));
-    printf_va_33("%ho",(unsigned int)x_10);
-    scanf_va_34("%hu",(unsigned short *)(& x_10));
-    printf_va_34("%hu",(unsigned int)x_10);
-    scanf_va_35("%hx",(unsigned short *)(& x_10));
-    printf_va_35("%hx",(unsigned int)x_10);
-    scanf_va_36("%hx",(unsigned short *)(& x_10));
-    printf_va_36("%hX",(unsigned int)x_10);
+    scanf("%ho",(unsigned short *)(& x_10)); /* scanf_va_33 */
+    printf("%ho",(unsigned int)x_10); /* printf_va_33 */
+    scanf("%hu",(unsigned short *)(& x_10)); /* scanf_va_34 */
+    printf("%hu",(unsigned int)x_10); /* printf_va_34 */
+    scanf("%hx",(unsigned short *)(& x_10)); /* scanf_va_35 */
+    printf("%hx",(unsigned int)x_10); /* printf_va_35 */
+    scanf("%hx",(unsigned short *)(& x_10)); /* scanf_va_36 */
+    printf("%hX",(unsigned int)x_10); /* printf_va_36 */
   }
   {
     int_least32_t x_11;
-    scanf_va_37("%ld",(long *)(& x_11));
-    printf_va_37("%ld",x_11);
-    scanf_va_38("%li",(long *)(& x_11));
-    printf_va_38("%li",x_11);
+    scanf("%ld",(long *)(& x_11)); /* scanf_va_37 */
+    printf("%ld",x_11); /* printf_va_37 */
+    scanf("%li",(long *)(& x_11)); /* scanf_va_38 */
+    printf("%li",x_11); /* printf_va_38 */
   }
   {
     uint_least32_t x_12;
-    scanf_va_39("%lo",(unsigned long *)(& x_12));
-    printf_va_39("%lo",x_12);
-    scanf_va_40("%lu",(unsigned long *)(& x_12));
-    printf_va_40("%lu",x_12);
-    scanf_va_41("%lx",(unsigned long *)(& x_12));
-    printf_va_41("%lx",x_12);
-    scanf_va_42("%lx",(unsigned long *)(& x_12));
-    printf_va_42("%lX",x_12);
+    scanf("%lo",(unsigned long *)(& x_12)); /* scanf_va_39 */
+    printf("%lo",x_12); /* printf_va_39 */
+    scanf("%lu",(unsigned long *)(& x_12)); /* scanf_va_40 */
+    printf("%lu",x_12); /* printf_va_40 */
+    scanf("%lx",(unsigned long *)(& x_12)); /* scanf_va_41 */
+    printf("%lx",x_12); /* printf_va_41 */
+    scanf("%lx",(unsigned long *)(& x_12)); /* scanf_va_42 */
+    printf("%lX",x_12); /* printf_va_42 */
   }
   {
     int_least64_t x_13;
-    scanf_va_43("%lld",(long long *)(& x_13));
-    printf_va_43("%lld",x_13);
-    scanf_va_44("%lli",(long long *)(& x_13));
-    printf_va_44("%lli",x_13);
+    scanf("%lld",(long long *)(& x_13)); /* scanf_va_43 */
+    printf("%lld",x_13); /* printf_va_43 */
+    scanf("%lli",(long long *)(& x_13)); /* scanf_va_44 */
+    printf("%lli",x_13); /* printf_va_44 */
   }
   {
     uint_least64_t x_14;
-    scanf_va_45("%llo",(unsigned long long *)(& x_14));
-    printf_va_45("%llo",x_14);
-    scanf_va_46("%llu",(unsigned long long *)(& x_14));
-    printf_va_46("%llu",x_14);
-    scanf_va_47("%llx",(unsigned long long *)(& x_14));
-    printf_va_47("%llx",x_14);
-    scanf_va_48("%llx",(unsigned long long *)(& x_14));
-    printf_va_48("%llX",x_14);
+    scanf("%llo",(unsigned long long *)(& x_14)); /* scanf_va_45 */
+    printf("%llo",x_14); /* printf_va_45 */
+    scanf("%llu",(unsigned long long *)(& x_14)); /* scanf_va_46 */
+    printf("%llu",x_14); /* printf_va_46 */
+    scanf("%llx",(unsigned long long *)(& x_14)); /* scanf_va_47 */
+    printf("%llx",x_14); /* printf_va_47 */
+    scanf("%llx",(unsigned long long *)(& x_14)); /* scanf_va_48 */
+    printf("%llX",x_14); /* printf_va_48 */
   }
   {
     int_fast8_t x_15;
-    scanf_va_49("%hhd",(signed char *)(& x_15));
-    printf_va_49("%hhd",(int)x_15);
-    scanf_va_50("%hhi",(signed char *)(& x_15));
-    printf_va_50("%hhi",(int)x_15);
+    scanf("%hhd",(signed char *)(& x_15)); /* scanf_va_49 */
+    printf("%hhd",(int)x_15); /* printf_va_49 */
+    scanf("%hhi",(signed char *)(& x_15)); /* scanf_va_50 */
+    printf("%hhi",(int)x_15); /* printf_va_50 */
   }
   {
     uint_fast8_t x_16;
-    scanf_va_51("%hho",(unsigned char *)(& x_16));
-    printf_va_51("%hho",(int)x_16);
-    scanf_va_52("%hhu",(unsigned char *)(& x_16));
-    printf_va_52("%hhu",(int)x_16);
-    scanf_va_53("%hhx",(unsigned char *)(& x_16));
-    printf_va_53("%hhx",(int)x_16);
-    scanf_va_54("%hhx",(unsigned char *)(& x_16));
-    printf_va_54("%hhX",(int)x_16);
+    scanf("%hho",(unsigned char *)(& x_16)); /* scanf_va_51 */
+    printf("%hho",(int)x_16); /* printf_va_51 */
+    scanf("%hhu",(unsigned char *)(& x_16)); /* scanf_va_52 */
+    printf("%hhu",(int)x_16); /* printf_va_52 */
+    scanf("%hhx",(unsigned char *)(& x_16)); /* scanf_va_53 */
+    printf("%hhx",(int)x_16); /* printf_va_53 */
+    scanf("%hhx",(unsigned char *)(& x_16)); /* scanf_va_54 */
+    printf("%hhX",(int)x_16); /* printf_va_54 */
   }
   {
     int_fast16_t x_17;
-    scanf_va_55("%d",(int *)(& x_17));
-    printf_va_55("%d",x_17);
-    scanf_va_56("%i",(int *)(& x_17));
-    printf_va_56("%i",x_17);
+    scanf("%d",(int *)(& x_17)); /* scanf_va_55 */
+    printf("%d",x_17); /* printf_va_55 */
+    scanf("%i",(int *)(& x_17)); /* scanf_va_56 */
+    printf("%i",x_17); /* printf_va_56 */
   }
   {
     uint_fast16_t x_18;
-    scanf_va_57("%o",(unsigned int *)(& x_18));
-    printf_va_57("%o",x_18);
-    scanf_va_58("%u",(unsigned int *)(& x_18));
-    printf_va_58("%u",x_18);
-    scanf_va_59("%x",(unsigned int *)(& x_18));
-    printf_va_59("%x",x_18);
-    scanf_va_60("%x",(unsigned int *)(& x_18));
-    printf_va_60("%X",x_18);
+    scanf("%o",(unsigned int *)(& x_18)); /* scanf_va_57 */
+    printf("%o",x_18); /* printf_va_57 */
+    scanf("%u",(unsigned int *)(& x_18)); /* scanf_va_58 */
+    printf("%u",x_18); /* printf_va_58 */
+    scanf("%x",(unsigned int *)(& x_18)); /* scanf_va_59 */
+    printf("%x",x_18); /* printf_va_59 */
+    scanf("%x",(unsigned int *)(& x_18)); /* scanf_va_60 */
+    printf("%X",x_18); /* printf_va_60 */
   }
   {
     int_fast32_t x_19;
-    scanf_va_61("%ld",(long *)(& x_19));
-    printf_va_61("%ld",x_19);
-    scanf_va_62("%li",(long *)(& x_19));
-    printf_va_62("%li",x_19);
+    scanf("%ld",(long *)(& x_19)); /* scanf_va_61 */
+    printf("%ld",x_19); /* printf_va_61 */
+    scanf("%li",(long *)(& x_19)); /* scanf_va_62 */
+    printf("%li",x_19); /* printf_va_62 */
   }
   {
     uint_fast32_t x_20;
-    scanf_va_63("%lo",(unsigned long *)(& x_20));
-    printf_va_63("%lo",x_20);
-    scanf_va_64("%lu",(unsigned long *)(& x_20));
-    printf_va_64("%lu",x_20);
-    scanf_va_65("%lx",(unsigned long *)(& x_20));
-    printf_va_65("%lx",x_20);
-    scanf_va_66("%lx",(unsigned long *)(& x_20));
-    printf_va_66("%lX",x_20);
+    scanf("%lo",(unsigned long *)(& x_20)); /* scanf_va_63 */
+    printf("%lo",x_20); /* printf_va_63 */
+    scanf("%lu",(unsigned long *)(& x_20)); /* scanf_va_64 */
+    printf("%lu",x_20); /* printf_va_64 */
+    scanf("%lx",(unsigned long *)(& x_20)); /* scanf_va_65 */
+    printf("%lx",x_20); /* printf_va_65 */
+    scanf("%lx",(unsigned long *)(& x_20)); /* scanf_va_66 */
+    printf("%lX",x_20); /* printf_va_66 */
   }
   {
     int_fast64_t x_21;
-    scanf_va_67("%lld",(long long *)(& x_21));
-    printf_va_67("%lld",x_21);
-    scanf_va_68("%lli",(long long *)(& x_21));
-    printf_va_68("%lli",x_21);
+    scanf("%lld",(long long *)(& x_21)); /* scanf_va_67 */
+    printf("%lld",x_21); /* printf_va_67 */
+    scanf("%lli",(long long *)(& x_21)); /* scanf_va_68 */
+    printf("%lli",x_21); /* printf_va_68 */
   }
   {
     uint_fast64_t x_22;
-    scanf_va_69("%llo",(unsigned long long *)(& x_22));
-    printf_va_69("%llo",x_22);
-    scanf_va_70("%llu",(unsigned long long *)(& x_22));
-    printf_va_70("%llu",x_22);
-    scanf_va_71("%llx",(unsigned long long *)(& x_22));
-    printf_va_71("%llx",x_22);
-    scanf_va_72("%llx",(unsigned long long *)(& x_22));
-    printf_va_72("%llX",x_22);
+    scanf("%llo",(unsigned long long *)(& x_22)); /* scanf_va_69 */
+    printf("%llo",x_22); /* printf_va_69 */
+    scanf("%llu",(unsigned long long *)(& x_22)); /* scanf_va_70 */
+    printf("%llu",x_22); /* printf_va_70 */
+    scanf("%llx",(unsigned long long *)(& x_22)); /* scanf_va_71 */
+    printf("%llx",x_22); /* printf_va_71 */
+    scanf("%llx",(unsigned long long *)(& x_22)); /* scanf_va_72 */
+    printf("%llX",x_22); /* printf_va_72 */
   }
   {
     intmax_t x_23;
-    scanf_va_73("%lld",(long long *)(& x_23));
-    printf_va_73("%lld",x_23);
-    scanf_va_74("%lli",(long long *)(& x_23));
-    printf_va_74("%lli",x_23);
+    scanf("%lld",(long long *)(& x_23)); /* scanf_va_73 */
+    printf("%lld",x_23); /* printf_va_73 */
+    scanf("%lli",(long long *)(& x_23)); /* scanf_va_74 */
+    printf("%lli",x_23); /* printf_va_74 */
   }
   {
     uintmax_t x_24;
-    scanf_va_75("%llo",(unsigned long long *)(& x_24));
-    printf_va_75("%llo",x_24);
-    scanf_va_76("%llu",(unsigned long long *)(& x_24));
-    printf_va_76("%llu",x_24);
-    scanf_va_77("%llx",(unsigned long long *)(& x_24));
-    printf_va_77("%llx",x_24);
-    scanf_va_78("%llx",(unsigned long long *)(& x_24));
-    printf_va_78("%llX",x_24);
+    scanf("%llo",(unsigned long long *)(& x_24)); /* scanf_va_75 */
+    printf("%llo",x_24); /* printf_va_75 */
+    scanf("%llu",(unsigned long long *)(& x_24)); /* scanf_va_76 */
+    printf("%llu",x_24); /* printf_va_76 */
+    scanf("%llx",(unsigned long long *)(& x_24)); /* scanf_va_77 */
+    printf("%llx",x_24); /* printf_va_77 */
+    scanf("%llx",(unsigned long long *)(& x_24)); /* scanf_va_78 */
+    printf("%llX",x_24); /* printf_va_78 */
   }
   {
     intptr_t x_25;
-    scanf_va_79("%ld",(long *)(& x_25));
-    printf_va_79("%ld",x_25);
-    scanf_va_80("%li",(long *)(& x_25));
-    printf_va_80("%li",x_25);
+    scanf("%ld",(long *)(& x_25)); /* scanf_va_79 */
+    printf("%ld",x_25); /* printf_va_79 */
+    scanf("%li",(long *)(& x_25)); /* scanf_va_80 */
+    printf("%li",x_25); /* printf_va_80 */
   }
   {
     uintptr_t x_26;
-    scanf_va_81("%lo",(unsigned long *)(& x_26));
-    printf_va_81("%lo",x_26);
-    scanf_va_82("%lu",(unsigned long *)(& x_26));
-    printf_va_82("%lu",x_26);
-    scanf_va_83("%lx",(unsigned long *)(& x_26));
-    printf_va_83("%lx",x_26);
-    scanf_va_84("%lx",(unsigned long *)(& x_26));
-    printf_va_84("%lX",x_26);
+    scanf("%lo",(unsigned long *)(& x_26)); /* scanf_va_81 */
+    printf("%lo",x_26); /* printf_va_81 */
+    scanf("%lu",(unsigned long *)(& x_26)); /* scanf_va_82 */
+    printf("%lu",x_26); /* printf_va_82 */
+    scanf("%lx",(unsigned long *)(& x_26)); /* scanf_va_83 */
+    printf("%lx",x_26); /* printf_va_83 */
+    scanf("%lx",(unsigned long *)(& x_26)); /* scanf_va_84 */
+    printf("%lX",x_26); /* printf_va_84 */
   }
   __retres = 0;
   return __retres;
diff --git a/tests/libc/oracle/inttypes_h.4.res.oracle b/tests/libc/oracle/inttypes_h.4.res.oracle
index fdb3e620cbe42aef466f175602aaf3a2ce30aa52..ef6788e60221327a88e6b7600beabb3445b00628 100644
--- a/tests/libc/oracle/inttypes_h.4.res.oracle
+++ b/tests/libc/oracle/inttypes_h.4.res.oracle
@@ -2531,255 +2531,255 @@ int main(void)
   int __retres;
   {
     int8_t x;
-    scanf_va_1("%hhd",(signed char *)(& x));
-    printf_va_1("%hhd",(int)x);
-    scanf_va_2("%hhi",(signed char *)(& x));
-    printf_va_2("%hhi",(int)x);
+    scanf("%hhd",(signed char *)(& x)); /* scanf_va_1 */
+    printf("%hhd",(int)x); /* printf_va_1 */
+    scanf("%hhi",(signed char *)(& x)); /* scanf_va_2 */
+    printf("%hhi",(int)x); /* printf_va_2 */
   }
   {
     uint8_t x_0;
-    scanf_va_3("%hho",(unsigned char *)(& x_0));
-    printf_va_3("%hho",(int)x_0);
-    scanf_va_4("%hhu",(unsigned char *)(& x_0));
-    printf_va_4("%hhu",(int)x_0);
-    scanf_va_5("%hhx",(unsigned char *)(& x_0));
-    printf_va_5("%hhx",(int)x_0);
-    scanf_va_6("%hhx",(unsigned char *)(& x_0));
-    printf_va_6("%hhX",(int)x_0);
+    scanf("%hho",(unsigned char *)(& x_0)); /* scanf_va_3 */
+    printf("%hho",(int)x_0); /* printf_va_3 */
+    scanf("%hhu",(unsigned char *)(& x_0)); /* scanf_va_4 */
+    printf("%hhu",(int)x_0); /* printf_va_4 */
+    scanf("%hhx",(unsigned char *)(& x_0)); /* scanf_va_5 */
+    printf("%hhx",(int)x_0); /* printf_va_5 */
+    scanf("%hhx",(unsigned char *)(& x_0)); /* scanf_va_6 */
+    printf("%hhX",(int)x_0); /* printf_va_6 */
   }
   {
     int16_t x_1;
-    scanf_va_7("%hd",(short *)(& x_1));
-    printf_va_7("%hd",(int)x_1);
-    scanf_va_8("%hi",(short *)(& x_1));
-    printf_va_8("%hi",(int)x_1);
+    scanf("%hd",(short *)(& x_1)); /* scanf_va_7 */
+    printf("%hd",(int)x_1); /* printf_va_7 */
+    scanf("%hi",(short *)(& x_1)); /* scanf_va_8 */
+    printf("%hi",(int)x_1); /* printf_va_8 */
   }
   {
     uint16_t x_2;
-    scanf_va_9("%ho",(unsigned short *)(& x_2));
-    printf_va_9("%ho",(int)x_2);
-    scanf_va_10("%hu",(unsigned short *)(& x_2));
-    printf_va_10("%hu",(int)x_2);
-    scanf_va_11("%hx",(unsigned short *)(& x_2));
-    printf_va_11("%hx",(int)x_2);
-    scanf_va_12("%hx",(unsigned short *)(& x_2));
-    printf_va_12("%hX",(int)x_2);
+    scanf("%ho",(unsigned short *)(& x_2)); /* scanf_va_9 */
+    printf("%ho",(int)x_2); /* printf_va_9 */
+    scanf("%hu",(unsigned short *)(& x_2)); /* scanf_va_10 */
+    printf("%hu",(int)x_2); /* printf_va_10 */
+    scanf("%hx",(unsigned short *)(& x_2)); /* scanf_va_11 */
+    printf("%hx",(int)x_2); /* printf_va_11 */
+    scanf("%hx",(unsigned short *)(& x_2)); /* scanf_va_12 */
+    printf("%hX",(int)x_2); /* printf_va_12 */
   }
   {
     int32_t x_3;
-    scanf_va_13("%d",(int *)(& x_3));
-    printf_va_13("%d",x_3);
-    scanf_va_14("%i",(int *)(& x_3));
-    printf_va_14("%i",x_3);
+    scanf("%d",(int *)(& x_3)); /* scanf_va_13 */
+    printf("%d",x_3); /* printf_va_13 */
+    scanf("%i",(int *)(& x_3)); /* scanf_va_14 */
+    printf("%i",x_3); /* printf_va_14 */
   }
   {
     uint32_t x_4;
-    scanf_va_15("%o",(unsigned int *)(& x_4));
-    printf_va_15("%o",x_4);
-    scanf_va_16("%u",(unsigned int *)(& x_4));
-    printf_va_16("%u",x_4);
-    scanf_va_17("%x",(unsigned int *)(& x_4));
-    printf_va_17("%x",x_4);
-    scanf_va_18("%x",(unsigned int *)(& x_4));
-    printf_va_18("%X",x_4);
+    scanf("%o",(unsigned int *)(& x_4)); /* scanf_va_15 */
+    printf("%o",x_4); /* printf_va_15 */
+    scanf("%u",(unsigned int *)(& x_4)); /* scanf_va_16 */
+    printf("%u",x_4); /* printf_va_16 */
+    scanf("%x",(unsigned int *)(& x_4)); /* scanf_va_17 */
+    printf("%x",x_4); /* printf_va_17 */
+    scanf("%x",(unsigned int *)(& x_4)); /* scanf_va_18 */
+    printf("%X",x_4); /* printf_va_18 */
   }
   {
     int64_t x_5;
-    scanf_va_19("%lld",(long long *)(& x_5));
-    printf_va_19("%lld",x_5);
-    scanf_va_20("%lli",(long long *)(& x_5));
-    printf_va_20("%lli",x_5);
+    scanf("%lld",(long long *)(& x_5)); /* scanf_va_19 */
+    printf("%lld",x_5); /* printf_va_19 */
+    scanf("%lli",(long long *)(& x_5)); /* scanf_va_20 */
+    printf("%lli",x_5); /* printf_va_20 */
   }
   {
     uint64_t x_6;
-    scanf_va_21("%llo",(unsigned long long *)(& x_6));
-    printf_va_21("%llo",x_6);
-    scanf_va_22("%llu",(unsigned long long *)(& x_6));
-    printf_va_22("%llu",x_6);
-    scanf_va_23("%llx",(unsigned long long *)(& x_6));
-    printf_va_23("%llx",x_6);
-    scanf_va_24("%llx",(unsigned long long *)(& x_6));
-    printf_va_24("%llX",x_6);
+    scanf("%llo",(unsigned long long *)(& x_6)); /* scanf_va_21 */
+    printf("%llo",x_6); /* printf_va_21 */
+    scanf("%llu",(unsigned long long *)(& x_6)); /* scanf_va_22 */
+    printf("%llu",x_6); /* printf_va_22 */
+    scanf("%llx",(unsigned long long *)(& x_6)); /* scanf_va_23 */
+    printf("%llx",x_6); /* printf_va_23 */
+    scanf("%llx",(unsigned long long *)(& x_6)); /* scanf_va_24 */
+    printf("%llX",x_6); /* printf_va_24 */
   }
   {
     int_least8_t x_7;
-    scanf_va_25("%hhd",(signed char *)(& x_7));
-    printf_va_25("%hhd",(int)x_7);
-    scanf_va_26("%hhi",(signed char *)(& x_7));
-    printf_va_26("%hhi",(int)x_7);
+    scanf("%hhd",(signed char *)(& x_7)); /* scanf_va_25 */
+    printf("%hhd",(int)x_7); /* printf_va_25 */
+    scanf("%hhi",(signed char *)(& x_7)); /* scanf_va_26 */
+    printf("%hhi",(int)x_7); /* printf_va_26 */
   }
   {
     uint_least8_t x_8;
-    scanf_va_27("%hho",(unsigned char *)(& x_8));
-    printf_va_27("%hho",(int)x_8);
-    scanf_va_28("%hhu",(unsigned char *)(& x_8));
-    printf_va_28("%hhu",(int)x_8);
-    scanf_va_29("%hhx",(unsigned char *)(& x_8));
-    printf_va_29("%hhx",(int)x_8);
-    scanf_va_30("%hhx",(unsigned char *)(& x_8));
-    printf_va_30("%hhX",(int)x_8);
+    scanf("%hho",(unsigned char *)(& x_8)); /* scanf_va_27 */
+    printf("%hho",(int)x_8); /* printf_va_27 */
+    scanf("%hhu",(unsigned char *)(& x_8)); /* scanf_va_28 */
+    printf("%hhu",(int)x_8); /* printf_va_28 */
+    scanf("%hhx",(unsigned char *)(& x_8)); /* scanf_va_29 */
+    printf("%hhx",(int)x_8); /* printf_va_29 */
+    scanf("%hhx",(unsigned char *)(& x_8)); /* scanf_va_30 */
+    printf("%hhX",(int)x_8); /* printf_va_30 */
   }
   {
     int_least16_t x_9;
-    scanf_va_31("%hd",(short *)(& x_9));
-    printf_va_31("%hd",(int)x_9);
-    scanf_va_32("%hi",(short *)(& x_9));
-    printf_va_32("%hi",(int)x_9);
+    scanf("%hd",(short *)(& x_9)); /* scanf_va_31 */
+    printf("%hd",(int)x_9); /* printf_va_31 */
+    scanf("%hi",(short *)(& x_9)); /* scanf_va_32 */
+    printf("%hi",(int)x_9); /* printf_va_32 */
   }
   {
     uint_least16_t x_10;
-    scanf_va_33("%ho",(unsigned short *)(& x_10));
-    printf_va_33("%ho",(int)x_10);
-    scanf_va_34("%hu",(unsigned short *)(& x_10));
-    printf_va_34("%hu",(int)x_10);
-    scanf_va_35("%hx",(unsigned short *)(& x_10));
-    printf_va_35("%hx",(int)x_10);
-    scanf_va_36("%hx",(unsigned short *)(& x_10));
-    printf_va_36("%hX",(int)x_10);
+    scanf("%ho",(unsigned short *)(& x_10)); /* scanf_va_33 */
+    printf("%ho",(int)x_10); /* printf_va_33 */
+    scanf("%hu",(unsigned short *)(& x_10)); /* scanf_va_34 */
+    printf("%hu",(int)x_10); /* printf_va_34 */
+    scanf("%hx",(unsigned short *)(& x_10)); /* scanf_va_35 */
+    printf("%hx",(int)x_10); /* printf_va_35 */
+    scanf("%hx",(unsigned short *)(& x_10)); /* scanf_va_36 */
+    printf("%hX",(int)x_10); /* printf_va_36 */
   }
   {
     int_least32_t x_11;
-    scanf_va_37("%d",(int *)(& x_11));
-    printf_va_37("%d",x_11);
-    scanf_va_38("%i",(int *)(& x_11));
-    printf_va_38("%i",x_11);
+    scanf("%d",(int *)(& x_11)); /* scanf_va_37 */
+    printf("%d",x_11); /* printf_va_37 */
+    scanf("%i",(int *)(& x_11)); /* scanf_va_38 */
+    printf("%i",x_11); /* printf_va_38 */
   }
   {
     uint_least32_t x_12;
-    scanf_va_39("%o",(unsigned int *)(& x_12));
-    printf_va_39("%o",x_12);
-    scanf_va_40("%u",(unsigned int *)(& x_12));
-    printf_va_40("%u",x_12);
-    scanf_va_41("%x",(unsigned int *)(& x_12));
-    printf_va_41("%x",x_12);
-    scanf_va_42("%x",(unsigned int *)(& x_12));
-    printf_va_42("%X",x_12);
+    scanf("%o",(unsigned int *)(& x_12)); /* scanf_va_39 */
+    printf("%o",x_12); /* printf_va_39 */
+    scanf("%u",(unsigned int *)(& x_12)); /* scanf_va_40 */
+    printf("%u",x_12); /* printf_va_40 */
+    scanf("%x",(unsigned int *)(& x_12)); /* scanf_va_41 */
+    printf("%x",x_12); /* printf_va_41 */
+    scanf("%x",(unsigned int *)(& x_12)); /* scanf_va_42 */
+    printf("%X",x_12); /* printf_va_42 */
   }
   {
     int_least64_t x_13;
-    scanf_va_43("%lld",(long long *)(& x_13));
-    printf_va_43("%lld",x_13);
-    scanf_va_44("%lli",(long long *)(& x_13));
-    printf_va_44("%lli",x_13);
+    scanf("%lld",(long long *)(& x_13)); /* scanf_va_43 */
+    printf("%lld",x_13); /* printf_va_43 */
+    scanf("%lli",(long long *)(& x_13)); /* scanf_va_44 */
+    printf("%lli",x_13); /* printf_va_44 */
   }
   {
     uint_least64_t x_14;
-    scanf_va_45("%llo",(unsigned long long *)(& x_14));
-    printf_va_45("%llo",x_14);
-    scanf_va_46("%llu",(unsigned long long *)(& x_14));
-    printf_va_46("%llu",x_14);
-    scanf_va_47("%llx",(unsigned long long *)(& x_14));
-    printf_va_47("%llx",x_14);
-    scanf_va_48("%llx",(unsigned long long *)(& x_14));
-    printf_va_48("%llX",x_14);
+    scanf("%llo",(unsigned long long *)(& x_14)); /* scanf_va_45 */
+    printf("%llo",x_14); /* printf_va_45 */
+    scanf("%llu",(unsigned long long *)(& x_14)); /* scanf_va_46 */
+    printf("%llu",x_14); /* printf_va_46 */
+    scanf("%llx",(unsigned long long *)(& x_14)); /* scanf_va_47 */
+    printf("%llx",x_14); /* printf_va_47 */
+    scanf("%llx",(unsigned long long *)(& x_14)); /* scanf_va_48 */
+    printf("%llX",x_14); /* printf_va_48 */
   }
   {
     int_fast8_t x_15;
-    scanf_va_49("%hhd",(signed char *)(& x_15));
-    printf_va_49("%hhd",(int)x_15);
-    scanf_va_50("%hhi",(signed char *)(& x_15));
-    printf_va_50("%hhi",(int)x_15);
+    scanf("%hhd",(signed char *)(& x_15)); /* scanf_va_49 */
+    printf("%hhd",(int)x_15); /* printf_va_49 */
+    scanf("%hhi",(signed char *)(& x_15)); /* scanf_va_50 */
+    printf("%hhi",(int)x_15); /* printf_va_50 */
   }
   {
     uint_fast8_t x_16;
-    scanf_va_51("%hho",(unsigned char *)(& x_16));
-    printf_va_51("%hho",(int)x_16);
-    scanf_va_52("%hhu",(unsigned char *)(& x_16));
-    printf_va_52("%hhu",(int)x_16);
-    scanf_va_53("%hhx",(unsigned char *)(& x_16));
-    printf_va_53("%hhx",(int)x_16);
-    scanf_va_54("%hhx",(unsigned char *)(& x_16));
-    printf_va_54("%hhX",(int)x_16);
+    scanf("%hho",(unsigned char *)(& x_16)); /* scanf_va_51 */
+    printf("%hho",(int)x_16); /* printf_va_51 */
+    scanf("%hhu",(unsigned char *)(& x_16)); /* scanf_va_52 */
+    printf("%hhu",(int)x_16); /* printf_va_52 */
+    scanf("%hhx",(unsigned char *)(& x_16)); /* scanf_va_53 */
+    printf("%hhx",(int)x_16); /* printf_va_53 */
+    scanf("%hhx",(unsigned char *)(& x_16)); /* scanf_va_54 */
+    printf("%hhX",(int)x_16); /* printf_va_54 */
   }
   {
     int_fast16_t x_17;
-    scanf_va_55("%d",(int *)(& x_17));
-    printf_va_55("%d",x_17);
-    scanf_va_56("%i",(int *)(& x_17));
-    printf_va_56("%i",x_17);
+    scanf("%d",(int *)(& x_17)); /* scanf_va_55 */
+    printf("%d",x_17); /* printf_va_55 */
+    scanf("%i",(int *)(& x_17)); /* scanf_va_56 */
+    printf("%i",x_17); /* printf_va_56 */
   }
   {
     uint_fast16_t x_18;
-    scanf_va_57("%o",(unsigned int *)(& x_18));
-    printf_va_57("%o",x_18);
-    scanf_va_58("%u",(unsigned int *)(& x_18));
-    printf_va_58("%u",x_18);
-    scanf_va_59("%x",(unsigned int *)(& x_18));
-    printf_va_59("%x",x_18);
-    scanf_va_60("%x",(unsigned int *)(& x_18));
-    printf_va_60("%X",x_18);
+    scanf("%o",(unsigned int *)(& x_18)); /* scanf_va_57 */
+    printf("%o",x_18); /* printf_va_57 */
+    scanf("%u",(unsigned int *)(& x_18)); /* scanf_va_58 */
+    printf("%u",x_18); /* printf_va_58 */
+    scanf("%x",(unsigned int *)(& x_18)); /* scanf_va_59 */
+    printf("%x",x_18); /* printf_va_59 */
+    scanf("%x",(unsigned int *)(& x_18)); /* scanf_va_60 */
+    printf("%X",x_18); /* printf_va_60 */
   }
   {
     int_fast32_t x_19;
-    scanf_va_61("%d",(int *)(& x_19));
-    printf_va_61("%d",x_19);
-    scanf_va_62("%i",(int *)(& x_19));
-    printf_va_62("%i",x_19);
+    scanf("%d",(int *)(& x_19)); /* scanf_va_61 */
+    printf("%d",x_19); /* printf_va_61 */
+    scanf("%i",(int *)(& x_19)); /* scanf_va_62 */
+    printf("%i",x_19); /* printf_va_62 */
   }
   {
     uint_fast32_t x_20;
-    scanf_va_63("%o",(unsigned int *)(& x_20));
-    printf_va_63("%o",x_20);
-    scanf_va_64("%u",(unsigned int *)(& x_20));
-    printf_va_64("%u",x_20);
-    scanf_va_65("%x",(unsigned int *)(& x_20));
-    printf_va_65("%x",x_20);
-    scanf_va_66("%x",(unsigned int *)(& x_20));
-    printf_va_66("%X",x_20);
+    scanf("%o",(unsigned int *)(& x_20)); /* scanf_va_63 */
+    printf("%o",x_20); /* printf_va_63 */
+    scanf("%u",(unsigned int *)(& x_20)); /* scanf_va_64 */
+    printf("%u",x_20); /* printf_va_64 */
+    scanf("%x",(unsigned int *)(& x_20)); /* scanf_va_65 */
+    printf("%x",x_20); /* printf_va_65 */
+    scanf("%x",(unsigned int *)(& x_20)); /* scanf_va_66 */
+    printf("%X",x_20); /* printf_va_66 */
   }
   {
     int_fast64_t x_21;
-    scanf_va_67("%lld",(long long *)(& x_21));
-    printf_va_67("%lld",x_21);
-    scanf_va_68("%lli",(long long *)(& x_21));
-    printf_va_68("%lli",x_21);
+    scanf("%lld",(long long *)(& x_21)); /* scanf_va_67 */
+    printf("%lld",x_21); /* printf_va_67 */
+    scanf("%lli",(long long *)(& x_21)); /* scanf_va_68 */
+    printf("%lli",x_21); /* printf_va_68 */
   }
   {
     uint_fast64_t x_22;
-    scanf_va_69("%llo",(unsigned long long *)(& x_22));
-    printf_va_69("%llo",x_22);
-    scanf_va_70("%llu",(unsigned long long *)(& x_22));
-    printf_va_70("%llu",x_22);
-    scanf_va_71("%llx",(unsigned long long *)(& x_22));
-    printf_va_71("%llx",x_22);
-    scanf_va_72("%llx",(unsigned long long *)(& x_22));
-    printf_va_72("%llX",x_22);
+    scanf("%llo",(unsigned long long *)(& x_22)); /* scanf_va_69 */
+    printf("%llo",x_22); /* printf_va_69 */
+    scanf("%llu",(unsigned long long *)(& x_22)); /* scanf_va_70 */
+    printf("%llu",x_22); /* printf_va_70 */
+    scanf("%llx",(unsigned long long *)(& x_22)); /* scanf_va_71 */
+    printf("%llx",x_22); /* printf_va_71 */
+    scanf("%llx",(unsigned long long *)(& x_22)); /* scanf_va_72 */
+    printf("%llX",x_22); /* printf_va_72 */
   }
   {
     intmax_t x_23;
-    scanf_va_73("%lld",(long long *)(& x_23));
-    printf_va_73("%lld",x_23);
-    scanf_va_74("%lli",(long long *)(& x_23));
-    printf_va_74("%lli",x_23);
+    scanf("%lld",(long long *)(& x_23)); /* scanf_va_73 */
+    printf("%lld",x_23); /* printf_va_73 */
+    scanf("%lli",(long long *)(& x_23)); /* scanf_va_74 */
+    printf("%lli",x_23); /* printf_va_74 */
   }
   {
     uintmax_t x_24;
-    scanf_va_75("%llo",(unsigned long long *)(& x_24));
-    printf_va_75("%llo",x_24);
-    scanf_va_76("%llu",(unsigned long long *)(& x_24));
-    printf_va_76("%llu",x_24);
-    scanf_va_77("%llx",(unsigned long long *)(& x_24));
-    printf_va_77("%llx",x_24);
-    scanf_va_78("%llx",(unsigned long long *)(& x_24));
-    printf_va_78("%llX",x_24);
+    scanf("%llo",(unsigned long long *)(& x_24)); /* scanf_va_75 */
+    printf("%llo",x_24); /* printf_va_75 */
+    scanf("%llu",(unsigned long long *)(& x_24)); /* scanf_va_76 */
+    printf("%llu",x_24); /* printf_va_76 */
+    scanf("%llx",(unsigned long long *)(& x_24)); /* scanf_va_77 */
+    printf("%llx",x_24); /* printf_va_77 */
+    scanf("%llx",(unsigned long long *)(& x_24)); /* scanf_va_78 */
+    printf("%llX",x_24); /* printf_va_78 */
   }
   {
     intptr_t x_25;
-    scanf_va_79("%d",(int *)(& x_25));
-    printf_va_79("%d",x_25);
-    scanf_va_80("%i",(int *)(& x_25));
-    printf_va_80("%i",x_25);
+    scanf("%d",(int *)(& x_25)); /* scanf_va_79 */
+    printf("%d",x_25); /* printf_va_79 */
+    scanf("%i",(int *)(& x_25)); /* scanf_va_80 */
+    printf("%i",x_25); /* printf_va_80 */
   }
   {
     uintptr_t x_26;
-    scanf_va_81("%o",(unsigned int *)(& x_26));
-    printf_va_81("%o",x_26);
-    scanf_va_82("%u",(unsigned int *)(& x_26));
-    printf_va_82("%u",x_26);
-    scanf_va_83("%x",(unsigned int *)(& x_26));
-    printf_va_83("%x",x_26);
-    scanf_va_84("%x",(unsigned int *)(& x_26));
-    printf_va_84("%X",x_26);
+    scanf("%o",(unsigned int *)(& x_26)); /* scanf_va_81 */
+    printf("%o",x_26); /* printf_va_81 */
+    scanf("%u",(unsigned int *)(& x_26)); /* scanf_va_82 */
+    printf("%u",x_26); /* printf_va_82 */
+    scanf("%x",(unsigned int *)(& x_26)); /* scanf_va_83 */
+    printf("%x",x_26); /* printf_va_83 */
+    scanf("%x",(unsigned int *)(& x_26)); /* scanf_va_84 */
+    printf("%X",x_26); /* printf_va_84 */
   }
   __retres = 0;
   return __retres;
diff --git a/tests/libc/oracle/inttypes_h.5.res.oracle b/tests/libc/oracle/inttypes_h.5.res.oracle
index e519da6336564250bf581e6e928c34c5cb64e888..1a3ec0c939e6cdca229303b069fb316a58f21a9c 100644
--- a/tests/libc/oracle/inttypes_h.5.res.oracle
+++ b/tests/libc/oracle/inttypes_h.5.res.oracle
@@ -2531,255 +2531,255 @@ int main(void)
   int __retres;
   {
     int8_t x;
-    scanf_va_1("%hhd",(signed char *)(& x));
-    printf_va_1("%hhd",(int)x);
-    scanf_va_2("%hhi",(signed char *)(& x));
-    printf_va_2("%hhi",(int)x);
+    scanf("%hhd",(signed char *)(& x)); /* scanf_va_1 */
+    printf("%hhd",(int)x); /* printf_va_1 */
+    scanf("%hhi",(signed char *)(& x)); /* scanf_va_2 */
+    printf("%hhi",(int)x); /* printf_va_2 */
   }
   {
     uint8_t x_0;
-    scanf_va_3("%hho",(unsigned char *)(& x_0));
-    printf_va_3("%hho",(int)x_0);
-    scanf_va_4("%hhu",(unsigned char *)(& x_0));
-    printf_va_4("%hhu",(int)x_0);
-    scanf_va_5("%hhx",(unsigned char *)(& x_0));
-    printf_va_5("%hhx",(int)x_0);
-    scanf_va_6("%hhx",(unsigned char *)(& x_0));
-    printf_va_6("%hhX",(int)x_0);
+    scanf("%hho",(unsigned char *)(& x_0)); /* scanf_va_3 */
+    printf("%hho",(int)x_0); /* printf_va_3 */
+    scanf("%hhu",(unsigned char *)(& x_0)); /* scanf_va_4 */
+    printf("%hhu",(int)x_0); /* printf_va_4 */
+    scanf("%hhx",(unsigned char *)(& x_0)); /* scanf_va_5 */
+    printf("%hhx",(int)x_0); /* printf_va_5 */
+    scanf("%hhx",(unsigned char *)(& x_0)); /* scanf_va_6 */
+    printf("%hhX",(int)x_0); /* printf_va_6 */
   }
   {
     int16_t x_1;
-    scanf_va_7("%hd",(short *)(& x_1));
-    printf_va_7("%hd",(int)x_1);
-    scanf_va_8("%hi",(short *)(& x_1));
-    printf_va_8("%hi",(int)x_1);
+    scanf("%hd",(short *)(& x_1)); /* scanf_va_7 */
+    printf("%hd",(int)x_1); /* printf_va_7 */
+    scanf("%hi",(short *)(& x_1)); /* scanf_va_8 */
+    printf("%hi",(int)x_1); /* printf_va_8 */
   }
   {
     uint16_t x_2;
-    scanf_va_9("%ho",(unsigned short *)(& x_2));
-    printf_va_9("%ho",(int)x_2);
-    scanf_va_10("%hu",(unsigned short *)(& x_2));
-    printf_va_10("%hu",(int)x_2);
-    scanf_va_11("%hx",(unsigned short *)(& x_2));
-    printf_va_11("%hx",(int)x_2);
-    scanf_va_12("%hx",(unsigned short *)(& x_2));
-    printf_va_12("%hX",(int)x_2);
+    scanf("%ho",(unsigned short *)(& x_2)); /* scanf_va_9 */
+    printf("%ho",(int)x_2); /* printf_va_9 */
+    scanf("%hu",(unsigned short *)(& x_2)); /* scanf_va_10 */
+    printf("%hu",(int)x_2); /* printf_va_10 */
+    scanf("%hx",(unsigned short *)(& x_2)); /* scanf_va_11 */
+    printf("%hx",(int)x_2); /* printf_va_11 */
+    scanf("%hx",(unsigned short *)(& x_2)); /* scanf_va_12 */
+    printf("%hX",(int)x_2); /* printf_va_12 */
   }
   {
     int32_t x_3;
-    scanf_va_13("%d",(int *)(& x_3));
-    printf_va_13("%d",x_3);
-    scanf_va_14("%i",(int *)(& x_3));
-    printf_va_14("%i",x_3);
+    scanf("%d",(int *)(& x_3)); /* scanf_va_13 */
+    printf("%d",x_3); /* printf_va_13 */
+    scanf("%i",(int *)(& x_3)); /* scanf_va_14 */
+    printf("%i",x_3); /* printf_va_14 */
   }
   {
     uint32_t x_4;
-    scanf_va_15("%o",(unsigned int *)(& x_4));
-    printf_va_15("%o",x_4);
-    scanf_va_16("%u",(unsigned int *)(& x_4));
-    printf_va_16("%u",x_4);
-    scanf_va_17("%x",(unsigned int *)(& x_4));
-    printf_va_17("%x",x_4);
-    scanf_va_18("%x",(unsigned int *)(& x_4));
-    printf_va_18("%X",x_4);
+    scanf("%o",(unsigned int *)(& x_4)); /* scanf_va_15 */
+    printf("%o",x_4); /* printf_va_15 */
+    scanf("%u",(unsigned int *)(& x_4)); /* scanf_va_16 */
+    printf("%u",x_4); /* printf_va_16 */
+    scanf("%x",(unsigned int *)(& x_4)); /* scanf_va_17 */
+    printf("%x",x_4); /* printf_va_17 */
+    scanf("%x",(unsigned int *)(& x_4)); /* scanf_va_18 */
+    printf("%X",x_4); /* printf_va_18 */
   }
   {
     int64_t x_5;
-    scanf_va_19("%ld",(long *)(& x_5));
-    printf_va_19("%ld",x_5);
-    scanf_va_20("%li",(long *)(& x_5));
-    printf_va_20("%li",x_5);
+    scanf("%ld",(long *)(& x_5)); /* scanf_va_19 */
+    printf("%ld",x_5); /* printf_va_19 */
+    scanf("%li",(long *)(& x_5)); /* scanf_va_20 */
+    printf("%li",x_5); /* printf_va_20 */
   }
   {
     uint64_t x_6;
-    scanf_va_21("%lo",(unsigned long *)(& x_6));
-    printf_va_21("%lo",x_6);
-    scanf_va_22("%lu",(unsigned long *)(& x_6));
-    printf_va_22("%lu",x_6);
-    scanf_va_23("%lx",(unsigned long *)(& x_6));
-    printf_va_23("%lx",x_6);
-    scanf_va_24("%lx",(unsigned long *)(& x_6));
-    printf_va_24("%lX",x_6);
+    scanf("%lo",(unsigned long *)(& x_6)); /* scanf_va_21 */
+    printf("%lo",x_6); /* printf_va_21 */
+    scanf("%lu",(unsigned long *)(& x_6)); /* scanf_va_22 */
+    printf("%lu",x_6); /* printf_va_22 */
+    scanf("%lx",(unsigned long *)(& x_6)); /* scanf_va_23 */
+    printf("%lx",x_6); /* printf_va_23 */
+    scanf("%lx",(unsigned long *)(& x_6)); /* scanf_va_24 */
+    printf("%lX",x_6); /* printf_va_24 */
   }
   {
     int_least8_t x_7;
-    scanf_va_25("%hhd",(signed char *)(& x_7));
-    printf_va_25("%hhd",(int)x_7);
-    scanf_va_26("%hhi",(signed char *)(& x_7));
-    printf_va_26("%hhi",(int)x_7);
+    scanf("%hhd",(signed char *)(& x_7)); /* scanf_va_25 */
+    printf("%hhd",(int)x_7); /* printf_va_25 */
+    scanf("%hhi",(signed char *)(& x_7)); /* scanf_va_26 */
+    printf("%hhi",(int)x_7); /* printf_va_26 */
   }
   {
     uint_least8_t x_8;
-    scanf_va_27("%hho",(unsigned char *)(& x_8));
-    printf_va_27("%hho",(int)x_8);
-    scanf_va_28("%hhu",(unsigned char *)(& x_8));
-    printf_va_28("%hhu",(int)x_8);
-    scanf_va_29("%hhx",(unsigned char *)(& x_8));
-    printf_va_29("%hhx",(int)x_8);
-    scanf_va_30("%hhx",(unsigned char *)(& x_8));
-    printf_va_30("%hhX",(int)x_8);
+    scanf("%hho",(unsigned char *)(& x_8)); /* scanf_va_27 */
+    printf("%hho",(int)x_8); /* printf_va_27 */
+    scanf("%hhu",(unsigned char *)(& x_8)); /* scanf_va_28 */
+    printf("%hhu",(int)x_8); /* printf_va_28 */
+    scanf("%hhx",(unsigned char *)(& x_8)); /* scanf_va_29 */
+    printf("%hhx",(int)x_8); /* printf_va_29 */
+    scanf("%hhx",(unsigned char *)(& x_8)); /* scanf_va_30 */
+    printf("%hhX",(int)x_8); /* printf_va_30 */
   }
   {
     int_least16_t x_9;
-    scanf_va_31("%hd",(short *)(& x_9));
-    printf_va_31("%hd",(int)x_9);
-    scanf_va_32("%hi",(short *)(& x_9));
-    printf_va_32("%hi",(int)x_9);
+    scanf("%hd",(short *)(& x_9)); /* scanf_va_31 */
+    printf("%hd",(int)x_9); /* printf_va_31 */
+    scanf("%hi",(short *)(& x_9)); /* scanf_va_32 */
+    printf("%hi",(int)x_9); /* printf_va_32 */
   }
   {
     uint_least16_t x_10;
-    scanf_va_33("%ho",(unsigned short *)(& x_10));
-    printf_va_33("%ho",(int)x_10);
-    scanf_va_34("%hu",(unsigned short *)(& x_10));
-    printf_va_34("%hu",(int)x_10);
-    scanf_va_35("%hx",(unsigned short *)(& x_10));
-    printf_va_35("%hx",(int)x_10);
-    scanf_va_36("%hx",(unsigned short *)(& x_10));
-    printf_va_36("%hX",(int)x_10);
+    scanf("%ho",(unsigned short *)(& x_10)); /* scanf_va_33 */
+    printf("%ho",(int)x_10); /* printf_va_33 */
+    scanf("%hu",(unsigned short *)(& x_10)); /* scanf_va_34 */
+    printf("%hu",(int)x_10); /* printf_va_34 */
+    scanf("%hx",(unsigned short *)(& x_10)); /* scanf_va_35 */
+    printf("%hx",(int)x_10); /* printf_va_35 */
+    scanf("%hx",(unsigned short *)(& x_10)); /* scanf_va_36 */
+    printf("%hX",(int)x_10); /* printf_va_36 */
   }
   {
     int_least32_t x_11;
-    scanf_va_37("%d",(int *)(& x_11));
-    printf_va_37("%d",x_11);
-    scanf_va_38("%i",(int *)(& x_11));
-    printf_va_38("%i",x_11);
+    scanf("%d",(int *)(& x_11)); /* scanf_va_37 */
+    printf("%d",x_11); /* printf_va_37 */
+    scanf("%i",(int *)(& x_11)); /* scanf_va_38 */
+    printf("%i",x_11); /* printf_va_38 */
   }
   {
     uint_least32_t x_12;
-    scanf_va_39("%o",(unsigned int *)(& x_12));
-    printf_va_39("%o",x_12);
-    scanf_va_40("%u",(unsigned int *)(& x_12));
-    printf_va_40("%u",x_12);
-    scanf_va_41("%x",(unsigned int *)(& x_12));
-    printf_va_41("%x",x_12);
-    scanf_va_42("%x",(unsigned int *)(& x_12));
-    printf_va_42("%X",x_12);
+    scanf("%o",(unsigned int *)(& x_12)); /* scanf_va_39 */
+    printf("%o",x_12); /* printf_va_39 */
+    scanf("%u",(unsigned int *)(& x_12)); /* scanf_va_40 */
+    printf("%u",x_12); /* printf_va_40 */
+    scanf("%x",(unsigned int *)(& x_12)); /* scanf_va_41 */
+    printf("%x",x_12); /* printf_va_41 */
+    scanf("%x",(unsigned int *)(& x_12)); /* scanf_va_42 */
+    printf("%X",x_12); /* printf_va_42 */
   }
   {
     int_least64_t x_13;
-    scanf_va_43("%ld",(long *)(& x_13));
-    printf_va_43("%ld",x_13);
-    scanf_va_44("%li",(long *)(& x_13));
-    printf_va_44("%li",x_13);
+    scanf("%ld",(long *)(& x_13)); /* scanf_va_43 */
+    printf("%ld",x_13); /* printf_va_43 */
+    scanf("%li",(long *)(& x_13)); /* scanf_va_44 */
+    printf("%li",x_13); /* printf_va_44 */
   }
   {
     uint_least64_t x_14;
-    scanf_va_45("%lo",(unsigned long *)(& x_14));
-    printf_va_45("%lo",x_14);
-    scanf_va_46("%lu",(unsigned long *)(& x_14));
-    printf_va_46("%lu",x_14);
-    scanf_va_47("%lx",(unsigned long *)(& x_14));
-    printf_va_47("%lx",x_14);
-    scanf_va_48("%lx",(unsigned long *)(& x_14));
-    printf_va_48("%lX",x_14);
+    scanf("%lo",(unsigned long *)(& x_14)); /* scanf_va_45 */
+    printf("%lo",x_14); /* printf_va_45 */
+    scanf("%lu",(unsigned long *)(& x_14)); /* scanf_va_46 */
+    printf("%lu",x_14); /* printf_va_46 */
+    scanf("%lx",(unsigned long *)(& x_14)); /* scanf_va_47 */
+    printf("%lx",x_14); /* printf_va_47 */
+    scanf("%lx",(unsigned long *)(& x_14)); /* scanf_va_48 */
+    printf("%lX",x_14); /* printf_va_48 */
   }
   {
     int_fast8_t x_15;
-    scanf_va_49("%hhd",(signed char *)(& x_15));
-    printf_va_49("%hhd",(int)x_15);
-    scanf_va_50("%hhi",(signed char *)(& x_15));
-    printf_va_50("%hhi",(int)x_15);
+    scanf("%hhd",(signed char *)(& x_15)); /* scanf_va_49 */
+    printf("%hhd",(int)x_15); /* printf_va_49 */
+    scanf("%hhi",(signed char *)(& x_15)); /* scanf_va_50 */
+    printf("%hhi",(int)x_15); /* printf_va_50 */
   }
   {
     uint_fast8_t x_16;
-    scanf_va_51("%hho",(unsigned char *)(& x_16));
-    printf_va_51("%hho",(int)x_16);
-    scanf_va_52("%hhu",(unsigned char *)(& x_16));
-    printf_va_52("%hhu",(int)x_16);
-    scanf_va_53("%hhx",(unsigned char *)(& x_16));
-    printf_va_53("%hhx",(int)x_16);
-    scanf_va_54("%hhx",(unsigned char *)(& x_16));
-    printf_va_54("%hhX",(int)x_16);
+    scanf("%hho",(unsigned char *)(& x_16)); /* scanf_va_51 */
+    printf("%hho",(int)x_16); /* printf_va_51 */
+    scanf("%hhu",(unsigned char *)(& x_16)); /* scanf_va_52 */
+    printf("%hhu",(int)x_16); /* printf_va_52 */
+    scanf("%hhx",(unsigned char *)(& x_16)); /* scanf_va_53 */
+    printf("%hhx",(int)x_16); /* printf_va_53 */
+    scanf("%hhx",(unsigned char *)(& x_16)); /* scanf_va_54 */
+    printf("%hhX",(int)x_16); /* printf_va_54 */
   }
   {
     int_fast16_t x_17;
-    scanf_va_55("%d",(int *)(& x_17));
-    printf_va_55("%d",x_17);
-    scanf_va_56("%i",(int *)(& x_17));
-    printf_va_56("%i",x_17);
+    scanf("%d",(int *)(& x_17)); /* scanf_va_55 */
+    printf("%d",x_17); /* printf_va_55 */
+    scanf("%i",(int *)(& x_17)); /* scanf_va_56 */
+    printf("%i",x_17); /* printf_va_56 */
   }
   {
     uint_fast16_t x_18;
-    scanf_va_57("%o",(unsigned int *)(& x_18));
-    printf_va_57("%o",x_18);
-    scanf_va_58("%u",(unsigned int *)(& x_18));
-    printf_va_58("%u",x_18);
-    scanf_va_59("%x",(unsigned int *)(& x_18));
-    printf_va_59("%x",x_18);
-    scanf_va_60("%x",(unsigned int *)(& x_18));
-    printf_va_60("%X",x_18);
+    scanf("%o",(unsigned int *)(& x_18)); /* scanf_va_57 */
+    printf("%o",x_18); /* printf_va_57 */
+    scanf("%u",(unsigned int *)(& x_18)); /* scanf_va_58 */
+    printf("%u",x_18); /* printf_va_58 */
+    scanf("%x",(unsigned int *)(& x_18)); /* scanf_va_59 */
+    printf("%x",x_18); /* printf_va_59 */
+    scanf("%x",(unsigned int *)(& x_18)); /* scanf_va_60 */
+    printf("%X",x_18); /* printf_va_60 */
   }
   {
     int_fast32_t x_19;
-    scanf_va_61("%d",(int *)(& x_19));
-    printf_va_61("%d",x_19);
-    scanf_va_62("%i",(int *)(& x_19));
-    printf_va_62("%i",x_19);
+    scanf("%d",(int *)(& x_19)); /* scanf_va_61 */
+    printf("%d",x_19); /* printf_va_61 */
+    scanf("%i",(int *)(& x_19)); /* scanf_va_62 */
+    printf("%i",x_19); /* printf_va_62 */
   }
   {
     uint_fast32_t x_20;
-    scanf_va_63("%o",(unsigned int *)(& x_20));
-    printf_va_63("%o",x_20);
-    scanf_va_64("%u",(unsigned int *)(& x_20));
-    printf_va_64("%u",x_20);
-    scanf_va_65("%x",(unsigned int *)(& x_20));
-    printf_va_65("%x",x_20);
-    scanf_va_66("%x",(unsigned int *)(& x_20));
-    printf_va_66("%X",x_20);
+    scanf("%o",(unsigned int *)(& x_20)); /* scanf_va_63 */
+    printf("%o",x_20); /* printf_va_63 */
+    scanf("%u",(unsigned int *)(& x_20)); /* scanf_va_64 */
+    printf("%u",x_20); /* printf_va_64 */
+    scanf("%x",(unsigned int *)(& x_20)); /* scanf_va_65 */
+    printf("%x",x_20); /* printf_va_65 */
+    scanf("%x",(unsigned int *)(& x_20)); /* scanf_va_66 */
+    printf("%X",x_20); /* printf_va_66 */
   }
   {
     int_fast64_t x_21;
-    scanf_va_67("%ld",(long *)(& x_21));
-    printf_va_67("%ld",x_21);
-    scanf_va_68("%li",(long *)(& x_21));
-    printf_va_68("%li",x_21);
+    scanf("%ld",(long *)(& x_21)); /* scanf_va_67 */
+    printf("%ld",x_21); /* printf_va_67 */
+    scanf("%li",(long *)(& x_21)); /* scanf_va_68 */
+    printf("%li",x_21); /* printf_va_68 */
   }
   {
     uint_fast64_t x_22;
-    scanf_va_69("%lo",(unsigned long *)(& x_22));
-    printf_va_69("%lo",x_22);
-    scanf_va_70("%lu",(unsigned long *)(& x_22));
-    printf_va_70("%lu",x_22);
-    scanf_va_71("%lx",(unsigned long *)(& x_22));
-    printf_va_71("%lx",x_22);
-    scanf_va_72("%lx",(unsigned long *)(& x_22));
-    printf_va_72("%lX",x_22);
+    scanf("%lo",(unsigned long *)(& x_22)); /* scanf_va_69 */
+    printf("%lo",x_22); /* printf_va_69 */
+    scanf("%lu",(unsigned long *)(& x_22)); /* scanf_va_70 */
+    printf("%lu",x_22); /* printf_va_70 */
+    scanf("%lx",(unsigned long *)(& x_22)); /* scanf_va_71 */
+    printf("%lx",x_22); /* printf_va_71 */
+    scanf("%lx",(unsigned long *)(& x_22)); /* scanf_va_72 */
+    printf("%lX",x_22); /* printf_va_72 */
   }
   {
     intmax_t x_23;
-    scanf_va_73("%lld",(long long *)(& x_23));
-    printf_va_73("%lld",x_23);
-    scanf_va_74("%lli",(long long *)(& x_23));
-    printf_va_74("%lli",x_23);
+    scanf("%lld",(long long *)(& x_23)); /* scanf_va_73 */
+    printf("%lld",x_23); /* printf_va_73 */
+    scanf("%lli",(long long *)(& x_23)); /* scanf_va_74 */
+    printf("%lli",x_23); /* printf_va_74 */
   }
   {
     uintmax_t x_24;
-    scanf_va_75("%llo",(unsigned long long *)(& x_24));
-    printf_va_75("%llo",x_24);
-    scanf_va_76("%llu",(unsigned long long *)(& x_24));
-    printf_va_76("%llu",x_24);
-    scanf_va_77("%llx",(unsigned long long *)(& x_24));
-    printf_va_77("%llx",x_24);
-    scanf_va_78("%llx",(unsigned long long *)(& x_24));
-    printf_va_78("%llX",x_24);
+    scanf("%llo",(unsigned long long *)(& x_24)); /* scanf_va_75 */
+    printf("%llo",x_24); /* printf_va_75 */
+    scanf("%llu",(unsigned long long *)(& x_24)); /* scanf_va_76 */
+    printf("%llu",x_24); /* printf_va_76 */
+    scanf("%llx",(unsigned long long *)(& x_24)); /* scanf_va_77 */
+    printf("%llx",x_24); /* printf_va_77 */
+    scanf("%llx",(unsigned long long *)(& x_24)); /* scanf_va_78 */
+    printf("%llX",x_24); /* printf_va_78 */
   }
   {
     intptr_t x_25;
-    scanf_va_79("%ld",(long *)(& x_25));
-    printf_va_79("%ld",x_25);
-    scanf_va_80("%li",(long *)(& x_25));
-    printf_va_80("%li",x_25);
+    scanf("%ld",(long *)(& x_25)); /* scanf_va_79 */
+    printf("%ld",x_25); /* printf_va_79 */
+    scanf("%li",(long *)(& x_25)); /* scanf_va_80 */
+    printf("%li",x_25); /* printf_va_80 */
   }
   {
     uintptr_t x_26;
-    scanf_va_81("%lo",(unsigned long *)(& x_26));
-    printf_va_81("%lo",x_26);
-    scanf_va_82("%lu",(unsigned long *)(& x_26));
-    printf_va_82("%lu",x_26);
-    scanf_va_83("%lx",(unsigned long *)(& x_26));
-    printf_va_83("%lx",x_26);
-    scanf_va_84("%lx",(unsigned long *)(& x_26));
-    printf_va_84("%lX",x_26);
+    scanf("%lo",(unsigned long *)(& x_26)); /* scanf_va_81 */
+    printf("%lo",x_26); /* printf_va_81 */
+    scanf("%lu",(unsigned long *)(& x_26)); /* scanf_va_82 */
+    printf("%lu",x_26); /* printf_va_82 */
+    scanf("%lx",(unsigned long *)(& x_26)); /* scanf_va_83 */
+    printf("%lx",x_26); /* printf_va_83 */
+    scanf("%lx",(unsigned long *)(& x_26)); /* scanf_va_84 */
+    printf("%lX",x_26); /* printf_va_84 */
   }
   __retres = 0;
   return __retres;
diff --git a/tests/libc/oracle/inttypes_h.6.res.oracle b/tests/libc/oracle/inttypes_h.6.res.oracle
index fdb3e620cbe42aef466f175602aaf3a2ce30aa52..ef6788e60221327a88e6b7600beabb3445b00628 100644
--- a/tests/libc/oracle/inttypes_h.6.res.oracle
+++ b/tests/libc/oracle/inttypes_h.6.res.oracle
@@ -2531,255 +2531,255 @@ int main(void)
   int __retres;
   {
     int8_t x;
-    scanf_va_1("%hhd",(signed char *)(& x));
-    printf_va_1("%hhd",(int)x);
-    scanf_va_2("%hhi",(signed char *)(& x));
-    printf_va_2("%hhi",(int)x);
+    scanf("%hhd",(signed char *)(& x)); /* scanf_va_1 */
+    printf("%hhd",(int)x); /* printf_va_1 */
+    scanf("%hhi",(signed char *)(& x)); /* scanf_va_2 */
+    printf("%hhi",(int)x); /* printf_va_2 */
   }
   {
     uint8_t x_0;
-    scanf_va_3("%hho",(unsigned char *)(& x_0));
-    printf_va_3("%hho",(int)x_0);
-    scanf_va_4("%hhu",(unsigned char *)(& x_0));
-    printf_va_4("%hhu",(int)x_0);
-    scanf_va_5("%hhx",(unsigned char *)(& x_0));
-    printf_va_5("%hhx",(int)x_0);
-    scanf_va_6("%hhx",(unsigned char *)(& x_0));
-    printf_va_6("%hhX",(int)x_0);
+    scanf("%hho",(unsigned char *)(& x_0)); /* scanf_va_3 */
+    printf("%hho",(int)x_0); /* printf_va_3 */
+    scanf("%hhu",(unsigned char *)(& x_0)); /* scanf_va_4 */
+    printf("%hhu",(int)x_0); /* printf_va_4 */
+    scanf("%hhx",(unsigned char *)(& x_0)); /* scanf_va_5 */
+    printf("%hhx",(int)x_0); /* printf_va_5 */
+    scanf("%hhx",(unsigned char *)(& x_0)); /* scanf_va_6 */
+    printf("%hhX",(int)x_0); /* printf_va_6 */
   }
   {
     int16_t x_1;
-    scanf_va_7("%hd",(short *)(& x_1));
-    printf_va_7("%hd",(int)x_1);
-    scanf_va_8("%hi",(short *)(& x_1));
-    printf_va_8("%hi",(int)x_1);
+    scanf("%hd",(short *)(& x_1)); /* scanf_va_7 */
+    printf("%hd",(int)x_1); /* printf_va_7 */
+    scanf("%hi",(short *)(& x_1)); /* scanf_va_8 */
+    printf("%hi",(int)x_1); /* printf_va_8 */
   }
   {
     uint16_t x_2;
-    scanf_va_9("%ho",(unsigned short *)(& x_2));
-    printf_va_9("%ho",(int)x_2);
-    scanf_va_10("%hu",(unsigned short *)(& x_2));
-    printf_va_10("%hu",(int)x_2);
-    scanf_va_11("%hx",(unsigned short *)(& x_2));
-    printf_va_11("%hx",(int)x_2);
-    scanf_va_12("%hx",(unsigned short *)(& x_2));
-    printf_va_12("%hX",(int)x_2);
+    scanf("%ho",(unsigned short *)(& x_2)); /* scanf_va_9 */
+    printf("%ho",(int)x_2); /* printf_va_9 */
+    scanf("%hu",(unsigned short *)(& x_2)); /* scanf_va_10 */
+    printf("%hu",(int)x_2); /* printf_va_10 */
+    scanf("%hx",(unsigned short *)(& x_2)); /* scanf_va_11 */
+    printf("%hx",(int)x_2); /* printf_va_11 */
+    scanf("%hx",(unsigned short *)(& x_2)); /* scanf_va_12 */
+    printf("%hX",(int)x_2); /* printf_va_12 */
   }
   {
     int32_t x_3;
-    scanf_va_13("%d",(int *)(& x_3));
-    printf_va_13("%d",x_3);
-    scanf_va_14("%i",(int *)(& x_3));
-    printf_va_14("%i",x_3);
+    scanf("%d",(int *)(& x_3)); /* scanf_va_13 */
+    printf("%d",x_3); /* printf_va_13 */
+    scanf("%i",(int *)(& x_3)); /* scanf_va_14 */
+    printf("%i",x_3); /* printf_va_14 */
   }
   {
     uint32_t x_4;
-    scanf_va_15("%o",(unsigned int *)(& x_4));
-    printf_va_15("%o",x_4);
-    scanf_va_16("%u",(unsigned int *)(& x_4));
-    printf_va_16("%u",x_4);
-    scanf_va_17("%x",(unsigned int *)(& x_4));
-    printf_va_17("%x",x_4);
-    scanf_va_18("%x",(unsigned int *)(& x_4));
-    printf_va_18("%X",x_4);
+    scanf("%o",(unsigned int *)(& x_4)); /* scanf_va_15 */
+    printf("%o",x_4); /* printf_va_15 */
+    scanf("%u",(unsigned int *)(& x_4)); /* scanf_va_16 */
+    printf("%u",x_4); /* printf_va_16 */
+    scanf("%x",(unsigned int *)(& x_4)); /* scanf_va_17 */
+    printf("%x",x_4); /* printf_va_17 */
+    scanf("%x",(unsigned int *)(& x_4)); /* scanf_va_18 */
+    printf("%X",x_4); /* printf_va_18 */
   }
   {
     int64_t x_5;
-    scanf_va_19("%lld",(long long *)(& x_5));
-    printf_va_19("%lld",x_5);
-    scanf_va_20("%lli",(long long *)(& x_5));
-    printf_va_20("%lli",x_5);
+    scanf("%lld",(long long *)(& x_5)); /* scanf_va_19 */
+    printf("%lld",x_5); /* printf_va_19 */
+    scanf("%lli",(long long *)(& x_5)); /* scanf_va_20 */
+    printf("%lli",x_5); /* printf_va_20 */
   }
   {
     uint64_t x_6;
-    scanf_va_21("%llo",(unsigned long long *)(& x_6));
-    printf_va_21("%llo",x_6);
-    scanf_va_22("%llu",(unsigned long long *)(& x_6));
-    printf_va_22("%llu",x_6);
-    scanf_va_23("%llx",(unsigned long long *)(& x_6));
-    printf_va_23("%llx",x_6);
-    scanf_va_24("%llx",(unsigned long long *)(& x_6));
-    printf_va_24("%llX",x_6);
+    scanf("%llo",(unsigned long long *)(& x_6)); /* scanf_va_21 */
+    printf("%llo",x_6); /* printf_va_21 */
+    scanf("%llu",(unsigned long long *)(& x_6)); /* scanf_va_22 */
+    printf("%llu",x_6); /* printf_va_22 */
+    scanf("%llx",(unsigned long long *)(& x_6)); /* scanf_va_23 */
+    printf("%llx",x_6); /* printf_va_23 */
+    scanf("%llx",(unsigned long long *)(& x_6)); /* scanf_va_24 */
+    printf("%llX",x_6); /* printf_va_24 */
   }
   {
     int_least8_t x_7;
-    scanf_va_25("%hhd",(signed char *)(& x_7));
-    printf_va_25("%hhd",(int)x_7);
-    scanf_va_26("%hhi",(signed char *)(& x_7));
-    printf_va_26("%hhi",(int)x_7);
+    scanf("%hhd",(signed char *)(& x_7)); /* scanf_va_25 */
+    printf("%hhd",(int)x_7); /* printf_va_25 */
+    scanf("%hhi",(signed char *)(& x_7)); /* scanf_va_26 */
+    printf("%hhi",(int)x_7); /* printf_va_26 */
   }
   {
     uint_least8_t x_8;
-    scanf_va_27("%hho",(unsigned char *)(& x_8));
-    printf_va_27("%hho",(int)x_8);
-    scanf_va_28("%hhu",(unsigned char *)(& x_8));
-    printf_va_28("%hhu",(int)x_8);
-    scanf_va_29("%hhx",(unsigned char *)(& x_8));
-    printf_va_29("%hhx",(int)x_8);
-    scanf_va_30("%hhx",(unsigned char *)(& x_8));
-    printf_va_30("%hhX",(int)x_8);
+    scanf("%hho",(unsigned char *)(& x_8)); /* scanf_va_27 */
+    printf("%hho",(int)x_8); /* printf_va_27 */
+    scanf("%hhu",(unsigned char *)(& x_8)); /* scanf_va_28 */
+    printf("%hhu",(int)x_8); /* printf_va_28 */
+    scanf("%hhx",(unsigned char *)(& x_8)); /* scanf_va_29 */
+    printf("%hhx",(int)x_8); /* printf_va_29 */
+    scanf("%hhx",(unsigned char *)(& x_8)); /* scanf_va_30 */
+    printf("%hhX",(int)x_8); /* printf_va_30 */
   }
   {
     int_least16_t x_9;
-    scanf_va_31("%hd",(short *)(& x_9));
-    printf_va_31("%hd",(int)x_9);
-    scanf_va_32("%hi",(short *)(& x_9));
-    printf_va_32("%hi",(int)x_9);
+    scanf("%hd",(short *)(& x_9)); /* scanf_va_31 */
+    printf("%hd",(int)x_9); /* printf_va_31 */
+    scanf("%hi",(short *)(& x_9)); /* scanf_va_32 */
+    printf("%hi",(int)x_9); /* printf_va_32 */
   }
   {
     uint_least16_t x_10;
-    scanf_va_33("%ho",(unsigned short *)(& x_10));
-    printf_va_33("%ho",(int)x_10);
-    scanf_va_34("%hu",(unsigned short *)(& x_10));
-    printf_va_34("%hu",(int)x_10);
-    scanf_va_35("%hx",(unsigned short *)(& x_10));
-    printf_va_35("%hx",(int)x_10);
-    scanf_va_36("%hx",(unsigned short *)(& x_10));
-    printf_va_36("%hX",(int)x_10);
+    scanf("%ho",(unsigned short *)(& x_10)); /* scanf_va_33 */
+    printf("%ho",(int)x_10); /* printf_va_33 */
+    scanf("%hu",(unsigned short *)(& x_10)); /* scanf_va_34 */
+    printf("%hu",(int)x_10); /* printf_va_34 */
+    scanf("%hx",(unsigned short *)(& x_10)); /* scanf_va_35 */
+    printf("%hx",(int)x_10); /* printf_va_35 */
+    scanf("%hx",(unsigned short *)(& x_10)); /* scanf_va_36 */
+    printf("%hX",(int)x_10); /* printf_va_36 */
   }
   {
     int_least32_t x_11;
-    scanf_va_37("%d",(int *)(& x_11));
-    printf_va_37("%d",x_11);
-    scanf_va_38("%i",(int *)(& x_11));
-    printf_va_38("%i",x_11);
+    scanf("%d",(int *)(& x_11)); /* scanf_va_37 */
+    printf("%d",x_11); /* printf_va_37 */
+    scanf("%i",(int *)(& x_11)); /* scanf_va_38 */
+    printf("%i",x_11); /* printf_va_38 */
   }
   {
     uint_least32_t x_12;
-    scanf_va_39("%o",(unsigned int *)(& x_12));
-    printf_va_39("%o",x_12);
-    scanf_va_40("%u",(unsigned int *)(& x_12));
-    printf_va_40("%u",x_12);
-    scanf_va_41("%x",(unsigned int *)(& x_12));
-    printf_va_41("%x",x_12);
-    scanf_va_42("%x",(unsigned int *)(& x_12));
-    printf_va_42("%X",x_12);
+    scanf("%o",(unsigned int *)(& x_12)); /* scanf_va_39 */
+    printf("%o",x_12); /* printf_va_39 */
+    scanf("%u",(unsigned int *)(& x_12)); /* scanf_va_40 */
+    printf("%u",x_12); /* printf_va_40 */
+    scanf("%x",(unsigned int *)(& x_12)); /* scanf_va_41 */
+    printf("%x",x_12); /* printf_va_41 */
+    scanf("%x",(unsigned int *)(& x_12)); /* scanf_va_42 */
+    printf("%X",x_12); /* printf_va_42 */
   }
   {
     int_least64_t x_13;
-    scanf_va_43("%lld",(long long *)(& x_13));
-    printf_va_43("%lld",x_13);
-    scanf_va_44("%lli",(long long *)(& x_13));
-    printf_va_44("%lli",x_13);
+    scanf("%lld",(long long *)(& x_13)); /* scanf_va_43 */
+    printf("%lld",x_13); /* printf_va_43 */
+    scanf("%lli",(long long *)(& x_13)); /* scanf_va_44 */
+    printf("%lli",x_13); /* printf_va_44 */
   }
   {
     uint_least64_t x_14;
-    scanf_va_45("%llo",(unsigned long long *)(& x_14));
-    printf_va_45("%llo",x_14);
-    scanf_va_46("%llu",(unsigned long long *)(& x_14));
-    printf_va_46("%llu",x_14);
-    scanf_va_47("%llx",(unsigned long long *)(& x_14));
-    printf_va_47("%llx",x_14);
-    scanf_va_48("%llx",(unsigned long long *)(& x_14));
-    printf_va_48("%llX",x_14);
+    scanf("%llo",(unsigned long long *)(& x_14)); /* scanf_va_45 */
+    printf("%llo",x_14); /* printf_va_45 */
+    scanf("%llu",(unsigned long long *)(& x_14)); /* scanf_va_46 */
+    printf("%llu",x_14); /* printf_va_46 */
+    scanf("%llx",(unsigned long long *)(& x_14)); /* scanf_va_47 */
+    printf("%llx",x_14); /* printf_va_47 */
+    scanf("%llx",(unsigned long long *)(& x_14)); /* scanf_va_48 */
+    printf("%llX",x_14); /* printf_va_48 */
   }
   {
     int_fast8_t x_15;
-    scanf_va_49("%hhd",(signed char *)(& x_15));
-    printf_va_49("%hhd",(int)x_15);
-    scanf_va_50("%hhi",(signed char *)(& x_15));
-    printf_va_50("%hhi",(int)x_15);
+    scanf("%hhd",(signed char *)(& x_15)); /* scanf_va_49 */
+    printf("%hhd",(int)x_15); /* printf_va_49 */
+    scanf("%hhi",(signed char *)(& x_15)); /* scanf_va_50 */
+    printf("%hhi",(int)x_15); /* printf_va_50 */
   }
   {
     uint_fast8_t x_16;
-    scanf_va_51("%hho",(unsigned char *)(& x_16));
-    printf_va_51("%hho",(int)x_16);
-    scanf_va_52("%hhu",(unsigned char *)(& x_16));
-    printf_va_52("%hhu",(int)x_16);
-    scanf_va_53("%hhx",(unsigned char *)(& x_16));
-    printf_va_53("%hhx",(int)x_16);
-    scanf_va_54("%hhx",(unsigned char *)(& x_16));
-    printf_va_54("%hhX",(int)x_16);
+    scanf("%hho",(unsigned char *)(& x_16)); /* scanf_va_51 */
+    printf("%hho",(int)x_16); /* printf_va_51 */
+    scanf("%hhu",(unsigned char *)(& x_16)); /* scanf_va_52 */
+    printf("%hhu",(int)x_16); /* printf_va_52 */
+    scanf("%hhx",(unsigned char *)(& x_16)); /* scanf_va_53 */
+    printf("%hhx",(int)x_16); /* printf_va_53 */
+    scanf("%hhx",(unsigned char *)(& x_16)); /* scanf_va_54 */
+    printf("%hhX",(int)x_16); /* printf_va_54 */
   }
   {
     int_fast16_t x_17;
-    scanf_va_55("%d",(int *)(& x_17));
-    printf_va_55("%d",x_17);
-    scanf_va_56("%i",(int *)(& x_17));
-    printf_va_56("%i",x_17);
+    scanf("%d",(int *)(& x_17)); /* scanf_va_55 */
+    printf("%d",x_17); /* printf_va_55 */
+    scanf("%i",(int *)(& x_17)); /* scanf_va_56 */
+    printf("%i",x_17); /* printf_va_56 */
   }
   {
     uint_fast16_t x_18;
-    scanf_va_57("%o",(unsigned int *)(& x_18));
-    printf_va_57("%o",x_18);
-    scanf_va_58("%u",(unsigned int *)(& x_18));
-    printf_va_58("%u",x_18);
-    scanf_va_59("%x",(unsigned int *)(& x_18));
-    printf_va_59("%x",x_18);
-    scanf_va_60("%x",(unsigned int *)(& x_18));
-    printf_va_60("%X",x_18);
+    scanf("%o",(unsigned int *)(& x_18)); /* scanf_va_57 */
+    printf("%o",x_18); /* printf_va_57 */
+    scanf("%u",(unsigned int *)(& x_18)); /* scanf_va_58 */
+    printf("%u",x_18); /* printf_va_58 */
+    scanf("%x",(unsigned int *)(& x_18)); /* scanf_va_59 */
+    printf("%x",x_18); /* printf_va_59 */
+    scanf("%x",(unsigned int *)(& x_18)); /* scanf_va_60 */
+    printf("%X",x_18); /* printf_va_60 */
   }
   {
     int_fast32_t x_19;
-    scanf_va_61("%d",(int *)(& x_19));
-    printf_va_61("%d",x_19);
-    scanf_va_62("%i",(int *)(& x_19));
-    printf_va_62("%i",x_19);
+    scanf("%d",(int *)(& x_19)); /* scanf_va_61 */
+    printf("%d",x_19); /* printf_va_61 */
+    scanf("%i",(int *)(& x_19)); /* scanf_va_62 */
+    printf("%i",x_19); /* printf_va_62 */
   }
   {
     uint_fast32_t x_20;
-    scanf_va_63("%o",(unsigned int *)(& x_20));
-    printf_va_63("%o",x_20);
-    scanf_va_64("%u",(unsigned int *)(& x_20));
-    printf_va_64("%u",x_20);
-    scanf_va_65("%x",(unsigned int *)(& x_20));
-    printf_va_65("%x",x_20);
-    scanf_va_66("%x",(unsigned int *)(& x_20));
-    printf_va_66("%X",x_20);
+    scanf("%o",(unsigned int *)(& x_20)); /* scanf_va_63 */
+    printf("%o",x_20); /* printf_va_63 */
+    scanf("%u",(unsigned int *)(& x_20)); /* scanf_va_64 */
+    printf("%u",x_20); /* printf_va_64 */
+    scanf("%x",(unsigned int *)(& x_20)); /* scanf_va_65 */
+    printf("%x",x_20); /* printf_va_65 */
+    scanf("%x",(unsigned int *)(& x_20)); /* scanf_va_66 */
+    printf("%X",x_20); /* printf_va_66 */
   }
   {
     int_fast64_t x_21;
-    scanf_va_67("%lld",(long long *)(& x_21));
-    printf_va_67("%lld",x_21);
-    scanf_va_68("%lli",(long long *)(& x_21));
-    printf_va_68("%lli",x_21);
+    scanf("%lld",(long long *)(& x_21)); /* scanf_va_67 */
+    printf("%lld",x_21); /* printf_va_67 */
+    scanf("%lli",(long long *)(& x_21)); /* scanf_va_68 */
+    printf("%lli",x_21); /* printf_va_68 */
   }
   {
     uint_fast64_t x_22;
-    scanf_va_69("%llo",(unsigned long long *)(& x_22));
-    printf_va_69("%llo",x_22);
-    scanf_va_70("%llu",(unsigned long long *)(& x_22));
-    printf_va_70("%llu",x_22);
-    scanf_va_71("%llx",(unsigned long long *)(& x_22));
-    printf_va_71("%llx",x_22);
-    scanf_va_72("%llx",(unsigned long long *)(& x_22));
-    printf_va_72("%llX",x_22);
+    scanf("%llo",(unsigned long long *)(& x_22)); /* scanf_va_69 */
+    printf("%llo",x_22); /* printf_va_69 */
+    scanf("%llu",(unsigned long long *)(& x_22)); /* scanf_va_70 */
+    printf("%llu",x_22); /* printf_va_70 */
+    scanf("%llx",(unsigned long long *)(& x_22)); /* scanf_va_71 */
+    printf("%llx",x_22); /* printf_va_71 */
+    scanf("%llx",(unsigned long long *)(& x_22)); /* scanf_va_72 */
+    printf("%llX",x_22); /* printf_va_72 */
   }
   {
     intmax_t x_23;
-    scanf_va_73("%lld",(long long *)(& x_23));
-    printf_va_73("%lld",x_23);
-    scanf_va_74("%lli",(long long *)(& x_23));
-    printf_va_74("%lli",x_23);
+    scanf("%lld",(long long *)(& x_23)); /* scanf_va_73 */
+    printf("%lld",x_23); /* printf_va_73 */
+    scanf("%lli",(long long *)(& x_23)); /* scanf_va_74 */
+    printf("%lli",x_23); /* printf_va_74 */
   }
   {
     uintmax_t x_24;
-    scanf_va_75("%llo",(unsigned long long *)(& x_24));
-    printf_va_75("%llo",x_24);
-    scanf_va_76("%llu",(unsigned long long *)(& x_24));
-    printf_va_76("%llu",x_24);
-    scanf_va_77("%llx",(unsigned long long *)(& x_24));
-    printf_va_77("%llx",x_24);
-    scanf_va_78("%llx",(unsigned long long *)(& x_24));
-    printf_va_78("%llX",x_24);
+    scanf("%llo",(unsigned long long *)(& x_24)); /* scanf_va_75 */
+    printf("%llo",x_24); /* printf_va_75 */
+    scanf("%llu",(unsigned long long *)(& x_24)); /* scanf_va_76 */
+    printf("%llu",x_24); /* printf_va_76 */
+    scanf("%llx",(unsigned long long *)(& x_24)); /* scanf_va_77 */
+    printf("%llx",x_24); /* printf_va_77 */
+    scanf("%llx",(unsigned long long *)(& x_24)); /* scanf_va_78 */
+    printf("%llX",x_24); /* printf_va_78 */
   }
   {
     intptr_t x_25;
-    scanf_va_79("%d",(int *)(& x_25));
-    printf_va_79("%d",x_25);
-    scanf_va_80("%i",(int *)(& x_25));
-    printf_va_80("%i",x_25);
+    scanf("%d",(int *)(& x_25)); /* scanf_va_79 */
+    printf("%d",x_25); /* printf_va_79 */
+    scanf("%i",(int *)(& x_25)); /* scanf_va_80 */
+    printf("%i",x_25); /* printf_va_80 */
   }
   {
     uintptr_t x_26;
-    scanf_va_81("%o",(unsigned int *)(& x_26));
-    printf_va_81("%o",x_26);
-    scanf_va_82("%u",(unsigned int *)(& x_26));
-    printf_va_82("%u",x_26);
-    scanf_va_83("%x",(unsigned int *)(& x_26));
-    printf_va_83("%x",x_26);
-    scanf_va_84("%x",(unsigned int *)(& x_26));
-    printf_va_84("%X",x_26);
+    scanf("%o",(unsigned int *)(& x_26)); /* scanf_va_81 */
+    printf("%o",x_26); /* printf_va_81 */
+    scanf("%u",(unsigned int *)(& x_26)); /* scanf_va_82 */
+    printf("%u",x_26); /* printf_va_82 */
+    scanf("%x",(unsigned int *)(& x_26)); /* scanf_va_83 */
+    printf("%x",x_26); /* printf_va_83 */
+    scanf("%x",(unsigned int *)(& x_26)); /* scanf_va_84 */
+    printf("%X",x_26); /* printf_va_84 */
   }
   __retres = 0;
   return __retres;
diff --git a/tests/libc/oracle/inttypes_h.7.res.oracle b/tests/libc/oracle/inttypes_h.7.res.oracle
index 42d30f54d92b90150c1b1f557c2991577aa3564a..4434b9f591aed04e57ba5f2384ef3c109db07a07 100644
--- a/tests/libc/oracle/inttypes_h.7.res.oracle
+++ b/tests/libc/oracle/inttypes_h.7.res.oracle
@@ -2531,255 +2531,255 @@ int main(void)
   int __retres;
   {
     int8_t x;
-    scanf_va_1("%hhd",(signed char *)(& x));
-    printf_va_1("%hhd",(int)x);
-    scanf_va_2("%hhi",(signed char *)(& x));
-    printf_va_2("%hhi",(int)x);
+    scanf("%hhd",(signed char *)(& x)); /* scanf_va_1 */
+    printf("%hhd",(int)x); /* printf_va_1 */
+    scanf("%hhi",(signed char *)(& x)); /* scanf_va_2 */
+    printf("%hhi",(int)x); /* printf_va_2 */
   }
   {
     uint8_t x_0;
-    scanf_va_3("%hho",(unsigned char *)(& x_0));
-    printf_va_3("%hho",(int)x_0);
-    scanf_va_4("%hhu",(unsigned char *)(& x_0));
-    printf_va_4("%hhu",(int)x_0);
-    scanf_va_5("%hhx",(unsigned char *)(& x_0));
-    printf_va_5("%hhx",(int)x_0);
-    scanf_va_6("%hhx",(unsigned char *)(& x_0));
-    printf_va_6("%hhX",(int)x_0);
+    scanf("%hho",(unsigned char *)(& x_0)); /* scanf_va_3 */
+    printf("%hho",(int)x_0); /* printf_va_3 */
+    scanf("%hhu",(unsigned char *)(& x_0)); /* scanf_va_4 */
+    printf("%hhu",(int)x_0); /* printf_va_4 */
+    scanf("%hhx",(unsigned char *)(& x_0)); /* scanf_va_5 */
+    printf("%hhx",(int)x_0); /* printf_va_5 */
+    scanf("%hhx",(unsigned char *)(& x_0)); /* scanf_va_6 */
+    printf("%hhX",(int)x_0); /* printf_va_6 */
   }
   {
     int16_t x_1;
-    scanf_va_7("%hd",(short *)(& x_1));
-    printf_va_7("%hd",(int)x_1);
-    scanf_va_8("%hi",(short *)(& x_1));
-    printf_va_8("%hi",(int)x_1);
+    scanf("%hd",(short *)(& x_1)); /* scanf_va_7 */
+    printf("%hd",(int)x_1); /* printf_va_7 */
+    scanf("%hi",(short *)(& x_1)); /* scanf_va_8 */
+    printf("%hi",(int)x_1); /* printf_va_8 */
   }
   {
     uint16_t x_2;
-    scanf_va_9("%ho",(unsigned short *)(& x_2));
-    printf_va_9("%ho",(int)x_2);
-    scanf_va_10("%hu",(unsigned short *)(& x_2));
-    printf_va_10("%hu",(int)x_2);
-    scanf_va_11("%hx",(unsigned short *)(& x_2));
-    printf_va_11("%hx",(int)x_2);
-    scanf_va_12("%hx",(unsigned short *)(& x_2));
-    printf_va_12("%hX",(int)x_2);
+    scanf("%ho",(unsigned short *)(& x_2)); /* scanf_va_9 */
+    printf("%ho",(int)x_2); /* printf_va_9 */
+    scanf("%hu",(unsigned short *)(& x_2)); /* scanf_va_10 */
+    printf("%hu",(int)x_2); /* printf_va_10 */
+    scanf("%hx",(unsigned short *)(& x_2)); /* scanf_va_11 */
+    printf("%hx",(int)x_2); /* printf_va_11 */
+    scanf("%hx",(unsigned short *)(& x_2)); /* scanf_va_12 */
+    printf("%hX",(int)x_2); /* printf_va_12 */
   }
   {
     int32_t x_3;
-    scanf_va_13("%d",(int *)(& x_3));
-    printf_va_13("%d",x_3);
-    scanf_va_14("%i",(int *)(& x_3));
-    printf_va_14("%i",x_3);
+    scanf("%d",(int *)(& x_3)); /* scanf_va_13 */
+    printf("%d",x_3); /* printf_va_13 */
+    scanf("%i",(int *)(& x_3)); /* scanf_va_14 */
+    printf("%i",x_3); /* printf_va_14 */
   }
   {
     uint32_t x_4;
-    scanf_va_15("%o",(unsigned int *)(& x_4));
-    printf_va_15("%o",x_4);
-    scanf_va_16("%u",(unsigned int *)(& x_4));
-    printf_va_16("%u",x_4);
-    scanf_va_17("%x",(unsigned int *)(& x_4));
-    printf_va_17("%x",x_4);
-    scanf_va_18("%x",(unsigned int *)(& x_4));
-    printf_va_18("%X",x_4);
+    scanf("%o",(unsigned int *)(& x_4)); /* scanf_va_15 */
+    printf("%o",x_4); /* printf_va_15 */
+    scanf("%u",(unsigned int *)(& x_4)); /* scanf_va_16 */
+    printf("%u",x_4); /* printf_va_16 */
+    scanf("%x",(unsigned int *)(& x_4)); /* scanf_va_17 */
+    printf("%x",x_4); /* printf_va_17 */
+    scanf("%x",(unsigned int *)(& x_4)); /* scanf_va_18 */
+    printf("%X",x_4); /* printf_va_18 */
   }
   {
     int64_t x_5;
-    scanf_va_19("%lld",(__int64 *)(& x_5));
-    printf_va_19("%lld",x_5);
-    scanf_va_20("%lli",(__int64 *)(& x_5));
-    printf_va_20("%lli",x_5);
+    scanf("%lld",(__int64 *)(& x_5)); /* scanf_va_19 */
+    printf("%lld",x_5); /* printf_va_19 */
+    scanf("%lli",(__int64 *)(& x_5)); /* scanf_va_20 */
+    printf("%lli",x_5); /* printf_va_20 */
   }
   {
     uint64_t x_6;
-    scanf_va_21("%llo",(unsigned __int64 *)(& x_6));
-    printf_va_21("%llo",x_6);
-    scanf_va_22("%llu",(unsigned __int64 *)(& x_6));
-    printf_va_22("%llu",x_6);
-    scanf_va_23("%llx",(unsigned __int64 *)(& x_6));
-    printf_va_23("%llx",x_6);
-    scanf_va_24("%llx",(unsigned __int64 *)(& x_6));
-    printf_va_24("%llX",x_6);
+    scanf("%llo",(unsigned __int64 *)(& x_6)); /* scanf_va_21 */
+    printf("%llo",x_6); /* printf_va_21 */
+    scanf("%llu",(unsigned __int64 *)(& x_6)); /* scanf_va_22 */
+    printf("%llu",x_6); /* printf_va_22 */
+    scanf("%llx",(unsigned __int64 *)(& x_6)); /* scanf_va_23 */
+    printf("%llx",x_6); /* printf_va_23 */
+    scanf("%llx",(unsigned __int64 *)(& x_6)); /* scanf_va_24 */
+    printf("%llX",x_6); /* printf_va_24 */
   }
   {
     int_least8_t x_7;
-    scanf_va_25("%hhd",(signed char *)(& x_7));
-    printf_va_25("%hhd",(int)x_7);
-    scanf_va_26("%hhi",(signed char *)(& x_7));
-    printf_va_26("%hhi",(int)x_7);
+    scanf("%hhd",(signed char *)(& x_7)); /* scanf_va_25 */
+    printf("%hhd",(int)x_7); /* printf_va_25 */
+    scanf("%hhi",(signed char *)(& x_7)); /* scanf_va_26 */
+    printf("%hhi",(int)x_7); /* printf_va_26 */
   }
   {
     uint_least8_t x_8;
-    scanf_va_27("%hho",(unsigned char *)(& x_8));
-    printf_va_27("%hho",(int)x_8);
-    scanf_va_28("%hhu",(unsigned char *)(& x_8));
-    printf_va_28("%hhu",(int)x_8);
-    scanf_va_29("%hhx",(unsigned char *)(& x_8));
-    printf_va_29("%hhx",(int)x_8);
-    scanf_va_30("%hhx",(unsigned char *)(& x_8));
-    printf_va_30("%hhX",(int)x_8);
+    scanf("%hho",(unsigned char *)(& x_8)); /* scanf_va_27 */
+    printf("%hho",(int)x_8); /* printf_va_27 */
+    scanf("%hhu",(unsigned char *)(& x_8)); /* scanf_va_28 */
+    printf("%hhu",(int)x_8); /* printf_va_28 */
+    scanf("%hhx",(unsigned char *)(& x_8)); /* scanf_va_29 */
+    printf("%hhx",(int)x_8); /* printf_va_29 */
+    scanf("%hhx",(unsigned char *)(& x_8)); /* scanf_va_30 */
+    printf("%hhX",(int)x_8); /* printf_va_30 */
   }
   {
     int_least16_t x_9;
-    scanf_va_31("%hd",(short *)(& x_9));
-    printf_va_31("%hd",(int)x_9);
-    scanf_va_32("%hi",(short *)(& x_9));
-    printf_va_32("%hi",(int)x_9);
+    scanf("%hd",(short *)(& x_9)); /* scanf_va_31 */
+    printf("%hd",(int)x_9); /* printf_va_31 */
+    scanf("%hi",(short *)(& x_9)); /* scanf_va_32 */
+    printf("%hi",(int)x_9); /* printf_va_32 */
   }
   {
     uint_least16_t x_10;
-    scanf_va_33("%ho",(unsigned short *)(& x_10));
-    printf_va_33("%ho",(int)x_10);
-    scanf_va_34("%hu",(unsigned short *)(& x_10));
-    printf_va_34("%hu",(int)x_10);
-    scanf_va_35("%hx",(unsigned short *)(& x_10));
-    printf_va_35("%hx",(int)x_10);
-    scanf_va_36("%hx",(unsigned short *)(& x_10));
-    printf_va_36("%hX",(int)x_10);
+    scanf("%ho",(unsigned short *)(& x_10)); /* scanf_va_33 */
+    printf("%ho",(int)x_10); /* printf_va_33 */
+    scanf("%hu",(unsigned short *)(& x_10)); /* scanf_va_34 */
+    printf("%hu",(int)x_10); /* printf_va_34 */
+    scanf("%hx",(unsigned short *)(& x_10)); /* scanf_va_35 */
+    printf("%hx",(int)x_10); /* printf_va_35 */
+    scanf("%hx",(unsigned short *)(& x_10)); /* scanf_va_36 */
+    printf("%hX",(int)x_10); /* printf_va_36 */
   }
   {
     int_least32_t x_11;
-    scanf_va_37("%d",(int *)(& x_11));
-    printf_va_37("%d",x_11);
-    scanf_va_38("%i",(int *)(& x_11));
-    printf_va_38("%i",x_11);
+    scanf("%d",(int *)(& x_11)); /* scanf_va_37 */
+    printf("%d",x_11); /* printf_va_37 */
+    scanf("%i",(int *)(& x_11)); /* scanf_va_38 */
+    printf("%i",x_11); /* printf_va_38 */
   }
   {
     uint_least32_t x_12;
-    scanf_va_39("%o",(unsigned int *)(& x_12));
-    printf_va_39("%o",x_12);
-    scanf_va_40("%u",(unsigned int *)(& x_12));
-    printf_va_40("%u",x_12);
-    scanf_va_41("%x",(unsigned int *)(& x_12));
-    printf_va_41("%x",x_12);
-    scanf_va_42("%x",(unsigned int *)(& x_12));
-    printf_va_42("%X",x_12);
+    scanf("%o",(unsigned int *)(& x_12)); /* scanf_va_39 */
+    printf("%o",x_12); /* printf_va_39 */
+    scanf("%u",(unsigned int *)(& x_12)); /* scanf_va_40 */
+    printf("%u",x_12); /* printf_va_40 */
+    scanf("%x",(unsigned int *)(& x_12)); /* scanf_va_41 */
+    printf("%x",x_12); /* printf_va_41 */
+    scanf("%x",(unsigned int *)(& x_12)); /* scanf_va_42 */
+    printf("%X",x_12); /* printf_va_42 */
   }
   {
     int_least64_t x_13;
-    scanf_va_43("%lld",(__int64 *)(& x_13));
-    printf_va_43("%lld",x_13);
-    scanf_va_44("%lli",(__int64 *)(& x_13));
-    printf_va_44("%lli",x_13);
+    scanf("%lld",(__int64 *)(& x_13)); /* scanf_va_43 */
+    printf("%lld",x_13); /* printf_va_43 */
+    scanf("%lli",(__int64 *)(& x_13)); /* scanf_va_44 */
+    printf("%lli",x_13); /* printf_va_44 */
   }
   {
     uint_least64_t x_14;
-    scanf_va_45("%llo",(unsigned __int64 *)(& x_14));
-    printf_va_45("%llo",x_14);
-    scanf_va_46("%llu",(unsigned __int64 *)(& x_14));
-    printf_va_46("%llu",x_14);
-    scanf_va_47("%llx",(unsigned __int64 *)(& x_14));
-    printf_va_47("%llx",x_14);
-    scanf_va_48("%llx",(unsigned __int64 *)(& x_14));
-    printf_va_48("%llX",x_14);
+    scanf("%llo",(unsigned __int64 *)(& x_14)); /* scanf_va_45 */
+    printf("%llo",x_14); /* printf_va_45 */
+    scanf("%llu",(unsigned __int64 *)(& x_14)); /* scanf_va_46 */
+    printf("%llu",x_14); /* printf_va_46 */
+    scanf("%llx",(unsigned __int64 *)(& x_14)); /* scanf_va_47 */
+    printf("%llx",x_14); /* printf_va_47 */
+    scanf("%llx",(unsigned __int64 *)(& x_14)); /* scanf_va_48 */
+    printf("%llX",x_14); /* printf_va_48 */
   }
   {
     int_fast8_t x_15;
-    scanf_va_49("%hhd",(signed char *)(& x_15));
-    printf_va_49("%hhd",(int)x_15);
-    scanf_va_50("%hhi",(signed char *)(& x_15));
-    printf_va_50("%hhi",(int)x_15);
+    scanf("%hhd",(signed char *)(& x_15)); /* scanf_va_49 */
+    printf("%hhd",(int)x_15); /* printf_va_49 */
+    scanf("%hhi",(signed char *)(& x_15)); /* scanf_va_50 */
+    printf("%hhi",(int)x_15); /* printf_va_50 */
   }
   {
     uint_fast8_t x_16;
-    scanf_va_51("%hho",(unsigned char *)(& x_16));
-    printf_va_51("%hho",(int)x_16);
-    scanf_va_52("%hhu",(unsigned char *)(& x_16));
-    printf_va_52("%hhu",(int)x_16);
-    scanf_va_53("%hhx",(unsigned char *)(& x_16));
-    printf_va_53("%hhx",(int)x_16);
-    scanf_va_54("%hhx",(unsigned char *)(& x_16));
-    printf_va_54("%hhX",(int)x_16);
+    scanf("%hho",(unsigned char *)(& x_16)); /* scanf_va_51 */
+    printf("%hho",(int)x_16); /* printf_va_51 */
+    scanf("%hhu",(unsigned char *)(& x_16)); /* scanf_va_52 */
+    printf("%hhu",(int)x_16); /* printf_va_52 */
+    scanf("%hhx",(unsigned char *)(& x_16)); /* scanf_va_53 */
+    printf("%hhx",(int)x_16); /* printf_va_53 */
+    scanf("%hhx",(unsigned char *)(& x_16)); /* scanf_va_54 */
+    printf("%hhX",(int)x_16); /* printf_va_54 */
   }
   {
     int_fast16_t x_17;
-    scanf_va_55("%d",(int *)(& x_17));
-    printf_va_55("%d",x_17);
-    scanf_va_56("%i",(int *)(& x_17));
-    printf_va_56("%i",x_17);
+    scanf("%d",(int *)(& x_17)); /* scanf_va_55 */
+    printf("%d",x_17); /* printf_va_55 */
+    scanf("%i",(int *)(& x_17)); /* scanf_va_56 */
+    printf("%i",x_17); /* printf_va_56 */
   }
   {
     uint_fast16_t x_18;
-    scanf_va_57("%o",(unsigned int *)(& x_18));
-    printf_va_57("%o",x_18);
-    scanf_va_58("%u",(unsigned int *)(& x_18));
-    printf_va_58("%u",x_18);
-    scanf_va_59("%x",(unsigned int *)(& x_18));
-    printf_va_59("%x",x_18);
-    scanf_va_60("%x",(unsigned int *)(& x_18));
-    printf_va_60("%X",x_18);
+    scanf("%o",(unsigned int *)(& x_18)); /* scanf_va_57 */
+    printf("%o",x_18); /* printf_va_57 */
+    scanf("%u",(unsigned int *)(& x_18)); /* scanf_va_58 */
+    printf("%u",x_18); /* printf_va_58 */
+    scanf("%x",(unsigned int *)(& x_18)); /* scanf_va_59 */
+    printf("%x",x_18); /* printf_va_59 */
+    scanf("%x",(unsigned int *)(& x_18)); /* scanf_va_60 */
+    printf("%X",x_18); /* printf_va_60 */
   }
   {
     int_fast32_t x_19;
-    scanf_va_61("%d",(int *)(& x_19));
-    printf_va_61("%d",x_19);
-    scanf_va_62("%i",(int *)(& x_19));
-    printf_va_62("%i",x_19);
+    scanf("%d",(int *)(& x_19)); /* scanf_va_61 */
+    printf("%d",x_19); /* printf_va_61 */
+    scanf("%i",(int *)(& x_19)); /* scanf_va_62 */
+    printf("%i",x_19); /* printf_va_62 */
   }
   {
     uint_fast32_t x_20;
-    scanf_va_63("%o",(unsigned int *)(& x_20));
-    printf_va_63("%o",x_20);
-    scanf_va_64("%u",(unsigned int *)(& x_20));
-    printf_va_64("%u",x_20);
-    scanf_va_65("%x",(unsigned int *)(& x_20));
-    printf_va_65("%x",x_20);
-    scanf_va_66("%x",(unsigned int *)(& x_20));
-    printf_va_66("%X",x_20);
+    scanf("%o",(unsigned int *)(& x_20)); /* scanf_va_63 */
+    printf("%o",x_20); /* printf_va_63 */
+    scanf("%u",(unsigned int *)(& x_20)); /* scanf_va_64 */
+    printf("%u",x_20); /* printf_va_64 */
+    scanf("%x",(unsigned int *)(& x_20)); /* scanf_va_65 */
+    printf("%x",x_20); /* printf_va_65 */
+    scanf("%x",(unsigned int *)(& x_20)); /* scanf_va_66 */
+    printf("%X",x_20); /* printf_va_66 */
   }
   {
     int_fast64_t x_21;
-    scanf_va_67("%lld",(__int64 *)(& x_21));
-    printf_va_67("%lld",x_21);
-    scanf_va_68("%lli",(__int64 *)(& x_21));
-    printf_va_68("%lli",x_21);
+    scanf("%lld",(__int64 *)(& x_21)); /* scanf_va_67 */
+    printf("%lld",x_21); /* printf_va_67 */
+    scanf("%lli",(__int64 *)(& x_21)); /* scanf_va_68 */
+    printf("%lli",x_21); /* printf_va_68 */
   }
   {
     uint_fast64_t x_22;
-    scanf_va_69("%llo",(unsigned __int64 *)(& x_22));
-    printf_va_69("%llo",x_22);
-    scanf_va_70("%llu",(unsigned __int64 *)(& x_22));
-    printf_va_70("%llu",x_22);
-    scanf_va_71("%llx",(unsigned __int64 *)(& x_22));
-    printf_va_71("%llx",x_22);
-    scanf_va_72("%llx",(unsigned __int64 *)(& x_22));
-    printf_va_72("%llX",x_22);
+    scanf("%llo",(unsigned __int64 *)(& x_22)); /* scanf_va_69 */
+    printf("%llo",x_22); /* printf_va_69 */
+    scanf("%llu",(unsigned __int64 *)(& x_22)); /* scanf_va_70 */
+    printf("%llu",x_22); /* printf_va_70 */
+    scanf("%llx",(unsigned __int64 *)(& x_22)); /* scanf_va_71 */
+    printf("%llx",x_22); /* printf_va_71 */
+    scanf("%llx",(unsigned __int64 *)(& x_22)); /* scanf_va_72 */
+    printf("%llX",x_22); /* printf_va_72 */
   }
   {
     intmax_t x_23;
-    scanf_va_73("%lld",(__int64 *)(& x_23));
-    printf_va_73("%lld",x_23);
-    scanf_va_74("%lli",(__int64 *)(& x_23));
-    printf_va_74("%lli",x_23);
+    scanf("%lld",(__int64 *)(& x_23)); /* scanf_va_73 */
+    printf("%lld",x_23); /* printf_va_73 */
+    scanf("%lli",(__int64 *)(& x_23)); /* scanf_va_74 */
+    printf("%lli",x_23); /* printf_va_74 */
   }
   {
     uintmax_t x_24;
-    scanf_va_75("%llo",(unsigned __int64 *)(& x_24));
-    printf_va_75("%llo",x_24);
-    scanf_va_76("%llu",(unsigned __int64 *)(& x_24));
-    printf_va_76("%llu",x_24);
-    scanf_va_77("%llx",(unsigned __int64 *)(& x_24));
-    printf_va_77("%llx",x_24);
-    scanf_va_78("%llx",(unsigned __int64 *)(& x_24));
-    printf_va_78("%llX",x_24);
+    scanf("%llo",(unsigned __int64 *)(& x_24)); /* scanf_va_75 */
+    printf("%llo",x_24); /* printf_va_75 */
+    scanf("%llu",(unsigned __int64 *)(& x_24)); /* scanf_va_76 */
+    printf("%llu",x_24); /* printf_va_76 */
+    scanf("%llx",(unsigned __int64 *)(& x_24)); /* scanf_va_77 */
+    printf("%llx",x_24); /* printf_va_77 */
+    scanf("%llx",(unsigned __int64 *)(& x_24)); /* scanf_va_78 */
+    printf("%llX",x_24); /* printf_va_78 */
   }
   {
     intptr_t x_25;
-    scanf_va_79("%lld",(__int64 *)(& x_25));
-    printf_va_79("%lld",x_25);
-    scanf_va_80("%lli",(__int64 *)(& x_25));
-    printf_va_80("%lli",x_25);
+    scanf("%lld",(__int64 *)(& x_25)); /* scanf_va_79 */
+    printf("%lld",x_25); /* printf_va_79 */
+    scanf("%lli",(__int64 *)(& x_25)); /* scanf_va_80 */
+    printf("%lli",x_25); /* printf_va_80 */
   }
   {
     uintptr_t x_26;
-    scanf_va_81("%llo",(unsigned __int64 *)(& x_26));
-    printf_va_81("%llo",x_26);
-    scanf_va_82("%llu",(unsigned __int64 *)(& x_26));
-    printf_va_82("%llu",x_26);
-    scanf_va_83("%llx",(unsigned __int64 *)(& x_26));
-    printf_va_83("%llx",x_26);
-    scanf_va_84("%llx",(unsigned __int64 *)(& x_26));
-    printf_va_84("%llX",x_26);
+    scanf("%llo",(unsigned __int64 *)(& x_26)); /* scanf_va_81 */
+    printf("%llo",x_26); /* printf_va_81 */
+    scanf("%llu",(unsigned __int64 *)(& x_26)); /* scanf_va_82 */
+    printf("%llu",x_26); /* printf_va_82 */
+    scanf("%llx",(unsigned __int64 *)(& x_26)); /* scanf_va_83 */
+    printf("%llx",x_26); /* printf_va_83 */
+    scanf("%llx",(unsigned __int64 *)(& x_26)); /* scanf_va_84 */
+    printf("%llX",x_26); /* printf_va_84 */
   }
   __retres = 0;
   return __retres;
diff --git a/tests/libc/oracle/inttypes_h2.res.oracle b/tests/libc/oracle/inttypes_h2.res.oracle
index 39624e005d13156afe771f8cf3283f446f7c035d..8b1cf43b64e011c6c2636600215458b27a9512bd 100644
--- a/tests/libc/oracle/inttypes_h2.res.oracle
+++ b/tests/libc/oracle/inttypes_h2.res.oracle
@@ -26,13 +26,40 @@
 [eva] inttypes_h2.c:22: 
   function imaxdiv: precondition 'no_overflow' got status valid.
 [eva] Done for function imaxdiv
+<<<<<<< HEAD
 [eva] inttypes_h2.c:23: assertion got status valid.
 [eva] inttypes_h2.c:24: assertion got status valid.
+||||||| ac7807782d
+[eva] tests/libc/inttypes_h2.c:23: assertion got status valid.
+[eva] tests/libc/inttypes_h2.c:24: assertion got status valid.
+=======
+[eva] tests/libc/inttypes_h2.c:23: assertion got status valid.
+[eva] tests/libc/inttypes_h2.c:24: assertion got status valid.
+[eva] computing for function imaxabs <- main.
+  Called from tests/libc/inttypes_h2.c:26.
+[eva] using specification for function imaxabs
+[eva] tests/libc/inttypes_h2.c:26: 
+  function imaxabs: precondition 'abs_representable' got status valid.
+[eva] Done for function imaxabs
+[eva] tests/libc/inttypes_h2.c:27: assertion got status valid.
+[eva] computing for function imaxabs <- main.
+  Called from tests/libc/inttypes_h2.c:28.
+[eva] tests/libc/inttypes_h2.c:28: 
+  function imaxabs: precondition 'abs_representable' got status valid.
+[eva] Done for function imaxabs
+[eva] tests/libc/inttypes_h2.c:29: assertion got status valid.
+[eva] computing for function imaxabs <- main.
+  Called from tests/libc/inttypes_h2.c:30.
+[eva] tests/libc/inttypes_h2.c:30: 
+  function imaxabs: precondition 'abs_representable' got status valid.
+[eva] Done for function imaxabs
+[eva] tests/libc/inttypes_h2.c:31: assertion got status valid.
+>>>>>>> origin/master
 [eva] Recording results for main
 [eva] done for function main
 [eva] ====== VALUES COMPUTED ======
 [eva:final-states] Values at end of function main:
-  a ∈ {9223372036854775807}
+  a ∈ {0}
   b ∈ {4611686018427387903}
   r.quot ∈ {2}
    .rem ∈ {1}
diff --git a/tests/libc/oracle/math_h.res.oracle b/tests/libc/oracle/math_h.res.oracle
index f888abcb2f247f6ed1c158545fb398c5c08892eb..e90addd6f9f50f526f729d98837ef42e0bd5a6c8 100644
--- a/tests/libc/oracle/math_h.res.oracle
+++ b/tests/libc/oracle/math_h.res.oracle
@@ -1,5 +1,13 @@
+<<<<<<< HEAD
 [kernel] Parsing math_h.c (with preprocessing)
 [kernel:parser:decimal-float] math_h.c:5: Warning: 
+||||||| ac7807782d
+[kernel] Parsing tests/libc/math_h.c (with preprocessing)
+[kernel:parser:decimal-float] tests/libc/math_h.c:5: Warning: 
+=======
+[kernel] Parsing tests/libc/math_h.c (with preprocessing)
+[kernel:parser:decimal-float] tests/libc/math_h.c:6: Warning: 
+>>>>>>> origin/master
   Floating-point constant 3.14159265358979323846264338327950288 is not represented exactly. Will use 0x1.921fb54442d18p1.
   (warn-once: no further messages from category 'parser:decimal-float' will be emitted)
 [eva] Analyzing a complete application starting at main
@@ -219,6 +227,41 @@
 [eva:alarm] math_h.c:50: Warning: 
   function fabsl: precondition 'finite_arg' got status unknown.
 [eva] Done for function fabsl
+[eva] computing for function __finite <- main.
+  Called from tests/libc/math_h.c:54.
+[eva] using specification for function __finite
+[eva] Done for function __finite
+[eva] tests/libc/math_h.c:55: assertion got status valid.
+[eva] computing for function __finite <- main.
+  Called from tests/libc/math_h.c:56.
+[eva] Done for function __finite
+[eva] computing for function __finite <- main.
+  Called from tests/libc/math_h.c:56.
+[eva] Done for function __finite
+[eva] tests/libc/math_h.c:57: assertion got status valid.
+[eva] computing for function __finitef <- main.
+  Called from tests/libc/math_h.c:58.
+[eva] using specification for function __finitef
+[eva] Done for function __finitef
+[eva] computing for function __finitef <- main.
+  Called from tests/libc/math_h.c:58.
+[eva] Done for function __finitef
+[eva] tests/libc/math_h.c:59: assertion got status valid.
+[eva] computing for function __finite <- main.
+  Called from tests/libc/math_h.c:60.
+[eva] Done for function __finite
+[eva] computing for function __finite <- main.
+  Called from tests/libc/math_h.c:60.
+[eva] Done for function __finite
+[eva] tests/libc/math_h.c:61: assertion got status valid.
+[eva] computing for function __finitef <- main.
+  Called from tests/libc/math_h.c:62.
+[eva] Done for function __finitef
+[eva] tests/libc/math_h.c:63: assertion got status valid.
+[eva] computing for function __finitef <- main.
+  Called from tests/libc/math_h.c:64.
+[eva] Done for function __finitef
+[eva] tests/libc/math_h.c:65: assertion got status valid.
 [eva] Recording results for main
 [eva] done for function main
 [eva] ====== VALUES COMPUTED ======
@@ -232,15 +275,15 @@
   atan_minus_one ∈ {-0.785398163397}
   atan_large ∈ {1.57079632679}
   atan_top ∈ [-1.57079632679 .. 1.57079632679] ∪ {NaN}
-  atanf_f_pi ∈ {1.262627244}
-  atanf_f_half_pi ∈ {1.00388479233}
-  atanf_f_e ∈ {1.218282938}
+  atanf_f_pi ∈ {1.262627}
+  atanf_f_half_pi ∈ {1.003884}
+  atanf_f_e ∈ {1.218282}
   atanf_zero ∈ {0}
   atanf_minus_zero ∈ {-0.}
-  atanf_one ∈ {0.785398185253}
-  atanf_minus_one ∈ {-0.785398185253}
-  atanf_large ∈ {1.57079637051}
-  atanf_f_top ∈ [-1.57079637051 .. 1.57079637051] ∪ {NaN}
+  atanf_one ∈ {0.785398}
+  atanf_minus_one ∈ {-0.785398}
+  atanf_large ∈ {1.570796}
+  atanf_f_top ∈ [-1.570796 .. 1.570796] ∪ {NaN}
   atanl_ld_pi ∈ [-inf .. inf]
   atanl_ld_half_pi ∈ [-inf .. inf]
   atanl_ld_e ∈ [-inf .. inf]
@@ -277,4 +320,5 @@
   fabsl_minus_one ∈ [-inf .. inf]
   fabsl_large ∈ [-inf .. inf]
   fabsl_ld_top ∈ [-inf .. inf]
+  r ∈ {0}
   __retres ∈ {0}
diff --git a/tests/libc/oracle/socket_h.res.oracle b/tests/libc/oracle/socket_h.res.oracle
index 2942b240516430a347da531c9d65338e593a5453..5b84d2f1e1e380f91341ec410560bbf7b9e2b753 100644
--- a/tests/libc/oracle/socket_h.res.oracle
+++ b/tests/libc/oracle/socket_h.res.oracle
@@ -59,10 +59,52 @@
 [eva] socket_h.c:21: 
   function getsockname: precondition 'valid_address' got status valid.
 [eva] Done for function getsockname
+[eva] computing for function sendto <- main.
+  Called from tests/libc/socket_h.c:24.
+[eva] using specification for function sendto
+[eva] tests/libc/socket_h.c:24: 
+  function sendto: precondition 'available_sockfd' got status valid.
+[eva] tests/libc/socket_h.c:24: 
+  function sendto: precondition 'buf_len_ok' got status valid.
+[eva] Done for function sendto
+[eva] computing for function sendto <- main.
+  Called from tests/libc/socket_h.c:27.
+[eva] tests/libc/socket_h.c:27: 
+  function sendto: precondition 'available_sockfd' got status valid.
+[eva] tests/libc/socket_h.c:27: 
+  function sendto: precondition 'buf_len_ok' got status valid.
+[eva] Done for function sendto
+[eva] computing for function recvfrom <- main.
+  Called from tests/libc/socket_h.c:31.
+[eva] using specification for function recvfrom
+[eva] tests/libc/socket_h.c:31: 
+  function recvfrom: precondition 'valid_sockfd' got status valid.
+[eva] tests/libc/socket_h.c:31: 
+  function recvfrom: precondition 'valid_buffer_length' got status valid.
+[eva] tests/libc/socket_h.c:31: 
+  function recvfrom: precondition 'valid_addrbuf_or_null' got status valid.
+[eva] Done for function recvfrom
+[eva] tests/libc/socket_h.c:35: assertion got status valid.
+[eva] computing for function recvfrom <- main.
+  Called from tests/libc/socket_h.c:37.
+[eva] tests/libc/socket_h.c:37: 
+  function recvfrom: precondition 'valid_sockfd' got status valid.
+[eva] tests/libc/socket_h.c:37: 
+  function recvfrom: precondition 'valid_buffer_length' got status valid.
+[eva] tests/libc/socket_h.c:37: 
+  function recvfrom: precondition 'valid_addrbuf_or_null' got status valid.
+[eva:invalid-assigns] tests/libc/socket_h.c:37: 
+  Completely invalid destination for assigns clause *addrbuf_len. Ignoring.
+[eva:invalid-assigns] tests/libc/socket_h.c:37: 
+  Completely invalid destination
+  for assigns clause *((char *)addrbuf + (0 .. \old(*addrbuf_len) - 1)).
+  Ignoring.
+[eva] Done for function recvfrom
 [eva] Recording results for main
 [eva] done for function main
 [eva] ====== VALUES COMPUTED ======
 [eva:final-states] Values at end of function main:
+  __fc_errno ∈ [--..--]
   __fc_sockfds[0..1023] ∈ [--..--]
   __fc_socket_counter ∈ [--..--]
   sockfd ∈ [0..1023]
@@ -73,3 +115,10 @@
   optlen ∈ {4}
   addr2 ∈ [--..--] or UNINITIALIZED
   socklen ∈ [0..8]
+  buf[0..39] ∈ [--..--]
+  sent ∈ {-1; 0; 1; 2; 3}
+  sent2 ∈ {-1; 0; 1; 2; 3}
+  recvfrom_addr ∈ [--..--]
+  recvfrom_addr_len ∈ [--..--]
+  received ∈ [-1..40]
+  received2 ∈ [-1..40]
diff --git a/tests/libc/socket_h.c b/tests/libc/socket_h.c
index 3a0e8d8cab974f29eb249f53759997d661e740d1..d52cb75cf23c207b155a61156ba0f9fa138706c7 100644
--- a/tests/libc/socket_h.c
+++ b/tests/libc/socket_h.c
@@ -19,5 +19,21 @@ int main() {
   struct sockaddr_in addr2;
   socklen_t socklen = sizeof(addr2);
   rc = getsockname(sockfd, (struct sockaddr *)&addr2, &socklen);
+
+  char buf[40] = {'a', 'b', 'c'};
+  ssize_t sent = sendto(sockfd, buf, 3, 0, (struct sockaddr *)&addr,
+                        sizeof(addr));
+
+  ssize_t sent2 = sendto(sockfd, buf, 3, 0, 0, 0);
+
+  struct sockaddr_in recvfrom_addr;
+  socklen_t recvfrom_addr_len = sizeof(recvfrom_addr);
+  ssize_t received = recvfrom(sockfd, buf, sizeof(buf), 0,
+                              (struct sockaddr *)&recvfrom_addr,
+                              &recvfrom_addr_len);
+  if (received != -1) {
+    //@ assert \initialized(&recvfrom_addr);
+  }
+  ssize_t received2 = recvfrom(sockfd, buf, sizeof(buf), 0, 0, 0);
   return rc;
 }
diff --git a/tests/metrics/libc.c b/tests/metrics/libc.c
index c9c41a18762157b7fe04cf2289fd0ee154a0fb75..83556b3d9b4e6b4042873d240ba90e708637d16c 100644
--- a/tests/metrics/libc.c
+++ b/tests/metrics/libc.c
@@ -1,6 +1,8 @@
 /* run.config
    STDOPT: #"-metrics-no-libc -metrics-eva-cover"
    STDOPT: #"-metrics-libc -metrics-eva-cover"
+   LOG: libc.json
+   STDOPT: #"-metrics-libc -metrics-output @PTEST_DIR@/result/libc.json"
 */
 #include <ctype.h>
 #include <stdio.h> // defines external variables
@@ -21,6 +23,8 @@ int g() { // called via fp
   return isalpha(42);
 }
 
+int h() { return 0; }
+
 int (*fp)() = g;
 
 int getopt(int argc, char * const argv[],
@@ -31,5 +35,6 @@ int getopt(int argc, char * const argv[],
 int main() {
   fp();
   getopt(0, 0, 0);
+  h();
   return isblank(0);
 }
diff --git a/tests/metrics/oracle/libc.0.res.oracle b/tests/metrics/oracle/libc.0.res.oracle
index 1e50ff032d2c6ef2d3829c0a63cab85912eeb31a..781b6e7b467ce2633b485a5086cbbe3dcbae04b1 100644
--- a/tests/metrics/oracle/libc.0.res.oracle
+++ b/tests/metrics/oracle/libc.0.res.oracle
@@ -1,8 +1,16 @@
+<<<<<<< HEAD
 [kernel] Parsing libc.c (with preprocessing)
 [metrics] Defined functions (5)
+||||||| ac7807782d
+[kernel] Parsing tests/metrics/libc.c (with preprocessing)
+[metrics] Defined functions (5)
+=======
+[kernel] Parsing tests/metrics/libc.c (with preprocessing)
+[metrics] Defined functions (6)
+>>>>>>> origin/master
   =====================
    bar (0 call); f (0 call); foo (0 call); g (address taken) (0 call);
-   main (0 call); 
+   h (1 call); main (0 call); 
   
   Specified-only functions (0)
   ============================
@@ -22,18 +30,18 @@
   
   Global metrics
   ============== 
-  Sloc = 12
+  Sloc = 15
   Decision point = 0
   Global variables = 1
   If = 0
   Loop = 0
   Goto = 0
-  Assignment = 5
-  Exit point = 5
-  Function = 5
-  Function call = 5
+  Assignment = 6
+  Exit point = 6
+  Function = 6
+  Function call = 6
   Pointer dereferencing = 1
-  Cyclomatic complexity = 5
+  Cyclomatic complexity = 6
 [eva] Analyzing a complete application starting at main
 [eva] Computing initial state
 [eva] Initial state computed
@@ -44,8 +52,8 @@
 [eva] done for function main
 [eva:summary] ====== ANALYSIS SUMMARY ======
   ----------------------------------------------------------------------------
-  4 functions analyzed (out of 5): 80% coverage.
-  In these functions, 10 statements reached (out of 10): 100% coverage.
+  5 functions analyzed (out of 6): 83% coverage.
+  In these functions, 13 statements reached (out of 13): 100% coverage.
   ----------------------------------------------------------------------------
   No errors or warnings raised during the analysis.
   ----------------------------------------------------------------------------
@@ -58,15 +66,16 @@
   ----------------------------------------------------------------------------
 [metrics] Eva coverage statistics
   =======================
-  Syntactically reachable functions = 4 (out of 5)
-  Semantically reached functions = 4
+  Syntactically reachable functions = 5 (out of 6)
+  Semantically reached functions = 5
   Coverage estimation = 100.0%
 [metrics] References to non-analyzed functions
   ------------------------------------
 [metrics] Statements analyzed by Eva
   --------------------------
-  10 stmts in analyzed functions, 10 stmts analyzed (100.0%)
+  13 stmts in analyzed functions, 13 stmts analyzed (100.0%)
   bar: 2 stmts out of 2 (100.0%)
   foo: 2 stmts out of 2 (100.0%)
   g: 2 stmts out of 2 (100.0%)
-  main: 4 stmts out of 4 (100.0%)
+  h: 2 stmts out of 2 (100.0%)
+  main: 5 stmts out of 5 (100.0%)
diff --git a/tests/metrics/oracle/libc.1.res.oracle b/tests/metrics/oracle/libc.1.res.oracle
index 5b505e2ff176415dd0cf09531a8cb71bfd660b5e..5eebdb80cc890a9d72d21051af0e94ae250ef75c 100644
--- a/tests/metrics/oracle/libc.1.res.oracle
+++ b/tests/metrics/oracle/libc.1.res.oracle
@@ -1,8 +1,16 @@
+<<<<<<< HEAD
 [kernel] Parsing libc.c (with preprocessing)
 [metrics] Defined functions (6)
+||||||| ac7807782d
+[kernel] Parsing tests/metrics/libc.c (with preprocessing)
+[metrics] Defined functions (6)
+=======
+[kernel] Parsing tests/metrics/libc.c (with preprocessing)
+[metrics] Defined functions (7)
+>>>>>>> origin/master
   =====================
    bar (1 call); f (0 call); foo (1 call); g (address taken) (0 call);
-   getopt (1 call); main (0 call); 
+   getopt (1 call); h (1 call); main (0 call); 
   
   Specified-only functions (122)
   ==============================
@@ -55,18 +63,18 @@
   
   Global metrics
   ============== 
-  Sloc = 17
+  Sloc = 20
   Decision point = 0
   Global variables = 17
   If = 0
   Loop = 0
   Goto = 0
-  Assignment = 8
-  Exit point = 6
-  Function = 128
-  Function call = 7
+  Assignment = 9
+  Exit point = 7
+  Function = 129
+  Function call = 8
   Pointer dereferencing = 1
-  Cyclomatic complexity = 6
+  Cyclomatic complexity = 7
 [eva] Analyzing a complete application starting at main
 [eva] Computing initial state
 [eva] Initial state computed
@@ -77,8 +85,8 @@
 [eva] done for function main
 [eva:summary] ====== ANALYSIS SUMMARY ======
   ----------------------------------------------------------------------------
-  4 functions analyzed (out of 5): 80% coverage.
-  In these functions, 10 statements reached (out of 10): 100% coverage.
+  5 functions analyzed (out of 6): 83% coverage.
+  In these functions, 13 statements reached (out of 13): 100% coverage.
   ----------------------------------------------------------------------------
   No errors or warnings raised during the analysis.
   ----------------------------------------------------------------------------
@@ -91,16 +99,17 @@
   ----------------------------------------------------------------------------
 [metrics] Eva coverage statistics
   =======================
-  Syntactically reachable functions = 7 (out of 128)
-  Semantically reached functions = 7
+  Syntactically reachable functions = 8 (out of 129)
+  Semantically reached functions = 8
   Coverage estimation = 100.0%
 [metrics] References to non-analyzed functions
   ------------------------------------
 [metrics] Statements analyzed by Eva
   --------------------------
-  15 stmts in analyzed functions, 15 stmts analyzed (100.0%)
+  18 stmts in analyzed functions, 18 stmts analyzed (100.0%)
   bar: 2 stmts out of 2 (100.0%)
   foo: 2 stmts out of 2 (100.0%)
   g: 2 stmts out of 2 (100.0%)
   getopt: 5 stmts out of 5 (100.0%)
-  main: 4 stmts out of 4 (100.0%)
+  h: 2 stmts out of 2 (100.0%)
+  main: 5 stmts out of 5 (100.0%)
diff --git a/tests/metrics/oracle/libc.2.res.oracle b/tests/metrics/oracle/libc.2.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..eeb5977dbc5fef0789c0e314ec2e68f5834bd8d2
--- /dev/null
+++ b/tests/metrics/oracle/libc.2.res.oracle
@@ -0,0 +1 @@
+[kernel] Parsing tests/metrics/libc.c (with preprocessing)
diff --git a/tests/metrics/oracle/libc.json b/tests/metrics/oracle/libc.json
new file mode 100644
index 0000000000000000000000000000000000000000..beaef667824195860e65dd80e77a5ed91e266313
--- /dev/null
+++ b/tests/metrics/oracle/libc.json
@@ -0,0 +1,141 @@
+{
+  "defined-functions": [
+    { "bar": { "calls": 1, "address_taken": false } },
+    { "f": { "calls": 0, "address_taken": false } },
+    { "foo": { "calls": 1, "address_taken": false } },
+    { "g": { "calls": 0, "address_taken": true } },
+    { "getopt": { "calls": 1, "address_taken": false } },
+    { "h": { "calls": 1, "address_taken": false } },
+    { "main": { "calls": 0, "address_taken": false } }
+  ],
+  "specified-only-functions": [
+    { "_exit": { "calls": 0, "address_taken": false } },
+    { "access": { "calls": 0, "address_taken": false } },
+    { "chdir": { "calls": 0, "address_taken": false } },
+    { "chown": { "calls": 0, "address_taken": false } },
+    { "chroot": { "calls": 0, "address_taken": false } },
+    { "clearerr": { "calls": 0, "address_taken": false } },
+    { "clearerr_unlocked": { "calls": 0, "address_taken": false } },
+    { "close": { "calls": 0, "address_taken": false } },
+    { "dup": { "calls": 0, "address_taken": false } },
+    { "dup2": { "calls": 0, "address_taken": false } },
+    { "execl": { "calls": 0, "address_taken": false } },
+    { "execle": { "calls": 0, "address_taken": false } },
+    { "execlp": { "calls": 0, "address_taken": false } },
+    { "execv": { "calls": 0, "address_taken": false } },
+    { "execve": { "calls": 0, "address_taken": false } },
+    { "execvp": { "calls": 0, "address_taken": false } },
+    { "fclose": { "calls": 0, "address_taken": false } },
+    { "fdopen": { "calls": 0, "address_taken": false } },
+    { "feof": { "calls": 0, "address_taken": false } },
+    { "feof_unlocked": { "calls": 0, "address_taken": false } },
+    { "ferror": { "calls": 0, "address_taken": false } },
+    { "ferror_unlocked": { "calls": 0, "address_taken": false } },
+    { "fflush": { "calls": 0, "address_taken": false } },
+    { "fgetc": { "calls": 0, "address_taken": false } },
+    { "fgetpos": { "calls": 0, "address_taken": false } },
+    { "fgets": { "calls": 0, "address_taken": false } },
+    { "fileno": { "calls": 0, "address_taken": false } },
+    { "fileno_unlocked": { "calls": 0, "address_taken": false } },
+    { "flockfile": { "calls": 0, "address_taken": false } },
+    { "fopen": { "calls": 0, "address_taken": false } },
+    { "fork": { "calls": 0, "address_taken": false } },
+    { "fputc": { "calls": 0, "address_taken": false } },
+    { "fputs": { "calls": 0, "address_taken": false } },
+    { "fread": { "calls": 0, "address_taken": false } },
+    { "freopen": { "calls": 0, "address_taken": false } },
+    { "fseek": { "calls": 0, "address_taken": false } },
+    { "fseeko": { "calls": 0, "address_taken": false } },
+    { "fsetpos": { "calls": 0, "address_taken": false } },
+    { "ftell": { "calls": 0, "address_taken": false } },
+    { "ftello": { "calls": 0, "address_taken": false } },
+    { "ftrylockfile": { "calls": 0, "address_taken": false } },
+    { "funlockfile": { "calls": 0, "address_taken": false } },
+    { "fwrite": { "calls": 0, "address_taken": false } },
+    { "getc": { "calls": 0, "address_taken": false } },
+    { "getc_unlocked": { "calls": 0, "address_taken": false } },
+    { "getchar": { "calls": 1, "address_taken": false } },
+    { "getchar_unlocked": { "calls": 0, "address_taken": false } },
+    { "getcwd": { "calls": 0, "address_taken": false } },
+    { "getegid": { "calls": 0, "address_taken": false } },
+    { "geteuid": { "calls": 0, "address_taken": false } },
+    { "getgid": { "calls": 0, "address_taken": false } },
+    { "gethostname": { "calls": 0, "address_taken": false } },
+    { "getopt_long": { "calls": 0, "address_taken": false } },
+    { "getopt_long_only": { "calls": 0, "address_taken": false } },
+    { "getpgid": { "calls": 0, "address_taken": false } },
+    { "getpgrp": { "calls": 0, "address_taken": false } },
+    { "getpid": { "calls": 0, "address_taken": false } },
+    { "getppid": { "calls": 0, "address_taken": false } },
+    { "getresgid": { "calls": 0, "address_taken": false } },
+    { "getresuid": { "calls": 0, "address_taken": false } },
+    { "gets": { "calls": 0, "address_taken": false } },
+    { "getsid": { "calls": 0, "address_taken": false } },
+    { "getuid": { "calls": 0, "address_taken": false } },
+    { "isalnum": { "calls": 0, "address_taken": false } },
+    { "isalpha": { "calls": 1, "address_taken": false } },
+    { "isascii": { "calls": 0, "address_taken": false } },
+    { "isatty": { "calls": 0, "address_taken": false } },
+    { "isblank": { "calls": 1, "address_taken": false } },
+    { "iscntrl": { "calls": 0, "address_taken": false } },
+    { "isdigit": { "calls": 0, "address_taken": false } },
+    { "isgraph": { "calls": 0, "address_taken": false } },
+    { "islower": { "calls": 0, "address_taken": false } },
+    { "isprint": { "calls": 0, "address_taken": false } },
+    { "ispunct": { "calls": 0, "address_taken": false } },
+    { "isspace": { "calls": 0, "address_taken": false } },
+    { "isupper": { "calls": 0, "address_taken": false } },
+    { "isxdigit": { "calls": 0, "address_taken": false } },
+    { "lseek": { "calls": 0, "address_taken": false } },
+    { "pathconf": { "calls": 0, "address_taken": false } },
+    { "pclose": { "calls": 0, "address_taken": false } },
+    { "perror": { "calls": 0, "address_taken": false } },
+    { "pipe": { "calls": 0, "address_taken": false } },
+    { "popen": { "calls": 0, "address_taken": false } },
+    { "putc": { "calls": 0, "address_taken": false } },
+    { "putc_unlocked": { "calls": 0, "address_taken": false } },
+    { "putchar": { "calls": 0, "address_taken": false } },
+    { "putchar_unlocked": { "calls": 0, "address_taken": false } },
+    { "puts": { "calls": 0, "address_taken": false } },
+    { "read": { "calls": 0, "address_taken": false } },
+    { "remove": { "calls": 0, "address_taken": false } },
+    { "rename": { "calls": 0, "address_taken": false } },
+    { "rewind": { "calls": 0, "address_taken": false } },
+    { "setbuf": { "calls": 0, "address_taken": false } },
+    { "setegid": { "calls": 0, "address_taken": false } },
+    { "seteuid": { "calls": 0, "address_taken": false } },
+    { "setgid": { "calls": 0, "address_taken": false } },
+    { "sethostname": { "calls": 0, "address_taken": false } },
+    { "setpgid": { "calls": 0, "address_taken": false } },
+    { "setregid": { "calls": 0, "address_taken": false } },
+    { "setresgid": { "calls": 0, "address_taken": false } },
+    { "setresuid": { "calls": 0, "address_taken": false } },
+    { "setreuid": { "calls": 0, "address_taken": false } },
+    { "setsid": { "calls": 0, "address_taken": false } },
+    { "setuid": { "calls": 0, "address_taken": false } },
+    { "setvbuf": { "calls": 0, "address_taken": false } },
+    { "sync": { "calls": 0, "address_taken": false } },
+    { "sysconf": { "calls": 0, "address_taken": false } },
+    { "tmpfile": { "calls": 0, "address_taken": false } },
+    { "tmpnam": { "calls": 0, "address_taken": false } },
+    { "tolower": { "calls": 0, "address_taken": false } },
+    { "toupper": { "calls": 0, "address_taken": false } },
+    { "ttyname": { "calls": 0, "address_taken": false } },
+    { "ungetc": { "calls": 0, "address_taken": false } },
+    { "unlink": { "calls": 0, "address_taken": false } },
+    { "usleep": { "calls": 0, "address_taken": false } },
+    { "vfprintf": { "calls": 0, "address_taken": false } },
+    { "vfscanf": { "calls": 0, "address_taken": false } },
+    { "vprintf": { "calls": 0, "address_taken": false } },
+    { "vscanf": { "calls": 0, "address_taken": false } },
+    { "vsnprintf": { "calls": 0, "address_taken": false } },
+    { "vsprintf": { "calls": 0, "address_taken": false } },
+    { "write": { "calls": 0, "address_taken": false } }
+  ],
+  "undefined-functions": [],
+  "extern-global-vars": [
+    "Frama_C_entropy_source", "__fc_errno", "__fc_hostname", "__fc_stdin",
+    "__fc_stdout", "__fc_ttyname", "optarg", "opterr", "optind", "optopt"
+  ],
+  "entry-points": [ "f", "main" ]
+}
diff --git a/tests/misc/add_assigns.ml b/tests/misc/add_assigns.ml
index 42afdad88cf132574af23ec8b86df63525688d14..3b1412f0f1c2247bb67865aef6fbb01b48bdb825 100644
--- a/tests/misc/add_assigns.ml
+++ b/tests/misc/add_assigns.ml
@@ -26,7 +26,7 @@ let main () =
         (fun b -> b.b_name = Cil.default_behavior_name)
         (Annotations.behaviors kf)
     in
-    let ip = Extlib.the (Property.ip_assigns_of_behavior kf Kglobal [] bhv) in
+    let ip = Option.get (Property.ip_assigns_of_behavior kf Kglobal [] bhv) in
     Property_status.(emit emitter ~hyps:[] ip True)
   end
 
diff --git a/tests/misc/bts1347.ml b/tests/misc/bts1347.ml
index 259c2fe8abac993c14b817353eeecd44dbace5dd..d2319d0f4b81a02e3a66d55474e63ea4e882c3d7 100644
--- a/tests/misc/bts1347.ml
+++ b/tests/misc/bts1347.ml
@@ -5,7 +5,7 @@ let emitter =
 let run () =
   Globals.Functions.iter
     (fun kf ->
-      if not (Cil.is_builtin (Kernel_function.get_vi kf)) then begin
+      if not (Cil_builtins.is_builtin (Kernel_function.get_vi kf)) then begin
 	Globals.set_entry_point (Kernel_function.get_name kf) true;
 	!Db.Value.compute();
 	let hyps = 
diff --git a/tests/misc/cli_string_multiple_map.ml b/tests/misc/cli_string_multiple_map.ml
index 4e462d916627571683449412d04bae7393898a6a..2b2078c4bb7fe41c97b5482023e91596f6b4976f 100644
--- a/tests/misc/cli_string_multiple_map.ml
+++ b/tests/misc/cli_string_multiple_map.ml
@@ -13,10 +13,10 @@ module M =
       type key = string
       let of_string ~key:_ ~prev:_ arg =
         try
-          Extlib.opt_map Integer.of_string arg
+          Option.map Integer.of_string arg
         with Failure _ ->
           raise (Cannot_build "expecting an integer")
-      let to_string ~key:_ = Extlib.opt_map Integer.to_string
+      let to_string ~key:_ = Option.map Integer.to_string
     end)
     (struct
       let option_name = "-multiple-map"
diff --git a/tests/misc/exception.ml b/tests/misc/exception.ml
index 0af32684819c1f6b9c5a6b990f88916e06d3ae4d..b057828398230dd11276504b14b858067a38e390 100644
--- a/tests/misc/exception.ml
+++ b/tests/misc/exception.ml
@@ -35,7 +35,7 @@ let add_my_exn my_exn f =
   let init =
     CompoundInit(
         exn_type,
-        [Field(List.hd my_exn.cfields, NoOffset), SingleInit (Cil.zero ~loc)])
+        [Field(List.hd (Option.get my_exn.cfields), NoOffset), SingleInit (Cil.zero ~loc)])
   in
   add_throw_test f exn_type c init
 
@@ -61,8 +61,8 @@ let add_int_ptr_exn glob f =
 let add_catch my_exn my_exn2 f =
   let exn_type = TComp(my_exn, { scache = Not_Computed }, []) in
   let exn_type2 = TComp(my_exn2, {scache = Not_Computed }, []) in
-  let exn_field = Field (List.hd my_exn.cfields, NoOffset) in
-  let exn2_field = Field (List.hd my_exn2.cfields, NoOffset) in
+  let exn_field = Field (List.hd (Option.get my_exn.cfields), NoOffset) in
+  let exn2_field = Field (List.hd (Option.get my_exn2.cfields), NoOffset) in
   let loc = Cil_datatype.Location.unknown in
   let real_locals = f.sbody.blocals in
   let v1 = Cil.makeLocalVar f "exn" exn_type in
@@ -86,7 +86,7 @@ let add_catch my_exn my_exn2 f =
       (TryCatch(
            f.sbody,
            [ Catch_exn (v1,[(v3,id_block); (v4, convert_exn_block)]),
-             Cil.mkBlock 
+             Cil.mkBlock
                [ Cil.mkStmt
                    (Return
                       (Some (Cil.new_exp ~loc (Lval (Var v1, exn_field))),
@@ -125,7 +125,7 @@ let add_exn ast =
     | GVar(v,_,_) when v.vname = "x" -> glob := Some v
     | GFun(f,_) ->
         change_body
-          (Extlib.the !my_exn) (Extlib.the !my_exn2) (Extlib.the !glob) f
+          (Option.get !my_exn) (Option.get !my_exn2) (Option.get !glob) f
     | _ -> ()
   in
   List.iter treat_glob ast.globals
@@ -178,4 +178,4 @@ let add_exn_cat = File.register_code_transformation_category "add_exn"
 
 let () = File.add_code_transformation_before_cleanup add_exn_cat add_exn
 
-      
+
diff --git a/tests/misc/find_enclosing_loop.ml b/tests/misc/find_enclosing_loop.ml
index 382ab2abc0fc9a2d6062fbd2ead967df1512592b..cc510ae91eb510e392f836f279022ba05f39aab0 100644
--- a/tests/misc/find_enclosing_loop.ml
+++ b/tests/misc/find_enclosing_loop.ml
@@ -17,7 +17,7 @@ object(self)
     let has_loop =
       try
         Some 
-          (Kernel_function.find_enclosing_loop (Extlib.the self#current_kf) s)
+          (Kernel_function.find_enclosing_loop (Option.get self#current_kf) s)
       with Not_found -> None
     in
     (match has_loop with
diff --git a/tests/misc/issue_191.ml b/tests/misc/issue_191.ml
index a65693ff931e59aca07e59d82795546b00bb56f0..afbb9efd7c39c460d4aead0e2d0ca5a847cde8fe 100644
--- a/tests/misc/issue_191.ml
+++ b/tests/misc/issue_191.ml
@@ -1,4 +1,4 @@
 let norm1 = Filepath.normalize ~base_name:"/dir1/" "dir/file" in
 let norm2 = Filepath.normalize ~base_name:"/dir2/" "dir/file" in
 (* norm2 should be different than norm1 *)
-Printf.printf "norm1: %s\nnorm2: %s\n" norm1 norm2
\ No newline at end of file
+Printf.printf "norm1: %s\nnorm2: %s\n" norm1 norm2
diff --git a/tests/misc/my_visitor.ml b/tests/misc/my_visitor.ml
index 09545f270ae554bcbfd5e1120ce60e7cc051fa12..4afb3e92f0862a5bc4e3b28f8b1023022a933cb6 100644
--- a/tests/misc/my_visitor.ml
+++ b/tests/misc/my_visitor.ml
@@ -55,7 +55,7 @@ class foo = object (self)
 
   method! vstmt_aux stmt =
     let loc = Cil.CurrentLoc.get () in
-    add_assert loc (Extlib.the self#current_kf) stmt;
+    add_assert loc (Option.get self#current_kf) stmt;
     DoChildren
 
   method! vglob_aux _ = DoChildren
diff --git a/tests/misc/oracle/my_visitor.res.oracle b/tests/misc/oracle/my_visitor.res.oracle
deleted file mode 100644
index 04b0d97491307081cc55be88c27f3d3b47e00392..0000000000000000000000000000000000000000
--- a/tests/misc/oracle/my_visitor.res.oracle
+++ /dev/null
@@ -1,23 +0,0 @@
-[kernel] Warning: emitter emitter1: correctness parameter -s does not exist anymore. Ignored.
-[kernel] Warning: emitter emitter2: correctness parameter -s2 does not exist anymore. Ignored.
-[kernel] Warning: 13 states in saved file ignored. They are invalid in this Frama-C configuration.
-[kernel] Warning: emitter emitter1: correctness parameter -s does not exist anymore. Ignored.
-[kernel] Warning: emitter emitter2: correctness parameter -s2 does not exist anymore. Ignored.
-[kernel] Warning: 13 states in saved file ignored. They are invalid in this Frama-C configuration.
-[kernel] Warning: ignoring source files specified on the command line while loading a global initial context.
-/* Generated by Frama-C */
-int f(void)
-{
-  int __retres;
-  /*@ assert emitter2: ∀ ℤ x; x ≡ x; */
-  int y = 0;
-  y ++;
-  /*@ assert y ≡ 1; */
-  /*@ assert emitter2: ∀ ℤ x; x ≡ x; */
-  ;
-  __retres = 0;
-  /*@ assert emitter2: ∀ ℤ x; x ≡ x; */
-  return __retres;
-}
-
-
diff --git a/tests/misc/oracle/print_machdep.res.oracle b/tests/misc/oracle/print_machdep.res.oracle
index 4902716c8fc08e7971dd7cee455314ab41f65599..e0ef03b220dadd48a509cd8d00a25151499d3f9b 100644
--- a/tests/misc/oracle/print_machdep.res.oracle
+++ b/tests/misc/oracle/print_machdep.res.oracle
@@ -1,17 +1,17 @@
-Machine: gcc 4.0.3 - X86-32bits mode
+Machine: gcc 4.0.3 AMD64
    sizeof       short =  2 (16 bits, aligned on 16 bits)
    sizeof         int =  4 (32 bits, aligned on 32 bits)
-   sizeof        long =  4 (32 bits, aligned on 32 bits)
-   sizeof   long long =  8 (64 bits, aligned on 32 bits)
+   sizeof        long =  8 (64 bits, aligned on 64 bits)
+   sizeof   long long =  8 (64 bits, aligned on 64 bits)
    sizeof       float =  4 (32 bits, aligned on 32 bits)
-   sizeof      double =  8 (64 bits, aligned on 32 bits)
-   sizeof long double = 12 (96 bits, aligned on 32 bits)
-   sizeof     pointer =  4 (32 bits, aligned on 32 bits)
+   sizeof      double =  8 (64 bits, aligned on 64 bits)
+   sizeof long double = 16 (128 bits, aligned on 128 bits)
+   sizeof     pointer =  8 (64 bits, aligned on 64 bits)
    sizeof        void =  1 (8 bits, aligned on 8 bits)
    sizeof    function = error (alignof error)
-   typeof   sizeof(T) = unsigned int
+   typeof   sizeof(T) = unsigned long
    typeof     wchar_t = int
-   typeof   ptrdiff_t = int
+   typeof   ptrdiff_t = long
    char is signed
    machine is little endian
    strings are const chars
diff --git a/tests/misc/pragma-pack.c b/tests/misc/pragma-pack.c
index 2f1dbe59e2f928babe15cf58b39293f5d1fa3272..3b84578601164eddf20b5b4ac08e3e90c299f667 100644
--- a/tests/misc/pragma-pack.c
+++ b/tests/misc/pragma-pack.c
@@ -1,8 +1,18 @@
 /*run.config
+<<<<<<< HEAD
   DEPS: pragma-pack-utils.h
   STDOPT: +"-machdep gcc_x86_64 -kernel-msg-key typing:pragma"
   STDOPT: +"-machdep gcc_x86_32"
   STDOPT: +"-machdep msvc_x86_64"
+||||||| ac7807782d
+  STDOPT: #"-machdep gcc_x86_64 -kernel-msg-key typing:pragma"
+  STDOPT: #"-cpp-command=\"gcc -E -C -I. -m32\" -cpp-frama-c-compliant"
+  STDOPT: #"-machdep msvc_x86_64"
+=======
+  STDOPT: +"-machdep gcc_x86_64 -kernel-msg-key typing:pragma"
+  STDOPT: +"-machdep gcc_x86_32"
+  STDOPT: +"-machdep msvc_x86_64"
+>>>>>>> origin/master
  */
 #include "pragma-pack-utils.h"
 
diff --git a/tests/misc/static.ml b/tests/misc/static.ml
index 9a5a73fdf89422ae513a2b0bb2bfdf2d929bb2f2..7b6f77aa5f8f1d7d362de123ec827c53e052bd70 100644
--- a/tests/misc/static.ml
+++ b/tests/misc/static.ml
@@ -3,7 +3,7 @@ open Cil_types
 let find_x f =
   let kf = Globals.Functions.find_by_name f in
   let stmt = Kernel_function.find_return kf in
-  Extlib.the (Globals.Syntactic_search.find_in_scope "x" (Block_scope stmt))
+  Option.get (Globals.Syntactic_search.find_in_scope "x" (Block_scope stmt))
 
 let run () =
   Ast.compute ();
@@ -11,7 +11,7 @@ let run () =
   let x_g = find_x "g" in
   let x_main = find_x "main" in
   let x_glob =
-    Extlib.the (Globals.Syntactic_search.find_in_scope "x" Program)
+    Option.get (Globals.Syntactic_search.find_in_scope "x" Program)
   in
   if not (Cil_datatype.Varinfo.equal x_main x_glob) then
     Kernel.fatal "in main, global variable x should be in scope";
diff --git a/tests/misc/tests.sh b/tests/misc/tests.sh
index 004d0f5f22e6fee31cebca4a99b2dfba33d2eeae..20df6b9e707189225184b3cc2b134c0dce336c28 100755
--- a/tests/misc/tests.sh
+++ b/tests/misc/tests.sh
@@ -60,4 +60,4 @@ if [ "${Res}" != 0 ] ; then
   exit ${Res}
 fi
 Compare ${PreFix} ${PostFix1} stdout
-Compare ${PreFix} ${PostFix2} stderr
\ No newline at end of file
+Compare ${PreFix} ${PostFix2} stderr
diff --git a/tests/misc/vis_spec.ml b/tests/misc/vis_spec.ml
index 720539a727bbbe9e03b4d4670ab6d2acbea6f531..ec8a33e2c84821e0734a0b22d7e61a51c96bd235 100644
--- a/tests/misc/vis_spec.ml
+++ b/tests/misc/vis_spec.ml
@@ -7,7 +7,7 @@ object(self)
 
   method! vspec sp =
     Format.printf "Considering spec of function %s@."
-      (Kernel_function.get_name (Extlib.the self#current_kf));
+      (Kernel_function.get_name (Option.get self#current_kf));
     (match self#current_func with
       | Some f ->
           if  f.svar.vname ="f" then (
diff --git a/tests/rte/array_index.c b/tests/rte/array_index.c
index b976e42cce80e05920e1870208d858e4db473a18..77df7919a2332a91172e6cb5790e609d1ff02aad 100644
--- a/tests/rte/array_index.c
+++ b/tests/rte/array_index.c
@@ -1,6 +1,6 @@
 /* run.config
-   OPT: -rte -warn-signed-overflow -print -then -rte-trivial-annotations
-   OPT: -rte -warn-signed-overflow -print -unsafe-arrays
+   OPT: -machdep x86_32 -rte -warn-signed-overflow -print -then -rte-trivial-annotations
+   OPT: -machdep x86_32 -rte -warn-signed-overflow -print -unsafe-arrays
 */
 
 int t[10];
diff --git a/tests/rte/castoncall.c b/tests/rte/castoncall.c
index 35340269152d9036a0425ae03148ce991143e4ad..65401d7a0354fe74e0e8ff61326915dd4e4a5856 100644
--- a/tests/rte/castoncall.c
+++ b/tests/rte/castoncall.c
@@ -1,15 +1,15 @@
 /* run.config
-  OPT: -rte -warn-signed-overflow  -warn-signed-downcast -print
-  OPT: -rte -warn-signed-overflow  -warn-signed-downcast -no-collapse-call-cast -print
+  OPT: -machdep x86_32 -rte -warn-signed-overflow  -warn-signed-downcast -print
+  OPT: -machdep x86_32 -rte -warn-signed-overflow  -warn-signed-downcast -no-collapse-call-cast -print
 */
 
-/*@ 
+/*@
   ensures (\result == a) || (\result == b);
   assigns \result \from a,b;
  */
 int nondet(int a, int b);
 
-/*@ 
+/*@
   ensures (\result == a) || (\result == b);
   assigns \result \from a,b;
  */
diff --git a/tests/rte/initialized_union.c b/tests/rte/initialized_union.c
index ce50aec121a98fc4d2f70c6929b15ec89c3bb51c..9f7b960688c1a9ace5860925922cd5b8e7dc032c 100644
--- a/tests/rte/initialized_union.c
+++ b/tests/rte/initialized_union.c
@@ -1,5 +1,6 @@
 /* run.config
    OPT: -rte -rte-initialized -warn-signed-overflow -print
+   OPT: -cpp-extra-args="-DEMPTY" -machdep gcc_x86_64 -rte -rte-initialized -warn-signed-overflow -print
 */
 
 union U {
@@ -23,10 +24,10 @@ struct S {
 };
 
 union U u_global;
-
+#ifdef EMPTY
 // supported by Frama-C
 union empty {};
-
+#endif
 int main(){
 
   union U u_local1;
@@ -37,9 +38,9 @@ int main(){
 
   union U3 u3_local1;
   union U3 u3_local2;
-
+#ifdef EMPTY
   union empty e;
-
+#endif
   u_local1.c = 1;
 
   u_local2 = u_local1;
@@ -53,12 +54,12 @@ int main(){
   u3_local2 = u3_local1;
 
   double f = u_global.f;
-  
+
   struct S s1, s2;
   s1.u.c = 'a';
   s2.u = s1.u;
-
+#ifdef EMPTY
   union empty e1 = e;
-
+#endif
   return 0;
 }
diff --git a/tests/rte/invalid_fptr.i b/tests/rte/invalid_fptr.i
new file mode 100644
index 0000000000000000000000000000000000000000..c28d93b0ed1dfc232e053144dd4998f834f8b5f0
--- /dev/null
+++ b/tests/rte/invalid_fptr.i
@@ -0,0 +1,37 @@
+/* run.config
+OPT: -c11 -rte -warn-invalid-pointer -print
+*/
+
+struct S { void (*f)(void); } s;
+
+struct S1 { void(*f)(void); } s1;
+
+void (*p)(void);
+
+void f(void) {
+  if (p) return; // should not warn
+  if (p+2) return; // should warn
+  if (s.f) return; //should not warn
+  if (s.f+2) return; // should warn
+  return;
+}
+
+struct { union { void(*g)(void); unsigned int x; }; } s2;
+
+struct { void (*tab[12])(void); } s3;
+
+void write_something(void *x);
+
+void h() {
+  write_something(&s1.f);
+  write_something(&s3.tab[4]);
+}
+
+//all the pointers below can have their value set to an invalid pointer without
+// generating a warning at write site, hence a warning should be generated
+// at read access.
+void g(void) {
+  if (s2.g) return;
+  if (s1.f) return;
+  if (s3.tab[4]) return;
+}
diff --git a/tests/rte/oracle/assign4.res.oracle b/tests/rte/oracle/assign4.res.oracle
index cc13f5f237c9c755cff38dd324c2774e5cc92030..a232f0d1d596b429c2f64b41c7c8d7c67ee2859d 100644
--- a/tests/rte/oracle/assign4.res.oracle
+++ b/tests/rte/oracle/assign4.res.oracle
@@ -5,10 +5,8 @@
     assigns \result \from min, max; */
 int choose1(int min, int max);
 
-/*@ assigns \result, \result;
-    assigns \result \from min, max, min, max;
-    assigns \result \from min, max, min, max;
- */
+/*@ assigns \result;
+    assigns \result \from min, max; */
 int choose2(int min, int max);
 
 int main(void)
diff --git a/tests/rte/oracle/assign5.res.oracle b/tests/rte/oracle/assign5.res.oracle
index cd60f298bd53aeab4056e7b70879014a95b58b0c..252e70786670399b1641f0ada054ab676cb74cdd 100644
--- a/tests/rte/oracle/assign5.res.oracle
+++ b/tests/rte/oracle/assign5.res.oracle
@@ -1,14 +1,22 @@
+<<<<<<< HEAD
 [kernel] Parsing assign5.c (with preprocessing)
+||||||| ac7807782d
+[kernel] Parsing tests/rte/assign5.c (with preprocessing)
+=======
+[kernel] Parsing tests/rte/assign5.c (with preprocessing)
+[kernel:annot:multi-from] Warning: 
+  Drop '*p' \from at tests/rte/assign5.c:9 for more precise one at tests/rte/assign5.c:10
+[kernel:annot:multi-from] Warning: 
+  Drop '*p' \from at tests/rte/assign5.c:19 for more precise one at tests/rte/assign5.c:18
+>>>>>>> origin/master
 [rte] annotating function main
 /* Generated by Frama-C */
-/*@ assigns *p, *p;
-    assigns *p \from x;
+/*@ assigns *p;
     assigns *p \from \nothing; */
 int f(int *p, int x);
 
-/*@ assigns *p, *p;
-    assigns *p \from \nothing;
-    assigns *p \from x; */
+/*@ assigns *p;
+    assigns *p \from \nothing; */
 int g(int *p, int x);
 
 int main(void)
diff --git a/tests/rte/oracle/initialized_union.0.res.oracle b/tests/rte/oracle/initialized_union.0.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..550af6851cec53470d701c3d2f199ed35c5a03e1
--- /dev/null
+++ b/tests/rte/oracle/initialized_union.0.res.oracle
@@ -0,0 +1,70 @@
+[kernel] Parsing tests/rte/initialized_union.c (with preprocessing)
+[rte] annotating function main
+/* Generated by Frama-C */
+union U {
+   char c ;
+   int i ;
+   double f ;
+};
+union U2 {
+   int i1 ;
+   int i2 ;
+};
+union U3 {
+   union U u ;
+   union U2 u2 ;
+};
+struct S {
+   union U u ;
+};
+union U u_global;
+int main(void)
+{
+  int __retres;
+  union U u_local1;
+  union U u_local2;
+  union U2 u2_local1;
+  union U2 u2_local2;
+  union U3 u3_local1;
+  union U3 u3_local2;
+  struct S s1;
+  struct S s2;
+  u_local1.c = (char)1;
+  /*@ assert
+      rte: initialization_of_union:
+        \initialized(&u_local1.c) ∨ \initialized(&u_local1.i) ∨
+        \initialized(&u_local1.f);
+  */
+  u_local2 = u_local1;
+  /*@ assert rte: initialization: \initialized(&u_local1.i); */
+  u2_local1.i2 = u_local1.i;
+  /*@ assert
+      rte: initialization_of_union:
+        \initialized(&u2_local1.i1) ∨ \initialized(&u2_local1.i2);
+  */
+  u2_local2 = u2_local1;
+  /*@ assert
+      rte: initialization_of_union:
+        \initialized(&u_local1.c) ∨ \initialized(&u_local1.i) ∨
+        \initialized(&u_local1.f);
+  */
+  u3_local1.u = u_local1;
+  /*@ assert
+      rte: initialization_of_union:
+        \initialized(&u3_local1.u) ∨ \initialized(&u3_local1.u2);
+  */
+  u3_local2 = u3_local1;
+  double f = u_global.f;
+  s1.u.c = (char)'a';
+  /*@ assert
+      rte: initialization_of_union:
+        \initialized(&s1.u.c) ∨ \initialized(&s1.u.i) ∨
+        \initialized(&s1.u.f);
+  */
+  s2.u = s1.u;
+  __retres = 0;
+  /*@ assert rte: initialization: \initialized(&__retres); */
+  return __retres;
+}
+
+
diff --git a/tests/rte/oracle/initialized_union.res.oracle b/tests/rte/oracle/initialized_union.1.res.oracle
similarity index 100%
rename from tests/rte/oracle/initialized_union.res.oracle
rename to tests/rte/oracle/initialized_union.1.res.oracle
diff --git a/tests/rte/oracle/invalid_fptr.res.oracle b/tests/rte/oracle/invalid_fptr.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..c1d6edf050a78c04f869915aba22205ed6fe211c
--- /dev/null
+++ b/tests/rte/oracle/invalid_fptr.res.oracle
@@ -0,0 +1,60 @@
+[kernel] Parsing tests/rte/invalid_fptr.i (no preprocessing)
+[rte] annotating function f
+[rte] annotating function g
+[rte] annotating function h
+/* Generated by Frama-C */
+struct S {
+   void (*f)(void) ;
+};
+struct S1 {
+   void (*f)(void) ;
+};
+union __anonunion_2 {
+   void (*g)(void) ;
+   unsigned int x ;
+};
+struct __anonstruct_s2_1 {
+   union __anonunion_2 __anonCompField1 ;
+};
+struct __anonstruct_s3_3 {
+   void (*tab[12])(void) ;
+};
+struct S s;
+struct S1 s1;
+void (*p)(void);
+void f(void)
+{
+  if (p) goto return_label;
+  /*@ assert rte: pointer_value: \valid_function(p + 2); */
+  if (p + 2) goto return_label;
+  if (s.f) goto return_label;
+  /*@ assert rte: pointer_value: \valid_function(s.f + 2); */
+  if (s.f + 2) goto return_label;
+  return_label: return;
+}
+
+struct __anonstruct_s2_1 s2;
+struct __anonstruct_s3_3 s3;
+void write_something(void *x);
+
+void h(void)
+{
+  /*@ assert rte: pointer_value: \object_pointer(&s1.f); */
+  write_something((void *)(& s1.f));
+  /*@ assert rte: pointer_value: \object_pointer(&s3.tab[4]); */
+  write_something((void *)(& s3.tab[4]));
+  return;
+}
+
+void g(void)
+{
+  /*@ assert rte: pointer_value: \valid_function(s2.__anonCompField1.g); */
+  if (s2.__anonCompField1.g) goto return_label;
+  /*@ assert rte: pointer_value: \valid_function(s1.f); */
+  if (s1.f) goto return_label;
+  /*@ assert rte: pointer_value: \valid_function(s3.tab[4]); */
+  if (s3.tab[4]) goto return_label;
+  return_label: return;
+}
+
+
diff --git a/tests/rte/u64.i b/tests/rte/u64.i
index 173468db18f77ba40b8145d10e9aeef6d7b1277b..8f23354dfb741c264df216e93520a3d94097ec5d 100644
--- a/tests/rte/u64.i
+++ b/tests/rte/u64.i
@@ -1,5 +1,5 @@
 /* run.config
-   OPT: -rte -warn-unsigned-overflow -print -journal-disable
+   OPT: -rte -warn-unsigned-overflow -print -journal-disable -machdep x86_32
    OPT: -rte -warn-unsigned-overflow -print -journal-disable -machdep x86_64
 */
 unsigned long f(unsigned int n)
diff --git a/tests/rte_manual/machdep.i b/tests/rte_manual/machdep.i
index 31828d04e860c5b079963c8f4123ee1a5c1b6c53..65edbbb4caa30e2af31b9c85d4d01e6a68804a54 100644
--- a/tests/rte_manual/machdep.i
+++ b/tests/rte_manual/machdep.i
@@ -1,5 +1,5 @@
 /* run.config
-   OPT: -rte -then -print
+   OPT: -machdep x86_32 -rte -then -print
    OPT: -machdep x86_64 -rte -then -print
  */
 
diff --git a/tests/saveload/bool.c b/tests/saveload/bool.c
index 200d545f557c3f08fa5599075baf01efa4eb38a4..bb295c81a31e63493fef32699cd85b512873ade3 100644
--- a/tests/saveload/bool.c
+++ b/tests/saveload/bool.c
@@ -1,7 +1,17 @@
 /* run.config
+<<<<<<< HEAD
    EXECNOW: BIN bool.sav LOG bool_sav.res LOG bool_sav.err @frama-c@ -save bool.sav -machdep x86_32 -eva @EVA_OPTIONS@ > bool_sav.res 2> bool_sav.err
    STDOPT: +"-load %{dep:bool.sav} -out -input -deps"
    STDOPT: +"-load %{dep:bool.sav} -eva @EVA_OPTIONS@"
+||||||| ac7807782d
+   EXECNOW: BIN bool.sav LOG bool_sav.res LOG bool_sav.err ./bin/toplevel.opt -save ./tests/saveload/result/bool.sav -eva @EVA_OPTIONS@ ./tests/saveload/bool.c > tests/saveload/result/bool_sav.res 2> tests/saveload/result/bool_sav.err
+   STDOPT: +"-load ./tests/saveload/result/bool.sav -out -input -deps"
+   STDOPT: +"-load ./tests/saveload/result/bool.sav -eva @EVA_OPTIONS@"
+=======
+   EXECNOW: BIN bool.sav LOG bool_sav.res LOG bool_sav.err ./bin/toplevel.opt -save ./tests/saveload/result/bool.sav -machdep x86_32 -eva @EVA_OPTIONS@ ./tests/saveload/bool.c > tests/saveload/result/bool_sav.res 2> tests/saveload/result/bool_sav.err
+   STDOPT: +"-load ./tests/saveload/result/bool.sav -out -input -deps"
+   STDOPT: +"-load ./tests/saveload/result/bool.sav -eva @EVA_OPTIONS@"
+>>>>>>> origin/master
  */
 
 #include "stdbool.h"
diff --git a/tests/slicing/min_call.c b/tests/slicing/min_call.c
index 4b9bafde7c19a07d4aaae1ce2ca471af73b05ca4..68ec3eade51dc8f01b2cd7023028eb47dc3cc8a1 100644
--- a/tests/slicing/min_call.c
+++ b/tests/slicing/min_call.c
@@ -1,10 +1,10 @@
 /* run.config
-   DEPS: select_return.i
-   LIBS: libSelect
-   MODULE: @PTEST_NAME@
+   EXECNOW: make -s @PTEST_DIR@/@PTEST_NAME@.cmxs
+   CMD: @frama-c@ -load-module tests/slicing/libSelect.cmxs -load-module @PTEST_DIR@/@PTEST_NAME@.cmxs
    OPT: @EVA_OPTIONS@ -deps -lib-entry -main g -journal-disable -slicing-level 3
 */
 
 /* dummy source file in order to test minimal calls feature
  * on select_return.i  */
-#include "select_return.i"
+
+#include "tests/slicing/select_return.i"
diff --git a/tests/slicing/oracle/min_call.res.oracle b/tests/slicing/oracle/min_call.res.oracle
index 858153ee93740c28d7b7379d50f8de6beca11e87..4251766b82a03d2c571e759f32e305d1ead93283 100644
--- a/tests/slicing/oracle/min_call.res.oracle
+++ b/tests/slicing/oracle/min_call.res.oracle
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
 [kernel] Parsing min_call.c (with preprocessing)
 [kernel:typing:implicit-function-declaration] select_return.i:45: Warning: 
   Calling undeclared function f. Old style K&R code?
@@ -592,3 +593,604 @@ void f_slice_1(void)
 }
 
 
+||||||| ac7807782d
+[kernel] Parsing tests/slicing/min_call.i (no preprocessing)
+[kernel] User Error: cannot find entry point `g'.
+  Please use option `-main' for specifying a valid entry point.
+[kernel] Frama-C aborted: invalid user input.
+=======
+[kernel] Parsing tests/slicing/min_call.c (with preprocessing)
+[kernel:typing:implicit-function-declaration] tests/slicing/select_return.i:45: Warning: 
+  Calling undeclared function f. Old style K&R code?
+[eva] Analyzing an incomplete application starting at g
+[eva] Computing initial state
+[eva] Initial state computed
+[eva:initial-state] Values of globals at initialization
+  G ∈ [--..--]
+  H ∈ [--..--]
+  I ∈ [--..--]
+[eva] computing for function k <- g.
+  Called from tests/slicing/select_return.i:44.
+[eva] computing for function get <- k <- g.
+  Called from tests/slicing/select_return.i:35.
+[kernel:annot:missing-spec] tests/slicing/select_return.i:35: Warning: 
+  Neither code nor specification for function get, generating default assigns from the prototype
+[eva] using specification for function get
+[eva] Done for function get
+[eva] computing for function send_bis <- k <- g.
+  Called from tests/slicing/select_return.i:39.
+[kernel:annot:missing-spec] tests/slicing/select_return.i:39: Warning: 
+  Neither code nor specification for function send_bis, generating default assigns from the prototype
+[eva] using specification for function send_bis
+[eva] Done for function send_bis
+[eva] Recording results for k
+[eva] Done for function k
+[eva] computing for function f <- g.
+  Called from tests/slicing/select_return.i:45.
+[eva] computing for function k <- f <- g.
+  Called from tests/slicing/select_return.i:49.
+[eva] computing for function get <- k <- f <- g.
+  Called from tests/slicing/select_return.i:35.
+[eva] Done for function get
+[eva] computing for function send_bis <- k <- f <- g.
+  Called from tests/slicing/select_return.i:39.
+[eva] Done for function send_bis
+[eva] Recording results for k
+[eva] Done for function k
+[eva] computing for function k <- f <- g.
+  Called from tests/slicing/select_return.i:50.
+[eva] computing for function get <- k <- f <- g.
+  Called from tests/slicing/select_return.i:35.
+[eva] Done for function get
+[eva] computing for function send_bis <- k <- f <- g.
+  Called from tests/slicing/select_return.i:39.
+[eva] Done for function send_bis
+[eva] Recording results for k
+[eva] Done for function k
+[eva] computing for function k <- f <- g.
+  Called from tests/slicing/select_return.i:51.
+[eva] computing for function get <- k <- f <- g.
+  Called from tests/slicing/select_return.i:35.
+[eva] Done for function get
+[eva] computing for function send_bis <- k <- f <- g.
+  Called from tests/slicing/select_return.i:39.
+[eva] Done for function send_bis
+[eva] Recording results for k
+[eva] Done for function k
+[eva] computing for function send <- f <- g.
+  Called from tests/slicing/select_return.i:53.
+[kernel:annot:missing-spec] tests/slicing/select_return.i:53: Warning: 
+  Neither code nor specification for function send, generating default assigns from the prototype
+[eva] using specification for function send
+[eva] Done for function send
+[eva] Recording results for f
+[eva] Done for function f
+[eva] Recording results for g
+[eva] done for function g
+[from] Computing for function k
+[from] Computing for function get <-k
+[from] Done for function get
+[from] Computing for function send_bis <-k
+[from] Done for function send_bis
+[from] Done for function k
+[from] Computing for function f
+[from] Computing for function send <-f
+[from] Done for function send
+[from] Done for function f
+[from] Computing for function g
+[from] Done for function g
+[from] ====== DEPENDENCIES COMPUTED ======
+  These dependencies hold at termination for the executions that terminate:
+[from] Function get:
+  \result FROM y
+[from] Function send:
+  NO EFFECTS
+[from] Function send_bis:
+  NO EFFECTS
+[from] Function k:
+  G FROM b
+  H FROM c
+  \result FROM a
+[from] Function f:
+  G FROM \nothing
+  H FROM \nothing
+  \result FROM y
+[from] Function g:
+  G FROM \nothing
+  H FROM \nothing
+[from] ====== END OF DEPENDENCIES ======
+[slicing] initializing slicing ...
+[pdg] computing for function k
+[pdg] done for function k
+[slicing] applying all slicing requests...
+[slicing] applying 1 actions...
+[slicing] applying actions: 1/1...
+[pdg] computing for function f
+[pdg] done for function f
+[pdg] computing for function g
+[pdg] done for function g
+Project1 - result1 :
+[slicing] exporting project to 'Sliced code'...
+[slicing] applying all slicing requests...
+[slicing] applying 0 actions...
+[sparecode] remove unused global declarations from project 'Sliced code tmp'
+[sparecode] removed unused global declarations in new project 'Sliced code'
+/* Generated by Frama-C */
+int get(int y);
+
+/*@ assigns \nothing; */
+void send_bis(int x);
+
+void k_slice_1(int d)
+{
+  int cond = get(d);
+  if (cond) send_bis(d);
+  return;
+}
+
+void f_slice_1(void);
+
+void g(void)
+{
+  k_slice_1(0);
+  f_slice_1();
+  return;
+}
+
+void f_slice_1(void)
+{
+  k_slice_1(0);
+  k_slice_1(0);
+  k_slice_1(0);
+  return;
+}
+
+
+Project1 - result2 :
+int G;
+int H;
+int I;
+/*@ assigns \result;
+    assigns \result \from y; */
+int get(int y);
+
+/*@ assigns \nothing; */
+void send(int x);
+
+/*@ assigns \nothing; */
+void send_bis(int x);
+
+Print slice = k_slice_2: (InCtrl: <[ S ], [---]>)
+                         (In4: <[--d], [---]>)
+
+/**/int k(/* <[---], [---]> */ int a, /* <[---], [---]> */ int b,
+          /* <[---], [---]> */ int c, /* <[--d], [---]> */ int d)
+{
+  /* sig call:
+    (InCtrl: <[ S ], [---]>)
+    (In1: <[ S ], [---]>)
+    (OutRet: <[ S ], [---]>) */
+  /* undetermined call */
+  /* <[ S ], [---]> */
+  /* <[ S ], [---]> */ int cond = get(d);
+  /* <[---], [---]> */
+  G = b;
+  /* <[---], [---]> */
+  H = c;
+  /* <[ S ], [---]> */
+  if (cond) {
+    /* sig call: (InCtrl: <[ S ], [---]>)
+                 (In1: <[ S ], [---]>) */
+    /* undetermined call */
+    /* <[ S ], [---]> */
+    send_bis(d);
+  }
+  /* <[---], [---]> */
+  return a;
+}
+
+Print slice = k_slice_1: (InCtrl: <[ S ], [ S ]>)
+                         (In4: <[--d], [ S ]>)
+
+/**/int k(/* <[---], [---]> */ int a, /* <[---], [---]> */ int b,
+          /* <[---], [---]> */ int c, /* <[--d], [ S ]> */ int d)
+{
+  /* sig call:
+    (InCtrl: <[ S ], [ S ]>)
+    (In1: <[ S ], [ S ]>)
+    (OutRet: <[ S ], [ S ]>) */
+  /* call to source function */
+  /* <[ S ], [ S ]> */
+  /* <[ S ], [ S ]> */ int cond = get(d);
+  /* <[---], [---]> */
+  G = b;
+  /* <[---], [---]> */
+  H = c;
+  /* <[ S ], [ S ]> */
+  if (cond) {
+    /* sig call: (InCtrl: <[ S ], [ S ]>)
+                 (In1: <[ S ], [ S ]>) */
+    /* call to source function */
+    /* <[ S ], [ S ]> */
+    send_bis(d);
+  }
+  /* <[---], [---]> */
+  return a;
+}
+
+int f(int y);
+
+Print slice = g_slice_1: (InCtrl: <[--d], [ S ]>)
+
+/**/void g(/* <[---], [---]> */ int b, /* <[---], [---]> */ int c)
+{
+  /* <[---], [---]> */ int r;
+  /* sig call: (InCtrl: <[--d], [ S ]>)
+               (In4: <[--d], [ S ]>) */
+  /* call to k_slice_1: (InCtrl: <[ S ], [ S ]>)
+                        (In4: <[--d], [ S ]>) */
+  /* <[--d], [ S ]> */
+  /* <[---], [---]> */ int r = k(0,0,c,0);
+  /* sig call: (InCtrl: <[--d], [ S ]>) */
+  /* call to f_slice_1: (InCtrl: <[--d], [ S ]>) */
+  /* <[--d], [ S ]> */
+  f(b);
+  /* <[---], [---]> */
+  return;
+}
+
+Print slice = f_slice_1: (InCtrl: <[--d], [ S ]>)
+
+/**/int f(/* <[---], [---]> */ int y)
+{
+  /* <[---], [---]> */ int r;
+  /* <[---], [---]> */ int z;
+  /* sig call: (InCtrl: <[--d], [ S ]>)
+               (In4: <[--d], [ S ]>) */
+  /* call to k_slice_1: (InCtrl: <[ S ], [ S ]>)
+                        (In4: <[--d], [ S ]>) */
+  /* <[--d], [ S ]> */
+  k(0,0,0,0);
+  /* sig call: (InCtrl: <[--d], [ S ]>)
+               (In4: <[--d], [ S ]>) */
+  /* call to k_slice_1: (InCtrl: <[ S ], [ S ]>)
+                        (In4: <[--d], [ S ]>) */
+  /* <[--d], [ S ]> */
+  /* <[---], [---]> */ int r = k(0,y,0,0);
+  /* sig call: (InCtrl: <[--d], [ S ]>)
+               (In4: <[--d], [ S ]>) */
+  /* call to k_slice_1: (InCtrl: <[ S ], [ S ]>)
+                        (In4: <[--d], [ S ]>) */
+  /* <[--d], [ S ]> */
+  /* <[---], [---]> */ int z = k(G,0,0,0);
+  /*@ slice pragma expr z; */ /* <[---], [---]> */
+                              ;
+  /* invisible call */ /* <[---], [---]> */
+  send(z);
+  /* <[---], [---]> */
+  return z;
+}
+
+Slicing project worklist [default] =
+[k_slice_2 = choose_call for call 6][k_slice_2 = choose_call for call 1]
+
+[slicing] exporting project to 'Sliced code'...
+[slicing] applying all slicing requests...
+[slicing] applying 2 actions...
+[slicing] applying actions: 1/2...
+[slicing] applying actions: 2/2...
+[sparecode] remove unused global declarations from project 'Sliced code tmp'
+[sparecode] removed unused global declarations in new project 'Sliced code'
+/* Generated by Frama-C */
+int get(int y);
+
+/*@ assigns \nothing; */
+void send_bis(int x);
+
+void k_slice_2(int d)
+{
+  int cond = get(d);
+  if (cond) send_bis(d);
+  return;
+}
+
+void k_slice_1(int d)
+{
+  int cond = get(d);
+  if (cond) send_bis(d);
+  return;
+}
+
+void f_slice_1(void);
+
+void g(void)
+{
+  k_slice_1(0);
+  f_slice_1();
+  return;
+}
+
+void f_slice_1(void)
+{
+  k_slice_1(0);
+  k_slice_1(0);
+  k_slice_1(0);
+  return;
+}
+
+
+[slicing] reinitializing slicing ...
+Slicing project worklist [default] =
+[k = (n:17 ,<[--d], [---]>)]
+
+[slicing] applying all slicing requests...
+[slicing] applying 1 actions...
+[slicing] applying actions: 1/1...
+Project3 - result :
+int G;
+int H;
+int I;
+/*@ assigns \result;
+    assigns \result \from y; */
+int get(int y);
+
+/*@ assigns \nothing; */
+void send(int x);
+
+/*@ assigns \nothing; */
+void send_bis(int x);
+
+Print slice = k_slice_1: (InCtrl: <[--d], [ S ]>)
+                         (In4: <[--d], [ S ]>)
+
+/**/int k(/* <[---], [---]> */ int a, /* <[---], [---]> */ int b,
+          /* <[---], [---]> */ int c, /* <[--d], [ S ]> */ int d)
+{
+  /* sig call:
+    (InCtrl: <[--d], [ S ]>)
+    (In1: <[--d], [ S ]>)
+    (OutRet: <[--d], [ S ]>) */
+  /* call to source function */
+  /* <[--d], [ S ]> */
+  /* <[--d], [ S ]> */ int cond = get(d);
+  /* <[---], [---]> */
+  G = b;
+  /* <[---], [---]> */
+  H = c;
+  /* <[--d], [ S ]> */
+  if (cond) {
+    /* sig call: (InCtrl: <[--d], [ S ]>)
+                 (In1: <[---], [ S ]>) */
+    /* call to source function */
+    /* <[--d], [ S ]> */
+    send_bis(d);
+  }
+  /* <[---], [---]> */
+  return a;
+}
+
+int f(int y);
+
+Print slice = g_slice_1: (InCtrl: <[--d], [ S ]>)
+
+/**/void g(/* <[---], [---]> */ int b, /* <[---], [---]> */ int c)
+{
+  /* <[---], [---]> */ int r;
+  /* sig call: (InCtrl: <[--d], [ S ]>)
+               (In4: <[--d], [ S ]>) */
+  /* call to k_slice_1: (InCtrl: <[--d], [ S ]>)
+                        (In4: <[--d], [ S ]>) */
+  /* <[--d], [ S ]> */
+  /* <[---], [---]> */ int r = k(0,0,c,0);
+  /* sig call: (InCtrl: <[--d], [ S ]>) */
+  /* call to f_slice_1: (InCtrl: <[--d], [ S ]>) */
+  /* <[--d], [ S ]> */
+  f(b);
+  /* <[---], [---]> */
+  return;
+}
+
+Print slice = f_slice_1: (InCtrl: <[--d], [ S ]>)
+
+/**/int f(/* <[---], [---]> */ int y)
+{
+  /* <[---], [---]> */ int r;
+  /* <[---], [---]> */ int z;
+  /* sig call: (InCtrl: <[--d], [ S ]>)
+               (In4: <[--d], [ S ]>) */
+  /* call to k_slice_1: (InCtrl: <[--d], [ S ]>)
+                        (In4: <[--d], [ S ]>) */
+  /* <[--d], [ S ]> */
+  k(0,0,0,0);
+  /* sig call: (InCtrl: <[--d], [ S ]>)
+               (In4: <[--d], [ S ]>) */
+  /* call to k_slice_1: (InCtrl: <[--d], [ S ]>)
+                        (In4: <[--d], [ S ]>) */
+  /* <[--d], [ S ]> */
+  /* <[---], [---]> */ int r = k(0,y,0,0);
+  /* sig call: (InCtrl: <[--d], [ S ]>)
+               (In4: <[--d], [ S ]>) */
+  /* call to k_slice_1: (InCtrl: <[--d], [ S ]>)
+                        (In4: <[--d], [ S ]>) */
+  /* <[--d], [ S ]> */
+  /* <[---], [---]> */ int z = k(G,0,0,0);
+  /*@ slice pragma expr z; */ /* <[---], [---]> */
+                              ;
+  /* invisible call */ /* <[---], [---]> */
+  send(z);
+  /* <[---], [---]> */
+  return z;
+}
+
+Slicing project worklist [default] =
+
+
+[slicing] exporting project to 'Sliced code'...
+[slicing] applying all slicing requests...
+[slicing] applying 0 actions...
+[sparecode] remove unused global declarations from project 'Sliced code tmp'
+[sparecode] removed unused global declarations in new project 'Sliced code'
+/* Generated by Frama-C */
+int get(int y);
+
+/*@ assigns \nothing; */
+void send_bis(int x);
+
+void k_slice_1(int d)
+{
+  int cond = get(d);
+  if (cond) send_bis(d);
+  return;
+}
+
+void f_slice_1(void);
+
+void g(void)
+{
+  k_slice_1(0);
+  f_slice_1();
+  return;
+}
+
+void f_slice_1(void)
+{
+  k_slice_1(0);
+  k_slice_1(0);
+  k_slice_1(0);
+  return;
+}
+
+
+[slicing] reinitializing slicing ...
+[slicing] applying all slicing requests...
+[slicing] applying 0 actions...
+Slicing project worklist [default] =
+[f = (n:26 ,<[acd], [---]>)(n:33 ,<[acd], [---]>)(n:41 ,<[acd], [---]>)][g = (n:60 ,
+<[acd],
+[---]>)]
+
+Slicing project worklist [default] =
+[f_slice_1 = choose_call for call 17][f_slice_1 = choose_call for call 16][f_slice_1 = choose_call for call 15][g = propagate (n:68 ,
+<[acd],
+[---]>)][Appli : calls to f][g = (n:60 ,<[acd], [---]>)]
+
+[slicing] applying all slicing requests...
+[slicing] applying 6 actions...
+[slicing] applying actions: 1/6...
+[slicing] applying actions: 2/6...
+[slicing] applying actions: 3/6...
+[slicing] applying actions: 4/6...
+[slicing] applying actions: 5/6...
+[slicing] applying actions: 6/6...
+Project3 - result :
+int G;
+int H;
+int I;
+/*@ assigns \result;
+    assigns \result \from y; */
+int get(int y);
+
+/*@ assigns \nothing; */
+void send(int x);
+
+/*@ assigns \nothing; */
+void send_bis(int x);
+
+Print slice = k_slice_1: 
+
+/**/int k(/* <[---], [---]> */ int a, /* <[---], [---]> */ int b,
+          /* <[---], [---]> */ int c, /* <[---], [---]> */ int d)
+{
+  /* invisible call */ /* <[---], [---]> */
+  /* <[---], [---]> */ int cond = get(d);
+  /* <[---], [---]> */
+  G = b;
+  /* <[---], [---]> */
+  H = c;
+  /* <[---], [---]> */
+  if (cond) {
+    /* invisible call */ /* <[---], [---]> */
+    send_bis(d);
+  }
+  /* <[---], [---]> */
+  return a;
+}
+
+int f(int y);
+
+Print slice = g_slice_1: (InCtrl: <[acd], [---]>)
+
+/**/void g(/* <[---], [---]> */ int b, /* <[---], [---]> */ int c)
+{
+  /* <[---], [---]> */ int r;
+  /* sig call: (InCtrl: <[acd], [---]>) */
+  /* call to k_slice_1:  */
+  /* <[acd], [---]> */
+  /* <[---], [---]> */ int r = k(0,0,c,0);
+  /* sig call: (InCtrl: <[acd], [---]>) */
+  /* call to f_slice_1: (InCtrl: <[acd], [---]>) */
+  /* <[acd], [---]> */
+  f(b);
+  /* <[---], [---]> */
+  return;
+}
+
+Print slice = f_slice_1: (InCtrl: <[acd], [---]>)
+
+/**/int f(/* <[---], [---]> */ int y)
+{
+  /* <[---], [---]> */ int r;
+  /* <[---], [---]> */ int z;
+  /* sig call: (InCtrl: <[acd], [---]>) */
+  /* call to k_slice_1:  */
+  /* <[acd], [---]> */
+  k(0,0,0,0);
+  /* sig call: (InCtrl: <[acd], [---]>) */
+  /* call to k_slice_1:  */
+  /* <[acd], [---]> */
+  /* <[---], [---]> */ int r = k(0,y,0,0);
+  /* sig call: (InCtrl: <[acd], [---]>) */
+  /* call to k_slice_1:  */
+  /* <[acd], [---]> */
+  /* <[---], [---]> */ int z = k(G,0,0,0);
+  /*@ slice pragma expr z; */ /* <[---], [---]> */
+                              ;
+  /* invisible call */ /* <[---], [---]> */
+  send(z);
+  /* <[---], [---]> */
+  return z;
+}
+
+Slicing project worklist [default] =
+
+
+[slicing] exporting project to 'Sliced code'...
+[slicing] applying all slicing requests...
+[slicing] applying 0 actions...
+[sparecode] remove unused global declarations from project 'Sliced code tmp'
+[sparecode] removed unused global declarations in new project 'Sliced code'
+/* Generated by Frama-C */
+void k_slice_1(void)
+{
+  return;
+}
+
+void f_slice_1(void);
+
+void g(void)
+{
+  k_slice_1();
+  f_slice_1();
+  return;
+}
+
+void f_slice_1(void)
+{
+  k_slice_1();
+  k_slice_1();
+  k_slice_1();
+  return;
+}
+
+
+>>>>>>> origin/master
diff --git a/tests/slicing/oracle/select_simple.res.oracle b/tests/slicing/oracle/select_simple.res.oracle
index 0dece58c73a2c7bcf9ac178f93badf3d1d78b608..c359bc624e0fa5f830be78a69ab29058bb78975c 100644
--- a/tests/slicing/oracle/select_simple.res.oracle
+++ b/tests/slicing/oracle/select_simple.res.oracle
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
 [kernel] Parsing select_simple.c (with preprocessing)
 [eva] Analyzing a complete application starting at main
 [eva] Computing initial state
@@ -428,3 +429,440 @@ void f8_slice_1(Tstr *ps)
 }
 
 
+||||||| ac7807782d
+[kernel] Parsing tests/slicing/select_simple.i (no preprocessing)
+[kernel] User Error: cannot find entry point `main'.
+  Please use option `-main' for specifying a valid entry point.
+[kernel] Frama-C aborted: invalid user input.
+=======
+[kernel] Parsing tests/slicing/select_simple.c (with 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
+  Unknown ∈ {0}
+  G ∈ {0}
+  S ∈ {0}
+  S1 ∈ {0}
+  S2 ∈ {0}
+[eva:alarm] tests/slicing/simple_intra_slice.i:99: Warning: 
+  signed overflow. assert -2147483648 ≤ uninit - 1;
+[eva] tests/slicing/simple_intra_slice.i:98: starting to merge loop iterations
+[eva:alarm] tests/slicing/simple_intra_slice.i:99: Warning: 
+  signed overflow. assert Unknown + 1 ≤ 2147483647;
+[eva:alarm] tests/slicing/simple_intra_slice.i:99: Warning: 
+  signed overflow. assert -2147483648 ≤ Unknown - 1;
+[eva:alarm] tests/slicing/simple_intra_slice.i:101: Warning: 
+  signed overflow. assert -2147483648 ≤ uninit2 - 1;
+[eva] tests/slicing/simple_intra_slice.i:100: starting to merge loop iterations
+[eva:alarm] tests/slicing/simple_intra_slice.i:101: Warning: 
+  signed overflow. assert S.a + 1 ≤ 2147483647;
+[eva:alarm] tests/slicing/simple_intra_slice.i:101: Warning: 
+  signed overflow. assert -2147483648 ≤ S.a - 1;
+[eva] computing for function f2 <- main.
+  Called from tests/slicing/simple_intra_slice.i:103.
+[eva] computing for function f1 <- f2 <- main.
+  Called from tests/slicing/simple_intra_slice.i:23.
+[eva] Recording results for f1
+[eva] Done for function f1
+[eva] Recording results for f2
+[eva] Done for function f2
+[eva] computing for function f3 <- main.
+  Called from tests/slicing/simple_intra_slice.i:104.
+[eva] Recording results for f3
+[eva] Done for function f3
+[eva] computing for function f4 <- main.
+  Called from tests/slicing/simple_intra_slice.i:105.
+[eva] Recording results for f4
+[eva] Done for function f4
+[eva] computing for function f5 <- main.
+  Called from tests/slicing/simple_intra_slice.i:106.
+[eva] Recording results for f5
+[eva] Done for function f5
+[eva] computing for function f6 <- main.
+  Called from tests/slicing/simple_intra_slice.i:107.
+[eva:alarm] tests/slicing/simple_intra_slice.i:71: Warning: 
+  signed overflow. assert -2147483648 ≤ 10 * n;
+[eva:alarm] tests/slicing/simple_intra_slice.i:71: Warning: 
+  signed overflow. assert 10 * n ≤ 2147483647;
+[eva] Recording results for f6
+[eva] Done for function f6
+[eva:alarm] tests/slicing/simple_intra_slice.i:107: Warning: 
+  signed overflow. assert res + tmp_3 ≤ 2147483647;
+                   (tmp_3 from f6(Unknown))
+[eva] computing for function f7 <- main.
+  Called from tests/slicing/simple_intra_slice.i:108.
+[eva:alarm] tests/slicing/simple_intra_slice.i:79: Warning: 
+  signed overflow. assert S.a + 3 ≤ 2147483647;
+[eva:alarm] tests/slicing/simple_intra_slice.i:82: Warning: 
+  signed overflow. assert s0.a + 1 ≤ 2147483647;
+[eva] Recording results for f7
+[eva] Done for function f7
+[eva] computing for function f8 <- main.
+  Called from tests/slicing/simple_intra_slice.i:110.
+[eva] Recording results for f8
+[eva] Done for function f8
+[eva] computing for function f8 <- main.
+  Called from tests/slicing/simple_intra_slice.i:112.
+[eva] Recording results for f8
+[eva] Done for function f8
+[eva] Recording results for main
+[eva] done for function main
+[from] Computing for function f1
+[from] Done for function f1
+[from] Computing for function f2
+[from] Done for function f2
+[from] Computing for function f3
+[from] Done for function f3
+[from] Computing for function f4
+[from] Done for function f4
+[from] Computing for function f5
+[from] Done for function f5
+[from] Computing for function f6
+[from] Done for function f6
+[from] Computing for function f7
+[from] Done for function f7
+[from] Computing for function f8
+[from] Done for function f8
+[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 f1:
+  G FROM x
+  \result FROM y
+[from] Function f2:
+  G FROM \nothing
+  \result FROM \nothing
+[from] Function f3:
+  G FROM Unknown; c (and SELF)
+  \result FROM Unknown; c
+[from] Function f4:
+  G FROM Unknown; c (and SELF)
+  \result FROM Unknown; c
+[from] Function f5:
+  G FROM Unknown; G; c (and SELF)
+  \result FROM Unknown; c
+[from] Function f6:
+  \result FROM Unknown; n
+[from] Function f7:
+  S.a FROM S.a; s0
+   {.b; .c} FROM S.a; s0 (and SELF)
+[from] Function f8:
+  S1.a FROM S1.a; S2.a; ps (and SELF)
+    .b FROM S1.b; S2.b; ps (and SELF)
+  S2.a FROM S1.a; S2.a; ps (and SELF)
+    .b FROM S1.b; S2.b; ps (and SELF)
+[from] Function main:
+  Unknown FROM Unknown (and SELF)
+  G FROM Unknown
+  S.a FROM S
+   {.b; .c} FROM S (and SELF)
+  S1.a FROM Unknown; S1.a; S2.a (and SELF)
+    .b FROM Unknown; S1.b; S2.b (and SELF)
+  S2.a FROM Unknown; S1.a; S2.a (and SELF)
+    .b FROM Unknown; S1.b; S2.b (and SELF)
+  \result FROM Unknown
+[from] ====== END OF DEPENDENCIES ======
+[slicing] initializing slicing ...
+[pdg] computing for function f1
+[pdg] done for function f1
+Slicing project worklist [default] =
+[f1_slice_1 = (n:11(restrict to G) ,<[--d], [---]>)]
+
+[slicing] exporting project to 'Sliced code'...
+[slicing] applying all slicing requests...
+[slicing] applying 1 actions...
+[slicing] applying actions: 1/1...
+[sparecode] remove unused global declarations from project 'Sliced code tmp'
+[sparecode] removed unused global declarations in new project 'Sliced code'
+/* Generated by Frama-C */
+int G;
+void f1_slice_1(int x)
+{
+  int a = 1;
+  G = x + a;
+  return;
+}
+
+
+[slicing] reinitializing slicing ...
+Slicing project worklist [default] =
+[f1_slice_1 = (n:13(restrict to __retres) ,<[--d], [---]>)]
+
+[slicing] exporting project to 'Sliced code'...
+[slicing] applying all slicing requests...
+[slicing] applying 1 actions...
+[slicing] applying actions: 1/1...
+[sparecode] remove unused global declarations from project 'Sliced code tmp'
+[sparecode] removed unused global declarations in new project 'Sliced code'
+/* Generated by Frama-C */
+int f1_slice_1(int y)
+{
+  int __retres;
+  int b = 2;
+  __retres = y + b;
+  return __retres;
+}
+
+
+[slicing] reinitializing slicing ...
+[pdg] computing for function f2
+[pdg] done for function f2
+Slicing project worklist [default] =
+[f2_slice_1 = (n:28(restrict to tmp) ,<[--d], [---]>)]
+
+[slicing] exporting project to 'Sliced code'...
+[slicing] applying all slicing requests...
+[slicing] applying 1 actions...
+[slicing] applying actions: 1/1...
+[sparecode] remove unused global declarations from project 'Sliced code tmp'
+[sparecode] removed unused global declarations in new project 'Sliced code'
+/* Generated by Frama-C */
+int f1_slice_1(int y)
+{
+  int __retres;
+  int b = 2;
+  __retres = y + b;
+  return __retres;
+}
+
+int f2_slice_1(void)
+{
+  int tmp;
+  int c = 3;
+  tmp = f1_slice_1(c);
+  return tmp;
+}
+
+
+[slicing] reinitializing slicing ...
+[pdg] computing for function f6
+[pdg] done for function f6
+Slicing project worklist [default] =
+[f6_slice_1 = (n:32(restrict to n) ,<[--d], [---]>)(n:42(restrict to 
+n) ,<[--d], [---]>)]
+
+[slicing] exporting project to 'Sliced code'...
+[slicing] applying all slicing requests...
+[slicing] applying 1 actions...
+[slicing] applying actions: 1/1...
+[sparecode] remove unused global declarations from project 'Sliced code tmp'
+[sparecode] removed unused global declarations in new project 'Sliced code'
+/* Generated by Frama-C */
+int Unknown;
+void f6_slice_1(int n)
+{
+  while (n < 10) {
+    if (Unknown > 3) break;
+    if (n % 2) continue;
+    n ++;
+  }
+  return;
+}
+
+
+[slicing] reinitializing slicing ...
+[pdg] computing for function f7
+[pdg] done for function f7
+[slicing] reinitializing slicing ...
+Impossible to select 'retres' for a void function (f7)
+Slicing project worklist [default] =
+[f7_slice_1 = (n:63(restrict to S.a) ,<[--d], [---]>)(n:65(restrict to 
+S.a) ,<[--d], [---]>)]
+
+[slicing] exporting project to 'Sliced code'...
+[slicing] applying all slicing requests...
+[slicing] applying 1 actions...
+[slicing] applying actions: 1/1...
+[sparecode] remove unused global declarations from project 'Sliced code tmp'
+[sparecode] removed unused global declarations in new project 'Sliced code'
+/* Generated by Frama-C */
+struct __anonstruct_Tstr_1 {
+   int a ;
+   int b ;
+   int c ;
+};
+typedef struct __anonstruct_Tstr_1 Tstr;
+Tstr S;
+void f7_slice_1(Tstr s0)
+{
+  int x = S.a;
+  if (x > 0) S.a += 3;
+  else {
+    (s0.a) ++;
+    S = s0;
+  }
+  return;
+}
+
+
+[slicing] reinitializing slicing ...
+Slicing project worklist [default] =
+[f7_slice_1 = (UndefIn S.b:<[--d], [---]>)(n:65(restrict to S.b) ,<[--d],
+                                                                  [---]>)]
+
+[slicing] exporting project to 'Sliced code'...
+[slicing] applying all slicing requests...
+[slicing] applying 1 actions...
+[slicing] applying actions: 1/1...
+[sparecode] remove unused global declarations from project 'Sliced code tmp'
+[sparecode] removed unused global declarations in new project 'Sliced code'
+/* Generated by Frama-C */
+struct __anonstruct_Tstr_1 {
+   int a ;
+   int b ;
+   int c ;
+};
+typedef struct __anonstruct_Tstr_1 Tstr;
+Tstr S;
+void f7_slice_1(Tstr s0)
+{
+  int x = S.a;
+  if (! (x > 0)) {
+    (s0.a) ++;
+    S = s0;
+  }
+  return;
+}
+
+
+[slicing] reinitializing slicing ...
+Slicing project worklist [default] =
+[f7_slice_1 = (UndefIn S{.b; .c}:<[--d], [---]>)(n:63(restrict to S.a) ,
+<[--d],
+[---]>)(n:65(restrict to S.a) ,<[--d], [---]>)(n:65(restrict to S{.b; .c}) ,
+<[--d],
+[---]>)]
+
+[slicing] exporting project to 'Sliced code'...
+[slicing] applying all slicing requests...
+[slicing] applying 1 actions...
+[slicing] applying actions: 1/1...
+[sparecode] remove unused global declarations from project 'Sliced code tmp'
+[sparecode] removed unused global declarations in new project 'Sliced code'
+/* Generated by Frama-C */
+struct __anonstruct_Tstr_1 {
+   int a ;
+   int b ;
+   int c ;
+};
+typedef struct __anonstruct_Tstr_1 Tstr;
+Tstr S;
+void f7_slice_1(Tstr s0)
+{
+  int x = S.a;
+  if (x > 0) S.a += 3;
+  else {
+    (s0.a) ++;
+    S = s0;
+  }
+  return;
+}
+
+
+[slicing] reinitializing slicing ...
+[slicing] reinitializing slicing ...
+[pdg] computing for function f8
+[pdg] done for function f8
+Impossible to select this data : XXX in f7
+Slicing project worklist [default] =
+[f8_slice_1 = (n:71(restrict to S1.a) ,<[--d], [---]>)(n:71(restrict to 
+S2.a) ,<[--d], [---]>)(n:77(restrict to S2.a) ,<[--d], [---]>)(n:76(restrict to 
+S1.a) ,<[--d], [---]>)]
+
+[slicing] exporting project to 'Sliced code'...
+[slicing] applying all slicing requests...
+[slicing] applying 1 actions...
+[slicing] applying actions: 1/1...
+[sparecode] remove unused global declarations from project 'Sliced code tmp'
+[sparecode] removed unused global declarations in new project 'Sliced code'
+/* Generated by Frama-C */
+struct __anonstruct_Tstr_1 {
+   int a ;
+   int b ;
+   int c ;
+};
+typedef struct __anonstruct_Tstr_1 Tstr;
+void f8_slice_1(Tstr *ps)
+{
+  (ps->a) ++;
+  return;
+}
+
+
+[slicing] reinitializing slicing ...
+Slicing project worklist [default] =
+[f8_slice_1 = (n:72(restrict to S1.b) ,<[--d], [---]>)(n:72(restrict to 
+S2.b) ,<[--d], [---]>)(n:75(restrict to S2.b) ,<[--d], [---]>)(n:74(restrict to 
+S1.b) ,<[--d], [---]>)]
+
+[slicing] exporting project to 'Sliced code'...
+[slicing] applying all slicing requests...
+[slicing] applying 1 actions...
+[slicing] applying actions: 1/1...
+[sparecode] remove unused global declarations from project 'Sliced code tmp'
+[sparecode] removed unused global declarations in new project 'Sliced code'
+/* Generated by Frama-C */
+struct __anonstruct_Tstr_1 {
+   int a ;
+   int b ;
+   int c ;
+};
+typedef struct __anonstruct_Tstr_1 Tstr;
+void f8_slice_1(Tstr *ps)
+{
+  (ps->b) ++;
+  return;
+}
+
+
+[slicing] reinitializing slicing ...
+Slicing project worklist [default] =
+[f8_slice_1 = (UndefIn S1.c;
+S2.c:<[--d], [---]>)]
+
+[slicing] exporting project to 'Sliced code'...
+[slicing] applying all slicing requests...
+[slicing] applying 1 actions...
+[slicing] applying actions: 1/1...
+[sparecode] remove unused global declarations from project 'Sliced code tmp'
+[sparecode] removed unused global declarations in new project 'Sliced code'
+/* Generated by Frama-C */
+void f8_slice_1(void)
+{
+  return;
+}
+
+
+[slicing] reinitializing slicing ...
+Slicing project worklist [default] =
+[f8_slice_1 = (UndefIn S1.c;
+S2.c:<[--d], [---]>)(n:71(restrict to S1.a) ,<[--d], [---]>)(n:72(restrict to 
+S1.b) ,<[--d], [---]>)(n:71(restrict to S2.a) ,<[--d], [---]>)(n:72(restrict to 
+S2.b) ,<[--d], [---]>)(n:75(restrict to S2.b) ,<[--d], [---]>)(n:77(restrict to 
+S2.a) ,<[--d], [---]>)(n:74(restrict to S1.b) ,<[--d], [---]>)(n:76(restrict to 
+S1.a) ,<[--d], [---]>)]
+
+[slicing] exporting project to 'Sliced code'...
+[slicing] applying all slicing requests...
+[slicing] applying 1 actions...
+[slicing] applying actions: 1/1...
+[sparecode] remove unused global declarations from project 'Sliced code tmp'
+[sparecode] removed unused global declarations in new project 'Sliced code'
+/* Generated by Frama-C */
+struct __anonstruct_Tstr_1 {
+   int a ;
+   int b ;
+   int c ;
+};
+typedef struct __anonstruct_Tstr_1 Tstr;
+void f8_slice_1(Tstr *ps)
+{
+  (ps->a) ++;
+  (ps->b) ++;
+  return;
+}
+
+
+>>>>>>> origin/master
diff --git a/tests/slicing/select_simple.c b/tests/slicing/select_simple.c
index 120c7d85790ba7bd9e653388b1e66fddb5bfa13c..6efa6fae65686dc81fea12a581d744db6abb5218 100644
--- a/tests/slicing/select_simple.c
+++ b/tests/slicing/select_simple.c
@@ -1,10 +1,9 @@
 /* run.config
-   DEPS: simple_intra_slice.i
-   LIBS: libSelect
-   MODULE: @PTEST_NAME@
+   EXECNOW: make -s @PTEST_DIR@/@PTEST_NAME@.cmxs
+   CMD: @frama-c@ -load-module tests/slicing/libSelect.cmxs -load-module @PTEST_DIR@/@PTEST_NAME@.cmxs
    OPT: @EVA_OPTIONS@ -deps -journal-disable
 */
 
 /* dummy source file in order to test select_simple.ml */
 
-#include "simple_intra_slice.i"
+#include "tests/slicing/simple_intra_slice.i"
diff --git a/tests/slicing/test_config b/tests/slicing/test_config
index 70059f8e01cc1a595bc0763eacdf15f3a4989f50..151008b9a6d539aa166a872ac3f81b0792bbb761 100644
--- a/tests/slicing/test_config
+++ b/tests/slicing/test_config
@@ -1,2 +1,10 @@
+<<<<<<< HEAD
 PLUGIN: slicing @EVA_PLUGINS@
 OPT: @EVA_OPTIONS@ -machdep x86_32
+||||||| ac7807782d
+EXECNOW: make -s tests/slicing/libSelect.cmxs tests/slicing/libAnim.cmxs
+OPT: @EVA_OPTIONS@
+=======
+EXECNOW: make -s tests/slicing/libSelect.cmxs tests/slicing/libAnim.cmxs
+OPT: @EVA_OPTIONS@ -machdep x86_32
+>>>>>>> origin/master
diff --git a/tests/sparecode/oracle/intra.2.res.oracle b/tests/sparecode/oracle/intra.2.res.oracle
index 47d7d4b3d0439b7b5982481bb2dd11bc0f9a7db1..ff10ab1e447840438c6fd59e653f927f6eb5a09d 100644
--- a/tests/sparecode/oracle/intra.2.res.oracle
+++ b/tests/sparecode/oracle/intra.2.res.oracle
@@ -40,7 +40,13 @@
 [pdg] Bottom for function spare_called_fct
 [pdg] computing for function stop
 [from] Computing for function stop
+<<<<<<< HEAD
 [kernel:annot:missing-spec] intra.i:110: Warning: 
+||||||| ac7807782d
+[kernel:annot:missing-spec] tests/sparecode/intra.i:110: Warning: 
+=======
+[kernel:annot:missing-spec] tests/sparecode/intra.i:93: Warning: 
+>>>>>>> origin/master
   Neither code nor specification for function stop, generating default assigns from the prototype
 [from] Done for function stop
 [pdg] done for function stop
diff --git a/tests/spec/Extend.ml b/tests/spec/Extend.ml
index 71fcdbdc871433955ef45aa232fd62b5f0c3b93b..af1f9f6510af20f330150938ce0703849e464a3c 100644
--- a/tests/spec/Extend.ml
+++ b/tests/spec/Extend.ml
@@ -40,7 +40,7 @@ let print_bar prt fmt ext =
     let l = Bar_table.find idx in
     Pretty_utils.pp_list
       ~pre:"@[<hov 2>" ~sep:",@ " ~suf:"@]" prt#predicate fmt l
-  | Ext_preds _ | Ext_terms _ ->
+  | Ext_preds _ | Ext_terms _ | Ext_annot _->
     Kernel.fatal "bar extension should have ids as arguments"
 
 let visit_bar vis ext =
@@ -56,7 +56,7 @@ let visit_bar vis ext =
       Bar_table.replace idx l';
       Cil.SkipChildren
     end
-  | Ext_terms _ | Ext_preds _ ->
+  | Ext_terms _ | Ext_preds _ | Ext_annot _ ->
       Kernel.fatal "bar extension should have ids as arguments"
 
 let type_baz typing_context _loc l =
diff --git a/tests/spec/Extend_recursive_preprocess.i b/tests/spec/Extend_recursive_preprocess.i
new file mode 100644
index 0000000000000000000000000000000000000000..319f9310fa3a995bdca92dff5499c6d5e940bd69
--- /dev/null
+++ b/tests/spec/Extend_recursive_preprocess.i
@@ -0,0 +1,34 @@
+/* run.config
+MODULE: @PTEST_DIR@/@PTEST_NAME@.cmxs
+OPT: -no-autoload-plugins -kernel-warn-key=annot-error=active -print
+*/
+
+/*@ gl_foo foo1 {
+    gl_fooo must_replace(x);
+    gl_fooo must_not_replace(x);
+    gl_fooo must_replace(x);
+}*/
+
+
+/*@ gl_foo foo1 {
+    gl_foo foo2 {
+      gl_fooo must_replace(x);
+      gl_fooo must_not_replace(x);
+    }
+}*/
+
+/*@ gl_foo foo1 {
+    gl_fooo must_replace(x);
+    gl_foo foo2 {
+      gl_fooo must_replace(x);
+      gl_foo foo3 {
+         gl_fooo must_replace(x);
+	 gl_fooo must_not_replace(x);
+      }
+      gl_fooo must_replace(x);
+    }
+    gl_fooo must_not_replace(x);
+
+}*/
+
+//frama-c -no-autoload-plugins -kernel-warn-key=annot-error=active -print -load-script Extend_recursive_preprocess.ml Extend_recursive_preprocess.i
diff --git a/tests/spec/Extend_recursive_preprocess.ml b/tests/spec/Extend_recursive_preprocess.ml
new file mode 100644
index 0000000000000000000000000000000000000000..f56767b5cc5aed48608d55bcb89e5c721472d175
--- /dev/null
+++ b/tests/spec/Extend_recursive_preprocess.ml
@@ -0,0 +1,83 @@
+open Logic_ptree
+open Logic_const
+open Cil_types
+
+let ext_typing_fooo _typing_context _loc l =
+  let type_lexpr = function
+    | { lexpr_node = PLapp("gl_foo_ok", [], [ _ ]) } -> ptrue
+    | { lexpr_node = PLapp("gl_foo_ko", [], [ _ ]) } -> pfalse
+    | _ -> assert false
+  in
+  Cil_types.Ext_preds (List.map type_lexpr l)
+
+let ext_typing_block typing_context loc_here node =
+  match node.extended_node with
+  | Ext_lexpr (name,data)  ->
+    let status,kind = Logic_typing.get_typer name typing_context node.extended_loc data in
+    Logic_const.new_acsl_extension name loc_here status kind
+  | Ext_extension (name, id, data) ->
+    let status,kind = Logic_typing.get_typer_block name typing_context node.extended_loc (id,data) in
+    Logic_const.new_acsl_extension name loc_here status kind
+
+let  ext_typing_foo typing_context loc (s,d) =
+  let block = List.map (ext_typing_block typing_context loc) d in
+  Cil_types.Ext_annot (s,block)
+
+let preprocess_fooo_ptree_element = function
+  | { lexpr_node = PLapp("must_replace", [], [ v ]) } as x ->
+    { x with lexpr_node = PLapp("gl_foo" ^ "_ok", [], [ v ]) }
+  | { lexpr_node = PLapp("must_not_replace", [], [ v ]) } as x ->
+    { x with lexpr_node = PLapp("gl_foo" ^ "_ko", [], [ v ]) }
+  | _ -> assert false
+
+let preprocess_fooo_ptree = List.map preprocess_fooo_ptree_element
+
+let preprocess_foo_ptree (id,data) = (id ^ "_ok",data)
+
+let ext_fooo_visitor vis ext =
+  let aux p = unamed (Pand(p,p)) in
+  match ext with
+  | Ext_preds pred ->
+    if Visitor_behavior.is_copy vis#behavior then
+      Cil.ChangeTo (Ext_preds (List.map aux pred))
+    else
+      Cil.DoChildren
+  | _ -> assert false
+
+let ext_foo_visitor vis ext =
+  match ext with
+  | Ext_annot _ ->
+    if Visitor_behavior.is_copy vis#behavior then
+      Cil.DoChildrenPost (fun ext ->
+          match ext with
+          | Ext_annot(s, l) -> Ext_annot(s ^ "_ok", l)
+          | _ -> ext)
+    else
+      Cil.DoChildren
+  | _ -> assert false
+
+let ext_fooo_printer prt fmt ext =
+  match ext with
+  | Ext_preds ps ->
+    Pretty_utils.pp_list ~pre:"@[data:" ~sep:",@ " prt#predicate fmt ps
+  | _ -> assert false
+
+let () =  Acsl_extension.register_global
+    "gl_fooo" ~preprocessor:preprocess_fooo_ptree ext_typing_fooo
+    ~printer:ext_fooo_printer ~visitor:ext_fooo_visitor false ;
+  Acsl_extension.register_global_block
+    "gl_foo" ~preprocessor:preprocess_foo_ptree ext_typing_foo
+                              ~visitor:ext_foo_visitor false
+
+let run () =
+  let old = Project.current () in
+  let vis prj = new Visitor.frama_c_copy prj in
+  let final_project =
+    File.create_project_from_visitor ~reorder:true "Test" vis
+  in
+  Project.set_current final_project;
+  File.pretty_ast ();
+  Filecheck.check_ast "Test";
+  Project.set_current old
+
+let () = Db.Main.extend run
diff --git a/tests/spec/Extend_short_print.ml b/tests/spec/Extend_short_print.ml
index 386cc1080b5165c554a3b574e3b3834605e35360..3bc2da1b356c7916b579cc72d42623b0409a4f5b 100644
--- a/tests/spec/Extend_short_print.ml
+++ b/tests/spec/Extend_short_print.ml
@@ -11,4 +11,4 @@ let process_global _ = function
   | Dextended(e, _, _) -> Kernel.feedback "%a" Cil_printer.pp_short_extended e
   | _ -> ()
 
-let () = Db.Main.extend (fun () -> Annotations.iter_global process_global)
\ No newline at end of file
+let () = Db.Main.extend (fun () -> Annotations.iter_global process_global)
diff --git a/tests/spec/acsl_basic_allocator.c b/tests/spec/acsl_basic_allocator.c
index 1390061b451e6a2b32107cebdb3a5b55c065e107..1a0c0b714c7fd2f59d9b676d807e26e8c6dabeef 100644
--- a/tests/spec/acsl_basic_allocator.c
+++ b/tests/spec/acsl_basic_allocator.c
@@ -21,10 +21,10 @@ typedef struct _memory_block {
 } memory_block;
 
 /*@ type invariant inv_memory_block(memory_block mb) =
-  @   0 < mb.size && \offset(mb.data) == 0 && \block_length{Here}(mb.data) == mb.size ;
+  @   0 < mb.size && \offset(mb.data) == 0 && \block_length(mb.data) == mb.size ;
   @*/
 
-/*@ predicate used_memory_block{L}(memory_block mb) = 
+/*@ predicate used_memory_block{L}(memory_block mb) =
   @   mb.free == false && inv_memory_block(mb) ;
   @*/
 
diff --git a/tests/spec/assignable_location.i b/tests/spec/assignable_location.i
index f7165642c352a6b605e3a3bc682e338dad40c2a0..70968c3735ad313c5896d7125e9f350e4c4a509d 100644
--- a/tests/spec/assignable_location.i
+++ b/tests/spec/assignable_location.i
@@ -1,4 +1,4 @@
-/* run.config 
+/* run.config
 OPT: -kernel-warn-key=annot-error=active
 */
 
@@ -18,6 +18,13 @@ double annotations_to_accept(typetab *t) {
   return f(t);
 }
 
+/*@ behavior acc_0: assigns \result \from &x ;
+    behavior acc_1: assigns \result \from &f ;
+*/
+int * from_address_to_accept(int f){
+  return (void*)0 ;
+}
+
 
 int g(void);
 
@@ -39,3 +46,10 @@ int annotations_to_reject(void) {
   //@ behavior to_reject_6: assigns x \from lx;
   return g();
 }
+
+/*@ behavior rej_0: assigns \result \from &l ; */
+int * from_address_to_reject(int f){
+  int l ;
+  //@ behavior rej_1: assigns l \from &lx ;
+  return (void*)0 ;
+}
diff --git a/tests/spec/assigns_const.i b/tests/spec/assigns_const.i
new file mode 100644
index 0000000000000000000000000000000000000000..6aedfe366b91d48a081c137dd41a0ef09c3bb99b
--- /dev/null
+++ b/tests/spec/assigns_const.i
@@ -0,0 +1,31 @@
+int i ;
+int const c ;
+
+//@ assigns i ;
+void accept_non_const(void);
+
+//@ assigns c ;
+void refuse_const(void);
+
+const int a[2];
+
+//@ assigns a[0] ;
+void refuse_const_array(void);
+
+//@ assigns { i, c };
+void refuse_const_in_set(void);
+
+struct X { int const f; };
+struct Y { struct X a[10] ; };
+struct Y y ;
+
+//@ assigns y.a[4].f ;
+void refuse_const_field(void);
+
+//@ assigns (*ptr).a[4].f ;
+void refuse_field_via_pointer(struct Y * ptr);
+
+// Acceptable const assigns:
+
+//@ assigns *ptr ;
+void accept_const_via_pointer(int const * ptr);
diff --git a/tests/spec/assigns_from_kf.i b/tests/spec/assigns_from_kf.i
index a62817ee7bd3984c0670d476d8187611354382e3..d921cdd4e849b73c77465cb88691dc8b70d366ff 100644
--- a/tests/spec/assigns_from_kf.i
+++ b/tests/spec/assigns_from_kf.i
@@ -44,4 +44,4 @@ void reference(void) {
     g_both(0, 1, 0, 2);
     g_both_r(0, 1, 0, 2);
   */
-}
\ No newline at end of file
+}
diff --git a/tests/spec/assigns_from_kf.ml b/tests/spec/assigns_from_kf.ml
index fcab8e135d1e04408c95c695eba44eac20e22173..875006cd3a6d37b85f257a7acae2f2a9d36ca615 100644
--- a/tests/spec/assigns_from_kf.ml
+++ b/tests/spec/assigns_from_kf.ml
@@ -1,4 +1,4 @@
 let run () =
     Globals.Functions.iter (fun kf -> ignore (Annotations.funspec kf))
 
-let () = Db.Main.extend run
\ No newline at end of file
+let () = Db.Main.extend run
diff --git a/tests/spec/boolean_conversion.i b/tests/spec/boolean_conversion.i
new file mode 100644
index 0000000000000000000000000000000000000000..1c815309a3d59eae140fbaf562c456a41d43dc56
--- /dev/null
+++ b/tests/spec/boolean_conversion.i
@@ -0,0 +1,10 @@
+/* run.config*
+MODULE: @PTEST_DIR@/@PTEST_NAME@.cmxs
+STDOPT:
+*/
+void __FC_assert(int c);
+enum a {HA};
+enum a b;
+int main() {
+  __FC_assert(!b);
+}
diff --git a/tests/spec/boolean_conversion.ml b/tests/spec/boolean_conversion.ml
new file mode 100644
index 0000000000000000000000000000000000000000..a2071303368c92bef6b1bcec891ca5ca807a365e
--- /dev/null
+++ b/tests/spec/boolean_conversion.ml
@@ -0,0 +1,22 @@
+open Cil_types
+
+let e = Emitter.(create "test" [ Code_annot ] ~correctness:[] ~tuning:[])
+
+let run () =
+  Ast.compute();
+  let vis = object(self)
+    inherit Visitor.frama_c_inplace
+    method! vinst =
+      function
+      | Call(_,{enode=Lval(Var f,NoOffset)},[arg],_)
+        when f.vname = "__FC_assert" ->
+        let p = Logic_utils.expr_to_predicate arg in
+        Annotations.add_assert e (Option.get self#current_stmt) p;
+        Cil.SkipChildren
+      | _ -> Cil.SkipChildren
+  end
+  in
+  Visitor.visitFramacFileSameGlobals vis (Ast.get());
+  Filecheck.check_ast "Test"
+
+let () = Db.Main.extend run
diff --git a/tests/spec/float-acsl.i b/tests/spec/float-acsl.i
index 41ef751a5c4be79fe7cdd8b12d24b6fd927896b7..8aa4081d0234c937e256ac53c1f7b79177c15468 100644
--- a/tests/spec/float-acsl.i
+++ b/tests/spec/float-acsl.i
@@ -36,3 +36,9 @@ void main() {
   float monef = minus_onef();
 }
 
+/*@ requires 0. == -f;
+    requires 0. == f + (-f);
+    requires 0. == -d;
+    requires 0. == d + (-d);
+*/
+void unop_coerce(float f, double d);
diff --git a/tests/spec/generalized_check.i b/tests/spec/generalized_check.i
index 7b14a568815610ecd9de3677b00b6b739736a101..d667336c3b38a16eb43e8302462cd6f2e6d9ff1f 100644
--- a/tests/spec/generalized_check.i
+++ b/tests/spec/generalized_check.i
@@ -1,8 +1,14 @@
 /* run.config
+<<<<<<< HEAD
 PLUGIN: @EVA_PLUGINS@
+||||||| ac7807782d
+OPT: -wp -wp-prover qed -wp-msg-key shell
+=======
+>>>>>>> origin/master
 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);
diff --git a/tests/spec/location_char.ml b/tests/spec/location_char.ml
index 981839b0ba83e12967bdd4dbfe54949bb2561409..335700d2f5108e080ce20cdfef723dc76ed0d324 100644
--- a/tests/spec/location_char.ml
+++ b/tests/spec/location_char.ml
@@ -9,7 +9,7 @@ class print_term = object(self)
   inherit Visitor.frama_c_inplace
 
   method private should_print =
-    let n = Kernel_function.get_name (Extlib.the self#current_kf) in
+    let n = Kernel_function.get_name (Option.get self#current_kf) in
     n = "f" || n = "main"
 
   method! vterm v =
diff --git a/tests/spec/logic_functions_sets.ml b/tests/spec/logic_functions_sets.ml
index 0eb5f933fd72a4e91afd78a35747fdd40008009f..f4b2847fec3e10ff5d3b6fd673406b363e403ffd 100644
--- a/tests/spec/logic_functions_sets.ml
+++ b/tests/spec/logic_functions_sets.ml
@@ -2,7 +2,7 @@ open Cil_types
 
 let check = function
   | Dfun_or_pred (li, _) ->
-    let decl_type = Extlib.the li.l_type in
+    let decl_type = Option.get li.l_type in
     let body_type = match li.l_body with
       | LBterm t -> t.term_type
       | _ -> assert false
@@ -13,4 +13,4 @@ let check = function
   | _ -> ()
 
 let () =
-  Db.Main.extend (fun () -> Annotations.iter_global (fun _ g -> check g))
\ No newline at end of file
+  Db.Main.extend (fun () -> Annotations.iter_global (fun _ g -> check g))
diff --git a/tests/spec/oracle/Extend_recursive_preprocess.res.oracle b/tests/spec/oracle/Extend_recursive_preprocess.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..73af51bd109cdddc1b864db092bf7826a23bbee6
--- /dev/null
+++ b/tests/spec/oracle/Extend_recursive_preprocess.res.oracle
@@ -0,0 +1,62 @@
+[kernel] Parsing tests/spec/Extend_recursive_preprocess.i (no preprocessing)
+/* Generated by Frama-C */
+/*@
+gl_foo foo1_ok_ok {
+  gl_fooo data:\true ∧ \true;
+  gl_fooo data:\false ∧ \false;
+  gl_fooo data:\true ∧ \true;
+  }
+*/
+/*@
+gl_foo foo1_ok_ok {
+  gl_foo foo2_ok_ok {
+    gl_fooo data:\true ∧ \true;
+    gl_fooo data:\false ∧ \false;
+    }
+  }
+*/
+/*@
+gl_foo foo1_ok_ok {
+  gl_fooo data:\true ∧ \true;
+  gl_foo foo2_ok_ok {
+    gl_fooo data:\true ∧ \true;
+    gl_foo foo3_ok_ok {
+      gl_fooo data:\true ∧ \true;
+      gl_fooo data:\false ∧ \false;
+      }
+    gl_fooo data:\true ∧ \true;
+    }
+  gl_fooo data:\false ∧ \false;
+  }
+*/
+
+/* Generated by Frama-C */
+/*@
+gl_foo foo1_ok {
+  gl_fooo data:\true;
+  gl_fooo data:\false;
+  gl_fooo data:\true;
+  }
+*/
+/*@ gl_foo foo1_ok {
+      gl_foo foo2_ok {
+        gl_fooo data:\true;
+        gl_fooo data:\false;
+        }
+      }
+*/
+/*@
+gl_foo foo1_ok {
+  gl_fooo data:\true;
+  gl_foo foo2_ok {
+    gl_fooo data:\true;
+    gl_foo foo3_ok {
+      gl_fooo data:\true;
+      gl_fooo data:\false;
+      }
+    gl_fooo data:\true;
+    }
+  gl_fooo data:\false;
+  }
+*/
+
diff --git a/tests/spec/oracle/assignable_location.res.oracle b/tests/spec/oracle/assignable_location.res.oracle
index 43aec8f2843d2a74125606458a2ab449ea22c65a..a54ad3a7ba16f4ecdd2342807983a1078d56a82f 100644
--- a/tests/spec/oracle/assignable_location.res.oracle
+++ b/tests/spec/oracle/assignable_location.res.oracle
@@ -1,22 +1,90 @@
+<<<<<<< HEAD
 [kernel] Parsing assignable_location.i (no preprocessing)
 [kernel:annot-error] assignable_location.i:36: Warning: unexpected token ';'
 [kernel:annot-error] assignable_location.i:28: Warning: 
+||||||| ac7807782d
+[kernel] Parsing tests/spec/assignable_location.i (no preprocessing)
+[kernel:annot-error] tests/spec/assignable_location.i:36: Warning: 
+  unexpected token ';'
+[kernel:annot-error] tests/spec/assignable_location.i:28: Warning: 
+=======
+[kernel] Parsing tests/spec/assignable_location.i (no preprocessing)
+[kernel:annot-error] tests/spec/assignable_location.i:43: Warning: 
+  unexpected token ';'
+[kernel:annot-error] tests/spec/assignable_location.i:35: Warning: 
+>>>>>>> origin/master
   not an addressable left value: \result. Ignoring logic specification of function annotations_to_reject
+<<<<<<< HEAD
 [kernel:annot-error] assignable_location.i:30: Warning: 
+||||||| ac7807782d
+[kernel:annot-error] tests/spec/assignable_location.i:30: Warning: 
+=======
+[kernel:annot-error] tests/spec/assignable_location.i:37: Warning: 
+>>>>>>> origin/master
   not an assignable left value: *t. Ignoring code annotation
+<<<<<<< HEAD
 [kernel:annot-error] assignable_location.i:31: Warning: 
+||||||| ac7807782d
+[kernel:annot-error] tests/spec/assignable_location.i:31: Warning: 
+=======
+[kernel:annot-error] tests/spec/assignable_location.i:38: Warning: 
+>>>>>>> origin/master
   not an assignable left value: *(t + 0). Ignoring code annotation
+<<<<<<< HEAD
 [kernel:annot-error] assignable_location.i:32: Warning: 
+||||||| ac7807782d
+[kernel:annot-error] tests/spec/assignable_location.i:32: Warning: 
+=======
+[kernel:annot-error] tests/spec/assignable_location.i:39: Warning: 
+>>>>>>> origin/master
   not an assignable left value: *(t + (0 .. 0)). Ignoring code annotation
+<<<<<<< HEAD
 [kernel:annot-error] assignable_location.i:33: Warning: 
+||||||| ac7807782d
+[kernel:annot-error] tests/spec/assignable_location.i:33: Warning: 
+=======
+[kernel:annot-error] tests/spec/assignable_location.i:40: Warning: 
+>>>>>>> origin/master
   not an assignable left value: (int)x. Ignoring code annotation
+<<<<<<< HEAD
 [kernel:annot-error] assignable_location.i:34: Warning: 
+||||||| ac7807782d
+[kernel:annot-error] tests/spec/assignable_location.i:34: Warning: 
+=======
+[kernel:annot-error] tests/spec/assignable_location.i:41: Warning: 
+>>>>>>> origin/master
   not an assignable left value: (char)x. Ignoring code annotation
+<<<<<<< HEAD
 [kernel:annot-error] assignable_location.i:35: Warning: 
+||||||| ac7807782d
+[kernel:annot-error] tests/spec/assignable_location.i:35: Warning: 
+=======
+[kernel:annot-error] tests/spec/assignable_location.i:42: Warning: 
+>>>>>>> origin/master
   not an addressable left value: (char)x. Ignoring code annotation
+<<<<<<< HEAD
 [kernel:annot-error] assignable_location.i:37: Warning: 
+||||||| ac7807782d
+[kernel:annot-error] tests/spec/assignable_location.i:37: Warning: 
+=======
+[kernel:annot-error] tests/spec/assignable_location.i:44: Warning: 
+>>>>>>> origin/master
   not an addressable left value: \empty. Ignoring code annotation
+<<<<<<< HEAD
 [kernel:annot-error] assignable_location.i:38: Warning: 
   not an assignable left value: lx. Ignoring code annotation
 [kernel:annot-error] assignable_location.i:39: Warning: 
+||||||| ac7807782d
+[kernel:annot-error] tests/spec/assignable_location.i:38: Warning: 
   not an assignable left value: lx. Ignoring code annotation
+[kernel:annot-error] tests/spec/assignable_location.i:39: Warning: 
+=======
+[kernel:annot-error] tests/spec/assignable_location.i:45: Warning: 
+>>>>>>> origin/master
+  not an assignable left value: lx. Ignoring code annotation
+[kernel:annot-error] tests/spec/assignable_location.i:46: Warning: 
+  not a valid dependency: lx. Ignoring code annotation
+[kernel:annot-error] tests/spec/assignable_location.i:50: Warning: 
+  unbound logic variable l. Ignoring logic specification of function from_address_to_reject
+[kernel:annot-error] tests/spec/assignable_location.i:53: Warning: 
+  not an addressable left value: lx. Ignoring code annotation
diff --git a/tests/spec/oracle/assigns_const.res.oracle b/tests/spec/oracle/assigns_const.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..9279fd42e107faf983ef6d2e83d2b96081a57afd
--- /dev/null
+++ b/tests/spec/oracle/assigns_const.res.oracle
@@ -0,0 +1,29 @@
+[kernel] Parsing tests/spec/assigns_const.i (no preprocessing)
+[kernel:annot-error] tests/spec/assigns_const.i:7: Warning: 
+  not an assignable left value: c. Ignoring specification of function refuse_const
+[kernel:annot-error] tests/spec/assigns_const.i:12: Warning: 
+  not an assignable left value: a[0]. Ignoring specification of function refuse_const_array
+[kernel:annot-error] tests/spec/assigns_const.i:15: Warning: 
+  not an assignable left value: {i, c}. Ignoring specification of function refuse_const_in_set
+[kernel:annot-error] tests/spec/assigns_const.i:22: Warning: 
+  not an assignable left value: y.a[4].f. Ignoring specification of function refuse_const_field
+[kernel:annot-error] tests/spec/assigns_const.i:25: Warning: 
+  not an assignable left value: ptr->a[4].f. Ignoring specification of function refuse_field_via_pointer
+/* Generated by Frama-C */
+struct X {
+   int const f ;
+};
+struct Y {
+   struct X a[10] ;
+};
+int i;
+int const c;
+/*@ assigns i; */
+void accept_non_const(void);
+
+int const a[2];
+struct Y y;
+/*@ assigns *ptr; */
+void accept_const_via_pointer(int const *ptr);
+
+
diff --git a/tests/spec/oracle/boolean_conversion.res.oracle b/tests/spec/oracle/boolean_conversion.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..293127a887e8872906ad8fae312a61e0e638c290
--- /dev/null
+++ b/tests/spec/oracle/boolean_conversion.res.oracle
@@ -0,0 +1,18 @@
+[kernel] Parsing tests/spec/boolean_conversion.i (no preprocessing)
+/* Generated by Frama-C */
+enum a {
+    HA = 0
+};
+void __FC_assert(int c);
+
+enum a b;
+int main(void)
+{
+  int __retres;
+  /*@ assert test: ¬(b ≢ 0); */
+  __FC_assert(! b);
+  __retres = 0;
+  return __retres;
+}
+
+
diff --git a/tests/spec/oracle/float-acsl.res.oracle b/tests/spec/oracle/float-acsl.res.oracle
index 9ba8821e6c0ec19b3be2472706b92afa9be0c624..58ab43bf2c292f3c0668ad6f90cc72f01335307e 100644
--- a/tests/spec/oracle/float-acsl.res.oracle
+++ b/tests/spec/oracle/float-acsl.res.oracle
@@ -42,4 +42,11 @@ void main(void)
   return;
 }
 
+/*@ requires 0. ≡ -(ℝ)f;
+    requires 0. ≡ (ℝ)f + -(ℝ)f;
+    requires 0. ≡ -(ℝ)d;
+    requires 0. ≡ (ℝ)d + -(ℝ)d;
+ */
+void unop_coerce(float f, double d);
+
 
diff --git a/tests/spec/oracle/generalized_check.0.res.oracle b/tests/spec/oracle/generalized_check.0.res.oracle
index e0157ff77949b316035398d944a929ae48fec420..315619afdb738cd6a53de8e4f552d201159f46c2 100644
--- a/tests/spec/oracle/generalized_check.0.res.oracle
+++ b/tests/spec/oracle/generalized_check.0.res.oracle
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
 [kernel] Parsing generalized_check.i (no preprocessing)
 [eva] Analyzing a complete application starting at main
 [eva] Computing initial state
@@ -44,3 +45,77 @@
     Preconditions     0 valid     1 unknown     0 invalid      1 total
   0% of the logical properties reached have been proven.
   ----------------------------------------------------------------------------
+||||||| ac7807782d
+# 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
+=======
+[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.
+  ----------------------------------------------------------------------------
+>>>>>>> origin/master
diff --git a/tests/spec/oracle/generalized_check.1.res.oracle b/tests/spec/oracle/generalized_check.1.res.oracle
index 7e0503ac2ae81e3733b87703e497dee35f843332..a3be4ae11b892adcd51e3e1fcc14009ce8fc456a 100644
--- a/tests/spec/oracle/generalized_check.1.res.oracle
+++ b/tests/spec/oracle/generalized_check.1.res.oracle
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
 [kernel] Parsing generalized_check.i (no preprocessing)
 /* Generated by Frama-C */
 /*@ check lemma easy_proof: \false;
@@ -49,3 +50,104 @@ void loop(void)
 }
 
 
+||||||| ac7807782d
+[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.
+  ----------------------------------------------------------------------------
+=======
+[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;
+}
+
+
+>>>>>>> origin/master
diff --git a/tests/spec/oracle/qarrsize.res.oracle b/tests/spec/oracle/qarrsize.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..093a9470ebbf0e1df7d673557bcdca82d209de80
--- /dev/null
+++ b/tests/spec/oracle/qarrsize.res.oracle
@@ -0,0 +1,19 @@
+[kernel] Parsing tests/spec/qarrsize.c (with preprocessing)
+/* Generated by Frama-C */
+int a[0xFFu];
+int b[128L];
+int c[0x8A];
+int d['r'];
+int sa = (int)sizeof(int [0xFFu]);
+int sb = (int)sizeof(int [128L]);
+int sc = (int)sizeof(int [0x8A]);
+int sd = (int)sizeof(int ['r']);
+/*@ requires \valid(n + (0 .. sizeof(int [0xFFu])));
+    requires \valid(p + (0 .. sizeof(int [128L])));
+    requires \valid(q + (0 .. sizeof(int [0x8A])));
+    requires \valid(r + (0 .. sizeof(int ['r'])));
+    assigns \nothing;
+ */
+void f(int *n, int *p, int *q, int *r);
+
+
diff --git a/tests/spec/oracle/reset_env.res.oracle b/tests/spec/oracle/reset_env.res.oracle
index aefb89f81ffe13df80473999ef2dd3745b842962..7acf6291108c410b2810db6d22cb07708b3ba4f9 100644
--- a/tests/spec/oracle/reset_env.res.oracle
+++ b/tests/spec/oracle/reset_env.res.oracle
@@ -1,7 +1,15 @@
 [kernel] Parsing reset_env.i (no preprocessing)
 [kernel:annot-error] reset_env.i:5: Warning: 
   unbound logic variable INEXISTENT_SYMBOL. Ignoring global annotation
+<<<<<<< HEAD
 [kernel:annot-error] reset_env.i:9: Warning: 
   unbound function bla. Ignoring specification of function f
+||||||| ac7807782d
+[kernel:annot-error] tests/spec/reset_env.i:9: Warning: 
+  unbound function bla. Ignoring specification of function f
+=======
+[kernel:annot-error] tests/spec/reset_env.i:9: Warning: 
+  unbound logic function bla. Ignoring specification of function f
+>>>>>>> origin/master
 /* Generated by Frama-C */
 
diff --git a/tests/spec/property_test.ml b/tests/spec/property_test.ml
index 443e8cefd62dc590c13935476210378f744f6037..9be9b8114bedc86a765e346bb25cafc41490f591 100644
--- a/tests/spec/property_test.ml
+++ b/tests/spec/property_test.ml
@@ -8,7 +8,7 @@ class visit prj =
   object(self)
     inherit Visitor.frama_c_copy prj
     method! vbehavior b =
-      let kf = Extlib.the self#current_kf in
+      let kf = Option.get self#current_kf in
       if Kernel_function.get_name kf = "main" then begin
         let x = Globals.Vars.find_from_astinfo "X" VGlobal in
         let x = Cil.cvar_to_lvar x in
@@ -35,7 +35,7 @@ class visit prj =
     method! vstmt_aux stmt =
       match stmt.skind with
       | Return _ ->
-        let kf = Extlib.the self#current_kf in
+        let kf = Option.get self#current_kf in
         let requires = [ Logic_const.new_predicate (Logic_const.ptrue) ] in
         let post_cond =
           [ Normal, Logic_const.new_predicate (Logic_const.pfalse) ]
diff --git a/tests/spec/qarrsize.c b/tests/spec/qarrsize.c
new file mode 100644
index 0000000000000000000000000000000000000000..169f12ed03882499ea1726968ebd3e74fedaf895
--- /dev/null
+++ b/tests/spec/qarrsize.c
@@ -0,0 +1,30 @@
+// Qualified Type-Array Size
+
+#define N 0xFFu
+#define P 128L
+#define Q 0x8A
+#define R 'r'
+
+int a[N];
+int b[P];
+int c[Q];
+int d[R];
+
+typedef int Ta[N];
+typedef int Tb[P];
+typedef int Tc[Q];
+typedef int Td[R];
+
+int sa = sizeof(int[N]);
+int sb = sizeof(int[P]);
+int sc = sizeof(int[Q]);
+int sd = sizeof(int[R]);
+
+/*@
+  requires \valid(n + (0 .. sizeof(int[N])));
+  requires \valid(p + (0 .. sizeof(int[P])));
+  requires \valid(q + (0 .. sizeof(int[Q])));
+  requires \valid(r + (0 .. sizeof(int[R])));
+  assigns \nothing;
+ */
+void f(int *n, int *p, int *q, int* r);
diff --git a/tests/spec/test_config b/tests/spec/test_config
index 3451196c9530eca938c5827b1e4e89ed5d208693..b95d8ceb668dfc65a56721621cc71f560d2af3c1 100644
--- a/tests/spec/test_config
+++ b/tests/spec/test_config
@@ -1,6 +1,7 @@
 COMMENT: for now, this directory mainly tests the annotations syntax.
 COMMENT: we continue on annotation errors, as this allows to put
 COMMENT: various variations of the same test in one file.
+<<<<<<< HEAD
 COMMENT: by default, no analysis is performed (since the PLUGIN directive
 COMMENT: is empty).
 COMMENT: to perform value analyses, the macro @EVA_PLUGINS@ (resp. @EVA_OPTIONS@)
@@ -8,3 +9,8 @@ COMMENT: can be used into PLUGIN (resp. OPT) directives of specific test files.
 
 PLUGIN:
 OPT: -pp-annot -print -kernel-warn-key=annot-error=active -machdep x86_32
+||||||| ac7807782d
+OPT: -pp-annot -print -journal-disable -kernel-warn-key=annot-error=active -check
+=======
+OPT: -pp-annot -print -journal-disable -kernel-warn-key=annot-error=active -check -machdep x86_32
+>>>>>>> origin/master
diff --git a/tests/syntax/anon_enum_libc.c b/tests/syntax/anon_enum_libc.c
index 8ab5eeec2c97fd9e3ac2c4ffa9e692049b516920..60b470c1fe643c34fdb4f4240ca0bd93ee702c75 100644
--- a/tests/syntax/anon_enum_libc.c
+++ b/tests/syntax/anon_enum_libc.c
@@ -1,7 +1,15 @@
 /* run.config
+<<<<<<< HEAD
 DEPS: anon_enum_libc.h
 FILTER: sed -e 's|#include *"\([^/]*[/]\)*\([^/]*\)"|#include "PTESTS_DIR/\2"|'
 OPT: -cpp-extra-args="-I ." -ocode ocode_@PTEST_NUMBER@_@PTEST_NAME@.c -print -then -ocode="" ocode_@PTEST_NUMBER@_@PTEST_NAME@.c -print
+||||||| ac7807782d
+FILTER: sed -e 's|#include *"\([^/]*[/]\)*\([^/]*\)"|#include "PTESTS_DIR/\2"|'
+OPT: -cpp-extra-args="-I @PTEST_DIR@" -ocode @PTEST_DIR@/result/@PTEST_NAME@.c -print -then -ocode="" @PTEST_DIR@/result/@PTEST_NAME@.c -print
+=======
+
+OPT: -cpp-extra-args="-I @PTEST_DIR@" -ocode @PTEST_DIR@/result/@PTEST_NAME@.c -print -then -ocode="" @PTEST_DIR@/result/@PTEST_NAME@.c -print
+>>>>>>> origin/master
 */
 struct { int x; float y; } s1;
 
diff --git a/tests/syntax/copy_visitor_bts_1073.ml b/tests/syntax/copy_visitor_bts_1073.ml
index a8bf07b17d614fc3f967f5aebdc594039b47403d..d057ae1f8327c8b9dc043b61cc4fe3feb1133837 100644
--- a/tests/syntax/copy_visitor_bts_1073.ml
+++ b/tests/syntax/copy_visitor_bts_1073.ml
@@ -7,7 +7,7 @@ object(self)
   method! vglob_aux g =
     match g with
       | GFun (f,loc) ->
-        let my_kf = Extlib.the self#current_kf in
+        let my_kf = Option.get self#current_kf in
         let f1 = Visitor.visitFramacFunction (self:>Visitor.frama_c_visitor) f
         in
         let v2 = Cil.copyVarinfo f.svar (f.svar.vname ^ "1") in
diff --git a/tests/syntax/cpp-command.c b/tests/syntax/cpp-command.c
index 17a90fb779652ef9433d7da1bf261851c13aff3b..ea2789c87f34588702f58dfe2f029b56b5c9cfc1 100644
--- a/tests/syntax/cpp-command.c
+++ b/tests/syntax/cpp-command.c
@@ -1,8 +1,24 @@
 /* run.config*
+<<<<<<< HEAD
    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: -machdep x86_32 -cpp-frama-c-compliant -cpp-command "echo [\$(basename '%1') \$(basename '%1') \$(basename '%i') \$(basename '%input')] ['%2' '%2' '%o' '%output'] ['%args']"
    OPT: -machdep x86_32 -cpp-frama-c-compliant -cpp-command "echo %%1 = \$(basename '%1') %%2 = '%2' %%args = '%args'"
    OPT: -machdep x86_32 -cpp-frama-c-compliant -cpp-command "printf \"%s\" \"using \\% has no effect : \$(basename \"\%input\")\""
    OPT: -machdep x86_32 -cpp-frama-c-compliant -cpp-command "echo %var is not an interpreted placeholder"
    OPT: -machdep x86_32 -print-cpp-commands
+||||||| ac7807782d
+   FILTER: sed "s:/\(tmp\|var\|build\)/[^ ]*\.i:/tmp/FILE.i:g; s:$PWD/::"
+   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
+=======
+   FILTER: sed "s:/[^ ]*/cpp-command\.[^ ]*\.i:TMPDIR/FILE.i:g; s:$PWD/::; s: -m32::"
+   OPT: -machdep x86_32 -no-autoload-plugins -cpp-frama-c-compliant -cpp-command "echo [\$(basename '%1') \$(basename '%1') \$(basename '%i') \$(basename '%input')] ['%2' '%2' '%o' '%output'] ['%args']"
+   OPT: -machdep x86_32 -no-autoload-plugins -cpp-frama-c-compliant -cpp-command "echo %%1 = \$(basename '%1') %%2 = '%2' %%args = '%args'"
+   OPT: -machdep x86_32 -no-autoload-plugins -cpp-frama-c-compliant -cpp-command "printf \"%s\n\" \"using \\% has no effect : \$(basename \"\%input\")\""
+   OPT: -machdep x86_32 -no-autoload-plugins -cpp-frama-c-compliant -cpp-command "echo %var is not an interpreted placeholder"
+   OPT: -machdep x86_32 -no-autoload-plugins -print-cpp-commands
+>>>>>>> origin/master
    */
diff --git a/tests/syntax/enum_repr.i b/tests/syntax/enum_repr.i
index aa311e5edf9ecf0ce80402f743126d3f42cd47e6..5de4cbef7260e574030041b72ef6ed203dc73f98 100644
--- a/tests/syntax/enum_repr.i
+++ b/tests/syntax/enum_repr.i
@@ -1,11 +1,23 @@
 /* run.config
+<<<<<<< HEAD
 MODULE: Enum_repr
 STDOPT: #"-enums int"
 STDOPT: #"-enums gcc-short-enums"
 STDOPT: #"-enums gcc-enums"
+||||||| ac7807782d
+EXECNOW: make -s tests/syntax/Enum_repr.cmxs
+OPT: -load-module tests/syntax/Enum_repr.cmxs -enums int -print
+OPT: -load-module tests/syntax/Enum_repr.cmxs -enums gcc-short-enums -print
+OPT: -load-module tests/syntax/Enum_repr.cmxs -enums gcc-enums -print
+=======
+EXECNOW: make -s tests/syntax/Enum_repr.cmxs
+OPT: -machdep x86_32 -load-module tests/syntax/Enum_repr.cmxs -enums int -print
+OPT: -machdep x86_32 -load-module tests/syntax/Enum_repr.cmxs -enums gcc-short-enums -print
+OPT: -machdep x86_32 -load-module tests/syntax/Enum_repr.cmxs -enums gcc-enums -print
+>>>>>>> origin/master
 */
 
-// is represented by | int | gcc-enums          | gcc-short-enums 
+// is represented by | int | gcc-enums          | gcc-short-enums
 // foo               | int | unsigned int       | unsigned char
 // bar               | int | unsigned char      | unsigned char
 // bu1               | int | unsigned int       | unsigned int
diff --git a/tests/syntax/field-offsets.c b/tests/syntax/field-offsets.c
index dd972c8418ed4e042d4e2912312e7c538ea9599c..e29ff5e8e83a2e2cf667507ea5e185c214c54f8d 100644
--- a/tests/syntax/field-offsets.c
+++ b/tests/syntax/field-offsets.c
@@ -13,7 +13,7 @@ struct st {
 struct fam {
   int a;
   char b;
-  int fam[]; // check that a SizeOfError exception does not crash the printer
+  int fam[]; // check that the printer handles flexible arrays members
 };
 
 int main() {
diff --git a/tests/syntax/ghost_cv_var_decl.ml b/tests/syntax/ghost_cv_var_decl.ml
index b2baec811fdea011ed4111a1d856996604c6d870..7d60ff48a6af560db9cd0ab88973b7b2ebfc090a 100644
--- a/tests/syntax/ghost_cv_var_decl.ml
+++ b/tests/syntax/ghost_cv_var_decl.ml
@@ -47,7 +47,7 @@ and comp_ghost_status fmt lval =
   match Cil.typeOfLval lval with
   | TComp({ cfields }, _, _) ->
     Format.fprintf fmt "{ " ;
-    List.iter (field_ghost_status fmt lval) cfields ;
+    List.iter (field_ghost_status fmt lval) (Option.value ~default:[] cfields) ;
     Format.fprintf fmt " }"
   | _ -> assert false
 and field_ghost_status fmt lval f =
diff --git a/tests/syntax/gnu-asm-aesni.c b/tests/syntax/gnu-asm-aesni.c
index 57f21d3dc98c7b9c984f0e4f43bd4eba384026c1..1e2b0f7f4526aa2e71a85d9f31114959b086f0dc 100644
--- a/tests/syntax/gnu-asm-aesni.c
+++ b/tests/syntax/gnu-asm-aesni.c
@@ -7,7 +7,7 @@
    COMMENT: TEST_TITLE: Chiffrement via AES-NI
    COMMENT: TEST_MAIN: encrypt_aesni
    COMMENT: TEST_DESCRIPTION: Un message de 64 octets est initialisé à une valeur précise. Le nombre de tours est fixé à 12 et la clé de chiffrement étendue est initialisée à une valeur abstraite. L'appel à la fonction do_aesni_enc effectue le chiffrement et place le résultat à l'adresse mémoire pointée par le paramètre b. On vérifie ensuite que les cases du tableau b ont bien été initialisées et que le tableau a n'a pas été modifié.
-   OPT: -cpp-extra-args='-DUSE_AESNI' -print
+   OPT: -machdep x86_32 -cpp-extra-args='-DUSE_AESNI' -print
    -------------------------
 */
 #ifdef __FRAMAC__
diff --git a/tests/syntax/local-init-const.i b/tests/syntax/local-init-const.i
new file mode 100644
index 0000000000000000000000000000000000000000..1d79724df761cbe3b412972bc0fb43c3fd156ea1
--- /dev/null
+++ b/tests/syntax/local-init-const.i
@@ -0,0 +1,9 @@
+/*run.config
+  OPT: -no-autoload-plugins -load-module eva,scope -eva -eva-verbose 0
+ */
+unsigned id(unsigned x) { return x; }
+
+void main() {
+  unsigned const r = id(1 > 2 ? 1 : 2);
+  //@ assert written_r: r == 2;
+}
diff --git a/tests/syntax/multiple_assigns.i b/tests/syntax/multiple_assigns.i
new file mode 100644
index 0000000000000000000000000000000000000000..d20a1dfcda46f0720ce70523677b4472dd709f80
--- /dev/null
+++ b/tests/syntax/multiple_assigns.i
@@ -0,0 +1,10 @@
+int z;
+
+/*@ assigns z, z;
+    assigns z \from z;
+    assigns z, z;
+ */
+void function(void)
+{
+  return;
+}
diff --git a/tests/syntax/multiple_froms.i b/tests/syntax/multiple_froms.i
new file mode 100644
index 0000000000000000000000000000000000000000..6a0a25687f9e2960e533cbec4ac5dbc0dc21e286
--- /dev/null
+++ b/tests/syntax/multiple_froms.i
@@ -0,0 +1,17 @@
+int a, b, c, d, e;
+
+// Reminder: assigns are visited in reverse
+
+/*@ assigns a;
+    assigns a \from a, a, b, c, c; // more precise so replace the next one
+    assigns a \from c, b, d, e, a;
+    assigns a;
+    assigns b \from a, e, b, d, c; // is ignored because the next one is more precise
+    assigns b \from a, e;
+    assigns c \from c, c, c, c, c; // both are kept (no inclusion)
+    assigns c \from d;
+ */
+void function(void)
+{
+  return;
+}
diff --git a/tests/syntax/no-print-libc-reparse.c b/tests/syntax/no-print-libc-reparse.c
index 3bb87d76d198d836e4da4588091017f137e0d064..bdb9005bf5091369e64fe1fdf3d3190e64d599e6 100644
--- a/tests/syntax/no-print-libc-reparse.c
+++ b/tests/syntax/no-print-libc-reparse.c
@@ -1,5 +1,11 @@
 /*run.config
+<<<<<<< HEAD
   STDOPT: +"-no-print-libc -print -ocode ocode_@PTEST_NUMBER@_@PTEST_NAME@.c -then ocode_@PTEST_NUMBER@_@PTEST_NAME@.c"
+||||||| ac7807782d
+  STDOPT: #"-no-print-libc -print -ocode @PTEST_DIR@/result/ocode_@PTEST_NUMBER@_@PTEST_NAME@.c -then @PTEST_DIR@/result/ocode_@PTEST_NUMBER@_@PTEST_NAME@.c"
+=======
+  STDOPT: +"-no-print-libc -print -ocode @PTEST_DIR@/result/ocode_@PTEST_NUMBER@_@PTEST_NAME@.c -then @PTEST_DIR@/result/ocode_@PTEST_NUMBER@_@PTEST_NAME@.c"
+>>>>>>> origin/master
 */
 
 // tests that using -no-print-libc on a file with an enum produces output that
diff --git a/tests/syntax/offset.c b/tests/syntax/offset.c
index 271b4450362ee830e85f0c9cb93d6903e21066e8..39b1c35f8c49f9e2b5b7409e72c756873e646e5d 100644
--- a/tests/syntax/offset.c
+++ b/tests/syntax/offset.c
@@ -1,5 +1,5 @@
 /* run.config
-OPT: -cpp-extra-args="-Ishare/libc" -print
+OPT: -machdep x86_32 -cpp-extra-args="-Ishare/libc" -print
 */
 
 #include "__fc_define_off_t.h"
diff --git a/tests/syntax/oracle/anon_enum_libc.res.oracle b/tests/syntax/oracle/anon_enum_libc.res.oracle
index ebe1e0a361983404397ebb82a1a1a2569c7e06b9..8334bd24f805dc57217abd6bca1d41944e56501b 100644
--- a/tests/syntax/oracle/anon_enum_libc.res.oracle
+++ b/tests/syntax/oracle/anon_enum_libc.res.oracle
@@ -1,7 +1,7 @@
 [kernel] Parsing anon_enum_libc.c (with preprocessing)
 [kernel] Parsing ocode_0_anon_enum_libc.c (with preprocessing)
 /* Generated by Frama-C */
-#include "PTESTS_DIR/anon_enum_libc.h"
+#include "tests/syntax/anon_enum_libc.h"
 struct __anonstruct_s1_1 {
    int x ;
    float y ;
diff --git a/tests/syntax/oracle/check_builtin_bts1440.res.oracle b/tests/syntax/oracle/check_builtin_bts1440.res.oracle
index 2f9ee2c0dfe1add406b78f43cab6f962cedc06c0..371623db3a3a09a3f631d1f294940b27adb9e41b 100644
--- a/tests/syntax/oracle/check_builtin_bts1440.res.oracle
+++ b/tests/syntax/oracle/check_builtin_bts1440.res.oracle
@@ -2,6 +2,8 @@
 [kernel:file:print-one] 
   result of parsing check_builtin_bts1440.i:
   /* Generated by Frama-C */
+  void __builtin__Exit(int);
+  
   int __builtin___fprintf_chk(void *, int, char const * , ...);
   
   void *__builtin___memcpy_chk(void *, void const *, unsigned int, unsigned int);
@@ -43,10 +45,18 @@
   int __builtin___vsprintf_chk(char *, int, unsigned int, char const *,
                                __builtin_va_list);
   
+  int __builtin_abs(int);
+  
   double __builtin_acos(double);
   
   float __builtin_acosf(float);
   
+  double __builtin_acosh(double);
+  
+  float __builtin_acoshf(float);
+  
+  long double __builtin_acoshl(long double);
+  
   long double __builtin_acosl(long double);
   
   void *__builtin_alloca(unsigned int);
@@ -55,6 +65,12 @@
   
   float __builtin_asinf(float);
   
+  double __builtin_asinh(double);
+  
+  float __builtin_asinhf(float);
+  
+  long double __builtin_asinhl(long double);
+  
   long double __builtin_asinl(long double);
   
   double __builtin_atan(double);
@@ -67,6 +83,12 @@
   
   float __builtin_atanf(float);
   
+  double __builtin_atanh(double);
+  
+  float __builtin_atanhf(float);
+  
+  long double __builtin_atanhl(long double);
+  
   long double __builtin_atanl(long double);
   
   unsigned short __builtin_bswap16(unsigned short);
@@ -75,6 +97,14 @@
   
   unsigned long long __builtin_bswap64(unsigned long long);
   
+  void *__builtin_calloc(unsigned int, unsigned int);
+  
+  double __builtin_cbrt(double);
+  
+  float __builtin_cbrtf(float);
+  
+  long double __builtin_cbrtl(long double);
+  
   double __builtin_ceil(double);
   
   float __builtin_ceilf(float);
@@ -83,6 +113,12 @@
   
   int __builtin_constant_p(int);
   
+  double __builtin_copysign(double, double);
+  
+  float __builtin_copysignf(float, float);
+  
+  long double __builtin_copysignl(long double, long double);
+  
   double __builtin_cos(double);
   
   float __builtin_cosf(float);
@@ -95,20 +131,52 @@
   
   long double __builtin_cosl(long double);
   
+  double __builtin_erf(double);
+  
+  double __builtin_erfc(double);
+  
+  float __builtin_erfcf(float);
+  
+  long double __builtin_erfcl(long double);
+  
+  float __builtin_erff(float);
+  
+  long double __builtin_erfl(long double);
+  
+  void __builtin_exit(int);
+  
   double __builtin_exp(double);
   
+  double __builtin_exp2(double);
+  
+  float __builtin_exp2f(float);
+  
+  long double __builtin_exp2l(long double);
+  
   long __builtin_expect(long, long);
   
   float __builtin_expf(float);
   
   long double __builtin_expl(long double);
   
+  double __builtin_expm1(double);
+  
+  float __builtin_expm1f(float);
+  
+  long double __builtin_expm1l(long double);
+  
   double __builtin_fabs(double);
   
   float __builtin_fabsf(float);
   
   long double __builtin_fabsl(long double);
   
+  double __builtin_fdim(double, double);
+  
+  float __builtin_fdimf(float, float);
+  
+  long double __builtin_fdiml(long double, long double);
+  
   int __builtin_ffs(unsigned int);
   
   int __builtin_ffsl(unsigned long);
@@ -121,44 +189,128 @@
   
   long double __builtin_floorl(long double);
   
+  double __builtin_fma(double, double, double);
+  
+  float __builtin_fmaf(float, float, float);
+  
+  long double __builtin_fmal(long double, long double, long double);
+  
+  double __builtin_fmax(double, double);
+  
+  float __builtin_fmaxf(float, float);
+  
+  long double __builtin_fmaxl(long double, long double);
+  
+  double __builtin_fmin(double, double);
+  
+  float __builtin_fminf(float, float);
+  
+  long double __builtin_fminl(long double, long double);
+  
   double __builtin_fmod(double);
   
   float __builtin_fmodf(float);
   
   long double __builtin_fmodl(long double);
   
+  int __builtin_fprintf(void *, char const * , ...);
+  
+  int __builtin_fputs(char const *, void *);
+  
   void *__builtin_frame_address(unsigned int);
   
+  void __builtin_free(void *);
+  
   double __builtin_frexp(double, int *);
   
   float __builtin_frexpf(float, int *);
   
   long double __builtin_frexpl(long double, int *);
   
+  int __builtin_fscanf(void *, char const * , ...);
+  
   double __builtin_huge_val(void);
   
   float __builtin_huge_valf(void);
   
   long double __builtin_huge_vall(void);
   
+  double __builtin_hypot(double, double);
+  
+  float __builtin_hypotf(float, float);
+  
+  long double __builtin_hypotl(long double, long double);
+  
   void __builtin_ia32_lfence(void);
   
   void __builtin_ia32_mfence(void);
   
   void __builtin_ia32_sfence(void);
   
+  double __builtin_ilogb(double);
+  
+  float __builtin_ilogbf(float);
+  
+  long double __builtin_ilogbl(long double);
+  
   double __builtin_inf(void);
   
   float __builtin_inff(void);
   
   long double __builtin_infl(void);
   
+  int __builtin_isalnum(int);
+  
+  int __builtin_isalpha(int);
+  
+  int __builtin_isblank(int);
+  
+  int __builtin_iscntrl(int);
+  
+  int __builtin_isdigit(int);
+  
+  int __builtin_isgraph(int);
+  
+  int __builtin_islower(int);
+  
+  int __builtin_isprint(int);
+  
+  int __builtin_ispunct(int);
+  
+  int __builtin_isspace(int);
+  
+  int __builtin_isupper(int);
+  
+  int __builtin_isxdigit(int);
+  
+  long __builtin_labs(long);
+  
   double __builtin_ldexp(double, int);
   
   float __builtin_ldexpf(float, int);
   
   long double __builtin_ldexpl(long double, int);
   
+  double __builtin_lgamma(double);
+  
+  float __builtin_lgammaf(float);
+  
+  long double __builtin_lgammal(long double);
+  
+  long long __builtin_llabs(long long);
+  
+  long long __builtin_llrint(double);
+  
+  long long __builtin_llrintf(float);
+  
+  long long __builtin_llrintl(long double);
+  
+  long long __builtin_llround(double);
+  
+  long long __builtin_llroundf(float);
+  
+  long long __builtin_llroundl(long double);
+  
   double __builtin_log(double);
   
   double __builtin_log10(double);
@@ -167,15 +319,53 @@
   
   long double __builtin_log10l(long double);
   
+  double __builtin_log1p(double);
+  
+  float __builtin_log1pf(float);
+  
+  long double __builtin_log1pl(long double);
+  
+  double __builtin_log2(double);
+  
+  float __builtin_log2f(float);
+  
+  long double __builtin_log2l(long double);
+  
+  double __builtin_logb(double);
+  
+  float __builtin_logbf(float);
+  
+  long double __builtin_logbl(long double);
+  
   float __builtin_logf(float);
   
   long double __builtin_logl(long double);
   
+  long __builtin_lrint(double);
+  
+  long __builtin_lrintf(float);
+  
+  long __builtin_lrintl(long double);
+  
+  long __builtin_lround(double);
+  
+  long __builtin_lroundf(float);
+  
+  long __builtin_lroundl(long double);
+  
+  void *__builtin_malloc(unsigned int);
+  
+  void *__builtin_memchr(void const *, int, unsigned int);
+  
+  int __builtin_memcmp(void const *, void const *, unsigned int);
+  
   void *__builtin_memcpy(void *, void const *, unsigned int);
   
   void *__builtin_mempcpy(void *, void const *, unsigned int);
   
-  void *__builtin_memset(void *, int, int);
+  void *__builtin_memset(void *, int, unsigned int);
+  
+  double __builtin_modf(double, double *);
   
   float __builtin_modff(float, float *);
   
@@ -193,8 +383,26 @@
   
   long double __builtin_nansl(char const *);
   
+  double __builtin_nearbyint(double);
+  
+  float __builtin_nearbyintf(float);
+  
+  long double __builtin_nearbyintl(long double);
+  
   __builtin_va_list __builtin_next_arg(void);
   
+  double __builtin_nextafter(double, double);
+  
+  float __builtin_nextafterf(float, float);
+  
+  long double __builtin_nextafterl(long double, long double);
+  
+  double __builtin_nexttoward(double, long double);
+  
+  float __builtin_nexttowardf(float, long double);
+  
+  long double __builtin_nexttowardl(long double, long double);
+  
   unsigned int __builtin_object_size(void *, int);
   
   unsigned int __builtin_offsetof(unsigned int);
@@ -205,18 +413,70 @@
   
   int __builtin_parityll(unsigned long long);
   
+  double __builtin_pow(double, double);
+  
+  float __builtin_powf(float, float);
+  
   double __builtin_powi(double, int);
   
   float __builtin_powif(float, int);
   
   long double __builtin_powil(long double, int);
   
+  long double __builtin_powl(long double, long double);
+  
   void __builtin_prefetch(void const * , ...);
   
+  int __builtin_printf(char const * , ...);
+  
+  int __builtin_putchar(int);
+  
+  int __builtin_puts(char const *);
+  
+  void *__builtin_realloc(void *, unsigned int);
+  
+  double __builtin_remainder(double, double);
+  
+  float __builtin_remainderf(float, float);
+  
+  long double __builtin_remainderl(long double, long double);
+  
+  double __builtin_remquo(double, double, int *);
+  
+  float __builtin_remquof(float, float, int *);
+  
+  long double __builtin_remquol(long double, long double, int *);
+  
   void __builtin_return(void const *);
   
   void *__builtin_return_address(unsigned int);
   
+  double __builtin_rint(double);
+  
+  float __builtin_rintf(float);
+  
+  long double __builtin_rintl(long double);
+  
+  double __builtin_round(double);
+  
+  float __builtin_roundf(float);
+  
+  long double __builtin_roundl(long double);
+  
+  double __builtin_scalbln(double, long);
+  
+  float __builtin_scalblnf(float, long);
+  
+  long double __builtin_scalblnl(long double, long);
+  
+  double __builtin_scalbn(double, int);
+  
+  float __builtin_scalbnf(float, int);
+  
+  long double __builtin_scalbnl(long double, int);
+  
+  int __builtin_scanf(char const * , ...);
+  
   double __builtin_sin(double);
   
   float __builtin_sinf(float);
@@ -229,16 +489,24 @@
   
   long double __builtin_sinl(long double);
   
+  int __builtin_snprintf(char *, unsigned int, char const * , ...);
+  
+  int __builtin_sprintf(char *, char const * , ...);
+  
   double __builtin_sqrt(double);
   
   float __builtin_sqrtf(float);
   
   long double __builtin_sqrtl(long double);
   
+  int __builtin_sscanf(char const *, char const * , ...);
+  
   void __builtin_stdarg_start(__builtin_va_list);
   
   char *__builtin_stpcpy(char *, char const *);
   
+  char *__builtin_strcat(char *, char const *);
+  
   char *__builtin_strchr(char *, int);
   
   int __builtin_strcmp(char const *, char const *);
@@ -247,6 +515,8 @@
   
   unsigned int __builtin_strcspn(char const *, char const *);
   
+  unsigned int __builtin_strlen(char const *);
+  
   char *__builtin_strncat(char *, char const *, unsigned int);
   
   int __builtin_strncmp(char const *, char const *, unsigned int);
@@ -255,8 +525,12 @@
   
   char *__builtin_strpbrk(char const *, char const *);
   
+  char *__builtin_strrchr(char const *, int);
+  
   unsigned int __builtin_strspn(char const *, char const *);
   
+  char *__builtin_strstr(char const *, char const *);
+  
   double __builtin_tan(double);
   
   float __builtin_tanf(float);
@@ -269,6 +543,22 @@
   
   long double __builtin_tanl(long double);
   
+  double __builtin_tgamma(double);
+  
+  float __builtin_tgammaf(float);
+  
+  long double __builtin_tgammal(long double);
+  
+  int __builtin_tolower(int);
+  
+  int __builtin_toupper(int);
+  
+  double __builtin_trunc(double);
+  
+  float __builtin_truncf(float);
+  
+  long double __builtin_truncl(long double);
+  
   int __builtin_types_compatible_p(unsigned int, unsigned int);
   
   void __builtin_unreachable(void);
@@ -283,6 +573,20 @@
   
   void __builtin_varargs_start(__builtin_va_list);
   
+  int __builtin_vfprintf(void *, char const *, __builtin_va_list);
+  
+  int __builtin_vfscanf(void *, char const *, __builtin_va_list);
+  
+  int __builtin_vprintf(char const *, __builtin_va_list);
+  
+  int __builtin_vscanf(char const *, __builtin_va_list);
+  
+  int __builtin_vsnprintf(char *, unsigned int, char const *, __builtin_va_list);
+  
+  int __builtin_vsprintf(char *, char const *, __builtin_va_list);
+  
+  int __builtin_vsscanf(char const *, char const *, __builtin_va_list);
+  
   short __sync_add_and_fetch_int16_t(short volatile *, short , ...);
   
   int __sync_add_and_fetch_int32_t(int volatile *, int , ...);
diff --git a/tests/syntax/oracle/cpp-command.0.res.oracle b/tests/syntax/oracle/cpp-command.0.res.oracle
index f9d70e8e442ecb6fbe0a3840675c965caaebccce..e3acce5e6e10a15cb33495147c2361b5bdd2c8ad 100644
--- a/tests/syntax/oracle/cpp-command.0.res.oracle
+++ b/tests/syntax/oracle/cpp-command.0.res.oracle
@@ -1,2 +1,10 @@
+<<<<<<< HEAD
 [kernel] Parsing cpp-command.c (with preprocessing)
 [cpp-command.c cpp-command.c cpp-command.c cpp-command.c] [/tmp/FILE.i /tmp/FILE.i /tmp/FILE.i /tmp/FILE.i] [ -I LIBC -D__FRAMAC__ -D__FC_MACHDEP_X86_32 -dD -nostdinc -m32]
+||||||| ac7807782d
+[kernel] Parsing tests/syntax/cpp-command.c (with preprocessing)
+[cpp-command.c cpp-command.c cpp-command.c cpp-command.c] [/tmp/FILE.i /tmp/FILE.i /tmp/FILE.i /tmp/FILE.i] [ -I./share/libc -D__FRAMAC__ -D__FC_MACHDEP_X86_32 -dD -nostdinc -m32]
+=======
+[kernel] Parsing tests/syntax/cpp-command.c (with preprocessing)
+[cpp-command.c cpp-command.c cpp-command.c cpp-command.c] [TMPDIR/FILE.i TMPDIR/FILE.i TMPDIR/FILE.i TMPDIR/FILE.i] [ -I./share/libc -D__FRAMAC__ -D__FC_MACHDEP_X86_32 -dD -nostdinc]
+>>>>>>> origin/master
diff --git a/tests/syntax/oracle/cpp-command.1.res.oracle b/tests/syntax/oracle/cpp-command.1.res.oracle
index 924d09472535cc4a5716a8c0cdb208b0ba89eeac..9bc18d10016ed57979947c8a3330fd29e06ca605 100644
--- a/tests/syntax/oracle/cpp-command.1.res.oracle
+++ b/tests/syntax/oracle/cpp-command.1.res.oracle
@@ -1,2 +1,10 @@
+<<<<<<< HEAD
 [kernel] Parsing cpp-command.c (with preprocessing)
 %1 = cpp-command.c %2 = /tmp/FILE.i %args =  -I LIBC -D__FRAMAC__ -D__FC_MACHDEP_X86_32 -dD -nostdinc -m32
+||||||| ac7807782d
+[kernel] Parsing tests/syntax/cpp-command.c (with preprocessing)
+%1 = cpp-command.c %2 = /tmp/FILE.i %args =  -I./share/libc -D__FRAMAC__ -D__FC_MACHDEP_X86_32 -dD -nostdinc -m32
+=======
+[kernel] Parsing tests/syntax/cpp-command.c (with preprocessing)
+%1 = cpp-command.c %2 = TMPDIR/FILE.i %args =  -I./share/libc -D__FRAMAC__ -D__FC_MACHDEP_X86_32 -dD -nostdinc
+>>>>>>> origin/master
diff --git a/tests/syntax/oracle/cpp-command.2.res.oracle b/tests/syntax/oracle/cpp-command.2.res.oracle
index 692da95f912304f6a6ef1091522391664c7650db..a1d0fa4ee2a58ac0174f877deed983ec2821eb66 100644
--- a/tests/syntax/oracle/cpp-command.2.res.oracle
+++ b/tests/syntax/oracle/cpp-command.2.res.oracle
@@ -1,2 +1,10 @@
+<<<<<<< HEAD
 [kernel] Parsing cpp-command.c (with preprocessing)
-using \% has no effect : cpp-command.c'
\ No newline at end of file
+using \% has no effect : cpp-command.c'
+||||||| ac7807782d
+[kernel] Parsing tests/syntax/cpp-command.c (with preprocessing)
+using \% has no effect : cpp-command.c'
+=======
+[kernel] Parsing tests/syntax/cpp-command.c (with preprocessing)
+using \% has no effect : cpp-command.c'
+>>>>>>> origin/master
diff --git a/tests/syntax/oracle/cpp-command.4.res.oracle b/tests/syntax/oracle/cpp-command.4.res.oracle
index 6ed0a35488bf005beac2a2946bb04fb3f761dab8..1556058e6b67c44cd2a7bb10ca3747dc197ec479 100644
--- a/tests/syntax/oracle/cpp-command.4.res.oracle
+++ b/tests/syntax/oracle/cpp-command.4.res.oracle
@@ -1,2 +1,8 @@
 [kernel] Preprocessing command:
+<<<<<<< HEAD
   gcc -E -C -I LIBC -D__FRAMAC__ -D__FC_MACHDEP_X86_32 -dD -nostdinc -m32 './cpp-command.c' -o '/tmp/FILE.i'
+||||||| ac7807782d
+  gcc -E -C -I.  -I./share/libc -D__FRAMAC__ -D__FC_MACHDEP_X86_32 -dD -nostdinc -m32 'tests/syntax/cpp-command.c' -o '/tmp/FILE.i'
+=======
+  gcc -E -C -I.  -I./share/libc -D__FRAMAC__ -D__FC_MACHDEP_X86_32 -dD -nostdinc 'tests/syntax/cpp-command.c' -o 'TMPDIR/FILE.i'
+>>>>>>> origin/master
diff --git a/tests/syntax/oracle/field-offsets.res.oracle b/tests/syntax/oracle/field-offsets.res.oracle
index 88ddb5a125cd62876d190d3cf171e39c0b9c9604..6e37cb9d680c6945e9f63a5136185063840f491d 100644
--- a/tests/syntax/oracle/field-offsets.res.oracle
+++ b/tests/syntax/oracle/field-offsets.res.oracle
@@ -9,7 +9,7 @@ struct st {
 struct fam {
    int a ; /* bits 0 .. 31 */
    char b ; /* bits 32 .. 39 */
-   int fam[] ;
+   int fam[] ; /* bits 64 ..  */
 };
 int main(void)
 {
diff --git a/tests/syntax/oracle/local-init-const.res.oracle b/tests/syntax/oracle/local-init-const.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..98bd497cc4f331b551c25605e8c6bfd2688c1913
--- /dev/null
+++ b/tests/syntax/oracle/local-init-const.res.oracle
@@ -0,0 +1 @@
+[kernel] Parsing tests/syntax/local-init-const.i (no preprocessing)
diff --git a/tests/syntax/oracle/multiple_assigns.res.oracle b/tests/syntax/oracle/multiple_assigns.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..0cda603d543618256b3d8bc527983157bf1538ed
--- /dev/null
+++ b/tests/syntax/oracle/multiple_assigns.res.oracle
@@ -0,0 +1,11 @@
+[kernel] Parsing tests/syntax/multiple_assigns.i (no preprocessing)
+/* Generated by Frama-C */
+int z;
+/*@ assigns z;
+    assigns z \from z; */
+void function(void)
+{
+  return;
+}
+
+
diff --git a/tests/syntax/oracle/multiple_froms.res.oracle b/tests/syntax/oracle/multiple_froms.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..b90f4dc55f6e2c31b6f7656f8f8cc0ecfa6cf03d
--- /dev/null
+++ b/tests/syntax/oracle/multiple_froms.res.oracle
@@ -0,0 +1,23 @@
+[kernel] Parsing tests/syntax/multiple_froms.i (no preprocessing)
+[kernel:annot:multi-from] Warning: 
+  Drop 'b' \from at tests/syntax/multiple_froms.i:9 for more precise one at tests/syntax/multiple_froms.i:10
+[kernel:annot:multi-from] Warning: 
+  Drop 'a' \from at tests/syntax/multiple_froms.i:7 for more precise one at tests/syntax/multiple_froms.i:6
+/* Generated by Frama-C */
+int a;
+int b;
+int c;
+int d;
+int e;
+/*@ assigns a, b, c;
+    assigns a \from a, b, c;
+    assigns b \from a, e;
+    assigns c \from c;
+    assigns c \from d;
+ */
+void function(void)
+{
+  return;
+}
+
+
diff --git a/tests/syntax/oracle/unroll_visit.res.oracle b/tests/syntax/oracle/unroll_visit.res.oracle
index ad5ca987bd5532a8b747dc0afc31022df3af8a40..21a550e1a23a6575913368481dd6cd08b15124cf 100644
--- a/tests/syntax/oracle/unroll_visit.res.oracle
+++ b/tests/syntax/oracle/unroll_visit.res.oracle
@@ -4,8 +4,16 @@
 [eva] Initial state computed
 [eva:initial-state] Values of globals at initialization
   
+<<<<<<< HEAD
 [eva] unroll_visit.i:10: assertion got status valid.
 [eva] unroll_visit.i:8: starting to merge loop iterations
+||||||| ac7807782d
+[eva] tests/syntax/unroll_visit.i:8: assertion got status valid.
+[eva] tests/syntax/unroll_visit.i:6: starting to merge loop iterations
+=======
+[eva] tests/syntax/unroll_visit.i:9: assertion got status valid.
+[eva] tests/syntax/unroll_visit.i:7: starting to merge loop iterations
+>>>>>>> origin/master
 [eva] Recording results for main
 [eva] done for function main
 [eva] ====== VALUES COMPUTED ======
@@ -26,26 +34,76 @@
 typedef char i8;
 void main(void)
 {
+<<<<<<< HEAD
   i8 i = (char)0;
   if (! ((int)i < 100)) goto unrolling_2_loop;
   i = (i8)((int)i - 1);
+||||||| ac7807782d
+  int i = 0;
+  if (! (i < 100)) goto unrolling_2_loop;
+  i --;
+=======
+  i8 i = (char)0;
+  if (! ((int)i < 100)) goto unrolling_2_loop;
+  i = (char)((int)i - 1);
+>>>>>>> origin/master
   /*@ assert i < 100; */ ;
+<<<<<<< HEAD
   i = (i8)((int)i + 1);
   i = (i8)((int)i + 1);
+||||||| ac7807782d
+  i ++;
+  i ++;
+=======
+  i = (char)((int)i + 1);
+  i = (char)((int)i + 1);
+>>>>>>> origin/master
   unrolling_4_loop: ;
+<<<<<<< HEAD
   if (! ((int)i < 100)) goto unrolling_2_loop;
   i = (i8)((int)i - 1);
+||||||| ac7807782d
+  if (! (i < 100)) goto unrolling_2_loop;
+  i --;
+=======
+  if (! ((int)i < 100)) goto unrolling_2_loop;
+  i = (char)((int)i - 1);
+>>>>>>> origin/master
   /*@ assert i < 100; */ ;
+<<<<<<< HEAD
   i = (i8)((int)i + 1);
   i = (i8)((int)i + 1);
+||||||| ac7807782d
+  i ++;
+  i ++;
+=======
+  i = (char)((int)i + 1);
+  i = (char)((int)i + 1);
+>>>>>>> origin/master
   unrolling_3_loop: ;
   /*@ loop pragma UNROLL 2;
       loop pragma UNROLL "done", 2; */
+<<<<<<< HEAD
   while ((int)i < 100) {
     i = (i8)((int)i - 1);
+||||||| ac7807782d
+  while (i < 100) {
+    i --;
+=======
+  while ((int)i < 100) {
+    i = (char)((int)i - 1);
+>>>>>>> origin/master
     /*@ assert i < 100; */ ;
+<<<<<<< HEAD
     i = (i8)((int)i + 1);
     i = (i8)((int)i + 1);
+||||||| ac7807782d
+    i ++;
+    i ++;
+=======
+    i = (char)((int)i + 1);
+    i = (char)((int)i + 1);
+>>>>>>> origin/master
   }
   unrolling_2_loop: ;
   return;
diff --git a/tests/syntax/preprocessed.ci b/tests/syntax/preprocessed.ci
index 57aaaec07570168108712920c0c82a484e65f31c..940d6b1100e454619a619dad2821d8a2268446e8 100644
--- a/tests/syntax/preprocessed.ci
+++ b/tests/syntax/preprocessed.ci
@@ -9,4 +9,4 @@ int foo() { int FOO = 42; return FOO; }
 Local Variables:
 mode: C
 End:
-*/
\ No newline at end of file
+*/
diff --git a/tests/syntax/test_config b/tests/syntax/test_config
index 44df8c23bf474e289c90af7e416aa2fbbf00e400..f8c1acbc0d14ed312c4d79e97ac6c76798f2b8b7 100644
--- a/tests/syntax/test_config
+++ b/tests/syntax/test_config
@@ -1,4 +1,5 @@
 COMMENT: this directory is meant to test exclusively the front-end
+<<<<<<< HEAD
 COMMENT: (parser, type-checker, linker, syntactic transformations).
 COMMENT: by default, no analysis is performed since only the varadic plugin is
 COMMENT: used.
@@ -7,4 +8,11 @@ COMMENT: can be used into PLUGIN (resp. OPT) directives of specific test files.
 
 PLUGIN: variadic
 OPT: -print -machdep x86_32
+||||||| ac7807782d
+COMMENT: (parser, type-checker, linker, syntactic transformations)
+OPT: -print -journal-disable -check
+=======
+COMMENT: (parser, type-checker, linker, syntactic transformations)
+OPT: -print -journal-disable -check -machdep x86_32
+>>>>>>> origin/master
 FILEREG:.*\.\(c\|i\|ci\)$
diff --git a/tests/syntax/transient_block.ml b/tests/syntax/transient_block.ml
index 0938b72d74627597f86fd7fe7c6070c363e36bac..79a9fc9d24574aa3c8154e3e0e57aeda1f7360d4 100644
--- a/tests/syntax/transient_block.ml
+++ b/tests/syntax/transient_block.ml
@@ -10,7 +10,7 @@ class vis prj = object(self)
     let b = Cil.mkBlock [s1] in
     if create then begin
       let f = Visitor_behavior.Get.fundec
-          self#behavior (Extlib.the self#current_func) in
+          self#behavior (Option.get self#current_func) in
       let y = Cil.makeLocalVar f ~scope:b "y" (TInt(IInt,[])) in
       my_var <- Some y;
       let loc = Cil_datatype.Location.unknown in
@@ -33,8 +33,8 @@ class vis prj = object(self)
          Kernel.feedback "transient_block fatal error on %a as expected"
            Printer.pp_instr instr;
          let f = Visitor_behavior.Get.fundec
-             self#behavior (Extlib.the self#current_func) in
-         let y = Extlib.the my_var in
+             self#behavior (Option.get self#current_func) in
+         let y = Option.get my_var in
          f.slocals <-
            List.filter
              (fun v -> not (Cil_datatype.Varinfo.equal v y)) f.slocals;
diff --git a/tests/syntax/visit_create_local.ml b/tests/syntax/visit_create_local.ml
index a81f0c35900d00dfec7bdf027d7b349a22ccbfab..1ae5cabb9a4890af488d4f583f8d4f40639b4dbf 100644
--- a/tests/syntax/visit_create_local.ml
+++ b/tests/syntax/visit_create_local.ml
@@ -4,7 +4,7 @@ open Cil
 class cF = object(self) inherit Visitor.frama_c_inplace
 
 method! vstmt s =
-let fd = (Extlib.the self#current_func) in
+let fd = (Option.get self#current_func) in
 match s.skind with
 | Instr (Set (lv,e,loc)) ->
     let vi = makeLocalVar fd "varbidon" (typeOf e) in
diff --git a/tests/test_config b/tests/test_config
index 9a493bd5e80a4c14580e018e9878bfbd5dd8f3d7..105f8bf82bbebfb630011ce003976cd72165e65c 100644
--- a/tests/test_config
+++ b/tests/test_config
@@ -6,6 +6,14 @@ COMMENT: of used plug'ins.
 
 MACRO: EVA_PLUGINS from inout eva scope variadic
 MACRO: EVA_OPTIONS -eva-show-progress -eva-msg-key=-summary -eva-auto-loop-unroll 0
+<<<<<<< HEAD
 MACRO: EVA_CONFIG @EVA_OPTIONS@ -machdep x86_32
 PLUGIN: @EVA_PLUGINS@
 OPT: -eva @EVA_CONFIG@ -out -input -deps
+||||||| ac7807782d
+MACRO: EVA_CONFIG @EVA_OPTIONS@ -no-autoload-plugins -load-module from,inout,eva,scope,variadic
+OPT: -eva @EVA_CONFIG@ -journal-disable -out -input -deps
+=======
+MACRO: EVA_CONFIG @EVA_OPTIONS@ -no-autoload-plugins -load-module from,inout,eva,scope,variadic -machdep x86_32
+OPT: -eva @EVA_CONFIG@ -journal-disable -out -input -deps
+>>>>>>> origin/master
diff --git a/tests/test_config_apron b/tests/test_config_apron
index 91f0ba7b07a9d3bc69020edadf9ebe866ead28e8..b6cd6c9977c0fcf9fe3a779e89610e7dc70d00b4 100644
--- a/tests/test_config_apron
+++ b/tests/test_config_apron
@@ -1,6 +1,12 @@
 MACRO: EVA_PLUGINS from inout eva scope variadic
 MACRO: EVA_OPTIONS -eva-show-progress -eva-msg-key=-summary -eva-auto-loop-unroll 0 -eva-domains apron-octagon -eva-warn-key experimental=inactive
+<<<<<<< HEAD
 MACRO: EVA_CONFIG @EVA_OPTIONS@ -machdep x86_32
 FILTER: diff %{dep:../oracle/@PTEST_ORACLE@}
 PLUGIN: @EVA_PLUGINS@
+||||||| ac7807782d
+MACRO: EVA_CONFIG @EVA_OPTIONS@ -no-autoload-plugins -load-module from,inout,eva,scope,variadic
+=======
+MACRO: EVA_CONFIG @EVA_OPTIONS@ -no-autoload-plugins -load-module from,inout,eva,scope,variadic -machdep x86_32
+>>>>>>> origin/master
 OPT: -eva @EVA_CONFIG@ -journal-disable -out -input -deps
diff --git a/tests/test_config_bitwise b/tests/test_config_bitwise
index 705f3d44db63628c6cfe6a53285e2a32ac28d301..85fe500c3ec9d3e94252ab4294778779714a37de 100644
--- a/tests/test_config_bitwise
+++ b/tests/test_config_bitwise
@@ -1,6 +1,14 @@
 MACRO: EVA_PLUGINS from inout eva scope variadic
 MACRO: EVA_OPTIONS -eva-show-progress -eva-msg-key=-summary -eva-auto-loop-unroll 0 -eva-domains bitwise
+<<<<<<< HEAD
 MACRO: EVA_CONFIG @EVA_OPTIONS@ -machdep x86_32
 FILTER: diff %{dep:../oracle/@PTEST_ORACLE@}
 PLUGIN: @EVA_PLUGINS@
 OPT: -eva @EVA_CONFIG@ -out -input -deps
+||||||| ac7807782d
+MACRO: EVA_CONFIG @EVA_OPTIONS@ -no-autoload-plugins -load-module from,inout,eva,scope,variadic
+OPT: -eva @EVA_CONFIG@ -journal-disable -out -input -deps
+=======
+MACRO: EVA_CONFIG @EVA_OPTIONS@ -no-autoload-plugins -load-module from,inout,eva,scope,variadic -machdep x86_32
+OPT: -eva @EVA_CONFIG@ -journal-disable -out -input -deps
+>>>>>>> origin/master
diff --git a/tests/test_config_equalities b/tests/test_config_equalities
index 5efc24a16cd215f1445548b0b26f19ff243f11ee..da246875aa58d6615804a8c003d87d33548a5d28 100644
--- a/tests/test_config_equalities
+++ b/tests/test_config_equalities
@@ -1,6 +1,12 @@
 MACRO: EVA_PLUGINS from inout eva scope variadic
 MACRO: EVA_OPTIONS -eva-show-progress -eva-msg-key=-summary -eva-auto-loop-unroll 0 -eva-domains equality
+<<<<<<< HEAD
 MACRO: EVA_CONFIG @EVA_OPTIONS@ -machdep x86_32
 FILTER: diff %{dep:../oracle/@PTEST_ORACLE@}
 PLUGIN: @EVA_PLUGINS@
+||||||| ac7807782d
+MACRO: EVA_CONFIG @EVA_OPTIONS@ -no-autoload-plugins -load-module from,inout,eva,scope,variadic
+=======
+MACRO: EVA_CONFIG @EVA_OPTIONS@ -no-autoload-plugins -load-module from,inout,eva,scope,variadic -machdep x86_32
+>>>>>>> origin/master
 OPT: -eva @EVA_CONFIG@ -journal-disable -out -input -deps
diff --git a/tests/test_config_gauges b/tests/test_config_gauges
index 4e751c3d7d737cfe9d1c8787a208839a66f7635c..d6555ed350191df2a2ef0a1255795cd05cf5bd10 100644
--- a/tests/test_config_gauges
+++ b/tests/test_config_gauges
@@ -1,4 +1,10 @@
 MACRO: EVA_PLUGINS from inout eva scope variadic
 MACRO: EVA_OPTIONS -eva-show-progress -eva-msg-key=-summary -eva-auto-loop-unroll 0 -eva-domains gauges
+<<<<<<< HEAD
 MACRO: EVA_CONFIG @EVA_OPTIONS@ -machdep x86_32
+||||||| ac7807782d
+MACRO: EVA_CONFIG @EVA_OPTIONS@ -no-autoload-plugins -load-module from,inout,eva,scope,variadic
+=======
+MACRO: EVA_CONFIG @EVA_OPTIONS@ -no-autoload-plugins -load-module from,inout,eva,scope,variadic -machdep x86_32
+>>>>>>> origin/master
 OPT: -eva @EVA_CONFIG@ -journal-disable -out -input -deps
diff --git a/tests/test_config_octagons b/tests/test_config_octagons
index 4646bdc386578adba5e59af91286fe583e5f17f2..0fa6346dc81f95ee67f27f010b74af26489449a5 100644
--- a/tests/test_config_octagons
+++ b/tests/test_config_octagons
@@ -1,6 +1,12 @@
 MACRO: EVA_PLUGINS from inout eva scope variadic
 MACRO: EVA_OPTIONS -eva-show-progress -eva-msg-key=-summary -eva-domains octagon
+<<<<<<< HEAD
 MACRO: EVA_CONFIG @EVA_OPTIONS@ -machdep x86_32 
 FILTER: diff %{dep:../oracle/@PTEST_ORACLE@}
 PLUGIN: @EVA_PLUGINS@
+||||||| ac7807782d
+MACRO: EVA_CONFIG @EVA_OPTIONS@ -no-autoload-plugins -load-module from,inout,eva,scope,variadic
+=======
+MACRO: EVA_CONFIG @EVA_OPTIONS@ -no-autoload-plugins -load-module from,inout,eva,scope,variadic -machdep x86_32
+>>>>>>> origin/master
 OPT: -eva @EVA_CONFIG@ -journal-disable -out -input -deps
diff --git a/tests/test_config_symblocs b/tests/test_config_symblocs
index edb58b80081e86639faf6d89bf69f1222f9b2058..bd6c9777089a45fd492d41da906e0e05ff2d6fe3 100644
--- a/tests/test_config_symblocs
+++ b/tests/test_config_symblocs
@@ -1,6 +1,12 @@
 MACRO: EVA_PLUGINS from inout eva scope variadic
 MACRO: EVA_OPTIONS -eva-show-progress -eva-msg-key=-summary -eva-auto-loop-unroll 0 -eva-domains symbolic-locations
+<<<<<<< HEAD
 MACRO: EVA_CONFIG @EVA_OPTIONS@ -machdep x86_32 
 FILTER: diff %{dep:../oracle/@PTEST_ORACLE@}
 PLUGIN: @EVA_PLUGINS@
+||||||| ac7807782d
+MACRO: EVA_CONFIG @EVA_OPTIONS@ -no-autoload-plugins -load-module from,inout,eva,scope,variadic
+=======
+MACRO: EVA_CONFIG @EVA_OPTIONS@ -no-autoload-plugins -load-module from,inout,eva,scope,variadic -machdep x86_32
+>>>>>>> origin/master
 OPT: -eva @EVA_CONFIG@ -journal-disable -out -input -deps
diff --git a/tests/value/.gitignore b/tests/value/.gitignore
index a2232653a6f719442070e6f515728d7e0a863c46..5de45901ce62a18d26c6309c170b943215b78b67 100644
--- a/tests/value/.gitignore
+++ b/tests/value/.gitignore
@@ -1 +1 @@
-/oracle_*
\ No newline at end of file
+/oracle_*
diff --git a/tests/value/backward_arith.i b/tests/value/backward_arith.i
index a26120d37e80dcd688b619bc03df1b6913549a60..afe946261c3b451c350e90970ac4c9a4c1678a48 100644
--- a/tests/value/backward_arith.i
+++ b/tests/value/backward_arith.i
@@ -1,4 +1,5 @@
 /* run.config*
+   STDOPT: +"-keep-logical-operators"
 */
 
 /* Test the soundness of arithmetic backward propagators.  */
@@ -26,8 +27,52 @@ void unsigned_neg () {
     Frama_C_show_each_smaller_than_minus_ten_but_zero(x); /* <= 4294967286 but 0 */
 }
 
+void logical_operators () {
+  unsigned int x = nondet;
+  unsigned int y = nondet;
+  unsigned int a = x % 10;
+  unsigned int b = x % 10;
+
+  // Logical conjunction LAnd.
+  if (x < 11 && y < 21)
+    Frama_C_show_each("0..10", x, "0..20", y);
+  else
+    Frama_C_show_each("top", x, "top", y);
+  if (a < 10 && y < 10)
+    Frama_C_show_each("0..9", a, "0..9", y);
+  else
+    Frama_C_show_each("0..9", a, "10..max", y);
+  if (a > 10 && y < 10)
+    Frama_C_show_each("bottom", a, y);
+  else
+    Frama_C_show_each("0..9", a, "top", y);
+  if (a > 10 && b > 10)
+    Frama_C_show_each("bottom", a, b);
+  else
+    Frama_C_show_each("0..9", a, "0..9", b);
+
+  // Logical disjunction LOr.
+  if (x > 10 || y > 20)
+    Frama_C_show_each("top", x, "top", y);
+  else
+    Frama_C_show_each("0..10", x, "0..20", y);
+  if (a > 10 || y > 10)
+    Frama_C_show_each("0..9", a, "11..max", y);
+  else
+    Frama_C_show_each("0..9", a, "0..10", y);
+  if (a < 10 || y > 10)
+    Frama_C_show_each("0..9", a, "top", y);
+  else
+    Frama_C_show_each("bottom", a, y);
+  if (a > 10 || b > 10)
+    Frama_C_show_each("bottom", a, b);
+  else
+    Frama_C_show_each("0..9", a, "0..9", b);
+}
+
 
 int main () {
   unsigned_neg ();
+  logical_operators ();
   return 0;
 }
diff --git a/tests/value/bool.i b/tests/value/bool.i
index 7d1c46359f3aa59627c852379d1185abcb53567a..5a7342750bf878b8d6591770294a34e985bf3705 100644
--- a/tests/value/bool.i
+++ b/tests/value/bool.i
@@ -16,7 +16,17 @@ int valid_bool () {
   Frama_C_show_each(x, y);
   x=x+1;
   Frama_C_show_each(x);
-  x=x+1;
+  ++x;
+  Frama_C_show_each(x);
+  x++;
+  Frama_C_show_each(x);
+  x--;
+  Frama_C_show_each(x);
+  x--;
+  Frama_C_show_each(x);
+  --x;
+  Frama_C_show_each(x);
+  --x;
   Frama_C_show_each(x);
   return y;
 }
diff --git a/tests/value/const_typedef.i b/tests/value/const_typedef.i
index a672647be760b5f78e1a969ce5ee8769b6d056e4..2dd72202a6f5316b5e969ad0017a59b581ce147c 100644
--- a/tests/value/const_typedef.i
+++ b/tests/value/const_typedef.i
@@ -1,6 +1,12 @@
 /* run.config*
+<<<<<<< HEAD
   PLUGIN= inout eva
   OPT: -machdep x86_32 -print -then -eva @EVA_CONFIG@ -lib-entry -no-print
+||||||| ac7807782d
+  OPT: -no-autoload-plugins -load-module inout,eva -print -then -eva @EVA_CONFIG@ -lib-entry -no-print
+=======
+  OPT: -machdep x86_32 -no-autoload-plugins -load-module inout,eva -print -then -eva @EVA_CONFIG@ -lib-entry -no-print
+>>>>>>> origin/master
 */
 
 typedef int INT[3][3];
diff --git a/tests/value/diff_apron b/tests/value/diff_apron
index 7915c0b0e873ef23a864f3b30d8cc73709be8fc7..9e5d14b53b4ca734fc2cad76ed4060962d98c8fa 100644
--- a/tests/value/diff_apron
+++ b/tests/value/diff_apron
@@ -71,48 +71,138 @@ diff oracle/auto_loop_unroll.0.res.oracle oracle_apron/auto_loop_unroll.0.res.or
 < [eva] auto_loop_unroll.c:82: 
 <   Frama_C_show_each_32_80: [0..2147483647]
 ---
+<<<<<<< HEAD
 > [eva] auto_loop_unroll.c:82: Frama_C_show_each_32_80: [0..164]
 49,52c32
 < [eva:alarm] auto_loop_unroll.c:86: Warning: 
+||||||| ac7807782d
+> [eva] tests/value/auto_loop_unroll.c:82: Frama_C_show_each_32_80: [0..164]
+49,52c32
+< [eva:alarm] tests/value/auto_loop_unroll.c:86: Warning: 
+=======
+> [eva] tests/value/auto_loop_unroll.c:82: Frama_C_show_each_32_80: [0..164]
+55,56d37
+< [eva:alarm] tests/value/auto_loop_unroll.c:88: Warning: 
+>>>>>>> origin/master
 <   signed overflow. assert res + 1 ≤ 2147483647;
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:90: 
 <   Frama_C_show_each_11_111: [0..2147483647]
 ---
 > [eva] auto_loop_unroll.c:90: Frama_C_show_each_11_111: [11..111]
 60,61d39
 < [eva:alarm] auto_loop_unroll.c:96: Warning: 
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:90: 
+<   Frama_C_show_each_11_111: [0..2147483647]
+---
+> [eva] tests/value/auto_loop_unroll.c:90: Frama_C_show_each_11_111: [11..111]
+60,61d39
+< [eva:alarm] tests/value/auto_loop_unroll.c:96: Warning: 
+=======
+60,62c41
+< [eva:alarm] tests/value/auto_loop_unroll.c:93: Warning: 
+>>>>>>> origin/master
 <   signed overflow. assert res + 1 ≤ 2147483647;
+<<<<<<< HEAD
 72c50,53
 < [eva] auto_loop_unroll.c:103: Reusing old results for call to incr
+||||||| ac7807782d
+72c50,53
+< [eva] tests/value/auto_loop_unroll.c:103: Reusing old results for call to incr
+=======
+< [eva] tests/value/auto_loop_unroll.c:95: Frama_C_show_each_101: [0..2147483647]
+---
+> [eva] tests/value/auto_loop_unroll.c:95: Frama_C_show_each_101: {101}
+71c50,53
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr
+>>>>>>> origin/master
 ---
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:103.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:103.
+=======
+>   Called from tests/value/auto_loop_unroll.c:101.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
+<<<<<<< HEAD
 82c63,66
 < [eva] auto_loop_unroll.c:103: Reusing old results for call to incr
+||||||| ac7807782d
+82c63,66
+< [eva] tests/value/auto_loop_unroll.c:103: Reusing old results for call to incr
+=======
+81c63,66
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr
+>>>>>>> origin/master
 ---
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:103.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:103.
+=======
+>   Called from tests/value/auto_loop_unroll.c:101.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
+<<<<<<< HEAD
 91c75,78
 < [eva] auto_loop_unroll.c:103: Reusing old results for call to incr
+||||||| ac7807782d
+91c75,78
+< [eva] tests/value/auto_loop_unroll.c:103: Reusing old results for call to incr
+=======
+90c75,78
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr
+>>>>>>> origin/master
 ---
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:103.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:103.
+=======
+>   Called from tests/value/auto_loop_unroll.c:101.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
+<<<<<<< HEAD
 108c95,98
 < [eva] auto_loop_unroll.c:102: Reusing old results for call to incr
+||||||| ac7807782d
+108c95,98
+< [eva] tests/value/auto_loop_unroll.c:102: Reusing old results for call to incr
+=======
+107c95,98
+< [eva] tests/value/auto_loop_unroll.c:100: Reusing old results for call to incr
+>>>>>>> origin/master
 ---
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:102.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:102.
+=======
+>   Called from tests/value/auto_loop_unroll.c:100.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
+<<<<<<< HEAD
 115,116d104
 < [eva:alarm] auto_loop_unroll.c:14: Warning: 
+||||||| ac7807782d
+115,116d104
+< [eva:alarm] tests/value/auto_loop_unroll.c:14: Warning: 
+=======
+114,115d104
+< [eva:alarm] tests/value/auto_loop_unroll.c:14: Warning: 
+>>>>>>> origin/master
 <   signed overflow. assert g + 1 ≤ 2147483647;
+<<<<<<< HEAD
 119c107,110
 < [eva] auto_loop_unroll.c:102: Reusing old results for call to incr
 ---
@@ -123,7 +213,23 @@ diff oracle/auto_loop_unroll.0.res.oracle oracle_apron/auto_loop_unroll.0.res.or
 124,125c115,122
 < [eva] auto_loop_unroll.c:101: Reusing old results for call to incr_g
 < [eva] auto_loop_unroll.c:102: Reusing old results for call to incr
+||||||| ac7807782d
+119c107,110
+< [eva] tests/value/auto_loop_unroll.c:102: Reusing old results for call to incr
 ---
+> [eva] computing for function incr <- various_loops <- main.
+>   Called from tests/value/auto_loop_unroll.c:102.
+> [eva] Recording results for incr
+> [eva] Done for function incr
+124,125c115,122
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr_g
+< [eva] tests/value/auto_loop_unroll.c:102: Reusing old results for call to incr
+=======
+118c107,110
+< [eva] tests/value/auto_loop_unroll.c:100: Reusing old results for call to incr
+>>>>>>> origin/master
+---
+<<<<<<< HEAD
 > [eva] computing for function incr_g <- various_loops <- main.
 >   Called from auto_loop_unroll.c:101.
 > [eva] Recording results for incr_g
@@ -140,36 +246,123 @@ diff oracle/auto_loop_unroll.0.res.oracle oracle_apron/auto_loop_unroll.0.res.or
 >   Called from auto_loop_unroll.c:101.
 > [eva] Recording results for incr_g
 > [eva] Done for function incr_g
+||||||| ac7807782d
+> [eva] computing for function incr_g <- various_loops <- main.
+>   Called from tests/value/auto_loop_unroll.c:101.
+> [eva] Recording results for incr_g
+> [eva] Done for function incr_g
+> [eva] computing for function incr <- various_loops <- main.
+>   Called from tests/value/auto_loop_unroll.c:102.
+> [eva] Recording results for incr
+> [eva] Done for function incr
+130,131c127,134
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr_g
+< [eva] tests/value/auto_loop_unroll.c:102: Reusing old results for call to incr
+---
+> [eva] computing for function incr_g <- various_loops <- main.
+>   Called from tests/value/auto_loop_unroll.c:101.
+> [eva] Recording results for incr_g
+> [eva] Done for function incr_g
+=======
+>>>>>>> origin/master
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:102.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:102.
+=======
+>   Called from tests/value/auto_loop_unroll.c:100.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
+<<<<<<< HEAD
 134,135d136
 < [eva:alarm] auto_loop_unroll.c:18: Warning: 
+||||||| ac7807782d
+134,135d136
+< [eva:alarm] tests/value/auto_loop_unroll.c:18: Warning: 
+=======
+121,122d112
+< [eva:alarm] tests/value/auto_loop_unroll.c:18: Warning: 
+>>>>>>> origin/master
 <   signed overflow. assert i + 1 ≤ 2147483647;
+<<<<<<< HEAD
 138c139
 < [eva] auto_loop_unroll.c:105: Frama_C_show_each_25: [0..2147483647]
+||||||| ac7807782d
+138c139
+< [eva] tests/value/auto_loop_unroll.c:105: Frama_C_show_each_25: [0..2147483647]
+=======
+125c115
+< [eva] tests/value/auto_loop_unroll.c:103: Frama_C_show_each_25: [0..2147483647]
+>>>>>>> origin/master
 ---
+<<<<<<< HEAD
 > [eva] auto_loop_unroll.c:105: Frama_C_show_each_25: {25}
 144c145,146
 < [eva] auto_loop_unroll.c:114: Frama_C_show_each_120: [0..2147483647]
----
+||||||| ac7807782d
+> [eva] tests/value/auto_loop_unroll.c:105: Frama_C_show_each_25: {25}
+144c145,146
+< [eva] tests/value/auto_loop_unroll.c:114: Frama_C_show_each_120: [0..2147483647]
+=======
+> [eva] tests/value/auto_loop_unroll.c:103: Frama_C_show_each_25: {25}
+131c121,122
+< [eva] tests/value/auto_loop_unroll.c:112: Frama_C_show_each_120: [0..2147483647]
+>>>>>>> origin/master
+---
+<<<<<<< HEAD
 > [eva] auto_loop_unroll.c:114: 
+||||||| ac7807782d
+> [eva] tests/value/auto_loop_unroll.c:114: 
+=======
+> [eva] tests/value/auto_loop_unroll.c:112: 
+>>>>>>> origin/master
 >   Frama_C_show_each_120: [15..2147483647]
+<<<<<<< HEAD
 160,161d161
 < [eva:alarm] auto_loop_unroll.c:136: Warning: 
+||||||| ac7807782d
+160,161d161
+< [eva:alarm] tests/value/auto_loop_unroll.c:136: Warning: 
+=======
+133,136c124
+< [eva:alarm] tests/value/auto_loop_unroll.c:120: Warning: 
+>>>>>>> origin/master
 <   signed overflow. assert res + 1 ≤ 2147483647;
-168c168
-<   Frama_C_show_each_imprecise: [0..2147483647]
+< [eva] tests/value/auto_loop_unroll.c:122: 
+<   Frama_C_show_each_32_64: [0..2147483647]
 ---
+<<<<<<< HEAD
 >   Frama_C_show_each_imprecise: [10..2147483647]
 170,174c170,174
 < [eva:alarm] auto_loop_unroll.c:156: Warning: 
+||||||| ac7807782d
+>   Frama_C_show_each_imprecise: [10..2147483647]
+170,174c170,174
+< [eva:alarm] tests/value/auto_loop_unroll.c:156: Warning: 
+=======
+> [eva] tests/value/auto_loop_unroll.c:122: Frama_C_show_each_32_64: [0..65]
+152,153d139
+< [eva:alarm] tests/value/auto_loop_unroll.c:145: Warning: 
+>>>>>>> origin/master
 <   signed overflow. assert res + 1 ≤ 2147483647;
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:158: 
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:158: 
+=======
+160c146
+>>>>>>> origin/master
 <   Frama_C_show_each_imprecise: [0..2147483647]
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:163: Reusing old results for call to incr_g
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:163: Reusing old results for call to incr_g
+=======
+>>>>>>> origin/master
 ---
+<<<<<<< HEAD
 > [eva] auto_loop_unroll.c:158: Frama_C_show_each_imprecise: {10}
 > [eva] computing for function incr_g <- complex_loops <- main.
 >   Called from auto_loop_unroll.c:163.
@@ -179,42 +372,200 @@ diff oracle/auto_loop_unroll.0.res.oracle oracle_apron/auto_loop_unroll.0.res.or
 < [eva] auto_loop_unroll.c:163: Reusing old results for call to incr_g
 < [eva] auto_loop_unroll.c:163: Reusing old results for call to incr_g
 < [eva:alarm] auto_loop_unroll.c:165: Warning: 
+||||||| ac7807782d
+> [eva] tests/value/auto_loop_unroll.c:158: Frama_C_show_each_imprecise: {10}
+> [eva] computing for function incr_g <- complex_loops <- main.
+>   Called from tests/value/auto_loop_unroll.c:163.
+> [eva] Recording results for incr_g
+> [eva] Done for function incr_g
+188,193c188,196
+< [eva] tests/value/auto_loop_unroll.c:163: Reusing old results for call to incr_g
+< [eva] tests/value/auto_loop_unroll.c:163: Reusing old results for call to incr_g
+< [eva:alarm] tests/value/auto_loop_unroll.c:165: Warning: 
+=======
+>   Frama_C_show_each_imprecise: [10..2147483647]
+178,183c164,172
+< [eva] tests/value/auto_loop_unroll.c:162: Reusing old results for call to incr_g
+< [eva] tests/value/auto_loop_unroll.c:162: Reusing old results for call to incr_g
+< [eva:alarm] tests/value/auto_loop_unroll.c:164: Warning: 
+>>>>>>> origin/master
 <   signed overflow. assert res + 1 ≤ 2147483647;
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:167: 
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:167: 
+=======
+< [eva] tests/value/auto_loop_unroll.c:166: 
+>>>>>>> origin/master
 <   Frama_C_show_each_imprecise: [0..2147483647]
 ---
 > [eva] computing for function incr_g <- complex_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:163.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:163.
+=======
+>   Called from tests/value/auto_loop_unroll.c:162.
+>>>>>>> origin/master
 > [eva] Recording results for incr_g
 > [eva] Done for function incr_g
 > [eva] computing for function incr_g <- complex_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:163.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:163.
+=======
+>   Called from tests/value/auto_loop_unroll.c:162.
+>>>>>>> origin/master
 > [eva] Recording results for incr_g
 > [eva] Done for function incr_g
+<<<<<<< HEAD
 > [eva] auto_loop_unroll.c:167: Frama_C_show_each_imprecise: [0..64]
 195,198c198
 < [eva:alarm] auto_loop_unroll.c:174: Warning: 
+||||||| ac7807782d
+> [eva] tests/value/auto_loop_unroll.c:167: Frama_C_show_each_imprecise: [0..64]
+195,198c198
+< [eva:alarm] tests/value/auto_loop_unroll.c:174: Warning: 
+=======
+> [eva] tests/value/auto_loop_unroll.c:166: Frama_C_show_each_imprecise: [0..64]
+185,188c174
+< [eva:alarm] tests/value/auto_loop_unroll.c:173: Warning: 
+>>>>>>> origin/master
 <   signed overflow. assert res + 1 ≤ 2147483647;
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:176: 
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:176: 
+=======
+< [eva] tests/value/auto_loop_unroll.c:175: 
+>>>>>>> origin/master
 <   Frama_C_show_each_imprecise: [0..2147483647]
 ---
+<<<<<<< HEAD
 > [eva] auto_loop_unroll.c:176: Frama_C_show_each_imprecise: [0..9]
 200,203c200
 < [eva:alarm] auto_loop_unroll.c:182: Warning: 
+||||||| ac7807782d
+> [eva] tests/value/auto_loop_unroll.c:176: Frama_C_show_each_imprecise: [0..9]
+200,203c200
+< [eva:alarm] tests/value/auto_loop_unroll.c:182: Warning: 
+=======
+> [eva] tests/value/auto_loop_unroll.c:175: Frama_C_show_each_imprecise: [0..9]
+190,191d175
+< [eva:alarm] tests/value/auto_loop_unroll.c:181: Warning: 
+>>>>>>> origin/master
 <   signed overflow. assert res + 1 ≤ 2147483647;
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:184: 
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:184: 
+=======
+195c179
+>>>>>>> origin/master
 <   Frama_C_show_each_imprecise: [0..2147483647]
 ---
+<<<<<<< HEAD
 > [eva] auto_loop_unroll.c:184: Frama_C_show_each_imprecise: [0..64]
 210c207
+||||||| ac7807782d
+> [eva] tests/value/auto_loop_unroll.c:184: Frama_C_show_each_imprecise: [0..64]
+210c207
+=======
+>   Frama_C_show_each_imprecise: [64..2147483647]
+201,203c185
+< [eva:alarm] tests/value/auto_loop_unroll.c:193: Warning: 
+<   signed overflow. assert res + 1 ≤ 2147483647;
+< [eva] tests/value/auto_loop_unroll.c:195: Frama_C_show_each_11: [0..2147483647]
+---
+> [eva] tests/value/auto_loop_unroll.c:195: Frama_C_show_each_11: {11}
+205,207c187
+< [eva:alarm] tests/value/auto_loop_unroll.c:198: Warning: 
+<   signed overflow. assert res + 1 ≤ 2147483647;
+< [eva] tests/value/auto_loop_unroll.c:200: Frama_C_show_each_12: [0..2147483647]
+---
+> [eva] tests/value/auto_loop_unroll.c:200: Frama_C_show_each_12: {12}
+209,210d188
+< [eva:alarm] tests/value/auto_loop_unroll.c:204: Warning: 
+<   signed overflow. assert res + 1 ≤ 2147483647;
+212a191,192
+> [eva:alarm] tests/value/auto_loop_unroll.c:204: Warning: 
+>   signed overflow. assert res + 1 ≤ 2147483647;
+216,217d195
+< [eva:alarm] tests/value/auto_loop_unroll.c:209: Warning: 
+<   signed overflow. assert res + 1 ≤ 2147483647;
+219a198,199
+> [eva:alarm] tests/value/auto_loop_unroll.c:209: Warning: 
+>   signed overflow. assert res + 1 ≤ 2147483647;
+223,224d202
+< [eva:alarm] tests/value/auto_loop_unroll.c:217: Warning: 
+<   signed overflow. assert res + 1 ≤ 2147483647;
+228,231c206
+< [eva:alarm] tests/value/auto_loop_unroll.c:222: Warning: 
+<   signed overflow. assert res + 1 ≤ 2147483647;
+< [eva] tests/value/auto_loop_unroll.c:226: 
+<   Frama_C_show_each_11_111: [0..2147483647]
+---
+> [eva] tests/value/auto_loop_unroll.c:226: Frama_C_show_each_11_111: [11..111]
+239,241c214
+< [eva:alarm] tests/value/auto_loop_unroll.c:236: Warning: 
+<   signed overflow. assert res + 1 ≤ 2147483647;
+< [eva] tests/value/auto_loop_unroll.c:238: Frama_C_show_each_20: [0..2147483647]
+---
+> [eva] tests/value/auto_loop_unroll.c:238: Frama_C_show_each_20: [20..2147483646]
+243,244d215
+< [eva:alarm] tests/value/auto_loop_unroll.c:241: Warning: 
+<   signed overflow. assert res + 1 ≤ 2147483647;
+247c218,220
+< [eva] tests/value/auto_loop_unroll.c:243: Frama_C_show_each_21: [0..2147483647]
+---
+> [eva:alarm] tests/value/auto_loop_unroll.c:241: Warning: 
+>   signed overflow. assert res + 1 ≤ 2147483647;
+> [eva] tests/value/auto_loop_unroll.c:243: Frama_C_show_each_21: {21}
+253,255c226,227
+< [eva:alarm] tests/value/auto_loop_unroll.c:250: Warning: 
+<   signed overflow. assert res + 1 ≤ 2147483647;
+< [eva] tests/value/auto_loop_unroll.c:254: Frama_C_show_each_30: [0..2147483647]
+---
+> [eva] tests/value/auto_loop_unroll.c:254: Frama_C_show_each_30: {30}
+> [eva] tests/value/auto_loop_unroll.c:258: starting to merge loop iterations
+258,259c230,231
+< [eva] tests/value/auto_loop_unroll.c:258: starting to merge loop iterations
+< [eva] tests/value/auto_loop_unroll.c:263: Frama_C_show_each_top: [0..2147483647]
+---
+> [eva] tests/value/auto_loop_unroll.c:263: 
+>   Frama_C_show_each_top: [31..2147483647]
+261,263c233
+< [eva:alarm] tests/value/auto_loop_unroll.c:267: Warning: 
+<   signed overflow. assert res + 1 ≤ 2147483647;
+< [eva] tests/value/auto_loop_unroll.c:272: Frama_C_show_each_32: [0..2147483647]
+---
+> [eva] tests/value/auto_loop_unroll.c:272: Frama_C_show_each_32: {32}
+268c238
+<   Frama_C_show_each_33_inf: [0..2147483647]
+---
+>   Frama_C_show_each_33_inf: [33..2147483647]
+272,273d241
+< [eva:alarm] tests/value/auto_loop_unroll.c:283: Warning: 
+<   signed overflow. assert res + 1 ≤ 2147483647;
+281c249
+>>>>>>> origin/master
 <   __retres ∈ [1..2147483647]
 ---
 >   __retres ∈ [1..25]
-212c209
+283c251
 <   g ∈ [1..2147483647]
 ---
+<<<<<<< HEAD
 >   g ∈ [1..63]
 diff oracle/auto_loop_unroll.1.res.oracle oracle_apron/auto_loop_unroll.1.res.oracle
+||||||| ac7807782d
+>   g ∈ [1..63]
+diff tests/value/oracle/auto_loop_unroll.1.res.oracle tests/value/oracle_apron/auto_loop_unroll.1.res.oracle
+=======
+>   g ∈ [1..126]
+diff tests/value/oracle/auto_loop_unroll.1.res.oracle tests/value/oracle_apron/auto_loop_unroll.1.res.oracle
+>>>>>>> origin/master
 15,18c15
 < [eva:alarm] auto_loop_unroll.c:31: Warning: 
 <   signed overflow. assert res + 1 ≤ 2147483647;
@@ -230,187 +581,496 @@ diff oracle/auto_loop_unroll.1.res.oracle oracle_apron/auto_loop_unroll.1.res.or
 ---
 > [eva] auto_loop_unroll.c:41: Frama_C_show_each_imprecise: {100}
 58c52,55
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:103: Reusing old results for call to incr
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:103: Reusing old results for call to incr
+=======
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr
+>>>>>>> origin/master
 ---
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:103.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:103.
+=======
+>   Called from tests/value/auto_loop_unroll.c:101.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
 67c64,67
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:103: Reusing old results for call to incr
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:103: Reusing old results for call to incr
+=======
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr
+>>>>>>> origin/master
 ---
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:103.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:103.
+=======
+>   Called from tests/value/auto_loop_unroll.c:101.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
 76c76,79
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:103: Reusing old results for call to incr
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:103: Reusing old results for call to incr
+=======
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr
+>>>>>>> origin/master
 ---
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:103.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:103.
+=======
+>   Called from tests/value/auto_loop_unroll.c:101.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
 85c88,91
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:103: Reusing old results for call to incr
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:103: Reusing old results for call to incr
+=======
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr
+>>>>>>> origin/master
 ---
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:103.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:103.
+=======
+>   Called from tests/value/auto_loop_unroll.c:101.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
 94c100,103
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:103: Reusing old results for call to incr
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:103: Reusing old results for call to incr
+=======
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr
+>>>>>>> origin/master
 ---
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:103.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:103.
+=======
+>   Called from tests/value/auto_loop_unroll.c:101.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
 103c112,115
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:103: Reusing old results for call to incr
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:103: Reusing old results for call to incr
+=======
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr
+>>>>>>> origin/master
 ---
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:103.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:103.
+=======
+>   Called from tests/value/auto_loop_unroll.c:101.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
 112c124,127
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:103: Reusing old results for call to incr
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:103: Reusing old results for call to incr
+=======
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr
+>>>>>>> origin/master
 ---
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:103.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:103.
+=======
+>   Called from tests/value/auto_loop_unroll.c:101.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
 121c136,139
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:103: Reusing old results for call to incr
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:103: Reusing old results for call to incr
+=======
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr
+>>>>>>> origin/master
 ---
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:103.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:103.
+=======
+>   Called from tests/value/auto_loop_unroll.c:101.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
 130c148,151
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:103: Reusing old results for call to incr
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:103: Reusing old results for call to incr
+=======
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr
+>>>>>>> origin/master
 ---
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:103.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:103.
+=======
+>   Called from tests/value/auto_loop_unroll.c:101.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
 139c160,163
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:103: Reusing old results for call to incr
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:103: Reusing old results for call to incr
+=======
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr
+>>>>>>> origin/master
 ---
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:103.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:103.
+=======
+>   Called from tests/value/auto_loop_unroll.c:101.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
 148c172,175
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:103: Reusing old results for call to incr
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:103: Reusing old results for call to incr
+=======
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr
+>>>>>>> origin/master
 ---
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:103.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:103.
+=======
+>   Called from tests/value/auto_loop_unroll.c:101.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
 157c184,187
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:103: Reusing old results for call to incr
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:103: Reusing old results for call to incr
+=======
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr
+>>>>>>> origin/master
 ---
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:103.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:103.
+=======
+>   Called from tests/value/auto_loop_unroll.c:101.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
 166c196,199
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:103: Reusing old results for call to incr
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:103: Reusing old results for call to incr
+=======
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr
+>>>>>>> origin/master
 ---
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:103.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:103.
+=======
+>   Called from tests/value/auto_loop_unroll.c:101.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
 175c208,211
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:103: Reusing old results for call to incr
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:103: Reusing old results for call to incr
+=======
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr
+>>>>>>> origin/master
 ---
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:103.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:103.
+=======
+>   Called from tests/value/auto_loop_unroll.c:101.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
 184c220,223
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:103: Reusing old results for call to incr
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:103: Reusing old results for call to incr
+=======
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr
+>>>>>>> origin/master
 ---
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:103.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:103.
+=======
+>   Called from tests/value/auto_loop_unroll.c:101.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
 193c232,235
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:103: Reusing old results for call to incr
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:103: Reusing old results for call to incr
+=======
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr
+>>>>>>> origin/master
 ---
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:103.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:103.
+=======
+>   Called from tests/value/auto_loop_unroll.c:101.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
 202c244,247
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:103: Reusing old results for call to incr
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:103: Reusing old results for call to incr
+=======
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr
+>>>>>>> origin/master
 ---
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:103.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:103.
+=======
+>   Called from tests/value/auto_loop_unroll.c:101.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
 211c256,259
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:103: Reusing old results for call to incr
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:103: Reusing old results for call to incr
+=======
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr
+>>>>>>> origin/master
 ---
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:103.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:103.
+=======
+>   Called from tests/value/auto_loop_unroll.c:101.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
 220c268,271
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:103: Reusing old results for call to incr
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:103: Reusing old results for call to incr
+=======
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr
+>>>>>>> origin/master
 ---
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:103.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:103.
+=======
+>   Called from tests/value/auto_loop_unroll.c:101.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
 229c280,283
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:103: Reusing old results for call to incr
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:103: Reusing old results for call to incr
+=======
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr
+>>>>>>> origin/master
 ---
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:103.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:103.
+=======
+>   Called from tests/value/auto_loop_unroll.c:101.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
 238c292,295
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:103: Reusing old results for call to incr
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:103: Reusing old results for call to incr
+=======
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr
+>>>>>>> origin/master
 ---
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:103.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:103.
+=======
+>   Called from tests/value/auto_loop_unroll.c:101.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
 247c304,307
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:103: Reusing old results for call to incr
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:103: Reusing old results for call to incr
+=======
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr
+>>>>>>> origin/master
 ---
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:103.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:103.
+=======
+>   Called from tests/value/auto_loop_unroll.c:101.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
 256c316,319
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:103: Reusing old results for call to incr
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:103: Reusing old results for call to incr
+=======
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr
+>>>>>>> origin/master
 ---
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:103.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:103.
+=======
+>   Called from tests/value/auto_loop_unroll.c:101.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
 265c328,331
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:103: Reusing old results for call to incr
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:103: Reusing old results for call to incr
+=======
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr
+>>>>>>> origin/master
 ---
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:103.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:103.
+=======
+>   Called from tests/value/auto_loop_unroll.c:101.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
 274c340,343
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:103: Reusing old results for call to incr
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:103: Reusing old results for call to incr
+=======
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr
+>>>>>>> origin/master
 ---
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:103.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:103.
+=======
+>   Called from tests/value/auto_loop_unroll.c:101.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
+<<<<<<< HEAD
 294,295d362
 < [eva:alarm] auto_loop_unroll.c:136: Warning: 
+||||||| ac7807782d
+294,295d362
+< [eva:alarm] tests/value/auto_loop_unroll.c:136: Warning: 
+=======
+296,297d364
+< [eva:alarm] tests/value/auto_loop_unroll.c:145: Warning: 
+>>>>>>> origin/master
 <   signed overflow. assert res + 1 ≤ 2147483647;
-302c369
+304c371
 <   Frama_C_show_each_imprecise: [0..2147483647]
 ---
 >   Frama_C_show_each_imprecise: [10..2147483647]
+<<<<<<< HEAD
 304,308c371,375
 < [eva:alarm] auto_loop_unroll.c:156: Warning: 
 <   signed overflow. assert res + 1 ≤ 2147483647;
@@ -423,38 +1083,178 @@ diff oracle/auto_loop_unroll.1.res.oracle oracle_apron/auto_loop_unroll.1.res.or
 >   Called from auto_loop_unroll.c:163.
 > [eva] Recording results for incr_g
 > [eva] Done for function incr_g
+||||||| ac7807782d
+304,308c371,375
+< [eva:alarm] tests/value/auto_loop_unroll.c:156: Warning: 
+<   signed overflow. assert res + 1 ≤ 2147483647;
+< [eva] tests/value/auto_loop_unroll.c:158: 
+<   Frama_C_show_each_imprecise: [0..2147483647]
+< [eva] tests/value/auto_loop_unroll.c:163: Reusing old results for call to incr_g
+---
+> [eva] tests/value/auto_loop_unroll.c:158: Frama_C_show_each_imprecise: {10}
+> [eva] computing for function incr_g <- complex_loops <- main.
+>   Called from tests/value/auto_loop_unroll.c:163.
+> [eva] Recording results for incr_g
+> [eva] Done for function incr_g
+=======
+>>>>>>> origin/master
 322,327c389,397
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:163: Reusing old results for call to incr_g
 < [eva] auto_loop_unroll.c:163: Reusing old results for call to incr_g
 < [eva:alarm] auto_loop_unroll.c:165: Warning: 
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:163: Reusing old results for call to incr_g
+< [eva] tests/value/auto_loop_unroll.c:163: Reusing old results for call to incr_g
+< [eva:alarm] tests/value/auto_loop_unroll.c:165: Warning: 
+=======
+< [eva] tests/value/auto_loop_unroll.c:162: Reusing old results for call to incr_g
+< [eva] tests/value/auto_loop_unroll.c:162: Reusing old results for call to incr_g
+< [eva:alarm] tests/value/auto_loop_unroll.c:164: Warning: 
+>>>>>>> origin/master
 <   signed overflow. assert res + 1 ≤ 2147483647;
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:167: 
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:167: 
+=======
+< [eva] tests/value/auto_loop_unroll.c:166: 
+>>>>>>> origin/master
 <   Frama_C_show_each_imprecise: [0..2147483647]
 ---
 > [eva] computing for function incr_g <- complex_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:163.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:163.
+=======
+>   Called from tests/value/auto_loop_unroll.c:162.
+>>>>>>> origin/master
 > [eva] Recording results for incr_g
 > [eva] Done for function incr_g
 > [eva] computing for function incr_g <- complex_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:163.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:163.
+=======
+>   Called from tests/value/auto_loop_unroll.c:162.
+>>>>>>> origin/master
 > [eva] Recording results for incr_g
 > [eva] Done for function incr_g
+<<<<<<< HEAD
 > [eva] auto_loop_unroll.c:167: Frama_C_show_each_imprecise: [0..64]
+||||||| ac7807782d
+> [eva] tests/value/auto_loop_unroll.c:167: Frama_C_show_each_imprecise: [0..64]
+=======
+> [eva] tests/value/auto_loop_unroll.c:166: Frama_C_show_each_imprecise: [0..64]
+>>>>>>> origin/master
 329,332c399
+<<<<<<< HEAD
 < [eva:alarm] auto_loop_unroll.c:174: Warning: 
+||||||| ac7807782d
+< [eva:alarm] tests/value/auto_loop_unroll.c:174: Warning: 
+=======
+< [eva:alarm] tests/value/auto_loop_unroll.c:173: Warning: 
+>>>>>>> origin/master
 <   signed overflow. assert res + 1 ≤ 2147483647;
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:176: 
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:176: 
+=======
+< [eva] tests/value/auto_loop_unroll.c:175: 
+>>>>>>> origin/master
 <   Frama_C_show_each_imprecise: [0..2147483647]
 ---
+<<<<<<< HEAD
 > [eva] auto_loop_unroll.c:176: Frama_C_show_each_imprecise: [0..9]
 334,337c401
 < [eva:alarm] auto_loop_unroll.c:182: Warning: 
+||||||| ac7807782d
+> [eva] tests/value/auto_loop_unroll.c:176: Frama_C_show_each_imprecise: [0..9]
+334,337c401
+< [eva:alarm] tests/value/auto_loop_unroll.c:182: Warning: 
+=======
+> [eva] tests/value/auto_loop_unroll.c:175: Frama_C_show_each_imprecise: [0..9]
+334,335d400
+< [eva:alarm] tests/value/auto_loop_unroll.c:181: Warning: 
+>>>>>>> origin/master
 <   signed overflow. assert res + 1 ≤ 2147483647;
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:184: 
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:184: 
+=======
+339c404
+>>>>>>> origin/master
 <   Frama_C_show_each_imprecise: [0..2147483647]
 ---
+<<<<<<< HEAD
 > [eva] auto_loop_unroll.c:184: Frama_C_show_each_imprecise: [0..64]
 diff oracle/backward_add_ptr.res.oracle oracle_apron/backward_add_ptr.res.oracle
+||||||| ac7807782d
+> [eva] tests/value/auto_loop_unroll.c:184: Frama_C_show_each_imprecise: [0..64]
+diff tests/value/oracle/backward_add_ptr.res.oracle tests/value/oracle_apron/backward_add_ptr.res.oracle
+=======
+>   Frama_C_show_each_imprecise: [64..2147483647]
+344c409
+< [eva:loop-unroll] tests/value/auto_loop_unroll.c:192: Automatic loop unrolling.
+---
+> [eva] tests/value/auto_loop_unroll.c:192: starting to merge loop iterations
+346c411
+< [eva:loop-unroll] tests/value/auto_loop_unroll.c:197: Automatic loop unrolling.
+---
+> [eva] tests/value/auto_loop_unroll.c:197: starting to merge loop iterations
+348,353c413,429
+< [eva:loop-unroll] tests/value/auto_loop_unroll.c:203: Automatic loop unrolling.
+< [eva] tests/value/auto_loop_unroll.c:206: Frama_C_show_each_0_13: [0..13]
+< [eva:loop-unroll] tests/value/auto_loop_unroll.c:208: Automatic loop unrolling.
+< [eva] tests/value/auto_loop_unroll.c:211: Frama_C_show_each_0_14: [0..14]
+< [eva:loop-unroll] tests/value/auto_loop_unroll.c:214: Automatic loop unrolling.
+< [eva] tests/value/auto_loop_unroll.c:219: Frama_C_show_each_0_15: [0..15]
+---
+> [eva] tests/value/auto_loop_unroll.c:203: starting to merge loop iterations
+> [eva:alarm] tests/value/auto_loop_unroll.c:203: Warning: 
+>   signed overflow. assert -2147483648 ≤ i_0 - 1;
+> [eva:alarm] tests/value/auto_loop_unroll.c:204: Warning: 
+>   signed overflow. assert res + 1 ≤ 2147483647;
+> [eva] tests/value/auto_loop_unroll.c:206: 
+>   Frama_C_show_each_0_13: [0..2147483647]
+> [eva] tests/value/auto_loop_unroll.c:208: starting to merge loop iterations
+> [eva:alarm] tests/value/auto_loop_unroll.c:208: Warning: 
+>   signed overflow. assert -2147483648 ≤ i_1 - 1;
+> [eva:alarm] tests/value/auto_loop_unroll.c:209: Warning: 
+>   signed overflow. assert res + 1 ≤ 2147483647;
+> [eva] tests/value/auto_loop_unroll.c:211: 
+>   Frama_C_show_each_0_14: [0..2147483647]
+> [eva] tests/value/auto_loop_unroll.c:214: starting to merge loop iterations
+> [eva] tests/value/auto_loop_unroll.c:219: 
+>   Frama_C_show_each_0_15: [0..2147483647]
+364c440,444
+< [eva:loop-unroll] tests/value/auto_loop_unroll.c:240: Automatic loop unrolling.
+---
+> [eva] tests/value/auto_loop_unroll.c:240: starting to merge loop iterations
+> [eva:alarm] tests/value/auto_loop_unroll.c:240: Warning: 
+>   signed overflow. assert -2147483648 ≤ i - 1;
+> [eva:alarm] tests/value/auto_loop_unroll.c:241: Warning: 
+>   signed overflow. assert res + 1 ≤ 2147483647;
+375c455,456
+< [eva] tests/value/auto_loop_unroll.c:263: Frama_C_show_each_top: [0..2147483647]
+---
+> [eva] tests/value/auto_loop_unroll.c:263: 
+>   Frama_C_show_each_top: [31..2147483647]
+391,392d471
+< [eva:alarm] tests/value/auto_loop_unroll.c:283: Warning: 
+<   signed overflow. assert res + 1 ≤ 2147483647;
+425,426c504,505
+<   i ∈ {-1}
+<   res ∈ {21}
+---
+>   i ∈ [-2147483648..20]
+>   res ∈ [0..2147483647]
+diff tests/value/oracle/backward_add_ptr.res.oracle tests/value/oracle_apron/backward_add_ptr.res.oracle
+>>>>>>> origin/master
 71c71,74
 < [eva] backward_add_ptr.c:91: Reusing old results for call to gm
 ---
@@ -985,6 +1785,7 @@ diff oracle/loopinv.res.oracle oracle_apron/loopinv.res.oracle
 ---
 >      3 To be validated
 >     12 Total
+<<<<<<< HEAD
 diff oracle/memexec.res.oracle oracle_apron/memexec.res.oracle
 27,32c27,50
 < [eva] memexec.c:13: Reusing old results for call to f11
@@ -993,6 +1794,25 @@ diff oracle/memexec.res.oracle oracle_apron/memexec.res.oracle
 < [eva] memexec.c:18: Reusing old results for call to f11
 < [eva] memexec.c:20: Reusing old results for call to f11
 < [eva] memexec.c:21: Reusing old results for call to f11
+||||||| ac7807782d
+diff tests/value/oracle/memexec.res.oracle tests/value/oracle_apron/memexec.res.oracle
+27,32c27,50
+< [eva] tests/value/memexec.c:13: Reusing old results for call to f11
+< [eva] tests/value/memexec.c:14: Reusing old results for call to f11
+< [eva] tests/value/memexec.c:16: Reusing old results for call to f11
+< [eva] tests/value/memexec.c:18: Reusing old results for call to f11
+< [eva] tests/value/memexec.c:20: Reusing old results for call to f11
+< [eva] tests/value/memexec.c:21: Reusing old results for call to f11
+=======
+diff tests/value/oracle/memexec.res.oracle tests/value/oracle_apron/memexec.res.oracle
+29,34c29,52
+< [eva] tests/value/memexec.c:13: Reusing old results for call to f11
+< [eva] tests/value/memexec.c:14: Reusing old results for call to f11
+< [eva] tests/value/memexec.c:16: Reusing old results for call to f11
+< [eva] tests/value/memexec.c:18: Reusing old results for call to f11
+< [eva] tests/value/memexec.c:20: Reusing old results for call to f11
+< [eva] tests/value/memexec.c:21: Reusing old results for call to f11
+>>>>>>> origin/master
 ---
 > [eva] computing for function f11 <- f1 <- main.
 >   Called from memexec.c:13.
@@ -1018,22 +1838,46 @@ diff oracle/memexec.res.oracle oracle_apron/memexec.res.oracle
 >   Called from memexec.c:21.
 > [eva] Recording results for f11
 > [eva] Done for function f11
+<<<<<<< HEAD
 106c124,127
 < [eva] memexec.c:113: Reusing old results for call to f5_aux
+||||||| ac7807782d
+106c124,127
+< [eva] tests/value/memexec.c:113: Reusing old results for call to f5_aux
+=======
+108c126,129
+< [eva] tests/value/memexec.c:113: Reusing old results for call to f5_aux
+>>>>>>> origin/master
 ---
 > [eva] computing for function f5_aux <- f5 <- main.
 >   Called from memexec.c:113.
 > [eva] Recording results for f5_aux
 > [eva] Done for function f5_aux
+<<<<<<< HEAD
 129c150,153
 < [eva] memexec.c:137: Reusing old results for call to f7_1
+||||||| ac7807782d
+129c150,153
+< [eva] tests/value/memexec.c:137: Reusing old results for call to f7_1
+=======
+131c152,155
+< [eva] tests/value/memexec.c:137: Reusing old results for call to f7_1
+>>>>>>> origin/master
 ---
 > [eva] computing for function f7_1 <- f7 <- main.
 >   Called from memexec.c:137.
 > [eva] Recording results for f7_1
 > [eva] Done for function f7_1
+<<<<<<< HEAD
 144c168,171
 < [eva] memexec.c:150: Reusing old results for call to f8_1
+||||||| ac7807782d
+144c168,171
+< [eva] tests/value/memexec.c:150: Reusing old results for call to f8_1
+=======
+146c170,173
+< [eva] tests/value/memexec.c:150: Reusing old results for call to f8_1
+>>>>>>> origin/master
 ---
 > [eva] computing for function f8_1 <- f8 <- main.
 >   Called from memexec.c:150.
@@ -1148,9 +1992,19 @@ diff oracle/offsetmap.1.res.oracle oracle_apron/offsetmap.1.res.oracle
 >   a ∈ {1; 6}
 >   b ∈ {0; 1}
 >   a7 ∈ {1}
+<<<<<<< HEAD
 diff oracle/partitioning-annots.4.res.oracle oracle_apron/partitioning-annots.4.res.oracle
 14,15d13
 < [eva:alarm] partitioning-annots.c:134: Warning: 
+||||||| ac7807782d
+diff tests/value/oracle/partitioning-annots.4.res.oracle tests/value/oracle_apron/partitioning-annots.4.res.oracle
+14,15d13
+< [eva:alarm] tests/value/partitioning-annots.c:134: Warning: 
+=======
+diff tests/value/oracle/partitioning-annots.4.res.oracle tests/value/oracle_apron/partitioning-annots.4.res.oracle
+15,16d14
+< [eva:alarm] tests/value/partitioning-annots.c:138: Warning: 
+>>>>>>> origin/master
 <   division by zero. assert j ≢ 0;
 diff oracle/precise_locations.res.oracle oracle_apron/precise_locations.res.oracle
 32,35c32,47
@@ -1394,7 +2248,14 @@ diff oracle/undefined_sequence.1.res.oracle oracle_apron/undefined_sequence.1.re
 >   Called from undefined_sequence.i:54.
 > [eva] Recording results for g
 > [eva] Done for function g
+<<<<<<< HEAD
 diff oracle/unroll.res.oracle oracle_apron/unroll.res.oracle
+||||||| ac7807782d
+diff tests/value/oracle/unroll.res.oracle tests/value/oracle_apron/unroll.res.oracle
+=======
+Only in tests/value/oracle: unit_tests.res.oracle
+diff tests/value/oracle/unroll.res.oracle tests/value/oracle_apron/unroll.res.oracle
+>>>>>>> origin/master
 13,14d12
 < [eva:alarm] unroll.i:34: Warning: 
 <   signed overflow. assert -2147483648 ≤ j - 1;
diff --git a/tests/value/diff_bitwise b/tests/value/diff_bitwise
index 2f1a2f657fb82cc0a4df552d6d1f1532e1bfcd55..6b636b22d793c7a6e0f5b8a7980cdd433dfcae86 100644
--- a/tests/value/diff_bitwise
+++ b/tests/value/diff_bitwise
@@ -23,11 +23,27 @@ diff oracle/addition.res.oracle oracle_bitwise/addition.res.oracle
 <       (origin: Arithmetic {addition.i:52}) }}
 ---
 >   p10 ∈ {{ garbled mix of &{p1} }}
+<<<<<<< HEAD
 diff oracle/bitwise.res.oracle oracle_bitwise/bitwise.res.oracle
 79c79,82
 < [eva] bitwise.i:144: Frama_C_show_each_dead: {0}
+||||||| ac7807782d
+diff tests/value/oracle/bitwise.res.oracle tests/value/oracle_bitwise/bitwise.res.oracle
+79c79,82
+< [eva] tests/value/bitwise.i:144: Frama_C_show_each_dead: {0}
+=======
+diff tests/value/oracle/bitwise.res.oracle tests/value/oracle_bitwise/bitwise.res.oracle
+98c98,101
+< [eva] tests/value/bitwise.i:158: Frama_C_show_each_dead: {0}
+>>>>>>> origin/master
 ---
+<<<<<<< HEAD
 > [eva] bitwise.i:142: 
+||||||| ac7807782d
+> [eva] tests/value/bitwise.i:142: 
+=======
+> [eva] tests/value/bitwise.i:156: 
+>>>>>>> origin/master
 >   The evaluation of the expression x & 2
 >   led to bottom without alarms:
 >   at this point the product of states has no possible concretization.
@@ -50,4 +66,11 @@ diff oracle/logic_ptr_cast.res.oracle oracle_bitwise/logic_ptr_cast.res.oracle
 <   Assigning imprecise value to p.
 <   The imprecision originates from Arithmetic {logic_ptr_cast.i:8}
 ---
+<<<<<<< HEAD
 > [eva] logic_ptr_cast.i:8: Assigning imprecise value to p.
+||||||| ac7807782d
+> [eva] tests/value/logic_ptr_cast.i:8: Assigning imprecise value to p.
+=======
+> [eva] tests/value/logic_ptr_cast.i:8: Assigning imprecise value to p.
+Only in tests/value/oracle: unit_tests.res.oracle
+>>>>>>> origin/master
diff --git a/tests/value/diff_equalities b/tests/value/diff_equalities
index 50ad92a6e91a9443e87cb6e8083f987c1d1c48ec..bdf2cb52c2a2ad78d378abc677c911cca19eabc0 100644
--- a/tests/value/diff_equalities
+++ b/tests/value/diff_equalities
@@ -120,19 +120,49 @@ diff oracle/alias.6.res.oracle oracle_equalities/alias.6.res.oracle
 <   x ∈ {0; 4; 33}
 ---
 >   x ∈ {33}
+<<<<<<< HEAD
 diff oracle/auto_loop_unroll.0.res.oracle oracle_equalities/auto_loop_unroll.0.res.oracle
 82c82,85
 < [eva] auto_loop_unroll.c:103: Reusing old results for call to incr
+||||||| ac7807782d
+diff tests/value/oracle/auto_loop_unroll.0.res.oracle tests/value/oracle_equalities/auto_loop_unroll.0.res.oracle
+82c82,85
+< [eva] tests/value/auto_loop_unroll.c:103: Reusing old results for call to incr
+=======
+diff tests/value/oracle/auto_loop_unroll.0.res.oracle tests/value/oracle_equalities/auto_loop_unroll.0.res.oracle
+81c81,84
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr
+>>>>>>> origin/master
 ---
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:103.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:103.
+=======
+>   Called from tests/value/auto_loop_unroll.c:101.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
+<<<<<<< HEAD
 91c94,97
 < [eva] auto_loop_unroll.c:103: Reusing old results for call to incr
+||||||| ac7807782d
+91c94,97
+< [eva] tests/value/auto_loop_unroll.c:103: Reusing old results for call to incr
+=======
+90c93,96
+< [eva] tests/value/auto_loop_unroll.c:101: Reusing old results for call to incr
+>>>>>>> origin/master
 ---
 > [eva] computing for function incr <- various_loops <- main.
+<<<<<<< HEAD
 >   Called from auto_loop_unroll.c:103.
+||||||| ac7807782d
+>   Called from tests/value/auto_loop_unroll.c:103.
+=======
+>   Called from tests/value/auto_loop_unroll.c:101.
+>>>>>>> origin/master
 > [eva] Recording results for incr
 > [eva] Done for function incr
 diff oracle/backward_add_ptr.res.oracle oracle_equalities/backward_add_ptr.res.oracle
@@ -687,8 +717,16 @@ diff oracle/non_natural.res.oracle oracle_equalities/non_natural.res.oracle
 199a200,201
 > [kernel] non_natural.i:39: 
 >   more than 200(12500) elements to enumerate. Approximating.
+<<<<<<< HEAD
 diff oracle/nonlin.res.oracle oracle_equalities/nonlin.res.oracle
 188c188
+||||||| ac7807782d
+diff tests/value/oracle/nonlin.res.oracle tests/value/oracle_equalities/nonlin.res.oracle
+188c188
+=======
+diff tests/value/oracle/nonlin.res.oracle tests/value/oracle_equalities/nonlin.res.oracle
+194c194
+>>>>>>> origin/master
 <   q ∈ {{ &x + [-400..400],0%4 }}
 ---
 >   q ∈ {{ &x }}
@@ -867,3 +905,4 @@ diff oracle/struct2.res.oracle oracle_equalities/struct2.res.oracle
 <            [9].a}; s1; s2; s5.e[0].b; s6.b; s8; tabl[0..1]; tab1[0..1];
 ---
 >            [9].a}; s1; s2; s5.e[0].b; s6.b; s8; tabl[0..1]; tab1[0];
+Only in tests/value/oracle: unit_tests.res.oracle
diff --git a/tests/value/diff_gauges b/tests/value/diff_gauges
index 9d620be8a25ee1688daaf35c0064dbaf3ea80043..04669bcb5731cc0da4d654ddd45374fcb1e8bfea 100644
--- a/tests/value/diff_gauges
+++ b/tests/value/diff_gauges
@@ -46,22 +46,134 @@ diff oracle/auto_loop_unroll.0.res.oracle oracle_gauges/auto_loop_unroll.0.res.o
 < [eva] auto_loop_unroll.c:82: 
 <   Frama_C_show_each_32_80: [0..2147483647]
 ---
+<<<<<<< HEAD
 > [eva] auto_loop_unroll.c:82: Frama_C_show_each_32_80: [32..83]
 49,52c32
 < [eva:alarm] auto_loop_unroll.c:86: Warning: 
+||||||| ac7807782d
+> [eva] tests/value/auto_loop_unroll.c:82: Frama_C_show_each_32_80: [32..83]
+49,52c32
+< [eva:alarm] tests/value/auto_loop_unroll.c:86: Warning: 
+=======
+> [eva] tests/value/auto_loop_unroll.c:82: Frama_C_show_each_32_80: [32..83]
+55,56d37
+< [eva:alarm] tests/value/auto_loop_unroll.c:88: Warning: 
+>>>>>>> origin/master
 <   signed overflow. assert res + 1 ≤ 2147483647;
+<<<<<<< HEAD
 < [eva] auto_loop_unroll.c:90: 
+||||||| ac7807782d
+< [eva] tests/value/auto_loop_unroll.c:90: 
+=======
+58c39
+<   Frama_C_show_each_40_50: [0..2147483647]
+---
+>   Frama_C_show_each_40_50: [40..1073741861]
+133,136c114
+< [eva:alarm] tests/value/auto_loop_unroll.c:120: Warning: 
+<   signed overflow. assert res + 1 ≤ 2147483647;
+< [eva] tests/value/auto_loop_unroll.c:122: 
+<   Frama_C_show_each_32_64: [0..2147483647]
+---
+> [eva] tests/value/auto_loop_unroll.c:122: Frama_C_show_each_32_64: [32..65]
+185,188c163
+< [eva:alarm] tests/value/auto_loop_unroll.c:173: Warning: 
+<   signed overflow. assert res + 1 ≤ 2147483647;
+< [eva] tests/value/auto_loop_unroll.c:175: 
+<   Frama_C_show_each_imprecise: [0..2147483647]
+---
+> [eva] tests/value/auto_loop_unroll.c:175: Frama_C_show_each_imprecise: [1..9]
+190,191d164
+< [eva:alarm] tests/value/auto_loop_unroll.c:181: Warning: 
+<   signed overflow. assert res + 1 ≤ 2147483647;
+195c168
+<   Frama_C_show_each_imprecise: [0..2147483647]
+---
+>   Frama_C_show_each_imprecise: [64..2147483647]
+201,203c174
+< [eva:alarm] tests/value/auto_loop_unroll.c:193: Warning: 
+<   signed overflow. assert res + 1 ≤ 2147483647;
+< [eva] tests/value/auto_loop_unroll.c:195: Frama_C_show_each_11: [0..2147483647]
+---
+> [eva] tests/value/auto_loop_unroll.c:195: Frama_C_show_each_11: {11}
+205,207c176
+< [eva:alarm] tests/value/auto_loop_unroll.c:198: Warning: 
+<   signed overflow. assert res + 1 ≤ 2147483647;
+< [eva] tests/value/auto_loop_unroll.c:200: Frama_C_show_each_12: [0..2147483647]
+---
+> [eva] tests/value/auto_loop_unroll.c:200: Frama_C_show_each_12: {12}
+209,210d177
+< [eva:alarm] tests/value/auto_loop_unroll.c:204: Warning: 
+<   signed overflow. assert res + 1 ≤ 2147483647;
+212a180,181
+> [eva:alarm] tests/value/auto_loop_unroll.c:204: Warning: 
+>   signed overflow. assert res + 1 ≤ 2147483647;
+216,217d184
+< [eva:alarm] tests/value/auto_loop_unroll.c:209: Warning: 
+<   signed overflow. assert res + 1 ≤ 2147483647;
+219a187,188
+> [eva:alarm] tests/value/auto_loop_unroll.c:209: Warning: 
+>   signed overflow. assert res + 1 ≤ 2147483647;
+223,224d191
+< [eva:alarm] tests/value/auto_loop_unroll.c:217: Warning: 
+<   signed overflow. assert res + 1 ≤ 2147483647;
+228,231c195
+< [eva:alarm] tests/value/auto_loop_unroll.c:222: Warning: 
+<   signed overflow. assert res + 1 ≤ 2147483647;
+< [eva] tests/value/auto_loop_unroll.c:226: 
+>>>>>>> origin/master
 <   Frama_C_show_each_11_111: [0..2147483647]
 ---
+<<<<<<< HEAD
 > [eva] auto_loop_unroll.c:90: Frama_C_show_each_11_111: [11..111]
 60,61d39
 < [eva:alarm] auto_loop_unroll.c:96: Warning: 
+||||||| ac7807782d
+> [eva] tests/value/auto_loop_unroll.c:90: Frama_C_show_each_11_111: [11..111]
+60,61d39
+< [eva:alarm] tests/value/auto_loop_unroll.c:96: Warning: 
+=======
+> [eva] tests/value/auto_loop_unroll.c:226: Frama_C_show_each_11_111: [11..111]
+239,241c203
+< [eva:alarm] tests/value/auto_loop_unroll.c:236: Warning: 
+>>>>>>> origin/master
 <   signed overflow. assert res + 1 ≤ 2147483647;
-63c41
-<   Frama_C_show_each_40_50: [0..2147483647]
+< [eva] tests/value/auto_loop_unroll.c:238: Frama_C_show_each_20: [0..2147483647]
 ---
+<<<<<<< HEAD
 >   Frama_C_show_each_40_50: [40..1073741861]
 diff oracle/auto_loop_unroll.1.res.oracle oracle_gauges/auto_loop_unroll.1.res.oracle
+||||||| ac7807782d
+>   Frama_C_show_each_40_50: [40..1073741861]
+diff tests/value/oracle/auto_loop_unroll.1.res.oracle tests/value/oracle_gauges/auto_loop_unroll.1.res.oracle
+=======
+> [eva] tests/value/auto_loop_unroll.c:238: Frama_C_show_each_20: [20..2147483646]
+243,244d204
+< [eva:alarm] tests/value/auto_loop_unroll.c:241: Warning: 
+<   signed overflow. assert res + 1 ≤ 2147483647;
+247c207,209
+< [eva] tests/value/auto_loop_unroll.c:243: Frama_C_show_each_21: [0..2147483647]
+---
+> [eva:alarm] tests/value/auto_loop_unroll.c:241: Warning: 
+>   signed overflow. assert res + 1 ≤ 2147483647;
+> [eva] tests/value/auto_loop_unroll.c:243: Frama_C_show_each_21: {21}
+253,255c215,216
+< [eva:alarm] tests/value/auto_loop_unroll.c:250: Warning: 
+<   signed overflow. assert res + 1 ≤ 2147483647;
+< [eva] tests/value/auto_loop_unroll.c:254: Frama_C_show_each_30: [0..2147483647]
+---
+> [eva] tests/value/auto_loop_unroll.c:254: Frama_C_show_each_30: {30}
+> [eva] tests/value/auto_loop_unroll.c:258: starting to merge loop iterations
+258d218
+< [eva] tests/value/auto_loop_unroll.c:258: starting to merge loop iterations
+261,263c221
+< [eva:alarm] tests/value/auto_loop_unroll.c:267: Warning: 
+<   signed overflow. assert res + 1 ≤ 2147483647;
+< [eva] tests/value/auto_loop_unroll.c:272: Frama_C_show_each_32: [0..2147483647]
+---
+> [eva] tests/value/auto_loop_unroll.c:272: Frama_C_show_each_32: {32}
+diff tests/value/oracle/auto_loop_unroll.1.res.oracle tests/value/oracle_gauges/auto_loop_unroll.1.res.oracle
+>>>>>>> origin/master
 15,18c15
 < [eva:alarm] auto_loop_unroll.c:31: Warning: 
 <   signed overflow. assert res + 1 ≤ 2147483647;
@@ -75,8 +187,115 @@ diff oracle/auto_loop_unroll.1.res.oracle oracle_gauges/auto_loop_unroll.1.res.o
 < [eva] auto_loop_unroll.c:41: 
 <   Frama_C_show_each_imprecise: [0..2147483647]
 ---
+<<<<<<< HEAD
 > [eva] auto_loop_unroll.c:41: Frama_C_show_each_imprecise: {100}
 diff oracle/bad_loop.res.oracle oracle_gauges/bad_loop.res.oracle
+||||||| ac7807782d
+> [eva] tests/value/auto_loop_unroll.c:41: Frama_C_show_each_imprecise: {100}
+diff tests/value/oracle/bad_loop.res.oracle tests/value/oracle_gauges/bad_loop.res.oracle
+=======
+> [eva] tests/value/auto_loop_unroll.c:41: Frama_C_show_each_imprecise: {100}
+329,332c323
+< [eva:alarm] tests/value/auto_loop_unroll.c:173: Warning: 
+<   signed overflow. assert res + 1 ≤ 2147483647;
+< [eva] tests/value/auto_loop_unroll.c:175: 
+<   Frama_C_show_each_imprecise: [0..2147483647]
+---
+> [eva] tests/value/auto_loop_unroll.c:175: Frama_C_show_each_imprecise: [1..9]
+334,335d324
+< [eva:alarm] tests/value/auto_loop_unroll.c:181: Warning: 
+<   signed overflow. assert res + 1 ≤ 2147483647;
+339c328
+<   Frama_C_show_each_imprecise: [0..2147483647]
+---
+>   Frama_C_show_each_imprecise: [64..2147483647]
+385a375,458
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 200 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 300 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 400 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 500 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 600 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 700 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 800 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 900 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 1000 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 1100 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 1200 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 1300 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 1400 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 1500 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 1600 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 1700 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 1800 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 1900 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 2000 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 2100 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 2200 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 2300 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 2400 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 2500 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 2600 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 2700 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 2800 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 2900 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 3000 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 3100 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 3200 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 3300 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 3400 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 3500 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 3600 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 3700 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 3800 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 3900 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 4000 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 4100 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 4200 states
+> [eva] tests/value/auto_loop_unroll.c:276: 
+>   Trace partitioning superposing up to 4300 states
+diff tests/value/oracle/bad_loop.res.oracle tests/value/oracle_gauges/bad_loop.res.oracle
+>>>>>>> origin/master
 6a7
 > [eva] bad_loop.i:12: starting to merge loop iterations
 diff oracle/bitfield.res.oracle oracle_gauges/bitfield.res.oracle
@@ -585,11 +804,25 @@ diff oracle/loopfun.1.res.oracle oracle_gauges/loopfun.1.res.oracle
 11a15
 > [eva] loopfun.i:26: starting to merge loop iterations
 13a18
+<<<<<<< HEAD
 > [eva] loopfun.i:27: starting to merge loop iterations
 diff oracle/memexec.res.oracle oracle_gauges/memexec.res.oracle
 101a102
 > [eva] memexec.c:98: starting to merge loop iterations
 diff oracle/modulo.res.oracle oracle_gauges/modulo.res.oracle
+||||||| ac7807782d
+> [eva] tests/value/loopfun.i:27: starting to merge loop iterations
+diff tests/value/oracle/memexec.res.oracle tests/value/oracle_gauges/memexec.res.oracle
+101a102
+> [eva] tests/value/memexec.c:98: starting to merge loop iterations
+diff tests/value/oracle/modulo.res.oracle tests/value/oracle_gauges/modulo.res.oracle
+=======
+> [eva] tests/value/loopfun.i:27: starting to merge loop iterations
+diff tests/value/oracle/memexec.res.oracle tests/value/oracle_gauges/memexec.res.oracle
+103a104
+> [eva] tests/value/memexec.c:98: starting to merge loop iterations
+diff tests/value/oracle/modulo.res.oracle tests/value/oracle_gauges/modulo.res.oracle
+>>>>>>> origin/master
 40a41,123
 > [eva] modulo.i:41: Frama_C_show_each_1: [-10..-1], [-9..-1], [-8..0]
 > [eva] modulo.i:41: Frama_C_show_each_1: [-10..-1], [1..9], [-8..0]
@@ -1046,8 +1279,17 @@ diff oracle/undefined_sequence.0.res.oracle oracle_gauges/undefined_sequence.0.r
 97a98
 > [eva] undefined_sequence.i:43: starting to merge loop iterations
 101a103
+<<<<<<< HEAD
 > [eva] undefined_sequence.i:49: starting to merge loop iterations
 diff oracle/unroll.res.oracle oracle_gauges/unroll.res.oracle
+||||||| ac7807782d
+> [eva] tests/value/undefined_sequence.i:49: starting to merge loop iterations
+diff tests/value/oracle/unroll.res.oracle tests/value/oracle_gauges/unroll.res.oracle
+=======
+> [eva] tests/value/undefined_sequence.i:49: starting to merge loop iterations
+Only in tests/value/oracle: unit_tests.res.oracle
+diff tests/value/oracle/unroll.res.oracle tests/value/oracle_gauges/unroll.res.oracle
+>>>>>>> origin/master
 13,14d12
 < [eva:alarm] unroll.i:34: Warning: 
 <   signed overflow. assert -2147483648 ≤ j - 1;
diff --git a/tests/value/diff_octagons b/tests/value/diff_octagons
index 03691b504853e4fa6b802fb81df90325ae8291ef..a45ce7e5d6dd5eeb2ef8a6388b1250053ba4fabf 100644
--- a/tests/value/diff_octagons
+++ b/tests/value/diff_octagons
@@ -33,7 +33,27 @@ diff oracle/alias.6.res.oracle oracle_octagons/alias.6.res.oracle
 >   tz1 ∈ {1}
 >   tz2 ∈ {1}
 >   tz3 ∈ {1}
+<<<<<<< HEAD
 diff oracle/bitfield.res.oracle oracle_octagons/bitfield.res.oracle
+||||||| ac7807782d
+diff tests/value/oracle/bitfield.res.oracle tests/value/oracle_octagons/bitfield.res.oracle
+=======
+diff tests/value/oracle/auto_loop_unroll.0.res.oracle tests/value/oracle_octagons/auto_loop_unroll.0.res.oracle
+211,212d210
+< [eva:alarm] tests/value/auto_loop_unroll.c:203: Warning: 
+<   signed overflow. assert -2147483648 ≤ i_0 - 1;
+218,219d215
+< [eva:alarm] tests/value/auto_loop_unroll.c:208: Warning: 
+<   signed overflow. assert -2147483648 ≤ i_1 - 1;
+245,246d240
+< [eva:alarm] tests/value/auto_loop_unroll.c:240: Warning: 
+<   signed overflow. assert -2147483648 ≤ i - 1;
+306c300
+<   i ∈ [-2147483648..20]
+---
+>   i ∈ {-1}
+diff tests/value/oracle/bitfield.res.oracle tests/value/oracle_octagons/bitfield.res.oracle
+>>>>>>> origin/master
 138a139,141
 > [eva] bitfield.i:71: 
 >   Frama_C_show_each:
@@ -237,6 +257,7 @@ diff oracle/non_natural.res.oracle oracle_octagons/non_natural.res.oracle
 199a200,201
 > [kernel] non_natural.i:39: 
 >   more than 200(12500) elements to enumerate. Approximating.
+<<<<<<< HEAD
 diff oracle/nonlin.res.oracle oracle_octagons/nonlin.res.oracle
 107a108,109
 > [eva:nonlin] nonlin.c:65: non-linear 'x * x', lv 'x'
@@ -256,6 +277,47 @@ diff oracle/nonlin.res.oracle oracle_octagons/nonlin.res.oracle
 155a166
 > [eva:nonlin] nonlin.c:115: subdividing on x
 diff oracle/plevel.res.oracle oracle_octagons/plevel.res.oracle
+||||||| ac7807782d
+diff tests/value/oracle/nonlin.res.oracle tests/value/oracle_octagons/nonlin.res.oracle
+107a108,109
+> [eva:nonlin] tests/value/nonlin.c:65: non-linear 'x * x', lv 'x'
+> [eva:nonlin] tests/value/nonlin.c:65: subdividing on x
+110a113,115
+> [eva:nonlin] tests/value/nonlin.c:66: subdividing on x
+> [eva:nonlin] tests/value/nonlin.c:66: non-linear 'y * y', lv 'y'
+> [eva:nonlin] tests/value/nonlin.c:66: subdividing on y
+113a119,120
+> [eva:nonlin] tests/value/nonlin.c:68: non-linear 'z * x + x * y', lv 'x'
+> [eva:nonlin] tests/value/nonlin.c:68: subdividing on x
+151a159,160
+> [eva:nonlin] tests/value/nonlin.c:112: non-linear 'x * x', lv 'x'
+> [eva:nonlin] tests/value/nonlin.c:112: subdividing on x
+154a164
+> [eva:nonlin] tests/value/nonlin.c:113: subdividing on x
+155a166
+> [eva:nonlin] tests/value/nonlin.c:115: subdividing on x
+diff tests/value/oracle/plevel.res.oracle tests/value/oracle_octagons/plevel.res.oracle
+=======
+diff tests/value/oracle/nonlin.res.oracle tests/value/oracle_octagons/nonlin.res.oracle
+113a114,115
+> [eva:nonlin] tests/value/nonlin.c:71: non-linear 'x * x', lv 'x'
+> [eva:nonlin] tests/value/nonlin.c:71: subdividing on x
+116a119,121
+> [eva:nonlin] tests/value/nonlin.c:72: subdividing on x
+> [eva:nonlin] tests/value/nonlin.c:72: non-linear 'y * y', lv 'y'
+> [eva:nonlin] tests/value/nonlin.c:72: subdividing on y
+119a125,126
+> [eva:nonlin] tests/value/nonlin.c:74: non-linear 'z * x + x * y', lv 'x'
+> [eva:nonlin] tests/value/nonlin.c:74: subdividing on x
+157a165,166
+> [eva:nonlin] tests/value/nonlin.c:118: non-linear 'x * x', lv 'x'
+> [eva:nonlin] tests/value/nonlin.c:118: subdividing on x
+160a170
+> [eva:nonlin] tests/value/nonlin.c:119: subdividing on x
+161a172
+> [eva:nonlin] tests/value/nonlin.c:121: subdividing on x
+diff tests/value/oracle/plevel.res.oracle tests/value/oracle_octagons/plevel.res.oracle
+>>>>>>> origin/master
 12d11
 < [eva] Recording results for main
 14a14
@@ -386,7 +448,14 @@ diff oracle/test.0.res.oracle oracle_octagons/test.0.res.oracle
 <   j ∈ [-1073741822..1]
 ---
 >   j ∈ {-1; 0; 1}
+<<<<<<< HEAD
 diff oracle/unroll.res.oracle oracle_octagons/unroll.res.oracle
+||||||| ac7807782d
+diff tests/value/oracle/unroll.res.oracle tests/value/oracle_octagons/unroll.res.oracle
+=======
+Only in tests/value/oracle: unit_tests.res.oracle
+diff tests/value/oracle/unroll.res.oracle tests/value/oracle_octagons/unroll.res.oracle
+>>>>>>> origin/master
 22c22
 <   G ∈ [17739..2147483647]
 ---
diff --git a/tests/value/diff_symblocs b/tests/value/diff_symblocs
index 813f88e9f4a35e60b22be6d9777b36c371f9f39b..0409787495622e07771cc58c4afb260694420a4b 100644
--- a/tests/value/diff_symblocs
+++ b/tests/value/diff_symblocs
@@ -326,3 +326,4 @@ diff oracle/test.0.res.oracle oracle_symblocs/test.0.res.oracle
 <   tmp ∈ [--..--] or UNINITIALIZED
 ---
 >   tmp ∈ [-2147483647..2147483647] or UNINITIALIZED
+Only in tests/value/oracle: unit_tests.res.oracle
diff --git a/tests/value/div.i b/tests/value/div.i
index 83c8c0e512ea065b5e3a12131dbdb660196b9d56..f59e2c5a3e483562d88cc26eaf9dcdbff15a15df 100644
--- a/tests/value/div.i
+++ b/tests/value/div.i
@@ -1,6 +1,14 @@
 /* run.config*
+<<<<<<< HEAD
    STDOPT: #"-eva-remove-redundant-alarms"
    OPT: -machdep x86_32 -rte -then -eva @EVA_OPTIONS@
+||||||| ac7807782d
+   STDOPT: #"-load-module scope -eva-remove-redundant-alarms"
+   OPT: -no-autoload-plugins -load-module eva,inout -rte -then -eva @EVA_CONFIG@
+=======
+   STDOPT: #"-load-module scope -eva-remove-redundant-alarms"
+   OPT: -machdep x86_32 -no-autoload-plugins -load-module eva,inout -rte -then -eva @EVA_CONFIG@
+>>>>>>> origin/master
 */
 int X,Y,Z1,Z2,T,U1,U2,V,W1,W2;
 int a,b,d1,d2,d0,e;
diff --git a/tests/value/empty_base.c b/tests/value/empty_base.c
index a1e08e2b7e0741f4c18b6cac0b635446cf67ed43..870994da2f4d3b5834516cd276d5da2517dfb138 100644
--- a/tests/value/empty_base.c
+++ b/tests/value/empty_base.c
@@ -1,6 +1,12 @@
 /* run.config*
+<<<<<<< HEAD
    EXIT: 1
    STDOPT: +"-machdep gcc_x86_32"
+||||||| ac7807782d
+   STDOPT: #"-machdep gcc_x86_32"
+=======
+   STDOPT: +"-machdep gcc_x86_32"
+>>>>>>> origin/master
    STDOPT:
  */
 // the tests above must be done separately because both fail:
diff --git a/tests/value/empty_struct.c b/tests/value/empty_struct.c
index 0ca38cecd3dfb87baba8c019e1189e7068e9c6dc..64af6878098e8b756f7d6217260e23f21642491e 100644
--- a/tests/value/empty_struct.c
+++ b/tests/value/empty_struct.c
@@ -2,10 +2,18 @@
    STDOPT: +" -machdep gcc_x86_32 -cpp-extra-args=-DP1 -then -lib-entry"
    STDOPT: +" -machdep gcc_x86_32 -cpp-extra-args=-DP2 -lib-entry"
    STDOPT: +" -machdep gcc_x86_32 -cpp-extra-args=-DP3 -lib-entry"
+<<<<<<< HEAD
 EXIT: 1
    STDOPT: +" -cpp-extra-args=-DP1 -lib-entry"
 EXIT: 0
    STDOPT: +" -cpp-extra-args=-DP1 -absolute-valid-range 0-1 -main main2"
+||||||| ac7807782d
+   STDOPT: +" -cpp-extra-args=-DP1 -lib-entry"
+   STDOPT: +" -cpp-extra-args=-DP1 -absolute-valid-range 0-1 -main main2"
+=======
+   STDOPT: +" -machdep gcc_x86_32 -cpp-extra-args=-DP1 -lib-entry"
+   STDOPT: +" -machdep gcc_x86_32 -cpp-extra-args=-DP1 -absolute-valid-range 0-1 -main main2"
+>>>>>>> origin/master
    STDOPT: +"  -cpp-extra-args=\"-DP1 -DP5\" -machdep gcc_x86_32 -absolute-valid-range 0-1 -main main3"
    STDOPT: +" -machdep gcc_x86_32 -cpp-extra-args=-DP1 -main main4"
 */
diff --git a/tests/value/empty_struct2.c b/tests/value/empty_struct2.c
index 857b049965c9e7d384442595aacd1ca9d4c8df13..9cff3b7e3501705461f50781d898a11121decb63 100644
--- a/tests/value/empty_struct2.c
+++ b/tests/value/empty_struct2.c
@@ -1,3 +1,7 @@
+/* run.config
+   STDOPT: +"-machdep gcc_x86_64"
+*/
+
 #include <string.h>
 
 volatile int nondet;
diff --git a/tests/value/implies.i b/tests/value/implies.i
index 005c828797c2e60e680f880869d43e286272fd1c..b0c3b3a5b4beae1a522a0b84fc33cb86f61ec019 100644
--- a/tests/value/implies.i
+++ b/tests/value/implies.i
@@ -8,4 +8,4 @@ int main(int c, int d)
   /*@ assert c ==> \false; */
   return 1 + c;
 
-}
\ No newline at end of file
+}
diff --git a/tests/value/memexec.c b/tests/value/memexec.c
index 36b1a450f3bf5c18f1fd93e513a762d7d41802e8..1023354a4332f15a43204c40d955c226bf5699be 100644
--- a/tests/value/memexec.c
+++ b/tests/value/memexec.c
@@ -1,5 +1,5 @@
 /* run.config*
-   STDOPT: #" -no-eva -rte-select fbug -rte -then -eva"
+   STDOPT: +"-rte-select fbug -rte -then -eva"
 */
 
 int x1, y1, z1, z2; volatile int c, nondet;
diff --git a/tests/value/nonlin.c b/tests/value/nonlin.c
index 1a05ef68d3147308ca183a5a8b6a18b65e876d76..2fe0f90f17a8ee5072ccd76445e60dfa44ad7708 100644
--- a/tests/value/nonlin.c
+++ b/tests/value/nonlin.c
@@ -16,9 +16,15 @@ void subdivide_pointer () {
   int *q = p + i - i;
   /* The complete expression is a singleton: no subdivision. */
   y = *(&y + i - i);
-  /* The complete expression is an imprecise integer: subdivision (but not
+  /* The complete expression is an imprecise integer: subdivision (but no
      reduction, as it cannot improve the bounds of the result). */
   y = *(p + i - i);
+  /* The subexpression contains a pointer, but the complete expression is an
+     integer, and the subdivision can reduce its value. */
+  int t[10] = {0, 1, 2, 4, 5, 6, 7, 8, 9};
+  p = &t[0];
+  i = Frama_C_interval(0, 10);
+  y = *(p + i - i);
   /* The splitted lvalue contains a pointer value: no subdivision. */
   i = v ? i : (int) &x;
   y = *(p + i - i);
diff --git a/tests/value/oracle/backward_arith.res.oracle b/tests/value/oracle/backward_arith.res.oracle
index 67824bed00276541596e1f5ca26af94e4ee4c235..90987a86f490108aa0be630445caddb0549accb3 100644
--- a/tests/value/oracle/backward_arith.res.oracle
+++ b/tests/value/oracle/backward_arith.res.oracle
@@ -5,39 +5,116 @@
 [eva:initial-state] Values of globals at initialization
   nondet ∈ [--..--]
 [eva] computing for function unsigned_neg <- main.
+<<<<<<< HEAD
   Called from backward_arith.i:31.
 [eva] backward_arith.i:12: Frama_C_show_each_ten: {10}
 [eva] backward_arith.i:14: Frama_C_show_each_not_ten: [0..4294967295]
 [eva] backward_arith.i:16: 
+||||||| ac7807782d
+  Called from tests/value/backward_arith.i:31.
+[eva] tests/value/backward_arith.i:12: Frama_C_show_each_ten: {10}
+[eva] tests/value/backward_arith.i:14: 
+  Frama_C_show_each_not_ten: [0..4294967295]
+[eva] tests/value/backward_arith.i:16: 
+=======
+  Called from tests/value/backward_arith.i:75.
+[eva] tests/value/backward_arith.i:13: Frama_C_show_each_ten: {10}
+[eva] tests/value/backward_arith.i:15: 
+  Frama_C_show_each_not_ten: [0..4294967295]
+[eva] tests/value/backward_arith.i:17: 
+>>>>>>> origin/master
   Frama_C_show_each_greater_than_ten_or_zero: [0..4294967295]
+<<<<<<< HEAD
 [eva] backward_arith.i:18: Frama_C_show_each_smaller_than_ten_but_zero: [1..10]
 [eva] backward_arith.i:20: Frama_C_show_each_minus_ten: {4294967286}
 [eva] backward_arith.i:22: Frama_C_show_each_not_minus_ten: [0..4294967295]
 [eva] backward_arith.i:24: 
+||||||| ac7807782d
+[eva] tests/value/backward_arith.i:18: 
+  Frama_C_show_each_smaller_than_ten_but_zero: [1..10]
+[eva] tests/value/backward_arith.i:20: Frama_C_show_each_minus_ten: {4294967286}
+[eva] tests/value/backward_arith.i:22: 
+  Frama_C_show_each_not_minus_ten: [0..4294967295]
+[eva] tests/value/backward_arith.i:24: 
+=======
+[eva] tests/value/backward_arith.i:19: 
+  Frama_C_show_each_smaller_than_ten_but_zero: [1..10]
+[eva] tests/value/backward_arith.i:21: Frama_C_show_each_minus_ten: {4294967286}
+[eva] tests/value/backward_arith.i:23: 
+  Frama_C_show_each_not_minus_ten: [0..4294967295]
+[eva] tests/value/backward_arith.i:25: 
+>>>>>>> origin/master
   Frama_C_show_each_greater_than_minus_ten_or_zero: [0..4294967295]
+<<<<<<< HEAD
 [eva] backward_arith.i:26: 
+||||||| ac7807782d
+[eva] tests/value/backward_arith.i:26: 
+=======
+[eva] tests/value/backward_arith.i:27: 
+>>>>>>> origin/master
   Frama_C_show_each_smaller_than_minus_ten_but_zero: [1..4294967286]
 [eva] Recording results for unsigned_neg
 [eva] Done for function unsigned_neg
+[eva] computing for function logical_operators <- main.
+  Called from tests/value/backward_arith.i:76.
+[eva] tests/value/backward_arith.i:38: 
+  Frama_C_show_each: {{ "0..10" }}, [0..10], {{ "0..20" }}, [0..20]
+[eva] tests/value/backward_arith.i:40: 
+  Frama_C_show_each: {{ "top" }}, [0..4294967295], {{ "top" }}, [0..4294967295]
+[eva] tests/value/backward_arith.i:42: 
+  Frama_C_show_each: {{ "0..9" }}, [0..9], {{ "0..9" }}, [0..9]
+[eva] tests/value/backward_arith.i:44: 
+  Frama_C_show_each: {{ "0..9" }}, [0..9], {{ "10..max" }}, [10..4294967295]
+[eva] tests/value/backward_arith.i:48: 
+  Frama_C_show_each: {{ "0..9" }}, [0..9], {{ "top" }}, [0..4294967295]
+[eva] tests/value/backward_arith.i:52: 
+  Frama_C_show_each: {{ "0..9" }}, [0..9], {{ "0..9" }}, [0..9]
+[eva] tests/value/backward_arith.i:56: 
+  Frama_C_show_each: {{ "top" }}, [0..4294967295], {{ "top" }}, [0..4294967295]
+[eva] tests/value/backward_arith.i:58: 
+  Frama_C_show_each: {{ "0..10" }}, [0..10], {{ "0..20" }}, [0..20]
+[eva] tests/value/backward_arith.i:60: 
+  Frama_C_show_each: {{ "0..9" }}, [0..9], {{ "11..max" }}, [11..4294967295]
+[eva] tests/value/backward_arith.i:62: 
+  Frama_C_show_each: {{ "0..9" }}, [0..9], {{ "0..10" }}, [0..10]
+[eva] tests/value/backward_arith.i:64: 
+  Frama_C_show_each: {{ "0..9" }}, [0..9], {{ "top" }}, [0..4294967295]
+[eva] tests/value/backward_arith.i:70: 
+  Frama_C_show_each: {{ "0..9" }}, [0..9], {{ "0..9" }}, [0..9]
+[eva] Recording results for logical_operators
+[eva] Done for function logical_operators
 [eva] Recording results for main
 [eva] done for function main
 [eva] ====== VALUES COMPUTED ======
+[eva:final-states] Values at end of function logical_operators:
+  x ∈ [--..--]
+  y ∈ [--..--]
+  a ∈ [0..9]
+  b ∈ [0..9]
 [eva:final-states] Values at end of function unsigned_neg:
   x ∈ [--..--]
   minus_ten ∈ {4294967286}
 [eva:final-states] Values at end of function main:
   __retres ∈ {0}
+[from] Computing for function logical_operators
+[from] Done for function logical_operators
 [from] Computing for function unsigned_neg
 [from] Done for function unsigned_neg
 [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 logical_operators:
+  NO EFFECTS
 [from] Function unsigned_neg:
   NO EFFECTS
 [from] Function main:
   \result FROM \nothing
 [from] ====== END OF DEPENDENCIES ======
+[inout] Out (internal) for function logical_operators:
+    x; y; a; b
+[inout] Inputs for function logical_operators:
+    nondet
 [inout] Out (internal) for function unsigned_neg:
     x; minus_ten
 [inout] Inputs for function unsigned_neg:
diff --git a/tests/value/oracle/bool.res.oracle b/tests/value/oracle/bool.res.oracle
index 9911b54bcebb1ffe7b87465f46119702ac00992f..bd0f602ff3a9b47261032ddd616b648ae834ba19 100644
--- a/tests/value/oracle/bool.res.oracle
+++ b/tests/value/oracle/bool.res.oracle
@@ -5,18 +5,48 @@
 [eva:initial-state] Values of globals at initialization
   rand ∈ [--..--]
 [eva] computing for function valid_bool <- main.
+<<<<<<< HEAD
   Called from bool.i:61.
 [eva] bool.i:12: Frama_C_show_each: {0}
 [eva] bool.i:14: Frama_C_show_each: {1}
 [eva] bool.i:16: Frama_C_show_each: {1}, {2}
 [eva] bool.i:18: Frama_C_show_each: {1}
 [eva] bool.i:20: Frama_C_show_each: {1}
+||||||| ac7807782d
+  Called from tests/value/bool.i:61.
+[eva] tests/value/bool.i:12: Frama_C_show_each: {0}
+[eva] tests/value/bool.i:14: Frama_C_show_each: {1}
+[eva] tests/value/bool.i:16: Frama_C_show_each: {1}, {2}
+[eva] tests/value/bool.i:18: Frama_C_show_each: {1}
+[eva] tests/value/bool.i:20: Frama_C_show_each: {1}
+=======
+  Called from tests/value/bool.i:71.
+[eva] tests/value/bool.i:12: Frama_C_show_each: {0}
+[eva] tests/value/bool.i:14: Frama_C_show_each: {1}
+[eva] tests/value/bool.i:16: Frama_C_show_each: {1}, {2}
+[eva] tests/value/bool.i:18: Frama_C_show_each: {1}
+[eva] tests/value/bool.i:20: Frama_C_show_each: {1}
+[eva] tests/value/bool.i:22: Frama_C_show_each: {1}
+[eva] tests/value/bool.i:24: Frama_C_show_each: {0}
+[eva] tests/value/bool.i:26: Frama_C_show_each: {1}
+[eva] tests/value/bool.i:28: Frama_C_show_each: {0}
+[eva] tests/value/bool.i:30: Frama_C_show_each: {1}
+>>>>>>> origin/master
 [eva] Recording results for valid_bool
 [eva] Done for function valid_bool
 [eva] computing for function invalid_bool <- main.
+<<<<<<< HEAD
   Called from bool.i:62.
 [eva:alarm] bool.i:33: Warning: 
+||||||| ac7807782d
+  Called from tests/value/bool.i:62.
+[eva:alarm] tests/value/bool.i:33: Warning: 
+=======
+  Called from tests/value/bool.i:72.
+[eva:alarm] tests/value/bool.i:43: Warning: 
+>>>>>>> origin/master
   trap representation of a _Bool lvalue. assert ub.b ≡ 0 ∨ ub.b ≡ 1;
+<<<<<<< HEAD
 [eva] bool.i:36: Frama_C_show_each_zero: {0}
 [eva] bool.i:39: Frama_C_show_each_one: {1}
 [eva:alarm] bool.i:42: Warning: 
@@ -26,17 +56,66 @@
 [eva] bool.i:46: Frama_C_show_each_zero_or_one: {0; 1}
 [eva] bool.i:49: Frama_C_show_each_one: {1}
 [eva:alarm] bool.i:52: Warning: 
+||||||| ac7807782d
+[eva] tests/value/bool.i:36: Frama_C_show_each_zero: {0}
+[eva] tests/value/bool.i:39: Frama_C_show_each_one: {1}
+[eva:alarm] tests/value/bool.i:42: Warning: 
+  trap representation of a _Bool lvalue. assert ub.b ≡ 0 ∨ ub.b ≡ 1;
+[eva:alarm] tests/value/bool.i:45: Warning: 
+  trap representation of a _Bool lvalue. assert ub.b ≡ 0 ∨ ub.b ≡ 1;
+[eva] tests/value/bool.i:46: Frama_C_show_each_zero_or_one: {0; 1}
+[eva] tests/value/bool.i:49: Frama_C_show_each_one: {1}
+[eva:alarm] tests/value/bool.i:52: Warning: 
+=======
+[eva] tests/value/bool.i:46: Frama_C_show_each_zero: {0}
+[eva] tests/value/bool.i:49: Frama_C_show_each_one: {1}
+[eva:alarm] tests/value/bool.i:52: Warning: 
+  trap representation of a _Bool lvalue. assert ub.b ≡ 0 ∨ ub.b ≡ 1;
+[eva:alarm] tests/value/bool.i:55: Warning: 
+  trap representation of a _Bool lvalue. assert ub.b ≡ 0 ∨ ub.b ≡ 1;
+[eva] tests/value/bool.i:56: Frama_C_show_each_zero_or_one: {0; 1}
+[eva] tests/value/bool.i:59: Frama_C_show_each_one: {1}
+[eva:alarm] tests/value/bool.i:62: Warning: 
+>>>>>>> origin/master
   trap representation of a _Bool lvalue. assert b ≡ 0 ∨ b ≡ 1;
+<<<<<<< HEAD
 [eva:alarm] bool.i:56: Warning: 
+||||||| ac7807782d
+[eva:alarm] tests/value/bool.i:56: Warning: 
+=======
+[eva:alarm] tests/value/bool.i:66: Warning: 
+>>>>>>> origin/master
   trap representation of a _Bool lvalue. assert *p ≡ 0 ∨ *p ≡ 1;
+<<<<<<< HEAD
 [eva] bool.i:57: Frama_C_show_each_zero_or_one: {0; 1}
+||||||| ac7807782d
+[eva] tests/value/bool.i:57: Frama_C_show_each_zero_or_one: {0; 1}
+=======
+[eva] tests/value/bool.i:67: Frama_C_show_each_zero_or_one: {0; 1}
+>>>>>>> origin/master
 [eva] Recording results for invalid_bool
 [eva] Done for function invalid_bool
 [eva] Recording results for main
 [eva] done for function main
+<<<<<<< HEAD
 [eva] bool.i:33: assertion 'Eva,bool_value' got final status invalid.
 [eva] bool.i:42: assertion 'Eva,bool_value' got final status invalid.
 [eva] bool.i:52: assertion 'Eva,bool_value' got final status invalid.
+||||||| ac7807782d
+[eva] tests/value/bool.i:33: 
+  assertion 'Eva,bool_value' got final status invalid.
+[eva] tests/value/bool.i:42: 
+  assertion 'Eva,bool_value' got final status invalid.
+[eva] tests/value/bool.i:52: 
+  assertion 'Eva,bool_value' got final status invalid.
+=======
+[eva] tests/value/bool.i:43: 
+  assertion 'Eva,bool_value' got final status invalid.
+[eva] tests/value/bool.i:52: 
+  assertion 'Eva,bool_value' got final status invalid.
+[eva] tests/value/bool.i:62: 
+  assertion 'Eva,bool_value' got final status invalid.
+>>>>>>> origin/master
 [eva] ====== VALUES COMPUTED ======
 [eva:final-states] Values at end of function invalid_bool:
   ub{.b; .c; .s[bits 0 to 7]} ∈ {0; 1}
diff --git a/tests/value/oracle/empty_base.1.res.oracle b/tests/value/oracle/empty_base.1.res.oracle
index e729136c95e874f413766eff62bde5d576078d9f..23b3981f3a3709f077e6d7edc62516fe0da6726c 100644
--- a/tests/value/oracle/empty_base.1.res.oracle
+++ b/tests/value/oracle/empty_base.1.res.oracle
@@ -1,5 +1,15 @@
+<<<<<<< HEAD
 [kernel] Parsing empty_base.c (with preprocessing)
 [kernel] empty_base.c:47: User Error: 
+||||||| ac7807782d
+[kernel] Parsing tests/value/empty_base.c (with preprocessing)
+[kernel] tests/value/empty_base.c:47: User Error: 
+=======
+[kernel] Parsing tests/value/empty_base.c (with preprocessing)
+[kernel] tests/value/empty_base.c:12: User Error: 
+  empty structs only allowed for GCC/MSVC
+[kernel] tests/value/empty_base.c:47: User Error: 
+>>>>>>> origin/master
   zero-length arrays only allowed for GCC/MSVC
 [kernel] empty_base.c:49: User Error: 
   empty initializers only allowed for GCC/MSVC
diff --git a/tests/value/oracle/empty_struct.3.res.oracle b/tests/value/oracle/empty_struct.3.res.oracle
index 1210b0cf13270124d5c5352e7be0a685a3f3f998..daa9cdb1a92a44c778747ebe3a4e487cc73d0c57 100644
--- a/tests/value/oracle/empty_struct.3.res.oracle
+++ b/tests/value/oracle/empty_struct.3.res.oracle
@@ -1,7 +1,35 @@
 [kernel] Parsing empty_struct.c (with preprocessing)
 [eva] Analyzing an incomplete application starting at main
 [eva] Computing initial state
+<<<<<<< HEAD
 [eva] empty_struct.c:22: User Error: 
   empty structs are unsupported (type 'struct s', location s)
   in C99 (only allowed as GCC/MSVC extension). Aborting.
 [kernel] Plug-in eva aborted: invalid user input.
+||||||| ac7807782d
+[eva] tests/value/empty_struct.c:22: User Error: 
+  empty structs are unsupported (type 'struct s', location s)
+  in C99 (only allowed as GCC/MSVC extension). Aborting.
+[kernel] Plug-in eva aborted: invalid user input.
+=======
+[eva] Initial state computed
+[eva:initial-state] Values of globals at initialization
+  s2 ∈ [--..--]
+  pgs ∈ {{ NULL ; &S_pgs[-1] }}
+[eva] Recording results for main
+[eva] done for function main
+[eva] ====== VALUES COMPUTED ======
+[eva:final-states] Values at end of function main:
+  p ∈ {{ (void *)&s }}
+[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 main:
+  NO EFFECTS
+[from] ====== END OF DEPENDENCIES ======
+[inout] Out (internal) for function main:
+    p
+[inout] Inputs for function main:
+    \nothing
+>>>>>>> origin/master
diff --git a/tests/value/oracle/empty_struct2.res.oracle b/tests/value/oracle/empty_struct2.res.oracle
index e8f0f8dbb4864e7115269c75e157e7f959255c71..21d1ff040707e652fcba61941e93c3576f3a2877 100644
--- a/tests/value/oracle/empty_struct2.res.oracle
+++ b/tests/value/oracle/empty_struct2.res.oracle
@@ -5,43 +5,131 @@
 [eva:initial-state] Values of globals at initialization
   nondet ∈ [--..--]
   pg ∈ {{ &global_empty }}
+<<<<<<< HEAD
 [eva] empty_struct2.c:44: assertion got status valid.
 [eva] empty_struct2.c:46: Frama_C_show_each_global_empty: ∅
 [eva] empty_struct2.c:47: Frama_C_show_each_e1: ∅
 [eva] empty_struct2.c:48: Call to builtin memcpy
 [eva] empty_struct2.c:48: 
+||||||| ac7807782d
+[eva] tests/value/empty_struct2.c:44: assertion got status valid.
+[eva] tests/value/empty_struct2.c:46: Frama_C_show_each_global_empty: ∅
+[eva] tests/value/empty_struct2.c:47: Frama_C_show_each_e1: ∅
+[eva] tests/value/empty_struct2.c:48: Call to builtin memcpy
+[eva] tests/value/empty_struct2.c:48: 
+=======
+[eva] tests/value/empty_struct2.c:48: assertion got status valid.
+[eva] tests/value/empty_struct2.c:50: Frama_C_show_each_global_empty: ∅
+[eva] tests/value/empty_struct2.c:51: Frama_C_show_each_e1: ∅
+[eva] tests/value/empty_struct2.c:52: Call to builtin memcpy
+[eva] tests/value/empty_struct2.c:52: 
+>>>>>>> origin/master
   function memcpy: precondition 'valid_dest' got status valid.
+<<<<<<< HEAD
 [eva] empty_struct2.c:48: 
+||||||| ac7807782d
+[eva] tests/value/empty_struct2.c:48: 
+=======
+[eva] tests/value/empty_struct2.c:52: 
+>>>>>>> origin/master
   function memcpy: precondition 'valid_src' got status valid.
+<<<<<<< HEAD
 [eva] empty_struct2.c:48: 
+||||||| ac7807782d
+[eva] tests/value/empty_struct2.c:48: 
+=======
+[eva] tests/value/empty_struct2.c:52: 
+>>>>>>> origin/master
   function memcpy: precondition 'separation' got status valid.
 [eva] FRAMAC_SHARE/libc/string.h:98: 
   cannot evaluate ACSL term, unsupported ACSL construct: logic function memcmp
+<<<<<<< HEAD
 [eva] empty_struct2.c:53: Call to builtin memcpy
 [eva] empty_struct2.c:53: 
+||||||| ac7807782d
+[eva] tests/value/empty_struct2.c:53: Call to builtin memcpy
+[eva] tests/value/empty_struct2.c:53: 
+=======
+[eva] tests/value/empty_struct2.c:57: Call to builtin memcpy
+[eva] tests/value/empty_struct2.c:57: 
+>>>>>>> origin/master
   function memcpy: precondition 'valid_dest' got status valid.
+<<<<<<< HEAD
 [eva] empty_struct2.c:53: 
+||||||| ac7807782d
+[eva] tests/value/empty_struct2.c:53: 
+=======
+[eva] tests/value/empty_struct2.c:57: 
+>>>>>>> origin/master
   function memcpy: precondition 'valid_src' got status valid.
+<<<<<<< HEAD
 [eva] empty_struct2.c:53: 
+||||||| ac7807782d
+[eva] tests/value/empty_struct2.c:53: 
+=======
+[eva] tests/value/empty_struct2.c:57: 
+>>>>>>> origin/master
   function memcpy: precondition 'separation' got status valid.
+<<<<<<< HEAD
 [eva] empty_struct2.c:54: 
+||||||| ac7807782d
+[eva] tests/value/empty_struct2.c:54: 
+=======
+[eva] tests/value/empty_struct2.c:58: 
+>>>>>>> origin/master
   Frama_C_show_each_c2: .a ∈ {42}
                         .b ∈ {77}
+<<<<<<< HEAD
 [eva] empty_struct2.c:55: Frama_C_show_each_c2_e: ∅
+||||||| ac7807782d
+[eva] tests/value/empty_struct2.c:55: Frama_C_show_each_c2_e: ∅
+=======
+[eva] tests/value/empty_struct2.c:59: Frama_C_show_each_c2_e: ∅
+>>>>>>> origin/master
 [eva] computing for function f <- main.
+<<<<<<< HEAD
   Called from empty_struct2.c:56.
+||||||| ac7807782d
+  Called from tests/value/empty_struct2.c:56.
+=======
+  Called from tests/value/empty_struct2.c:60.
+>>>>>>> origin/master
 [eva] Recording results for f
 [eva] Done for function f
+<<<<<<< HEAD
 [eva] empty_struct2.c:58: 
+||||||| ac7807782d
+[eva] tests/value/empty_struct2.c:58: 
+=======
+[eva] tests/value/empty_struct2.c:62: 
+>>>>>>> origin/master
   Frama_C_show_each_res: .a ∈ {87}
                          .b ∈ {39}
+<<<<<<< HEAD
 [eva] empty_struct2.c:62: assertion got status valid.
+||||||| ac7807782d
+[eva] tests/value/empty_struct2.c:62: assertion got status valid.
+=======
+[eva] tests/value/empty_struct2.c:66: assertion got status valid.
+>>>>>>> origin/master
 [eva] computing for function ret_empty <- main.
+<<<<<<< HEAD
   Called from empty_struct2.c:64.
+||||||| ac7807782d
+  Called from tests/value/empty_struct2.c:64.
+=======
+  Called from tests/value/empty_struct2.c:68.
+>>>>>>> origin/master
 [eva] using specification for function ret_empty
 [eva] Done for function ret_empty
 [eva] computing for function ret_ptr_empty <- main.
+<<<<<<< HEAD
   Called from empty_struct2.c:65.
+||||||| ac7807782d
+  Called from tests/value/empty_struct2.c:65.
+=======
+  Called from tests/value/empty_struct2.c:69.
+>>>>>>> origin/master
 [eva] using specification for function ret_ptr_empty
 [eva] Done for function ret_ptr_empty
 [eva] Recording results for main
diff --git a/tests/value/oracle/nonlin.res.oracle b/tests/value/oracle/nonlin.res.oracle
index f96160f312e1037635b14cceccce2234481324ae..c0d9b11adc2d9a91e54cfe07cd3dc09829d60e89 100644
--- a/tests/value/oracle/nonlin.res.oracle
+++ b/tests/value/oracle/nonlin.res.oracle
@@ -24,27 +24,77 @@
        [31] ∈ {5}
        [32..35] ∈ {0}
 [eva] computing for function subdivide_integer <- main.
+<<<<<<< HEAD
   Called from nonlin.c:119.
 [eva:nonlin] nonlin.c:31: non-linear '((int)z + 675) * ((int)z + 675)', lv 'z'
 [eva:nonlin] nonlin.c:31: subdividing on z
 [eva:nonlin] nonlin.c:32: 
+||||||| ac7807782d
+  Called from tests/value/nonlin.c:119.
+[eva:nonlin] tests/value/nonlin.c:31: 
+  non-linear '((int)z + 675) * ((int)z + 675)', lv 'z'
+[eva:nonlin] tests/value/nonlin.c:31: subdividing on z
+[eva:nonlin] tests/value/nonlin.c:32: 
+=======
+  Called from tests/value/nonlin.c:125.
+[eva:nonlin] tests/value/nonlin.c:37: 
+  non-linear '((int)z + 675) * ((int)z + 675)', lv 'z'
+[eva:nonlin] tests/value/nonlin.c:37: subdividing on z
+[eva:nonlin] tests/value/nonlin.c:38: 
+>>>>>>> origin/master
   non-linear '((int)z + 17817) * ((int)z + 17817)', lv 'z'
+<<<<<<< HEAD
 [eva:nonlin] nonlin.c:32: subdividing on z
 [eva:alarm] nonlin.c:32: Warning: 
+||||||| ac7807782d
+[eva:nonlin] tests/value/nonlin.c:32: subdividing on z
+[eva:alarm] tests/value/nonlin.c:32: Warning: 
+=======
+[eva:nonlin] tests/value/nonlin.c:38: subdividing on z
+[eva:alarm] tests/value/nonlin.c:38: Warning: 
+>>>>>>> origin/master
   signed overflow.
   assert (int)((int)z + 17817) * (int)((int)z + 17817) ≤ 2147483647;
+<<<<<<< HEAD
 [eva:nonlin] nonlin.c:39: 
+||||||| ac7807782d
+[eva:nonlin] tests/value/nonlin.c:39: 
+=======
+[eva:nonlin] tests/value/nonlin.c:45: 
+>>>>>>> origin/master
   non-linear '(i2 + (long long)3) * (i2 + (long long)3)', lv 'i2'
+<<<<<<< HEAD
 [eva:nonlin] nonlin.c:39: non-linear 'i1 * i1', lv 'i1'
 [eva:nonlin] nonlin.c:39: subdividing on i2
 [eva:nonlin] nonlin.c:39: subdividing on i1
 [eva:alarm] nonlin.c:43: Warning: assertion got status unknown.
 [eva:nonlin] nonlin.c:44: non-linear '(int)idx * (int)idx', lv 'idx'
 [eva:nonlin] nonlin.c:44: subdividing on idx
+||||||| ac7807782d
+[eva:nonlin] tests/value/nonlin.c:39: non-linear 'i1 * i1', lv 'i1'
+[eva:nonlin] tests/value/nonlin.c:39: subdividing on i2
+[eva:nonlin] tests/value/nonlin.c:39: subdividing on i1
+[eva:alarm] tests/value/nonlin.c:43: Warning: assertion got status unknown.
+[eva:nonlin] tests/value/nonlin.c:44: non-linear '(int)idx * (int)idx', lv 'idx'
+[eva:nonlin] tests/value/nonlin.c:44: subdividing on idx
+=======
+[eva:nonlin] tests/value/nonlin.c:45: non-linear 'i1 * i1', lv 'i1'
+[eva:nonlin] tests/value/nonlin.c:45: subdividing on i2
+[eva:nonlin] tests/value/nonlin.c:45: subdividing on i1
+[eva:alarm] tests/value/nonlin.c:49: Warning: assertion got status unknown.
+[eva:nonlin] tests/value/nonlin.c:50: non-linear '(int)idx * (int)idx', lv 'idx'
+[eva:nonlin] tests/value/nonlin.c:50: subdividing on idx
+>>>>>>> origin/master
 [eva] Recording results for subdivide_integer
 [eva] Done for function subdivide_integer
 [eva] computing for function subdivide_pointer <- main.
+<<<<<<< HEAD
   Called from nonlin.c:120.
+||||||| ac7807782d
+  Called from tests/value/nonlin.c:120.
+=======
+  Called from tests/value/nonlin.c:126.
+>>>>>>> origin/master
 [eva] computing for function Frama_C_interval <- subdivide_pointer <- main.
   Called from nonlin.c:12.
 [eva] using specification for function Frama_C_interval
@@ -62,38 +112,95 @@
 [eva:nonlin] nonlin.c:21: subdividing on i
 [eva:alarm] nonlin.c:21: Warning: 
   out of bounds read. assert \valid_read((p + i) - i);
+<<<<<<< HEAD
 [eva:alarm] nonlin.c:23: Warning: 
+||||||| ac7807782d
+[eva:alarm] tests/value/nonlin.c:23: Warning: 
+=======
+[eva] computing for function Frama_C_interval <- subdivide_pointer <- main.
+  Called from tests/value/nonlin.c:26.
+[eva] tests/value/nonlin.c:26: 
+  function Frama_C_interval: precondition 'order' got status valid.
+[eva] Done for function Frama_C_interval
+[eva:nonlin] tests/value/nonlin.c:27: subdividing on i
+[eva:alarm] tests/value/nonlin.c:29: Warning: 
+>>>>>>> origin/master
   pointer downcast. assert (unsigned int)(&x) ≤ 2147483647;
+<<<<<<< HEAD
 [eva:alarm] nonlin.c:24: Warning: 
+||||||| ac7807782d
+[eva:alarm] tests/value/nonlin.c:24: Warning: 
+=======
+[eva:alarm] tests/value/nonlin.c:30: Warning: 
+>>>>>>> origin/master
   out of bounds read. assert \valid_read((p + i) - i);
 [eva] Recording results for subdivide_pointer
 [eva] Done for function subdivide_pointer
 [eva] computing for function subdivide_several_variables <- main.
+<<<<<<< HEAD
   Called from nonlin.c:121.
+||||||| ac7807782d
+  Called from tests/value/nonlin.c:121.
+=======
+  Called from tests/value/nonlin.c:127.
+>>>>>>> origin/master
 [eva] computing for function Frama_C_interval <- subdivide_several_variables <- 
                           main.
+<<<<<<< HEAD
   Called from nonlin.c:51.
 [eva] nonlin.c:51: 
+||||||| ac7807782d
+  Called from tests/value/nonlin.c:51.
+[eva] tests/value/nonlin.c:51: 
+=======
+  Called from tests/value/nonlin.c:57.
+[eva] tests/value/nonlin.c:57: 
+>>>>>>> origin/master
   function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
 [eva] computing for function Frama_C_interval <- subdivide_several_variables <- 
                           main.
+<<<<<<< HEAD
   Called from nonlin.c:52.
 [eva] nonlin.c:52: 
+||||||| ac7807782d
+  Called from tests/value/nonlin.c:52.
+[eva] tests/value/nonlin.c:52: 
+=======
+  Called from tests/value/nonlin.c:58.
+[eva] tests/value/nonlin.c:58: 
+>>>>>>> origin/master
   function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
 [eva] computing for function Frama_C_interval <- subdivide_several_variables <- 
                           main.
+<<<<<<< HEAD
   Called from nonlin.c:53.
 [eva] nonlin.c:53: 
+||||||| ac7807782d
+  Called from tests/value/nonlin.c:53.
+[eva] tests/value/nonlin.c:53: 
+=======
+  Called from tests/value/nonlin.c:59.
+[eva] tests/value/nonlin.c:59: 
+>>>>>>> origin/master
   function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
 [eva] computing for function Frama_C_interval <- subdivide_several_variables <- 
                           main.
+<<<<<<< HEAD
   Called from nonlin.c:54.
 [eva] nonlin.c:54: 
+||||||| ac7807782d
+  Called from tests/value/nonlin.c:54.
+[eva] tests/value/nonlin.c:54: 
+=======
+  Called from tests/value/nonlin.c:60.
+[eva] tests/value/nonlin.c:60: 
+>>>>>>> origin/master
   function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
+<<<<<<< HEAD
 [eva:nonlin] nonlin.c:56: non-linear 'x * x', lv 'x'
 [eva:nonlin] nonlin.c:56: non-linear 'y * y', lv 'y'
 [eva:nonlin] nonlin.c:56: subdividing on x
@@ -112,41 +219,158 @@
 [eva:nonlin] nonlin.c:68: non-linear 'w * w', lv 'w'
 [eva:nonlin] nonlin.c:68: subdividing on x, y, z
 [eva:nonlin] nonlin.c:68: subdividing on w
+||||||| ac7807782d
+[eva:nonlin] tests/value/nonlin.c:56: non-linear 'x * x', lv 'x'
+[eva:nonlin] tests/value/nonlin.c:56: non-linear 'y * y', lv 'y'
+[eva:nonlin] tests/value/nonlin.c:56: subdividing on x
+[eva:nonlin] tests/value/nonlin.c:56: subdividing on y
+[eva:nonlin] tests/value/nonlin.c:60: non-linear 'x * x', lv 'x'
+[eva:nonlin] tests/value/nonlin.c:60: non-linear '((x * x) * y) * y', lv 'y'
+[eva:nonlin] tests/value/nonlin.c:60: subdividing on x
+[eva:nonlin] tests/value/nonlin.c:60: subdividing on y
+[eva:nonlin] tests/value/nonlin.c:62: non-linear 'x * y - y * x', lv 'y, x'
+[eva:nonlin] tests/value/nonlin.c:62: subdividing on x, y
+[eva:nonlin] tests/value/nonlin.c:65: 
+  non-linear '(x * x - (2 * x) * y) + y * y', lv 'y, x'
+[eva:nonlin] tests/value/nonlin.c:65: subdividing on x, y
+[eva:nonlin] tests/value/nonlin.c:66: 
+  non-linear '(x * x + y * y) - (2 * x) * y', lv 'y, x'
+[eva:nonlin] tests/value/nonlin.c:66: subdividing on x, y
+[eva:nonlin] tests/value/nonlin.c:68: 
+  non-linear '(z * x + x * y) + y * z', lv 'z, y, x'
+[eva:nonlin] tests/value/nonlin.c:68: non-linear 'w * w', lv 'w'
+[eva:nonlin] tests/value/nonlin.c:68: subdividing on x, y, z
+[eva:nonlin] tests/value/nonlin.c:68: subdividing on w
+=======
+[eva:nonlin] tests/value/nonlin.c:62: non-linear 'x * x', lv 'x'
+[eva:nonlin] tests/value/nonlin.c:62: non-linear 'y * y', lv 'y'
+[eva:nonlin] tests/value/nonlin.c:62: subdividing on x
+[eva:nonlin] tests/value/nonlin.c:62: subdividing on y
+[eva:nonlin] tests/value/nonlin.c:66: non-linear 'x * x', lv 'x'
+[eva:nonlin] tests/value/nonlin.c:66: non-linear '((x * x) * y) * y', lv 'y'
+[eva:nonlin] tests/value/nonlin.c:66: subdividing on x
+[eva:nonlin] tests/value/nonlin.c:66: subdividing on y
+[eva:nonlin] tests/value/nonlin.c:68: non-linear 'x * y - y * x', lv 'y, x'
+[eva:nonlin] tests/value/nonlin.c:68: subdividing on x, y
+[eva:nonlin] tests/value/nonlin.c:71: 
+  non-linear '(x * x - (2 * x) * y) + y * y', lv 'y, x'
+[eva:nonlin] tests/value/nonlin.c:71: subdividing on x, y
+[eva:nonlin] tests/value/nonlin.c:72: 
+  non-linear '(x * x + y * y) - (2 * x) * y', lv 'y, x'
+[eva:nonlin] tests/value/nonlin.c:72: subdividing on x, y
+[eva:nonlin] tests/value/nonlin.c:74: 
+  non-linear '(z * x + x * y) + y * z', lv 'z, y, x'
+[eva:nonlin] tests/value/nonlin.c:74: non-linear 'w * w', lv 'w'
+[eva:nonlin] tests/value/nonlin.c:74: subdividing on x, y, z
+[eva:nonlin] tests/value/nonlin.c:74: subdividing on w
+>>>>>>> origin/master
 [eva] Recording results for subdivide_several_variables
 [eva] Done for function subdivide_several_variables
 [eva] computing for function subdivide_table <- main.
+<<<<<<< HEAD
   Called from nonlin.c:122.
 [eva] nonlin.c:87: loop invariant got status valid.
 [eva] nonlin.c:88: starting to merge loop iterations
 [eva:nonlin] nonlin.c:89: non-linear '(4 + ((x >> 2) * 3 << 2)) + x % 4', lv 'x'
 [eva:nonlin] nonlin.c:89: subdividing on x
+||||||| ac7807782d
+  Called from tests/value/nonlin.c:122.
+[eva] tests/value/nonlin.c:87: loop invariant got status valid.
+[eva] tests/value/nonlin.c:88: starting to merge loop iterations
+[eva:nonlin] tests/value/nonlin.c:89: 
+  non-linear '(4 + ((x >> 2) * 3 << 2)) + x % 4', lv 'x'
+[eva:nonlin] tests/value/nonlin.c:89: subdividing on x
+=======
+  Called from tests/value/nonlin.c:128.
+[eva] tests/value/nonlin.c:93: loop invariant got status valid.
+[eva] tests/value/nonlin.c:94: starting to merge loop iterations
+[eva:nonlin] tests/value/nonlin.c:95: 
+  non-linear '(4 + ((x >> 2) * 3 << 2)) + x % 4', lv 'x'
+[eva:nonlin] tests/value/nonlin.c:95: subdividing on x
+>>>>>>> origin/master
 [eva] Recording results for subdivide_table
 [eva] Done for function subdivide_table
 [eva] computing for function subdivide_reduced_value <- main.
+<<<<<<< HEAD
   Called from nonlin.c:123.
 [eva:nonlin] nonlin.c:101: non-linear 't1[i] - t2[i]', lv 'i'
 [eva:nonlin] nonlin.c:101: subdividing on i
 [eva:alarm] nonlin.c:101: Warning: 
+||||||| ac7807782d
+  Called from tests/value/nonlin.c:123.
+[eva:nonlin] tests/value/nonlin.c:101: non-linear 't1[i] - t2[i]', lv 'i'
+[eva:nonlin] tests/value/nonlin.c:101: subdividing on i
+[eva:alarm] tests/value/nonlin.c:101: Warning: 
+=======
+  Called from tests/value/nonlin.c:129.
+[eva:nonlin] tests/value/nonlin.c:107: non-linear 't1[i] - t2[i]', lv 'i'
+[eva:nonlin] tests/value/nonlin.c:107: subdividing on i
+[eva:alarm] tests/value/nonlin.c:107: Warning: 
+>>>>>>> origin/master
   accessing out of bounds index. assert 0 ≤ i;
+<<<<<<< HEAD
 [eva:alarm] nonlin.c:101: Warning: accessing out of bounds index. assert i < 2;
+||||||| ac7807782d
+[eva:alarm] tests/value/nonlin.c:101: Warning: 
+  accessing out of bounds index. assert i < 2;
+=======
+[eva:alarm] tests/value/nonlin.c:107: Warning: 
+  accessing out of bounds index. assert i < 2;
+>>>>>>> origin/master
 [eva] Recording results for subdivide_reduced_value
 [eva] Done for function subdivide_reduced_value
 [eva] computing for function local_subdivide <- main.
+<<<<<<< HEAD
   Called from nonlin.c:124.
+||||||| ac7807782d
+  Called from tests/value/nonlin.c:124.
+=======
+  Called from tests/value/nonlin.c:130.
+>>>>>>> origin/master
 [eva] computing for function Frama_C_interval <- local_subdivide <- main.
+<<<<<<< HEAD
   Called from nonlin.c:107.
 [eva] nonlin.c:107: 
+||||||| ac7807782d
+  Called from tests/value/nonlin.c:107.
+[eva] tests/value/nonlin.c:107: 
+=======
+  Called from tests/value/nonlin.c:113.
+[eva] tests/value/nonlin.c:113: 
+>>>>>>> origin/master
   function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
 [eva] computing for function Frama_C_interval <- local_subdivide <- main.
+<<<<<<< HEAD
   Called from nonlin.c:108.
 [eva] nonlin.c:108: 
+||||||| ac7807782d
+  Called from tests/value/nonlin.c:108.
+[eva] tests/value/nonlin.c:108: 
+=======
+  Called from tests/value/nonlin.c:114.
+[eva] tests/value/nonlin.c:114: 
+>>>>>>> origin/master
   function Frama_C_interval: precondition 'order' got status valid.
 [eva] Done for function Frama_C_interval
+<<<<<<< HEAD
 [eva:nonlin] nonlin.c:112: non-linear '(x * x - (2 * x) * y) + y * y', lv 'y, x'
 [eva:nonlin] nonlin.c:112: subdividing on x, y
 [eva:nonlin] nonlin.c:113: subdividing on x, y
 [eva:nonlin] nonlin.c:115: subdividing on x, y
+||||||| ac7807782d
+[eva:nonlin] tests/value/nonlin.c:112: 
+  non-linear '(x * x - (2 * x) * y) + y * y', lv 'y, x'
+[eva:nonlin] tests/value/nonlin.c:112: subdividing on x, y
+[eva:nonlin] tests/value/nonlin.c:113: subdividing on x, y
+[eva:nonlin] tests/value/nonlin.c:115: subdividing on x, y
+=======
+[eva:nonlin] tests/value/nonlin.c:118: 
+  non-linear '(x * x - (2 * x) * y) + y * y', lv 'y, x'
+[eva:nonlin] tests/value/nonlin.c:118: subdividing on x, y
+[eva:nonlin] tests/value/nonlin.c:119: subdividing on x, y
+[eva:nonlin] tests/value/nonlin.c:121: subdividing on x, y
+>>>>>>> origin/master
 [eva] Recording results for local_subdivide
 [eva] Done for function local_subdivide
 [eva] Recording results for main
@@ -174,11 +398,21 @@
   idx ∈ [0..10]
 [eva:final-states] Values at end of function subdivide_pointer:
   Frama_C_entropy_source ∈ [--..--]
-  y ∈ [-10..10]
+  y ∈ [--..--]
   x ∈ [-10..10]
-  p ∈ {{ &x }}
-  i ∈ {{ NULL + [0..100] ; (int)&x }}
+  p ∈ {{ &t[0] }}
+  i ∈ {{ NULL + [0..10] ; (int)&x }}
   q ∈ {{ &x + [-400..400],0%4 }}
+  t[0] ∈ {0}
+   [1] ∈ {1}
+   [2] ∈ {2}
+   [3] ∈ {4}
+   [4] ∈ {5}
+   [5] ∈ {6}
+   [6] ∈ {7}
+   [7] ∈ {8}
+   [8] ∈ {9}
+   [9] ∈ {0}
 [eva:final-states] Values at end of function subdivide_reduced_value:
   t1[0] ∈ {0}
     [1] ∈ {1}
@@ -249,7 +483,7 @@
 [inout] Inputs for function subdivide_integer:
     v; vs
 [inout] Out (internal) for function subdivide_pointer:
-    Frama_C_entropy_source; y; x; p; i; q
+    Frama_C_entropy_source; y; x; p; i; q; t[0..9]
 [inout] Inputs for function subdivide_pointer:
     Frama_C_entropy_source; v
 [inout] Out (internal) for function subdivide_reduced_value:
diff --git a/tests/value/oracle/widen_non_constant.res.oracle b/tests/value/oracle/widen_non_constant.res.oracle
index 825fa149e062a5b5ea5612a076fd2f2cf6938f82..b12e4384e4f9bac27488fe78422324d28d7c58a2 100644
--- a/tests/value/oracle/widen_non_constant.res.oracle
+++ b/tests/value/oracle/widen_non_constant.res.oracle
@@ -10,6 +10,7 @@
   t[0..19] ∈ {0}
   u[0..39] ∈ {0}
 [eva] computing for function main1 <- main.
+<<<<<<< HEAD
   Called from widen_non_constant.i:84.
 [eva] widen_non_constant.i:11: Frama_C_show_each_out: {0}
 [eva] widen_non_constant.i:13: Frama_C_show_each_in: {0}, {1}
@@ -24,9 +25,45 @@
 [eva] widen_non_constant.i:13: Frama_C_show_each_in: {0; 1; 2}, [1..23]
 [eva] widen_non_constant.i:11: Frama_C_show_each_out: [0..22]
 [eva] widen_non_constant.i:13: Frama_C_show_each_in: [0..22], [1..23]
+||||||| ac7807782d
+  Called from tests/value/widen_non_constant.i:84.
+[eva] tests/value/widen_non_constant.i:11: Frama_C_show_each_out: {0}
+[eva] tests/value/widen_non_constant.i:13: Frama_C_show_each_in: {0}, {1}
+[eva] tests/value/widen_non_constant.i:12: starting to merge loop iterations
+[eva] tests/value/widen_non_constant.i:13: Frama_C_show_each_in: {0}, {1; 2}
+[eva] tests/value/widen_non_constant.i:13: Frama_C_show_each_in: {0}, {1; 2; 3}
+[eva] tests/value/widen_non_constant.i:13: Frama_C_show_each_in: {0}, [1..23]
+[eva] tests/value/widen_non_constant.i:10: starting to merge loop iterations
+[eva] tests/value/widen_non_constant.i:11: Frama_C_show_each_out: {0; 1}
+[eva] tests/value/widen_non_constant.i:13: Frama_C_show_each_in: {0; 1}, [1..23]
+[eva] tests/value/widen_non_constant.i:11: Frama_C_show_each_out: {0; 1; 2}
+[eva] tests/value/widen_non_constant.i:13: 
+  Frama_C_show_each_in: {0; 1; 2}, [1..23]
+[eva] tests/value/widen_non_constant.i:11: Frama_C_show_each_out: [0..22]
+[eva] tests/value/widen_non_constant.i:13: 
+  Frama_C_show_each_in: [0..22], [1..23]
+=======
+  Called from tests/value/widen_non_constant.i:97.
+[eva] tests/value/widen_non_constant.i:11: Frama_C_show_each_out: {0}
+[eva] tests/value/widen_non_constant.i:13: Frama_C_show_each_in: {0}, {1}
+[eva] tests/value/widen_non_constant.i:12: starting to merge loop iterations
+[eva] tests/value/widen_non_constant.i:13: Frama_C_show_each_in: {0}, {1; 2}
+[eva] tests/value/widen_non_constant.i:13: Frama_C_show_each_in: {0}, {1; 2; 3}
+[eva] tests/value/widen_non_constant.i:13: Frama_C_show_each_in: {0}, [1..23]
+[eva] tests/value/widen_non_constant.i:10: starting to merge loop iterations
+[eva] tests/value/widen_non_constant.i:11: Frama_C_show_each_out: {0; 1}
+[eva] tests/value/widen_non_constant.i:13: Frama_C_show_each_in: {0; 1}, [1..23]
+[eva] tests/value/widen_non_constant.i:11: Frama_C_show_each_out: {0; 1; 2}
+[eva] tests/value/widen_non_constant.i:13: 
+  Frama_C_show_each_in: {0; 1; 2}, [1..23]
+[eva] tests/value/widen_non_constant.i:11: Frama_C_show_each_out: [0..22]
+[eva] tests/value/widen_non_constant.i:13: 
+  Frama_C_show_each_in: [0..22], [1..23]
+>>>>>>> origin/master
 [eva] Recording results for main1
 [eva] Done for function main1
 [eva] computing for function main2 <- main.
+<<<<<<< HEAD
   Called from widen_non_constant.i:85.
 [eva] widen_non_constant.i:27: Frama_C_show_each_out: {0}
 [eva] widen_non_constant.i:29: Frama_C_show_each_in: {0}, {1}
@@ -41,9 +78,45 @@
 [eva] widen_non_constant.i:29: Frama_C_show_each_in: {0; 1; 2}, [1..23]
 [eva] widen_non_constant.i:27: Frama_C_show_each_out: [0..22]
 [eva] widen_non_constant.i:29: Frama_C_show_each_in: [0..22], [1..23]
+||||||| ac7807782d
+  Called from tests/value/widen_non_constant.i:85.
+[eva] tests/value/widen_non_constant.i:27: Frama_C_show_each_out: {0}
+[eva] tests/value/widen_non_constant.i:29: Frama_C_show_each_in: {0}, {1}
+[eva] tests/value/widen_non_constant.i:28: starting to merge loop iterations
+[eva] tests/value/widen_non_constant.i:29: Frama_C_show_each_in: {0}, {1; 2}
+[eva] tests/value/widen_non_constant.i:29: Frama_C_show_each_in: {0}, {1; 2; 3}
+[eva] tests/value/widen_non_constant.i:29: Frama_C_show_each_in: {0}, [1..23]
+[eva] tests/value/widen_non_constant.i:26: starting to merge loop iterations
+[eva] tests/value/widen_non_constant.i:27: Frama_C_show_each_out: {0; 1}
+[eva] tests/value/widen_non_constant.i:29: Frama_C_show_each_in: {0; 1}, [1..23]
+[eva] tests/value/widen_non_constant.i:27: Frama_C_show_each_out: {0; 1; 2}
+[eva] tests/value/widen_non_constant.i:29: 
+  Frama_C_show_each_in: {0; 1; 2}, [1..23]
+[eva] tests/value/widen_non_constant.i:27: Frama_C_show_each_out: [0..22]
+[eva] tests/value/widen_non_constant.i:29: 
+  Frama_C_show_each_in: [0..22], [1..23]
+=======
+  Called from tests/value/widen_non_constant.i:98.
+[eva] tests/value/widen_non_constant.i:27: Frama_C_show_each_out: {0}
+[eva] tests/value/widen_non_constant.i:29: Frama_C_show_each_in: {0}, {1}
+[eva] tests/value/widen_non_constant.i:28: starting to merge loop iterations
+[eva] tests/value/widen_non_constant.i:29: Frama_C_show_each_in: {0}, {1; 2}
+[eva] tests/value/widen_non_constant.i:29: Frama_C_show_each_in: {0}, {1; 2; 3}
+[eva] tests/value/widen_non_constant.i:29: Frama_C_show_each_in: {0}, [1..23]
+[eva] tests/value/widen_non_constant.i:26: starting to merge loop iterations
+[eva] tests/value/widen_non_constant.i:27: Frama_C_show_each_out: {0; 1}
+[eva] tests/value/widen_non_constant.i:29: Frama_C_show_each_in: {0; 1}, [1..23]
+[eva] tests/value/widen_non_constant.i:27: Frama_C_show_each_out: {0; 1; 2}
+[eva] tests/value/widen_non_constant.i:29: 
+  Frama_C_show_each_in: {0; 1; 2}, [1..23]
+[eva] tests/value/widen_non_constant.i:27: Frama_C_show_each_out: [0..22]
+[eva] tests/value/widen_non_constant.i:29: 
+  Frama_C_show_each_in: [0..22], [1..23]
+>>>>>>> origin/master
 [eva] Recording results for main2
 [eva] Done for function main2
 [eva] computing for function main3 <- main.
+<<<<<<< HEAD
   Called from widen_non_constant.i:86.
 [eva] widen_non_constant.i:46: Frama_C_show_each_out: {0}
 [eva] widen_non_constant.i:48: Frama_C_show_each_in: {0}, {1}
@@ -58,18 +131,74 @@
 [eva] widen_non_constant.i:48: Frama_C_show_each_in: {0; 1; 2}, [1..23]
 [eva] widen_non_constant.i:46: Frama_C_show_each_out: [0..22]
 [eva] widen_non_constant.i:48: Frama_C_show_each_in: [0..22], [1..23]
+||||||| ac7807782d
+  Called from tests/value/widen_non_constant.i:86.
+[eva] tests/value/widen_non_constant.i:46: Frama_C_show_each_out: {0}
+[eva] tests/value/widen_non_constant.i:48: Frama_C_show_each_in: {0}, {1}
+[eva] tests/value/widen_non_constant.i:47: starting to merge loop iterations
+[eva] tests/value/widen_non_constant.i:48: Frama_C_show_each_in: {0}, {1; 2}
+[eva] tests/value/widen_non_constant.i:48: Frama_C_show_each_in: {0}, {1; 2; 3}
+[eva] tests/value/widen_non_constant.i:48: Frama_C_show_each_in: {0}, [1..23]
+[eva] tests/value/widen_non_constant.i:45: starting to merge loop iterations
+[eva] tests/value/widen_non_constant.i:46: Frama_C_show_each_out: {0; 1}
+[eva] tests/value/widen_non_constant.i:48: Frama_C_show_each_in: {0; 1}, [1..23]
+[eva] tests/value/widen_non_constant.i:46: Frama_C_show_each_out: {0; 1; 2}
+[eva] tests/value/widen_non_constant.i:48: 
+  Frama_C_show_each_in: {0; 1; 2}, [1..23]
+[eva] tests/value/widen_non_constant.i:46: Frama_C_show_each_out: [0..22]
+[eva] tests/value/widen_non_constant.i:48: 
+  Frama_C_show_each_in: [0..22], [1..23]
+=======
+  Called from tests/value/widen_non_constant.i:99.
+[eva] tests/value/widen_non_constant.i:46: Frama_C_show_each_out: {0}
+[eva] tests/value/widen_non_constant.i:48: Frama_C_show_each_in: {0}, {1}
+[eva] tests/value/widen_non_constant.i:47: starting to merge loop iterations
+[eva] tests/value/widen_non_constant.i:48: Frama_C_show_each_in: {0}, {1; 2}
+[eva] tests/value/widen_non_constant.i:48: Frama_C_show_each_in: {0}, {1; 2; 3}
+[eva] tests/value/widen_non_constant.i:48: Frama_C_show_each_in: {0}, [1..23]
+[eva] tests/value/widen_non_constant.i:45: starting to merge loop iterations
+[eva] tests/value/widen_non_constant.i:46: Frama_C_show_each_out: {0; 1}
+[eva] tests/value/widen_non_constant.i:48: Frama_C_show_each_in: {0; 1}, [1..23]
+[eva] tests/value/widen_non_constant.i:46: Frama_C_show_each_out: {0; 1; 2}
+[eva] tests/value/widen_non_constant.i:48: 
+  Frama_C_show_each_in: {0; 1; 2}, [1..23]
+[eva] tests/value/widen_non_constant.i:46: Frama_C_show_each_out: [0..22]
+[eva] tests/value/widen_non_constant.i:48: 
+  Frama_C_show_each_in: [0..22], [1..23]
+>>>>>>> origin/master
 [eva] Recording results for main3
 [eva] Done for function main3
 [eva] computing for function main4 <- main.
+<<<<<<< HEAD
   Called from widen_non_constant.i:87.
 [eva] widen_non_constant.i:63: starting to merge loop iterations
 [eva] widen_non_constant.i:69: starting to merge loop iterations
 [eva] widen_non_constant.i:72: Frama_C_show_each: {43}
 [eva] widen_non_constant.i:75: starting to merge loop iterations
 [eva] widen_non_constant.i:78: 
+||||||| ac7807782d
+  Called from tests/value/widen_non_constant.i:87.
+[eva] tests/value/widen_non_constant.i:63: starting to merge loop iterations
+[eva] tests/value/widen_non_constant.i:69: starting to merge loop iterations
+[eva] tests/value/widen_non_constant.i:72: Frama_C_show_each: {43}
+[eva] tests/value/widen_non_constant.i:75: starting to merge loop iterations
+[eva] tests/value/widen_non_constant.i:78: 
+=======
+  Called from tests/value/widen_non_constant.i:100.
+[eva] tests/value/widen_non_constant.i:63: starting to merge loop iterations
+[eva] tests/value/widen_non_constant.i:69: starting to merge loop iterations
+[eva] tests/value/widen_non_constant.i:72: Frama_C_show_each: {43}
+[eva] tests/value/widen_non_constant.i:75: starting to merge loop iterations
+[eva] tests/value/widen_non_constant.i:78: 
+>>>>>>> origin/master
   Frama_C_show_each: {35; 36; 37; 38; 39; 40; 41; 42}
 [eva] Recording results for main4
 [eva] Done for function main4
+[eva] computing for function main5 <- main.
+  Called from tests/value/widen_non_constant.i:101.
+[eva] tests/value/widen_non_constant.i:90: starting to merge loop iterations
+[eva] Recording results for main5
+[eva] Done for function main5
 [eva] Recording results for main
 [eva] done for function main
 [eva] ====== VALUES COMPUTED ======
@@ -91,6 +220,9 @@
   j ∈ {35; 36; 37; 38; 39; 40; 41; 42}
   maxi ∈ {19}
   maxj ∈ {35}
+[eva:final-states] Values at end of function main5:
+  i ∈ {32}
+  ptr ∈ {{ (void *)&sub }}
 [eva:final-states] Values at end of function main:
   t[0] ∈ {-1}
    [1..19] ∈ [0..18]
@@ -103,6 +235,8 @@
 [from] Done for function main3
 [from] Computing for function main4
 [from] Done for function main4
+[from] Computing for function main5
+[from] Done for function main5
 [from] Computing for function main
 [from] Done for function main
 [from] ====== DEPENDENCIES COMPUTED ======
@@ -117,6 +251,8 @@
   t[0] FROM \nothing
    [1..19] FROM \nothing (and SELF)
   u[0..39] FROM \nothing (and SELF)
+[from] Function main5:
+  NO EFFECTS
 [from] Function main:
   t[0] FROM \nothing
    [1..19] FROM \nothing (and SELF)
@@ -138,6 +274,10 @@
     t[0..19]; u[0..39]; i; j; maxi; maxj
 [inout] Inputs for function main4:
     \nothing
+[inout] Out (internal) for function main5:
+    i; ptr
+[inout] Inputs for function main5:
+    \nothing
 [inout] Out (internal) for function main:
     t[0..19]; u[0..39]
 [inout] Inputs for function main:
diff --git a/tests/value/precond2.c b/tests/value/precond2.c
index bc435ecf54dcff61d34d19529a4f2032d8a37435..4df5ae310d227a8bbd063937b1b40d0ec741a98a 100644
--- a/tests/value/precond2.c
+++ b/tests/value/precond2.c
@@ -1,7 +1,15 @@
 /* run.config*
+<<<<<<< HEAD
    PLUGIN: @PLUGIN@ report
    OPT: -machdep x86_32 -rte -then -eva @EVA_OPTIONS@ -then -report -report-print-properties
    OPT: -machdep x86_32 -eva @EVA_OPTIONS@ -then -rte -then -report -report-print-properties
+||||||| ac7807782d
+   OPT: -no-autoload-plugins -load-module from,inout,eva,report,rtegen -rte -then -eva @EVA_CONFIG@ -then -report -report-print-properties
+   OPT: -no-autoload-plugins -load-module from,inout,eva,report,rtegen -eva @EVA_CONFIG@ -then -rte -then -report -report-print-properties
+=======
+   OPT: -machdep x86_32 -no-autoload-plugins -load-module from,inout,eva,report,rtegen -rte -then -eva @EVA_CONFIG@ -then -report -report-print-properties
+   OPT: -machdep x86_32 -no-autoload-plugins -load-module from,inout,eva,report,rtegen -eva @EVA_CONFIG@ -then -rte -then -report -report-print-properties
+>>>>>>> origin/master
 */
 // Fuse with precond.c when bts #1208 is solved
 int x;
diff --git a/tests/value/traces/oracle/test1.res.oracle b/tests/value/traces/oracle/test1.res.oracle
index a3053428704db65ca6a0f5856b3c05fcf1d13a65..687a3a1ceb615c098323649f6003c3d1315af5fd 100644
--- a/tests/value/traces/oracle/test1.res.oracle
+++ b/tests/value/traces/oracle/test1.res.oracle
@@ -56,16 +56,14 @@ c -> 5
     37 -> Assume: i < 3 false -> 38
     38 -> LeaveScope: i -> 41
     39 -> LeaveScope: i -> 40
-    40 -> LeaveScope: i -> 42
-    41 -> LeaveScope: i -> 43
-    42 -> Assign: g = tmp -> 44
-    43 -> Assign: g = tmp -> 45
-    44 -> EnterScope: \result<main> -> 46
-    45 -> EnterScope: \result<main> -> 48
+    40 -> Assign: g = tmp -> 42
+    41 -> Assign: g = tmp -> 43
+    42 -> EnterScope: \result<main> -> 44
+    43 -> EnterScope: \result<main> -> 46
+    44 -> Assign: \result<main> = tmp -> 45
+    45 -> join -> 48
     46 -> Assign: \result<main> = tmp -> 47
-    47 -> join -> 50
-    48 -> Assign: \result<main> = tmp -> 49
-    49 -> join -> 50 ]} at 50
+    47 -> join -> 48 ]} at 48
 [from] Computing for function main
 [from] Done for function main
 [from] ====== DEPENDENCIES COMPUTED ======
diff --git a/tests/value/traces/oracle/test2.res.oracle b/tests/value/traces/oracle/test2.res.oracle
index 9463e0c9dc90560a1a8b977ccf9077d32d7823f8..05f84f4a876a3eb4e55d1c37823889630a3d12fa 100644
--- a/tests/value/traces/oracle/test2.res.oracle
+++ b/tests/value/traces/oracle/test2.res.oracle
@@ -30,7 +30,7 @@ c -> 1
     4 -> Assign: tmp = 1 -> 5
     5 -> start_call: loop (true) -> 8
     6 -> Assign: tmp = 2 -> 7
-    7 -> start_call: loop (true) -> 40
+    7 -> start_call: loop (true) -> 39
     8 -> EnterScope: j -> 9
     9 -> Assign: j = tmp -> 10
     10 -> EnterScope: i -> 11
@@ -48,43 +48,41 @@ c -> 1
     22 -> Assign: i = i + 1 -> 23
     23 -> Assume: i < 3 false -> 24
     24 -> LeaveScope: i -> 25
-    25 -> LeaveScope: i -> 26
-    26 -> EnterScope: \result<loop> -> 27
-    27 -> Assign: \result<loop> = j -> 28
-    28 -> LeaveScope: j -> 36
-    36 -> finalize_call: loop -> 37
-    37 -> Assign: tmp = \result<loop> -> 38
-    38 -> LeaveScope: \result<loop> -> 39
-    39 -> EnterScope: \result<main> -> 80
-    40 -> EnterScope: j -> 41
-    41 -> Assign: j = tmp -> 42
-    42 -> EnterScope: i -> 44
-    44 -> initialize variable: i -> 45
-    45 -> Assign: i = 0 -> 46
-    46 -> enter_loop -> 47
-    47 -> Assume: i < 3 true -> 48
-    48 -> Assign: j = j + 1 -> 49
-    49 -> Assign: i = i + 1 -> 50
-    50 -> Assume: i < 3 true -> 51
-    51 -> Assign: j = j + 1 -> 52
-    52 -> Assign: i = i + 1 -> 53
-    53 -> Assume: i < 3 true -> 54
-    54 -> Assign: j = j + 1 -> 55
-    55 -> Assign: i = i + 1 -> 56
-    56 -> Assume: i < 3 false -> 57
-    57 -> LeaveScope: i -> 58
-    58 -> LeaveScope: i -> 59
-    59 -> EnterScope: \result<loop> -> 60
-    60 -> Assign: \result<loop> = j -> 61
-    61 -> LeaveScope: j -> 76
-    76 -> finalize_call: loop -> 77
-    77 -> Assign: tmp = \result<loop> -> 78
-    78 -> LeaveScope: \result<loop> -> 79
-    79 -> EnterScope: \result<main> -> 82
+    25 -> EnterScope: \result<loop> -> 26
+    26 -> Assign: \result<loop> = j -> 27
+    27 -> LeaveScope: j -> 35
+    35 -> finalize_call: loop -> 36
+    36 -> Assign: tmp = \result<loop> -> 37
+    37 -> LeaveScope: \result<loop> -> 38
+    38 -> EnterScope: \result<main> -> 78
+    39 -> EnterScope: j -> 40
+    40 -> Assign: j = tmp -> 41
+    41 -> EnterScope: i -> 43
+    43 -> initialize variable: i -> 44
+    44 -> Assign: i = 0 -> 45
+    45 -> enter_loop -> 46
+    46 -> Assume: i < 3 true -> 47
+    47 -> Assign: j = j + 1 -> 48
+    48 -> Assign: i = i + 1 -> 49
+    49 -> Assume: i < 3 true -> 50
+    50 -> Assign: j = j + 1 -> 51
+    51 -> Assign: i = i + 1 -> 52
+    52 -> Assume: i < 3 true -> 53
+    53 -> Assign: j = j + 1 -> 54
+    54 -> Assign: i = i + 1 -> 55
+    55 -> Assume: i < 3 false -> 56
+    56 -> LeaveScope: i -> 57
+    57 -> EnterScope: \result<loop> -> 58
+    58 -> Assign: \result<loop> = j -> 59
+    59 -> LeaveScope: j -> 74
+    74 -> finalize_call: loop -> 75
+    75 -> Assign: tmp = \result<loop> -> 76
+    76 -> LeaveScope: \result<loop> -> 77
+    77 -> EnterScope: \result<main> -> 80
+    78 -> Assign: \result<main> = tmp -> 79
+    79 -> join -> 82
     80 -> Assign: \result<main> = tmp -> 81
-    81 -> join -> 84
-    82 -> Assign: \result<main> = tmp -> 83
-    83 -> join -> 84 ]} at 84
+    81 -> join -> 82 ]} at 82
 [from] Computing for function loop
 [from] Done for function loop
 [from] Computing for function main
diff --git a/tests/value/traces/oracle/test4.res.oracle b/tests/value/traces/oracle/test4.res.oracle
index 5067a1ef6fa18455ca5eaf3022fb31f8fda8ce75..68f647b1463c8003e6342d17ec2d24a927d158bd 100644
--- a/tests/value/traces/oracle/test4.res.oracle
+++ b/tests/value/traces/oracle/test4.res.oracle
@@ -255,9 +255,8 @@ c -> 1
     228 -> Assume: i < 100 false -> 229
     229 -> leave_loop -> 230
     230 -> LeaveScope: i -> 231
-    231 -> LeaveScope: i -> 232
-    232 -> EnterScope: \result<main> -> 233
-    233 -> Assign: \result<main> = tmp -> 234 ]} at 234
+    231 -> EnterScope: \result<main> -> 232
+    232 -> Assign: \result<main> = tmp -> 233 ]} at 233
 [from] Computing for function main
 [from] Done for function main
 [from] ====== DEPENDENCIES COMPUTED ======
diff --git a/tests/value/traces/oracle/test5.res.oracle b/tests/value/traces/oracle/test5.res.oracle
index e2898ecdf2f415199b41a778b808c414dc937dd8..c3e94b81b6317e06c8284fddac7fb8784b329e78 100644
--- a/tests/value/traces/oracle/test5.res.oracle
+++ b/tests/value/traces/oracle/test5.res.oracle
@@ -212,370 +212,355 @@ c -> 1
     109 -> Assign: tmp = tmp_0 + tmp -> 110
     110 -> LeaveScope: tmp_0 -> 111
     111 -> Assign: j = j + 1 -> 112
-    112 -> Assume: j < 10 false -> 113; join -> 122
+    112 -> Assume: j < 10 false -> 113; join -> 121
     113 -> LeaveScope: j -> 114
-    114 -> LeaveScope: j -> 115
-    115 -> Assign: i = i + 1 -> 116
-    116 -> Assume: i < 10 true -> 117
-    117 -> EnterScope: j -> 118
-    118 -> initialize variable: j -> 119
-    119 -> Assign: j = 0 -> 120
-    120 -> enter_loop -> 121
-    121 -> join -> 122
-    122 -> Assume: j < 10 true -> 123; join -> 133
-    123 -> EnterScope: tmp_0 -> 124; join -> 135
-    124 -> EnterScope: \result<my_switch> -> 125; join -> 137
-    125 -> CallDeclared: \result<my_switch> = my_switch(tmp) -> 126
-    126 -> Assign: tmp_0 = \result<my_switch> -> 128
-    128 -> LeaveScope: \result<my_switch> -> 129
-    129 -> Assign: tmp = tmp_0 + tmp -> 130; join -> 143
-    130 -> LeaveScope: tmp_0 -> 131
-    131 -> Assign: j = j + 1 -> 132; join -> 146
-    132 -> join -> 133
-    133 -> Assume: j < 10 true -> 134; join -> 148
-    134 -> join -> 135
-    135 -> EnterScope: tmp_0 -> 136; join -> 151
-    136 -> join -> 137
-    137 -> EnterScope: \result<my_switch> -> 138; join -> 153
-    138 -> CallDeclared: \result<my_switch> = my_switch(tmp) -> 139
-    139 -> Assign: tmp_0 = \result<my_switch> -> 141
-    141 -> LeaveScope: \result<my_switch> -> 142
-    142 -> join -> 143
-    143 -> Assign: tmp = tmp_0 + tmp -> 144; join -> 159
-    144 -> LeaveScope: tmp_0 -> 145
-    145 -> join -> 146
-    146 -> Assign: j = j + 1 -> 147; join -> 162
-    147 -> join -> 148
-    148 -> join -> 151
-    151 -> join -> 153
-    153 -> join -> 159
-    159 -> join -> 162
-    162 -> Loop(16) 149 {[ 149 -> Assume: j < 10 true -> 150
-                           150 -> EnterScope: tmp_0 -> 152
-                           152 -> EnterScope: \result<my_switch> -> 154
-                           154 -> CallDeclared:
+    114 -> Assign: i = i + 1 -> 115
+    115 -> Assume: i < 10 true -> 116
+    116 -> EnterScope: j -> 117
+    117 -> initialize variable: j -> 118
+    118 -> Assign: j = 0 -> 119
+    119 -> enter_loop -> 120
+    120 -> join -> 121
+    121 -> Assume: j < 10 true -> 122; join -> 132
+    122 -> EnterScope: tmp_0 -> 123; join -> 134
+    123 -> EnterScope: \result<my_switch> -> 124; join -> 136
+    124 -> CallDeclared: \result<my_switch> = my_switch(tmp) -> 125
+    125 -> Assign: tmp_0 = \result<my_switch> -> 127
+    127 -> LeaveScope: \result<my_switch> -> 128
+    128 -> Assign: tmp = tmp_0 + tmp -> 129; join -> 142
+    129 -> LeaveScope: tmp_0 -> 130
+    130 -> Assign: j = j + 1 -> 131; join -> 145
+    131 -> join -> 132
+    132 -> Assume: j < 10 true -> 133; join -> 147
+    133 -> join -> 134
+    134 -> EnterScope: tmp_0 -> 135; join -> 150
+    135 -> join -> 136
+    136 -> EnterScope: \result<my_switch> -> 137; join -> 152
+    137 -> CallDeclared: \result<my_switch> = my_switch(tmp) -> 138
+    138 -> Assign: tmp_0 = \result<my_switch> -> 140
+    140 -> LeaveScope: \result<my_switch> -> 141
+    141 -> join -> 142
+    142 -> Assign: tmp = tmp_0 + tmp -> 143; join -> 158
+    143 -> LeaveScope: tmp_0 -> 144
+    144 -> join -> 145
+    145 -> Assign: j = j + 1 -> 146; join -> 161
+    146 -> join -> 147
+    147 -> join -> 150
+    150 -> join -> 152
+    152 -> join -> 158
+    158 -> join -> 161
+    161 -> Loop(16) 148 {[ 148 -> Assume: j < 10 true -> 149
+                           149 -> EnterScope: tmp_0 -> 151
+                           151 -> EnterScope: \result<my_switch> -> 153
+                           153 -> CallDeclared:
                                     \result<my_switch> =
-                                    my_switch(tmp) -> 155
-                           155 -> Assign: tmp_0 = \result<my_switch> -> 157
-                           157 -> LeaveScope: \result<my_switch> -> 158
-                           158 -> Assign: tmp = tmp_0 + tmp -> 160
-                           160 -> LeaveScope: tmp_0 -> 161
-                           161 -> Assign: j = j + 1 -> 163 ]} -> 166;
-           join -> 177
-    166 -> Assume: j < 10 false -> 167
-    167 -> leave_loop -> 168
-    168 -> LeaveScope: j -> 169
-    169 -> LeaveScope: j -> 170
-    170 -> Assign: i = i + 1 -> 171
-    171 -> Assume: i < 10 true -> 172
-    172 -> EnterScope: j -> 173
-    173 -> initialize variable: j -> 174
-    174 -> Assign: j = 0 -> 175
-    175 -> enter_loop -> 176
-    176 -> join -> 177
-    177 -> Loop(16) 149 {[ 149 -> Assume: j < 10 true -> 150
-                           150 -> EnterScope: tmp_0 -> 152
-                           152 -> EnterScope: \result<my_switch> -> 154
-                           154 -> CallDeclared:
+                                    my_switch(tmp) -> 154
+                           154 -> Assign: tmp_0 = \result<my_switch> -> 156
+                           156 -> LeaveScope: \result<my_switch> -> 157
+                           157 -> Assign: tmp = tmp_0 + tmp -> 159
+                           159 -> LeaveScope: tmp_0 -> 160
+                           160 -> Assign: j = j + 1 -> 162 ]} -> 165;
+           join -> 175
+    165 -> Assume: j < 10 false -> 166
+    166 -> leave_loop -> 167
+    167 -> LeaveScope: j -> 168
+    168 -> Assign: i = i + 1 -> 169
+    169 -> Assume: i < 10 true -> 170
+    170 -> EnterScope: j -> 171
+    171 -> initialize variable: j -> 172
+    172 -> Assign: j = 0 -> 173
+    173 -> enter_loop -> 174
+    174 -> join -> 175
+    175 -> Loop(16) 148 {[ 148 -> Assume: j < 10 true -> 149
+                           149 -> EnterScope: tmp_0 -> 151
+                           151 -> EnterScope: \result<my_switch> -> 153
+                           153 -> CallDeclared:
                                     \result<my_switch> =
-                                    my_switch(tmp) -> 155
-                           155 -> Assign: tmp_0 = \result<my_switch> -> 157
-                           157 -> LeaveScope: \result<my_switch> -> 158
-                           158 -> Assign: tmp = tmp_0 + tmp -> 160
-                           160 -> LeaveScope: tmp_0 -> 161
-                           161 -> Assign: j = j + 1 -> 163 ]} -> 179;
-           join -> 190
-    179 -> Assume: j < 10 false -> 180
-    180 -> leave_loop -> 181
-    181 -> LeaveScope: j -> 182
-    182 -> LeaveScope: j -> 183
-    183 -> Assign: i = i + 1 -> 184
-    184 -> Assume: i < 10 true -> 185
-    185 -> EnterScope: j -> 186
-    186 -> initialize variable: j -> 187
-    187 -> Assign: j = 0 -> 188
-    188 -> enter_loop -> 189
-    189 -> join -> 190
-    190 -> Loop(16) 149 {[ 149 -> Assume: j < 10 true -> 150
-                           150 -> EnterScope: tmp_0 -> 152
-                           152 -> EnterScope: \result<my_switch> -> 154
-                           154 -> CallDeclared:
+                                    my_switch(tmp) -> 154
+                           154 -> Assign: tmp_0 = \result<my_switch> -> 156
+                           156 -> LeaveScope: \result<my_switch> -> 157
+                           157 -> Assign: tmp = tmp_0 + tmp -> 159
+                           159 -> LeaveScope: tmp_0 -> 160
+                           160 -> Assign: j = j + 1 -> 162 ]} -> 177;
+           join -> 187
+    177 -> Assume: j < 10 false -> 178
+    178 -> leave_loop -> 179
+    179 -> LeaveScope: j -> 180
+    180 -> Assign: i = i + 1 -> 181
+    181 -> Assume: i < 10 true -> 182
+    182 -> EnterScope: j -> 183
+    183 -> initialize variable: j -> 184
+    184 -> Assign: j = 0 -> 185
+    185 -> enter_loop -> 186
+    186 -> join -> 187
+    187 -> Loop(16) 148 {[ 148 -> Assume: j < 10 true -> 149
+                           149 -> EnterScope: tmp_0 -> 151
+                           151 -> EnterScope: \result<my_switch> -> 153
+                           153 -> CallDeclared:
                                     \result<my_switch> =
-                                    my_switch(tmp) -> 155
-                           155 -> Assign: tmp_0 = \result<my_switch> -> 157
-                           157 -> LeaveScope: \result<my_switch> -> 158
-                           158 -> Assign: tmp = tmp_0 + tmp -> 160
-                           160 -> LeaveScope: tmp_0 -> 161
-                           161 -> Assign: j = j + 1 -> 163 ]} -> 192;
-           join -> 203
-    192 -> Assume: j < 10 false -> 193
-    193 -> leave_loop -> 194
-    194 -> LeaveScope: j -> 195
-    195 -> LeaveScope: j -> 196
-    196 -> Assign: i = i + 1 -> 197
-    197 -> Assume: i < 10 true -> 198
-    198 -> EnterScope: j -> 199
-    199 -> initialize variable: j -> 200
-    200 -> Assign: j = 0 -> 201
-    201 -> enter_loop -> 202
-    202 -> join -> 203
-    203 -> Loop(16) 149 {[ 149 -> Assume: j < 10 true -> 150
-                           150 -> EnterScope: tmp_0 -> 152
-                           152 -> EnterScope: \result<my_switch> -> 154
-                           154 -> CallDeclared:
+                                    my_switch(tmp) -> 154
+                           154 -> Assign: tmp_0 = \result<my_switch> -> 156
+                           156 -> LeaveScope: \result<my_switch> -> 157
+                           157 -> Assign: tmp = tmp_0 + tmp -> 159
+                           159 -> LeaveScope: tmp_0 -> 160
+                           160 -> Assign: j = j + 1 -> 162 ]} -> 189;
+           join -> 199
+    189 -> Assume: j < 10 false -> 190
+    190 -> leave_loop -> 191
+    191 -> LeaveScope: j -> 192
+    192 -> Assign: i = i + 1 -> 193
+    193 -> Assume: i < 10 true -> 194
+    194 -> EnterScope: j -> 195
+    195 -> initialize variable: j -> 196
+    196 -> Assign: j = 0 -> 197
+    197 -> enter_loop -> 198
+    198 -> join -> 199
+    199 -> Loop(16) 148 {[ 148 -> Assume: j < 10 true -> 149
+                           149 -> EnterScope: tmp_0 -> 151
+                           151 -> EnterScope: \result<my_switch> -> 153
+                           153 -> CallDeclared:
                                     \result<my_switch> =
-                                    my_switch(tmp) -> 155
-                           155 -> Assign: tmp_0 = \result<my_switch> -> 157
-                           157 -> LeaveScope: \result<my_switch> -> 158
-                           158 -> Assign: tmp = tmp_0 + tmp -> 160
-                           160 -> LeaveScope: tmp_0 -> 161
-                           161 -> Assign: j = j + 1 -> 163 ]} -> 205;
-           join -> 216
-    205 -> Assume: j < 10 false -> 206
-    206 -> leave_loop -> 207
-    207 -> LeaveScope: j -> 208
-    208 -> LeaveScope: j -> 209
-    209 -> Assign: i = i + 1 -> 210
-    210 -> Assume: i < 10 true -> 211
-    211 -> EnterScope: j -> 212
-    212 -> initialize variable: j -> 213
-    213 -> Assign: j = 0 -> 214
-    214 -> enter_loop -> 215
-    215 -> join -> 216
-    216 -> Loop(16) 149 {[ 149 -> Assume: j < 10 true -> 150
-                           150 -> EnterScope: tmp_0 -> 152
-                           152 -> EnterScope: \result<my_switch> -> 154
-                           154 -> CallDeclared:
+                                    my_switch(tmp) -> 154
+                           154 -> Assign: tmp_0 = \result<my_switch> -> 156
+                           156 -> LeaveScope: \result<my_switch> -> 157
+                           157 -> Assign: tmp = tmp_0 + tmp -> 159
+                           159 -> LeaveScope: tmp_0 -> 160
+                           160 -> Assign: j = j + 1 -> 162 ]} -> 201;
+           join -> 211
+    201 -> Assume: j < 10 false -> 202
+    202 -> leave_loop -> 203
+    203 -> LeaveScope: j -> 204
+    204 -> Assign: i = i + 1 -> 205
+    205 -> Assume: i < 10 true -> 206
+    206 -> EnterScope: j -> 207
+    207 -> initialize variable: j -> 208
+    208 -> Assign: j = 0 -> 209
+    209 -> enter_loop -> 210
+    210 -> join -> 211
+    211 -> Loop(16) 148 {[ 148 -> Assume: j < 10 true -> 149
+                           149 -> EnterScope: tmp_0 -> 151
+                           151 -> EnterScope: \result<my_switch> -> 153
+                           153 -> CallDeclared:
                                     \result<my_switch> =
-                                    my_switch(tmp) -> 155
-                           155 -> Assign: tmp_0 = \result<my_switch> -> 157
-                           157 -> LeaveScope: \result<my_switch> -> 158
-                           158 -> Assign: tmp = tmp_0 + tmp -> 160
-                           160 -> LeaveScope: tmp_0 -> 161
-                           161 -> Assign: j = j + 1 -> 163 ]} -> 218;
-           join -> 229
-    218 -> Assume: j < 10 false -> 219
-    219 -> leave_loop -> 220
-    220 -> LeaveScope: j -> 221
-    221 -> LeaveScope: j -> 222
-    222 -> Assign: i = i + 1 -> 223
-    223 -> Assume: i < 10 true -> 224
-    224 -> EnterScope: j -> 225
-    225 -> initialize variable: j -> 226
-    226 -> Assign: j = 0 -> 227
-    227 -> enter_loop -> 228
-    228 -> join -> 229
-    229 -> Loop(16) 149 {[ 149 -> Assume: j < 10 true -> 150
-                           150 -> EnterScope: tmp_0 -> 152
-                           152 -> EnterScope: \result<my_switch> -> 154
-                           154 -> CallDeclared:
+                                    my_switch(tmp) -> 154
+                           154 -> Assign: tmp_0 = \result<my_switch> -> 156
+                           156 -> LeaveScope: \result<my_switch> -> 157
+                           157 -> Assign: tmp = tmp_0 + tmp -> 159
+                           159 -> LeaveScope: tmp_0 -> 160
+                           160 -> Assign: j = j + 1 -> 162 ]} -> 213;
+           join -> 223
+    213 -> Assume: j < 10 false -> 214
+    214 -> leave_loop -> 215
+    215 -> LeaveScope: j -> 216
+    216 -> Assign: i = i + 1 -> 217
+    217 -> Assume: i < 10 true -> 218
+    218 -> EnterScope: j -> 219
+    219 -> initialize variable: j -> 220
+    220 -> Assign: j = 0 -> 221
+    221 -> enter_loop -> 222
+    222 -> join -> 223
+    223 -> Loop(16) 148 {[ 148 -> Assume: j < 10 true -> 149
+                           149 -> EnterScope: tmp_0 -> 151
+                           151 -> EnterScope: \result<my_switch> -> 153
+                           153 -> CallDeclared:
                                     \result<my_switch> =
-                                    my_switch(tmp) -> 155
-                           155 -> Assign: tmp_0 = \result<my_switch> -> 157
-                           157 -> LeaveScope: \result<my_switch> -> 158
-                           158 -> Assign: tmp = tmp_0 + tmp -> 160
-                           160 -> LeaveScope: tmp_0 -> 161
-                           161 -> Assign: j = j + 1 -> 163 ]} -> 231;
-           join -> 242
-    231 -> Assume: j < 10 false -> 232
-    232 -> leave_loop -> 233
-    233 -> LeaveScope: j -> 234
-    234 -> LeaveScope: j -> 235
-    235 -> Assign: i = i + 1 -> 236
-    236 -> Assume: i < 10 true -> 237
-    237 -> EnterScope: j -> 238
-    238 -> initialize variable: j -> 239
-    239 -> Assign: j = 0 -> 240
-    240 -> enter_loop -> 241
-    241 -> join -> 242
-    242 -> Loop(16) 149 {[ 149 -> Assume: j < 10 true -> 150
-                           150 -> EnterScope: tmp_0 -> 152
-                           152 -> EnterScope: \result<my_switch> -> 154
-                           154 -> CallDeclared:
+                                    my_switch(tmp) -> 154
+                           154 -> Assign: tmp_0 = \result<my_switch> -> 156
+                           156 -> LeaveScope: \result<my_switch> -> 157
+                           157 -> Assign: tmp = tmp_0 + tmp -> 159
+                           159 -> LeaveScope: tmp_0 -> 160
+                           160 -> Assign: j = j + 1 -> 162 ]} -> 225;
+           join -> 235
+    225 -> Assume: j < 10 false -> 226
+    226 -> leave_loop -> 227
+    227 -> LeaveScope: j -> 228
+    228 -> Assign: i = i + 1 -> 229
+    229 -> Assume: i < 10 true -> 230
+    230 -> EnterScope: j -> 231
+    231 -> initialize variable: j -> 232
+    232 -> Assign: j = 0 -> 233
+    233 -> enter_loop -> 234
+    234 -> join -> 235
+    235 -> Loop(16) 148 {[ 148 -> Assume: j < 10 true -> 149
+                           149 -> EnterScope: tmp_0 -> 151
+                           151 -> EnterScope: \result<my_switch> -> 153
+                           153 -> CallDeclared:
                                     \result<my_switch> =
-                                    my_switch(tmp) -> 155
-                           155 -> Assign: tmp_0 = \result<my_switch> -> 157
-                           157 -> LeaveScope: \result<my_switch> -> 158
-                           158 -> Assign: tmp = tmp_0 + tmp -> 160
-                           160 -> LeaveScope: tmp_0 -> 161
-                           161 -> Assign: j = j + 1 -> 163 ]} -> 244;
-           join -> 255
-    244 -> Assume: j < 10 false -> 245
-    245 -> leave_loop -> 246
-    246 -> LeaveScope: j -> 247
-    247 -> LeaveScope: j -> 248
-    248 -> Assign: i = i + 1 -> 249
-    249 -> Assume: i < 10 true -> 250
-    250 -> EnterScope: j -> 251
-    251 -> initialize variable: j -> 252
-    252 -> Assign: j = 0 -> 253
-    253 -> enter_loop -> 254
-    254 -> join -> 255
-    255 -> Loop(16) 149 {[ 149 -> Assume: j < 10 true -> 150
-                           150 -> EnterScope: tmp_0 -> 152
-                           152 -> EnterScope: \result<my_switch> -> 154
-                           154 -> CallDeclared:
+                                    my_switch(tmp) -> 154
+                           154 -> Assign: tmp_0 = \result<my_switch> -> 156
+                           156 -> LeaveScope: \result<my_switch> -> 157
+                           157 -> Assign: tmp = tmp_0 + tmp -> 159
+                           159 -> LeaveScope: tmp_0 -> 160
+                           160 -> Assign: j = j + 1 -> 162 ]} -> 237;
+           join -> 247
+    237 -> Assume: j < 10 false -> 238
+    238 -> leave_loop -> 239
+    239 -> LeaveScope: j -> 240
+    240 -> Assign: i = i + 1 -> 241
+    241 -> Assume: i < 10 true -> 242
+    242 -> EnterScope: j -> 243
+    243 -> initialize variable: j -> 244
+    244 -> Assign: j = 0 -> 245
+    245 -> enter_loop -> 246
+    246 -> join -> 247
+    247 -> Loop(16) 148 {[ 148 -> Assume: j < 10 true -> 149
+                           149 -> EnterScope: tmp_0 -> 151
+                           151 -> EnterScope: \result<my_switch> -> 153
+                           153 -> CallDeclared:
                                     \result<my_switch> =
-                                    my_switch(tmp) -> 155
-                           155 -> Assign: tmp_0 = \result<my_switch> -> 157
-                           157 -> LeaveScope: \result<my_switch> -> 158
-                           158 -> Assign: tmp = tmp_0 + tmp -> 160
-                           160 -> LeaveScope: tmp_0 -> 161
-                           161 -> Assign: j = j + 1 -> 163 ]} -> 257;
-           join -> 268
-    257 -> Assume: j < 10 false -> 258
-    258 -> leave_loop -> 259
-    259 -> LeaveScope: j -> 260
-    260 -> LeaveScope: j -> 261
-    261 -> Assign: i = i + 1 -> 262
-    262 -> Assume: i < 10 true -> 263
-    263 -> EnterScope: j -> 264
-    264 -> initialize variable: j -> 265
-    265 -> Assign: j = 0 -> 266
-    266 -> enter_loop -> 267
-    267 -> join -> 268
-    268 -> Loop(16) 149 {[ 149 -> Assume: j < 10 true -> 150
-                           150 -> EnterScope: tmp_0 -> 152
-                           152 -> EnterScope: \result<my_switch> -> 154
-                           154 -> CallDeclared:
+                                    my_switch(tmp) -> 154
+                           154 -> Assign: tmp_0 = \result<my_switch> -> 156
+                           156 -> LeaveScope: \result<my_switch> -> 157
+                           157 -> Assign: tmp = tmp_0 + tmp -> 159
+                           159 -> LeaveScope: tmp_0 -> 160
+                           160 -> Assign: j = j + 1 -> 162 ]} -> 249;
+           join -> 259
+    249 -> Assume: j < 10 false -> 250
+    250 -> leave_loop -> 251
+    251 -> LeaveScope: j -> 252
+    252 -> Assign: i = i + 1 -> 253
+    253 -> Assume: i < 10 true -> 254
+    254 -> EnterScope: j -> 255
+    255 -> initialize variable: j -> 256
+    256 -> Assign: j = 0 -> 257
+    257 -> enter_loop -> 258
+    258 -> join -> 259
+    259 -> Loop(16) 148 {[ 148 -> Assume: j < 10 true -> 149
+                           149 -> EnterScope: tmp_0 -> 151
+                           151 -> EnterScope: \result<my_switch> -> 153
+                           153 -> CallDeclared:
                                     \result<my_switch> =
-                                    my_switch(tmp) -> 155
-                           155 -> Assign: tmp_0 = \result<my_switch> -> 157
-                           157 -> LeaveScope: \result<my_switch> -> 158
-                           158 -> Assign: tmp = tmp_0 + tmp -> 160
-                           160 -> LeaveScope: tmp_0 -> 161
-                           161 -> Assign: j = j + 1 -> 163 ]} -> 270;
-           join -> 281
-    270 -> Assume: j < 10 false -> 271
-    271 -> leave_loop -> 272
-    272 -> LeaveScope: j -> 273
-    273 -> LeaveScope: j -> 274
-    274 -> Assign: i = i + 1 -> 275
-    275 -> Assume: i < 10 true -> 276; join -> 289
-    276 -> EnterScope: j -> 277; join -> 291
-    277 -> initialize variable: j -> 278
-    278 -> Assign: j = 0 -> 279
-    279 -> enter_loop -> 280
-    280 -> join -> 281
-    281 -> Loop(16) 149 {[ 149 -> Assume: j < 10 true -> 150
-                           150 -> EnterScope: tmp_0 -> 152
-                           152 -> EnterScope: \result<my_switch> -> 154
-                           154 -> CallDeclared:
+                                    my_switch(tmp) -> 154
+                           154 -> Assign: tmp_0 = \result<my_switch> -> 156
+                           156 -> LeaveScope: \result<my_switch> -> 157
+                           157 -> Assign: tmp = tmp_0 + tmp -> 159
+                           159 -> LeaveScope: tmp_0 -> 160
+                           160 -> Assign: j = j + 1 -> 162 ]} -> 261;
+           join -> 271
+    261 -> Assume: j < 10 false -> 262
+    262 -> leave_loop -> 263
+    263 -> LeaveScope: j -> 264
+    264 -> Assign: i = i + 1 -> 265
+    265 -> Assume: i < 10 true -> 266; join -> 278
+    266 -> EnterScope: j -> 267; join -> 280
+    267 -> initialize variable: j -> 268
+    268 -> Assign: j = 0 -> 269
+    269 -> enter_loop -> 270
+    270 -> join -> 271
+    271 -> Loop(16) 148 {[ 148 -> Assume: j < 10 true -> 149
+                           149 -> EnterScope: tmp_0 -> 151
+                           151 -> EnterScope: \result<my_switch> -> 153
+                           153 -> CallDeclared:
                                     \result<my_switch> =
-                                    my_switch(tmp) -> 155
-                           155 -> Assign: tmp_0 = \result<my_switch> -> 157
-                           157 -> LeaveScope: \result<my_switch> -> 158
-                           158 -> Assign: tmp = tmp_0 + tmp -> 160
-                           160 -> LeaveScope: tmp_0 -> 161
-                           161 -> Assign: j = j + 1 -> 163 ]} -> 283;
-           join -> 296
-    283 -> Assume: j < 10 false -> 284
-    284 -> leave_loop -> 285
-    285 -> LeaveScope: j -> 286; join -> 301
-    286 -> LeaveScope: j -> 287
-    287 -> Assign: i = i + 1 -> 288; join -> 304
-    288 -> join -> 289
-    289 -> Assume: i < 10 true -> 290; join -> 306
-    290 -> join -> 291
-    291 -> EnterScope: j -> 292; join -> 308
-    292 -> initialize variable: j -> 293
-    293 -> Assign: j = 0 -> 294
-    294 -> enter_loop -> 295
-    295 -> join -> 296
-    296 -> Loop(16) 149 {[ 149 -> Assume: j < 10 true -> 150
-                           150 -> EnterScope: tmp_0 -> 152
-                           152 -> EnterScope: \result<my_switch> -> 154
-                           154 -> CallDeclared:
+                                    my_switch(tmp) -> 154
+                           154 -> Assign: tmp_0 = \result<my_switch> -> 156
+                           156 -> LeaveScope: \result<my_switch> -> 157
+                           157 -> Assign: tmp = tmp_0 + tmp -> 159
+                           159 -> LeaveScope: tmp_0 -> 160
+                           160 -> Assign: j = j + 1 -> 162 ]} -> 273;
+           join -> 285
+    273 -> Assume: j < 10 false -> 274
+    274 -> leave_loop -> 275
+    275 -> LeaveScope: j -> 276; join -> 290
+    276 -> Assign: i = i + 1 -> 277; join -> 292
+    277 -> join -> 278
+    278 -> Assume: i < 10 true -> 279; join -> 294
+    279 -> join -> 280
+    280 -> EnterScope: j -> 281; join -> 296
+    281 -> initialize variable: j -> 282
+    282 -> Assign: j = 0 -> 283
+    283 -> enter_loop -> 284
+    284 -> join -> 285
+    285 -> Loop(16) 148 {[ 148 -> Assume: j < 10 true -> 149
+                           149 -> EnterScope: tmp_0 -> 151
+                           151 -> EnterScope: \result<my_switch> -> 153
+                           153 -> CallDeclared:
                                     \result<my_switch> =
-                                    my_switch(tmp) -> 155
-                           155 -> Assign: tmp_0 = \result<my_switch> -> 157
-                           157 -> LeaveScope: \result<my_switch> -> 158
-                           158 -> Assign: tmp = tmp_0 + tmp -> 160
-                           160 -> LeaveScope: tmp_0 -> 161
-                           161 -> Assign: j = j + 1 -> 163 ]} -> 298;
-           join -> 313
-    298 -> Assume: j < 10 false -> 299
-    299 -> leave_loop -> 300
+                                    my_switch(tmp) -> 154
+                           154 -> Assign: tmp_0 = \result<my_switch> -> 156
+                           156 -> LeaveScope: \result<my_switch> -> 157
+                           157 -> Assign: tmp = tmp_0 + tmp -> 159
+                           159 -> LeaveScope: tmp_0 -> 160
+                           160 -> Assign: j = j + 1 -> 162 ]} -> 287;
+           join -> 301
+    287 -> Assume: j < 10 false -> 288
+    288 -> leave_loop -> 289
+    289 -> join -> 290
+    290 -> LeaveScope: j -> 291; join -> 306
+    291 -> join -> 292
+    292 -> Assign: i = i + 1 -> 293; join -> 308
+    293 -> join -> 294
+    294 -> Assume: i < 10 true -> 295; join -> 310
+    295 -> join -> 296
+    296 -> EnterScope: j -> 297; join -> 313
+    297 -> initialize variable: j -> 298
+    298 -> Assign: j = 0 -> 299
+    299 -> enter_loop -> 300
     300 -> join -> 301
-    301 -> LeaveScope: j -> 302; join -> 318
-    302 -> LeaveScope: j -> 303
-    303 -> join -> 304
-    304 -> Assign: i = i + 1 -> 305; join -> 321
+    301 -> Loop(16) 148 {[ 148 -> Assume: j < 10 true -> 149
+                           149 -> EnterScope: tmp_0 -> 151
+                           151 -> EnterScope: \result<my_switch> -> 153
+                           153 -> CallDeclared:
+                                    \result<my_switch> =
+                                    my_switch(tmp) -> 154
+                           154 -> Assign: tmp_0 = \result<my_switch> -> 156
+                           156 -> LeaveScope: \result<my_switch> -> 157
+                           157 -> Assign: tmp = tmp_0 + tmp -> 159
+                           159 -> LeaveScope: tmp_0 -> 160
+                           160 -> Assign: j = j + 1 -> 162 ]} -> 303;
+           join -> 318
+    303 -> Assume: j < 10 false -> 304
+    304 -> leave_loop -> 305
     305 -> join -> 306
-    306 -> Assume: i < 10 true -> 307; join -> 323
+    306 -> LeaveScope: j -> 307; join -> 323
     307 -> join -> 308
-    308 -> EnterScope: j -> 309; join -> 326
-    309 -> initialize variable: j -> 310
-    310 -> Assign: j = 0 -> 311
-    311 -> enter_loop -> 312
-    312 -> join -> 313
-    313 -> Loop(16) 149 {[ 149 -> Assume: j < 10 true -> 150
-                           150 -> EnterScope: tmp_0 -> 152
-                           152 -> EnterScope: \result<my_switch> -> 154
-                           154 -> CallDeclared:
-                                    \result<my_switch> =
-                                    my_switch(tmp) -> 155
-                           155 -> Assign: tmp_0 = \result<my_switch> -> 157
-                           157 -> LeaveScope: \result<my_switch> -> 158
-                           158 -> Assign: tmp = tmp_0 + tmp -> 160
-                           160 -> LeaveScope: tmp_0 -> 161
-                           161 -> Assign: j = j + 1 -> 163 ]} -> 315;
-           join -> 331
-    315 -> Assume: j < 10 false -> 316
-    316 -> leave_loop -> 317
-    317 -> join -> 318
-    318 -> LeaveScope: j -> 319; join -> 336
-    319 -> LeaveScope: j -> 320
-    320 -> join -> 321
-    321 -> Assign: i = i + 1 -> 322; join -> 339
-    322 -> join -> 323
-    323 -> join -> 326
-    326 -> join -> 331
-    331 -> join -> 336
-    336 -> join -> 339
-    339 -> Loop(10) 324 {[ 324 -> Assume: i < 10 true -> 325
-                           325 -> EnterScope: j -> 327
-                           327 -> initialize variable: j -> 328
-                           328 -> Assign: j = 0 -> 329
-                           329 -> enter_loop -> 330
-                           330 -> Loop(16) 149 {[ 149 -> Assume:
+    308 -> Assign: i = i + 1 -> 309; join -> 325
+    309 -> join -> 310
+    310 -> join -> 313
+    313 -> join -> 318
+    318 -> join -> 323
+    323 -> join -> 325
+    325 -> Loop(10) 311 {[ 311 -> Assume: i < 10 true -> 312
+                           312 -> EnterScope: j -> 314
+                           314 -> initialize variable: j -> 315
+                           315 -> Assign: j = 0 -> 316
+                           316 -> enter_loop -> 317
+                           317 -> Loop(16) 148 {[ 148 -> Assume:
                                                            j < 10 true 
-                                                           -> 150
-                                                  150 -> EnterScope:
-                                                           tmp_0 -> 152
-                                                  152 -> EnterScope:
+                                                           -> 149
+                                                  149 -> EnterScope:
+                                                           tmp_0 -> 151
+                                                  151 -> EnterScope:
                                                            \result<my_switch> 
-                                                           -> 154
-                                                  154 -> CallDeclared:
+                                                           -> 153
+                                                  153 -> CallDeclared:
                                                            \result<my_switch> =
                                                            my_switch(
-                                                           tmp) -> 155
-                                                  155 -> Assign:
+                                                           tmp) -> 154
+                                                  154 -> Assign:
                                                            tmp_0 = \result<my_switch> 
-                                                           -> 157
-                                                  157 -> LeaveScope:
+                                                           -> 156
+                                                  156 -> LeaveScope:
                                                            \result<my_switch> 
-                                                           -> 158
-                                                  158 -> Assign:
+                                                           -> 157
+                                                  157 -> Assign:
                                                            tmp = tmp_0 + tmp 
-                                                           -> 160
-                                                  160 -> LeaveScope:
-                                                           tmp_0 -> 161
-                                                  161 -> Assign:
+                                                           -> 159
+                                                  159 -> LeaveScope:
+                                                           tmp_0 -> 160
+                                                  160 -> Assign:
                                                            j = j + 1 
-                                                           -> 163 ]} 
-                                    -> 333
-                           333 -> Assume: j < 10 false -> 334
-                           334 -> leave_loop -> 335
-                           335 -> LeaveScope: j -> 337
-                           337 -> LeaveScope: j -> 338
-                           338 -> Assign: i = i + 1 -> 340 ]} -> 343
-    343 -> Assume: i < 10 false -> 344
-    344 -> leave_loop -> 345
-    345 -> LeaveScope: i -> 346
-    346 -> LeaveScope: i -> 347
-    347 -> EnterScope: \result<main> -> 348
-    348 -> Assign: \result<main> = tmp -> 349 ]} at 349
+                                                           -> 162 ]} 
+                                    -> 320
+                           320 -> Assume: j < 10 false -> 321
+                           321 -> leave_loop -> 322
+                           322 -> LeaveScope: j -> 324
+                           324 -> Assign: i = i + 1 -> 326 ]} -> 329
+    329 -> Assume: i < 10 false -> 330
+    330 -> leave_loop -> 331
+    331 -> LeaveScope: i -> 332
+    332 -> EnterScope: \result<main> -> 333
+    333 -> Assign: \result<main> = tmp -> 334 ]} at 334
 [from] Computing for function main
 [from] Computing for function my_switch <-main
 [from] Done for function my_switch
diff --git a/tests/value/widen_non_constant.i b/tests/value/widen_non_constant.i
index 4a297fc1a4fd930d8334c66bc53bfee250ecb027..00ec24ccbe489909ef00e449b579634065427d4a 100644
--- a/tests/value/widen_non_constant.i
+++ b/tests/value/widen_non_constant.i
@@ -80,9 +80,23 @@ void main4() {
 }
 
 
+static double sub(double a, double b) {return a - b;}
+
+/* Test for a possible crash on function pointers. */
+void main5 (void) {
+  int i = 0;
+  void *ptr = sub;
+  /* Do not add [sub] to the bases to be widened. */
+  while(i < 32 && ptr == sub) {
+    i++;
+  }
+}
+
+
 void main() {
   main1();
   main2();
   main3();
   main4();
+  main5();
 }
diff --git a/tests/verisec/suite/programs/apps/Makefile b/tests/verisec/suite/programs/apps/Makefile
index ecb8f7a623b9661f5f9a060e099dd289e5729dfc..2d7cb97cd85927ed6419667fe0ca66954bd70932 100644
--- a/tests/verisec/suite/programs/apps/Makefile
+++ b/tests/verisec/suite/programs/apps/Makefile
@@ -43,4 +43,4 @@ edbrowse: $(EDBROWSE_DIR)/strchr_bad.c
 openser:openser_6876
 
 openser_6876:$(OPENSER_6876_DIR)/full_bad.c
-	$(FRAMAC) -val $(STUBS) $(OPENSER_6876_DIR)/full_bad.c -slevel 500 >$(OPENSER_6876_DIR)/full_bad.log 2>$(OPENSER_6876_DIR)/full_bad.err
\ No newline at end of file
+	$(FRAMAC) -val $(STUBS) $(OPENSER_6876_DIR)/full_bad.c -slevel 500 >$(OPENSER_6876_DIR)/full_bad.log 2>$(OPENSER_6876_DIR)/full_bad.err