diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/tracker_gri/explainers/AbstractStaticGRIBasedExplainer_TrackerGRI.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/tracker_gri/explainers/AbstractStaticGRIBasedExplainer_TrackerGRI.java
index e757dc7dcf9e98d9955617a4e48e507c5137dff2..2fdb5d0fca7cd927a217aa9eb96fd37b49b99374 100644
--- a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/tracker_gri/explainers/AbstractStaticGRIBasedExplainer_TrackerGRI.java
+++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/tracker_gri/explainers/AbstractStaticGRIBasedExplainer_TrackerGRI.java
@@ -28,7 +28,7 @@ public abstract class AbstractStaticGRIBasedExplainer_TrackerGRI<ExplanationType
     /*
      * A KB where we want to trace bodyAtoms
      */
-    protected KnowledgeBase kb;
+    protected KnowledgeBase inputKB;
 
     /*
      * A KB whose factbase will contain the GRI and whose rulebase is the transformedRB
@@ -45,39 +45,32 @@ public abstract class AbstractStaticGRIBasedExplainer_TrackerGRI<ExplanationType
      * The factory for transforming rules
      */
     GRIRuleTransformer ruleTransformer = GRIRuleTransformer.instance();
-
+    Predicate<Atom> belongsToInitialFactbase;
     /**
      * Sets the initial KB and compute the GRI
      *
-     * @param kb the current kb
+     * @param inputKB the current kb
      */
-    public AbstractStaticGRIBasedExplainer_TrackerGRI(KnowledgeBase kb) {
-        this.kb = kb;
+    public AbstractStaticGRIBasedExplainer_TrackerGRI(KnowledgeBase inputKB, Solver solver) {
+        this.inputKB = inputKB;
 
         this.intialAtoms = new HashSet<Atom>();
-        kb.getFactBase().getAtoms().forEach(intialAtoms::add);
+        inputKB.getFactBase().getAtoms().forEach(intialAtoms::add);
 
-        var trackedChase = DefaultChaseForExplanations.chaseForTracker(this.kb);
+        var trackedChase = DefaultChaseForExplanations.chaseForTracker(this.inputKB);
         this.griKBChase = trackedChase.chase();
         this.griTracker = trackedChase.tracker();
     }
 
-    /**
-     * Sets the initial KB and compute the GRI
-     *
-     * @param kb the current kb
-     */
-    public AbstractStaticGRIBasedExplainer_TrackerGRI(KnowledgeBase kb, Solver solver) {
-        this.kb = kb;
-
-        this.intialAtoms = new HashSet<Atom>();
-        kb.getFactBase().getAtoms().forEach(intialAtoms::add);
+    public void pipeline() {
+        recordInitialFactbase();
+    }
 
-        var trackedChase = DefaultChaseForExplanations.chaseForTracker(this.kb);
-        this.griKBChase = trackedChase.chase();
-        this.griTracker = trackedChase.tracker();
-        this.solver=solver;
+    public void recordInitialFactbase() {
+        belongsToInitialFactbase = atom -> inputKB.getFactBase().contains(atom);
     }
+
+
     /**
      * Saturates the GRI with Tracing rules to compute relevant bodyAtoms and triggers for the query.
      * Then calls the solver.
@@ -86,11 +79,11 @@ public abstract class AbstractStaticGRIBasedExplainer_TrackerGRI<ExplanationType
      * @return
      */
     public Set<ExplanationType> getAllExplanations(Atom query) {
-        if (!kb.getFactBase().contains(query)) {
+        if (!inputKB.getFactBase().contains(query)) {
             return Set.of();
         }
 
-        Predicate<Atom> belongsToInitialFactbase = atom -> intialAtoms.contains(atom) ;
+        belongsToInitialFactbase = atom -> intialAtoms.contains(atom) ;
 
         var res = getGMUSProcessor(this.solver).computeAllExplanations(griTracker, query, belongsToInitialFactbase);
 
diff --git a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/check_has_explanation/MowlOntologyTest.java b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/check_has_explanation/MowlOntologyTest.java
index b66e0c7cfa86a8142e67bb3ceac71b444afa228b..8b3d766e84dc834ac85e216df5b18831a21441d2 100644
--- a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/check_has_explanation/MowlOntologyTest.java
+++ b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/check_has_explanation/MowlOntologyTest.java
@@ -30,7 +30,7 @@ import java.util.stream.Stream;
 public class MowlOntologyTest {
 
     static String mowl_bench_path = "./src/test/resources/mowl-bench-main/";
-    static List<String> mowl_bench_datasets = TestData.default_mowl_bench_datasets;
+    static List<String> mowl_bench_datasets = TestData.all_mowl_bench_datasets;
 
     enum AtomicQueryExplainerType {
         STATIC_GRI_FB_MARCO,
diff --git a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/unit_tests/explainer/kb_gri_marco/FactSupportExplainerTest.java b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/unit_tests/explainer/kb_gri_marco/FactSupportExplainerTest.java
index 9ddf4ceea56075fc17196cf0f028377559d85083..40a6267aebd9dbff018b46cd2ca87aa13ff3d986 100644
--- a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/unit_tests/explainer/kb_gri_marco/FactSupportExplainerTest.java
+++ b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/unit_tests/explainer/kb_gri_marco/FactSupportExplainerTest.java
@@ -28,6 +28,60 @@ public class FactSupportExplainerTest {
     public void setUp() {
     }
 
+
+
+    @Test
+    public void FactSupportExplainerTestCyclic3() {
+        Atom query = TestData.ta;
+
+        FactBase factBase = new SimpleInMemoryGraphStore(List.of(TestData.pa));
+        RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r1_px_qx,TestData.r10_qx_tx, TestData.r11_tx_px));
+        KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase);
+
+        explainer = new FactSupportExplainer_KBGRI(kb);
+        Set<FactBase> explanations = explainer.getAllExplanations(query);
+
+        FactBase expectedFactBase1 = new SimpleInMemoryGraphStore(Set.of(TestData.pa));
+
+        Assertions.assertTrue(explanations.contains(expectedFactBase1), "(Completeness issue) Explanation missing: " + expectedFactBase1);
+        Assertions.assertEquals(1, explanations.size(), "(Soundness issue) identify non-explanation as explanation");
+    }
+
+    @Test
+    public void FactSupportExplainerTestCyclic2() {
+        Atom query = TestData.qa;
+
+        FactBase factBase = new SimpleInMemoryGraphStore(List.of(TestData.pa));
+        RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r1_px_qx,TestData.r10_qx_tx, TestData.r11_tx_px));
+        KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase);
+
+        explainer = new FactSupportExplainer_KBGRI(kb);
+        Set<FactBase> explanations = explainer.getAllExplanations(query);
+
+        FactBase expectedFactBase1 = new SimpleInMemoryGraphStore(Set.of(TestData.pa));
+
+        Assertions.assertTrue(explanations.contains(expectedFactBase1), "(Completeness issue) Explanation missing: " + expectedFactBase1);
+        Assertions.assertEquals(1, explanations.size(), "(Soundness issue) identify non-explanation as explanation");
+    }
+
+
+    @Test
+    public void FactSupportExplainerTestCyclic1() {
+        Atom query = TestData.qa;
+
+        FactBase factBase = new SimpleInMemoryGraphStore(List.of(TestData.pa));
+        RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r1_px_qx,TestData.r9_qx_px));
+        KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase);
+
+        explainer = new FactSupportExplainer_KBGRI(kb);
+        Set<FactBase> explanations = explainer.getAllExplanations(query);
+
+        FactBase expectedFactBase1 = new SimpleInMemoryGraphStore(Set.of(TestData.pa));
+
+        Assertions.assertTrue(explanations.contains(expectedFactBase1), "(Completeness issue) Explanation missing: " + expectedFactBase1);
+        Assertions.assertEquals(1, explanations.size(), "(Soundness issue) identify non-explanation as explanation");
+    }
+
     @Test
     public void FactSupportExplainerTest4() {
         Atom query = TestData.pa;
diff --git a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/unit_tests/explainer/kb_gri_marco/RuleSupportExplainerTest.java b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/unit_tests/explainer/kb_gri_marco/RuleSupportExplainerTest.java
index 5cc7c7ca9f24d7035a4e85d2045f0491a3ca0130..8b396462e9649d4586ab8f7906a7f086bed20b5f 100644
--- a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/unit_tests/explainer/kb_gri_marco/RuleSupportExplainerTest.java
+++ b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/unit_tests/explainer/kb_gri_marco/RuleSupportExplainerTest.java
@@ -137,4 +137,58 @@ public class RuleSupportExplainerTest {
 
     }
 
+
+    @Test
+    public void RuleSupportExplainerTestCyclic3() {
+        Atom query = TestData.ta;
+
+        FactBase factBase = new SimpleInMemoryGraphStore(List.of(TestData.pa));
+        RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r1_px_qx,TestData.r10_qx_tx, TestData.r11_tx_px));
+        KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase);
+
+        explainer = new RuleSupportExplainer_KBGRI(kb);
+        Set<RuleBase> explanations = explainer.getAllExplanations(query);
+
+        RuleBase expectedRuleBase1 = new RuleBaseImpl(Set.of(TestData.r1_px_qx, TestData.r10_qx_tx));
+
+        Assertions.assertTrue(explanations.contains(expectedRuleBase1), "(Completeness issue) Explanation missing: " + expectedRuleBase1);
+        Assertions.assertEquals(1, explanations.size(), "(Soundness issue) identify non-explanation as explanation");
+    }
+
+
+    @Test
+    public void RuleSupportExplainerTestCyclic2() {
+        Atom query = TestData.qa;
+
+        FactBase factBase = new SimpleInMemoryGraphStore(List.of(TestData.pa));
+        RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r1_px_qx,TestData.r10_qx_tx, TestData.r11_tx_px));
+        KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase);
+
+        explainer = new RuleSupportExplainer_KBGRI(kb);
+        Set<RuleBase> explanations = explainer.getAllExplanations(query);
+
+        RuleBase expectedRuleBase1 = new RuleBaseImpl(Set.of(TestData.r1_px_qx));
+
+        Assertions.assertTrue(explanations.contains(expectedRuleBase1), "(Completeness issue) Explanation missing: " + expectedRuleBase1);
+        Assertions.assertEquals(1, explanations.size(), "(Soundness issue) identify non-explanation as explanation");
+    }
+
+
+    @Test
+    public void RuleSupportExplainerTestCyclic1() {
+        Atom query = TestData.qa;
+
+        FactBase factBase = new SimpleInMemoryGraphStore(List.of(TestData.pa));
+        RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r1_px_qx,TestData.r9_qx_px));
+        KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase);
+
+        explainer = new RuleSupportExplainer_KBGRI(kb);
+        Set<RuleBase> explanations = explainer.getAllExplanations(query);
+
+        RuleBase expectedRuleBase1 = new RuleBaseImpl(Set.of(TestData.r1_px_qx));
+
+        Assertions.assertTrue(explanations.contains(expectedRuleBase1), "(Completeness issue) Explanation missing: " + expectedRuleBase1);
+        Assertions.assertEquals(1, explanations.size(), "(Soundness issue) identify non-explanation as explanation");
+    }
+
 }
diff --git a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/unit_tests/explainer/kb_gri_s4j/FactSupportExplainerSat4JTest.java b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/unit_tests/explainer/kb_gri_s4j/FactSupportExplainerSat4JTest.java
index 648373cfab1c383fdff2f7cf9c01110456b8a189..c0702b15c20c19f78ca7276c6a23994340337d88 100644
--- a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/unit_tests/explainer/kb_gri_s4j/FactSupportExplainerSat4JTest.java
+++ b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/unit_tests/explainer/kb_gri_s4j/FactSupportExplainerSat4JTest.java
@@ -35,6 +35,60 @@ public class FactSupportExplainerSat4JTest {
     public void setUp() {
     }
 
+
+
+    @Test
+    public void FactSupportExplainerTestCyclic3() {
+        Atom query = TestData.ta;
+
+        FactBase factBase = new SimpleInMemoryGraphStore(List.of(TestData.pa));
+        RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r1_px_qx,TestData.r10_qx_tx, TestData.r11_tx_px));
+        KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase);
+
+        explainer = getExplainer(kb);
+        Set<FactBase> explanations = explainer.getAllExplanations(query);
+
+        FactBase expectedFactBase1 = new SimpleInMemoryGraphStore(Set.of(TestData.pa));
+
+        Assertions.assertTrue(explanations.contains(expectedFactBase1), "(Completeness issue) Explanation missing: " + expectedFactBase1);
+        Assertions.assertEquals(1, explanations.size(), "(Soundness issue) identify non-explanation as explanation");
+    }
+
+    @Test
+    public void FactSupportExplainerTestCyclic2() {
+        Atom query = TestData.qa;
+
+        FactBase factBase = new SimpleInMemoryGraphStore(List.of(TestData.pa));
+        RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r1_px_qx,TestData.r10_qx_tx, TestData.r11_tx_px));
+        KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase);
+
+        explainer = getExplainer(kb);
+        Set<FactBase> explanations = explainer.getAllExplanations(query);
+
+        FactBase expectedFactBase1 = new SimpleInMemoryGraphStore(Set.of(TestData.pa));
+
+        Assertions.assertTrue(explanations.contains(expectedFactBase1), "(Completeness issue) Explanation missing: " + expectedFactBase1);
+        Assertions.assertEquals(1, explanations.size(), "(Soundness issue) identify non-explanation as explanation");
+    }
+
+
+    @Test
+    public void FactSupportExplainerTestCyclic1() {
+        Atom query = TestData.qa;
+
+        FactBase factBase = new SimpleInMemoryGraphStore(List.of(TestData.pa));
+        RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r1_px_qx,TestData.r9_qx_px));
+        KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase);
+
+        explainer = getExplainer(kb);
+        Set<FactBase> explanations = explainer.getAllExplanations(query);
+
+        FactBase expectedFactBase1 = new SimpleInMemoryGraphStore(Set.of(TestData.pa));
+
+        Assertions.assertTrue(explanations.contains(expectedFactBase1), "(Completeness issue) Explanation missing: " + expectedFactBase1);
+        Assertions.assertEquals(1, explanations.size(), "(Soundness issue) identify non-explanation as explanation");
+    }
+
     @Test
     public void FactSupportExplainerTest4() {
         Atom query = TestData.pa;
diff --git a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/unit_tests/explainer/kb_gri_s4j/RuleSupportExplainerSat4JTest.java b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/unit_tests/explainer/kb_gri_s4j/RuleSupportExplainerSat4JTest.java
index f2aae67ce92654854a2986bc3cf352637017f654..0d1bd3612f42775cc82cf85b595c64dceba1f66a 100644
--- a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/unit_tests/explainer/kb_gri_s4j/RuleSupportExplainerSat4JTest.java
+++ b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/unit_tests/explainer/kb_gri_s4j/RuleSupportExplainerSat4JTest.java
@@ -140,4 +140,59 @@ public class RuleSupportExplainerSat4JTest {
 
     }
 
+
+    @Test
+    public void RuleSupportExplainerTestCyclic3() {
+        Atom query = TestData.ta;
+
+        FactBase factBase = new SimpleInMemoryGraphStore(List.of(TestData.pa));
+        RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r1_px_qx,TestData.r10_qx_tx, TestData.r11_tx_px));
+        KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase);
+
+        explainer = getExplainer(kb);
+        Set<RuleBase> explanations = explainer.getAllExplanations(query);
+
+        RuleBase expectedRuleBase1 = new RuleBaseImpl(Set.of(TestData.r1_px_qx, TestData.r10_qx_tx));
+
+        Assertions.assertTrue(explanations.contains(expectedRuleBase1), "(Completeness issue) Explanation missing: " + expectedRuleBase1);
+        Assertions.assertEquals(1, explanations.size(), "(Soundness issue) identify non-explanation as explanation");
+    }
+
+
+    @Test
+    public void RuleSupportExplainerTestCyclic2() {
+        Atom query = TestData.qa;
+
+        FactBase factBase = new SimpleInMemoryGraphStore(List.of(TestData.pa));
+        RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r1_px_qx,TestData.r10_qx_tx, TestData.r11_tx_px));
+        KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase);
+
+        explainer = getExplainer(kb);
+        Set<RuleBase> explanations = explainer.getAllExplanations(query);
+
+        RuleBase expectedRuleBase1 = new RuleBaseImpl(Set.of(TestData.r1_px_qx));
+
+        Assertions.assertTrue(explanations.contains(expectedRuleBase1), "(Completeness issue) Explanation missing: " + expectedRuleBase1);
+        Assertions.assertEquals(1, explanations.size(), "(Soundness issue) identify non-explanation as explanation");
+    }
+
+
+    @Test
+    public void RuleSupportExplainerTestCyclic1() {
+        Atom query = TestData.qa;
+
+        FactBase factBase = new SimpleInMemoryGraphStore(List.of(TestData.pa));
+        RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r1_px_qx,TestData.r9_qx_px));
+        KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase);
+
+        explainer = getExplainer(kb);
+        Set<RuleBase> explanations = explainer.getAllExplanations(query);
+
+        RuleBase expectedRuleBase1 = new RuleBaseImpl(Set.of(TestData.r1_px_qx));
+
+        Assertions.assertTrue(explanations.contains(expectedRuleBase1), "(Completeness issue) Explanation missing: " + expectedRuleBase1);
+        Assertions.assertEquals(1, explanations.size(), "(Soundness issue) identify non-explanation as explanation");
+    }
+
+
 }
diff --git a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/unit_tests/explainer/tracker_gri_s4j/FactSupportExplainerWithLinearTrackerAndSat4JTest.java b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/unit_tests/explainer/tracker_gri_s4j/FactSupportExplainerWithLinearTrackerAndSat4JTest.java
index 396a9f00ccadc7e5c1cf33b44397f08d6e961595..7299603e92e715267b6704a6cd0d7e363fa07df9 100644
--- a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/unit_tests/explainer/tracker_gri_s4j/FactSupportExplainerWithLinearTrackerAndSat4JTest.java
+++ b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/unit_tests/explainer/tracker_gri_s4j/FactSupportExplainerWithLinearTrackerAndSat4JTest.java
@@ -5,6 +5,7 @@ import fr.boreal.explanation.kb_gri.explainers.static_gri.FactSupportExplainer_K
 import fr.boreal.explanation.kb_gri.rule_transformation.GRIRuleTransformer;
 import fr.boreal.explanation.solving_enumerating.sat4j.Sat4JSolver;
 import fr.boreal.explanation.tracker_gri.explainers.FactSupportExplainer_TrackerGRI;
+import fr.boreal.explanation.tracker_gri.explainers.KBSupportExplainer_TrackerGRI;
 import fr.boreal.model.kb.api.FactBase;
 import fr.boreal.model.kb.api.KnowledgeBase;
 import fr.boreal.model.kb.api.RuleBase;
@@ -35,6 +36,58 @@ public class FactSupportExplainerWithLinearTrackerAndSat4JTest {
     public void setUp() {
     }
 
+    @Test
+    public void FactSupportExplainerTestCyclic3() {
+        Atom query = TestData.ta;
+
+        FactBase factBase = new SimpleInMemoryGraphStore(List.of(TestData.pa));
+        RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r1_px_qx,TestData.r10_qx_tx, TestData.r11_tx_px));
+        KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase);
+
+        explainer = getExplainer(kb);
+        Set<FactBase> explanations = explainer.getAllExplanations(query);
+
+        FactBase expectedFactBase1 = new SimpleInMemoryGraphStore(Set.of(TestData.pa));
+
+        Assertions.assertTrue(explanations.contains(expectedFactBase1), "(Completeness issue) Explanation missing: " + expectedFactBase1);
+        Assertions.assertEquals(1, explanations.size(), "(Soundness issue) identify non-explanation as explanation");
+    }
+
+    @Test
+    public void FactSupportExplainerTestCyclic2() {
+        Atom query = TestData.qa;
+
+        FactBase factBase = new SimpleInMemoryGraphStore(List.of(TestData.pa));
+        RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r1_px_qx,TestData.r10_qx_tx, TestData.r11_tx_px));
+        KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase);
+
+        explainer = getExplainer(kb);
+        Set<FactBase> explanations = explainer.getAllExplanations(query);
+
+        FactBase expectedFactBase1 = new SimpleInMemoryGraphStore(Set.of(TestData.pa));
+
+        Assertions.assertTrue(explanations.contains(expectedFactBase1), "(Completeness issue) Explanation missing: " + expectedFactBase1);
+        Assertions.assertEquals(1, explanations.size(), "(Soundness issue) identify non-explanation as explanation");
+    }
+
+
+    @Test
+    public void FactSupportExplainerTestCyclic1() {
+        Atom query = TestData.qa;
+
+        FactBase factBase = new SimpleInMemoryGraphStore(List.of(TestData.pa));
+        RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r1_px_qx,TestData.r9_qx_px));
+        KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase);
+
+        explainer = getExplainer(kb);
+        Set<FactBase> explanations = explainer.getAllExplanations(query);
+
+        FactBase expectedFactBase1 = new SimpleInMemoryGraphStore(Set.of(TestData.pa));
+
+        Assertions.assertTrue(explanations.contains(expectedFactBase1), "(Completeness issue) Explanation missing: " + expectedFactBase1);
+        Assertions.assertEquals(1, explanations.size(), "(Soundness issue) identify non-explanation as explanation");
+    }
+
     @Test
     public void FactSupportExplainerTest4() {
         Atom query = TestData.pa;
diff --git a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/unit_tests/explainer/tracker_gri_s4j/RuleSupportExplainerWithLinearTrackerAndSat4JTest.java b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/unit_tests/explainer/tracker_gri_s4j/RuleSupportExplainerWithLinearTrackerAndSat4JTest.java
index 01a754253d4476ce2502c5836653467f8a25bd15..4b877eaefdbe458cadceeea92155ffc88449bc46 100644
--- a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/unit_tests/explainer/tracker_gri_s4j/RuleSupportExplainerWithLinearTrackerAndSat4JTest.java
+++ b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/unit_tests/explainer/tracker_gri_s4j/RuleSupportExplainerWithLinearTrackerAndSat4JTest.java
@@ -1,8 +1,10 @@
 package fr.boreal.test.explanation.unit_tests.explainer.tracker_gri_s4j;
 
+import fr.boreal.explanation.api.explainers.AtomicQueryExplainer;
 import fr.boreal.explanation.kb_gri.explainers.static_gri.RuleSupportExplainer_KBGRI;
 import fr.boreal.explanation.kb_gri.rule_transformation.GRIRuleTransformer;
 import fr.boreal.explanation.solving_enumerating.sat4j.Sat4JSolver;
+import fr.boreal.explanation.tracker_gri.explainers.KBSupportExplainer_TrackerGRI;
 import fr.boreal.explanation.tracker_gri.explainers.RuleSupportExplainer_TrackerGRI;
 import fr.boreal.model.kb.api.FactBase;
 import fr.boreal.model.kb.api.KnowledgeBase;
@@ -141,4 +143,60 @@ public class RuleSupportExplainerWithLinearTrackerAndSat4JTest {
 
     }
 
+
+
+    @Test
+    public void RuleSupportExplainerTestCyclic3() {
+        Atom query = TestData.ta;
+
+        FactBase factBase = new SimpleInMemoryGraphStore(List.of(TestData.pa));
+        RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r1_px_qx,TestData.r10_qx_tx, TestData.r11_tx_px));
+        KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase);
+
+        explainer = getExplainer(kb);
+        Set<RuleBase> explanations = explainer.getAllExplanations(query);
+
+        RuleBase expectedRuleBase1 = new RuleBaseImpl(Set.of(TestData.r1_px_qx, TestData.r10_qx_tx));
+
+        Assertions.assertTrue(explanations.contains(expectedRuleBase1), "(Completeness issue) Explanation missing: " + expectedRuleBase1);
+        Assertions.assertEquals(1, explanations.size(), "(Soundness issue) identify non-explanation as explanation");
+    }
+
+
+    @Test
+    public void RuleSupportExplainerTestCyclic2() {
+        Atom query = TestData.qa;
+
+        FactBase factBase = new SimpleInMemoryGraphStore(List.of(TestData.pa));
+        RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r1_px_qx,TestData.r10_qx_tx, TestData.r11_tx_px));
+        KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase);
+
+        explainer = getExplainer(kb);
+        Set<RuleBase> explanations = explainer.getAllExplanations(query);
+
+        RuleBase expectedRuleBase1 = new RuleBaseImpl(Set.of(TestData.r1_px_qx));
+
+        Assertions.assertTrue(explanations.contains(expectedRuleBase1), "(Completeness issue) Explanation missing: " + expectedRuleBase1);
+        Assertions.assertEquals(1, explanations.size(), "(Soundness issue) identify non-explanation as explanation");
+    }
+
+
+    @Test
+    public void RuleSupportExplainerTestCyclic1() {
+        Atom query = TestData.qa;
+
+        FactBase factBase = new SimpleInMemoryGraphStore(List.of(TestData.pa));
+        RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r1_px_qx,TestData.r9_qx_px));
+        KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase);
+
+        explainer = getExplainer(kb);
+        Set<RuleBase> explanations = explainer.getAllExplanations(query);
+
+        RuleBase expectedRuleBase1 = new RuleBaseImpl(Set.of(TestData.r1_px_qx));
+
+        Assertions.assertTrue(explanations.contains(expectedRuleBase1), "(Completeness issue) Explanation missing: " + expectedRuleBase1);
+        Assertions.assertEquals(1, explanations.size(), "(Soundness issue) identify non-explanation as explanation");
+    }
+
+
 }