diff --git a/compilation/src/main/java/App.java b/compilation/src/main/java/App.java
index e9bbbe83b00aa3f1717828b5a1be9fa3e88d9216..3362f9de816a3fdcf24f40316b8834351f6c08ed 100644
--- a/compilation/src/main/java/App.java
+++ b/compilation/src/main/java/App.java
@@ -1,89 +1,10 @@
 import io.javalin.Javalin;
 import org.json.JSONObject;
 
-import java.io.*;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 import static java.lang.System.out;
 
-interface ExecutableCode {
-    Map<String, Serializable> execute();
-}
-interface DockerExecutableCode extends ExecutableCode {
-
-    String command();
-    Map<String, String> filesToExecute();
-
-    default void writeFile(String filename, String content) {
-        File file = new File(filename);
-        try (PrintWriter writer = new PrintWriter( new FileWriter(file, true) )) {
-            writer.write(content);
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-    }
-    default void writeFiles(Map<String, String> files) {
-        files.forEach( this::writeFile );
-    }
-    default void deleteFiles(Map<String, String> files) {
-        files.keySet().forEach( filename -> new File(filename).delete() );
-    }
-    default Map<String, Serializable> executeFiles() {
-        Process cmdProc;
-        long elapsed = 0;
-        try {
-            long start = System.currentTimeMillis();
-            cmdProc = Runtime.getRuntime().exec( command() );
-            cmdProc.waitFor();
-            elapsed = System.currentTimeMillis() - start;
-        } catch (IOException | InterruptedException e) {
-            e.printStackTrace();
-            return Map.of("error", e.toString(), "exit", 1, "elapsed", elapsed);
-        }
-
-        String in = new BufferedReader( new InputStreamReader( cmdProc.getInputStream() )).lines().collect(Collectors.joining());
-        String err = new BufferedReader( new InputStreamReader( cmdProc.getErrorStream() )).lines().collect(Collectors.joining());
-
-        return Map.of("exit", err.isEmpty(), "output", in, "error", err, "time", elapsed);
-    }
-    default Map<String, Serializable> execute() {
-        writeFiles( filesToExecute() );
-        Map<String, Serializable> res = executeFiles();
-        deleteFiles( filesToExecute() );
-        return res;
-    }
-}
-
-class JavaDockerCode implements DockerExecutableCode {
-    private Map<String, String> filesWithContent;
-    public JavaDockerCode(Map<String, String> filesWithContent) {
-        this.filesWithContent = filesWithContent;
-    }
-
-    public String command() {
-        return "docker run --rm --mount type=bind,source=" + System.getProperty("user.dir") + "/share_docker_file,dst=/env/ freakency/java:1.0 ./java_test.sh";
-    }
-
-    public Map<String, String> filesToExecute() {
-        return this.filesWithContent;
-    }
-}
-class PythonDockerCode implements DockerExecutableCode {
-    private Map<String, String> filesWithContent;
-    public PythonDockerCode(Map<String, String> filesWithContent) {
-        this.filesWithContent = filesWithContent;
-    }
-
-    public String command() {
-        return "docker run --rm --mount type=bind,source=" + System.getProperty("user.dir") + "/share_docker_file,dst=/env/ freakency/python:3.0 python assert.py";
-    }
-
-    public Map<String, String> filesToExecute() {
-        return this.filesWithContent;
-    }
-}
-
 
 public class App {
     public static void main(String[] args) {
@@ -97,10 +18,17 @@ public class App {
             String userCode = res.getString("stream");
             String assertion = res.getString("assert");
 
-
-            ExecutableCode ec = language.equals("java") ?
-                    new JavaDockerCode(Map.of("share_docker_file/Kata.java", userCode, "share_docker_file/Main.java", assertion)) :
-                    new PythonDockerCode(Map.of("share_docker_file/sample.py", userCode, "share_docker_file/assert.py", assertion));
+            ExecutableCode ec;
+            switch( language ) {
+                case "java":
+                    ec = new JavaDockerCode(Map.of("share_docker_file/Kata.java", userCode, "share_docker_file/Main.java", assertion));
+                    break;
+                case "python":
+                    ec = new PythonDockerCode(Map.of("share_docker_file/sample.py", userCode, "share_docker_file/assert.py", assertion));
+                    break;
+                default:
+                    throw new IllegalArgumentException("Language unkown");
+            }
 
             out.println(language);
             out.println(userCode);
diff --git a/compilation/src/main/java/CompilationService.java b/compilation/src/main/java/CompilationService.java
deleted file mode 100644
index d54209be8b5681f6325370a829c6a9cc1370c200..0000000000000000000000000000000000000000
--- a/compilation/src/main/java/CompilationService.java
+++ /dev/null
@@ -1,8 +0,0 @@
-import java.io.Serializable;
-import java.util.Map;
-
-public interface CompilationService {
-
-    Map<String, Serializable> executeKata(String language, String userCode, String assertion);
-
-}
diff --git a/compilation/src/main/java/DockerCompilation.java b/compilation/src/main/java/DockerCompilation.java
deleted file mode 100644
index 8bf78324bc731e70d70be5b266477a1840dba1fb..0000000000000000000000000000000000000000
--- a/compilation/src/main/java/DockerCompilation.java
+++ /dev/null
@@ -1,94 +0,0 @@
-import org.json.JSONObject;
-
-import java.io.*;
-import java.util.HashMap;
-import java.util.Map;
-
-public class DockerCompilation implements CompilationService {
-
-    private Map<String, Map<String, String>> filenameDic = new HashMap<>();
-
-    DockerCompilation() {
-
-        String userDir = System.getProperty("user.dir");
-        Map<String, String> python = new HashMap<>();
-        python.put("filename", "share_docker_file/sample.py");
-        python.put("test", "share_docker_file/assert.py");
-        python.put("cmd", "docker run --rm --mount type=bind,source=" + userDir + "/share_docker_file,dst=/env/ freakency/python:3.0 python assert.py");
-
-        Map<String, String> java = new HashMap<>();
-
-        java.put("filename", "share_docker_file/kata.java");
-        java.put("test", "share_docker_file/Main.java");
-        java.put("cmd", "docker run --rm --mount type=bind,source=" + userDir + "/share_docker_file,dst=/env/ freakency/java:1.0 ./java_test.sh");
-
-        this.filenameDic.put("python", python);
-        this.filenameDic.put("java", java);
-    }
-
-    public Map<String, Serializable> executeKata(String language, String userCode, String assertion) {
-
-
-        String line;
-        String output = "";
-        String error = "";
-
-        Map<String, String> languages = this.filenameDic.get(language);
-
-        try (PrintWriter filenameWriter = new PrintWriter(languages.get("filename"), "UTF-8"); PrintWriter filenameTestWriter = new PrintWriter(languages.get("test"), "UTF-8")) {
-            filenameWriter.println(userCode);
-            filenameTestWriter.println(assertion);
-        } catch (FileNotFoundException | UnsupportedEncodingException e) {
-            e.printStackTrace();
-        }
-
-        long start, elapsed = 0;
-        Process cmdProc = null;
-
-        try {
-            start = System.currentTimeMillis();
-            cmdProc = Runtime.getRuntime().exec(languages.get("cmd"));
-            cmdProc.waitFor();
-
-            elapsed = System.currentTimeMillis() - start;
-
-        } catch (IOException | InterruptedException e) {
-            e.printStackTrace();
-        }
-
-        // Create Array lists that will contain output and error values of the executed program
-        /**************************/
-
-        try (BufferedReader stdoutReader = new BufferedReader(new InputStreamReader(cmdProc.getInputStream()));
-             BufferedReader stderrReader = new BufferedReader(new InputStreamReader(cmdProc.getErrorStream()))) {
-            while ((line = stdoutReader.readLine()) != null)
-                output += line + "\n";
-            while ((line = stderrReader.readLine()) != null)
-                error += line + "\n";
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-
-        /**************************/
-
-        Map<String, Serializable> json = new HashMap<>();
-
-        //exit value of the ran program
-        if (error.equals(""))
-            json.put("exit", 0);
-        else
-            json.put("exit", 1);
-        json.put("output", output);
-        json.put("error", error);
-        json.put("time", elapsed);
-
-        // For delete purpose, create a File object also targeting sample.py
-        File file = new File(languages.get("filename"));
-        file.delete();
-
-        file = new File(languages.get("test"));
-        file.delete();
-
-        return json;
-    }
-}
diff --git a/compilation/src/main/java/DockerExecutableCode.java b/compilation/src/main/java/DockerExecutableCode.java
new file mode 100644
index 0000000000000000000000000000000000000000..30ccc15548cf16c59760f247e1c67bfa34949939
--- /dev/null
+++ b/compilation/src/main/java/DockerExecutableCode.java
@@ -0,0 +1,53 @@
+import java.io.*;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+interface DockerExecutableCode extends ExecutableCode {
+
+    String[] command();
+
+    Map<String, String> filesToExecute();
+
+    default Map<String, Serializable> execute() {
+        writeFiles( filesToExecute() );
+        Map<String, Serializable> res = executeFiles();
+        deleteFiles( filesToExecute() );
+        return res;
+    }
+
+    default void writeFile(String filename, String content) {
+        File file = new File(filename);
+        try (PrintWriter writer = new PrintWriter( new FileWriter(file, false) )) {
+            writer.write(content);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    default void writeFiles(Map<String, String> files) {
+        files.forEach( this::writeFile );
+    }
+
+    default void deleteFiles(Map<String, String> files) {
+        files.keySet().forEach( filename -> new File(filename).delete() );
+    }
+
+    default Map<String, Serializable> executeFiles() {
+        Process cmdProc;
+        long elapsed = 0;
+        try {
+            long start = System.currentTimeMillis();
+            cmdProc = Runtime.getRuntime().exec( command() );
+            cmdProc.waitFor();
+            elapsed = System.currentTimeMillis() - start;
+        } catch (IOException | InterruptedException e) {
+            e.printStackTrace();
+            return Map.of("error", e.toString(), "exit", 1, "elapsed", elapsed);
+        }
+
+        String in = new BufferedReader( new InputStreamReader( cmdProc.getInputStream() )).lines().collect(Collectors.joining());
+        String err = new BufferedReader( new InputStreamReader( cmdProc.getErrorStream() )).lines().collect(Collectors.joining());
+
+        return Map.of("exit", err.isEmpty() ? 0 : 1, "output", in, "error", err, "time", elapsed);
+    }
+}
diff --git a/compilation/src/main/java/ExecutableCode.java b/compilation/src/main/java/ExecutableCode.java
new file mode 100644
index 0000000000000000000000000000000000000000..236fc31a2068dc43137ae4846d29a87bb2cda8b2
--- /dev/null
+++ b/compilation/src/main/java/ExecutableCode.java
@@ -0,0 +1,23 @@
+import java.io.Serializable;
+import java.util.Map;
+
+public interface ExecutableCode {
+    Map<String, Serializable> execute();
+
+    /*
+    enum Language {
+        Java, Python3
+    }
+
+    static ExecutableCode of(Language language, Map<String, String> filesWithContent ) {
+        switch (language) {
+            case Java:
+                return new JavaDockerCode(filesWithContent);
+            case Python3:
+                return new PythonDockerCode(filesWithContent);
+            default:
+                throw new IllegalArgumentException("Need a implementation for this language");
+        }
+    }
+    */
+}
diff --git a/compilation/src/main/java/JavaDockerCode.java b/compilation/src/main/java/JavaDockerCode.java
new file mode 100644
index 0000000000000000000000000000000000000000..589cea56155963f711878df8ab77853124706dbb
--- /dev/null
+++ b/compilation/src/main/java/JavaDockerCode.java
@@ -0,0 +1,17 @@
+import java.util.Map;
+
+final class JavaDockerCode implements DockerExecutableCode {
+    private Map<String, String> filesWithContent;
+
+    public JavaDockerCode(Map<String, String> filesWithContent) {
+        this.filesWithContent = filesWithContent;
+    }
+
+    public String[] command() {
+        return new String[]{"docker", "run", "--rm", "--mount", "type=bind,source=" + System.getProperty("user.dir") + "/share_docker_file,dst=/env/", "freakency/java:1.0", "/bin/bash", "-c", "./java_test.sh"};
+    }
+
+    public Map<String, String> filesToExecute() {
+        return this.filesWithContent;
+    }
+}
diff --git a/compilation/src/main/java/PythonDockerCode.java b/compilation/src/main/java/PythonDockerCode.java
new file mode 100644
index 0000000000000000000000000000000000000000..2a81e64c5a04abdceb530efba5680d71786c410d
--- /dev/null
+++ b/compilation/src/main/java/PythonDockerCode.java
@@ -0,0 +1,16 @@
+import java.util.Map;
+
+final class PythonDockerCode implements DockerExecutableCode {
+    private Map<String, String> filesWithContent;
+    public PythonDockerCode(Map<String, String> filesWithContent) {
+        this.filesWithContent = filesWithContent;
+    }
+
+    public String[] command() {
+        return new String[]{"docker", "run", "--rm", "--mount", "type=bind,source=" + System.getProperty("user.dir") + "/share_docker_file,dst=/env/", "freakency/python:3.0", "/bin/bash", "-c", "python sample.py && python assert.py"};
+    }
+
+    public Map<String, String> filesToExecute() {
+        return this.filesWithContent;
+    }
+}