diff --git a/nix/ocamlgraph.nix b/nix/ocamlgraph.nix
new file mode 100644
index 0000000000000000000000000000000000000000..66b1c4d3ec7ee8fbeba9cb9578d429173857e5f7
--- /dev/null
+++ b/nix/ocamlgraph.nix
@@ -0,0 +1,26 @@
+{ lib, fetchurl, buildDunePackage, stdlib-shims }:
+
+buildDunePackage rec {
+  pname = "ocamlgraph";
+  version = "2.1.0";
+
+  src = fetchurl {
+    url = "https://github.com/backtracking/ocamlgraph/releases/download/${version}/ocamlgraph-${version}.tbz";
+    sha256 = "sha256-D5YsNvklPfI5OVWvQbB0tqQmsvkqne95WyAFtX0wLWU=";
+  };
+
+  minimalOCamlVersion = "4.08";
+  useDune2 = true;
+
+  propagatedBuildInputs = [
+    stdlib-shims
+  ];
+
+  meta = with lib; {
+      homepage = "http://ocamlgraph.lri.fr/";
+      downloadPage = "https://github.com/backtracking/ocamlgraph";
+      description = "Graph library for OCaml";
+      license = licenses.gpl2Oss;
+      maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nix/pkgs.nix b/nix/pkgs.nix
index 69ec600c6a00dace82ffa98d0b4dbd1a110a69ed..25c355331580ddc8845fd3b16f76044ebbc0cd2e 100644
--- a/nix/pkgs.nix
+++ b/nix/pkgs.nix
@@ -7,6 +7,7 @@ let
     combinetura = oself.callPackage ./combinetura.nix {};
     headache = oself.callPackage ./headache.nix {};
     mlmpfr = oself.callPackage ./mlmpfr.nix {};
+    ocamlgraph = oself.callPackage ./ocamlgraph.nix {};
     why3 = oself.callPackage ./why3.nix {};
     ppx_deriving_yaml = oself.callPackage ./ppx_deriving_yaml.nix {};
 
diff --git a/opam b/opam
index 8ccaa3669bc50deb9d57482d14938f8583ffb088..8a017f19c580cdeef801414179abe04c8b876966 100644
--- a/opam
+++ b/opam
@@ -128,6 +128,7 @@ depends: [
   "menhir" { >= "20181006" & build }
   "ocaml" { >= "4.13.1" }
   "ocamlgraph" { >= "1.8.8" }
+  "ocamlgraph" { with-test & >= "2.1.0" }
   "odoc" { with-doc }
   "unionFind" { >= "20220107" }
   "why3" { >= "1.6.0" }
diff --git a/reference-configuration.md b/reference-configuration.md
index b85304514189864476d23ecbdfc24428927afdeb..e075a0d9f602417ed4aaf598b7dd5ba6dabb6d57 100644
--- a/reference-configuration.md
+++ b/reference-configuration.md
@@ -10,7 +10,7 @@ compiling Frama-C+dev.
 - lablgtk3-sourceview3.3.1.3
 - menhir.20211128
 - ocamlfind.1.9.6
-- ocamlgraph.2.0.0
+- ocamlgraph.2.1.0
 - ppx_deriving_yaml.0.2.1
 - ppx_deriving_yojson.3.7.0
 - ppx_import.1.10.0
diff --git a/src/plugins/dive/tests/dive/oracle/assigned_param.dot b/src/plugins/dive/tests/dive/oracle/assigned_param.dot
index dbf37f6f407a6e3967e6f8f52940fa21910a2279..f5833aae3a4c7c6678b775551603d1a455209682 100644
--- a/src/plugins/dive/tests/dive/oracle/assigned_param.dot
+++ b/src/plugins/dive/tests/dive/oracle/assigned_param.dot
@@ -20,4 +20,4 @@ digraph G {
   cp7 -> cp3;
   cp9 -> cp5;
   
-  }
\ No newline at end of file
+  }
diff --git a/src/plugins/dive/tests/dive/oracle/callstack_global.dot b/src/plugins/dive/tests/dive/oracle/callstack_global.dot
index 927402ef746431e2a2fddfc9e44d18404d0fcf87..ffcae6d054f55ecb535f841962d161b926ec071a 100644
--- a/src/plugins/dive/tests/dive/oracle/callstack_global.dot
+++ b/src/plugins/dive/tests/dive/oracle/callstack_global.dot
@@ -46,4 +46,4 @@ digraph G {
   cp23 -> cp19;
   cp25 -> cp21;
   
-  }
\ No newline at end of file
+  }
diff --git a/src/plugins/dive/tests/dive/oracle/callstack_strategy.dot b/src/plugins/dive/tests/dive/oracle/callstack_strategy.dot
index f343686a117e0a25a97402d5b40f0ebad3efc64f..3baccd3f7ab3f4e97a494d4db1c99ad6087390c0 100644
--- a/src/plugins/dive/tests/dive/oracle/callstack_strategy.dot
+++ b/src/plugins/dive/tests/dive/oracle/callstack_strategy.dot
@@ -42,4 +42,4 @@ digraph G {
   cp15 -> cp18;
   cp18 -> cp13;
   
-  }
\ No newline at end of file
+  }
diff --git a/src/plugins/dive/tests/dive/oracle/const.dot b/src/plugins/dive/tests/dive/oracle/const.dot
index bb67ee0a8f13e3ffdc2fa6069374d215300f5673..d359a854bc14c20ba274dbbc13390a685a60acd6 100644
--- a/src/plugins/dive/tests/dive/oracle/const.dot
+++ b/src/plugins/dive/tests/dive/oracle/const.dot
@@ -27,4 +27,4 @@ digraph G {
   cp13 -> cp9;
   cp13 -> cp11;
   
-  }
\ No newline at end of file
+  }
diff --git a/src/plugins/dive/tests/dive/oracle/exceptional.dot b/src/plugins/dive/tests/dive/oracle/exceptional.dot
index b2e11483ced54ea2c35fe6c937654d0f7e265213..55e15cd1c72df4493609c7482f0f25fd0650264e 100644
--- a/src/plugins/dive/tests/dive/oracle/exceptional.dot
+++ b/src/plugins/dive/tests/dive/oracle/exceptional.dot
@@ -24,4 +24,4 @@ digraph G {
   cp11 -> cp5;
   cp13 -> cp7;
   
-  }
\ No newline at end of file
+  }
diff --git a/src/plugins/dive/tests/dive/oracle/global.dot b/src/plugins/dive/tests/dive/oracle/global.dot
index 2659479de44b35d430becb1153d31d1a0c3dde6d..e812304b34e78d98aa61c29967cc9ad4820bc4ee 100644
--- a/src/plugins/dive/tests/dive/oracle/global.dot
+++ b/src/plugins/dive/tests/dive/oracle/global.dot
@@ -20,4 +20,4 @@ digraph G {
   cp7 -> cp3;
   cp9 -> cp3;
   
-  }
\ No newline at end of file
+  }
diff --git a/src/plugins/dive/tests/dive/oracle/manydeps.dot b/src/plugins/dive/tests/dive/oracle/manydeps.dot
index d00972c3173b5d36ee80a6ec993194f0333bc635..69446545b0970cdde5830c57eda07661d37e7808 100644
--- a/src/plugins/dive/tests/dive/oracle/manydeps.dot
+++ b/src/plugins/dive/tests/dive/oracle/manydeps.dot
@@ -41,4 +41,4 @@ digraph G {
   cp25 -> cp24 [style="bold", ];
   cp27 -> cp24;
   
-  }
\ No newline at end of file
+  }
diff --git a/src/plugins/dive/tests/dive/oracle/per_callstack.dot b/src/plugins/dive/tests/dive/oracle/per_callstack.dot
index 0ae6f71c8c46c41651bae04ccc5c34b62cc54fc1..85100a27b32c57e627e50465b544714289348160 100644
--- a/src/plugins/dive/tests/dive/oracle/per_callstack.dot
+++ b/src/plugins/dive/tests/dive/oracle/per_callstack.dot
@@ -48,4 +48,4 @@ digraph G {
   cp23 -> cp17;
   cp25 -> cp19;
   
-  }
\ No newline at end of file
+  }
diff --git a/src/plugins/dive/tests/dive/oracle/pointed_param.dot b/src/plugins/dive/tests/dive/oracle/pointed_param.dot
index 92f573361740169815209ed17afccd6a326b8974..46bb735bd56446636a18ce3e0e2c1cab7ab8137a 100644
--- a/src/plugins/dive/tests/dive/oracle/pointed_param.dot
+++ b/src/plugins/dive/tests/dive/oracle/pointed_param.dot
@@ -30,4 +30,4 @@ digraph G {
   cp11 -> cp9;
   cp13 -> cp11;
   
-  }
\ No newline at end of file
+  }
diff --git a/src/plugins/dive/tests/dive/oracle/pointers_to_local.dot b/src/plugins/dive/tests/dive/oracle/pointers_to_local.dot
index b7876f50b929e04fe0f2704a4debfca7d0d72e98..1080f17282b79fcccd55eda8338ae7a53f2f775c 100644
--- a/src/plugins/dive/tests/dive/oracle/pointers_to_local.dot
+++ b/src/plugins/dive/tests/dive/oracle/pointers_to_local.dot
@@ -19,4 +19,4 @@ digraph G {
   cp5 -> cp2;
   cp8 -> cp2;
   
-  }
\ No newline at end of file
+  }
diff --git a/src/plugins/dive/tests/dive/oracle/ranges.dot b/src/plugins/dive/tests/dive/oracle/ranges.dot
index 6c5989ea7f6c318bd227bd79f1caa8d57a1fce94..5544ffa739eb0e2c1eb7f69748b0e561848e5dfa 100644
--- a/src/plugins/dive/tests/dive/oracle/ranges.dot
+++ b/src/plugins/dive/tests/dive/oracle/ranges.dot
@@ -120,4 +120,4 @@ digraph G {
   cp95 -> cp37;
   cp97 -> cp37;
   
-  }
\ No newline at end of file
+  }
diff --git a/src/plugins/dive/tests/dive/oracle/unfocused_callers.dot b/src/plugins/dive/tests/dive/oracle/unfocused_callers.dot
index c1212e05cefdb363f882f5cb34a1b977b4c942a1..6f0a41332ca46ba3eba82dbfa0ebe052460008d6 100644
--- a/src/plugins/dive/tests/dive/oracle/unfocused_callers.dot
+++ b/src/plugins/dive/tests/dive/oracle/unfocused_callers.dot
@@ -28,4 +28,4 @@ digraph G {
   cp9 -> cp5;
   cp9 -> cp7;
   
-  }
\ No newline at end of file
+  }
diff --git a/src/plugins/dive/tests/dive/oracle/various.dot b/src/plugins/dive/tests/dive/oracle/various.dot
index 0a9076386dcb14e7caaaf483c9ecafa96355fd46..86fa80576bd0c301a76c490ccb2efca7ea3f5a65 100644
--- a/src/plugins/dive/tests/dive/oracle/various.dot
+++ b/src/plugins/dive/tests/dive/oracle/various.dot
@@ -68,4 +68,4 @@ digraph G {
   cp30 -> cp25;
   cp32 -> cp27;
   
-  }
\ No newline at end of file
+  }
diff --git a/tests/misc/oracle/interpreted_automata_dataflow_backward.dot b/tests/misc/oracle/interpreted_automata_dataflow_backward.dot
index e21778fe0870ef3da3d767e80fca5039a7528270..99f06648f6e429f3618551c663ac9fd6b3d33fcf 100644
--- a/tests/misc/oracle/interpreted_automata_dataflow_backward.dot
+++ b/tests/misc/oracle/interpreted_automata_dataflow_backward.dot
@@ -73,4 +73,4 @@ digraph G {
   cp32 -> cp31 [label=<int a = 1;>, ];
   cp33 -> cp23 [label=<i ++;>, ];
   
-  }
\ No newline at end of file
+  }
diff --git a/tests/misc/oracle/interpreted_automata_dataflow_forward.dot b/tests/misc/oracle/interpreted_automata_dataflow_forward.dot
index 654b07c305061523fc84f98606aae61d0e99807e..57834ef539166eac084da62b4a8825b7b2e741d7 100644
--- a/tests/misc/oracle/interpreted_automata_dataflow_forward.dot
+++ b/tests/misc/oracle/interpreted_automata_dataflow_forward.dot
@@ -73,4 +73,4 @@ digraph G {
   cp32 -> cp31 [label=<int a = 1;>, ];
   cp33 -> cp23 [label=<i ++;>, ];
   
-  }
\ No newline at end of file
+  }
diff --git a/tests/pdg/oracle/call.f.dot b/tests/pdg/oracle/call.f.dot
index 6069991160613f9dc1bb4eaeea0e4dda95d7f71f..08ed9493b5c32ffc117f019f07b9e115474433db 100644
--- a/tests/pdg/oracle/call.f.dot
+++ b/tests/pdg/oracle/call.f.dot
@@ -28,4 +28,4 @@ digraph G {
   8 -> 9 [color="#0000FF", ];
   9 -> 10 [color="#0000FF", ];
   
-  }
\ No newline at end of file
+  }
diff --git a/tests/pdg/oracle/call.g.dot b/tests/pdg/oracle/call.g.dot
index f0da71f1413380c06107d64436516841851b4eba..bf153f947b74048d92a76249df37bdbe9edce8b1 100644
--- a/tests/pdg/oracle/call.g.dot
+++ b/tests/pdg/oracle/call.g.dot
@@ -45,4 +45,4 @@ digraph G {
   24 -> 27 [color="#0000FF", ];
   27 -> 28 [color="#0000FF", ];
   
-  }
\ No newline at end of file
+  }