diff --git a/src/kernel_services/ast_queries/acsl_extension.mli b/src/kernel_services/ast_queries/acsl_extension.mli
index 08a181d4ab45940314d7c7cfe150a32531b97751..5ea377e07750705c16b9792e78b898df503d0278 100644
--- a/src/kernel_services/ast_queries/acsl_extension.mli
+++ b/src/kernel_services/ast_queries/acsl_extension.mli
@@ -20,50 +20,129 @@
 (*                                                                        *)
 (**************************************************************************)
 
+(** ACSL extensions registration module
+    @since Frama-C+dev
+*)
+
 open Cil_types
 open Logic_typing
 open Logic_ptree
 
+(** Untyped ACSL extensions transformers *)
 type extension_preprocessor =
   lexpr list -> lexpr list
+
+(** Transformers from untyped to typed ACSL extension *)
 type extension_typer =
   typing_context -> location -> lexpr list -> acsl_extension_kind
+(** Visitor functions for ACSL extensions *)
 type extension_visitor =
   Cil.cilVisitor -> acsl_extension_kind -> acsl_extension_kind Cil.visitAction
+(** Pretty printers for ACSL extensions *)
 type extension_printer =
   Printer_api.extensible_printer_type -> Format.formatter ->
   acsl_extension_kind -> unit
 
+
+(** [register_behavior name ~preprocessor typer ~visitor ~printer ~short_printer status]
+    registers new ACSL extension to be used in function contracts with name
+    [name].
+
+    The optional [preprocessor] is a function to be applied by the parser on the
+    untyped content of the extension before parsing the rest of the processed
+    file. By default, this function is the identity.
+
+    The [typer] is applied when transforming the untyped AST to Cil. It recieves
+    the typing context of the annotation that can be used to type the received
+    logic expressions (see [Logic_typing.typing_context]), and the location of
+    the annotation.
+
+    The optional [visitor] allows changing the way the ACSL extension is visited.
+    By default, the behavior is [Cil.DoChildren], which ends up visiting
+    each identified predicate/term in the list and leave the id as is.
+
+    The optional [printer] allows changing the way the ACSL extension is pretty
+    printed. By default, it prints the name of the extension followed by the
+    formatted predicates, terms or identifier according to the
+    [Cil_types.acsl_extension_kind].
+
+    The optional [short_printer] allows changing the [Printer.pp_short_extended]
+    behavior for the ACSL extension. By default, it just prints the [name]. It
+    is for example used for the filetree in the GUI.
+
+    The [status] indicates whether the extension can be assigned a property
+    status or not.
+
+    Here is a basic example:
+    [
+    let count = ref 0
+    let foo_typer ~typing_context ~loc = function
+      | p :: [] ->
+        Ext_preds
+        [ (typing_context.type_predicate
+             typing_context
+             (typing_context.post_state [Normal])
+             p)])
+      | [] -> let id = !count in incr count; Ext_id id
+      | _ -> typing_context.error loc "expecting a predicate after keyword FOO"
+
+    let () = Acsl_extension.register_behavior "FOO" foo_typer false
+    ]
+    @plugin development guide
+*)
 val register_behavior:
   string -> ?preprocessor:extension_preprocessor -> extension_typer ->
   ?visitor:extension_visitor ->
   ?printer:extension_printer -> ?short_printer:extension_printer -> bool ->
   unit
 
+(** Registers extension for global annotation. See [register_behavior].
+
+    @plugin development guide
+*)
 val register_global:
   string -> ?preprocessor:extension_preprocessor -> extension_typer ->
   ?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].
+
+    @plugin development guide
+*)
 val register_code_annot:
   string -> ?preprocessor:extension_preprocessor -> extension_typer ->
   ?visitor:extension_visitor ->
   ?printer:extension_printer -> ?short_printer:extension_printer -> bool ->
   unit
 
+(** Registers extension for code annotation to be evaluated for the _next_
+    statement. See [register_behavior].
+
+    @plugin development guide
+*)
 val register_code_annot_next_stmt:
   string -> ?preprocessor:extension_preprocessor -> extension_typer ->
   ?visitor:extension_visitor ->
   ?printer:extension_printer -> ?short_printer:extension_printer -> bool ->
   unit
 
+(** Registers extension for loop annotation. See [register_behavior].
+
+    @plugin development guide
+*)
 val register_code_annot_next_loop:
   string -> ?preprocessor:extension_preprocessor -> extension_typer ->
   ?visitor:extension_visitor ->
   ?printer:extension_printer -> ?short_printer:extension_printer -> bool ->
   unit
 
+(** Registers extension both for code and loop annotations.
+    See [register_behavior].
+
+    @plugin development guide
+*)
 val register_code_annot_next_both:
   string -> ?preprocessor:extension_preprocessor -> extension_typer ->
   ?visitor:extension_visitor ->