diff --git a/CHANGELOG.md b/CHANGELOG.md
index 321869d27c31645ff0f5fe76637e5e15985bc1af..321f3561bbe3506eddd531cd905b167faa0f5889 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,11 @@
 - :bug: : Fix
 - :arrow_double_up: : Dependency upgrade
 
+## 1.6.3
+- added configuration module
+- improved integraal keywords 
+- improved CLI
+
 ## 1.6.2
 
 ### Added
diff --git a/integraal/integraal-api/src/main/java/fr/boreal/api/high_level_api/EndUserAPI.java b/integraal/integraal-api/src/main/java/fr/boreal/api/high_level_api/EndUserAPI.java
index 16e5875badefd3ef8aea6678e778d61921cda941..d538546c9e348b13d42d263ab4835c50b176bb1b 100644
--- a/integraal/integraal-api/src/main/java/fr/boreal/api/high_level_api/EndUserAPI.java
+++ b/integraal/integraal-api/src/main/java/fr/boreal/api/high_level_api/EndUserAPI.java
@@ -8,11 +8,16 @@ import java.util.stream.StreamSupport;
 
 import com.google.common.collect.Iterators;
 
-import fr.boreal.backward_chaining.evaluators.QueryRewriter;
-import fr.boreal.backward_chaining.evaluators.RewritingOutput;
+import fr.boreal.component_builder.evaluators.query_rewriting.auxiliary.RewritingOutput;
 import fr.boreal.backward_chaining.unfolding.UCQUnfolder;
-import fr.boreal.component_builder.AlgorithmParameters;
 import fr.boreal.component_builder.api.IComponentBuilder;
+import fr.boreal.component_builder.evaluators.query_evaluation.QueryEvaluatorWithMultiEvaluator;
+import fr.boreal.component_builder.evaluators.query_rewriting.QueryRewriterWitMultiEvaluator;
+import fr.lirmm.boreal.util.timeout.CallableWithTimeout;
+import fr.boreal.component_builder.externalHaltingConditions.ExternalHaltingCondition;
+import fr.boreal.configuration.keywords.InteGraalKeywords;
+import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Parameters.Compilation;
+import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Checker;
 import fr.boreal.configuration.parameters.IGParameter;
 import fr.boreal.configuration.parameters.IGParameterValueExtractor;
 import fr.boreal.forward_chaining.chase.Chase;
@@ -25,15 +30,9 @@ import fr.boreal.model.query.api.Query;
 import fr.boreal.model.rule.api.FORule;
 import fr.boreal.model.ruleCompilation.api.RuleCompilation;
 import fr.boreal.model.ruleCompilation.api.RuleCompilationResult;
-import fr.boreal.query_evaluation.component.QueryEvaluationOutput;
-import fr.boreal.query_evaluation.component.QueryEvaluatorWithMultiEvaluator;
+import fr.boreal.component_builder.evaluators.query_evaluation.auxiliary.QueryEvaluationOutput;
 import fr.lirmm.boreal.util.Rules;
 import fr.lirmm.boreal.util.converter.RuleConverter;
-import fr.lirmm.boreal.util.evaluator.CallableWithTimeout;
-import fr.lirmm.boreal.util.externalHaltingConditions.ExternalHaltingCondition;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Checker;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Parameters.Compilation;
 import fr.lirmm.graphik.integraal.api.core.Rule;
 import fr.lirmm.graphik.integraal.api.core.RuleSet;
 import fr.lirmm.graphik.integraal.core.ruleset.LinkedListRuleSet;
@@ -100,6 +99,9 @@ public class EndUserAPI {
 			 */
 			Chase chase = IComponentBuilder.buildAndGetChase(fb, rb, params);
 			chase.execute();
+			System.out.println(chase.getDescription().toJson());
+			System.out.println(chase.getDescription().toPrettyString());
+			System.out.println(chase.getDescription().getCorrespondingParameters());
 			return fb;
 		};
 
@@ -168,7 +170,7 @@ public class EndUserAPI {
 	 */
 	public static Collection<Query> rewriteOld(RuleBase rb, Collection<Query> queries, Compilation ruleCompilationType,
 			ExternalHaltingCondition... conds) {
-		QueryRewriter rewriter = IComponentBuilder.buildAndGetOMQRewriter(rb, queries, ruleCompilationType, conds);
+		QueryRewriterWitMultiEvaluator rewriter = IComponentBuilder.buildAndGetOMQRewriter(rb, queries, ruleCompilationType, conds);
 		Iterable<RewritingOutput> it = rewriter.batchEvaluate();
 		return StreamSupport.stream(it.spliterator(), false).flatMap(out -> out.rewritings().getQueries().stream())
 				.collect(Collectors.toSet());
@@ -193,7 +195,7 @@ public class EndUserAPI {
 			/*
 			 * wrapped method body
 			 */
-			QueryRewriter rewriter = IComponentBuilder.buildAndGetOMQRewriter(rb, queries, params);
+			QueryRewriterWitMultiEvaluator rewriter = IComponentBuilder.buildAndGetOMQRewriter(rb, queries, params);
 			Iterable<RewritingOutput> it = rewriter.batchEvaluate();
 			return StreamSupport.stream(it.spliterator(), false).map(out -> out.rewritings())
 					.collect(Collectors.toList());
diff --git a/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_commander/InteGraalCommander.java b/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_commander/InteGraalCommander.java
index 2dee662903308b800a75ab0b48f7241d425fb313..753734fe41155791ac508bac8a1dc48619f41021 100644
--- a/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_commander/InteGraalCommander.java
+++ b/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_commander/InteGraalCommander.java
@@ -18,11 +18,11 @@ import com.beust.jcommander.Parameters;
 import fr.boreal.api.high_level_api.EndUserAPI;
 import fr.boreal.api.high_level_api.Environment;
 import fr.boreal.api.high_level_api.HybridRuleBase;
+import fr.boreal.configuration.keywords.InteGraalKeywords;
 import fr.boreal.io.dlgp.DlgpWriter;
 import fr.boreal.model.logicalElements.api.Substitution;
 import fr.boreal.model.query.api.Query;
 import fr.lirmm.boreal.util.enumerations.EnumUtils;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords;
 
 /**
  * CLI Client for a user wanting to easily use InteGraal for reasoning.
diff --git a/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_repl/CECommands.java b/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_repl/CECommands.java
index e2b2fbc8eda8cdc1684b7f41c1fd441ff4d17c47..867a73a054a4f09496a1a52fb7aeea6116f73a92 100644
--- a/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_repl/CECommands.java
+++ b/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_repl/CECommands.java
@@ -15,6 +15,7 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.function.Supplier;
+import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import org.jline.builtins.Less;
@@ -33,6 +34,7 @@ import fr.boreal.model.logicalElements.api.Predicate;
 import fr.boreal.model.query.api.Query;
 import fr.boreal.model.rule.api.FORule;
 import fr.boreal.storage.builder.StorageBuilder;
+import fr.boreal.storage.natives.SimpleInMemoryGraphStore;
 import fr.boreal.views.FederatedFactBase;
 import fr.boreal.views.builder.ViewBuilder;
 import picocli.CommandLine;
@@ -152,19 +154,22 @@ public class CECommands {
 
 				// One file
 				if (this.files.length == 1) {
-					IGRepl.writeIfVerbose("Loading file \"" + this.files[0].getAbsolutePath() + "\"...\n", PrintLevel.MAXIMAL);
+					Path filePath = Paths.get(this.files[0].getAbsolutePath());
+					IGRepl.writeIfVerbose("Loading file \"" + filePath + "\"...\n", PrintLevel.MAXIMAL);
 
 					if ((this.fact != null && this.fact.isEmpty())) this.fact = this.files[0].getName();
 					if ((this.rule != null && this.rule.isEmpty())) this.rule = this.files[0].getName();
 					if ((this.query != null && this.query.isEmpty())) this.query = this.files[0].getName();
 
 					try {
-						ComplexEnvironmentCommands.env.loadDLGPFile(this.fact, this.rule, this.query, new FileInputStream(this.files[0]), this.mode);
+						ComplexEnvironmentCommands.env.loadDLGPFile(this.fact, this.rule, this.query, new FileInputStream(this.files[0]), filePath, this.mode);
 						if (this.fact != null && set) ComplexEnvironmentCommands.env.setCurrentFactBase(this.fact);
 						if (this.rule != null && set) ComplexEnvironmentCommands.env.setCurrentRuleBase(this.rule);
 						if (this.query != null && set) ComplexEnvironmentCommands.env.setCurrentQueryBase(this.query);
 					} catch (ParseException e) {
-						IGRepl.writeIfVerbose("Warning: Parse Exception on \"" + this.files[0].getAbsolutePath() + "\". Aborting...\n", PrintLevel.MINIMAL);
+						IGRepl.writeIfVerbose("Warning: Parse Exception on \"" + this.files[0].getAbsolutePath() + "\".", PrintLevel.MINIMAL);
+						IGRepl.writeIfVerbose(e.getMessage() + "\n", PrintLevel.MINIMAL);
+						IGRepl.writeIfVerbose("Aborting...\n", PrintLevel.MINIMAL);
 						if (this.fact != null && !Checks.factbaseIsEmpty(this.fact))
 							ComplexEnvironmentCommands.env.removeFactBase(this.fact);
 						if (this.rule != null && !Checks.rulebaseIsEmpty(this.rule))
@@ -179,26 +184,49 @@ public class CECommands {
 				} else {
 
 					// If at least a target base has been specified, then we load every file in the same specified base(s)
+					// TODO: warning : this part has undesirable behavior when dlgp files have some VD loading (only the VD of last file will be kept)
 					if ((this.fact != null && !this.fact.isEmpty()) || (this.rule != null && !this.rule.isEmpty()) || (this.query != null && !this.query.isEmpty())) {
 
 						if (this.fact != null && !this.fact.isEmpty()) ComplexEnvironmentCommands.env.createFactBase(this.fact, this.mode);
 						if (this.rule != null && !this.rule.isEmpty()) ComplexEnvironmentCommands.env.createRuleBase(this.rule, this.mode);
 						if (this.query != null && !this.query.isEmpty()) ComplexEnvironmentCommands.env.createQueryBase(this.query, this.mode);
 						int counter = 0;
+						FederatedFactBase finalFFB = new FederatedFactBase(new SimpleInMemoryGraphStore());
 						for (File file : this.files) {
-							IGRepl.writeIfVerbose("Loading file \"" + file.getAbsolutePath() + "\"...\n", PrintLevel.MAXIMAL);
+							Path filePath = Paths.get(file.getAbsolutePath());
+							IGRepl.writeIfVerbose("Loading file \"" + filePath + "\"...\n", PrintLevel.MAXIMAL);
 							try {
-								ComplexEnvironmentCommands.env.loadDLGPFile(this.fact, this.rule, this.query, new FileInputStream(file), WriteMode.APPEND);
+								// TODO: hideous much?
+								// When we want to aggregate the different files' content (facts) into one base, we first load a file
+								// then put its content in a FFB iteratively (we might have views)
+								ComplexEnvironmentCommands.env.loadDLGPFile(this.fact, this.rule, this.query, new FileInputStream(file), filePath, WriteMode.APPEND);
+								if (this.fact != null) {
+									FactBase temp = ComplexEnvironmentCommands.env.getFactBaseByName(this.fact);
+									if (temp instanceof FederatedFactBase) {
+										((FederatedFactBase) temp).getViewDefinitions().forEach((pred, fb) -> finalFFB.addStorage(pred, fb));
+									}
+									finalFFB.addAll(temp.getAtoms());
+									
+								}
 							} catch (ParseException e) {
-								IGRepl.writeIfVerbose("Warning: Parse Exception on \"" + file.getAbsolutePath() + "\". Skipping this file...\n", PrintLevel.MINIMAL);
+								IGRepl.writeIfVerbose("Warning: Parse Exception on \"" + file.getAbsolutePath() + "\".\n", PrintLevel.MINIMAL);
+								IGRepl.writeIfVerbose(e.getMessage() + "\n", PrintLevel.MINIMAL);
+								IGRepl.writeIfVerbose("Skipping this file...\n", PrintLevel.MINIMAL);
 								counter++;
 							} catch (FileNotFoundException e) {
 								IGRepl.writeIfVerbose("Warning: \"" + file.getAbsolutePath() + "\" does not exist. Skipping this file...\n", PrintLevel.MINIMAL);
 							}
 						}
+						if (finalFFB.getViewDefinitions().size() == 0) {
+							ComplexEnvironmentCommands.env.putFactBase(this.fact, new SimpleInMemoryGraphStore(finalFFB.getDefaultStorage().getAtoms().toList()), this.mode);
+						} else {
+							ComplexEnvironmentCommands.env.putFactBase(this.fact, finalFFB, this.mode);
+						}
+						
 						if (counter == this.files.length) {
-							if (this.fact != null && !Checks.factbaseIsEmpty(this.fact))
+							if (this.fact != null && !Checks.factbaseIsEmpty(this.fact)) {
 								ComplexEnvironmentCommands.env.removeFactBase(this.fact);
+							}
 							if (this.rule != null && !Checks.rulebaseIsEmpty(this.rule))
 								ComplexEnvironmentCommands.env.removeRuleBase(this.rule);
 							if (this.query != null && !Checks.querybaseIsEmpty(this.query))
@@ -208,12 +236,15 @@ public class CECommands {
 					} else {  // Else, we load every file in its own base
 						for (File file : this.files) {
 							String fileName = file.getName();
+							Path filePath = Paths.get(file.getAbsolutePath());
 							IGRepl.writeIfVerbose("Loading file \"" + file.getAbsolutePath() + "\"...\n", PrintLevel.MAXIMAL);
 
 							try {
-								ComplexEnvironmentCommands.env.loadDLGPFile(fileName, fileName, fileName, new FileInputStream(file), this.mode);
+								ComplexEnvironmentCommands.env.loadDLGPFile(fileName, fileName, fileName, new FileInputStream(file), filePath, this.mode);
 							} catch (ParseException e) {
-								IGRepl.writeIfVerbose("Warning: Parse Exception on \"" + file.getAbsolutePath() + "\". Skipping this file...\n", PrintLevel.MINIMAL);
+								IGRepl.writeIfVerbose("Warning: Parse Exception on \"" + file.getAbsolutePath() + "\".\n", PrintLevel.MINIMAL);
+								IGRepl.writeIfVerbose(e.getMessage() + "\n", PrintLevel.MINIMAL);
+								IGRepl.writeIfVerbose("Skipping this file...\n", PrintLevel.MINIMAL);
 								ComplexEnvironmentCommands.env.removeFactBase(fileName);
 								ComplexEnvironmentCommands.env.removeRuleBase(fileName);
 								ComplexEnvironmentCommands.env.removeQueryBase(fileName);
@@ -299,37 +330,53 @@ public class CECommands {
 			StringWriter stringDlgpWriter = new StringWriter();
 			DlgpWriter dlgpW = new DlgpWriter(stringDlgpWriter);
 
-			int printSizeLimit = 20;
+			int printSizeLimit = 10;
 			int nbCol = (int)Stream.of(this.fact, this.rule, this.query).filter(Boolean.TRUE::equals).count();
 			int widthSizeLimit = (Math.round(ComplexEnvironmentCommands.lineReader.getTerminal().getWidth() - (nbCol * 4)) / nbCol);
 			widthSizeLimit = Math.max(widthSizeLimit, 20);
 			List<List<String>> matrix = new ArrayList<>();
 
-			String factBaseTitle = "Fact base";
-			String ruleBaseTitle = "Rule base";
-			String queryBaseTitle = "Query base";
-			int longestFact = Math.max(factBaseName.length(), factBaseTitle.length());
-			int longestRule = Math.max(ruleBaseName.length(), ruleBaseTitle.length());
-			int longestQuery = Math.max(queryBaseName.length(), queryBaseTitle.length());
+			String factBaseTitle = "Fact base: " + factBaseName;
+			String ruleBaseTitle = "Rule base: " + ruleBaseName;
+			String queryBaseTitle = "Query base: " + queryBaseName;
+			int longestFact = factBaseTitle.length();
+			int longestRule = ruleBaseTitle.length();
+			int longestQuery = queryBaseTitle.length();
 			if (this.fact) {
-				List<String> arrAtom = new ArrayList<>();
+				// TODO: the following really needs a refactoring...
 				FactBase fb = ComplexEnvironmentCommands.env.getFactBaseByName(factBaseName);
+				
+				List<String> arrFB = new ArrayList<>();
+				int adjust = printSizeLimit;
+
+				//Listing the views
+				List<String> arrView = new ArrayList<>();
+				Iterator<Predicate> iterView = null;
+				
 				if(fb instanceof FederatedFactBase ffb) {
-					for(Predicate p : ffb.getViewDefinitions().keySet()) {
-                        String fString = "view : " +
+					int idx = 0;
+					iterView = ffb.getViewDefinitions().keySet().iterator();
+					while (iterView.hasNext() && idx < printSizeLimit / 2) {
+						Predicate p = iterView.next();
+						String fString =
                                 p.label() +
                                 "/" +
                                 p.arity();
 						if (fString.length() > widthSizeLimit) fString = fString.substring(0, widthSizeLimit-3) + "...";
 						if (fString.length() > longestFact) longestFact = fString.length();
-						arrAtom.add(fString);
+						arrView.add(fString);
+						idx++;
 					}
+					adjust = printSizeLimit - (idx + 1);
 				}
-				Iterator<Atom> iter = fb.getAtoms().iterator();
+
+				// Listing the facts
+				List<String> arrAtom = new ArrayList<>();
+				Iterator<Atom> iterAtom = fb.getAtoms().iterator();
 				int idx = 0;
-				while (iter.hasNext() && idx < printSizeLimit) {
+				while (iterAtom.hasNext() && idx < Math.min(printSizeLimit,adjust)) {
 					try {
-						dlgpW.write(iter.next());
+						dlgpW.write(iterAtom.next());
 					} catch (IOException e) {
 						IGRepl.systemRegistry.trace(e);
 					}
@@ -340,12 +387,29 @@ public class CECommands {
 					stringDlgpWriter.getBuffer().setLength(0);
 					idx++;
 				}
+
+				String sep = "-";
+				int dash_size = 0;
+				if(fb instanceof FederatedFactBase ffb) {
+					factBaseTitle = "Federated fact base: "+ factBaseName;
+					longestFact = Math.max(longestFact, factBaseTitle.length());
+					sep = " Views ";
+					dash_size = (longestFact - sep.length()) / 2;
+					arrFB.add("-".repeat(dash_size) + sep + "-".repeat(longestFact - (dash_size + sep.length())));
+					arrView.sort(null);
+					if (arrView.size() == 0) arrFB.add("(Empty)");
+					else arrFB.addAll(arrView);
+					if (iterView.hasNext()) arrFB.add("...");
+					sep = " Facts ";
+				}
+				arrFB.add(0,factBaseTitle);
+				dash_size = (longestFact - sep.length()) / 2;
+				arrFB.add("-".repeat(dash_size) + sep + "-".repeat(longestFact - (dash_size + sep.length())));
 				arrAtom.sort(null);
-				if (iter.hasNext()) arrAtom.add("...");
-				arrAtom.add(0,factBaseTitle);
-				arrAtom.add(1,factBaseName);
-				arrAtom.add(2, "-".repeat(longestFact));
-				matrix.add(arrAtom);
+				if (arrAtom.size() == 0) arrFB.add("(Empty)");
+				else arrFB.addAll(arrAtom);
+				if (iterAtom.hasNext()) arrFB.add("...");
+				matrix.add(arrFB);
 			}
 			if (this.rule) {
 				List<String> arrRule = new ArrayList<>();
@@ -366,9 +430,9 @@ public class CECommands {
 				}
 				arrRule.sort(null);
 				if (iter.hasNext()) arrRule.add("...");
+				if (arrRule.size() == 0) arrRule.add("(Empty)");
 				arrRule.add(0,ruleBaseTitle);
-				arrRule.add(1,ruleBaseName);
-				arrRule.add(2, "-".repeat(longestRule));
+				arrRule.add(1, "-".repeat(longestRule));
 				matrix.add(arrRule);
 			}
 			if (this.query) {
@@ -390,9 +454,9 @@ public class CECommands {
 				}
 				arrQuery.sort(null);
 				if (iter.hasNext()) arrQuery.add("...");
+				if (arrQuery.size() == 0) arrQuery.add("(Empty)");
 				arrQuery.add(0,queryBaseTitle);
-				arrQuery.add(1,queryBaseName);
-				arrQuery.add(2, "-".repeat(longestQuery));
+				arrQuery.add(1, "-".repeat(longestQuery));
 				matrix.add(arrQuery);
 			}
 
@@ -491,10 +555,28 @@ public class CECommands {
 				StringWriter stringDlgpWriter = new StringWriter();
 				DlgpWriter dlgpW = new DlgpWriter(stringDlgpWriter);
 
+
+				
 				for (String factbase : this.factBases) {
+//					List<String> arrFact = new ArrayList<>();
+					
+					FactBase fb = ComplexEnvironmentCommands.env.getFactBaseByName(factbase);
+					
 					if (Checks.factbaseExists(factbase)) {
+						List<String> arrView = new ArrayList<>();
+						if (fb instanceof FederatedFactBase ffb) {
+							Iterator<Predicate> iterView = ffb.getViewDefinitions().keySet().iterator();
+							while (iterView.hasNext()) {
+								Predicate p = iterView.next();
+								String fString =
+		                                p.label() + "/" + p.arity() + "\n";
+								arrView.add(fString);
+							}
+							arrView.sort(null);
+						}
+						
 						ArrayList<String> arrAtom = new ArrayList<>();
-						Iterable<Atom> iter = ComplexEnvironmentCommands.env.getFactBaseByName(factbase).getAtoms()::iterator;
+						Iterable<Atom> iter = fb.getAtoms()::iterator;
 						for (Atom a : iter) {
 							dlgpW.write(a);
 							dlgpW.flush();
@@ -502,7 +584,24 @@ public class CECommands {
 							stringDlgpWriter.getBuffer().setLength(0);
 						}
 						arrAtom.sort(null);
+						if (arrAtom.size() == 0) arrAtom.add("(Empty)");
+						if (arrView.size() == 0) arrView.add("(Empty)");
+						
+//						if (arrView.size() != 0) {
+							arrView.add(0, "*********\n");
+							arrView.add(1, "* Views *\n");
+							arrView.add(2, "*********\n");
+							arrView.add(3, "\n");
+							
+							arrAtom.add(0, "\n\n*********\n");
+							arrAtom.add(1, "* Facts *\n");
+							arrAtom.add(2, "*********\n");
+							arrAtom.add(3, "\n");
+//						}
+						
+						for (String s : arrView) stringDlgpWriter.append(s);
 						for (String s : arrAtom) stringDlgpWriter.append(s);
+						
 						sources.add(new InputStreamSource(new ByteArrayInputStream(stringDlgpWriter.toString().getBytes(StandardCharsets.UTF_8)), true, factbase + " (facts)"));
 						stringDlgpWriter.getBuffer().setLength(0);
 					}
@@ -517,6 +616,11 @@ public class CECommands {
 							stringDlgpWriter.getBuffer().setLength(0);
 						}
 						arrRule.sort(null);
+						if (arrRule.size() == 0) arrRule.add("(Empty)");
+						arrRule.add(0, "*********\n");
+						arrRule.add(1, "* Rules *\n");
+						arrRule.add(2, "*********\n");
+						arrRule.add(3, "\n");
 						for (String s : arrRule) stringDlgpWriter.append(s);
 						sources.add(new InputStreamSource(new ByteArrayInputStream(stringDlgpWriter.toString().getBytes(StandardCharsets.UTF_8)), true, rulebase + " (rules)"));
 						stringDlgpWriter.getBuffer().setLength(0);
@@ -533,6 +637,11 @@ public class CECommands {
 							stringDlgpWriter.getBuffer().setLength(0);
 						}
 						arrQuery.sort(null);
+						if (arrQuery.size() == 0) arrQuery.add("(Empty)");
+						arrQuery.add(0, "***********\n");
+						arrQuery.add(1, "* Queries *\n");
+						arrQuery.add(2, "***********\n");
+						arrQuery.add(3, "\n");
 						for (String s : arrQuery) stringDlgpWriter.append(s);
 						sources.add(new InputStreamSource(new ByteArrayInputStream(stringDlgpWriter.toString().getBytes(StandardCharsets.UTF_8)), true, querybase + " (queries)"));
 						stringDlgpWriter.getBuffer().setLength(0);
diff --git a/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_repl/ComplexEnvironment.java b/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_repl/ComplexEnvironment.java
index 3248df6b2c31389d2f9bbe73bcddd9c7f2570c40..a7b0a4843bc0ce82a1fd5e4e46e9f35bcb088ce2 100644
--- a/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_repl/ComplexEnvironment.java
+++ b/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_repl/ComplexEnvironment.java
@@ -1,13 +1,19 @@
 package fr.boreal.api.integraal_repl;
 
 import java.io.InputStream;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
+import fr.boreal.api.integraal_repl.CECommands.ComplexEnvironmentCommands;
+import fr.boreal.api.integraal_repl.ComplexEnvironment.WriteMode;
+import fr.boreal.api.integraal_repl.IGRepl.PrintLevel;
 import fr.boreal.io.api.ParseException;
+import fr.boreal.io.dlgp.Directive;
 import fr.boreal.io.dlgp.DlgpParser;
 import fr.boreal.io.dlgp.DlgpUtil;
 import fr.boreal.model.kb.api.FactBase;
@@ -21,7 +27,11 @@ import fr.boreal.model.logicalElements.factory.impl.SameObjectTermFactory;
 import fr.boreal.model.query.api.FOQuery;
 import fr.boreal.model.query.api.Query;
 import fr.boreal.model.rule.api.FORule;
+import fr.boreal.storage.builder.StorageBuilder;
 import fr.boreal.storage.natives.SimpleInMemoryGraphStore;
+import fr.boreal.views.FederatedFactBase;
+import fr.boreal.views.builder.ViewBuilder;
+import fr.boreal.views.builder.ViewBuilder.ViewBuilderException;
 
 /**
  * An object that represents an environment for a logic-based system.
@@ -446,10 +456,51 @@ public class ComplexEnvironment {
 	}
 
 	/* TODO:
-	 * - we are not taking are of redundancies here; should we?
+	 * - we are not taking care of redundancies here; should we?
 	 * - add warning if one of the "bases" is empty in the dlgp file ?
 	 */
-	public void loadDLGPFiles(String factBaseName, String ruleBaseName, String queryBaseName, InputStream[] dlgpList, WriteMode mode) throws ParseException {
+	// UNUSED
+//	public void loadDLGPFiles(String factBaseName, String ruleBaseName, String queryBaseName, InputStream[] dlgpList, WriteMode mode) throws ParseException {
+//		FactBase factbase = null;
+//		RuleBase rulebase = null;
+//		Collection<Query> querybase = null;
+//
+//		if (factBaseName != null) {
+//			factbase = this.createFactBase(factBaseName, mode);
+//		}
+//		if (ruleBaseName != null ) {
+//			rulebase = this.createRuleBase(ruleBaseName, mode);
+//		}
+//		if (queryBaseName != null) {
+//			querybase = this.createQueryBase(queryBaseName, mode);
+//		}
+//
+//		// TODO: the factories will probably annoy us because they won't allow for the same predicates with different arities over different bases
+//		// That might actually be desirable, if we need to mix and match different bases
+//		//		try {
+//
+//		for (InputStream dlgp : dlgpList) {
+//			DlgpParser dlgp_parser = new DlgpParser(dlgp);
+//			while (dlgp_parser.hasNext()) {
+//				Object result = dlgp_parser.next();
+//				if (factbase != null && result instanceof Atom) {
+//					factbase.add((Atom) result);
+//				} else if (rulebase != null && result instanceof FORule) {
+//					rulebase.add((FORule) result);
+//				} else if (querybase != null && result instanceof FOQuery) {
+//					querybase.add((Query) result);
+//				}
+//			}
+//			dlgp_parser.close();
+//		}
+//	}
+
+	// UNUSED
+//	public void loadDLGPFile(String factBaseName, String ruleBaseName, String queryBaseName, InputStream dlgp, WriteMode mode) throws ParseException {
+//		this.loadDLGPFiles(factBaseName, ruleBaseName, queryBaseName, new InputStream[] {dlgp}, mode);
+//	}
+	
+	public void loadDLGPFile(String factBaseName, String ruleBaseName, String queryBaseName, InputStream dlgp, Path dlgpFileSourcePath, WriteMode mode) throws ParseException {
 		FactBase factbase = null;
 		RuleBase rulebase = null;
 		Collection<Query> querybase = null;
@@ -464,28 +515,41 @@ public class ComplexEnvironment {
 			querybase = this.createQueryBase(queryBaseName, mode);
 		}
 
-		// TODO: the factories will probably annoy us because they won't allow for the same predicates with different arities over different bases
-		// That might actually be desirable, if we need to mix and match different bases
-		//		try {
-
-		for (InputStream dlgp : dlgpList) {
-			DlgpParser dlgp_parser = new DlgpParser(dlgp);
-			while (dlgp_parser.hasNext()) {
-				Object result = dlgp_parser.next();
-				if (factbase != null && result instanceof Atom) {
-					factbase.add((Atom) result);
-				} else if (rulebase != null && result instanceof FORule) {
-					rulebase.add((FORule) result);
-				} else if (querybase != null && result instanceof FOQuery) {
-					querybase.add((Query) result);
+		DlgpParser dlgp_parser = new DlgpParser(dlgp);
+		while (dlgp_parser.hasNext()) {
+			Object result = dlgp_parser.next();
+			if (factbase != null && result instanceof Atom) {
+				factbase.add((Atom) result);
+			} else if (rulebase != null && result instanceof FORule) {
+				rulebase.add((FORule) result);
+			} else if (querybase != null && result instanceof FOQuery) {
+				querybase.add((Query) result);
+			} else if (result instanceof Directive) {
+				// TODO: we should probably have a subroutine that is called here and in the mapping command
+				if (dlgpFileSourcePath != null) {
+					// TODO: For now, VD file, if present, is only loaded if fileSourcePath is not null
+					// It can be considered as a flag meaning we should load the VD file, in addition to provide the path (of the dlgp file)
+					if (((Directive) result).type() == Directive.Type.VIEW) {
+						String value = (String) ((Directive) result).value();
+						// If the path is not absolute, we use the dlgp file path as origin
+						Path vdPath = Paths.get(value);
+						if (!vdPath.isAbsolute()) {
+							vdPath = dlgpFileSourcePath.getParent().resolve(vdPath);
+						}
+
+						FederatedFactBase federation;
+						if (factbase == null) factbase = new SimpleInMemoryGraphStore();
+						try {
+							federation = new FederatedFactBase(factbase, ViewBuilder.createFactBases(vdPath.toString()));
+							this.putFactBase(factBaseName, federation, mode);
+						} catch (ViewBuilderException e) {
+							IGRepl.writeIfVerbose("An error occurred while parsing the view definition file. Skipping.\n", PrintLevel.MAXIMAL);
+							IGRepl.writeIfVerbose(e.getMessage(), PrintLevel.MAXIMAL);
+						}
+					}		
 				}
 			}
-			dlgp_parser.close();
 		}
-		//		}
-	}
-
-	public void loadDLGPFile(String factBaseName, String ruleBaseName, String queryBaseName, InputStream dlgp, WriteMode mode) throws ParseException {
-		this.loadDLGPFiles(factBaseName, ruleBaseName, queryBaseName, new InputStream[] {dlgp}, mode);
+		dlgp_parser.close();
 	}
 }
diff --git a/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_repl/IGCommands.java b/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_repl/IGCommands.java
index cbda2af9dff3e69f9f2dfad9ec01562d6190f1c7..2e1472c3d2fb6f88c6e9bc1573f57e73dc649db3 100644
--- a/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_repl/IGCommands.java
+++ b/integraal/integraal-api/src/main/java/fr/boreal/api/integraal_repl/IGCommands.java
@@ -7,9 +7,12 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
+import java.util.StringJoiner;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -24,6 +27,10 @@ import fr.boreal.api.high_level_api.EndUserAPI;
 import fr.boreal.api.high_level_api.HybridRuleBase;
 import fr.boreal.api.integraal_repl.ComplexEnvironment.WriteMode;
 import fr.boreal.api.integraal_repl.IGRepl.PrintLevel;
+import fr.boreal.component_builder.externalHaltingConditions.ExternalHaltingCondition;
+import fr.boreal.component_builder.externalHaltingConditions.ExternalHaltingConditionFactory;
+import fr.boreal.configuration.keywords.InteGraalKeywords;
+import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Parameters.Compilation;
 import fr.boreal.io.api.ParseException;
 import fr.boreal.io.dlgp.DlgpUtil;
 import fr.boreal.io.dlgp.DlgpWriter;
@@ -32,14 +39,12 @@ import fr.boreal.model.kb.api.RuleBase;
 import fr.boreal.model.kb.impl.RuleBaseImpl;
 import fr.boreal.model.logicalElements.api.Atom;
 import fr.boreal.model.logicalElements.api.Substitution;
+import fr.boreal.model.logicalElements.api.Term;
+import fr.boreal.model.logicalElements.api.Variable;
 import fr.boreal.model.query.api.FOQuery;
 import fr.boreal.model.query.api.Query;
 import fr.boreal.model.rule.api.FORule;
 import fr.boreal.storage.natives.SimpleInMemoryGraphStore;
-import fr.lirmm.boreal.util.externalHaltingConditions.ExternalHaltingCondition;
-import fr.lirmm.boreal.util.externalHaltingConditions.ExternalHaltingConditionFactory;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Parameters.Compilation;
 import picocli.CommandLine;
 import picocli.CommandLine.Command;
 import picocli.CommandLine.Help;
@@ -81,34 +86,58 @@ public class IGCommands {
 		 * Prints the substitutions from the iterator.
 		 *
 		 * @param subIt  The iterator of substitutions containing the query results.
+		 * @param varsOrder	 The variables to print; this provides the order of the variables
 		 * @param writer The DlgpWriter object used to write the results.break;
 		 * @param max    The maximum number of substitutions to print.
 		 */
 		// TODO: This method should return a string instead
-		public static void printSubstitutions(Iterator<Substitution> subIt, DlgpWriter writer, Integer max) {
-			try {
-				if (subIt.hasNext()) {
-					while (subIt.hasNext()) {
-						if (max != null && max == 0)
-							return;
-						Substitution sub = subIt.next();
-						if (sub.isEmpty()) {
-							writer.write("True\n");
-							writer.flush();
-						} else {
-							writer.write(sub.toString());
-							writer.write("\n");
-							writer.flush();
+		public static void printSubstitutions(Iterator<Substitution> subIt, Collection<Variable> varsOrder, DlgpWriter writer, Integer max) {
+			boolean stop = false;
+			if (max != null && max == 0)
+				stop = true;
+			
+			// First, let's see if we have no answer (in that case, the query is false)
+			if (!subIt.hasNext()) {
+				IGRepl.writeIfVerbose("False\n", PrintLevel.MINIMAL);
+			} else { // Here we have at least one answer
+				// Let's check if the first answer is "empty" (in that case, there is only constant and
+				// no substitution: the query is true)
+				// Note that if the user ask for 0 answer, this will behave as if the substitution is empty
+				Substitution sub = subIt.next();
+				if (sub.isEmpty() || stop) {
+					IGRepl.writeIfVerbose("True\n", PrintLevel.MINIMAL);
+					// Since it is true, there is no need to continue
+//					return;
+				} else {
+					// We have some substitutions, so some variables, hence let's print them
+					// TODO: here print the header of the "table" with only the variables
+//					String varStr = varsOrder.stream().map(Variable::toString).collect(Collectors.joining(" | "));
+//					String varSep = "-".repeat(varStr.length());
+//					IGRepl.writeIfVerbose("|" + varStr + "|\n", PrintLevel.MINIMAL);
+//					IGRepl.writeIfVerbose("|" + varSep + "|\n", PrintLevel.MINIMAL);
+											
+					// Then print the first substitution that has already been extracted
+					Map<Variable, Term> subMap = sub.toMap();
+					StringJoiner str = new StringJoiner(", ");
+					for (Variable var : varsOrder) {
+						str.add(var + " : " + subMap.get(var).toString());
+					}
+					IGRepl.writeIfVerbose(str.toString() + "\n", PrintLevel.MINIMAL);
+				
+					// Then, let's continue with the remainder					
+					while (subIt.hasNext() && !stop) {
+						subMap = subIt.next().toMap();
+						str = new StringJoiner(", ");
+						for (Variable var : varsOrder) {
+							str.add(var + " : " + subMap.get(var).toString());
+						}
+						IGRepl.writeIfVerbose(str.toString() + "\n", PrintLevel.MINIMAL);
+						
+						if (max != null && max-- == 0) {
+								stop = true;
 						}
-						if (max != null)
-							max--;
 					}
-				} else {
-					writer.write("False\n");
-					writer.flush();
-				}
-			} catch (IOException e) {
-				IGRepl.systemRegistry.trace(e);
+				} 
 			}
 		}
 
@@ -629,40 +658,48 @@ public class IGCommands {
 							PrintLevel.WARNING);
 				}
 				IGRepl.writeIfVerbose("\n", PrintLevel.MINIMAL);
-				if (!ucq) {
+				if (!ucq) {					
 					int index = 1;
 					for (Query query : queriesToUse) {
-						IGRepl.writeIfVerbose("Query " + index++ + ": ", PrintLevel.MINIMAL);
-						IGRepl.writeIfVerbose(query, PrintLevel.MINIMAL);
-						IGRepl.writeIfVerbose("\n", PrintLevel.MINIMAL);
-						InteGraalCommands.printSubstitutions(EndUserAPI.evaluateOld(factsToUse, query), IGRepl.dlgpWriter,
+						IGRepl.writeIfVerbose("Query " + index++ + ": " + query + "\n", PrintLevel.MINIMAL);
+						InteGraalCommands.printSubstitutions(EndUserAPI.evaluateOld(factsToUse, query), query.getAnswerVariables(), IGRepl.dlgpWriter,
 								max);
 						IGRepl.writeIfVerbose("\n", PrintLevel.MINIMAL);
 					}
-				} else {
+				} 
+				else {
 					// Here, we basically reconstruct the string that represents the UCQ to have
 					// something pretty
 					// (something like ?(X,...,Z) :- pred1(X,...) | pred2(Y,...) )
 
-					List<FOQuery<?>> queriesToUseTyped = List.of();
-					for (Query q : queriesToUseTyped) {
+					// First, let's convert the Queries into FOQueries
+					// (and if a query is not instance of FOQueries, it is skipped) 
+					List<FOQuery<?>> queriesToUseTyped = new ArrayList<FOQuery<?>>();
+					for (Query q : queriesToUse) {
 						if (q instanceof FOQuery<?> qq) {
 							queriesToUseTyped.add(qq);
 						} else {
-							LOG.error("Wrong query type when reconstructing the UCQ from a set");
+							LOG.error("Wrong query type on " + q + " when reconstructing the UCQ from a set. Skipped");
 						}
+					}	
+
+					// Then, let's obtain the answer variables (and their order) that are needed 
+					// both for printing and evaluating
+					Collection<Variable> ansVarsOrder = new LinkedHashSet<Variable>();
+					
+					StringJoiner formulasJoiner = new StringJoiner(" | ");
+					for (FOQuery q : queriesToUseTyped) {
+						ansVarsOrder.addAll(q.getAnswerVariables());
+						formulasJoiner.add(q.getFormula().toString());
 					}
-
-					String ucqStr = "UCQ: " + queriesToUseTyped.stream()
-							// TODO: probably the most hideous line of code ever, but oh well...
-							.map(q -> "?(" + String.join(",",
-									q.getAnswerVariables().stream().map(Object::toString).toArray(CharSequence[]::new))
-									+ ") :- " + q.getFormula() + ".")
-							.collect(Collectors.joining("  |  "));
+					
+					String ucqStr = "UCQ: " + "?(" + 
+					ansVarsOrder.stream().map(Variable::toString).collect(Collectors.joining(",")) +
+					") :- " + formulasJoiner.toString() + ".";
 					IGRepl.writeIfVerbose(ucqStr + "\n", PrintLevel.MINIMAL);
-
+					
 					InteGraalCommands.printSubstitutions(EndUserAPI.evaluateOld(factsToUse, queriesToUse),
-							IGRepl.dlgpWriter, max);
+							ansVarsOrder, IGRepl.dlgpWriter, max);
 					IGRepl.writeIfVerbose("\n", PrintLevel.MINIMAL);
 				}
 			}
diff --git a/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/EndUserAPITest.java b/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/EndUserAPITest.java
index 42b6f7a5561b811ece928d0591a0ada06b291b79..86459069704a8d4c6ca0efa5a08db2090c1fb8ee 100644
--- a/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/EndUserAPITest.java
+++ b/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/EndUserAPITest.java
@@ -19,6 +19,7 @@ import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
 import fr.boreal.api.high_level_api.EndUserAPI;
+import fr.boreal.configuration.keywords.InteGraalKeywords;
 import fr.boreal.configuration.parameters.IGParameter;
 import fr.boreal.io.dlgp.DlgpParser;
 import fr.boreal.io.dlgp.ParserResult;
@@ -33,7 +34,6 @@ import fr.boreal.storage.builder.StorageBuilder;
 import fr.boreal.storage.natives.SimpleInMemoryGraphStore;
 import fr.boreal.views.FederatedFactBase;
 import fr.boreal.views.builder.ViewBuilder;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords;
 
 @RunWith(Parameterized.class)
 class EndUserAPITest {
diff --git a/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/QueryAnsweringViaEndUserAPITest.java b/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/QueryAnsweringViaEndUserAPITest.java
index bd266eb5709968fad8b23fad04a2dd3f36cd0975..ff01424a9369f40365f08b8ccc6d9ffebf1e190d 100644
--- a/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/QueryAnsweringViaEndUserAPITest.java
+++ b/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/QueryAnsweringViaEndUserAPITest.java
@@ -11,12 +11,12 @@ import org.junit.jupiter.params.provider.MethodSource;
 import org.junit.runners.Parameterized.Parameters;
 
 import fr.boreal.api.high_level_api.EndUserAPI;
+import fr.boreal.configuration.keywords.InteGraalKeywords;
 import fr.boreal.configuration.parameters.IGParameter;
 import fr.boreal.io.dlgp.DlgpParser;
 import fr.boreal.io.dlgp.ParserResult;
 import fr.boreal.model.kb.api.FactBase;
 import fr.boreal.storage.natives.SimpleInMemoryGraphStore;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords;
 
 /**
  * Checks that rewritings are correctly computed when using the EndUserAPI
diff --git a/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/RewritingViaEndUserAPITest.java b/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/RewritingViaEndUserAPITest.java
index ac926e4bbef4949425cbce1563f5f6c28e1ca754..fc2f93f5b85ab81beb5feba305233ea7838c5158 100644
--- a/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/RewritingViaEndUserAPITest.java
+++ b/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/RewritingViaEndUserAPITest.java
@@ -12,6 +12,7 @@ import org.junit.jupiter.params.provider.MethodSource;
 import org.junit.runners.Parameterized.Parameters;
 
 import fr.boreal.api.high_level_api.EndUserAPI;
+import fr.boreal.configuration.keywords.InteGraalKeywords;
 import fr.boreal.configuration.parameters.IGParameter;
 import fr.boreal.io.api.ParseException;
 import fr.boreal.io.dlgp.DlgpParser;
@@ -22,7 +23,6 @@ import fr.boreal.model.query.api.FOQuery;
 import fr.boreal.model.query.api.Query;
 import fr.boreal.model.query.impl.UnionFOQuery;
 import fr.boreal.model.rule.api.FORule;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords;
 
 /**
  * Checks that rewritings are correctly computed when using the EndUserAPI
diff --git a/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/SaturationViaEndUserAPITest.java b/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/SaturationViaEndUserAPITest.java
index 5270fa07b4823f92dec5e5b4f447c9a5cc812f3a..8e24cc821353d688021cd7278579be23707bf9e2 100644
--- a/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/SaturationViaEndUserAPITest.java
+++ b/integraal/integraal-api/src/test/java/fr/boreal/explanation/api/SaturationViaEndUserAPITest.java
@@ -13,6 +13,8 @@ import org.junit.jupiter.params.provider.MethodSource;
 import org.junit.runners.Parameterized.Parameters;
 
 import fr.boreal.api.high_level_api.EndUserAPI;
+import fr.boreal.configuration.keywords.InteGraalKeywords;
+import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms;
 import fr.boreal.configuration.parameters.IGParameter;
 import fr.boreal.io.dlgp.DlgpParser;
 import fr.boreal.io.dlgp.ParserResult;
@@ -21,8 +23,6 @@ import fr.boreal.model.kb.api.RuleBase;
 import fr.boreal.model.kb.impl.RuleBaseImpl;
 import fr.boreal.model.logicalElements.api.Atom;
 import fr.boreal.storage.natives.SimpleInMemoryGraphStore;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms;
 
 /*
  * Checks that rewritings are correctly computed when using the EndUserAPI
diff --git a/integraal/integraal-backward-chaining/src/main/java/module-info.java b/integraal/integraal-backward-chaining/src/main/java/module-info.java
index 972d91909145cd480f19f7b5368471968716f73d..2c4e89e643b9b3756dbd25c0d47345608fc13279 100644
--- a/integraal/integraal-backward-chaining/src/main/java/module-info.java
+++ b/integraal/integraal-backward-chaining/src/main/java/module-info.java
@@ -21,7 +21,6 @@ module fr.boreal.backward_chaining {
 	exports fr.boreal.backward_chaining.api;
 	exports fr.boreal.backward_chaining.core;
 	exports fr.boreal.backward_chaining.cover;
-	exports fr.boreal.backward_chaining.evaluators;
 	exports fr.boreal.backward_chaining.homomorphism;
 	exports fr.boreal.backward_chaining.pure;
 	exports fr.boreal.backward_chaining.pure.rewriting_operator;
diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/AlgorithmParameters.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/AlgorithmParameters.java
index 12e37c5a7a9bfe7d4e04c4f9d6b1ad844605e2db..483207fdd025398dac1a08b9190e93ee32ab433a 100644
--- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/AlgorithmParameters.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/AlgorithmParameters.java
@@ -10,26 +10,28 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import fr.boreal.component_builder.api.algorithm.IAlgorithmParameters;
+import fr.boreal.component_builder.externalHaltingConditions.ExternalAlgorithmHaltingConditions;
 import fr.boreal.component_builder.utils.StringUtils;
+import fr.boreal.configuration.keywords.InteGraalKeywords;
+import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms;
+import fr.boreal.configuration.keywords.InteGraalKeywords.InternalStorageConfiguration;
+import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Answers;
+import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Images;
+import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Parameters.Compilation;
+import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Application;
+import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Applier;
+import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Checker;
+import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Computer;
+import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Evaluator;
+import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Scheduler;
+import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Skolem;
+import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Transformer;
+import fr.boreal.configuration.keywords.InteGraalKeywords.InternalStorageConfiguration.DBMSDriverParameters;
+import fr.boreal.configuration.keywords.InteGraalKeywords.InternalStorageConfiguration.DBType;
+import fr.boreal.configuration.keywords.InteGraalKeywords.InternalStorageConfiguration.DriverType;
+import fr.boreal.configuration.keywords.InteGraalKeywords.InternalStorageConfiguration.StorageLayout;
 import fr.boreal.configuration.parameters.IGParameter;
 import fr.lirmm.boreal.util.enumerations.EnumUtils;
-import fr.lirmm.boreal.util.externalHaltingConditions.ExternalAlgorithmHaltingConditions;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Answers;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Images;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Application;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Applier;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Checker;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Computer;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Scheduler;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Parameters.Chase.Skolem;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Parameters.Compilation;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.InternalStorageConfiguration;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.InternalStorageConfiguration.DBMSDriverParameters;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.InternalStorageConfiguration.DBType;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.InternalStorageConfiguration.DriverType;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.InternalStorageConfiguration.StorageLayout;
 
 /**
  * Default implementation for {@link IAlgorithmParameters}.
@@ -62,7 +64,9 @@ public class AlgorithmParameters implements IAlgorithmParameters {
 	private Application application;
 	private Applier applier;
 	private Skolem skolem;
-
+	private Evaluator evaluator;		// added by Michel
+	private Transformer transformer;	// added by Michel
+										// TODO check transfer of IntegralParameters to AlgorithmParameters 
 	// storage
 	private DBType dbtype;
 	private DriverType driverType;
@@ -220,6 +224,16 @@ public class AlgorithmParameters implements IAlgorithmParameters {
 		return Optional.ofNullable(skolem);
 	}
 
+	@Override
+	public Optional<Evaluator> getEvaluator() {
+		return Optional.ofNullable(evaluator);
+	}
+
+	@Override
+	public Optional<Transformer> getTransformer() {
+		return Optional.ofNullable(transformer);
+	}
+
 	@Override
 	public Optional<DBType> getStorageType() {
 		return Optional.ofNullable(dbtype);
@@ -514,6 +528,42 @@ public class AlgorithmParameters implements IAlgorithmParameters {
 		return setParameter(skolemization);
 	}
 
+	/**
+	 * Sets the chase evaluator by matching the input string to an enum
+	 * constant and then calling {@link #setParameter(Enum)}.
+	 *
+	 * @param evaluatorName the name of the evaluator
+	 * @return this {@link IAlgorithmParameters} instance for method chaining
+	 */
+	public IAlgorithmParameters setEvaluator(String evaluatorName) {
+		return setParameter(EnumUtils.findEnumFromString(evaluatorName,
+				InteGraalKeywords.Algorithms.Parameters.Chase.Evaluator.class));
+	}
+
+	@Override
+	public IAlgorithmParameters setEvaluator(Evaluator evaluator) {
+		return setParameter(evaluator);
+	}
+
+
+	/**
+	 * Sets the chase transformer by matching the input string to an enum
+	 * constant and then calling {@link #setParameter(Enum)}.
+	 *
+	 * @param transformerName the name of the transformer
+	 * @return this {@link IAlgorithmParameters} instance for method chaining
+	 */
+	public IAlgorithmParameters setTransformer(String transformerName) {
+		return setParameter(EnumUtils.findEnumFromString(transformerName,
+				InteGraalKeywords.Algorithms.Parameters.Chase.Transformer.class));
+	}
+
+	@Override
+	public IAlgorithmParameters setTransformer(Transformer transformer) {
+		return setParameter(transformer);
+	}
+
+	
 	/**
 	 * Sets the compilation approach (e.g., "DEFAULT") by matching the input string
 	 * to an enum constant and then calling {@link #setParameter(Enum)}.
diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/ComponentBuilder.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/ComponentBuilder.java
index ec797c17e055aa86d675976b601a60d034770310..e97d9f1b6ad8f10c3c56d04d45966bcf399cdbf1 100644
--- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/ComponentBuilder.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/ComponentBuilder.java
@@ -10,20 +10,26 @@ import java.util.Optional;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import fr.boreal.backward_chaining.evaluators.QueryRewriter;
 import fr.boreal.component_builder.api.IComponentBuilder;
 import fr.boreal.component_builder.api.IOperationResult;
 import fr.boreal.component_builder.api.algorithm.IAlgorithmParameters;
 import fr.boreal.component_builder.api.scenario.IInputDataScenario;
 import fr.boreal.component_builder.components.ChaseComponentBuilder;
+import fr.boreal.component_builder.evaluators.query_evaluation.CountingQueryEvaluatorWithMultiEvaluator;
 import fr.boreal.component_builder.components.FactBaseLoaderFromFile;
 import fr.boreal.component_builder.components.QueryAnsweringComponentBuilder;
+import fr.boreal.component_builder.evaluators.query_evaluation.QueryEvaluatorWithMultiEvaluator;
+import fr.boreal.component_builder.evaluators.query_rewriting.QueryRewriterWitMultiEvaluator;
 import fr.boreal.component_builder.components.RewritingComponentBuilder;
+import fr.boreal.component_builder.evaluators.generic.MultiEvaluator;
+import fr.boreal.component_builder.externalHaltingConditions.ExternalAlgorithmHaltingConditions;
 import fr.boreal.component_builder.operations.FactBaseLoadingOperationResult;
 import fr.boreal.component_builder.operations.OperationNotPerformed;
 import fr.boreal.component_builder.operations.QueryBaseLoadingOperationResult;
 import fr.boreal.component_builder.operations.RuleBaseLoadingOperationResult;
 import fr.boreal.component_builder.operations.RuleCompilationOperationResult;
+import fr.boreal.configuration.keywords.InteGraalKeywords;
+import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms;
 import fr.boreal.forward_chaining.chase.Chase;
 import fr.boreal.io.dlgp.DlgpParser;
 import fr.boreal.model.kb.api.FactBase;
@@ -36,15 +42,9 @@ import fr.boreal.model.ruleCompilation.NoRuleCompilation;
 import fr.boreal.model.ruleCompilation.api.RuleCompilation;
 import fr.boreal.model.ruleCompilation.api.RuleCompilationResult;
 import fr.boreal.model.ruleCompilation.id.IDRuleCompilation;
-import fr.boreal.query_evaluation.component.CountingQueryEvaluator;
-import fr.boreal.query_evaluation.component.QueryEvaluationInput;
-import fr.boreal.query_evaluation.component.QueryEvaluationOutput;
-import fr.boreal.query_evaluation.component.QueryEvaluatorWithMultiEvaluator;
+import fr.boreal.component_builder.evaluators.query_evaluation.auxiliary.QueryEvaluationInput;
+import fr.boreal.component_builder.evaluators.query_evaluation.auxiliary.QueryEvaluationOutput;
 import fr.boreal.storage.external.rdbms.RDBMSStore;
-import fr.lirmm.boreal.util.evaluator.MultiEvaluator;
-import fr.lirmm.boreal.util.externalHaltingConditions.ExternalAlgorithmHaltingConditions;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms;
 
 /**
  * 
@@ -66,7 +66,7 @@ public class ComponentBuilder implements IComponentBuilder {
 	private Optional<MultiEvaluator<QueryEvaluationInput, QueryEvaluationOutput>> queryEvaluator;
 
 	private Optional<Chase> chaseAlgorithm;
-	private Optional<QueryRewriter> rewriter;
+	private Optional<QueryRewriterWitMultiEvaluator> rewriter;
 	private Optional<RuleCompilationResult> compilResult;
 
 	private RuleCompilation compilation; // assumed to be always set
@@ -190,7 +190,7 @@ public class ComponentBuilder implements IComponentBuilder {
 	 * @return a rewriting algorithm based on the current configuration
 	 */
 
-	public QueryRewriter buildOrGetRewriter() {
+	public QueryRewriterWitMultiEvaluator buildOrGetRewriter() {
 
 		checkRewritingService();
 
@@ -200,7 +200,7 @@ public class ComponentBuilder implements IComponentBuilder {
 
 		checkNecessaryElementsForComponent(List.of(querybase, ruleset), InteGraalKeywords.Algorithms.OMQ_REWRITING);
 
-		QueryRewriter customizedRewriter = RewritingComponentBuilder.prepareAndGetRewriterFrom(getQueries(),
+		QueryRewriterWitMultiEvaluator customizedRewriter = RewritingComponentBuilder.prepareAndGetRewriterFrom(getQueries(),
 				getRulebase(), integraalAlgorithmParameters);
 
 		this.rewriter = Optional.of(customizedRewriter);
@@ -246,17 +246,17 @@ public class ComponentBuilder implements IComponentBuilder {
 	 * 
 	 * @return a query evaluator based on the current configuration
 	 */
-	public CountingQueryEvaluator buildOrGetCountingQueryAnsweringAlgorithm() {
+	public CountingQueryEvaluatorWithMultiEvaluator buildOrGetCountingQueryAnsweringAlgorithm() {
 
 		checkQueryAnsweringService();
 
 		if (queryEvaluator.isPresent()) {
-			return (CountingQueryEvaluator) queryEvaluator.get();
+			return (CountingQueryEvaluatorWithMultiEvaluator) queryEvaluator.get();
 		}
 
 		checkNecessaryElementsForComponent(List.of(querybase, factbase), InteGraalKeywords.Algorithms.OMQ_REWRITING);
 
-		CountingQueryEvaluator customizedEvaluator = QueryAnsweringComponentBuilder
+		CountingQueryEvaluatorWithMultiEvaluator customizedEvaluator = QueryAnsweringComponentBuilder
 				.prepareAndGetCountingQueryAnsweringFrom(getQueries(), getFactbase(),
 						this.integraalAlgorithmParameters);
 
diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/InputDataScenario.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/InputDataScenario.java
index 7372ffcf35cdccf6f8310a3e217112964bfd4d1c..36710e37d690db6f6e7e5fd6b3559f5c605d08f0 100644
--- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/InputDataScenario.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/InputDataScenario.java
@@ -9,11 +9,11 @@ import org.slf4j.LoggerFactory;
 
 import fr.boreal.component_builder.api.scenario.IInputDataScenario;
 import fr.boreal.component_builder.utils.StringUtils;
+import fr.boreal.configuration.keywords.InteGraalKeywords;
 import fr.boreal.model.kb.api.FactBase;
 import fr.boreal.model.kb.api.RuleBase;
 import fr.boreal.model.query.api.Query;
 import fr.boreal.views.FederatedFactBase;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords;
 import radicchio.FileUtils;
 
 /**
diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/IComponentBuilder.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/IComponentBuilder.java
index a460de509235028dadca543820bdd9da949eb003..96c5f9284c13215a3b180f449164b93dc3c003dc 100644
--- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/IComponentBuilder.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/IComponentBuilder.java
@@ -3,20 +3,20 @@ package fr.boreal.component_builder.api;
 import java.util.Collection;
 import java.util.Set;
 
-import fr.boreal.backward_chaining.evaluators.QueryRewriter;
 import fr.boreal.component_builder.ComponentBuilder;
 import fr.boreal.component_builder.api.algorithm.IAlgorithmParameters;
 import fr.boreal.component_builder.api.scenario.IInputDataScenario;
+import fr.boreal.component_builder.evaluators.query_evaluation.QueryEvaluatorWithMultiEvaluator;
+import fr.boreal.component_builder.evaluators.query_rewriting.QueryRewriterWitMultiEvaluator;
+import fr.boreal.component_builder.externalHaltingConditions.ExternalAlgorithmHaltingConditions;
+import fr.boreal.component_builder.externalHaltingConditions.ExternalHaltingCondition;
+import fr.boreal.configuration.keywords.InteGraalKeywords;
 import fr.boreal.configuration.parameters.IGParameter;
 import fr.boreal.forward_chaining.chase.Chase;
 import fr.boreal.model.kb.api.FactBase;
 import fr.boreal.model.kb.api.RuleBase;
 import fr.boreal.model.query.api.Query;
 import fr.boreal.model.ruleCompilation.api.RuleCompilationResult;
-import fr.boreal.query_evaluation.component.QueryEvaluatorWithMultiEvaluator;
-import fr.lirmm.boreal.util.externalHaltingConditions.ExternalAlgorithmHaltingConditions;
-import fr.lirmm.boreal.util.externalHaltingConditions.ExternalHaltingCondition;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords;
 
 /**
  * Interface for building various InteGraal components related to query
@@ -83,11 +83,11 @@ public interface IComponentBuilder {
 	 * @param rb      the rule base for rewriting.
 	 * @param queries a collection of queries to be rewritten.
 	 * @param params  the parameters for storage and halting conditions
-	 * @return an instance of {@link QueryRewriter} configured for query rewriting,
+	 * @return an instance of {@link QueryRewriterWitMultiEvaluator} configured for query rewriting,
 	 *         or {@code null} in case of an error.
 	 */
-	static QueryRewriter buildAndGetOMQRewriter(RuleBase rb, Collection<Query> queries,
-			IGParameter<InteGraalKeywords, ?>... params) {
+	static QueryRewriterWitMultiEvaluator buildAndGetOMQRewriter(RuleBase rb, Collection<Query> queries,
+																 IGParameter<InteGraalKeywords, ?>... params) {
 		IInputDataScenario inputOMQ = IInputDataScenario.OMQ(rb, queries);
 		IAlgorithmParameters algoParam = IAlgorithmParameters.Rewriting(params);
 		var builder = createBuilderFrom(inputOMQ, algoParam);
@@ -189,11 +189,11 @@ public interface IComponentBuilder {
 	 * @param ruleCompilation the rule compilation method (optional, null means no
 	 *                        compilation).
 	 * @param conds           he external halting conditions (e.g., timeout, rank).
-	 * @return an instance of {@link QueryRewriter} configured for query rewriting,
+	 * @return an instance of {@link QueryRewriterWitMultiEvaluator} configured for query rewriting,
 	 *         or {@code null} in case of an error.
 	 */
-	static QueryRewriter buildAndGetOMQRewriter(RuleBase rb, Collection<Query> queries,
-			InteGraalKeywords.Algorithms.Parameters.Compilation ruleCompilation, ExternalHaltingCondition... conds) {
+	static QueryRewriterWitMultiEvaluator buildAndGetOMQRewriter(RuleBase rb, Collection<Query> queries,
+																 InteGraalKeywords.Algorithms.Parameters.Compilation ruleCompilation, ExternalHaltingCondition... conds) {
 		IInputDataScenario inputOMQ = IInputDataScenario.OMQ(rb, queries);
 		IAlgorithmParameters algoParam = IAlgorithmParameters.Rewriting(ruleCompilation,
 				new ExternalAlgorithmHaltingConditions(conds));
@@ -210,12 +210,12 @@ public interface IComponentBuilder {
 	 *                        compilation).
 	 * @param params          the external halting conditions (e.g., timeout, rank)
 	 *                        and the compilation type
-	 * @return an instance of {@link QueryRewriter} configured for query rewriting,
+	 * @return an instance of {@link QueryRewriterWitMultiEvaluator} configured for query rewriting,
 	 *         or {@code null} in case of an error.
 	 */
-	static QueryRewriter buildAndGetOMQRewriter(RuleBase rb, Collection<Query> queries,
-			InteGraalKeywords.Algorithms.Parameters.Compilation ruleCompilation,
-			IGParameter<InteGraalKeywords, ?>... params) {
+	static QueryRewriterWitMultiEvaluator buildAndGetOMQRewriter(RuleBase rb, Collection<Query> queries,
+																 InteGraalKeywords.Algorithms.Parameters.Compilation ruleCompilation,
+																 IGParameter<InteGraalKeywords, ?>... params) {
 		IInputDataScenario inputOMQ = IInputDataScenario.OMQ(rb, queries);
 		IAlgorithmParameters algoParam = IAlgorithmParameters.Rewriting(params);
 		var builder = createBuilderFrom(inputOMQ, algoParam);
@@ -314,9 +314,9 @@ public interface IComponentBuilder {
 	/**
 	 * Builds or gets the query rewriter component.
 	 *
-	 * @return the {@link QueryRewriter} component.
+	 * @return the {@link QueryRewriterWitMultiEvaluator} component.
 	 */
-	QueryRewriter buildOrGetRewriter();
+	QueryRewriterWitMultiEvaluator buildOrGetRewriter();
 
 	/**
 	 * Builds or gets the query answering algorithm component.
diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IAlgorithmParameters.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IAlgorithmParameters.java
index e37022a9d4fb63364a9e9fce68f5fa1365b6c439..c3678738ca0847e407d7d26a4db44eb06ed708c5 100644
--- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IAlgorithmParameters.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IAlgorithmParameters.java
@@ -1,11 +1,11 @@
 package fr.boreal.component_builder.api.algorithm;
 
 import fr.boreal.component_builder.AlgorithmParameters;
+import fr.boreal.component_builder.externalHaltingConditions.ExternalAlgorithmHaltingConditions;
+import fr.boreal.configuration.keywords.InteGraalKeywords;
+import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Parameters.Compilation;
 import fr.boreal.configuration.parameters.IGParameter;
 import fr.lirmm.boreal.util.enumerations.EnumUtils;
-import fr.lirmm.boreal.util.externalHaltingConditions.ExternalAlgorithmHaltingConditions;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Parameters.Compilation;
 
 /**
  * Contains parameters for an InteGraal algorithm or service.
diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IAnswerType.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IAnswerType.java
index d5f73fec81f16b638d349af24a8837401d08c107..8caf386af35eba82034a24956a53579a9d7fe4d0 100644
--- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IAnswerType.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IAnswerType.java
@@ -1,7 +1,7 @@
 package fr.boreal.component_builder.api.algorithm;
 
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Answers;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Images;
+import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Answers;
+import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Images;
 
 /**
  * Interface for count-only queries.
diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IBackwardChainingParameters.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IBackwardChainingParameters.java
index 5bf86c9cc622c9f86358c3e2cc884edf1285065a..600c068204c2357452b7ee0b35f4044a15cb7a53 100644
--- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IBackwardChainingParameters.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IBackwardChainingParameters.java
@@ -2,7 +2,7 @@ package fr.boreal.component_builder.api.algorithm;
 
 import java.util.Optional;
 
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords;
+import fr.boreal.configuration.keywords.InteGraalKeywords;
 
 /**
  * Interface for compilation parameters.
diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IEnvironmentExecutionParameters.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IEnvironmentExecutionParameters.java
index 43510e5fb06b2426f727499092a1002c5de2a0f2..b0566f014e936ac4815285c8a05762d8baa95e38 100644
--- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IEnvironmentExecutionParameters.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IEnvironmentExecutionParameters.java
@@ -3,7 +3,7 @@ package fr.boreal.component_builder.api.algorithm;
 import java.time.Duration;
 import java.util.Optional;
 
-import fr.lirmm.boreal.util.externalHaltingConditions.ExternalAlgorithmHaltingConditions;
+import fr.boreal.component_builder.externalHaltingConditions.ExternalAlgorithmHaltingConditions;
 
 interface IEnvironmentExecutionParameters {
 
diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IForwardChainingParameters.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IForwardChainingParameters.java
index f538c9c0c2b0044b52a7fdd632603ec575c019f6..27ec587801265cff034ac34fea73e99ec7c9ba04 100644
--- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IForwardChainingParameters.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IForwardChainingParameters.java
@@ -2,7 +2,7 @@ package fr.boreal.component_builder.api.algorithm;
 
 import java.util.Optional;
 
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords;
+import fr.boreal.configuration.keywords.InteGraalKeywords;
 
 /**
  * Interface for specifying the parameters related to a chase algorithm. The
@@ -120,4 +120,37 @@ interface IForwardChainingParameters {
 	 * @return the configuration with settled value
 	 */
 	IAlgorithmParameters setSkolemization(InteGraalKeywords.Algorithms.Parameters.Chase.Skolem skolemizationName);
+	
+	/**
+	 * Gets the evaluator used in the chase algorithm.
+	 * 
+	 * @return an Optional containing the evaluator, or an empty
+	 *         Optional if not set
+	 */
+	Optional<InteGraalKeywords.Algorithms.Parameters.Chase.Evaluator> getEvaluator();
+
+	/**
+	 * Sets the evaluator to be used in the chase algorithm.
+	 * 
+	 * @param evaluatorName the evaluator to be set
+	 * @return the configuration with settled value
+	 */
+	IAlgorithmParameters setEvaluator(InteGraalKeywords.Algorithms.Parameters.Chase.Evaluator evaluatorName);
+
+	/**
+	 * Gets the transformer used in the chase algorithm.
+	 * 
+	 * @return an Optional containing the transformer, or an empty
+	 *         Optional if not set
+	 */
+	Optional<InteGraalKeywords.Algorithms.Parameters.Chase.Transformer> getTransformer();
+
+	/**
+	 * Sets the transformer to be used in the chase algorithm.
+	 * 
+	 * @param transformerName the transformer to be set
+	 * @return the configuration with settled value
+	 */
+	IAlgorithmParameters setTransformer(InteGraalKeywords.Algorithms.Parameters.Chase.Transformer transformerName);
+
 }
diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IStorageParameters.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IStorageParameters.java
index e8f0c22512041108fafa5413be5303d52f6b52b7..01d12d1ade0ae25b5624eddcbc4b3a149579d56b 100644
--- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IStorageParameters.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/api/algorithm/IStorageParameters.java
@@ -3,7 +3,7 @@ package fr.boreal.component_builder.api.algorithm;
 import java.util.Map;
 import java.util.Optional;
 
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.InternalStorageConfiguration;
+import fr.boreal.configuration.keywords.InteGraalKeywords.InternalStorageConfiguration;
 
 /**
  * Interface for storage parameters.
diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/FactBaseLoaderFromFile.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/FactBaseLoaderFromFile.java
index d77fb2a764f2ee15496f79f43ad8c0b3811aa2f0..d2b3f247286aea6c25a544a265523d7401613786 100644
--- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/FactBaseLoaderFromFile.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/FactBaseLoaderFromFile.java
@@ -2,6 +2,8 @@ package fr.boreal.component_builder.components;
 
 import fr.boreal.component_builder.api.algorithm.IAlgorithmParameters;
 import fr.boreal.component_builder.api.scenario.IInputDataScenario;
+import fr.boreal.configuration.keywords.InteGraalKeywords.SupportedFileExtensions;
+import fr.boreal.configuration.keywords.InteGraalKeywords.InternalStorageConfiguration.StorageLayout;
 import fr.boreal.io.api.Parser;
 import fr.boreal.io.csv.CSVLoader;
 import fr.boreal.io.csv.CSVParser;
@@ -13,8 +15,6 @@ import fr.boreal.model.logicalElements.api.Atom;
 import fr.boreal.storage.builder.StorageBuilder;
 import fr.boreal.views.FederatedFactBase;
 import fr.boreal.views.builder.ViewBuilder;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.SupportedFileExtensions;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.InternalStorageConfiguration.StorageLayout;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/QueryAnsweringComponentBuilder.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/QueryAnsweringComponentBuilder.java
index ddce2d94d68687ea48b6fc02b36297740cfab665..7764cfc44cafa6788bc404541d0c5d5f9672e631 100644
--- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/QueryAnsweringComponentBuilder.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/QueryAnsweringComponentBuilder.java
@@ -4,12 +4,12 @@ import java.util.Collection;
 import java.util.Objects;
 
 import fr.boreal.component_builder.api.algorithm.IAlgorithmParameters;
+import fr.boreal.component_builder.evaluators.query_evaluation.CountingQueryEvaluatorWithMultiEvaluator;
+import fr.boreal.component_builder.evaluators.query_evaluation.QueryEvaluatorWithMultiEvaluator;
+import fr.boreal.component_builder.externalHaltingConditions.ExternalAlgorithmHaltingConditions;
+import fr.boreal.configuration.keywords.InteGraalKeywords;
 import fr.boreal.model.kb.api.FactBase;
 import fr.boreal.model.query.api.Query;
-import fr.boreal.query_evaluation.component.CountingQueryEvaluator;
-import fr.boreal.query_evaluation.component.QueryEvaluatorWithMultiEvaluator;
-import fr.lirmm.boreal.util.externalHaltingConditions.ExternalAlgorithmHaltingConditions;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords;
 
 /**
  * A builder class for preparing and creating components for query answering
@@ -48,10 +48,10 @@ public class QueryAnsweringComponentBuilder {
 	}
 
 	/**
-	 * Prepares and returns a {@link CountingQueryEvaluator} for answering the given
+	 * Prepares and returns a {@link CountingQueryEvaluatorWithMultiEvaluator} for answering the given
 	 * set of queries over the provided fact base, with optional external halting
 	 * conditions to limit non-terminating algorithms. The
-	 * {@link CountingQueryEvaluator} counts the number of answers in addition to
+	 * {@link CountingQueryEvaluatorWithMultiEvaluator} counts the number of answers in addition to
 	 * performing the query evaluation.
 	 *
 	 * @param queries  a collection of {@link Query} objects to be evaluated over
@@ -61,14 +61,14 @@ public class QueryAnsweringComponentBuilder {
 	 * @param ap       optional conditions used to limit the evaluation process,
 	 *                 such as timeouts or maximum number of states, as well as the
 	 *                 type of answers.
-	 * @return a {@link CountingQueryEvaluator} configured to answer the given
+	 * @return a {@link CountingQueryEvaluatorWithMultiEvaluator} configured to answer the given
 	 *         queries over the fact base with optional halting conditions and
 	 *         counting the number of answers.
 	 * @throws NullPointerException if either {@code queries} or {@code factbase} is
 	 *                              {@code null}.
 	 */
-	public static CountingQueryEvaluator prepareAndGetCountingQueryAnsweringFrom(Collection<Query> queries,
-			FactBase factbase, IAlgorithmParameters ap) {
+	public static CountingQueryEvaluatorWithMultiEvaluator prepareAndGetCountingQueryAnsweringFrom(Collection<Query> queries,
+																								   FactBase factbase, IAlgorithmParameters ap) {
 
 		Objects.requireNonNull(queries, "query must not be null");
 		Objects.requireNonNull(factbase, "factBase must not be null");
@@ -78,7 +78,7 @@ public class QueryAnsweringComponentBuilder {
 		var hc = new ExternalAlgorithmHaltingConditions(ap.getRank().isEmpty() ? null : ap.getRank().get(),
 				ap.getTimeout().isEmpty() ? null : ap.getTimeout().get());
 
-		return new CountingQueryEvaluator(queries, factbase, null, constantsOnly, hc);
+		return new CountingQueryEvaluatorWithMultiEvaluator(queries, factbase, null, constantsOnly, hc);
 	}
 
 }
diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/RewritingComponentBuilder.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/RewritingComponentBuilder.java
index 7a5340c5809e3ed3d6b970c50f8280c69770ca2f..94c47aa9a3489c305f6acdbfad3d72ab6fe97b5f 100644
--- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/RewritingComponentBuilder.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/RewritingComponentBuilder.java
@@ -3,16 +3,16 @@ package fr.boreal.component_builder.components;
 import java.util.Collection;
 import java.util.Set;
 
-import fr.boreal.backward_chaining.evaluators.QueryRewriter;
 import fr.boreal.component_builder.api.algorithm.IAlgorithmParameters;
+import fr.boreal.component_builder.evaluators.query_rewriting.QueryRewriterWitMultiEvaluator;
+import fr.boreal.component_builder.externalHaltingConditions.ExternalAlgorithmHaltingConditions;
+import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms;
 import fr.boreal.model.kb.api.RuleBase;
 import fr.boreal.model.query.api.Query;
 import fr.boreal.model.ruleCompilation.HierarchicalRuleCompilation;
 import fr.boreal.model.ruleCompilation.NoRuleCompilation;
 import fr.boreal.model.ruleCompilation.api.RuleCompilation;
 import fr.boreal.model.ruleCompilation.id.IDRuleCompilation;
-import fr.lirmm.boreal.util.externalHaltingConditions.ExternalAlgorithmHaltingConditions;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms;
 
 /**
  * Builds a custom query rewriter
@@ -26,8 +26,8 @@ public class RewritingComponentBuilder {
 	 * @param rewritingParameters
 	 * @return
 	 */
-	public static QueryRewriter prepareAndGetRewriterFrom(Collection<Query> queries, RuleBase rulebase,
-			IAlgorithmParameters rewritingParameters) {
+	public static QueryRewriterWitMultiEvaluator prepareAndGetRewriterFrom(Collection<Query> queries, RuleBase rulebase,
+																		   IAlgorithmParameters rewritingParameters) {
 
 		// handle compilation
 		Algorithms.Parameters.Compilation compil = rewritingParameters.getCompilation().isPresent()
@@ -59,8 +59,8 @@ public class RewritingComponentBuilder {
 	 * @param rewritingParameters
 	 * @return
 	 */
-	public static QueryRewriter prepareAndGetRewriterFrom(Query query, RuleBase rulebase, RuleCompilation compilation,
-			IAlgorithmParameters rewritingParameters) {
+	public static QueryRewriterWitMultiEvaluator prepareAndGetRewriterFrom(Query query, RuleBase rulebase, RuleCompilation compilation,
+                                                                           IAlgorithmParameters rewritingParameters) {
 
 		return prepareAndGetRewriterFrom(Set.of(query), rulebase, rewritingParameters);
 
@@ -73,10 +73,10 @@ public class RewritingComponentBuilder {
 	 * @param hc
 	 * @return the query rewriter according to the configuration required
 	 */
-	public static QueryRewriter prepareAndGetRewriterFrom(Collection<Query> queries, RuleBase rulebase,
-			RuleCompilation compilation, ExternalAlgorithmHaltingConditions hc) {
+	public static QueryRewriterWitMultiEvaluator prepareAndGetRewriterFrom(Collection<Query> queries, RuleBase rulebase,
+                                                                           RuleCompilation compilation, ExternalAlgorithmHaltingConditions hc) {
 
-		return new QueryRewriter(queries, rulebase, compilation, hc);
+		return new QueryRewriterWitMultiEvaluator(queries, rulebase, compilation, hc);
 
 	}
 
@@ -87,8 +87,8 @@ public class RewritingComponentBuilder {
 	 * @param hc
 	 * @return the query rewriter according to the configuration required
 	 */
-	public static QueryRewriter prepareAndGetRewriterFrom(Query query, RuleBase rulebase, RuleCompilation compilation,
-			ExternalAlgorithmHaltingConditions hc) {
+	public static QueryRewriterWitMultiEvaluator prepareAndGetRewriterFrom(Query query, RuleBase rulebase, RuleCompilation compilation,
+                                                                           ExternalAlgorithmHaltingConditions hc) {
 
 		return prepareAndGetRewriterFrom(Set.of(query), rulebase, compilation, hc);
 
diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/StorageComponent.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/StorageComponent.java
index 52b44ecff2282bf3f64b6405741fa0d7c17b4711..5be361a04a9290b752ddc878f82b4bb94318f78e 100644
--- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/StorageComponent.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/components/StorageComponent.java
@@ -7,12 +7,12 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import fr.boreal.component_builder.api.algorithm.IAlgorithmParameters;
+import fr.boreal.configuration.keywords.InteGraalKeywords.InternalStorageConfiguration;
+import fr.boreal.configuration.keywords.InteGraalKeywords.InternalStorageConfiguration.DBMSDriverParameters;
 import fr.boreal.model.kb.api.FactBase;
 import fr.boreal.storage.builder.StorageBuilder;
 import fr.boreal.storage.natives.DefaultInMemoryAtomSet;
 import fr.boreal.storage.natives.SimpleInMemoryGraphStore;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.InternalStorageConfiguration;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.InternalStorageConfiguration.DBMSDriverParameters;
 
 class StorageComponent {
 
diff --git a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/evaluator/MultiEvaluator.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/generic/MultiEvaluator.java
similarity index 88%
rename from integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/evaluator/MultiEvaluator.java
rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/generic/MultiEvaluator.java
index c7256555b4ae208633313d90ac4e33774c8c10d3..1ec29ba5d5888f9b0af195289b8d0b6ef1051c61 100644
--- a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/evaluator/MultiEvaluator.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/generic/MultiEvaluator.java
@@ -1,12 +1,14 @@
-package fr.lirmm.boreal.util.evaluator;
+package fr.boreal.component_builder.evaluators.generic;
 
 import java.util.Collection;
 import java.util.function.BiFunction;
 import java.util.function.Function;
 
+import fr.boreal.component_builder.evaluators.generic.processors.BatchProcessor;
+import fr.boreal.component_builder.evaluators.generic.processors.LazyIterator;
 import org.slf4j.Logger;
 
-import fr.lirmm.boreal.util.externalHaltingConditions.ExternalAlgorithmHaltingConditions;
+import fr.boreal.component_builder.externalHaltingConditions.ExternalAlgorithmHaltingConditions;
 
 public abstract class MultiEvaluator<InputType, OutputType> {
 
diff --git a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/evaluator/BatchProcessor.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/generic/processors/BatchProcessor.java
similarity index 96%
rename from integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/evaluator/BatchProcessor.java
rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/generic/processors/BatchProcessor.java
index 9b89446d6f29ac9d6ba6954de414e7eda651cd17..7ecc1c3d5222bad1ee78050808a78e9024956be4 100644
--- a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/evaluator/BatchProcessor.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/generic/processors/BatchProcessor.java
@@ -1,4 +1,4 @@
-package fr.lirmm.boreal.util.evaluator;
+package fr.boreal.component_builder.evaluators.generic.processors;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -19,7 +19,7 @@ import java.util.stream.Collectors;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import fr.lirmm.boreal.util.externalHaltingConditions.ExternalAlgorithmHaltingConditions;
+import fr.boreal.component_builder.externalHaltingConditions.ExternalAlgorithmHaltingConditions;
 
 /**
  * A generic class for batch processing of input objects.
diff --git a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/evaluator/LazyIterator.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/generic/processors/LazyIterator.java
similarity index 97%
rename from integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/evaluator/LazyIterator.java
rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/generic/processors/LazyIterator.java
index 380e9873fcc73dfece0841e03d557c5eeee389da..5bbc22d8bc7c223129515d7e122679f7e38cc32b 100644
--- a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/evaluator/LazyIterator.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/generic/processors/LazyIterator.java
@@ -1,4 +1,4 @@
-package fr.lirmm.boreal.util.evaluator;
+package fr.boreal.component_builder.evaluators.generic.processors;
 
 import java.util.Collection;
 import java.util.Iterator;
diff --git a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/CountingQueryEvaluator.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/CountingQueryEvaluatorWithMultiEvaluator.java
similarity index 56%
rename from integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/CountingQueryEvaluator.java
rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/CountingQueryEvaluatorWithMultiEvaluator.java
index 0c5f2c2f3aa670a652b88b48252d699ad3f10158..62851134eba14e81e638a4db4a17a0c2d023befc 100644
--- a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/CountingQueryEvaluator.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/CountingQueryEvaluatorWithMultiEvaluator.java
@@ -1,14 +1,15 @@
-package fr.boreal.query_evaluation.component;
+package fr.boreal.component_builder.evaluators.query_evaluation;
 
 import java.util.Collection;
 
+import fr.boreal.component_builder.evaluators.query_evaluation.auxiliary.*;
 import org.slf4j.LoggerFactory;
 
+import fr.boreal.component_builder.externalHaltingConditions.ExternalAlgorithmHaltingConditions;
 import fr.boreal.model.kb.api.FactBase;
 import fr.boreal.model.query.api.Query;
 import fr.boreal.model.queryEvaluation.api.QueryEvaluator;
-import fr.lirmm.boreal.util.evaluator.MultiEvaluator;
-import fr.lirmm.boreal.util.externalHaltingConditions.ExternalAlgorithmHaltingConditions;
+import fr.boreal.component_builder.evaluators.generic.MultiEvaluator;
 
 /**
  * A class that wraps around an FOQueryEvaluator to provide both batch and lazy
@@ -16,10 +17,10 @@ import fr.lirmm.boreal.util.externalHaltingConditions.ExternalAlgorithmHaltingCo
  * number of answers.
  *
  */
-public class CountingQueryEvaluator extends MultiEvaluator<QueryEvaluationInput, QueryEvaluationOutput> {
+public class CountingQueryEvaluatorWithMultiEvaluator extends MultiEvaluator<QueryEvaluationInput, QueryEvaluationOutput> {
 
 	static {
-		LOG = LoggerFactory.getLogger(CountingQueryEvaluator.class);
+		LOG = LoggerFactory.getLogger(CountingQueryEvaluatorWithMultiEvaluator.class);
 	}
 
 	/**
@@ -30,11 +31,11 @@ public class CountingQueryEvaluator extends MultiEvaluator<QueryEvaluationInput,
 	 * @param constantsOnly  true iff variables must only map to constants
 	 * @param externalHaltingConditions 
 	 */
-	public CountingQueryEvaluator(Collection<Query> queries,
-								  FactBase factBase,
-								  QueryEvaluator<Query> queryEvaluator,
-								  boolean constantsOnly,
-								  ExternalAlgorithmHaltingConditions externalHaltingConditions) {
+	public CountingQueryEvaluatorWithMultiEvaluator(Collection<Query> queries,
+													FactBase factBase,
+													QueryEvaluator<Query> queryEvaluator,
+													boolean constantsOnly,
+													ExternalAlgorithmHaltingConditions externalHaltingConditions) {
 
 		super(new QueryInputWrapper(queries, factBase, queryEvaluator, constantsOnly, true).createQueryInputs(),
 				new PreemptiveQueryEvaluationFunction(), new DefaultQueryEvaluationFunction(), externalHaltingConditions,
diff --git a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/QueryEvaluatorWithMultiEvaluator.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/QueryEvaluatorWithMultiEvaluator.java
similarity index 81%
rename from integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/QueryEvaluatorWithMultiEvaluator.java
rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/QueryEvaluatorWithMultiEvaluator.java
index e6e70c28bf2a1a33bca7674ecf99fd4bb41c230f..e33e1dff9c86d8c34fd4a1d92e4378d319aa3e4c 100644
--- a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/QueryEvaluatorWithMultiEvaluator.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/QueryEvaluatorWithMultiEvaluator.java
@@ -1,17 +1,15 @@
-package fr.boreal.query_evaluation.component;
+package fr.boreal.component_builder.evaluators.query_evaluation;
 
 import java.util.Collection;
 
+import fr.boreal.component_builder.evaluators.query_evaluation.auxiliary.*;
 import org.slf4j.LoggerFactory;
 
-import fr.boreal.configuration.parameters.IGParameter;
-import fr.boreal.configuration.parameters.IGParameterValueExtractor;
+import fr.boreal.component_builder.externalHaltingConditions.ExternalAlgorithmHaltingConditions;
 import fr.boreal.model.kb.api.FactBase;
 import fr.boreal.model.query.api.Query;
 import fr.boreal.model.queryEvaluation.api.QueryEvaluator;
-import fr.lirmm.boreal.util.evaluator.MultiEvaluator;
-import fr.lirmm.boreal.util.externalHaltingConditions.ExternalAlgorithmHaltingConditions;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords;
+import fr.boreal.component_builder.evaluators.generic.MultiEvaluator;
 
 /**
  * A class that wraps around an FOQueryEvaluator to provide both batch and lazy
diff --git a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/DefaultQueryEvaluationFunction.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/DefaultQueryEvaluationFunction.java
similarity index 94%
rename from integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/DefaultQueryEvaluationFunction.java
rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/DefaultQueryEvaluationFunction.java
index e37a322e5bfa4a89f563613b4b3434792c094fdb..b19319700a4c9cc1c6f452fef14eecb8f8983a4e 100644
--- a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/DefaultQueryEvaluationFunction.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/DefaultQueryEvaluationFunction.java
@@ -1,5 +1,5 @@
 
-package fr.boreal.query_evaluation.component;
+package fr.boreal.component_builder.evaluators.query_evaluation.auxiliary;
 
 import java.util.Collections;
 import java.util.Iterator;
diff --git a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/DefaultQueryEvaluationOutputIfTimeoutFunction.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/DefaultQueryEvaluationOutputIfTimeoutFunction.java
similarity index 88%
rename from integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/DefaultQueryEvaluationOutputIfTimeoutFunction.java
rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/DefaultQueryEvaluationOutputIfTimeoutFunction.java
index 81b82e46765fcbb057ea43ee8e148b4b2e16c63b..020f182c624ff1cdee22a5fa6f11190fedfe80a1 100644
--- a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/DefaultQueryEvaluationOutputIfTimeoutFunction.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/DefaultQueryEvaluationOutputIfTimeoutFunction.java
@@ -1,5 +1,5 @@
 
-package fr.boreal.query_evaluation.component;
+package fr.boreal.component_builder.evaluators.query_evaluation.auxiliary;
 
 import java.util.Collections;
 import java.util.function.BiFunction;
diff --git a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/PreemptiveQueryEvaluationFunction.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/PreemptiveQueryEvaluationFunction.java
similarity index 95%
rename from integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/PreemptiveQueryEvaluationFunction.java
rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/PreemptiveQueryEvaluationFunction.java
index f797c28a4fd106481e9980c9d873d9ad3ff5bef7..0c657ab588eaf5641f662b902d83afb67d4f0c49 100644
--- a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/PreemptiveQueryEvaluationFunction.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/PreemptiveQueryEvaluationFunction.java
@@ -1,5 +1,5 @@
 
-package fr.boreal.query_evaluation.component;
+package fr.boreal.component_builder.evaluators.query_evaluation.auxiliary;
 
 import java.util.ArrayList;
 import java.util.Collections;
diff --git a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/QueryEvaluationInput.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/QueryEvaluationInput.java
similarity index 91%
rename from integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/QueryEvaluationInput.java
rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/QueryEvaluationInput.java
index 71943fd643c3bcd98dd83bf2afe6ace00cad70f9..5296943f3cba1ab3ea7356f6738af91e8d18e6b3 100644
--- a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/QueryEvaluationInput.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/QueryEvaluationInput.java
@@ -1,4 +1,4 @@
-package fr.boreal.query_evaluation.component;
+package fr.boreal.component_builder.evaluators.query_evaluation.auxiliary;
 
 import java.util.Objects;
 
diff --git a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/QueryEvaluationOutput.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/QueryEvaluationOutput.java
similarity index 94%
rename from integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/QueryEvaluationOutput.java
rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/QueryEvaluationOutput.java
index c4926505a71b174505b2833347e5ec43f5810782..e7ed4efda17ef9e5156e5df7446956d053ae98ac 100644
--- a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/QueryEvaluationOutput.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/QueryEvaluationOutput.java
@@ -1,4 +1,4 @@
-package fr.boreal.query_evaluation.component;
+package fr.boreal.component_builder.evaluators.query_evaluation.auxiliary;
 
 import java.util.Iterator;
 import java.util.Objects;
diff --git a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/QueryInputWrapper.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/QueryInputWrapper.java
similarity index 94%
rename from integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/QueryInputWrapper.java
rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/QueryInputWrapper.java
index 7aa09b4be71ef6cb510ce02d9f3d6ed0e46bf22d..cb434dda199725b60d7b39b3d66ccbac77d75e95 100644
--- a/integraal/integraal-query-evaluation/src/main/java/fr/boreal/query_evaluation/component/QueryInputWrapper.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_evaluation/auxiliary/QueryInputWrapper.java
@@ -1,4 +1,4 @@
-package fr.boreal.query_evaluation.component;
+package fr.boreal.component_builder.evaluators.query_evaluation.auxiliary;
 
 import java.util.Collection;
 import java.util.List;
diff --git a/integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/QueryRewriter.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/QueryRewriterWitMultiEvaluator.java
similarity index 62%
rename from integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/QueryRewriter.java
rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/QueryRewriterWitMultiEvaluator.java
index 8ad7dccabe665023ae5820a47ebadf5202fc6b94..01668d9452608a56277d61631c08f1c5e62b4004 100644
--- a/integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/QueryRewriter.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/QueryRewriterWitMultiEvaluator.java
@@ -1,25 +1,26 @@
-package fr.boreal.backward_chaining.evaluators;
+package fr.boreal.component_builder.evaluators.query_rewriting;
 
 import java.util.Collection;
 
+import fr.boreal.component_builder.evaluators.query_rewriting.auxiliary.*;
 import org.slf4j.LoggerFactory;
 
+import fr.boreal.component_builder.externalHaltingConditions.ExternalAlgorithmHaltingConditions;
 import fr.boreal.model.kb.api.RuleBase;
 import fr.boreal.model.query.api.Query;
 import fr.boreal.model.ruleCompilation.NoRuleCompilation;
 import fr.boreal.model.ruleCompilation.api.RuleCompilation;
-import fr.lirmm.boreal.util.evaluator.MultiEvaluator;
-import fr.lirmm.boreal.util.externalHaltingConditions.ExternalAlgorithmHaltingConditions;
+import fr.boreal.component_builder.evaluators.generic.MultiEvaluator;
 
 /**
  * A class for rewriting a collection of FOQuery objects.
  *
  */
-public class QueryRewriter extends MultiEvaluator<RewritingInput, RewritingOutput> {
+public class QueryRewriterWitMultiEvaluator extends MultiEvaluator<RewritingInput, RewritingOutput> {
 
 	static {
 
-		LOG = LoggerFactory.getLogger(QueryRewriter.class);
+		LOG = LoggerFactory.getLogger(QueryRewriterWitMultiEvaluator.class);
 
 	}
 
@@ -36,8 +37,8 @@ public class QueryRewriter extends MultiEvaluator<RewritingInput, RewritingOutpu
 	 * @param externalHaltingConditions 
 	 */
 
-	public QueryRewriter(Collection<Query> queries, RuleBase ruleBase, RuleCompilation compilation,
-			ExternalAlgorithmHaltingConditions externalHaltingConditions) {
+	public QueryRewriterWitMultiEvaluator(Collection<Query> queries, RuleBase ruleBase, RuleCompilation compilation,
+										  ExternalAlgorithmHaltingConditions externalHaltingConditions) {
 
 		super(new RewritingInputWrapper(queries, ruleBase, compilation).createRewritingInputs(),
 				new DefaultRewritingFunction(), externalHaltingConditions,
diff --git a/integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/DefaultQueryRewritingOutputIfTimeoutFunction.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/auxiliary/DefaultQueryRewritingOutputIfTimeoutFunction.java
similarity index 88%
rename from integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/DefaultQueryRewritingOutputIfTimeoutFunction.java
rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/auxiliary/DefaultQueryRewritingOutputIfTimeoutFunction.java
index aa72e145eaec640e08f39bb3bec487902bf494d2..748af4b453ab38b5f39b3a41f472fce8048671c1 100644
--- a/integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/DefaultQueryRewritingOutputIfTimeoutFunction.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/auxiliary/DefaultQueryRewritingOutputIfTimeoutFunction.java
@@ -1,5 +1,5 @@
 
-package fr.boreal.backward_chaining.evaluators;
+package fr.boreal.component_builder.evaluators.query_rewriting.auxiliary;
 
 import java.util.Optional;
 import java.util.function.BiFunction;
diff --git a/integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/DefaultRewritingFunction.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/auxiliary/DefaultRewritingFunction.java
similarity index 94%
rename from integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/DefaultRewritingFunction.java
rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/auxiliary/DefaultRewritingFunction.java
index 13f7382a222a036d711ba5cd331071877189cd31..dc807189d41757768125448f85786a578cd2d9d0 100644
--- a/integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/DefaultRewritingFunction.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/auxiliary/DefaultRewritingFunction.java
@@ -1,4 +1,4 @@
-package fr.boreal.backward_chaining.evaluators;
+package fr.boreal.component_builder.evaluators.query_rewriting.auxiliary;
 
 import java.util.Optional;
 import java.util.function.Function;
diff --git a/integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/RewritingInput.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/auxiliary/RewritingInput.java
similarity index 75%
rename from integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/RewritingInput.java
rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/auxiliary/RewritingInput.java
index 7baf1c2913d9df1598096fa1d2701ee5e68e6536..21f8658b80fd1f1e7d9837fabd459a7da0f5bcc0 100644
--- a/integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/RewritingInput.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/auxiliary/RewritingInput.java
@@ -1,4 +1,4 @@
-package fr.boreal.backward_chaining.evaluators;
+package fr.boreal.component_builder.evaluators.query_rewriting.auxiliary;
 
 import fr.boreal.model.kb.api.RuleBase;
 import fr.boreal.model.query.api.Query;
diff --git a/integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/RewritingInputWrapper.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/auxiliary/RewritingInputWrapper.java
similarity index 85%
rename from integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/RewritingInputWrapper.java
rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/auxiliary/RewritingInputWrapper.java
index a624816f9008dcd5c27bb4d4ad36bd1a638b2f10..3b5f47ac399f6e60cce575e73d1a7809379e2e83 100644
--- a/integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/RewritingInputWrapper.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/auxiliary/RewritingInputWrapper.java
@@ -1,12 +1,10 @@
-package fr.boreal.backward_chaining.evaluators;
+package fr.boreal.component_builder.evaluators.query_rewriting.auxiliary;
 
 import java.util.Collection;
 import java.util.List;
 import java.util.stream.Collectors;
 
-import fr.boreal.model.formula.api.FOFormula;
 import fr.boreal.model.kb.api.RuleBase;
-import fr.boreal.model.query.api.FOQuery;
 import fr.boreal.model.query.api.Query;
 import fr.boreal.model.ruleCompilation.api.RuleCompilation;
 
diff --git a/integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/RewritingOutput.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/auxiliary/RewritingOutput.java
similarity index 94%
rename from integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/RewritingOutput.java
rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/auxiliary/RewritingOutput.java
index 9260ca5b6f4d41583b734c8b3e3356df9319ac60..82d887df00938fac212a27a0598579e60d9a6890 100644
--- a/integraal/integraal-backward-chaining/src/main/java/fr/boreal/backward_chaining/evaluators/RewritingOutput.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/evaluators/query_rewriting/auxiliary/RewritingOutput.java
@@ -1,4 +1,4 @@
-package fr.boreal.backward_chaining.evaluators;
+package fr.boreal.component_builder.evaluators.query_rewriting.auxiliary;
 
 import java.io.Serializable;
 import java.util.Objects;
diff --git a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/externalHaltingConditions/ExternalAlgorithmHaltingConditions.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/externalHaltingConditions/ExternalAlgorithmHaltingConditions.java
similarity index 95%
rename from integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/externalHaltingConditions/ExternalAlgorithmHaltingConditions.java
rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/externalHaltingConditions/ExternalAlgorithmHaltingConditions.java
index cca469403d6dcb7c375d81636b715e15da2612ec..4b0658c917c570e0aff052a3ed0f4ea9632b5a45 100644
--- a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/externalHaltingConditions/ExternalAlgorithmHaltingConditions.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/externalHaltingConditions/ExternalAlgorithmHaltingConditions.java
@@ -1,10 +1,10 @@
-package fr.lirmm.boreal.util.externalHaltingConditions;
+package fr.boreal.component_builder.externalHaltingConditions;
 
 import java.time.Duration;
 import java.util.Arrays;
 import java.util.List;
 
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.ExternalHaltingConditions;
+import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.ExternalHaltingConditions;
 
 /**
  * Defines conditions that must be respected in case of a non-terminating
diff --git a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/externalHaltingConditions/ExternalHaltingCondition.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/externalHaltingConditions/ExternalHaltingCondition.java
similarity index 94%
rename from integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/externalHaltingConditions/ExternalHaltingCondition.java
rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/externalHaltingConditions/ExternalHaltingCondition.java
index 2a2da984f98dbf5a977b640ebdb5a5286200e7e4..225ccf8aeb9a1d5ab74ce6bfa0ea822c1b69837c 100644
--- a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/externalHaltingConditions/ExternalHaltingCondition.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/externalHaltingConditions/ExternalHaltingCondition.java
@@ -1,9 +1,9 @@
-package fr.lirmm.boreal.util.externalHaltingConditions;
+package fr.boreal.component_builder.externalHaltingConditions;
 
 import java.time.Duration;
 import java.util.Objects;
 
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.ExternalHaltingConditions;
+import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.ExternalHaltingConditions;
 
 /**
  * Represents a pair of halting condition: a keyword and its associated value.
diff --git a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/externalHaltingConditions/ExternalHaltingConditionFactory.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/externalHaltingConditions/ExternalHaltingConditionFactory.java
similarity index 80%
rename from integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/externalHaltingConditions/ExternalHaltingConditionFactory.java
rename to integraal/integraal-component/src/main/java/fr/boreal/component_builder/externalHaltingConditions/ExternalHaltingConditionFactory.java
index 5ef902c43a43bef2bd41cf3627e9b46dd760eb9d..633797258494f5179e062b8e16e81d65c42b2126 100644
--- a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/externalHaltingConditions/ExternalHaltingConditionFactory.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/externalHaltingConditions/ExternalHaltingConditionFactory.java
@@ -1,6 +1,6 @@
-package fr.lirmm.boreal.util.externalHaltingConditions;
+package fr.boreal.component_builder.externalHaltingConditions;
 
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.ExternalHaltingConditions;
+import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.ExternalHaltingConditions;
 
 /**
  * Factory for creating ExternalHaltingConditions
diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/operations/OperationNotPerformed.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/operations/OperationNotPerformed.java
index 97a4545659c0f62b1339c9aff0f9a60a4f17e5cd..129574b8d873353163f7b9fa8b0c65c670aa3a09 100644
--- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/operations/OperationNotPerformed.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/operations/OperationNotPerformed.java
@@ -3,8 +3,8 @@ package fr.boreal.component_builder.operations;
 import java.io.Serializable;
 
 import fr.boreal.component_builder.api.IOperationResult;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms;
+import fr.boreal.configuration.keywords.InteGraalKeywords;
+import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms;
 
 /**
  * records the operation which has not been performed
diff --git a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/utils/ComponentPrinter.java b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/utils/ComponentPrinter.java
index 59a8e3b25b416b4884d566ff787f28b6976fce9e..83550e6fc242b994f0b5c7a91d78af508fa92324 100644
--- a/integraal/integraal-component/src/main/java/fr/boreal/component_builder/utils/ComponentPrinter.java
+++ b/integraal/integraal-component/src/main/java/fr/boreal/component_builder/utils/ComponentPrinter.java
@@ -7,9 +7,9 @@ import java.util.stream.StreamSupport;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import fr.boreal.backward_chaining.evaluators.RewritingOutput;
+import fr.boreal.component_builder.evaluators.query_rewriting.auxiliary.RewritingOutput;
 import fr.boreal.model.kb.api.FactBase;
-import fr.boreal.query_evaluation.component.QueryEvaluationOutput;
+import fr.boreal.component_builder.evaluators.query_evaluation.auxiliary.QueryEvaluationOutput;
 
 public class ComponentPrinter {
 	static final Logger LOG = LoggerFactory.getLogger(ComponentPrinter.class);
diff --git a/integraal/integraal-component/src/main/java/module-info.java b/integraal/integraal-component/src/main/java/module-info.java
index a3fb9ee09b5a0133b43d71a040dc517ae747abd2..3a7dcf98580a0af250a7730ec16974127a20e0b6 100644
--- a/integraal/integraal-component/src/main/java/module-info.java
+++ b/integraal/integraal-component/src/main/java/module-info.java
@@ -24,5 +24,13 @@ open module fr.boreal.component {
 	exports fr.boreal.component_builder.api;
 	exports fr.boreal.component_builder.api.algorithm;
 	exports fr.boreal.component_builder.api.scenario;
+	exports fr.boreal.component_builder.components;
+	exports fr.boreal.component_builder.externalHaltingConditions;
+    exports fr.boreal.component_builder.evaluators.generic;
+	exports fr.boreal.component_builder.evaluators.query_rewriting;
+	exports fr.boreal.component_builder.evaluators.query_evaluation;
+	exports fr.boreal.component_builder.evaluators.query_evaluation.auxiliary;
+	exports fr.boreal.component_builder.evaluators.query_rewriting.auxiliary;
+	exports fr.boreal.component_builder.evaluators.generic.processors;
 
 }
\ No newline at end of file
diff --git a/integraal/integraal-component/src/test/java/fr/boreal/component_builder/api/algorithm/ParameterExamples.java b/integraal/integraal-component/src/test/java/fr/boreal/component_builder/api/algorithm/ParameterExamples.java
index dd3cab874e11d80cb302f37ce7767f74dce00a26..03d058876e7bdcdae62ee69aee5a2e40938317bc 100644
--- a/integraal/integraal-component/src/test/java/fr/boreal/component_builder/api/algorithm/ParameterExamples.java
+++ b/integraal/integraal-component/src/test/java/fr/boreal/component_builder/api/algorithm/ParameterExamples.java
@@ -1,13 +1,13 @@
 package fr.boreal.component_builder.api.algorithm;
 
+import fr.boreal.configuration.keywords.InteGraalKeywords;
+import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms;
+import fr.boreal.configuration.keywords.InteGraalKeywords.InternalStorageConfiguration;
+import fr.boreal.configuration.keywords.InteGraalKeywords.MonitoringOperations;
+import fr.boreal.configuration.keywords.InteGraalKeywords.SupportedFileExtensions;
+import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.*;
+import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms.Parameters.*;
 import fr.boreal.configuration.parameters.IGParameter;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.*;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms.Parameters.*;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.InternalStorageConfiguration;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.SupportedFileExtensions;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.MonitoringOperations;
 
 import java.time.Duration;
 
@@ -41,7 +41,7 @@ public class ParameterExamples {
             new IGParameter<>(InteGraalKeywords.APPLIER, Chase.Applier.BREADTH_FIRST_TRIGGER);
 
     public static final IGParameter<InteGraalKeywords, Chase.Transformer> TRANSFORMER_PARAM =
-            new IGParameter<>(InteGraalKeywords.TRANFORMER, Chase.Transformer.ALL);
+            new IGParameter<>(InteGraalKeywords.TRANSFORMER, Chase.Transformer.ALL);
 
     public static final IGParameter<InteGraalKeywords, Chase.Computer> COMPUTER_PARAM =
             new IGParameter<>(InteGraalKeywords.COMPUTER, Chase.Computer.SEMI_NAIVE);
diff --git a/integraal/integraal-component/src/test/java/fr/boreal/component_builder/api/algorithm/QAWithIGParameterTest.java b/integraal/integraal-component/src/test/java/fr/boreal/component_builder/api/algorithm/QAWithIGParameterTest.java
index be278cc86f09615bb6f55f23519af795970a22c8..92ef8b211f683b110f270f44ce0355fa8445f96e 100644
--- a/integraal/integraal-component/src/test/java/fr/boreal/component_builder/api/algorithm/QAWithIGParameterTest.java
+++ b/integraal/integraal-component/src/test/java/fr/boreal/component_builder/api/algorithm/QAWithIGParameterTest.java
@@ -1,9 +1,10 @@
 package fr.boreal.component_builder.api.algorithm;
 
 import fr.boreal.component_builder.AlgorithmParameters;
+import fr.boreal.configuration.keywords.InteGraalKeywords;
+import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms;
 import fr.boreal.configuration.parameters.IGParameter;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.params.ParameterizedTest;
diff --git a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/keywords/InteGraalKeywords.java b/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/keywords/InteGraalKeywords.java
similarity index 99%
rename from integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/keywords/InteGraalKeywords.java
rename to integraal/integraal-configuration/src/main/java/fr/boreal/configuration/keywords/InteGraalKeywords.java
index 9301816262805701631a4c96692b9e93ac7c458b..9c27f2831b8cb3f9321d2c740b7d2641eb513ad7 100644
--- a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/keywords/InteGraalKeywords.java
+++ b/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/keywords/InteGraalKeywords.java
@@ -1,4 +1,4 @@
-package fr.lirmm.boreal.util.keywords;
+package fr.boreal.configuration.keywords;
 
 import java.time.Duration;
 import java.time.format.DateTimeParseException;
@@ -51,7 +51,7 @@ public enum InteGraalKeywords {
     SCHEDULER(Algorithms.Parameters.Chase.Scheduler.class),
     EVALUATOR(Algorithms.Parameters.Chase.Evaluator.class),
     APPLIER(Algorithms.Parameters.Chase.Applier.class),
-    TRANFORMER(Algorithms.Parameters.Chase.Transformer.class),
+    TRANSFORMER(Algorithms.Parameters.Chase.Transformer.class),
     COMPUTER(Algorithms.Parameters.Chase.Computer.class),
     CHECKER(Algorithms.Parameters.Chase.Checker.class),
     APPLICATION(Algorithms.Parameters.Chase.Application.class),
@@ -162,7 +162,7 @@ public enum InteGraalKeywords {
     public static InteGraalKeywords findKeyword(String s) {
         InteGraalKeywords ikw = (InteGraalKeywords) EnumUtils.findConstantInEnumeration(s, InteGraalKeywords.class);
         if (ikw == null)
-            throw new IllegalArgumentException(ikw + " is an unknown InteGraalKeywords.");
+            throw new IllegalArgumentException(s + " is an unknown InteGraalKeywords.");
         return ikw;
     }
 
diff --git a/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameter.java b/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameter.java
index e16c6bed41e61a7325015c96354b3a0bd220c55f..68196026017d29e01dd7242fd80ba0559775d478 100644
--- a/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameter.java
+++ b/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameter.java
@@ -1,8 +1,8 @@
 package fr.boreal.configuration.parameters;
 
 
+import fr.boreal.configuration.keywords.InteGraalKeywords;
 import fr.lirmm.boreal.util.enumerations.EnumUtils;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords;
 
 /**
  * Structure used to describe an InteGraal API service parameter
diff --git a/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameterConverter.java b/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameterConverter.java
index 055778f4c18951984200d0da4c52f64baf1ba4b6..b3b2af7865ff96b6fbafc3a7d71a52382d21d7ff 100644
--- a/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameterConverter.java
+++ b/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameterConverter.java
@@ -1,6 +1,6 @@
 package fr.boreal.configuration.parameters;
 
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords;
+import fr.boreal.configuration.keywords.InteGraalKeywords;
 
 public class IGParameterConverter {
 
diff --git a/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameterException.java b/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameterException.java
index 709b921cbf0538691febc1fe8c1440ffebdca160..19ee2249da65d8e7d527939c5391816d228b9f67 100644
--- a/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameterException.java
+++ b/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameterException.java
@@ -1,6 +1,6 @@
 package fr.boreal.configuration.parameters;
 
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords;
+import fr.boreal.configuration.keywords.InteGraalKeywords;
 
 /**
  * Exception for errors caused by inconsistent use of the {@link IGParameter}
diff --git a/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameterValueExtractor.java b/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameterValueExtractor.java
index a25b81be66162c082a4aa4f666c4c7c31a4cca00..e0a82f205d7b75643113f281ae55b0be0d71d8a9 100644
--- a/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameterValueExtractor.java
+++ b/integraal/integraal-configuration/src/main/java/fr/boreal/configuration/parameters/IGParameterValueExtractor.java
@@ -2,8 +2,8 @@ package fr.boreal.configuration.parameters;
 
 import java.time.Duration;
 
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords.Algorithms;
+import fr.boreal.configuration.keywords.InteGraalKeywords;
+import fr.boreal.configuration.keywords.InteGraalKeywords.Algorithms;
 
 public class IGParameterValueExtractor {
 
diff --git a/integraal/integraal-configuration/src/main/java/module-info.java b/integraal/integraal-configuration/src/main/java/module-info.java
index ab743c1c9878668fdd776e4f7e2239c9dd802719..a3b6573864ab59c7262a20f2294e13443016f727 100644
--- a/integraal/integraal-configuration/src/main/java/module-info.java
+++ b/integraal/integraal-configuration/src/main/java/module-info.java
@@ -6,5 +6,7 @@
  */
 open module fr.boreal.configuration {
     requires fr.lirmm.boreal.util;
+    exports fr.boreal.configuration.keywords;
     exports fr.boreal.configuration.parameters;
+
 }
\ No newline at end of file
diff --git a/integraal/integraal-configuration/src/test/java/configuration/tests/ParameterConverterTest.java b/integraal/integraal-configuration/src/test/java/configuration/tests/ParameterConverterTest.java
index 9e410f56c78292f2087fbf19ca8f3e0892ca0715..481e919383191e7073fb4e950ffa2fe545f7cd9f 100644
--- a/integraal/integraal-configuration/src/test/java/configuration/tests/ParameterConverterTest.java
+++ b/integraal/integraal-configuration/src/test/java/configuration/tests/ParameterConverterTest.java
@@ -10,10 +10,10 @@ import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
 import org.junit.runners.Parameterized.Parameters;
 
+import fr.boreal.configuration.keywords.InteGraalKeywords;
 import fr.boreal.configuration.parameters.IGParameter;
 import fr.boreal.configuration.parameters.IGParameterConverter;
 import fr.boreal.configuration.parameters.IGParameterException;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords;
 
 /*
  * Checks that parameters are correctly converted
diff --git a/integraal/integraal-configuration/src/test/java/configuration/tests/ParameterCreationTest.java b/integraal/integraal-configuration/src/test/java/configuration/tests/ParameterCreationTest.java
index 63b2ee736aec129786d2ea50d4f7654c0192a781..425434f616d7dfdb038b360151b3d26e7692ac6b 100644
--- a/integraal/integraal-configuration/src/test/java/configuration/tests/ParameterCreationTest.java
+++ b/integraal/integraal-configuration/src/test/java/configuration/tests/ParameterCreationTest.java
@@ -1,6 +1,7 @@
 package configuration.tests;
+import fr.boreal.configuration.keywords.InteGraalKeywords;
 import fr.boreal.configuration.parameters.IGParameter;
-import fr.lirmm.boreal.util.keywords.InteGraalKeywords;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.params.ParameterizedTest;
diff --git a/integraal/integraal-forward-chaining/pom.xml b/integraal/integraal-forward-chaining/pom.xml
index 0dfdd37fa6463a5aaf2dc5720d6e164f542f9a89..c5c525f9104f39f07d71d340ce8be19bbf552481 100644
--- a/integraal/integraal-forward-chaining/pom.xml
+++ b/integraal/integraal-forward-chaining/pom.xml
@@ -34,7 +34,10 @@
 			<groupId>${groupId}</groupId>
 			<artifactId>integraal-util</artifactId>
 		</dependency>
-
+		<dependency>
+			<groupId>${groupId}</groupId>
+			<artifactId>integraal-configuration</artifactId>
+		</dependency>
 		<dependency>
 			<groupId>org.junit.jupiter</groupId>
 			<artifactId>junit-jupiter-api</artifactId>
diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/Chase.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/Chase.java
index bbac874322f11ae7280f34b10bda89d7d3f69b2c..8f18db03c6c53f2a7e0607d6291a9b475b18e0b8 100644
--- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/Chase.java
+++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/Chase.java
@@ -1,17 +1,11 @@
 package fr.boreal.forward_chaining.chase;
 
 import fr.boreal.forward_chaining.api.ForwardChainingAlgorithm;
-import fr.boreal.forward_chaining.chase.lineage.LineageTracker;
-import fr.boreal.forward_chaining.chase.rule_applier.RuleApplier;
+import fr.boreal.forward_chaining.chase.description.ChaseDescription;
+import fr.boreal.forward_chaining.chase.description.IChaseDescription;
 import fr.boreal.forward_chaining.chase.rule_scheduler.RuleScheduler;
 import fr.boreal.model.kb.api.FactBase;
 import fr.boreal.model.kb.api.RuleBase;
-import fr.boreal.model.logicalElements.api.Atom;
-import fr.boreal.model.logicalElements.api.Substitution;
-import fr.boreal.model.rule.api.Rule;
-
-import java.util.*;
-import java.util.stream.Collectors;
 
 /**
  * The Chase is a way to saturate a {@link FactBase} according to rules
@@ -101,4 +95,15 @@ public interface Chase extends ForwardChainingAlgorithm {
      */
     int getStepCount();
 
+    /**
+     * Returns a description of the configuration of the chase
+     */
+    IChaseDescription getDescription();
+
+    /**
+     * Returns a String description of the configuration of the chase
+     */
+    default String describe() {
+        return this.getDescription().toJson();
+    }
 }
diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/ChaseImpl.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/ChaseImpl.java
index 7dd72f808cf3a2c171aca6d7b60f23f746a614a5..76d8f940077bbbcf607b03bf4ce4e3d7d398d35a 100644
--- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/ChaseImpl.java
+++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/ChaseImpl.java
@@ -1,13 +1,10 @@
 package fr.boreal.forward_chaining.chase;
 
 import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
 
+import fr.boreal.forward_chaining.chase.description.ChaseDescription;
+import fr.boreal.forward_chaining.chase.description.IChaseDescription;
 import fr.boreal.forward_chaining.chase.halting_condition.HaltingCondition;
-import fr.boreal.forward_chaining.chase.lineage.LineageTracker;
-import fr.boreal.forward_chaining.chase.lineage.LineageTrackerImpl;
 import fr.boreal.forward_chaining.chase.rule_applier.RuleApplier;
 import fr.boreal.forward_chaining.chase.rule_scheduler.RuleScheduler;
 import fr.boreal.forward_chaining.chase.treatment.EndTreatment;
@@ -15,10 +12,7 @@ import fr.boreal.forward_chaining.chase.treatment.Pretreatment;
 import fr.boreal.forward_chaining.chase.treatment.Treatment;
 import fr.boreal.model.kb.api.FactBase;
 import fr.boreal.model.kb.api.RuleBase;
-import fr.boreal.model.logicalElements.api.Atom;
-import fr.boreal.model.logicalElements.api.Substitution;
 import fr.boreal.model.rule.api.FORule;
-import fr.boreal.model.rule.api.Rule;
 
 /**
  * Default implementation of the chase algorithm
@@ -75,6 +69,7 @@ public class ChaseImpl implements Chase {
         this.step_pretreatments = step_pretreatments;
         this.global_end_treatments = global_end_treatments;
         this.end_of_step_treatments = end_of_step_treatments;
+
         this.last_step_result = new RuleApplicationStepResult(null, null);
     }
 
@@ -155,8 +150,78 @@ public class ChaseImpl implements Chase {
     @Override
     public String toString() {
         return "Steps : " + this.step_number +
-                "\nStep result :\n" + this.last_step_result +
-                "\nFacts :\n" + this.fb.toString();
+               "\nStep result :\n" + this.last_step_result +
+               "\nFacts :\n" + this.fb.toString();
+    }
+
+    public IChaseDescription getDescription() {
+        return new ChaseDescription(
+                fb,
+                rb,
+                rule_scheduler,
+                rule_applier,
+                last_step_result,
+                step_number,
+                halting_conditions,
+                global_pretreatments,
+                step_pretreatments,
+                global_end_treatments,
+                end_of_step_treatments
+        );
+    }
+    @Override
+    public String describe() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("ChaseImpl\n");
+        sb.append("├── FactBase (size): ").append(fb.size()).append("\n");
+        sb.append("├── RuleBase (size): ").append(rb.getRules().size()).append("\n");
+        sb.append("├── RuleScheduler: ").append(rule_scheduler.describe()).append("\n");
+        sb.append("├── RuleApplier: ").append(rule_applier.describe()).append("\n");
+        sb.append("├── LastStepResult: ").append(last_step_result.describe()).append("\n");
+        sb.append("├── StepNumber: ").append(step_number).append("\n");
+
+        sb.append("├── HaltingConditions:\n");
+        for (HaltingCondition hc : halting_conditions) {
+            sb.append("│   ├── ").append(hc.describe()).append("\n");
+        }
+
+        if (global_pretreatments.isEmpty()) {
+            sb.append("├── No Global Pretreatments\n");
+        } else {
+            sb.append("├── GlobalPretreatments:\n");
+            for (Pretreatment p : global_pretreatments) {
+                sb.append("│   ├── ").append(p.describe()).append("\n");
+            }
+        }
+
+        if (step_pretreatments.isEmpty()) {
+            sb.append("├── No Step Pretreatment\n");
+        } else {
+            sb.append("├── StepPretreatments:\n");
+            for (Pretreatment p : step_pretreatments) {
+                sb.append("│   ├── ").append(p.describe()).append("\n");
+            }
+        }
+
+        if (global_pretreatments.isEmpty()) {
+            sb.append("├── No Global End Treatment\n");
+        } else {
+            sb.append("├── GlobalEndTreatments:\n");
+            for (EndTreatment et : global_end_treatments) {
+                sb.append("│   ├── ").append(et.describe()).append("\n");
+            }
+        }
+
+        if (end_of_step_treatments.isEmpty()) {
+            sb.append("└── No End Of Step Treatment\n");
+        } else {
+            sb.append("└── EndOfStepTreatments:\n");
+            for (EndTreatment et : end_of_step_treatments) {
+                sb.append("    ├── ").append(et.describe()).append("\n");
+            }
+        }
+
+        return sb.toString();
     }
 
     /////////////////////////////////////////////////
diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/RuleApplicationStepResult.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/RuleApplicationStepResult.java
index 688aae24d6ace06ecaf5680bffe5fc048d72f704..90ee65172d10bc06ab6d32ec0c67fb2097ccde92 100644
--- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/RuleApplicationStepResult.java
+++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/RuleApplicationStepResult.java
@@ -14,45 +14,58 @@ import java.util.stream.Collectors;
  */
 public class RuleApplicationStepResult {
 
-	private final Collection<FORule> applied_rules;
-	private final Collection<Atom> created_facts;
-
-	private FactBase created_facts_factbase = null;
-
-	/**
-	 * Constructor with rules and facts
-	 * @param applied_rules rules applied at the step
-	 * @param created_facts facts created at the step
-	 */
-	public RuleApplicationStepResult(Collection<FORule> applied_rules, Collection<Atom> created_facts)  {
-		this.applied_rules = applied_rules;
-		this.created_facts = created_facts;
-	}
-
-	/**
-	 * @return the rules applied at the step
-	 */
-	public Collection<FORule> applied_rules() {
-		return this.applied_rules;
-	}
-
-	/**
-	 * @return the facts created at the step
-	 */
-	public Collection<Atom> created_facts() {
-		return this.created_facts;
-	}	
-
-	/**
-	 * @return the facts created at the step seen as a FactBase with indexes, kept in cache
-	 */
-	public FactBase created_facts_as_factbase() {
-		if(this.created_facts_factbase == null) {
-			this.created_facts_factbase = new SimpleInMemoryGraphStore(
-					this.created_facts.stream()
-					.flatMap(facts -> facts.asAtomSet().stream())
-					.collect(Collectors.toSet()));
-		}
-		return this.created_facts_factbase;
-	}
+    private final Collection<FORule> applied_rules;
+    private final Collection<Atom> created_facts;
+
+    private FactBase created_facts_factbase = null;
+
+    /**
+     * Constructor with rules and facts
+     *
+     * @param applied_rules rules applied at the step
+     * @param created_facts facts created at the step
+     */
+    public RuleApplicationStepResult(Collection<FORule> applied_rules, Collection<Atom> created_facts) {
+        this.applied_rules = applied_rules;
+        this.created_facts = created_facts;
+    }
+
+    /**
+     * @return the rules applied at the step
+     */
+    public Collection<FORule> applied_rules() {
+        return this.applied_rules;
+    }
+
+    /**
+     * @return the facts created at the step
+     */
+    public Collection<Atom> created_facts() {
+        return this.created_facts;
+    }
+
+    /**
+     * @return the facts created at the step seen as a FactBase with indexes, kept in cache
+     */
+    public FactBase created_facts_as_factbase() {
+        if (this.created_facts_factbase == null) {
+            this.created_facts_factbase = new SimpleInMemoryGraphStore(
+                    this.created_facts.stream()
+                            .flatMap(facts -> facts.asAtomSet().stream())
+                            .collect(Collectors.toSet()));
+        }
+        return this.created_facts_factbase;
+    }
+
+
+    /**
+     * Defautl method to describe the rule scheduler
+     */
+    public String describe() {
+        if (applied_rules == null) {
+            return "No rule applied yet.";
+        } else {
+            return "Applied " + applied_rules.size() + " rules in the last step ; inferred " + created_facts.size() + " atoms.";
+        }
+    }
 }
diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/description/ChaseDescription.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/description/ChaseDescription.java
new file mode 100644
index 0000000000000000000000000000000000000000..7a269c2e8ba69b9c2fabab3e522f646ca541daeb
--- /dev/null
+++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/description/ChaseDescription.java
@@ -0,0 +1,112 @@
+package fr.boreal.forward_chaining.chase.description;
+
+import fr.boreal.configuration.parameters.IGParameter;
+import fr.boreal.forward_chaining.chase.RuleApplicationStepResult;
+import fr.boreal.forward_chaining.chase.halting_condition.HaltingCondition;
+import fr.boreal.forward_chaining.chase.rule_applier.RuleApplier;
+import fr.boreal.forward_chaining.chase.rule_scheduler.RuleScheduler;
+import fr.boreal.forward_chaining.chase.treatment.EndTreatment;
+import fr.boreal.forward_chaining.chase.treatment.Pretreatment;
+import fr.boreal.model.kb.api.FactBase;
+import fr.boreal.model.kb.api.RuleBase;
+import fr.boreal.configuration.keywords.InteGraalKeywords;
+
+import java.util.Collection;
+import java.util.List;
+
+public record ChaseDescription(
+        FactBase factBase,
+        RuleBase ruleBase,
+        RuleScheduler ruleScheduler,
+        RuleApplier ruleApplier,
+        RuleApplicationStepResult lastStepResult,
+
+        int stepNumber,
+        Collection<HaltingCondition> haltingConditions,
+        Collection<Pretreatment> globalPretreatments,
+        Collection<Pretreatment> stepPretreatments,
+        Collection<EndTreatment> globalEndTreatments,
+        Collection<EndTreatment> endOfStepTreatments
+) implements IChaseDescription {
+
+    public Collection<IGParameter<InteGraalKeywords,?>> getCorrespondingParameters(){
+        //TODO add the other items of the configuration
+        return List.of(ruleScheduler.getCorrespondingParameter());
+    }
+    // Convert to a manually built JSON string
+    public String toJson() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("{\n");
+
+        sb.append("  \"factBaseSize\": ").append(factBase.size()).append(",\n");
+        sb.append("  \"ruleBaseSize\": ").append(ruleBase.getRules().size()).append(",\n");
+        sb.append("  \"ruleScheduler\": \"").append(ruleScheduler.describe()).append("\",\n");
+        sb.append("  \"ruleApplier\": \"").append(ruleApplier.describeJSON()).append("\",\n");
+        sb.append("  \"lastStepResult\": \"").append(lastStepResult.describe()).append("\",\n");
+        sb.append("  \"stepNumber\": ").append(stepNumber).append(",\n");
+
+        appendJsonArray(sb, "haltingConditions", haltingConditions);
+        appendJsonArray(sb, "globalPretreatments", globalPretreatments);
+        appendJsonArray(sb, "stepPretreatments", stepPretreatments);
+        appendJsonArray(sb, "globalEndTreatments", globalEndTreatments);
+        appendJsonArray(sb, "endOfStepTreatments", endOfStepTreatments, false);
+
+        sb.append("\n}");
+        return sb.toString();
+    }
+
+    // Convert to a human-readable structured string
+    public String toPrettyString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("ChaseImpl\n");
+        sb.append("├── FactBase (size): ").append(factBase.size()).append("\n");
+        sb.append("├── RuleBase (size): ").append(ruleBase.getRules().size()).append("\n");
+        sb.append("├── RuleScheduler: ").append(ruleScheduler.describe()).append("\n");
+        sb.append("├── RuleApplier: ").append(ruleApplier.describe()).append("\n");
+        sb.append("├── LastStepResult: ").append(lastStepResult.describe()).append("\n");
+        sb.append("├── StepNumber: ").append(stepNumber).append("\n");
+
+        appendPrettySection(sb, "HaltingConditions", haltingConditions);
+        appendPrettySection(sb, "GlobalPretreatments", globalPretreatments);
+        appendPrettySection(sb, "StepPretreatments", stepPretreatments);
+        appendPrettySection(sb, "GlobalEndTreatments", globalEndTreatments);
+        appendPrettySection(sb, "EndOfStepTreatments", endOfStepTreatments);
+
+        return sb.toString();
+    }
+
+    // Helper method for JSON arrays
+    private static <T> void appendJsonArray(StringBuilder sb, String key, Collection<T> collection) {
+        appendJsonArray(sb, key, collection, true);
+    }
+
+    private static <T> void appendJsonArray(StringBuilder sb, String key, Collection<T> collection, boolean addComma) {
+        sb.append("  \"").append(key).append("\": [");
+        if (collection.isEmpty()) {
+            sb.append("]");
+            if (addComma) sb.append(",");
+            sb.append("\n");
+        } else {
+            sb.append("\n");
+            for (T item : collection) {
+                sb.append("    \"").append(item.toString()).append("\",\n");
+            }
+            sb.setLength(sb.length() - 2); // Remove last comma
+            sb.append("\n  ]");
+            if (addComma) sb.append(",");
+            sb.append("\n");
+        }
+    }
+
+    // Helper method for structured string sections
+    private static <T> void appendPrettySection(StringBuilder sb, String title, Collection<T> collection) {
+        sb.append("├── ").append(title).append(":\n");
+        if (collection.isEmpty()) {
+            sb.append("│   ├── None\n");
+        } else {
+            for (T item : collection) {
+                sb.append("│   ├── ").append(item.toString()).append("\n");
+            }
+        }
+    }
+}
diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/description/IChaseDescription.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/description/IChaseDescription.java
new file mode 100644
index 0000000000000000000000000000000000000000..d7203fea0faeddbd04707630451405c7dc2a3dc9
--- /dev/null
+++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/description/IChaseDescription.java
@@ -0,0 +1,29 @@
+package fr.boreal.forward_chaining.chase.description;
+
+import fr.boreal.configuration.keywords.InteGraalKeywords;
+import fr.boreal.configuration.parameters.IGParameter;
+
+import java.util.Collection;
+
+public interface IChaseDescription {
+
+    /**
+     *
+     * @return a string description of the chase configuration and status
+     */
+    public String toJson();
+
+    /**
+     *
+     * @return a JSON string description of the chase configuration and status
+     */
+    public String toPrettyString();
+
+    /**
+     *
+     * @return the set of parameters corresponding to this chase configuration
+     */
+    default Collection<IGParameter<InteGraalKeywords,?>> getCorrespondingParameters(){
+        return null;
+    }
+}
diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/description/StratifiedChaseDescription.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/description/StratifiedChaseDescription.java
new file mode 100644
index 0000000000000000000000000000000000000000..84e8c5fe8e720374afb1833633df122d4c007b2b
--- /dev/null
+++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/description/StratifiedChaseDescription.java
@@ -0,0 +1,112 @@
+package fr.boreal.forward_chaining.chase.description;
+
+import fr.boreal.forward_chaining.chase.Chase;
+import fr.boreal.forward_chaining.chase.ChaseBuilder;
+import fr.boreal.forward_chaining.chase.halting_condition.HaltingCondition;
+import fr.boreal.forward_chaining.chase.treatment.EndTreatment;
+import fr.boreal.forward_chaining.chase.treatment.Pretreatment;
+import fr.boreal.model.kb.api.FactBase;
+import fr.boreal.model.kb.api.RuleBase;
+
+import java.util.Collection;
+import java.util.List;
+
+public record StratifiedChaseDescription(
+        FactBase factBase,
+        List<RuleBase> strata,
+        Chase chase,
+        ChaseBuilder chaseBuilder,
+        Collection<HaltingCondition> haltingConditions,
+        Collection<Pretreatment> globalPretreatments,
+        Collection<Pretreatment> stepPretreatments,
+        Collection<EndTreatment> globalEndTreatments,
+        Collection<EndTreatment> endOfStepTreatments,
+        int stepNumber
+) implements IChaseDescription {
+
+    // Convert to manually built JSON string
+    public String toJson() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("{\n");
+
+        sb.append("  \"factBaseSize\": ").append(factBase.size()).append(",\n");
+
+        // Strata as an array
+        sb.append("  \"strata\": [\n");
+        for (int i = 0; i < strata.size(); i++) {
+            sb.append("    { \"stratumIndex\": ").append(i)
+                    .append(", \"ruleCount\": ").append(strata.get(i).getRules().size()).append(" }");
+            if (i < strata.size() - 1) sb.append(",");
+            sb.append("\n");
+        }
+        sb.append("  ],\n");
+
+        sb.append("  \"currentStepNumber\": ").append(stepNumber).append(",\n");
+        sb.append("  \"currentChase\": \"").append(chase != null ? chase.describe() : "None").append("\",\n");
+
+        appendJsonArray(sb, "haltingConditions", haltingConditions);
+        appendJsonArray(sb, "globalPretreatments", globalPretreatments);
+        appendJsonArray(sb, "stepPretreatments", stepPretreatments);
+        appendJsonArray(sb, "globalEndTreatments", globalEndTreatments);
+        appendJsonArray(sb, "endOfStepTreatments", endOfStepTreatments, false);
+
+        sb.append("\n}");
+        return sb.toString();
+    }
+
+    // Convert to human-readable structured string
+    public String toPrettyString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("StratifiedChase\n");
+        sb.append("├── FactBase (size): ").append(factBase.size()).append("\n");
+
+        sb.append("├── Strata:\n");
+        for (int i = 0; i < strata.size(); i++) {
+            sb.append("│   ├── Stratum ").append(i).append(" (size): ").append(strata.get(i).getRules().size()).append("\n");
+        }
+
+        sb.append("├── Current Step Number: ").append(stepNumber).append("\n");
+        sb.append("├── Current Chase: ").append(chase != null ? chase.describe() : "None").append("\n");
+
+        appendPrettySection(sb, "HaltingConditions", haltingConditions);
+        appendPrettySection(sb, "GlobalPretreatments", globalPretreatments);
+        appendPrettySection(sb, "StepPretreatments", stepPretreatments);
+        appendPrettySection(sb, "GlobalEndTreatments", globalEndTreatments);
+        appendPrettySection(sb, "EndOfStepTreatments", endOfStepTreatments);
+
+        return sb.toString();
+    }
+
+    // Helper method for JSON arrays
+    private static <T> void appendJsonArray(StringBuilder sb, String key, Collection<T> collection) {
+        appendJsonArray(sb, key, collection, true);
+    }
+
+    private static <T> void appendJsonArray(StringBuilder sb, String key, Collection<T> collection, boolean addComma) {
+        sb.append("  \"").append(key).append("\": [");
+        if (collection.isEmpty()) {
+            sb.append("],\n");
+        } else {
+            sb.append("\n");
+            for (T item : collection) {
+                sb.append("    \"").append(item.toString()).append("\",\n");
+            }
+            sb.setLength(sb.length() - 2); // Remove last comma
+            sb.append("\n  ]");
+            if (addComma) sb.append(",");
+            sb.append("\n");
+        }
+    }
+
+    // Helper method for structured string sections
+    private static <T> void appendPrettySection(StringBuilder sb, String title, Collection<T> collection) {
+        sb.append("├── ").append(title).append(":\n");
+        if (collection.isEmpty()) {
+            sb.append("│   ├── None\n");
+        } else {
+            for (T item : collection) {
+                sb.append("│   ├── ").append(item.toString()).append("\n");
+            }
+        }
+    }
+}
diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/halting_condition/HaltingCondition.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/halting_condition/HaltingCondition.java
index 72942ff935bf973b1f4e225ed1cebbea3cbb7360..93d05e2565eafc4523c1cf924e9ab12998c2576f 100644
--- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/halting_condition/HaltingCondition.java
+++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/halting_condition/HaltingCondition.java
@@ -18,4 +18,9 @@ public interface HaltingCondition {
 	 */
     boolean check();
 
+	/**
+	 * Defautl method to describe the rule scheduler
+	 */
+	default String describe(){return this.getClass().getSimpleName();}
+
 }
diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/metachase/stratified/StratifiedChase.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/metachase/stratified/StratifiedChase.java
index 74dd1153667f2f61d29bfa40fef273df158feff4..d6aa65d5e23069ef4203939e4d012a945cbd11e8 100644
--- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/metachase/stratified/StratifiedChase.java
+++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/metachase/stratified/StratifiedChase.java
@@ -3,20 +3,20 @@ package fr.boreal.forward_chaining.chase.metachase.stratified;
 import fr.boreal.forward_chaining.chase.Chase;
 import fr.boreal.forward_chaining.chase.ChaseBuilder;
 import fr.boreal.forward_chaining.chase.RuleApplicationStepResult;
+import fr.boreal.forward_chaining.chase.description.ChaseDescription;
+import fr.boreal.forward_chaining.chase.description.IChaseDescription;
+import fr.boreal.forward_chaining.chase.description.StratifiedChaseDescription;
 import fr.boreal.forward_chaining.chase.halting_condition.HaltingCondition;
-import fr.boreal.forward_chaining.chase.lineage.LineageTracker;
-import fr.boreal.forward_chaining.chase.lineage.LineageTrackerImpl;
 import fr.boreal.forward_chaining.chase.rule_scheduler.RuleScheduler;
 import fr.boreal.forward_chaining.chase.treatment.EndTreatment;
 import fr.boreal.forward_chaining.chase.treatment.Pretreatment;
 import fr.boreal.forward_chaining.chase.treatment.Treatment;
 import fr.boreal.model.kb.api.FactBase;
 import fr.boreal.model.kb.api.RuleBase;
-import fr.boreal.model.logicalElements.api.Atom;
-import fr.boreal.model.logicalElements.api.Substitution;
-import fr.boreal.model.rule.api.Rule;
 
-import java.util.*;
+import java.util.Collection;
+import java.util.List;
+import java.util.Optional;
 
 public class StratifiedChase implements Chase {
     private final FactBase fb;
@@ -128,7 +128,7 @@ public class StratifiedChase implements Chase {
     @Override
     public String toString() {
         return "Steps : " + this.step_number +
-                "\nFacts :\n" + this.fb.toString();
+               "\nFacts :\n" + this.fb.toString();
     }
 
     private void initAll() {
@@ -158,4 +158,20 @@ public class StratifiedChase implements Chase {
     private void initHaltingConditions() {
         this.halting_conditions.forEach(condition -> condition.init(this));
     }
+
+    public IChaseDescription getDescription() {
+        return new StratifiedChaseDescription(
+                fb,
+                strata,
+                chase,
+                chaseBuilder,
+                halting_conditions,
+                global_pretreatments,
+                step_pretreatments,
+                global_end_treatments,
+                end_of_step_treatments,
+                step_number
+        );
+    }
+
 }
diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/AbstractRuleApplier.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/AbstractRuleApplier.java
index 65643a52d7d69b0e9d3d8308705d97eeefd8a4df..55ef02dcc0355603413d31f5c86c92d87418d3ae 100644
--- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/AbstractRuleApplier.java
+++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/AbstractRuleApplier.java
@@ -5,8 +5,6 @@ import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 
-import fr.boreal.forward_chaining.chase.lineage.LineageTracker;
-import fr.boreal.forward_chaining.chase.lineage.LineageTrackerImpl;
 import org.slf4j.Logger;
 
 import fr.boreal.forward_chaining.chase.Chase;
@@ -19,73 +17,91 @@ import fr.boreal.model.rule.api.FORule;
 
 /**
  * @author Florent Tornil
- * <p>
+ *
  * Abstract class
  */
 public abstract class AbstractRuleApplier implements RuleApplier {
 
-    protected Logger LOG;
-
-    /**
-     * Transformation of the rule's body to a query
-     */
-    protected final BodyToQueryTransformer transformer;
-
-    /**
-     * How to evaluate the rule's body
-     */
-    protected final TriggerComputer computer;
-
-    /**
-     * How to check the trigger should be applied
-     */
-    protected final TriggerChecker checker;
-
-    /**
-     * How to effectively apply the trigger
-     */
-    protected final TriggerApplier applier;
-
-    /**
-     * Constructor
-     *
-     * @param transformer the BodyToQueryTransformer
-     * @param computer    the TriggerComputer
-     * @param checker     the TriggerChecker
-     * @param applier     the TriggerApplier
-     */
-    public AbstractRuleApplier(BodyToQueryTransformer transformer, TriggerComputer computer, TriggerChecker checker, TriggerApplier applier) {
-        this.transformer = transformer;
-        this.computer = computer;
-        this.checker = checker;
-        this.applier = applier;
-    }
-
-    @Override
-    public void init(Chase c) {
-        this.computer.init(c);
-    }
-
-    /**
-     * Re-groups the rules with the same body
-     *
-     * @param rules rules to re-group
-     * @return the map of query to rules
-     */
-    protected Map<FOQuery<?>, Collection<FORule>> groupRulesByBodyQuery(Collection<FORule> rules) {
-        Map<FOQuery<?>, Collection<FORule>> map = new HashMap<>();
-
-        for (FORule rule : rules) {
-            FOQuery<?> ruleQuery = this.transformer.transform(rule);
-            if (!map.containsKey(ruleQuery)) {
-                map.put(ruleQuery, new ArrayList<>());
-            }
-            map.get(ruleQuery).add(rule);
-        }
-        return map;
-    }
-
-    public TriggerApplier getTriggerApplier(){
-        return applier;
-    }
+	protected Logger LOG;
+
+	/**
+	 * Transformation of the rule's body to a query
+	 */
+	protected final BodyToQueryTransformer transformer;
+
+	/**
+	 * How to evaluate the rule's body
+	 */
+	protected final TriggerComputer computer;
+
+	/**
+	 * How to check the trigger should be applied
+	 */
+	protected final TriggerChecker checker;
+
+	/**
+	 * How to effectively apply the trigger
+	 */
+	protected final TriggerApplier applier;
+
+	/**
+	 * Defautl method to describe the rule scheduler
+	 */
+	public String describe(){
+			return "\n" +
+				   "│   ├── TriggerComputer: " + computer.describe() + "\n" +
+				   "│   ├── TriggerChecker: " + checker.describe() + "\n" +
+				   "│   ├── TriggerApplier: " + applier.describe() + "\n" +
+				   "│   └── BodyToQueryTransformer: " + transformer.describe();
+	}
+
+	@Override
+	public String describeJSON() {
+		return "{\n" +
+			   "  \"TriggerComputer\": \"" + computer.describe() + "\",\n" +
+			   "  \"TriggerChecker\": \"" + checker.describe() + "\",\n" +
+			   "  \"TriggerApplier\": \"" + applier.describe() + "\",\n" +
+			   "  \"BodyToQueryTransformer\": \"" + transformer.describe() + "\"\n" +
+			   "}";
+	}
+
+	/**
+	 * Constructor
+	 * 
+	 * @param transformer the BodyToQueryTransformer
+	 * @param computer the TriggerComputer
+	 * @param checker the TriggerChecker
+	 * @param applier the TriggerApplier
+	 */
+	public AbstractRuleApplier(BodyToQueryTransformer transformer, TriggerComputer computer, TriggerChecker checker, TriggerApplier applier) {
+		this.transformer = transformer;
+		this.computer = computer;
+		this.checker = checker;
+		this.applier = applier;
+	}
+
+	@Override
+	public void init(Chase c) {
+		this.computer.init(c);		
+	}
+
+	/**
+	 *  Re-groups the rules with the same body
+	 *  
+	 * @param rules rules to re-group
+	 * @return the map of query to rules
+	 */
+	protected Map<FOQuery<?>, Collection<FORule>> groupRulesByBodyQuery(Collection<FORule> rules) {
+		Map<FOQuery<?>, Collection<FORule>> map = new HashMap<>();
+
+		for(FORule rule : rules) {
+			FOQuery<?> ruleQuery = this.transformer.transform(rule);
+			if(!map.containsKey(ruleQuery)) {
+				map.put(ruleQuery, new ArrayList<>());
+			}
+			map.get(ruleQuery).add(rule);
+		}
+		return map;
+	}
+
 }
diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/RuleApplier.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/RuleApplier.java
index dd1cbfd35082fce36099ff6c92f1a4e7b96a177f..5b344d6dbf9d93d6c135a3c3a11edca0a631fbc6 100644
--- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/RuleApplier.java
+++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/RuleApplier.java
@@ -1,46 +1,40 @@
 package fr.boreal.forward_chaining.chase.rule_applier;
 
 import java.util.Collection;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Set;
 
 import fr.boreal.forward_chaining.chase.Chase;
 import fr.boreal.forward_chaining.chase.RuleApplicationStepResult;
-import fr.boreal.forward_chaining.chase.lineage.LineageTracker;
-import fr.boreal.forward_chaining.chase.rule_applier.trigger_applier.TriggerApplier;
 import fr.boreal.model.kb.api.FactBase;
-import fr.boreal.model.logicalElements.api.Atom;
-import fr.boreal.model.logicalElements.api.Substitution;
 import fr.boreal.model.rule.api.FORule;
-import fr.boreal.model.rule.api.Rule;
 
 /**
  * A rule applier applies the given rules of the given factbase
  */
 public interface RuleApplier {
-
-    /**
-     * Initialize the rule applier for the given chase
-     *
-     * @param c the chase object
-     */
+	
+	/**
+	 * Initialize the rule applier for the given chase
+	 * @param c the chase object
+	 */
     void init(Chase c);
-
-    /**
-     * Applies the given rules on the given factbase an returns the result (see {@link RuleApplicationStepResult})
-     *
-     * @param rules the rules to apply
-     * @param fb    the factbase to apply the rules on
-     * @return the result of one application step
-     */
+	
+	/**
+	 * Applies the given rules on the given factbase an returns the result (see {@link RuleApplicationStepResult})
+	 * @param rules the rules to apply
+	 * @param fb  the factbase to apply the rules on
+	 * @return the result of one application step
+	 */
     RuleApplicationStepResult apply(Collection<FORule> rules, FactBase fb);
 
-    /**
-     *
-     * @return the lineage tracker
-     */
-    default TriggerApplier getTriggerApplier(){
-        throw new RuntimeException("operation not supported");
-    }
+	/**
+	 *
+	 * @return a description of the rule applier
+	 */
+	String describe();
+
+	/**
+	 *
+	 * @return a JSON description of the rule applier
+	 */
+	String describeJSON();
 }
diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/SourceDelegatedDatalogRuleApplier.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/SourceDelegatedDatalogRuleApplier.java
index 29c3f623fb74f45cb23a96de0206aa3146cad2cd..1a154ac9e00453c22e967815716395f4a8887e89 100644
--- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/SourceDelegatedDatalogRuleApplier.java
+++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/SourceDelegatedDatalogRuleApplier.java
@@ -95,5 +95,17 @@ public class SourceDelegatedDatalogRuleApplier implements RuleApplier {
 		return this.fallback.apply(rules, fb);
 	}
 
+	@Override
+	public String describe() {
+		return this.getClass().getSimpleName() + " with fallback " + this.fallback.describe();
+	}
+
+	@Override
+	public String describeJSON() {
+		return "{\n" +
+			   "  \"class\": \"" + this.getClass().getSimpleName() + "\",\n" +
+			   "  \"fallback\": \"" + this.fallback.describe() + "\"\n" +
+			   "}";
+	}
 
 }
diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/body_to_query_transformer/BodyToQueryTransformer.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/body_to_query_transformer/BodyToQueryTransformer.java
index a26cb1b18545146ded12b335f72e6a1ebe6b53f0..67acc92d49e430745bb0226011b681a8fba4fec3 100644
--- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/body_to_query_transformer/BodyToQueryTransformer.java
+++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/body_to_query_transformer/BodyToQueryTransformer.java
@@ -20,4 +20,10 @@ public interface BodyToQueryTransformer {
 	 */
 	FOQuery<?> transform(FORule rule);
 
+
+	/**
+	 * Defautl method to describe the rule scheduler
+	 */
+	default String describe(){return this.getClass().getSimpleName();}
+
 }
diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/trigger_applier/TriggerApplier.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/trigger_applier/TriggerApplier.java
index 752755f1f0e3f26da0ae263e24136774a51cf768..c8fa25deffae1d2dc335e4fa0ad1f547a66de6f9 100644
--- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/trigger_applier/TriggerApplier.java
+++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/trigger_applier/TriggerApplier.java
@@ -26,4 +26,9 @@ public interface TriggerApplier {
 	 */
 	FOFormula apply(FORule rule, Substitution substitution, FactBase fb);
 
+
+	/**
+	 * Defautl method to describe the rule scheduler
+	 */
+	default String describe(){return this.getClass().getSimpleName();}
 }
diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/trigger_checker/TriggerChecker.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/trigger_checker/TriggerChecker.java
index 7ca56943ec3671589dfae59eefab33bc04fe9154..cf480a9cb37cc15f01df79dc630fe2653ff75901 100644
--- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/trigger_checker/TriggerChecker.java
+++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/trigger_checker/TriggerChecker.java
@@ -17,4 +17,9 @@ public interface TriggerChecker {
 	 */
     boolean check(FORule rule, Substitution substitution, FactBase fb);
 
+
+	/**
+	 * Defautl method to describe the rule scheduler
+	 */
+	default String describe(){return this.getClass().getSimpleName();}
 }
diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/trigger_computer/TriggerComputer.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/trigger_computer/TriggerComputer.java
index 9f2e55d98a2047783a39fe0bbcb67a0f05e72dc0..16380ba2cff89c28fe959854c8a386012b4fdb92 100644
--- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/trigger_computer/TriggerComputer.java
+++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_applier/trigger_computer/TriggerComputer.java
@@ -26,4 +26,9 @@ public interface TriggerComputer {
 	 */
 	Iterator<Substitution> compute(FOQuery<?> body, FactBase fb);
 
+
+	/**
+	 * Defautl method to describe the rule scheduler
+	 */
+	default String describe(){return this.getClass().getSimpleName();}
 }
diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_scheduler/GRDScheduler.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_scheduler/GRDScheduler.java
index db0e4464f058db81717680c9e58a02f20ec3664b..bd95819bc283488eac3a0ccc6bdde28c5524f8e1 100644
--- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_scheduler/GRDScheduler.java
+++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_scheduler/GRDScheduler.java
@@ -3,10 +3,13 @@ package fr.boreal.forward_chaining.chase.rule_scheduler;
 import java.util.Collection;
 import java.util.stream.Collectors;
 
+import fr.boreal.configuration.parameters.IGParameter;
 import fr.boreal.grd.api.GraphOfFORuleDependencies;
 import fr.boreal.grd.impl.GRDImpl;
 import fr.boreal.model.kb.api.RuleBase;
 import fr.boreal.model.rule.api.FORule;
+import fr.boreal.configuration.keywords.InteGraalKeywords;
+import org.eclipse.rdf4j.query.algebra.In;
 
 /**
  * Schedules all the rules that can be triggered by rules applied at the previous step
@@ -41,4 +44,12 @@ public class GRDScheduler implements RuleScheduler {
 				.collect(Collectors.toSet());
 	}
 
+	public String describe(){
+		return getCorrespondingParameter().value().toString();
+	}
+
+	public IGParameter<InteGraalKeywords,?> getCorrespondingParameter(){
+		return new IGParameter<>(InteGraalKeywords.SCHEDULER,InteGraalKeywords.Algorithms.Parameters.Chase.Scheduler.GRD);
+	}
+
 }
diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_scheduler/NaiveScheduler.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_scheduler/NaiveScheduler.java
index f28e10e4c7c0b9f2ace21617af3d615267eecb76..fd0ebce8b66059e78ced2fa9e5e9ec5382b48ac2 100644
--- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_scheduler/NaiveScheduler.java
+++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_scheduler/NaiveScheduler.java
@@ -2,8 +2,10 @@ package fr.boreal.forward_chaining.chase.rule_scheduler;
 
 import java.util.Collection;
 
+import fr.boreal.configuration.parameters.IGParameter;
 import fr.boreal.model.kb.api.RuleBase;
 import fr.boreal.model.rule.api.FORule;
+import fr.boreal.configuration.keywords.InteGraalKeywords;
 
 /**
  * Schedules all the rules for every step
@@ -29,5 +31,12 @@ public class NaiveScheduler implements RuleScheduler {
 		return this.rb.getRules();
 	}
 
+	public String describe(){
+		return getCorrespondingParameter().value().toString();
+	}
+
+	public IGParameter<InteGraalKeywords,?> getCorrespondingParameter(){
+		return new IGParameter<>(InteGraalKeywords.SCHEDULER,InteGraalKeywords.Algorithms.Parameters.Chase.Scheduler.NAIVE_SCHEDULER);
+	}
 
 }
diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_scheduler/RuleScheduler.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_scheduler/RuleScheduler.java
index 0f29bb38501aa9a93763f5cb15c93567a6a14bc4..b9312da3e34b5f123936d934dd26868fef9badc9 100644
--- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_scheduler/RuleScheduler.java
+++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/rule_scheduler/RuleScheduler.java
@@ -2,6 +2,8 @@ package fr.boreal.forward_chaining.chase.rule_scheduler;
 
 import java.util.Collection;
 
+import fr.boreal.configuration.keywords.InteGraalKeywords;
+import fr.boreal.configuration.parameters.IGParameter;
 import fr.boreal.model.kb.api.RuleBase;
 import fr.boreal.model.rule.api.FORule;
 
@@ -21,5 +23,15 @@ public interface RuleScheduler {
 	 * @return the rules to apply at the next step
 	 */
     Collection<FORule> getRulesToApply(Collection<FORule> last_applied_rules);
-	
+
+	/**
+	 * Defautl method to describe the rule scheduler
+	 */
+	String describe();
+
+	/**
+	 *
+	 * @return the parameter corresponding to this object
+	 */
+	IGParameter<InteGraalKeywords,?> getCorrespondingParameter();
 }
diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/treatment/Treatment.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/treatment/Treatment.java
index 531d5e59c29e35f53d632061029801fefb6aa37c..c45c68fd32acfebbe6fd94fcc804f514683be25e 100644
--- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/treatment/Treatment.java
+++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/treatment/Treatment.java
@@ -17,7 +17,10 @@ public interface Treatment {
 	 * Applies the treatment
 	 */
     void apply();
-	
-	
+
+	/**
+	 * Defautl method to describe the rule scheduler
+	 */
+	default String describe(){return this.getClass().getSimpleName();}
 
 }
diff --git a/integraal/integraal-forward-chaining/src/main/java/module-info.java b/integraal/integraal-forward-chaining/src/main/java/module-info.java
index 2395c00170fef5dc28fa033cec6ef6bea710a110..da7ffc9984c03c1351761ecd00408f06a0646230 100644
--- a/integraal/integraal-forward-chaining/src/main/java/module-info.java
+++ b/integraal/integraal-forward-chaining/src/main/java/module-info.java
@@ -5,11 +5,8 @@
  *
  */
 module fr.boreal.forward_chaining {
-	
-	requires transitive fr.boreal.model;
-	
+
 	requires fr.boreal.query_evaluation;
-	requires fr.lirmm.boreal.util;
 	requires fr.boreal.storage;
 	requires fr.boreal.grd;
 	requires fr.boreal.core;
@@ -17,9 +14,13 @@ module fr.boreal.forward_chaining {
 
 	requires  org.slf4j;
     requires org.jgrapht.core;
+    requires com.fasterxml.jackson.databind;
+	requires fr.boreal.configuration;
+	requires rdf4j.queryalgebra.model;
 
-    exports fr.boreal.forward_chaining.api;
+	exports fr.boreal.forward_chaining.api;
 	exports fr.boreal.forward_chaining.chase;
+	exports fr.boreal.forward_chaining.chase.description;
 	exports fr.boreal.forward_chaining.chase.halting_condition;
 	exports fr.boreal.forward_chaining.chase.rule_applier;
 	exports fr.boreal.forward_chaining.chase.rule_applier.body_to_query_transformer;
diff --git a/integraal/integraal-model/src/main/java/fr/boreal/model/logicalElements/factory/api/PredicateFactory.java b/integraal/integraal-model/src/main/java/fr/boreal/model/logicalElements/factory/api/PredicateFactory.java
index a198f62465619b8d490c1872363c02429d50ca5a..28714a863b0c764ff0a7161981da65f993185234 100644
--- a/integraal/integraal-model/src/main/java/fr/boreal/model/logicalElements/factory/api/PredicateFactory.java
+++ b/integraal/integraal-model/src/main/java/fr/boreal/model/logicalElements/factory/api/PredicateFactory.java
@@ -1,5 +1,7 @@
 package fr.boreal.model.logicalElements.factory.api;
 
+import java.util.Optional;
+
 import fr.boreal.model.logicalElements.api.Predicate;
 
 /**
@@ -38,4 +40,13 @@ public interface PredicateFactory {
 	 */
 	boolean forgetPredicate(String label);
 
+	/**
+	 * Gets a previously created predicate.
+	 * <br/>
+	 * This predicate will no longer be considered as already existing in the factory.
+	 * 
+	 * @param label the label of the previously created predicate
+	 * @return an optional that contains the predicate if there is one 
+	 */
+	Optional<Predicate> getPredicate(String label);
 }
diff --git a/integraal/integraal-model/src/main/java/fr/boreal/model/logicalElements/factory/impl/SameObjectPredicateFactory.java b/integraal/integraal-model/src/main/java/fr/boreal/model/logicalElements/factory/impl/SameObjectPredicateFactory.java
index 4f1533773b81cd668018f49d0c06dcda54500fcf..56108db78f0b3053884cd7a86b456f2224445d6b 100644
--- a/integraal/integraal-model/src/main/java/fr/boreal/model/logicalElements/factory/impl/SameObjectPredicateFactory.java
+++ b/integraal/integraal-model/src/main/java/fr/boreal/model/logicalElements/factory/impl/SameObjectPredicateFactory.java
@@ -2,6 +2,7 @@ package fr.boreal.model.logicalElements.factory.impl;
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Optional;
 
 import fr.boreal.model.logicalElements.api.Predicate;
 import fr.boreal.model.logicalElements.factory.api.PredicateFactory;
@@ -69,4 +70,9 @@ public class SameObjectPredicateFactory implements PredicateFactory {
 		else return false; 
 	}
 
+	@Override
+	public Optional<Predicate> getPredicate(String label) {
+		return Optional.ofNullable(this.predicates.get(label));
+	}
+
 }
diff --git a/integraal/integraal-query-evaluation/src/main/java/module-info.java b/integraal/integraal-query-evaluation/src/main/java/module-info.java
index 2acc5edcf2dcfcc9c4ae678f6da1270d0fe8b305..4044d0c26d09e9d689b7c2514db6168c207ed8ea 100644
--- a/integraal/integraal-query-evaluation/src/main/java/module-info.java
+++ b/integraal/integraal-query-evaluation/src/main/java/module-info.java
@@ -25,6 +25,6 @@ module fr.boreal.query_evaluation {
 	exports fr.boreal.query_evaluation.conjunction.backtrack;
 	exports fr.boreal.query_evaluation.generic;
 	exports fr.boreal.query_evaluation.negation;
-	exports fr.boreal.query_evaluation.component;
+    exports fr.boreal.query_evaluation.union;
 	
 }
\ No newline at end of file
diff --git a/integraal/integraal-util/pom.xml b/integraal/integraal-util/pom.xml
index aec9df5c5b99158e75a0f365d00147049b475865..8ab21c37d099838290f7887dd16b947e3820e5b2 100644
--- a/integraal/integraal-util/pom.xml
+++ b/integraal/integraal-util/pom.xml
@@ -23,14 +23,6 @@
 			<groupId>${groupId}</groupId>
 			<artifactId>integraal-graal-ruleset-analysis</artifactId>
 		</dependency>
-		<dependency>
-			<groupId>fr.lirmm.graphik</groupId>
-			<artifactId>graal-api</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>fr.lirmm.graphik</groupId>
-			<artifactId>graal-core</artifactId>
-		</dependency>
 		<dependency>
 			<groupId>com.google.guava</groupId>
 			<artifactId>guava</artifactId>
diff --git a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/evaluator/CallableWithTimeout.java b/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/timeout/CallableWithTimeout.java
similarity index 97%
rename from integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/evaluator/CallableWithTimeout.java
rename to integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/timeout/CallableWithTimeout.java
index b2f071b799563e6fb99682cbd70994b1ae002785..1b65516d0beee20f64fda6aa972124e8136cdfe8 100644
--- a/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/evaluator/CallableWithTimeout.java
+++ b/integraal/integraal-util/src/main/java/fr/lirmm/boreal/util/timeout/CallableWithTimeout.java
@@ -1,4 +1,4 @@
-package fr.lirmm.boreal.util.evaluator;
+package fr.lirmm.boreal.util.timeout;
 
 import java.time.Duration;
 import java.util.Objects;
diff --git a/integraal/integraal-util/src/main/java/module-info.java b/integraal/integraal-util/src/main/java/module-info.java
index 669038cf688cd2632d8f1f01bf85095e87b645c9..1018e2dd4abdc004c6c453ce873a350f1735d90f 100644
--- a/integraal/integraal-util/src/main/java/module-info.java
+++ b/integraal/integraal-util/src/main/java/module-info.java
@@ -13,7 +13,6 @@ module fr.lirmm.boreal.util {
 	requires org.slf4j;
 
 	exports fr.lirmm.boreal.util;
-	exports fr.lirmm.boreal.util.keywords;
 	exports fr.lirmm.boreal.util.time;
 	exports fr.lirmm.boreal.util.converter;
 	exports fr.lirmm.boreal.util.stream;
@@ -22,9 +21,8 @@ module fr.lirmm.boreal.util {
 	exports fr.lirmm.boreal.util.validator.data;
 	exports fr.lirmm.boreal.util.validator.query;
 	exports fr.lirmm.boreal.util.validator.rule;
-	exports fr.lirmm.boreal.util.evaluator;
 	exports fr.lirmm.boreal.util.object_analyzer;
 	exports fr.lirmm.boreal.util.enumerations;
-	exports fr.lirmm.boreal.util.externalHaltingConditions;
+	exports fr.lirmm.boreal.util.timeout;
 	
 }
\ No newline at end of file
diff --git a/integraal/integraal-util/src/test/java/evaluators/CallableWithTimeoutTest.java b/integraal/integraal-util/src/test/java/timeout/CallableWithTimeoutTest.java
similarity index 95%
rename from integraal/integraal-util/src/test/java/evaluators/CallableWithTimeoutTest.java
rename to integraal/integraal-util/src/test/java/timeout/CallableWithTimeoutTest.java
index 3305321e40e3455a3ed7d1538cf08a04cedddc91..e245942156efbe455566e6c4c3ba7a3218aa2d46 100644
--- a/integraal/integraal-util/src/test/java/evaluators/CallableWithTimeoutTest.java
+++ b/integraal/integraal-util/src/test/java/timeout/CallableWithTimeoutTest.java
@@ -1,4 +1,4 @@
-package evaluators;
+package timeout;
 import static org.junit.Assert.assertNull;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -7,9 +7,9 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 import java.time.Duration;
 import java.util.concurrent.Callable;
 
+import fr.lirmm.boreal.util.timeout.CallableWithTimeout;
 import org.junit.Test;
 
-import fr.lirmm.boreal.util.evaluator.CallableWithTimeout;
 
 public class CallableWithTimeoutTest {
 
diff --git a/integraal/integraal-views/src/main/java/fr/boreal/views/builder/ViewBuilder.java b/integraal/integraal-views/src/main/java/fr/boreal/views/builder/ViewBuilder.java
index 1c7f2a54887fd9acee991c069c8eb8017003c931..20a7e8b6d9e9afbf1b3251ae6c4e9e3784673afc 100644
--- a/integraal/integraal-views/src/main/java/fr/boreal/views/builder/ViewBuilder.java
+++ b/integraal/integraal-views/src/main/java/fr/boreal/views/builder/ViewBuilder.java
@@ -86,6 +86,7 @@ public class ViewBuilder {
 					}
 				};
 
+				wrapper.setName(d.getId());
 				for (ViewDefinition m : document.getMappingsByDatasource(d)) {
 					String query = m.getNativeQuery();
 					Optional<String> position = m.getPositioning();
@@ -141,6 +142,8 @@ public class ViewBuilder {
 	 */
 	public static class ViewBuilderException extends Exception {
 
+		private static final long serialVersionUID = 1L;
+
 		/**
 		 * @param message the message of the exception
 		 */
diff --git a/integraal/integraal-views/src/main/java/fr/boreal/views/datasource/AbstractViewWrapper.java b/integraal/integraal-views/src/main/java/fr/boreal/views/datasource/AbstractViewWrapper.java
index 91538d5eb40c820366e59e7e62ad087245a7ce15..a3c7ad7c6d1f1bab1d90699ea3ddede8a4b6bd55 100644
--- a/integraal/integraal-views/src/main/java/fr/boreal/views/datasource/AbstractViewWrapper.java
+++ b/integraal/integraal-views/src/main/java/fr/boreal/views/datasource/AbstractViewWrapper.java
@@ -24,6 +24,7 @@ import fr.lirmm.boreal.util.stream.filter.MatchFilter;
  */
 public abstract class AbstractViewWrapper<NativeQueryType, NativeResultType> implements Readable {
 
+	private String name; 
 	private final Specializer<NativeQueryType> specializer;
 	private final NativeQueryEvaluator<NativeQueryType, NativeResultType> evaluator;
 	private final Transformer<NativeResultType> transformer;
@@ -37,6 +38,18 @@ public abstract class AbstractViewWrapper<NativeQueryType, NativeResultType> imp
 	 * @param transformer to transform the native result into atoms
 	 */
 	public AbstractViewWrapper(Specializer<NativeQueryType> specializer, NativeQueryEvaluator<NativeQueryType, NativeResultType> evaluator, Transformer<NativeResultType> transformer) {
+		this(null, specializer,evaluator,transformer);
+	}
+	
+	/**
+	 * Create a new wrapper over a data-source with a relational view
+	 * @param name to identify the datasource
+	 * @param specializer to specialize the native query
+	 * @param evaluator to evaluate the native query
+	 * @param transformer to transform the native result into atoms
+	 */
+	public AbstractViewWrapper(String name, Specializer<NativeQueryType> specializer, NativeQueryEvaluator<NativeQueryType, NativeResultType> evaluator, Transformer<NativeResultType> transformer) {
+		this.name = name;
 		this.specializer = specializer;
 		this.evaluator = evaluator;
 		this.transformer = transformer;
@@ -85,9 +98,28 @@ public abstract class AbstractViewWrapper<NativeQueryType, NativeResultType> imp
 		return this.transformer;
 	}
 
+	/**
+	 * @return the predicates corresponding to the relational views of the datasource
+	 */
 	public Collection<Predicate> getPredicates() {
 		return this.viewByPredicate.keySet();
 	}
+	
+	/**
+	 * @return an optional that contains the datasource name if there is one
+	 */
+	public Optional<String> getName() {
+		return Optional.ofNullable(this.name);
+	}
+	
+	/**
+	 * @param name the new datasource name
+	 */
+	public void setName(String name) {
+		this.name=name;
+	}
+	
+
 
 	/////////////////////////////////////////////////
 	// FactStorage methods