diff --git a/test/dfs/Makefile b/test/dfs/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..c774d4eaaf91987cf1193955297ace1e36d45a26
--- /dev/null
+++ b/test/dfs/Makefile
@@ -0,0 +1,37 @@
+# Time-stamp: <modified the 26/03/2019 (at 14:43) by Erwan Jahier>
+
+
+test: test0 lurette0
+test0: cmxs 
+	$(sasa) -rif -l 200 g.dot -sd 
+
+cmxs: p.cmxs root.cmxs g.lut
+
+sim2chrogtk: g.rif
+	sim2chrogtk -ecran -in $< > /dev/null
+
+gnuplot: g.rif 
+	gnuplot-rif $< 
+
+
+lurette0:cmxs
+	lurette -o lurette.rif  \
+      -env "$(sasa) g.dot -custd -rif" \
+      -sut "lutin g.lut -n distributed"
+
+lurette: lurette0
+	sim2chrogtk -ecran -in lurette.rif > /dev/null
+	gnuplot-rif lurette.rif
+
+rdbg: cmxs g.lut
+	rdbg 
+
+rdbg0: cmxs g.lut
+	rdbg -o lurette.rif  \
+      -env "$(sasa) g.dot -custd -rif" \
+      -sut-nd "lutin g.lut -n distributed"
+
+
+
+-include ../Makefile.inc
+
diff --git a/test/dfs/g.dot b/test/dfs/g.dot
new file mode 100644
index 0000000000000000000000000000000000000000..15d310ced3824e4d7209ac9f1f704d9a48a78a64
--- /dev/null
+++ b/test/dfs/g.dot
@@ -0,0 +1,18 @@
+graph  {
+
+ p1 [algo="p.cmxs"]
+ p2 [algo="p.cmxs"]
+ p3 [algo="root.cmxs"]
+ p4 [algo="p.cmxs"]
+ p5 [algo="p.cmxs"]
+ p6 [algo="p.cmxs"]
+ p7 [algo="p.cmxs"]
+ p8 [algo="p.cmxs"]
+ p9 [algo="p.cmxs"]
+ p10 [algo="p.cmxs"]
+
+ p1 -- p2 -- p3 -- p4 
+ p2 -- p4 -- p5 --p2
+ p3 -- p6 -- p7 -- p8 -- p9 -- p10 --p6
+
+}
diff --git a/test/dfs/p.ml b/test/dfs/p.ml
new file mode 100644
index 0000000000000000000000000000000000000000..1c49e6d6efdced5a9f0dba5faa3eb5be06d37b3a
--- /dev/null
+++ b/test/dfs/p.ml
@@ -0,0 +1,113 @@
+(* Time-stamp: <modified the 27/03/2019 (at 17:11) by Erwan Jahier> *)
+
+(* cf Collin-Dolex-94 *)
+
+open Algo
+
+let delta=10
+let vars = ["path",(At (It,delta)); "par",Nt]
+let actions = ["a"]
+
+let (init_vars: neighbor list -> local_env) =
+  fun nl -> function
+  | "path" -> A (Array.make delta (I (-1)))
+  | "par" -> N (try Random.int ((List.length nl)) with _ -> assert false)
+  | _ -> raise Not_found
+    
+(* casting *)
+let i v = match v with I i | N i -> i | _ -> assert false
+let (a:value -> value array) = function A a -> a | _ -> assert false
+
+let str_of_array a =
+  let l = List.map Algo.value_to_string (Array.to_list a) in
+  "["^(String.concat "," l)^"]"
+
+let min_path al =
+      match al with
+      |  [] -> assert false
+      | x::t -> List.fold_left min x t
+
+let (get_paths: neighbor list -> local_env -> value array list) =
+  fun nl e ->
+    List.mapi (fun alpha_i n -> a (n.lenv "path")) nl 
+
+let (enable_f:neighbor list -> local_env -> action list) =
+  fun _nl _e -> ["a"]
+
+
+(* The index of the first negative elt in a starting from i. returns
+   the size of the a if none is found *)
+let rec end_of_a a i =
+  if i=delta then delta else
+  if a.(i) < I 0 then i else end_of_a a (i+1) 
+    
+    
+(* concat and truncate *)
+let (concat_path : value array -> int -> value array) =
+  fun a alpha ->
+    let s = Array.length a in
+    let a = Array.copy a in (* ouch! *)
+    let last = end_of_a a 1 in
+    if last=s then (
+      for i = 1 to s-1 do
+        a.(i-1) <- a.(i)
+      done;
+      a.(s-1) <- I alpha
+    )
+    else
+      a.(last) <- I alpha;
+    a
+
+let equals_up_to p1 p2 i =
+  let res = ref true in
+  for j = 0 to i do
+    res := !res && p1.(j) = p2.(j) ;
+  done;
+  !res
+
+let (get_parent : neighbor list -> value array -> value) =
+  fun nl p ->
+    (* The parent of a process p in the neighbor which path is a
+       subpath of p *)
+    let last_p = end_of_a p 1 in
+    let paths = List.mapi (fun i n -> a (n.lenv "path"), i) nl in
+    let _,parent =
+      match 
+        List.find_opt
+          (fun (npath,_) ->
+             let last_n = end_of_a npath 1 in
+             last_n = last_p-1 && equals_up_to npath p (last_n-1)
+          )
+          paths
+      with
+        Some p -> p
+      | None -> [||],(-1) (* may happen before convergence *)
+    in
+    N parent
+    
+
+let (step_f : neighbor list -> local_env -> action -> local_env) =
+  fun nl e -> 
+    function
+    | "a" ->
+      let paths = get_paths nl e in
+      let paths = List.map2 (fun p n -> concat_path p (n.reply ())) paths nl in
+
+      let path = min_path paths in
+      (
+        function
+        | "path" -> A path
+        | "par"  -> get_parent nl path
+        | o -> e o
+      )
+    | _ -> assert false
+
+let () =
+  let algo_id = "p" in
+  Algo.reg_vars      algo_id vars;
+  Algo.reg_init_vars algo_id init_vars; 
+  Algo.reg_enable    algo_id enable_f;
+  Algo.reg_step      algo_id step_f;
+  Algo.reg_actions   algo_id actions;
+  ()
+
diff --git a/test/dfs/rdbg-session.ml b/test/dfs/rdbg-session.ml
index e6de3d89e15293e25796ed5abe27859d2a7237b7..127d8b94e17a905d3e0da014d00ef08f477d13f6 100644
--- a/test/dfs/rdbg-session.ml
+++ b/test/dfs/rdbg-session.ml
@@ -14,7 +14,7 @@ open Data;;
 #require "lutin";;
 
 let plugin_0 = 
-  let args = ["lutin";"g.lut";"-n";"distributed"] in
+  let args = ["lutin";"g.lut";"-n";"synchronous"] in
   let aargs = Array.of_list args in
   let plugin = LutinRun.make aargs in
   let skip_dbg sl e cont = cont (plugin.step sl) e in
@@ -22,7 +22,7 @@ let plugin_0 =
 ;;
 
 let plugin_1 = 
-  let plugin = StdioRun.make "../../_build/install/default/bin/sasa -seed 42 g.dot -custd -rif" in
+  let plugin = StdioRun.make "../../_build/install/default/bin/sasa -l 1000 -vl 1 -seed 42 g.dot -custd -rif" in
   plugin
 ;;
 let _ = args.suts <- [Ocaml(plugin_0)];;
@@ -33,7 +33,7 @@ let _ =
  args.display_gnuplot <- false;
  args.display_sim2chro <- false;
  args.rdbg <- true;
- args.step_nb <- 100;
+ args.step_nb <- 1000;
  args.output <- "g.rif";
  args.cov_file <- "lurette.cov";
  args.stop_on_oracle_error <- true;
@@ -55,7 +55,21 @@ let _ = print_string "
 
 let dotfile = "g.dot";;
 let p = Topology.read dotfile;;
-let d () = print_dot p dotfile !e;;
+let d () = dot p dotfile !e;;
+let ne () = neato p dotfile !e;;
+let tw () = twopi p dotfile !e;;
+let ci () = circo p dotfile !e;;
+let fd () = fdp p dotfile !e;;
+let sf () = sfdp p dotfile !e;;
+let pa () = patchwork p dotfile !e;;
+let os () = osage p dotfile !e;;
+
+
 let sd () = s();d();;
-let nr () = e:=next_round p.nodes dotfile !e; d();;
+let nr () = e:=next_round p.nodes dotfile !e; osage p dotfile !e;;
 let _ = n (); d (); ignore (Sys.command ("zathura sasa-g.dot.pdf&"))
+
+(* Convergence is reached when data does not change *)
+let rec go () =
+  let data = !e.data in
+  s(); if data = !e.data then ci () else go () ;;
diff --git a/test/dfs/root.ml b/test/dfs/root.ml
new file mode 100644
index 0000000000000000000000000000000000000000..6f05433143dfb539541897f2935b6e8c13cc63df
--- /dev/null
+++ b/test/dfs/root.ml
@@ -0,0 +1,43 @@
+(* Time-stamp: <modified the 27/03/2019 (at 09:53) by Erwan Jahier> *)
+
+(* cf Collin-Dolex-94 *)
+
+open Algo
+
+let delta=10
+let vars = ["path",(At (It,delta)) ]
+let actions = ["a"]
+
+let (init_vars: neighbor list -> local_env) =
+  fun nl -> function
+  | "path" -> A (Array.make delta (I (-1)))
+  | "par" -> N (try Random.int ((List.length nl)) with _ -> assert false)
+  | _ -> raise Not_found
+    
+(* casting *)
+let i v = match v with I i | N i -> i | _ -> assert false
+
+
+let (enable_f:neighbor list -> local_env -> action list) =
+  fun _nl _e -> ["a"]
+
+   
+let (step_f : neighbor list -> local_env -> action -> local_env) =
+  fun nl e -> 
+    function
+    | "a" -> (
+        function
+        | "path" -> A (Array.make delta (I (-1)))
+        | o -> e o
+      )
+    | _ -> assert false
+
+let () =
+  let algo_id = "root" in
+  Algo.reg_vars      algo_id vars;
+  Algo.reg_init_vars algo_id init_vars; 
+  Algo.reg_enable    algo_id enable_f;
+  Algo.reg_step      algo_id step_f;
+  Algo.reg_actions   algo_id actions;
+  ()
+