diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index 112be4284359582cc9505d8af7adb74fc241ce76..92661275c51542eb15ed4e155b228cc91d4d32ed 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -6,26 +6,29 @@
         <sourceOutputDir name="target/generated-sources/annotations" />
         <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
         <outputRelativeToContentRoot value="true" />
-        <module name="unl-tools-infrastructure" />
+        <module name="unl-tools-application" />
         <module name="unl-tools-core" />
+        <module name="unl-tools-infrastructure" />
       </profile>
-      <profile name="Annotation profile for unl-tools-main" enabled="true">
+      <profile name="Annotation profile for unl-tools" enabled="true">
         <sourceOutputDir name="target/generated-sources/annotations" />
         <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
         <outputRelativeToContentRoot value="true" />
-        <option name="project" value="fr.tetras_libre.unl/unl-tools-app" />
+        <option name="project" value="fr.tetras_libre.unl/unl-tools-main" />
         <processorPath useClasspath="false">
           <entry name="$MAVEN_REPOSITORY$/info/picocli/picocli-codegen/4.2.0/picocli-codegen-4.2.0.jar" />
           <entry name="$MAVEN_REPOSITORY$/info/picocli/picocli/4.2.0/picocli-4.2.0.jar" />
         </processorPath>
-        <module name="unl-tools-app" />
+        <module name="unl-tools-main" />
       </profile>
     </annotationProcessing>
     <bytecodeTargetLevel target="11">
       <module name="unl-parser" target="11" />
       <module name="unl-tools-app" target="11" />
+      <module name="unl-tools-application" target="11" />
       <module name="unl-tools-core" target="11" />
       <module name="unl-tools-infrastructure" target="11" />
+      <module name="unl-tools-main" target="11" />
       <module name="unl2rdf" target="11" />
       <module name="unl2rdf-app" target="11" />
       <module name="unlTools" target="11" />
@@ -35,6 +38,7 @@
     <option name="ADDITIONAL_OPTIONS_OVERRIDE">
       <module name="unl-parser" options="" />
       <module name="unl-tools-app" options="-Aproject=fr.tetras_libre.unl/unl-tools-app" />
+      <module name="unl-tools-main" options="-Aproject=fr.tetras_libre.unl/unl-tools-main" />
       <module name="unl2rdf" options="-Aproject=unl2rdf/unl2rdf" />
       <module name="unl2rdf-app" options="-Aproject=fr.tetras_libre.unl/unl2rdf-app" />
     </option>
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
index 63015661248eb3b451adc962d2e580f43ff4f262..06ab4d0d5212b06f6f6710c4caaca3d4beb484b0 100644
--- a/.idea/encodings.xml
+++ b/.idea/encodings.xml
@@ -1,10 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="Encoding">
-    <file url="file://$PROJECT_DIR$/unl-tools-app/src/main/java" charset="UTF-8" />
-    <file url="file://$PROJECT_DIR$/unl-tools-app/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/unl-tools-application/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/unl-tools-application/src/main/resources" charset="UTF-8" />
     <file url="file://$PROJECT_DIR$/unl-tools-core/src/main/java" charset="UTF-8" />
     <file url="file://$PROJECT_DIR$/unl-tools-infrastructure/src/main/java" charset="UTF-8" />
     <file url="file://$PROJECT_DIR$/unl-tools-infrastructure/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/unl-tools-main/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/unl-tools-main/src/main/resources" charset="UTF-8" />
   </component>
 </project>
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index ba348da52a2036664ece6f26fd26a12926a42c27..dbdc2e08bd7bf88ae3851fbcccbd8ff0293f142d 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -5,6 +5,7 @@
       <list>
         <option value="$PROJECT_DIR$/pom.xml" />
         <option value="$PROJECT_DIR$/../rdf/pom.xml" />
+        <option value="$PROJECT_DIR$/unl-tools-main/pom.xml" />
       </list>
     </option>
   </component>
diff --git a/.idea/modules.xml b/.idea/modules.xml
index 7e06cd3831aed4b348841c6396e6e389af854885..4e2ba7aaa0d9ef3bee6e1be5b8b77c3500bb2e8a 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -2,9 +2,10 @@
 <project version="4">
   <component name="ProjectModuleManager">
     <modules>
-      <module fileurl="file://$PROJECT_DIR$/unl-tools-app/unl-tools-app.iml" filepath="$PROJECT_DIR$/unl-tools-app/unl-tools-app.iml" />
+      <module fileurl="file://$PROJECT_DIR$/unl-tools-application/unl-tools-application.iml" filepath="$PROJECT_DIR$/unl-tools-application/unl-tools-application.iml" />
       <module fileurl="file://$PROJECT_DIR$/unl-tools-core/unl-tools-core.iml" filepath="$PROJECT_DIR$/unl-tools-core/unl-tools-core.iml" />
       <module fileurl="file://$PROJECT_DIR$/unl-tools-infrastructure/unl-tools-infrastructure.iml" filepath="$PROJECT_DIR$/unl-tools-infrastructure/unl-tools-infrastructure.iml" />
+      <module fileurl="file://$PROJECT_DIR$/unl-tools-main/unl-tools-main.iml" filepath="$PROJECT_DIR$/unl-tools-main/unl-tools-main.iml" />
       <module fileurl="file://$PROJECT_DIR$/unlTools.iml" filepath="$PROJECT_DIR$/unlTools.iml" />
     </modules>
   </component>
diff --git a/pom.xml b/pom.xml
index cd3992aa66c9b50064b1ac1ed070d7b6ab3c047d..a344dcf2c47ca7fc7024f6fb6b9f6a5007ed3e07 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
@@ -13,12 +13,13 @@
 
     <packaging>pom</packaging>
 
-    <name>unl-tools-main</name>
+    <name>unl-tools</name>
 
     <modules>
         <module>unl-tools-core</module>
-        <module>unl-tools-app</module>
+        <module>unl-tools-main</module>
         <module>unl-tools-infrastructure</module>
+        <module>unl-tools-application</module>
     </modules>
 
     <build>
diff --git a/unl-tools-application/pom.xml b/unl-tools-application/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f6d18dd2e9d9758160fba569f0790a6a90546bdd
--- /dev/null
+++ b/unl-tools-application/pom.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>unlTools</artifactId>
+        <groupId>fr.tetras_libre.unl</groupId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>unl-tools-application</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>fr.tetras_libre.unl</groupId>
+            <artifactId>unl-tools-core</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+
+
+</project>
\ No newline at end of file
diff --git a/unl-tools-application/src/main/java/fr/tetras_libre/unltools/CommandHandlerResolverBuilder.java b/unl-tools-application/src/main/java/fr/tetras_libre/unltools/CommandHandlerResolverBuilder.java
new file mode 100644
index 0000000000000000000000000000000000000000..692e47e33fe6323365cd0d2b2c146ca4cbe585bb
--- /dev/null
+++ b/unl-tools-application/src/main/java/fr/tetras_libre/unltools/CommandHandlerResolverBuilder.java
@@ -0,0 +1,25 @@
+package fr.tetras_libre.unltools;
+
+import fr.tetras_libre.unltools.cqrs.Command;
+import fr.tetras_libre.unltools.cqrs.CommandHandler;
+import fr.tetras_libre.unltools.cqrs.CommandHandlerResolver;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+public class CommandHandlerResolverBuilder {
+    private final Dictionary<Class<? extends Command>, Class<? extends CommandHandler>> map;
+
+    public CommandHandlerResolverBuilder() {
+        this.map = new Hashtable<>();
+    }
+
+    public <TResult, THandler extends CommandHandler<TCommand, TResult>, TCommand extends Command<TResult>> CommandHandlerResolverBuilder addHandler(Class<THandler> handler, Class<TCommand> command) {
+        this.map.put(command, handler);
+        return this;
+    }
+
+    public CommandHandlerResolver createCommandResolver() {
+        return new CommandHandlerResolver(this.map);
+    }
+}
diff --git a/unl-tools-application/src/main/java/fr/tetras_libre/unltools/Convert/ExportUnlDocuments.java b/unl-tools-application/src/main/java/fr/tetras_libre/unltools/Convert/ExportUnlDocuments.java
new file mode 100644
index 0000000000000000000000000000000000000000..efec7a17bbf3df4ea5cc9d74f09619d43d979314
--- /dev/null
+++ b/unl-tools-application/src/main/java/fr/tetras_libre/unltools/Convert/ExportUnlDocuments.java
@@ -0,0 +1,31 @@
+package fr.tetras_libre.unltools.Convert;
+
+import fr.tetras_libre.unltools.cqrs.Command;
+import fr.tetras_libre.unltools.cqrs.Result;
+import fr.tetras_libre.unltools.unl.GraphImporter;
+
+import java.io.Writer;
+
+public class ExportUnlDocuments implements Command<Result> {
+    private final GraphImporter graphImporter;
+    private final String exporterName;
+    private final Writer writer;
+
+    public ExportUnlDocuments(GraphImporter graphImporter, String exporterName, Writer writer) {
+        this.graphImporter = graphImporter;
+        this.exporterName = exporterName;
+        this.writer = writer;
+    }
+
+    public GraphImporter getGraphImporter() {
+        return this.graphImporter;
+    }
+
+    public String getExporterName() {
+        return this.exporterName;
+    }
+
+    public Writer getWriter() {
+        return this.writer;
+    }
+}
diff --git a/unl-tools-application/src/main/java/fr/tetras_libre/unltools/Convert/ExportUnlDocumentsHandler.java b/unl-tools-application/src/main/java/fr/tetras_libre/unltools/Convert/ExportUnlDocumentsHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..62ed3433b85252679ebb70ff5cd605ee980ff57e
--- /dev/null
+++ b/unl-tools-application/src/main/java/fr/tetras_libre/unltools/Convert/ExportUnlDocumentsHandler.java
@@ -0,0 +1,27 @@
+package fr.tetras_libre.unltools.Convert;
+
+import fr.tetras_libre.unltools.cqrs.CommandHandler;
+import fr.tetras_libre.unltools.cqrs.Result;
+import fr.tetras_libre.unltools.unl.GraphExporterFactory;
+
+import java.io.IOException;
+
+public class ExportUnlDocumentsHandler implements CommandHandler<ExportUnlDocuments, Result> {
+    private final GraphExporterFactory factory;
+
+    public ExportUnlDocumentsHandler(GraphExporterFactory factory) {
+        this.factory = factory;
+    }
+
+    @Override
+    public Result handle(ExportUnlDocuments command) {
+        try {
+            var graphExporter = factory.createGraphExporter(command.getWriter(), command.getExporterName());
+            graphExporter.write(command.getGraphImporter().Import());
+        } catch (IOException e) {
+            return Result.Failure(String.format("Cannot export unl documents to format '%s'", command.getExporterName()),
+                    e);
+        }
+        return Result.Success();
+    }
+}
diff --git a/unl-tools-application/src/main/java/fr/tetras_libre/unltools/DefaultCommandHandlerResolverFactory.java b/unl-tools-application/src/main/java/fr/tetras_libre/unltools/DefaultCommandHandlerResolverFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..5c0f95e525cdbe37e435b2746976117d4e7dc4e7
--- /dev/null
+++ b/unl-tools-application/src/main/java/fr/tetras_libre/unltools/DefaultCommandHandlerResolverFactory.java
@@ -0,0 +1,14 @@
+package fr.tetras_libre.unltools;
+
+import fr.tetras_libre.unltools.Convert.ExportUnlDocuments;
+import fr.tetras_libre.unltools.Convert.ExportUnlDocumentsHandler;
+import fr.tetras_libre.unltools.cqrs.CommandHandlerResolver;
+
+public class DefaultCommandHandlerResolverFactory {
+    public static CommandHandlerResolver create() {
+        var builder = new CommandHandlerResolverBuilder()
+                .addHandler(ExportUnlDocumentsHandler.class, ExportUnlDocuments.class);
+
+        return builder.createCommandResolver();
+    }
+}
diff --git a/unl-tools-application/unl-tools-application.iml b/unl-tools-application/unl-tools-application.iml
new file mode 100644
index 0000000000000000000000000000000000000000..200cdeaa5287029d1a596c76d68f6181bcf03153
--- /dev/null
+++ b/unl-tools-application/unl-tools-application.iml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_11">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="unl-tools-core" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter:5.7.0-M1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-api:5.7.0-M1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.apiguardian:apiguardian-api:1.1.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.opentest4j:opentest4j:1.2.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-commons:1.7.0-M1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-params:5.7.0-M1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-engine:5.7.0-M1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-engine:1.7.0-M1" level="project" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/unl-tools-core/pom.xml b/unl-tools-core/pom.xml
index cbdcd7d89703384cc11fb49ce8392987f2055587..5a2eb25b12d8cbb2becd02266ab2c3d3dfeb5cda 100644
--- a/unl-tools-core/pom.xml
+++ b/unl-tools-core/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/Command.java b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/Command.java
new file mode 100644
index 0000000000000000000000000000000000000000..edf837f17845e31d44690493df30c278eb3c2dd0
--- /dev/null
+++ b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/Command.java
@@ -0,0 +1,4 @@
+package fr.tetras_libre.unltools.cqrs;
+
+public interface Command<TResult> {
+}
diff --git a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/CommandHandler.java b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/CommandHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..2efdaef8637a96cf47e975132b4f472e8b11b137
--- /dev/null
+++ b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/CommandHandler.java
@@ -0,0 +1,5 @@
+package fr.tetras_libre.unltools.cqrs;
+
+public interface CommandHandler<Cmd extends Command<TResult>, TResult> {
+    TResult handle(Cmd command);
+}
diff --git a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/CommandHandlerResolver.java b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/CommandHandlerResolver.java
new file mode 100644
index 0000000000000000000000000000000000000000..671d5791c237b6fd26fb54c3567da583ce38e7af
--- /dev/null
+++ b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/CommandHandlerResolver.java
@@ -0,0 +1,20 @@
+package fr.tetras_libre.unltools.cqrs;
+
+import java.util.Dictionary;
+import java.util.Enumeration;
+
+public class CommandHandlerResolver {
+    private Dictionary<Class<? extends Command>, Class<? extends CommandHandler>> associations;
+
+    public CommandHandlerResolver(Dictionary<Class<? extends Command>, Class<? extends CommandHandler>> associations) {
+        this.associations = associations;
+    }
+
+    public Class<? extends CommandHandler> getHandler(Class<?> cmd) {
+        return associations.get(cmd);
+    }
+
+    public Enumeration<Class<? extends CommandHandler>> getHandlers() {
+        return associations.elements();
+    }
+}
diff --git a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/Mediator.java b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/Mediator.java
new file mode 100644
index 0000000000000000000000000000000000000000..091200f072fca051e7cc9e74de208b1e71f6eb14
--- /dev/null
+++ b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/Mediator.java
@@ -0,0 +1,16 @@
+package fr.tetras_libre.unltools.cqrs;
+
+public class Mediator {
+
+    private final ServiceProvider serviceProvider;
+
+    public Mediator(ServiceProvider serviceProvider) {
+        this.serviceProvider = serviceProvider;
+    }
+
+    public <TCmd extends Command<TResult>, TResult> TResult Dispatch(TCmd cmd) {
+        var handlerResolver = (CommandHandlerResolver) serviceProvider.getService(CommandHandlerResolver.class);
+        var handler = (CommandHandler<Command<TResult>, TResult>) serviceProvider.getService(handlerResolver.getHandler(cmd.getClass()));
+        return handler.handle(cmd);
+    }
+}
diff --git a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/Result.java b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/Result.java
new file mode 100644
index 0000000000000000000000000000000000000000..c9bd9c71435e095bb4cd9ac40fd4c60d29e5a683
--- /dev/null
+++ b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/Result.java
@@ -0,0 +1,42 @@
+package fr.tetras_libre.unltools.cqrs;
+
+public class Result {
+    private static Result success = new Result(true);
+
+    private boolean isSuccess;
+    private String message;
+    private Exception e;
+
+    private Result(boolean isSuccess) {
+        this(isSuccess, null, null);
+    }
+
+    private Result(boolean isSuccess, String message, Exception e) {
+        if (isSuccess) {
+            this.isSuccess = true;
+        }
+
+        if (!isSuccess && null != message) {
+            this.message = message;
+        }
+
+        if (!isSuccess && null != e) {
+            this.e = e;
+            if (null == this.message || this.message.isBlank()) {
+                this.message = e.getMessage();
+            }
+        }
+    }
+
+    public static Result Success() {
+        return success;
+    }
+
+    public static Result Failure(String message) {
+        return new Result(false, message, null);
+    }
+
+    public static Result Failure(String message, Exception exception) {
+        return new Result(false, message, exception);
+    }
+}
diff --git a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/ServiceProvider.java b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/ServiceProvider.java
new file mode 100644
index 0000000000000000000000000000000000000000..3d6ca418c94b8f901c470f2508f4da28ed78d62a
--- /dev/null
+++ b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/ServiceProvider.java
@@ -0,0 +1,7 @@
+package fr.tetras_libre.unltools.cqrs;
+
+public interface ServiceProvider {
+    Object getService(Class<?> service);
+
+    <TCmd extends Command<TResult>, TResult> CommandHandler<Command<TResult>, TResult> getHandler(Class<? extends TCmd> command);
+}
diff --git a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/Graph.java b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/Graph.java
index 6d710a787ace2d6bf8eb9736abd75c77703bf0d9..33197d0d85d44bd13ac62076a486991bb149b41d 100644
--- a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/Graph.java
+++ b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/Graph.java
@@ -142,18 +142,18 @@ public class Graph {
 
     @Override
     public boolean equals(Object obj) {
-        if(null == obj) {
+        if (null == obj) {
             return false;
         }
 
-        if(!(obj instanceof Graph)) {
+        if (!(obj instanceof Graph)) {
             return false;
         }
 
         return equals((Graph) obj);
     }
 
-    private boolean equals(Graph other){
+    private boolean equals(Graph other) {
         return this.nodes.equals(other.nodes)
                 && this.relations.equals(other.relations);
     }
diff --git a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/GraphImporter.java b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/GraphImporter.java
new file mode 100644
index 0000000000000000000000000000000000000000..001f25097062857ae3bc10759e9758508d0da435
--- /dev/null
+++ b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/GraphImporter.java
@@ -0,0 +1,7 @@
+package fr.tetras_libre.unltools.unl;
+
+import java.util.List;
+
+public interface GraphImporter {
+    List<UnlDocument> Import();
+}
diff --git a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/GraphRelation.java b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/GraphRelation.java
index 7b56dc5279f05b3f20337ccf7b9fe91cebaa73d9..2af346870121f0c00f033c4375e4097004d56d61 100644
--- a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/GraphRelation.java
+++ b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/GraphRelation.java
@@ -52,11 +52,11 @@ public class GraphRelation {
 
     @Override
     public boolean equals(Object obj) {
-        if(null == obj) {
+        if (null == obj) {
             return false;
         }
 
-        if(!(obj instanceof GraphRelation)) {
+        if (!(obj instanceof GraphRelation)) {
             return false;
         }
 
diff --git a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/UnlDocument.java b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/UnlDocument.java
index eb5552965911d1fec14a3be07c5a2573f3de1241..ed9116ac88c1a896db8abd5b9b748ed1a9810a3c 100644
--- a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/UnlDocument.java
+++ b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/UnlDocument.java
@@ -73,17 +73,17 @@ public class UnlDocument {
 
     @Override
     public boolean equals(Object obj) {
-        if(obj == null) {
+        if (obj == null) {
             return false;
         }
 
-        if(!(obj instanceof UnlDocument)){
+        if (!(obj instanceof UnlDocument)) {
             return false;
         }
-        return equals((UnlDocument)obj);
+        return equals((UnlDocument) obj);
     }
 
-    private boolean equals(UnlDocument other){
+    private boolean equals(UnlDocument other) {
         return this.docElements.equals(other.docElements)
                 && (this.hasError() == other.hasError());
     }
diff --git a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/UnlDocumentNode.java b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/UnlDocumentNode.java
index 08e63d8380013bdc45a106e47bf14cb5b02664e3..6d4c9f25b56035900a7e7f2901bad553658609d5 100644
--- a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/UnlDocumentNode.java
+++ b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/UnlDocumentNode.java
@@ -75,11 +75,11 @@ public class UnlDocumentNode {
 
     @Override
     public boolean equals(Object obj) {
-        if(null == obj){
+        if (null == obj) {
             return false;
         }
 
-        if(!(obj instanceof UnlDocumentNode)){
+        if (!(obj instanceof UnlDocumentNode)) {
             return false;
         }
 
diff --git a/unl-tools-core/src/test/java/fr/tetras_libre/unltools/unl/EqualsBuilderTest.java b/unl-tools-core/src/test/java/fr/tetras_libre/unltools/unl/EqualsBuilderTest.java
index 9918265676dbd518249eac9869bf1cf15be69c03..8fd693d581637da9c50bf20d670f09086db35d42 100644
--- a/unl-tools-core/src/test/java/fr/tetras_libre/unltools/unl/EqualsBuilderTest.java
+++ b/unl-tools-core/src/test/java/fr/tetras_libre/unltools/unl/EqualsBuilderTest.java
@@ -4,21 +4,21 @@ import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 class EqualsBuilderTest {
-        @Test
-        void isEqual() {
-            String s1 = "qdfsf";
-            int i1 = 1;
-            long l1 = 2L;
-            EqualsBuilder builder = new EqualsBuilder()
-                    .append(s1)
-                    .append(i1)
-                    .append(l1);
+    @Test
+    void isEqual() {
+        String s1 = "qdfsf";
+        int i1 = 1;
+        long l1 = 2L;
+        EqualsBuilder builder = new EqualsBuilder()
+                .append(s1)
+                .append(i1)
+                .append(l1);
 
-            EqualsBuilder builder2 = new EqualsBuilder()
-                    .append(s1)
-                    .append(i1)
-                    .append(l1);
+        EqualsBuilder builder2 = new EqualsBuilder()
+                .append(s1)
+                .append(i1)
+                .append(l1);
 
-            Assertions.assertTrue(() -> builder.isEqual(builder2));
-        }
+        Assertions.assertTrue(() -> builder.isEqual(builder2));
+    }
 }
\ No newline at end of file
diff --git a/unl-tools-infrastructure/pom.xml b/unl-tools-infrastructure/pom.xml
index 537df2bcb9d23ca0659008738e030e12f130198c..4a0f7f55293dc4d064e21c81bd943fd35f9fe5f5 100644
--- a/unl-tools-infrastructure/pom.xml
+++ b/unl-tools-infrastructure/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
@@ -38,6 +38,16 @@
             <version>1.0-SNAPSHOT</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>org.picocontainer</groupId>
+            <artifactId>picocontainer</artifactId>
+            <version>2.15</version>
+        </dependency>
+        <dependency>
+            <groupId>fr.tetras_libre.unl</groupId>
+            <artifactId>unl-tools-application</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
     </dependencies>
 
 
diff --git a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/ApplicationStartup.java b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/ApplicationStartup.java
new file mode 100644
index 0000000000000000000000000000000000000000..d3654e77fcd8398acf428745154e7d9d733a3e52
--- /dev/null
+++ b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/ApplicationStartup.java
@@ -0,0 +1,29 @@
+package fr.tetras_libre.unltools;
+
+import fr.tetras_libre.unltools.cqrs.CommandHandlerResolver;
+import fr.tetras_libre.unltools.cqrs.Mediator;
+import fr.tetras_libre.unltools.cqrs.ServiceProvider;
+import fr.tetras_libre.unltools.cqrs.ServiceProviderImpl;
+import fr.tetras_libre.unltools.unl.GraphExporterFactory;
+import fr.tetras_libre.unltools.unl.exporters.DefaultGraphExporterFactory;
+import org.picocontainer.MutablePicoContainer;
+import org.picocontainer.containers.TransientPicoContainer;
+
+public class ApplicationStartup {
+
+    public static ServiceProvider Initialize(CommandHandlerResolver commandHandlerResolver) {
+        MutablePicoContainer picoContainer = new TransientPicoContainer();
+
+        picoContainer.addComponent(commandHandlerResolver);
+        for (var handlerToRegister = commandHandlerResolver.getHandlers(); handlerToRegister.hasMoreElements(); ) {
+            picoContainer.addComponent(handlerToRegister.nextElement());
+        }
+
+        picoContainer.addComponent(GraphExporterFactory.class, DefaultGraphExporterFactory.class);
+
+        var result = new ServiceProviderImpl(picoContainer);
+        picoContainer.addComponent(ServiceProvider.class, result);
+        picoContainer.addComponent(Mediator.class);
+        return result;
+    }
+}
diff --git a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/cqrs/ServiceProviderImpl.java b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/cqrs/ServiceProviderImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..918647b63b8b9a90f657d99580849e4c68575962
--- /dev/null
+++ b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/cqrs/ServiceProviderImpl.java
@@ -0,0 +1,26 @@
+package fr.tetras_libre.unltools.cqrs;
+
+import org.picocontainer.PicoContainer;
+
+public class ServiceProviderImpl implements ServiceProvider {
+    PicoContainer container;
+
+    public ServiceProviderImpl(PicoContainer container) {
+        this.container = container;
+    }
+
+    @Override
+    public Object getService(Class<?> service) {
+        return this.container.getComponent(service);
+    }
+
+    public <T> T getInternalService(Class<T> s) {
+        return (T) getService(s);
+    }
+
+    @Override
+    public <TCmd extends Command<TResult>, TResult> CommandHandler<Command<TResult>, TResult> getHandler(Class<? extends TCmd> command) {
+        var commandResolver = getInternalService(CommandHandlerResolver.class);
+        return getInternalService(commandResolver.getHandler(command));
+    }
+}
diff --git a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/GraphExtensions.java b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/GraphExtensions.java
index 73bf85de6124c9c7eacdbf95b41a9c2834988a45..a7f838ec73c7d74318a364783212ec2677359fd3 100644
--- a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/GraphExtensions.java
+++ b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/GraphExtensions.java
@@ -1,8 +1,5 @@
 package fr.tetras_libre.unltools.unl;
 
-import fr.tetras_libre.unltools.unl.Graph;
-import fr.tetras_libre.unltools.unl.GraphRelation;
-
 import java.util.Collection;
 import java.util.LinkedList;
 import java.util.stream.Stream;
diff --git a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/SubGraphReferenceNodeExtensions.java b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/SubGraphReferenceNodeExtensions.java
index 19144d2e570cec690bec0560e6020b25743ac4b6..34ae9f7e9dc7a847f4f00196037166e7b7a9ccd8 100644
--- a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/SubGraphReferenceNodeExtensions.java
+++ b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/SubGraphReferenceNodeExtensions.java
@@ -1,9 +1,5 @@
 package fr.tetras_libre.unltools.unl;
 
-import fr.tetras_libre.unltools.unl.Graph;
-import fr.tetras_libre.unltools.unl.NoEntryNodeException;
-import fr.tetras_libre.unltools.unl.SubGraphReferenceNode;
-
 public class SubGraphReferenceNodeExtensions {
     public static String getScopeNameFromSubGraphReferenceNode(SubGraphReferenceNode g) {
         return g.getReferenceNumber().substring(1);
diff --git a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/exporters/rdf/RelationLabelToUnlPropertyConverter.java b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/exporters/rdf/RelationLabelToUnlPropertyConverter.java
index 87152027a7d342539b5278ea45db98c4ee6d4c3f..2ab59e8c738215b4ac0260ed2ef491f631b37174 100644
--- a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/exporters/rdf/RelationLabelToUnlPropertyConverter.java
+++ b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/exporters/rdf/RelationLabelToUnlPropertyConverter.java
@@ -1,8 +1,8 @@
 package fr.tetras_libre.unltools.unl.exporters.rdf;
 
+import fr.tetras_libre.rdf.vocabulary.UNL;
 import org.apache.jena.ontology.ObjectProperty;
 import org.apache.jena.ontology.OntModel;
-import fr.tetras_libre.rdf.vocabulary.UNL;
 
 
 public class RelationLabelToUnlPropertyConverter {
diff --git a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/exporters/rdf/UnlDocumentToRdfConverter.java b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/exporters/rdf/UnlDocumentToRdfConverter.java
index 19667199cf77c4b3346bcc13d96f28d05689406a..5b778b41582dfb77d57672ee49b2df7349f485ff 100644
--- a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/exporters/rdf/UnlDocumentToRdfConverter.java
+++ b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/exporters/rdf/UnlDocumentToRdfConverter.java
@@ -2,8 +2,6 @@ package fr.tetras_libre.unltools.unl.exporters.rdf;
 
 import fr.tetras_libre.rdf.vocabulary.UNL;
 import fr.tetras_libre.unltools.unl.*;
-import fr.tetras_libre.unltools.unl.GraphExtensions;
-import fr.tetras_libre.unltools.unl.SubGraphReferenceNodeExtensions;
 import org.apache.jena.ontology.Individual;
 import org.apache.jena.ontology.OntModel;
 import org.apache.jena.ontology.Ontology;
diff --git a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/exporters/rdf/UtilGraphNodeUri.java b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/exporters/rdf/UtilGraphNodeUri.java
index f8d5e5c5d2952823d25c1dced45f9b5c51068e5b..5c20e5658328b1598552a858c13ab21650461a5b 100644
--- a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/exporters/rdf/UtilGraphNodeUri.java
+++ b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/exporters/rdf/UtilGraphNodeUri.java
@@ -2,8 +2,8 @@ package fr.tetras_libre.unltools.unl.exporters.rdf;
 
 import fr.tetras_libre.unltools.unl.GraphNode;
 import fr.tetras_libre.unltools.unl.SubGraphReferenceNode;
-import fr.tetras_libre.unltools.unl.UniversalWordNode;
 import fr.tetras_libre.unltools.unl.SubGraphReferenceNodeExtensions;
+import fr.tetras_libre.unltools.unl.UniversalWordNode;
 
 import static fr.tetras_libre.unltools.unl.exporters.rdf.Slugify.slugify;
 
diff --git a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/parser/UnlGraphImporterFromUnlParser.java b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/parser/UnlGraphImporterFromUnlParser.java
new file mode 100644
index 0000000000000000000000000000000000000000..f293807504a8bc545bdd7fa27ee2f18c7c2d8518
--- /dev/null
+++ b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/parser/UnlGraphImporterFromUnlParser.java
@@ -0,0 +1,33 @@
+package fr.tetras_libre.unltools.unl.parser;
+
+import fr.tetras_libre.unltools.unl.GraphImporter;
+import fr.tetras_libre.unltools.unl.UnlDocument;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.util.List;
+
+public class UnlGraphImporterFromUnlParser implements GraphImporter {
+    private List<UnlDocument> documents;
+    private BufferedReader bufferedReader;
+
+    public UnlGraphImporterFromUnlParser(BufferedReader bufferedReader) {
+        this.bufferedReader = bufferedReader;
+    }
+
+    public static UnlGraphImporterFromUnlParser FromInputReader(InputStreamReader inputStreamReader) {
+        return new UnlGraphImporterFromUnlParser(new BufferedReader(inputStreamReader));
+    }
+
+    @Override
+    public List<UnlDocument> Import() {
+        if (documents == null) {
+            try {
+                documents = new UnlParser(this.bufferedReader).createUnlDocumentList();
+            } catch (ParseException e) {
+                e.printStackTrace();
+            }
+        }
+        return documents;
+    }
+}
diff --git a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/ApplicationStartupTest.java b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/ApplicationStartupTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..e03137e20b486b6a049467884b6306f0f6602ee5
--- /dev/null
+++ b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/ApplicationStartupTest.java
@@ -0,0 +1,49 @@
+package fr.tetras_libre.unltools;
+
+import fr.tetras_libre.unltools.Convert.ExportUnlDocuments;
+import fr.tetras_libre.unltools.Convert.ExportUnlDocumentsHandler;
+import fr.tetras_libre.unltools.cqrs.CommandHandlerResolver;
+import fr.tetras_libre.unltools.cqrs.Result;
+import fr.tetras_libre.unltools.unl.CatsUnl;
+import fr.tetras_libre.unltools.unl.exporters.GraphExporterNames;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.concurrent.atomic.AtomicReference;
+
+public class ApplicationStartupTest {
+
+    @Test
+    public void ApplicationShouldCreateSimpleHandlerWithoutException() {
+        var appService = ApplicationStartup.Initialize(CreateDefaultCommandResolver());
+        var testCommand = new TestCommand();
+        var handler = appService.getHandler(TestCommand.class);
+
+
+        AtomicReference<Result> resultAtomicReference = new AtomicReference<>();
+        Assertions.assertDoesNotThrow(() -> resultAtomicReference.set(handler.handle(testCommand)));
+        Assertions.assertSame(resultAtomicReference.get(), Result.Success());
+    }
+
+    @Test
+    public void ApplicationShouldCreateHandlerWithContructorInjectionWithoutException() throws IOException {
+        var appService = ApplicationStartup.Initialize(CreateDefaultCommandResolver());
+        var stringWriter = new StringWriter();
+        var exportCommand = new ExportUnlDocuments(new CatsUnl(), GraphExporterNames.DOT_EXPORTER, stringWriter);
+        var handler = appService.getHandler(ExportUnlDocuments.class);
+        AtomicReference<Result> resultAtomicReference = new AtomicReference<>();
+
+        Assertions.assertDoesNotThrow(() -> resultAtomicReference.set(handler.handle(exportCommand)));
+        Assertions.assertFalse(stringWriter.toString().isBlank());
+        stringWriter.close();
+    }
+
+    CommandHandlerResolver CreateDefaultCommandResolver() {
+        return new CommandHandlerResolverBuilder()
+                .addHandler(TestCommandHandler.class, TestCommand.class)
+                .addHandler(ExportUnlDocumentsHandler.class, ExportUnlDocuments.class)
+                .createCommandResolver();
+    }
+}
\ No newline at end of file
diff --git a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/TestCommand.java b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/TestCommand.java
new file mode 100644
index 0000000000000000000000000000000000000000..fc18c3fced86679d5156b6df6db5fdcc5744bea4
--- /dev/null
+++ b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/TestCommand.java
@@ -0,0 +1,8 @@
+package fr.tetras_libre.unltools;
+
+import fr.tetras_libre.unltools.cqrs.Command;
+import fr.tetras_libre.unltools.cqrs.Result;
+
+public class TestCommand implements Command<Result> {
+
+}
diff --git a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/TestCommandHandler.java b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/TestCommandHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..6cfccd0b142ac0fc472080ca54d2f4a809d9f308
--- /dev/null
+++ b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/TestCommandHandler.java
@@ -0,0 +1,16 @@
+package fr.tetras_libre.unltools;
+
+import fr.tetras_libre.unltools.cqrs.CommandHandler;
+import fr.tetras_libre.unltools.cqrs.Result;
+
+public class TestCommandHandler implements CommandHandler<TestCommand, Result> {
+
+    public TestCommandHandler() {
+
+    }
+
+    @Override
+    public Result handle(TestCommand command) {
+        return Result.Success();
+    }
+}
diff --git a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/AbstractFlyweightUnlArgumentProvider.java b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/AbstractFlyweightUnlArgumentProvider.java
index f09f058b3c27203c99c9669a8e13ec43f58f65f5..b1569e89e9f8173d09dad09d3470792b249f9568 100644
--- a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/AbstractFlyweightUnlArgumentProvider.java
+++ b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/AbstractFlyweightUnlArgumentProvider.java
@@ -4,7 +4,7 @@ import java.util.Dictionary;
 import java.util.Hashtable;
 import java.util.List;
 
-public abstract class AbstractFlyweightUnlArgumentProvider extends AbstractUnlArgumentProvider {
+public abstract class AbstractFlyweightUnlArgumentProvider extends AbstractUnlArgumentProvider implements GraphImporter {
     private static final Dictionary<Class<?>, List<UnlDocument>> values = new Hashtable<>();
 
     protected abstract List<UnlDocument> buildUnlDocuments();
@@ -21,5 +21,7 @@ public abstract class AbstractFlyweightUnlArgumentProvider extends AbstractUnlAr
         return values.get(this.getClass());
     }
 
-
+    final public List<UnlDocument> Import() {
+        return getUnlDocuments();
+    }
 }
diff --git a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/AllUnl.java b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/AllUnl.java
index 106890ec237eb60ef0abd93fbd3caa633c761b4b..43274beb44c472e96ea37a9739ec652c46c62084 100644
--- a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/AllUnl.java
+++ b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/AllUnl.java
@@ -1,6 +1,5 @@
 package fr.tetras_libre.unltools.unl;
 
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
diff --git a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/CatsUnl.java b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/CatsUnl.java
index d6562094eb97d53be9f02df63ad450a72a3873ef..951f79d7bb43909b9b76eccb287ce12f671a3ac5 100644
--- a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/CatsUnl.java
+++ b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/CatsUnl.java
@@ -2,7 +2,7 @@ package fr.tetras_libre.unltools.unl;
 
 import java.util.*;
 
-public class CatsUnl extends AbstractFlyweightUnlArgumentProvider {
+public class CatsUnl extends AbstractFlyweightUnlArgumentProvider implements GraphImporter {
     public static UnlDocumentNode buildSentenceNode() {
         var graph = new Graph();
 
diff --git a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/R1Unl.java b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/R1Unl.java
index 323ed470cc681605c3db02e147ec9f9fd4530179..8d8af44297fde4546b232eafec06667d57d0d8da 100644
--- a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/R1Unl.java
+++ b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/R1Unl.java
@@ -1,21 +1,12 @@
 package fr.tetras_libre.unltools.unl;
 
-import java.util.*;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.TreeSet;
 
 public class R1Unl extends AbstractFlyweightUnlArgumentProvider {
 
-    @Override
-    final protected List<UnlDocument> buildUnlDocuments() {
-
-        var unlDocument = new UnlDocument("[D]");
-
-        UnlDocumentNode unlDocumentNode = buildSentenceNode();
-
-        unlDocument.add(unlDocumentNode);
-
-        return Collections.singletonList(unlDocument);
-    }
-
     public static UnlDocumentNode buildSentenceNode() {
         var graph = new Graph();
 
@@ -143,4 +134,16 @@ public class R1Unl extends AbstractFlyweightUnlArgumentProvider {
 
         return new UnlDocumentNode(UnlDocumentNodeType.Sentence, "[S:R1]", graph);
     }
+
+    @Override
+    final protected List<UnlDocument> buildUnlDocuments() {
+
+        var unlDocument = new UnlDocument("[D]");
+
+        UnlDocumentNode unlDocumentNode = buildSentenceNode();
+
+        unlDocument.add(unlDocumentNode);
+
+        return Collections.singletonList(unlDocument);
+    }
 }
diff --git a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/R2Unl.java b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/R2Unl.java
index 7b0ad0d6e42cfe27281f95fe89d649e7cae53083..78bf75398a11eb551c2efa6fe29efc70d934a963 100644
--- a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/R2Unl.java
+++ b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/R2Unl.java
@@ -4,18 +4,6 @@ import java.util.*;
 
 public class R2Unl extends AbstractFlyweightUnlArgumentProvider {
 
-    @Override
-    final protected List<UnlDocument> buildUnlDocuments() {
-
-        var unlDocument = new UnlDocument("[D]");
-
-        UnlDocumentNode unlDocumentNode = buildSentenceNode();
-
-        unlDocument.add(unlDocumentNode);
-
-        return Collections.singletonList(unlDocument);
-    }
-
     public static UnlDocumentNode buildSentenceNode() {
         var graph = new Graph();
 
@@ -142,4 +130,16 @@ public class R2Unl extends AbstractFlyweightUnlArgumentProvider {
 
         return new UnlDocumentNode(UnlDocumentNodeType.Sentence, "[S:R2]", graph);
     }
+
+    @Override
+    final protected List<UnlDocument> buildUnlDocuments() {
+
+        var unlDocument = new UnlDocument("[D]");
+
+        UnlDocumentNode unlDocumentNode = buildSentenceNode();
+
+        unlDocument.add(unlDocumentNode);
+
+        return Collections.singletonList(unlDocument);
+    }
 }
diff --git a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/exporters/dot/SentenceWithExpectedDotArgumentProvider.java b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/exporters/dot/SentenceWithExpectedDotArgumentProvider.java
index 62451693695ae5291dd96a25fc9874829e73101c..769aae6efab7482cfc9a4b0fd64fa17dc2e6c8d6 100644
--- a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/exporters/dot/SentenceWithExpectedDotArgumentProvider.java
+++ b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/exporters/dot/SentenceWithExpectedDotArgumentProvider.java
@@ -1,9 +1,5 @@
 package fr.tetras_libre.unltools.unl.exporters.dot;
 
-import fr.tetras_libre.unltools.unl.exporters.dot.AllSetenceWithExpectedDotChecker;
-import fr.tetras_libre.unltools.unl.exporters.dot.CatSentenceWithExpectedDotChecker;
-import fr.tetras_libre.unltools.unl.exporters.dot.R1SentenceWithExpectedDotChecker;
-import fr.tetras_libre.unltools.unl.exporters.dot.R2SentenceWithExpectedDotChecker;
 import org.junit.jupiter.api.extension.ExtensionContext;
 import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.ArgumentsProvider;
diff --git a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/exporters/rdf/RelationLabelToUnlPropertyConverterTest.java b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/exporters/rdf/RelationLabelToUnlPropertyConverterTest.java
index 4a7c80f97dea84ded2a3932f10dd180801cf1a6f..a6d4200b0ecd8623b6c54f0560c3358546a822e7 100644
--- a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/exporters/rdf/RelationLabelToUnlPropertyConverterTest.java
+++ b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/exporters/rdf/RelationLabelToUnlPropertyConverterTest.java
@@ -1,7 +1,6 @@
 package fr.tetras_libre.unltools.unl.exporters.rdf;
 
 import org.apache.jena.ontology.ObjectProperty;
-import org.apache.jena.ontology.OntModel;
 import org.apache.jena.rdf.model.ModelFactory;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
@@ -11,14 +10,14 @@ import java.util.concurrent.atomic.AtomicReference;
 class RelationLabelToUnlPropertyConverterTest {
 
     @Test
-    public void getObjectPropertyShouldGiveAssociatedUNLressource(){
+    public void getObjectPropertyShouldGiveAssociatedUNLressource() {
         var relationLabelToUnlProperty = new RelationLabelToUnlPropertyConverter();
 
         Assertions.assertDoesNotThrow(() -> relationLabelToUnlProperty.getObjectProperty("aoj", null));
     }
 
     @Test
-    public void getObjectPropertyShouldNotThrowOnUnknownResource(){
+    public void getObjectPropertyShouldNotThrowOnUnknownResource() {
         AtomicReference<ObjectProperty> objectPropertyAtomicReference = new AtomicReference<>();
         var relationLabelToUnlProperty = new RelationLabelToUnlPropertyConverter();
         var unknownProperty = "dfadsfijoplknkjadfljgliukjelkjkdm";
diff --git a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/parser/UnlParserTest.java b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/parser/UnlParserTest.java
index 28dd3e0cf93a31e05bbbdd17c5050e82f02bd47e..7bc9410c46b7cfd8b6c8a661f7b236345b116839 100644
--- a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/parser/UnlParserTest.java
+++ b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/parser/UnlParserTest.java
@@ -4,7 +4,6 @@ import fr.tetras_libre.unltools.unl.UnlDocument;
 import fr.tetras_libre.unltools.unl.UnlSentences;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.ArgumentsSources;
 import org.junit.jupiter.params.provider.MethodSource;
 import org.junit.jupiter.params.provider.ValueSource;
 
@@ -13,6 +12,13 @@ import java.util.stream.Stream;
 
 class UnlParserTest {
 
+    private static Stream<SentenceWithExpectedUnlDocumentsChecker> unlParserShouldParseSentenceAndGetExpectedUnlDocuments() {
+        return Stream.of(new R1SentenceWithExpectedUnlDocumentsChecker(),
+                new R2SentenceWithExpectedUnlDocumentsChecker(),
+                new CatsSentenceWithExpectedUnlDocumentsChecker(),
+                new AllSentenceWithExpectedUnlDocumentsChecker());
+    }
+
     @ParameterizedTest
     @ValueSource(strings = {UnlSentences.R1, UnlSentences.R2, UnlSentences.Cats, UnlSentences.All})
     void unlParserShouldParseSimpleSentenceWithoutException(String input) {
@@ -43,8 +49,6 @@ class UnlParserTest {
         return unlParser.get();
     }
 
-
-
     @ParameterizedTest
     @MethodSource
     void unlParserShouldParseSentenceAndGetExpectedUnlDocuments(SentenceWithExpectedUnlDocumentsChecker input) {
@@ -55,11 +59,4 @@ class UnlParserTest {
         input.assetSameAsExpected();
     }
 
-    private static Stream<SentenceWithExpectedUnlDocumentsChecker> unlParserShouldParseSentenceAndGetExpectedUnlDocuments(){
-        return Stream.of(new R1SentenceWithExpectedUnlDocumentsChecker(),
-                new R2SentenceWithExpectedUnlDocumentsChecker(),
-                new CatsSentenceWithExpectedUnlDocumentsChecker(),
-                new AllSentenceWithExpectedUnlDocumentsChecker());
-    }
-
 }
\ No newline at end of file
diff --git a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/parser/WrapperUnlParser.java b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/parser/WrapperUnlParser.java
index 97c487f78ef0d51b8dab9343b510dcdf93f4bc35..cd4cb337aadada7a853575000b0aaa1e96f7b9c1 100644
--- a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/parser/WrapperUnlParser.java
+++ b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/parser/WrapperUnlParser.java
@@ -17,6 +17,7 @@ public class WrapperUnlParser {
 
     /**
      * get UnlDocuments once the parsing is done
+     *
      * @return A list of UnlDocuments
      */
     public Vector<UnlDocument> getUnlDocumentList() {
@@ -68,6 +69,7 @@ public class WrapperUnlParser {
 
     /**
      * An error as occured during the parsing
+     *
      * @return true if an error occured, false otherwise
      */
     public boolean hasError() {
@@ -77,6 +79,7 @@ public class WrapperUnlParser {
 
     /**
      * Get errors of parsing
+     *
      * @return A vector of errors
      */
     public Vector<String> getErrors() {
diff --git a/unl-tools-infrastructure/unl-tools-infrastructure.iml b/unl-tools-infrastructure/unl-tools-infrastructure.iml
index 095605ea887b71d3fd448e107c5a36bbf7367980..8b05d4fbb418ccaad01f7e2f69d3fd727a5d8b11 100644
--- a/unl-tools-infrastructure/unl-tools-infrastructure.iml
+++ b/unl-tools-infrastructure/unl-tools-infrastructure.iml
@@ -46,6 +46,8 @@
     <orderEntry type="library" name="Maven: fr.tetras_libre.rdf:rdf-unl-java-vocabulary:1.0-SNAPSHOT" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.slf4j:slf4j-nop:1.7.30" level="project" />
     <orderEntry type="module" module-name="unl-tools-core" />
+    <orderEntry type="library" name="Maven: org.picocontainer:picocontainer:2.15" level="project" />
+    <orderEntry type="module" module-name="unl-tools-application" />
     <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter:5.7.0-M1" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-api:5.7.0-M1" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.apiguardian:apiguardian-api:1.1.0" level="project" />
diff --git a/unl-tools-app/pom.xml b/unl-tools-main/pom.xml
similarity index 85%
rename from unl-tools-app/pom.xml
rename to unl-tools-main/pom.xml
index 450e947391aaf51b1276ed61ba6907df113b4bd8..e4b966ef7deecc219bedba4e4446ab785d17fcd1 100644
--- a/unl-tools-app/pom.xml
+++ b/unl-tools-main/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
@@ -10,7 +10,7 @@
         <version>1.0-SNAPSHOT</version>
     </parent>
 
-    <artifactId>unl-tools-app</artifactId>
+    <artifactId>unl-tools-main</artifactId>
 
     <packaging>jar</packaging>
 
@@ -66,13 +66,15 @@
                                 </excludes>
                             </artifactSet>
                             <transformers>
-                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                     <ManifestEntries>
                                         <mainClass>unl2rdf.Unl2Rdf</mainClass>
                                         <Build-Number>1</Build-Number>
                                     </ManifestEntries>
                                 </transformer>
-                                <transformer implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer">
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer">
                                 </transformer>
                             </transformers>
                             <relocations>
@@ -104,6 +106,12 @@
             <version>1.0-SNAPSHOT</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>fr.tetras_libre.unl</groupId>
+            <artifactId>unl-tools-application</artifactId>
+            <version>1.0-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
 
diff --git a/unl-tools-app/src/main/java/unl2rdf/Options.java b/unl-tools-main/src/main/java/unl2rdf/Options.java
similarity index 100%
rename from unl-tools-app/src/main/java/unl2rdf/Options.java
rename to unl-tools-main/src/main/java/unl2rdf/Options.java
diff --git a/unl-tools-app/src/main/java/unl2rdf/OutFileType.java b/unl-tools-main/src/main/java/unl2rdf/OutFileType.java
similarity index 100%
rename from unl-tools-app/src/main/java/unl2rdf/OutFileType.java
rename to unl-tools-main/src/main/java/unl2rdf/OutFileType.java
diff --git a/unl-tools-app/src/main/java/unl2rdf/Unl2Rdf.java b/unl-tools-main/src/main/java/unl2rdf/Unl2Rdf.java
similarity index 56%
rename from unl-tools-app/src/main/java/unl2rdf/Unl2Rdf.java
rename to unl-tools-main/src/main/java/unl2rdf/Unl2Rdf.java
index 2761d69efabc367227fe6f839e378c1fd9e77698..555b7e7be9d9ec4eeb8e61124ca2f5574b562dfa 100644
--- a/unl-tools-app/src/main/java/unl2rdf/Unl2Rdf.java
+++ b/unl-tools-main/src/main/java/unl2rdf/Unl2Rdf.java
@@ -1,22 +1,21 @@
 package unl2rdf;
 
-import fr.tetras_libre.unltools.unl.GraphExporter;
-import fr.tetras_libre.unltools.unl.UnlDocument;
-import fr.tetras_libre.unltools.unl.exporters.DefaultGraphExporterFactory;
+import fr.tetras_libre.unltools.ApplicationStartup;
+import fr.tetras_libre.unltools.Convert.ExportUnlDocuments;
+import fr.tetras_libre.unltools.DefaultCommandHandlerResolverFactory;
+import fr.tetras_libre.unltools.cqrs.ServiceProvider;
 import fr.tetras_libre.unltools.unl.exporters.GraphExporterNames;
-import fr.tetras_libre.unltools.unl.parser.ParseException;
-import fr.tetras_libre.unltools.unl.parser.UnlParser;
+import fr.tetras_libre.unltools.unl.parser.UnlGraphImporterFromUnlParser;
 import picocli.CommandLine;
 
-import java.io.BufferedReader;
 import java.io.FileWriter;
 import java.io.IOException;
-import java.util.Vector;
 
 public class Unl2Rdf {
 
-    private static DefaultGraphExporterFactory defaultGraphExporterFactory = new DefaultGraphExporterFactory();
-    public static void main(String[] args) throws IOException, ParseException {
+    private static ServiceProvider serviceProvider;
+
+    public static void main(String[] args) throws IOException {
 
         Options options = new Options();
 
@@ -24,6 +23,7 @@ public class Unl2Rdf {
             CommandLine.ParseResult parseResult = new CommandLine(options).parseArgs(args);
 
             if (!CommandLine.printHelpIfRequested(parseResult)) {
+                serviceProvider = ApplicationStartup.Initialize(DefaultCommandHandlerResolverFactory.create());
                 runProgram(options);
             }
         } catch (CommandLine.ParameterException e) {
@@ -32,17 +32,19 @@ public class Unl2Rdf {
         }
     }
 
-    private static void runProgram(Options options) throws ParseException, IOException {
+    private static void runProgram(Options options) throws IOException {
         System.out.println(String.format("Source file :  '%s'", options.getInputFile().getAbsolutePath()));
-        BufferedReader bufferedReader = new BufferedReader(options.getInputStream());
-        UnlParser parser = new UnlParser(bufferedReader);
-        Vector<UnlDocument> documents = parser.createUnlDocumentList();
+
+
+        var importer = UnlGraphImporterFromUnlParser.FromInputReader(options.getInputStream());
+        var handler = serviceProvider.getHandler(ExportUnlDocuments.class);
 
         for (OutFileType outType : options.getOutputFileType()) {
             String extension = ToExtension(outType);
             String outfileName = options.getOutputFile() + extension;
             FileWriter fileWriter = new FileWriter(outfileName, false);
-            GetExporter(outType, fileWriter).write(documents);
+            var convertCommand = new ExportUnlDocuments(importer, GetExporterName(outType), fileWriter);
+            handler.handle(convertCommand);
             fileWriter.close();
             System.out.println(String.format("Graph writen into file '%s'", outfileName));
         }
@@ -59,18 +61,16 @@ public class Unl2Rdf {
         throw new IllegalArgumentException(String.format("unknown fileType '%s", outFileType.toString()));
     }
 
-    private static GraphExporter GetExporter(OutFileType fileType, FileWriter writer) {
+    private static String GetExporterName(OutFileType fileType) {
         String exporterName = null;
         switch (fileType) {
             case rdf:
-                exporterName = GraphExporterNames.RDF_EXPORTER;
-                break;
+                return GraphExporterNames.RDF_EXPORTER;
             case dot:
-                exporterName = GraphExporterNames.DOT_EXPORTER;
-                break;
+                return GraphExporterNames.DOT_EXPORTER;
         }
 
-        return defaultGraphExporterFactory.createGraphExporter(writer, exporterName);
+        throw new IllegalArgumentException();
     }
 
 }
diff --git a/unl-tools-app/src/main/resources/META-INF/MANIFEST.MF b/unl-tools-main/src/main/resources/META-INF/MANIFEST.MF
similarity index 100%
rename from unl-tools-app/src/main/resources/META-INF/MANIFEST.MF
rename to unl-tools-main/src/main/resources/META-INF/MANIFEST.MF
diff --git a/unl-tools-app/src/test/java/unl2rdf/Unl2RdfTest.java b/unl-tools-main/src/test/java/unl2rdf/Unl2RdfTest.java
similarity index 92%
rename from unl-tools-app/src/test/java/unl2rdf/Unl2RdfTest.java
rename to unl-tools-main/src/test/java/unl2rdf/Unl2RdfTest.java
index b0d28dac74dcde47cebdd1b36982e5ae9fa8de33..4a9dfb91cf582313bae6e2e722270098042db815 100644
--- a/unl-tools-app/src/test/java/unl2rdf/Unl2RdfTest.java
+++ b/unl-tools-main/src/test/java/unl2rdf/Unl2RdfTest.java
@@ -22,25 +22,25 @@ class Unl2RdfTest {
 
     @Tag("integration")
     @Test
-    public void r1ShouldBeConvertedToRdfFile(){
+    public void r1ShouldBeConvertedToRdfFile() {
         Assertions.assertDoesNotThrow(() -> Unl2Rdf.main(new String[]{"--input-file", "../Examples/r1.txt", "--output-file", "r1", "--output-type", "rdf"}));
     }
 
     @Tag("integration")
     @Test
-    public void r2ShouldBeConvertedToRdfFile(){
+    public void r2ShouldBeConvertedToRdfFile() {
         Assertions.assertDoesNotThrow(() -> Unl2Rdf.main(new String[]{"--input-file", "../Examples/r2.txt", "--output-file", "r2", "--output-type", "rdf"}));
     }
 
     @Tag("integration")
     @Test
-    public void catShouldBeConvertedToRdfFile(){
+    public void catShouldBeConvertedToRdfFile() {
         Assertions.assertDoesNotThrow(() -> Unl2Rdf.main(new String[]{"--input-file", "../Examples/cat.txt", "--output-file", "cat", "--output-type", "rdf"}));
     }
 
     @Tag("integration")
     @Test
-    public void exemplesShouldBeConvertedToRdfFile(){
+    public void exemplesShouldBeConvertedToRdfFile() {
         Assertions.assertDoesNotThrow(() -> Unl2Rdf.main(new String[]{"--input-file", "../Examples/exemples_unl.txt", "--output-file", "exemples_unl", "--output-type", "rdf"}));
     }
 
diff --git a/unl-tools-app/unl-tools-app.iml b/unl-tools-main/unl-tools-main.iml
similarity index 97%
rename from unl-tools-app/unl-tools-app.iml
rename to unl-tools-main/unl-tools-main.iml
index f7b5b3cb5757c81444b3202361e561f99827e677..a4c45eb599074bee25daa7121406845abbee6f92 100644
--- a/unl-tools-app/unl-tools-app.iml
+++ b/unl-tools-main/unl-tools-main.iml
@@ -48,6 +48,8 @@
     <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.26" level="project" />
     <orderEntry type="library" name="Maven: fr.tetras_libre.rdf:rdf-unl-java-vocabulary:1.0-SNAPSHOT" level="project" />
     <orderEntry type="module" module-name="unl-tools-core" />
+    <orderEntry type="library" name="Maven: org.picocontainer:picocontainer:2.15" level="project" />
+    <orderEntry type="module" module-name="unl-tools-application" />
     <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter:5.7.0-M1" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-api:5.7.0-M1" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.apiguardian:apiguardian-api:1.1.0" level="project" />