diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..e9a773aee49ae7430dff88d0976a321363e6d4b9
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,15 @@
+
+*.tmp
+*~
+*.bak
+_build
+*.vo
+*.vd
+*.glob
+\#*\#
+*.native
+
+# /src/util/
+/src/util/config.ml
+/src/util/rc.ml
+
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..e48aaad258e52627806cf0c09f126acf9b221412
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,13 @@
+
+
+.PHONY: tests tests.native
+
+all: tests
+
+tests.native:
+	ocamlbuild tests/tests.native -I src -I src/util -package oUnit
+
+SEEDTEST=1 2 3 4 5 6 7
+
+tests: tests.native
+	./tests.native
diff --git a/src/egraph_simple.ml b/src/egraph_simple.ml
index 1fcc2998f0e8312f37660d8bb3339e1427154d29..c482deefda75fc2580422af7be3307469d0f3e3f 100644
--- a/src/egraph_simple.ml
+++ b/src/egraph_simple.ml
@@ -20,6 +20,8 @@ let set_shuffle = function
   | None -> opt_shuffle := None
   | Some i -> opt_shuffle := Some (Random.State.make i)
 
+let is_shuffle () = !opt_shuffle <> None
+
 let shuffle ((t1,t2) as p) =
   match !opt_shuffle with
   | None -> p
@@ -55,9 +57,6 @@ let is_added env t = Term.S.mem t env.added
 
 (** Return the successors of a node *)
 let use env t =
-  assert (is_added env t);
-  (** It's just impossible that the result is not empty if the node
-      has never be added, so something is going on *)
   assert (Term.equal (repr env t) t);
   (** Strange if it's used not with a representative *)
   Term.M.find_def Term.S.empty t env.use
@@ -133,7 +132,7 @@ let rec equal_aux queue env t1 t2 =
     let parent = repr env parent in
     let parent',env = normalize env parent' in
     (** choose which one becomes representants p1 -> p2 *)
-      if not (is_added env parent') then
+    let p1,p2 = if not (is_added env parent') then
         begin
           (** we choose parent' -> parent since parent' is a node not added
               we need to use only representant that have been added
@@ -143,14 +142,16 @@ let rec equal_aux queue env t1 t2 =
           Debug.dprintf debug
             "[EGraph] @[@[%a@] !->@ @[%a@]@]@."
             Term.print parent' Term.print parent;
-          {env with repr = Term.M.add parent' parent env.repr}
+          parent', parent
         end
       else
         begin
-          let p1, p2 = shuffle (parent, parent') in
-          if p1 != p2 then Queue.push (p1,p2) queue;
-          env
-        end in
+          shuffle (parent, parent')
+        end
+    in
+    if p1 != p2 then Queue.push (p1,p2) queue;
+    env
+  in
   let env = Term.S.fold fold use1 env in
   if Queue.is_empty queue then env
   else
diff --git a/src/egraph_simple.mli b/src/egraph_simple.mli
index 51c57bad9d80abf076f9db5349dff0a9ccbaadce..a955ecae67ca7b68a8c1f93e89ef8d47d546d07b 100644
--- a/src/egraph_simple.mli
+++ b/src/egraph_simple.mli
@@ -1,6 +1,7 @@
 val debug: Debug.flag
 
 val set_shuffle: int array option -> unit
+val is_shuffle: unit -> bool
 
 type env
 
diff --git a/tests/tests.ml b/tests/tests.ml
new file mode 100644
index 0000000000000000000000000000000000000000..e05bc3da38659a16b2abb4253543c92c86252025
--- /dev/null
+++ b/tests/tests.ml
@@ -0,0 +1,28 @@
+open OUnit
+
+let opt_seed = ref 0
+
+let print_seed fmt = function
+  | None -> Format.fprintf fmt "No"
+  | Some [|i|] -> Format.fprintf fmt "%i" i
+  | _ -> assert false
+
+let rec make_tests acc seed =
+  let module Uf = Tests_uf.Tests(Egraph_simple) in
+  let test = ((Pp.sprintf "seed %a" print_seed seed) >::: [Uf.tests]) in
+  let test = test_decorate
+    (fun f -> (fun () -> Egraph_simple.set_shuffle seed; f ())) test in
+  test::acc
+
+let tests =
+  let l = Util.foldi (fun acc i -> make_tests acc (Some [|i|])) []
+    (!opt_seed + 1) (!opt_seed + 10)in
+  make_tests l None
+
+let _ =
+  run_test_tt_main
+    ~set_verbose:(fun _ -> Debug.Args.set_flags_selected () )
+    ~arg_specs:["--seed",Arg.Set_int opt_seed,
+                " Base seed used for shuffling the arbitrary decision";
+                Debug.Args.desc_debug]
+    (TestList tests)
diff --git a/src/test.ml b/tests/tests_uf.ml
similarity index 85%
rename from src/test.ml
rename to tests/tests_uf.ml
index 937bfbfe0374e20afe4fdd2f02732f9ea8ab9a37..4328a45a774a045dbebadf3d56a85a494abae62e 100644
--- a/src/test.ml
+++ b/tests/tests_uf.ml
@@ -7,8 +7,8 @@ let a = Term.cst "a"
 let b = Term.cst "b"
 let c = Term.cst "c"
 
-open Egraph_simple
-
+module Tests(E: module type of Egraph_simple) = struct
+open E
 let env = empty_env
 
 let a,env = add env a
@@ -50,11 +50,8 @@ let bigger () =
   let rec bf n = if n < 1 then a else (Term.app f (bf (n-1))) in
   let fffa, env = add env (bf 3) in
   let fffffa, env = add env (bf 5) in
-  exportdot "bigger_1.dot" env;
   let env = equal env a fffa in
-  exportdot "bigger_2.dot" env;
   let env = equal env fffffa a in
-  exportdot "bigger_3.dot" env;
   assert_bool "a = f(f(f(a))) => f(f(f(f(f(a))))) = a => f(a) = a"
     (is_equal env fa a)
 
@@ -80,13 +77,7 @@ let _2level () =
 let congru2 = "congru 2 args" >::: ["refl" >:: refl; "congru" >:: congru;
                                     "2level" >:: _2level;]
 
-let test = TestList [basic;congru1;congru2]
+let tests = TestList [basic;congru1;congru2]
 
-let _ =
-  run_test_tt_main
-    ~set_verbose:(fun _ -> Debug.Args.set_flags_selected () )
-    ~arg_specs:["--seed",Arg.Int (fun i -> set_shuffle (Some [|i|])),
-                " Seed used for shuffling the arbitrary decision";
-                Debug.Args.desc_debug]
-    test
+end