let wp_panel (_main_ui:Design.main_window_extension_points) =
  let vbox = GPack.vbox () in
  let demon = Gtk_form.demon () in
  let packing = vbox#pack in
  let form = new Gtk_form.form ~packing in
  
  form#label "Model" ;
  Gtk_form.menu wp_model_menu
    ~tooltip:"Memory model selection" ~packing:form#item
    Wp_parameters.Model.get Wp_parameters.Model.set demon ;

  form#label "Prover" ;
  Gtk_form.menu wp_prover_menu
    ~tooltip:"Prover selection"
    ~packing:form#item
    wp_prover_get wp_prover_set demon ;

  let options = GPack.hbox ~spacing:8 ~packing () in

  Gtk_form.check ~label:"RTE" 
    ~tooltip:"Generates RTE guards for WP"
    ~packing:options#pack
    Wp_parameters.RTE.get Wp_parameters.RTE.set demon ;

  Gtk_form.check ~label:"Split" 
    ~tooltip:"Split cunjunctions into sub-goals"
    ~packing:options#pack
    Wp_parameters.Split.get Wp_parameters.Split.set demon ;
  
  Gtk_form.check ~label:"Trace"
    ~tooltip:"Keep user labels in proof obligations"
    ~packing:options#pack
    Wp_parameters.Trace.get Wp_parameters.Trace.set demon ;

  Gtk_form.check ~label:"Axioms"
    ~tooltip:"Instanciation of memory-dependent axioms (Experimental)"
    ~packing:options#pack
    Wp_parameters.Axioms.get Wp_parameters.Axioms.set demon ;

  let control = GPack.hbox ~packing () in

  Gtk_form.button ~label:"Scripts"
    ~tooltip:"Script file for saving Coq proofs"
    ~callback:wp_script ~packing:control#pack () ;

  Gtk_form.label ~text:"Timeout" ~packing:control#pack () ;
  Gtk_form.spinner ~lower:0 ~upper:100000 
    ~tooltip:"Timeout for proving one proof obligation"
    ~packing:control#pack
    Wp_parameters.Timeout.get Wp_parameters.Timeout.set demon ;

  Gtk_form.label ~text:"Process" ~packing:control#pack () ;
  Gtk_form.spinner ~lower:1 ~upper:32
    ~tooltip:"Maximum number of parallel running provers"
    ~packing:control#pack
    Wp_parameters.Procs.get Wp_parameters.Procs.set demon ;

  let progress = GRange.progress_bar ~packing ~show:false () in
  let server = Prover.server () in
  let state = ref 0 in
  Task.on_server_activity server 
    (fun () ->
       let n = Task.load server in
       if n=0 then
         ( progress#misc#hide () ; state := 0 )
       else
         begin
           if !state = 0 then progress#misc#show () ;
           if n > !state then state := n ;
           let r = !state - n in
           progress#set_text (Printf.sprintf "%d / %d" r !state) ;
           progress#set_fraction ( float r /. float !state ) ;
         end) ;

  if Wp_parameters.Prover.get () = "none" 
  then Wp_parameters.Prover.set "alt-ergo" ;

  "WP" , vbox#coerce , Some (Gtk_form.refresh demon)