diff --git a/Makefile.in b/Makefile.in
index af92aec5f28b6b0efe1675734b2c61558ae9dffe..6fe109bbeec33ba6df4804cc6a61c79967037fd1 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -822,9 +822,10 @@ install_local:: bin/why3webserver
 ###############
 
 SESSION_FILES = why3session_lib why3session_info \
+		why3session_html \
 		why3session_main
 # TODO: why3session_copy why3session_rm why3session_csv why3session_run
-#       why3session_latex why3session_html  why3session_output
+#       why3session_latex  why3session_output
 
 SESSIONMODULES = $(addprefix src/why3session/, $(SESSION_FILES))
 
diff --git a/examples/dijkstra/why3session.xml b/examples/dijkstra/why3session.xml
index e824d7cd7e53d47ee53df7dd5093ee4c1632b67f..e9054b7f20c9be16119955e4ed5ac4e9f2ec317e 100644
--- a/examples/dijkstra/why3session.xml
+++ b/examples/dijkstra/why3session.xml
@@ -3,69 +3,69 @@
 "http://why3.lri.fr/why3session.dtd">
 <why3session shape_version="4">
 <prover id="0" name="CVC4" version="1.4" timelimit="1" steplimit="0" memlimit="1000"/>
-<prover id="1" name="CVC4" version="1.5-prerelease" timelimit="5" steplimit="0" memlimit="0"/>
+<prover id="1" name="CVC4" version="1.5-prerelease" timelimit="2" steplimit="0" memlimit="0"/>
 <prover id="2" name="Alt-Ergo" version="1.30" timelimit="2" steplimit="0" memlimit="1000"/>
-<prover id="3" name="Z3" version="4.5.0" timelimit="10" steplimit="0" memlimit="4000"/>
-<prover id="4" name="Z3" version="3.2" timelimit="5" steplimit="0" memlimit="1000"/>
-<prover id="5" name="Z3" version="4.4.1" timelimit="10" steplimit="0" memlimit="4000"/>
-<file name="../dijkstra.mlw">
-<theory name="DijkstraShortestPath" sum="6f8a056406b11e82a41224586d40a6e4">
- <goal name="WP_parameter relax">
+<prover id="3" name="Z3" version="3.2" timelimit="5" steplimit="0" memlimit="1000"/>
+<prover id="4" name="Z3" version="4.5.0" timelimit="10" steplimit="0" memlimit="4000"/>
+<prover id="5" name="Z3" version="4.4.1" timelimit="1" steplimit="0" memlimit="1000"/>
+<file name="../dijkstra.mlw" proved="true">
+<theory name="DijkstraShortestPath" proved="true" sum="97357c5fd333273c2b5e098cc1dbad40">
+ <goal name="WP_parameter relax" expl="VC for relax" proved="true">
  <proof prover="2"><result status="valid" time="0.01" steps="11"/></proof>
  </goal>
- <goal name="Length_nonneg">
- <transf name="induction_pr" >
-  <goal name="Length_nonneg.0">
+ <goal name="Length_nonneg" proved="true">
+ <transf name="induction_pr"  proved="true">
+  <goal name="Length_nonneg.0" proved="true">
   <proof prover="2"><result status="valid" time="0.00" steps="4"/></proof>
   </goal>
-  <goal name="Length_nonneg.1">
+  <goal name="Length_nonneg.1" proved="true">
   <proof prover="0"><result status="valid" time="0.02"/></proof>
   </goal>
  </transf>
  </goal>
- <goal name="Path_inversion">
+ <goal name="Path_inversion" proved="true">
  <proof prover="2"><result status="valid" time="0.01" steps="9"/></proof>
  </goal>
- <goal name="Path_shortest_path">
- <transf name="introduce_premises" >
-  <goal name="Path_shortest_path.0">
-  <transf name="induction" arg1="d" arg2="0">
-   <goal name="Path_shortest_path.0.0">
-   <proof prover="5" timelimit="1" memlimit="1000"><result status="valid" time="0.04"/></proof>
+ <goal name="Path_shortest_path" proved="true">
+ <transf name="introduce_premises"  proved="true">
+  <goal name="Path_shortest_path.0" proved="true">
+  <transf name="induction"  proved="true"arg1="d" arg2="0">
+   <goal name="Path_shortest_path.0.0" proved="true">
+   <proof prover="5"><result status="valid" time="0.04"/></proof>
    </goal>
-   <goal name="Path_shortest_path.0.1">
+   <goal name="Path_shortest_path.0.1" proved="true">
    <proof prover="2"><result status="valid" time="0.01" steps="6"/></proof>
    </goal>
   </transf>
   </goal>
  </transf>
  </goal>
- <goal name="Main_lemma">
+ <goal name="Main_lemma" proved="true">
  <proof prover="2"><result status="valid" time="0.04" steps="173"/></proof>
  </goal>
- <goal name="Completeness_lemma">
- <transf name="induction_pr" >
-  <goal name="Completeness_lemma.0">
+ <goal name="Completeness_lemma" proved="true">
+ <transf name="induction_pr"  proved="true">
+  <goal name="Completeness_lemma.0" proved="true">
   <proof prover="2"><result status="valid" time="0.00" steps="5"/></proof>
   </goal>
-  <goal name="Completeness_lemma.1">
+  <goal name="Completeness_lemma.1" proved="true">
   <proof prover="0"><result status="valid" time="0.04"/></proof>
   </goal>
  </transf>
  </goal>
- <goal name="inside_or_exit">
- <transf name="induction_pr" >
-  <goal name="inside_or_exit.0">
+ <goal name="inside_or_exit" proved="true">
+ <transf name="induction_pr"  proved="true">
+  <goal name="inside_or_exit.0" proved="true">
   <proof prover="2"><result status="valid" time="0.01" steps="5"/></proof>
   </goal>
-  <goal name="inside_or_exit.1">
-  <transf name="introduce_premises" >
-   <goal name="inside_or_exit.1.0">
-   <transf name="case" arg1="(mem z s)">
-    <goal name="inside_or_exit.1.0.0">
+  <goal name="inside_or_exit.1" proved="true">
+  <transf name="introduce_premises"  proved="true">
+   <goal name="inside_or_exit.1.0" proved="true">
+   <transf name="case"  proved="true"arg1="(mem z s)">
+    <goal name="inside_or_exit.1.0.0" proved="true">
     <proof prover="2"><result status="valid" time="0.01" steps="8"/></proof>
     </goal>
-    <goal name="inside_or_exit.1.0.1">
+    <goal name="inside_or_exit.1.0.1" proved="true">
     <proof prover="0"><result status="valid" time="0.06"/></proof>
     </goal>
    </transf>
@@ -74,141 +74,129 @@
   </goal>
  </transf>
  </goal>
- <goal name="WP_parameter shortest_path_code">
- <transf name="split_goal_wp" >
-  <goal name="WP_parameter shortest_path_code.0">
+ <goal name="WP_parameter shortest_path_code" expl="VC for shortest_path_code" proved="true">
+ <transf name="split_goal_wp"  proved="true">
+  <goal name="WP_parameter shortest_path_code.0" expl="loop invariant init" proved="true">
   <proof prover="2"><result status="valid" time="0.04" steps="164"/></proof>
   </goal>
-  <goal name="WP_parameter shortest_path_code.1">
+  <goal name="WP_parameter shortest_path_code.1" expl="loop invariant init" proved="true">
   <proof prover="2"><result status="valid" time="0.01" steps="11"/></proof>
   </goal>
-  <goal name="WP_parameter shortest_path_code.2">
+  <goal name="WP_parameter shortest_path_code.2" expl="loop invariant init" proved="true">
   <proof prover="2"><result status="valid" time="0.02" steps="35"/></proof>
   </goal>
-  <goal name="WP_parameter shortest_path_code.3">
-  <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.03"/></proof>
+  <goal name="WP_parameter shortest_path_code.3" expl="precondition" proved="true">
+  <proof prover="4" timelimit="1" memlimit="1000"><result status="valid" time="0.03"/></proof>
   </goal>
-  <goal name="WP_parameter shortest_path_code.4">
+  <goal name="WP_parameter shortest_path_code.4" expl="assertion" proved="true">
   <proof prover="2"><result status="valid" time="0.02" steps="86"/></proof>
   </goal>
-  <goal name="WP_parameter shortest_path_code.5">
+  <goal name="WP_parameter shortest_path_code.5" expl="loop invariant init" proved="true">
   <proof prover="2"><result status="valid" time="0.01" steps="15"/></proof>
   </goal>
-  <goal name="WP_parameter shortest_path_code.6">
-  <transf name="inline_goal" >
-   <goal name="WP_parameter shortest_path_code.6.0">
-   <transf name="split_goal_wp" >
-    <goal name="WP_parameter shortest_path_code.6.0.0">
+  <goal name="WP_parameter shortest_path_code.6" expl="loop invariant init" proved="true">
+  <transf name="inline_goal"  proved="true">
+   <goal name="WP_parameter shortest_path_code.6.0" expl="loop invariant init" proved="true">
+   <transf name="split_goal_wp"  proved="true">
+    <goal name="WP_parameter shortest_path_code.6.0.0" expl="VC for shortest_path_code" proved="true">
     <proof prover="2"><result status="valid" time="0.01" steps="26"/></proof>
     </goal>
-    <goal name="WP_parameter shortest_path_code.6.0.1">
+    <goal name="WP_parameter shortest_path_code.6.0.1" expl="VC for shortest_path_code" proved="true">
     <proof prover="2"><result status="valid" time="0.01" steps="16"/></proof>
     </goal>
-    <goal name="WP_parameter shortest_path_code.6.0.2">
+    <goal name="WP_parameter shortest_path_code.6.0.2" expl="VC for shortest_path_code" proved="true">
     <proof prover="2"><result status="valid" time="0.00" steps="26"/></proof>
     </goal>
-    <goal name="WP_parameter shortest_path_code.6.0.3">
+    <goal name="WP_parameter shortest_path_code.6.0.3" expl="VC for shortest_path_code" proved="true">
     <proof prover="2"><result status="valid" time="0.01" steps="24"/></proof>
     </goal>
-    <goal name="WP_parameter shortest_path_code.6.0.4">
+    <goal name="WP_parameter shortest_path_code.6.0.4" expl="VC for shortest_path_code" proved="true">
     <proof prover="2"><result status="valid" time="0.02" steps="65"/></proof>
     </goal>
-    <goal name="WP_parameter shortest_path_code.6.0.5">
+    <goal name="WP_parameter shortest_path_code.6.0.5" expl="VC for shortest_path_code" proved="true">
     <proof prover="2"><result status="valid" time="0.05" steps="263"/></proof>
     </goal>
-    <goal name="WP_parameter shortest_path_code.6.0.6">
+    <goal name="WP_parameter shortest_path_code.6.0.6" expl="VC for shortest_path_code" proved="true">
     <proof prover="2"><result status="valid" time="0.02" steps="33"/></proof>
     </goal>
    </transf>
    </goal>
   </transf>
   </goal>
-  <goal name="WP_parameter shortest_path_code.7">
-  <transf name="split_goal_wp" >
-   <goal name="WP_parameter shortest_path_code.7.0">
+  <goal name="WP_parameter shortest_path_code.7" expl="loop invariant init" proved="true">
+  <transf name="split_goal_wp"  proved="true">
+   <goal name="WP_parameter shortest_path_code.7.0" expl="loop invariant init" proved="true">
    <proof prover="2"><result status="valid" time="0.03" steps="110"/></proof>
    </goal>
   </transf>
   </goal>
-  <goal name="WP_parameter shortest_path_code.8">
+  <goal name="WP_parameter shortest_path_code.8" expl="precondition" proved="true">
   <proof prover="2"><result status="valid" time="0.01" steps="19"/></proof>
   </goal>
-  <goal name="WP_parameter shortest_path_code.9">
-  <proof prover="4"><result status="valid" time="0.18"/></proof>
+  <goal name="WP_parameter shortest_path_code.9" expl="assertion" proved="true">
+  <proof prover="3"><result status="valid" time="0.18"/></proof>
   </goal>
-  <goal name="WP_parameter shortest_path_code.10">
+  <goal name="WP_parameter shortest_path_code.10" expl="loop invariant preservation" proved="true">
   <proof prover="2"><result status="valid" time="0.01" steps="40"/></proof>
   </goal>
-  <goal name="WP_parameter shortest_path_code.11">
-  <transf name="inline_goal" >
-   <goal name="WP_parameter shortest_path_code.11.0">
-   <transf name="split_goal_wp" >
-    <goal name="WP_parameter shortest_path_code.11.0.0">
+  <goal name="WP_parameter shortest_path_code.11" expl="loop invariant preservation" proved="true">
+  <transf name="inline_goal"  proved="true">
+   <goal name="WP_parameter shortest_path_code.11.0" expl="loop invariant preservation" proved="true">
+   <transf name="split_goal_wp"  proved="true">
+    <goal name="WP_parameter shortest_path_code.11.0.0" expl="VC for shortest_path_code" proved="true">
     <proof prover="2"><result status="valid" time="0.02" steps="64"/></proof>
     </goal>
-    <goal name="WP_parameter shortest_path_code.11.0.1">
+    <goal name="WP_parameter shortest_path_code.11.0.1" expl="VC for shortest_path_code" proved="true">
     <proof prover="0" timelimit="10" memlimit="4000"><result status="valid" time="2.39"/></proof>
     </goal>
-    <goal name="WP_parameter shortest_path_code.11.0.2">
+    <goal name="WP_parameter shortest_path_code.11.0.2" expl="VC for shortest_path_code" proved="true">
     <proof prover="2"><result status="valid" time="0.01" steps="25"/></proof>
     </goal>
-    <goal name="WP_parameter shortest_path_code.11.0.3">
-    <proof prover="0"><result status="unknown" time="1.28"/></proof>
-    <proof prover="2" timelimit="1"><result status="timeout" time="0.99"/></proof>
-    <proof prover="3"><result status="valid" time="7.45"/></proof>
-    <proof prover="5"><result status="timeout" time="10.00"/></proof>
+    <goal name="WP_parameter shortest_path_code.11.0.3" expl="VC for shortest_path_code" proved="true">
+    <proof prover="4"><result status="valid" time="7.45"/></proof>
     </goal>
-    <goal name="WP_parameter shortest_path_code.11.0.4">
+    <goal name="WP_parameter shortest_path_code.11.0.4" expl="VC for shortest_path_code" proved="true">
     <proof prover="2"><result status="valid" time="0.05" steps="191"/></proof>
     </goal>
-    <goal name="WP_parameter shortest_path_code.11.0.5">
+    <goal name="WP_parameter shortest_path_code.11.0.5" expl="VC for shortest_path_code" proved="true">
     <proof prover="2"><result status="valid" time="0.17" steps="495"/></proof>
     </goal>
-    <goal name="WP_parameter shortest_path_code.11.0.6">
-    <transf name="introduce_premises" >
-     <goal name="WP_parameter shortest_path_code.11.0.6.0">
-     <transf name="destruct" arg1="H22">
-      <goal name="WP_parameter shortest_path_code.11.0.6.0.0">
+    <goal name="WP_parameter shortest_path_code.11.0.6" expl="VC for shortest_path_code" proved="true">
+    <transf name="introduce_premises"  proved="true">
+     <goal name="WP_parameter shortest_path_code.11.0.6.0" expl="VC for shortest_path_code" proved="true">
+     <transf name="destruct"  proved="true"arg1="H22">
+      <goal name="WP_parameter shortest_path_code.11.0.6.0.0" expl="VC for shortest_path_code" proved="true">
       <proof prover="2"><result status="valid" time="0.03" steps="57"/></proof>
       </goal>
-      <goal name="WP_parameter shortest_path_code.11.0.6.0.1">
-      <transf name="destruct" arg1="H">
-       <goal name="WP_parameter shortest_path_code.11.0.6.0.1.0">
+      <goal name="WP_parameter shortest_path_code.11.0.6.0.1" expl="VC for shortest_path_code" proved="true">
+      <transf name="destruct"  proved="true"arg1="H">
+       <goal name="WP_parameter shortest_path_code.11.0.6.0.1.0" expl="VC for shortest_path_code" proved="true">
        <proof prover="2"><result status="valid" time="0.02" steps="58"/></proof>
        </goal>
-       <goal name="WP_parameter shortest_path_code.11.0.6.0.1.1">
-       <transf name="destruct" arg1="H">
-        <goal name="WP_parameter shortest_path_code.11.0.6.0.1.1.0">
-        <transf name="destruct" arg1="H23">
-         <goal name="WP_parameter shortest_path_code.11.0.6.0.1.1.0.0">
+       <goal name="WP_parameter shortest_path_code.11.0.6.0.1.1" expl="VC for shortest_path_code" proved="true">
+       <transf name="destruct"  proved="true"arg1="H">
+        <goal name="WP_parameter shortest_path_code.11.0.6.0.1.1.0" expl="VC for shortest_path_code" proved="true">
+        <transf name="destruct"  proved="true"arg1="H23">
+         <goal name="WP_parameter shortest_path_code.11.0.6.0.1.1.0.0" expl="VC for shortest_path_code" proved="true">
          <proof prover="2"><result status="valid" time="0.01" steps="30"/></proof>
          </goal>
-         <goal name="WP_parameter shortest_path_code.11.0.6.0.1.1.0.1">
-         <transf name="destruct" arg1="H12">
-          <goal name="WP_parameter shortest_path_code.11.0.6.0.1.1.0.1.0">
-          <transf name="case" arg1="(v = v1)">
-           <goal name="WP_parameter shortest_path_code.11.0.6.0.1.1.0.1.0.0">
+         <goal name="WP_parameter shortest_path_code.11.0.6.0.1.1.0.1" expl="VC for shortest_path_code" proved="true">
+         <transf name="destruct"  proved="true"arg1="H12">
+          <goal name="WP_parameter shortest_path_code.11.0.6.0.1.1.0.1.0" expl="VC for shortest_path_code" proved="true">
+          <transf name="case"  proved="true"arg1="(v = v1)">
+           <goal name="WP_parameter shortest_path_code.11.0.6.0.1.1.0.1.0.0" expl="VC for shortest_path_code" proved="true">
            <proof prover="2"><result status="valid" time="1.03" steps="1298"/></proof>
            </goal>
-           <goal name="WP_parameter shortest_path_code.11.0.6.0.1.1.0.1.0.1">
+           <goal name="WP_parameter shortest_path_code.11.0.6.0.1.1.0.1.0.1" expl="VC for shortest_path_code" proved="true">
            <proof prover="2"><result status="valid" time="0.02" steps="59"/></proof>
            </goal>
           </transf>
-          <transf name="destruct" arg1="H3">
-           <goal name="WP_parameter shortest_path_code.11.0.6.0.1.1.0.1.0.0">
-           <transf name="destruct" arg1="H">
-            <goal name="WP_parameter shortest_path_code.11.0.6.0.1.1.0.1.0.0.0">
-            <proof prover="2"><result status="timeout" time="2.00"/></proof>
-            </goal>
-           </transf>
-           </goal>
-          </transf>
           </goal>
          </transf>
          </goal>
         </transf>
         </goal>
-        <goal name="WP_parameter shortest_path_code.11.0.6.0.1.1.1">
+        <goal name="WP_parameter shortest_path_code.11.0.6.0.1.1.1" expl="VC for shortest_path_code" proved="true">
         <proof prover="2"><result status="valid" time="0.85" steps="1260"/></proof>
         </goal>
        </transf>
@@ -223,19 +211,19 @@
    </goal>
   </transf>
   </goal>
-  <goal name="WP_parameter shortest_path_code.12">
-  <transf name="split_goal_wp" >
-   <goal name="WP_parameter shortest_path_code.12.0">
-   <transf name="inline_goal" >
-    <goal name="WP_parameter shortest_path_code.12.0.0">
-    <transf name="split_goal_wp" >
-     <goal name="WP_parameter shortest_path_code.12.0.0.0">
+  <goal name="WP_parameter shortest_path_code.12" expl="loop invariant preservation" proved="true">
+  <transf name="split_goal_wp"  proved="true">
+   <goal name="WP_parameter shortest_path_code.12.0" expl="loop invariant preservation" proved="true">
+   <transf name="inline_goal"  proved="true">
+    <goal name="WP_parameter shortest_path_code.12.0.0" expl="loop invariant preservation" proved="true">
+    <transf name="split_goal_wp"  proved="true">
+     <goal name="WP_parameter shortest_path_code.12.0.0.0" expl="loop invariant preservation" proved="true">
      <proof prover="0"><result status="valid" time="0.10"/></proof>
-     <proof prover="1"><undone/></proof>
+     <proof prover="1" memlimit="1000"><undone/></proof>
      </goal>
-     <goal name="WP_parameter shortest_path_code.12.0.0.1">
+     <goal name="WP_parameter shortest_path_code.12.0.0.1" expl="loop invariant preservation" proved="true">
      <proof prover="0"><result status="valid" time="0.46"/></proof>
-     <proof prover="1"><undone/></proof>
+     <proof prover="1" timelimit="5"><undone/></proof>
      </goal>
     </transf>
     </goal>
@@ -243,50 +231,50 @@
    </goal>
   </transf>
   </goal>
-  <goal name="WP_parameter shortest_path_code.13">
+  <goal name="WP_parameter shortest_path_code.13" expl="loop variant decrease" proved="true">
   <proof prover="2"><result status="valid" time="0.02" steps="59"/></proof>
   </goal>
-  <goal name="WP_parameter shortest_path_code.14">
+  <goal name="WP_parameter shortest_path_code.14" expl="loop invariant preservation" proved="true">
   <proof prover="2"><result status="valid" time="0.01" steps="19"/></proof>
   </goal>
-  <goal name="WP_parameter shortest_path_code.15">
+  <goal name="WP_parameter shortest_path_code.15" expl="loop invariant preservation" proved="true">
   <proof prover="2"><result status="valid" time="0.10" steps="291"/></proof>
   </goal>
-  <goal name="WP_parameter shortest_path_code.16">
-  <transf name="introduce_premises" >
-   <goal name="WP_parameter shortest_path_code.16.0">
-   <transf name="cut" arg1="(is_empty su)">
-    <goal name="WP_parameter shortest_path_code.16.0.0">
-    <transf name="cut" arg1="(inv_succ src visited q d)">
-     <goal name="WP_parameter shortest_path_code.16.0.0.0">
-     <transf name="cut" arg1="(mem src visited)">
-      <goal name="WP_parameter shortest_path_code.16.0.0.0.0">
-      <transf name="instantiate" arg1="inside_or_exit" arg2="visited">
-       <goal name="WP_parameter shortest_path_code.16.0.0.0.0.0">
-       <transf name="instantiate" arg1="inside_or_exit" arg2="src">
-        <goal name="WP_parameter shortest_path_code.16.0.0.0.0.0.0">
-        <transf name="instantiate" arg1="inside_or_exit" arg2="x">
-         <goal name="WP_parameter shortest_path_code.16.0.0.0.0.0.0.0">
-         <transf name="instantiate" arg1="inside_or_exit" arg2="dx">
-          <goal name="WP_parameter shortest_path_code.16.0.0.0.0.0.0.0.0">
-          <transf name="cut" arg1="(mem x visited \/ (exists y:vertex. exists z: vertex. exists dy:int. mem y visited /\ not mem z visited /\ mem z (g_succ y) /\ path src y dy /\ ((dy + weight y z) &lt;= dx)))">
-           <goal name="WP_parameter shortest_path_code.16.0.0.0.0.0.0.0.0.0">
-           <transf name="destruct" arg1="h">
-            <goal name="WP_parameter shortest_path_code.16.0.0.0.0.0.0.0.0.0.0">
+  <goal name="WP_parameter shortest_path_code.16" expl="loop invariant preservation" proved="true">
+  <transf name="introduce_premises"  proved="true">
+   <goal name="WP_parameter shortest_path_code.16.0" expl="loop invariant preservation" proved="true">
+   <transf name="cut"  proved="true"arg1="(is_empty su)">
+    <goal name="WP_parameter shortest_path_code.16.0.0" expl="loop invariant preservation" proved="true">
+    <transf name="cut"  proved="true"arg1="(inv_succ src visited q d)">
+     <goal name="WP_parameter shortest_path_code.16.0.0.0" expl="loop invariant preservation" proved="true">
+     <transf name="cut"  proved="true"arg1="(mem src visited)">
+      <goal name="WP_parameter shortest_path_code.16.0.0.0.0" expl="loop invariant preservation" proved="true">
+      <transf name="instantiate"  proved="true"arg1="inside_or_exit" arg2="visited">
+       <goal name="WP_parameter shortest_path_code.16.0.0.0.0.0" expl="loop invariant preservation" proved="true">
+       <transf name="instantiate"  proved="true"arg1="inside_or_exit" arg2="src">
+        <goal name="WP_parameter shortest_path_code.16.0.0.0.0.0.0" expl="loop invariant preservation" proved="true">
+        <transf name="instantiate"  proved="true"arg1="inside_or_exit" arg2="x">
+         <goal name="WP_parameter shortest_path_code.16.0.0.0.0.0.0.0" expl="loop invariant preservation" proved="true">
+         <transf name="instantiate"  proved="true"arg1="inside_or_exit" arg2="dx">
+          <goal name="WP_parameter shortest_path_code.16.0.0.0.0.0.0.0.0" expl="loop invariant preservation" proved="true">
+          <transf name="cut"  proved="true"arg1="(mem x visited \/ (exists y:vertex. exists z: vertex. exists dy:int. mem y visited /\ not mem z visited /\ mem z (g_succ y) /\ path src y dy /\ ((dy + weight y z) &lt;= dx)))">
+           <goal name="WP_parameter shortest_path_code.16.0.0.0.0.0.0.0.0.0" expl="loop invariant preservation" proved="true">
+           <transf name="destruct"  proved="true"arg1="h">
+            <goal name="WP_parameter shortest_path_code.16.0.0.0.0.0.0.0.0.0.0" expl="loop invariant preservation" proved="true">
             <proof prover="2"><result status="valid" time="0.01" steps="25"/></proof>
             </goal>
-            <goal name="WP_parameter shortest_path_code.16.0.0.0.0.0.0.0.0.0.1">
-            <transf name="destruct" arg1="h">
-             <goal name="WP_parameter shortest_path_code.16.0.0.0.0.0.0.0.0.0.1.0">
-             <transf name="destruct" arg1="h">
-              <goal name="WP_parameter shortest_path_code.16.0.0.0.0.0.0.0.0.0.1.0.0">
-              <transf name="destruct" arg1="h">
-               <goal name="WP_parameter shortest_path_code.16.0.0.0.0.0.0.0.0.0.1.0.0.0">
-               <transf name="cut" arg1="(mem z q)">
-                <goal name="WP_parameter shortest_path_code.16.0.0.0.0.0.0.0.0.0.1.0.0.0.0">
+            <goal name="WP_parameter shortest_path_code.16.0.0.0.0.0.0.0.0.0.1" expl="loop invariant preservation" proved="true">
+            <transf name="destruct"  proved="true"arg1="h">
+             <goal name="WP_parameter shortest_path_code.16.0.0.0.0.0.0.0.0.0.1.0" expl="loop invariant preservation" proved="true">
+             <transf name="destruct"  proved="true"arg1="h">
+              <goal name="WP_parameter shortest_path_code.16.0.0.0.0.0.0.0.0.0.1.0.0" expl="loop invariant preservation" proved="true">
+              <transf name="destruct"  proved="true"arg1="h">
+               <goal name="WP_parameter shortest_path_code.16.0.0.0.0.0.0.0.0.0.1.0.0.0" expl="loop invariant preservation" proved="true">
+               <transf name="cut"  proved="true"arg1="(mem z q)">
+                <goal name="WP_parameter shortest_path_code.16.0.0.0.0.0.0.0.0.0.1.0.0.0.0" expl="loop invariant preservation" proved="true">
                 <proof prover="2"><result status="valid" time="0.48" steps="405"/></proof>
                 </goal>
-                <goal name="WP_parameter shortest_path_code.16.0.0.0.0.0.0.0.0.0.1.0.0.0.1">
+                <goal name="WP_parameter shortest_path_code.16.0.0.0.0.0.0.0.0.0.1.0.0.0.1" proved="true">
                 <proof prover="2"><result status="valid" time="0.20" steps="355"/></proof>
                 </goal>
                </transf>
@@ -299,7 +287,7 @@
             </goal>
            </transf>
            </goal>
-           <goal name="WP_parameter shortest_path_code.16.0.0.0.0.0.0.0.0.1">
+           <goal name="WP_parameter shortest_path_code.16.0.0.0.0.0.0.0.0.1" proved="true">
            <proof prover="2"><result status="valid" time="0.01" steps="68"/></proof>
            </goal>
           </transf>
@@ -312,30 +300,30 @@
        </goal>
       </transf>
       </goal>
-      <goal name="WP_parameter shortest_path_code.16.0.0.0.1">
+      <goal name="WP_parameter shortest_path_code.16.0.0.0.1" proved="true">
       <proof prover="2"><result status="valid" time="0.01" steps="54"/></proof>
       </goal>
      </transf>
      </goal>
-     <goal name="WP_parameter shortest_path_code.16.0.0.1">
+     <goal name="WP_parameter shortest_path_code.16.0.0.1" proved="true">
      <proof prover="2"><result status="valid" time="0.09" steps="268"/></proof>
      </goal>
     </transf>
     </goal>
-    <goal name="WP_parameter shortest_path_code.16.0.1">
+    <goal name="WP_parameter shortest_path_code.16.0.1" proved="true">
     <proof prover="2"><result status="valid" time="0.00" steps="22"/></proof>
     </goal>
    </transf>
    </goal>
   </transf>
   </goal>
-  <goal name="WP_parameter shortest_path_code.17">
+  <goal name="WP_parameter shortest_path_code.17" expl="loop variant decrease" proved="true">
   <proof prover="2"><result status="valid" time="0.04" steps="122"/></proof>
   </goal>
-  <goal name="WP_parameter shortest_path_code.18">
+  <goal name="WP_parameter shortest_path_code.18" expl="postcondition" proved="true">
   <proof prover="2"><result status="valid" time="0.01" steps="22"/></proof>
   </goal>
-  <goal name="WP_parameter shortest_path_code.19">
+  <goal name="WP_parameter shortest_path_code.19" expl="postcondition" proved="true">
   <proof prover="2"><result status="valid" time="0.18" steps="353"/></proof>
   </goal>
  </transf>
diff --git a/examples/dijkstra/why3shapes.gz b/examples/dijkstra/why3shapes.gz
index 3f0597052e8d7c33a80cba57af6586d85679184f..54d021b579c17c3da590b74563fb0661424c2491 100644
Binary files a/examples/dijkstra/why3shapes.gz and b/examples/dijkstra/why3shapes.gz differ
diff --git a/src/why3session/why3session_html.ml b/src/why3session/why3session_html.ml
index c444184db1162e5142b140ed79043ee44b734d29..b5bf383c83d75fff6e1111fd18ff8a59c27ebb34 100644
--- a/src/why3session/why3session_html.ml
+++ b/src/why3session/why3session_html.ml
@@ -65,12 +65,12 @@ open Session_itp
 
 type context =
     (string ->
-     (formatter -> unit session -> unit) -> unit session
+     (formatter -> session -> unit) -> session
      -> unit, formatter, unit) format
 
 let run_file (context : context) print_session fname =
-  let project_dir = S.get_project_dir fname in
-  let session,_use_shapes = S.read_session project_dir in
+  let ses,_ = read_session fname in
+  let project_dir = get_dir ses in
   let output_dir =
     if !output_dir = "" then project_dir else !output_dir
   in
@@ -81,8 +81,8 @@ let run_file (context : context) print_session fname =
   in
   let fmt = formatter_of_out_channel cout in
   if !opt_context
-  then fprintf fmt context basename (print_session basename) session
-  else print_session basename fmt session;
+  then fprintf fmt context basename (print_session basename) ses
+  else print_session basename fmt ses;
   pp_print_flush fmt ();
   if output_dir <> "-" then close_out cout
 
@@ -91,21 +91,21 @@ module Table =
 struct
 
 
-  let rec transf_depth tr =
+  let rec transf_depth s tr =
     List.fold_left
-      (fun depth g -> max depth (goal_depth g)) 0 tr.S.transf_goals
-  and goal_depth g =
-    S.PHstr.fold
-      (fun _st tr depth -> max depth (1 + transf_depth tr))
-      (S.goal_transformations g) 1
+      (fun depth g -> max depth (goal_depth s g)) 0 (get_sub_tasks s tr)
+  and goal_depth s g =
+    List.fold_left
+      (fun depth tr -> max depth (1 + transf_depth s tr))
+      1 (get_transformations s g)
 
-  let theory_depth t =
+  let theory_depth s t =
     List.fold_left
-      (fun depth g -> max depth (goal_depth g)) 0 t.S.theory_goals
+      (fun depth g -> max depth (goal_depth s g)) 0 (theory_goals t)
 
-  let provers_stats provers theory =
-    S.theory_iter_proof_attempt (fun a ->
-      Hprover.replace provers a.S.proof_prover a.S.proof_prover) theory
+  let provers_stats s provers theory =
+    theory_iter_proof_attempt s (fun a ->
+      Hprover.replace provers a.prover a.prover) theory
 
   let print_prover = Whyconf.print_prover
 
@@ -115,16 +115,16 @@ struct
         if dark then "008000" else "C0FFC0"
       else "FF0000")
 
-let print_results fmt provers proofs =
+let print_results fmt s provers proofs =
   List.iter (fun p ->
     fprintf fmt "<td bgcolor=\"#";
     begin
       try
-        let pr = S.PHprover.find proofs p in
-        let s = pr.S.proof_state in
+        let pr = get_proof_attempt_node s (Hprover.find proofs p) in
+        let s = pr.proof_state in
         begin
           match s with
-	  | S.Done res ->
+	  | Some res ->
 	    begin
 	      match res.Call_provers.pr_answer with
 		| Call_provers.Valid ->
@@ -133,10 +133,10 @@ let print_results fmt provers proofs =
                   fprintf fmt "FF0000\">Invalid"
 		| Call_provers.Timeout ->
                   fprintf fmt "FF8000\">Timeout (%ds)"
-                    pr.S.proof_limit.Call_provers.limit_time
+                    pr.limit.Call_provers.limit_time
 		| Call_provers.OutOfMemory ->
                   fprintf fmt "FF8000\">Out Of Memory (%dM)"
-                    pr.S.proof_limit.Call_provers.limit_mem
+                    pr.limit.Call_provers.limit_mem
 		| Call_provers.StepLimitExceeded ->
                   fprintf fmt "FF8000\">Step limit exceeded"
 		| Call_provers.Unknown _ ->
@@ -146,81 +146,78 @@ let print_results fmt provers proofs =
 		| Call_provers.HighFailure ->
                   fprintf fmt "FF8000\">High Failure"
 	    end
-	  | S.InternalFailure _ -> fprintf fmt "E0E0E0\">Internal Failure"
-          | S.Interrupted -> fprintf fmt "E0E0E0\">Not yet run"
-          | S.Unedited -> fprintf fmt "E0E0E0\">Not yet edited"
-          | S.Scheduled | S.Running
-          | S.JustEdited -> assert false
+	  | None -> fprintf fmt "E0E0E0\">result missing"
         end;
         if pr.S.proof_obsolete then fprintf fmt " (obsolete)"
       with Not_found -> fprintf fmt "E0E0E0\">---"
     end;
     fprintf fmt "</td>") provers
 
-let rec num_lines acc tr =
+let rec num_lines s acc tr =
   List.fold_left
     (fun acc g -> 1 +
-      PHstr.fold (fun _ tr acc -> 1 + num_lines acc tr)
-      (goal_transformations g) acc)
-    acc tr.transf_goals
+      List.fold_left (fun acc tr -> 1 + num_lines s acc tr)
+      acc (get_transformations s g))
+    acc (get_sub_tasks s tr)
 
-  let rec print_transf fmt depth max_depth provers tr =
+  let rec print_transf fmt s depth max_depth provers tr =
     fprintf fmt "<tr>";
     for _i=1 to 0 (* depth-1 *) do fprintf fmt "<td></td>" done;
     fprintf fmt "<td bgcolor=\"#%a\" colspan=\"%d\">"
-      (color_of_status ~dark:false) (Opt.inhabited tr.S.transf_verified)
+      (color_of_status ~dark:false) (tn_proved s tr)
       (max_depth - depth + 1);
     (* for i=1 to depth-1 do fprintf fmt "&nbsp;&nbsp;&nbsp;&nbsp;" done; *)
-    fprintf fmt "%s</td>" tr.transf_name ;
+    let name = (get_transf_name s tr) ^
+                 (String.concat "" (get_transf_args s tr)) in
+    fprintf fmt "%s</td>" name ;
     for _i=1 (* depth *) to (*max_depth - 1 + *) List.length provers do
       fprintf fmt "<td bgcolor=\"#E0E0E0\"></td>"
     done;
     fprintf fmt "</tr>@\n";
-    fprintf fmt "<td rowspan=\"%d\">&nbsp;&nbsp;</td>" (num_lines 0 tr);
+    fprintf fmt "<td rowspan=\"%d\">&nbsp;&nbsp;</td>" (num_lines s 0 tr);
     let (_:bool) = List.fold_left
       (fun is_first g ->
-        print_goal fmt is_first (depth+1) max_depth provers g;
+        print_goal fmt s is_first (depth+1) max_depth provers g;
         false)
-      true tr.transf_goals
+      true (get_sub_tasks s tr)
     in ()
 
-  and print_goal fmt is_first depth max_depth provers g =
+  and print_goal fmt s is_first depth max_depth provers g =
     if not is_first then fprintf fmt "<tr>";
     (* for i=1 to 0 (\* depth-1 *\) do fprintf fmt "<td></td>" done; *)
     fprintf fmt "<td bgcolor=\"#%a\" colspan=\"%d\">"
-      (color_of_status ~dark:false) (Opt.inhabited (S.goal_verified g))
+      (color_of_status ~dark:false) (pn_proved s g)
       (max_depth - depth + 1);
     (* for i=1 to depth-1 do fprintf fmt "&nbsp;&nbsp;&nbsp;&nbsp;" done; *)
-    fprintf fmt "%s</td>" (S.goal_user_name g);
+    fprintf fmt "%s</td>" (get_proof_name s g).Ident.id_string;
 (*    for i=depth to max_depth-1 do fprintf fmt "<td></td>" done; *)
-    print_results fmt provers (goal_external_proofs g);
+    print_results fmt s provers (get_proof_attempt_ids s g);
     fprintf fmt "</tr>@\n";
-    PHstr.iter
-      (fun _ tr -> print_transf fmt depth max_depth provers tr)
-      (goal_transformations g)
+    List.iter
+      (print_transf fmt s depth max_depth provers)
+      (get_transformations s g)
 
-  let print_theory fn fmt th =
-    let depth = theory_depth th in
+  let print_theory s fn fmt th =
+    let depth = theory_depth s th in
     if depth > 0 then
     let provers = Hprover.create 9 in
-    provers_stats provers th;
+    provers_stats s provers th;
     let provers =
       Hprover.fold (fun _ pr acc -> pr :: acc) provers []
     in
     let provers = List.sort Whyconf.Prover.compare provers in
     let name =
       try
-        let (l,t,_) = Theory.restore_path th.theory_name in
+        let (l,t,_) = Theory.restore_path (theory_name th) in
         String.concat "." ([fn]@l@[t])
-      with Not_found -> fn ^ "." ^ th.theory_name.Ident.id_string
+      with Not_found -> fn ^ "." ^ (theory_name th).Ident.id_string
     in
     fprintf fmt "<h2><font color=\"#%a\">Theory \"%s\": "
-      (color_of_status ~dark:true) (Opt.inhabited th.S.theory_verified)
+      (color_of_status ~dark:true) (th_proved s th)
       name;
-    begin match th.S.theory_verified with
-    | Some t -> fprintf fmt "fully verified in %.02f s" t
-    | None -> fprintf fmt "not fully verified"
-    end;
+    if th_proved s th then
+      fprintf fmt "fully verified in %%.02f s"
+    else fprintf fmt "not fully verified";
     fprintf fmt "</font></h2>@\n";
 
     fprintf fmt "<table border=\"1\"><tr><td colspan=\"%d\">Obligations</td>" depth;
@@ -229,21 +226,21 @@ let rec num_lines acc tr =
       (fun pr -> fprintf fmt "<td text-rotation=\"90\">%a</td>" print_prover pr)
       provers;
     fprintf fmt "</td></tr>@\n";
-    List.iter (print_goal fmt true 1 depth provers) th.theory_goals;
+    List.iter (print_goal fmt s true 1 depth provers) (theory_goals th);
     fprintf fmt "</table>@\n"
 
-  let print_file fmt f =
+  let print_file s fmt f =
     (* fprintf fmt "<h1>File %s</h1>@\n" f.file_name; *)
-    let fn = Filename.basename f.file_name in
+    let fn = Filename.basename (file_name f) in
     let fn = Filename.chop_extension fn in
     fprintf fmt "%a"
-      (Pp.print_list Pp.newline (print_theory fn)) f.file_theories
+      (Pp.print_list Pp.newline (print_theory s fn)) (file_theories f)
 
   let print_session name fmt s =
     fprintf fmt "<h1>Why3 Proof Results for Project \"%s\"</h1>@\n" name;
     fprintf fmt "%a"
-      (Pp.print_iter2 PHstr.iter Pp.newline Pp.nothing Pp.nothing
-         print_file) s.session_files
+      (Pp.print_iter2 Stdlib.Hstr.iter Pp.newline Pp.nothing Pp.nothing
+         (print_file s)) (get_files s)
 
 
   let context : context = "<!DOCTYPE html\
@@ -271,47 +268,45 @@ struct
   let print_prover = Whyconf.print_prover
 
   let print_proof_status fmt = function
-    | Interrupted -> fprintf fmt "Not yet run"
-    | Unedited -> fprintf fmt "Not yet edited"
-    | JustEdited | Scheduled | Running -> assert false
-    | Done pr -> fprintf fmt "Done: %a" Call_provers.print_prover_result pr
-    | InternalFailure exn ->
-      fprintf fmt "Failure: %a"Exn_printer.exn_printer exn
-
-  let print_proof_attempt fmt pa =
+    | None -> fprintf fmt "No result"
+    | Some res -> fprintf fmt "Done: %a" Call_provers.print_prover_result res
+
+  let print_proof_attempt s fmt pa =
+    let pa = get_proof_attempt_node s pa in
     fprintf fmt "<li>%a : %a</li>"
-      print_prover pa.proof_prover
+      print_prover pa.prover
       print_proof_status pa.proof_state
 
-  let rec print_transf fmt tr =
+  let rec print_transf s fmt tr =
+    let name = (get_transf_name s tr) ^
+                 (String.concat "" (get_transf_args s tr)) in
     fprintf fmt "<li>%s : <ul>%a</ul></li>"
-      tr.transf_name
-      (Pp.print_list Pp.newline print_goal) tr.transf_goals
+      name
+      (Pp.print_list Pp.newline (print_goal s)) (get_sub_tasks s tr)
 
-  and print_goal fmt g =
+  and print_goal s fmt g =
     fprintf fmt "<li>%s : <ul>%a%a</ul></li>"
-      (goal_name g).Ident.id_string
-      (Pp.print_iter2 PHprover.iter Pp.newline Pp.nothing
-         Pp.nothing print_proof_attempt)
-      (goal_external_proofs g)
-      (Pp.print_iter2 PHstr.iter Pp.newline Pp.nothing
-         Pp.nothing print_transf)
-      (goal_transformations g)
-
-  let print_theory fmt th =
+      (get_proof_name s g).Ident.id_string
+      (Pp.print_iter2 Hprover.iter Pp.newline Pp.nothing
+         Pp.nothing (print_proof_attempt s))
+      (get_proof_attempt_ids s g)
+      (Pp.print_iter1 List.iter Pp.newline (print_transf s))
+      (get_transformations s g)
+
+  let print_theory s fmt th =
     fprintf fmt "<li>%s : <ul>%a</ul></li>"
-      th.theory_name.Ident.id_string
-      (Pp.print_list Pp.newline print_goal) th.theory_goals
+      (theory_name th).Ident.id_string
+      (Pp.print_list Pp.newline (print_goal s)) (theory_goals th)
 
-  let print_file fmt f =
+  let print_file s fmt f =
     fprintf fmt "<li>%s : <ul>%a</ul></li>"
-      f.file_name
-      (Pp.print_list Pp.newline print_theory) f.file_theories
+      (file_name f)
+      (Pp.print_list Pp.newline (print_theory s)) (file_theories f)
 
   let print_session _name fmt s =
     fprintf fmt "<ul>%a</ul>"
-      (Pp.print_iter2 PHstr.iter Pp.newline Pp.nothing Pp.nothing
-         print_file) s.session_files
+      (Pp.print_iter2 Stdlib.Hstr.iter Pp.newline Pp.nothing Pp.nothing
+         (print_file s)) (get_files s)
 
 
   let context : context = "<!DOCTYPE html\
diff --git a/src/why3session/why3session_main.ml b/src/why3session/why3session_main.ml
index 5b0f7fe9f36405ac1c119f0d0702504d0fc4b924..92d92ca1d15dfc7277a3533bcb07a2ee8c885d70 100644
--- a/src/why3session/why3session_main.ml
+++ b/src/why3session/why3session_main.ml
@@ -16,9 +16,9 @@ open Why3session_lib
 let cmds =
   [|
     Why3session_info.cmd;
+    Why3session_html.cmd;
 (*
     Why3session_latex.cmd;
-    Why3session_html.cmd;
     Why3session_csv.cmd;
     Why3session_copy.cmd_mod;
     Why3session_copy.cmd_copy;