diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/GRI/dynamicProcessing/RELTracer.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/GRI/dynamicProcessing/RELTracer.java
index eb96ba7ce92fe65cb342526872c9dc8daca784f0..5925867025b54ff349eee39e0d1ba88e7e8d4af1 100644
--- a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/GRI/dynamicProcessing/RELTracer.java
+++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/GRI/dynamicProcessing/RELTracer.java
@@ -28,6 +28,7 @@ public class RELTracer {
             KnowledgeBase gri,
             StaticGRIRuleTransformer ruleTransformerFactory,
             Atom query) {
+        //TODO : modify and add the dynamic rules
         gri = new KnowledgeBaseImpl(new SimpleInMemoryGraphStore(gri.getFactBase().getAtomsInMemory()), gri.getRuleBase());
 
         //first, check that the query is entailed
diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/GRI/staticProcessing/GRIBuilder.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/GRI/staticProcessing/GRIBuilder.java
index 4614e74d824cde44d815122d8afbebf73f9c1b91..eea71e6760ad6d588c15883ce9a1a6077de78e12 100644
--- a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/GRI/staticProcessing/GRIBuilder.java
+++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/GRI/staticProcessing/GRIBuilder.java
@@ -15,7 +15,7 @@ public class GRIBuilder {
         // transform the ruleset to be able to build the GRI
         var transformedRB = staticRuleTransformerFactory.createTransformedRB(kb);
 
-        KnowledgeBase gri = new KnowledgeBaseImpl(kb.getFactBase(), transformedRB);
+        KnowledgeBase gri = new KnowledgeBaseImpl(kb.getFactBase(), transformedRB.getStaticRuleBase());
 
         DefaultChaseForExplanations.chase(gri);
 
diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/ruleFactories/RuleTransformationRecord.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/ruleFactories/RuleTransformationRecord.java
new file mode 100644
index 0000000000000000000000000000000000000000..ef6539db651bcedea93a0422f49b635993651757
--- /dev/null
+++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/ruleFactories/RuleTransformationRecord.java
@@ -0,0 +1,27 @@
+package fr.boreal.explanation.ruleFactories;
+
+import fr.boreal.model.kb.api.RuleBase;
+import fr.boreal.model.kb.impl.RuleBaseImpl;
+import fr.boreal.model.rule.api.FORule;
+import fr.boreal.model.rule.api.Rule;
+
+import java.util.Collection;
+import java.util.LinkedHashSet;
+
+public record RuleTransformationRecord(Collection<FORule> nodeBuildingRules, Collection<FORule> edgeBuildingRules,
+                                       Collection<FORule> relTracingRules){
+
+    public RuleBase getStaticRuleBase() {
+        Collection<FORule> temp = new LinkedHashSet<>();
+        temp.addAll(this.nodeBuildingRules);
+        temp.addAll(this.edgeBuildingRules);
+        return new RuleBaseImpl(temp);
+    }
+
+    public RuleBase getDynamicRuleBase() {
+        Collection<FORule> temp = new LinkedHashSet<>();
+        temp.addAll(this.relTracingRules);
+        return new RuleBaseImpl(temp);
+    }
+
+}
diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/ruleFactories/StaticGRIRuleTransformer.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/ruleFactories/StaticGRIRuleTransformer.java
index c57cfc7fdd2d210c88390e12a57497dbd238060c..88880059285cc5b7d932057804ea939893d6a966 100644
--- a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/ruleFactories/StaticGRIRuleTransformer.java
+++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/ruleFactories/StaticGRIRuleTransformer.java
@@ -15,10 +15,12 @@ import fr.boreal.model.logicalElements.factory.impl.SameObjectTermFactory;
 import fr.boreal.model.logicalElements.impl.AtomImpl;
 import fr.boreal.model.logicalElements.impl.StoredFunctionalTermImpl;
 import fr.boreal.model.rule.api.FORule;
+import fr.boreal.model.rule.api.Rule;
 import fr.boreal.model.rule.impl.FORuleImpl;
 
 import java.util.*;
 
+;
 /**
  * This class implements a rule transformation for :
  * <p>
@@ -28,6 +30,7 @@ import java.util.*;
  */
 public class StaticGRIRuleTransformer {
 
+
     // factories for creating new terms, predicates and transformed rules
     private TermFactory termFactory = SameObjectTermFactory.instance();
     private static PredicateFactory predicateFactory = SameObjectPredicateFactory.instance();
@@ -66,21 +69,23 @@ public class StaticGRIRuleTransformer {
      * (3) rel propagation rules
      */
 
-    public RuleBase createTransformedRB(KnowledgeBase kb) {
+    public RuleTransformationRecord createTransformedRB(KnowledgeBase kb) {
 
-        RuleBase rb = new RuleBaseImpl();
+        Set<FORule> nodeBuildingRules = new LinkedHashSet<>();
+        Set<FORule> edgeBuildingRules = new LinkedHashSet<>();
+        Set<FORule> relTracingRules = new LinkedHashSet<>();
 
         for (Iterator<Predicate> it = kb.getFactBase().getPredicates(); it.hasNext(); ) {
             Predicate p = it.next();
-            rb.add(createGRINodeBuildingRule(p));
+            nodeBuildingRules.add(createGRINodeBuildingRule(p));
         }
 
         for (FORule r : kb.getRuleBase().getRules()) {
-            rb.add(createGRIEdgeBuildingRule(r));
-            rb.add(createRelPropagationRule(r));
+            edgeBuildingRules.add(createGRIEdgeBuildingRule(r));
+            relTracingRules.add(createRelPropagationRule(r));
         }
 
-        return rb;
+        return new RuleTransformationRecord(nodeBuildingRules,edgeBuildingRules,relTracingRules);
     }
 
 
diff --git a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/chasingAndTracing/ChaseStaticGRIRuleTransformerTest.java b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/chasingAndTracing/ChaseStaticGRIRuleTransformerTest.java
index b796175790d19d3f6732ed1931fc916f7adea2fe..b1405d74471e5112e1355c84f2e960dfca60509e 100644
--- a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/chasingAndTracing/ChaseStaticGRIRuleTransformerTest.java
+++ b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/chasingAndTracing/ChaseStaticGRIRuleTransformerTest.java
@@ -47,7 +47,7 @@ public class ChaseStaticGRIRuleTransformerTest {
         RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r3));
         KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase);
 
-        KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, factory.createTransformedRB(kb));
+        KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, factory.createTransformedRB(kb).getStaticRuleBase());
         TestData.chase(transformedKB);
 
         Predicate edge_r3 = factory.getOrGenerateEdgePredicateFromRule(TestData.r3);
@@ -78,7 +78,7 @@ public class ChaseStaticGRIRuleTransformerTest {
         RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r3, TestData.r4));
         KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase);
 
-        KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, factory.createTransformedRB(kb));
+        KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, factory.createTransformedRB(kb).getStaticRuleBase());
         TestData.chase(transformedKB);
 
         Predicate edge_r3 = factory.getOrGenerateEdgePredicateFromRule(TestData.r3);
@@ -107,7 +107,7 @@ public class ChaseStaticGRIRuleTransformerTest {
         RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r2));
         KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase);
 
-        KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, factory.createTransformedRB(kb));
+        KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, factory.createTransformedRB(kb).getStaticRuleBase());
         TestData.chase(transformedKB);
 
         Predicate edge_r2 = factory.getOrGenerateEdgePredicateFromRule(TestData.r2);
diff --git a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/chasingAndTracing/RELTracerTest.java b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/chasingAndTracing/RELTracerTest.java
index c2b32abcacf338abdf7ee1218af30d521e84c881..011f8abbfba8d3aac8f5b9a3be8aadef235ea930 100644
--- a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/chasingAndTracing/RELTracerTest.java
+++ b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/chasingAndTracing/RELTracerTest.java
@@ -63,31 +63,26 @@ public class RELTracerTest {
         RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r3));
         KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase);
 
-        KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, ruleTransformerFactory.createTransformedRB(kb));
+        var transformedRB =  ruleTransformerFactory.createTransformedRB(kb);
+        KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, transformedRB.getStaticRuleBase());
         Chase staticChase = chase(transformedKB);
 
         var tracker = staticChase.getTracker();
         RELTracer tracer = new RELTracer();
-        FactBase relAtoms ;
+
         var query = TestData.qa;
         var gri=transformedKB;
-        gri = new KnowledgeBaseImpl(new SimpleInMemoryGraphStore(gri.getFactBase().getAtomsInMemory()), gri.getRuleBase());
+        gri = new KnowledgeBaseImpl(factBase, transformedRB.getDynamicRuleBase());
 
         //first, check that the query is entailed
         Atom queryWithFuncId = ruleTransformerFactory.createAtomWithStoredFnTermIdentifier(query);
 
-        if (!gri.getFactBase().contains(queryWithFuncId)) {
-            relAtoms= new SimpleInMemoryGraphStore();
-        }
-
         // add seed atom to the factbase
         Atom RELquery = new AtomImpl(StaticGRIRuleTransformer.REL, StaticGRIRuleTransformer.createFnTermIdentifier(query));
         gri.getFactBase().add(RELquery);
 
         //propagate REL and REL_EDGE
-        var dynamicChase = DefaultChaseForExplanations.chase(gri);
-
-        relAtoms= gri.getFactBase();
+        var dynamicChase = chase(gri);
 
         StoredFunctionalTerm fpa = ruleTransformerFactory.createFnTermIdentifier(TestData.pa);
         StoredFunctionalTerm fqa = ruleTransformerFactory.createFnTermIdentifier(TestData.qa);
@@ -108,16 +103,16 @@ public class RELTracerTest {
                 ruleTransformerFactory.getOrGenerateRelEdgePredicateFromRule(TestData.r3),
                 List.of(fpa, ftay));
 
-        Assertions.assertTrue(relAtoms.contains(RELpa),
+        Assertions.assertTrue(factBase.contains(RELpa),
                 String.format("Relevant atom missing: %s %n Rel Atoms: %s", RELpa, factBase));
 
-        Assertions.assertTrue(relAtoms.contains(RELedgepaqa),
+        Assertions.assertTrue(factBase.contains(RELedgepaqa),
                 String.format("Relevant edge missing: %s %n Rel Atoms: %s", RELedgepaqa, factBase));
 
-        Assertions.assertTrue(!relAtoms.contains(RELtay),
+        Assertions.assertTrue(!factBase.contains(RELtay),
                 String.format("Irrelevant atom marked as relevant: %s %n Rel Atoms: %s", RELtay, factBase));
 
-        Assertions.assertTrue(!relAtoms.contains(RELedgepatay),
+        Assertions.assertTrue(!factBase.contains(RELedgepatay),
                 String.format("Irrelevant edge marked as relevant: %s %n Rel Atoms: %s", RELedgepatay, factBase));
 
     }
@@ -129,7 +124,7 @@ public class RELTracerTest {
         RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r5));
         KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase);
 
-        KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, ruleTransformerFactory.createTransformedRB(kb));
+        KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, ruleTransformerFactory.createTransformedRB(kb).getStaticRuleBase());
         chase(transformedKB);
 
         RELTracer tracer = new RELTracer();
diff --git a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/FactSupportKBGSATEncoderTest.java b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/FactSupportKBGSATEncoderTest.java
index 349df57cc8d2269a1e6bdda2b94b3e594c6e581c..bb21d5112567d621e51c4a36d7cc6ca689a2ba3e 100644
--- a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/FactSupportKBGSATEncoderTest.java
+++ b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/FactSupportKBGSATEncoderTest.java
@@ -51,7 +51,7 @@ public class FactSupportKBGSATEncoderTest {
         RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r1));
         KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase);
 
-        KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, staticGRIRuleTransformer.createTransformedRB(kb));
+        KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, staticGRIRuleTransformer.createTransformedRB(kb).getStaticRuleBase());
         TestData.chase(transformedKB);
 
         RELTracer tracer = new RELTracer();
diff --git a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/GMUSSolverTest.java b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/GMUSSolverTest.java
index 5ef9ce6e40979c5898c764809842b81b67393709..71726081410bc3f4f31e53f71ff8db78537ebbcd 100644
--- a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/GMUSSolverTest.java
+++ b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/GMUSSolverTest.java
@@ -46,7 +46,7 @@ public class GMUSSolverTest {
         RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r1, TestData.r4));
         KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase);
 
-        KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, staticGRIRuleTransformer.createTransformedRB(kb));
+        KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, staticGRIRuleTransformer.createTransformedRB(kb).getStaticRuleBase());
         TestData.chase(transformedKB);
 
         RELTracer tracer = new RELTracer();
diff --git a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/GMUSTranslatorTest.java b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/GMUSTranslatorTest.java
index 610a0205a17c89834144a456aec5ffec4388471e..57dd6b0922121ed3064f32e7dafbd1834da211e9 100644
--- a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/GMUSTranslatorTest.java
+++ b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/GMUSTranslatorTest.java
@@ -43,7 +43,7 @@ public class GMUSTranslatorTest {
         RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r1, TestData.r4));
         KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase);
 
-        KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, staticGRIRuleTransformer.createTransformedRB(kb));
+        KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, staticGRIRuleTransformer.createTransformedRB(kb).getStaticRuleBase());
         TestData.chase(transformedKB);
 
         RELTracer tracer = new RELTracer();
diff --git a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/KBtoGSATEncoderTest.java b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/KBtoGSATEncoderTest.java
index 9b8a83107974b0e777cf29cfc8faf4b09eef211a..591a47096e54d80810bb6db07b50da9ba121e7e4 100644
--- a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/KBtoGSATEncoderTest.java
+++ b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/KBtoGSATEncoderTest.java
@@ -51,7 +51,7 @@ public class KBtoGSATEncoderTest {
         RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r1));
         KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase);
 
-        KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, staticGRIRuleTransformer.createTransformedRB(kb));
+        KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, staticGRIRuleTransformer.createTransformedRB(kb).getStaticRuleBase());
         TestData.chase(transformedKB);
 
         RELTracer tracer = new RELTracer();
diff --git a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/sat4j/MUSSat4JSolverTest.java b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/sat4j/MUSSat4JSolverTest.java
index d7c3c59ad3a105bad82f41f7be6d929d0bce7903..518050422faee7f2ea64814d9331d736d0ef1a9e 100644
--- a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/sat4j/MUSSat4JSolverTest.java
+++ b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/sat4j/MUSSat4JSolverTest.java
@@ -39,7 +39,7 @@ public class MUSSat4JSolverTest {
         RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r1, TestData.r4));
         KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase);
 
-        KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, staticGRIRuleTransformer.createTransformedRB(kb));
+        KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, staticGRIRuleTransformer.createTransformedRB(kb).getStaticRuleBase());
         TestData.chase(transformedKB);
 
         RELTracer tracer = new RELTracer();
@@ -61,7 +61,7 @@ public class MUSSat4JSolverTest {
         RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r1, TestData.r4));
         KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase);
 
-        KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, staticGRIRuleTransformer.createTransformedRB(kb));
+        KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, staticGRIRuleTransformer.createTransformedRB(kb).getStaticRuleBase());
         TestData.chase(transformedKB);
 
         RELTracer tracer = new RELTracer();
diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/FederatedLineageTracker.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/FederatedLineageTracker.java
index 7f2dab51dd52f74d67317426bb5460979f0013ef..74c14f27fd3ddbfdc0225595f11775a77583493a 100644
--- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/FederatedLineageTracker.java
+++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/FederatedLineageTracker.java
@@ -2,25 +2,27 @@ package fr.boreal.forward_chaining.chase.lineage;
 
 import fr.boreal.model.logicalElements.api.Atom;
 
+import java.util.ArrayList;
 import java.util.LinkedHashSet;
+import java.util.List;
 import java.util.Set;
 
 public interface FederatedLineageTracker {
 
     static Set<Atom> getAncestorsOf(Atom atom, LineageTracker... trackers) {
         Set<Atom> result = new LinkedHashSet<>();
-        Set<Atom> toDO = new LinkedHashSet<>();
+        List<Atom> toDO = new ArrayList<>();
         toDO.add(atom);
         boolean noNew = true;
         while (noNew) {
             if (toDO.isEmpty()){
                 break;
             }
-            Atom currentAtom = toDO.stream().findAny().get();
+            Atom currentAtom = toDO.getFirst();
             toDO.remove(currentAtom);
             boolean someNew = false;
             for (int i = 0; i < trackers.length; i++) {
-                for(Atom currentAtomAncestor : trackers[i].getAncestorsOf(currentAtom)) {
+                for(Atom currentAtomAncestor : trackers[i].getPrimeAncestorsOf(currentAtom)) {
                     boolean addedCurrent = result.add(currentAtomAncestor);
                     someNew = someNew || addedCurrent;
                     if(addedCurrent){
diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/LineageTracker.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/LineageTracker.java
index 25ebcf7eb405c1d2df9bb554c0eea1b249b17ab7..f383b309add5b45c84b71817a0e3e0dc57f1ad3b 100644
--- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/LineageTracker.java
+++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/LineageTracker.java
@@ -17,6 +17,13 @@ public interface LineageTracker {
      */
     Collection<Atom> getAncestorsOf(Atom atom);
 
+    /**
+     *
+     * @param atom
+     * @return the prime ancestors of atom, that is, only those who do not have ancestors
+     */
+    Collection<Atom> getPrimeAncestorsOf(Atom atom);
+
     /**
      *
      * Tracks the fact that the application of rule with substitution from the bodyfacts produced headFactsPossiblyNew
diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/LineageTrackerImpl.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/LineageTrackerImpl.java
index 65b53f7b9659147a24ffd2eea56ad60bbbd77e9b..10debebdc0128cf261eac133af7d9c5835c1c571 100644
--- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/LineageTrackerImpl.java
+++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/LineageTrackerImpl.java
@@ -12,35 +12,46 @@ public class LineageTrackerImpl implements LineageTracker {
 
     Map<Atom, Map<Rule, Map<Substitution, Set<Atom>>>> lineage = new LinkedHashMap<>();
 
-    @Override
-    public Collection<Atom> getAncestorsOf(Atom a) {
+    private Collection<Atom> getAncestorsOf(Atom a, boolean returnOnlyPrimeAncestors) {
         boolean finished = false;
-        Set<Atom> ancestors = new LinkedHashSet<>();
-        List<Atom> toVisit = new ArrayList<>();
+        Set<Atom> ancestorSet = new LinkedHashSet<>();
+        List<Atom> computeAncestorsOf = new ArrayList<>();
         Atom current = a;
         while (!finished) {
-            if (lineage.get(current) == null || lineage.get(current).isEmpty()) {
-                return Set.of();
-            }
-            for (Rule rule : lineage.get(current).keySet()) {
-                for (Substitution substitution : lineage.get(current).get(rule).keySet()) {
-                    Set<Atom> anc = lineage.get(current).get(rule).get(substitution);
-                    for (Atom an : anc) {
-                        if (!ancestors.contains(an)) {
-                            ancestors.add(a);
-                            toVisit.add(a);
+            if (!(lineage.get(current) == null || lineage.get(current).isEmpty())) {
+                for (Rule rule : lineage.get(current).keySet()) {
+                    for (Substitution substitution : lineage.get(current).get(rule).keySet()) {
+                        Set<Atom> tempAnc = lineage.get(current).get(rule).get(substitution);
+                        for (Atom ancestorAtom : tempAnc) {
+                            if (!ancestorSet.contains(ancestorAtom)) {
+                                if (returnOnlyPrimeAncestors) {
+                                    if (lineage.get(ancestorAtom) == null || lineage.get(ancestorAtom).isEmpty())
+                                        ancestorSet.add(ancestorAtom);
+                                }
+                                computeAncestorsOf.add(ancestorAtom);
+                            }
                         }
                     }
                 }
             }
-            toVisit.remove(current);
-            if (toVisit.isEmpty()) {
+            computeAncestorsOf.remove(current);
+            if (computeAncestorsOf.isEmpty()) {
                 finished = true;
             } else {
-                current = toVisit.getFirst();
+                current = computeAncestorsOf.getFirst();
             }
         }
-        return ancestors;
+        return ancestorSet;
+    }
+
+    @Override
+    public Collection<Atom> getAncestorsOf(Atom atom) {
+        return getAncestorsOf(atom,false);
+    }
+
+    @Override
+    public Collection<Atom> getPrimeAncestorsOf(Atom atom) {
+        return getAncestorsOf(atom,true);
     }
 
     @Override
@@ -52,7 +63,7 @@ public class LineageTrackerImpl implements LineageTracker {
                     .computeIfAbsent(rule, r -> new LinkedHashMap<>())
                     .computeIfAbsent(substitution, s -> new LinkedHashSet<>())
                     .addAll(bodyFacts);
-            addedSomething = addedSomething||atomAdded;
+            addedSomething = addedSomething || atomAdded;
         }
         return addedSomething;
     }
diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/NoLineageTracker.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/NoLineageTracker.java
index c176d0c53f37f325ea99988556e2d8e69500835e..518b92660ea35e398c441d52e1e782a47850514e 100644
--- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/NoLineageTracker.java
+++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/NoLineageTracker.java
@@ -10,13 +10,18 @@ import java.util.*;
 /**
  * Default Implementation of a no-tracker
  */
-public class NoLineageTracker implements LineageTracker{
+public class NoLineageTracker implements LineageTracker {
 
     @Override
     public Collection<Atom> getAncestorsOf(Atom a) {
         return Set.of();
     }
 
+    @Override
+    public Collection<Atom> getPrimeAncestorsOf(Atom atom) {
+        return Set.of();
+    }
+
     @Override
     public boolean track(Set<Atom> bodyFacts, Set<Atom> headFactsPossiblyNew, FORule rule, Substitution substitution) {
         return false;