diff --git a/ptests/ptests.ml b/ptests/ptests.ml
index 74d172f88e461db99ab816cd07f748ac071325b6..e945f7923794f1bc819cbb5c5b36befa230546af 100644
--- a/ptests/ptests.ml
+++ b/ptests/ptests.ml
@@ -588,23 +588,6 @@ end = struct
 
 end
 
-type execnow =
-  {
-    ex_cmd: string;      (** command to launch *)
-    ex_log: string list; (** log files *)
-    ex_bin: string list; (** bin files *)
-    ex_dir: SubDir.t;    (** directory of test suite *)
-    ex_once: bool;       (** true iff the command has to be executed only once
-                             per config file (otherwise it is executed for
-                             every file of the test suite) *)
-    ex_done: bool ref;   (** has the command been already fully executed.
-                             Shared between all copies of this EXECNOW. Do
-                             NOT use a mutable field here, as execnows
-                             are duplicated using OCaml 'with' syntax. *)
-    ex_timeout: string;
-  }
-
-
 module Macros =
 struct
   module StringMap = Map.Make (String)
@@ -612,6 +595,12 @@ struct
 
   type t = string StringMap.t
 
+  let add_defaults ~defaults macros =
+    StringMap.merge (fun _k default cur ->
+        match cur with
+        | Some _ -> cur
+        | _ -> default) defaults macros
+
   let empty = StringMap.empty
 
   let print_macros macros =
@@ -673,6 +662,24 @@ struct
 end
 
 
+type execnow =
+  {
+    ex_cmd: string;      (** command to launch *)
+    ex_macros: Macros.t; (** current macros *)
+    ex_log: string list; (** log files *)
+    ex_bin: string list; (** bin files *)
+    ex_dir: SubDir.t;    (** directory of test suite *)
+    ex_once: bool;       (** true iff the command has to be executed only once
+                             per config file (otherwise it is executed for
+                             every file of the test suite) *)
+    ex_done: bool ref;   (** has the command been already fully executed.
+                             Shared between all copies of this EXECNOW. Do
+                             NOT use a mutable field here, as execnows
+                             are duplicated using OCaml 'with' syntax. *)
+    ex_timeout: string;
+  }
+
+
 (** configuration of a directory/test. *)
 type cmd = {
   toplevel: string;
@@ -764,7 +771,7 @@ end = struct
       dc_timeout = "";
     }
 
-  let scan_execnow ~once dir ex_timeout (s:string) =
+  let scan_execnow ~once dir ex_macros ex_timeout (s:string) =
     let rec aux (s:execnow) =
       try
         Scanf.sscanf s.ex_cmd "%_[ ]LOG%_[ ]%[-A-Za-z0-9_',+=:.\\@@]%_[ ]%s@\n"
@@ -786,6 +793,7 @@ end = struct
     in
     aux
       { ex_cmd = s;
+        ex_macros;
         ex_log = [];
         ex_bin = [];
         ex_dir = dir;
@@ -847,7 +855,7 @@ end = struct
   let config_exec ~once ~file:_ dir s current =
     { current with
       dc_execnow =
-        scan_execnow ~once dir current.dc_timeout s :: current.dc_execnow }
+        scan_execnow ~once dir current.dc_macros current.dc_timeout s :: current.dc_execnow }
 
   let config_macro ~file _dir s current =
     let regex = Str.regexp "[ \t]*\\([^ \t@]+\\)\\([ \t]+\\(.*\\)\\|$\\)" in
@@ -869,13 +877,7 @@ end = struct
 
   let set_load_modules deps macros =
     let name = "PTEST_LOAD_MODULES" in
-    let def = List.fold_left (fun acc s ->
-        match acc with
-        | "" -> s
-        | acc -> s ^ "," ^ acc)
-        ""
-        deps
-    in
+    let def = String.concat "," deps in
     if !verbosity >= 3 then
       lock_printf "%%   - Macro %s for -load-module with definition %s@." name def;
     Macros.add_list [name, def] macros
@@ -1172,7 +1174,7 @@ module Cmd : sig
   val log_prefix : toplevel_command -> string
   val oracle_prefix : toplevel_command -> string
 
-  val expand_macros : toplevel_command -> toplevel_command
+  val expand_macros : defaults:Macros.t -> toplevel_command -> toplevel_command
 
   (* [basic_command_string cmd] does not redirect the outputs, and does
      not overwrite the result files *)
@@ -1206,7 +1208,7 @@ end = struct
 
   let get_ptest_file cmd = SubDir.make_file cmd.directory cmd.file
 
-  let expand_macros cmd =
+  let expand_macros ~defaults cmd =
     let ptest_config =
       if !special_config = "" then "" else "_" ^ !special_config
     in
@@ -1226,6 +1228,7 @@ end = struct
       ]
     in
     let macros = Macros.add_list macros cmd.macros in
+    let macros = Macros.add_defaults ~defaults macros in
     let process_macros s = Macros.expand macros s in
     { cmd with
       macros;
@@ -1935,7 +1938,7 @@ let dispatcher () =
         fun {toplevel; opts=options; logs=log_files; macros; exit_code; timeout} ->
           let n = !i in
           incr i;
-          Cmd.expand_macros
+          Cmd.expand_macros ~defaults:config.dc_macros
             { file; options; toplevel; nb_files; directory; n; log_files;
               filter = config.dc_filter; macros;
               exit_code = begin
@@ -1955,7 +1958,7 @@ let dispatcher () =
         fun execnow ->
           let n = !e in
           incr e;
-          let cmd = Cmd.expand_macros
+          let cmd = Cmd.expand_macros ~defaults:config.dc_macros
               {file ;
                nb_files = nb_files_execnow;
                log_files = execnow.ex_log;
@@ -1965,13 +1968,14 @@ let dispatcher () =
                n;
                directory;
                filter = None; (* No filter for execnow command *)
-               macros = config.dc_macros;
+               macros = execnow.ex_macros;
                execnow = true;
                timeout = execnow.ex_timeout;
               }
           in
           let process_macros s = Macros.expand cmd.macros s in
           { ex_cmd = Cmd.basic_command_string cmd;
+            ex_macros = cmd.macros;
             ex_log = cmd.log_files;
             ex_bin = List.map process_macros execnow.ex_bin;
             ex_dir = execnow.ex_dir;
diff --git a/src/plugins/e-acsl/tests/arith/bitwise.c b/src/plugins/e-acsl/tests/arith/bitwise.c
index 7dfa73a7c444bbd24f5911e3abde2010c53ed6db..676150fb0315130ec0efd4a7e9c6d7ffa2588339 100644
--- a/src/plugins/e-acsl/tests/arith/bitwise.c
+++ b/src/plugins/e-acsl/tests/arith/bitwise.c
@@ -1,7 +1,7 @@
 /* run.config_ci, run.config_dev
    COMMENT: Support of bitwise operations
-   STDOPT: #"-warn-right-shift-negative -warn-left-shift-negative"
    MACRO: ROOT_EACSL_GCC_FC_EXTRA_EXT -warn-right-shift-negative -warn-left-shift-negative
+   STDOPT: #"-warn-right-shift-negative -warn-left-shift-negative"
 */
 
 #include <limits.h>
diff --git a/src/plugins/e-acsl/tests/builtin/test_config_dev b/src/plugins/e-acsl/tests/builtin/test_config_dev
index a915fc61b249ed381825662eecdb83418ae70384..75244f22baf113b9a89e5613d15e66d948db1264 100644
--- a/src/plugins/e-acsl/tests/builtin/test_config_dev
+++ b/src/plugins/e-acsl/tests/builtin/test_config_dev
@@ -1 +1,2 @@
 MACRO: ROOT_EACSL_GCC_OPTS_EXT --libc-replacements
+STDOPT:
diff --git a/src/plugins/e-acsl/tests/format/test_config_dev b/src/plugins/e-acsl/tests/format/test_config_dev
index aae787763c6565f6f717eb03b30a8221feb90fb6..d7f6f441060ba9eb22b426eaf816ff05a679840b 100644
--- a/src/plugins/e-acsl/tests/format/test_config_dev
+++ b/src/plugins/e-acsl/tests/format/test_config_dev
@@ -1,2 +1,3 @@
 MACRO: ROOT_EACSL_GCC_OPTS_EXT --validate-format-strings --full-mtracking -F -variadic-no-translation
 MACRO: ROOT_EACSL_EXEC_FILTER @SEDCMD@ -e "s|/.*/share/e-acsl|FRAMAC_SHARE/e-acsl|"
+STDOPT:
diff --git a/src/plugins/e-acsl/tests/full-mtracking/test_config_dev b/src/plugins/e-acsl/tests/full-mtracking/test_config_dev
index 80a939ea02713f1e0fb539f6bfb567096a7e2510..7341131a532b15723e4ea283ad68908ff7ec3917 100644
--- a/src/plugins/e-acsl/tests/full-mtracking/test_config_dev
+++ b/src/plugins/e-acsl/tests/full-mtracking/test_config_dev
@@ -1 +1,2 @@
 MACRO: ROOT_EACSL_GCC_OPTS_EXT --full-mtracking
+STDOPT:
diff --git a/src/plugins/e-acsl/tests/gmp-only/test_config_dev b/src/plugins/e-acsl/tests/gmp-only/test_config_dev
index 3a3fc2c7e601d0b97416e7f858e9ddeee944102f..17fca0a799c66f8133edd943ed1f76a484263218 100644
--- a/src/plugins/e-acsl/tests/gmp-only/test_config_dev
+++ b/src/plugins/e-acsl/tests/gmp-only/test_config_dev
@@ -1 +1,2 @@
 MACRO: ROOT_EACSL_GCC_OPTS_EXT --gmp
+STDOPT:
diff --git a/src/plugins/e-acsl/tests/temporal/test_config_dev b/src/plugins/e-acsl/tests/temporal/test_config_dev
index a390cadc7c632ab6c59fde8881a2695e0749ef4d..ddff8508c1e18074db4e26c6d93ee182b04ec0fc 100644
--- a/src/plugins/e-acsl/tests/temporal/test_config_dev
+++ b/src/plugins/e-acsl/tests/temporal/test_config_dev
@@ -1 +1,2 @@
 MACRO: ROOT_EACSL_GCC_OPTS_EXT --temporal
+STDOPT:
diff --git a/src/plugins/e-acsl/tests/test_config_dev.in b/src/plugins/e-acsl/tests/test_config_dev.in
index c10b67e1493d2b3bb5f112244bf657a09a5e1122..045e0fac2c994cb0d4fe5edc094ed3ddfb5b5a62 100644
--- a/src/plugins/e-acsl/tests/test_config_dev.in
+++ b/src/plugins/e-acsl/tests/test_config_dev.in
@@ -4,16 +4,20 @@ MACRO: DEST @PTEST_RESULT@/@PTEST_NAME@
 MACRO: OUT @PTEST_NAME@.res.log
 MACRO: ERR @PTEST_NAME@.err.log
 MACRO: EACSL_ERR @PTEST_NAME@.e-acsl.err.log
+
 COMMENT: Define the following macro to "no" in a test to stop the execution of `e-acsl-gcc.sh`
 MACRO: ROOT_EACSL_GCC_ENABLE yes
 COMMENT: Default options for `e-acsl-gcc.sh`
 MACRO: ROOT_EACSL_GCC_MISC_OPTS -q -X
 COMMENT: Default options for the frama-c invocation
 MACRO: ROOT_EACSL_GCC_FC_EXTRA -journal-disable -verbose 0
+
+EXEC: LOG @EACSL_ERR@ if test "@ROOT_EACSL_GCC_ENABLE@" = "yes"; then ./scripts/e-acsl-gcc.sh -I @frama-c@ -c @ROOT_EACSL_GCC_MISC_OPTS@ --frama-c-extra="@ROOT_EACSL_GCC_FC_EXTRA@ @ROOT_EACSL_GCC_FC_EXTRA_EXT@" @ROOT_EACSL_GCC_OPTS_EXT@ -o @DEST@.gcc.c -O @DEST@ @PTEST_FILE@ > @PTEST_RESULT@/@OUT@ 2> @PTEST_RESULT@/@ERR@ && ./@DEST@.e-acsl 2>&1 1>/dev/null | @ROOT_EACSL_EXEC_FILTER@ > @PTEST_RESULT@/@EACSL_ERR@; fi
+
+COMMENT: These next macros can be redefined in a test file
 COMMENT: Define the following macro in a test to pass extra options to the frama-c invocation
 MACRO: ROOT_EACSL_GCC_FC_EXTRA_EXT
 COMMENT: Define the following macro in a test to pass extra options to `e-acsl-gcc.sh`
 MACRO: ROOT_EACSL_GCC_OPTS_EXT
 COMMENT: Define the following macro in a test to filter the output of the test execution
 MACRO: ROOT_EACSL_EXEC_FILTER cat
-EXEC: LOG @EACSL_ERR@ if test "@ROOT_EACSL_GCC_ENABLE@" = "yes"; then ./scripts/e-acsl-gcc.sh -I @frama-c@ -c @ROOT_EACSL_GCC_MISC_OPTS@ --frama-c-extra="@ROOT_EACSL_GCC_FC_EXTRA@ @ROOT_EACSL_GCC_FC_EXTRA_EXT@" @ROOT_EACSL_GCC_OPTS_EXT@ -o @DEST@.gcc.c -O @DEST@ @PTEST_FILE@ > @PTEST_RESULT@/@OUT@ 2> @PTEST_RESULT@/@ERR@ && ./@DEST@.e-acsl 2>&1 1>/dev/null | @ROOT_EACSL_EXEC_FILTER@ > @PTEST_RESULT@/@EACSL_ERR@; fi
diff --git a/tests/saveload/basic.i b/tests/saveload/basic.i
index 6e2f8318e06b079b2a35dc0d74b806f4f8664d85..4c9fc76e904c0a440e172fe92979741020451fd3 100644
--- a/tests/saveload/basic.i
+++ b/tests/saveload/basic.i
@@ -1,15 +1,15 @@
 /* run.config
  MODULE: @PTEST_NAME@
-   EXECNOW: LOG basic_sav.res LOG basic_sav.err BIN basic.sav @frama-c@ -load-module @PTEST_DIR@/@PTEST_NAME@.cmxs -eva @EVA_OPTIONS@ -out -input -deps ./@PTEST_DIR@/@PTEST_NAME@.i -save ./tests/saveload/result/basic.sav > ./tests/saveload/result/basic_sav.res 2> ./tests/saveload/result/basic_sav.err
-   EXECNOW: LOG basic_sav.1.res LOG basic_sav.1.err BIN basic.1.sav @frama-c@ -save ./tests/saveload/result/basic.1.sav @PTEST_DIR@/@PTEST_NAME@.i -eva @EVA_OPTIONS@ -out -input -deps > ./tests/saveload/result/basic_sav.1.res 2> ./tests/saveload/result/basic_sav.1.err
+   EXECNOW: LOG basic_sav.res LOG basic_sav.err BIN basic.sav @frama-c@ -eva @EVA_OPTIONS@ -out -input -deps @PTEST_FILE@ -save ./tests/saveload/result/basic.sav > ./tests/saveload/result/basic_sav.res 2> ./tests/saveload/result/basic_sav.err
  MODULE:
+   EXECNOW: LOG basic_sav.1.res LOG basic_sav.1.err BIN basic.1.sav @frama-c@ -save ./tests/saveload/result/basic.1.sav @PTEST_FILE@ -eva @EVA_OPTIONS@ -out -input -deps > ./tests/saveload/result/basic_sav.1.res 2> ./tests/saveload/result/basic_sav.1.err
    STDOPT: +"-load ./tests/saveload/result/basic.sav -eva @EVA_OPTIONS@ -out -input -deps -journal-disable"
  MODULE: @PTEST_NAME@
    STDOPT: +"-load ./tests/saveload/result/basic.1.sav -eva @EVA_OPTIONS@ -out -input -deps -journal-disable -print"
  MODULE:
    STDOPT: +"-load ./tests/saveload/result/basic.1.sav -eva @EVA_OPTIONS@ -out -input -deps -journal-disable"
  MODULE: status
-   EXECNOW: LOG status_sav.res LOG status_sav.err BIN status.sav @frama-c@ -load-module @PTEST_DIR@/status -save ./tests/saveload/result/status.sav @PTEST_DIR@/@PTEST_NAME@.i > ./tests/saveload/result/status_sav.res 2> ./tests/saveload/result/status_sav.err
+   EXECNOW: LOG status_sav.res LOG status_sav.err BIN status.sav @frama-c@ -save ./tests/saveload/result/status.sav @PTEST_FILE@ > ./tests/saveload/result/status_sav.res 2> ./tests/saveload/result/status_sav.err
    STDOPT: +"-load ./tests/saveload/result/status.sav"
  MODULE:
    STDOPT: +"-load ./tests/saveload/result/status.sav"