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..2bfbe3b6b0637e8d9e654a4bb24d87df7e0762b5 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
@@ -26,12 +26,11 @@ public class RELTracer {
      */
     public FactBase computeQueryRelevant(
             KnowledgeBase gri,
-            StaticGRIRuleTransformer ruleTransformerFactory,
             Atom query) {
         gri = new KnowledgeBaseImpl(new SimpleInMemoryGraphStore(gri.getFactBase().getAtomsInMemory()), gri.getRuleBase());
 
         //first, check that the query is entailed
-        Atom queryWithFuncId = ruleTransformerFactory.createAtomWithStoredFnTermIdentifier(query);
+        Atom queryWithFuncId = StaticGRIRuleTransformer.instance().createAtomWithStoredFnTermIdentifier(query);
 
         if (!gri.getFactBase().contains(queryWithFuncId)) {
             LOG.warn("Query " + query + " not entailed by the input KB.");
diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/api/encoders/GSATEncoder_GRI.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/api/encoders/GSATEncoder_GRI.java
new file mode 100644
index 0000000000000000000000000000000000000000..692aa4f6acf9dbebae875504eaf69006b75803d2
--- /dev/null
+++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/api/encoders/GSATEncoder_GRI.java
@@ -0,0 +1,20 @@
+package fr.boreal.explanation.api.encoders;
+
+import fr.boreal.explanation.solving_enumerating.encoders.GSATEncodingResult_GRI;
+
+/**
+ * Computes at GSAT encoding of the GRI and the Query for GMUS enumeration
+ * @param <DataStructureType> the data structure holding the GRI
+ * @param <QueryType> the query type
+ */
+public interface GSATEncoder_GRI<DataStructureType, QueryType>  {
+
+    /**
+     *
+     * @param filteredGRI
+     * @param query
+     * @return at GSAT encoding of the filteredGRI and the Query for GMUS enumeration
+     */
+    GSATEncodingResult_GRI encode(DataStructureType filteredGRI, QueryType query);
+
+}
diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/api/AtomicQueryExplanationEnumerator.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/api/explainers/AtomicQueryExplainer.java
similarity index 91%
rename from integraal/integraal-explanation/src/main/java/fr/boreal/explanation/api/AtomicQueryExplanationEnumerator.java
rename to integraal/integraal-explanation/src/main/java/fr/boreal/explanation/api/explainers/AtomicQueryExplainer.java
index 71ed9bb3190353146e394ff088938a620453e520..30c3f44085542686a5dcc64413dd83939a4b949c 100644
--- a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/api/AtomicQueryExplanationEnumerator.java
+++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/api/explainers/AtomicQueryExplainer.java
@@ -1,4 +1,4 @@
-package fr.boreal.explanation.api;
+package fr.boreal.explanation.api.explainers;
 
 import fr.boreal.model.formula.api.FOFormulaConjunction;
 import fr.boreal.model.kb.api.KnowledgeBase;
@@ -11,7 +11,7 @@ import java.util.Arrays;
  *
  * @param <ExplanationType> the type of the (set of) explanations which is returned by the enumerator
  */
-public interface AtomicQueryExplanationEnumerator<ExplanationType> extends QueryExplainer<ExplanationType,Atom> {
+public interface AtomicQueryExplainer<ExplanationType> extends QueryExplainer<ExplanationType, Atom, KnowledgeBase> {
 
     /**
      * Checks if an atom can be explained
diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/api/QueryExplainer.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/api/explainers/QueryExplainer.java
similarity index 81%
rename from integraal/integraal-explanation/src/main/java/fr/boreal/explanation/api/QueryExplainer.java
rename to integraal/integraal-explanation/src/main/java/fr/boreal/explanation/api/explainers/QueryExplainer.java
index ded40bc2dcb46888a85ea64311f1d64d6d62da1d..a2ebdedaf3044cef92949fbfe3e5626cd74ec932 100644
--- a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/api/QueryExplainer.java
+++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/api/explainers/QueryExplainer.java
@@ -1,6 +1,4 @@
-package fr.boreal.explanation.api;
-
-import fr.boreal.model.kb.api.KnowledgeBase;
+package fr.boreal.explanation.api.explainers;
 
 import java.util.Iterator;
 import java.util.Set;
@@ -11,7 +9,7 @@ import java.util.Set;
  * @param <ExplanationType> the type of the (set of) explanations which is returned by the enumerator
  * @param <QueryType>       the type of the query
  */
-public interface QueryExplainer<ExplanationType, QueryType> {
+public interface QueryExplainer<ExplanationType, QueryType, KnowledgeBaseType> {
 
     /**
      * @param query
@@ -36,6 +34,6 @@ public interface QueryExplainer<ExplanationType, QueryType> {
      * @param query
      * @return true iff the explainer surpports the query and the knowledget base
      */
-    boolean canExplain(KnowledgeBase kb, QueryType query);
+    boolean canExplain(KnowledgeBaseType kb, QueryType query);
 
 }
diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/api/gmus/GMUSEncoder.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/api/gmus/GMUSEncoder.java
deleted file mode 100644
index 1db42f51d199ea0960668433815d7fb026d03c24..0000000000000000000000000000000000000000
--- a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/api/gmus/GMUSEncoder.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package fr.boreal.explanation.api.gmus;
-
-import fr.boreal.explanation.solving_enumerating.encoders.EncodingResult;
-import fr.boreal.model.kb.api.FactBase;
-import fr.boreal.model.logicalElements.api.Atom;
-
-public interface GMUSEncoder {
-
-    EncodingResult encode(FactBase filteredGRI, Atom query);
-}
diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/api/gri/GRIExplanationProcessor.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/api/processors/ExplanationProcessor_GRI.java
similarity index 85%
rename from integraal/integraal-explanation/src/main/java/fr/boreal/explanation/api/gri/GRIExplanationProcessor.java
rename to integraal/integraal-explanation/src/main/java/fr/boreal/explanation/api/processors/ExplanationProcessor_GRI.java
index 4c532df4bba6e931646b06a2f18f169cec30c736..d0386a2b276f496fb83ba21cc2a9e828ecfc7b3e 100644
--- a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/api/gri/GRIExplanationProcessor.java
+++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/api/processors/ExplanationProcessor_GRI.java
@@ -1,4 +1,4 @@
-package fr.boreal.explanation.api.gri;
+package fr.boreal.explanation.api.processors;
 
 import java.util.Iterator;
 import java.util.Set;
@@ -10,7 +10,7 @@ import java.util.Set;
  * @param <DataStructureType>
  * @param <QueryType>
  */
-public interface GRIExplanationProcessor<ExplanationType, DataStructureType, QueryType> {
+public interface ExplanationProcessor_GRI<ExplanationType, DataStructureType, QueryType> {
 
     /**
      * @param GRI
diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/api/processors/ExplanationProcessor_Rewriting.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/api/processors/ExplanationProcessor_Rewriting.java
new file mode 100644
index 0000000000000000000000000000000000000000..e11af5fa12854ba02886397663b794b0e9f1d78f
--- /dev/null
+++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/api/processors/ExplanationProcessor_Rewriting.java
@@ -0,0 +1,34 @@
+package fr.boreal.explanation.api.processors;
+
+import fr.boreal.model.kb.api.KnowledgeBase;
+
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * Uses query rewriting to compute the Explanations of a Query
+ * Supports different types of Explanations, and Query types.
+ *
+ * @param <ExplanationType>
+ * @param <QueryType>
+ */
+public interface ExplanationProcessor_Rewriting<ExplanationType, QueryType> {
+
+    /**
+     * @param kb
+     * @param query
+     * @return the set of all explanations of a query given the kb
+     */
+    Set<ExplanationType> computeAllExplanations(KnowledgeBase kb, QueryType query);
+
+
+    /**
+     * @param kb
+     * @param query
+     * @return an iterator for all explanations of a query given the kb
+     */
+    default Iterator<ExplanationType> computeExplanations(KnowledgeBase kb, QueryType query) {
+        return this.computeAllExplanations(kb, query).iterator();
+    }
+
+}
diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/configuration/DefaultChaseForExplanations.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/configuration/DefaultChaseForExplanations.java
index 4469a013ca77ccd454f1b4cef6e5ac54dc5b3477..29da3d65ddacf8e9ec6591a6edf5d099effa0b06 100644
--- a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/configuration/DefaultChaseForExplanations.java
+++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/configuration/DefaultChaseForExplanations.java
@@ -1,6 +1,7 @@
 package fr.boreal.explanation.configuration;
 
 import fr.boreal.forward_chaining.api.ForwardChainingAlgorithm;
+import fr.boreal.forward_chaining.chase.Chase;
 import fr.boreal.forward_chaining.chase.ChaseBuilder;
 import fr.boreal.model.kb.api.KnowledgeBase;
 
@@ -9,12 +10,13 @@ import fr.boreal.model.kb.api.KnowledgeBase;
  */
 public class DefaultChaseForExplanations {
 
-    public static void chase(KnowledgeBase kb) {
-        ForwardChainingAlgorithm chase = ChaseBuilder.defaultBuilder(kb.getFactBase(), kb.getRuleBase())
+    public static Chase chase(KnowledgeBase kb) {
+        Chase chase = ChaseBuilder.defaultBuilder(kb.getFactBase(), kb.getRuleBase())
                 .useObliviousChecker()
                 .useNaiveComputer()
                 .useNaiveRuleScheduler()
                 .build().get();
         chase.execute();
+        return chase;
     }
 }
diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/explainers/AbstractStaticGRIBasedExplainer.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/explainers/AbstractStaticGRIBasedExplainer.java
index cbf7eaca3a18dfad442c37cb356a886812c301c3..7dc09fbf85481497f4bc94c7f6f7e11274b7ad30 100644
--- a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/explainers/AbstractStaticGRIBasedExplainer.java
+++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/explainers/AbstractStaticGRIBasedExplainer.java
@@ -2,17 +2,28 @@ package fr.boreal.explanation.explainers;
 
 import fr.boreal.explanation.GRI.dynamicProcessing.RELTracer;
 import fr.boreal.explanation.GRI.staticProcessing.GRIBuilder;
+import fr.boreal.explanation.api.explainers.AtomicQueryExplainer;
+import fr.boreal.explanation.api.processors.ExplanationProcessor_GRI;
+import fr.boreal.explanation.configuration.DefaultChaseForExplanations;
+import fr.boreal.explanation.ruleFactories.RuleTransformationRecord;
 import fr.boreal.explanation.ruleFactories.StaticGRIRuleTransformer;
-import fr.boreal.explanation.solving_enumerating.gmus_processors.FactSupportGMUSProcessor;
+import fr.boreal.forward_chaining.chase.Chase;
 import fr.boreal.model.kb.api.FactBase;
 import fr.boreal.model.kb.api.KnowledgeBase;
+import fr.boreal.model.kb.api.RuleBase;
+import fr.boreal.model.kb.impl.KnowledgeBaseImpl;
 import fr.boreal.model.logicalElements.api.Atom;
+import fr.boreal.model.logicalElements.impl.AtomImpl;
+import fr.boreal.storage.natives.SimpleInMemoryGraphStore;
 import org.apache.commons.lang3.tuple.Pair;
 
 import java.util.Set;
 
-public abstract class AbstractStaticGRIBasedExplainer {
+public abstract class AbstractStaticGRIBasedExplainer<ExplanationType> implements AtomicQueryExplainer<ExplanationType>  {
 
+    private final KnowledgeBase originalRB;
+    private final RuleTransformationRecord transformedRB;
+    private final Chase griKBChase;
     /*
      * A KB whose factbase will contain the GRI and whose rulebase the rules needed to compute the GRI
      */
@@ -29,8 +40,10 @@ public abstract class AbstractStaticGRIBasedExplainer {
      * @param kb the current kb
      */
     public AbstractStaticGRIBasedExplainer(KnowledgeBase kb) {
-        Pair<KnowledgeBase, StaticGRIRuleTransformer> pair = GRIBuilder.buildGRI(kb);
-        this.griKB = pair.getLeft();
+        this.originalRB  = kb;
+        this.transformedRB = StaticGRIRuleTransformer.instance().createTransformedRB(kb);
+        this.griKB = new KnowledgeBaseImpl(kb.getFactBase(), transformedRB.getStaticRuleBase());
+        this.griKBChase = DefaultChaseForExplanations.chase(griKB);
     }
 
     /**
@@ -39,12 +52,23 @@ public abstract class AbstractStaticGRIBasedExplainer {
      * @param query
      * @return
      */
-    public Set<KnowledgeBase> getAllExplanations(Atom query) {
-        RELTracer tracer = new RELTracer();
-        FactBase filteredGRI = tracer.computeQueryRelevant(griKB, ruleTransformer, query);
+    public Set<ExplanationType> getAllExplanations(Atom query) {
+        Atom queryWithFuncId = StaticGRIRuleTransformer.instance().createAtomWithStoredFnTermIdentifier(query);
 
-        return getGMUSProcessor().computeExplanations(filteredGRI, ruleTransformer, query);
+        if (!griKB.getFactBase().contains(queryWithFuncId)) {
+            return Set.of();
+        }
+
+        // add seed atom to the factbase
+        Atom RELquery = new AtomImpl(StaticGRIRuleTransformer.REL, StaticGRIRuleTransformer.createFnTermIdentifier(query));
+        griKB.getFactBase().add(RELquery);
+
+        // set tracing rules
+        griKBChase.setRuleBase(this.transformedRB.getDynamicRuleBase());
+        griKBChase.execute();
+
+        return getGMUSProcessor().computeAllExplanations(griKB,  query);
     }
 
-    abstract FactSupportGMUSProcessor getGMUSProcessor();
+    abstract ExplanationProcessor_GRI getGMUSProcessor();
 }
diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/explainers/FactSupportExplainer.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/explainers/FactSupportExplainer.java
index a8dfae0d2f3e3831a76287d6689631fb0b2d4dc1..d39e9c01157ef9b8857acace3a6fc1b39fd2fddf 100644
--- a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/explainers/FactSupportExplainer.java
+++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/explainers/FactSupportExplainer.java
@@ -1,21 +1,15 @@
 package fr.boreal.explanation.explainers;
 
-import fr.boreal.explanation.GRI.dynamicProcessing.RELTracer;
-import fr.boreal.explanation.GRI.staticProcessing.GRIBuilder;
-import fr.boreal.explanation.api.AtomicQueryExplanationEnumerator;
+import fr.boreal.explanation.api.processors.ExplanationProcessor_GRI;
 import fr.boreal.explanation.ruleFactories.StaticGRIRuleTransformer;
 import fr.boreal.explanation.solving_enumerating.gmus_processors.FactSupportGMUSProcessor;
 import fr.boreal.model.kb.api.FactBase;
 import fr.boreal.model.kb.api.KnowledgeBase;
-import fr.boreal.model.logicalElements.api.Atom;
-import org.apache.commons.lang3.tuple.Pair;
-
-import java.util.Set;
 
 /**
- * Computes kb-support explanations for a knowledge base and a ground atomic query
+ * Computes fact-support explanations for a knowledge base and a ground atomic query
  */
-public class FactSupportExplainer implements AtomicQueryExplanationEnumerator<KnowledgeBase> {
+public class FactSupportExplainer extends AbstractStaticGRIBasedExplainer<FactBase>  {
     KnowledgeBase gri;
     StaticGRIRuleTransformer ruleTransformer;
     /**
@@ -24,16 +18,12 @@ public class FactSupportExplainer implements AtomicQueryExplanationEnumerator<Kn
      * @param kb the current kb
      */
     public FactSupportExplainer(KnowledgeBase kb) {
-        Pair<KnowledgeBase, StaticGRIRuleTransformer> pair = GRIBuilder.buildGRI(kb);
-        gri = pair.getLeft();
-        ruleTransformer = pair.getRight();
+        super(kb);
     }
 
-    public Set<KnowledgeBase> getAllExplanations(Atom query) {
-        RELTracer tracer = new RELTracer();
-        FactBase filteredGRI = tracer.computeQueryRelevant(gri, ruleTransformer, query);
-
-        FactSupportGMUSProcessor gmusProcessor = new FactSupportGMUSProcessor();
-        return gmusProcessor.computeExplanations(filteredGRI, ruleTransformer, query);
+    @Override
+    ExplanationProcessor_GRI getGMUSProcessor() {
+        return new FactSupportGMUSProcessor();
     }
+
 }
diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/explainers/FactSupportProvenanceExplainer.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/explainers/FactSupportProvenanceExplainer.java
index 2f2a4434c7589509cc0fefb8b0b37ff737436f39..8c422cf0cc24cf7d68915e21e7b47a9473f6ee49 100644
--- a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/explainers/FactSupportProvenanceExplainer.java
+++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/explainers/FactSupportProvenanceExplainer.java
@@ -1,6 +1,6 @@
 package fr.boreal.explanation.explainers;
 
-import fr.boreal.explanation.api.AtomicQueryExplanationEnumerator;
+import fr.boreal.explanation.api.explainers.AtomicQueryExplainer;
 import fr.boreal.model.kb.api.FactBase;
 import fr.boreal.model.logicalElements.api.Atom;
 
@@ -9,7 +9,7 @@ import java.util.Set;
 /**
  * Computes fact-support-why-provenance explanations for a knowledge base and a ground atomic query
  */
-public class FactSupportProvenanceExplainer implements AtomicQueryExplanationEnumerator<FactBase> {
+public class FactSupportProvenanceExplainer implements AtomicQueryExplainer<FactBase> {
     public Set<FactBase> getAllExplanations(Atom query) {
         return Set.of();
     }
diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/explainers/KBSupportExplainer.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/explainers/KBSupportExplainer.java
index 3edd76fc5c47f18734e2d1064b990b58c73bae34..7eef5bd6833e6fcd753bac0491b0e59bb32724c8 100644
--- a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/explainers/KBSupportExplainer.java
+++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/explainers/KBSupportExplainer.java
@@ -1,39 +1,31 @@
 package fr.boreal.explanation.explainers;
 
-import fr.boreal.explanation.api.AtomicQueryExplanationEnumerator;
-import fr.boreal.explanation.GRI.dynamicProcessing.RELTracer;
-import fr.boreal.explanation.solving_enumerating.gmus_processors.KBSupportGMUSProcessor;
+import fr.boreal.explanation.api.processors.ExplanationProcessor_GRI;
 import fr.boreal.explanation.ruleFactories.StaticGRIRuleTransformer;
-import fr.boreal.explanation.GRI.staticProcessing.GRIBuilder;
+import fr.boreal.explanation.solving_enumerating.gmus_processors.FactSupportGMUSProcessor;
+import fr.boreal.explanation.solving_enumerating.gmus_processors.KBSupportGMUSProcessor;
 import fr.boreal.model.kb.api.FactBase;
 import fr.boreal.model.kb.api.KnowledgeBase;
-import fr.boreal.model.logicalElements.api.Atom;
-import org.apache.commons.lang3.tuple.Pair;
-
-import java.util.Set;
 
 /**
  * Computes kb-support explanations for a knowledge base and a ground atomic query
  */
-public class KBSupportExplainer implements AtomicQueryExplanationEnumerator<KnowledgeBase> {
+public class KBSupportExplainer extends AbstractStaticGRIBasedExplainer<KnowledgeBase> {
     KnowledgeBase gri;
     StaticGRIRuleTransformer ruleTransformer;
+
     /**
      * Sets the initial KB and compute the GRI
      *
      * @param kb the current kb
      */
     public KBSupportExplainer(KnowledgeBase kb) {
-        Pair<KnowledgeBase, StaticGRIRuleTransformer> pair = GRIBuilder.buildGRI(kb);
-        gri = pair.getLeft();
-        ruleTransformer = pair.getRight();
+        super(kb);
     }
 
-    public Set<KnowledgeBase> getAllExplanations(Atom query) {
-        RELTracer tracer = new RELTracer();
-        FactBase filteredGRI = tracer.computeQueryRelevant(gri, ruleTransformer, query);
-
-        KBSupportGMUSProcessor gmusProcessor = new KBSupportGMUSProcessor();
-        return gmusProcessor.computeExplanations(filteredGRI, ruleTransformer, query);
+    @Override
+    ExplanationProcessor_GRI getGMUSProcessor() {
+        return new KBSupportGMUSProcessor();
     }
+
 }
diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/explainers/NewFactSupportExplainer.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/explainers/NewFactSupportExplainer.java
deleted file mode 100644
index aef885070da6e8cf029cc9eb795704c06e1678d3..0000000000000000000000000000000000000000
--- a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/explainers/NewFactSupportExplainer.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package fr.boreal.explanation.explainers;
-
-import fr.boreal.explanation.GRI.dynamicProcessing.RELTracer;
-import fr.boreal.explanation.GRI.staticProcessing.GRIBuilder;
-import fr.boreal.explanation.api.AtomicQueryExplanationEnumerator;
-import fr.boreal.explanation.ruleFactories.StaticGRIRuleTransformer;
-import fr.boreal.explanation.solving_enumerating.gmus_processors.FactSupportGMUSProcessor;
-import fr.boreal.model.kb.api.FactBase;
-import fr.boreal.model.kb.api.KnowledgeBase;
-import fr.boreal.model.logicalElements.api.Atom;
-import org.apache.commons.lang3.tuple.Pair;
-
-import java.util.Set;
-
-/**
- * Computes kb-support explanations for a knowledge base and a ground atomic query
- */
-public class NewFactSupportExplainer extends AbstractStaticGRIBasedExplainer implements AtomicQueryExplanationEnumerator<KnowledgeBase> {
-    KnowledgeBase gri;
-    StaticGRIRuleTransformer ruleTransformer;
-    /**
-     * Sets the initial KB and compute the GRI
-     *
-     * @param kb the current kb
-     */
-    public NewFactSupportExplainer(KnowledgeBase kb) {
-        super(kb);
-    }
-
-    @Override
-    FactSupportGMUSProcessor getGMUSProcessor() {
-        return new FactSupportGMUSProcessor();
-    }
-
-}
diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/explainers/RuleSupportExplainer.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/explainers/RuleSupportExplainer.java
index 24b1abb675b8d029780c080365dac0c5c9aa10d0..852d2bebb2068a4a2e7185a562d0844f543a0b03 100644
--- a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/explainers/RuleSupportExplainer.java
+++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/explainers/RuleSupportExplainer.java
@@ -1,22 +1,16 @@
 package fr.boreal.explanation.explainers;
 
-import fr.boreal.explanation.GRI.dynamicProcessing.RELTracer;
-import fr.boreal.explanation.GRI.staticProcessing.GRIBuilder;
-import fr.boreal.explanation.api.AtomicQueryExplanationEnumerator;
+import fr.boreal.explanation.api.processors.ExplanationProcessor_GRI;
 import fr.boreal.explanation.ruleFactories.StaticGRIRuleTransformer;
 import fr.boreal.explanation.solving_enumerating.gmus_processors.FactSupportGMUSProcessor;
 import fr.boreal.explanation.solving_enumerating.gmus_processors.RuleSupportGMUSProcessor;
-import fr.boreal.model.kb.api.FactBase;
 import fr.boreal.model.kb.api.KnowledgeBase;
-import fr.boreal.model.logicalElements.api.Atom;
-import org.apache.commons.lang3.tuple.Pair;
-
-import java.util.Set;
+import fr.boreal.model.kb.api.RuleBase;
 
 /**
- * Computes kb-support explanations for a knowledge base and a ground atomic query
+ * Computes rule-support explanations for a knowledge base and a ground atomic query
  */
-public class RuleSupportExplainer implements AtomicQueryExplanationEnumerator<KnowledgeBase> {
+public class RuleSupportExplainer extends AbstractStaticGRIBasedExplainer<RuleBase>  {
     KnowledgeBase gri;
     StaticGRIRuleTransformer ruleTransformer;
     /**
@@ -25,16 +19,12 @@ public class RuleSupportExplainer implements AtomicQueryExplanationEnumerator<Kn
      * @param kb the current kb
      */
     public RuleSupportExplainer(KnowledgeBase kb) {
-        Pair<KnowledgeBase, StaticGRIRuleTransformer> pair = GRIBuilder.buildGRI(kb);
-        gri = pair.getLeft();
-        ruleTransformer = pair.getRight();
+        super(kb);
     }
 
-    public Set<KnowledgeBase> getAllExplanations(Atom query) {
-        RELTracer tracer = new RELTracer();
-        FactBase filteredGRI = tracer.computeQueryRelevant(gri, ruleTransformer, query);
-
-        RuleSupportGMUSProcessor gmusProcessor = new RuleSupportGMUSProcessor();
-        return gmusProcessor.computeExplanations(filteredGRI, ruleTransformer, query);
+    @Override
+    ExplanationProcessor_GRI getGMUSProcessor() {
+        return new RuleSupportGMUSProcessor();
     }
+
 }
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..4440a518a5d8808367ae200a2a25a304aa81fb43
--- /dev/null
+++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/ruleFactories/RuleTransformationRecord.java
@@ -0,0 +1,36 @@
+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);
+    }
+
+    public RuleBase getAllRules() {
+        Collection<FORule> temp = new LinkedHashSet<>();
+        temp.addAll(this.nodeBuildingRules);
+        temp.addAll(this.edgeBuildingRules);
+        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..a7952bbf5e934f4550dd79876c55caad7c444306 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
@@ -5,8 +5,6 @@ import com.google.common.collect.HashBiMap;
 import fr.boreal.model.formula.api.FOFormula;
 import fr.boreal.model.formula.factory.FOFormulaFactory;
 import fr.boreal.model.kb.api.KnowledgeBase;
-import fr.boreal.model.kb.api.RuleBase;
-import fr.boreal.model.kb.impl.RuleBaseImpl;
 import fr.boreal.model.logicalElements.api.*;
 import fr.boreal.model.logicalElements.factory.api.PredicateFactory;
 import fr.boreal.model.logicalElements.factory.api.TermFactory;
@@ -66,21 +64,22 @@ public class StaticGRIRuleTransformer {
      * (3) rel propagation rules
      */
 
-    public RuleBase createTransformedRB(KnowledgeBase kb) {
-
-        RuleBase rb = new RuleBaseImpl();
+    public RuleTransformationRecord createTransformedRB(KnowledgeBase kb) {
+        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/main/java/fr/boreal/explanation/solving_enumerating/GMUSSolver.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/GMUSSolverImpl.java
similarity index 87%
rename from integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/GMUSSolver.java
rename to integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/GMUSSolverImpl.java
index 4bc61a0d51877c25f200795f2801d433abaf2c5f..d528efbdcafb902584085b508e31e343dde3cb30 100644
--- a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/GMUSSolver.java
+++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/GMUSSolverImpl.java
@@ -1,7 +1,6 @@
 package fr.boreal.explanation.solving_enumerating;
 
 import com.google.common.collect.BiMap;
-import com.google.common.collect.HashBiMap;
 import fr.boreal.model.logicalElements.api.Term;
 
 import java.io.*;
@@ -10,17 +9,12 @@ import java.util.List;
 import java.util.Set;
 
 
-public class GMUSSolver {
+public class GMUSSolverImpl {
 
-    private static final GMUSSolver INSTANCE = new GMUSSolver();
-    public static GMUSSolver instance() {
-        return INSTANCE;
-    }
-
-    String tmpFileName = "gsat.gcnf";
-    File gcnfFile = new File(tmpFileName);
+    private static final String tmpFileName = "gsat.gcnf";
+    private static final File gcnfFile = new File(tmpFileName);
 
-    int timeout = 0;
+    private static final int timeout = 0;
 
     /**
      * This main methods call two methods:
@@ -33,7 +27,7 @@ public class GMUSSolver {
      *
      * @return gmuses
      **/
-    public Set<String> solve(BiMap<Term, Integer> propVarIDMap,
+    public static Set<String> solve(BiMap<Term, Integer> propVarIDMap,
             List<List<Integer>> clauses,
             int nbGroup) {
         Set<String> gmuses = new HashSet<>();
@@ -49,7 +43,7 @@ public class GMUSSolver {
      * @param clauses
      * @param nbGroup
      */
-    public void writeGCNF(BiMap<Term, Integer> propVarIDMap,
+    public static void writeGCNF(BiMap<Term, Integer> propVarIDMap,
             List<List<Integer>> clauses,
             int nbGroup
             ) {
@@ -89,7 +83,7 @@ public class GMUSSolver {
      * @param gcnfFile
      * @return
      */
-    public Set<String> getGMUSes(File gcnfFile) {
+    public static Set<String> getGMUSes(File gcnfFile) {
         Set<String> gmuses = new HashSet<>();
         ProcessBuilder build = new ProcessBuilder().redirectErrorStream(true);
         if (timeout == 0)
diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/GMUSTranslator.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/GMUSTranslatorImpl.java
similarity index 89%
rename from integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/GMUSTranslator.java
rename to integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/GMUSTranslatorImpl.java
index 10b6027c851fbe17fd6a357ffece4debf033d1be..f29c8cc52feb8ef05798c385df68bb9fbf5f12ff 100644
--- a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/GMUSTranslator.java
+++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/GMUSTranslatorImpl.java
@@ -13,11 +13,7 @@ import fr.boreal.storage.natives.SimpleInMemoryGraphStore;
 import java.util.HashSet;
 import java.util.Set;
 
-public class GMUSTranslator {
-    private static final GMUSTranslator INSTANCE = new GMUSTranslator();
-    public static GMUSTranslator instance() {
-        return INSTANCE;
-    }
+public class GMUSTranslatorImpl {
 
     /**
      * This method takes in the set of strings (each string represents a gmus) and the factIDMap/ruleIDMap
@@ -27,7 +23,7 @@ public class GMUSTranslator {
      * @param ruleIDMap
      * @return set of explanations
      */
-    public Set<KnowledgeBase> translateGMUSes(
+    public static Set<KnowledgeBase> translateGMUSes(
             Set<String> gmuses,
             BiMap<Integer, Atom> factIDMap,
             BiMap<Integer, FORule> ruleIDMap
@@ -51,7 +47,7 @@ public class GMUSTranslator {
      * @param ruleIDMap
      * @return
      */
-    public KnowledgeBase gmusToExpl(
+    public static KnowledgeBase gmusToExpl(
             String gmus,
             BiMap<Integer, Atom> factIDMap,
             BiMap<Integer, FORule> ruleIDMap) {
diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/encoders/AbstractKBtoGSATEncoder.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/encoders/AbstractGSATEncoderGRI.java
similarity index 88%
rename from integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/encoders/AbstractKBtoGSATEncoder.java
rename to integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/encoders/AbstractGSATEncoderGRI.java
index 34142c0195d8a01c0a966fd155222f797b843a1f..b9ed1393863738eea7ee1853fcdc93dda87d8a6a 100644
--- a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/encoders/AbstractKBtoGSATEncoder.java
+++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/encoders/AbstractGSATEncoderGRI.java
@@ -2,9 +2,10 @@ package fr.boreal.explanation.solving_enumerating.encoders;
 
 import com.google.common.collect.BiMap;
 import com.google.common.collect.HashBiMap;
-import fr.boreal.explanation.api.gmus.GMUSEncoder;
+import fr.boreal.explanation.api.encoders.GSATEncoder_GRI;
 import fr.boreal.explanation.ruleFactories.StaticGRIRuleTransformer;
 import fr.boreal.model.kb.api.FactBase;
+import fr.boreal.model.kb.api.KnowledgeBase;
 import fr.boreal.model.logicalElements.api.Atom;
 import fr.boreal.model.logicalElements.api.Predicate;
 import fr.boreal.model.logicalElements.api.StoredFunctionalTerm;
@@ -18,7 +19,7 @@ import java.util.Set;
 
 /**
  * This abstract class contains the main algorithm for encoding factbase with 4 additional abstract methods
- *
+ * <p>
  * This class computes an encoding of explanations as GCNF formulas that can later be processed by a MUS solver
  * <p>
  * Ground atoms are represented as propositional variables
@@ -39,19 +40,31 @@ import java.util.Set;
  * 1. factIDmap (nbGroup - atom)
  * 2. ruleIDmap (nbGroup - ungrounded rule)
  */
-public abstract class AbstractKBtoGSATEncoder implements GMUSEncoder {
+public abstract class AbstractGSATEncoderGRI implements GSATEncoder_GRI<KnowledgeBase, Atom> {
 
-    StaticGRIRuleTransformer staticGRIRuleTransformer;
+    StaticGRIRuleTransformer staticGRIRuleTransformer = StaticGRIRuleTransformer.instance();
     Predicate REL = StaticGRIRuleTransformer.REL;
     public BiMap<Term, Integer> propVarIDMap = HashBiMap.create();
     public BiMap<Integer, Atom> factIDMap = HashBiMap.create();
     public BiMap<Integer, FORule> ruleIDMap = HashBiMap.create();
     public List<List<Integer>> clauses = new ArrayList<>();
-    public int nbGroup;
+    protected int nbGroup;
+
+    public AbstractGSATEncoderGRI() {
+        this.nbGroup = getStartingGroupNumber();
+    }
 
-    public AbstractKBtoGSATEncoder(StaticGRIRuleTransformer staticGRIRuleTransformer, int nbGroup) {
-        this.staticGRIRuleTransformer = staticGRIRuleTransformer;
-        this.nbGroup = nbGroup;
+
+    /**
+     * @return the starting group number for the encoding
+     */
+    abstract int getStartingGroupNumber();
+
+    /**
+     * @return the number of groups
+     */
+    public int getNumberOfGroups() {
+        return this.nbGroup;
     }
 
     /**
@@ -62,13 +75,13 @@ public abstract class AbstractKBtoGSATEncoder implements GMUSEncoder {
      * @return set of explanations
      */
 
-    public EncodingResult encode(
-            FactBase filteredGRI,
+    public GSATEncodingResult_GRI encode(
+            KnowledgeBase filteredGRI,
             Atom query) {
         assignDefaultGroupNumberAndCreateClauseForStartQuery(query);
-        assignGroupNumbersAndComputeClausesForRELEdges(filteredGRI, query);
+        assignGroupNumbersAndComputeClausesForRELEdges(filteredGRI.getFactBase(), query);
 
-        return new EncodingResult(propVarIDMap,factIDMap,ruleIDMap,clauses, nbGroup);
+        return new GSATEncodingResult_GRI(propVarIDMap, factIDMap, ruleIDMap, clauses, nbGroup);
     }
 
     /**
@@ -104,9 +117,9 @@ public abstract class AbstractKBtoGSATEncoder implements GMUSEncoder {
         // we collect all RELEDGE_r predicates after tracing
         Set<Predicate> allRelEdgePredicatesAfterTracing = new HashSet<>();
         var predIt = filteredGRI.getPredicates();
-        while(predIt.hasNext()){
+        while (predIt.hasNext()) {
             var p = predIt.next();
-            if(p.label().startsWith(StaticGRIRuleTransformer.REL_EDGE_prefix)){
+            if (p.label().startsWith(StaticGRIRuleTransformer.REL_EDGE_prefix)) {
                 allRelEdgePredicatesAfterTracing.add(p);
             }
         }
diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/encoders/EncodingResult.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/encoders/EncodingResult.java
deleted file mode 100644
index 20d749827ca562807ffaf0399431d4c3fde93234..0000000000000000000000000000000000000000
--- a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/encoders/EncodingResult.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package fr.boreal.explanation.solving_enumerating.encoders;
-
-import com.google.common.collect.BiMap;
-import fr.boreal.model.logicalElements.api.Atom;
-import fr.boreal.model.logicalElements.api.Term;
-import fr.boreal.model.rule.api.FORule;
-
-import java.util.List;
-
-public record EncodingResult(BiMap<Term, Integer> propVarIDMap, BiMap<Integer, Atom> factIDMap,
-                             BiMap<Integer, FORule> ruleIDMap, List<List<Integer>>clauses, int nbGroup) {}
-
diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/encoders/FactSupportKBGSATEncoder.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/encoders/FactSupportKBGSATEncoder.java
index 64acfd076ce239562f80882189e324534be3bde0..5a115bcc713107cd01713a82968a59d73f9cdad9 100644
--- a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/encoders/FactSupportKBGSATEncoder.java
+++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/encoders/FactSupportKBGSATEncoder.java
@@ -1,16 +1,14 @@
 package fr.boreal.explanation.solving_enumerating.encoders;
 
-import fr.boreal.explanation.api.gmus.GMUSEncoder;
 import fr.boreal.explanation.ruleFactories.StaticGRIRuleTransformer;
+import fr.boreal.model.kb.api.KnowledgeBase;
+import fr.boreal.model.logicalElements.api.Atom;
 
-public class FactSupportKBGSATEncoder extends AbstractKBtoGSATEncoder implements GMUSEncoder {
+public class FactSupportKBGSATEncoder extends AbstractGSATEncoderGRI {
 
-    /**
-     * Constructor for Fact-support KB to GSAT encoder
-     * @param staticGRIRuleTransformer
-     */
-    public FactSupportKBGSATEncoder(StaticGRIRuleTransformer staticGRIRuleTransformer) {
-        super(staticGRIRuleTransformer, 1);
+    @Override
+    int getStartingGroupNumber() {
+        return 1;
     }
 
     /**
@@ -57,4 +55,9 @@ public class FactSupportKBGSATEncoder extends AbstractKBtoGSATEncoder implements
     public boolean needFact() {
         return true;
     }
+
+    @Override
+    public GSATEncodingResult_GRI encode(KnowledgeBase filteredGRI, Atom query) {
+        return null;
+    }
 }
diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/encoders/GSATEncodingResult_GRI.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/encoders/GSATEncodingResult_GRI.java
new file mode 100644
index 0000000000000000000000000000000000000000..38f279edd4c841ffd74e8f9e39f502406a1d76d0
--- /dev/null
+++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/encoders/GSATEncodingResult_GRI.java
@@ -0,0 +1,22 @@
+package fr.boreal.explanation.solving_enumerating.encoders;
+
+import com.google.common.collect.BiMap;
+import fr.boreal.model.logicalElements.api.Atom;
+import fr.boreal.model.logicalElements.api.Term;
+import fr.boreal.model.rule.api.FORule;
+
+import java.util.List;
+
+/**
+ *
+ * @param propVarIDMap map from propositional variables to integers
+ * @param factIDMap map from atoms to integers
+ * @param ruleIDMap maps from rules to integers
+ * @param clauses encoded GSAT
+ * @param nbGroup number of groups in the GSAT
+ */
+public record GSATEncodingResult_GRI(BiMap<Term, Integer> propVarIDMap,
+                                     BiMap<Integer, Atom> factIDMap,
+                                     BiMap<Integer, FORule> ruleIDMap,
+                                     List<List<Integer>>clauses, int nbGroup) {}
+
diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/encoders/KBSupportKBGSATEncoder.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/encoders/KBSupportKBGSATEncoder.java
index 0fea45cafeec70694050b03642283cf11c7f6fbc..e3edc8d3829ded4314ffa0562bd935dd2e7d99c2 100644
--- a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/encoders/KBSupportKBGSATEncoder.java
+++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/encoders/KBSupportKBGSATEncoder.java
@@ -1,16 +1,13 @@
 package fr.boreal.explanation.solving_enumerating.encoders;
 
-import fr.boreal.explanation.api.gmus.GMUSEncoder;
 import fr.boreal.explanation.ruleFactories.StaticGRIRuleTransformer;
+import fr.boreal.model.kb.api.KnowledgeBase;
+import fr.boreal.model.logicalElements.api.Atom;
 
-public class KBSupportKBGSATEncoder extends AbstractKBtoGSATEncoder implements GMUSEncoder {
+public class KBSupportKBGSATEncoder extends AbstractGSATEncoderGRI {
 
-    /**
-     * constructor for KB-support GCNF encoder
-     * @param staticGRIRuleTransformer
-     */
-    public KBSupportKBGSATEncoder(StaticGRIRuleTransformer staticGRIRuleTransformer) {
-        super(staticGRIRuleTransformer, 0);
+    int getStartingGroupNumber() {
+        return 0;
     }
 
     /**
@@ -60,4 +57,6 @@ public class KBSupportKBGSATEncoder extends AbstractKBtoGSATEncoder implements G
     public boolean needFact() {
         return true;
     }
+
+
 }
diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/encoders/RuleSupportKBGSATEncoder.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/encoders/RuleSupportKBGSATEncoder.java
index f12b2da61c0de444abd57691338a5852e36cec1b..e01165da7b4c752b5b938de50c782f6a33d4cc2d 100644
--- a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/encoders/RuleSupportKBGSATEncoder.java
+++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/encoders/RuleSupportKBGSATEncoder.java
@@ -1,12 +1,11 @@
 package fr.boreal.explanation.solving_enumerating.encoders;
 
-import fr.boreal.explanation.api.gmus.GMUSEncoder;
 import fr.boreal.explanation.ruleFactories.StaticGRIRuleTransformer;
 
-public class RuleSupportKBGSATEncoder extends AbstractKBtoGSATEncoder implements GMUSEncoder {
+public class RuleSupportKBGSATEncoder extends AbstractGSATEncoderGRI {
 
-    public RuleSupportKBGSATEncoder(StaticGRIRuleTransformer staticGRIRuleTransformer) {
-        super(staticGRIRuleTransformer,2);
+    int getStartingGroupNumber() {
+        return 2;
     }
 
     /**
diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/gmus_processors/AbstractSupportGMUSProcessor.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/gmus_processors/AbstractSupportGMUSProcessor.java
new file mode 100644
index 0000000000000000000000000000000000000000..42b6b5eba04162277139294b777189dd204f3b08
--- /dev/null
+++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/gmus_processors/AbstractSupportGMUSProcessor.java
@@ -0,0 +1,44 @@
+package fr.boreal.explanation.solving_enumerating.gmus_processors;
+
+import fr.boreal.explanation.api.encoders.GSATEncoder_GRI;
+import fr.boreal.explanation.api.processors.ExplanationProcessor_GRI;
+import fr.boreal.explanation.solving_enumerating.GMUSSolverImpl;
+import fr.boreal.explanation.solving_enumerating.GMUSTranslatorImpl;
+import fr.boreal.explanation.solving_enumerating.encoders.GSATEncodingResult_GRI;
+import fr.boreal.explanation.solving_enumerating.encoders.KBSupportKBGSATEncoder;
+import fr.boreal.model.kb.api.KnowledgeBase;
+import fr.boreal.model.logicalElements.api.Atom;
+
+import java.util.Set;
+
+public abstract class AbstractSupportGMUSProcessor<ExplanationType> implements ExplanationProcessor_GRI<ExplanationType,KnowledgeBase, Atom> {
+
+    protected static final GMUSSolverImpl solver = new GMUSSolverImpl();
+    protected static final GMUSTranslatorImpl translator = new GMUSTranslatorImpl();
+    protected GSATEncodingResult_GRI encoding;
+    protected Set<String> gmuses;
+    /**
+     * This method
+     * (1) takes in the filteredGRI (the factbase with REL/RELEDGES atom)
+     * (2) calls the encoder to construct the gcnf formula according to the type of explanations
+     * (3) calls the solver solve the formula from (2)
+     * and returns the set of rule-support explanations (in the form of knowledge base)
+     *
+     * @param filteredGRI
+     * @param query
+     * @return set of explanations
+     */
+    @Override
+    public Set<ExplanationType> computeAllExplanations(KnowledgeBase filteredGRI, Atom query) {
+
+        GSATEncoder_GRI encoder = getEncoder();
+        encoding = encoder.encode(filteredGRI, query);
+        gmuses = solver.solve(encoding.propVarIDMap(), encoding.clauses(), encoding.nbGroup());
+        return translate();
+
+    }
+
+    abstract GSATEncoder_GRI getEncoder();
+    abstract Set<ExplanationType>  translate();
+
+}
diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/gmus_processors/FactSupportGMUSProcessor.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/gmus_processors/FactSupportGMUSProcessor.java
index e1ddf57cc1957cd0702989f786d7b630d66d98ee..8d0869d483b26d65c8b93ce076039beafea1cc01 100644
--- a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/gmus_processors/FactSupportGMUSProcessor.java
+++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/gmus_processors/FactSupportGMUSProcessor.java
@@ -1,8 +1,10 @@
 package fr.boreal.explanation.solving_enumerating.gmus_processors;
 
+import fr.boreal.explanation.api.encoders.GSATEncoder_GRI;
+import fr.boreal.explanation.api.processors.ExplanationProcessor_GRI;
 import fr.boreal.explanation.ruleFactories.StaticGRIRuleTransformer;
-import fr.boreal.explanation.solving_enumerating.GMUSSolver;
-import fr.boreal.explanation.solving_enumerating.GMUSTranslator;
+import fr.boreal.explanation.solving_enumerating.GMUSSolverImpl;
+import fr.boreal.explanation.solving_enumerating.GMUSTranslatorImpl;
 import fr.boreal.explanation.solving_enumerating.encoders.FactSupportKBGSATEncoder;
 import fr.boreal.model.kb.api.FactBase;
 import fr.boreal.model.kb.api.KnowledgeBase;
@@ -10,33 +12,18 @@ import fr.boreal.model.logicalElements.api.Atom;
 
 import java.util.HashSet;
 import java.util.Set;
-import java.util.function.Function;
 
-public class FactSupportGMUSProcessor {
-    private Set<String> gmuses = new HashSet<>();
-    private static final GMUSSolver solver = new GMUSSolver();
-    private static final GMUSTranslator translator = new GMUSTranslator();
+public class FactSupportGMUSProcessor extends AbstractSupportGMUSProcessor<FactBase> {
 
-    /**
-     * This method
-     * (1) takes in the filteredGRI (the factbase with REL/RELEDGES atom)
-     * (2) calls the fact-support encoder to construct the gcnf formula
-     * (3) calls the solver solve the formula from (2)
-     * and returns the set of fact-support explanations (in the form of knowledge base with empty rulebase)
-     *
-     * @param filteredGRI
-     * @param staticGRIRuleTransformer
-     * @param query
-     * @return set of explanations
-     */
-    public Set<KnowledgeBase> computeExplanations(
-            FactBase filteredGRI,
-            StaticGRIRuleTransformer staticGRIRuleTransformer,
-            Atom query) {
-        FactSupportKBGSATEncoder encoder = new FactSupportKBGSATEncoder(staticGRIRuleTransformer);
-        var encoding = encoder.encode(filteredGRI, query);
-        gmuses = solver.solve(encoding.propVarIDMap(), encoding.clauses(), encoding.nbGroup());
+    @Override
+    GSATEncoder_GRI getEncoder() {
+        return new FactSupportKBGSATEncoder();
+    }
 
-        return translator.translateGMUSes(gmuses, encoding.factIDMap(), encoding.ruleIDMap());
+    @Override
+    Set<FactBase> translate() {
+        return Set.of();
+        // TODO adapt output translator.translateGMUSes(gmuses, encoding.factIDMap(), encoding.ruleIDMap());
     }
+
 }
diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/gmus_processors/KBSupportGMUSProcessor.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/gmus_processors/KBSupportGMUSProcessor.java
index 542d62c690737d857da9fb1032024a2ba88f5f29..9e021bb7cd7153f24a01ef84fc940787fa5e118f 100644
--- a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/gmus_processors/KBSupportGMUSProcessor.java
+++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/gmus_processors/KBSupportGMUSProcessor.java
@@ -1,9 +1,10 @@
 package fr.boreal.explanation.solving_enumerating.gmus_processors;
 
+import fr.boreal.explanation.api.processors.ExplanationProcessor_GRI;
 import fr.boreal.explanation.ruleFactories.StaticGRIRuleTransformer;
-import fr.boreal.explanation.api.gmus.GMUSEncoder;
-import fr.boreal.explanation.solving_enumerating.GMUSSolver;
-import fr.boreal.explanation.solving_enumerating.GMUSTranslator;
+import fr.boreal.explanation.api.encoders.GSATEncoder_GRI;
+import fr.boreal.explanation.solving_enumerating.GMUSSolverImpl;
+import fr.boreal.explanation.solving_enumerating.GMUSTranslatorImpl;
 import fr.boreal.explanation.solving_enumerating.encoders.KBSupportKBGSATEncoder;
 import fr.boreal.model.kb.api.FactBase;
 import fr.boreal.model.kb.api.KnowledgeBase;
@@ -12,31 +13,16 @@ import fr.boreal.model.logicalElements.api.Atom;
 import java.util.HashSet;
 import java.util.Set;
 
-public class KBSupportGMUSProcessor {
-    private Set<String> gmuses = new HashSet<>();
-    private static final GMUSSolver solver = new GMUSSolver();
-    private static final GMUSTranslator translator = new GMUSTranslator();
+public class KBSupportGMUSProcessor extends  AbstractSupportGMUSProcessor<KnowledgeBase>  {
 
-    /**
-     * This method
-     * (1) takes in the filteredGRI (the factbase with REL/RELEDGES atom)
-     * (2) calls the KB-support encoder to construct the gcnf formula
-     * (3) calls the solver solve the formula from (2)
-     * and returns the set of rule-support explanations (in the form of knowledge base)
-     *
-     * @param filteredGRI
-     * @param staticGRIRuleTransformer
-     * @param query
-     * @return set of explanations
-     */
-    public Set<KnowledgeBase> computeExplanations(
-            FactBase filteredGRI,
-            StaticGRIRuleTransformer staticGRIRuleTransformer,
-            Atom query) {
-        GMUSEncoder encoder = new KBSupportKBGSATEncoder(staticGRIRuleTransformer);
-        var encoding = encoder.encode(filteredGRI, query);
-        gmuses = solver.solve(encoding.propVarIDMap(), encoding.clauses(), encoding.nbGroup());
+    @Override
+    GSATEncoder_GRI getEncoder() {
+        return new KBSupportKBGSATEncoder();
+    }
 
+    @Override
+    Set<KnowledgeBase> translate() {
         return translator.translateGMUSes(gmuses, encoding.factIDMap(), encoding.ruleIDMap());
     }
+
 }
diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/gmus_processors/RuleSupportGMUSProcessor.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/gmus_processors/RuleSupportGMUSProcessor.java
index 8fe8d04371b0b38468b3867dc35a72592b7ee8f9..f5b5e1926ed3c5ce0cf73b07074b6f3264273bc3 100644
--- a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/gmus_processors/RuleSupportGMUSProcessor.java
+++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/gmus_processors/RuleSupportGMUSProcessor.java
@@ -1,42 +1,32 @@
 package fr.boreal.explanation.solving_enumerating.gmus_processors;
 
+import fr.boreal.explanation.api.encoders.GSATEncoder_GRI;
+import fr.boreal.explanation.api.processors.ExplanationProcessor_GRI;
 import fr.boreal.explanation.ruleFactories.StaticGRIRuleTransformer;
-import fr.boreal.explanation.solving_enumerating.GMUSSolver;
-import fr.boreal.explanation.solving_enumerating.GMUSTranslator;
+import fr.boreal.explanation.solving_enumerating.GMUSSolverImpl;
+import fr.boreal.explanation.solving_enumerating.GMUSTranslatorImpl;
 import fr.boreal.explanation.solving_enumerating.encoders.FactSupportKBGSATEncoder;
 import fr.boreal.explanation.solving_enumerating.encoders.RuleSupportKBGSATEncoder;
 import fr.boreal.model.kb.api.FactBase;
 import fr.boreal.model.kb.api.KnowledgeBase;
+import fr.boreal.model.kb.api.RuleBase;
 import fr.boreal.model.logicalElements.api.Atom;
 
 import java.util.HashSet;
 import java.util.Set;
 
-public class RuleSupportGMUSProcessor {
-    private Set<String> gmuses = new HashSet<>();
-    private static final GMUSSolver solver = new GMUSSolver();
-    private static final GMUSTranslator translator = new GMUSTranslator();
+public class RuleSupportGMUSProcessor extends AbstractSupportGMUSProcessor<FactBase> {
 
-    /**
-     * This method
-     * (1) takes in the filteredGRI (the factbase with REL/RELEDGES atom)
-     * (2) calls the rule-support encoder to construct the gcnf formula
-     * (3) calls the solver solve the formula from (2)
-     * and returns the set of rule-support explanations (in the form of knowledge base with empty factbase)
-     *
-     * @param filteredGRI
-     * @param staticGRIRuleTransformer
-     * @param query
-     * @return set of explanations
-     */
-    public Set<KnowledgeBase> computeExplanations(
-            FactBase filteredGRI,
-            StaticGRIRuleTransformer staticGRIRuleTransformer,
-            Atom query) {
-        RuleSupportKBGSATEncoder encoder = new RuleSupportKBGSATEncoder(staticGRIRuleTransformer);
-        var encoding = encoder.encode(filteredGRI, query);
-        gmuses = solver.solve(encoding.propVarIDMap(), encoding.clauses(), encoding.nbGroup());
+    @Override
+    GSATEncoder_GRI getEncoder() {
+        return new RuleSupportKBGSATEncoder();
+    }
 
-        return translator.translateGMUSes(gmuses, encoding.factIDMap(), encoding.ruleIDMap());
+    @Override
+    Set<FactBase> translate() {
+        return Set.of();
+        // TODO adapt output translator.translateGMUSes(gmuses, encoding.factIDMap(), encoding.ruleIDMap());
     }
+
+
 }
diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/gmus_processors/sat4j/FactSupportMUSSat4JProcessor.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/gmus_processors/sat4j/FactSupportMUSSat4JProcessor.java
index 28ce162ccc059fb9c006430cfe7636479506d350..3540084fedced43b91cfe0be613415734f6d32ed 100644
--- a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/gmus_processors/sat4j/FactSupportMUSSat4JProcessor.java
+++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/solving_enumerating/gmus_processors/sat4j/FactSupportMUSSat4JProcessor.java
@@ -13,11 +13,11 @@ public class FactSupportMUSSat4JProcessor {
     private Set<String> gmuses = new HashSet<>();
 
     public Set<KnowledgeBase> computeExplanations(
-            FactBase filteredGRI,
+            KnowledgeBase filteredGRI,
             StaticGRIRuleTransformer staticGRIRuleTransformer,
             Atom query) {
 
-        FactSupportKBGSATEncoder encoder = new FactSupportKBGSATEncoder(staticGRIRuleTransformer);
+        FactSupportKBGSATEncoder encoder = new FactSupportKBGSATEncoder();
         var encoding = encoder.encode(filteredGRI, query);
         var gmuses = Sat4JSolver.enumerateGMUSes(encoding.clauses());
 
diff --git a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/explainer/FactSupportExplainerTest.java b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/explainer/FactSupportExplainerTest.java
index de1fd1c937b71054c325afdeacfc042fdf889f6c..5e8f789d37f9a4a3cc2750f62564962e6448aa28 100644
--- a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/explainer/FactSupportExplainerTest.java
+++ b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/explainer/FactSupportExplainerTest.java
@@ -1,6 +1,5 @@
 package fr.boreal.test.explanation.explainer;
 
-import fr.boreal.explanation.explainers.FactSupportExplainer;
 import fr.boreal.explanation.ruleFactories.StaticGRIRuleTransformer;
 import fr.boreal.model.kb.api.FactBase;
 import fr.boreal.model.kb.api.KnowledgeBase;
diff --git a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/explainer/KBSupportExplainerTest.java b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/explainer/KBSupportExplainerTest.java
index 037479564763b428fd3b4a0682ca14f4afc7b61a..7027933bc2525f71d94b7b112de5ba22ba451ac5 100644
--- a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/explainer/KBSupportExplainerTest.java
+++ b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/explainer/KBSupportExplainerTest.java
@@ -1,6 +1,5 @@
 package fr.boreal.test.explanation.explainer;
 
-import fr.boreal.explanation.explainers.KBSupportExplainer;
 import fr.boreal.explanation.ruleFactories.StaticGRIRuleTransformer;
 import fr.boreal.model.kb.api.FactBase;
 import fr.boreal.model.kb.api.KnowledgeBase;
diff --git a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/explainer/RuleSupportExplainerTest.java b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/explainer/RuleSupportExplainerTest.java
index 0b0f742831a6ee8347d94a0c14bca360559c8259..2dd0f0a26003510a1876a13bfb03ee9d84b8845c 100644
--- a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/explainer/RuleSupportExplainerTest.java
+++ b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/explainer/RuleSupportExplainerTest.java
@@ -1,6 +1,5 @@
 package fr.boreal.test.explanation.explainer;
 
-import fr.boreal.explanation.explainers.RuleSupportExplainer;
 import fr.boreal.explanation.ruleFactories.StaticGRIRuleTransformer;
 import fr.boreal.model.kb.api.FactBase;
 import fr.boreal.model.kb.api.KnowledgeBase;
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..dd4f8396ef742812d12004df6f5adefdcda27232 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
@@ -29,7 +29,7 @@ public class FactSupportKBGSATEncoderTest {
     @BeforeEach
     public void setUp() {
         staticGRIRuleTransformer = new StaticGRIRuleTransformer();
-        encoder = new FactSupportKBGSATEncoder(staticGRIRuleTransformer);
+        encoder = new FactSupportKBGSATEncoder();
     }
     @Test
     public void startQueryTest() {
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..ce89b94164bcac4f761fec05b7ddf8090604f3a2 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
@@ -2,8 +2,8 @@ package fr.boreal.test.explanation.solvingViaGMUS;
 
 import fr.boreal.explanation.GRI.dynamicProcessing.RELTracer;
 import fr.boreal.explanation.solving_enumerating.encoders.KBSupportKBGSATEncoder;
-import fr.boreal.explanation.solving_enumerating.GMUSSolver;
-import fr.boreal.explanation.solving_enumerating.GMUSTranslator;
+import fr.boreal.explanation.solving_enumerating.GMUSSolverImpl;
+import fr.boreal.explanation.solving_enumerating.GMUSTranslatorImpl;
 import fr.boreal.explanation.ruleFactories.StaticGRIRuleTransformer;
 import fr.boreal.model.kb.api.FactBase;
 import fr.boreal.model.kb.api.KnowledgeBase;
@@ -23,8 +23,8 @@ import java.util.Set;
 
 public class GMUSSolverTest {
     KBSupportKBGSATEncoder gmusProcessor;
-    GMUSTranslator gmusTranslator;
-    GMUSSolver gmusSolver;
+    GMUSTranslatorImpl gmusTranslator;
+    GMUSSolverImpl gmusSolver;
     StaticGRIRuleTransformer staticGRIRuleTransformer;
 
     Predicate REL = staticGRIRuleTransformer.REL;
@@ -32,9 +32,9 @@ public class GMUSSolverTest {
     @BeforeEach
     public void setUp() {
         staticGRIRuleTransformer = new StaticGRIRuleTransformer();
-        gmusProcessor = new KBSupportKBGSATEncoder(staticGRIRuleTransformer);
-        gmusTranslator = new GMUSTranslator();
-        gmusSolver = new GMUSSolver();
+        gmusProcessor = new KBSupportKBGSATEncoder();
+        gmusTranslator = new GMUSTranslatorImpl();
+        gmusSolver = new GMUSSolverImpl();
     }
 
 
@@ -46,17 +46,17 @@ 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).getAllRules());
         TestData.chase(transformedKB);
 
         RELTracer tracer = new RELTracer();
-        FactBase relAtoms = tracer.computeQueryRelevant(transformedKB, staticGRIRuleTransformer, TestData.qa);
+        FactBase relAtoms = tracer.computeQueryRelevant(transformedKB, TestData.qa);
 
         gmusProcessor.assignDefaultGroupNumberAndCreateClauseForStartQuery(query);
         gmusProcessor.assignGroupNumbersAndComputeClausesForRELEdges(relAtoms, query);
 
 
-        Set<String> actual = gmusSolver.solve(gmusProcessor.propVarIDMap, gmusProcessor.clauses, gmusProcessor.nbGroup);
+        Set<String> actual = gmusSolver.solve(gmusProcessor.propVarIDMap, gmusProcessor.clauses, gmusProcessor.getNumberOfGroups());
 
         Assertions.assertEquals(Set.of("2 1"), actual);
 
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..919ff801afc69305b580e3e6f4c955661c569b7c 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
@@ -2,7 +2,7 @@ package fr.boreal.test.explanation.solvingViaGMUS;
 
 import fr.boreal.explanation.GRI.dynamicProcessing.RELTracer;
 import fr.boreal.explanation.solving_enumerating.encoders.KBSupportKBGSATEncoder;
-import fr.boreal.explanation.solving_enumerating.GMUSTranslator;
+import fr.boreal.explanation.solving_enumerating.GMUSTranslatorImpl;
 import fr.boreal.explanation.ruleFactories.StaticGRIRuleTransformer;
 import fr.boreal.model.kb.api.FactBase;
 import fr.boreal.model.kb.api.KnowledgeBase;
@@ -23,7 +23,7 @@ import java.util.List;
 
 public class GMUSTranslatorTest {
     KBSupportKBGSATEncoder gmusProcessor;
-    GMUSTranslator gmusTranslator;
+    GMUSTranslatorImpl gmusTranslator;
     StaticGRIRuleTransformer staticGRIRuleTransformer;
 
     Predicate REL = staticGRIRuleTransformer.REL;
@@ -31,8 +31,8 @@ public class GMUSTranslatorTest {
     @BeforeEach
     public void setUp() {
         this.staticGRIRuleTransformer = new StaticGRIRuleTransformer();
-        gmusProcessor = new KBSupportKBGSATEncoder(staticGRIRuleTransformer);
-        gmusTranslator = new GMUSTranslator();
+        gmusProcessor = new KBSupportKBGSATEncoder();
+        gmusTranslator = new GMUSTranslatorImpl();
     }
 
     @Test
diff --git a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/KBSupportKBGSATEncoderTest.java b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/KBSupportKBGSATEncoderTest.java
index 463066de09760aa63d1b5ba172cda1660b8b1fb5..6dc5948c97ba4a7eb7ec1b369b676abbc655ae3a 100644
--- a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/KBSupportKBGSATEncoderTest.java
+++ b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/KBSupportKBGSATEncoderTest.java
@@ -29,7 +29,7 @@ public class KBSupportKBGSATEncoderTest {
     @BeforeEach
     public void setUp() {
         staticGRIRuleTransformer = new StaticGRIRuleTransformer();
-        kBtoGSATEncoder = new KBSupportKBGSATEncoder(staticGRIRuleTransformer);
+        kBtoGSATEncoder = new KBSupportKBGSATEncoder();
     }
     @Test
     public void startQueryTest() {
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 1410e4e31713162528eafbd08872f9cc2eef9331..29be82562ad8faebf9b248d4abd20d6cd045a8b4 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
@@ -1,12 +1,9 @@
 package fr.boreal.test.explanation.solvingViaGMUS.sat4j;
 
 import fr.boreal.explanation.GRI.dynamicProcessing.RELTracer;
-import fr.boreal.explanation.explainers.FactSupportExplainer;
 import fr.boreal.explanation.ruleFactories.StaticGRIRuleTransformer;
-import fr.boreal.explanation.solving_enumerating.GMUSTranslator;
 import fr.boreal.explanation.solving_enumerating.encoders.FactSupportKBGSATEncoder;
 import fr.boreal.explanation.solving_enumerating.encoders.KBSupportKBGSATEncoder;
-import fr.boreal.explanation.solving_enumerating.gmus_processors.FactSupportGMUSProcessor;
 import fr.boreal.explanation.solving_enumerating.gmus_processors.sat4j.Sat4JSolver;
 import fr.boreal.model.kb.api.FactBase;
 import fr.boreal.model.kb.api.KnowledgeBase;
@@ -17,12 +14,10 @@ import fr.boreal.model.logicalElements.api.Atom;
 import fr.boreal.model.logicalElements.api.Predicate;
 import fr.boreal.storage.natives.SimpleInMemoryGraphStore;
 import fr.boreal.test.explanation.TestData;
-import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 import java.util.List;
-import java.util.Set;
 
 public class MUSSat4JSolverTest {
     StaticGRIRuleTransformer staticGRIRuleTransformer;
@@ -78,7 +73,7 @@ public class MUSSat4JSolverTest {
 
     @Test
     public void gmusToFactSupportExplTest() {
-        FactSupportKBGSATEncoder gmusProcessor = new FactSupportKBGSATEncoder(staticGRIRuleTransformer);
+        FactSupportKBGSATEncoder gmusProcessor = new FactSupportKBGSATEncoder();
         Atom query = TestData.qa;
 
         FactBase factBase = new SimpleInMemoryGraphStore(List.of(TestData.pa, TestData.ta));
@@ -101,7 +96,7 @@ public class MUSSat4JSolverTest {
 
     @Test
     public void gmusToKBSupportExplTest() {
-        KBSupportKBGSATEncoder encoder = new KBSupportKBGSATEncoder(staticGRIRuleTransformer);
+        KBSupportKBGSATEncoder encoder = new KBSupportKBGSATEncoder();
         Atom query = TestData.qa;
 
         FactBase factBase = new SimpleInMemoryGraphStore(List.of(TestData.pa, TestData.ta));