diff --git a/ALL_VERSIONS b/ALL_VERSIONS
index 127fa685225b133394702ffd2819c5d442a72a21..d9447f7b7d320386cd109d9acaaefc53da5ca3c8 100644
--- a/ALL_VERSIONS
+++ b/ALL_VERSIONS
@@ -1,5 +1,6 @@
 Version number			Date of release		Notes
 ==============			===============		=====
+18.0 (Argon)                    2018, November 29
 Chlorine-20180502               2018, July 06           Bug fixed
 Chlorine-20180501               2018, June 01
 Sulfur-20171101                 2017, November 28
diff --git a/Changelog b/Changelog
index d97c6803349ab92c574e12009d63afb771bb8aa3..141ced448ff11999cd6e3c9571ffaa1b38f307ea 100644
--- a/Changelog
+++ b/Changelog
@@ -13,11 +13,6 @@
 # '#?nnn'  : OLD-BTS entry #nnn                                               #
 ###############################################################################
 
-##################################
-Open Source Release <next-release>
-##################################
-
-
 ################################
 Open Source Release 18.0 (Argon)
 ################################
diff --git a/Makefile b/Makefile
index 6b117ec57cc620dae99d5829e1c410bffe79ecbc..70092c7cb3418f552d685b555464635837b4c83a 100644
--- a/Makefile
+++ b/Makefile
@@ -252,10 +252,13 @@ DISTRIB_FILES:=\
       VERSION VERSION_CODENAME $(wildcard licenses/*)                   \
       $(LIBC_FILES)							\
       share/analysis-scripts/cmd-dep.sh                                 \
+      share/analysis-scripts/concat-csv.sh                              \
+      $(wildcard share/analysis-scripts/examples/*)                     \
       share/analysis-scripts/flamegraph.pl                              \
       share/analysis-scripts/frama-c.mk                                 \
       share/analysis-scripts/list_files.py                              \
       share/analysis-scripts/parse-coverage.sh                          \
+      share/analysis-scripts/summary.sh                                 \
       share/analysis-scripts/README.md                                  \
       share/analysis-scripts/template.mk                                \
       $(wildcard share/emacs/*.el) share/autocomplete_frama-c           \
@@ -1800,13 +1803,18 @@ install:: install-lib
 	  $(FRAMAC_DATADIR)
 	$(MKDIR) $(FRAMAC_DATADIR)/analysis-scripts
 	$(CP) share/analysis-scripts/cmd-dep.sh \
+	  share/analysis-scripts/concat-csv.sh \
 	  share/analysis-scripts/flamegraph.pl \
 	  share/analysis-scripts/frama-c.mk \
 	  share/analysis-scripts/parse-coverage.sh \
 	  share/analysis-scripts/README.md \
 	  share/analysis-scripts/list_files.py \
+	  share/analysis-scripts/summary.sh \
 	  share/analysis-scripts/template.mk \
 	  $(FRAMAC_DATADIR)/analysis-scripts
+	$(MKDIR) $(FRAMAC_DATADIR)/analysis-scripts/examples
+	$(CP) share/analysis-scripts/examples/* \
+	  $(FRAMAC_DATADIR)/analysis-scripts/examples
 	$(MKDIR) $(FRAMAC_DATADIR)/emacs
 	$(CP) $(wildcard share/emacs/*.el) $(FRAMAC_DATADIR)/emacs
 	$(CP) share/frama-c.rc $(ICONS) $(FRAMAC_DATADIR)
diff --git a/VERSION b/VERSION
index 3a48ff126f4f03ea3b2eb133fb1b2de6bb40e772..fc004cb52c7a3c23ed19e8b19149b832f492ca2b 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-18.0+dev
\ No newline at end of file
+18.0
\ No newline at end of file
diff --git a/bin/build-src-distrib.sh b/bin/build-src-distrib.sh
index 67607a2e0835e5c71cbab3d6a56359f17830a6a4..111947be0a557a8aa3cd5d74275fc4987f32c2b5 100755
--- a/bin/build-src-distrib.sh
+++ b/bin/build-src-distrib.sh
@@ -36,7 +36,7 @@ FRAMAC_VERSION_CODENAME=$(cat VERSION_CODENAME)
 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/[A-Za-z]*-[0-9]*\\\(.*\\\)/\\1/)
+VERSION_MODIFIER=$(cat VERSION | sed -e s/[0-9.]*\\\(.*\\\)/\\1/)
 
 if test -n "$VERSION_MODIFIER"; then FINAL_RELEASE=no; else FINAL_RELEASE=yes; fi
 
@@ -313,7 +313,7 @@ case "${STEP}" in
       echo " - [$TARGZ_FILENAME](downloads/$TARGZ_FILENAME)" >> $WIKI_PAGE
       echo "" >> $WIKI_PAGE
       echo "## Manuals" >> $WIKI_PAGE
-    for f in "user-manual" "acsl-implementation" "value-analysis" "plugin-development-guide" "rte-manual" "wp-manual" "metrics-manual" "aorai-manual"; do
+    for f in "user-manual" "acsl-implementation" "eva-manual" "plugin-development-guide" "rte-manual" "wp-manual" "metrics-manual" "aorai-manual"; do
         echo "- [$f](manuals/$f-${FRAMAC_VERSION_AND_CODENAME}.pdf)" >> $WIKI_PAGE
         run "cp $MANUALS_DIR/$f.pdf $GITHUB_WIKI/manuals/$f-${FRAMAC_VERSION_AND_CODENAME}.pdf"
         run "git -C $GITHUB_WIKI add manuals/$f-${FRAMAC_VERSION_AND_CODENAME}.pdf"
diff --git a/doc/Makefile b/doc/Makefile
index de074ba66b8d858ba6ce46003caf5ed7d5b448be..e45e252c0f47f8df338ed88a1f0431ad2a4b9f5c 100644
--- a/doc/Makefile
+++ b/doc/Makefile
@@ -55,7 +55,7 @@ MANUALS=acsl
 #MANUALS that depend on the frama-c version
 VERSIONED_MANUALS=acsl-implementation aorai-manual rte-manual	\
 		  wp-manual metrics-manual user-manual		\
-		  plugin-development-guide value-analysis
+		  plugin-development-guide eva-manual
 
 FILES= $(addprefix manuals/, \
 	 $(addsuffix -$(VERSION).pdf, $(VERSIONED_MANUALS)) \
diff --git a/doc/developer/developer.bib b/doc/developer/developer.bib
index 69d4aa57560e3129b6e730607fce0edd325f2387..7f4c8c58ecdc729975a21be0a0379d7799336ce8 100644
--- a/doc/developer/developer.bib
+++ b/doc/developer/developer.bib
@@ -35,7 +35,7 @@
   title  = {{Frama-C}'s value analysis plug-in},
   year   = 2015,
   month  = feb,
-  note   = {\mbox{\url{http://frama-c.com/download/frama-c-value-analysis.pdf}}},
+  note   = {\mbox{\url{http://frama-c.com/download/frama-c-eva-manual.pdf}}},
 }
 
 @misc{slicing,
diff --git a/doc/rte/biblio.bib b/doc/rte/biblio.bib
index 12f5a2484516bc23f15dc83d1b406a3304890270..0bb03befc467bd8b9dfa10a17be6d55dd555205e 100644
--- a/doc/rte/biblio.bib
+++ b/doc/rte/biblio.bib
@@ -21,7 +21,7 @@ howpublished={\url{http://manju.cs.berkeley.edu/cil/}}
   title = {Frama-C's value analysis plug-in},
   author={Pascal Cuoq and Boris Yakobowski and Virgile Prevosto},
   organization = {CEA List, Software Reliability Laboratory},
-  note = {\url{http://frama-c.com/download/frama-c-value-analysis.pdf}}
+  note = {\url{http://frama-c.com/download/frama-c-eva-manual.pdf}}
 }
 
 @MANUAL{framacwp,
diff --git a/doc/userman/userman.bib b/doc/userman/userman.bib
index 0237983740a880d86e59ceeeb8992efc446a8f44..a8abde0581e886288dc4526765a1013c7ad2d742 100644
--- a/doc/userman/userman.bib
+++ b/doc/userman/userman.bib
@@ -4,7 +4,7 @@
   title  = {{Frama-C Plug-in Development Guide}},
   year   = 2015,
   month  = feb,
-  note   = {\newline \url{http://frama-c.cea.fr/download/plugin-developer.pdf}},
+  note   = {\newline \url{http://frama-c.com/download/frama-c-plugin-development-guide.pdf}},
 }
 
 @manual{value,
@@ -12,7 +12,7 @@
   title  = {{Frama-C}'s value analysis plug-in},
   year   = 2015,
   month  = feb,
-  note   = {\mbox{\url{http://frama-c.cea.fr/download/value-analysis.pdf}}},
+  note   = {\mbox{\url{http://frama-c.com/download/frama-c-eva-manual.pdf}}},
 }
 
 @manual{acsl,
@@ -109,5 +109,5 @@ note={Extended version of \cite{sefm12}},
   author = {Julien Signoles},
   year = {2015},
   month = feb,
-  note = {\url{http://frama-c.com/eacsl}},
+  note = {\url{http://frama-c.com/eacsl.html}},
 }
diff --git a/doc/value/main.tex b/doc/value/main.tex
index e881bac4e14cb6cde8800c6bb82278310795d6c8..2d5124ad23a4639fa25509a1de053eaf6842253f 100644
--- a/doc/value/main.tex
+++ b/doc/value/main.tex
@@ -2205,7 +2205,7 @@ Besides, the source code of some of the functions used by
 the application may not be available (library functions for instance).
 The plug-in can be used, usually with more work, in all these circumstances.
 The options for specifying the entry point of the analysis are detailed
-in this manual, section \ref{trait_fonctions}.
+in this manual, section \ref{val-use-spec}.
 
 \subsection{Entry point of a complete application}
 
@@ -2564,7 +2564,7 @@ the following program does not terminate:
 If this program is analyzed
 with the default options of \Eva{}, the analysis finds
 that every time execution reaches the end of \lstinline|main|, the value
-of \lstinline|x| is in  $\bropen 100..127\brclose$. This does
+of \lstinline|x| is $\geq 100$. This does
 not mean that the function always terminates or even that it may
 sometimes terminate (it does neither). When \Eva{}
 proposes an interval for \lstinline|x| at a point P, 
@@ -2591,7 +2591,7 @@ int x, y, z;
 main(int c){
   ...
   ...
-/* At this point \Eva{} guarantees:
+/* At this point Eva guarantees:
    x IN {0; 1} 
    y IN {0; 1}; */
   z = 10 / (x - y);
@@ -2634,7 +2634,27 @@ Just in case.}
 
 \vspace{2cm}
 
+Parameterization of \Eva{} involves two main kinds of options:
+{\em correctness options} and {\em performance tuning options}.
+The former require understanding of their meaning and of the extra hypotheses
+they entail; used incorrectly, they can lead to a wrong analysis.
+The latter control the tradeoff between the quality of the results and the
+resources taken by the analyzer to provide them (CPU time and memory usage).
+These options cannot be used wrongly, in the sense that they do not affect the
+correctness of the results. However, using them efficiently is essential for
+scalability of the analysis.
+
+Section \ref{command-line} presents the general usage options of \Eva{} in the
+command-line.
+The options described in section \ref{context} are correctness options,
+while the remaining sections (\ref{boucles-traitement},
+\ref{controlling-approximations} and \ref{sec:eva}) deal with performance
+tuning options. Finally, \ref{nonterm} presents a derived analysis to
+obtain information about non-termination.
+
+
 \section{Command line}
+\label{command-line}
 
 The parameters that determine Frama-C's behavior can be
 set through the command line.
@@ -3151,24 +3171,58 @@ informed assumptions. However, no guarantee is made that those assumptions
 over-approximate the real behavior of the function. The inferred
 contract should be verified carefully by the user.
 
+\subsection{Using the specification of a function instead of its body}
+\label{val-use-spec}
 
+In some cases, one can estimate that the analysis of a given function \verb+f+
+takes too much time. This can be caused by a very complex
+function, or because \verb+f+ is called many times during the analysis.
+Another situation is when a function already has a functional specification,
+proved for instance with the \textsf{WP} plug-in, and we do not want/need
+to analyze it with \Eva{}.
 
-\section{Controlling approximations}
+In the cases above, a somewhat radical
+approach consists in replacing the entire body of the function
+by an ACSL contract that describes its behavior. See for example
+section~\ref{annot_assigns} for how to specify which values the function
+reads and writes.
 
-Unlike options of section \ref{context}, which used wrongly may cause
-\Eva{} to produce incorrect results, all the options
-in this section give the user control over the tradeoff between the
-quality of the results and the resources taken by the analyzer to
-provide them. The options described in this section can, so to speak,
-not be used wrongly. They may cause Frama-C to exhaust the available
-memory, to take a nearly infinite time, or, in the other direction,
-to produce results so imprecise that they are useless, but {\bf never}
-to produce incorrect results.
-
-\subsection{Treatment of loops}
-\label{boucles-traitement}
+Alternatively, one can leave the body of the function untouched, but
+still write a contract. Then it is possible to use the option
+\verb+-eva-use-spec f+. This instructs \Eva{} to use the
+specification of \verb+f+ instead of its body each time a call to
+\verb+f+ is encountered. This is equivalent\footnote{Except for a few
+  properties, as described in the next paragraph.} to deleting the body
+of \verb+f+ for \Eva{}, but not for the other plug-ins of \FramaC,
+that may study the body of \verb+f+ on their own.
 
-\subsubsection{Default treatment of loops}
+Notice that option \verb+-eva-use-spec f+ loses some guarantees. In particular,
+the body of \verb+f+ is not studied at all by \Eva{}. Neither
+are the functions that \verb+f+ calls, unless they are used by some other
+functions than \verb+f+. Moreover, \Eva{} does not attempt
+to check that \verb+f+ conforms to its specification. In particular,
+postconditions are marked as {\em unknown} with \verb+-eva-use-spec+,
+while they are {\em considered valid} for functions without body.
+It is the responsibility
+of the user to verify those facts, for example by studying \verb+f+
+on its own in a generic context.
+
+
+
+%\section{Controlling approximations}
+%
+%Unlike options of section \ref{context}, which used wrongly may cause
+%\Eva{} to produce incorrect results, all the options
+%in this section give the user control over the tradeoff between the
+%quality of the results and the resources taken by the analyzer to
+%provide them. The options described in this section can, so to speak,
+%not be used wrongly. They may cause Frama-C to exhaust the available
+%memory, to take a nearly infinite time, or, in the other direction,
+%to produce results so imprecise that they are useless, but {\bf never}
+%to produce incorrect results.
+
+\section{Improving precision in loops}
+\label{boucles-traitement}
 
 The default treatment of loops by the analyzer may produce
 results that are too approximate. Tuning 
@@ -3181,8 +3235,181 @@ entering the loop. This englobing state may be too imprecise
 by construction: typically, if the analyzed loop is initializing
 an array, the user does not expect to see the initial values of
 the array appear in the state computed by the analyzer.
-The solution in this case is to use one of the two unrolling options,
-as described in this section.
+The solution in this case is to either unroll loops, using one of several
+available methods, or to add annotations (widening hints or loop invariants)
+that enable the analyzer to maintain precision while ensuring the analysis
+time remains bounded.
+
+\subsection{Loop unrolling}
+
+Loop unrolling is often easier to apply, since it does not require much
+knowledge about the loop, other than an estimate of the number of iterations.
+This estimate may not improve precision if too low
+or lead to unnecessary work if too high,
+but will never affect its correctness.
+
+\subsubsection{Loop unroll annotations}
+
+Whenever a loop has a fixed number of iterations (or a known upper bound),
+an easy and precise way to handle it is to include a
+\lstinline|loop unroll <n>| annotation, where
+\lstinline|<n>| is the number of iterations of the loop.
+It will indicate \Eva{} to analyze the loop by semantically unrolling each
+iteration, avoiding merging states from different iterations.
+This leads to increased cost in terms of analysis, but usually the cost
+increase is worth the improvement in precision.
+
+Such annotations must be placed before just before the loop (i.e. before the
+\lstinline|while|, \lstinline|for| or \lstinline|do| introducing the loop),
+and one annotation is required per loop, including nested ones. For instance:
+
+\begin{lstlisting}
+#define NROWS 10
+void main() {
+  int a[NROWS][20] = {0};
+  //@ loop unroll NROWS;
+  for (int i = 0; i < 10; i++) {
+    //@ loop unroll (10+10);
+    for (int j = 0; j < 20; j++) {
+      a[i][j] += i + j;
+    }
+  }
+}
+\end{lstlisting}
+
+Note that constants obtained via \lstinline|#define| macros can be used in
+annotations, as well as constant expressions. The annotations above will ensure
+that \Eva{} will unroll the loops and keep the analysis precise; otherwise,
+the array access \lstinline|a[i][j]| might generate alarms due to imprecisions.
+
+The unrolling mechanism is independent of \lstinline|-eva-slevel|
+(see next subsection): annotated loops are always unrolled at least the specified
+number of times. If the loop has not been entirely unrolled, however,
+remaining \lstinline|-eva-slevel| may be used to unroll more iterations.
+
+While it is sometimes useful to unroll only the first iterations, the usual
+objective is full unrolling; the user can enable option
+\lstinline|-value-msg-key=loop-unrolling| to be informed whenever the specified
+unrolling value is insufficient to unroll the loop entirely:
+
+\begin{lstlisting}
+void main() {
+  //@ loop unroll 20; // should be 21
+  for (int i = 0 ; i <= 20 ; i ++) {
+  }
+}
+\end{lstlisting}
+
+\begin{lstlisting}
+[eva:loop-unrolling] insuf-loop.c:3: loop not completely unrolled
+\end{lstlisting}
+
+Note that using an unrolling parameter which is higher than the actual number
+of iterations of a loop doesn't generally have an effect on the analysis.
+The analyzer will usually detect that further iterations are not useful.
+
+If all loops in a program need to be unrolled, one way to do it quickly
+consists in using option \lstinline|-eva-min-loop-unroll <n>|,
+where \lstinline|<n>| is the number of iterations to unroll in each loop.
+This option has lower precedence than \lstinline|loop unroll| annotations:
+\Eva{} will always consider the latter if it is present in a loop.
+This allows, for instance, to prevent unrolling of an infinite loop by
+adding \lstinline|loop unroll 0| before it, while unrolling the remaining
+loops by the specified amount in \lstinline|-eva-min-loop-unroll|.
+
+\subsubsection{Unrolling via option {\em -eva-slevel}}
+\label{slevel}
+
+The option \lstinline|-eva-slevel n| indicates that the analyzer is allowed
+to separate, in each point of the analyzed code,
+up to \lstinline|n| states from different execution paths before starting
+to compute the unions of said states. An effect of this option
+is that the states corresponding to the first, second,\ldots
+iterations in a loop remain separated, as if the loop had been unrolled.
+
+Unlike with \lstinline|loop unroll| annotations, the number \lstinline|n|
+to use with \lstinline|-eva-slevel| depends on the nature of the control flow
+graph of the function to analyze.
+If the only control structure is a loop of \lstinline|m| iterations,
+then \texttt{-eva-slevel \textsf{m+1}} allows to unroll the loop completely.
+The presence of other loops or of \lstinline|if-then-else| constructs
+multiplies the number of paths a state may correspond to,
+and thus the number of states it is necessary to keep separated
+in order to unroll a loop completely.
+For instance, the
+nested simple loops in the following example require the
+option \lstinline|-eva-slevel 55| in order to be completely unrolled:
+\lstinputlisting[numbers=left]
+  {examples/parametrizing/slevel.c}
+
+When the loops are sufficiently unrolled, the result obtained for the
+contents of array \lstinline|t| are the optimally precise:
+\lstinputlisting[linerange={14-14}]
+  {examples/parametrizing/slevel.1.log}
+
+The number to pass the option \lstinline|-eva-slevel|  is of the magnitude of
+the number of values for \lstinline|i| (the 6 integers between 0 and 5)
+times the number of possible values for \lstinline|j| (the 11
+integers comprised between 0 and 10). If a value much lower than
+this is passed, the result of the initialization of array \lstinline|t|
+will only be precise for the first cells. The option \lstinline|-eva-slevel 28|
+gives for instance the following result for array \lstinline|t|:
+\lstinputlisting[linerange={15-16}]
+  {examples/parametrizing/slevel.2.log}
+
+In this result, the effects of the first iterations of the loops
+(for the whole of \lstinline|t[0]|, the whole of \lstinline|t[1]| and the first
+half of \lstinline|t[2]|) have been computed precisely. The
+effects on the rest of \lstinline|t| were computed with
+approximations. Because of these approximations, the analyzer can not
+tell whether each of those cells contains 1 or its original value 0.
+The value proposed for the cells \lstinline|t[2][5]| and following
+is imprecise but correct. The set \lstinline|{0; 1}| does
+contain the actual value \lstinline|1| of the cells.
+
+The option \lstinline|-eva-slevel-function f:n| tells the analyzer to apply 
+semantic unrolling level \lstinline|n| to function \lstinline|f|.
+This fine-tuning option allows to 
+force the analyzer to invest time precisely analyzing functions that matter,
+for instance \lstinline|-eva-slevel-function crucial_initialization:2000|.
+Oppositely, options \lstinline|-eva-slevel 100 -eva-slevel-function trifle:0| 
+can be used together to avoid squandering resources over irrelevant parts of 
+the analyzed application. The \lstinline|-eva-slevel-function| option can be used 
+several times to set the semantic unrolling level of several functions.
+
+Overall, \lstinline|-eva-slevel| has the advantage of being quick to setup.
+However, it does not allow fine grained control as loop unrolling annotations,
+it is context-dependent (e.g. for nested loops), unstable (minor changes in
+control flow may affect the usage of slevel) and hard to estimate in presence
+of complex control flows.
+
+\subsubsection{Syntactic unrolling}
+
+Syntactic unrolling (option \lstinline|-ulevel n|, provided by the \FramaC
+kernel), while not recommended when using \Eva{}, is another way to unroll
+loops for a more precise analysis. The only advantage of syntactic unrolling
+is that the GUI will show separate statements, allowing
+the user to see the values of variables at each iteration.
+However, this method is slower and leads to code which may become less
+readable, due to the introduction of extra variables, labels and statements.
+
+The value \lstinline$n$ is the number of times to unroll the loop before starting
+any analysis (if larger than the number of loop iterations, the extra code will
+still be generated, but it may end up being considered unreachable by \Eva{}).
+In any case, a large value for \lstinline|n| makes the analyzed code larger,
+especially for nested loops. This may cause the analyzer to use more time and
+memory.
+
+It is possible to control syntactic unrolling for each loop in the analyzed code
+with the annotation \lstinline|//@loop pragma UNROLL n;|, placed before the loop.
+
+
+\subsection{Widening hints and loop invariants}
+
+Besides loop unrolling, another technique to improve precision in loops
+consists in using the standard computation by accumulation mechanism present in
+tools based on abstract interpretation. This mechanism requires a more involved
+setup, but can lead to more efficient analyses.
 
 As compared to loop unrolling, the advantage of the computation
 by accumulation is that it generally requires less iterations
@@ -3199,7 +3426,7 @@ parameters in the widening process, it may (rarely) be appropriate
 to help it by providing it with the bounds that are likely to
 be reached, for a given variable modified inside a loop.
 
-\subsubsection{Stipulating bounds}
+\subsubsection{Widening hints}
 \label{subsub:widen-hints}
 
 The user may place an annotation \lstinline|//@ widen_hints $v$, $e_1,\ldots,e_m$ ;|
@@ -3271,103 +3498,10 @@ Example:
 \lstinputlisting[numbers=left]
   {examples/parametrizing/pragma-widen-hints.c}
 
-\subsubsection{Loop unrolling}\label{deroulage}
-
-There are two different options for forcing \Eva{}
-to unroll the effects of the body of the loop, as many times as
-specified, in order to obtain a precise representation of the effects
-of the loop itself. If the number of iterations is sufficient,
-the analyzer is thus able to determine that each cell in the array
-is initialized, as opposed to the approximation techniques
-from the previous section.
-
-\paragraph{Syntactic unrolling}
-
-The option \lstinline|-ulevel n| indicates that Frama-C should unroll
-the loops syntactically \lstinline$n$ times before starting any analysis.
-If the provided number \lstinline|n| is larger than the number of iterations
-of the loop, then the loop is completely unrolled and the analysis will
-not observe any loop in that part of the code.
-
-Providing a large value for \lstinline|n| makes the analyzed code bigger:
-this may cause the analyzer to use more time and memory. This option
-can also make the code notably bigger in presence of
-nested loops (polynomially bigger in the depth of nested loops). A large value
-should therefore not be used in this case.
-
-It is possible to control the syntactic unrolling for each
-loop in the analyzed code with the annotation
-\lstinline|//@ loop pragma UNROLL n;|.  The user should place 
-this annotation in the source code, just before
-the loop. This annotation causes Frama-C's front-end to unroll 
-the loop \lstinline|n| times.
-
-\paragraph{Semantic unrolling}
-\label{slevel}
-
-The option \lstinline|-eva-slevel n| indicates that the analyzer is allowed
-to separate, in each point of the analyzed code,
-up to \lstinline|n| states from different execution paths before starting
-to compute the unions of said states. An effect of this option
-is that the states corresponding to the first, second,\ldots
-iterations in the loop remain separated, as if the loop had been
-unrolled.
-
-The number \lstinline|n| to use depends on the
-nature of the control flow graph of the function to analyze.
-If the only control structure is a loop of \lstinline|m| iterations,
-then \texttt{-eva-slevel \textsf{m+1}} allows to unroll the loop completely.
-The presence of other loops or of \lstinline|if-then-else| constructs
-multiplies the number of paths a state may correspond to,
-and thus the number of states it is necessary to keep separated
-in order to unroll a loop completely.
-For instance, the
-nested simple loops in the following example require the
-option \lstinline|-eva-slevel 55| in order to be completely unrolled:
-\lstinputlisting[numbers=left]
-  {examples/parametrizing/slevel.c}
-
-When the loops are sufficiently unrolled, the result obtained for the
-contents of array \lstinline|t| are the optimally precise:
-\lstinputlisting[linerange={14-14}]
-  {examples/parametrizing/slevel.1.log}
-
-The number to pass the option \lstinline|-eva-slevel|  is of the magnitude of
-the number of values for \lstinline|i| (the 6 integers between 0 and 5)
-times the number of possible values for \lstinline|j| (the 11
-integers comprised between 0 and 10). If a value much lower than
-this is passed, the result of the initialization of array \lstinline|t|
-will only be precise for the first cells. The option \lstinline|-eva-slevel 28|
-gives for instance the following result for array \lstinline|t|:
-\lstinputlisting[linerange={15-16}]
-  {examples/parametrizing/slevel.2.log}
-
-In this result, the effects of the first iterations of the loops
-(for the whole of \lstinline|t[0]|, the whole of \lstinline|t[1]| and the first
-half of \lstinline|t[2]|) have been computed precisely. The
-effects on the rest of \lstinline|t| were computed with
-approximations. Because of these approximations, the analyzer can not
-tell whether each of those cells contains 1 or its original value 0.
-The value proposed for the cells \lstinline|t[2][5]| and following
-is imprecise but correct. The set \lstinline|{0; 1}| does
-contain the actual value \lstinline|1| of the cells.
-
-The option \lstinline|-eva-slevel-function f:n| tells the analyzer to apply 
-semantic unrolling level \lstinline|n| to function \lstinline|f|.
-This fine-tuning option allows to 
-force the analyzer to invest time precisely analyzing functions that matter,
-for instance \lstinline|-eva-slevel-function crucial_initialization:2000|.
-Oppositely, options \lstinline|-eva-slevel 100 -eva-slevel-function trifle:0| 
-can be used together to avoid squandering resources over irrelevant parts of 
-the analyzed application. The \lstinline|-eva-slevel-function| option can be used 
-several times to set the semantic unrolling level of several functions.
-
-
 \subsubsection{Loop invariants}
 
-A last technique, complementary to the unrolling ones above, 
-consists in using the loop invariant construct of ACSL. Loop invariants
-describe some
+A last technique consists in using the loop invariant construct of ACSL.
+Loop invariants describe some
 properties that hold at the beginning of each execution of a loop,
 as explained in the ACSL specification, \S2.4.2.
 %\url{http://frama-c.com/download/acsl.pdf}
@@ -3430,127 +3564,99 @@ We have effectively replaced an alarm, the possible out-of-bounds access at
 line~7, by an invariant, that remains to be proven.
 
 
-\subsection{Treatment of functions}
-\label{trait_fonctions}
-
-\subsubsection{Skipping the recording of the results of a function}
-\label{noresults}
-
-When a function \lstinline|f|
-is called many times, or, in presence of semantic unrolling,
-if \lstinline|f| contains large/nested loops, significant 
-time may be spent recording the values taken by the program's variables
-at each of \lstinline|f|'s statements.
-If the user knows that these values will not be useful later,
-ey can instruct \Eva{} not to record these with the
-\lstinline|-eva-no-results-function f| option.
-The \lstinline|-eva-no-results-function| option
-can be used several times, to omit the results of several functions.
-The option \lstinline|-eva-no-results| can be used to omit all
-results.
-It can result in a significant saving of time, as in the following example.
-
-\lstinputlisting[numbers=left]
-  {examples/parametrizing/nor.c}
-
-\begin{shell}
-time frama-c -eva nor.c -eva-slevel 2001
-\end{shell}
-
-\lstinputlisting[linerange={30-33},numbers=left,firstnumber=36]
-  {examples/parametrizing/nor.1.log}
-\lstinputlisting[linerange={2032-2035},numbers=left,firstnumber=2036]
-  {examples/parametrizing/nor.1.log}
-\lstinputlisting[linerange={4032-4036},numbers=left,firstnumber=4038]
-  {examples/parametrizing/nor.1.log}
-
-Launched with option \lstinline|-eva-slevel 2001| so that the value returned
-by \lstinline|main| can be computed precisely, the analysis takes more than
-half a second.
- Contrast with:
-
-\begin{shell}                                             
-time frama-c -eva nor.c -eva-slevel 2001 -eva-no-results-function irrelevant_function
-\end{shell}
-
-\lstinputlisting[linerange={30-34},numbers=left,firstnumber=36]
-  {examples/parametrizing/nor.2.log}
-\lstinputlisting[linerange={2031-2035},numbers=left,firstnumber=2037]
-  {examples/parametrizing/nor.2.log}
-
-When instructed, with 
-option \lstinline|-eva-no-results-function irrelevant_function|,
-that the values for the function
-\lstinline|irrelevant_function| do not need to be kept, \Eva{}
-takes less than half the time to produce its results. This shows
-that in the earlier analysis, most of the time was not spent in the
-analysis itself but in recording the values
-of \lstinline|irrelevant_function|.
-
-Note that the function \lstinline|irrelevant_function| was analyzed with
-as much precision as before, and that the result for \lstinline|main| is
-as precise as before. The recording of some results 
-is omitted, but this does not cause any loss of precision {\em during}
-the analysis\footnote{The emission of run-time error alarms and the evaluation
-of user-provided ACSL properties are done during the analysis and are 
-not influenced by the {\tt -eva-no-results*} options. If you make use
-of only these functionalities, then you can speed up the analysis 
-with option {\tt -eva-no-results} without detrimental effects.}.
-The results for \verb|irrelevant_function| are, as expected, unavailable.
-The ``outputs'' of \verb|main| (the ``outputs'' computation is
-described in chapter \ref{inoutdeps}) cannot be computed, because
-they depend on the outputs of \lstinline|irrelevant_function|, which
-require the values of that function to be computed.
-These outputs would automatically be used for
-displaying only the relevant variables if they were available.
-Instead, all the program's variables are displayed.
-
-The meaning of option \lstinline|-eva-no-results-function irrelevant_function|
-is different from that of option 
-\lstinline|-eva-slevel-function irrelevant_function:0|. In the case of the latter,
-values
-are computed with less precision for \verb|irrelevant_function|
-but the computed values are kept in memory as usual.
-All derived analyses (such as outputs)
-are available, but the values predicted by the analysis are
-less precise, because \verb|irrelevant_function| has been analyzed
-less precisely.
-
-\subsubsection{Using the specification of a function instead of its body}
-\label{val-use-spec}
-
-In some cases, one can estimate that the analysis of a given function \verb+f+
-takes too much time. This can be caused by a very complex
-function, or because \verb+f+ is called many times during the analysis.
-If the solutions of the previous section are not sufficient, a radical
-approach consists in replacing the entire body of the function
-by an ACSL contract, that describes its behavior. See for example
-section~\ref{annot_assigns} for how to specify which values the function
-reads and writes.
-
-Alternatively, one can leave the body of the function untouched, but
-still write a contract. Then it is possible to use the option
-\verb+-eva-use-spec f+. This instructs \Eva{} to use the
-specification of \verb+f+ instead of its body each time a call to
-\verb+f+ is encountered. This is equivalent\footnote{Except for a few
-  properties, as described in the next paragraph.} to deleting the body
-of \verb+f+ for \Eva{}, but not for the other plug-ins of \FramaC,
-that may study the body of \verb+f+ on their own.
-
-Notice that option \verb+-eva-use-spec f+ loses some guarantees. In particular,
-the body of \verb+f+ is not studied at all by \Eva{}. Neither
-are the functions that \verb+f+ calls, unless they are used by some other
-functions than \verb+f+. Moreover, \Eva{} does not attempt
-to check that \verb+f+ conforms to its specification. In particular,
-postconditions are marked as {\em unknown} with \verb+-eva-use-spec+,
-while they are {\em considered valid} for functions without body.
-It is the responsibility
-of the user to verify those facts, for example by studying \verb+f+
-on its own in a generic context.
-
+%% \section{Treatment of functions}
+%% \label{trait_fonctions}
+
+%% Some \Eva{} options can be used to handle certain functions in a special
+%% way, to improve the efficiency of the analysis.
+
+
+%% \subsubsection{Skipping the recording of the results of a function}
+%% \label{noresults}
+
+%% When a function \lstinline|f|
+%% is called many times, or, in presence of semantic unrolling,
+%% if \lstinline|f| contains large/nested loops, significant 
+%% time may be spent recording the values taken by the program's variables
+%% at each of \lstinline|f|'s statements.
+%% If the user knows that these values will not be useful later,
+%% ey can instruct \Eva{} not to record these with the
+%% \lstinline|-eva-no-results-function f| option.
+%% The \lstinline|-eva-no-results-function| option
+%% can be used several times, to omit the results of several functions.
+%% The option \lstinline|-eva-no-results| can be used to omit all
+%% results.
+%% It can result in a significant saving of time, as in the following example.
+
+%% \lstinputlisting[numbers=left]
+%%   {examples/parametrizing/nor.c}
+
+%% \begin{shell}
+%% time frama-c -eva nor.c -eva-slevel 2001
+%% \end{shell}
+
+%% \lstinputlisting[linerange={30-33},numbers=left,firstnumber=36]
+%%   {examples/parametrizing/nor.1.log}
+%% \lstinputlisting[linerange={2032-2035},numbers=left,firstnumber=2036]
+%%   {examples/parametrizing/nor.1.log}
+%% \lstinputlisting[linerange={4032-4036},numbers=left,firstnumber=4038]
+%%   {examples/parametrizing/nor.1.log}
+
+%% Launched with option \lstinline|-eva-slevel 2001| so that the value returned
+%% by \lstinline|main| can be computed precisely, the analysis takes more than
+%% half a second.
+%%  Contrast with:
+
+%% \begin{shell}                                             
+%% time frama-c -eva nor.c -eva-slevel 2001 -eva-no-results-function irrelevant_function
+%% \end{shell}
+
+%% \lstinputlisting[linerange={30-34},numbers=left,firstnumber=36]
+%%   {examples/parametrizing/nor.2.log}
+%% \lstinputlisting[linerange={2031-2035},numbers=left,firstnumber=2037]
+%%   {examples/parametrizing/nor.2.log}
+
+%% When instructed, with 
+%% option \lstinline|-eva-no-results-function irrelevant_function|,
+%% that the values for the function
+%% \lstinline|irrelevant_function| do not need to be kept, \Eva{}
+%% takes less than half the time to produce its results. This shows
+%% that in the earlier analysis, most of the time was not spent in the
+%% analysis itself but in recording the values
+%% of \lstinline|irrelevant_function|.
+
+%% Note that the function \lstinline|irrelevant_function| was analyzed with
+%% as much precision as before, and that the result for \lstinline|main| is
+%% as precise as before. The recording of some results 
+%% is omitted, but this does not cause any loss of precision {\em during}
+%% the analysis\footnote{The emission of run-time error alarms and the evaluation
+%% of user-provided ACSL properties are done during the analysis and are 
+%% not influenced by the {\tt -eva-no-results*} options. If you make use
+%% of only these functionalities, then you can speed up the analysis 
+%% with option {\tt -eva-no-results} without detrimental effects.}.
+%% The results for \verb|irrelevant_function| are, as expected, unavailable.
+%% The ``outputs'' of \verb|main| (the ``outputs'' computation is
+%% described in chapter \ref{inoutdeps}) cannot be computed, because
+%% they depend on the outputs of \lstinline|irrelevant_function|, which
+%% require the values of that function to be computed.
+%% These outputs would automatically be used for
+%% displaying only the relevant variables if they were available.
+%% Instead, all the program's variables are displayed.
+
+%% The meaning of option \lstinline|-eva-no-results-function irrelevant_function|
+%% is different from that of option 
+%% \lstinline|-eva-slevel-function irrelevant_function:0|. In the case of the latter,
+%% values
+%% are computed with less precision for \verb|irrelevant_function|
+%% but the computed values are kept in memory as usual.
+%% All derived analyses (such as outputs)
+%% are available, but the values predicted by the analysis are
+%% less precise, because \verb|irrelevant_function| has been analyzed
+%% less precisely.
 
 
-\section{Analysis cutoff values}
+\section{Controlling approximations}
+\label{controlling-approximations}
 
 \subsection{Cutoff between integer sets and integer intervals}
 
@@ -3576,6 +3682,36 @@ analysis result then becomes:
 \lstinputlisting[linerange={23-23}]
   {examples/parametrizing/ilevel.2.log}
 
+\subsection{Maximum number of precise items in arrays}
+
+Option \verb|-eva-plevel <n>| is used to limit the number of elements
+in an array that can be considered precisely during assignments.
+When assigning a value to an array element, if the index is imprecise,
+it may be very costly to update each array element individually.
+Instead, if the range of indices to be accessed is larger than {\em plevel},
+some approximations are made and a message is emitted:
+
+\begin{lstlisting}
+[kernel] arrays.c:32:
+  more than 200(300) elements to enumerate. Approximating.
+\end{lstlisting}
+
+This message means that the array to be updated had 300 elements, and
+\verb|-eva-plevel| was set to 200 (the default value). In this case, it
+might be reasonable to increase the plevel to 300, especially if some alarms
+could be caused by the imprecision. In other cases, however, there is little
+hope of obtaining a reasonable bound:
+
+\begin{lstlisting}
+more than 200(0x20000000) elements to enumerate. Approximating.
+\end{lstlisting}
+
+In some cases, lowering the plevel can improve performance, but it is rarely
+a significant factor. Most of the time, this option has little impact in the
+analysis, both in terms of precision and performance. However, when dealing
+with large arrays and matrices, it is worth considering its usage.
+
+
 \section{Advanced analyses}
 \label{sec:eva}
 
@@ -3835,7 +3971,7 @@ interpreted as leading to any possible value.
 Moreover, the domain only infers error values for scalar variables. Structure
 and union fields, as well as arrays, are ignored.
 
-\section{Non-termination}
+\section{Non-termination}\label{nonterm}
 
 The parameterization of \Eva{} can lead to situations where the
 analysis stops abruptly due to the absence of valid states. For instance,
@@ -4138,7 +4274,7 @@ to prove is therefore the assertion at line 8.
 
 \subsubsection{Case analysis}
 
-When using {\em semantic unrolling} (section \ref{deroulage}), if an
+When using {\em slevel-based unrolling} (section \ref{slevel}), if an
 assertion is a disjunction, then the reduction of the state by the
 assertion may be computed independently for each disjunct.  This
 multiplies the number of states to propagate in the same way that
diff --git a/doc/value/makefile b/doc/value/makefile
index 63e44b450e00db4cbfd4306b1ad75eefdb415c50..01b7f9053b1dda140a0973bba93923607f0745c6 100644
--- a/doc/value/makefile
+++ b/doc/value/makefile
@@ -23,5 +23,5 @@ clean:
 	rm -f $(GENERATED)
 
 install:
-	rm -f ../manuals/value-analysis.pdf
-	cp main.pdf ../manuals/value-analysis.pdf
+	rm -f ../manuals/eva-manual.pdf
+	cp main.pdf ../manuals/eva-manual.pdf
diff --git a/headers/header_spec.txt b/headers/header_spec.txt
index ffc7b2ce0a5815d7b34a636826b50ecc5349b42d..36de74a9f38df23c208828edc7d84fa141a14027 100644
--- a/headers/header_spec.txt
+++ b/headers/header_spec.txt
@@ -116,9 +116,16 @@ share/_frama-c: CEA_LGPL
 share/analysis-scripts/frama-c.mk: CEA_LGPL
 share/analysis-scripts/README.md: .ignore
 share/analysis-scripts/cmd-dep.sh: .ignore
+share/analysis-scripts/concat-csv.sh: .ignore
+share/analysis-scripts/examples/example.c: .ignore
+share/analysis-scripts/examples/example.mk: .ignore
+share/analysis-scripts/examples/example-multi.mk: .ignore
+share/analysis-scripts/examples/example-slevel.mk: .ignore
+share/analysis-scripts/examples/Makefile: .ignore
 share/analysis-scripts/flamegraph.pl: CDDL
 share/analysis-scripts/list_files.py: .ignore
 share/analysis-scripts/parse-coverage.sh: .ignore
+share/analysis-scripts/summary.sh: .ignore
 share/analysis-scripts/template.mk: .ignore
 share/autocomplete_frama-c: CEA_LGPL
 share/Makefile.clean: CEA_LGPL
diff --git a/opam/opam b/opam/opam
index df7158ed6fb625a5804c020bf4ed21ce0b1e56f7..0a110bc90757aabb50e35f00d1a0763aad538878 100644
--- a/opam/opam
+++ b/opam/opam
@@ -44,7 +44,7 @@ authors: [
 homepage: "http://frama-c.com/"
 license: "GNU Lesser General Public License version 2.1"
 dev-repo: "git+https://github.com/Frama-C/Frama-C-snapshot.git#latest"
-doc: "http://frama-c.com/download/user-manual-Chlorine-20180501.pdf"
+doc: "http://frama-c.com/download/user-manual-18.0-Argon.pdf"
 bug-reports: "https://bts.frama-c.com/"
 tags: [
   "deductive"
diff --git a/src/kernel_internals/runtime/config.mli b/src/kernel_internals/runtime/config.mli
index 2d49810b265d24d7e86ea0f63a62cf3e40ec605c..70375d377faa650139f600ade9b5edc557acf1e3 100644
--- a/src/kernel_internals/runtime/config.mli
+++ b/src/kernel_internals/runtime/config.mli
@@ -28,11 +28,11 @@ val version: string
 
 val codename: string
 (** Frama-C version codename.
-    @since Frama-C+dev *)
+    @since 18.0-Argon *)
 
 val version_and_codename: string
 (** Frama-C version and codename.
-    @since Frama-C+dev *)
+    @since 18.0-Argon *)
 
 val is_gui: bool ref
   (** Is the Frama-C GUI running?
diff --git a/src/kernel_services/ast_data/cil_types.mli b/src/kernel_services/ast_data/cil_types.mli
index 38c85c983aa9b6220ae22506663dfa104b1a92f5..6aea5a03a1390e04aba9a8614cc008473c8c3c28 100644
--- a/src/kernel_services/ast_data/cil_types.mli
+++ b/src/kernel_services/ast_data/cil_types.mli
@@ -1671,7 +1671,7 @@ and acsl_extension_kind =
 
 (** Where are we expected to find corresponding extension keyword.
     @plugin development guide
-    @since Frama-C+dev
+    @since 18.0-Argon
 *)
 and ext_category =
   | Ext_contract
diff --git a/src/kernel_services/ast_data/globals.mli b/src/kernel_services/ast_data/globals.mli
index b5127dab9e63c7ee5102bdbbd9d00397d9ef37e1..d80e4af7670f923d25bd0e21f1caea1bc46b71fa 100644
--- a/src/kernel_services/ast_data/globals.mli
+++ b/src/kernel_services/ast_data/globals.mli
@@ -75,7 +75,7 @@ module Vars: sig
   val remove: varinfo -> unit
   (** Removes the given varinfo, which must have already been removed from the
       AST. Warning: this is very dangerous.
-      @since Frama-C+dev
+      @since 18.0-Argon
   *)
 
   val add_decl: varinfo -> unit
@@ -131,7 +131,7 @@ module Functions: sig
   val remove: varinfo -> unit
   (** Removes the given varinfo, which must have already been removed from the
       AST. Warning: this is very dangerous.
-      @since Frama-C+dev
+      @since 18.0-Argon
   *)
 
   val replace_by_declaration: funspec -> varinfo -> location -> unit
@@ -164,7 +164,7 @@ module FileIndex : sig
   [@@deprecated "Use FileIndex.get_symbols instead."]
     (** [find path] returns all global C symbols associated with [path],
         plus [path] itself. The returned [global] list is reversed.
-        @deprecated Frama-C+dev use [get_symbols] instead. *)
+        @deprecated 18.0-Argon use [get_symbols] instead. *)
 
   val get_files: unit -> Datatype.Filepath.t list
     (** Get the files list containing all [global] C symbols. *)
diff --git a/src/kernel_services/ast_data/kernel_function.mli b/src/kernel_services/ast_data/kernel_function.mli
index 501f1323be4686be7f89a9d0d83309aac65a421c..db00a8d5768d7120fb9a17069db38b4aa7f1be7d 100644
--- a/src/kernel_services/ast_data/kernel_function.mli
+++ b/src/kernel_services/ast_data/kernel_function.mli
@@ -161,7 +161,7 @@ val get_locals : t -> varinfo list
 
 val get_statics : t -> varinfo list
 (** Returns the list of static variables declared inside the function.
-    @since Frama-C+dev *)
+    @since 18.0-Argon *)
 
 exception No_Definition
 val get_definition : t -> fundec
diff --git a/src/kernel_services/ast_data/property.mli b/src/kernel_services/ast_data/property.mli
index 9a852748600d19d00d7398fa09b4bfda310718dc..254ef04db0c75f395bc00644ebbbd356e9bc2910 100644
--- a/src/kernel_services/ast_data/property.mli
+++ b/src/kernel_services/ast_data/property.mli
@@ -164,15 +164,15 @@ val pretty_predicate_kind: Format.formatter -> predicate_kind -> unit
 
 val pretty_debug: Format.formatter -> identified_property -> unit
 (** Internal use only.
-    @since Frama-C+dev *)
+    @since 18.0-Argon *)
 
 (** create a Loc_contract or Loc_stmt depending on the kinstr.
-    @since Frama-C+dev
+    @since 18.0-Argon
 *)
 val e_loc_of_stmt: kernel_function -> kinstr -> extended_loc
 
 (** create a Loc_contract or Loc_stmt depending on the kinstr.
-    @since Frama-C+dev
+    @since 18.0-Argon
 *)
 val o_loc_of_stmt: kernel_function -> kinstr -> other_loc
 
@@ -184,7 +184,7 @@ val o_loc_of_stmt: kernel_function -> kinstr -> other_loc
 val ip_other: string -> other_loc -> identified_property
 (** Create a non-standard property.
     @since Nitrogen-20111001
-    @modify Frama-C+dev Refine localisation argument
+    @modify 18.0-Argon Refine localisation argument
  *)
 
 val ip_reachable_stmt: kernel_function -> stmt -> identified_property
@@ -223,7 +223,7 @@ val ip_of_ensures:
 
 (** Extended property.
     @since Chlorine-20180501
-    @modify Frama-C+dev refine localisation argument
+    @modify 18.0-Argon refine localisation argument
 *)
 val ip_of_extended: extended_loc -> acsl_extension -> identified_property
 
diff --git a/src/kernel_services/ast_printing/description.mli b/src/kernel_services/ast_printing/description.mli
index 9ec78a06ac1e9970b33e2dbb1b52c56d8d8b3f42..02b1ea479eef6d4c1174fd8e2bb51393d9284250 100644
--- a/src/kernel_services/ast_printing/description.mli
+++ b/src/kernel_services/ast_printing/description.mli
@@ -53,11 +53,11 @@ val pp_property : Format.formatter -> Property.t -> unit
 val property_kind_and_node: Property.t -> (string * string) option
 (** Returns separately the kind and the node of a property. Returns None for
     unsupported property kinds. Used to output properties in csv files.
-    @since Frama-C+dev *)
+    @since 18.0-Argon *)
 
 val status_feedback: Property_status.Feedback.t -> string
 (** User-friendly description of property statuses.
-    @since Frama-C+dev *)
+    @since 18.0-Argon *)
 
 type kf = [ `Always | `Never | `Context of kernel_function ]
 
diff --git a/src/kernel_services/ast_queries/cil.mli b/src/kernel_services/ast_queries/cil.mli
index 2b7ca72f32c254d82e1eae2640897c25f2438e1a..ec5424a8b4737a8b5d4f2fa0542525ebfb922b8d 100644
--- a/src/kernel_services/ast_queries/cil.mli
+++ b/src/kernel_services/ast_queries/cil.mli
@@ -470,7 +470,7 @@ val isCompleteType: ?allowZeroSizeArrays:bool -> typ -> bool
     array member. When in gcc mode, a zero-sized array is identified with a
     FAM for this purpose.
 
-    @since Frama-C+dev
+    @since 18.0-Argon
 *)
 val has_flexible_array_member: typ -> bool
 
@@ -542,27 +542,27 @@ val isIntegralOrPointerType: typ -> bool
 
 (** True if the argument is an integral type (i.e. integer or enum), either
     C or mathematical one.
-    @modify Frama-C+dev expands the logic type definition if necessary. *)
+    @modify 18.0-Argon expands the logic type definition if necessary. *)
 val isLogicIntegralType: logic_type -> bool
 
 (** True if the argument is a boolean type, either integral C type or
     mathematical boolean one.
-    @modify Frama-C+dev expands the logic type definition if necessary. *)
+    @modify 18.0-Argon expands the logic type definition if necessary. *)
 val isLogicBooleanType: logic_type -> bool
 
 (** True if the argument is a floating point type. *)
 val isFloatingType: typ -> bool
 
 (** True if the argument is a floating point type.
-    @modify Frama-C+dev expands the logic type definition if necessary. *)
+    @modify 18.0-Argon expands the logic type definition if necessary. *)
 val isLogicFloatType: logic_type -> bool
 
 (** True if the argument is a C floating point type or logic 'real' type.
-    @modify Frama-C+dev expands the logic type definition if necessary. *)
+    @modify 18.0-Argon expands the logic type definition if necessary. *)
 val isLogicRealOrFloatType: logic_type -> bool
 
 (** True if the argument is the logic 'real' type.
-    @modify Frama-C+dev expands the logic type definition if necessary. *)
+    @modify 18.0-Argon expands the logic type definition if necessary. *)
 val isLogicRealType: logic_type -> bool
 
 (** True if the argument is an arithmetic type (i.e. integer, enum or
@@ -575,7 +575,7 @@ val isArithmeticOrPointerType: typ -> bool
 
 (** True if the argument is a logic arithmetic type (i.e. integer, enum or
     floating point, either C or mathematical one.
-    @modify Frama-C+dev expands the logic type definition if necessary. *)
+    @modify 18.0-Argon expands the logic type definition if necessary. *)
 val isLogicArithmeticType: logic_type -> bool
 
 (** True if the argument is a function type *)
@@ -583,23 +583,23 @@ val isFunctionType: typ -> bool
 
 (** True if the argument is the logic function type.
     Expands the logic type definition if necessary.
-    @since Frama-C+dev *)
+    @since 18.0-Argon *)
 val isLogicFunctionType: logic_type -> bool
 
 (** True if the argument is a pointer type. *)
 val isPointerType: typ -> bool
 
 (** True if the argument is a function pointer type.
-    @since Frama-C+dev *)
+    @since 18.0-Argon *)
 val isFunPtrType: typ -> bool
 
 (** True if the argument is the logic function pointer type.
     Expands the logic type definition if necessary.
-    @since Frama-C+dev *)
+    @since 18.0-Argon *)
 val isLogicFunPtrType: logic_type -> bool
 
 (** True if the argument is the type for reified C types.
-    @modify Frama-C+dev expands the logic type definition if necessary. *)
+    @modify 18.0-Argon expands the logic type definition if necessary. *)
 val isTypeTagType: logic_type -> bool
 
 (** True if the argument denotes the type of ... in a variadic function.
@@ -1184,7 +1184,7 @@ val dropAttributes: string list -> attributes -> attributes
 (** a field struct marked with this attribute is known to be mutable, i.e.
     it can be modified even on a const object.
 
-    @since Frama-C+dev
+    @since 18.0-Argon
 *)
 val frama_c_mutable: string
 
@@ -1192,7 +1192,7 @@ val frama_c_mutable: string
     object being initialized by the current function, which can thus assign
     any sub-object regardless of const status.
 
-    @since Frama-C+dev
+    @since 18.0-Argon
  *)
 val frama_c_init_obj: string
 
diff --git a/src/kernel_services/ast_queries/logic_const.mli b/src/kernel_services/ast_queries/logic_const.mli
index a9353c9609de93781af178547bee2e7d9f68ee87..0a10bccaffa9298760d40a61d79bd93371ec2ff7 100644
--- a/src/kernel_services/ast_queries/logic_const.mli
+++ b/src/kernel_services/ast_queries/logic_const.mli
@@ -198,18 +198,18 @@ val pseparated: ?loc:location -> term list -> predicate
 (* ************************************************************************** *)
 
 (** instantiate type variables in a logic type.
-    @since Frama-C+dev moved from Logic_utils *)
+    @since 18.0-Argon moved from Logic_utils *)
 val instantiate :
   (string * logic_type) list ->
   logic_type -> logic_type
 
 (** @return [true] if the logic type definition can be expanded.
-    @since Frama-C+dev *)
+    @since 18.0-Argon *)
 val is_unrollable_ltdef : logic_type_info -> bool
 
 (** expands logic type definitions only.
     To expands both logic part and C part, uses [Logic_utils.unroll_type].
-    @since Frama-C+dev *)
+    @since 18.0-Argon *)
 val unroll_ltdef : logic_type -> logic_type
 
 (** [isLogicType test typ] is [false] for pure logic types and the result
@@ -218,7 +218,7 @@ val isLogicCType : (typ -> bool) -> logic_type -> bool
 
 (** returns [true] if the type is a list<t>.
     @since Aluminium-20160501
-    @modify Frama-C+dev expands the logic type definition if necessary. *)
+    @modify 18.0-Argon expands the logic type definition if necessary. *)
 val is_list_type: logic_type -> bool
 
 (** [make_type_list_of t] returns the type list<[t]>.
@@ -228,52 +228,52 @@ val make_type_list_of: logic_type -> logic_type
 (** returns the type of elements of a list type.
     @raise Failure if the input type is not a list type.
     @since Aluminium-20160501
-    @modify Frama-C+dev expands the logic type definition if necessary. *)
+    @modify 18.0-Argon expands the logic type definition if necessary. *)
 val type_of_list_elem: logic_type -> logic_type
 
 (** returns [true] if the type is a set<t>.
     @since Neon-20140301
-    @modify Frama-C+dev expands the logic type definition if necessary. *)
+    @modify 18.0-Argon expands the logic type definition if necessary. *)
 val is_set_type: logic_type -> bool
 
 (** [set_conversion ty1 ty2] returns a set type as soon as [ty1] and/or [ty2]
     is a set. Elements have type [ty1], or the type of the elements of [ty1] if
     it is itself a set-type ({i.e.} we do not build set of sets that way).
-    @modify Frama-C+dev expands the logic type definitions if necessary. *)
+    @modify 18.0-Argon expands the logic type definitions if necessary. *)
 val set_conversion: logic_type -> logic_type -> logic_type
 
 (** converts a type into the corresponding set type if needed. Does nothing
     if the argument is already a set type.
-    @modify Frama-C+dev expands the logic type definition if necessary. *)
+    @modify 18.0-Argon expands the logic type definition if necessary. *)
 val make_set_type: logic_type -> logic_type
 
 (** returns the type of elements of a set type.
     @raise Failure if the input type is not a set type.
-    @modify Frama-C+dev expands the logic type definition if necessary. *)
+    @modify 18.0-Argon expands the logic type definition if necessary. *)
 val type_of_element: logic_type -> logic_type
 
 (** [plain_or_set f t] applies [f] to [t] or to the type of elements of [t]
     if it is a set type.
-    @modify Frama-C+dev expands the logic type definition if necessary. *)
+    @modify 18.0-Argon expands the logic type definition if necessary. *)
 val plain_or_set: (logic_type -> 'a) -> logic_type -> 'a
 
 (** [transform_element f t] is the same as
     [set_conversion (plain_or_set f t) t]
     @since Nitrogen-20111001
-    @modify Frama-C+dev expands the logic type definition if necessary.
+    @modify 18.0-Argon expands the logic type definition if necessary.
 *)
 val transform_element: (logic_type -> logic_type) -> logic_type -> logic_type
 
 (** [true] if the argument is not a set type.
-    @modify Frama-C+dev expands the logic type definition if necessary. *)
+    @modify 18.0-Argon expands the logic type definition if necessary. *)
 val is_plain_type: logic_type -> bool
 
 (** @return true if the argument is the boolean type.
-    @modify Frama-C+dev expands the logic type definition if necessary. *)
+    @modify 18.0-Argon expands the logic type definition if necessary. *)
 val is_boolean_type: logic_type -> bool
 
 (** @since Sodium-20150201
-    @modify Frama-C+dev expands the logic type definition if necessary. *)
+    @modify 18.0-Argon expands the logic type definition if necessary. *)
 val boolean_type: logic_type
 
 (* ************************************************************************** *)
diff --git a/src/kernel_services/ast_queries/logic_typing.mli b/src/kernel_services/ast_queries/logic_typing.mli
index d7eb312fc1d66a140a49c6547653a6db67f3efdb..e978b3e829ab0e7a77f27cc5dbcf961bcd189fec 100644
--- a/src/kernel_services/ast_queries/logic_typing.mli
+++ b/src/kernel_services/ast_queries/logic_typing.mli
@@ -177,7 +177,7 @@ val register_behavior_extension:
 
     @plugin development guide
 
-    @since Frama-C+dev
+    @since 18.0-Argon
 *)
 val register_global_extension:
   string ->
@@ -189,7 +189,7 @@ val register_global_extension:
 
     @plugin development guide
 
-    @since Frama-C+dev
+    @since 18.0-Argon
 *)
 val register_code_annot_extension:
   string ->
@@ -201,7 +201,7 @@ val register_code_annot_extension:
 
     @plugin development guide
 
-    @since Frama-C+dev
+    @since 18.0-Argon
 *)
 val register_code_annot_next_stmt_extension:
   string ->
@@ -212,7 +212,7 @@ val register_code_annot_next_stmt_extension:
 
     @plugin development guide
 
-    @since Frama-C+dev
+    @since 18.0-Argon
 *)
 val register_code_annot_next_loop_extension:
   string ->
@@ -224,7 +224,7 @@ val register_code_annot_next_loop_extension:
 
     @plugin development guide
 
-    @since Frama-C+dev
+    @since 18.0-Argon
 *)
 val register_code_annot_next_both_extension:
   string ->
diff --git a/src/kernel_services/parsetree/logic_ptree.mli b/src/kernel_services/parsetree/logic_ptree.mli
index 8b5b418cda57ec1407e6583aaffd88ae0b5270c0..ea5a3d072be27850366bb39e8d82daefc4fa70da 100644
--- a/src/kernel_services/parsetree/logic_ptree.mli
+++ b/src/kernel_services/parsetree/logic_ptree.mli
@@ -369,7 +369,7 @@ type code_annot =
   | AExtended of string list * bool * extension
     (** extension in a code or loop (when boolean flag is true) annotation.
         @since Silicon-20161101
-        @modify Frama-C+dev
+        @modify 18.0-Argon
     *)
 
 (** custom trees *)
diff --git a/src/kernel_services/plugin_entry_points/log.mli b/src/kernel_services/plugin_entry_points/log.mli
index 1efef9b18217cbc189d356ce1be767f5b3887ba8..436820f29d8691c8bbdd16bcc1618f7306cca624 100644
--- a/src/kernel_services/plugin_entry_points/log.mli
+++ b/src/kernel_services/plugin_entry_points/log.mli
@@ -221,22 +221,22 @@ module type Messages = sig
   val with_result  : (event option -> 'b) -> ('a,'b) pretty_aborter
   (** [with_result f fmt] calls [f] in the same condition as [logwith].
       @since Beryllium-20090601-beta1
-      @modified Frama-C+dev the argument of the continuation is optionnal *)
+      @modified 18.0-Argon the argument of the continuation is optionnal *)
 
   val with_warning : (event option -> 'b) -> ('a,'b) pretty_aborter
   (** [with_warning f fmt] calls [f] in the same condition as [logwith].
       @since Beryllium-20090601-beta1
-      @modified Frama-C+dev the argument of the continuation is optionnal *)
+      @modified 18.0-Argon the argument of the continuation is optionnal *)
 
   val with_error   : (event option -> 'b) -> ('a,'b) pretty_aborter
   (** [with_error f fmt] calls [f] in the same condition as [logwith].
       @since Beryllium-20090601-beta1
-      @modified Frama-C+dev the argument of the continuation is optionnal *)
+      @modified 18.0-Argon the argument of the continuation is optionnal *)
 
   val with_failure : (event option -> 'b) -> ('a,'b) pretty_aborter
   (** [with_failure f fmt] calls [f] in the same condition as [logwith].
       @since Beryllium-20090601-beta1
-      @modified Frama-C+dev the argument of the continuation is optionnal *)
+      @modified 18.0-Argon the argument of the continuation is optionnal *)
 
   val log : ?kind:kind -> ?verbose:int -> ?debug:int -> 'a pretty_printer
   (** Generic log routine. The default kind is [Result]. Use cases (with
@@ -261,7 +261,7 @@ module type Messages = sig
       In case the [wkey] is considered as a [Failure], the continution is not called.
       This kind of message denotes a fatal error aborting Frama-C.
       Notice that the [~emitwith] action is called iff a message is logged.
-      @since Frama-C+dev *)
+      @since 18.0-Argon *)
 
   val register : kind -> (event -> unit) -> unit
   (** Local registry for listeners. *)
@@ -284,7 +284,7 @@ module type Messages = sig
 
   val dkey_name: category -> string
   (** returns the category name as a string.
-      @since Frama-C+dev
+      @since 18.0-Argon
   *)
 
   val is_registered_category: string -> bool
@@ -346,7 +346,7 @@ module type Messages = sig
 
   val wkey_name: warn_category -> string
   (** returns the warning category name as a string.
-      @since Frama-C+dev
+      @since 18.0-Argon
   *)
 
   val get_warn_category: string -> warn_category option
@@ -362,19 +362,19 @@ module type Messages = sig
 end
 
 (** Split an event category into its constituants.
-    @since Frama-C+dev *)
+    @since 18.0-Argon *)
 val evt_category : event -> string list
 
 (** Split a category specification into its constituants.
     ["*"] is considered as empty, and [""] categories are skipped.
-    @since Frama-C+dev *)
+    @since 18.0-Argon *)
 val split_category : string -> string list
 
 (** Sub-category checks.
     [is_subcategory a b] checks whether [a] is a sub-category of [b].
     Indeed, it checks whether [b] is a prefix of [a], that is,
     that [a] equals [b] or refines [b] with (a list of) sub-category(ies).
-    @since Frama-C+dev *)
+    @since 18.0-Argon *)
 val is_subcategory : string list -> string list -> bool
 
 (** Each plugin has its own channel to output messages.
@@ -446,7 +446,7 @@ val kernel_label_name: string
 
 val source : file:Filepath.Normalized.t -> line:int -> Filepath.position
 (** @since Chlorine-20180501
-    @modify Frama-C+dev change type of [file]
+    @modify 18.0-Argon change type of [file]
  *)
 
 val get_current_source : unit -> Filepath.position
diff --git a/src/kernel_services/plugin_entry_points/plugin.mli b/src/kernel_services/plugin_entry_points/plugin.mli
index 09efba3f25bd058e05a8aa6ce8e4585ae67d16a2..cf9adbaa4e1277bc9b94a1199256dc12a729aa79 100644
--- a/src/kernel_services/plugin_entry_points/plugin.mli
+++ b/src/kernel_services/plugin_entry_points/plugin.mli
@@ -69,7 +69,7 @@ module type S_no_log = sig
       -plugin-msg-key, and -plugin-warn-key.
       [add_plugin_output_aliases [alias]] adds the aliases -alias-help,
       -alias-verbose, etc.
-      @since Frama-C+dev *)
+      @since 18.0-Argon *)
 end
 
 (** Provided plug-general services for plug-ins.
diff --git a/src/libraries/datatype/datatype.mli b/src/libraries/datatype/datatype.mli
index cb813ba6dc83014ed37c1ae721c94206cabd04cd..605282f8bf42b4535e71b736934c9adc36139508 100644
--- a/src/libraries/datatype/datatype.mli
+++ b/src/libraries/datatype/datatype.mli
@@ -345,7 +345,7 @@ val integer: Integer.t Type.t
 
 (** Type-safe strings representing normalized filepaths.
     See module {!Filepath.Normalized}.
-    @since Frama-C+dev *)
+    @since 18.0-Argon *)
 module Filepath: sig
   include S_with_collections with type t = Filepath.Normalized.t
   val of_string: ?base_name:string -> string -> t
diff --git a/src/libraries/stdlib/extlib.mli b/src/libraries/stdlib/extlib.mli
index d331629c8bc5b0ddaa916a976a62ccb46793d280..9c98ba0a4c5279adbef1699ea0768febaf901e80 100644
--- a/src/libraries/stdlib/extlib.mli
+++ b/src/libraries/stdlib/extlib.mli
@@ -141,7 +141,7 @@ val find_opt : ('a -> 'b option) -> 'a list -> 'b
       is no such value the list l.
 
       @since Nitrogen-20111001
-      @deprecated Frama-C+dev use [Transitioning.List.find_opt] instead *)
+      @deprecated 18.0-Argon use [Transitioning.List.find_opt] instead *)
 
 val iteri: (int -> 'a -> unit) -> 'a list -> unit
   (** Same as iter, but the function to be applied take also as argument the
@@ -178,7 +178,7 @@ val list_slice: ?first:int -> ?last:int -> 'a list -> 'a list
     Negative indices are allowed, and count from the end of the list.
     [list_slice] never raises exceptions: out-of-bounds arguments are clipped,
     and inverted ranges result in empty lists.
-    @since Frama-C+dev *)
+    @since 18.0-Argon *)
 
 (* ************************************************************************* *)
 (** {2 Arrays} *)
@@ -307,7 +307,7 @@ val strip_underscore: string -> string
 (** remove underscores at the beginning and end of a string. If a string
     is composed solely of underscores, return the empty string
 
-    @since Frama-C+dev
+    @since 18.0-Argon
   *)
 
 val html_escape: string -> string
diff --git a/src/libraries/utils/filepath.mli b/src/libraries/utils/filepath.mli
index 2c9267e77f4d876dcae466f45a7f7aec92185018..b5fe7d255f9e545fb317ebdb064611c5759f766d 100644
--- a/src/libraries/utils/filepath.mli
+++ b/src/libraries/utils/filepath.mli
@@ -63,7 +63,7 @@ val is_relative: ?base_name:string -> string -> bool
     in the filesystem.
 
     @since Neon-20140301
-    @deprecated since Frama-C+dev
+    @deprecated since 18.0-Argon
 *)
 val pretty: string -> string
 [@@deprecated "Use Filepath.Normalized.to_pretty_string instead."]
@@ -76,7 +76,7 @@ val add_symbolic_dir: string -> string -> unit
 
 (** The [Normalized] module is simply a wrapper that ensures that paths are
     always normalized. Used by [Datatype.Filepath].
-    @since Frama-C+dev *)
+    @since 18.0-Argon *)
 module Normalized: sig
 
   (** The normalized (absolute) path. *)
@@ -123,7 +123,7 @@ module Normalized: sig
 end
 
 (** Describes a position in a source file.
-    @since Frama-C+dev
+    @since 18.0-Argon
 *)
 type position =
   {
@@ -134,7 +134,7 @@ type position =
   }
 
 (** Pretty-prints a position, in the format file:line.
-    @since Frama-C+dev
+    @since 18.0-Argon
 *)
 val pp_pos : Format.formatter -> position -> unit
 
diff --git a/tests/misc/oracle/debug_category.16.res.oracle b/tests/misc/oracle/debug_category.16.res.oracle
index 75e2529443bacd2087a9202069d4eee278b6f201..708cc59e04fa55dc3bb39458bb840dd6f145359b 100644
--- a/tests/misc/oracle/debug_category.16.res.oracle
+++ b/tests/misc/oracle/debug_category.16.res.oracle
@@ -9,7 +9,7 @@
   
   Plug-in test aborted: internal error.
   Please report as 'crash' at http://bts.frama-c.com/.
-  Your Frama-C version is 18.0+dev (Argon).
+  Your Frama-C version is 18.0 (Argon).
   Note that a version and a backtrace alone often do not contain enough
   information to understand the bug. Guidelines for reporting bugs are at:
   http://bts.frama-c.com/dokuwiki/doku.php?id=mantis:frama-c:bug_reporting_guidelines
diff --git a/tests/misc/oracle/log-file.1.res.oracle b/tests/misc/oracle/log-file.1.res.oracle
index a7ef0e3d8b8280aa5101209cf259ce5b9cc16375..f80564b48f8e005f479cfa2ebb10007902b71e17 100644
--- a/tests/misc/oracle/log-file.1.res.oracle
+++ b/tests/misc/oracle/log-file.1.res.oracle
@@ -14,7 +14,7 @@
   
   Frama-C aborted: internal error.
   Please report as 'crash' at http://bts.frama-c.com/.
-  Your Frama-C version is 18.0+dev (Argon).
+  Your Frama-C version is 18.0 (Argon).
   Note that a version and a backtrace alone often do not contain enough
   information to understand the bug. Guidelines for reporting bugs are at:
   http://bts.frama-c.com/dokuwiki/doku.php?id=mantis:frama-c:bug_reporting_guidelines
diff --git a/tests/misc/oracle/plugin-log-all.txt b/tests/misc/oracle/plugin-log-all.txt
index 2483f6ebcc8f221037ad68a82185c2ff62960064..1a773b13cb6c253a07b1204bddef249e3ba04f0e 100644
--- a/tests/misc/oracle/plugin-log-all.txt
+++ b/tests/misc/oracle/plugin-log-all.txt
@@ -14,7 +14,7 @@ The full backtrace is:
 
 Frama-C aborted: internal error.
 Please report as 'crash' at http://bts.frama-c.com/.
-Your Frama-C version is 18.0+dev (Argon).
+Your Frama-C version is 18.0 (Argon).
 Note that a version and a backtrace alone often do not contain enough
 information to understand the bug. Guidelines for reporting bugs are at:
 http://bts.frama-c.com/dokuwiki/doku.php?id=mantis:frama-c:bug_reporting_guidelines