let export_wpo export kf bhv wrn dep propid gpred =
    let gname = WpPropId.prop_id_name propid in
    let gid = Wpo.gid ~context:Descr.context ~kf ~bhv ~propid in
    (* --- HEADER --- *)
    Wp_parameters.debug ~dkey "Export PO %s " gname;
    let fhead = Wpo.file_for_head ~gid in
     Wp_parameters.debug ~dkey "DO HEADER in %s" fhead ;
    Command.pp_to_file fhead
      (fun fmt ->
         Format.fprintf fmt "@[<v 0>Proof Obligation %s:@]@\n" gname ;
         Format.fprintf fmt "Environment: %s@\n" export.env ;
         List.iter (fun d -> Format.fprintf fmt "%a@\n" (Wpo.pp_dependency kf) d) dep ;
         List.iter (fun w -> Format.fprintf fmt "%a@\n" Wpo.pp_warning w) wrn ;
      ) ;
    Wp_parameters.debug ~dkey "DONE HEADER in %s" fhead;
    (* --- BODY --- *)
    let fbody = Wpo.file_for_body ~gid in
     Wp_parameters.debug ~dkey "DO BODY in %s" fbody ;
    Command.pp_to_file fbody
      (fun fmt ->
         Format.fprintf fmt "@[<v 2>Goal %s:@ %a@]" gid F.pp_pred gpred ;
      ) ;
    Wp_parameters.debug ~dkey "DONE BODY in %s" fbody ;
    (* --- WHY Others --- *)
    let export_lgg l =
      Wp_parameters.debug ~dkey "DO export goal in language %a"
        Wpo.pp_language l;
    Command.pp_to_file (Wpo.file_for_goal ~gid l )
      (fun fmt ->
         match l with
           | Wpo.L_why -> Why.export_goal fmt gid gpred
           | Wpo.L_coq -> Coq.export_goal fmt gid gpred
           | Wpo.L_altergo -> Ergo.export_goal fmt gid gpred
      ) ;
    Wp_parameters.debug ~dkey "DONE export goal in language %a"
      Wpo.pp_language l;
    in

    let export_all () =
      export_lgg Wpo.L_why ;
      export_lgg Wpo.L_coq ;
      export_lgg Wpo.L_altergo;
    in
    (
      if !Config.is_gui || (Wp_parameters.debug_atleast 2) then
        (Wp_parameters.debug ~dkey
          "Into gui config, goal has to be produce in all languages";
        export_all () )
      else
        (match active_lgg () with
          | None -> ()
          | Some l ->export_lgg l
        )
    );

    (* --- Warnings --- *)
    if wrn <> [] then
      begin
        let pp_warnings fmt ws =
          let n = List.length ws in if n = 1
          then Format.pp_print_string fmt "1 warning"
          else Format.fprintf fmt "%d warnings" n
        in
        let degenerated = List.exists (fun w -> w.Wpo.wrn_severe) wrn in
        if not (Wp_parameters.Details.get ()) then
          Wp_parameters.warning ~current:false ~once:true
            "Use -wp-warnings for details about 'Stronger' and 'Degenerated' goals" ;
        Wp_parameters.warning ~current:false
          "%s goal %s (%a)"
          (if degenerated then "Degenerated" else "Stronger")
          gid pp_warnings wrn ;
        if Wp_parameters.Details.get () then
          List.iter
            (fun w ->
               Log.print_on_output 
                 (fun fmt -> Wpo.pp_warning fmt w ; Format.pp_print_newline fmt ())
            ) wrn ;
      end ;

    let emitter =
      Emitter.create Me.name 
        ~correctness:[] ~tuning:[ Wp_parameters.Prover.parameter ]
    in
        
    (* --- WPO --- *)
    let wpo = {
      Wpo.po_fun    = kf ;
      Wpo.po_bhv    = bhv ;
      Wpo.po_name   = gname ;
      Wpo.po_gid    = gid ;
      Wpo.po_model  = Descr.shared ;
      Wpo.po_env    = export.env ;
      Wpo.po_pid    = propid ;
      Wpo.po_dep    = dep ;
      Wpo.po_warn   = wrn ;
      Wpo.po_updater = emitter;
    } 
    in
    Wpo.add wpo ;
    if F.is_true gpred then
      Wpo.set_result wpo Wpo.WP Wpo.Valid ;
    export.goals <- wpo :: export.goals