diff --git a/src/plugins/e-acsl/Makefile.in b/src/plugins/e-acsl/Makefile.in
index 9d8eb9a550327225c832ef0d6707923cd868bd76..a44d27242911d78ca3342a8cac5779d96a85f5d7 100644
--- a/src/plugins/e-acsl/Makefile.in
+++ b/src/plugins/e-acsl/Makefile.in
@@ -44,6 +44,13 @@ SRC_LIBRARIES:= \
 	varname
 SRC_LIBRARIES:=$(addprefix src/libraries/, $(SRC_LIBRARIES))
 
+# project initializer
+SRC_PROJECT_INITIALIZER:= \
+	rtl \
+	prepare_ast
+SRC_PROJECT_INITIALIZER:=\
+  $(addprefix src/project_initializer/, $(SRC_PROJECT_INITIALIZER))
+
 # analyses
 SRC_ANALYSES:= \
 	rte \
@@ -55,13 +62,6 @@ SRC_ANALYSES:= \
 	typing
 SRC_ANALYSES:=$(addprefix src/analyses/, $(SRC_ANALYSES))
 
-# project initializer
-SRC_PROJECT_INITIALIZER:= \
-	rtl \
-	prepare_ast
-SRC_PROJECT_INITIALIZER:=\
-  $(addprefix src/project_initializer/, $(SRC_PROJECT_INITIALIZER))
-
 # code generator
 SRC_CODE_GENERATOR:= \
 	constructor \
@@ -100,8 +100,8 @@ PLUGIN_NAME:=E_ACSL
 PLUGIN_CMO:= src/local_config \
 	src/options \
 	$(SRC_LIBRARIES) \
-	$(SRC_ANALYSES) \
 	$(SRC_PROJECT_INITIALIZER) \
+	$(SRC_ANALYSES) \
 	$(SRC_CODE_GENERATOR) \
 	src/main
 
diff --git a/src/plugins/e-acsl/src/analyses/mmodel_analysis.ml b/src/plugins/e-acsl/src/analyses/mmodel_analysis.ml
index fb984d7073e8af16a1f9c17f529816e35631b8e6..c480e318b764410dc8acfd272b8c28d27d3f75f6 100644
--- a/src/plugins/e-acsl/src/analyses/mmodel_analysis.ml
+++ b/src/plugins/e-acsl/src/analyses/mmodel_analysis.ml
@@ -620,7 +620,7 @@ end = struct
   let compute init_set kf =
     Options.feedback ~dkey ~level:2 "entering in function %a."
       Kernel_function.pretty kf;
-    assert (not (Misc.is_library_loc (Kernel_function.get_location kf)));
+    assert (not (Rtl.Symbols.mem_kf kf));
     let tbl, is_init =
       try Env.find kf, true
       with Not_found -> Stmt.Hashtbl.create 17, false
@@ -660,7 +660,7 @@ end = struct
     tbl
 
   let get ?init kf =
-    if Misc.is_library_loc (Kernel_function.get_location kf) then
+    if Rtl.Symbols.mem_kf kf then
       Varinfo.Hptset.empty
     else
       try
@@ -799,6 +799,6 @@ let use_model () =
 
 (*
 Local Variables:
-compile-command: "make -C ../.."
+compile-command: "make -C ../../../../.."
 End:
 *)
diff --git a/src/plugins/e-acsl/src/analyses/mmodel_analysis.mli b/src/plugins/e-acsl/src/analyses/mmodel_analysis.mli
index 39090f0dfa07a4100864ff0c20883bd9d79e7f3a..8c4967c2797f9c936b3c230b40a9cb0d476f6a37 100644
--- a/src/plugins/e-acsl/src/analyses/mmodel_analysis.mli
+++ b/src/plugins/e-acsl/src/analyses/mmodel_analysis.mli
@@ -44,6 +44,6 @@ val must_model_exp: ?kf:kernel_function -> ?stmt:stmt -> exp -> bool
 
 (*
   Local Variables:
-  compile-command: "make"
+  compile-command: "make -C ../../../../.."
   End:
  *)
diff --git a/src/plugins/e-acsl/src/code_generator/injector.ml b/src/plugins/e-acsl/src/code_generator/injector.ml
index 3722be14ad4101f2cb7097d414683c0ca0065ed3..dd1222051d790f8757da083c9f9628ac3be4d877 100644
--- a/src/plugins/e-acsl/src/code_generator/injector.ml
+++ b/src/plugins/e-acsl/src/code_generator/injector.ml
@@ -123,9 +123,9 @@ let rename_caller loc args exp = match exp.enode with
     let name = Functions.RTL.libc_replacement_name vi.vname in
     (* variadic arguments descriptor *)
     let fmt = Functions.Libc.get_printf_argument_str ~loc vi.vname args in
-    (* get the name of the library function we need. Cannot just rewrite the
-       name as AST check will then fail *)
-    let vi = Misc.get_lib_fun_vi name in
+    (* get the library function we need. Cannot just rewrite the name as AST
+       check will then fail *)
+    let vi = try Rtl.Symbols.find_vi name with Not_found -> assert false in
     Cil.evar vi, fmt :: args
 
   | _ ->
@@ -589,6 +589,7 @@ let inject_in_fundec main fundec =
   in
   List.iter unghost_formal fundec.sformals;
   (* update environments *)
+  (* TODO: do it only for built-ins *)
   Builtins.update vi.vname vi;
   (* track function addresses but the main function that is tracked internally
      via RTL *)
@@ -628,17 +629,15 @@ let unghost_vi vi =
 let inject_in_global (env, main) = function
   (* library functions and built-ins *)
   | GVarDecl(vi, _) | GVar(vi, _, _)
-  | GFunDecl(_, vi, _) | GFun({ svar = vi }, _)
-    when Misc.is_library_loc vi.vdecl || Builtins.mem vi.vname ->
-    Misc.register_library_function vi;
-    if Builtins.mem vi.vname then Builtins.update vi.vname vi;
+  | GFunDecl(_, vi, _) | GFun({ svar = vi }, _) when Builtins.mem vi.vname ->
+    Builtins.update vi.vname vi;
     env, main
 
   (* Cil built-ins and other library globals: nothing to do *)
   | GVarDecl(vi, _) | GVar(vi, _, _) | GFun({ svar = vi }, _)
     when Misc.is_fc_or_compiler_builtin vi ->
     env, main
-  | g when Misc.is_library_loc (Global.loc g) ->
+  | g when Rtl.Symbols.mem_global g ->
     env, main
 
   (* variable declarations *)
@@ -845,7 +844,6 @@ let reset_all ast =
   Options.Run.off ();
   (* reset all the E-ACSL environments to their original states *)
   Mmodel_analysis.reset ();
-  Misc.reset ();
   Logic_functions.reset ();
   Literal_strings.reset ();
   Global_observer.reset ();
@@ -862,7 +860,6 @@ let inject () =
   Options.feedback ~level:2
     "injecting annotations as code in project %a"
     Project.pretty (Project.current ());
-  Misc.reorder_ast ();
   Gmp_types.init ();
   let ast = Ast.get () in
   inject_in_file ast;
diff --git a/src/plugins/e-acsl/src/code_generator/translate.ml b/src/plugins/e-acsl/src/code_generator/translate.ml
index f3cb0dc8de11b567298a59bd2167bfc9d7ee6e00..5c470efe5a0fa3014f8d418209daa1c74bf94417 100644
--- a/src/plugins/e-acsl/src/code_generator/translate.ml
+++ b/src/plugins/e-acsl/src/code_generator/translate.ml
@@ -1128,7 +1128,7 @@ let term_to_exp typ t =
   let env = Env.rte env false in
   let e, env =
     try term_to_exp (Kernel_function.dummy ()) env t
-    with Misc.Unregistered_library_function _ -> raise (No_simple_translation t)
+    with Rtl.Symbols.Unregistered _ -> raise (No_simple_translation t)
   in
   if not (Env.has_no_new_stmt env) then raise (No_simple_translation t);
   e
diff --git a/src/plugins/e-acsl/src/libraries/builtins.ml b/src/plugins/e-acsl/src/libraries/builtins.ml
index 9bfe9fe7d7bf79638487c00e265ee2a35b533a79..fa5d9adf70ae5c12f251f9ba96bbcea4bc56558c 100644
--- a/src/plugins/e-acsl/src/libraries/builtins.ml
+++ b/src/plugins/e-acsl/src/libraries/builtins.ml
@@ -83,6 +83,6 @@ let () = Cmdline.run_after_configuring_stage init
 
 (*
 Local Variables:
-compile-command: "make"
+compile-command: "make -C ../../../../.."
 End:
 *)
diff --git a/src/plugins/e-acsl/src/libraries/builtins.mli b/src/plugins/e-acsl/src/libraries/builtins.mli
index 95dce5b8aab5bc88615f90a2274bccc9b79d521c..d15f53f6ef5284904b9f4c709a95cb78e7c6d5fc 100644
--- a/src/plugins/e-acsl/src/libraries/builtins.mli
+++ b/src/plugins/e-acsl/src/libraries/builtins.mli
@@ -35,6 +35,6 @@ val update: string -> Cil_types.varinfo -> unit
 
 (*
 Local Variables:
-compile-command: "make"
+compile-command: "make -C ../../../../.."
 End:
 *)
diff --git a/src/plugins/e-acsl/src/libraries/misc.ml b/src/plugins/e-acsl/src/libraries/misc.ml
index 0f4d38ef3fb6f37bd2ab33dd37c1f0d1ff021063..3ef0b0452028f3c97a11f0ac1373de59d6be88a6 100644
--- a/src/plugins/e-acsl/src/libraries/misc.ml
+++ b/src/plugins/e-acsl/src/libraries/misc.ml
@@ -20,7 +20,6 @@
 (*                                                                        *)
 (**************************************************************************)
 
-module RTL = Functions.RTL
 open Cil_types
 open Cil_datatype
 
@@ -28,20 +27,6 @@ open Cil_datatype
 (** {2 Handling the E-ACSL's C-libraries, part I} *)
 (* ************************************************************************** *)
 
-let library_files () =
-  List.map
-    (fun d -> Options.Share.get_file ~mode:`Must_exist d)
-    [ "e_acsl_gmp_api.h";
-      "e_acsl.h" ]
-
-let is_library_loc (loc, _) = List.mem loc.Filepath.pos_path (library_files ())
-
-let library_functions = Datatype.String.Hashtbl.create 17
-let register_library_function vi =
-  Datatype.String.Hashtbl.add library_functions vi.vname vi
-
-let reset () = Datatype.String.Hashtbl.clear library_functions
-
 let is_fc_or_compiler_builtin vi =
   Cil.is_builtin vi
   ||
@@ -51,20 +36,6 @@ let is_fc_or_compiler_builtin vi =
    let prefix = String.sub vi.vname 0 prefix_length in
    Datatype.String.equal prefix "__builtin_")
 
-(* ************************************************************************** *)
-(** {2 Builders} *)
-(* ************************************************************************** *)
-
-exception Unregistered_library_function of string
-let get_lib_fun_vi fname =
-  try Datatype.String.Hashtbl.find library_functions fname
-  with Not_found ->
-  try Builtins.find fname
-  with Not_found ->
-    (* should not happen in normal mode, but could be raised when E-ACSL is
-       used as a library *)
-    raise (Unregistered_library_function fname)
-
 (* ************************************************************************** *)
 (** {2 Handling \result} *)
 (* ************************************************************************** *)
@@ -89,17 +60,6 @@ let result_vi kf = match result_lhost kf with
 let term_addr_of ~loc tlv ty =
   Logic_const.taddrof ~loc tlv (Ctype (TPtr(ty, [])))
 
-let reorder_ast () =
-  let ast = Ast.get() in
-  let is_from_library = function
-    | GType(ti, _) when ti.tname = "size_t" || ti.tname = "FILE"
-                        || RTL.is_rtl_name ti.tname -> true
-    | GCompTag (ci, _) when RTL.is_rtl_name ci.cname -> true
-    | GFunDecl(_, _, loc) | GVarDecl(_, loc) when is_library_loc loc -> true
-    | _ -> false in
-  let rtl, other = List.partition is_from_library ast.globals in
-  ast.globals <- rtl @ other
-
 let cty = function
   | Ctype ty -> ty
   | lty -> Options.fatal "Expecting a C type. Got %a" Printer.pp_logic_type lty
diff --git a/src/plugins/e-acsl/src/libraries/misc.mli b/src/plugins/e-acsl/src/libraries/misc.mli
index 1d2359202f752f482e32557377726c0719f23d3f..1a66d8cf412a9c0c2ef315e7797ff7b26fa8627c 100644
--- a/src/plugins/e-acsl/src/libraries/misc.mli
+++ b/src/plugins/e-acsl/src/libraries/misc.mli
@@ -24,14 +24,6 @@
 
 open Cil_types
 
-(* ************************************************************************** *)
-(** {2 Builders} *)
-(* ************************************************************************** *)
-
-exception Unregistered_library_function of string
-val get_lib_fun_vi: string -> varinfo
-(** @return varinfo corresponding to a name of a given library function *)
-
 (* ************************************************************************** *)
 (** {2 Handling \result} *)
 (* ************************************************************************** *)
@@ -46,11 +38,6 @@ val result_vi: kernel_function -> varinfo
 (** {2 Handling the E-ACSL's C-libraries} *)
 (* ************************************************************************** *)
 
-val library_files: unit -> Datatype.Filepath.t list
-val is_library_loc: location -> bool
-val register_library_function: varinfo -> unit
-val reset: unit -> unit
-
 val is_fc_or_compiler_builtin: varinfo -> bool
 
 (* ************************************************************************** *)
@@ -59,11 +46,6 @@ val is_fc_or_compiler_builtin: varinfo -> bool
 
 val term_addr_of: loc:location -> term_lval -> typ -> term
 
-val reorder_ast: unit -> unit
-(* Reorder current AST by bringing all global declarations belonging to the
- * E-ACSL runtime library and their dependencies (e.g., typedef size_t) to
- * the very top of the file. *)
-
 val cty: logic_type -> typ
 (** Assume that the logic type is indeed a C type. Just return it. *)
 
diff --git a/src/plugins/e-acsl/src/main.ml b/src/plugins/e-acsl/src/main.ml
index 0c5bd0e1f59093b176297a32026044a6b3b5db41..5b73604151c17d72ba7d43a6cecbd72540585d74 100644
--- a/src/plugins/e-acsl/src/main.ml
+++ b/src/plugins/e-acsl/src/main.ml
@@ -71,7 +71,8 @@ let generate_code =
        Project.on
          copied_prj
          (fun () ->
-            (* preparation of the AST does not concern the E-ACSL RTL *)
+            (* preparation of the AST does not concern the E-ACSL RTL:
+               do it first *)
             Prepare_ast.prepare ();
             Rtl.link rtl_prj;
             (* the E-ACSL type system ensures the soundness of the generated
diff --git a/src/plugins/e-acsl/src/project_initializer/prepare_ast.ml b/src/plugins/e-acsl/src/project_initializer/prepare_ast.ml
index f5e31c7949f347cb4d850ad9ceed30c119dbe2e4..5324a4ffd3b79ee9888500d626e0543072266d62 100644
--- a/src/plugins/e-acsl/src/project_initializer/prepare_ast.ml
+++ b/src/plugins/e-acsl/src/project_initializer/prepare_ast.ml
@@ -410,8 +410,6 @@ class prepare_visitor = object (self)
         not (Datatype.String.Set.mem vi.vname unduplicable_functions)
         && (* it is not a variadic function *)
         not (self#is_variadic_function vi)
-        && (* it is not in the E-ACSL's RTL *)
-        not (Misc.is_library_loc loc)
         && (* it is not a built-in *)
         not (Misc.is_fc_or_compiler_builtin vi)
         &&
@@ -484,8 +482,8 @@ class prepare_visitor = object (self)
              [ new_decl; g ]
            | _ -> assert false)
 
-    | GVarDecl(vi, loc) | GFunDecl(_, vi, loc) | GFun({ svar = vi }, loc)
-      when Misc.is_library_loc loc || Misc.is_fc_or_compiler_builtin vi ->
+    | GVarDecl(vi, _loc) | GFunDecl(_, vi, _loc) | GFun({ svar = vi }, _loc)
+      when Misc.is_fc_or_compiler_builtin vi ->
       Cil.DoChildren
 
     | _ ->