diff --git a/src/plugins/wp/ProverWhy3.ml b/src/plugins/wp/ProverWhy3.ml
index 17a55fcf05e666baabab4a36fb712cdfedfea96a..2a5bbea102a9fadc3785b78ca71e9606e953af01 100644
--- a/src/plugins/wp/ProverWhy3.ml
+++ b/src/plugins/wp/ProverWhy3.ml
@@ -1236,7 +1236,7 @@ let digest wpo drv prover task =
       end
   in Digest.file file |> Digest.to_hex
 
-let batch pconf driver ~timeout ~steplimit prover task =
+let batch pconf driver ?script ~timeout ~steplimit prover task =
   let steps = match steplimit with Some 0 -> None | _ -> steplimit in
   let limit =
     let def = Why3.Call_provers.empty_limit in
@@ -1250,9 +1250,51 @@ let batch pconf driver ~timeout ~steplimit prover task =
     | Some _, None -> false
   in
   let command = Why3.Whyconf.get_complete_command pconf ~with_steps in
-  let call = Why3.Driver.prove_task_prepared ~command ~limit driver task in
+  let inplace = if script <> None then Some true else None in
+  let call = Why3.Driver.prove_task_prepared ?old:script ?inplace
+      ~command ~limit driver task in
   call_prover_task ~timeout ~steps prover call
 
+(* -------------------------------------------------------------------------- *)
+(* --- Interactive Prover (Coq)                                           --- *)
+(* -------------------------------------------------------------------------- *)
+
+let editor pconf =
+  let config = Why3Provers.config () in
+  try
+    let ed = Why3.Whyconf.editor_by_id config pconf.Why3.Whyconf.editor in
+    String.concat " " (ed.editor_command :: ed.editor_options)
+  with Not_found ->
+    Why3.Whyconf.(default_editor (get_main config))
+[@@ warning "-32"]
+
+let script ~force wpo =
+  let dir = Wp_parameters.get_session_dir ~force "coq" in
+  Format.sprintf "%s/%s.v" (dir :> string) wpo.Wpo.po_sid
+
+let prepare ~file driver task =
+  Command.pp_to_file file (fun fmt ->
+      ignore (Why3.Driver.print_task_prepared driver fmt task)
+    )
+
+let editscript ~file pconf =
+  let call = Why3.Call_provers.call_editor ~command:(editor pconf) file in
+  call_prover_task ~timeout:None ~steps:None pconf.prover call
+
+let interactive wpo pconf driver prover task =
+  let file = script ~force:true wpo in
+  if not (Sys.file_exists file) then prepare ~file driver task ;
+  let time = Wp_parameters.CoqTimeout.get () in
+  let timeout = if time <= 0 then None else Some time in
+  let open Task in
+  batch pconf driver ~script:file ~timeout ~steplimit:None prover task
+  >>= fun result ->
+  if VCS.is_valid result then
+    Task.return result
+  else
+    editscript ~file pconf >>= fun _ ->
+    batch pconf driver ~script:file ~timeout ~steplimit:None prover task
+
 (* -------------------------------------------------------------------------- *)
 (* --- Prove WPO                                                          --- *)
 (* -------------------------------------------------------------------------- *)
@@ -1273,10 +1315,13 @@ let build_proof_task ?timeout ?steplimit ~prover wpo () =
       let drv , pconf , task = prover_task env prover task in
       if is_trivial task then
         Task.return VCS.valid
+      else
+      if prover.prover_name = "Coq" then
+        interactive wpo pconf drv prover task
       else
         Cache.get_result
           ~digest:(digest wpo drv)
-          ~runner:(batch pconf drv)
+          ~runner:(batch pconf drv ?script:None)
           ~timeout ~steplimit prover task
   with exn ->
     if Wp_parameters.has_dkey dkey_api then