diff --git a/bin/migration_scripts/potassium2calcium.sh b/bin/migration_scripts/potassium2calcium.sh
new file mode 100644
index 0000000000000000000000000000000000000000..b927f2094eee56786f785f1bdd81bae323ab9dfe
--- /dev/null
+++ b/bin/migration_scripts/potassium2calcium.sh
@@ -0,0 +1,159 @@
+#! /bin/sh
+##########################################################################
+#                                                                        #
+#  This file is part of Frama-C.                                         #
+#                                                                        #
+#  Copyright (C) 2007-2019                                               #
+#    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 19 Potassium to Frama-C 20 Calcium,
+# on a best-efforts basis (no guarantee that the result is fully compatible).
+#
+# known missing features:
+# - doesn't work if a directory name contains spaces
+# - doesn't follow symbolic links to directories
+
+ARGS=$@
+
+DIR=
+
+# verbosing on by default
+VERBOSE="v"
+
+sedi ()
+{
+  if [ -n "`sed --help 2> /dev/null | grep \"\\-i\" 2> /dev/null`" ]; then
+    sed -i "$@"
+  else
+      # option '-i' is not recognized by sed: use a tmp file
+    new_temp=`mktemp /tmp/frama-c.XXXXXXX` || exit 1
+    sed "$@" > $new_temp
+    eval last=\${$#}
+    mv $new_temp $last
+  fi
+}
+
+dirs ()
+{
+  if [ -z "$DIR" ]; then
+    DIR=.
+  fi
+}
+
+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 \
+   -e "s/Transitioning\.Char\./Char./g" \
+   -e "s/Transitioning\.List\./List./g" \
+   -e "s/Transitioning\.Stack\./Stack./g" \
+   -e "s/Transitioning\.String\./String./g" \
+   $file
+}
+
+apply_one_dir ()
+{
+  if [ "$VERBOSE" ]; then
+    echo "Processing directory `pwd`"
+  fi
+  for f in `ls -p1 *.ml* 2> /dev/null`; do
+    process_file $f
+  done
+}
+
+apply_recursively ()
+{
+  apply_one_dir
+  for d in `ls -p1 | grep \/`; do
+    safe_goto $d .. apply_recursively
+  done
+}
+
+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 $ARGS; do
+    parse_arg $s
+  done
+  applying_to_list $FN
+}
+
+cmd_line
+exit 0
diff --git a/headers/header_spec.txt b/headers/header_spec.txt
index 9980f89dcdfe404757752447e6b72dde4359b3ad..3122754828ca3e15fde4e1639383cf1020d7e878 100644
--- a/headers/header_spec.txt
+++ b/headers/header_spec.txt
@@ -39,6 +39,7 @@ bin/migration_scripts/silicon2phosphorus.sh: CEA_LGPL
 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/sed_get_binutils_version: .ignore
 bin/sed_get_make_major: .ignore
 bin/sed_get_make_minor: .ignore
diff --git a/src/kernel_services/ast_data/alarms.ml b/src/kernel_services/ast_data/alarms.ml
index 248d57078c094a74bcb2b58d5e0e205361a7d307..eaa9455b742e798965fc88a2a3a954ae384b7378 100644
--- a/src/kernel_services/ast_data/alarms.ml
+++ b/src/kernel_services/ast_data/alarms.ml
@@ -267,7 +267,7 @@ module D =
             Printer.pp_exp e1 Printer.pp_exp e2          
         | Overflow(s, e, n, b) ->
           Format.fprintf fmt "%s(@[%a@]@ %s@ @[%a@])"
-            (Transitioning.String.capitalize_ascii (string_of_overflow_kind s))
+            (String.capitalize_ascii (string_of_overflow_kind s))
             Printer.pp_exp e
             (match b with Lower_bound -> ">=" | Upper_bound -> "<=")
             Datatype.Integer.pretty n
diff --git a/src/kernel_services/ast_printing/description.ml b/src/kernel_services/ast_printing/description.ml
index 89aa33d86d8b8a8a3a4f54683bd4f00bb9cb8e63..5a6609bd9286495e50cc7fd494fb58ace0d14c7d 100644
--- a/src/kernel_services/ast_printing/description.ml
+++ b/src/kernel_services/ast_printing/description.ml
@@ -210,7 +210,7 @@ let pp_active fmt active =
     (Datatype.String.Set.elements active)
 
 let pp_capitalize fmt s =
-  Format.pp_print_string fmt (Transitioning.String.capitalize_ascii s)
+  Format.pp_print_string fmt (String.capitalize_ascii s)
 
 let pp_acsl_extension fmt {ext_name} = pp_capitalize fmt ext_name
 
diff --git a/src/kernel_services/ast_queries/cil.ml b/src/kernel_services/ast_queries/cil.ml
index 3336c5689deedb7cdd84be114b579018336b20f0..186a56d4cdde06ea54acfab703738e1d4f71616e 100644
--- a/src/kernel_services/ast_queries/cil.ml
+++ b/src/kernel_services/ast_queries/cil.ml
@@ -4149,7 +4149,7 @@ let parseIntAux (str:string) =
     fun s ->
       let ls = String.length s in
       l >= ls &&
-      s = Transitioning.String.uppercase_ascii (String.sub str (l - ls) ls)
+      s = String.uppercase_ascii (String.sub str (l - ls) ls)
   in
   let l = String.length str in
   (* See if it is octal or hex or binary *)
diff --git a/src/kernel_services/ast_queries/file.ml b/src/kernel_services/ast_queries/file.ml
index d285dd4aad183f31f097f26137385be5372262b7..9fd8da5e14f15e9d52bee6b56c65cc7952b1058a 100644
--- a/src/kernel_services/ast_queries/file.ml
+++ b/src/kernel_services/ast_queries/file.ml
@@ -320,7 +320,7 @@ let machdep_macro = function
   | "ppc_32"                -> "__FC_MACHDEP_PPC_32"
   | "msvc_x86_64"           -> "__FC_MACHDEP_MSVC_X86_64"
   | s ->
-    let res = "__FC_MACHDEP_" ^ (Transitioning.String.uppercase_ascii s) in
+    let res = "__FC_MACHDEP_" ^ (String.uppercase_ascii s) in
     Kernel.warning ~once:true
       "machdep %s has no registered macro. Using %s for pre-processing" s res;
     res
diff --git a/src/kernel_services/ast_queries/logic_typing.ml b/src/kernel_services/ast_queries/logic_typing.ml
index 80d58f94a723675aa5ed962b95db0e2df9f41cfa..a0e404dd1c1e4b9dbb93575eed84077c85fd176d 100644
--- a/src/kernel_services/ast_queries/logic_typing.ml
+++ b/src/kernel_services/ast_queries/logic_typing.ml
@@ -339,7 +339,7 @@ module Lenv = struct
       | BuiltinLabel LoopEntry -> Some "LoopEntry"
       | StmtLabel s ->
         (match
-           Transitioning.List.find_opt
+           List.find_opt
              (function Label (_,_,b) -> b | _ -> false) !s.labels
          with
          | None -> None
diff --git a/src/kernel_services/ast_queries/logic_utils.ml b/src/kernel_services/ast_queries/logic_utils.ml
index 5c66aa85fed221f13978b198d373ee386d6115ea..ff499c760d6de4c292557b209eddd1709cacca0b 100644
--- a/src/kernel_services/ast_queries/logic_utils.ml
+++ b/src/kernel_services/ast_queries/logic_utils.ml
@@ -288,7 +288,7 @@ let string_to_float_lconstant string =
      constant and the nearest parsed float is exact. Otherwise, use the upper
      and lower float computed by [parse]. *)
   let l = String.length string - 1 in
-  let last = Transitioning.Char.uppercase_ascii string.[l] in
+  let last = Char.uppercase_ascii string.[l] in
   let exact = last = 'F' || last = 'D' in
   if exact
   then LReal (real_of_float string f.Floating_point.f_nearest)
diff --git a/src/kernel_services/ast_transformations/inline.ml b/src/kernel_services/ast_transformations/inline.ml
index ea63e968b7c1392aa4b18bf91fb9aecf8db1d505..cb00a64b313a8dc77930c56db256653944770fa7 100644
--- a/src/kernel_services/ast_transformations/inline.ml
+++ b/src/kernel_services/ast_transformations/inline.ml
@@ -190,7 +190,7 @@ let inliner functions_to_inline = object (self)
 
   method private recursive_call_limit kf =
     let nb_calls =
-      Transitioning.Stack.fold
+      Stack.fold
         (fun res kf' -> if Cil_datatype.Kf.equal kf kf' then res + 1 else res)
         0 call_stack
     in
diff --git a/src/kernel_services/cmdline_parameters/cmdline.ml b/src/kernel_services/cmdline_parameters/cmdline.ml
index b49b856b2cdae25c02ad46673bb4a6f67705c47a..4ce267fa0fa69bdbe8ea3b5e0002d9756c714c09 100644
--- a/src/kernel_services/cmdline_parameters/cmdline.ml
+++ b/src/kernel_services/cmdline_parameters/cmdline.ml
@@ -972,7 +972,7 @@ let plugin_help shortname =
                   if newline then Format.pp_print_newline fmt ();
                   if s <> "" then
                     Format.fprintf fmt "@[*** %s@]@\n@\n"
-                      (Transitioning.String.uppercase_ascii s);
+                      (String.uppercase_ascii s);
                   ignore (print_options !o)
                 in
                 print_group false g;
@@ -1012,7 +1012,7 @@ let list_plugins () =
         (fun p ->
            if p.Plugin.name <> "" then
              print_helpline fmt
-               (Transitioning.String.capitalize_ascii p.Plugin.name)
+               (String.capitalize_ascii p.Plugin.name)
                (Printf.sprintf "%s (-%s-h)" p.Plugin.help p.Plugin.short)
                "")
         (Plugin.all_plugins ()) ;
diff --git a/src/kernel_services/plugin_entry_points/dynamic.ml b/src/kernel_services/plugin_entry_points/dynamic.ml
index 0ad27f1c620c9e031ffb609d6aef8137b112b343..10241320736c4495275430db1a8a6ac2bbecc563 100644
--- a/src/kernel_services/plugin_entry_points/dynamic.ml
+++ b/src/kernel_services/plugin_entry_points/dynamic.ml
@@ -329,7 +329,7 @@ let load_module m =
                 if is_package m && mem_package m then load_packages [m]
                 else
                   let fc =
-                    "frama-c-" ^ Transitioning.String.lowercase_ascii m
+                    "frama-c-" ^ String.lowercase_ascii m
                   in
                   if mem_package fc then load_packages [fc]
                   else Klog.error "package or module '%s' not found" m
diff --git a/src/kernel_services/plugin_entry_points/journal.ml b/src/kernel_services/plugin_entry_points/journal.ml
index cec362c256961bb8d530fbf329aad550db0f70cf..c7ad5bf6e4dbc4124a8ce4adbb265e21ba5d0996 100644
--- a/src/kernel_services/plugin_entry_points/journal.ml
+++ b/src/kernel_services/plugin_entry_points/journal.ml
@@ -155,7 +155,7 @@ let print_trailer fmt =
   Format.fprintf fmt "@[(* Registering *)@]@\n";
   Format.fprintf fmt
     "@[<hv 2>let main : unit -> unit =@;@[<hv 2>Dynamic.register@;~plugin:%S@;\"main\"@;"
-    (Transitioning.String.capitalize_ascii (Filename.basename (get_name ())));
+    (String.capitalize_ascii (Filename.basename (get_name ())));
   Format.fprintf fmt
     "@[<hv 2>(Datatype.func@;Datatype.unit@;Datatype.unit)@]@;";
   Format.fprintf fmt "~journalize:false@;main@]@]@\n@\n";
diff --git a/src/kernel_services/plugin_entry_points/log.ml b/src/kernel_services/plugin_entry_points/log.ml
index da8b3426d7743580f633840a8657d6120fabeeb6..fc75685ce07eb58dc3edc72419e55ec23d16216b 100644
--- a/src/kernel_services/plugin_entry_points/log.ml
+++ b/src/kernel_services/plugin_entry_points/log.ml
@@ -718,7 +718,7 @@ let rec split_joker = function
   | ""::w -> split_joker w
   | a::w -> a::split_joker w
 
-let split_category s = split_joker (Transitioning.String.split_on_char ':' s)
+let split_category s = split_joker (String.split_on_char ':' s)
 
 let evt_category = function
   | { evt_category = None } -> []
diff --git a/src/kernel_services/plugin_entry_points/plugin.ml b/src/kernel_services/plugin_entry_points/plugin.ml
index 1ba3d14939cbf54d60a458a8055c5add286e537a..f24bdbcfb2680fd819c456b99b0c6d7ca87c8dd9 100644
--- a/src/kernel_services/plugin_entry_points/plugin.ml
+++ b/src/kernel_services/plugin_entry_points/plugin.ml
@@ -519,7 +519,7 @@ struct
       else
         let str = if str = "" then default_kinds_str else str in
         let has_ch c =
-          CamlString.contains str (Transitioning.Char.lowercase_ascii c)
+          CamlString.contains str (Char.lowercase_ascii c)
         in
         let list_of_bool b e = if b then [e] else [] in
         let kinds =
@@ -657,7 +657,7 @@ struct
       else
         L.set_warn_status c s
     in
-    let directives = Transitioning.String.split_on_char ',' s in
+    let directives = CamlString.split_on_char ',' s in
     if List.mem "help" directives then begin
       match directives with
       | [ "help" ] ->
@@ -666,7 +666,7 @@ struct
       | _ -> L.abort "mixing help with warning categories in `%s'" s
     end else begin
       let parse_single s =
-        match Transitioning.String.split_on_char '=' s with
+        match CamlString.split_on_char '=' s with
         | [] -> assert false (* split_on_char should return at least an element
                                 even if it is the empty string *)
         | [ c ] -> set_status c Log.Wactive
@@ -678,7 +678,7 @@ struct
     end
 
   let parse_category s =
-    let categories = Transitioning.String.split_on_char ',' s in
+    let categories = CamlString.split_on_char ',' s in
     if List.mem "help" categories then Print_help
     else begin
       let parse_single s =
diff --git a/src/libraries/datatype/datatype.ml b/src/libraries/datatype/datatype.ml
index 328b9e1a1e39b56e6dc0ed6d23b889c58749eadc..e2f6b9b2cee75b892f392c331698c4075ae3dff9 100644
--- a/src/libraries/datatype/datatype.ml
+++ b/src/libraries/datatype/datatype.ml
@@ -146,7 +146,7 @@ end
 let valid_varname s =
   let r = Str.regexp "[^A-Za-z0-9_]+" in
   let s = Str.global_replace r "__" s in
-  Transitioning.String.uncapitalize_ascii s
+  String.uncapitalize_ascii s
 
 let check f fname tname fstr =
   assert
@@ -272,7 +272,7 @@ let is_module_name s =
   List.for_all
     (fun x ->
        String.length x > 0 &&
-       x.[0] = Transitioning.Char.uppercase_ascii x.[0]) l
+       x.[0] = Char.uppercase_ascii x.[0]) l
 
 module Make(X: Make_input) = struct
 
@@ -1711,7 +1711,7 @@ end
 module Make_with_collections(X: Make_input) =
   With_collections
     (Make(X))
-    (struct let module_name = Transitioning.String.capitalize_ascii X.name end)
+    (struct let module_name = String.capitalize_ascii X.name end)
 
 (* ****************************************************************************)
 (** {2 Predefined datatype} *)
@@ -1730,7 +1730,7 @@ module Simple_type
   end) =
 struct
 
-  let module_name = "Datatype." ^ Transitioning.String.capitalize_ascii X.name
+  let module_name = "Datatype." ^ String.capitalize_ascii X.name
 
   include With_collections
   (Make(struct
diff --git a/src/libraries/stdlib/extlib.ml b/src/libraries/stdlib/extlib.ml
index f815f104a071411a50b6eb1501f1b29853fe773e..e14bbd2582c262fe2697232b580f53b8b0bb0465 100644
--- a/src/libraries/stdlib/extlib.ml
+++ b/src/libraries/stdlib/extlib.ml
@@ -158,18 +158,7 @@ let mapi f l =
     snd (List.fold_left (fun (i,acc) x -> (i+1,f i x :: acc)) (0,[]) l)
   in List.rev res
 
-(* Remove duplicates from a sorted list *)
-let list_unique cmp l =
-  let rec aux acc = function
-   | [] -> acc
-   | [e] -> e :: acc
-   | e1 :: (e2 :: _ as q) ->
-     if cmp e1 e2 = 0 then aux acc q else aux (e1 :: acc) q
-  in
-  List.rev (aux [] l)
-
-(* Remove once OCaml 4.02 is mandatory *)
-let sort_unique cmp l = list_unique cmp (List.sort cmp l)
+let sort_unique cmp l = List.sort_uniq cmp l
 
 let subsets k l =
   let rec aux k l len =
@@ -510,8 +499,8 @@ external compare_basic: 'a -> 'a -> int = "%compare"
 
 let compare_ignore_case s1 s2 =
   String.compare
-    (Transitioning.String.lowercase_ascii s1)
-    (Transitioning.String.lowercase_ascii s2)
+    (String.lowercase_ascii s1)
+    (String.lowercase_ascii s2)
 
 (*
 Local Variables:
diff --git a/src/libraries/stdlib/extlib.mli b/src/libraries/stdlib/extlib.mli
index 86d7bec02790d0ec2ced3af931ab3c239910cc0f..c39327e3e31709ee0ffb0546bcdc13d6f12080f5 100644
--- a/src/libraries/stdlib/extlib.mli
+++ b/src/libraries/stdlib/extlib.mli
@@ -154,7 +154,9 @@ val mapi: (int -> 'a -> 'b) -> 'a list -> 'b list
       @since Oxygen-20120901 *)
 
 val sort_unique: ('a -> 'a -> int) -> 'a list -> 'a list
-  (**  Same as List.sort , but also remove duplicates. *)
+  (**  Same as List.sort , but also remove duplicates.
+       @deprecated use List.sort_uniq instead
+  *)
 
 val subsets: int -> 'a list -> 'a list list
   (** [subsets k l] computes the combinations of [k] elements from list [l].
diff --git a/src/libraries/stdlib/transitioning.ml.in b/src/libraries/stdlib/transitioning.ml.in
index 8d6603d83658cb5332f9581f468cf998355b61f2..de6215991de78ead186f5deb8cca34095989fb99 100644
--- a/src/libraries/stdlib/transitioning.ml.in
+++ b/src/libraries/stdlib/transitioning.ml.in
@@ -20,43 +20,6 @@
 (*                                                                        *)
 (**************************************************************************)
 
-let split_on_char c s =
-  let rec aux res s =
-    if String.contains s c then begin
-      let i = String.rindex s c in
-      let prefix = String.sub s 0 i in
-      let suf = String.sub s (i+1) (String.length s - i - 1) in
-      aux (suf::res) prefix
-    end else s :: res
-  in
-  aux [] s
-
-let stack_fold f x s =
-  let res = ref x in
-  let do_it y = res := f !res y in
-  Stack.iter do_it s;
-  !res
-
-let nth_opt l n =
-  try Some (List.nth l n)
-  with Failure _ when n >= 0 -> None
-(* OCaml manual states that a negative argument still raises a Failure. *)
-
-let find_opt f l = try Some (List.find f l) with Not_found -> None
-
-let assoc_opt x l = try Some (List.assoc x l) with Not_found -> None
-
-let assq_opt x l = try Some (List.assq x l) with Not_found -> None
-
-(* the implementations above are only used in case we compile against an
-   old OCaml version. Avoid unused warning in other cases. *)
-let _: char -> string -> string list = split_on_char
-let _: ('a -> 'b -> 'a) -> 'a -> 'b Stack.t -> 'a = stack_fold
-let _: 'a list -> int -> 'a option = nth_opt
-let _: ('a -> bool) -> 'a list -> 'a option = find_opt
-let _: 'a -> ('a * 'b) list -> 'b option = assoc_opt
-let _: 'a -> ('a * 'b) list -> 'b option = assq_opt
-
 module Stdlib = struct
   (* Pervasives/Stdlib functions *)
   let compare = compare
@@ -70,30 +33,6 @@ end
 
 [@@@ warning "-3"]
 
-module String = struct
-  let uppercase_ascii = String.uppercase
-  let capitalize_ascii = String.capitalize
-  let uncapitalize_ascii = String.uncapitalize
-  let lowercase_ascii = String.lowercase
-  let split_on_char = @SPLIT_ON_CHAR@
-end
-
-module Char = struct
-  let uppercase_ascii = Char.uppercase
-  let lowercase_ascii = Char.lowercase
-end
-
-module Stack = struct
-  let fold = @STACK_FOLD@
-end
-
-module List = struct
-  let nth_opt = @NTH_OPT@
-  let find_opt = @FIND_OPT@
-  let assoc_opt = @ASSOC_OPT@
-  let assq_opt = @ASSQ_OPT@
-end
-
 module Dynlink = struct
   let init = @DYNLINK_INIT@
 end
diff --git a/src/libraries/stdlib/transitioning.mli b/src/libraries/stdlib/transitioning.mli
index ce5dcb612e5176b44181a7ecece45b8413500e53..521cf30c013bf939d5bbecc4444a682620267319 100644
--- a/src/libraries/stdlib/transitioning.mli
+++ b/src/libraries/stdlib/transitioning.mli
@@ -33,38 +33,6 @@
 
 (** {1 OCaml} *)
 
-(** In OCaml 4.03, many functions [f] from String have been deprecated
-    in favor of [f_ascii], which operate only on the ASCII charset, while
-    the deprecated [f] knew about iso-8859-1.
-    We use the new names here, so that when support of 4.02.3 is dropped,
-    client code will just have to erase [Transitioning.] to use directly
-    the stdlib version
-*)
-module String: sig
-  val uppercase_ascii: string -> string (** 4.03 *)
-  val capitalize_ascii: string -> string (** 4.03 *)
-  val uncapitalize_ascii: string -> string (** 4.03 *)
-  val lowercase_ascii: string -> string (** 4.03 *)
-  val split_on_char: char -> string -> string list (** 4.04 *)
-end
-
-(** See above documentation for [String] *)
-module Char: sig
-  val uppercase_ascii: char -> char (** 4.03 *)
-  val lowercase_ascii: char -> char (** 4.03 *)
-end
-
-module Stack: sig
-  val fold: ('a -> 'b -> 'a) -> 'a -> 'b Stack.t -> 'a (** 4.03 *)
-end
-
-module List: sig
-  val nth_opt: 'a list -> int -> 'a option (** 4.05 *)
-  val find_opt: ('a -> bool) -> 'a list -> 'a option (** 4.05 *)
-  val assoc_opt: 'a -> ('a * 'b) list -> 'b option (** 4.05 *)
-  val assq_opt: 'a -> ('a * 'b) list -> 'b option (** 4.05 *)
-end
-
 (** 4.08 *)
 module Stdlib: sig
   val compare: 'a -> 'a -> int
diff --git a/src/libraries/utils/floating_point.ml b/src/libraries/utils/floating_point.ml
index bc487fe40a9b9459227ff24ded4103019849720f..9d5399133a88d812663316acd729259e4f6585f3 100644
--- a/src/libraries/utils/floating_point.ml
+++ b/src/libraries/utils/floating_point.ml
@@ -258,7 +258,7 @@ let parse string =
   then Kernel.fatal ~current:true
       "Parsing an empty string as a floating-point constant."
   else
-    let last = Transitioning.Char.uppercase_ascii string.[l] in
+    let last = Char.uppercase_ascii string.[l] in
     let suffix, kind =
       match last with
       | 'F' -> true, Cil_types.FFloat
diff --git a/src/plugins/gui/file_manager.ml b/src/plugins/gui/file_manager.ml
index 4edc958567c6e270a7c08fdbf2aa0687b5ac1588..cec5d5568bcd4f32b511967fce6ddd4cba9d595a 100644
--- a/src/plugins/gui/file_manager.ml
+++ b/src/plugins/gui/file_manager.ml
@@ -146,7 +146,7 @@ let preferences (host_window: Design.main_window_extension_points) =
   in
   let theme_group = new Widget.group "" in
   let build_theme_button name =
-    let label = Transitioning.String.capitalize_ascii name in
+    let label = String.capitalize_ascii name in
     let widget = theme_group#add_radio ~label ~value:name () in
     theme_box#add widget#coerce
   in
diff --git a/src/plugins/gui/launcher.ml b/src/plugins/gui/launcher.ml
index 2ca7d6662843869e27bad911ff855e3cba0354ce..94dcf83f767f76631987f681faddc6378c8f3c47 100644
--- a/src/plugins/gui/launcher.ml
+++ b/src/plugins/gui/launcher.ml
@@ -149,7 +149,7 @@ let box_plugin p =
   let vbox = GPack.vbox ~packing:frame#add () in
   let markup =
     "<span font_weight=\"bold\">" ^
-    Transitioning.String.capitalize_ascii p.Plugin.p_help ^
+    String.capitalize_ascii p.Plugin.p_help ^
     "</span>"
   in
   ignore (GMisc.label ~markup ~packing:(vbox#pack ~padding:15) ());
@@ -159,7 +159,7 @@ let box_plugin p =
       (Hashtbl.fold
          (fun l g acc ->
             if g = [] then acc
-            else (Transitioning.String.capitalize_ascii l, g) :: acc)
+            else (String.capitalize_ascii l, g) :: acc)
          p.Plugin.p_parameters
          [])
   in
@@ -287,7 +287,7 @@ let show ?height ?width ~(host:basic_main) () =
   Plugin.iter_on_plugins
     (fun p ->
        plugins :=
-         (Transitioning.String.capitalize_ascii p.Plugin.p_name, p)
+         (String.capitalize_ascii p.Plugin.p_name, p)
          :: !plugins);
   plugins :=
     List.sort (fun (n1, _) (n2, _) -> compare_plugin_name n1 n2)!plugins;
diff --git a/src/plugins/print_api/print_interface.ml b/src/plugins/print_api/print_interface.ml
index 4d5c5e934406baa2c8eb7deb0290b75d25463e33..1299cd4a1f7492f3667e0ae4043dd7256da68a60 100644
--- a/src/plugins/print_api/print_interface.ml
+++ b/src/plugins/print_api/print_interface.ml
@@ -60,7 +60,7 @@ let clash_with_compilation_unit =
   let h = Hashtbl.create 97 in
   List.iter (fun s -> Hashtbl.add h s ()) Config.compilation_unit_names;
   fun s ->
-    Hashtbl.mem h s || Hashtbl.mem h (Transitioning.String.lowercase_ascii s)
+    Hashtbl.mem h s || Hashtbl.mem h (String.lowercase_ascii s)
 
 (** Modules can depend on each other, when a value of a given module depend
     on a type of another. It is then important to print them in an appropriate
@@ -292,7 +292,7 @@ let print_plugin fmt =
         let extern, sub_modules = List.partition (is_submodule key1) deps in
         List.iter (print_one_plugin fmt i) extern;
         let short_module_name =
-          Transitioning.String.capitalize_ascii (get_name i key1)
+          String.capitalize_ascii (get_name i key1)
         in
 	let space_i = space i in
 	Format.fprintf fmt "\n \n%smodule %s:\n%ssig "
diff --git a/src/plugins/qed/export.ml b/src/plugins/qed/export.ml
index 8f7d667899f2fa0b28b3496fffc9ecc3457c4b98..b3d64a8089d95a506170e8d26934969f96338108 100644
--- a/src/plugins/qed/export.ml
+++ b/src/plugins/qed/export.ml
@@ -91,7 +91,7 @@ let sanitize ~to_lowercase base =
         Buffer.add_char p c
     | 'A' .. 'Z' ->
         Buffer.add_char p
-          (if to_lowercase then Transitioning.Char.lowercase_ascii c else c)
+          (if to_lowercase then Char.lowercase_ascii c else c)
     | _ -> ()
   done ;
   Buffer.contents p
diff --git a/src/plugins/report/classify.ml b/src/plugins/report/classify.ml
index cbb3903021323c0a5452117d0f9228ec2cc81a9a..e7339901ac211f55104164531057580fc1c3e37d 100644
--- a/src/plugins/report/classify.ml
+++ b/src/plugins/report/classify.ml
@@ -21,12 +21,11 @@
 (**************************************************************************)
 
 module R = Report_parameters
-module T = Transitioning
 
 type action = SKIP | INFO | ERROR | REVIEW
 
 let action s =
-  match T.String.uppercase_ascii s with
+  match String.uppercase_ascii s with
   | "INFO" -> INFO
   | "ERROR" -> ERROR
   | "REVIEW" -> REVIEW
@@ -358,7 +357,7 @@ let monitor_log_event (evt : Log.event) =
         Printf.sprintf "%s.unclassified.%s" evt.evt_plugin env.rs_name in
       let e_title =
         Printf.sprintf "Unclassified %s (Plugin '%s')"
-          (T.String.capitalize_ascii env.rs_name) evt.evt_plugin in
+          (String.capitalize_ascii env.rs_name) evt.evt_plugin in
       let e_action = action (env.rs_action ()) in
       { unclassified with e_id ; e_title ; e_action } in
     monitor ~lookup ~category ~msg ~source unclassified
@@ -449,7 +448,7 @@ let monitor_status properties ip =
       let e_id = "unclassified." ^ properties.ps_name in
       let e_title = name in
       let e_action = properties.ps_action () |> action in
-      let e_descr = T.String.capitalize_ascii properties.ps_name ^ " status" in
+      let e_descr = String.capitalize_ascii properties.ps_name ^ " status" in
       { unclassified with e_id ; e_action ; e_title ; e_descr }
     in monitor ~lookup ~category:[] ~msg:name ~source unclassified
 
diff --git a/src/plugins/value/engine/partition.ml b/src/plugins/value/engine/partition.ml
index fcf0088095c21fb077679931087e2acb8fae0f9b..68686f72d14cc2cfa28af182e0714db28e980b5b 100644
--- a/src/plugins/value/engine/partition.ml
+++ b/src/plugins/value/engine/partition.ml
@@ -335,7 +335,7 @@ struct
       | `Bottom -> None
       | `Value (_cache, value) ->
         let is_included (_, _, v) = Abstract.Val.is_included v value in
-        match Transitioning.List.find_opt is_included expected_values with
+        match List.find_opt is_included expected_values with
         | None -> None
         | Some (stamp, i, _) ->
           if Cvalue.V.cardinal_zero_or_one (get value)
diff --git a/src/plugins/value/gui_files/gui_red.ml b/src/plugins/value/gui_files/gui_red.ml
index a5d78c61b30a2e722f05c9d077547d68858f8b32..83b2a1ea896d0f24bb83a400efe57d02ddf40dff 100644
--- a/src/plugins/value/gui_files/gui_red.ml
+++ b/src/plugins/value/gui_files/gui_red.ml
@@ -43,7 +43,7 @@ let all_alarms () =
       all_red_statuses
   in
   let kf_name_compare kfname =
-    Transitioning.String.uncapitalize_ascii kfname
+    String.uncapitalize_ascii kfname
   in
   (* Sort by function names, then stmt, then alarms *)
   let cmp (k1, ki1, ap1, _) (k2, ki2, ap2, _) =
@@ -82,7 +82,7 @@ let make_red_alarm function_name ki alarm callstacks =
   in
   let ca, _ = Alarms.to_annot (Kstmt stmt) alarm in
   let ip = Property.ip_of_code_annot_single kf stmt ca in
-  let kind = Transitioning.String.capitalize_ascii (Alarms.get_name alarm) in
+  let kind = String.capitalize_ascii (Alarms.get_name alarm) in
   let p = get_predicate ca in
   let acsl = Format.asprintf "@[<hov>%a@]" Cil_datatype.Predicate.pretty p in
   let alarm_or_prop = Red_statuses.Alarm alarm in
diff --git a/src/plugins/value/values/numerors/numerors_float.ml b/src/plugins/value/values/numerors/numerors_float.ml
index a080a79ed23030f7fee606fc0868747c9226e17d..9100f86425bfa2d17ac047aea38a3f655111af64 100644
--- a/src/plugins/value/values/numerors/numerors_float.ml
+++ b/src/plugins/value/values/numerors/numerors_float.ml
@@ -101,7 +101,7 @@ let of_float  ?(rnd = Rounding.Near) ?(prec = P.Real) f =
 let of_string ?(rnd = Rounding.Near) ?(prec = P.Real) str =
   prec >>- fun () ->
   let l = String.length str - 1 in
-  let last = Transitioning.Char.lowercase_ascii str.[l] in
+  let last = Char.lowercase_ascii str.[l] in
   let str =
     if last = 'f' || last = 'd' || last = 'l'
     then String.sub str 0 l
diff --git a/src/plugins/variadic/format_pprint.ml b/src/plugins/variadic/format_pprint.ml
index 7951ada686cc750a931ec160a75b68739e1f567e..b5647efb4456238ee6a5c782a8d0d3e00737dfd1 100644
--- a/src/plugins/variadic/format_pprint.ml
+++ b/src/plugins/variadic/format_pprint.ml
@@ -81,7 +81,7 @@ let string_of_cs = function
 
 let pp_cs ff (cs,capitalize) =
   let s = string_of_cs cs in
-  let s = if capitalize then Transitioning.String.capitalize_ascii s else s in
+  let s = if capitalize then String.capitalize_ascii s else s in
   Format.fprintf ff "%s" s
 
 let string_of_option ?pre:(pre="") ?suf:(suf="") f = function
diff --git a/src/plugins/wp/Factory.ml b/src/plugins/wp/Factory.ml
index bc76ceb0d8180a2944f420e6fe6386235ca401c4..bb84db892d8f2acec500e3b62b1a5df2a9e36232 100644
--- a/src/plugins/wp/Factory.ml
+++ b/src/plugins/wp/Factory.ml
@@ -45,7 +45,7 @@ type driver = LogicBuiltins.driver
 let main (i,t) name =
   begin
     Buffer.add_string i name ;
-    Buffer.add_string t (Transitioning.String.capitalize_ascii name) ;
+    Buffer.add_string t (String.capitalize_ascii name) ;
   end
 
 let add (i,t) part =
@@ -54,7 +54,7 @@ let add (i,t) part =
     Buffer.add_string i part ;
     Buffer.add_char t ' ' ;
     Buffer.add_char t '(' ;
-    Buffer.add_string t (Transitioning.String.capitalize_ascii part) ;
+    Buffer.add_string t (String.capitalize_ascii part) ;
     Buffer.add_char t ')' ;
   end
 
@@ -317,7 +317,7 @@ let split ~warning (m:string) : string list =
        | _ -> warning (Printf.sprintf
                          "In model spec %S : unexpected character '%c'" m c)
     )
-    (Transitioning.String.uppercase_ascii m) ;
+    (String.uppercase_ascii m) ;
   flush () ; !tk
 
 let update_config ~warning m s = function
diff --git a/src/plugins/wp/ProverCoq.ml b/src/plugins/wp/ProverCoq.ml
index daf7778bd2526da530e71141ca830e25b7e56b51..9ad41b022be9291a141253e9c9c0188dbd64da25 100644
--- a/src/plugins/wp/ProverCoq.ml
+++ b/src/plugins/wp/ProverCoq.ml
@@ -93,7 +93,7 @@ let parse_c_option opt =
     let coqid = Filename.chop_extension (Filename.basename c_file) in
     let c_module =
       Printf.sprintf "%s.%s" c_name
-        (Transitioning.String.capitalize_ascii coqid)
+        (String.capitalize_ascii coqid)
     in
     { c_id = opt ; c_source ; c_file ; c_path ; c_name ; c_module }
   with Not_found ->
@@ -101,7 +101,7 @@ let parse_c_option opt =
     let c_source = Filename.dirname opt in
     let c_file = Filename.basename opt in
     let c_module =
-      Transitioning.String.capitalize_ascii (Filename.chop_extension c_file)
+      String.capitalize_ascii (Filename.chop_extension c_file)
     in
     { c_id = opt ; c_source ; c_file ; c_path = "." ; c_name = "" ; c_module }
 
diff --git a/src/plugins/wp/ProverWhy3.ml b/src/plugins/wp/ProverWhy3.ml
index bcad8955a4bf993fb94deaf010e7812c01dc43f6..600dcc6aa68c9ceee193a916fda9a6da8a1f1a1f 100644
--- a/src/plugins/wp/ProverWhy3.ml
+++ b/src/plugins/wp/ProverWhy3.ml
@@ -52,7 +52,7 @@ let cluster_file c =
 
 let theory_name_of_cluster c =
   let base = cluster_id c in
-  Transitioning.String.capitalize_ascii base
+  String.capitalize_ascii base
 
 let theory_name_of_pid pid = "VC" ^ WpPropId.get_propid pid
 
@@ -148,13 +148,13 @@ class visitor fmt c =
       self#lines ;
       let name = (cluster_id c) in
       Format.fprintf fmt "use %s.%s@\n"
-        name (Transitioning.String.capitalize_ascii name) ;
+        name (String.capitalize_ascii name) ;
       deps <- (D_cluster c) :: deps
 
     method add_extlib file =
       let thy = filenoext file in
       let path = LogicBuiltins.find_lib file in
-      self#add_import2 thy (Transitioning.String.capitalize_ascii thy) ;
+      self#add_import2 thy (String.capitalize_ascii thy) ;
       self#add_dfile path
 
     method on_library thy =
@@ -163,7 +163,7 @@ class visitor fmt c =
         | [file] ->
             let filenoext = filenoext file in
             self#add_import2 filenoext
-              (Transitioning.String.capitalize_ascii filenoext) ;
+              (String.capitalize_ascii filenoext) ;
             self#add_dfile file
         | [file;lib] ->
             self#add_import2 (filenoext file) lib ;
diff --git a/src/plugins/wp/register.ml b/src/plugins/wp/register.ml
index 254ce3968bef3866356da7b2a2a00c86025aa16e..0c2117f250be3f3a6002cd0087ea63702c5a7883 100644
--- a/src/plugins/wp/register.ml
+++ b/src/plugins/wp/register.ml
@@ -145,7 +145,7 @@ let do_wp_report () =
       begin
         let stats = WpReport.fcstat () in
         begin
-          match Transitioning.String.split_on_char ':' jreport with
+          match String.split_on_char ':' jreport with
           | [] | [""] -> ()
           | [joutput] ->
               WpReport.export_json stats ~joutput () ;
diff --git a/src/plugins/wp/why3_api.ml b/src/plugins/wp/why3_api.ml
index 1287186af6f4c34a75f4e4aa8e612e2516ce2291..1d4c70adb6379fd1630c89b060cfdb0c7adf4d44 100644
--- a/src/plugins/wp/why3_api.ml
+++ b/src/plugins/wp/why3_api.ml
@@ -639,7 +639,7 @@ class visitor (ctx:context) c =
     method on_cluster c =
       let name = Definitions.cluster_id c in
       Wp_parameters.debug ~dkey:dkey_api "Start on_cluster %s@." name;
-      let th_name = Transitioning.String.capitalize_ascii name in
+      let th_name = String.capitalize_ascii name in
       let thy =
         let age = try fst (CLUSTERS.find c) with Not_found -> (-1) in
         if age < Definitions.cluster_age c then
@@ -714,7 +714,7 @@ class visitor (ctx:context) c =
             let filenoext = filenoext file in
             copy_file file;
             self#add_import2 [filenoext]
-              (Transitioning.String.capitalize_ascii filenoext);
+              (String.capitalize_ascii filenoext);
         | [file;lib] ->
             copy_file file;
             self#add_import2 [filenoext file] lib;