diff --git a/src/main/java/cli/Interpreter.java b/src/main/java/cli/Interpreter.java
index 67ef8a9bcb2cc4c34fce872b869064d12b3e4ff5..ae29dea7ab7bae5bdd4da6de0bfa19bb0b456dba 100644
--- a/src/main/java/cli/Interpreter.java
+++ b/src/main/java/cli/Interpreter.java
@@ -59,7 +59,7 @@ import java.util.Vector;
 public class Interpreter implements Runnable, TerminalProviderInterface {
 
     public final static Command[] commands = {new Action(), new Chat(), new Help(), new HelpTTool(), new History(), new Print(),
-            new Plan(), new PluginAction(), new Quit(),
+            new Plan(), new PluginAction(), new PatternHandling(), new Quit(),
             new TestSpecific(), new TML(), new Set(), new Wait(), new Robot(), new BF(), new SimulatorScript()};
 
     // Errors
@@ -152,6 +152,26 @@ public class Interpreter implements Runnable, TerminalProviderInterface {
         System.out.flush();
     }
 
+    public String interpretUntilError() {
+        Scanner scanner = new Scanner(script);
+        currentLine = 0;
+        while (scanner.hasNextLine()) {
+            String line = scanner.nextLine();
+            currentLine++;
+            for (String subCommand: line.split(";")) {
+                executeLine(subCommand, currentLine, false);
+                if (error != "" && error != null) {
+                    scanner.close();
+                    return error;
+                }
+            }
+        }
+        scanner.close();
+        printInterface.print("All done. See you soon.");
+        printInterface.exit(0);
+        return null;
+    }
+
     public void interpret() {
         Scanner scanner = new Scanner(script);
         currentLine = 0;
diff --git a/src/main/java/cli/PatternHandling.java b/src/main/java/cli/PatternHandling.java
new file mode 100644
index 0000000000000000000000000000000000000000..e9b582645e64997ed0c2e47b69a6430ed2e4bb21
--- /dev/null
+++ b/src/main/java/cli/PatternHandling.java
@@ -0,0 +1,1899 @@
+/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
+ *
+ * ludovic.apvrille AT enst.fr
+ *
+ * This software is a computer program whose purpose is to allow the
+ * edition of TURTLE analysis, design and deployment diagrams, to
+ * allow the generation of RT-LOTOS or Java code from this diagram,
+ * and at last to allow the analysis of formal validation traces
+ * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
+ * from INRIA Rhone-Alpes.
+ *
+ * This software is governed by the CeCILL  license under French law and
+ * abiding by the rules of distribution of free software.  You can  use,
+ * modify and/ or redistribute the software under the terms of the CeCILL
+ * license as circulated by CEA, CNRS and INRIA at the following URL
+ * "http://www.cecill.info".
+ *
+ * As a counterpart to the access to the source code and  rights to copy,
+ * modify and redistribute granted by the license, users are provided only
+ * with a limited warranty  and the software's author,  the holder of the
+ * economic rights,  and the successive licensors  have only  limited
+ * liability.
+ *
+ * In this respect, the user's attention is drawn to the risks associated
+ * with loading,  using,  modifying and/or developing or reproducing the
+ * software by the user in light of its specific status of free software,
+ * that may mean  that it is complicated to manipulate,  and  that  also
+ * therefore means  that it is reserved for developers  and  experienced
+ * professionals having in-depth computer knowledge. Users are therefore
+ * encouraged to load and test the software's suitability as regards their
+ * requirements in conditions enabling the security of their systems and/or
+ * data to be ensured and,  more generally, to use and operate it in the
+ * same conditions as regards security.
+ *
+ * The fact that you are presently reading this means that you have had
+ * knowledge of the CeCILL license and that you accept its terms.
+ */
+
+
+package cli;
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Vector;
+
+import myutil.FileUtils;
+import tmltranslator.HwNode;
+import tmltranslator.TMLChannel;
+import tmltranslator.TMLEvent;
+import tmltranslator.TMLMapping;
+import tmltranslator.TMLMappingTextSpecification;
+import tmltranslator.TMLRequest;
+import tmltranslator.TMLSyntaxChecking;
+import tmltranslator.TMLTask;
+import tmltranslator.patternhandling.AttributeTaskJsonFile;
+import tmltranslator.patternhandling.MappingPatternChannel;
+import tmltranslator.patternhandling.MappingPatternTask;
+import tmltranslator.patternhandling.PatternChannelWithSecurity;
+import tmltranslator.patternhandling.PatternCloneTask;
+import tmltranslator.patternhandling.PatternConfiguration;
+import tmltranslator.patternhandling.PatternConnection;
+import tmltranslator.patternhandling.PatternCreation;
+import tmltranslator.patternhandling.PatternPortsConfig;
+import tmltranslator.patternhandling.PortTaskJsonFile;
+import tmltranslator.patternhandling.TaskPattern;
+import tmltranslator.patternhandling.TaskPorts;
+import ui.GTURTLEModeling;
+import ui.TMLArchiPanel;
+import ui.TURTLEPanel;
+
+/**
+ * Class PatternHandling
+ * Creation: 23/10/2023
+ * Version 1.0 23/10/2023
+ *
+ * @author Jawher JERRAY
+ */
+
+public class PatternHandling extends Command {
+    private final static String SYNTAX_ERROR = "Syntax Error";
+    private final static String NO_NAME_NO_TASK_FOR_PATTERN = "No name or no tasks is giving for the pattern";
+
+    private final static String PATTERN_NOT_EXIST = "Pattern does not exist";
+    private final static String NO_PATTERN_SELECTED = "No pattern selected";
+    public final static String PATTERN_NOT_CONNECTED = "Some pattern ports are not connected yet";
+    private final static String PORT_CONFIGURATION_NOT_FINISHED = "Some ports configuration are missing";
+    private final static String CLONE_TASK_EXIST = "Cloned task already exists";
+    private final static String TASK_TO_CLONE_NOT_EXIST = "Task to clone does not exist";
+    private final static String TASK_NOT_EXIST = "Task does not exist";
+    private final static String PATTERN_TASK_NOT_EXIST = "Pattern task does not exist or all its external ports are already connected";
+    private final static String PATTERN_PORT_NOT_EXIST = "Pattern port does not exist or it's already connected";
+    private final static String MODEL_TASK_NOT_EXIST = "Model task does not exist";
+    private final static String MODEL_PORT_NOT_EXIST = "Model port does not exist or its already used";
+    private final static String MODEL_PORT_CONFIG_NOT_EXIST = "Model port does not exist or it's already configured";
+    private final static String MODEL_PORT_MERGE_WITH_NOT_EXIST = "Model port to merge with does not exist or can't be used";
+    private final static String PORTS_TYPES_NOT_MATCH = "The selected port in pattern side does not match with the selected port in the model side";
+    private final static String ATTRIBUTE_NOT_EXIST = "Attribute does not exist";
+    private final static String VALUE_BAD = "Unreadable value";
+    private final static String TASK_TO_MAP_NOT_EXIST = "Task to map does not exist or it's already mapped";
+    private final static String TASK_IN_SAME_HW_MAP_NOT_EXIST = "Selected task in same HW does not exist or can't be used";
+    private final static String CHANNEL_TO_MAP_NOT_EXIST = "Channel to map does not exist or it's already mapped";
+    private final static String CHANNEL_IN_SAME_MEM_MAP_NOT_EXIST = "Selected channel in same memory does not exist or can't be used";
+    private final static String BUS_NOT_EXIST = "Bus does not exist";
+    private final static String CONFIG_JSON_FILE_NOT_EXIST = "Config json file does not exist";
+    private final static String CONFIG_JSON_FILE_MISSING = "Path of the configuration json is missing or no pattern is selected";
+    // PatternHandling commands
+    private final static String CREATE = "create-pattern";
+    private final static String CONFIGURE = "configure-pattern";
+    private final static String INTEGRATE = "apply-pattern";
+    private final static String DIPLO_LOAD_TMAP = "diplodocus-load-tmap";
+
+    private TMLMapping<?> tmap;
+    private String tabName = "";
+    private String patternName, patternsPath = "../ttool/build/resources/main/patterns/";
+    private HashSet<String> selectedTasks = new HashSet<String>();
+    private HashSet<String> allTasksOfModel = new HashSet<String>();
+
+    private Vector<String> listPatterns = new Vector<String>();
+    private String selectedPatternPath, selectedPatternName;
+    private PatternConfiguration patternConfiguration = new PatternConfiguration();
+    LinkedHashMap<String, TaskPattern> patternTasksAll, patternTasksLeft;
+    LinkedHashMap<String, TaskPorts> portsTaskOfModelAll;
+    LinkedHashMap<String, TaskPorts> portsTaskModelLeft;
+    List<PatternPortsConfig> portsLeftToConfig;
+    List<MappingPatternTask> tasksLeftToMap;
+    List<MappingPatternChannel> channelsLeftToMap;
+
+    private String selectedPatternToIntergrate, selectedPatternPathToIntergrate, selectedJsonFilePath;
+
+    public PatternHandling() {
+
+    }
+
+    public List<Command> getListOfSubCommands() {
+        return subcommands;
+    }
+
+    public String getCommand() {
+        return "pattern";
+    }
+
+    public String getShortCommand() {
+        return "pa";
+    }
+
+    public String getUsage() {
+        return "pattern <subcommand> <options>";
+    }
+
+    public String getDescription() {
+        return "Can be used to create, configure or integrate a pattern into a DIPLODOCUS model.";
+    }
+
+    public void fillSubCommands() {
+
+        // Create Pattern
+        Command createPattern = new Command() {
+            final String [] options = {"-n", "-p","-a", "-l", "-t", "-r", "-m"};
+            public String getCommand() {
+                return CREATE;
+            }
+
+            public String getShortCommand() {
+                return "c";
+            }
+
+            public String getDescription() {
+                return "Create a pattern from a model by giving a name to the new pattern and selecting its tasks";
+            }
+
+            public String getUsage() {
+                return "[OPTION]... [NAME] [PATH] [TASKS]\n"
+                + "-n NAME\tset a name for the pattern to create\n"
+                + "-p PATH\tset a path for the files that will be generated for the pattern\n"
+                + "-a TASKS\tselect tasks to add to the pattern (seperated by a space)\n"
+                + "-l \tget the list of selected tasks to be added to the pattern\n"
+                + "-t \tget all tasks of the model\n"
+                + "-r TASKS\tremove selected tasks\n"
+                + "-m \tmake the pattern\n";
+            }
+
+            public String executeCommand(String command, Interpreter interpreter) {
+                /*if (!interpreter.isTToolStarted()) {
+                    return Interpreter.TTOOL_NOT_STARTED;
+                }*/
+                
+                if (tmap == null) {
+                    if (interpreter.mgui != null) {
+                        TURTLEPanel tp = interpreter.mgui.getCurrentTURTLEPanel();
+                        if (!(tp instanceof TMLArchiPanel)) {
+                            return "Current panel does not contain TMAP (NB: you can load a textual TMAP Spec using " + DIPLO_LOAD_TMAP +" or move to Arch panel.)";
+                        }
+                        if(!interpreter.mgui.checkModelingSyntax(tp, true)) {
+                            return SYNTAX_ERROR + "in current panel (NB: you can load a textual TMAP Spec using " + DIPLO_LOAD_TMAP +")";
+                        }
+                        tmap = interpreter.mgui.gtm.getTMLMapping();
+                        nullifyAll();
+                        if (tmap == null) {
+                            return Interpreter.TMAP_NO_SPEC + "\nLoad a textual TMAP Spec using " + DIPLO_LOAD_TMAP + " command or move to Arch panel.";
+                        } else {
+                            for (TMLTask task : tmap.getTMLModeling().getTasks()) {
+                                String[] taskNameSplit = task.getName().split("__");
+                                allTasksOfModel.add(taskNameSplit[taskNameSplit.length-1]);
+                                if (taskNameSplit.length > 1) {
+                                    tabName = taskNameSplit[0];
+                                } 
+                                task.setName(taskNameSplit[taskNameSplit.length-1]);
+                            }
+                            for (TMLChannel ch : tmap.getTMLModeling().getChannels()) {
+                                String[] chNameSplit = ch.getName().split("__");
+                                ch.setName(chNameSplit[chNameSplit.length-1]);
+                            }
+                            for (TMLEvent evt : tmap.getTMLModeling().getEvents()) {
+                                String[] evtNameSplit = evt.getName().split("__");
+                                evt.setName(evtNameSplit[evtNameSplit.length-1]);
+                            }
+                            for (TMLRequest req : tmap.getTMLModeling().getRequests()) {
+                                String[] reqNameSplit = req.getName().split("__");
+                                req.setName(reqNameSplit[reqNameSplit.length-1]);
+                            }
+                        }
+                    } else {
+                        return Interpreter.TTOOL_NOT_STARTED;
+                    }
+                }
+
+                String[] commands = command.split(" ");
+                for (int i = 0; i < commands.length; i++) {
+                    List<String> argumentsOfOption = new ArrayList<String>();
+                    
+                    switch (commands[i]) {
+                        case "-n":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 1) {
+                                return Interpreter.BAD;
+                            }
+                            patternName = argumentsOfOption.get(0);
+                            break;
+                        case "-p":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 1) {
+                                return Interpreter.BAD;
+                            }
+                            patternsPath = argumentsOfOption.get(0);
+                            break;
+                        case "-a":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() == 0) {
+                                return Interpreter.BAD;
+                            }
+                            for (String argumentOfOption : argumentsOfOption) {
+                                if (allTasksOfModel.contains(argumentOfOption)) {
+                                    selectedTasks.add(argumentOfOption);
+                                } else {
+                                    interpreter.print("The task " + argumentOfOption + " does not exist, it will not be added.");
+                                }
+                            }
+                            break;
+                        case "-l":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 0) {
+                                return Interpreter.BAD;
+                            }
+                            interpreter.print("The selected tasks are :");
+                            String printSelectedTasks = "";
+                            for (int ind = 0; ind < selectedTasks.size(); ind++) {
+                                if (ind == 0) {
+                                    printSelectedTasks = (String) selectedTasks.toArray()[ind];
+                                } else {
+                                    printSelectedTasks = printSelectedTasks + "\t" + (String) selectedTasks.toArray()[ind];
+                                }
+                            }
+                            interpreter.print(printSelectedTasks);
+                            break;
+                        case "-t":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 0) {
+                                return Interpreter.BAD;
+                            }
+                            
+                            interpreter.print("This model contains " + allTasksOfModel.size() + " task(s) :");
+                            String printTasks = "";
+                            for (int ind = 0; ind < allTasksOfModel.size(); ind++) {
+                                if (ind == 0) {
+                                    printTasks = (String) allTasksOfModel.toArray()[ind];
+                                } else {
+                                    printTasks = printTasks + "\t" + (String) allTasksOfModel.toArray()[ind];
+                                }
+                            }
+                            interpreter.print(printTasks);
+                            break;
+                        case "-r":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() == 0) {
+                                return Interpreter.BAD;
+                            }
+                            for (String argumentOfOption : argumentsOfOption) {
+                                if (allTasksOfModel.contains(argumentOfOption)) {
+                                    selectedTasks.remove(argumentOfOption);
+                                } else {
+                                    interpreter.print("The task " + argumentOfOption + " does not exist, it will not be removed.");
+                                }
+                            }
+                            break;
+                        case "-m":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 0) {
+                                return Interpreter.BAD;
+                            }
+                            if (patternName != null && !patternName.equals("") && selectedTasks.size() != 0) {
+                                GTURTLEModeling.createPatternFromTmap(new ArrayList<String>(selectedTasks), patternName, patternsPath, tmap);
+                                selectedTasks.clear();
+                                patternName = null;
+                            } else {
+                                return NO_NAME_NO_TASK_FOR_PATTERN;
+                            }
+                            
+                            break;
+                        default:
+                            return Interpreter.BAD;
+                    }
+                }
+                return null;
+            }
+        };
+
+        // Create Pattern
+        Command configurePattern = new Command() {
+            final String [] options = {"-n", "-p", "-pal", "-sp", "-ct", "-ctr", "-co", "-cor", "-col", "-plnc", "-pl", "-t", "-b", "-cptl", "-cpd", "-cpm", "-cpml", "-cpr", "-cpl", "-tctl", "-tcm", "-tcml", "-tcn", "-tcr", "-tcl", "-mctl", "-mcm", "-mcml", "-mcn", "-mcr", "-mcl", "-ua", "-m"};
+            public String getCommand() {
+                return CONFIGURE;
+            }
+
+            public String getShortCommand() {
+                return "sc";
+            }
+
+            public String getDescription() {
+                return "Select a pattern and Configure how it will be integrated into a given model";
+            }
+
+            public String getUsage() {
+                return "[OPTION]... [NAME] [TASK]\n"
+                + "-n NAME\tselect a pattern by its name\n"
+                + "-p PATH\tselect a pattern by the path of its folder\n"
+                + "-pal \tget the list of all the created patterns\n"
+                + "-sp \tget selected pattern\n"
+                + "-ct TASK1 TASK2\tclone TASK1 from TASK2\n"
+                + "-ctr TASK\t remove the clone task TASK\n"
+                + "-ctl TASK\t get the list of cloned tasks\n"
+                + "-co TASK1.PORT1 TASK2.PORT2 [NEW] [C] [WA] [SA]\tconnect PORT1 of TASK1 (pattern side) with PORT2 of TASK2 (model side). Other possible options:\n\t*Set NEW to specify that this is a new port that needs to be created.\n\t*Set C to ensure confidentiality for this channel\n\t*Set WA to ensure weak authenticity for this channel\n\t*Set SA to ensure strong authenticity for this channel\n"
+                + "-cor TASK.PORT\tremove connections that have TASK.PORT in the pattern side.\n"
+                + "-col \tget the list of connections already made\n"
+                + "-plnc \tget the list of pattern's ports that are not yet connected\n"
+                + "-pl TASK.PORT \tget list of available ports in model that could be used to connect with PORT (pattern side)\n"
+                + "-t \tget all tasks of the model\n"
+                + "-b \tget all buses of the model\n"
+                + "-cptl \tget list of ports to be configured\n"
+                + "-cpd [TASK.PORT] [ALL]\tchoose removing PORT as decision (or ALL to remove all the ports)\n"
+                + "-cpm TASK.PORT1 PORT2\tchoose merging PORT1 with PORT2 as decision\n"
+                + "-cpml TASK.PORT\tget list of ports that can be merge with TASK.PORT\n"
+                + "-cpr TASK.PORT\tremove the configuration decision for PORT\n"
+                + "-cpl \tget list of configured ports\n"
+                + "-tctl \tget list of tasks to be mapped \n"
+                + "-tcm TASK1 TASK2\tmap TASK1 in same CPU as TASK2\n"
+                + "-tcml\tmap get list of tasks that can be used to map in same CPU\n"
+                + "-tcn TASK BUS\tmap TASK in new CPU linked to bus BUS\n"
+                + "-tcr TASK\tremove the mapping of TASK\n"
+                + "-tcl \tget list of mapped tasks\n"
+                + "-mctl \tmap get list of channels to be mapped\n"
+                + "-mcm TASK1.CHANNEL1 TASK2.CHANNEL2\tmap CHANNEL1 in same memory and buses as CHANNEL2\n"
+                + "-mcml\tmap get list of channels that can be used to map in same Memory\n"
+                + "-mcn TASK.CHANNEL BUS\tmap CHANNEL in new memory linked to bus BUS\n"
+                + "-mcr TASK.CHANNEL\tremove the mapping of CHANNEL\n"
+                + "-mcl \tmap get list of mapped channels\n"
+                + "-ua TASK ATTRIBUTE VALUE \tput the value VALUE of attribute ATTRIBUTE of the task TASK\n"
+                + "-m [PATH]\tmake the json configuration file of the pattern, you can optionally specify the path of this new file\n";
+            }
+
+            public String executeCommand(String command, Interpreter interpreter) {
+                /*if (!interpreter.isTToolStarted()) {
+                    return Interpreter.TTOOL_NOT_STARTED;
+                }*/
+                
+                if (tmap == null) {
+                    if (interpreter.mgui != null) {
+                        TURTLEPanel tp = interpreter.mgui.getCurrentTURTLEPanel();
+                        if (!(tp instanceof TMLArchiPanel)) {
+                            return "Current panel does not contain TMAP (NB: you can load a textual TMAP Spec using " + DIPLO_LOAD_TMAP +" or move to Arch panel.)";
+                        }
+                        if(!interpreter.mgui.checkModelingSyntax(tp, true)) {
+                            return SYNTAX_ERROR + "in current panel (NB: you can load a textual TMAP Spec using " + DIPLO_LOAD_TMAP +")";
+                        }
+                        tmap = interpreter.mgui.gtm.getTMLMapping();
+                        nullifyAll();
+                        if (tmap == null) {
+                            return Interpreter.TMAP_NO_SPEC + "\nLoad a textual TMAP Spec using " + DIPLO_LOAD_TMAP + " command or move to Arch panel.";
+                        } else {
+                            for (TMLTask task : tmap.getTMLModeling().getTasks()) {
+                                String[] taskNameSplit = task.getName().split("__");
+                                allTasksOfModel.add(taskNameSplit[taskNameSplit.length-1]);
+                                if (taskNameSplit.length > 1) {
+                                    tabName = taskNameSplit[0];
+                                } 
+                                task.setName(taskNameSplit[taskNameSplit.length-1]);
+                            }
+                            for (TMLChannel ch : tmap.getTMLModeling().getChannels()) {
+                                String[] chNameSplit = ch.getName().split("__");
+                                ch.setName(chNameSplit[chNameSplit.length-1]);
+                            }
+                            for (TMLEvent evt : tmap.getTMLModeling().getEvents()) {
+                                String[] evtNameSplit = evt.getName().split("__");
+                                evt.setName(evtNameSplit[evtNameSplit.length-1]);
+                            }
+                            for (TMLRequest req : tmap.getTMLModeling().getRequests()) {
+                                String[] reqNameSplit = req.getName().split("__");
+                                req.setName(reqNameSplit[reqNameSplit.length-1]);
+                            }
+                        }
+                    } else {
+                        return Interpreter.TTOOL_NOT_STARTED;
+                    }
+                }
+
+                String[] commands = command.split(" ");
+                for (int i = 0; i < commands.length; i++) {
+                    List<String> argumentsOfOption = new ArrayList<String>();
+                    
+                    switch (commands[i]) {
+                        case "-n":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 1) {
+                                return Interpreter.BAD;
+                            }
+                            listPatterns = getFoldersName(patternsPath);
+                            if (listPatterns.contains(argumentsOfOption.get(0))) {
+                                selectedPatternName = argumentsOfOption.get(0);
+                                selectedPatternPath = patternsPath + selectedPatternName;
+                                patternTasksAll = TaskPattern.parsePatternJsonFile(selectedPatternPath, selectedPatternName+".json");
+                                portsTaskOfModelAll = TaskPorts.getListPortsTask(tmap.getTMLModeling());
+                                patternConfiguration = new PatternConfiguration();
+                                patternTasksLeft = null;
+                                portsTaskModelLeft = null;
+                                portsLeftToConfig = null;
+                                tasksLeftToMap = null;
+                                channelsLeftToMap = null;
+                            } else {
+                                //selectedPatternName = null;
+                                return PATTERN_NOT_EXIST;
+                            }
+                            break;
+                        case "-p":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 1) {
+                                return Interpreter.BAD;
+                            }
+                            File folderPattern = new File(argumentsOfOption.get(0));
+                            if (folderPattern.isDirectory()) {
+                                selectedPatternName = argumentsOfOption.get(0).split("/")[argumentsOfOption.get(0).split("/").length-1];
+                                selectedPatternName = selectedPatternName.split("\\.")[0];
+                                selectedPatternPath =  argumentsOfOption.get(0);
+                                if (!selectedPatternName.endsWith("/")) {
+                                    selectedPatternPath += "/";
+                                }
+                                patternTasksAll = TaskPattern.parsePatternJsonFile(selectedPatternPath, selectedPatternName+".json");
+                                portsTaskOfModelAll = TaskPorts.getListPortsTask(tmap.getTMLModeling());
+                                patternConfiguration = new PatternConfiguration();
+                                patternTasksLeft = null;
+                                portsTaskModelLeft = null;
+                                portsLeftToConfig = null;
+                                tasksLeftToMap = null;
+                                channelsLeftToMap = null;
+                            } else {
+                                //selectedPatternName = null;
+                                return PATTERN_NOT_EXIST;
+                            }
+                            break;
+                        case "-pal":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 0) {
+                                return Interpreter.BAD;
+                            }
+                            listPatterns = getFoldersName(patternsPath);
+                            interpreter.print("There is " + listPatterns.size() + " pattern(s):");
+                            int cont = 1;
+                            for (String pattern : listPatterns) {
+                                interpreter.print(cont + ". " + pattern);
+                                cont++;
+                            }
+                            break;
+                        case "-sp":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 0) {
+                                return Interpreter.BAD;
+                            }
+                            if (selectedPatternName != null) {
+                                interpreter.print("The selected pattern is " + selectedPatternName);
+                            } else {
+                                //selectedPatternName = null;
+                                return NO_PATTERN_SELECTED;
+                            }
+                            break;
+                        case "-ct":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 2) {
+                                return Interpreter.BAD;
+                            }
+                            if (selectedPatternName == null) {
+                                return NO_PATTERN_SELECTED;
+                            }
+                            String clonedTask = argumentsOfOption.get(0);
+                            String selectedTaskToClone = argumentsOfOption.get(1);
+                            if (allTasksOfModel.contains(clonedTask)) {
+                                return CLONE_TASK_EXIST;
+                            }
+
+                            if (PatternCloneTask.isAClonedTask(patternConfiguration.getClonedTasks(), clonedTask) != null) {
+                                return CLONE_TASK_EXIST;
+                            }
+                            
+                            if (!allTasksOfModel.contains(selectedTaskToClone)) {
+                                return TASK_TO_CLONE_NOT_EXIST;
+                            }
+                            
+                            PatternCloneTask patterClone = new PatternCloneTask(clonedTask, selectedTaskToClone);
+                            patternConfiguration.addClonedTasks(patterClone);
+                            portsTaskOfModelAll.put(clonedTask, TaskPorts.cloneTaskPort(portsTaskOfModelAll.get(selectedTaskToClone)));
+                            
+                            break;
+                        case "-ctr":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() == 0) {
+                                return Interpreter.BAD;
+                            }
+                            if (selectedPatternName == null) {
+                                return NO_PATTERN_SELECTED;
+                            }
+                            for (String argumentOfOption : argumentsOfOption) {
+                                PatternCloneTask patternCloneToRemove = PatternCloneTask.isAClonedTask(patternConfiguration.getClonedTasks(), argumentOfOption);
+                                
+                                if (patternCloneToRemove != null) {
+                                    patternConfiguration.removeClonedTask(patternCloneToRemove);
+                                    //portsTaskOfModelLeft.remove(patternCloneToRemove.getClonedTask());
+                                    portsTaskOfModelAll.remove(patternCloneToRemove.getClonedTask());
+                                    List<PatternConnection> patternConnectionsToRemove = new ArrayList<PatternConnection>();
+                                    for (PatternConnection patternConnection: patternConfiguration.getPortsConnection()) {
+                                        if (patternConnection.getModelTaskName().equals(patternCloneToRemove.getClonedTask())) {
+                                            patternConnectionsToRemove.add(patternConnection);
+                                        }
+                                    }
+                                    patternConfiguration.getPortsConnection().removeAll(patternConnectionsToRemove);
+                                    if (patternConnectionsToRemove != null) {
+                                        patternConfiguration.getTasksMapping().clear();
+                                        patternConfiguration.getChannelsMapping().clear();
+                                        patternConfiguration.getPortsConfig().clear();
+                                    }
+                                } else {
+                                    interpreter.print("The cloned task " + argumentOfOption + "does not exist, it will not be removed.");
+                                }
+                            }
+                            break;
+                        case "-ctl":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 0) {
+                                return Interpreter.BAD;
+                            }
+                            if (selectedPatternName == null) {
+                                return NO_PATTERN_SELECTED;
+                            }
+                            interpreter.print("The cloned tasks are:");
+                            for (PatternCloneTask cloneTask : patternConfiguration.getClonedTasks()) {
+                                interpreter.print(cloneTask.getStringDisplay());
+                            }
+                            break;
+                        case "-co":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() < 2 || argumentsOfOption.size() > 5) {
+                                return Interpreter.BAD;
+                            }
+                            if (selectedPatternName == null) {
+                                return NO_PATTERN_SELECTED;
+                            }
+                            String patternTask = null, patternPort = null, modelTask = null, modelPort =null;
+                            Boolean isNewPort = false;
+                            Boolean isConf = false;
+                            int auth = -1;
+                            for (int ind = 0; ind < argumentsOfOption.size(); ind++) {
+                                if (ind == 0) {
+                                    String[] taskPort = argumentsOfOption.get(ind).split("\\.");
+                                    if (taskPort.length == 2) {
+                                        patternTask = taskPort[0];
+                                        patternPort = taskPort[1];
+                                    } else {
+                                        return Interpreter.BAD;
+                                    }
+                                } else if (ind == 1) {
+                                    String[] taskPort = argumentsOfOption.get(ind).split("\\.");
+                                    if (taskPort.length == 2) {
+                                        modelTask = taskPort[0];
+                                        modelPort = taskPort[1];
+                                    } else {
+                                        return Interpreter.BAD;
+                                    }
+                                } else {
+                                    if (argumentsOfOption.get(ind).equals("NEW")) {
+                                        isNewPort = true;
+                                    } else if (argumentsOfOption.get(ind).equals("C")) {
+                                        isConf = true;
+                                    } else if (argumentsOfOption.get(ind).equals("WA")) {
+                                        auth = PatternChannelWithSecurity.WEAK_AUTHENTICITY;
+                                    } else if (argumentsOfOption.get(ind).equals("SA")) {
+                                        auth = PatternChannelWithSecurity.STRONG_AUTHENTICITY;
+                                    } else {
+                                        return Interpreter.BAD;
+                                    }
+                                }
+                            }
+                            patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection());
+                            portsTaskModelLeft = TaskPorts.getPortsTaskOfModelLeft(portsTaskOfModelAll, patternConfiguration.getPortsConnection());
+                            PortTaskJsonFile portPattern;
+                            if (patternTasksLeft.containsKey(patternTask)) {
+                                portPattern = patternTasksLeft.get(patternTask).getExternalPortByName(patternPort);
+                            } else {
+                                return PATTERN_TASK_NOT_EXIST;
+                            }
+                            if (portPattern == null) {
+                                return PATTERN_PORT_NOT_EXIST;
+                            }
+                            int portModelType;
+                            if (portsTaskModelLeft.containsKey(modelTask)) {
+                                portModelType = portsTaskModelLeft.get(modelTask).getPortTypeByName(modelPort);
+                            } else {
+                                return MODEL_TASK_NOT_EXIST;
+                            }
+                            if (portModelType == 0 && !isNewPort) {
+                                return MODEL_PORT_NOT_EXIST;
+                            }
+                            boolean samePortType = false;
+                            if (!isNewPort) {
+                                if (portPattern.getType().equals(PatternCreation.CHANNEL) && portPattern.getMode().equals(PatternCreation.MODE_INPUT) && portModelType == TaskPorts.WRITE_CHANNEL) {
+                                    samePortType = true;
+                                } else if (portPattern.getType().equals(PatternCreation.CHANNEL) && portPattern.getMode().equals(PatternCreation.MODE_OUTPUT) && portModelType == TaskPorts.READ_CHANNEL) {
+                                    samePortType = true;
+                                } else if (portPattern.getType().equals(PatternCreation.EVENT) && portPattern.getMode().equals(PatternCreation.MODE_INPUT) && portModelType == TaskPorts.SEND_EVENT) {
+                                    samePortType = true;
+                                } else if (portPattern.getType().equals(PatternCreation.EVENT) && portPattern.getMode().equals(PatternCreation.MODE_OUTPUT) && portModelType == TaskPorts.WAIT_EVENT) {
+                                    samePortType = true;
+                                } else {
+                                    return PORTS_TYPES_NOT_MATCH;
+                                }
+                            }
+                            
+                            if (samePortType || isNewPort) {
+                                if (isConf) {
+                                    portPattern.setConfidentiality(PatternCreation.WITH_CONFIDENTIALITY);
+                                }
+                                if (auth == PatternChannelWithSecurity.NO_AUTHENTICITY) {
+                                    portPattern.setAuthenticity(PatternCreation.WITHOUT_AUTHENTICITY);
+                                } else if (auth == PatternChannelWithSecurity.WEAK_AUTHENTICITY) {
+                                    portPattern.setAuthenticity(PatternCreation.WEAK_AUTHENTICITY);
+                                } else if (auth == PatternChannelWithSecurity.STRONG_AUTHENTICITY) {
+                                    portPattern.setAuthenticity(PatternCreation.STRONG_AUTHENTICITY);
+                                }
+                                PatternConnection patternConnection = new PatternConnection(patternTask, patternPort, modelTask, modelPort, isNewPort);
+                                patternConfiguration.addPortsConnection(patternConnection);
+                            }
+                            break;
+                        case "-plnc":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 0) {
+                                return Interpreter.BAD;
+                            }
+                            if (selectedPatternName == null) {
+                                return NO_PATTERN_SELECTED;
+                            }
+                            LinkedHashMap<String, TaskPattern> patternTasksLeftCur = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection());
+                            interpreter.print("The pattern's port that are still not connected:");
+                            for (String taskName : patternTasksLeftCur.keySet()) {
+                                for (PortTaskJsonFile portTask : patternTasksLeftCur.get(taskName).getExternalPorts()) {
+                                    interpreter.print(taskName + "." + portTask.getName());
+                                }
+                            }
+                            break;
+                        case "-cor":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() == 0) {
+                                return Interpreter.BAD;
+                            }
+                            if (selectedPatternName == null) {
+                                return NO_PATTERN_SELECTED;
+                            }
+                            List<PatternConnection> patternConnectionsToRemove = new ArrayList<PatternConnection>();
+                            for (String argumentOfOption : argumentsOfOption) {
+                                String patternTaskToRemove = null, patternPortToRemove = null;
+                                String[] taskPortToRemove = argumentOfOption.split("\\.");
+                                if (taskPortToRemove.length == 2) {
+                                    patternTaskToRemove = taskPortToRemove[0];
+                                    patternPortToRemove = taskPortToRemove[1];
+                                } else {
+                                    return Interpreter.BAD;
+                                }
+                                boolean taskPortExist = false;
+                                for (PatternConnection patternConnection : patternConfiguration.getPortsConnection()) {
+                                    if (patternConnection.getPatternTaskName().equals(patternTaskToRemove) && patternConnection.getPatternChannel().equals(patternPortToRemove)) {
+                                        patternConnectionsToRemove.add(patternConnection);
+                                        taskPortExist = true;
+                                        break;
+                                    }
+                                }
+                                if (!taskPortExist) {
+                                    interpreter.print(argumentOfOption + " does not exist, it will not be removed.");
+                                }
+                            }
+                            patternConfiguration.getPortsConnection().removeAll(patternConnectionsToRemove);
+                            if (patternConnectionsToRemove != null) {
+                                patternConfiguration.getTasksMapping().clear();
+                                patternConfiguration.getChannelsMapping().clear();
+                                patternConfiguration.getPortsConfig().clear();
+                            }
+                            break;
+                        case "-col":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 0) {
+                                return Interpreter.BAD;
+                            }
+                            if (selectedPatternName == null) {
+                                return NO_PATTERN_SELECTED;
+                            }
+                            interpreter.print("The connections made are:");
+                            for (PatternConnection patternConnection : patternConfiguration.getPortsConnection()) {
+                                interpreter.print(patternConnection.getStringDisplay());
+                            }
+                            break;
+                        case "-pl":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 1) {
+                                return Interpreter.BAD;
+                            }
+                            if (selectedPatternName == null) {
+                                return NO_PATTERN_SELECTED;
+                            }
+                            String patternTaskSelected = null, patternPortSelected = null;
+                            String[] taskPort = argumentsOfOption.get(0).split("\\.");
+                            if (taskPort.length == 2) {
+                                patternTaskSelected = taskPort[0];
+                                patternPortSelected = taskPort[1];
+                            } else {
+                                return Interpreter.BAD;
+                            }
+                            patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection());
+                            portsTaskModelLeft = TaskPorts.getPortsTaskOfModelLeft(portsTaskOfModelAll, patternConfiguration.getPortsConnection());
+                            PortTaskJsonFile portPatternSelected;
+                            if (patternTasksLeft.containsKey(patternTaskSelected)) {
+                                portPatternSelected = patternTasksLeft.get(patternTaskSelected).getExternalPortByName(patternPortSelected);
+                            } else {
+                                return PATTERN_TASK_NOT_EXIST;
+                            }
+                            if (portPatternSelected == null) {
+                                return PATTERN_PORT_NOT_EXIST;
+                            }
+                            interpreter.print("The available ports in model that could be used to connect with this port are :");
+                            for (String taskName : portsTaskModelLeft.keySet()) {
+                                if (portPatternSelected.getType().equals(PatternCreation.CHANNEL) && portPatternSelected.getMode().equals(PatternCreation.MODE_INPUT)) {
+                                    for (String wr : portsTaskModelLeft.get(taskName).getWriteChannels()) {
+                                        interpreter.print(taskName + "." + wr);
+                                    }
+                                } else if (portPatternSelected.getType().equals(PatternCreation.CHANNEL) && portPatternSelected.getMode().equals(PatternCreation.MODE_OUTPUT)) {
+                                    for (String wr : portsTaskModelLeft.get(taskName).getReadChannels()) {
+                                        interpreter.print(taskName + "." + wr);
+                                    }
+                                } else if (portPatternSelected.getType().equals(PatternCreation.EVENT) && portPatternSelected.getMode().equals(PatternCreation.MODE_INPUT)) {
+                                    for (String wr : portsTaskModelLeft.get(taskName).getSendEvents()) {
+                                        interpreter.print(taskName + "." + wr);
+                                    }
+                                } else if (portPatternSelected.getType().equals(PatternCreation.EVENT) && portPatternSelected.getMode().equals(PatternCreation.MODE_OUTPUT)) {
+                                    for (String wr : portsTaskModelLeft.get(taskName).getWaitEvents()) {
+                                        interpreter.print(taskName + "." + wr);
+                                    }
+                                }
+                            }
+                            break;
+                        case "-t":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 0) {
+                                return Interpreter.BAD;
+                            }
+                            
+                            interpreter.print("This model contains " + allTasksOfModel.size() + " task(s) :");
+                            String printTasks = "";
+                            for (int ind = 0; ind < allTasksOfModel.size(); ind++) {
+                                if (ind == 0) {
+                                    printTasks = (String) allTasksOfModel.toArray()[ind];
+                                } else {
+                                    printTasks = printTasks + "\t" + (String) allTasksOfModel.toArray()[ind];
+                                }
+                            }
+                            interpreter.print(printTasks);
+                            break;
+                        case "-b":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 0) {
+                                return Interpreter.BAD;
+                            }
+                            List<String> listBus = new ArrayList<String>();
+                            for (HwNode bus : tmap.getArch().getBUSs()) {
+                                listBus.add(bus.getName());
+                            }
+                            interpreter.print("This model contains " + listBus.size() + " bus(s) :");
+                            String printBuses = "";
+                            for (int ind = 0; ind < listBus.size(); ind++) {
+                                if (ind == 0) {
+                                    printBuses = listBus.get(ind);
+                                } else {
+                                    printBuses = printBuses + "\t" + listBus.get(ind);
+                                }
+                            }
+                            interpreter.print(printBuses);
+                            break;
+                        case "-cptl":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 0) {
+                                return Interpreter.BAD;
+                            }
+                            patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection());
+                            
+                            if (patternTasksLeft.keySet().size() != 0) {
+                                return PATTERN_NOT_CONNECTED;
+                            }
+
+                            portsTaskModelLeft = TaskPorts.getPortsTaskOfModelLeft(portsTaskOfModelAll, patternConfiguration.getPortsConnection());
+                            portsLeftToConfig = PatternPortsConfig.getPortsLeftToConfig(portsTaskOfModelAll, portsTaskModelLeft, patternConfiguration.getClonedTasksName(), patternConfiguration.getPortsConfig(), tmap.getTMLModeling());
+                            interpreter.print("The ports that need to be configured are :");
+                            for (PatternPortsConfig portToConfig : portsLeftToConfig) {
+                                interpreter.print(portToConfig.getTaskOfChannelToConfig() + "." + portToConfig.getChannelToConfig());
+                            }
+                            
+                            break;
+                        case "-cpd":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() == 0) {
+                                return Interpreter.BAD;
+                            }
+                            patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection());
+                            if (patternTasksLeft.keySet().size() != 0) {
+                                return PATTERN_NOT_CONNECTED;
+                            }
+                            for (String argumentOfOption : argumentsOfOption) {
+                                if (argumentOfOption.equals("ALL")) {
+                                    portsTaskModelLeft = TaskPorts.getPortsTaskOfModelLeft(portsTaskOfModelAll, patternConfiguration.getPortsConnection());
+                                    portsLeftToConfig = PatternPortsConfig.getPortsLeftToConfig(portsTaskOfModelAll, portsTaskModelLeft, patternConfiguration.getClonedTasksName(), patternConfiguration.getPortsConfig(), tmap.getTMLModeling());
+                                    for (PatternPortsConfig portConfig : portsLeftToConfig) {
+                                        portConfig.setIsChannelToRemove(true);
+                                        patternConfiguration.getPortsConfig().add(portConfig);
+                                    }
+                                } else {
+                                    String modelTaskToConfig = null, modelPortToConfig = null;
+                                    String[] taskPortToConfig = argumentOfOption.split("\\.");
+                                    if (taskPortToConfig.length == 2) {
+                                        modelTaskToConfig = taskPortToConfig[0];
+                                        modelPortToConfig = taskPortToConfig[1];
+                                        portsTaskModelLeft = TaskPorts.getPortsTaskOfModelLeft(portsTaskOfModelAll, patternConfiguration.getPortsConnection());
+                                        portsLeftToConfig = PatternPortsConfig.getPortsLeftToConfig(portsTaskOfModelAll, portsTaskModelLeft, patternConfiguration.getClonedTasksName(), patternConfiguration.getPortsConfig(), tmap.getTMLModeling());
+                                        boolean isConfigured = false;
+                                        for (PatternPortsConfig portConfig : portsLeftToConfig) {
+                                            if (portConfig.getTaskOfChannelToConfig().equals(modelTaskToConfig) && portConfig.getChannelToConfig().equals(modelPortToConfig)) {
+                                                portConfig.setIsChannelToRemove(true);
+                                                patternConfiguration.getPortsConfig().add(portConfig);
+                                                isConfigured = true;
+                                                break;
+                                            }
+                                        }
+                                        if (!isConfigured) {
+                                            return MODEL_PORT_CONFIG_NOT_EXIST;
+                                        }
+                                    } else {
+                                        return Interpreter.BAD;
+                                    }
+                                }
+                            }
+                            break;
+                        case "-cpm":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 2) {
+                                return Interpreter.BAD;
+                            }
+                            patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection());
+                            if (patternTasksLeft.keySet().size() != 0) {
+                                return PATTERN_NOT_CONNECTED;
+                            }
+                            PatternPortsConfig portToConfig = null;
+                            String modelTaskToConfig = null, modelPortToConfig = null;
+                            for (int ind = 0; ind < argumentsOfOption.size(); ind++) {
+                                if (ind == 0) {
+                                    String[] taskPortToConfig = argumentsOfOption.get(ind).split("\\.");
+                                    if (taskPortToConfig.length == 2) {
+                                        modelTaskToConfig = taskPortToConfig[0];
+                                        modelPortToConfig = taskPortToConfig[1];
+                                        portsTaskModelLeft = TaskPorts.getPortsTaskOfModelLeft(portsTaskOfModelAll, patternConfiguration.getPortsConnection());
+                                        portsLeftToConfig = PatternPortsConfig.getPortsLeftToConfig(portsTaskOfModelAll, portsTaskModelLeft, patternConfiguration.getClonedTasksName(), patternConfiguration.getPortsConfig(), tmap.getTMLModeling());
+                                        boolean isConfigured = false;
+                                        for (PatternPortsConfig portConfig : portsLeftToConfig) {
+                                            if (portConfig.getTaskOfChannelToConfig().equals(modelTaskToConfig) && portConfig.getChannelToConfig().equals(modelPortToConfig)) {
+                                                portToConfig = portConfig;
+                                                isConfigured = true;
+                                                break;
+                                            }
+                                        }
+                                        if (!isConfigured) {
+                                            return MODEL_PORT_CONFIG_NOT_EXIST;
+                                        }
+                                    } else {
+                                        return Interpreter.BAD;
+                                    }
+                                } else if (ind == 1) {
+                                    if (portToConfig != null) {
+                                        List<PatternPortsConfig> portsToConfig = PatternPortsConfig.getPortsToConfig(portsTaskOfModelAll, portsTaskModelLeft, patternConfiguration.getClonedTasksName(), tmap.getTMLModeling());
+                                        List<String> portsCanBeMergedWith = PatternPortsConfig.getPortsCanBeMergedWith(portsTaskOfModelAll, portsToConfig, modelTaskToConfig);
+                                        if (portsCanBeMergedWith.contains(argumentsOfOption.get(ind))) {
+                                            portToConfig.setMergeWith(argumentsOfOption.get(ind));
+                                            patternConfiguration.getPortsConfig().add(portToConfig);
+                                        } else {
+                                            return MODEL_PORT_MERGE_WITH_NOT_EXIST;
+                                        }
+                                    }
+                                }
+                            }
+                            break;
+                        case "-cpml":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 1) {
+                                return Interpreter.BAD;
+                            }
+                            patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection());
+                            if (patternTasksLeft.keySet().size() != 0) {
+                                return PATTERN_NOT_CONNECTED;
+                            }
+                            String[] taskPortToConfig = argumentsOfOption.get(0).split("\\.");
+                            if (taskPortToConfig.length == 2) {
+                                if (!portsTaskOfModelAll.containsKey(taskPortToConfig[0])) {
+                                    return TASK_NOT_EXIST;
+                                }
+                                portsTaskModelLeft = TaskPorts.getPortsTaskOfModelLeft(portsTaskOfModelAll, patternConfiguration.getPortsConnection());
+                                List<PatternPortsConfig> portsToConfig = PatternPortsConfig.getPortsToConfig(portsTaskOfModelAll, portsTaskModelLeft, patternConfiguration.getClonedTasksName(), tmap.getTMLModeling());
+                                List<String> portsCanBeMergedWith = PatternPortsConfig.getPortsCanBeMergedWith(portsTaskOfModelAll, portsToConfig, taskPortToConfig[0]);
+                                interpreter.print("List of ports that can be merge with " + taskPortToConfig[0] +"." + taskPortToConfig[1] +":");
+                                for (String portCanBeMergedWith : portsCanBeMergedWith) {
+                                    interpreter.print(portCanBeMergedWith);
+                                }
+                            } else {
+                                return Interpreter.BAD;
+                            }
+                            break;
+                        case "-cpr":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() == 0) {
+                                return Interpreter.BAD;
+                            }
+                            patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection());
+                            if (patternTasksLeft.keySet().size() != 0) {
+                                return PATTERN_NOT_CONNECTED;
+                            }
+                            List<PatternPortsConfig> patternPortsConfigToRemove = new ArrayList<PatternPortsConfig>();
+                            for (int ind = 0; ind < argumentsOfOption.size(); ind++) {
+                                String[] taskPortToRemove = argumentsOfOption.get(ind).split("\\.");
+                                if (taskPortToRemove.length == 2) {
+                                    boolean isPortConfigToRemoveExist = false;
+                                    for (PatternPortsConfig patternPortsConfig : patternConfiguration.getPortsConfig()) {
+                                        if (patternPortsConfig.getTaskOfChannelToConfig().equals(taskPortToRemove[0]) && patternPortsConfig.getChannelToConfig().equals(taskPortToRemove[1])) {
+                                            patternPortsConfigToRemove.add(patternPortsConfig);
+                                            isPortConfigToRemoveExist = true;
+                                            break;
+                                        }
+                                    }
+                                    if (!isPortConfigToRemoveExist) {
+                                        interpreter.print(argumentsOfOption.get(ind) + " does not exist, it will not be removed.");
+                                    }
+                                } else {
+                                    interpreter.print(argumentsOfOption.get(ind) + ": " + Interpreter.BAD);
+                                }
+                            }
+                            patternConfiguration.getPortsConfig().removeAll(patternPortsConfigToRemove);
+                            break;
+                        case "-cpl":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 0) {
+                                return Interpreter.BAD;
+                            }
+                            patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection());
+                            if (patternTasksLeft.keySet().size() != 0) {
+                                return PATTERN_NOT_CONNECTED;
+                            }
+                            interpreter.print("List of configured ports:");
+                            for (PatternPortsConfig patternPortsConfig : patternConfiguration.getPortsConfig()) {
+                                interpreter.print(patternPortsConfig.getStringDisplay());
+                            }
+                            break;
+                        case "-tctl":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 0) {
+                                return Interpreter.BAD;
+                            }
+                            patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection());
+                            if (patternTasksLeft.keySet().size() != 0) {
+                                return PATTERN_NOT_CONNECTED;
+                            }
+                            tasksLeftToMap = MappingPatternTask.getTasksLeftToMap(patternConfiguration.getTasksMapping(), MappingPatternTask.getTasksToMap(patternTasksAll, patternConfiguration.getClonedTasksName()));
+                            interpreter.print("The tasks that need to be mapped are :");
+                            for (MappingPatternTask taskMap : tasksLeftToMap) {
+                                interpreter.print(taskMap.getTaskToMapName());
+                            }
+                            break;
+                        case "-tcm":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 2) {
+                                return Interpreter.BAD;
+                            }
+                            patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection());
+                            if (patternTasksLeft.keySet().size() != 0) {
+                                return PATTERN_NOT_CONNECTED;
+                            }
+                            List<MappingPatternTask> allTasksToMap = MappingPatternTask.getTasksToMap(patternTasksAll, patternConfiguration.getClonedTasksName());
+                            tasksLeftToMap = MappingPatternTask.getTasksLeftToMap(patternConfiguration.getTasksMapping(), allTasksToMap);
+                            boolean taskToMapExist = false;
+                            MappingPatternTask taskToMap = null; 
+                            for (MappingPatternTask taskMap : tasksLeftToMap) {
+                                if (taskMap.getTaskToMapName().equals(argumentsOfOption.get(0))) {
+                                    taskToMap = taskMap;
+                                    taskToMapExist = true;
+                                    break;
+                                }
+                            }
+                            if (!taskToMapExist) {
+                                return TASK_TO_MAP_NOT_EXIST;
+                            }
+                            boolean taskSameHwExist = false;
+                            int originSameTask = 0;
+                            if (allTasksOfModel.contains(argumentsOfOption.get(1))) {
+                                taskSameHwExist = true;
+                                originSameTask = MappingPatternTask.ORIGIN_MODEL;
+                            }
+                            if (!taskSameHwExist) {
+                                for (MappingPatternTask taskMap : patternConfiguration.getTasksMapping()) {
+                                    if (taskMap.getTaskToMapName().equals(argumentsOfOption.get(1))) {
+                                        taskSameHwExist = true;
+                                        originSameTask = taskMap.getOrigin();
+                                        break;
+                                    }
+                                }
+                            }
+                            if (!taskSameHwExist) {
+                                return TASK_IN_SAME_HW_MAP_NOT_EXIST;
+                            }
+                            if (taskSameHwExist && taskToMapExist) {
+                                taskToMap.setSameHwAs(argumentsOfOption.get(1), originSameTask);
+                                patternConfiguration.getTasksMapping().add(taskToMap);
+                            }
+                            break;
+                        case "-tcml":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 0) {
+                                return Interpreter.BAD;
+                            }
+                            patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection());
+                            if (patternTasksLeft.keySet().size() != 0) {
+                                return PATTERN_NOT_CONNECTED;
+                            }
+                            interpreter.print("The list of tasks that can be used to map in same CPU:");
+                            for (String taskMap : allTasksOfModel) {
+                                interpreter.print(taskMap);
+                            }
+                            for (MappingPatternTask taskMap : patternConfiguration.getTasksMapping()) {
+                                interpreter.print(taskMap.getTaskToMapName());
+                            }
+                            break;
+                        case "-tcn":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 2) {
+                                return Interpreter.BAD;
+                            }
+                            patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection());
+                            if (patternTasksLeft.keySet().size() != 0) {
+                                return PATTERN_NOT_CONNECTED;
+                            }
+                            tasksLeftToMap = MappingPatternTask.getTasksLeftToMap(patternConfiguration.getTasksMapping(), MappingPatternTask.getTasksToMap(patternTasksAll, patternConfiguration.getClonedTasksName()));
+                            boolean taskToMapInNewCPUExist = false;
+                            MappingPatternTask taskToMapInNewCPU = null; 
+                            for (MappingPatternTask taskMap : tasksLeftToMap) {
+                                if (taskMap.getTaskToMapName().equals(argumentsOfOption.get(0))) {
+                                    taskToMapInNewCPU = taskMap;
+                                    taskToMapInNewCPUExist = true;
+                                    break;
+                                }
+                            }
+                            if (!taskToMapInNewCPUExist) {
+                                return TASK_TO_MAP_NOT_EXIST;
+                            }
+                            boolean busNewCPUExist = false;
+                            for (HwNode bus : tmap.getArch().getBUSs()) {
+                                if (bus.getName().equals(argumentsOfOption.get(1))) {
+                                    busNewCPUExist = true;
+                                    break;
+                                }
+                            }
+                            if (!busNewCPUExist) {
+                                return BUS_NOT_EXIST;
+                            }
+                            if (taskToMapInNewCPUExist && busNewCPUExist) {
+                                taskToMapInNewCPU.setBusNameForNewHw(argumentsOfOption.get(1));
+                                patternConfiguration.getTasksMapping().add(taskToMapInNewCPU);
+                            }
+                            break;
+                        case "-tcr":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() == 0) {
+                                return Interpreter.BAD;
+                            }
+                            patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection());
+                            if (patternTasksLeft.keySet().size() != 0) {
+                                return PATTERN_NOT_CONNECTED;
+                            }
+                            List<MappingPatternTask> mappingTasksToRemove = new ArrayList<MappingPatternTask>();
+                            boolean isMappingTaskToRemoveExist = false;
+                            for (int ind = 0; ind < argumentsOfOption.size(); ind++) {
+                                for (MappingPatternTask mappingTask : patternConfiguration.getTasksMapping()) {
+                                    if (mappingTask.getTaskToMapName().equals(argumentsOfOption.get(ind))) {
+                                        mappingTasksToRemove.add(mappingTask);
+                                        isMappingTaskToRemoveExist = true;
+                                        break;
+                                    }
+                                }
+                                if (!isMappingTaskToRemoveExist) {
+                                    interpreter.print(argumentsOfOption.get(ind) + " does not exist, it will not be removed.");
+                                }
+                            }
+                            patternConfiguration.getTasksMapping().removeAll(mappingTasksToRemove);
+                            break;
+                        case "-tcl":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 0) {
+                                return Interpreter.BAD;
+                            }
+                            patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection());
+                            if (patternTasksLeft.keySet().size() != 0) {
+                                return PATTERN_NOT_CONNECTED;
+                            }
+                            interpreter.print("list of mapped tasks:");
+                            for (MappingPatternTask mappingTask : patternConfiguration.getTasksMapping()) {
+                                interpreter.print(mappingTask.getStringDisplay());
+                            }
+                            break;
+                        case "-mctl":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 0) {
+                                return Interpreter.BAD;
+                            }
+                            patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection());
+                            if (patternTasksLeft.keySet().size() != 0) {
+                                return PATTERN_NOT_CONNECTED;
+                            }
+                            channelsLeftToMap = MappingPatternChannel.getChannelsLeftToMap(patternConfiguration.getChannelsMapping(), MappingPatternChannel.getChannelsToMap(patternConfiguration.getPortsConnection(), patternTasksAll,patternConfiguration.getClonedTasks()));
+                            interpreter.print("The channels that need to be mapped are :");
+                            for (MappingPatternChannel channelMap : channelsLeftToMap) {
+                                interpreter.print(channelMap.getTaskOfChannelToMap() + "." + channelMap.getChannelToMapName());
+                            }
+                            break;
+                        case "-mcm":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 2) {
+                                return Interpreter.BAD;
+                            }
+                            patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection());
+                            if (patternTasksLeft.keySet().size() != 0) {
+                                return PATTERN_NOT_CONNECTED;
+                            }
+                            String[] channelTaskToMap = argumentsOfOption.get(0).split("\\.");
+                            if (channelTaskToMap.length != 2) {
+                                return argumentsOfOption.get(0) + ": " + Interpreter.BAD;
+                            }
+                            String[] channelTaskSameMem = argumentsOfOption.get(1).split("\\.");
+                            if (channelTaskSameMem.length != 2) {
+                                return argumentsOfOption.get(1) + ": " + Interpreter.BAD;
+                            }
+                            List<MappingPatternChannel> allChannelsToMap = MappingPatternChannel.getChannelsToMap(patternConfiguration.getPortsConnection(), patternTasksAll,patternConfiguration.getClonedTasks());
+                            channelsLeftToMap = MappingPatternChannel.getChannelsLeftToMap(patternConfiguration.getChannelsMapping(), allChannelsToMap);
+                            boolean channelToMapExist = false;
+                            MappingPatternChannel channelToMap = null; 
+                            for (MappingPatternChannel channelMap : channelsLeftToMap) {
+                                if (channelMap.getTaskOfChannelToMap().equals(channelTaskToMap[0]) && channelMap.getChannelToMapName().equals(channelTaskToMap[1])) {
+                                    channelToMap = channelMap;
+                                    channelToMapExist = true;
+                                    break;
+                                }
+                            }
+                            if (!channelToMapExist) {
+                                return CHANNEL_TO_MAP_NOT_EXIST;
+                            }
+                            boolean channelSameHwExist = false;
+                            int originSameChannel = 0;
+                            for(String st : portsTaskOfModelAll.keySet()) {
+                                if (!patternConfiguration.getClonedTasksName().contains(st)) {
+                                    for (String wc : portsTaskOfModelAll.get(st).getWriteChannels()) {
+                                        if (st.equals(channelTaskSameMem[0]) && wc.equals(channelTaskSameMem[1])) {
+                                            originSameChannel = MappingPatternTask.ORIGIN_MODEL;
+                                            channelSameHwExist = true;
+                                        } 
+                                    }
+                                }
+                            }
+                            if (!channelSameHwExist) {
+                                for (MappingPatternChannel channelMap : patternConfiguration.getChannelsMapping()) {
+                                    if (channelMap.getTaskOfChannelToMap().equals(channelTaskSameMem[0]) && channelMap.getChannelToMapName().equals(channelTaskSameMem[1])) {
+                                        channelSameHwExist = true;
+                                        originSameChannel = channelMap.getOrigin();
+                                        break;
+                                    }
+                                }
+                            }
+                            if (!channelSameHwExist) {
+                                return CHANNEL_IN_SAME_MEM_MAP_NOT_EXIST;
+                            }
+                            if (channelSameHwExist && channelToMapExist) {
+                                channelToMap.setTaskAndChannelInSameMem(channelTaskSameMem[0], channelTaskSameMem[1], originSameChannel);
+                                patternConfiguration.getChannelsMapping().add(channelToMap);
+                            }
+                            break;
+                        case "-mcml":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 0) {
+                                return Interpreter.BAD;
+                            }
+                            patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection());
+                            if (patternTasksLeft.keySet().size() != 0) {
+                                return PATTERN_NOT_CONNECTED;
+                            }
+                            interpreter.print("The list of channels that can be used to map in same memory:");
+                            for(String st : portsTaskOfModelAll.keySet()) {
+                                if (!patternConfiguration.getClonedTasksName().contains(st)) {
+                                    for (String wc : portsTaskOfModelAll.get(st).getWriteChannels()) {
+                                        interpreter.print(st + "." + wc);
+                                    }
+                                }
+                            }
+                            for (MappingPatternChannel channelMap : patternConfiguration.getChannelsMapping()) {
+                                interpreter.print(channelMap.getTaskOfChannelToMap() + "." + channelMap.getChannelToMapName());
+                            }
+                            break;
+                        case "-mcn":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 2) {
+                                return Interpreter.BAD;
+                            }
+                            patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection());
+                            if (patternTasksLeft.keySet().size() != 0) {
+                                return PATTERN_NOT_CONNECTED;
+                            }
+                            String[] channelTaskToMapNew = argumentsOfOption.get(0).split("\\.");
+                            if (channelTaskToMapNew.length != 2) {
+                                return argumentsOfOption.get(0) + ": " + Interpreter.BAD;
+                            }
+                            channelsLeftToMap = MappingPatternChannel.getChannelsLeftToMap(patternConfiguration.getChannelsMapping(), MappingPatternChannel.getChannelsToMap(patternConfiguration.getPortsConnection(), patternTasksAll,patternConfiguration.getClonedTasks()));
+                            boolean channelToMapInNewMemExist = false;
+                            MappingPatternChannel channelToMapInNewMem = null; 
+                            for (MappingPatternChannel channelMap : channelsLeftToMap) {
+                                if (channelMap.getTaskOfChannelToMap().equals(channelTaskToMapNew[0]) && channelMap.getChannelToMapName().equals(channelTaskToMapNew[1])) {
+                                    channelToMapInNewMem = channelMap;
+                                    channelToMapInNewMemExist = true;
+                                    break;
+                                }
+                            }
+                            if (!channelToMapInNewMemExist) {
+                                return CHANNEL_TO_MAP_NOT_EXIST;
+                            }
+                            boolean busNewMemExist = false;
+                            for (HwNode bus : tmap.getArch().getBUSs()) {
+                                if (bus.getName().equals(argumentsOfOption.get(1))) {
+                                    busNewMemExist = true;
+                                    break;
+                                }
+                            }
+                            if (!busNewMemExist) {
+                                return BUS_NOT_EXIST;
+                            }
+                            if (channelToMapInNewMemExist && busNewMemExist) {
+                                channelToMapInNewMem.setBusNameForNewMem(argumentsOfOption.get(1));
+                                patternConfiguration.getChannelsMapping().add(channelToMapInNewMem);
+                            }
+                            break;
+                        case "-mcr":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() == 0) {
+                                return Interpreter.BAD;
+                            }
+                            patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection());
+                            if (patternTasksLeft.keySet().size() != 0) {
+                                return PATTERN_NOT_CONNECTED;
+                            }
+                            List<MappingPatternChannel> mappingChannelsToRemove = new ArrayList<MappingPatternChannel>();
+                            boolean isMappingChannelToRemoveExist = false;
+                            for (int ind = 0; ind < argumentsOfOption.size(); ind++) {
+                                String[] channelTaskToRem = argumentsOfOption.get(ind).split("\\.");
+                                if (channelTaskToRem.length != 2) {
+                                    interpreter.print(argumentsOfOption.get(ind) + ": " + Interpreter.BAD);
+                                    break;
+                                }
+                                for (MappingPatternChannel mappingChannel : patternConfiguration.getChannelsMapping()) {
+                                    if (mappingChannel.getTaskOfChannelToMap().equals(channelTaskToRem[0]) && mappingChannel.getChannelToMapName().equals(channelTaskToRem[1])) {
+                                        mappingChannelsToRemove.add(mappingChannel);
+                                        isMappingChannelToRemoveExist = true;
+                                        break;
+                                    }
+                                }
+                                if (!isMappingChannelToRemoveExist) {
+                                    interpreter.print(argumentsOfOption.get(ind) + " does not exist, it will not be removed.");
+                                }
+                            }
+                            patternConfiguration.getChannelsMapping().removeAll(mappingChannelsToRemove);
+                            break;
+                        case "-mcl":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 0) {
+                                return Interpreter.BAD;
+                            }
+                            patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection());
+                            if (patternTasksLeft.keySet().size() != 0) {
+                                return PATTERN_NOT_CONNECTED;
+                            }
+                            interpreter.print("list of mapped channels:");
+                            for (MappingPatternChannel mappedChannel : patternConfiguration.getChannelsMapping()) {
+                                interpreter.print(mappedChannel.getStringDisplay());
+                            }
+                            break;
+                        case "-ua":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 3) {
+                                return Interpreter.BAD;
+                            }
+                            String task = argumentsOfOption.get(0);
+                            String attribute = argumentsOfOption.get(1);
+                            String value = argumentsOfOption.get(2);
+                            
+                            boolean isTaskExist = false;
+                            boolean isAttributeExist = false;
+                            boolean isUpdated = false;
+                            AttributeTaskJsonFile attributeTask = null;
+                            for (String taskPattern : patternTasksAll.keySet()) {
+                                if (taskPattern.equals(task)) {
+                                    isTaskExist = true;
+                                    for (AttributeTaskJsonFile attributeTaskJsonFile : patternTasksAll.get(taskPattern).getAttributes()) {
+                                        if (attributeTaskJsonFile.getName().equals(attribute)) {
+                                            isAttributeExist = true;
+                                            if (value.matches("-?\\d+") || value.matches("(?i)^(true|false)")) {
+                                                attributeTaskJsonFile.setValue(value);
+                                                attributeTask = attributeTaskJsonFile;
+                                                isUpdated = true;
+                                                break;
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                            if (!isTaskExist) {
+                                return TASK_NOT_EXIST;
+                            }
+                            if (!isAttributeExist) {
+                                return ATTRIBUTE_NOT_EXIST;
+                            }
+                            if (!isUpdated) {
+                                return VALUE_BAD;
+                            }
+                            if (patternConfiguration.getUpdatedPatternAttributes().get(task) != null) {
+                                patternConfiguration.getUpdatedPatternAttributes().get(task).add(attributeTask);
+                            } else {
+                                List<AttributeTaskJsonFile> attributesTask = new ArrayList<AttributeTaskJsonFile>();
+                                attributesTask.add(attributeTask);
+                                patternConfiguration.getUpdatedPatternAttributes().put(task, attributesTask);
+                            }
+                            break;
+                        case "-m":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() > 1) {
+                                return Interpreter.BAD;
+                            }
+                            patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection());
+                            if (patternTasksLeft.keySet().size() > 1) {
+                                return PATTERN_NOT_CONNECTED;
+                            }
+                            portsTaskModelLeft = TaskPorts.getPortsTaskOfModelLeft(portsTaskOfModelAll, patternConfiguration.getPortsConnection());
+                            portsLeftToConfig = PatternPortsConfig.getPortsLeftToConfig(portsTaskOfModelAll, portsTaskModelLeft, patternConfiguration.getClonedTasksName(), patternConfiguration.getPortsConfig(), tmap.getTMLModeling());
+                            if (portsLeftToConfig.size() != 0) {
+                                return PORT_CONFIGURATION_NOT_FINISHED;
+                            }
+                            if (argumentsOfOption.size() == 0) {
+                                if (selectedPatternName != null && !selectedPatternName.equals("")) {
+                                    patternConfiguration.loadChannelsWithSecurity(patternTasksAll);
+                                    GTURTLEModeling.createJsonPatternConfigFile(selectedPatternPath, selectedPatternName, patternConfiguration);
+                                } else {
+                                    return NO_NAME_NO_TASK_FOR_PATTERN;
+                                }
+                            } else if (argumentsOfOption.size() == 1) {
+                                patternConfiguration.loadChannelsWithSecurity(patternTasksAll);
+                                GTURTLEModeling.createJsonPatternConfigFile(argumentsOfOption.get(0), patternConfiguration);
+                            }
+                            break;
+                        default:
+                            return Interpreter.BAD;
+                    }
+                }
+                return null;
+            }
+        };
+
+
+        // Diplodocus load TMAP
+        Command diplodocusLoadTMAP = new Command() {
+            public String getCommand() {
+                return DIPLO_LOAD_TMAP;
+            }
+
+            public String getShortCommand() {
+                return "dltmap";
+            }
+
+            public String getDescription() {
+                return "Load a TMAP specification";
+            }
+
+            public String getUsage() {
+                return "[PATH]\n"
+                + "[PATH]\tLoad a Textual TMAP specification\n"
+                + "\tLoad a TMAP specification from the current panel\n";
+            }
+
+            public String executeCommand(String command, Interpreter interpreter) {
+                /*if (!interpreter.isTToolStarted()) {
+                    return Interpreter.TTOOL_NOT_STARTED;
+                }*/
+
+                String[] commands = command.split(" ");
+                if (commands.length > 1) {
+                    return Interpreter.BAD;
+                }
+                if (commands.length == 1 && commands[0] != "") {
+                    String tmlFileName = commands[0].split("/")[commands[0].split("/").length-1];
+                    String tmlFilePath = commands[0].substring(0, commands[0].lastIndexOf("/")+1);
+                    TMLMappingTextSpecification<Class<?>>  ts = new TMLMappingTextSpecification<Class<?>>(tmlFileName);
+                    File f = new File(commands[0]);
+                    String spec = null;
+                    try {
+                        spec = FileUtils.loadFileData(f);
+                    } catch (Exception e) {
+                        System.out.println("Exception loading " + tmlFileName);
+                    }
+                    boolean parsed = ts.makeTMLMapping(spec, tmlFilePath);
+                    tmap = ts.getTMLMapping();
+                    // Checking syntax
+                    TMLSyntaxChecking syntax = new TMLSyntaxChecking(tmap);
+                    syntax.checkSyntax();
+                    nullifyAll();
+                } else {
+                    if (interpreter.mgui != null) {
+                        TURTLEPanel tp = interpreter.mgui.getCurrentTURTLEPanel();
+                        if (!(tp instanceof TMLArchiPanel)) {
+                            return "Current diagram is invalid for formal verification";
+                        }
+                        if(!interpreter.mgui.checkModelingSyntax(tp, true)) {
+                            return SYNTAX_ERROR;
+                        }
+
+                        tmap = interpreter.mgui.gtm.getTMLMapping();
+                        nullifyAll();
+                        if (tmap == null) {
+                            return "Fail to load TMAP specification"; 
+                        }
+                    } else {
+                        return Interpreter.TTOOL_NOT_STARTED;
+                    }
+                }
+                
+                for (TMLTask task : tmap.getTMLModeling().getTasks()) {
+                    String[] taskNameSplit = task.getName().split("__");
+                    allTasksOfModel.add(taskNameSplit[taskNameSplit.length-1]);
+                    if (taskNameSplit.length > 1) {
+                        tabName = taskNameSplit[0];
+                    } 
+                    task.setName(taskNameSplit[taskNameSplit.length-1]);
+                }
+                for (TMLChannel ch : tmap.getTMLModeling().getChannels()) {
+                    String[] chNameSplit = ch.getName().split("__");
+                    ch.setName(chNameSplit[chNameSplit.length-1]);
+                }
+                for (TMLEvent evt : tmap.getTMLModeling().getEvents()) {
+                    String[] evtNameSplit = evt.getName().split("__");
+                    evt.setName(evtNameSplit[evtNameSplit.length-1]);
+                }
+                for (TMLRequest req : tmap.getTMLModeling().getRequests()) {
+                    String[] reqNameSplit = req.getName().split("__");
+                    req.setName(reqNameSplit[reqNameSplit.length-1]);
+                }
+
+                return null;
+            }
+        };
+
+        Command integratePattern = new Command() {
+            final String [] options = {"-l", "-n", "-p", "-pc", "-g", "-d"};
+            public String getCommand() {
+                return INTEGRATE;
+            }
+
+            public String getShortCommand() {
+                return "a";
+            }
+
+            public String getDescription() {
+                return "Inegrate a pattern to a model by giving a name to the pattern and the path of the configuration file";
+            }
+
+            public String getUsage() {
+                return "[OPTION]... [NAME] [PATH]\n"
+                + "-l NAME\tlist of available patterns\n"
+                + "-n NAME\tselect a pattern by its name\n"
+                + "-p PATH\tselect a pattern by the path of its folder\n"
+                + "-pc PATH\tpath of the configuration json file\n"
+                + "-g [PATH] [NAME]\tgenerate TMAP file of the model after intergrating the pattern, you can optionally specify the path of this new tmap file and its name\n"
+                + "-d \tdraw the new model after integrating the pattern\n";
+            }
+            
+            @SuppressWarnings("unchecked")
+            public String executeCommand(String command, Interpreter interpreter) {
+                /*if (!interpreter.isTToolStarted()) {
+                    return Interpreter.TTOOL_NOT_STARTED;
+                }*/
+                
+                if (tmap == null) {
+                    if (interpreter.mgui != null) {
+                        TURTLEPanel tp = interpreter.mgui.getCurrentTURTLEPanel();
+                        if (!(tp instanceof TMLArchiPanel)) {
+                            return "Current panel does not contain TMAP (NB: you can load a textual TMAP Spec using " + DIPLO_LOAD_TMAP +" or move to Arch panel.)";
+                        }
+                        if(!interpreter.mgui.checkModelingSyntax(tp, true)) {
+                            return SYNTAX_ERROR + "in current panel (NB: you can load a textual TMAP Spec using " + DIPLO_LOAD_TMAP +")";
+                        }
+                        tmap = interpreter.mgui.gtm.getTMLMapping();
+                        nullifyAll();
+                        if (tmap == null) {
+                            return Interpreter.TMAP_NO_SPEC + "\nLoad a textual TMAP Spec using " + DIPLO_LOAD_TMAP + " command or move to Arch panel.";
+                        } else {
+                            for (TMLTask task : tmap.getTMLModeling().getTasks()) {
+                                String[] taskNameSplit = task.getName().split("__");
+                                allTasksOfModel.add(taskNameSplit[taskNameSplit.length-1]);
+                                if (taskNameSplit.length > 1) {
+                                    tabName = taskNameSplit[0];
+                                } 
+                                task.setName(taskNameSplit[taskNameSplit.length-1]);
+                            }
+                            for (TMLChannel ch : tmap.getTMLModeling().getChannels()) {
+                                String[] chNameSplit = ch.getName().split("__");
+                                ch.setName(chNameSplit[chNameSplit.length-1]);
+                            }
+                            for (TMLEvent evt : tmap.getTMLModeling().getEvents()) {
+                                String[] evtNameSplit = evt.getName().split("__");
+                                evt.setName(evtNameSplit[evtNameSplit.length-1]);
+                            }
+                            for (TMLRequest req : tmap.getTMLModeling().getRequests()) {
+                                String[] reqNameSplit = req.getName().split("__");
+                                req.setName(reqNameSplit[reqNameSplit.length-1]);
+                            }
+                        }
+                    } else {
+                        return Interpreter.TTOOL_NOT_STARTED;
+                    }
+                }
+                String[] commands = command.split(" ");
+                for (int i = 0; i < commands.length; i++) {
+                    List<String> argumentsOfOption = new ArrayList<String>();
+                    switch (commands[i]) {
+                        case "-l":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 0) {
+                                return Interpreter.BAD;
+                            }
+                            listPatterns = getFoldersName(patternsPath);
+                            interpreter.print("There is " + listPatterns.size() + " pattern(s):");
+                            int cont = 1;
+                            for (String pattern : listPatterns) {
+                                interpreter.print(cont + ". " + pattern);
+                                cont++;
+                            }
+                            break;
+                        case "-n":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 1) {
+                                return Interpreter.BAD;
+                            }
+                            listPatterns = getFoldersName(patternsPath);
+                            if (listPatterns.contains(argumentsOfOption.get(0))) {
+                                selectedPatternToIntergrate = argumentsOfOption.get(0);
+                                selectedPatternPathToIntergrate = patternsPath + selectedPatternToIntergrate + "/";
+                            } else {
+                                return PATTERN_NOT_EXIST;
+                            }
+                            break;
+                        case "-p":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 1) {
+                                return Interpreter.BAD;
+                            }
+                            File folderPattern = new File(argumentsOfOption.get(0));
+                            if (folderPattern.isDirectory()) {
+                                selectedPatternToIntergrate = argumentsOfOption.get(0).split("/")[argumentsOfOption.get(0).split("/").length-1];
+                                selectedPatternPathToIntergrate = argumentsOfOption.get(0);
+                                if (!selectedPatternPathToIntergrate.endsWith("/")) {
+                                    selectedPatternPathToIntergrate += "/";
+                                }
+                            } else {
+                                return PATTERN_NOT_EXIST;
+                            }
+
+                            break;
+                        case "-pc":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 1) {
+                                return Interpreter.BAD;
+                            }
+                            Path path = Paths.get(argumentsOfOption.get(0));
+                            if (Files.exists(path)) {
+                                selectedJsonFilePath = argumentsOfOption.get(0);
+                            } else {
+                                return CONFIG_JSON_FILE_NOT_EXIST;
+                            }
+                            break;
+                        case "-g":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 0 && argumentsOfOption.size() != 2) {
+                                return Interpreter.BAD;
+                            }
+                            if (selectedJsonFilePath != null && selectedPatternToIntergrate != null) {
+                                TMLMapping<?> tmapGen = GTURTLEModeling.integratePatternTMAP(tabName, selectedPatternPathToIntergrate, selectedPatternToIntergrate, selectedJsonFilePath, tmap);
+                                if (tabName != "") {
+                                    for (TMLTask task : tmap.getTMLModeling().getTasks()) {
+                                        String[] taskNameSplit = task.getName().split("__");
+                                        if (taskNameSplit.length == 1) {
+                                            task.setName(tabName + "__" + task.getName());
+                                        }
+                                    }
+                                    for (TMLChannel ch : tmap.getTMLModeling().getChannels()) {
+                                        String[] channelNameSplit = ch.getName().split("__");
+                                        if (channelNameSplit.length == 1) {
+                                            ch.setName(tabName + "__" + ch.getName());
+                                        }
+                                    }
+                                    for (TMLEvent evt : tmap.getTMLModeling().getEvents()) {
+                                        String[] eventNameSplit = evt.getName().split("__");
+                                        if (eventNameSplit.length == 1) {
+                                            evt.setName(tabName + "__" + evt.getName());
+                                        }
+                                    }
+                                    for (TMLRequest req : tmap.getTMLModeling().getRequests()) {
+                                        String[] requestNameSplit = req.getName().split("__");
+                                        if (requestNameSplit.length == 1) {
+                                            req.setName(tabName + "__" + req.getName());
+                                        }
+                                    }
+                                }
+                                TMLMappingTextSpecification<Class<?>> spec = new TMLMappingTextSpecification<Class<?>>(selectedPatternToIntergrate);
+                                spec.toTextFormat((TMLMapping<Class<?>>) tmapGen);
+                                if (argumentsOfOption.size() == 0) {
+                                    String folderGenTmap = selectedJsonFilePath.substring(0, selectedJsonFilePath.lastIndexOf("/"));
+                                    if (!folderGenTmap.endsWith("/")) {
+                                        folderGenTmap += "/";
+                                    }
+                                    try {
+                                        Files.createDirectories(Paths.get(folderGenTmap));
+                                        spec.saveFile(folderGenTmap, "spec");
+                                    } catch (Exception e) {
+                                        return "Files could not be saved: " + e.getMessage();
+                                    }
+                                } else if (argumentsOfOption.size() == 2) {
+                                    String folderGenTmap = argumentsOfOption.get(0);
+                                    String nameGenTmap = argumentsOfOption.get(1);
+                                    if (!folderGenTmap.endsWith("/")) {
+                                        folderGenTmap += "/";
+                                    }
+                                    try {
+                                        Files.createDirectories(Paths.get(folderGenTmap));
+                                        spec.saveFile(folderGenTmap, nameGenTmap);
+                                    } catch (Exception e) {
+                                        return "Files could not be saved: " + e.getMessage();
+                                    }
+                                }
+                            } else {
+                                return CONFIG_JSON_FILE_MISSING;
+                            }
+                            break;
+                        case "-d":
+                            while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) {
+                                argumentsOfOption.add(commands[i+1]);
+                                i += 1;
+                            }
+                            if (argumentsOfOption.size() != 0) {
+                                return Interpreter.BAD;
+                            }
+                            if (interpreter.mgui != null) {
+                                if (selectedJsonFilePath != null && selectedPatternToIntergrate != null) {
+                                    interpreter.mgui.gtm.integratePattern(interpreter.mgui, selectedPatternPathToIntergrate, selectedPatternToIntergrate, selectedJsonFilePath);
+                                } else {
+                                    return CONFIG_JSON_FILE_MISSING;
+                                }
+                            } else {
+                                return Interpreter.TTOOL_NOT_STARTED;
+                            }
+                            break;
+                        default:
+                            return Interpreter.BAD;
+                    }
+                }
+                return null;
+            }
+        };
+        addAndSortSubcommand(createPattern);
+        addAndSortSubcommand(configurePattern);
+        addAndSortSubcommand(integratePattern);
+        addAndSortSubcommand(diplodocusLoadTMAP);
+    }
+
+    Vector<String> getFoldersName(String path) {
+        Vector<String> folders = new Vector<String>();
+        File directoryPath = new File(path);
+        String[] directories = directoryPath.list((dir, name) -> new File(dir, name).isDirectory());
+        if (directories != null) {
+            folders = new Vector<String>(Arrays.asList(directories));
+        }
+        return folders;
+    }
+
+    private void nullifyAll() {
+        selectedTasks.clear();
+        patternName = null;
+        allTasksOfModel.clear();
+        listPatterns.clear();
+        selectedPatternPath = null;
+        selectedPatternName = null;
+        patternConfiguration = new PatternConfiguration();
+        patternTasksAll = null; 
+        patternTasksLeft = null;
+        portsTaskOfModelAll = null;
+        portsTaskModelLeft = null;
+        portsLeftToConfig = null;
+        tasksLeftToMap = null;
+        channelsLeftToMap = null;
+        selectedPatternToIntergrate = null;
+        selectedJsonFilePath = null;
+    }
+}
diff --git a/src/main/java/tmltranslator/SecurityPattern.java b/src/main/java/tmltranslator/SecurityPattern.java
index 455effc131e5ece6ece78e08f310aa450a5ec761..fa09f6f09c23c5e42c4d394c57b3fec910d60aac 100644
--- a/src/main/java/tmltranslator/SecurityPattern.java
+++ b/src/main/java/tmltranslator/SecurityPattern.java
@@ -123,6 +123,7 @@ public class SecurityPattern {
         this.size = secPattern.size;
         this.decTime = secPattern.decTime;
         this.encTime = secPattern.encTime;
+        this.originTask = secPattern.originTask;
     }
 
     public String toXML() {
diff --git a/src/main/java/tmltranslator/TMLActivityElementChannel.java b/src/main/java/tmltranslator/TMLActivityElementChannel.java
index b7aa2f39b817d53dbf2f84b6b0f7745988712acc..bc0f37b20fa65445d68d0f97e8ce5c14c230cbe1 100755
--- a/src/main/java/tmltranslator/TMLActivityElementChannel.java
+++ b/src/main/java/tmltranslator/TMLActivityElementChannel.java
@@ -56,7 +56,7 @@ public abstract class TMLActivityElementChannel extends TMLActivityElement {
     protected ArrayList<TMLChannel> channels;
     protected String nbOfSamples;
     private boolean isAttacker;
-    protected boolean isEncForm; //If the Cryptographic
+    // protected boolean isEncForm; //If the Cryptographic
 
     public TMLActivityElementChannel(String _name, Object _referenceObject) {
         super(_name, _referenceObject);
@@ -96,13 +96,13 @@ public abstract class TMLActivityElementChannel extends TMLActivityElement {
         return nbOfSamples;
     }
 
-    public boolean getEncForm() {
+    /* public boolean getEncForm() {
         return isEncForm;
     }
 
     public void setEncForm(boolean form) {
         isEncForm = form;
-    }
+    } */
 
     public void replaceChannelWith(TMLChannel oldChan, TMLChannel newChan) {
         if (channels.contains(oldChan)) {
@@ -130,8 +130,8 @@ public abstract class TMLActivityElementChannel extends TMLActivityElement {
         if (!super.equalSpec(o)) return false;
         TMLActivityElementChannel tmlActEltChannel = (TMLActivityElementChannel) o;
         return Objects.equals(nbOfSamples, ((TMLActivityElementChannel) o).getNbOfSamples()) &&
-                isAttacker == tmlActEltChannel.isAttacker() &&
-                isEncForm == tmlActEltChannel.getEncForm();
+                isAttacker == tmlActEltChannel.isAttacker()/*  &&
+                isEncForm == tmlActEltChannel.getEncForm() */;
 
     }
 
@@ -139,7 +139,7 @@ public abstract class TMLActivityElementChannel extends TMLActivityElement {
         super.fillValues(newElt, tmlm);
         newElt.setNbOfSamples(getNbOfSamples());
         newElt.setAttacker(isAttacker);
-        newElt.setEncForm(getEncForm());
+        // newElt.setEncForm(getEncForm());
 
         for(TMLChannel channel: channels) {
             TMLChannel ch = tmlm.getChannelByName(channel.getName());
diff --git a/src/main/java/tmltranslator/TMLChannel.java b/src/main/java/tmltranslator/TMLChannel.java
index ee65c51c20fb5f32bf20693e6f64ba081feadc70..8966cacd008d338429e699d9900e2bbfa23a8499 100755
--- a/src/main/java/tmltranslator/TMLChannel.java
+++ b/src/main/java/tmltranslator/TMLChannel.java
@@ -80,6 +80,11 @@ public class TMLChannel extends TMLCommunicationElement {
     private String SP = " ";
     private int priority;
     private int vc = 0;
+
+    //Security
+    private boolean ensureConf; // Ensure the confidentiality for this channel
+    private boolean ensureWeakAuth; // Ensure the weak authenticity for this channel
+    private boolean ensureStrongAuth; // Ensure the strong authenticity for this channel
     //A reference to the original origin and destination tasks
 
 
@@ -199,6 +204,29 @@ public class TMLChannel extends TMLCommunicationElement {
         return vc;
     }
 
+    public boolean isEnsureConf() {
+        return ensureConf;
+    }
+
+    public boolean isEnsureWeakAuth() {
+        return ensureWeakAuth;
+    }
+    public boolean isEnsureStrongAuth() {
+        return ensureStrongAuth;
+    }
+
+    public void setEnsureConf(boolean _ensureConf) {
+        ensureConf = _ensureConf;
+    }
+
+    public void setEnsureWeakAuth(boolean _ensureWeakAuth) {
+        ensureWeakAuth = _ensureWeakAuth;
+    }
+
+    public void setEnsureStrongAuth(boolean _ensureStrongAuth) {
+        ensureStrongAuth = _ensureStrongAuth;
+    }
+
     public void setVC(int vc) {
         TraceManager.addDev("Setting VC to " + vc + " for channel " + getName());
         this.vc = vc;
@@ -653,6 +681,9 @@ public class TMLChannel extends TMLCommunicationElement {
 
         boolean ret =  checkConf == channel.checkConf &&
                 checkAuth == channel.checkAuth &&
+                ensureConf == channel.ensureConf &&
+                ensureWeakAuth == channel.ensureWeakAuth &&
+                ensureStrongAuth == channel.ensureStrongAuth &&
                 size == channel.size &&
                 type == channel.type &&
                 max == channel.max &&
@@ -728,6 +759,9 @@ public class TMLChannel extends TMLCommunicationElement {
         TMLChannel newC = new TMLChannel(getName(), getReferenceObject());
         newC.checkConf = isCheckConfChannel();
         newC.checkAuth = isCheckAuthChannel();
+        newC.ensureConf = isEnsureConf();
+        newC.ensureWeakAuth = isEnsureWeakAuth();
+        newC.ensureStrongAuth = isEnsureStrongAuth();
 
         newC.port = port;
         newC.ports = new ArrayList<>();
diff --git a/src/main/java/tmltranslator/TMLMapping.java b/src/main/java/tmltranslator/TMLMapping.java
index e224ea9e86a2cc34e1e26f9ef5059e46cf021830..bafe77601d73b03e88825a5aa6e3f718e1e7ebf3 100755
--- a/src/main/java/tmltranslator/TMLMapping.java
+++ b/src/main/java/tmltranslator/TMLMapping.java
@@ -2005,6 +2005,12 @@ public class TMLMapping<E> {
         return mappedSecurity.get(_sp);
     }
 
+    public void NullifyAutomata() {
+        aut = null;
+        nodesToStates = null;
+        commNodes = null;
+    }
+
     @SuppressWarnings("unchecked")
     public TMLMapping deepClone() throws TMLCheckingError {
 
diff --git a/src/main/java/tmltranslator/TMLSyntaxChecking.java b/src/main/java/tmltranslator/TMLSyntaxChecking.java
index 880a60e46d33d51d91ffed8de37ca6942296099a..0a8fd981547ba2c4032fa797e2cd9207c2ff6ea0 100755
--- a/src/main/java/tmltranslator/TMLSyntaxChecking.java
+++ b/src/main/java/tmltranslator/TMLSyntaxChecking.java
@@ -820,7 +820,17 @@ public class TMLSyntaxChecking {
     public String printErrors() {
         String ret = "*** ERRORS:";
         for (TMLError error : errors) {
-            ret += "ERROR / task " + error.task.getName() + " / element " + error.element.getName() + ": " + error.message + "\n";
+            ret += "ERROR";
+            if (error.task != null) {
+                ret += " / task " + error.task.getName();
+            }
+            if (error.element != null) {
+                ret += " / element " + error.element.getName();
+            }
+            if (error.message != null) {
+                ret += ": " + error.message;
+            }
+            ret += "\n";
         }
         return ret;
     }
@@ -828,7 +838,17 @@ public class TMLSyntaxChecking {
     public String printWarnings() {
         String ret = "";
         for (TMLError error : warnings) {
-            ret += "ERROR / task " + error.task.getName() + " / element: " + error.element.getName() + ": " + error.message + "\n";
+            ret += "ERROR";
+            if (error.task != null) {
+                ret += " / task " + error.task.getName();
+            }
+            if (error.element != null) {
+                ret += " / element " + error.element.getName();
+            }
+            if (error.message != null) {
+                ret += ": " + error.message;
+            }
+            ret += "\n";
         }
         return ret;
     }
diff --git a/src/main/java/tmltranslator/compareTMLTest/CompareTMAP.java b/src/main/java/tmltranslator/compareTMLTest/CompareTMAP.java
new file mode 100644
index 0000000000000000000000000000000000000000..b08417817eecb81d64c065f48951813124d6d70c
--- /dev/null
+++ b/src/main/java/tmltranslator/compareTMLTest/CompareTMAP.java
@@ -0,0 +1,111 @@
+/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
+ *
+ * ludovic.apvrille AT enst.fr
+ *
+ * This software is a computer program whose purpose is to allow the
+ * edition of TURTLE analysis, design and deployment diagrams, to
+ * allow the generation of RT-LOTOS or Java code from this diagram,
+ * and at last to allow the analysis of formal validation traces
+ * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
+ * from INRIA Rhone-Alpes.
+ *
+ * This software is governed by the CeCILL  license under French law and
+ * abiding by the rules of distribution of free software.  You can  use,
+ * modify and/ or redistribute the software under the terms of the CeCILL
+ * license as circulated by CEA, CNRS and INRIA at the following URL
+ * "http://www.cecill.info".
+ *
+ * As a counterpart to the access to the source code and  rights to copy,
+ * modify and redistribute granted by the license, users are provided only
+ * with a limited warranty  and the software's author,  the holder of the
+ * economic rights,  and the successive licensors  have only  limited
+ * liability.
+ *
+ * In this respect, the user's attention is drawn to the risks associated
+ * with loading,  using,  modifying and/or developing or reproducing the
+ * software by the user in light of its specific status of free software,
+ * that may mean  that it is complicated to manipulate,  and  that  also
+ * therefore means  that it is reserved for developers  and  experienced
+ * professionals having in-depth computer knowledge. Users are therefore
+ * encouraged to load and test the software's suitability as regards their
+ * requirements in conditions enabling the security of their systems and/or
+ * data to be ensured and,  more generally, to use and operate it in the
+ * same conditions as regards security.
+ *
+ * The fact that you are presently reading this means that you have had
+ * knowledge of the CeCILL license and that you accept its terms.
+ */
+
+
+package tmltranslator.compareTMLTest;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Class CompareTMAP
+ * 
+ * Creation: 13/11/2023
+ *
+ * @author Jawher JERRAY
+ * @version 1.0 13/11/2023
+ */
+
+public class CompareTMAP {
+
+    public CompareTMAP () {
+
+    }
+
+    public boolean CompareTMAPFiles(File expected, File clone) throws Exception {
+
+        BufferedReader expectedReader = new BufferedReader(new FileReader(expected));
+        BufferedReader cloneReader = new BufferedReader(new FileReader(clone));
+
+        String s1;
+        String s2;
+        List<String> expectedStringArray = new ArrayList<String>();
+        List<String> cloneStringArray = new ArrayList<String>();
+        
+        while ((s1 = expectedReader.readLine()) != null) {
+            if (s1.indexOf("//") >= 0) {
+                s1 = s1.substring(0, s1.indexOf("//"));
+            }
+            if (!s1.contains("#include") && s1.length() > 0) {
+                s1 = s1.trim();
+                expectedStringArray.add(s1);
+            }
+        }
+
+        while ((s2 = cloneReader.readLine()) != null){
+            if (s2.indexOf("//") >= 0) {
+                s2 = s2.substring(0, s2.indexOf("//"));
+            }
+            if (!s2.contains("#include") && s2.length() > 0) {
+                s2 = s2.trim();
+                cloneStringArray.add(s2);
+            }
+        }
+        expectedReader.close();
+        cloneReader.close();
+        
+        return checkEquality(expectedStringArray, cloneStringArray);
+    }
+
+    public boolean checkEquality(List<String> s1, List<String> s2) {
+        for (String s : s1) {
+            if (s2.contains(s)) {
+                s2.remove(s);
+            }
+        }
+
+        if (s2.size() == 0) {
+            return true;
+        }
+
+        return false;
+    }
+}
diff --git a/src/main/java/tmltranslator/patternhandling/AttributeTaskJsonFile.java b/src/main/java/tmltranslator/patternhandling/AttributeTaskJsonFile.java
new file mode 100644
index 0000000000000000000000000000000000000000..b79e5c9dfad01952e69104ebdf6eff5699963125
--- /dev/null
+++ b/src/main/java/tmltranslator/patternhandling/AttributeTaskJsonFile.java
@@ -0,0 +1,80 @@
+/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
+ *
+ * ludovic.apvrille AT enst.fr
+ *
+ * This software is a computer program whose purpose is to allow the
+ * edition of TURTLE analysis, design and deployment diagrams, to
+ * allow the generation of RT-LOTOS or Java code from this diagram,
+ * and at last to allow the analysis of formal validation traces
+ * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
+ * from INRIA Rhone-Alpes.
+ *
+ * This software is governed by the CeCILL  license under French law and
+ * abiding by the rules of distribution of free software.  You can  use,
+ * modify and/ or redistribute the software under the terms of the CeCILL
+ * license as circulated by CEA, CNRS and INRIA at the following URL
+ * "http://www.cecill.info".
+ *
+ * As a counterpart to the access to the source code and  rights to copy,
+ * modify and redistribute granted by the license, users are provided only
+ * with a limited warranty  and the software's author,  the holder of the
+ * economic rights,  and the successive licensors  have only  limited
+ * liability.
+ *
+ * In this respect, the user's attention is drawn to the risks associated
+ * with loading,  using,  modifying and/or developing or reproducing the
+ * software by the user in light of its specific status of free software,
+ * that may mean  that it is complicated to manipulate,  and  that  also
+ * therefore means  that it is reserved for developers  and  experienced
+ * professionals having in-depth computer knowledge. Users are therefore
+ * encouraged to load and test the software's suitability as regards their
+ * requirements in conditions enabling the security of their systems and/or
+ * data to be ensured and,  more generally, to use and operate it in the
+ * same conditions as regards security.
+ *
+ * The fact that you are presently reading this means that you have had
+ * knowledge of the CeCILL license and that you accept its terms.
+ */
+
+
+package tmltranslator.patternhandling;
+/**
+ * Class AttributeTaskJsonFile
+ * 
+ * Creation: 28/08/2023
+ *
+ * @author Jawher JERRAY
+ * @version 1.0 28/08/2023
+ */
+ 
+import tmltranslator.*;
+
+ 
+public class AttributeTaskJsonFile {
+    private String name;
+    private String type;
+    private String value;
+
+    public AttributeTaskJsonFile(String name, String type, String value) {
+        this.name = name;
+        this.type = type;
+        this.value = value;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String _value) {
+        value = _value;
+    }
+    
+}
diff --git a/src/main/java/tmltranslator/patternhandling/MappingPatternChannel.java b/src/main/java/tmltranslator/patternhandling/MappingPatternChannel.java
new file mode 100644
index 0000000000000000000000000000000000000000..2f675da34ba042df241c73ed29f68acb71298f5a
--- /dev/null
+++ b/src/main/java/tmltranslator/patternhandling/MappingPatternChannel.java
@@ -0,0 +1,223 @@
+/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
+ *
+ * ludovic.apvrille AT enst.fr
+ *
+ * This software is a computer program whose purpose is to allow the
+ * edition of TURTLE analysis, design and deployment diagrams, to
+ * allow the generation of RT-LOTOS or Java code from this diagram,
+ * and at last to allow the analysis of formal validation traces
+ * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
+ * from INRIA Rhone-Alpes.
+ *
+ * This software is governed by the CeCILL  license under French law and
+ * abiding by the rules of distribution of free software.  You can  use,
+ * modify and/ or redistribute the software under the terms of the CeCILL
+ * license as circulated by CEA, CNRS and INRIA at the following URL
+ * "http://www.cecill.info".
+ *
+ * As a counterpart to the access to the source code and  rights to copy,
+ * modify and redistribute granted by the license, users are provided only
+ * with a limited warranty  and the software's author,  the holder of the
+ * economic rights,  and the successive licensors  have only  limited
+ * liability.
+ *
+ * In this respect, the user's attention is drawn to the risks associated
+ * with loading,  using,  modifying and/or developing or reproducing the
+ * software by the user in light of its specific status of free software,
+ * that may mean  that it is complicated to manipulate,  and  that  also
+ * therefore means  that it is reserved for developers  and  experienced
+ * professionals having in-depth computer knowledge. Users are therefore
+ * encouraged to load and test the software's suitability as regards their
+ * requirements in conditions enabling the security of their systems and/or
+ * data to be ensured and,  more generally, to use and operate it in the
+ * same conditions as regards security.
+ *
+ * The fact that you are presently reading this means that you have had
+ * knowledge of the CeCILL license and that you accept its terms.
+ */
+
+
+package tmltranslator.patternhandling;
+/**
+ * Class MappingPatternChannel
+ * 
+ * Creation: 25/10/2023
+ *
+ * @author Jawher JERRAY
+ * @version 1.0 25/10/2023
+ */
+ 
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+import tmltranslator.*;
+
+ 
+public class MappingPatternChannel {
+
+    public final static String TASK_CHANNEL_SEPARATOR = "::";
+    public final static String MAP_CHANNEL_IN_SAME_MEMORY_SEPARATOR = " mapped in the same Memory as ";
+    public final static String MAP_CHANNEL_IN_NEW_MEMORY_SEPARATOR = " mapped in a new memory linked to ";
+    public final static int ORIGIN_PATTERN = 0;
+    public final static int ORIGIN_CLONE = 1;
+    public final static int ORIGIN_MODEL = 2;
+
+    private String taskOfChannelToMap;
+    private String channelToMapName;
+    private int origin;
+    private String taskOfChannelInSameMem;
+    private String channelInSameMemAs;
+    private int sameMemAsOrigin;
+    private String busNameForNewMem;
+    
+
+    public MappingPatternChannel(String taskOfChannelToMap, String channelToMapName, int origin) {
+        this.taskOfChannelToMap = taskOfChannelToMap;
+        this.channelToMapName = channelToMapName;
+        this.origin = origin;
+    }
+
+    public String getTaskOfChannelToMap() {
+        return taskOfChannelToMap;
+    }
+
+    public String getChannelToMapName() {
+        return channelToMapName;
+    }
+
+    public String getTaskOfChannelInSameMem() {
+        return taskOfChannelInSameMem;
+    }
+
+    public String getChannelInSameMemAs() {
+        return channelInSameMemAs;
+    }
+
+    public String getBusNameForNewMem() {
+        return busNameForNewMem;
+    }
+
+    public int getOrigin() {
+        return origin;
+    }
+
+    public int getSameMemAsOrigin() {
+        return sameMemAsOrigin;
+    }
+
+    public void setTaskOfChannelToMap(String _taskOfChannelToMap) {
+        taskOfChannelToMap = _taskOfChannelToMap;
+    }
+
+    public void setChannelToMapName(String _channelToMapName) {
+        channelToMapName = _channelToMapName;
+    }
+
+    public void setTaskAndChannelInSameMem(String _taskOfChannelInSameMem, String _channelInSameMemAs, int _sameMemAsOrigin) {
+        taskOfChannelInSameMem = _taskOfChannelInSameMem;
+        channelInSameMemAs = _channelInSameMemAs;
+        sameMemAsOrigin = _sameMemAsOrigin;
+        busNameForNewMem = null;
+    }
+
+    public void setBusNameForNewMem(String _busNameForNewMem) {
+        busNameForNewMem = _busNameForNewMem;
+        channelInSameMemAs = null;
+        taskOfChannelInSameMem = null;
+    }
+
+    public String getStringDisplay() {
+        if (channelInSameMemAs != null) {
+            return (taskOfChannelToMap + TASK_CHANNEL_SEPARATOR + channelToMapName + MAP_CHANNEL_IN_SAME_MEMORY_SEPARATOR + taskOfChannelInSameMem + TASK_CHANNEL_SEPARATOR + channelInSameMemAs);
+        } else {
+            return (taskOfChannelToMap + TASK_CHANNEL_SEPARATOR + channelToMapName + MAP_CHANNEL_IN_NEW_MEMORY_SEPARATOR + busNameForNewMem);
+        }
+    }
+
+    public void setOrigin(int _origin) {
+        origin = _origin;
+    }
+
+    public String getTaskChannelToMap() {
+        return (taskOfChannelToMap + TASK_CHANNEL_SEPARATOR + channelToMapName);
+    }
+
+    public String getTaskChannelInSameMem() {
+        return (taskOfChannelInSameMem + TASK_CHANNEL_SEPARATOR + channelInSameMemAs);
+    }
+
+    public static String getTaskChannel(String task, String channel) {
+        return (task + TASK_CHANNEL_SEPARATOR + channel);
+    }
+
+    public static String[] seperateTaskAndChannel(String st) {
+        String[] split = st.split(TASK_CHANNEL_SEPARATOR);
+        String task, channel;
+        if (split.length == 2) {
+            task = split[0];
+            channel = split[1];
+            return new String[]{task, channel};
+        } else {
+            return null;
+        }
+    }
+
+    public static List<MappingPatternChannel> getChannelsToMap(List<PatternConnection> patternConnectionList, LinkedHashMap<String, TaskPattern> patternTasks, List<PatternCloneTask> patternCloneTasks) {
+        List<MappingPatternChannel> mappingPatternChannels = new ArrayList<MappingPatternChannel>();
+        List<String> clonedTasks = new ArrayList<String>();
+        for (PatternCloneTask clonedTask: patternCloneTasks) {
+            clonedTasks.add(clonedTask.getClonedTask());
+        }
+        for (PatternConnection patternConnection: patternConnectionList) {
+            if (!patternConnection.isNewPort() && clonedTasks.contains(patternConnection.getModelTaskName())) {
+                MappingPatternChannel mappingPatternChannel = new MappingPatternChannel(patternConnection.getModelTaskName(), patternConnection.getModelChannelName(), ORIGIN_CLONE);
+                if (!mappingPatternChannels.contains(mappingPatternChannel)) {
+                    mappingPatternChannels.add(mappingPatternChannel);
+                }
+            }
+            if (patternConnection.isANewChannelRequired(patternConnectionList, patternTasks, patternCloneTasks)) {
+                if (!patternConnection.isNewPort() && clonedTasks.contains(patternConnection.getModelTaskName())) {
+                } else {
+                    for (PortTaskJsonFile portTaskJsonFile : patternTasks.get(patternConnection.getPatternTaskName()).getExternalPorts()) {
+                        if (portTaskJsonFile.getType().equals(PatternCreation.CHANNEL) && patternConnection.getPatternChannel().equals(portTaskJsonFile.getName())) {
+                            MappingPatternChannel mappingPatternChannel = new MappingPatternChannel(patternConnection.getPatternTaskName(), patternConnection.getPatternChannel(), ORIGIN_PATTERN);
+                            if (!mappingPatternChannels.contains(mappingPatternChannel)) {
+                                mappingPatternChannels.add(mappingPatternChannel);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        for (String st : patternTasks.keySet()) {
+            for (PortTaskJsonFile portTaskJsonFile : patternTasks.get(st).getInternalPorts()) {
+                if (portTaskJsonFile.getType().equals(PatternCreation.CHANNEL) && portTaskJsonFile.getMode().equals(PatternCreation.MODE_OUTPUT)) {
+                    MappingPatternChannel mappingPatternChannel = new MappingPatternChannel(st, portTaskJsonFile.getName(), ORIGIN_PATTERN);
+                    if (!mappingPatternChannels.contains(mappingPatternChannel)) {
+                        mappingPatternChannels.add(mappingPatternChannel);
+                    }
+                }
+            }
+        }
+
+        return mappingPatternChannels;
+    }
+
+    public static List<MappingPatternChannel> getChannelsLeftToMap(List<MappingPatternChannel> _mappedChannels, List<MappingPatternChannel> _allChannelsToMap) {
+        List<MappingPatternChannel> channelsLeftToMap = new ArrayList<MappingPatternChannel>();
+        for (MappingPatternChannel channelToMap : _allChannelsToMap) {
+            boolean isLeftToMap = true;
+            for (MappingPatternChannel mappedChannel : _mappedChannels) {
+                if (channelToMap.getChannelToMapName().equals(mappedChannel.getChannelToMapName()) && channelToMap.getTaskOfChannelToMap().equals(mappedChannel.getTaskOfChannelToMap())) {
+                    isLeftToMap = false;
+                    break;
+                }
+            }
+            if (isLeftToMap) {
+                channelsLeftToMap.add(channelToMap);
+            }
+        }
+        return channelsLeftToMap;
+    }
+}
diff --git a/src/main/java/tmltranslator/patternhandling/MappingPatternTask.java b/src/main/java/tmltranslator/patternhandling/MappingPatternTask.java
new file mode 100644
index 0000000000000000000000000000000000000000..0b825f485db7d50209fe7ee3aa4e221a83e64f28
--- /dev/null
+++ b/src/main/java/tmltranslator/patternhandling/MappingPatternTask.java
@@ -0,0 +1,166 @@
+/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
+ *
+ * ludovic.apvrille AT enst.fr
+ *
+ * This software is a computer program whose purpose is to allow the
+ * edition of TURTLE analysis, design and deployment diagrams, to
+ * allow the generation of RT-LOTOS or Java code from this diagram,
+ * and at last to allow the analysis of formal validation traces
+ * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
+ * from INRIA Rhone-Alpes.
+ *
+ * This software is governed by the CeCILL  license under French law and
+ * abiding by the rules of distribution of free software.  You can  use,
+ * modify and/ or redistribute the software under the terms of the CeCILL
+ * license as circulated by CEA, CNRS and INRIA at the following URL
+ * "http://www.cecill.info".
+ *
+ * As a counterpart to the access to the source code and  rights to copy,
+ * modify and redistribute granted by the license, users are provided only
+ * with a limited warranty  and the software's author,  the holder of the
+ * economic rights,  and the successive licensors  have only  limited
+ * liability.
+ *
+ * In this respect, the user's attention is drawn to the risks associated
+ * with loading,  using,  modifying and/or developing or reproducing the
+ * software by the user in light of its specific status of free software,
+ * that may mean  that it is complicated to manipulate,  and  that  also
+ * therefore means  that it is reserved for developers  and  experienced
+ * professionals having in-depth computer knowledge. Users are therefore
+ * encouraged to load and test the software's suitability as regards their
+ * requirements in conditions enabling the security of their systems and/or
+ * data to be ensured and,  more generally, to use and operate it in the
+ * same conditions as regards security.
+ *
+ * The fact that you are presently reading this means that you have had
+ * knowledge of the CeCILL license and that you accept its terms.
+ */
+
+
+package tmltranslator.patternhandling;
+/**
+ * Class MappingPatternTask
+ * 
+ * Creation: 25/10/2023
+ *
+ * @author Jawher JERRAY
+ * @version 1.0 25/10/2023
+ */
+ 
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+import tmltranslator.*;
+
+ 
+public class MappingPatternTask {
+
+    public final static String MAP_TASK_IN_SAME_HW_SEPARATOR = " mapped in the same HW as ";
+    public final static String MAP_TASK_IN_NEW_HW_SEPARATOR = " mapped in a new HW linked to ";
+    public final static int ORIGIN_PATTERN = 0;
+    public final static int ORIGIN_CLONE = 1;
+    public final static int ORIGIN_MODEL = 2;
+
+    private String taskToMapName;
+    private String sameHwAs;
+    private int sameHwAsOrigin;
+    private String busNameForNewHw;
+    private int origin;
+
+    public MappingPatternTask(String taskToMapName, int origin) {
+        this.taskToMapName = taskToMapName;
+        this.origin = origin;
+    }
+
+    public String getTaskToMapName() {
+        return taskToMapName;
+    }
+
+    public String getSameHwAs() {
+        return sameHwAs;
+    }
+
+    public String getBusNameForNewHw() {
+        return busNameForNewHw;
+    }
+
+    public int getOrigin() {
+        return origin;
+    }
+
+    public int getSameHwAsOrigin() {
+        return sameHwAsOrigin;
+    }
+
+    public void setTaskToMapName(String _taskToMapName) {
+        taskToMapName = _taskToMapName;
+    }
+
+    public void setSameHwAs(String _sameHwAs, int _sameHwAsOrigin) {
+        sameHwAs = _sameHwAs;
+        sameHwAsOrigin = _sameHwAsOrigin;
+        busNameForNewHw = null;
+    }
+
+    public void setBusNameForNewHw(String _busNameForNewHw) {
+        busNameForNewHw = _busNameForNewHw;
+        sameHwAs = null;
+        sameHwAsOrigin = -1;
+    }
+
+    public void setOrigin(int _origin) {
+        origin = _origin;
+    }
+
+    public String getStringDisplay() {
+        if (sameHwAs != null) {
+            return (taskToMapName + MAP_TASK_IN_SAME_HW_SEPARATOR + sameHwAs);
+        } else {
+            return (taskToMapName + MAP_TASK_IN_NEW_HW_SEPARATOR + busNameForNewHw);
+        }
+    }
+
+    public static List<MappingPatternTask> getTasksToMap(LinkedHashMap<String, TaskPattern> _allPatternTasks, List<String> _cloneTasks) {
+        List<MappingPatternTask> tasksToMap = new ArrayList<MappingPatternTask>();
+        for (String taskPattern : _allPatternTasks.keySet()) {
+            MappingPatternTask taskToMap = new MappingPatternTask(taskPattern, ORIGIN_PATTERN);
+            tasksToMap.add(taskToMap);
+        }
+        for (String taskClone : _cloneTasks) {
+            MappingPatternTask taskToMap = new MappingPatternTask(taskClone, ORIGIN_CLONE);
+            tasksToMap.add(taskToMap);
+        }
+        return tasksToMap;
+    }
+
+    public static List<MappingPatternTask> getTasksLeftToMap(List<MappingPatternTask> _mappedTasks, List<MappingPatternTask> _allTasksToMap) {
+        List<MappingPatternTask> tasksLeftToMap = new ArrayList<MappingPatternTask>();
+        for (MappingPatternTask taskToMap : _allTasksToMap) {
+            boolean isLeftToMap = true;
+            for (MappingPatternTask mappedTask : _mappedTasks) {
+                if (taskToMap.getTaskToMapName().equals(mappedTask.getTaskToMapName())) {
+                    isLeftToMap = false;
+                    break;
+                }
+            }
+            if (isLeftToMap) {
+                tasksLeftToMap.add(taskToMap);
+            }
+        }
+        return tasksLeftToMap;
+    }
+    
+    // public static List<String> getListTasksToMapWith(List<MappingPatternTask> _mappedTasks, List<String> _cloneTasks) {
+    //     List<MappingPatternTask> tasksToMap = new ArrayList<MappingPatternTask>();
+    //     for (String taskPattern : _allPatternTasks.keySet()) {
+    //         MappingPatternTask taskToMap = new MappingPatternTask(taskPattern, ORIGIN_PATTERN);
+    //         tasksToMap.add(taskToMap);
+    //     }
+    //     for (String taskClone : _cloneTasks) {
+    //         MappingPatternTask taskToMap = new MappingPatternTask(taskClone, ORIGIN_CLONE);
+    //         tasksToMap.add(taskToMap);
+    //     }
+    //     return tasksToMap;
+    // }
+}
diff --git a/src/main/java/tmltranslator/patternhandling/PatternAttributeUpdate.java b/src/main/java/tmltranslator/patternhandling/PatternAttributeUpdate.java
new file mode 100644
index 0000000000000000000000000000000000000000..12b1408b98f223fbd98ea3fdaeecc18a1d48c34a
--- /dev/null
+++ b/src/main/java/tmltranslator/patternhandling/PatternAttributeUpdate.java
@@ -0,0 +1,90 @@
+/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
+ *
+ * ludovic.apvrille AT enst.fr
+ *
+ * This software is a computer program whose purpose is to allow the
+ * edition of TURTLE analysis, design and deployment diagrams, to
+ * allow the generation of RT-LOTOS or Java code from this diagram,
+ * and at last to allow the analysis of formal validation traces
+ * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
+ * from INRIA Rhone-Alpes.
+ *
+ * This software is governed by the CeCILL  license under French law and
+ * abiding by the rules of distribution of free software.  You can  use,
+ * modify and/ or redistribute the software under the terms of the CeCILL
+ * license as circulated by CEA, CNRS and INRIA at the following URL
+ * "http://www.cecill.info".
+ *
+ * As a counterpart to the access to the source code and  rights to copy,
+ * modify and redistribute granted by the license, users are provided only
+ * with a limited warranty  and the software's author,  the holder of the
+ * economic rights,  and the successive licensors  have only  limited
+ * liability.
+ *
+ * In this respect, the user's attention is drawn to the risks associated
+ * with loading,  using,  modifying and/or developing or reproducing the
+ * software by the user in light of its specific status of free software,
+ * that may mean  that it is complicated to manipulate,  and  that  also
+ * therefore means  that it is reserved for developers  and  experienced
+ * professionals having in-depth computer knowledge. Users are therefore
+ * encouraged to load and test the software's suitability as regards their
+ * requirements in conditions enabling the security of their systems and/or
+ * data to be ensured and,  more generally, to use and operate it in the
+ * same conditions as regards security.
+ *
+ * The fact that you are presently reading this means that you have had
+ * knowledge of the CeCILL license and that you accept its terms.
+ */
+
+
+package tmltranslator.patternhandling;
+/**
+ * Class PatternAttributeUpdate
+ * 
+ * Creation: 25/10/2023
+ *
+ * @author Jawher JERRAY
+ * @version 1.0 25/10/2023
+ */
+ 
+import tmltranslator.*;
+
+ 
+public class PatternAttributeUpdate {
+    private String taskOfAttributeToUpdate;
+    private String attributeName;
+    private String newAttributeValue;
+
+    public PatternAttributeUpdate(String taskOfAttributeToUpdate, String attributeName, String newAttributeValue) {
+        this.taskOfAttributeToUpdate = taskOfAttributeToUpdate;
+        this.attributeName = attributeName;
+        this.newAttributeValue = newAttributeValue;
+    }
+
+    public String getTaskOfAttributeToUpdate() {
+        return taskOfAttributeToUpdate;
+    }
+
+    public String getAttributeName() {
+        return attributeName;
+    }
+
+    public String getNewAttributeValue() {
+        return newAttributeValue;
+    }
+
+
+    public void setTaskOfAttributeToUpdate(String _taskOfAttributeToUpdate) {
+        taskOfAttributeToUpdate = _taskOfAttributeToUpdate;
+    }
+
+    public void setAttributeName(String _attributeName) {
+        attributeName = _attributeName;
+    }
+
+    public void setNewAttributeValue(String _newAttributeValue) {
+        newAttributeValue = _newAttributeValue;
+    }
+
+    
+}
diff --git a/src/main/java/tmltranslator/patternhandling/PatternChannelWithSecurity.java b/src/main/java/tmltranslator/patternhandling/PatternChannelWithSecurity.java
new file mode 100644
index 0000000000000000000000000000000000000000..745c561576a878ce363f9bf6675eb0e22d6369c5
--- /dev/null
+++ b/src/main/java/tmltranslator/patternhandling/PatternChannelWithSecurity.java
@@ -0,0 +1,111 @@
+/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
+ *
+ * ludovic.apvrille AT enst.fr
+ *
+ * This software is a computer program whose purpose is to allow the
+ * edition of TURTLE analysis, design and deployment diagrams, to
+ * allow the generation of RT-LOTOS or Java code from this diagram,
+ * and at last to allow the analysis of formal validation traces
+ * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
+ * from INRIA Rhone-Alpes.
+ *
+ * This software is governed by the CeCILL  license under French law and
+ * abiding by the rules of distribution of free software.  You can  use,
+ * modify and/ or redistribute the software under the terms of the CeCILL
+ * license as circulated by CEA, CNRS and INRIA at the following URL
+ * "http://www.cecill.info".
+ *
+ * As a counterpart to the access to the source code and  rights to copy,
+ * modify and redistribute granted by the license, users are provided only
+ * with a limited warranty  and the software's author,  the holder of the
+ * economic rights,  and the successive licensors  have only  limited
+ * liability.
+ *
+ * In this respect, the user's attention is drawn to the risks associated
+ * with loading,  using,  modifying and/or developing or reproducing the
+ * software by the user in light of its specific status of free software,
+ * that may mean  that it is complicated to manipulate,  and  that  also
+ * therefore means  that it is reserved for developers  and  experienced
+ * professionals having in-depth computer knowledge. Users are therefore
+ * encouraged to load and test the software's suitability as regards their
+ * requirements in conditions enabling the security of their systems and/or
+ * data to be ensured and,  more generally, to use and operate it in the
+ * same conditions as regards security.
+ *
+ * The fact that you are presently reading this means that you have had
+ * knowledge of the CeCILL license and that you accept its terms.
+ */
+
+
+package tmltranslator.patternhandling;
+/**
+ * Class PatternChannelWithSecurity
+ * 
+ * Creation: 25/10/2023
+ *
+ * @author Jawher JERRAY
+ * @version 1.0 25/10/2023
+ */
+ 
+import tmltranslator.*;
+
+ 
+public class PatternChannelWithSecurity {
+    public static final int NO_AUTHENTICITY = 0; 
+    public static final int WEAK_AUTHENTICITY = 1; 
+    public static final int STRONG_AUTHENTICITY = 2;
+
+    private String channelTaskName;
+    private String channelName;
+    private String channelMode;
+    private Boolean isConf;
+    private int auth;
+
+    public PatternChannelWithSecurity(String channelTaskName, String channelName, String channelMode) {
+        this.channelTaskName = channelTaskName;
+        this.channelName = channelName;
+        this.channelMode = channelMode;
+    }
+
+    public String getChannelTaskName() {
+        return channelTaskName;
+    }
+
+    public String getChannelName() {
+        return channelName;
+    }
+
+    public String getChannelMode() {
+        return channelMode;
+    }
+
+    public Boolean isConfidential() {
+        return isConf;
+    }
+
+    public int getAuthenticity() {
+        return auth;
+    }
+
+    public void setChannelTaskName(String _channelTaskName) {
+        channelTaskName = _channelTaskName;
+    }
+
+    public void setChannelName(String _channelName) {
+        channelName = _channelName;
+    }
+
+    public void setChannelMode(String _channelMode) {
+        channelMode = _channelMode;
+    }
+
+    public void setIsConfidential(Boolean _isConf) {
+        isConf = _isConf;
+    }
+
+    public void setAuthenticity(int _auth) {
+        auth = _auth;
+    }
+
+    
+}
diff --git a/src/main/java/tmltranslator/patternhandling/PatternCloneTask.java b/src/main/java/tmltranslator/patternhandling/PatternCloneTask.java
new file mode 100644
index 0000000000000000000000000000000000000000..e5d554ba519a83be9b72bbddfc6c4089a1f8dd55
--- /dev/null
+++ b/src/main/java/tmltranslator/patternhandling/PatternCloneTask.java
@@ -0,0 +1,96 @@
+/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
+ *
+ * ludovic.apvrille AT enst.fr
+ *
+ * This software is a computer program whose purpose is to allow the
+ * edition of TURTLE analysis, design and deployment diagrams, to
+ * allow the generation of RT-LOTOS or Java code from this diagram,
+ * and at last to allow the analysis of formal validation traces
+ * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
+ * from INRIA Rhone-Alpes.
+ *
+ * This software is governed by the CeCILL  license under French law and
+ * abiding by the rules of distribution of free software.  You can  use,
+ * modify and/ or redistribute the software under the terms of the CeCILL
+ * license as circulated by CEA, CNRS and INRIA at the following URL
+ * "http://www.cecill.info".
+ *
+ * As a counterpart to the access to the source code and  rights to copy,
+ * modify and redistribute granted by the license, users are provided only
+ * with a limited warranty  and the software's author,  the holder of the
+ * economic rights,  and the successive licensors  have only  limited
+ * liability.
+ *
+ * In this respect, the user's attention is drawn to the risks associated
+ * with loading,  using,  modifying and/or developing or reproducing the
+ * software by the user in light of its specific status of free software,
+ * that may mean  that it is complicated to manipulate,  and  that  also
+ * therefore means  that it is reserved for developers  and  experienced
+ * professionals having in-depth computer knowledge. Users are therefore
+ * encouraged to load and test the software's suitability as regards their
+ * requirements in conditions enabling the security of their systems and/or
+ * data to be ensured and,  more generally, to use and operate it in the
+ * same conditions as regards security.
+ *
+ * The fact that you are presently reading this means that you have had
+ * knowledge of the CeCILL license and that you accept its terms.
+ */
+
+
+package tmltranslator.patternhandling;
+/**
+ * Class PatternCloneTask
+ * 
+ * Creation: 25/10/2023
+ *
+ * @author Jawher JERRAY
+ * @version 1.0 25/10/2023
+ */
+ 
+import java.util.List;
+
+import tmltranslator.*;
+
+ 
+public class PatternCloneTask {
+    public final static String CLONE_TASK_SEPARATOR = " clone of ";
+
+    private String clonedTask;
+    private String taskToClone;
+
+    public PatternCloneTask(String clonedTask, String taskToClone) {
+        this.clonedTask = clonedTask;
+        this.taskToClone = taskToClone;
+    }
+
+    public String getClonedTask() {
+        return clonedTask;
+    }
+
+    public String getTaskToClone() {
+        return taskToClone;
+    }
+
+
+    public void setClonedTask(String _clonedTask) {
+        clonedTask = _clonedTask;
+    }
+
+    public void setTaskToClone(String _taskToClone) {
+        taskToClone = _taskToClone;
+    }
+
+    public String getStringDisplay() {
+        return (clonedTask + CLONE_TASK_SEPARATOR + taskToClone);
+        
+    }
+  
+    public static PatternCloneTask isAClonedTask(List<PatternCloneTask> clonedTasks, String taskName) {
+        for (PatternCloneTask patternCloneTask : clonedTasks) {
+            if (patternCloneTask.getClonedTask().equals(taskName)) {
+                return patternCloneTask;
+            }
+        }
+        return null;
+    }
+}
diff --git a/src/main/java/tmltranslator/patternhandling/PatternConfig2Json.java b/src/main/java/tmltranslator/patternhandling/PatternConfig2Json.java
new file mode 100644
index 0000000000000000000000000000000000000000..316759b13993576593ceb5c5973765176e27a969
--- /dev/null
+++ b/src/main/java/tmltranslator/patternhandling/PatternConfig2Json.java
@@ -0,0 +1,507 @@
+/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
+ *
+ * ludovic.apvrille AT enst.fr
+ *
+ * This software is a computer program whose purpose is to allow the
+ * edition of TURTLE analysis, design and deployment diagrams, to
+ * allow the generation of RT-LOTOS or Java code from this diagram,
+ * and at last to allow the analysis of formal validation traces
+ * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
+ * from INRIA Rhone-Alpes.
+ *
+ * This software is governed by the CeCILL  license under French law and
+ * abiding by the rules of distribution of free software.  You can  use,
+ * modify and/ or redistribute the software under the terms of the CeCILL
+ * license as circulated by CEA, CNRS and INRIA at the following URL
+ * "http://www.cecill.info".
+ *
+ * As a counterpart to the access to the source code and  rights to copy,
+ * modify and redistribute granted by the license, users are provided only
+ * with a limited warranty  and the software's author,  the holder of the
+ * economic rights,  and the successive licensors  have only  limited
+ * liability.
+ *
+ * In this respect, the user's attention is drawn to the risks associated
+ * with loading,  using,  modifying and/or developing or reproducing the
+ * software by the user in light of its specific status of free software,
+ * that may mean  that it is complicated to manipulate,  and  that  also
+ * therefore means  that it is reserved for developers  and  experienced
+ * professionals having in-depth computer knowledge. Users are therefore
+ * encouraged to load and test the software's suitability as regards their
+ * requirements in conditions enabling the security of their systems and/or
+ * data to be ensured and,  more generally, to use and operate it in the
+ * same conditions as regards security.
+ *
+ * The fact that you are presently reading this means that you have had
+ * knowledge of the CeCILL license and that you accept its terms.
+ */
+
+
+package tmltranslator.patternhandling;
+/**
+ * Class PatternConfig2Json
+ * Transform a Pattern configuration to Json file and vice versa
+ * Creation: 05/09/2023
+ *
+ * @author Jawher JERRAY
+ * @version 1.0 05/09/2023
+ */
+ 
+import tmltranslator.*;
+
+import java.io.FileWriter;
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.*;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+ 
+public class PatternConfig2Json {
+    public final static String TASK_MAPPING_ORIGIN = "Origin";
+    public final static String TASK_MAPPING_ORIGIN_PATTERN = "Pattern";
+    public final static String TASK_MAPPING_ORIGIN_CLONE = "Clone";
+    public final static String TASK_MAPPING_ORIGIN_MODEL = "Model";
+    public final static String TASK_MAPPING = "Task_Mapping";
+    public final static String TASK_TO_MAP = "Task_To_Map";
+    public final static String TASK_MAPPED_IN_SAME_HW_AS = "Task_Mapped_In_Same_HW_As";
+    public final static String TASK_MAPPED_IN_SAME_HW_AS_ORIGIN = "Origin_Task_Mapped_In_Same_HW_As";
+    public final static String TASK_MAPPED_IN_NEW_HW_CONNECTED_TO_BUS = "Task_Mapped_In_New_HW";
+
+    public final static String CHANNEL_MAPPING_ORIGIN = "Origin";
+    public final static String CHANNEL_MAPPING_ORIGIN_PATTERN = "Pattern";
+    public final static String CHANNEL_MAPPING_ORIGIN_CLONE = "Clone";
+    public final static String CHANNEL_MAPPING_ORIGIN_MODEL = "Model";
+    public final static String CHANNEL_MAPPING = "Channel_Mapping";
+    public final static String TASK_OF_CHANNEL_TO_MAP = "Task_Of_Channel_To_Map";
+    public final static String CHANNEL_TO_MAP = "Channel_To_Map";
+    public final static String CHANNEL_MAPPED_IN_SAME_MEM_AS = "Channel_Mapped_In_Same_Mem_As";
+    public final static String TASK_OF_CHANNEL_SAME_MEM = "Task_Of_Channel_Same_Mem_As";
+    public final static String CHANNEL_MAPPED_IN_SAME_MEM_AS_ORIGIN = "Origin_Channel_Mapped_In_Same_Mem_As";
+    public final static String CHANNEL_MAPPED_IN_NEW_MEM_CONNECTED_TO_BUS = "Channel_Mapped_In_New_Mem";
+
+    public final static String CHANNEL_CONFIG = "Channel_Configuration";
+    public final static String TASK_OF_CHANNEL_TO_CONFIG = "Task_Of_Channel_To_Config";
+    public final static String CHANNEL_TO_CONFIG = "Channel_To_Config";
+    public final static String CHANNEL_TO_MERGE_WITH = "Channel_To_Merge_With";
+    public final static String CHANNEL_TO_REMOVE = "Channel_To_Remove";
+
+    public final static String TASK_CLONE = "Task_Clone";
+    public final static String CLONE_OF_TASK = "Clone_Of_Task";
+    public final static String CLONED_TASK = "Cloned_Task";
+    
+    public final static String CONNECTION = "Connection";
+    public final static String PATTERN_TASK = "Pattern_Task";
+    public final static String PATTERN_PORT = "Pattern_Port";
+    public final static String MODEL_TASK = "Model_Task";
+    public final static String MODEL_PORT = "Model_Port";
+    public final static String NEW_PORT = "New_Port";
+
+    public final static String UPDATED_ATTRIBUTES_IN_PATTERN = "Updated_Attributes_In_Pattern";
+    public final static String TASK_ATTRIBUTE_NAME = "Attribute_Task_Name";
+
+    public final static String CHANNELS_WITH_SECURITY_IN_PATTERN = "Channels_With_Security_In_Pattern";
+    public final static String TASK_CHANNEL_WITH_SECURITY_NAME = "Task_Name_Channel";
+
+    private String patternConfigurationPathName;
+    private PatternConfiguration patternConfiguration;  
+
+
+    public PatternConfiguration getPaternConfiguration() {
+        return patternConfiguration;
+    }
+	
+    public PatternConfig2Json(String _patternPathName, PatternConfiguration _patternConfiguration) {
+		this.patternConfigurationPathName = _patternPathName;
+		this.patternConfiguration = _patternConfiguration;
+	}
+    
+    public PatternConfig2Json(String _patternPathName) {
+		this.patternConfigurationPathName = _patternPathName;
+        this.patternConfiguration = new PatternConfiguration();
+	}
+
+	
+    public void patternConfiguration2Json() {
+        try {
+            FileWriter file = new FileWriter(patternConfigurationPathName);
+            JSONObject jsonPatternConfig = new JSONObject();
+
+            jsonPatternConfig.put(CONNECTION, addConnectionInJsonFile(patternConfiguration.getPortsConnection()));
+            jsonPatternConfig.put(TASK_CLONE, addClonedTasksInJsonFile(patternConfiguration.getClonedTasks()));
+            jsonPatternConfig.put(CHANNEL_CONFIG, addPortsConfigurationInJsonFile(patternConfiguration.getPortsConfig()));
+            jsonPatternConfig.put(TASK_MAPPING, addTasksMappingInJsonFile(patternConfiguration.getTasksMapping()));
+            jsonPatternConfig.put(CHANNEL_MAPPING, addChannelsMappingInJsonFile(patternConfiguration.getChannelsMapping()));
+            jsonPatternConfig.put(UPDATED_ATTRIBUTES_IN_PATTERN, addUpdatedPatternAttributesInJsonFile(patternConfiguration.getUpdatedPatternAttributes()));
+            jsonPatternConfig.put(CHANNELS_WITH_SECURITY_IN_PATTERN, addChannelsWithSecurityInJsonFile(patternConfiguration.getChannelsWithSecurity()));
+
+            file.write(jsonPatternConfig.toString(1));
+            file.close();
+        }
+        catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public void json2patternConfiguration() {
+        Path jsonFilePath = Path.of(patternConfigurationPathName);
+        String jsonFilecontent = "";
+        
+        try {
+            jsonFilecontent = Files.readString(jsonFilePath, Charset.defaultCharset());
+        } catch (IOException ioExc) {
+        } 
+        
+        JSONObject patternConfigurationJson = new JSONObject(jsonFilecontent);
+        JSONArray jsonConnection = patternConfigurationJson.getJSONArray(CONNECTION);
+        JSONArray jsonTaskClone = patternConfigurationJson.getJSONArray(TASK_CLONE);
+        JSONArray jsonChannelConfig = patternConfigurationJson.getJSONArray(CHANNEL_CONFIG);
+        JSONArray jsonTaskMapping = patternConfigurationJson.getJSONArray(TASK_MAPPING);
+        JSONArray jsonChannelMapping = patternConfigurationJson.getJSONArray(CHANNEL_MAPPING);
+        JSONArray jsonUpdatedAttributesPattern = patternConfigurationJson.getJSONArray(UPDATED_ATTRIBUTES_IN_PATTERN);
+        JSONArray jsonChannelWithSecurity = patternConfigurationJson.getJSONArray(CHANNELS_WITH_SECURITY_IN_PATTERN);
+        patternConfiguration.setClonedTasks(getClonedTasksFromJsonFile(jsonTaskClone));
+        patternConfiguration.setPortsConnection(getConnectionFromJsonFile(jsonConnection));
+        patternConfiguration.setPortsConfig(getPortsConfigurationFromJsonFile(jsonChannelConfig));
+        patternConfiguration.setTasksMapping(getTasksMappingFromJsonFile(jsonTaskMapping));
+        patternConfiguration.setChannelsMapping(getChannelsMappingFromJsonFile(jsonChannelMapping));
+        patternConfiguration.setUpdatedPatternAttributes(getUpdatedPatternAttributesFromJsonFile(jsonUpdatedAttributesPattern));
+        patternConfiguration.setChannelsWithSecurity(getChannelsWithSecurityFromJsonFile(jsonChannelWithSecurity));
+
+    }
+
+    JSONArray addClonedTasksInJsonFile(List<PatternCloneTask> _clonedTasks) {
+        JSONArray ja = new JSONArray();
+        try {
+            for (PatternCloneTask cloneTask : _clonedTasks) {
+                JSONObject jo = new JSONObject();
+                jo.put(CLONE_OF_TASK, cloneTask.getTaskToClone());
+                jo.put(CLONED_TASK, cloneTask.getClonedTask());
+                ja.put(jo);
+            }
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        return ja;
+    }
+
+    List<PatternCloneTask> getClonedTasksFromJsonFile(JSONArray ja) {
+        List<PatternCloneTask> _clonedTasks = new ArrayList<PatternCloneTask>();
+        for (int j = 0; j < ja.length(); j++) {
+            String cloneOfTask = ja.getJSONObject(j).getString(CLONE_OF_TASK);
+            String clonedTask = ja.getJSONObject(j).getString(CLONED_TASK);
+            PatternCloneTask cloneTask = new PatternCloneTask(clonedTask, cloneOfTask);
+            _clonedTasks.add(cloneTask);
+        }
+        return _clonedTasks;
+    }
+
+    JSONArray addPortsConfigurationInJsonFile(List<PatternPortsConfig> _portsConfig) {
+        JSONArray ja = new JSONArray();
+        try {
+            for (PatternPortsConfig portConfig : _portsConfig) {
+                JSONObject jo = new JSONObject();
+                jo.put(CHANNEL_TO_CONFIG, portConfig.getChannelToConfig());
+                jo.put(TASK_OF_CHANNEL_TO_CONFIG, portConfig.getTaskOfChannelToConfig());
+                if (portConfig.isChannelToRemove()) {
+                    jo.put(CHANNEL_TO_REMOVE, "true");
+                } else {
+                    jo.put(CHANNEL_TO_MERGE_WITH, portConfig.getMergeWith());
+                }
+                ja.put(jo);
+            }
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        return ja;
+    }
+
+    List<PatternPortsConfig> getPortsConfigurationFromJsonFile(JSONArray ja) {
+        List<PatternPortsConfig> _portsConfig = new ArrayList<PatternPortsConfig>();
+        for (int j = 0; j < ja.length(); j++) {
+            String taskOfChToConfig = ja.getJSONObject(j).getString(TASK_OF_CHANNEL_TO_CONFIG);
+            String chToConfig = ja.getJSONObject(j).getString(CHANNEL_TO_CONFIG);
+            PatternPortsConfig portConfig = new PatternPortsConfig(taskOfChToConfig, chToConfig);
+            if (ja.getJSONObject(j).has(CHANNEL_TO_MERGE_WITH)) {
+                portConfig.setMergeWith(ja.getJSONObject(j).getString(CHANNEL_TO_MERGE_WITH));
+            }else if (ja.getJSONObject(j).has(CHANNEL_TO_REMOVE)) {
+                portConfig.setIsChannelToRemove(true);
+            }
+            _portsConfig.add(portConfig);
+        }
+        return _portsConfig;
+    }
+
+    JSONArray addChannelsMappingInJsonFile(List<MappingPatternChannel> _channelsMapping) {
+        JSONArray ja = new JSONArray();
+        try {
+            for (MappingPatternChannel channelMapping : _channelsMapping) {
+                JSONObject jo = new JSONObject();
+                jo.put(CHANNEL_TO_MAP, channelMapping.getChannelToMapName());
+                jo.put(TASK_OF_CHANNEL_TO_MAP, channelMapping.getTaskOfChannelToMap());
+                if (channelMapping.getOrigin() == MappingPatternChannel.ORIGIN_CLONE) {
+                    jo.put(CHANNEL_MAPPING_ORIGIN, CHANNEL_MAPPING_ORIGIN_CLONE);
+                } else if (channelMapping.getOrigin() == MappingPatternChannel.ORIGIN_PATTERN) {
+                    jo.put(CHANNEL_MAPPING_ORIGIN, CHANNEL_MAPPING_ORIGIN_PATTERN);
+                } else if (channelMapping.getOrigin() == MappingPatternChannel.ORIGIN_MODEL) {
+                    jo.put(CHANNEL_MAPPING_ORIGIN, CHANNEL_MAPPING_ORIGIN_MODEL);
+                }
+                if (channelMapping.getChannelInSameMemAs() != null && channelMapping.getTaskOfChannelInSameMem() != null) {
+                    jo.put(CHANNEL_MAPPED_IN_SAME_MEM_AS, channelMapping.getChannelInSameMemAs());
+                    jo.put(TASK_OF_CHANNEL_SAME_MEM, channelMapping.getTaskOfChannelInSameMem());
+                    if (channelMapping.getSameMemAsOrigin() == MappingPatternChannel.ORIGIN_CLONE) {
+                        jo.put(CHANNEL_MAPPED_IN_SAME_MEM_AS_ORIGIN, CHANNEL_MAPPING_ORIGIN_CLONE);
+                    } else if (channelMapping.getSameMemAsOrigin() == MappingPatternChannel.ORIGIN_PATTERN) {
+                        jo.put(CHANNEL_MAPPED_IN_SAME_MEM_AS_ORIGIN, CHANNEL_MAPPING_ORIGIN_PATTERN);
+                    } else if (channelMapping.getSameMemAsOrigin() == MappingPatternChannel.ORIGIN_MODEL) {
+                        jo.put(CHANNEL_MAPPED_IN_SAME_MEM_AS_ORIGIN, CHANNEL_MAPPING_ORIGIN_MODEL);
+                    }
+                }
+                if (channelMapping.getBusNameForNewMem() != null) {
+                    jo.put(CHANNEL_MAPPED_IN_NEW_MEM_CONNECTED_TO_BUS, channelMapping.getBusNameForNewMem());
+                }
+                ja.put(jo);
+            }
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        return ja;
+    }
+
+    JSONArray addUpdatedPatternAttributesInJsonFile(LinkedHashMap<String, List<AttributeTaskJsonFile>> _updatedPatternAttributes) {
+        JSONArray ja = new JSONArray();
+        try {
+            for (String task : _updatedPatternAttributes.keySet()) {
+                for (AttributeTaskJsonFile attributeTask : _updatedPatternAttributes.get(task)) {
+                    JSONObject jo = new JSONObject();
+                    jo.put(TASK_ATTRIBUTE_NAME, task);
+                    jo.put(PatternCreation.NAME, attributeTask.getName());
+                    jo.put(PatternCreation.TYPE, attributeTask.getType());
+                    jo.put(PatternCreation.VALUE, attributeTask.getValue());
+                    ja.put(jo);
+                }
+            }
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        return ja;
+    }
+
+    JSONArray addChannelsWithSecurityInJsonFile(List<PatternChannelWithSecurity> _channelsWithSec) {
+        JSONArray ja = new JSONArray();
+        try {
+            for (PatternChannelWithSecurity channelWithSec : _channelsWithSec) {
+                JSONObject jo = new JSONObject();
+                jo.put(TASK_CHANNEL_WITH_SECURITY_NAME, channelWithSec.getChannelTaskName());
+                jo.put(PatternCreation.NAME, channelWithSec.getChannelName());
+                jo.put(PatternCreation.MODE, channelWithSec.getChannelMode());
+                if (channelWithSec.isConfidential()) {
+                    jo.put(PatternCreation.CONFIDENTIALITY, PatternCreation.WITH_CONFIDENTIALITY);
+                } else {
+                    jo.put(PatternCreation.CONFIDENTIALITY, PatternCreation.WITHOUT_CONFIDENTIALITY);
+                }
+                if (channelWithSec.getAuthenticity() == PatternChannelWithSecurity.NO_AUTHENTICITY) {
+                    jo.put(PatternCreation.AUTHENTICITY, PatternCreation.WITHOUT_AUTHENTICITY);
+                } else if (channelWithSec.getAuthenticity() == PatternChannelWithSecurity.WEAK_AUTHENTICITY) {
+                    jo.put(PatternCreation.AUTHENTICITY, PatternCreation.WEAK_AUTHENTICITY);
+                } else if (channelWithSec.getAuthenticity() == PatternChannelWithSecurity.STRONG_AUTHENTICITY) {
+                    jo.put(PatternCreation.AUTHENTICITY, PatternCreation.STRONG_AUTHENTICITY);
+                }
+                ja.put(jo);
+            }
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        return ja;
+    }
+
+    List<PatternChannelWithSecurity> getChannelsWithSecurityFromJsonFile(JSONArray ja) {
+        List<PatternChannelWithSecurity> _channelsWithSec = new ArrayList<PatternChannelWithSecurity>();
+        for (int j = 0; j < ja.length(); j++) {
+            String taskName = ja.getJSONObject(j).getString(TASK_CHANNEL_WITH_SECURITY_NAME);
+            String channelName = ja.getJSONObject(j).getString(PatternCreation.NAME);
+            String channelMode = ja.getJSONObject(j).getString(PatternCreation.MODE);
+            String channelConf = ja.getJSONObject(j).getString(PatternCreation.CONFIDENTIALITY);
+            String channelAuth = ja.getJSONObject(j).getString(PatternCreation.AUTHENTICITY);
+            PatternChannelWithSecurity channelWithSecurity = new PatternChannelWithSecurity(taskName, channelName, channelMode);
+            if (channelConf.toLowerCase().equals(PatternCreation.WITHOUT_CONFIDENTIALITY.toLowerCase())) {
+                channelWithSecurity.setIsConfidential(false);
+            } else if (channelConf.toLowerCase().equals(PatternCreation.WITH_CONFIDENTIALITY.toLowerCase())) {
+                channelWithSecurity.setIsConfidential(true);
+            }
+            if (channelAuth.toLowerCase().equals(PatternCreation.WITHOUT_AUTHENTICITY.toLowerCase())) {
+                channelWithSecurity.setAuthenticity(PatternChannelWithSecurity.NO_AUTHENTICITY);
+            } else if (channelAuth.toLowerCase().equals(PatternCreation.WEAK_AUTHENTICITY.toLowerCase())) {
+                channelWithSecurity.setAuthenticity(PatternChannelWithSecurity.WEAK_AUTHENTICITY);
+            } else if (channelAuth.toLowerCase().equals(PatternCreation.STRONG_AUTHENTICITY.toLowerCase())) {
+                channelWithSecurity.setAuthenticity(PatternChannelWithSecurity.STRONG_AUTHENTICITY);
+            }
+            
+            _channelsWithSec.add(channelWithSecurity);
+        }
+        return _channelsWithSec;
+    }
+
+    LinkedHashMap<String, List<AttributeTaskJsonFile>> getUpdatedPatternAttributesFromJsonFile(JSONArray ja) {
+        LinkedHashMap<String, List<AttributeTaskJsonFile>> _updatedPatternAttributes = new LinkedHashMap<String, List<AttributeTaskJsonFile>>();
+        for (int j = 0; j < ja.length(); j++) {
+            String taskName = ja.getJSONObject(j).getString(TASK_ATTRIBUTE_NAME);
+            String attributeName = ja.getJSONObject(j).getString(PatternCreation.NAME);
+            String attributeType = ja.getJSONObject(j).getString(PatternCreation.TYPE);
+            String attributeValue = ja.getJSONObject(j).getString(PatternCreation.VALUE);
+            if (_updatedPatternAttributes.containsKey(taskName)) {
+                AttributeTaskJsonFile attrib = new AttributeTaskJsonFile(attributeName, attributeType, attributeValue);
+                _updatedPatternAttributes.get(taskName).add(attrib);
+            } else {
+                List<AttributeTaskJsonFile> listAttrib = new ArrayList<AttributeTaskJsonFile>();
+                AttributeTaskJsonFile attrib = new AttributeTaskJsonFile(attributeName, attributeType, attributeValue);
+                listAttrib.add(attrib);
+                _updatedPatternAttributes.put(taskName, listAttrib);
+            }
+        }
+        return _updatedPatternAttributes;
+    }
+
+    List<MappingPatternChannel> getChannelsMappingFromJsonFile(JSONArray ja) {
+        List<MappingPatternChannel> _channelsMapping = new ArrayList<MappingPatternChannel>();
+        for (int j = 0; j < ja.length(); j++) {
+            String channelToMap = ja.getJSONObject(j).getString(CHANNEL_TO_MAP);
+            String taskOfChannelToMap = ja.getJSONObject(j).getString(TASK_OF_CHANNEL_TO_MAP);
+            int originChannel = -1;
+            String channelToMapOrigin = ja.getJSONObject(j).getString(CHANNEL_MAPPING_ORIGIN);
+            if (channelToMapOrigin.equals(CHANNEL_MAPPING_ORIGIN_CLONE)) {
+                originChannel = MappingPatternChannel.ORIGIN_CLONE;
+            } else if (channelToMapOrigin.equals(CHANNEL_MAPPING_ORIGIN_PATTERN)) {
+                originChannel = MappingPatternChannel.ORIGIN_PATTERN;
+            } else if (channelToMapOrigin.equals(CHANNEL_MAPPING_ORIGIN_MODEL)) {
+                originChannel = MappingPatternChannel.ORIGIN_MODEL;
+            }
+            MappingPatternChannel mappingPatternChannel = new MappingPatternChannel(taskOfChannelToMap, channelToMap, originChannel);
+
+            if (ja.getJSONObject(j).has(CHANNEL_MAPPED_IN_SAME_MEM_AS) && ja.getJSONObject(j).has(TASK_OF_CHANNEL_SAME_MEM)) {
+                int sameMemAsOrigin = -1;
+                String sameChannelMemAsOrigin =  ja.getJSONObject(j).getString(CHANNEL_MAPPED_IN_SAME_MEM_AS_ORIGIN);
+                if (sameChannelMemAsOrigin.equals(CHANNEL_MAPPING_ORIGIN_CLONE)) {
+                    sameMemAsOrigin = MappingPatternChannel.ORIGIN_CLONE;
+                } else if (sameChannelMemAsOrigin.equals(TASK_MAPPING_ORIGIN_PATTERN)) {
+                    sameMemAsOrigin = MappingPatternChannel.ORIGIN_PATTERN;
+                } else if (sameChannelMemAsOrigin.equals(TASK_MAPPING_ORIGIN_MODEL)) {
+                    sameMemAsOrigin = MappingPatternChannel.ORIGIN_MODEL;
+                }
+                mappingPatternChannel.setTaskAndChannelInSameMem(ja.getJSONObject(j).getString(TASK_OF_CHANNEL_SAME_MEM), ja.getJSONObject(j).getString(CHANNEL_MAPPED_IN_SAME_MEM_AS), sameMemAsOrigin);
+            }else if (ja.getJSONObject(j).has(CHANNEL_MAPPED_IN_NEW_MEM_CONNECTED_TO_BUS)) {
+                mappingPatternChannel.setBusNameForNewMem(ja.getJSONObject(j).getString(CHANNEL_MAPPED_IN_NEW_MEM_CONNECTED_TO_BUS));
+            }
+            _channelsMapping.add(mappingPatternChannel);
+            
+        }
+        return _channelsMapping;
+    }
+
+    JSONArray addTasksMappingInJsonFile(List<MappingPatternTask> _tasksMapping) {
+        JSONArray ja = new JSONArray();
+        try {
+            for (MappingPatternTask taskMapping : _tasksMapping) {
+                JSONObject jo = new JSONObject();
+                jo.put(TASK_TO_MAP, taskMapping.getTaskToMapName());
+                if (taskMapping.getOrigin() == MappingPatternTask.ORIGIN_CLONE) {
+                    jo.put(TASK_MAPPING_ORIGIN, TASK_MAPPING_ORIGIN_CLONE);
+                } else if (taskMapping.getOrigin() == MappingPatternTask.ORIGIN_PATTERN) {
+                    jo.put(TASK_MAPPING_ORIGIN, TASK_MAPPING_ORIGIN_PATTERN);
+                }
+                if (taskMapping.getSameHwAs() != null) {
+                    jo.put(TASK_MAPPED_IN_SAME_HW_AS, taskMapping.getSameHwAs());
+                    if (taskMapping.getSameHwAsOrigin() == MappingPatternTask.ORIGIN_CLONE) {
+                        jo.put(TASK_MAPPED_IN_SAME_HW_AS_ORIGIN, TASK_MAPPING_ORIGIN_CLONE);
+                    } else if (taskMapping.getSameHwAsOrigin() == MappingPatternTask.ORIGIN_PATTERN) {
+                        jo.put(TASK_MAPPED_IN_SAME_HW_AS_ORIGIN, TASK_MAPPING_ORIGIN_PATTERN);
+                    } else if (taskMapping.getSameHwAsOrigin() == MappingPatternTask.ORIGIN_MODEL) {
+                        jo.put(TASK_MAPPED_IN_SAME_HW_AS_ORIGIN, TASK_MAPPING_ORIGIN_MODEL);
+                    }
+                    
+                } else if (taskMapping.getBusNameForNewHw() != null) {
+                    jo.put(TASK_MAPPED_IN_NEW_HW_CONNECTED_TO_BUS, taskMapping.getBusNameForNewHw());
+                }
+                ja.put(jo);
+            }
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        return ja;
+    }
+
+    List<MappingPatternTask> getTasksMappingFromJsonFile(JSONArray ja) {
+        List<MappingPatternTask> _tasksMapping = new ArrayList<MappingPatternTask>();
+        for (int j = 0; j < ja.length(); j++) {
+            String taskToMap = ja.getJSONObject(j).getString(TASK_TO_MAP);
+            String taskToMapOrigin = ja.getJSONObject(j).getString(TASK_MAPPING_ORIGIN);
+            int origin = -1;
+            if (taskToMapOrigin.equals(TASK_MAPPING_ORIGIN_CLONE)) {
+                origin = MappingPatternTask.ORIGIN_CLONE;
+            } else if (taskToMapOrigin.equals(TASK_MAPPING_ORIGIN_PATTERN)) {
+                origin = MappingPatternTask.ORIGIN_PATTERN;
+            }
+            MappingPatternTask mappingPatternTask = new MappingPatternTask(taskToMap, origin);
+            if (ja.getJSONObject(j).has(TASK_MAPPED_IN_NEW_HW_CONNECTED_TO_BUS)) {
+                mappingPatternTask.setBusNameForNewHw(ja.getJSONObject(j).getString(TASK_MAPPED_IN_NEW_HW_CONNECTED_TO_BUS));
+            } else if (ja.getJSONObject(j).has(TASK_MAPPED_IN_SAME_HW_AS)) {
+                int sameHwAsOrigin = -1;
+                String sameTaskHwAsOrigin = ja.getJSONObject(j).getString(TASK_MAPPED_IN_SAME_HW_AS_ORIGIN);
+                if (sameTaskHwAsOrigin.equals(TASK_MAPPING_ORIGIN_CLONE)) {
+                    sameHwAsOrigin = MappingPatternTask.ORIGIN_CLONE;
+                } else if (sameTaskHwAsOrigin.equals(TASK_MAPPING_ORIGIN_PATTERN)) {
+                    sameHwAsOrigin = MappingPatternTask.ORIGIN_PATTERN;
+                } else if (sameTaskHwAsOrigin.equals(TASK_MAPPING_ORIGIN_MODEL)) {
+                    sameHwAsOrigin = MappingPatternTask.ORIGIN_MODEL;
+                }
+                mappingPatternTask.setSameHwAs(ja.getJSONObject(j).getString(TASK_MAPPED_IN_SAME_HW_AS), sameHwAsOrigin);
+            }
+            _tasksMapping.add(mappingPatternTask);
+        }
+        return _tasksMapping;
+    }
+
+    JSONArray addConnectionInJsonFile(List<PatternConnection> _portsConnection) {
+        JSONArray ja = new JSONArray();
+        try {
+            for (PatternConnection portsConnection : _portsConnection) {
+                JSONObject jo = new JSONObject();
+                jo.put(PATTERN_TASK, portsConnection.getPatternTaskName());
+                jo.put(PATTERN_PORT, portsConnection.getPatternChannel());
+                jo.put(MODEL_TASK, portsConnection.getModelTaskName());
+                jo.put(MODEL_PORT, portsConnection.getModelChannelName());
+                
+                if (portsConnection.isNewPort()) {
+                    jo.put(NEW_PORT, "true");
+                } else {
+                    jo.put(NEW_PORT, "false");
+                }
+                ja.put(jo);
+                
+            }
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        return ja;
+    }
+
+    List<PatternConnection> getConnectionFromJsonFile(JSONArray ja) {
+        List<PatternConnection> _portsConnection = new ArrayList<PatternConnection>();
+        for (int j = 0; j < ja.length(); j++) {
+            String patternTask = ja.getJSONObject(j).getString(PATTERN_TASK);
+            String patternPort = ja.getJSONObject(j).getString(PATTERN_PORT);
+            String modelTask = ja.getJSONObject(j).getString(MODEL_TASK);
+            String modelPort = ja.getJSONObject(j).getString(MODEL_PORT);
+            String newPort =  ja.getJSONObject(j).getString(NEW_PORT);
+            boolean isNewPort = Boolean.parseBoolean(newPort);
+            PatternConnection patternConnection = new PatternConnection(patternTask, patternPort, modelTask, modelPort, isNewPort);
+            _portsConnection.add(patternConnection);
+        }
+        return _portsConnection;
+    }
+   
+}
diff --git a/src/main/java/tmltranslator/patternhandling/PatternConfiguration.java b/src/main/java/tmltranslator/patternhandling/PatternConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..87521a5f4dee88e3ec997163e599b8785b70cc65
--- /dev/null
+++ b/src/main/java/tmltranslator/patternhandling/PatternConfiguration.java
@@ -0,0 +1,356 @@
+/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
+ *
+ * ludovic.apvrille AT enst.fr
+ *
+ * This software is a computer program whose purpose is to allow the
+ * edition of TURTLE analysis, design and deployment diagrams, to
+ * allow the generation of RT-LOTOS or Java code from this diagram,
+ * and at last to allow the analysis of formal validation traces
+ * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
+ * from INRIA Rhone-Alpes.
+ *
+ * This software is governed by the CeCILL  license under French law and
+ * abiding by the rules of distribution of free software.  You can  use,
+ * modify and/ or redistribute the software under the terms of the CeCILL
+ * license as circulated by CEA, CNRS and INRIA at the following URL
+ * "http://www.cecill.info".
+ *
+ * As a counterpart to the access to the source code and  rights to copy,
+ * modify and redistribute granted by the license, users are provided only
+ * with a limited warranty  and the software's author,  the holder of the
+ * economic rights,  and the successive licensors  have only  limited
+ * liability.
+ *
+ * In this respect, the user's attention is drawn to the risks associated
+ * with loading,  using,  modifying and/or developing or reproducing the
+ * software by the user in light of its specific status of free software,
+ * that may mean  that it is complicated to manipulate,  and  that  also
+ * therefore means  that it is reserved for developers  and  experienced
+ * professionals having in-depth computer knowledge. Users are therefore
+ * encouraged to load and test the software's suitability as regards their
+ * requirements in conditions enabling the security of their systems and/or
+ * data to be ensured and,  more generally, to use and operate it in the
+ * same conditions as regards security.
+ *
+ * The fact that you are presently reading this means that you have had
+ * knowledge of the CeCILL license and that you accept its terms.
+ */
+
+
+package tmltranslator.patternhandling;
+/**
+ * Class PatternConfiguration
+ * 
+ * Creation: 07/09/2023
+ *
+ * @author Jawher JERRAY
+ * @version 1.0 07/09/2023
+ */
+ 
+import java.util.*;
+
+ 
+public class PatternConfiguration {
+
+    private List<PatternConnection> portsConnection; 
+    private List<PatternCloneTask> clonedTasks; 
+    private List<PatternPortsConfig> portsConfig; 
+    private List<MappingPatternTask> tasksMapping;
+    private List<MappingPatternChannel> channelsMapping;
+    private LinkedHashMap<String, List<AttributeTaskJsonFile>> updatedPatternAttributes;
+    private List<PatternChannelWithSecurity> channelsWithSecurity;
+
+    public PatternConfiguration(List<PatternConnection> portsConnection, List<PatternCloneTask> clonedTasks, List<PatternPortsConfig> portsConfig, List<MappingPatternTask> tasksMapping, List<MappingPatternChannel> channelsMapping, LinkedHashMap<String, List<AttributeTaskJsonFile>> updatedPatternAttributes, List<PatternChannelWithSecurity> channelsWithSecurity) {
+        this.portsConnection = portsConnection;
+        this.clonedTasks = clonedTasks;
+        this.portsConfig = portsConfig;
+        this.tasksMapping = tasksMapping;
+        this.channelsMapping = channelsMapping;
+        this.updatedPatternAttributes = updatedPatternAttributes;
+        this.channelsWithSecurity = channelsWithSecurity;
+    }
+
+    public PatternConfiguration() {
+        this.portsConnection = new ArrayList<PatternConnection>();
+        this.clonedTasks = new ArrayList<PatternCloneTask>();
+        this.portsConfig = new ArrayList<PatternPortsConfig>();
+        this.tasksMapping = new ArrayList<MappingPatternTask>();
+        this.channelsMapping = new ArrayList<MappingPatternChannel>();
+        this.updatedPatternAttributes = new LinkedHashMap<String, List<AttributeTaskJsonFile>>();
+        this.channelsWithSecurity = new ArrayList<PatternChannelWithSecurity>();
+    }
+
+    public List<PatternConnection> getPortsConnection() {
+        return portsConnection;
+    }
+
+    public List<PatternCloneTask> getClonedTasks() {
+        return clonedTasks;
+    }
+
+    public List<String> getClonedTasksName() {
+        List<String> cloneTasksName = new ArrayList<String>();
+        for (PatternCloneTask clonedTask : clonedTasks) {
+            cloneTasksName.add(clonedTask.getClonedTask());
+        }
+        return cloneTasksName;
+    }
+
+    public List<PatternPortsConfig> getPortsConfig() {
+        return portsConfig;
+    }
+
+    public List<MappingPatternTask> getTasksMapping() {
+        return tasksMapping;
+    }
+
+    public List<MappingPatternChannel> getChannelsMapping() {
+        return channelsMapping;
+    }
+
+    public LinkedHashMap<String, List<AttributeTaskJsonFile>> getUpdatedPatternAttributes() {
+        return updatedPatternAttributes;
+    }
+
+    public List<PatternChannelWithSecurity> getChannelsWithSecurity() {
+        return channelsWithSecurity;
+    }
+
+    public void setPortsConnection(List<PatternConnection> _portsConnection) {
+        portsConnection = _portsConnection;
+    }
+
+    public void setClonedTasks(List<PatternCloneTask> _clonedTasks) {
+        clonedTasks = _clonedTasks;
+    }
+
+    public void setPortsConfig(List<PatternPortsConfig> _portsConfig) {
+        portsConfig = _portsConfig;
+    }
+
+    public void setTasksMapping(List<MappingPatternTask> _tasksMapping) {
+        tasksMapping = _tasksMapping;
+    }
+
+    public void setChannelsMapping(List<MappingPatternChannel> _channelsMapping) {
+        channelsMapping = _channelsMapping;
+    }
+
+    public void setUpdatedPatternAttributes(LinkedHashMap<String, List<AttributeTaskJsonFile>> _updatedPatternAttributes) {
+        updatedPatternAttributes = _updatedPatternAttributes;
+    }
+
+    public void addPortsConnection(PatternConnection _portsConnection) {
+        portsConnection.add(_portsConnection);
+    }
+
+    public void addClonedTasks(PatternCloneTask _clonedTasks) {
+        clonedTasks.add(_clonedTasks);
+    }
+
+    public void addPortsConfig(PatternPortsConfig _portsConfig) {
+        portsConfig.add(_portsConfig);
+    }
+
+    public void addTasksMapping(MappingPatternTask _tasksMapping) {
+        tasksMapping.add(_tasksMapping);
+    }
+
+    public void addChannelsMapping(MappingPatternChannel _channelsMapping) {
+        channelsMapping.add(_channelsMapping);
+    }
+
+    public void setChannelsWithSecurity(List<PatternChannelWithSecurity> _channelsWithSecurity) {
+        channelsWithSecurity = _channelsWithSecurity;
+    }
+
+    public void removeClonedTask(PatternCloneTask _clonedTasks) {
+        clonedTasks.remove(_clonedTasks);
+    }
+
+    public void loadChannelsWithSecurity(LinkedHashMap<String, TaskPattern> patternTasksAll) {
+        for (String taskName : patternTasksAll.keySet()) {
+            for (PortTaskJsonFile portTaskExt : patternTasksAll.get(taskName).getExternalPorts()) {
+                if (portTaskExt.getType().equals(PatternCreation.CHANNEL)) {
+                    if (portTaskExt.getConfidentiality().toUpperCase().equals(PatternCreation.WITH_CONFIDENTIALITY.toUpperCase()) || !portTaskExt.getAuthenticity().toUpperCase().equals(PatternCreation.WITHOUT_AUTHENTICITY.toUpperCase())) {
+                        PatternChannelWithSecurity patternChannelWithSecurity = new PatternChannelWithSecurity(taskName, portTaskExt.getName(), portTaskExt.getMode());
+                        if (portTaskExt.getConfidentiality().toUpperCase().equals(PatternCreation.WITH_CONFIDENTIALITY.toUpperCase())) {
+                            patternChannelWithSecurity.setIsConfidential(true);
+                        } else if (portTaskExt.getConfidentiality().toUpperCase().equals(PatternCreation.WITHOUT_CONFIDENTIALITY.toUpperCase())) {
+                            patternChannelWithSecurity.setIsConfidential(false);
+                        }
+                        if (portTaskExt.getAuthenticity().toUpperCase().equals(PatternCreation.WITHOUT_AUTHENTICITY.toUpperCase())) {
+                            patternChannelWithSecurity.setAuthenticity(PatternChannelWithSecurity.NO_AUTHENTICITY);
+                        } else if (portTaskExt.getAuthenticity().toUpperCase().equals(PatternCreation.WEAK_AUTHENTICITY.toUpperCase())) {
+                            patternChannelWithSecurity.setAuthenticity(PatternChannelWithSecurity.WEAK_AUTHENTICITY);
+                        } else if (portTaskExt.getAuthenticity().toUpperCase().equals(PatternCreation.STRONG_AUTHENTICITY.toUpperCase())) {
+                            patternChannelWithSecurity.setAuthenticity(PatternChannelWithSecurity.STRONG_AUTHENTICITY);
+                        }
+                        channelsWithSecurity.add(patternChannelWithSecurity);
+                    }
+                }
+            }
+            for (PortTaskJsonFile portTaskInt : patternTasksAll.get(taskName).getInternalPorts()) {
+                if (portTaskInt.getType().equals(PatternCreation.CHANNEL)) {
+                    if (portTaskInt.getConfidentiality().toUpperCase().equals(PatternCreation.WITH_CONFIDENTIALITY.toUpperCase()) || !portTaskInt.getAuthenticity().toUpperCase().equals(PatternCreation.WITHOUT_AUTHENTICITY.toUpperCase())) {
+                        PatternChannelWithSecurity patternChannelWithSecurity = new PatternChannelWithSecurity(taskName, portTaskInt.getName(), portTaskInt.getMode());
+                        if (portTaskInt.getConfidentiality().toUpperCase().equals(PatternCreation.WITH_CONFIDENTIALITY.toUpperCase())) {
+                            patternChannelWithSecurity.setIsConfidential(true);
+                        } else if (portTaskInt.getConfidentiality().toUpperCase().equals(PatternCreation.WITHOUT_CONFIDENTIALITY.toUpperCase())) {
+                            patternChannelWithSecurity.setIsConfidential(false);
+                        }
+                        if (portTaskInt.getAuthenticity().toUpperCase().equals(PatternCreation.WITHOUT_AUTHENTICITY.toUpperCase())) {
+                            patternChannelWithSecurity.setAuthenticity(PatternChannelWithSecurity.NO_AUTHENTICITY);
+                        } else if (portTaskInt.getAuthenticity().toUpperCase().equals(PatternCreation.WEAK_AUTHENTICITY.toUpperCase())) {
+                            patternChannelWithSecurity.setAuthenticity(PatternChannelWithSecurity.WEAK_AUTHENTICITY);
+                        } else if (portTaskInt.getAuthenticity().toUpperCase().equals(PatternCreation.STRONG_AUTHENTICITY.toUpperCase())) {
+                            patternChannelWithSecurity.setAuthenticity(PatternChannelWithSecurity.STRONG_AUTHENTICITY);
+                        }
+                        channelsWithSecurity.add(patternChannelWithSecurity);
+                    }
+                }
+            }
+        }
+
+    }
+    /*public void loadConnectedPorts(Vector<String> connectedPortsFull) {
+        for (String connectedPort : connectedPortsFull) {
+            String[] splitO = connectedPort.split(JDialogPatternHandling.TASK_CHANNEL_SEPARATOR, 2);
+            String patternTaskName = splitO[0];
+            String[] splitCom = splitO[1].split(JDialogPatternHandling.PORT_CONNECTION_SEPARATOR, 2);
+            String patternTaskPortName = splitCom[0];
+            String[] splitComModel = splitCom[1].split(JDialogPatternHandling.TASK_CHANNEL_SEPARATOR, 2);
+            String modelTaskName = splitComModel[0];
+            String[] splitComModelPort = splitComModel[1].split(JDialogPatternHandling.NEW_PORT_OPTION, 2);
+            String modelTaskPortName = splitComModelPort[0];
+            if (portsConnection.containsKey(patternTaskName)) {
+                if (splitComModel[1].equals(modelTaskPortName)) {
+                    String[] portConnecMap = new String[3];
+                    portConnecMap[0] = patternTaskPortName;
+                    portConnecMap[1] = modelTaskName;
+                    portConnecMap[2] = modelTaskPortName;
+                    portsConnection.get(patternTaskName).add(portConnecMap);
+                } else {
+                    String[] portConnecMap = new String[4];
+                    portConnecMap[0] = patternTaskPortName;
+                    portConnecMap[1] = modelTaskName;
+                    portConnecMap[2] = modelTaskPortName;
+                    portConnecMap[3] = JDialogPatternHandling.NEW_PORT_OPTION;
+                    portsConnection.get(patternTaskName).add(portConnecMap);
+                }
+            } else {
+                if (splitComModel[1].equals(modelTaskPortName)) {
+                    String[] portConnecMap = new String[3];
+                    portConnecMap[0] = patternTaskPortName;
+                    portConnecMap[1] = modelTaskName;
+                    portConnecMap[2] = modelTaskPortName;
+                    ArrayList<String[]> portConnecMapList = new ArrayList<String[]>();
+                    portConnecMapList.add(portConnecMap);
+                    portsConnection.put(patternTaskName, portConnecMapList);
+                } else {
+                    String[] portConnecMap = new String[4];
+                    portConnecMap[0] = patternTaskPortName;
+                    portConnecMap[1] = modelTaskName;
+                    portConnecMap[2] = modelTaskPortName;
+                    portConnecMap[3] = JDialogPatternHandling.NEW_PORT_OPTION;
+                    ArrayList<String[]> portConnecMapList = new ArrayList<String[]>();
+                    portConnecMapList.add(portConnecMap);
+                    portsConnection.put(patternTaskName, portConnecMapList);
+                }
+            }
+        }
+    }
+
+    public void loadPortsConfig(Vector<String> portsConfigFull) {
+        for (String configuredPort : portsConfigFull) {
+            String[] configuredPortSplit = configuredPort.split(JDialogPatternHandling.TASK_CHANNEL_SEPARATOR);
+            String[] portConfigRemoveSplit = configuredPortSplit[1].split(JDialogPatternHandling.PORT_CONFIGURATION_SEPARATOR + JDialogPatternHandling.REMOVE_PORT_OPTION);
+            String[] portConfigMergeSplit = configuredPortSplit[1].split(JDialogPatternHandling.PORT_CONFIGURATION_SEPARATOR + JDialogPatternHandling.MERGE_PORT_OPTION);
+            if (portsConfig.containsKey(configuredPortSplit[0])) {
+                if (!configuredPortSplit[1].equals(portConfigRemoveSplit[0])) {
+                    Entry<String,String> portConfig = new AbstractMap.SimpleEntry<>(portConfigRemoveSplit[0], "");
+                    portsConfig.get(configuredPortSplit[0]).add(portConfig);
+                } else if (portConfigMergeSplit.length > 1) {
+                    Entry<String,String> portConfig = new AbstractMap.SimpleEntry<>(portConfigMergeSplit[0], portConfigMergeSplit[1]);
+                    portsConfig.get(configuredPortSplit[0]).add(portConfig);
+                }
+            } else {
+                if (!configuredPortSplit[1].equals(portConfigRemoveSplit[0])) {
+                    Entry<String,String> portConfig = new AbstractMap.SimpleEntry<>(portConfigRemoveSplit[0], "");
+                    portsConfig.put(configuredPortSplit[0], new ArrayList<Entry<String,String>>(Arrays.asList(portConfig)));
+                } else if (portConfigMergeSplit.length > 1) {
+                    Entry<String,String> portConfig = new AbstractMap.SimpleEntry<>(portConfigMergeSplit[0], portConfigMergeSplit[1]);
+                    portsConfig.put(configuredPortSplit[0], new ArrayList<Entry<String,String>>(Arrays.asList(portConfig)));
+                }
+            }
+        }
+    }
+    
+    public void loadMappedTasks(Vector<String> mappedTasks) {
+        for (String mappedTask : mappedTasks) {
+            String[] mappedTaskSplitSameHw = mappedTask.split(JDialogPatternHandling.MAP_TASK_IN_SAME_HW_SEPARATOR);
+            String[] mappedTaskSplitNewHw = mappedTask.split(JDialogPatternHandling.MAP_TASK_IN_NEW_HW_SEPARATOR);
+            if (mappedTaskSplitSameHw.length > 1) {
+                Entry<String,String> taskMap = new AbstractMap.SimpleEntry<>(JDialogPatternHandling.SAME_HW, mappedTaskSplitSameHw[1]);
+                tasksMapping.put(mappedTaskSplitSameHw[0], taskMap);
+            } else if (mappedTaskSplitNewHw.length > 1) {
+                Entry<String,String> taskMap = new AbstractMap.SimpleEntry<>(JDialogPatternHandling.NEW_HW, mappedTaskSplitNewHw[1]);
+                tasksMapping.put(mappedTaskSplitNewHw[0], taskMap);
+            }
+        }
+    }
+
+    public void loadMappedChannels(Vector<String> mappedChannels) {
+        for (String mappedChannel : mappedChannels) {
+            String[] mappedChannelSplit= mappedChannel.split(JDialogPatternHandling.TASK_CHANNEL_SEPARATOR, 2);
+            String[] mappedChannelSplitSameMem = mappedChannelSplit[1].split(JDialogPatternHandling.MAP_CHANNEL_IN_SAME_MEMORY_SEPARATOR);
+            String[] mappedChannelSplitNewMem = mappedChannelSplit[1].split(JDialogPatternHandling.MAP_CHANNEL_IN_NEW_MEMORY_SEPARATOR);
+            if (channelsMapping.containsKey(mappedChannelSplit[0])) {
+                if (mappedChannelSplitSameMem.length > 1) {
+                    String[] channelMap = new String[4];
+                    String[] mappedChannelSplitSameMemTaskChannel = mappedChannelSplitSameMem[1].split(JDialogPatternHandling.TASK_CHANNEL_SEPARATOR, 2);
+                    channelMap[0] = JDialogPatternHandling.SAME_MEMORY;
+                    channelMap[1] = mappedChannelSplitSameMem[0];
+                    channelMap[2] = mappedChannelSplitSameMemTaskChannel[0];
+                    channelMap[3] = mappedChannelSplitSameMemTaskChannel[1];
+                    channelsMapping.get(mappedChannelSplit[0]).add(channelMap);
+                } else if (mappedChannelSplitNewMem.length > 1) {
+                    String[] channelMap = new String[3];
+                    channelMap[0] = JDialogPatternHandling.NEW_MEMORY;
+                    channelMap[1] = mappedChannelSplitNewMem[0];
+                    channelMap[2] = mappedChannelSplitNewMem[1];
+                    channelsMapping.get(mappedChannelSplit[0]).add(channelMap);
+                }
+            } else {
+                if (mappedChannelSplitSameMem.length > 1) {
+                    String[] channelMap = new String[4];
+                    String[] mappedChannelSplitSameMemTaskChannel = mappedChannelSplitSameMem[1].split(JDialogPatternHandling.TASK_CHANNEL_SEPARATOR, 2);
+                    channelMap[0] = JDialogPatternHandling.SAME_MEMORY;
+                    channelMap[1] = mappedChannelSplitSameMem[0];
+                    channelMap[2] = mappedChannelSplitSameMemTaskChannel[0];
+                    channelMap[3] = mappedChannelSplitSameMemTaskChannel[1];
+                    ArrayList<String[]> channelMapList = new ArrayList<String[]>();
+                    channelMapList.add(channelMap);
+                    channelsMapping.put(mappedChannelSplit[0], channelMapList);
+                } else if (mappedChannelSplitNewMem.length > 1) {
+                    String[] channelMap = new String[3];
+                    channelMap[0] = JDialogPatternHandling.NEW_MEMORY;
+                    channelMap[1] = mappedChannelSplitNewMem[0];
+                    channelMap[2] = mappedChannelSplitNewMem[1];
+                    ArrayList<String[]> channelMapList = new ArrayList<String[]>();
+                    channelMapList.add(channelMap);
+                    channelsMapping.put(mappedChannelSplit[0], channelMapList);
+                }
+            }
+        }
+    }
+
+    public void loadClonedTasks(Vector<String> _clonedTasks) {
+        for (String clonedTask : _clonedTasks) {
+            String[] clonedTaskSplit = clonedTask.split(JDialogPatternHandling.CLONE_TASK_SEPARATOR);
+            if (clonedTaskSplit.length > 1) {
+                clonedTasks.put(clonedTaskSplit[0], clonedTaskSplit[1]);
+            }
+        }
+    }*/
+}
diff --git a/src/main/java/tmltranslator/patternhandling/PatternConnection.java b/src/main/java/tmltranslator/patternhandling/PatternConnection.java
new file mode 100644
index 0000000000000000000000000000000000000000..55591278a4b1f1699d78bd7bc5d5f29a9a94a6d4
--- /dev/null
+++ b/src/main/java/tmltranslator/patternhandling/PatternConnection.java
@@ -0,0 +1,155 @@
+/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
+ *
+ * ludovic.apvrille AT enst.fr
+ *
+ * This software is a computer program whose purpose is to allow the
+ * edition of TURTLE analysis, design and deployment diagrams, to
+ * allow the generation of RT-LOTOS or Java code from this diagram,
+ * and at last to allow the analysis of formal validation traces
+ * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
+ * from INRIA Rhone-Alpes.
+ *
+ * This software is governed by the CeCILL  license under French law and
+ * abiding by the rules of distribution of free software.  You can  use,
+ * modify and/ or redistribute the software under the terms of the CeCILL
+ * license as circulated by CEA, CNRS and INRIA at the following URL
+ * "http://www.cecill.info".
+ *
+ * As a counterpart to the access to the source code and  rights to copy,
+ * modify and redistribute granted by the license, users are provided only
+ * with a limited warranty  and the software's author,  the holder of the
+ * economic rights,  and the successive licensors  have only  limited
+ * liability.
+ *
+ * In this respect, the user's attention is drawn to the risks associated
+ * with loading,  using,  modifying and/or developing or reproducing the
+ * software by the user in light of its specific status of free software,
+ * that may mean  that it is complicated to manipulate,  and  that  also
+ * therefore means  that it is reserved for developers  and  experienced
+ * professionals having in-depth computer knowledge. Users are therefore
+ * encouraged to load and test the software's suitability as regards their
+ * requirements in conditions enabling the security of their systems and/or
+ * data to be ensured and,  more generally, to use and operate it in the
+ * same conditions as regards security.
+ *
+ * The fact that you are presently reading this means that you have had
+ * knowledge of the CeCILL license and that you accept its terms.
+ */
+
+
+package tmltranslator.patternhandling;
+/**
+ * Class PatternConnection
+ * 
+ * Creation: 25/10/2023
+ *
+ * @author Jawher JERRAY
+ * @version 1.0 25/10/2023
+ */
+ 
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+import tmltranslator.*;
+
+ 
+public class PatternConnection {
+    //public static final int NO_AUTHENTICITY = 0; 
+    //public static final int WEAK_AUTHENTICITY = 1; 
+    //public static final int STRONG_AUTHENTICITY = 2;
+    public final static String PORT_CONNECTION_SEPARATOR = " <-> ";
+    public final static String NEW_PORT_OPTION = " New port";
+    public final static String TASK_CHANNEL_SEPARATOR = "::";
+
+    private String patternTaskName;
+    private String patternChannel;
+    private String modelTaskName;
+    private String modelChannelName;
+    private Boolean isNewPort;
+
+    public PatternConnection(String patternTaskName, String patternChannel, String modelTaskName, String modelChannelName, Boolean isNewPort) {
+        this.patternTaskName = patternTaskName;
+        this.patternChannel = patternChannel;
+        this.modelTaskName = modelTaskName;
+        this.modelChannelName = modelChannelName;
+        this.isNewPort = isNewPort;
+    }
+
+    public String getPatternTaskName() {
+        return patternTaskName;
+    }
+
+    public String getPatternChannel() {
+        return patternChannel;
+    }
+
+    public String getModelTaskName() {
+        return modelTaskName;
+    }
+
+    public String getModelChannelName() {
+        return modelChannelName;
+    }
+
+    public Boolean isNewPort() {
+        return isNewPort;
+    }
+
+    public void setPatternTaskName(String _patternTaskName) {
+        patternTaskName = _patternTaskName;
+    }
+
+    public void setPatternChannel(String _patternChannel) {
+        patternChannel = _patternChannel;
+    }
+
+    public void setModelTaskName(String _modelTaskName) {
+        modelTaskName = _modelTaskName;
+    }
+
+    public void setModelChannelName(String _modelChannelName) {
+        modelChannelName = _modelChannelName;
+    }
+
+    public void setIsNewPort(Boolean _isNewPort) {
+        isNewPort = _isNewPort;
+    }
+
+    public String getStringDisplay() {
+        if (isNewPort) {
+            return (patternTaskName + TASK_CHANNEL_SEPARATOR + patternChannel + PORT_CONNECTION_SEPARATOR + modelTaskName + TASK_CHANNEL_SEPARATOR+ modelChannelName + NEW_PORT_OPTION);
+        } else {
+            return (patternTaskName + TASK_CHANNEL_SEPARATOR + patternChannel + PORT_CONNECTION_SEPARATOR + modelTaskName + TASK_CHANNEL_SEPARATOR+ modelChannelName);
+        }
+        
+    }
+    
+    public boolean isANewChannelRequired(List<PatternConnection> patternConnectionList, LinkedHashMap<String, TaskPattern> patternTasks, List<PatternCloneTask> patternCloneTasks) {
+        if (this.isNewPort()) {
+            return true;
+        } else {
+            List<String> similarTasks = new ArrayList<String>();
+            for (PatternCloneTask patternCloneTask : patternCloneTasks) {
+                if (patternCloneTask.getClonedTask().equals(this.getModelTaskName())) {
+                    for (PatternCloneTask patternCloneTask0 : patternCloneTasks) {
+                        if (patternCloneTask.getTaskToClone().equals(patternCloneTask0.getTaskToClone())) {
+                            similarTasks.add(patternCloneTask0.getClonedTask());
+                        }
+                    }
+                    similarTasks.add(patternCloneTask.getTaskToClone());
+                }
+            }
+            for (PatternConnection patternConnection: patternConnectionList) {
+                if (patternConnection != this && this.getModelChannelName().equals(patternConnection.getModelChannelName()) && !this.getModelTaskName().equals(patternConnection.getModelTaskName()) && !patternConnection.isNewPort() && !similarTasks.contains(patternConnection.getModelTaskName())) {
+                    for (PortTaskJsonFile portTaskJsonFile : patternTasks.get(this.getPatternTaskName()).getExternalPorts()) {
+                        if (this.getPatternChannel().equals(portTaskJsonFile.getName()) && portTaskJsonFile.getMode().equals(PatternCreation.MODE_OUTPUT)) {
+                            return true;
+                        }
+                    }
+                }
+            }
+        }
+        return false;
+    }
+}
diff --git a/src/main/java/tmltranslator/patternhandling/PatternCreation.java b/src/main/java/tmltranslator/patternhandling/PatternCreation.java
new file mode 100644
index 0000000000000000000000000000000000000000..71dca2d4fbbf2e11dd87ec28a87012628a5a89ab
--- /dev/null
+++ b/src/main/java/tmltranslator/patternhandling/PatternCreation.java
@@ -0,0 +1,464 @@
+/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
+ *
+ * ludovic.apvrille AT enst.fr
+ *
+ * This software is a computer program whose purpose is to allow the
+ * edition of TURTLE analysis, design and deployment diagrams, to
+ * allow the generation of RT-LOTOS or Java code from this diagram,
+ * and at last to allow the analysis of formal validation traces
+ * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
+ * from INRIA Rhone-Alpes.
+ *
+ * This software is governed by the CeCILL  license under French law and
+ * abiding by the rules of distribution of free software.  You can  use,
+ * modify and/ or redistribute the software under the terms of the CeCILL
+ * license as circulated by CEA, CNRS and INRIA at the following URL
+ * "http://www.cecill.info".
+ *
+ * As a counterpart to the access to the source code and  rights to copy,
+ * modify and redistribute granted by the license, users are provided only
+ * with a limited warranty  and the software's author,  the holder of the
+ * economic rights,  and the successive licensors  have only  limited
+ * liability.
+ *
+ * In this respect, the user's attention is drawn to the risks associated
+ * with loading,  using,  modifying and/or developing or reproducing the
+ * software by the user in light of its specific status of free software,
+ * that may mean  that it is complicated to manipulate,  and  that  also
+ * therefore means  that it is reserved for developers  and  experienced
+ * professionals having in-depth computer knowledge. Users are therefore
+ * encouraged to load and test the software's suitability as regards their
+ * requirements in conditions enabling the security of their systems and/or
+ * data to be ensured and,  more generally, to use and operate it in the
+ * same conditions as regards security.
+ *
+ * The fact that you are presently reading this means that you have had
+ * knowledge of the CeCILL license and that you accept its terms.
+ */
+
+
+package tmltranslator.patternhandling;
+/**
+ * Class PatternCreation
+ * Pattern Creation in separate thread
+ * Creation: 18/08/2023
+ *
+ * @author Jawher JERRAY
+ * @version 1.0 18/08/2023
+ */
+ 
+import myutil.TraceManager;
+import tmltranslator.*;
+
+import java.io.FileWriter;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.*;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+ 
+public class PatternCreation implements Runnable {
+    public final static String MODE_INPUT = "input";
+    public final static String MODE_OUTPUT = "output";
+    public final static String CHANNEL = "channel";
+    public final static String CONFIDENTIALITY = "confidentiality";
+    public final static String WITHOUT_CONFIDENTIALITY = "No";
+    public final static String WITH_CONFIDENTIALITY = "Yes";
+    public final static String AUTHENTICITY = "authenticity";
+    public final static String STRONG_AUTHENTICITY = "strong";
+    public final static String WEAK_AUTHENTICITY = "weak";
+    public final static String WITHOUT_AUTHENTICITY = "No";
+    public final static String EVENT = "event";
+    public final static String NAME = "name";
+    public final static String TYPE = "type";
+    public final static String MODE = "mode";
+    public final static String TASK = "task";
+    public final static String VALUE = "value";
+    public final static String EXTERNALPORTS = "externalPorts";
+    public final static String INTERNALPORTS = "internalPorts";
+    public final static String ATTRIBUTES = "attributes";
+
+	private List<String> selectedTasks;
+	private String patternName;
+    private String patternsPath;
+	private TMLMapping<?> tmap;
+
+    public PatternCreation(List<String> _selectedTasks, String _patternName, String _patternsPath, TMLMapping<?> tmap) {
+		this.selectedTasks = _selectedTasks;
+		this.patternName = _patternName;
+		this.patternsPath = _patternsPath;
+		this.tmap = tmap;
+	}
+    
+	public void startThread() {
+		Thread t = new Thread(this);
+		t.start();
+		try {
+			t.join();
+		}
+		catch (Exception e) {
+			TraceManager.addDev("Error in Pattern Creation Thread");
+		}
+		return;
+	}
+
+    public void run() {
+    	TraceManager.addDev("Creating Pattern");
+        if (tmap == null) {
+            return;
+        }
+
+        TMLModeling<?> tmlmNew = tmap.getTMLModeling();
+        for (TMLTask task : tmlmNew.getTasks()) {
+            String[] taskNameSplit = task.getName().split("__");
+            task.setName(taskNameSplit[taskNameSplit.length-1]);
+        }
+        for (TMLChannel ch : tmlmNew.getChannels()) {
+            String[] channelNameSplit = ch.getName().split("__");
+            ch.setName(channelNameSplit[channelNameSplit.length-1]);
+        }
+        for (TMLEvent evt : tmlmNew.getEvents()) {
+            String[] eventNameSplit = evt.getName().split("__");
+            evt.setName(eventNameSplit[eventNameSplit.length-1]);
+        }
+        for (TMLRequest req : tmlmNew.getRequests()) {
+            String[] requestNameSplit = req.getName().split("__");
+            req.setName(requestNameSplit[requestNameSplit.length-1]);
+        }
+        if (generateTMLTxt(patternName)) {
+            TraceManager.addDev("Done TML generation");
+            if (generatePatternFile(patternName)) {
+                TraceManager.addDev("Done Pattern JSON File generation");
+            } 
+        }
+        
+	}
+
+    @SuppressWarnings("unchecked")
+    public boolean generateTMLTxt(String _title) {
+        TMLMappingTextSpecification<Class<?>> spec = new TMLMappingTextSpecification<Class<?>>(_title);
+        spec.toTextFormat((TMLMapping<Class<?>>) tmap);
+        try {
+            String pathNewPattern = patternsPath + patternName + "/";
+            Files.createDirectories(Paths.get(pathNewPattern));
+            spec.saveFile(pathNewPattern, patternName);
+        } catch (Exception e) {
+            TraceManager.addError("Files could not be saved: " + e.getMessage());
+            return false;
+        }
+        return true;
+    }
+
+    public boolean generatePatternFile(String _title) {
+        List<TMLChannel> listExternalChannels = new ArrayList<TMLChannel>();
+        List<TMLEvent> listExternalEvents = new ArrayList<TMLEvent>();
+        JSONArray listTasks = new JSONArray();
+        try {
+            FileWriter file = new FileWriter(patternsPath+patternName+"/"+patternName+".json");
+            for (String selectedTask1 : selectedTasks) {
+                TMLTask task1 = tmap.getTMLModeling().getTMLTaskByName(selectedTask1);
+                if (task1 != null) {
+                    JSONArray listAttributes = new JSONArray();
+                    JSONArray listExternalPorts = new JSONArray();
+                    JSONArray listInternalPorts = new JSONArray();
+                    JSONObject joTask = new JSONObject();
+                    joTask.put(NAME, task1.getName());
+                    for(TMLAttribute attrib : task1.getAttributes()) {
+                        listAttributes.put(addAttributeInJsonFile(attrib));
+                    }
+                    joTask.put(ATTRIBUTES, listAttributes);
+                    for (int i=0; i < task1.getReadChannels().size(); i++) {
+                        for (int j=0 ; j < task1.getReadChannels().get(i).getNbOfChannels(); j++) {
+                            Boolean channelCheck = false;
+                            TMLChannel ch = task1.getReadChannels().get(i).getChannel(j);
+                            if (!listExternalChannels.contains(ch)) {
+                                for (String selectedTask2 : selectedTasks) {
+                                    if (selectedTask1 != selectedTask2) {
+                                        TMLTask task2 = tmap.getTMLModeling().getTMLTaskByName(selectedTask2);
+                                        if (task2 != null) {
+                                            channelCheck = isWriteChannelOfTask(ch, task2);
+                                            if (channelCheck) {
+                                                break;
+                                            }
+                                        }
+                                    }
+                                }
+                                if (!channelCheck) {
+                                    listExternalPorts.put(addChannelInJsonFile(ch, task1, MODE_INPUT));
+                                    listExternalChannels.add(ch);
+                                } else {
+                                    listInternalPorts.put(addChannelInJsonFile(ch, task1, MODE_INPUT));
+                                }
+                            }
+                        }
+                    }
+
+                    for (int i=0; i < task1.getWriteChannels().size(); i++) {
+                        for (int j=0 ; j < task1.getWriteChannels().get(i).getNbOfChannels(); j++) {
+                            Boolean channelCheck = false;
+                            TMLChannel ch = task1.getWriteChannels().get(i).getChannel(j);
+                            if (!listExternalChannels.contains(ch)) {
+                                for (String selectedTask2 : selectedTasks) {
+                                    if (selectedTask1 != selectedTask2) {
+                                        TMLTask task2 = tmap.getTMLModeling().getTMLTaskByName(selectedTask2);
+                                        if (task2 != null) {
+                                            channelCheck = isReadChannelOfTask(ch, task2);
+                                            if (channelCheck) {
+                                                break;
+                                            }
+                                        }
+                                    }
+                                }
+                                if (!channelCheck) {
+                                    listExternalPorts.put(addChannelInJsonFile(ch, task1, MODE_OUTPUT));
+                                    listExternalChannels.add(ch);
+                                } else {
+                                    listInternalPorts.put(addChannelInJsonFile(ch, task1, MODE_OUTPUT));
+                                }
+                            }
+                        }
+                    }
+                    
+                    for (int i=0; i < task1.getSendEvents().size(); i++) {
+                        TMLEvent event = task1.getSendEvents().get(i).getEvent();
+                        Boolean eventCheck = false;
+                        if(!listExternalEvents.contains(event)) {
+                            for (String selectedTask2 : selectedTasks) {
+                                if (selectedTask1 != selectedTask2) {
+                                    TMLTask task2 = tmap.getTMLModeling().getTMLTaskByName(selectedTask2);
+                                    if (task2 != null) {
+                                        eventCheck = isWaitEventOfTask(event, task2);
+                                        if (eventCheck) {
+                                            break;
+                                        }
+                                    }
+                                }
+                            }
+                            if (!eventCheck) {
+                                listExternalPorts.put(addEventInJsonFile(event, task1, MODE_OUTPUT));
+                                listExternalEvents.add(event);
+                            } else {
+                                listInternalPorts.put(addEventInJsonFile(event, task1, MODE_OUTPUT));
+                            }
+                            if (task1.getSendEvents().get(i).getEvents() != null) {
+                                for (int j=0 ; j < task1.getSendEvents().get(i).getEvents().size(); j++) {
+                                    eventCheck = false;
+                                    event = task1.getSendEvents().get(i).getEvents().get(j);
+                                    for (String selectedTask2 : selectedTasks) {
+                                        if (selectedTask1 != selectedTask2) {
+                                            TMLTask task2 = tmap.getTMLModeling().getTMLTaskByName(selectedTask2);
+                                            if (task2 != null) {
+                                                eventCheck = isWaitEventOfTask(event, task2);
+                                                if (eventCheck) {
+                                                    break;
+                                                }
+                                            }
+                                        }
+                                    }
+                                    if (!eventCheck) {
+                                        listExternalPorts.put(addEventInJsonFile(event, task1, MODE_OUTPUT));
+                                        listExternalEvents.add(event);
+                                    } else {
+                                        listInternalPorts.put(addEventInJsonFile(event, task1, MODE_OUTPUT));
+                                    }
+                                }
+                            }
+                        }
+                    }
+
+
+                    for (int i=0; i < task1.getWaitEvents().size(); i++) {
+                        TMLEvent event = task1.getWaitEvents().get(i).getEvent();
+                        Boolean eventCheck = false;
+                        if(!listExternalEvents.contains(event)) {
+                            for (String selectedTask2 : selectedTasks) {
+                                if (selectedTask1 != selectedTask2) {
+                                    TMLTask task2 = tmap.getTMLModeling().getTMLTaskByName(selectedTask2);
+                                    if (task2 != null) {
+                                        eventCheck = isSendEventOfTask(event, task2);
+                                        if (eventCheck) {
+                                            break;
+                                        }
+                                    }
+                                }
+                            }
+                            if (!eventCheck) {
+                                listExternalPorts.put(addEventInJsonFile(event, task1, MODE_INPUT));
+                                listExternalEvents.add(event);
+                            }  else {
+                                listInternalPorts.put(addEventInJsonFile(event, task1, MODE_INPUT));
+                            }
+                            if (task1.getWaitEvents().get(i).getEvents() != null) {
+                                for (int j=0 ; j < task1.getWaitEvents().get(i).getEvents().size(); j++) {
+                                    eventCheck = false;
+                                    event = task1.getWaitEvents().get(i).getEvents().get(j);
+                                    for (String selectedTask2 : selectedTasks) {
+                                        if (selectedTask1 != selectedTask2) {
+                                            TMLTask task2 = tmap.getTMLModeling().getTMLTaskByName(selectedTask2);
+                                            if (task2 != null) {
+                                                eventCheck = isSendEventOfTask(event, task2);
+                                                if (eventCheck) {
+                                                    break;
+                                                }
+                                            }
+                                        }
+                                    }
+                                    if (!eventCheck) {
+                                        listExternalPorts.put(addEventInJsonFile(event, task1, MODE_INPUT));
+                                        listExternalEvents.add(event);
+                                    } else {
+                                        listInternalPorts.put(addEventInJsonFile(event, task1, MODE_INPUT));
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    joTask.put(EXTERNALPORTS, listExternalPorts);
+                    joTask.put(INTERNALPORTS, listInternalPorts);
+                    listTasks.put(joTask);
+                }       
+            }
+            file.write(listTasks.toString(1));
+            file.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        
+        /*
+        try {
+            
+            file.write(jo.toString());
+            file.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } */
+
+        return true;
+    }
+
+    JSONObject addChannelInJsonFile(TMLChannel ch, TMLTask task, String mode) {
+        JSONObject jo = new JSONObject();
+        try {
+            jo.put(NAME, ch.getName());
+            jo.put(TASK, task.getName());
+            jo.put(TYPE, CHANNEL);
+            jo.put(MODE, mode);
+            jo.put(CONFIDENTIALITY, WITHOUT_CONFIDENTIALITY);
+            jo.put(AUTHENTICITY, WITHOUT_AUTHENTICITY);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        return jo;
+    }
+
+    JSONObject addEventInJsonFile(TMLEvent evt, TMLTask task, String mode) {
+        JSONObject jo = new JSONObject();
+        try {
+            jo.put(NAME, evt.getName());
+            jo.put(TASK, task.getName());
+            jo.put(TYPE, EVENT);
+            jo.put(MODE, mode);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        /*try {
+            file.write(jo.toString());
+            //file.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }*/
+        return jo;
+    }
+
+    JSONObject addAttributeInJsonFile(TMLAttribute attrib) {
+        JSONObject jo = new JSONObject();
+        try {
+            jo.put(NAME, attrib.getName());
+            jo.put(TYPE, attrib.getType());
+            jo.put(VALUE, attrib.getInitialValue());
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        return jo;
+    }
+    
+
+    List<TMLChannel> getListChannelsBetweenTwoTasks(TMLTask originTask, TMLTask destinationTask) {
+        List<TMLChannel> channels = new ArrayList<TMLChannel>();
+        if (originTask.getWriteChannels().size() > 0) {
+            for (int i=0; i < destinationTask.getReadChannels().size(); i++) {
+                for (int j=0 ; j < destinationTask.getReadChannels().get(i).getNbOfChannels(); j++) {
+                    for (int k=0; k < originTask.getWriteChannels().size(); k++) {
+                        for (int l=0; l < originTask.getWriteChannels().get(k).getNbOfChannels(); l++) {
+                            if (originTask.getWriteChannels().get(k).getChannel(l) == destinationTask.getReadChannels().get(i).getChannel(j)) {
+                                TMLChannel channel = destinationTask.getReadChannels().get(i).getChannel(j);
+                                if (!channels.contains(channel)) {
+                                    channels.add(channel);
+                                }
+                            }
+                        }
+                    }
+                } 
+            }
+        }
+        return channels;
+    }
+
+    Boolean isReadChannelOfTask(TMLChannel channel, TMLTask destinationTask) {
+        for (int i=0; i < destinationTask.getReadChannels().size(); i++) {
+            for (int j=0 ; j < destinationTask.getReadChannels().get(i).getNbOfChannels(); j++) {
+                if (channel == destinationTask.getReadChannels().get(i).getChannel(j)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    Boolean isWriteChannelOfTask(TMLChannel channel, TMLTask originTask) {
+        for (int i=0; i < originTask.getWriteChannels().size(); i++) {
+            for (int j=0 ; j < originTask.getWriteChannels().get(i).getNbOfChannels(); j++) {
+                if (channel == originTask.getWriteChannels().get(i).getChannel(j)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    Boolean isSendEventOfTask(TMLEvent event, TMLTask originTask) {
+        for (int i=0; i < originTask.getSendEvents().size(); i++) {
+            if (event == originTask.getSendEvents().get(i).getEvent()) {
+                return true;
+            }
+            if (originTask.getSendEvents().get(i).getEvents() != null) {
+                for (int j=0 ; j < originTask.getSendEvents().get(i).getEvents().size(); j++) {
+                    if (event == originTask.getSendEvents().get(i).getEvents().get(j)) {
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
+    Boolean isWaitEventOfTask(TMLEvent event, TMLTask destinationTask) {
+        for (int i=0; i < destinationTask.getWaitEvents().size(); i++) {
+            if (event == destinationTask.getWaitEvents().get(i).getEvent()) {
+                return true;
+            }
+            if (destinationTask.getWaitEvents().get(i).getEvents() != null) {
+                for (int j=0 ; j < destinationTask.getWaitEvents().get(i).getEvents().size(); j++) {
+                    if (event == destinationTask.getWaitEvents().get(i).getEvents().get(j)) {
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
+    }
+        
+}
diff --git a/src/main/java/tmltranslator/patternhandling/PatternIntegration.java b/src/main/java/tmltranslator/patternhandling/PatternIntegration.java
new file mode 100644
index 0000000000000000000000000000000000000000..5f710b0c3414983612c1dab564322584441e5285
--- /dev/null
+++ b/src/main/java/tmltranslator/patternhandling/PatternIntegration.java
@@ -0,0 +1,1943 @@
+/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
+ *
+ * ludovic.apvrille AT enst.fr
+ *
+ * This software is a computer program whose purpose is to allow the
+ * edition of TURTLE analysis, design and deployment diagrams, to
+ * allow the generation of RT-LOTOS or Java code from this diagram,
+ * and at last to allow the analysis of formal validation traces
+ * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
+ * from INRIA Rhone-Alpes.
+ *
+ * This software is governed by the CeCILL  license under French law and
+ * abiding by the rules of distribution of free software.  You can  use,
+ * modify and/ or redistribute the software under the terms of the CeCILL
+ * license as circulated by CEA, CNRS and INRIA at the following URL
+ * "http://www.cecill.info".
+ *
+ * As a counterpart to the access to the source code and  rights to copy,
+ * modify and redistribute granted by the license, users are provided only
+ * with a limited warranty  and the software's author,  the holder of the
+ * economic rights,  and the successive licensors  have only  limited
+ * liability.
+ *
+ * In this respect, the user's attention is drawn to the risks associated
+ * with loading,  using,  modifying and/or developing or reproducing the
+ * software by the user in light of its specific status of free software,
+ * that may mean  that it is complicated to manipulate,  and  that  also
+ * therefore means  that it is reserved for developers  and  experienced
+ * professionals having in-depth computer knowledge. Users are therefore
+ * encouraged to load and test the software's suitability as regards their
+ * requirements in conditions enabling the security of their systems and/or
+ * data to be ensured and,  more generally, to use and operate it in the
+ * same conditions as regards security.
+ *
+ * The fact that you are presently reading this means that you have had
+ * knowledge of the CeCILL license and that you accept its terms.
+ */
+
+
+package tmltranslator.patternhandling;
+/**
+ * Class PatternIntegration
+ * Pattern Integration in separate thread
+ * Creation: 28/08/2023
+ *
+ * @author Jawher JERRAY
+ * @version 1.0 28/08/2023
+ */
+ 
+import myutil.FileUtils;
+import myutil.TraceManager;
+import tmltranslator.*;
+
+import java.io.File;
+import java.util.*;
+import java.util.Map.Entry;
+
+ 
+public class PatternIntegration implements Runnable {
+    private String appTab;
+    private String patternPath;
+    private String patternName;
+    private PatternConfiguration patternConfiguration;
+    private LinkedHashMap<String, TaskPattern> patternTasks;
+	private TMLMapping<?> tmapModel;
+	private TMLMapping<?> tmapPattern;
+
+    private HashMap<String, String> tasksClonedIntoModel = new HashMap<String, String>();
+    private HashMap<Entry<String, String>, String> channelsClonedIntoModel = new HashMap<Entry<String, String>, String>();
+
+    private HashMap<String, String> tasksOfPatternIntoModel = new HashMap<String, String>();
+    private HashMap<Entry<String, String>, String> channelsOfPatternIntoModel = new HashMap<Entry<String, String>, String>();
+
+    private HashMap<Entry<String, String>, String> renamedModelChannels = new HashMap<Entry<String, String>, String>();
+    private HashMap<TMLTask, List<TMLActivityElement>> clonedTasksToRemElems = new HashMap<TMLTask, List<TMLActivityElement>>();
+
+    public PatternIntegration(String _appTab, String _patternPath, String _patternName, PatternConfiguration _patternConfiguration, LinkedHashMap<String, TaskPattern> _patternTasks, TMLMapping<?> _tmapModel) {
+		this.appTab = _appTab;
+		this.patternPath = _patternPath;
+		this.patternName = _patternName;
+		this.patternConfiguration = _patternConfiguration;
+		this.patternTasks = _patternTasks;
+		this.tmapModel = _tmapModel;
+	}
+    
+	public TMLMapping<?> startThread() {
+		Thread t = new Thread(this);
+		t.start();
+		try {
+			t.join();
+		}
+		catch (Exception e) {
+			TraceManager.addDev("Error in Pattern Integration Thread");
+		}
+		return tmapModel;
+	}
+
+    public void run() {
+    	TraceManager.addDev("Integrating Pattern");
+        if (tmapModel == null) {
+            return;
+        }
+        tmapModel = removePrefixNames(tmapModel);
+        tmapPattern = getTMLMappingOfPattern(patternPath, patternName);
+        tmapPattern = removePrefixNames(tmapPattern);
+        tmapModel = addClonedTask(tmapModel, patternConfiguration);
+        renamePatternTasksName();
+        renamePatternChannelsName();
+        tmapPattern = updatePatternTasksAttributes(tmapPattern, patternConfiguration.getUpdatedPatternAttributes());
+        tmapModel = addPatternTasksInModel(tmapModel, tmapPattern, patternTasks);
+        tmapModel = addPatternInternalChannelsInModel(tmapModel, tmapPattern, patternTasks);
+        //tmapModel = addNewPortToTasks(tmapModel, patternConfiguration.getPortsConnection(), patternTasks);
+        tmapModel = makeConnectionBetweenPatternAndModel(tmapModel, tmapPattern, patternConfiguration.getPortsConnection(), patternTasks, patternConfiguration.getClonedTasks());        
+        tmapModel = configDisconnectedChannels(tmapModel, patternConfiguration.getPortsConfig());
+        tmapModel = removeNotUsedChannelsInClonedTask(tmapModel, clonedTasksToRemElems);
+        tmapModel = mapTasksInArch(tmapModel, patternConfiguration.getTasksMapping());
+        tmapModel = mapTasksInArchAuto(tmapModel, tmapPattern, patternConfiguration.getTasksMapping(), patternConfiguration, patternTasks);
+        tmapModel = mapChannelsInArch(tmapModel, patternConfiguration.getChannelsMapping());
+        tmapModel = mapChannelsInArchAuto(tmapModel, tmapPattern, patternConfiguration.getTasksMapping(), patternConfiguration.getChannelsMapping(), patternConfiguration, patternTasks);
+        tmapModel = generateSecurityForChannels(tmapModel, tmapPattern, patternConfiguration, patternTasks, appTab);
+        tmapModel = putBackPrefixNames(tmapModel, appTab);
+	}
+
+    public TMLMapping<?> addClonedTask(TMLMapping<?> _tmapModel, PatternConfiguration _patternConfiguration) {
+        TMLModeling<?> _tmlmModel = _tmapModel.getTMLModeling();
+        for (PatternCloneTask patternCloneTask : _patternConfiguration.getClonedTasks()) {
+            try {
+                String clonedTask = patternCloneTask.getClonedTask();
+                String taskToClone = patternCloneTask.getTaskToClone();
+                TMLModeling<?> _tmlmModelClone = _tmlmModel.deepClone();
+                TMLTask taskClone = _tmlmModelClone.getTMLTaskByName(taskToClone);
+                
+                if (taskClone != null) {
+                    taskClone.setName(clonedTask);
+                    if (_tmlmModel.getTMLTaskByName(taskClone.getName()) != null || tasksClonedIntoModel.containsValue(taskClone.getName()) || tasksOfPatternIntoModel.containsValue(taskClone.getName())) {
+                        int indexTask = 0;
+                        String taskNameWithIndex = taskClone.getName() + indexTask;
+                        while (_tmlmModel.getTMLTaskByName(taskNameWithIndex) != null || tasksClonedIntoModel.containsValue(taskNameWithIndex) || tasksOfPatternIntoModel.containsValue(taskNameWithIndex)) {
+                            indexTask += 1;
+                            taskNameWithIndex= taskClone.getName() + indexTask;
+                        }
+                        taskClone.setName(taskNameWithIndex);
+                        tasksClonedIntoModel.put(clonedTask, taskNameWithIndex);
+                    } else {
+                        tasksClonedIntoModel.put(clonedTask, clonedTask);
+                    }
+                    //List<String> usedChannelsOfClonedTask = new ArrayList<String>();
+                    //Map<String, String> oldNewChannelsClonedTaskName = new HashMap<String, String>();
+                    //Map<String, String> oldNewEventsClonedTaskName = new HashMap<String, String>();
+                    List<TMLActivityElement> aeElemsToRemove = new ArrayList<TMLActivityElement>();
+                    for (PatternConnection patternConnection : _patternConfiguration.getPortsConnection()) {
+                        if (patternConnection.getModelTaskName().equals(clonedTask) && !patternConnection.isNewPort()) {
+                            String modelChannelName = patternConnection.getModelChannelName();
+                            if (_tmlmModel.getChannelByName(modelChannelName) != null) {
+                                int indexChannel = 0;
+                                String channelNameWithIndex = modelChannelName + indexChannel;
+                                while (_tmlmModel.getChannelByName(channelNameWithIndex) != null || channelsClonedIntoModel.containsValue(channelNameWithIndex) || channelsOfPatternIntoModel.containsValue(channelNameWithIndex)) {
+                                    indexChannel += 1;
+                                    channelNameWithIndex = modelChannelName + indexChannel;
+                                }
+                                //oldNewChannelsClonedTaskName.put(modelChannelName, channelNameWithIndex);
+                                //TraceManager.addDev("Channel : old =" + modelChannelName + " New=" + channelNameWithIndex);
+                                //patternConnection.setModelChannelName(channelNameWithIndex);
+                                channelsClonedIntoModel.put(Map.entry(clonedTask, modelChannelName), channelNameWithIndex);
+                            } else if (_tmlmModel.getEventByName(modelChannelName) != null) {
+                                int indexEvent = 0;
+                                String eventNameWithIndex = modelChannelName + indexEvent;
+                                while (_tmlmModel.getEventByName(eventNameWithIndex) != null || channelsClonedIntoModel.containsValue(eventNameWithIndex) || channelsOfPatternIntoModel.containsValue(eventNameWithIndex)) {
+                                    indexEvent += 1;
+                                    eventNameWithIndex = modelChannelName + indexEvent;
+                                }
+                                //oldNewEventsClonedTaskName.put(modelChannelName, eventNameWithIndex);
+                                //patternConnection.setModelChannelName(eventNameWithIndex);
+                                channelsClonedIntoModel.put(Map.entry(clonedTask, modelChannelName), eventNameWithIndex);
+                            } else if (channelsClonedIntoModel.containsValue(modelChannelName) || channelsOfPatternIntoModel.containsValue(modelChannelName)){
+                                int index = 0;
+                                String nameWithIndex = modelChannelName + index;
+                                while (channelsClonedIntoModel.containsValue(nameWithIndex) || channelsOfPatternIntoModel.containsValue(nameWithIndex)) {
+                                    index += 1;
+                                    nameWithIndex = modelChannelName + index;
+                                }
+                                channelsClonedIntoModel.put(Map.entry(clonedTask, modelChannelName), nameWithIndex);
+                            } else {
+                                channelsClonedIntoModel.put(Map.entry(clonedTask, modelChannelName), modelChannelName);
+                            }
+                        } else if (patternConnection.getModelTaskName().equals(clonedTask) && patternConnection.isNewPort()) {
+                            
+                        }
+                    }
+                    /*for (MappingPatternChannel mappingPatternChannel : _patternConfiguration.getChannelsMapping()) {
+                        //for (String[] st : _patternConfiguration.getChannelsMapping().get(taskOfChannelToMap)) {
+                        if (mappingPatternChannel.getTaskOfChannelToMap().equals(clonedTask)) {
+                            if (oldNewChannelsClonedTaskName.keySet().contains(st[1])) {
+                                st[1] = oldNewChannelsClonedTaskName.get(st[1]);
+                            } else if (oldNewEventsClonedTaskName.keySet().contains(st[1])) {
+                                st[1] = oldNewEventsClonedTaskName.get(st[1]);
+                            }
+                        }
+                        if (st.length == 4) {
+                            if (st[2].equals(clonedTask)) {
+                                if (oldNewChannelsClonedTaskName.keySet().contains(st[3])) {
+                                    st[3] = oldNewChannelsClonedTaskName.get(st[3]);
+                                } else if (oldNewEventsClonedTaskName.keySet().contains(st[3])) {
+                                    st[3] = oldNewEventsClonedTaskName.get(st[3]);
+                                }
+                            }
+                        }
+                        //}
+                    }*/
+                    for (TMLActivityElement ae : taskClone.getActivityDiagram().getElements()) {
+                        if (ae instanceof TMLActivityElementChannel) {
+                            TMLActivityElementChannel aeChannel = (TMLActivityElementChannel) ae;
+                            for (int i=0; i < aeChannel.getNbOfChannels(); i++) {
+                                if (channelsClonedIntoModel.get(Map.entry(taskClone.getName(), aeChannel.getChannel(i).getName())) == null) {
+                                    //TMLActivityElement prevElem =  taskClone.getActivityDiagram().getPrevious(ae);
+                                    //prevElem.setNewNext(ae, ae.getNextElement(0));
+                                    aeElemsToRemove.add(ae);
+                                } else {
+                                    
+                                    for (TMLPort port : aeChannel.getChannel(i).getOriginPorts()) {
+                                        port.setName(channelsClonedIntoModel.get(Map.entry(taskClone.getName(), aeChannel.getChannel(i).getName())));
+                                    }
+                                    for (TMLPort port : aeChannel.getChannel(i).getDestinationPorts()) {
+                                        port.setName(channelsClonedIntoModel.get(Map.entry(taskClone.getName(), aeChannel.getChannel(i).getName())));
+                                    }
+                                    if (aeChannel.getChannel(i).getOriginPort() != null) {
+                                        aeChannel.getChannel(i).getOriginPort().setName(channelsClonedIntoModel.get(Map.entry(taskClone.getName(), aeChannel.getChannel(i).getName())));
+                                        //TraceManager.addDev("Port Origin New Name = " + aeChannel.getChannel(i).getOriginPort().getName());
+                                    }
+                                    if (aeChannel.getChannel(i).getDestinationPort() != null) {
+                                        aeChannel.getChannel(i).getDestinationPort().setName(channelsClonedIntoModel.get(Map.entry(taskClone.getName(), aeChannel.getChannel(i).getName())));
+                                    }
+                                    //TraceManager.addDev("Name Channel Clone Before =" + aeChannel.getChannel(i).getName());
+                                    aeChannel.getChannel(i).setName(channelsClonedIntoModel.get(Map.entry(taskClone.getName(), aeChannel.getChannel(i).getName())));
+                                    //TraceManager.addDev("Name Channel Clone After =" + aeChannel.getChannel(i).getName());
+                                    if (_tmlmModel.getChannelByName(aeChannel.getChannel(i).getName()) == null) {
+                                        _tmlmModel.addChannel(aeChannel.getChannel(i));
+                                        //channelsFromClonedToMap.add(aeChannel.getChannel(i));
+                                    }
+                                }
+                            }
+                        } else if (ae instanceof TMLActivityElementEvent) {
+                            TMLActivityElementEvent aeEvent = (TMLActivityElementEvent) ae;
+                            //if (!oldNewEventsClonedTaskName.keySet().contains(aeEvent.getEvent().getName())) {
+                            if (channelsClonedIntoModel.get(Map.entry(taskClone.getName(), aeEvent.getEvent().getName())) == null) {
+                                //TMLActivityElement prevElem =  taskClone.getActivityDiagram().getPrevious(ae);
+                                //prevElem.setNewNext(ae, ae.getNextElement(0));
+                                aeElemsToRemove.add(ae);
+                            } else {
+                                
+                                for (TMLPort port : aeEvent.getEvent().getOriginPorts()) {
+                                    port.setName(channelsClonedIntoModel.get(Map.entry(taskClone.getName(), aeEvent.getEvent().getName())));
+                                }
+                                for (TMLPort port : aeEvent.getEvent().getDestinationPorts()) {
+                                    port.setName(channelsClonedIntoModel.get(Map.entry(taskClone.getName(), aeEvent.getEvent().getName())));
+                                }
+                                if (aeEvent.getEvent().getOriginPort() != null) {
+                                    aeEvent.getEvent().getOriginPort().setName(channelsClonedIntoModel.get(Map.entry(taskClone.getName(), aeEvent.getEvent().getName())));
+                                }
+                                if (aeEvent.getEvent().getDestinationPort() != null) {
+                                    aeEvent.getEvent().getDestinationPort().setName(channelsClonedIntoModel.get(Map.entry(taskClone.getName(), aeEvent.getEvent().getName())));
+                                }
+                                aeEvent.getEvent().setName(channelsClonedIntoModel.get(Map.entry(taskClone.getName(), aeEvent.getEvent().getName())));
+                                if (_tmlmModel.getEventByName(aeEvent.getEvent().getName()) == null) {
+                                    _tmlmModel.addEvent(aeEvent.getEvent());
+                                }
+                            }
+                        }
+                    }
+                    /*for (TMLActivityElement ae : aeElemsToRemove) {
+                        taskClone.getActivityDiagram().removeElement(ae);
+                    }*/
+                    clonedTasksToRemElems.put(taskClone, aeElemsToRemove);
+                    _tmlmModel.addTask(taskClone);
+                }  
+            } catch (TMLCheckingError err) {
+
+            }
+        }
+        return _tmapModel;
+    }
+
+    public TMLMapping<?> removeNotUsedChannelsInClonedTask(TMLMapping<?> _tmapModel, HashMap<TMLTask, List<TMLActivityElement>> _clonedTaskToRemoveElems) {
+        for (TMLTask taskClone : _clonedTaskToRemoveElems.keySet()) {
+            //TraceManager.addDev("removeNotUsed: taskClone=" + taskClone.getName());
+            List<TMLActivityElement> _aeElemsToRemove = _clonedTaskToRemoveElems.get(taskClone);
+            for (TMLActivityElement ae : _aeElemsToRemove) {
+                TMLActivityElement prevElem =  taskClone.getActivityDiagram().getPrevious(ae);
+                prevElem.setNewNext(ae, ae.getNextElement(0));
+            }
+            for (TMLActivityElement ae : _aeElemsToRemove) {
+                taskClone.getActivityDiagram().removeElement(ae);
+            }
+        }
+        return _tmapModel;
+    }
+    
+    public void renamePatternTasksName() {
+        TMLModeling<?> tmlmModel = tmapModel.getTMLModeling();
+        //TMLModeling<?> tmlmPattern = tmapPattern.getTMLModeling();
+        String[] patternTasksKeys = patternTasks.keySet().toArray(new String[patternTasks.keySet().size()]);
+        //List<String> newTasksNames = new ArrayList<String>();
+        //for (int i = 0; i < patternTasks.keySet().size(); i++) {
+        for (String taskName : patternTasksKeys) {
+            //String taskName = patternTasksKeys[i];
+            if (tmlmModel.getTMLTaskByName(taskName) != null || tasksOfPatternIntoModel.containsValue(taskName) || tasksClonedIntoModel.containsValue(taskName)) {
+                int indexTask = 0;
+                String taskNameWithIndex = taskName + indexTask;
+                while (tmlmModel.getTMLTaskByName(taskNameWithIndex) != null || tasksOfPatternIntoModel.containsValue(taskNameWithIndex) || tasksClonedIntoModel.containsValue(taskNameWithIndex)) {
+                    indexTask += 1;
+                    taskNameWithIndex= taskName + indexTask;
+                }
+                tasksOfPatternIntoModel.put(taskName, taskNameWithIndex);
+                /*TMLTask taskPattern = tmlmPattern.getTMLTaskByName(taskName);
+                taskPattern.setName(taskNameWithIndex);
+                if (patternConfiguration.getPortsConnection().containsKey(taskName)) {
+                    patternConfiguration.getPortsConnection().put(taskNameWithIndex, patternConfiguration.getPortsConnection().remove(taskName));
+                }
+                if (patternConfiguration.getTasksMapping().containsKey(taskName)) {
+                    patternConfiguration.getTasksMapping().put(taskNameWithIndex, patternConfiguration.getTasksMapping().remove(taskName));
+                }
+                if (patternConfiguration.getChannelsMapping().containsKey(taskName)) {
+                    patternConfiguration.getChannelsMapping().put(taskNameWithIndex, patternConfiguration.getChannelsMapping().remove(taskName));
+                }
+                if (patternConfiguration.getUpdatedPatternAttributes().containsKey(taskName)) {
+                    patternConfiguration.getUpdatedPatternAttributes().put(taskNameWithIndex, patternConfiguration.getUpdatedPatternAttributes().remove(taskName));
+                }
+                if (patternConfiguration.getChannelsWithSecurity().containsKey(taskName)) {
+                    patternConfiguration.getChannelsWithSecurity().put(taskNameWithIndex, patternConfiguration.getChannelsWithSecurity().remove(taskName));
+                }
+                if (patternTasks.containsKey(taskName)) {
+                    patternTasks.put(taskNameWithIndex, patternTasks.remove(taskName));
+                }*/
+                
+            } else {
+                tasksOfPatternIntoModel.put(taskName, taskName);
+            }
+        }
+    }
+
+    public void renamePatternChannelsName() {
+        TMLModeling<?> tmlmModel = tmapModel.getTMLModeling();
+        //Map<String, String> oldNewChannelName = new HashMap<String,String>();
+        //Map<String, String> oldNewEventName = new HashMap<String,String>();
+        for (String taskName : patternTasks.keySet()) {
+            TaskPattern tp = patternTasks.get(taskName);
+            for (int i = 0 ; i < tp.getInternalPorts().size() ; i++) {
+                PortTaskJsonFile extPort = tp.getInternalPorts().get(i);
+                if (extPort.getMode().equals(PatternCreation.MODE_OUTPUT)) {
+                    if (tmlmModel.getChannelByName(extPort.getName()) != null) {
+                        int indexChannel = 0;
+                        String channelNameWithIndex = extPort.getName() + indexChannel;
+                        while (tmlmModel.getChannelByName(channelNameWithIndex) != null || channelsOfPatternIntoModel.containsValue(channelNameWithIndex) || channelsClonedIntoModel.containsValue(channelNameWithIndex)) {
+                            indexChannel += 1;
+                            channelNameWithIndex= extPort.getName() + indexChannel;
+                        }
+                        /*TMLChannel channelPattern = tmlmPattern.getChannelByName(extPort.name);
+                        oldNewChannelName.put(extPort.name, channelNameWithIndex);
+                        channelPattern.setName(channelNameWithIndex);
+                        if (patternConfiguration.getChannelsMapping().containsKey(taskName)) {
+                            for (String[] cm : patternConfiguration.getChannelsMapping().get(taskName)) {
+                                if (cm[0].equals(extPort.name)) {
+                                    cm[0] = channelNameWithIndex;
+                                }
+                            }
+                        }
+                        if (patternConfiguration.getChannelsWithSecurity().containsKey(taskName)) {
+                            for (PortTaskJsonFile portTask : patternConfiguration.getChannelsWithSecurity().get(taskName)) {
+                                if (portTask.getName().equals(extPort.name)) {
+                                    portTask.name = channelNameWithIndex;
+                                }
+                            }
+                        }
+                        extPort.name = channelNameWithIndex;*/
+                        channelsOfPatternIntoModel.put(Map.entry(taskName, extPort.getName()), channelNameWithIndex);
+                        
+                    } else if (tmlmModel.getEventByName(extPort.getName()) != null) {
+                        int indexEvent = 0;
+                        String eventNameWithIndex = extPort.getName() + indexEvent;
+                        while (tmlmModel.getEventByName(eventNameWithIndex) != null  || channelsOfPatternIntoModel.containsValue(eventNameWithIndex) || channelsClonedIntoModel.containsValue(eventNameWithIndex)) {
+                            indexEvent += 1;
+                            eventNameWithIndex= extPort.getName() + indexEvent;
+                        }
+                        /*TMLEvent eventPattern = tmlmPattern.getEventByName(extPort.name);
+                        oldNewEventName.put(extPort.name, eventNameWithIndex);
+                        eventPattern.setName(eventNameWithIndex);
+                        extPort.name = eventNameWithIndex;*/
+                        channelsOfPatternIntoModel.put(Map.entry(taskName, extPort.getName()), eventNameWithIndex);
+                    } else if (channelsOfPatternIntoModel.containsValue(extPort.getName()) || channelsClonedIntoModel.containsValue(extPort.getName())) {
+                        int index = 0;
+                        String nameWithIndex = extPort.getName() + index;
+                        while (channelsOfPatternIntoModel.containsValue(nameWithIndex) || channelsClonedIntoModel.containsValue(nameWithIndex)) {
+                            index += 1;
+                            nameWithIndex= extPort.getName() + index;
+                        }
+                        channelsOfPatternIntoModel.put(Map.entry(taskName, extPort.getName()), nameWithIndex);
+                    } else {
+                        channelsOfPatternIntoModel.put(Map.entry(taskName, extPort.getName()), extPort.getName());
+                    }
+                }
+            }
+        }
+        for (PatternConnection patternConnection : patternConfiguration.getPortsConnection()) {
+            if (patternConnection.isANewChannelRequired(patternConfiguration.getPortsConnection(), patternTasks, patternConfiguration.getClonedTasks())) {
+                if (tmlmModel.getChannelByName(patternConnection.getPatternChannel()) != null) {
+                    int indexChannel = 0;
+                    String channelNameWithIndex = patternConnection.getPatternChannel() + indexChannel;
+                    while (tmlmModel.getChannelByName(channelNameWithIndex) != null || channelsOfPatternIntoModel.containsValue(channelNameWithIndex) || channelsClonedIntoModel.containsValue(channelNameWithIndex)) {
+                        indexChannel += 1;
+                        channelNameWithIndex= patternConnection.getPatternChannel() + indexChannel;
+                    }
+                    channelsOfPatternIntoModel.put(Map.entry(patternConnection.getPatternTaskName(), patternConnection.getPatternChannel()), channelNameWithIndex);
+                    
+                } else if (tmlmModel.getEventByName(patternConnection.getPatternChannel()) != null) {
+                    int indexEvent = 0;
+                    String eventNameWithIndex = patternConnection.getPatternChannel() + indexEvent;
+                    while (tmlmModel.getEventByName(eventNameWithIndex) != null || channelsOfPatternIntoModel.containsValue(eventNameWithIndex) || channelsClonedIntoModel.containsValue(eventNameWithIndex)) {
+                        indexEvent += 1;
+                        eventNameWithIndex= patternConnection.getPatternChannel() + indexEvent;
+                    }
+                    channelsOfPatternIntoModel.put(Map.entry(patternConnection.getPatternTaskName(), patternConnection.getPatternChannel()), eventNameWithIndex);
+                } else if (channelsOfPatternIntoModel.containsValue(patternConnection.getPatternChannel()) || channelsClonedIntoModel.containsValue(patternConnection.getPatternChannel())) {
+                    int index = 0;
+                    String nameWithIndex = patternConnection.getPatternChannel() + index;
+                    while (channelsOfPatternIntoModel.containsValue(nameWithIndex) || channelsClonedIntoModel.containsValue(nameWithIndex)) {
+                        index += 1;
+                        nameWithIndex= patternConnection.getPatternChannel() + index;
+                    }
+                    channelsOfPatternIntoModel.put(Map.entry(patternConnection.getPatternTaskName(), patternConnection.getPatternChannel()), nameWithIndex);
+                } else {
+                    channelsOfPatternIntoModel.put(Map.entry(patternConnection.getPatternTaskName(), patternConnection.getPatternChannel()), patternConnection.getPatternChannel());
+                }
+            }
+        }
+    }
+
+    public TMLMapping<?> updatePatternTasksAttributes(TMLMapping<?> _tmapPattern, LinkedHashMap<String, List<AttributeTaskJsonFile>> _updatedPatternAttributes) {
+        TMLModeling<?> _tmlmPattern = _tmapPattern.getTMLModeling();
+        for (String taskName : _updatedPatternAttributes.keySet()) {
+            TMLTask taskPattern = _tmlmPattern.getTMLTaskByName(taskName);
+            if (taskPattern != null) {
+                for (int i = 0; i < _updatedPatternAttributes.get(taskName).size(); i++) {
+                    TMLAttribute attribTaskPattern = taskPattern.getAttributeByName(_updatedPatternAttributes.get(taskName).get(i).getName());
+                    attribTaskPattern.initialValue = _updatedPatternAttributes.get(taskName).get(i).getValue();
+                }
+            }
+        }
+        return _tmapPattern;
+    }
+
+    public TMLMapping<?> addPatternTasksInModel(TMLMapping<?> _tmapModel, TMLMapping<?> _tmapPattern, LinkedHashMap<String, TaskPattern> _patternTasks) {
+        TMLModeling<?> _tmlmModel = _tmapModel.getTMLModeling();
+        TMLModeling<?> _tmlmPattern = _tmapPattern.getTMLModeling();
+        try {
+            TMLModeling<?> _tmlmPatternClone = _tmlmPattern.deepClone();
+            for (String taskName : _patternTasks.keySet()) {
+                TMLTask taskPattern = _tmlmPatternClone.getTMLTaskByName(taskName);
+                if (taskPattern != null) {
+                    if (_tmlmModel.getTMLTaskByName(tasksOfPatternIntoModel.get(taskName)) == null) {
+                        taskPattern.setName(tasksOfPatternIntoModel.get(taskName));
+                        _tmlmModel.addTask(taskPattern);
+                    }
+                }
+            }
+        } catch (TMLCheckingError err) {
+
+        }
+        return _tmapModel;
+    }
+
+    public TMLMapping<?> addPatternInternalChannelsInModel(TMLMapping<?> _tmapModel, TMLMapping<?> _tmapPattern, LinkedHashMap<String, TaskPattern> _patternTasks) {
+        TMLModeling<?> _tmlmModel = _tmapModel.getTMLModeling();
+        TMLModeling<?> _tmlmPattern = _tmapPattern.getTMLModeling();
+        try {
+            TMLModeling<?> _tmlmPatternClone = _tmlmPattern.deepClone();
+            for (String taskName : _patternTasks.keySet()) {
+                for (PortTaskJsonFile portTask : _patternTasks.get(taskName).getInternalPorts()) {
+                    TMLChannel channelPattern = _tmlmPatternClone.getChannelByName(portTask.getName());
+                    TMLEvent eventPattern = _tmlmPatternClone.getEventByName(portTask.getName());
+                    if (portTask.getMode().equals(PatternCreation.MODE_OUTPUT)) {
+                        if (channelPattern != null) {
+                            if (_tmlmModel.getChannelByName(channelsOfPatternIntoModel.get(Map.entry(taskName, portTask.getName()))) == null) {
+                                channelPattern.setName(channelsOfPatternIntoModel.get(Map.entry(taskName, portTask.getName())));
+                                channelPattern.setTasks(_tmlmModel.getTMLTaskByName(tasksOfPatternIntoModel.get(channelPattern.getOriginTask().getName())), _tmlmModel.getTMLTaskByName(tasksOfPatternIntoModel.get(channelPattern.getDestinationTask().getName())));
+                                channelPattern.setPorts(new TMLPort(channelPattern.getName(), channelPattern.getReferenceObject()), new TMLPort(channelPattern.getName(), channelPattern.getReferenceObject()));
+                                _tmlmModel.addChannel(channelPattern);
+                                for (TMLActivityElement elem : channelPattern.getDestinationTask().getActivityDiagram().getElements()) {
+                                    if (elem instanceof TMLActivityElementChannel) {
+                                        TMLActivityElementChannel acElemChannel = (TMLActivityElementChannel) elem;
+                                        for (int indexChannel = 0 ; indexChannel < acElemChannel.getNbOfChannels() ; indexChannel++) { 
+                                            if (acElemChannel.getChannel(indexChannel).getName().equals(portTask.getName())) {
+                                                acElemChannel.replaceChannelWith(acElemChannel.getChannel(indexChannel), channelPattern);
+                                            }
+                                        }
+                                    }
+                                }
+                                for (TMLActivityElement elem : channelPattern.getOriginTask().getActivityDiagram().getElements()) {
+                                    if (elem instanceof TMLActivityElementChannel) {
+                                        TMLActivityElementChannel acElemChannel = (TMLActivityElementChannel) elem;
+                                        for (int indexChannel = 0 ; indexChannel < acElemChannel.getNbOfChannels() ; indexChannel++) { 
+                                            if (acElemChannel.getChannel(indexChannel).getName().equals(portTask.getName())) {
+                                                acElemChannel.replaceChannelWith(acElemChannel.getChannel(indexChannel), channelPattern);
+                                            }
+                                        }
+                                    }
+                                }
+                                //channelsFromPatternToMap.add(channelPattern);
+                            }
+                        } else if (eventPattern != null) {
+                            if (_tmlmModel.getEventByName(channelsOfPatternIntoModel.get(Map.entry(taskName, portTask.getName()))) == null) {
+                                eventPattern.setName(channelsOfPatternIntoModel.get(Map.entry(taskName, portTask.getName())));
+                                eventPattern.setTasks(_tmlmModel.getTMLTaskByName(tasksOfPatternIntoModel.get(eventPattern.getOriginTask().getName())), _tmlmModel.getTMLTaskByName(tasksOfPatternIntoModel.get(eventPattern.getDestinationTask().getName())));
+                                eventPattern.setPorts(new TMLPort(eventPattern.getName(), eventPattern.getReferenceObject()), new TMLPort(eventPattern.getName(), eventPattern.getReferenceObject()));
+                                _tmlmModel.addEvent(eventPattern);
+                                for (TMLActivityElement elem : eventPattern.getDestinationTask().getActivityDiagram().getElements()) {
+                                    if (elem instanceof TMLActivityElementEvent) {
+                                        TMLActivityElementEvent acElemEvent = (TMLActivityElementEvent) elem;
+                                        if (acElemEvent.getEvent().getName().equals(portTask.getName())) {
+                                            acElemEvent.replaceEventWith(acElemEvent.getEvent(), eventPattern);
+                                        }
+                                    }
+                                }
+                                for (TMLActivityElement elem : eventPattern.getOriginTask().getActivityDiagram().getElements()) {
+                                    if (elem instanceof TMLActivityElementEvent) {
+                                        TMLActivityElementEvent acElemEvent = (TMLActivityElementEvent) elem;
+                                        if (acElemEvent.getEvent().getName().equals(portTask.getName())) {
+                                            acElemEvent.replaceEventWith(acElemEvent.getEvent(), eventPattern);
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        } catch (TMLCheckingError err) {
+
+        }
+        return _tmapModel;
+    }
+
+    /*public TMLMapping<?> updatePatternTasksAttributes(TMLMapping<?> _tmapPattern, LinkedHashMap<String, TaskPattern> _patternTasks) {
+        TMLModeling<?> _tmlmPattern = _tmapPattern.getTMLModeling();
+        for (String taskName : _patternTasks.keySet()) {
+            TMLTask taskPattern = _tmlmPattern.getTMLTaskByName(taskName);
+            if (taskPattern != null) {
+                for (int i=0; i < _patternTasks.get(taskName).getAttributes().size(); i++) {
+                    TMLAttribute attribTaskPattern = taskPattern.getAttributeByName(_patternTasks.get(taskName).getAttributes().get(i).getName());
+                    attribTaskPattern.initialValue = _patternTasks.get(taskName).getAttributes().get(i).getValue();
+                }
+            }
+        }
+        return _tmapPattern;
+    }*/
+
+
+    public TMLMapping<?> addNewPortToATask(TMLMapping<?> _tmapModel, LinkedHashMap<String, TaskPattern> _patternTasks, TMLTask _taskToAddPort, String _patternTaskName, String _portPatternName, String _portTolink) {
+        TMLModeling<?> _tmlmModel = _tmapModel.getTMLModeling();
+        TaskPattern tp = _patternTasks.get(_patternTaskName);
+        TMLActivity adTaskToAddPort = _taskToAddPort.getActivityDiagram();
+        List<TMLActivityElement> actElemsToAdd = new ArrayList<TMLActivityElement>();
+        TMLChannel channelInModel = _tmlmModel.getChannelByName(channelsOfPatternIntoModel.get(Map.entry(_patternTaskName, _portPatternName)));
+        TMLEvent eventInModel = _tmlmModel.getEventByName(channelsOfPatternIntoModel.get(Map.entry(_patternTaskName, _portPatternName)));
+        for (PortTaskJsonFile pTaskJson : tp.getExternalPorts()) {
+            if (pTaskJson.getName().equals(_portPatternName)) {
+                if (pTaskJson.getMode().equals(PatternCreation.MODE_INPUT)) {
+                    if (pTaskJson.getType().equals(PatternCreation.CHANNEL)) {
+                        _taskToAddPort.addWriteTMLChannel(channelInModel); 
+                        for (TMLActivityElement acElem : adTaskToAddPort.getElements()) {
+                            if (acElem instanceof TMLActivityElementChannel) {
+                                TMLActivityElementChannel acElemChannel = (TMLActivityElementChannel) acElem;
+                                for (int indexChannel = 0 ; indexChannel < acElemChannel.getNbOfChannels() ; indexChannel++) { 
+                                    if (acElemChannel.getChannel(indexChannel).getName().equals(_portTolink)) {
+                                        TMLActivityElement prevElem =  adTaskToAddPort.getPrevious(acElem);
+                                        TMLWriteChannel wrChannel = new TMLWriteChannel(channelInModel.getName(), adTaskToAddPort.getReferenceObject());
+                                        wrChannel.setNbOfSamples("1"); /// TO UPDATE
+                                        wrChannel.addChannel(channelInModel);
+                                        wrChannel.addNext(acElem);
+                                        prevElem.setNewNext(acElem, wrChannel);
+                                        //adTaskToAddPort.addElement(wrChannel);
+                                        actElemsToAdd.add(wrChannel);
+                                    }
+                                }
+                            } else if (acElem instanceof TMLActivityElementEvent) {
+                                TMLActivityElementEvent acElemEvent = (TMLActivityElementEvent) acElem;
+                                if (acElemEvent.getEvent().getName().equals(_portTolink)) {
+                                    TMLActivityElement prevElem =  adTaskToAddPort.getPrevious(acElem);
+                                    TMLWriteChannel wrChannel = new TMLWriteChannel(channelInModel.getName(), adTaskToAddPort.getReferenceObject());
+                                    wrChannel.setNbOfSamples("1"); /// TO UPDATE
+                                    wrChannel.addChannel(channelInModel);
+                                    wrChannel.addNext(acElem);
+                                    prevElem.setNewNext(acElem, wrChannel);
+                                    //adTaskToAddPort.addElement(wrChannel);
+                                    actElemsToAdd.add(wrChannel);
+                                }
+                            }
+                        }
+                    } else if (pTaskJson.getType().equals(PatternCreation.EVENT)) {
+                        _taskToAddPort.addTMLEvent(eventInModel); 
+                        eventInModel.setOriginTask(_taskToAddPort);
+                        for (TMLActivityElement acElem : adTaskToAddPort.getElements()) {
+                            if (acElem instanceof TMLActivityElementEvent) {
+                                TMLActivityElementEvent acElemEvent = (TMLActivityElementEvent) acElem;
+                                if (acElemEvent.getEvent().getName().equals(_portTolink)) {
+                                    TMLActivityElement prevElem =  adTaskToAddPort.getPrevious(acElem);
+                                    TMLSendEvent sdEvent = new TMLSendEvent(eventInModel.getName(), adTaskToAddPort.getReferenceObject());
+                                    sdEvent.setEvent(eventInModel);
+                                    for (TMLWaitEvent we : eventInModel.getDestinationTask().getWaitEvents()) {
+                                        if (we.getEvent().getName().equals(eventInModel.getName())) {
+                                            for (String param : we.getVectorAllParams()) {
+                                                if (param.matches("-?\\d+") || param.matches("(?i)^(true|false)")) {
+                                                    sdEvent.addParam(param);
+                                                } else {
+                                                    sdEvent.addParam(param);
+                                                    if (_taskToAddPort.getAttributeByName(param) == null) {
+                                                        _taskToAddPort.addAttribute(eventInModel.getDestinationTask().getAttributeByName(param).deepClone(_tmlmModel));
+                                                    }
+                                                }
+                                                
+                                            }
+                                        } 
+                                    }
+                                    sdEvent.addNext(acElem);
+                                    prevElem.setNewNext(acElem, sdEvent);
+                                    //adTaskToAddPort.addElement(sdEvent);
+                                    actElemsToAdd.add(sdEvent);
+                                }
+                            } else if (acElem instanceof TMLActivityElementChannel) {
+                                TMLActivityElementChannel acElemChannel = (TMLActivityElementChannel) acElem;
+                                for (int indexChannel = 0 ; indexChannel < acElemChannel.getNbOfChannels() ; indexChannel++) { 
+                                    if (acElemChannel.getChannel(indexChannel).getName().equals(_portTolink)) {
+                                        TMLActivityElement prevElem =  adTaskToAddPort.getPrevious(acElem);
+                                        TMLSendEvent sdEvent = new TMLSendEvent(eventInModel.getName(), adTaskToAddPort.getReferenceObject());
+                                        sdEvent.setEvent(eventInModel);
+                                        for (TMLWaitEvent we : eventInModel.getDestinationTask().getWaitEvents()) {
+                                            if (we.getEvent().getName().equals(eventInModel.getName())) {
+                                                for (String param : we.getVectorAllParams()) {
+                                                    if (param.matches("-?\\d+") || param.matches("(?i)^(true|false)")) {
+                                                        sdEvent.addParam(param);
+                                                    } else {
+                                                        sdEvent.addParam(param);
+                                                        if (_taskToAddPort.getAttributeByName(param) == null) {
+                                                            _taskToAddPort.addAttribute(eventInModel.getDestinationTask().getAttributeByName(param).deepClone(_tmlmModel));
+                                                        }
+                                                    }
+                                                    
+                                                }
+                                            }
+                                        }
+                                        sdEvent.addNext(acElem);
+                                        prevElem.setNewNext(acElem, sdEvent);
+                                        //adTaskToAddPort.addElement(sdEvent);
+                                        actElemsToAdd.add(sdEvent);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                } else if (pTaskJson.getMode().equals(PatternCreation.MODE_OUTPUT)) {
+                    if (pTaskJson.getType().equals(PatternCreation.CHANNEL)) {
+                        _taskToAddPort.addReadTMLChannel(channelInModel);
+                        for (TMLActivityElement acElem : adTaskToAddPort.getElements()) {
+                            if (acElem instanceof TMLActivityElementChannel) {
+                                TMLActivityElementChannel acElemChannel = (TMLActivityElementChannel) acElem;
+                                for (int indexChannel = 0 ; indexChannel < acElemChannel.getNbOfChannels() ; indexChannel++) { 
+                                    if (acElemChannel.getChannel(indexChannel).getName().equals(_portTolink)) {
+                                        TMLActivityElement prevElem =  adTaskToAddPort.getPrevious(acElem);
+                                        TMLReadChannel rdChannel = new TMLReadChannel(channelInModel.getName(), adTaskToAddPort.getReferenceObject());
+                                        rdChannel.setNbOfSamples("1"); /// TO UPDATE
+                                        rdChannel.addChannel(channelInModel);
+                                        rdChannel.addNext(acElem);
+                                        prevElem.setNewNext(acElem, rdChannel);
+                                        //adTaskToAddPort.addElement(rdChannel);
+                                        actElemsToAdd.add(rdChannel);
+                                    }
+                                }
+                            } else if (acElem instanceof TMLActivityElementEvent) {
+                                TMLActivityElementEvent acElemEvent = (TMLActivityElementEvent) acElem;
+                                if (acElemEvent.getEvent().getName().equals(_portTolink)) {
+                                    TMLActivityElement prevElem =  adTaskToAddPort.getPrevious(acElem);
+                                    TMLReadChannel rdChannel = new TMLReadChannel(channelInModel.getName(), adTaskToAddPort.getReferenceObject());
+                                    rdChannel.setNbOfSamples("1"); /// TO UPDATE
+                                    rdChannel.addChannel(channelInModel);
+                                    rdChannel.addNext(acElem);
+                                    prevElem.setNewNext(acElem, rdChannel);
+                                    //adTaskToAddPort.addElement(rdChannel);
+                                    actElemsToAdd.add(rdChannel);
+                                }
+                            }
+                        }
+                    } else if (pTaskJson.getType().equals(PatternCreation.EVENT)) {
+                        _taskToAddPort.addTMLEvent(eventInModel);
+                        eventInModel.setDestinationTask(_taskToAddPort);
+                        for (TMLActivityElement acElem : adTaskToAddPort.getElements()) {
+                            if (acElem instanceof TMLActivityElementEvent) {
+                                TMLActivityElementEvent acElemEvent = (TMLActivityElementEvent) acElem;
+                                if (acElemEvent.getEvent().getName().equals(_portTolink)) {
+                                    TMLActivityElement prevElem =  adTaskToAddPort.getPrevious(acElem);
+                                    TMLWaitEvent wtEvent = new TMLWaitEvent(eventInModel.getName(), adTaskToAddPort.getReferenceObject());
+                                    wtEvent.setEvent(eventInModel);
+                                    for (TMLSendEvent sd : eventInModel.getOriginTask().getSendEvents()) {
+                                        if (sd.getEvent().getName().equals(eventInModel.getName())) {
+                                            for (int indexParam=0; indexParam < sd.getNbOfParams(); indexParam++) {
+                                                String param = sd.getParam(indexParam);
+                                                if (param.matches("-?\\d+") || param.matches("(?i)^(true|false)")) {
+                                                    String paramName = eventInModel.getName()+indexParam;
+                                                    if (_taskToAddPort.getAttributeByName(paramName) == null) {
+                                                        TMLAttribute attribParam = new TMLAttribute(paramName, eventInModel.getParams().get(indexParam).deepClone(_tmlmModel), "");
+                                                        _taskToAddPort.addAttribute(attribParam);
+                                                    }
+                                                    wtEvent.addParam(paramName);
+                                                } else {
+                                                    wtEvent.addParam(param);
+                                                    if (_taskToAddPort.getAttributeByName(param) == null) {
+                                                        _taskToAddPort.addAttribute(eventInModel.getOriginTask().getAttributeByName(param).deepClone(_tmlmModel));
+                                                    }
+                                                }
+                                            }
+                                        }   
+                                    }
+                                    wtEvent.addNext(acElem);
+                                    prevElem.setNewNext(acElem, wtEvent);
+                                    //adTaskToAddPort.addElement(wtEvent);
+                                    actElemsToAdd.add(wtEvent);
+                                }
+                            } else if (acElem instanceof TMLActivityElementChannel) {
+                                TMLActivityElementChannel acElemChannel = (TMLActivityElementChannel) acElem;
+                                for (int indexChannel = 0 ; indexChannel < acElemChannel.getNbOfChannels() ; indexChannel++) { 
+                                    if (acElemChannel.getChannel(indexChannel).getName().equals(_portTolink)) {
+                                        TMLActivityElement prevElem =  adTaskToAddPort.getPrevious(acElem);
+                                        TMLWaitEvent wtEvent = new TMLWaitEvent(eventInModel.getName(), adTaskToAddPort.getReferenceObject());
+                                        wtEvent.setEvent(eventInModel);
+                                        for (TMLSendEvent sd : eventInModel.getOriginTask().getSendEvents()) {
+                                            if (sd.getEvent().getName().equals(eventInModel.getName())) {
+                                                for (int indexParam=0; indexParam < sd.getNbOfParams(); indexParam++) {
+                                                    String param = sd.getParam(indexParam);
+                                                    if (param.matches("-?\\d+") || param.matches("(?i)^(true|false)")) {
+                                                        String paramName = eventInModel.getName()+indexParam;
+                                                        if (_taskToAddPort.getAttributeByName(paramName) == null) {
+                                                            TMLAttribute attribParam = new TMLAttribute(paramName, eventInModel.getParams().get(indexParam).deepClone(_tmlmModel), "");
+                                                            _taskToAddPort.addAttribute(attribParam);
+                                                        }
+                                                        wtEvent.addParam(paramName);
+                                                    } else {
+                                                        wtEvent.addParam(param);
+                                                        if (_taskToAddPort.getAttributeByName(param) == null) {
+                                                            _taskToAddPort.addAttribute(eventInModel.getOriginTask().getAttributeByName(param).deepClone(_tmlmModel));
+                                                        }
+                                                    }       
+                                                }
+                                            }
+                                        }
+                                        wtEvent.addNext(acElem);
+                                        prevElem.setNewNext(acElem, wtEvent);
+                                        //adTaskToAddPort.addElement(wtEvent);
+                                        actElemsToAdd.add(wtEvent);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+
+            }
+        }
+        for (TMLActivityElement actElem : actElemsToAdd) {
+            adTaskToAddPort.addElement(actElem);
+        }
+        return _tmapModel;
+    }
+
+    /*public TMLMapping<?> addNewPortToTasks(TMLMapping<?> _tmapModel, LinkedHashMap<String,List<String[]>> _portsConnection, LinkedHashMap<String, TaskPattern> _patternTasks) {
+        TMLModeling<?> _tmlmModel = _tmapModel.getTMLModeling();
+        for (String patternTaskName : _portsConnection.keySet()) {
+            for (String[] elemP : _portsConnection.get(patternTaskName)) {
+                TraceManager.addDev("elemP[0]= " + elemP[0]);
+                TraceManager.addDev("elemP[1]= " + elemP[1]);
+                TraceManager.addDev("elemP[2]= " + elemP[2]);
+                
+                if (elemP.length == 4) {
+                    TMLTask taskToAddPort = _tmlmModel.getTMLTaskByName(elemP[1]);
+                    TaskPattern tp = _patternTasks.get(patternTaskName);
+                    TMLActivity adTaskToAddPort = taskToAddPort.getActivityDiagram();
+                    for (PortTaskJsonFile pTaskJson : tp.externalPorts) {
+                        if (pTaskJson.name.equals(elemP[0])) {
+                            if (pTaskJson.getMode().equals(PatternCreation.MODE_INPUT)) {
+                                if (pTaskJson.getType().equals(PatternCreation.CHANNEL)) {
+                                    taskToAddPort.addWriteTMLChannel(_tmlmModel.getChannelByName(elemP[0])); 
+                                    for (TMLActivityElement acElem : adTaskToAddPort.getElements()) {
+                                        if (acElem instanceof TMLActivityElementChannel) {
+                                            TMLActivityElementChannel acElemChannel = (TMLActivityElementChannel) acElem;
+                                            for (int indexChannel = 0 ; indexChannel < acElemChannel.getNbOfChannels() ; indexChannel++) { 
+                                                if (acElemChannel.getChannel(indexChannel).getName().equals(elemP[2])) {
+                                                    TMLActivityElement prevElem =  adTaskToAddPort.getPrevious(acElem);
+                                                    TMLWriteChannel wrChannel = new TMLWriteChannel(_tmlmModel.getChannelByName(elemP[0]).getName(), adTaskToAddPort.getReferenceObject());
+                                                    wrChannel.setNbOfSamples("1"); /// TO UPDATE
+                                                    wrChannel.addChannel(_tmlmModel.getChannelByName(elemP[0]));
+                                                    wrChannel.addNext(acElem);
+                                                    prevElem.setNewNext(acElem, wrChannel);
+                                                    adTaskToAddPort.addElement(wrChannel);
+                                                }
+                                            }
+                                        }
+                                    }
+                                } else if (pTaskJson.getType().equals(PatternCreation.EVENT)) {
+                                    taskToAddPort.addTMLEvent(_tmlmModel.getEventByName(elemP[0])); 
+                                    _tmlmModel.getEventByName(elemP[0]).setOriginTask(taskToAddPort);
+                                    for (TMLActivityElement acElem : adTaskToAddPort.getElements()) {
+                                        if (acElem instanceof TMLActivityElementEvent) {
+                                            TMLActivityElementEvent acElemEvent = (TMLActivityElementEvent) acElem;
+                                            if (acElemEvent.getEvent().getName().equals(elemP[2])) {
+                                                TMLActivityElement prevElem =  adTaskToAddPort.getPrevious(acElem);
+                                                TMLSendEvent sdEvent = new TMLSendEvent(_tmlmModel.getEventByName(elemP[0]).getName(), adTaskToAddPort.getReferenceObject());
+                                                sdEvent.setEvent(_tmlmModel.getEventByName(elemP[0]));
+                                                sdEvent.addNext(acElem);
+                                                prevElem.setNewNext(acElem, sdEvent);
+                                                adTaskToAddPort.addElement(sdEvent);
+                                            }
+                                        }
+                                    }
+                                }
+                            } else if (pTaskJson.getMode().equals(PatternCreation.MODE_OUTPUT)) {
+                                if (pTaskJson.getType().equals(PatternCreation.CHANNEL)) {
+                                    taskToAddPort.addReadTMLChannel(_tmlmModel.getChannelByName(elemP[0]));
+                                    for (TMLActivityElement acElem : adTaskToAddPort.getElements()) {
+                                        if (acElem instanceof TMLActivityElementChannel) {
+                                            TMLActivityElementChannel acElemChannel = (TMLActivityElementChannel) acElem;
+                                            for (int indexChannel = 0 ; indexChannel < acElemChannel.getNbOfChannels() ; indexChannel++) { 
+                                                if (acElemChannel.getChannel(indexChannel).getName().equals(elemP[2])) {
+                                                    TMLActivityElement prevElem =  adTaskToAddPort.getPrevious(acElem);
+                                                    TMLReadChannel rdChannel = new TMLReadChannel(_tmlmModel.getChannelByName(elemP[0]).getName(), adTaskToAddPort.getReferenceObject());
+                                                    rdChannel.setNbOfSamples("1"); /// TO UPDATE
+                                                    rdChannel.addChannel(_tmlmModel.getChannelByName(elemP[0]));
+                                                    rdChannel.addNext(acElem);
+                                                    prevElem.setNewNext(acElem, rdChannel);
+                                                    adTaskToAddPort.addElement(rdChannel);
+                                                }
+                                            }
+                                        }
+                                    }
+                                } else if (pTaskJson.getType().equals(PatternCreation.EVENT)) {
+                                    taskToAddPort.addTMLEvent(_tmlmModel.getEventByName(elemP[0]));
+                                    _tmlmModel.getEventByName(elemP[0]).setDestinationTask(taskToAddPort);
+                                    for (TMLActivityElement acElem : adTaskToAddPort.getElements()) {
+                                        if (acElem instanceof TMLActivityElementEvent) {
+                                            TMLActivityElementEvent acElemEvent = (TMLActivityElementEvent) acElem;
+                                            if (acElemEvent.getEvent().getName().equals(elemP[2])) {
+                                                TMLActivityElement prevElem =  adTaskToAddPort.getPrevious(acElem);
+                                                TMLWaitEvent wtEvent = new TMLWaitEvent(_tmlmModel.getEventByName(elemP[0]).getName(), adTaskToAddPort.getReferenceObject());
+                                                wtEvent.setEvent(_tmlmModel.getEventByName(elemP[0]));
+                                                wtEvent.addNext(acElem);
+                                                prevElem.setNewNext(acElem, wtEvent);
+                                                adTaskToAddPort.addElement(wtEvent);
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+
+                        }
+                    }
+                }
+            } 
+        }
+        return _tmapModel;
+    }*/
+
+    public TMLMapping<?> makeConnectionBetweenPatternAndModel(TMLMapping<?> _tmapModel, TMLMapping<?> _tmapPattern, List<PatternConnection> _portsConnection, LinkedHashMap<String, TaskPattern> _patternTasks, List<PatternCloneTask> _patternCloneTasks) {
+        TMLModeling<?> _tmlmModel = _tmapModel.getTMLModeling();
+        TMLModeling<?> _tmlmPattern = _tmapPattern.getTMLModeling();
+        for (PatternConnection portConnection : _portsConnection) {
+            String patternTaskName = portConnection.getPatternTaskName();
+            String patternTaskPortName = portConnection.getPatternChannel();
+            String modelTaskName = portConnection.getModelTaskName();
+            String modelTaskPortName = portConnection.getModelChannelName();
+
+            PortTaskJsonFile relatedPortInPattern = null;
+
+            for (PortTaskJsonFile portTaskJsonFile : _patternTasks.get(patternTaskName).getExternalPorts()) {
+                if (portTaskJsonFile.getName().equals(patternTaskPortName)) {
+                    relatedPortInPattern = portTaskJsonFile;
+                    break;
+                }
+            }
+
+            TMLTask patternTaskInModel = _tmlmModel.getTMLTaskByName(tasksOfPatternIntoModel.get(patternTaskName));
+
+            if (tasksClonedIntoModel.containsKey(modelTaskName)) {
+                modelTaskName = tasksClonedIntoModel.get(modelTaskName);
+                if (!portConnection.isNewPort()) {
+                    modelTaskPortName = channelsClonedIntoModel.get(Map.entry(modelTaskName, modelTaskPortName));
+                }
+            }
+            TMLTask modelTask = _tmlmModel.getTMLTaskByName(modelTaskName);
+            
+            TMLChannel chInModel = _tmlmModel.getChannelByName(modelTaskPortName);
+            TMLEvent evtInModel = _tmlmModel.getEventByName(modelTaskPortName);
+
+            TMLChannel chInPattern = _tmlmPattern.getChannelByName(patternTaskPortName);
+            TMLEvent evtInPattern = _tmlmPattern.getEventByName(patternTaskPortName);
+
+            if (portConnection.isANewChannelRequired(_portsConnection, patternTasks, _patternCloneTasks)) {
+                if (chInPattern != null) {
+                    //TraceManager.addDev("New channel !");
+                    try {
+                        TMLChannel chToAdd = chInPattern.deepClone(_tmlmPattern);
+                        chToAdd.setName(channelsOfPatternIntoModel.get(Map.entry(patternTaskName, patternTaskPortName)));
+                        if (relatedPortInPattern.getMode().equals(PatternCreation.MODE_INPUT)) {
+                            chToAdd.setDestinationTask(patternTaskInModel);
+                            chToAdd.setOriginTask(modelTask);
+                        } else if (relatedPortInPattern.getMode().equals(PatternCreation.MODE_OUTPUT)) {
+                            chToAdd.setDestinationTask(modelTask);
+                            chToAdd.setOriginTask(patternTaskInModel);
+                        }
+                        chToAdd.setPorts(new TMLPort(chToAdd.getName(), chToAdd.getReferenceObject()), new TMLPort(chToAdd.getName(), chToAdd.getReferenceObject()));
+                        _tmlmModel.addChannel(chToAdd);
+                        
+                        for (TMLActivityElement ae : patternTaskInModel.getActivityDiagram().getElements()) {
+                            if (ae instanceof TMLActivityElementChannel) {
+                                TMLActivityElementChannel aeCh = (TMLActivityElementChannel) ae;
+                                if (aeCh.getChannel(0).getName().equals(chInPattern.getName())) {
+                                    aeCh.replaceChannelWith(aeCh.getChannel(0), chToAdd);
+                                    //TraceManager.addDev("Pattern Task : Replace channel : " + chInPattern.getName() + " with : " + chToAdd.getName());
+                                }
+                            }
+                        }
+                        if (portConnection.isNewPort()) {
+                            String modelTaskNameForNewPort = modelTaskPortName;
+                            if (renamedModelChannels.containsKey(Map.entry(portConnection.getModelTaskName(), portConnection.getModelChannelName()))) {
+                                modelTaskNameForNewPort = renamedModelChannels.get(Map.entry(portConnection.getModelTaskName(), portConnection.getModelChannelName()));
+                            }
+                            _tmapModel = addNewPortToATask(_tmapModel, _patternTasks, modelTask, patternTaskName, patternTaskPortName, modelTaskNameForNewPort);
+                        } else {
+                            for (TMLActivityElement ae : modelTask.getActivityDiagram().getElements()) {
+                                if (ae instanceof TMLActivityElementChannel) {
+                                    TMLActivityElementChannel aeCh = (TMLActivityElementChannel) ae;
+                                    if (aeCh.getChannel(0).getName().equals(chInModel.getName())) {
+                                        aeCh.replaceChannelWith(aeCh.getChannel(0), chToAdd);
+                                        //TraceManager.addDev("model Task : Replace channel : " + chInModel.getName() + " with : " + chToAdd.getName());
+                                        renamedModelChannels.put(Map.entry(portConnection.getModelTaskName(), portConnection.getModelChannelName()), chToAdd.getName());
+                                    }
+                                }
+                            }
+                        }
+                    } catch (TMLCheckingError err) {
+                    }
+                } else if (evtInPattern != null) {
+                    //TraceManager.addDev("New event !");
+                    try {
+                        TMLEvent evtToAdd = evtInPattern.deepClone(_tmlmPattern);
+                        evtToAdd.setName(channelsOfPatternIntoModel.get(Map.entry(patternTaskName, patternTaskPortName)));
+                        if (relatedPortInPattern.getMode().equals(PatternCreation.MODE_INPUT)) {
+                            evtToAdd.setDestinationTask(patternTaskInModel);
+                            evtToAdd.setOriginTask(modelTask);
+                        } else if (relatedPortInPattern.getMode().equals(PatternCreation.MODE_OUTPUT)) {
+                            evtToAdd.setDestinationTask(modelTask);
+                            evtToAdd.setOriginTask(patternTaskInModel);
+                        }
+                        evtToAdd.setPorts(new TMLPort(evtToAdd.getName(), evtToAdd.getReferenceObject()), new TMLPort(evtToAdd.getName(), evtToAdd.getReferenceObject()));
+                        _tmlmModel.addEvent(evtToAdd);
+                        
+                        for (TMLActivityElement ae : patternTaskInModel.getActivityDiagram().getElements()) {
+                            if (ae instanceof TMLActivityElementEvent) {
+                                TMLActivityElementEvent aeEvt = (TMLActivityElementEvent) ae;
+                                if (aeEvt.getEvent().getName().equals(evtInPattern.getName())) {
+                                    aeEvt.replaceEventWith(aeEvt.getEvent(), evtToAdd);
+                                    //TraceManager.addDev("Pattern Task : Replace event : " + evtInPattern.getName() + " with : " + evtToAdd.getName());
+                                }
+                            }
+                        }
+                        if (portConnection.isNewPort()) {
+                            String modelTaskNameForNewPort = modelTaskPortName;
+                            if (renamedModelChannels.containsKey(Map.entry(portConnection.getModelTaskName(), portConnection.getModelChannelName()))) {
+                                modelTaskNameForNewPort = renamedModelChannels.get(Map.entry(portConnection.getModelTaskName(), portConnection.getModelChannelName()));
+                            }
+                            _tmapModel = addNewPortToATask(_tmapModel, _patternTasks, modelTask, patternTaskName, patternTaskPortName, modelTaskNameForNewPort);
+                        } else {
+                            for (TMLActivityElement ae : modelTask.getActivityDiagram().getElements()) {
+                                if (ae instanceof TMLActivityElementEvent) {
+                                    TMLActivityElementEvent aeEvt = (TMLActivityElementEvent) ae;
+                                    if (aeEvt.getEvent().getName().equals(evtInModel.getName())) {
+                                        aeEvt.replaceEventWith(aeEvt.getEvent(), evtToAdd);
+                                        //TraceManager.addDev("model Task : Replace event : " + evtInModel.getName() + " with : " + evtToAdd.getName());
+                                        renamedModelChannels.put(Map.entry(portConnection.getModelTaskName(), portConnection.getModelChannelName()), evtToAdd.getName());
+                                    }
+                                }
+                            }
+                        }
+                    } catch (TMLCheckingError err) {
+                    }
+                }
+            } else {
+                if (chInModel != null) {
+                    //TraceManager.addDev("Existant channel !");
+                    if (relatedPortInPattern.getMode().equals(PatternCreation.MODE_INPUT)) {
+                        chInModel.setDestinationTask(patternTaskInModel);
+                        chInModel.setPorts(chInModel.getOriginPort(), new TMLPort(chInModel.getName(), chInModel.getReferenceObject()));
+                    } else if (relatedPortInPattern.getMode().equals(PatternCreation.MODE_OUTPUT)) {
+                        chInModel.setOriginTask(patternTaskInModel);
+                        chInModel.setPorts(new TMLPort(chInModel.getName(), chInModel.getReferenceObject()), chInModel.getDestinationPort());
+                    }
+                    
+                    for (TMLActivityElement ae : patternTaskInModel.getActivityDiagram().getElements()) {
+                        if (ae instanceof TMLActivityElementChannel) {
+                            TMLActivityElementChannel aeCh = (TMLActivityElementChannel) ae;
+                            if (aeCh.getChannel(0).getName().equals(chInPattern.getName())) {
+                                aeCh.replaceChannelWith(aeCh.getChannel(0), chInModel);
+                                //TraceManager.addDev("Replace channel : " + chInPattern.getName() + " with : " + chInModel.getName());
+                            }
+                        }
+                    }
+                }
+                if (evtInModel != null) {
+                    //TraceManager.addDev("Existant event !");
+                    if (relatedPortInPattern.getMode().equals(PatternCreation.MODE_INPUT)) {
+                        evtInModel.setDestinationTask(patternTaskInModel);
+                        evtInModel.setPorts(evtInModel.getOriginPort(), new TMLPort(evtInModel.getName(), evtInModel.getReferenceObject()));
+                    } else if (relatedPortInPattern.getMode().equals(PatternCreation.MODE_OUTPUT)) {
+                        evtInModel.setOriginTask(patternTaskInModel);
+                        evtInModel.setPorts(new TMLPort(evtInModel.getName(), evtInModel.getReferenceObject()), evtInModel.getDestinationPort());
+                    }
+                    
+                    for (TMLActivityElement ae : patternTaskInModel.getActivityDiagram().getElements()) {
+                        if (ae instanceof TMLActivityElementEvent) {
+                            TMLActivityElementEvent aeEvt = (TMLActivityElementEvent) ae;
+                            if (aeEvt.getEvent().getName().equals(evtInPattern.getName())) {
+                                aeEvt.replaceEventWith(aeEvt.getEvent(), evtInModel);
+                                //TraceManager.addDev("Replace event : " + evtInPattern.getName() + " with : " + evtInModel.getName());
+                            }
+                        }
+                    }
+                } 
+            }
+        }
+        return _tmapModel;
+    }
+
+    public TMLMapping<?> configDisconnectedChannels(TMLMapping<?> _tmapModel, List<PatternPortsConfig> _portsConfig) {
+        TMLModeling<?> _tmlmModel = _tmapModel.getTMLModeling();
+
+        for (PatternPortsConfig portConfig : _portsConfig) {
+            TMLTask task = _tmlmModel.getTMLTaskByName(portConfig.getTaskOfChannelToConfig());
+            //String portName = portDecision.getKey();
+            //String decision = portDecision.getValue();
+            
+            if (task != null) {
+                TMLActivity adTask = task.getActivityDiagram();
+                TMLActivityElement elemMerge = null;
+                String mergeWith = portConfig.getMergeWith();
+                if (mergeWith != null) {
+                    if (renamedModelChannels.containsKey(Map.entry(portConfig.getTaskOfChannelToConfig(), mergeWith))) {
+                        mergeWith = renamedModelChannels.get(Map.entry(portConfig.getTaskOfChannelToConfig(), mergeWith));
+                    }
+                    for (TMLActivityElement acElem : adTask.getElements()) {
+                        if (acElem instanceof TMLActivityElementChannel) {
+                            TMLActivityElementChannel acElemChannel = (TMLActivityElementChannel) acElem;
+                            for (int indexChannel = 0 ; indexChannel < acElemChannel.getNbOfChannels() ; indexChannel++) {
+                                if (acElemChannel.getChannel(indexChannel).getName().equals(mergeWith)) {
+                                    try {
+                                        elemMerge = acElem.deepClone(_tmlmModel);
+                                    } catch (TMLCheckingError err) {
+
+                                    }
+                                    break;
+                                }
+                            }
+                        } else if (acElem instanceof TMLActivityElementEvent) {
+                            TMLActivityElementEvent acElemEvent = (TMLActivityElementEvent) acElem;
+                            if (acElemEvent.getEvent().getName().equals(mergeWith)) {
+                                try {
+                                    elemMerge = acElem.deepClone(_tmlmModel);
+                                } catch (TMLCheckingError err) {
+
+                                }
+                                break;
+                            }
+                        }
+                    }   
+                }
+
+                List<TMLActivityElement> elemsToRemove = new ArrayList<TMLActivityElement>();
+                for (int ind = 0; ind < adTask.getElements().size() ; ind ++) {
+                    TMLActivityElement acElem = adTask.getElements().get(ind);
+                    if (acElem instanceof TMLActivityElementChannel) {
+                        TMLActivityElementChannel acElemChannel = (TMLActivityElementChannel) acElem;
+                        for (int indexChannel = 0 ; indexChannel < acElemChannel.getNbOfChannels() ; indexChannel++) { 
+                            if (acElemChannel.getChannel(indexChannel).getName().equals(portConfig.getChannelToConfig())) {
+                                TMLActivityElement prevElem =  adTask.getPrevious(acElem);
+                                TMLActivityElement nextElem =  acElem.getNextElement(0);
+                                if (elemMerge == null) {
+                                    while (nextElem instanceof TMLActivityElementChannel && ((TMLActivityElementChannel)nextElem).getChannel(0).getName().equals(portConfig.getChannelToConfig())) {
+                                        elemsToRemove.add(nextElem);
+                                        nextElem =  nextElem.getNextElement(0);
+                                    }
+                                    prevElem.setNewNext(acElem, nextElem);
+                                    elemsToRemove.add(acElem);
+                                } else {
+                                    try {
+                                        TMLActivityElement newNextElem =  elemMerge.deepClone(_tmlmModel);
+                                        prevElem.setNewNext(acElem, newNextElem);
+                                        newNextElem.clearNexts();
+                                        newNextElem.addNext(nextElem);
+                                        elemsToRemove.add(acElem);
+                                        adTask.addElement(newNextElem);
+                                    } catch (TMLCheckingError err) {
+
+                                    }
+                                    
+                                }
+                            }
+                        }
+                    } else if (acElem instanceof TMLActivityElementEvent) {
+                        TMLActivityElementEvent acElemEvent = (TMLActivityElementEvent) acElem;
+                        if (acElemEvent.getEvent().getName().equals(portConfig.getChannelToConfig())) {
+                            TMLActivityElement prevElem =  adTask.getPrevious(acElem);
+                            TMLActivityElement nextElem =  acElem.getNextElement(0);
+                            if (elemMerge == null) {
+                                while (nextElem instanceof TMLActivityElementEvent && ((TMLActivityElementEvent)nextElem).getEvent().getName().equals(portConfig.getChannelToConfig())) {
+                                    elemsToRemove.add(nextElem);
+                                    nextElem =  nextElem.getNextElement(0);
+                                }
+                                prevElem.setNewNext(acElem, nextElem);
+                                elemsToRemove.add(acElem);
+                            } else {
+                                try {
+                                    TMLActivityElement newNextElem =  elemMerge.deepClone(_tmlmModel);
+                                    prevElem.setNewNext(acElem, newNextElem);
+                                    newNextElem.clearNexts();
+                                    newNextElem.addNext(nextElem);
+                                    elemsToRemove.add(acElem);
+                                } catch (TMLCheckingError err) {
+
+                                }
+                            }
+                        }
+                    }
+                }
+                for (TMLActivityElement elemToRemove : elemsToRemove) {
+                    //TraceManager.addDev("elemToRemove = " + elemToRemove.getName());
+                    adTask.removeElement(elemToRemove);
+                }
+            } 
+
+        }
+        return _tmapModel;
+    }
+
+    public TMLMapping<?> mapTasksInArch(TMLMapping<?> _tmapModel, List<MappingPatternTask> _tasksMapping) {
+        TMLArchitecture _tmlarchModel =  _tmapModel.getArch();
+        for (MappingPatternTask taskMapping : _tasksMapping) {
+            if (taskMapping.getOrigin() == MappingPatternTask.ORIGIN_CLONE) {
+                TMLTask taskCloneToMap = _tmapModel.getTaskByName(tasksClonedIntoModel.get(taskMapping.getTaskToMapName()));
+                if (taskCloneToMap != null) {
+                    if (taskMapping.getSameHwAs() != null) {
+                        String sameTaskName = taskMapping.getSameHwAs();
+                        int sameTaskOrigin = taskMapping.getSameHwAsOrigin();
+                        TMLTask inSameTask = null;
+                        if (sameTaskOrigin == MappingPatternTask.ORIGIN_MODEL) {
+                            inSameTask = _tmapModel.getTaskByName(sameTaskName);
+                        } else if (sameTaskOrigin == MappingPatternTask.ORIGIN_CLONE) {
+                            inSameTask = _tmapModel.getTaskByName(tasksClonedIntoModel.get(sameTaskName));
+                        } else if (sameTaskOrigin == MappingPatternTask.ORIGIN_PATTERN) {
+                            inSameTask = _tmapModel.getTaskByName(tasksOfPatternIntoModel.get(sameTaskName));
+                        }
+                        if (inSameTask != null) {
+                            HwExecutionNode hwMapTask = _tmapModel.getHwNodeOf(inSameTask);
+                            if (hwMapTask != null) {
+                                _tmapModel.addTaskToHwExecutionNode(taskCloneToMap, hwMapTask);
+                            }
+                        }
+                    } else if (taskMapping.getBusNameForNewHw() != null) {
+                        HwBus bus = _tmlarchModel.getHwBusByName(taskMapping.getBusNameForNewHw());
+                        if (bus != null) {
+                            String nameCPU = "CPU_" + tasksClonedIntoModel.get(taskMapping.getTaskToMapName());
+                            HwNode node = _tmlarchModel.getHwNodeByName(nameCPU);
+                            if (node != null) {
+                                int indexCPU = 0;
+                                String nameCPUWithIndex = nameCPU + indexCPU;
+                                while(_tmlarchModel.getHwNodeByName(nameCPUWithIndex) != null) {
+                                    indexCPU += 1;
+                                    nameCPUWithIndex = nameCPU + indexCPU;
+                                }
+                                nameCPU = nameCPUWithIndex;
+                            }
+                            HwCPU _newCpu = new HwCPU(nameCPU);
+                            _tmapModel.addTaskToHwExecutionNode(taskCloneToMap, _newCpu);
+                            _tmlarchModel.addHwNode(_newCpu);
+                            HwLink linkNewCPUWithBus = new HwLink("link_" + _newCpu.getName() + "_to_" + bus.getName());
+                            linkNewCPUWithBus.bus = bus;
+                            linkNewCPUWithBus.hwnode = _newCpu;
+                            _tmlarchModel.addHwLink(linkNewCPUWithBus);
+                        }
+                    }
+                }
+            } else if (taskMapping.getOrigin() == MappingPatternTask.ORIGIN_PATTERN) {
+                TMLTask taskPatternToMap = _tmapModel.getTaskByName(tasksOfPatternIntoModel.get(taskMapping.getTaskToMapName()));
+                if (taskPatternToMap != null) {
+                    if (taskMapping.getSameHwAs() != null) {
+                        String sameTaskName = taskMapping.getSameHwAs();
+                        int sameTaskOrigin = taskMapping.getSameHwAsOrigin();
+                        TMLTask inSameTask = null;
+                        if (sameTaskOrigin == MappingPatternTask.ORIGIN_MODEL) {
+                            inSameTask = _tmapModel.getTaskByName(sameTaskName);
+                        } else if (sameTaskOrigin == MappingPatternTask.ORIGIN_CLONE) {
+                            inSameTask = _tmapModel.getTaskByName(tasksClonedIntoModel.get(sameTaskName));
+                        } else if (sameTaskOrigin == MappingPatternTask.ORIGIN_PATTERN) {
+                            inSameTask = _tmapModel.getTaskByName(tasksOfPatternIntoModel.get(sameTaskName));
+                        }
+                        if (inSameTask != null) {
+                            HwExecutionNode hwMapTask = _tmapModel.getHwNodeOf(inSameTask);
+                            if (hwMapTask != null) {
+                                _tmapModel.addTaskToHwExecutionNode(taskPatternToMap, hwMapTask);
+                            }
+                        }
+                    } else if (taskMapping.getBusNameForNewHw() != null) {
+                        HwBus bus = _tmlarchModel.getHwBusByName(taskMapping.getBusNameForNewHw());
+                        if (bus != null) {
+                            String nameCPU = "CPU_" + tasksOfPatternIntoModel.get(taskMapping.getTaskToMapName());
+                            HwNode node = _tmlarchModel.getHwNodeByName(nameCPU);
+                            if (node != null) {
+                                int indexCPU = 0;
+                                String nameCPUWithIndex = nameCPU + indexCPU;
+                                while(_tmlarchModel.getHwNodeByName(nameCPUWithIndex) != null) {
+                                    indexCPU += 1;
+                                    nameCPUWithIndex = nameCPU + indexCPU;
+                                }
+                                nameCPU = nameCPUWithIndex;
+                            }
+                            HwCPU _newCpu = new HwCPU(nameCPU);
+                            _tmapModel.addTaskToHwExecutionNode(taskPatternToMap, _newCpu);
+                            _tmlarchModel.addHwNode(_newCpu);
+                            HwLink linkNewCPUWithBus = new HwLink("link_" + _newCpu.getName() + "_to_" + bus.getName());
+                            linkNewCPUWithBus.bus = bus;
+                            linkNewCPUWithBus.hwnode = _newCpu;
+                            _tmlarchModel.addHwLink(linkNewCPUWithBus);
+                        }
+                    }
+                }
+            }
+            
+            
+            
+        }
+        return _tmapModel;
+    }
+
+    public TMLMapping<?> mapTasksInArchAuto(TMLMapping<?> _tmapModel, TMLMapping<?> _tmapPattern, List<MappingPatternTask> _mappingPatternTasks, PatternConfiguration _patternConfiguration, LinkedHashMap<String, TaskPattern> _patternTasks) {
+        TMLModeling<?> tmlmModel = _tmapModel.getTMLModeling();
+        TMLModeling<?> tmlmPattern = _tmapPattern.getTMLModeling();
+        Map<TMLTask, TMLTask> correspTasks = correspondenceForTasks(_tmapModel, _tmapPattern, _patternConfiguration, _patternTasks);
+        Set<String> mappedTasks = new HashSet<String>();
+        for (MappingPatternTask mappingPatternTask : _mappingPatternTasks) {
+            mappedTasks.add(mappingPatternTask.getTaskToMapName());
+        }
+        Map<TMLTask, TMLTask> correspondenceForClonedTasks = correspondenceForClonedTasks(_tmapModel, _tmapPattern, mappedTasks, _patternConfiguration, _patternTasks);
+        /*for (TMLTask correspTask : correspTasks.keySet()) {
+            TraceManager.addDev("correspTask: In pattern :" + correspTask.getName() + " In model : " + correspTasks.get(correspTask).getName());
+        }
+        for (TMLTask correspTask : correspondenceForClonedTasks.keySet()) {
+            TraceManager.addDev("correspondenceForClonedTasks: In Model :" + correspTask.getName() + " In pattern : " + correspondenceForClonedTasks.get(correspTask).getName());
+        }*/ 
+        LinkedHashMap<String, TaskPattern> _patternTasksSorted = new LinkedHashMap<String, TaskPattern>();
+        LinkedHashMap<String, TaskPattern> _patternTasksInEnd = new LinkedHashMap<String, TaskPattern>();
+        for (String taskName : _patternTasks.keySet()) {
+            if (_patternTasks.get(taskName).getExternalPorts().size() == 0) {
+                _patternTasksInEnd.put(taskName, _patternTasks.get(taskName));
+            } else {
+                _patternTasksSorted.put(taskName, _patternTasks.get(taskName));
+            }
+        }
+        _patternTasksSorted.putAll(_patternTasksInEnd);
+        for (String taskName : _patternTasksSorted.keySet()) {
+            TMLTask task = tmlmPattern.getTMLTaskByName(taskName);
+            boolean taskIsMapped = false;
+            if (task != null && !mappedTasks.contains(taskName)) {
+                HwExecutionNode hwMapTask = _tmapPattern.getHwNodeOf(task);
+                HashSet<TMLTask> tasksInThisCPU = _tmapPattern.getLisMappedTasks(hwMapTask);
+                for (TMLTask taskInCPU : tasksInThisCPU) {
+                    if (correspTasks.containsKey(taskInCPU)) {
+                        TMLTask taskInModel = correspTasks.get(taskInCPU);
+                        HwExecutionNode hwMapTaskInModel = _tmapModel.getHwNodeOf(taskInModel);
+                        if (hwMapTaskInModel != null) {
+                            TMLTask taskToMap = tmlmModel.getTMLTaskByName(tasksOfPatternIntoModel.get(taskName));
+                            _tmapModel.addTaskToHwExecutionNode(taskToMap, hwMapTaskInModel);
+                            taskIsMapped = true;
+                            break;
+                        }
+                    }
+                }
+                if (!taskIsMapped) {
+                    String nameNewCPU = hwMapTask.getName();
+                    HwExecutionNode newCPU = _tmapModel.getHwExecutionNodeByName(nameNewCPU);
+                    int ind = 0;
+                    while (newCPU != null) {
+                        nameNewCPU = hwMapTask.getName() + ind;
+                        newCPU = _tmapModel.getHwExecutionNodeByName(nameNewCPU);
+                        ind += 1;
+                    }
+                    HwCPU _newCpu = new HwCPU(nameNewCPU);
+                    TMLTask taskToMap = tmlmModel.getTMLTaskByName(tasksOfPatternIntoModel.get(taskName));
+                    _tmapModel.addTaskToHwExecutionNode(taskToMap, _newCpu);
+                    _tmapModel.getArch().addHwNode(_newCpu);
+                    HwBus bus = null;
+                    for (TMLChannel ch : tmlmModel.getChannelsFromMe(taskToMap)) {
+                        if (bus == null) {
+                            TMLTask taskInConn = ch.getDestinationTask();
+                            HwExecutionNode hwOfTaskInConn = _tmapModel.getHwNodeOf(taskInConn);
+                            if (hwOfTaskInConn != null) {
+                                for (HwLink link : _tmapModel.getArch().getHwLinks()) {
+                                    if (link.hwnode == hwOfTaskInConn) {
+                                        bus = link.bus;
+                                        break;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    
+                    for (TMLChannel ch : tmlmModel.getChannelsToMe(taskToMap)) {
+                        if (bus == null) {
+                            TMLTask taskInConn = ch.getOriginTask();
+                            HwExecutionNode hwOfTaskInConn = _tmapModel.getHwNodeOf(taskInConn);
+                            if (hwOfTaskInConn != null) {
+                                for (HwLink link : _tmapModel.getArch().getHwLinks()) {
+                                    if (link.hwnode == hwOfTaskInConn) {
+                                        bus = link.bus;
+                                        break;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    
+                    if (bus == null) {
+                        int nbConnections = 0 ; 
+                        for (HwNode busModel : _tmapModel.getArch().getBUSs()) {
+                            if (busModel instanceof HwBus) {
+                                int curNbConnections = 0 ;
+                                for (HwLink link : _tmapModel.getArch().getHwLinks()) {
+                                    if (link.bus == busModel) {
+                                        nbConnections += 1;
+                                    }
+                                }
+                                if (curNbConnections > nbConnections) {
+                                    bus = (HwBus) busModel;
+                                    nbConnections = curNbConnections;
+                                }
+                            }
+                        }
+                    }
+                    
+                    HwLink linkNewCPUWithBus = new HwLink("link_" + _newCpu.getName() + "_to_" + bus.getName());
+                    linkNewCPUWithBus.bus = bus;
+                    linkNewCPUWithBus.hwnode = _newCpu;
+                    _tmapModel.getArch().addHwLink(linkNewCPUWithBus);
+                }
+            }
+        }
+
+        for (PatternCloneTask patternCloneTask : _patternConfiguration.getClonedTasks()) {
+            String taskName = tasksClonedIntoModel.get(patternCloneTask.getClonedTask());
+            TMLTask task = tmlmModel.getTMLTaskByName(taskName);
+            boolean taskIsMapped = false;
+            if (task != null && !mappedTasks.contains(patternCloneTask.getClonedTask())) {
+                TMLTask taskInPattern = correspondenceForClonedTasks.get(task);
+
+                HwExecutionNode hwMapTask = _tmapPattern.getHwNodeOf(taskInPattern);
+                HashSet<TMLTask> tasksInThisCPU = _tmapPattern.getLisMappedTasks(hwMapTask);
+                for (TMLTask taskInCPU : tasksInThisCPU) {
+                    if (correspTasks.containsKey(taskInCPU)) {
+                        TMLTask taskInModel = correspTasks.get(taskInCPU);
+                        HwExecutionNode hwMapTaskInModel = _tmapModel.getHwNodeOf(taskInModel);
+                        if (hwMapTaskInModel != null) {
+                            _tmapModel.addTaskToHwExecutionNode(task, hwMapTaskInModel);
+                            taskIsMapped = true;
+                            break;
+                        }
+                    }
+                }
+                if (!taskIsMapped) {
+                    String nameNewCPU = hwMapTask.getName();
+                    HwExecutionNode newCPU = _tmapModel.getHwExecutionNodeByName(nameNewCPU);
+                    int ind = 0;
+                    while (newCPU != null) {
+                        nameNewCPU = hwMapTask.getName() + ind;
+                        newCPU = _tmapModel.getHwExecutionNodeByName(nameNewCPU);
+                        ind += 1;
+                    }
+                    HwCPU _newCpu = new HwCPU(nameNewCPU);
+                    TMLTask taskToMap = tmlmModel.getTMLTaskByName(taskName);
+                    _tmapModel.addTaskToHwExecutionNode(taskToMap, _newCpu);
+                    _tmapModel.getArch().addHwNode(_newCpu);
+
+                    HwBus bus = null;
+                    for (TMLChannel ch : tmlmModel.getChannelsFromMe(taskToMap)) {
+                        if (bus == null) {
+                            TMLTask taskInConn = ch.getDestinationTask();
+                            HwExecutionNode hwOfTaskInConn = _tmapModel.getHwNodeOf(taskInConn);
+                            if (hwOfTaskInConn != null) {
+                                for (HwLink link : _tmapModel.getArch().getHwLinks()) {
+                                    if (link.hwnode == hwOfTaskInConn) {
+                                        bus = link.bus;
+                                        break;
+                                    }
+                                }
+                            }
+                        }
+                        
+                    }
+                    for (TMLChannel ch : tmlmModel.getChannelsToMe(taskToMap)) {
+                        if (bus == null) {
+                            TMLTask taskInConn = ch.getOriginTask();
+                            HwExecutionNode hwOfTaskInConn = _tmapModel.getHwNodeOf(taskInConn);
+                            if (hwOfTaskInConn != null) {
+                                for (HwLink link : _tmapModel.getArch().getHwLinks()) {
+                                    if (link.hwnode == hwOfTaskInConn) {
+                                        bus = link.bus;
+                                        break;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    if (bus == null) {
+                        int nbConnections = 0 ; 
+                        for (HwNode busModel : _tmapModel.getArch().getBUSs()) {
+                            if (busModel instanceof HwBus) {
+                                int curNbConnections = 0 ;
+                                for (HwLink link : _tmapModel.getArch().getHwLinks()) {
+                                    if (link.bus == busModel) {
+                                        nbConnections += 1;
+                                    }
+                                }
+                                if (curNbConnections > nbConnections) {
+                                    bus = (HwBus) busModel;
+                                    nbConnections = curNbConnections;
+                                }
+                            }
+                        }
+                    }
+                    HwLink linkNewCPUWithBus = new HwLink("link_" + _newCpu.getName() + "_to_" + bus.getName());
+                    linkNewCPUWithBus.bus = bus;
+                    linkNewCPUWithBus.hwnode = _newCpu;
+                    _tmapModel.getArch().addHwLink(linkNewCPUWithBus);
+                }
+            }
+        }
+        return _tmapModel;
+    }
+
+    // Find correspondence between Tasks of the pattern model and the cloned tasks of current Model 
+    public Map<TMLTask, TMLTask> correspondenceForClonedTasks(TMLMapping<?> _tmapModel, TMLMapping<?> _tmapPattern, Set<String> mappedTasks, PatternConfiguration _patternConfiguration, LinkedHashMap<String, TaskPattern> _patternTasks) {
+        TMLModeling<?> tmlmModel = _tmapModel.getTMLModeling();
+        TMLModeling<?> tmlmPattern = _tmapPattern.getTMLModeling();
+        List <String> clonedTasksToMap = new ArrayList<String>();
+        // List <TMLTask> patternTasksToMap = new ArrayList<TMLTask>();
+        for (PatternCloneTask patternCloneTask : _patternConfiguration.getClonedTasks()) {
+            String taskName = patternCloneTask.getClonedTask();
+            TMLTask task = tmlmModel.getTMLTaskByName(tasksClonedIntoModel.get(taskName));
+            if (task != null && !mappedTasks.contains(taskName)) {
+                clonedTasksToMap.add(task.getName());
+            }
+        }
+        /* for (String taskName : _patternTasks.keySet()) {
+            TMLTask task = tmlmModel.getTMLTaskByName(taskName);
+            if (task != null && !mappedTasks.contains(taskName)) {
+                patternTasksToMap.add(task);
+            }
+        } */
+        Map<TMLTask, TMLTask> correspTasks = new HashMap<TMLTask, TMLTask>();
+        for (PatternConnection patternConnection : _patternConfiguration.getPortsConnection()) {
+            String taskPatternName = patternConnection.getPatternTaskName();
+            if (clonedTasksToMap.contains(tasksClonedIntoModel.get(patternConnection.getModelTaskName()))) {
+                String modeChInPattern = "";
+                String typeChInPattern = "";
+                for (PortTaskJsonFile pt : _patternTasks.get(taskPatternName).getExternalPorts()) {
+                    if (pt.getName().equals(patternConnection.getPatternChannel())) {
+                        modeChInPattern = pt.getMode();
+                        typeChInPattern = pt.getType();
+                        break;
+                    }
+                }
+                if (typeChInPattern.equals(PatternCreation.CHANNEL)) {
+                    TMLChannel chInPattern = tmlmPattern.getChannelByName(patternConnection.getPatternChannel());
+                    if (chInPattern != null) {
+                        if (modeChInPattern.equals(PatternCreation.MODE_INPUT)) {
+                            correspTasks.put(tmlmModel.getTMLTaskByName(tasksClonedIntoModel.get(patternConnection.getModelTaskName())), chInPattern.getOriginTask());
+                        } else if (modeChInPattern.equals(PatternCreation.MODE_OUTPUT)) {
+                            correspTasks.put(tmlmModel.getTMLTaskByName(tasksClonedIntoModel.get(patternConnection.getModelTaskName())), chInPattern.getDestinationTask());
+                        }
+                        
+                    }
+                } else if (typeChInPattern.equals(PatternCreation.EVENT)) {
+                    TMLEvent evtInPattern = tmlmPattern.getEventByName(patternConnection.getPatternChannel());
+                    if (evtInPattern != null) {
+                        if (modeChInPattern.equals(PatternCreation.MODE_INPUT)) {
+                            correspTasks.put(tmlmModel.getTMLTaskByName(tasksClonedIntoModel.get(patternConnection.getModelTaskName())), evtInPattern.getOriginTask());
+                        } else if (modeChInPattern.equals(PatternCreation.MODE_OUTPUT)) {
+                            correspTasks.put(tmlmModel.getTMLTaskByName(tasksClonedIntoModel.get(patternConnection.getModelTaskName())), evtInPattern.getDestinationTask());
+                        }
+                    }
+                }
+            }
+        }
+        return correspTasks;
+    }
+
+    // Find correspondence between Tasks of the pattern model and the tasks of current Model 
+    public Map<TMLTask, TMLTask> correspondenceForTasks(TMLMapping<?> _tmapModel, TMLMapping<?> _tmapPattern, PatternConfiguration _patternConfiguration, LinkedHashMap<String, TaskPattern> _patternTasks) {
+        TMLModeling<?> tmlmModel = _tmapModel.getTMLModeling();
+        TMLModeling<?> tmlmPattern = _tmapPattern.getTMLModeling();
+        Map<TMLTask, TMLTask> correspTasks = new HashMap<TMLTask, TMLTask>();
+        for (PatternConnection patternConnection : _patternConfiguration.getPortsConnection()) {
+            String taskPatternName = patternConnection.getPatternTaskName();
+            String modelTask = patternConnection.getModelTaskName();
+            if (tasksClonedIntoModel.containsKey(modelTask)) {
+                modelTask = tasksClonedIntoModel.get(modelTask);
+            }
+            String modeChInPattern = "";
+            String typeChInPattern = "";
+            for (PortTaskJsonFile pt : _patternTasks.get(taskPatternName).getExternalPorts()) {
+                if (pt.getName().equals(patternConnection.getPatternChannel())) {
+                    modeChInPattern = pt.getMode();
+                    typeChInPattern = pt.getType();
+                    break;
+                }
+            }
+            if (typeChInPattern.equals(PatternCreation.CHANNEL)) {
+                TMLChannel chInPattern = tmlmPattern.getChannelByName(patternConnection.getPatternChannel());
+                if (chInPattern != null) {
+                    if (modeChInPattern.equals(PatternCreation.MODE_INPUT)) {
+                        correspTasks.put(chInPattern.getOriginTask(), tmlmModel.getTMLTaskByName(modelTask));
+                    } else if (modeChInPattern.equals(PatternCreation.MODE_OUTPUT)) {
+                        correspTasks.put(chInPattern.getDestinationTask(), tmlmModel.getTMLTaskByName(modelTask));
+                    }
+                }
+            } else if (typeChInPattern.equals(PatternCreation.EVENT)) {
+                TMLEvent evtInPattern = tmlmPattern.getEventByName(patternConnection.getPatternChannel());
+                if (evtInPattern != null) {
+                    if (modeChInPattern.equals(PatternCreation.MODE_INPUT)) {
+                        correspTasks.put(evtInPattern.getOriginTask(), tmlmModel.getTMLTaskByName(modelTask));
+                    } else if (modeChInPattern.equals(PatternCreation.MODE_OUTPUT)) {
+                        correspTasks.put(evtInPattern.getDestinationTask(), tmlmModel.getTMLTaskByName(modelTask));
+                    }
+                }
+            }
+        }
+        for (String patternTask: _patternTasks.keySet()) {
+            correspTasks.put(tmlmPattern.getTMLTaskByName(patternTask), tmlmModel.getTMLTaskByName(tasksOfPatternIntoModel.get(patternTask)));
+        }
+        return correspTasks;
+    }
+
+
+    public TMLMapping<?> mapChannelsInArch(TMLMapping<?> _tmapModel, List<MappingPatternChannel> _channelMapping) {
+        TMLArchitecture _tmlarchModel =  _tmapModel.getArch();
+        for (MappingPatternChannel channelMapping : _channelMapping) {
+            String channelToMapName = channelMapping.getChannelToMapName();
+            String taskOfChannelToMap = channelMapping.getTaskOfChannelToMap();
+            /*if (renamedChannels.containsKey(channelToMapName)) {
+                channelToMapName = renamedChannels.get(channelToMapName);
+            }*/
+            String channelToMapNameInModel = channelToMapName;
+            if (channelMapping.getOrigin() == MappingPatternChannel.ORIGIN_CLONE && channelsClonedIntoModel.containsKey(Map.entry(taskOfChannelToMap, channelToMapName))) {
+                channelToMapNameInModel =  channelsClonedIntoModel.get(Map.entry(taskOfChannelToMap, channelToMapName));
+            } else if (channelMapping.getOrigin() == MappingPatternChannel.ORIGIN_PATTERN && channelsOfPatternIntoModel.containsKey(Map.entry(taskOfChannelToMap, channelToMapName))) {
+                channelToMapNameInModel =  channelsOfPatternIntoModel.get(Map.entry(taskOfChannelToMap, channelToMapName));
+            }
+            TMLChannel channelToMap = _tmapModel.getChannelByName(channelToMapNameInModel);
+            if (channelToMap != null) {
+                if (channelMapping.getChannelInSameMemAs() != null) {
+                    String sameChannel = channelMapping.getChannelInSameMemAs();
+                    String sameChannelTask = channelMapping.getTaskOfChannelInSameMem();
+                    String sameChannelInModel = sameChannel;
+                    if (channelMapping.getSameMemAsOrigin() == MappingPatternChannel.ORIGIN_CLONE && channelsClonedIntoModel.containsKey(Map.entry(sameChannelTask, sameChannel))) {
+                        sameChannelInModel =  channelsClonedIntoModel.get(Map.entry(sameChannelTask, sameChannel));
+                    } else if (channelMapping.getSameMemAsOrigin() == MappingPatternChannel.ORIGIN_PATTERN && channelsOfPatternIntoModel.containsKey(Map.entry(sameChannelTask, sameChannel))) {
+                        sameChannelInModel =  channelsOfPatternIntoModel.get(Map.entry(sameChannelTask, sameChannel));
+                    }
+                    TMLChannel inSameChannel = _tmapModel.getChannelByName(sameChannelInModel);
+                    if (inSameChannel != null) {
+                        HwMemory memoryOfSameChannel = _tmapModel.getMemoryOfChannel(inSameChannel);
+                        if (memoryOfSameChannel != null) {
+                            _tmapModel.addCommToHwCommNode(channelToMap, memoryOfSameChannel);
+                        }
+                        for (HwCommunicationNode mappedNode : _tmapModel.getAllCommunicationNodesOfChannel(inSameChannel)) {
+                            if (mappedNode instanceof HwBus) {
+                                _tmapModel.addCommToHwCommNode(channelToMap, mappedNode);
+                            }   
+                        }
+                    }
+                } else if (channelMapping.getBusNameForNewMem() != null) {
+                    String busName = channelMapping.getBusNameForNewMem();
+                    HwBus bus = _tmlarchModel.getHwBusByName(busName);
+                    if (bus != null) {
+                        String nameMem = "Memory_" + channelToMapName;
+                        HwNode node = _tmlarchModel.getHwNodeByName(nameMem);
+                        if (node != null) {
+                            int indexMem = 0;
+                            String nameMemWithIndex = nameMem + indexMem;
+                            while(_tmlarchModel.getHwNodeByName(nameMemWithIndex) != null) {
+                                indexMem += 1;
+                                nameMemWithIndex = nameMem + indexMem;
+                            }
+                            nameMem = nameMemWithIndex;
+                        }
+                        HwMemory _newMem = new HwMemory(nameMem);
+                        _tmapModel.addCommToHwCommNode(channelToMap, _newMem);
+                        _tmapModel.addCommToHwCommNode(channelToMap, bus);
+                        _tmlarchModel.addHwNode(_newMem);
+                        HwLink linkNewMemWithBus = new HwLink("link_" + _newMem.getName() + "_to_" + bus.getName());
+                        linkNewMemWithBus.bus = bus;
+                        linkNewMemWithBus.hwnode = _newMem;
+                        _tmlarchModel.addHwLink(linkNewMemWithBus);
+                    }
+                }
+            }
+        }
+        return _tmapModel;
+    }
+
+    public TMLMapping<?> mapChannelsInArchAuto(TMLMapping<?> _tmapModel, TMLMapping<?> _tmapPattern, List<MappingPatternTask> _mappingPatternTasks, List<MappingPatternChannel> _mappingPatternChannels, PatternConfiguration _patternConfiguration, LinkedHashMap<String, TaskPattern> _patternTasks) {
+        Map<TMLChannel, TMLChannel> correspChannels = correspondenceForChannels(_tmapModel, _tmapPattern, _patternConfiguration, _patternTasks);
+        /*for (TMLChannel corresp : correspChannels.keySet()) {
+            TraceManager.addDev("chInPattern=" + corresp.getName() + " chInModel=" + correspChannels.get(corresp).getName());
+        }*/
+        List<MappingPatternChannel> allChannelsToMap = MappingPatternChannel.getChannelsToMap(_patternConfiguration.getPortsConnection(), _patternTasks, _patternConfiguration.getClonedTasks());
+        List<MappingPatternChannel> channelsToMapAuto = new ArrayList<MappingPatternChannel>();
+        for (MappingPatternChannel mappingPatternChannel : allChannelsToMap) {
+            boolean isMapped = false;
+            for (MappingPatternChannel mappedPatternChannel : _mappingPatternChannels) {
+                if (mappingPatternChannel.getChannelToMapName().equals(mappedPatternChannel.getChannelToMapName()) && mappingPatternChannel.getTaskOfChannelToMap().equals(mappedPatternChannel.getTaskOfChannelToMap())) {
+                    isMapped = true;
+                    break;
+                }
+            }
+            if (!isMapped) {
+                channelsToMapAuto.add(mappingPatternChannel);
+            }
+        }
+        for (MappingPatternChannel mappingPatternChannel : channelsToMapAuto) {
+            String chToMapName = mappingPatternChannel.getChannelToMapName();
+            String taskOfChToMapName = mappingPatternChannel.getTaskOfChannelToMap();
+            TMLChannel chToMap = null;
+            TMLChannel chInPattern = null;
+            if (mappingPatternChannel.getOrigin() == MappingPatternChannel.ORIGIN_CLONE) {
+                String chToMapNameInModel = channelsClonedIntoModel.get(Map.entry(taskOfChToMapName, chToMapName));
+                chToMap = _tmapModel.getChannelByName(chToMapNameInModel);
+                chInPattern = getKeyByValue(correspChannels, chToMap);
+            } else if (mappingPatternChannel.getOrigin() == MappingPatternChannel.ORIGIN_PATTERN) {
+                chInPattern = _tmapPattern.getChannelByName(chToMapName);
+                chToMap = _tmapModel.getChannelByName(channelsOfPatternIntoModel.get(Map.entry(taskOfChToMapName, chToMapName)));
+            }
+            if (chToMap != null && chInPattern != null) {
+                ArrayList<HwCommunicationNode> hwComsOfChannel = _tmapPattern.getAllCommunicationNodesOfChannel(chInPattern);
+                Boolean chIsMappedToMem = false;
+                Boolean chIsMappedToBuses = false;
+                for (HwCommunicationNode hwComOfChannel : hwComsOfChannel) {
+                    if (hwComOfChannel instanceof HwMemory) {
+                        if (!chIsMappedToMem) {
+                            HashSet<TMLElement> channelsInThisHwCom = _tmapPattern.getLisMappedChannels(hwComOfChannel);
+                            for (TMLElement elemInHwCom : channelsInThisHwCom) {
+                                if (elemInHwCom instanceof TMLChannel) {
+                                    TMLChannel channelInHwCom = (TMLChannel) elemInHwCom;
+                                    if (channelInHwCom != chInPattern && correspChannels.containsKey(channelInHwCom)) {
+                                        TMLChannel channelInModel = correspChannels.get(channelInHwCom);
+                                        ArrayList<HwCommunicationNode> hwsMapChannelInModel = _tmapModel.getAllCommunicationNodesOfChannel(channelInModel);
+                                        if (hwsMapChannelInModel.size() > 0) {
+                                            for (HwCommunicationNode hwMapChannelInModel : hwsMapChannelInModel) {
+                                                if ((!chIsMappedToMem) && (hwMapChannelInModel instanceof HwMemory) && !(_tmapModel.isCommNodeMappedOn(chToMap, hwMapChannelInModel))) {
+                                                    _tmapModel.addCommToHwCommNode(chToMap, hwMapChannelInModel);
+                                                    chIsMappedToMem = true;
+                                                    break;
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    } else {
+                        if (!chIsMappedToBuses) {
+                            HashSet<TMLElement> channelsInThisHwCom = _tmapPattern.getLisMappedChannels(hwComOfChannel);
+                            for (TMLElement elemInHwCom : channelsInThisHwCom) {
+                                if (elemInHwCom instanceof TMLChannel) {
+                                    TMLChannel channelInHwCom = (TMLChannel) elemInHwCom;
+                                    if (channelInHwCom != chInPattern && correspChannels.containsKey(channelInHwCom)) {
+                                        TMLChannel channelInModel = correspChannels.get(channelInHwCom);
+                                        ArrayList<HwCommunicationNode> hwsMapChannelInModel = _tmapModel.getAllCommunicationNodesOfChannel(channelInModel);
+                                        if (hwsMapChannelInModel.size() > 0) {
+                                            for (HwCommunicationNode hwMapChannelInModel : hwsMapChannelInModel) {
+                                                if (!(hwMapChannelInModel instanceof HwMemory) && !(_tmapModel.isCommNodeMappedOn(chToMap, hwMapChannelInModel))) {
+                                                    _tmapModel.addCommToHwCommNode(chToMap, hwMapChannelInModel);
+                                                }
+                                            }
+                                            //break;
+                                        }
+                                    }
+                                }
+                            }
+                        }                        
+                    }    
+                }
+                if (!chIsMappedToMem) {
+                    HwMemory memMapChannel = _tmapPattern.getMemoryOfChannel(chInPattern);
+                    String nameNewMem = memMapChannel.getName();
+                    HwCommunicationNode newMem = _tmapModel.getHwCommunicationNodeByName(nameNewMem);
+                    int ind = 0;
+                    while (newMem != null) {
+                        nameNewMem = memMapChannel.getName() + ind;
+                        newMem = _tmapModel.getHwCommunicationNodeByName(nameNewMem);
+                        ind += 1;
+                    }
+                    HwMemory _newMem = new HwMemory(nameNewMem);
+                    _tmapModel.addCommToHwCommNode(chToMap, _newMem);
+                    _tmapModel.getArch().addHwNode(_newMem);
+                    HwBus bus = null;
+                    TMLTask taskInConn = chToMap.getDestinationTask();
+                    HwExecutionNode hwOfTaskInConn = _tmapModel.getHwNodeOf(taskInConn);
+                    if (hwOfTaskInConn != null) {
+                        for (HwLink link : _tmapModel.getArch().getHwLinks()) {
+                            if (link.hwnode == hwOfTaskInConn) {
+                                bus = link.bus;
+                                break;
+                            }
+                        }
+                    }
+                    if (bus == null) {
+                        taskInConn = chToMap.getOriginTask();
+                        hwOfTaskInConn = _tmapModel.getHwNodeOf(taskInConn);
+                        if (hwOfTaskInConn != null) {
+                            for (HwLink link : _tmapModel.getArch().getHwLinks()) {
+                                if (link.hwnode == hwOfTaskInConn) {
+                                    bus = link.bus;
+                                    break;
+                                }
+                            }
+                        }
+                    }
+                    if (bus == null) {
+                        int nbConnections = 0 ; 
+                        for (HwNode busModel : _tmapModel.getArch().getBUSs()) {
+                            if (busModel instanceof HwBus) {
+                                int curNbConnections = 0 ;
+                                for (HwLink link : _tmapModel.getArch().getHwLinks()) {
+                                    if (link.bus == busModel) {
+                                        nbConnections += 1;
+                                    }
+                                }
+                                if (curNbConnections > nbConnections) {
+                                    bus = (HwBus) busModel;
+                                    nbConnections = curNbConnections;
+                                }
+                            }
+                        }
+                        
+                    }
+                    
+                    HwLink linkNewMemWithBus = new HwLink("link_" + _newMem.getName() + "_to_" + bus.getName());
+                    linkNewMemWithBus.bus = bus;
+                    linkNewMemWithBus.hwnode = _newMem;
+                    _tmapModel.addCommToHwCommNode(chToMap, bus);
+                    _tmapModel.getArch().addHwLink(linkNewMemWithBus);
+                }
+            }
+        }
+
+        return _tmapModel;
+    }
+
+    // Find correspondence between Channels of the pattern model and the channels of cloned tasks of current Model 
+    /*public Map<TMLChannel, TMLChannel> correspondenceForClonedChannels(TMLMapping<?> _tmapModel, TMLMapping<?> _tmapPattern, Set<String> mappedTasks, PatternConfiguration _patternConfiguration) {
+        TMLModeling<?> tmlmModel = _tmapModel.getTMLModeling();
+        TMLModeling<?> tmlmPattern = _tmapPattern.getTMLModeling();
+        List <String> clonedChannelsToMap = new ArrayList<String>();
+        // List <TMLTask> patternTasksToMap = new ArrayList<TMLTask>();
+        for (String taskName : _patternConfiguration.getClonedTasks().keySet()) {
+            TMLTask task = tmlmModel.getTMLTaskByName(taskName);
+            if (task != null && !mappedTasks.contains(taskName)) {
+                clonedChannelsToMap.add(task.getName());
+            }
+        }
+        Map<TMLChannel, TMLChannel> correspChannels = new HashMap<TMLChannel, TMLChannel>();
+        for (String taskPatternName : _patternConfiguration.getPortsConnection().keySet()) {
+            for (String[] pc : _patternConfiguration.getPortsConnection().get(taskPatternName)) {
+                if (clonedChannelsToMap.contains(pc[1])) {
+                    TMLChannel chInPattern = tmlmPattern.getChannelByName(pc[0]);
+                    if (chInPattern != null) {
+                        String nameChInModel = pc[2];
+                        if (renamedChannels.containsKey(nameChInModel)) {
+                            nameChInModel = renamedChannels.get(nameChInModel);
+                        }
+                        correspChannels.put(tmlmModel.getChannelByName(nameChInModel), chInPattern);
+                    }
+                }
+            }
+        }
+        return correspChannels;
+    }*/
+
+    // Find correspondence between channels of the pattern model and the channels of current Model 
+    public Map<TMLChannel, TMLChannel> correspondenceForChannels(TMLMapping<?> _tmapModel, TMLMapping<?> _tmapPattern, PatternConfiguration _patternConfiguration, LinkedHashMap<String, TaskPattern> _patternTasks) {
+        TMLModeling<?> tmlmModel = _tmapModel.getTMLModeling();
+        TMLModeling<?> tmlmPattern = _tmapPattern.getTMLModeling();
+        Map<TMLChannel, TMLChannel> correspChannels = new HashMap<TMLChannel, TMLChannel>();
+        for (Entry<String, String> chTask : channelsOfPatternIntoModel.keySet()) {
+            TMLChannel chInPattern = tmlmPattern.getChannelByName(chTask.getValue());
+            TMLChannel chInModel = tmlmModel.getChannelByName(channelsOfPatternIntoModel.get(chTask));
+            if (chInModel != null && chInPattern != null) {
+                correspChannels.put(chInPattern, chInModel);
+            }
+        }
+        for (PatternConnection patternConnection : _patternConfiguration.getPortsConnection()) {
+            if (!patternConnection.isANewChannelRequired(_patternConfiguration.getPortsConnection(), _patternTasks, _patternConfiguration.getClonedTasks())) {
+                String chNameInModel = patternConnection.getModelChannelName();
+                String taskNameInModel = patternConnection.getModelTaskName();
+                if (channelsClonedIntoModel.containsKey(Map.entry(taskNameInModel, chNameInModel))) {
+                    chNameInModel = channelsClonedIntoModel.get(Map.entry(taskNameInModel, chNameInModel));
+                }
+                
+                TMLChannel chInPattern = tmlmPattern.getChannelByName(patternConnection.getPatternChannel());
+                TMLChannel chInModel = tmlmModel.getChannelByName(chNameInModel);
+                if (chInModel != null && chInPattern != null) {
+                    correspChannels.put(chInPattern, chInModel);
+                }
+            }
+        }
+        return correspChannels;
+    }
+
+    public TMLMapping<?> generateSecurityForChannels(TMLMapping<?> _tmapModel, TMLMapping<?> _tmapPattern, PatternConfiguration _patternConfiguration, LinkedHashMap<String, TaskPattern> _patternTasks, String _appTabName) {
+        boolean hasSecChannel = false;
+        Map<TMLChannel, TMLChannel> correspChannels = correspondenceForChannels(_tmapModel, _tmapPattern, _patternConfiguration, _patternTasks);
+        for (PatternChannelWithSecurity channelWithSec : _patternConfiguration.getChannelsWithSecurity()) {
+            TMLChannel chSec = correspChannels.get(_tmapPattern.getChannelByName(channelWithSec.getChannelName()));
+            if (chSec != null) {
+                if (channelWithSec.isConfidential()) {
+                    chSec.setEnsureConf(true);
+                    chSec.checkConf = true;
+                }
+                if (channelWithSec.getAuthenticity() == PatternChannelWithSecurity.WEAK_AUTHENTICITY) {
+                    chSec.setEnsureWeakAuth(true);
+                    chSec.checkAuth = true;
+                }
+                if (channelWithSec.getAuthenticity() == PatternChannelWithSecurity.STRONG_AUTHENTICITY) {
+                    chSec.setEnsureStrongAuth(true);
+                    chSec.setEnsureWeakAuth(true);
+                    chSec.checkAuth = true;
+                }
+                hasSecChannel = true;
+            }
+        }
+        if (hasSecChannel) {
+            TraceManager.addDev("hasSecChannel");
+            if (_appTabName != "") {
+                _tmapModel = putBackPrefixNames(_tmapModel, _appTabName);
+            
+                SecurityGenerationForTMAP secgen = new SecurityGenerationForTMAP(_appTabName, _tmapModel, "100", "0", "100", new HashMap<String, java.util.List<String>>());
+                _tmapModel = secgen.startThread();
+                _tmapModel = secgen.autoMapKeys();
+                _tmapModel = removePrefixNames(_tmapModel);
+            }
+        }
+        return _tmapModel;
+    }
+
+    public static <T, E> T getKeyByValue(Map<T, E> map, E value) {
+        for (Entry<T, E> entry : map.entrySet()) {
+            if (Objects.equals(value, entry.getValue())) {
+                return entry.getKey();
+            }
+        }
+        return null;
+    }
+
+    public TMLMapping<?> putBackPrefixNames(TMLMapping<?> _tmapModel, String _appTabName) {
+        if (_appTabName != "") {
+            for (TMLTask task : _tmapModel.getTMLModeling().getTasks()) {
+                String[] taskNameSplit = task.getName().split("__");
+                if (taskNameSplit.length == 1) {
+                    task.setName(_appTabName + "__" + task.getName());
+                }
+            }
+            for (TMLChannel ch : _tmapModel.getTMLModeling().getChannels()) {
+                String[] channelNameSplit = ch.getName().split("__");
+                if (channelNameSplit.length == 1) {
+                    ch.setName(_appTabName + "__" + ch.getName());
+                }
+            }
+            for (TMLEvent evt : _tmapModel.getTMLModeling().getEvents()) {
+                String[] eventNameSplit = evt.getName().split("__");
+                if (eventNameSplit.length == 1) {
+                    evt.setName(_appTabName + "__" + evt.getName());
+                }
+            }
+            for (TMLRequest req : _tmapModel.getTMLModeling().getRequests()) {
+                String[] requestNameSplit = req.getName().split("__");
+                if (requestNameSplit.length == 1) {
+                    req.setName(_appTabName + "__" + req.getName());
+                }
+            }
+        }
+        return _tmapModel;
+    }
+
+    public TMLMapping<?> removePrefixNames(TMLMapping<?> _tmapModel) {
+        for (TMLTask task : _tmapModel.getTMLModeling().getTasks()) {
+            String[] taskNameSplit = task.getName().split("__");
+            task.setName(taskNameSplit[taskNameSplit.length-1]);
+        }
+        for (TMLChannel ch : _tmapModel.getTMLModeling().getChannels()) {
+            String[] channelNameSplit = ch.getName().split("__");
+            ch.setName(channelNameSplit[channelNameSplit.length-1]);
+        }
+        for (TMLEvent evt : _tmapModel.getTMLModeling().getEvents()) {
+            String[] eventNameSplit = evt.getName().split("__");
+            evt.setName(eventNameSplit[eventNameSplit.length-1]);
+        }
+        for (TMLRequest req : _tmapModel.getTMLModeling().getRequests()) {
+            String[] requestNameSplit = req.getName().split("__");
+            req.setName(requestNameSplit[requestNameSplit.length-1]);
+        }
+        return _tmapModel;
+    }
+
+    @SuppressWarnings("unchecked")
+    public TMLMapping<?> getTMLMappingOfPattern(String _path, String fileName) {
+        TMLMappingTextSpecification<Class<?>> tmts = new TMLMappingTextSpecification<Class<?>>(fileName);
+        File f = new File(_path + fileName + ".tmap");
+        String spec = null;
+        try {
+            spec = FileUtils.loadFileData(f);
+        } catch (Exception e) {
+            System.out.println("Exception executing: loading " + fileName);
+        }
+        boolean parsed = tmts.makeTMLMapping(spec, _path);
+        TMLMapping<?> _tmapPattern = tmts.getTMLMapping();
+        // Checking syntax
+        TMLSyntaxChecking syntax = new TMLSyntaxChecking(_tmapPattern);
+        syntax.checkSyntax();
+        return _tmapPattern;
+    }
+}
diff --git a/src/main/java/tmltranslator/patternhandling/PatternPortsConfig.java b/src/main/java/tmltranslator/patternhandling/PatternPortsConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..5fbca829d5b92dfe9fcaf996ba165ce643f646bf
--- /dev/null
+++ b/src/main/java/tmltranslator/patternhandling/PatternPortsConfig.java
@@ -0,0 +1,288 @@
+/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
+ *
+ * ludovic.apvrille AT enst.fr
+ *
+ * This software is a computer program whose purpose is to allow the
+ * edition of TURTLE analysis, design and deployment diagrams, to
+ * allow the generation of RT-LOTOS or Java code from this diagram,
+ * and at last to allow the analysis of formal validation traces
+ * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
+ * from INRIA Rhone-Alpes.
+ *
+ * This software is governed by the CeCILL  license under French law and
+ * abiding by the rules of distribution of free software.  You can  use,
+ * modify and/ or redistribute the software under the terms of the CeCILL
+ * license as circulated by CEA, CNRS and INRIA at the following URL
+ * "http://www.cecill.info".
+ *
+ * As a counterpart to the access to the source code and  rights to copy,
+ * modify and redistribute granted by the license, users are provided only
+ * with a limited warranty  and the software's author,  the holder of the
+ * economic rights,  and the successive licensors  have only  limited
+ * liability.
+ *
+ * In this respect, the user's attention is drawn to the risks associated
+ * with loading,  using,  modifying and/or developing or reproducing the
+ * software by the user in light of its specific status of free software,
+ * that may mean  that it is complicated to manipulate,  and  that  also
+ * therefore means  that it is reserved for developers  and  experienced
+ * professionals having in-depth computer knowledge. Users are therefore
+ * encouraged to load and test the software's suitability as regards their
+ * requirements in conditions enabling the security of their systems and/or
+ * data to be ensured and,  more generally, to use and operate it in the
+ * same conditions as regards security.
+ *
+ * The fact that you are presently reading this means that you have had
+ * knowledge of the CeCILL license and that you accept its terms.
+ */
+
+
+package tmltranslator.patternhandling;
+/**
+ * Class PatternPortsConfig
+ * 
+ * Creation: 25/10/2023
+ *
+ * @author Jawher JERRAY
+ * @version 1.0 25/10/2023
+ */
+ 
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+import tmltranslator.*;
+
+ 
+public class PatternPortsConfig {
+    public final static String REMOVE_PORT_OPTION = " Remove";
+    public final static String MERGE_PORT_OPTION = " Merge with ";
+    public final static String TASK_CHANNEL_SEPARATOR = "::";
+
+    private String taskOfChannelToConfig;
+    private String channelToConfig;
+    private Boolean isChannelToRemove;
+    private String mergeWith;
+
+    public PatternPortsConfig(String taskOfChannelToConfig, String channelToConfig) {
+        this.taskOfChannelToConfig = taskOfChannelToConfig;
+        this.channelToConfig = channelToConfig;
+    }
+
+    public String getTaskOfChannelToConfig() {
+        return taskOfChannelToConfig;
+    }
+
+    public String getChannelToConfig() {
+        return channelToConfig;
+    }
+
+    public Boolean isChannelToRemove() {
+        return isChannelToRemove;
+    }
+
+    public String getMergeWith() {
+        return mergeWith;
+    }
+
+
+    public void setTaskOfChannelToConfig(String _taskOfChannelToConfig) {
+        taskOfChannelToConfig = _taskOfChannelToConfig;
+    }
+
+    public void setChannelToConfig(String _channelToConfig) {
+        channelToConfig = _channelToConfig;
+    }
+
+    public void setIsChannelToRemove(Boolean _isChannelToRemove) {
+        isChannelToRemove = _isChannelToRemove;
+        mergeWith = null;
+    }
+
+    public void setMergeWith(String _mergeWith) {
+        mergeWith = _mergeWith;
+        isChannelToRemove = false;
+    }
+    
+    public String getStringDisplay() {
+        if (isChannelToRemove) {
+            return (taskOfChannelToConfig + TASK_CHANNEL_SEPARATOR + channelToConfig + REMOVE_PORT_OPTION);
+        } else {
+            return (taskOfChannelToConfig + TASK_CHANNEL_SEPARATOR + channelToConfig + MERGE_PORT_OPTION + mergeWith);
+        }
+    }
+
+    public String getTaskChannelToConfig() {
+        return (taskOfChannelToConfig + TASK_CHANNEL_SEPARATOR + channelToConfig);
+    }
+
+    public static String[] seperateTaskAndChannel(String st) {
+        String[] split = st.split(TASK_CHANNEL_SEPARATOR);
+        String task, channel;
+        if (split.length == 2) {
+            task = split[0];
+            channel = split[1];
+            return new String[]{task, channel};
+        } else {
+            return null;
+        }
+    }
+
+    public static List<PatternPortsConfig> getPortsToConfig(LinkedHashMap<String, TaskPorts> _portsTaskOfModelAll, LinkedHashMap<String, TaskPorts> _portsTaskOfModelLeft, List<String> clonedTasks, TMLModeling<?> tmlmodel) {
+        List<PatternPortsConfig> portsToConf = new ArrayList<PatternPortsConfig>();
+        for (String task : _portsTaskOfModelLeft.keySet()) {
+            if (!clonedTasks.contains(task)) {
+                TMLTask tmlTask = tmlmodel.getTMLTaskByName(task);
+                TaskPorts  pt = _portsTaskOfModelLeft.get(task);
+                if (tmlTask != null) {
+                    for (String wc : pt.getWriteChannels()) {
+                        for (int i = 0; i < tmlTask.getWriteChannels().size() ; i++) {
+                            if (tmlTask.getWriteChannels().get(i).getChannel(0).getName().equals(wc)) {
+                                for (String taskAll : _portsTaskOfModelAll.keySet()) {
+                                    if (!clonedTasks.contains(taskAll) && _portsTaskOfModelAll.get(taskAll).getReadChannels().contains(wc) && !_portsTaskOfModelLeft.get(taskAll).getReadChannels().contains(wc)) {
+                                        PatternPortsConfig patternPortsConfig = new PatternPortsConfig(task, wc);
+                                        if (!portsToConf.contains(patternPortsConfig)) {
+                                            portsToConf.add(patternPortsConfig);
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+
+                    for (String rc : pt.getReadChannels()) {
+                        for (int i = 0; i < tmlTask.getReadChannels().size() ; i++) {
+                            if (tmlTask.getReadChannels().get(i).getChannel(0).getName().equals(rc)) {
+                                for (String taskAll : _portsTaskOfModelAll.keySet()) {
+                                    if (!clonedTasks.contains(taskAll) && _portsTaskOfModelAll.get(taskAll).getWriteChannels().contains(rc) && !_portsTaskOfModelLeft.get(taskAll).getWriteChannels().contains(rc)) {
+                                        PatternPortsConfig patternPortsConfig = new PatternPortsConfig(task, rc);
+                                        if (!portsToConf.contains(patternPortsConfig)) {
+                                            portsToConf.add(patternPortsConfig);
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+
+                    for (String se : pt.getSendEvents()) {
+                        for (int i = 0; i < tmlTask.getSendEvents().size() ; i++) {
+                            if (tmlTask.getSendEvents().get(i).getEvent().getName().equals(se)) {
+                                for (String taskAll : _portsTaskOfModelAll.keySet()) {
+                                    if (!clonedTasks.contains(taskAll) && _portsTaskOfModelAll.get(taskAll).getWaitEvents().contains(se) && !_portsTaskOfModelLeft.get(taskAll).getWaitEvents().contains(se)) {
+                                        PatternPortsConfig patternPortsConfig = new PatternPortsConfig(task, se);
+                                        if (!portsToConf.contains(patternPortsConfig)) {
+                                            portsToConf.add(patternPortsConfig);
+                                        }
+                                    } 
+                                }
+                            } 
+                        }
+                    }
+                    for (String we : pt.getWaitEvents()) {
+                        for (int i = 0; i < tmlTask.getWaitEvents().size() ; i++) {
+                            if (tmlTask.getWaitEvents().get(i).getEvent().getName().equals(we)) {
+                                for (String taskAll : _portsTaskOfModelAll.keySet()) {
+                                    if (!clonedTasks.contains(taskAll) && _portsTaskOfModelAll.get(taskAll).getSendEvents().contains(we) && !_portsTaskOfModelLeft.get(taskAll).getSendEvents().contains(we)) {
+                                        PatternPortsConfig patternPortsConfig = new PatternPortsConfig(task, we);
+                                        if (!portsToConf.contains(patternPortsConfig)) {
+                                            portsToConf.add(patternPortsConfig);
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+
+                }
+            }
+        }
+
+        return portsToConf;
+    }
+
+    public static List<PatternPortsConfig> getPortsLeftToConfig(LinkedHashMap<String, TaskPorts> _portsTaskOfModelAll, LinkedHashMap<String, TaskPorts> _portsTaskOfModelLeft, List<String> _clonedTasks, List<PatternPortsConfig> _configuredPorts, TMLModeling<?> tmlmodel) {
+        List<PatternPortsConfig> portsLeftToConf = new ArrayList<PatternPortsConfig>();
+        List<PatternPortsConfig> portsToConfig = PatternPortsConfig.getPortsToConfig(_portsTaskOfModelAll, _portsTaskOfModelLeft, _clonedTasks, tmlmodel);
+        for (PatternPortsConfig portToConfig : portsToConfig) {
+            boolean isToConfig = true;
+            for (PatternPortsConfig portConfigured : _configuredPorts) {
+                if (portToConfig.getTaskOfChannelToConfig().equals(portConfigured.getTaskOfChannelToConfig()) && portToConfig.getChannelToConfig().equals(portConfigured.getChannelToConfig())) {
+                    isToConfig = false;
+                    break;
+                }
+            }
+            if (isToConfig) {
+                portsLeftToConf.add(portToConfig);
+            }
+        }
+        return portsLeftToConf;
+    }
+
+    public static List<String> getPortsCanBeMergedWith(LinkedHashMap<String, TaskPorts> _portsTaskOfModelAll, List<PatternPortsConfig> _allPortsToConfig, String _taskOfPortToConfig) {
+        List<String> portsCanBeMergedWith = new ArrayList<String>();
+        if (_portsTaskOfModelAll.containsKey(_taskOfPortToConfig)) {
+            for (String wr : _portsTaskOfModelAll.get(_taskOfPortToConfig).getWriteChannels()) {
+                boolean canBeMergedWith = true;
+                for (PatternPortsConfig portToConfig : _allPortsToConfig) {
+                    if (portToConfig.getTaskOfChannelToConfig().equals(_taskOfPortToConfig) && portToConfig.getChannelToConfig().equals(wr)) {
+                        canBeMergedWith = false;
+                        break;
+                    }
+                }
+                if (canBeMergedWith) {
+                    portsCanBeMergedWith.add(wr);
+                }
+            }
+            for (String wr : _portsTaskOfModelAll.get(_taskOfPortToConfig).getWriteChannels()) {
+                boolean canBeMergedWith = true;
+                for (PatternPortsConfig portToConfig : _allPortsToConfig) {
+                    if (portToConfig.getTaskOfChannelToConfig().equals(_taskOfPortToConfig) && portToConfig.getChannelToConfig().equals(wr)) {
+                        canBeMergedWith = false;
+                        break;
+                    }
+                }
+                if (canBeMergedWith) {
+                    portsCanBeMergedWith.add(wr);
+                }
+            }
+            for (String rd : _portsTaskOfModelAll.get(_taskOfPortToConfig).getReadChannels()) {
+                boolean canBeMergedWith = true;
+                for (PatternPortsConfig portToConfig : _allPortsToConfig) {
+                    if (portToConfig.getTaskOfChannelToConfig().equals(_taskOfPortToConfig) && portToConfig.getChannelToConfig().equals(rd)) {
+                        canBeMergedWith = false;
+                        break;
+                    }
+                }
+                if (canBeMergedWith) {
+                    portsCanBeMergedWith.add(rd);
+                }
+            }
+            for (String sd : _portsTaskOfModelAll.get(_taskOfPortToConfig).getSendEvents()) {
+                boolean canBeMergedWith = true;
+                for (PatternPortsConfig portToConfig : _allPortsToConfig) {
+                    if (portToConfig.getTaskOfChannelToConfig().equals(_taskOfPortToConfig) && portToConfig.getChannelToConfig().equals(sd)) {
+                        canBeMergedWith = false;
+                        break;
+                    }
+                }
+                if (canBeMergedWith) {
+                    portsCanBeMergedWith.add(sd);
+                }
+            }
+            for (String we : _portsTaskOfModelAll.get(_taskOfPortToConfig).getWaitEvents()) {
+                boolean canBeMergedWith = true;
+                for (PatternPortsConfig portToConfig : _allPortsToConfig) {
+                    if (portToConfig.getTaskOfChannelToConfig().equals(_taskOfPortToConfig) && portToConfig.getChannelToConfig().equals(we)) {
+                        canBeMergedWith = false;
+                        break;
+                    }
+                }
+                if (canBeMergedWith) {
+                    portsCanBeMergedWith.add(we);
+                }
+            }
+        }
+        return portsCanBeMergedWith;
+    }
+}
diff --git a/src/main/java/tmltranslator/patternhandling/PortTaskJsonFile.java b/src/main/java/tmltranslator/patternhandling/PortTaskJsonFile.java
new file mode 100644
index 0000000000000000000000000000000000000000..3fa86c34bb28fd124253deb7f2d7dc38f24c7678
--- /dev/null
+++ b/src/main/java/tmltranslator/patternhandling/PortTaskJsonFile.java
@@ -0,0 +1,93 @@
+/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
+ *
+ * ludovic.apvrille AT enst.fr
+ *
+ * This software is a computer program whose purpose is to allow the
+ * edition of TURTLE analysis, design and deployment diagrams, to
+ * allow the generation of RT-LOTOS or Java code from this diagram,
+ * and at last to allow the analysis of formal validation traces
+ * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
+ * from INRIA Rhone-Alpes.
+ *
+ * This software is governed by the CeCILL  license under French law and
+ * abiding by the rules of distribution of free software.  You can  use,
+ * modify and/ or redistribute the software under the terms of the CeCILL
+ * license as circulated by CEA, CNRS and INRIA at the following URL
+ * "http://www.cecill.info".
+ *
+ * As a counterpart to the access to the source code and  rights to copy,
+ * modify and redistribute granted by the license, users are provided only
+ * with a limited warranty  and the software's author,  the holder of the
+ * economic rights,  and the successive licensors  have only  limited
+ * liability.
+ *
+ * In this respect, the user's attention is drawn to the risks associated
+ * with loading,  using,  modifying and/or developing or reproducing the
+ * software by the user in light of its specific status of free software,
+ * that may mean  that it is complicated to manipulate,  and  that  also
+ * therefore means  that it is reserved for developers  and  experienced
+ * professionals having in-depth computer knowledge. Users are therefore
+ * encouraged to load and test the software's suitability as regards their
+ * requirements in conditions enabling the security of their systems and/or
+ * data to be ensured and,  more generally, to use and operate it in the
+ * same conditions as regards security.
+ *
+ * The fact that you are presently reading this means that you have had
+ * knowledge of the CeCILL license and that you accept its terms.
+ */
+
+
+package tmltranslator.patternhandling;
+/**
+ * Class PortTaskJsonFile
+ * 
+ * Creation: 28/08/2023
+ *
+ * @author Jawher JERRAY
+ * @version 1.0 28/08/2023
+ */
+ 
+import tmltranslator.*;
+
+ 
+public class PortTaskJsonFile {
+    private String name;
+    private String type;
+    private String mode;
+    private String confidentiality;
+    private String authenticity;
+
+    public PortTaskJsonFile(String name, String type, String mode) {
+        this.name = name;
+        this.type = type;
+        this.mode = mode;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public String getMode() {
+        return mode;
+    }
+
+    public String getConfidentiality() {
+        return confidentiality;
+    }
+    
+    public String getAuthenticity() {
+        return authenticity;
+    }
+    public void setConfidentiality(String _confidentiality) {
+        confidentiality = _confidentiality;
+    }
+    
+    public void setAuthenticity(String _authenticity) {
+        authenticity = _authenticity;
+    }
+    
+}
diff --git a/src/main/java/tmltranslator/patternhandling/SecurityGenerationForTMAP.java b/src/main/java/tmltranslator/patternhandling/SecurityGenerationForTMAP.java
new file mode 100644
index 0000000000000000000000000000000000000000..05da50072671cc83fade4553583f820982d405c7
--- /dev/null
+++ b/src/main/java/tmltranslator/patternhandling/SecurityGenerationForTMAP.java
@@ -0,0 +1,2303 @@
+/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
+ *
+ * ludovic.apvrille AT enst.fr
+ *
+ * This software is a computer program whose purpose is to allow the
+ * edition of TURTLE analysis, design and deployment diagrams, to
+ * allow the generation of RT-LOTOS or Java code from this diagram,
+ * and at last to allow the analysis of formal validation traces
+ * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
+ * from INRIA Rhone-Alpes.
+ *
+ * This software is governed by the CeCILL  license under French law and
+ * abiding by the rules of distribution of free software.  You can  use,
+ * modify and/ or redistribute the software under the terms of the CeCILL
+ * license as circulated by CEA, CNRS and INRIA at the following URL
+ * "http://www.cecill.info".
+ *
+ * As a counterpart to the access to the source code and  rights to copy,
+ * modify and redistribute granted by the license, users are provided only
+ * with a limited warranty  and the software's author,  the holder of the
+ * economic rights,  and the successive licensors  have only  limited
+ * liability.
+ *
+ * In this respect, the user's attention is drawn to the risks associated
+ * with loading,  using,  modifying and/or developing or reproducing the
+ * software by the user in light of its specific status of free software,
+ * that may mean  that it is complicated to manipulate,  and  that  also
+ * therefore means  that it is reserved for developers  and  experienced
+ * professionals having in-depth computer knowledge. Users are therefore
+ * encouraged to load and test the software's suitability as regards their
+ * requirements in conditions enabling the security of their systems and/or
+ * data to be ensured and,  more generally, to use and operate it in the
+ * same conditions as regards security.
+ *
+ * The fact that you are presently reading this means that you have had
+ * knowledge of the CeCILL license and that you accept its terms.
+ */
+
+
+package tmltranslator.patternhandling;
+/**
+ * Class SecurityGenerationForTMAP
+ * 
+ * Creation: 28/09/2023
+ *
+ * @author Jawher JERRAY
+ * @version 1.0 28/09/2023
+ */
+ 
+import avatartranslator.AvatarPragmaAuthenticity;
+import avatartranslator.AvatarPragmaSecret;
+import avatartranslator.AvatarSpecification;
+import avatartranslator.toproverif.AVATAR2ProVerif;
+import common.ConfigurationTTool;
+import launcher.RshClient;
+import myutil.TraceManager;
+import proverifspec.ProVerifOutputAnalyzer;
+import proverifspec.ProVerifQueryAuthResult;
+import proverifspec.ProVerifQueryResult;
+import proverifspec.ProVerifSpec;
+import tmltranslator.*;
+import tmltranslator.toavatarsec.TML2Avatar;
+import ui.TGComponent;
+
+import java.io.Reader;
+import java.util.*;
+
+
+public class SecurityGenerationForTMAP implements Runnable {
+    private String appName;
+    private TMLMapping<?> tmap;
+    private String encComp;
+    private String overhead;
+    private String decComp;
+    private Map<String, List<String>> selectedCPUTasks;
+    private int channelIndex = 0;
+
+    private AVATAR2ProVerif avatar2proverif;
+
+    private Map<String, Integer> channelIndexMap = new HashMap<String, Integer>();
+
+    private Map<String, List<HSMChannel>> hsmChannelMap = new HashMap<String, List<HSMChannel>>();
+
+    private Map<String, String> taskHSMMap = new HashMap<String, String>();
+    private List<String> hsmTasks = new ArrayList<String>();
+
+    private Map<String, SecurityPattern> channelSecMap = new HashMap<String, SecurityPattern>();
+    private TMLMapping<?> newMap;
+
+    public SecurityGenerationForTMAP(String appName, TMLMapping<?> tmap, String encComp, String overhead, String decComp, Map<String, List<String>> selectedCPUTasks) {
+        this.appName = appName;
+        this.tmap = tmap;
+        this.newMap = tmap;
+        this.overhead = overhead;
+        this.decComp = decComp;
+        this.encComp = encComp;
+        this.selectedCPUTasks = selectedCPUTasks;
+    }
+    
+    public void proverifAnalysis(TMLMapping<?> tmap, List<String> nonAuthChans, List<String> nonConfChans, boolean checkAuthProverif) {
+        if (tmap == null) {
+            TraceManager.addDev("No mapping");
+            return;
+        }
+
+        //Perform ProVerif Analysis
+
+        Object o = null;
+        if (tmap.getTMLModeling().getReference() instanceof TGComponent) {
+            o = ((TGComponent)(tmap.getTMLModeling().getReference())).getTDiagramPanel().tp;
+        }
+
+        TML2Avatar t2a = new TML2Avatar(newMap, false, true, o);
+        AvatarSpecification avatarspec = t2a.generateAvatarSpec("1", checkAuthProverif);
+        if (avatarspec == null) {
+            TraceManager.addDev("No avatar spec");
+            return;
+        }
+
+        avatar2proverif = new AVATAR2ProVerif(avatarspec);
+        try {
+            ProVerifSpec proverif = avatar2proverif.generateProVerif(true, true, 3, true, true);
+            //warnings = avatar2proverif.getWarnings();
+
+            if (!avatar2proverif.saveInFile("pvspec")) {
+                return;
+            }
+
+            RshClient rshc = new RshClient(ConfigurationTTool.ProVerifVerifierHost);
+
+            rshc.setCmd(ConfigurationTTool.ProVerifVerifierPath + " -in pitype pvspec");
+            rshc.sendExecuteCommandRequest();
+            Reader data = rshc.getDataReaderFromProcess();
+
+
+            ProVerifOutputAnalyzer pvoa = avatar2proverif.getOutputAnalyzer();
+            pvoa.analyzeOutput(data, true);
+
+            if (pvoa.getResults().size() == 0) {
+                TraceManager.addDev("SECGEN ERROR: No security results");
+            }
+
+
+            Map<AvatarPragmaSecret, ProVerifQueryResult> confResults = pvoa.getConfidentialityResults();
+
+            for (AvatarPragmaSecret pragma : confResults.keySet()) {
+                TraceManager.addDev("SECGEN: Pragma " + pragma);
+                if (confResults.get(pragma).isProved() && !confResults.get(pragma).isSatisfied()) {
+                    nonConfChans.add(pragma.getArg().getBlock().getName() + "__" + pragma.getArg().getName());
+                    TraceManager.addDev("SECGEN:" + pragma.getArg().getBlock().getName() + "." + pragma.getArg().getName() + " is not secret");
+
+                    TMLChannel chan = tmap.getTMLModeling().getChannelByShortName(pragma.getArg().getName().replaceAll("_chData", ""));
+
+                    if (chan == null) {
+                        chan = tmap.getTMLModeling().getChannelByOriginPortName(pragma.getArg().getName().replaceAll("_chData", ""));
+                    }
+
+                    if (chan == null) {
+                        TraceManager.addDev("SECGEN: NULL Channel");
+                        continue;
+                    }
+
+                    if (chan.isBasicChannel()) {
+                        TraceManager.addDev("SECGEN: Channel added to nonConfCh");
+                        nonConfChans.add(chan.getOriginTask().getName() + "__" + pragma.getArg().getName());
+
+                    } else {
+                        for (TMLTask originTask : chan.getOriginTasks()) {
+                            nonConfChans.add(originTask.getName() + "__" + pragma.getArg().getName());
+                        }
+                    }
+                }
+            }
+
+            Map<AvatarPragmaAuthenticity, ProVerifQueryAuthResult> authResults = pvoa.getAuthenticityResults();
+            for (AvatarPragmaAuthenticity pragma : authResults.keySet()) {
+                if (authResults.get(pragma).isProved() && !authResults.get(pragma).isSatisfied()) {
+                    nonAuthChans.add(pragma.getAttrA().getAttribute().getBlock().getName() + "__" + pragma.getAttrA().getAttribute().getName().replaceAll("_chData", ""));
+                    nonAuthChans.add(pragma.getAttrB().getAttribute().getBlock().getName() + "__" + pragma.getAttrB().getAttribute().getName().replaceAll("_chData", ""));
+                }
+            }
+
+        } catch (Exception e) {
+            System.out.println("SECGEN EXCEPTION " + e);
+
+        }
+    }
+
+    public TMLMapping<?> startThread() {
+        Thread t = new Thread(this);
+        t.start();
+        try {
+            t.join();
+        } catch (Exception e) {
+            TraceManager.addDev("SECGEN. Error in Security Generation Thread");
+            System.out.println("SECGEN. Error in Security Generation Thread");
+        }
+        return tmap;
+    }
+
+    public boolean portInTask(TMLTask task, String portName) {
+        TMLActivity adTask = task.getActivityDiagram();
+        for (TMLActivityElement elem : adTask.getElements()) {
+            if (elem instanceof TMLWriteChannel) {
+                TMLWriteChannel writeChannel = (TMLWriteChannel) elem;
+                for (int i = 0; i < writeChannel.getNbOfChannels(); i++) {
+                    if (writeChannel.getChannel(i).getName().replaceAll(appName + "__", "").equals(portName)) {
+                        return true;
+                    }
+                }
+            } else if (elem instanceof TMLReadChannel) {
+                TMLReadChannel readChannel = (TMLReadChannel) elem;
+                for (int i = 0; i < readChannel.getNbOfChannels(); i++) {
+                    if (readChannel.getChannel(i).getName().replaceAll(appName + "__", "").equals(portName)) {
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
+    public void run() {
+        String title = appName;
+        // oldmodel = tmap.getTMLModeling();
+        Map<TMLTask, HashSet<TMLTask>> toSecure = new HashMap<TMLTask, HashSet<TMLTask>>();
+        Map<TMLTask, HashSet<TMLTask>> toSecureRev = new HashMap<TMLTask, HashSet<TMLTask>>();
+        Map<TMLTask, HashSet<String>> secOutChannels = new HashMap<TMLTask, HashSet<String>>();
+        Map<TMLTask, HashSet<String>> secInChannels = new HashMap<TMLTask, HashSet<String>>();
+        Map<TMLTask, HashSet<String>> nonceOutChannels = new HashMap<TMLTask, HashSet<String>>();
+        Map<TMLTask, HashSet<String>> nonceInChannels = new HashMap<TMLTask, HashSet<String>>();
+        Map<TMLTask, HashSet<String>> macOutChannels = new HashMap<TMLTask, HashSet<String>>();
+        Map<TMLTask, HashSet<String>> macInChannels = new HashMap<TMLTask, HashSet<String>>();
+
+        Map<TMLTask, HashSet<String>> hsmSecInChannels = new HashMap<TMLTask, HashSet<String>>();
+        Map<TMLTask, HashSet<String>> hsmSecOutChannels = new HashMap<TMLTask, HashSet<String>>();
+
+        //TraceManager.addDev("mapping " + tmap.getSummaryTaskMapping());
+
+        //   Map<String, HSMChannel> secChannels = new HashMap<String, HSMChannel>();
+        //Map<String, HSMChannel> hsmChannels = new HashMap<String, HSMChannel>();
+
+
+        for (String cpuName : selectedCPUTasks.keySet()) {
+            for (String task : selectedCPUTasks.get(cpuName)) {
+                hsmTasks.add(task);
+                taskHSMMap.put(task, cpuName);
+            }
+            hsmChannelMap.put(cpuName, new ArrayList<HSMChannel>());
+
+        }
+
+        TMLModeling<?> tmlmodel = tmap.getTMLModeling();
+        //Proverif Analysis channels
+        List<String> nonAuthChans = new ArrayList<String>();
+        List<String> nonConfChans = new ArrayList<String>();
+        boolean checkAuthProverif = false;
+        for (TMLChannel ch : tmlmodel.getChannels()) {
+            if (ch.isEnsureWeakAuth() || ch.isEnsureStrongAuth()) {
+                checkAuthProverif = true;
+                break;
+            }
+        }
+        proverifAnalysis(tmap, nonAuthChans, nonConfChans, checkAuthProverif);
+
+        
+        List<TMLChannel> channels = tmlmodel.getChannels();
+        for (TMLChannel channel : channels) {
+            for (TMLPortWithSecurityInformation p : channel.ports) {
+                channel.checkConf = channel.checkConf || p.getCheckConf();
+                channel.checkAuth = channel.checkAuth || p.getCheckAuth();
+            }
+        }
+
+        //System.out.println("Nonauth " + nonAuthChans);
+        //System.out.println("NonConf " + nonConfChans);
+
+        //Create clone of Component Diagram + Activity diagrams to secure
+        //        TMLComponentDesignPanel tmlcdp = tmap.getTMLCDesignPanel();
+
+        //TMLComponentTaskDiagramPanel tcdp = tmlcdp.tmlctdp;
+        //Create clone of architecture panel and tmap tasks to it
+        //newarch.renameMapping(tabName, tabName + "_" + name);
+
+        for (TMLTask task : tmap.getTMLModeling().getTasks()) {
+            HashSet<String> tmp = new HashSet<String>();
+            HashSet<String> tmp2 = new HashSet<String>();
+            HashSet<TMLTask> tmp3 = new HashSet<TMLTask>();
+            HashSet<TMLTask> tmp4 = new HashSet<TMLTask>();
+            HashSet<String> tmp5 = new HashSet<String>();
+            HashSet<String> tmp6 = new HashSet<String>();
+            HashSet<String> tmp7 = new HashSet<String>();
+            HashSet<String> tmp8 = new HashSet<String>();
+            HashSet<String> tmp9 = new HashSet<String>();
+            HashSet<String> tmp10 = new HashSet<String>();
+
+
+            secInChannels.put(task, tmp);
+            secOutChannels.put(task, tmp2);
+            toSecure.put(task, tmp3);
+            toSecureRev.put(task, tmp4);
+            nonceInChannels.put(task, tmp5);
+            nonceOutChannels.put(task, tmp6);
+            macInChannels.put(task, tmp7);
+            macOutChannels.put(task, tmp8);
+
+            hsmSecInChannels.put(task, tmp9);
+            hsmSecOutChannels.put(task, tmp10);
+
+        }
+        //ToSecure keeps a tmap of origin task: {dest task} for which security operators need to be added
+        //ToSecureRev keeps a tmap of dest task: {origin task} for which security operators need to be added
+
+        //SecOutChannels are channels which need symmetric encryption operators added
+        //SecInChannels are channels which need sym decryption operators added
+        //nonceInChannels are channels which need to send a nonce before receiving the channel data
+        //nonceOutChannels are channels which need to receive a nonce before sending the channel data
+        //macInChannels are channels which need verifymac operators added
+        //macOutChannels are channels which need mac operators added
+
+        //hsmSecInChannels need to send data to the hsm to decrypt after receiving channel data
+        //hsmSecOutChannels need to send data to the hsm to encrypt before sending channel data
+
+        //With the proverif results, check which channels need to be secured
+        for (TMLTask task : tmap.getTMLModeling().getTasks()) {
+            //Check if all channel operators are secured
+            TMLActivity taskAD = task.getActivityDiagram(); //FIXME getActivityDiagramName( task ) )
+            if (taskAD == null) {
+                TraceManager.addDev("SECGEN. Null Activity Diagram for " + task.getName());
+                continue;
+            }
+
+            for (TMLChannel chan : tmlmodel.getChannels(task)) {
+                //Origin and Destination ports can have different names. Therefore, we need to put both names in the list of channels to secure.
+                List<String> portNames = new ArrayList<String>();
+                boolean nonConf = false;
+                boolean nonAuth = false;
+
+                if (chan.isBasicChannel()) {
+                    portNames.add(chan.getOriginPort().getName());
+                    portNames.add(chan.getDestinationPort().getName());
+                    if (nonConfChans.contains(chan.getOriginTask().getName().split("__")[1] + "__" + chan.getOriginPort().getName() + "_chData")) {
+                        nonConf = true;
+                        TraceManager.addDev("SECGEN. non conf basic ch = true");
+                    }
+
+                    if (nonAuthChans.contains(chan.getDestinationTask().getName().split("__")[1] + "__" + title + "__" + chan.getDestinationPort().getName())) {
+                        nonAuth = true;
+                    }
+
+                    //When port names are different
+                    if (nonAuthChans.contains(chan.getDestinationTask().getName().split("__")[1] + "__" + chan.getDestinationPort().getName())) {
+                        nonAuth = true;
+                    }
+                } else {
+                    for (TMLPort port : chan.getOriginPorts()) {
+                        for (TMLTask origTask : chan.getOriginTasks()) {
+                            if (nonConfChans.contains(origTask.getName().split("__")[1] + "__" + port.getName() + "_chData")) {
+                                nonConf = true;
+                                TraceManager.addDev("SECGEN. non conf port ch = true");
+                            }
+                        }
+                        portNames.add(port.getName());
+                    }
+
+
+                    for (TMLTask destTask : chan.getDestinationTasks()) {
+                        for (TMLPort port : chan.getDestinationPorts()) {
+                            if (nonAuthChans.contains(destTask.getName().split("__")[1] + "__" + title + "__" + port.getName())) {
+                                nonAuth = true;
+                            }
+                            if (!portNames.contains(port.getName())) {
+                                portNames.add(port.getName());
+                            }
+                        }
+                        //System.out.println(destTask.getName().split("__")[1] + "__" + chan.getName());
+                        if (nonAuthChans.contains(destTask.getName().split("__")[1] + "__" + chan.getDestinationPort().getName())) {
+                            nonAuth = true;
+                        }
+
+                    }
+                    //When port names are different
+
+                }
+
+                String secName = chan.getName().split("__")[chan.getName().split("__").length - 1];
+
+                for (String chanName : portNames) {
+                    //Classify channels based on the type of security requirements and unsatisfied properties
+                    if (chan.isBasicChannel()) {
+                        if (chan.isEnsureConf() && nonConf) {
+                            toSecure.get(chan.getOriginTask()).add(chan.getDestinationTask());
+                            if (chan.isEnsureStrongAuth()) {
+                                if (!toSecureRev.get(chan.getDestinationTask()).contains(chan.getOriginTask())) {
+                                    toSecureRev.get(chan.getDestinationTask()).add(chan.getOriginTask());
+                                }
+                            }
+                            if (hsmTasks.contains(chan.getOriginTask().getName().split("__")[1])) {
+                                SecurityPattern secPattern = new SecurityPattern("hsmSec_" + secName, SecurityPattern.SYMMETRIC_ENC_PATTERN, overhead, "", encComp, decComp, "", "", "");
+                                secPattern.originTask = "HSM_" + taskHSMMap.get(chan.getOriginTask().getName().replaceAll(title + "__", ""));
+                                channelSecMap.put(chanName, secPattern);
+                                if (!hsmSecOutChannels.get(chan.getOriginTask()).contains(chanName) && portInTask(chan.getOriginTask(), chanName)) {
+                                    HSMChannel hsmchan = new HSMChannel(chanName, chan.getOriginTask().getName().split("__")[1], HSMChannel.SENC);
+                                    hsmChannelMap.get(taskHSMMap.get(chan.getOriginTask().getName().split("__")[1])).add(hsmchan);
+                                    hsmSecOutChannels.get(chan.getOriginTask()).add(chanName);
+
+                                    if (chan.isEnsureStrongAuth()) {
+                                        nonceOutChannels.get(chan.getOriginTask()).add(chanName);
+                                        hsmchan.nonceName = "nonce_" + chan.getDestinationTask().getName().split("__")[1] + "_" + chan.getOriginTask().getName().split("__")[1];
+                                    }
+                                }
+                            } else {
+                                if (!secOutChannels.get(chan.getOriginTask()).contains(chanName)) {
+                                    secOutChannels.get(chan.getOriginTask()).add(chanName);
+                                    SecurityPattern secPattern = new SecurityPattern("autoEncrypt_" + secName, SecurityPattern.SYMMETRIC_ENC_PATTERN, overhead, "", encComp, decComp, "", "", "");
+                                    secPattern.originTask = chan.getOriginTask().getName().replaceAll(title + "__", "");
+                                    channelSecMap.put(chanName, secPattern);
+                                    if (chan.isEnsureStrongAuth()) {
+                                        nonceOutChannels.get(chan.getOriginTask()).add(chanName);
+                                    }
+                                }
+                            }
+
+                            if (hsmTasks.contains(chan.getDestinationTask().getName().split("__")[1])) {
+                                if (!hsmSecInChannels.get(chan.getDestinationTask()).contains(chanName) && portInTask(chan.getDestinationTask(), chanName)) {
+                                    HSMChannel hsmchan = new HSMChannel(chanName, chan.getDestinationTask().getName().split("__")[1], HSMChannel.DEC);
+                                    hsmChannelMap.get(taskHSMMap.get(chan.getDestinationTask().getName().split("__")[1])).add(hsmchan);
+                                    hsmSecInChannels.get(chan.getDestinationTask()).add(chanName);
+                                    if (chan.isEnsureStrongAuth()) {
+                                        nonceInChannels.get(chan.getDestinationTask()).add(chanName);
+                                        hsmchan.nonceName = "nonce_" + chan.getDestinationTask().getName().split("__")[1] + "_" + chan.getOriginTask().getName().split("__")[1];
+                                    }
+                                }
+                            } else {
+                                if (!secInChannels.get(chan.getDestinationTask()).contains(chanName)) {
+                                    secInChannels.get(chan.getDestinationTask()).add(chanName);
+                                    if (chan.isEnsureStrongAuth()) {
+                                        nonceInChannels.get(chan.getDestinationTask()).add(chanName);
+                                    }
+                                }
+                            }
+
+                        } else if (chan.isEnsureWeakAuth() && nonAuth) {
+                            toSecure.get(chan.getOriginTask()).add(chan.getDestinationTask());
+                            if (chan.isEnsureStrongAuth()) {
+                                if (!toSecureRev.get(chan.getDestinationTask()).contains(chan.getOriginTask())) {
+                                    toSecureRev.get(chan.getDestinationTask()).add(chan.getOriginTask());
+                                }
+								/*}
+								  else {
+								  TMLChannel chantmp = oldmodel.getChannelByShortName("__"+chan.getName());
+								  System.out.println("Channel found "+ chantmp);
+								  }*/
+
+                            }
+                            if (hsmTasks.contains(chan.getOriginTask().getName().split("__")[1])) {
+                                SecurityPattern secPattern = new SecurityPattern("hsmSec_" + secName, SecurityPattern.SYMMETRIC_ENC_PATTERN, overhead, "", encComp, decComp, "", "", "");
+                                secPattern.originTask = "HSM_" + taskHSMMap.get(chan.getOriginTask().getName().replaceAll(title + "__", ""));
+                                channelSecMap.put(chanName, secPattern);
+                                if (!hsmSecOutChannels.get(chan.getOriginTask()).contains(chanName) && portInTask(chan.getOriginTask(), chanName)) {
+                                    HSMChannel hsmchan = new HSMChannel(chanName, chan.getOriginTask().getName().split("__")[1], HSMChannel.MAC);
+                                    hsmChannelMap.get(taskHSMMap.get(chan.getOriginTask().getName().split("__")[1])).add(hsmchan);
+                                    hsmSecOutChannels.get(chan.getOriginTask()).add(chanName);
+
+                                    if (chan.isEnsureStrongAuth()) {
+                                        nonceOutChannels.get(chan.getOriginTask()).add(chanName);
+                                        hsmchan.nonceName = "nonce_" + chan.getDestinationTask().getName().split("__")[1] + "_" + chan.getOriginTask().getName().split("__")[1];
+                                    }
+                                }
+                            } else {
+                                if (!macInChannels.get(chan.getOriginTask()).contains(chanName)) {
+                                    macOutChannels.get(chan.getOriginTask()).add(chanName);
+                                    SecurityPattern secPattern = new SecurityPattern("autoEncrypt_" + secName, SecurityPattern.SYMMETRIC_ENC_PATTERN, overhead, "", encComp, decComp, "", "", "");
+                                    secPattern.originTask = chan.getOriginTask().getName().replaceAll(title + "__", "");
+                                    channelSecMap.put(chanName, secPattern);
+                                    if (chan.isEnsureStrongAuth()) {
+                                        nonceOutChannels.get(chan.getOriginTask()).add(chanName);
+                                    }
+                                }
+                            }
+
+                            if (hsmTasks.contains(chan.getDestinationTask().getName().split("__")[1])) {
+                                if (!hsmSecInChannels.get(chan.getDestinationTask()).contains(chanName) && portInTask(chan.getDestinationTask(), chanName)) {
+                                    HSMChannel hsmchan = new HSMChannel(chanName, chan.getDestinationTask().getName().split("__")[1], HSMChannel.DEC);
+                                    hsmChannelMap.get(taskHSMMap.get(chan.getDestinationTask().getName().split("__")[1])).add(hsmchan);
+                                    hsmSecInChannels.get(chan.getDestinationTask()).add(chanName);
+                                    if (chan.isEnsureStrongAuth()) {
+                                        nonceInChannels.get(chan.getDestinationTask()).add(chanName);
+                                        hsmchan.nonceName = "nonce_" + chan.getDestinationTask().getName().split("__")[1] + "_" + chan.getOriginTask().getName().split("__")[1];
+                                    }
+                                }
+                            } else {
+                                if (!secInChannels.get(chan.getDestinationTask()).contains(chanName)) {
+                                    secInChannels.get(chan.getDestinationTask()).add(chanName);
+                                    if (chan.isEnsureStrongAuth()) {
+                                        nonceInChannels.get(chan.getDestinationTask()).add(chanName);
+                                    }
+                                }
+                            }
+                        }
+                    } else {
+                        //Ignore strong authenticity for fork and join channels
+                        //Only add hsm channel for own port
+                        for (TMLTask orig : chan.getOriginTasks()) {
+                            for (TMLTask dest : chan.getDestinationTasks()) {
+                                if (chan.isEnsureConf() && nonConf) {
+                                    toSecure.get(orig).add(dest);
+								/*if (chan.checkAuth && autoStrongAuth) {
+								  if (!toSecureRev.get(dest).contains(orig)) {
+								  toSecureRev.get(dest).add(orig);
+								  }
+								  }*/
+                                    if (hsmTasks.contains(orig.getName().split("__")[1])) {
+                                        SecurityPattern secPattern = new SecurityPattern("hsmSec_" + secName, SecurityPattern.SYMMETRIC_ENC_PATTERN, overhead, "", encComp, decComp, "", "", "");
+                                        secPattern.originTask = "HSM_" + taskHSMMap.get(orig.getName().replaceAll(title + "__", ""));
+                                        channelSecMap.put(chanName, secPattern);
+                                        if (!hsmSecOutChannels.get(orig).contains(chanName) && portInTask(orig, chanName)) {
+                                            HSMChannel hsmchan = new HSMChannel(chanName, orig.getName().split("__")[1], HSMChannel.SENC);
+                                            hsmChannelMap.get(taskHSMMap.get(orig.getName().split("__")[1])).add(hsmchan);
+                                            hsmSecOutChannels.get(orig).add(chanName);
+
+										/*	if (chan.checkAuth && autoStrongAuth) {
+											nonceOutChannels.get(orig).add(chanName);
+											hsmchan.nonceName="nonce_" + dest.getName().split("__")[1] + "_" + orig.getName().split("__")[1];
+											}*/
+                                        }
+                                    } else {
+                                        if (!secOutChannels.get(orig).contains(chanName)) {
+                                            secOutChannels.get(orig).add(chanName);
+                                            SecurityPattern secPattern = new SecurityPattern("autoEncrypt_" + secName, SecurityPattern.SYMMETRIC_ENC_PATTERN, overhead, "", encComp, decComp, "", "", "");
+                                            secPattern.originTask = orig.getName().replaceAll(title + "__", "");
+                                            channelSecMap.put(chanName, secPattern);
+										/* if (chan.checkAuth && autoStrongAuth) {
+										   nonceOutChannels.get(orig).add(chanName);
+										   }*/
+                                        }
+                                    }
+
+                                    if (hsmTasks.contains(dest.getName().split("__")[1])) {
+                                        if (!hsmSecInChannels.get(dest).contains(chanName) && portInTask(dest, chanName)) {
+                                            HSMChannel hsmchan = new HSMChannel(chanName, dest.getName().split("__")[1], HSMChannel.DEC);
+                                            hsmChannelMap.get(taskHSMMap.get(dest.getName().split("__")[1])).add(hsmchan);
+                                            hsmSecInChannels.get(dest).add(chanName);
+										/*	if (chan.checkAuth && autoStrongAuth) {
+											nonceInChannels.get(dest).add(chanName);
+											hsmchan.nonceName="nonce_" + dest.getName().split("__")[1] + "_" + orig.getName().split("__")[1];
+											}*/
+                                        }
+                                    } else {
+                                        if (!secInChannels.get(dest).contains(chanName)) {
+                                            secInChannels.get(dest).add(chanName);
+										/*if (chan.checkAuth && autoStrongAuth) {
+										  nonceInChannels.get(dest).add(chanName);
+										  }*/
+                                        }
+                                    }
+
+                                } else if (chan.isEnsureWeakAuth() && nonAuth) {
+                                    toSecure.get(orig).add(dest);
+								/*	if (autoStrongAuth) {
+								/*  		if (chan.getOriginTask().getReferenceObject() instanceof TMLCPrimitiveComponent && chan.getDestinationTask().getReferenceObject() instanceof TMLCPrimitiveComponent) {*/
+								/*if (!toSecureRev.get(dest).contains(orig)) {
+								  toSecureRev.get(dest).add(orig);
+								  }*/
+								/*}
+								  else {
+								  TMLChannel chantmp = oldmodel.getChannelByShortName("__"+chan.getName());
+								  System.out.println("Channel found "+ chantmp);
+								  }
+
+								  }*/
+                                    if (hsmTasks.contains(orig.getName().split("__")[1])) {
+                                        SecurityPattern secPattern = new SecurityPattern("hsmSec_" + secName, SecurityPattern.SYMMETRIC_ENC_PATTERN, overhead, "", encComp, decComp, "", "", "");
+                                        secPattern.originTask = "HSM_" + taskHSMMap.get(orig.getName().replaceAll(title + "__", ""));
+                                        channelSecMap.put(chanName, secPattern);
+                                        if (!hsmSecOutChannels.get(orig).contains(chanName) && portInTask(orig, chanName)) {
+                                            HSMChannel hsmchan = new HSMChannel(chanName, orig.getName().split("__")[1], HSMChannel.MAC);
+                                            hsmChannelMap.get(taskHSMMap.get(orig.getName().split("__")[1])).add(hsmchan);
+                                            hsmSecOutChannels.get(orig).add(chanName);
+
+										/*if (autoStrongAuth) {
+										  nonceOutChannels.get(orig).add(chanName);
+										  hsmchan.nonceName="nonce_" + dest.getName().split("__")[1] + "_" + orig.getName().split("__")[1];
+										  }*/
+                                        }
+                                    } else {
+                                        if (!macInChannels.get(orig).contains(chanName)) {
+                                            macOutChannels.get(orig).add(chanName);
+                                            SecurityPattern secPattern = new SecurityPattern("autoEncrypt_" + secName, SecurityPattern.SYMMETRIC_ENC_PATTERN, overhead, "", encComp, decComp, "", "", "");
+                                            secPattern.originTask = orig.getName().replaceAll(title + "__", "");
+                                            channelSecMap.put(chanName, secPattern);
+										/*   if (autoStrongAuth) {
+										     nonceOutChannels.get(orig).add(chanName);
+										     }*/
+                                        }
+                                    }
+
+                                    if (hsmTasks.contains(dest.getName().split("__")[1])) {
+
+                                        if (!hsmSecInChannels.get(dest).contains(chanName) && portInTask(dest, chanName)) {
+                                            HSMChannel hsmchan = new HSMChannel(chanName, dest.getName().split("__")[1], HSMChannel.DEC);
+                                            hsmChannelMap.get(taskHSMMap.get(dest.getName().split("__")[1])).add(hsmchan);
+                                            hsmSecInChannels.get(dest).add(chanName);
+										/*if (chan.checkAuth && autoStrongAuth) {
+										  nonceInChannels.get(dest).add(chanName);
+										  hsmchan.nonceName="nonce_" + dest.getName().split("__")[1] + "_" + orig.getName().split("__")[1];
+										  }*/
+                                        }
+                                    } else {
+                                        if (!secInChannels.get(dest).contains(chanName)) {
+                                            secInChannels.get(dest).add(chanName);
+										/*if (chan.checkAuth && autoStrongAuth) {
+										  nonceInChannels.get(dest).add(chanName);
+										  }*/
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+
+                }
+            }
+        }
+
+        // System.out.println("hsmchannelmap" + hsmChannelMap);
+        for (String chSec : channelSecMap.keySet()) {
+            TraceManager.addDev("secChannelMap: key=" + chSec + " value= " + channelSecMap.get(chSec).name);
+        }
+        for (TMLTask tk : macOutChannels.keySet()) {
+            TraceManager.addDev("macoutchans: key= " + tk.getName() + " value= " + macOutChannels.get(tk));
+        }
+        for (TMLTask tk : macInChannels.keySet()) {
+            TraceManager.addDev("macinchans: key= " + tk.getName() + " value= " + macInChannels.get(tk));
+        }
+        for (TMLTask tk : secInChannels.keySet()) {
+            TraceManager.addDev("nonsecin: key= " + tk.getName() + " value= " + secInChannels.get(tk));
+        }
+        for (TMLTask tk : secOutChannels.keySet()) {
+            TraceManager.addDev("nonsecout: key= " + tk.getName() + " value= " + secOutChannels.get(tk));
+        }
+        for (TMLTask tk : nonceInChannels.keySet()) {
+            TraceManager.addDev("noncein: key= " + tk.getName() + " value= " + nonceInChannels.get(tk));
+        }
+        for (TMLTask tk : nonceOutChannels.keySet()) {
+            TraceManager.addDev("nonceout: key= " + tk.getName() + " value= " + nonceOutChannels.get(tk));
+        }
+        for (TMLTask tk : hsmSecInChannels.keySet()) {
+            TraceManager.addDev("hsmsecin: key= " + tk.getName() + " value= " + hsmSecInChannels.get(tk));
+        }
+        for (TMLTask tk : hsmSecOutChannels.keySet()) {
+            TraceManager.addDev("hsmsecout: key= " + tk.getName() + " value= " + hsmSecOutChannels.get(tk));
+        }
+        for (TMLTask tk : toSecureRev.keySet()) {
+            TraceManager.addDev("tosecrev: key= " + tk.getName() + " value= " + toSecureRev.get(tk));
+        }
+        //Add a HSM Task for each selected CPU on the component diagram, add associated channels, etc
+        Map<String, List<TMLChannel>> hsmChannelsToMap = new HashMap<String, List<TMLChannel>>();
+        //Map<TMLChannel, Set<TMLChannel>> mapHSMChannelsInSameBusesAs = new HashMap<TMLChannel, Set<TMLChannel>>();
+        for (String cpuName : selectedCPUTasks.keySet()) {
+            TMLTask hsm = new TMLTask("HSM_" + cpuName, tmap.getTMLModeling().getTasks().get(0).getReferenceObject(), null);
+
+            TMLAttribute index = new TMLAttribute("channelIndex", new TMLType(TMLType.NATURAL), "0");
+            hsm.addAttribute(index);
+            tmlmodel.addTask(hsm);
+
+            //Find all associated tasks
+            List<TMLTask> comps = new ArrayList<TMLTask>();
+            //Find the component to add a HSM to
+
+            for (TMLTask task : tmlmodel.getTasks()) {
+                for (String compName : selectedCPUTasks.get(cpuName)) {
+                    if (task.getName().replaceAll(title + "__", "").equals(compName)) {
+                        comps.add(task);
+                        break;
+                    }
+                }
+            }
+            if (comps.size() == 0) {
+                //System.out.println("No Components found");
+                continue;
+            }
+
+            for (TMLTask comp : comps) {
+
+                //Map<String, HSMChannel> compChannels = new HashMap<String, HSMChannel>();
+                //String compName = comp.getValue();
+
+                List<ChannelData> hsmChans = new ArrayList<ChannelData>();
+                ChannelData chd = new ChannelData("startHSM_" + cpuName, false, false);
+                hsmChans.add(chd);
+                for (HSMChannel hsmChan : hsmChannelMap.get(cpuName)) {
+                    if (!hsmChan.task.equals(comp.getName().replaceAll(title + "__", ""))) {
+                        continue;
+                    }
+                    if (!channelIndexMap.containsKey(hsmChan.name)) {
+                        channelIndexMap.put(hsmChan.name, channelIndex);
+                        channelIndex++;
+                    }
+                    chd = new ChannelData("data_" + hsmChan.name + "_" + hsmChan.task, false, true);
+                    hsmChans.add(chd);
+                    chd = new ChannelData("retData_" + hsmChan.name + "_" + hsmChan.task, true, true);
+                    hsmChans.add(chd);
+                }
+                for (ChannelData hsmChan : hsmChans) {
+                    if (!hsmChan.isChan) {
+                        TMLRequest request = new TMLRequest(hsmChan.name, hsm.getReferenceObject());
+                        if (hsmChan.isOrigin) {
+                            request.addOriginTask(hsm);
+                            request.setDestinationTask(comp);
+                        } else {
+                            request.addOriginTask(comp);
+                            request.setDestinationTask(hsm);
+                        }
+                        hsm.setRequest(request);
+                        comp.setRequest(request);
+                        request.addParam(new TMLType(TMLType.NATURAL));
+                        tmlmodel.addRequest(request);
+                    } else {
+                        TMLChannel channel = new TMLChannel(hsmChan.name, hsm.getReferenceObject());
+                        channel.setPorts(new TMLPort(channel.getName(), channel.getReferenceObject()), new TMLPort(channel.getName(), channel.getReferenceObject()));
+                        if (hsmChan.isOrigin) {
+                            channel.setOriginTask(hsm);
+                            channel.setDestinationTask(comp);
+                            comp.addReadTMLChannel(channel);
+                            hsm.addWriteTMLChannel(channel);
+                        } else {
+                            channel.setOriginTask(comp);
+                            channel.setDestinationTask(hsm);
+                            hsm.addReadTMLChannel(channel);
+                            comp.addWriteTMLChannel(channel);
+                        }
+                        
+                        if (hsmChannelsToMap.containsKey(cpuName)) {
+                            if (!hsmChannelsToMap.get(cpuName).contains(channel)) {
+                                hsmChannelsToMap.get(cpuName).add(channel);
+                            }
+                        } else {
+                            List<TMLChannel> hsmChannels = new ArrayList<TMLChannel>();
+                            
+                            hsmChannels.add(channel);
+                            hsmChannelsToMap.put(cpuName, hsmChannels);
+                        }
+
+                        /*Set<TMLChannel> channelsWithSameMapping = new HashSet<TMLChannel>();
+                        for (TMLReadChannel rdCh: comp.getReadChannels()) {
+                            for(int i=0; i<rdCh.getNbOfChannels(); i++) {
+                                if (rdCh.getChannel(i).isEnsureConf() || rdCh.getChannel(i).isEnsureWeakAuth()) {
+                                    if (!channelsWithSameMapping.contains(rdCh.getChannel(i))) {
+                                        channelsWithSameMapping.add(rdCh.getChannel(i));
+                                    }
+                                }
+                            }
+                        }
+
+                        for (TMLWriteChannel wrCh: comp.getWriteChannels()) {
+                            for(int i=0; i<wrCh.getNbOfChannels(); i++) {
+                                if (wrCh.getChannel(i).isEnsureConf() || wrCh.getChannel(i).isEnsureWeakAuth()) {
+                                    if (!channelsWithSameMapping.contains(wrCh.getChannel(i))) { 
+                                        channelsWithSameMapping.add(wrCh.getChannel(i));
+                                    }
+                                }
+                            }
+                        } 
+                        if (mapHSMChannelsInSameBusesAs.containsKey(channel)) {
+                            mapHSMChannelsInSameBusesAs.get(channel).addAll(channelsWithSameMapping);
+                        } else {
+                            mapHSMChannelsInSameBusesAs.put(channel, channelsWithSameMapping);
+                        }*/
+                        
+                        //hsm.addTMLChannel(channel); /// IN TMLChannel and WriteTMLChannel ??
+                        
+                        //comp.addTMLChannel(channel);
+                        tmlmodel.addChannel(channel);
+                    }
+                }
+            }
+        }
+
+        /*for (TMLChannel ch : mapHSMChannelsInSameBusesAs.keySet()) {
+            for (TMLChannel chAs : mapHSMChannelsInSameBusesAs.get(ch)) {
+                for (HwCommunicationNode comm : tmap.getAllCommunicationNodesOfChannel(chAs)) {
+                    if (comm instanceof HwBus) {
+                        if (!tmap.isCommNodeMappedOn(ch, comm)) {
+                            tmap.addCommToHwCommNode(ch, comm);
+                        }
+                    }
+                }
+            }
+        }*/
+
+        for (TMLTask task : toSecureRev.keySet()) {
+            // TraceManager.addDev("Adding nonces to " + task.getName());
+            List<TMLChannel> chans = tmlmodel.getChannelsFromMe(task);
+            for (TMLTask task2 : toSecureRev.get(task)) {
+                boolean addChan = true;
+                for (TMLChannel chan : chans) {
+                    if (chan.getDestinationTask() == task2) {
+                        addChan = false;
+                    }
+                }
+                if (addChan) {
+                    TMLChannel channel = new TMLChannel("nonceCh" + task.getName().split("__")[1] + "_" + task2.getName().split("__")[1], task.getReferenceObject());
+                    if (tmlmodel.getChannelByName(channel.getName()) == null) {
+                        if (hsmTasks.contains(task.getName().replaceAll(title + "__", ""))) {
+                            channel.setOriginTask(tmap.getTaskByName("HSM_" + taskHSMMap.get(task.getName().replaceAll(title + "__", ""))));
+                            tmap.getTaskByName("HSM_" + taskHSMMap.get(task.getName().replaceAll(title + "__", ""))).addWriteTMLChannel(channel);
+                        } else {
+                            channel.setOriginTask(task);
+                            task.addWriteTMLChannel(channel);
+                        }
+
+                        if (hsmTasks.contains(task2.getName().replaceAll(title + "__", ""))) {
+                            channel.setDestinationTask(tmap.getTaskByName("HSM_" + taskHSMMap.get(task2.getName().replaceAll(title + "__", ""))));
+                            tmap.getTaskByName("HSM_" + taskHSMMap.get(task2.getName().replaceAll(title + "__", ""))).addReadTMLChannel(channel);
+                        } else {
+                            channel.setDestinationTask(task2);
+                            task2.addReadTMLChannel(channel);
+                        }
+                        
+                        channel.setPorts(new TMLPort(channel.getName(), channel.getReferenceObject()), new TMLPort(channel.getName(), channel.getReferenceObject()));
+                        tmlmodel.addChannel(channel);
+                    }
+                    
+                }
+            }
+        }
+
+        for (String cpuName : selectedCPUTasks.keySet()) {          
+            buildHSMActivityDiagram(cpuName);
+            //Add a private bus to Hardware Accelerator with the task for hsm
+
+            //Find the CPU the task is mapped to
+            TMLArchitecture arch = tmap.getArch();
+            HwCPU cpu = arch.getHwCPUByName(cpuName);
+            
+            if (cpu == null) {
+                return;
+            }
+
+            //Add new memory
+            HwMemory mem = new HwMemory("HSMMemory_" + cpuName);
+            arch.addHwNode(mem);
+            
+            //Add Hardware Accelerator
+            HwA hwa = new HwA("HSM_" + cpuName);
+            arch.addHwNode(hwa);
+            
+            //Add hsm task to hwa
+            TMLTask task = tmap.getTaskByName("HSM_" + cpuName);
+            if (task != null) {
+                tmap.addTaskToHwExecutionNode(task, hwa);
+            }
+            //Add bus to be connecting to the HWA
+            HwBus bus = new HwBus("HSMBus_" + cpuName);
+            bus.privacy = HwBus.BUS_PRIVATE;
+            arch.addHwNode(bus);
+
+            //Add bridge to be connecting to the 2 buses
+            HwBridge bridge = new HwBridge("HSMBridge_" + cpuName);
+            arch.addHwNode(bridge);
+            
+            //get bus connected to CPU
+            HwBus busOfCPU = null;
+            for (HwLink link : tmap.getArch().getHwLinks()) {
+                if (link.hwnode == cpu) {
+                    busOfCPU = link.bus;
+                    break;
+                }
+            }
+
+            for (TMLChannel ch : hsmChannelsToMap.get(cpuName)) {
+                tmap.addCommToHwCommNode(ch, mem);
+                tmap.addCommToHwCommNode(ch, bus);
+                tmap.addCommToHwCommNode(ch, busOfCPU);
+            }
+
+            //Connect new Bus and Bridge
+            HwLink linkBridgeWithNewBus = new HwLink("link_" + bridge.getName() + "_to_" + bus.getName());
+            linkBridgeWithNewBus.bus = bus;
+            linkBridgeWithNewBus.hwnode = bridge;
+            arch.addHwLink(linkBridgeWithNewBus);
+
+            //Connect the Bus of CPU and Bridge
+            if (busOfCPU != null) {
+                HwLink linkBridgeWithBus = new HwLink("link_" + bridge.getName() + "_to_" + busOfCPU.getName());
+                linkBridgeWithBus.bus = busOfCPU;
+                linkBridgeWithBus.hwnode = bridge;
+                arch.addHwLink(linkBridgeWithBus);
+            }
+
+            //Connect Bus and HWA
+            HwLink linkHWAWithBus = new HwLink("link_" + hwa.getName() + "_to_" + bus.getName());
+            linkHWAWithBus.bus = bus;
+            linkHWAWithBus.hwnode = hwa;
+            arch.addHwLink(linkHWAWithBus);
+
+            //Connect Bus and Memory
+            HwLink linkMemoryWithBus = new HwLink("link_" + mem.getName() + "_to_" + bus.getName());
+            linkMemoryWithBus.bus = bus;
+            linkMemoryWithBus.hwnode = mem;
+            arch.addHwLink(linkMemoryWithBus);
+        }
+
+        for (TMLTask task : toSecureRev.keySet()) {
+            // TraceManager.addDev("Adding nonces to " + task.getName());
+
+            for (TMLTask task2 : toSecureRev.get(task)) {
+                TMLChannel channel = tmlmodel.getChannelByName("nonceCh" + task.getName().split("__")[1] + "_" + task2.getName().split("__")[1]);
+                
+                List<TMLChannel> chans, chans2;
+                
+                chans = tmlmodel.getChannelsToMe(task);
+                HwMemory memToPutChannel = null;
+                for (TMLChannel chan : chans) {
+                    if (chan.isCheckAuthChannel()) {
+                        for (HwCommunicationNode mappedNode : tmap.getAllCommunicationNodesOfChannel(chan)) {
+                            if (!(mappedNode instanceof HwMemory)) {
+                                if (!tmap.isCommNodeMappedOn(channel, mappedNode)) {
+                                    tmap.addCommToHwCommNode(channel, mappedNode);
+                                }
+                            }
+                        }
+                        HwMemory memoryOfChannel = tmap.getMemoryOfChannel(chan);
+                        if (memoryOfChannel != null) {
+                            memToPutChannel = memoryOfChannel;
+                        }
+                    }
+                }
+                
+                if (hsmTasks.contains(task.getName().replaceAll(title + "__", ""))) {
+                    chans = tmlmodel.getChannelsFromMe(tmap.getTaskByName("HSM_" + taskHSMMap.get(task.getName().replaceAll(title + "__", ""))));
+                    for (TMLChannel chan : chans) {
+                        for (HwCommunicationNode mappedNode : tmap.getAllCommunicationNodesOfChannel(chan)) {
+                            if (!(mappedNode instanceof HwMemory)) {
+                                if (!tmap.isCommNodeMappedOn(channel, mappedNode)) {
+                                    tmap.addCommToHwCommNode(channel, mappedNode);
+                                }
+                            }
+                        }
+                        HwMemory memoryOfChannel = tmap.getMemoryOfChannel(chan);
+                        if (memoryOfChannel != null) {
+                            memToPutChannel = memoryOfChannel;
+                        }
+                    }
+                }
+                if (memToPutChannel != null) {
+                    if (!tmap.isCommNodeMappedOn(channel, memToPutChannel)) {
+                        tmap.addCommToHwCommNode(channel, memToPutChannel);
+                    }
+                }
+                chans2 = tmlmodel.getChannelsFromMe(task2);
+                for (TMLChannel chan2 : chans2) {
+                    if (chan2.isCheckAuthChannel()) {
+                        for (HwCommunicationNode mappedNode : tmap.getAllCommunicationNodesOfChannel(chan2)) {
+                            if (!(mappedNode instanceof HwMemory)) {
+                                if (!tmap.isCommNodeMappedOn(channel, mappedNode)) {
+                                    tmap.addCommToHwCommNode(channel, mappedNode);
+                                }
+                            }
+                        }
+                    }
+                }
+
+                if (hsmTasks.contains(task2.getName().replaceAll(title + "__", ""))) {
+                    chans2 = tmlmodel.getChannelsToMe(tmap.getTaskByName("HSM_" + taskHSMMap.get(task2.getName().replaceAll(title + "__", ""))));
+                    for (TMLChannel chan2 : chans2) {
+                        for (HwCommunicationNode mappedNode : tmap.getAllCommunicationNodesOfChannel(chan2)) {
+                            if (!(mappedNode instanceof HwMemory)) {
+                                if (!tmap.isCommNodeMappedOn(channel, mappedNode)) {
+                                    tmap.addCommToHwCommNode(channel, mappedNode);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+
+        //  }
+        //Add encryption/nonces to activity diagram
+        for (TMLTask task : toSecure.keySet()) {
+            TraceManager.addDev("Securing task " + task.getName());
+            TMLActivity taskAD = task.getActivityDiagram();
+            if (taskAD == null) {
+                continue;
+            }
+            
+            TMLActivityElement fromStart = taskAD.getFirst();
+            //TGConnectingPoint point = new TGConnectingPoint(null, 0, 0, false, false);
+
+            //Find states immediately before the write channel operator
+            //For each occurence of a write channel operator, add encryption/nonces before it
+
+
+            for (String channel : secOutChannels.get(task)) {
+                Set<TMLActivityElement> channelInstances = new HashSet<TMLActivityElement>();
+                TMLChannel tmlc = tmlmodel.getChannelByName(title + "__" + channel);
+                if (tmlc == null) {
+                    //Find by origin port instead
+                    tmlc = tmlmodel.getChannelByOriginPortName(channel);
+                }
+                if (tmlc == null) {
+                    continue;
+                }
+                //First, find the connector that points to it. We will add the encryption, nonce operators directly before the write channel operator
+                for (TMLActivityElement elem : taskAD.getElements()) {
+                    if (elem instanceof TMLWriteChannel) {
+                        TMLWriteChannel writeChannel = (TMLWriteChannel) elem;
+                        for (int i = 0; i < writeChannel.getNbOfChannels(); i++) {
+                            if (writeChannel.getChannel(i).getName().equals(tmlc.getName()) && writeChannel.securityPattern == null) {
+                                if (fromStart != null) {
+                                    channelInstances.add(elem);
+                                }
+                            }
+                        }
+                    }
+                }
+                for (TMLActivityElement elem : channelInstances) {
+                    
+                    //Add encryption operator
+                    TMLExecC encC = new TMLExecC(channelSecMap.get(channel).name, taskAD.getReferenceObject());
+                    encC.securityPattern = new SecurityPattern(channelSecMap.get(channel));
+                    encC.securityPattern.setProcess(SecurityPattern.ENCRYPTION_PROCESS);
+                    encC.setAction(Integer.toString(channelSecMap.get(channel).encTime));
+                    tmlmodel.addSecurityPattern(channelSecMap.get(channel));
+                    if (tmlmodel.securityTaskMap.containsKey(channelSecMap.get(channel))) {
+                        if (!tmlmodel.securityTaskMap.get(channelSecMap.get(channel)).contains(task)) {
+                            tmlmodel.securityTaskMap.get(channelSecMap.get(channel)).add(task);
+                        }
+                    } else {
+                        List<TMLTask> listTask = new ArrayList<TMLTask>();
+                        listTask.add(task);
+                        tmlmodel.securityTaskMap.put(channelSecMap.get(channel), listTask);
+                    }
+                    
+                    TMLActivityElement prevElem = taskAD.getPrevious(elem);
+                    if (nonceOutChannels.get(task).contains(channel)) {
+                        SecurityPattern secPatternNonce = new SecurityPattern("nonce_" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1], SecurityPattern.NONCE_PATTERN, overhead, "", encComp, decComp, "", "", "");
+                        if (tmlc != null) {
+                            encC.securityPattern.nonce = secPatternNonce.getName();
+                        }
+                        boolean addNewReadNonce = true;
+                        for (TMLActivityElement elemT : taskAD.getElements()) {
+                            if (elemT instanceof TMLReadChannel) {
+                                TMLReadChannel readElem = (TMLReadChannel) elemT;
+                                if (readElem.securityPattern != null) {
+                                    if(readElem.securityPattern.getName().equals(secPatternNonce.getName())) {
+                                        addNewReadNonce = false;
+                                        break;
+                                    }
+                                }
+                            }
+                        }
+                        if (addNewReadNonce) {
+                            //Receive any nonces if ensuring authenticity
+                            TMLReadChannel rd = new TMLReadChannel("", taskAD.getReferenceObject());
+                            //System.out.println("tmlc " + tmlc);
+                            //					System.out.println("Checking "+ tmlc.getDestinationTask() + " " + tmlc.getOriginTask());
+                            List<TMLChannel> matches = tmlmodel.getChannels(tmlc.getDestinationTask(), tmlc.getOriginTask());
+
+                            if (matches.size() > 0) {
+                                rd.setName(matches.get(0).getName().replaceAll(title + "__", ""));
+                                if (tmlmodel.getChannelByName(rd.getName()) != null) {
+                                    rd.addChannel(tmlmodel.getChannelByName(rd.getName()));
+                                } else if (tmlmodel.getChannelByShortName(rd.getName()) != null) {
+                                    rd.addChannel(tmlmodel.getChannelByShortName(rd.getName()));
+                                }
+                            } else {
+                                rd.setName("nonceCh" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]);
+                                if (tmlmodel.getChannelByName(rd.getName()) != null) {
+                                    rd.addChannel(tmlmodel.getChannelByName(rd.getName()));
+                                } else if (tmlmodel.getChannelByShortName(rd.getName()) != null) {
+                                    rd.addChannel(tmlmodel.getChannelByShortName(rd.getName()));
+                                }
+                            }
+                            secPatternNonce.originTask = rd.getChannel(0).getOriginTask().getName().replaceAll(title + "__", "");
+                            rd.securityPattern = secPatternNonce;  
+                            rd.setNbOfSamples("1");                   
+                            TMLActivityElement nextFirst = taskAD.getFirst().getNextElement(0);
+                            taskAD.getFirst().setNewNext(nextFirst, rd);
+                            rd.addNext(nextFirst);
+                            taskAD.addElement(rd);
+                            //Move encryption operator after receive nonce component
+                            
+                        }
+                    }
+                    prevElem = taskAD.getPrevious(elem);
+                    prevElem.setNewNext(elem, encC);
+                    encC.addNext(elem);
+                    taskAD.addElement(encC);
+
+                    //Add security contexts to write channels
+                    for (TMLActivityElement elemAC : taskAD.getElements()) {
+                        if (elemAC instanceof TMLWriteChannel) {
+                            TMLWriteChannel wChannel = (TMLWriteChannel) elemAC;
+                            for (int i=0; i < wChannel.getNbOfChannels(); i++) {
+                                if (channel.equals(wChannel.getChannel(i).getName().replaceAll(title + "__", "")) && wChannel.securityPattern == null) {
+                                    wChannel.securityPattern = channelSecMap.get(channel);
+                                    // wChannel.setEncForm(true);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+            for (String channel : macOutChannels.get(task)) {
+                //Add MAC before writechannel
+                TMLChannel tmlc = tmlmodel.getChannelByName(title + "__" + channel);
+                //First, find the connector that points to it. We will add the encryption, nonce operators directly before the write channel operator
+                if (tmlc == null) {
+                    tmlc = tmlmodel.getChannelByOriginPortName(channel);
+                }
+                if (tmlc == null) {
+                    continue;
+                }
+                Set<TMLActivityElement> channelInstances = new HashSet<TMLActivityElement>();
+                for (TMLActivityElement elem : taskAD.getElements()) {
+                    if (elem instanceof TMLWriteChannel) {
+                        TMLWriteChannel writeChannel = (TMLWriteChannel) elem;
+                        for (int i=0; i < writeChannel.getNbOfChannels(); i++) {
+                            if (writeChannel.getChannel(i).getName().equals(tmlc.getName()) && writeChannel.securityPattern == null) {
+                                fromStart = taskAD.getPrevious(elem);
+                                if (fromStart != null) {
+                                    channelInstances.add(elem);
+                                }
+                            }
+                        }
+                    }
+                }
+                for (TMLActivityElement elem : channelInstances) {
+                    //SecurityPattern secPattern = new SecurityPattern(channelSecMap.get(channel), SecurityPattern.MAC_PATTERN, overhead, overhead, encComp, decComp, "", "", "");
+                    channelSecMap.get(channel).type = SecurityPattern.MAC_PATTERN;
+                    TMLExecC encC = new TMLExecC(channelSecMap.get(channel).name, taskAD.getReferenceObject());
+                    encC.securityPattern = new SecurityPattern(channelSecMap.get(channel));
+                    encC.securityPattern.setProcess(SecurityPattern.ENCRYPTION_PROCESS);
+                    encC.setAction(Integer.toString(channelSecMap.get(channel).encTime));
+                    tmlmodel.addSecurityPattern(channelSecMap.get(channel));
+                    if (tmlmodel.securityTaskMap.containsKey(channelSecMap.get(channel))) {
+                        if (!tmlmodel.securityTaskMap.get(channelSecMap.get(channel)).contains(task)) {
+                            tmlmodel.securityTaskMap.get(channelSecMap.get(channel)).add(task);
+                        }
+                    } else {
+                        List<TMLTask> listTask = new ArrayList<TMLTask>();
+                        listTask.add(task);
+                        tmlmodel.securityTaskMap.put(channelSecMap.get(channel), listTask);
+                    }
+
+                    TMLActivityElement prevElem = taskAD.getPrevious(elem);
+                    if (nonceOutChannels.get(task).contains(channel)) {
+                        SecurityPattern secPatternNonce = new SecurityPattern("nonce_" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1], SecurityPattern.NONCE_PATTERN, overhead, "", encComp, decComp, "", "", "");
+                        if (tmlc != null) {
+                            encC.securityPattern.nonce = secPatternNonce.getName();
+                        }
+                        boolean addNewReadNonce = true;
+                        for (TMLActivityElement elemT : taskAD.getElements()) {
+                            if (elemT instanceof TMLReadChannel) {
+                                TMLReadChannel readElem = (TMLReadChannel) elemT;
+                                if (readElem.securityPattern != null) {
+                                    if(readElem.securityPattern.getName().equals(secPatternNonce.getName())) {
+                                        addNewReadNonce = false;
+                                        break;
+                                    }
+                                }
+                            }
+                        }
+                        if (addNewReadNonce) {
+                            //If we need to receive a nonce
+                            TMLReadChannel rd = new TMLReadChannel("", taskAD.getReferenceObject());
+                            //Receive any nonces if ensuring authenticity
+                            List<TMLChannel> matches = tmlmodel.getChannels(tmlc.getDestinationTask(), tmlc.getOriginTask());
+                            if (matches.size() > 0) {
+                                rd.setName(matches.get(0).getName().replaceAll(title + "__", ""));
+                                if (tmlmodel.getChannelByName(rd.getName()) != null) {
+                                    rd.addChannel(tmlmodel.getChannelByName(rd.getName()));
+                                } else if (tmlmodel.getChannelByShortName(rd.getName()) != null) {
+                                    rd.addChannel(tmlmodel.getChannelByShortName(rd.getName()));
+                                }
+                            } else {
+                                rd.setName("nonceCh" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]);
+                                if (tmlmodel.getChannelByName(rd.getName()) != null) {
+                                    rd.addChannel(tmlmodel.getChannelByName(rd.getName()));
+                                } else if (tmlmodel.getChannelByShortName(rd.getName()) != null) {
+                                    rd.addChannel(tmlmodel.getChannelByShortName(rd.getName()));
+                                }
+                            }
+                            secPatternNonce.originTask = rd.getChannel(0).getOriginTask().getName().replaceAll(title + "__", "");
+                            rd.securityPattern = secPatternNonce;
+                            rd.setNbOfSamples("1");
+                            TMLActivityElement nextFirst = taskAD.getFirst().getNextElement(0);
+                            taskAD.getFirst().setNewNext(nextFirst, rd);
+                            rd.addNext(nextFirst);
+                            taskAD.addElement(rd);
+                            
+                        }
+                    }
+                    //Add encryption operator
+                    prevElem = taskAD.getPrevious(elem);
+                    prevElem.setNewNext(elem, encC);
+                    encC.addNext(elem);
+                    taskAD.addElement(encC);
+                    //Add security contexts to write channels
+                    for (TMLActivityElement elemA : taskAD.getElements()) {
+                        if (elemA instanceof TMLWriteChannel) {
+                            TMLWriteChannel wChannel = (TMLWriteChannel) elemA;
+                            for (int i=0; i < wChannel.getNbOfChannels(); i++) {
+                                if (channel.equals(wChannel.getChannel(i).getName().replaceAll(title + "__", "")) && wChannel.securityPattern == null) {
+                                    wChannel.securityPattern = channelSecMap.get(channel); 
+                                    // wChannel.setEncForm(true);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            for (String channel : hsmSecOutChannels.get(task)) {
+                Set<TMLActivityElement> channelInstances = new HashSet<TMLActivityElement>();
+                for (TMLActivityElement elem : taskAD.getElements()) {
+                    if (elem instanceof TMLWriteChannel) {
+                        TMLWriteChannel writeChannel = (TMLWriteChannel) elem;
+                        for (int i=0; i < writeChannel.getNbOfChannels(); i++) {
+                            if (writeChannel.getChannel(i).getName().replaceAll(title + "__", "").equals(channel) && writeChannel.securityPattern == null) {
+                                fromStart = taskAD.getPrevious(elem);
+                                if (fromStart != null) {
+                                    channelInstances.add(elem);
+                                }
+                            }
+                        }
+                    }
+                }
+                for (TMLActivityElement chan : channelInstances) {
+                    TMLWriteChannel writeChannel = (TMLWriteChannel) chan;
+                    String chanName = writeChannel.getChannel(0).getName().replaceAll(title + "__", "");
+                    TMLChannel tmlc = tmlmodel.getChannelByName(title + "__" + chanName);
+                    
+                    if (tmlc == null) {
+                        tmlc = tmlmodel.getChannelByOriginPortName(channel);
+                    }
+                    if (tmlc == null) {
+                        continue;
+                    }
+                    writeChannel.securityPattern = channelSecMap.get(channel);
+                    // writeChannel.setEncForm(true);
+                    fromStart = taskAD.getPrevious(chan);
+
+                    TMLSendRequest reqSend = new TMLSendRequest("startHSM_" + taskHSMMap.get(task.getName().split("__")[1]), taskAD.getReferenceObject());
+                    
+                    TMLRequest req = tmlmodel.getRequestByName(reqSend.getName());
+                    if (req != null) {
+                        reqSend.setRequest(req);
+                    }
+
+                    if (reqSend.getNbOfParams() > 0) {
+                        reqSend.setParam(Integer.toString(channelIndexMap.get(chanName)), 0);
+                    } else {
+                        reqSend.addParam(Integer.toString(channelIndexMap.get(chanName)));
+                    }
+                    
+                    fromStart.setNewNext(chan, reqSend);
+                    taskAD.addElement(reqSend);
+                    //Add write channel operator
+                    TMLWriteChannel wr = new TMLWriteChannel("data_" + chanName + "_" + task.getName().split("__")[1], taskAD.getReferenceObject());
+                    if (tmlmodel.getChannelByName(wr.getName()) != null) {
+                        wr.addChannel(tmlmodel.getChannelByName(wr.getName()));
+                    } else if (tmlmodel.getChannelByShortName(wr.getName()) != null) {
+                        wr.addChannel(tmlmodel.getChannelByShortName(wr.getName()));
+                    }
+                    wr.setNbOfSamples("1"); 
+                    // wr.setEncForm(false);
+                    //wr.securityPattern = channelSecMap.get(chanName);
+                    taskAD.addElement(wr);
+                    reqSend.addNext(wr);
+                    wr.addNext(chan);
+                    //Receive any nonces if ensuring authenticity
+                    /* if (nonceOutChannels.get(task).contains(channel)) {
+                        //Read nonce from rec task
+
+                        List<TMLChannel> matches = tmlmodel.getChannels(tmlc.getDestinationTask(), tmlc.getOriginTask());
+                        TMLReadChannel rd = new TMLReadChannel("", taskAD.getReferenceObject());
+                        if (matches.size() > 0) {
+                            rd.setName(matches.get(0).getName().replaceAll(title + "__", ""));
+                            if (tmlmodel.getChannelByName(rd.getName()) != null) {
+                                rd.addChannel(tmlmodel.getChannelByName(rd.getName()));
+                            } else if (tmlmodel.getChannelByShortName(rd.getName()) != null) {
+                                rd.addChannel(tmlmodel.getChannelByShortName(rd.getName()));
+                            }
+                        } else {
+                            rd.setName("nonceCh" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]);
+                            if (tmlmodel.getChannelByName(rd.getName()) != null) {
+                                rd.addChannel(tmlmodel.getChannelByName(rd.getName()));
+                            } else if (tmlmodel.getChannelByShortName(rd.getName()) != null) {
+                                rd.addChannel(tmlmodel.getChannelByShortName(rd.getName()));
+                            }
+                        }
+                        SecurityPattern secPatternNonce = new SecurityPattern("nonce_" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1], SecurityPattern.NONCE_PATTERN, overhead, "", encComp, decComp, "", "", "");
+                        secPatternNonce.originTask = rd.getChannel(0).getOriginTask().getName().replaceAll(title + "__", "");
+                        rd.securityPattern = secPatternNonce;
+                        rd.setNbOfSamples("1"); 
+                        taskAD.addElement(rd);
+                        fromStart.setNewNext(reqSend, rd);
+                        rd.addNext(reqSend);
+                        //wr.setNewNext(chan, rd);
+
+                        TMLWriteChannel wr2 = new TMLWriteChannel("data_" + chanName + "_" + task.getName().split("__")[1], taskAD.getReferenceObject());
+                        if (tmlmodel.getChannelByName(wr2.getName()) != null) {
+                            wr2.addChannel(tmlmodel.getChannelByName(wr2.getName()));
+                        } else if (tmlmodel.getChannelByShortName(wr2.getName()) != null) {
+                            wr2.addChannel(tmlmodel.getChannelByShortName(wr2.getName()));
+                        }
+                        wr2.setNbOfSamples("1");
+                        wr2.securityPattern = secPatternNonce;
+                        taskAD.addElement(wr2);
+                        reqSend.setNewNext(wr, wr2);
+                        wr2.addNext(wr);
+                    } */
+
+                    //Read channel operator to receive hsm data
+                    TMLReadChannel rd2 = new TMLReadChannel("retData_" + chanName + "_" + task.getName().split("__")[1], taskAD.getReferenceObject());
+                    if (tmlmodel.getChannelByName(rd2.getName()) != null) {
+                        rd2.addChannel(tmlmodel.getChannelByName(rd2.getName()));
+                    } else if (tmlmodel.getChannelByShortName(rd2.getName()) != null) {
+                        rd2.addChannel(tmlmodel.getChannelByShortName(rd2.getName()));
+                    }
+                    rd2.securityPattern = channelSecMap.get(chanName);
+                    rd2.setNbOfSamples("1"); 
+                    taskAD.addElement(rd2);
+
+                    fromStart = taskAD.getPrevious(chan);
+                    fromStart.setNewNext(chan, rd2);
+                    rd2.addNext(chan);
+                }
+            }
+
+            for (String channel : hsmSecInChannels.get(task)) {
+                //System.out.println("Checking hsmsecinchannel " + channel + " " + task.getName());
+                Set<TMLActivityElement> channelInstances = new HashSet<TMLActivityElement>();
+                //TGConnector conn = new TGConnectorTMLAD(0, 0, 0, 0, 0, 0, false, null, tad, null, null, new Vector<Point>());
+                //TGConnectingPoint next = new TGConnectingPoint(null, 0, 0, false, false);
+                for (TMLActivityElement elem : taskAD.getElements()) {
+                    if (elem instanceof TMLReadChannel) {
+                        TMLReadChannel readChannel = (TMLReadChannel) elem;
+                        for (int i=0; i<readChannel.getNbOfChannels(); i++) {
+                            if (readChannel.getChannel(i).getName().replaceAll(title + "__", "").equals(channel) && readChannel.securityPattern == null) {
+                                fromStart = taskAD.getPrevious(elem);
+                                if (fromStart != null) {
+                                    channelInstances.add(elem);
+                                }
+                            }
+                        }
+                    }
+                }
+                //System.out.println("matches " + channelInstances);
+                for (TMLActivityElement chan : channelInstances) {
+                    TMLReadChannel readChannel = (TMLReadChannel) chan;
+                    String chanName = readChannel.getChannel(0).getName().replaceAll(title + "__", "");
+                    TMLChannel tmlc = tmlmodel.getChannelByName(title + "__" + chanName);
+                    if (tmlc == null) {
+                        tmlc = tmlmodel.getChannelByDestinationPortName(channel);
+                    }
+                    if (tmlc == null) {
+                        continue;
+                    }
+                    readChannel.securityPattern = channelSecMap.get(chanName);
+                    // readChannel.setEncForm(true);
+                
+                    fromStart = taskAD.getPrevious(chan);
+                    TMLActivityElement nextReadCh = chan.getNextElement(0);
+                   
+                    TMLSendRequest reqSend = new TMLSendRequest("startHSM_" + taskHSMMap.get(task.getName().split("__")[1]), taskAD.getReferenceObject());
+                    TMLRequest req = tmlmodel.getRequestByName(reqSend.getName());
+                    if (req != null) {
+                        reqSend.setRequest(req);
+                    }
+                    if (reqSend.getNbOfParams() > 0) {
+                        reqSend.setParam(Integer.toString(channelIndexMap.get(chanName)), 0);
+                    } else {
+                        reqSend.addParam(Integer.toString(channelIndexMap.get(chanName)));
+                    }
+                    taskAD.addElement(reqSend);
+                    fromStart.setNewNext(chan, reqSend);
+                    reqSend.addNext(chan);
+
+                    //Add write channel operator
+                    TMLWriteChannel wr = new TMLWriteChannel("data_" + chanName + "_" + task.getName().split("__")[1], taskAD.getReferenceObject());
+                    if (tmlmodel.getChannelByName(wr.getName()) != null) {
+                        wr.addChannel(tmlmodel.getChannelByName(wr.getName()));
+                    } else if (tmlmodel.getChannelByShortName(wr.getName()) != null) {
+                        wr.addChannel(tmlmodel.getChannelByShortName(wr.getName()));
+                    }
+                    wr.securityPattern = channelSecMap.get(chanName);
+                    wr.setNbOfSamples("1");
+                    taskAD.addElement(wr);
+
+                    //Add connector between request and write
+                    chan.setNewNext(nextReadCh, wr);
+                    
+                
+                    /*if (nonceInChannels.get(task).contains(channel)) {
+                        //Create a nonce operator and a write channel operator
+                        TMLExecC nonce = new TMLExecC("nonce_" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1], taskAD.getReferenceObject());
+                        SecurityPattern secNonce = new SecurityPattern(nonce.getName(), SecurityPattern.NONCE_PATTERN, overhead, "", encComp, decComp, "", "", "");
+                        
+                        nonce.securityPattern = secNonce;
+                        nonce.securityPattern.setProcess(SecurityPattern.ENCRYPTION_PROCESS);
+                        nonce.setAction(Integer.toString(secNonce.encTime));
+                        
+                        tmlmodel.addSecurityPattern(secNonce);
+                        if (tmlmodel.securityTaskMap.containsKey(secNonce)) {
+                            if (!tmlmodel.securityTaskMap.get(secNonce).contains(task)) {
+                                tmlmodel.securityTaskMap.get(secNonce).add(task);
+                            }
+                        } else {
+                            List<TMLTask> listTask = new ArrayList<TMLTask>();
+                            listTask.add(task);
+                            tmlmodel.securityTaskMap.put(secNonce, listTask);
+                        }
+                        
+                        taskAD.addElement(nonce);
+                        fromStart.setNewNext(chan, nonce);
+
+                        TMLWriteChannel wr3 = new TMLWriteChannel("", taskAD.getReferenceObject());
+                        //Send nonce along channel, the newly created nonce channel or an existing channel with the matching sender and receiver
+                        //Find matching channels
+                        List<TMLChannel> matches = tmlmodel.getChannels(tmlc.getDestinationTask(), tmlc.getOriginTask());
+
+                        if (matches.size() > 0) {
+                            wr3.setName(matches.get(0).getName().replaceAll(title + "__", ""));
+                            if (tmlmodel.getChannelByName(wr3.getName()) != null) {
+                                wr3.addChannel(tmlmodel.getChannelByName(wr3.getName()));
+                            } else if (tmlmodel.getChannelByShortName(wr3.getName()) != null) {
+                                wr3.addChannel(tmlmodel.getChannelByShortName(wr3.getName()));
+                            }
+                        } else {
+                            wr3.setName("nonceCh" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]);
+                            if (tmlmodel.getChannelByName(wr3.getName()) != null) {
+                                wr3.addChannel(tmlmodel.getChannelByName(wr3.getName()));
+                            } else if (tmlmodel.getChannelByShortName(wr3.getName()) != null) {
+                                wr3.addChannel(tmlmodel.getChannelByShortName(wr3.getName()));
+                            }
+                        }
+                        //send the nonce along the channel
+                        secNonce.originTask = wr3.getChannel(0).getOriginTask().getName().replaceAll(title + "__", "");
+                        wr3.securityPattern = secNonce;
+                        
+                        wr3.setNbOfSamples("1");
+                        taskAD.addElement(wr3);
+                        nonce.addNext(wr3);
+                        wr3.addNext(chan);
+
+                        //Also send nonce to hsm
+                        TMLWriteChannel wr2 = new TMLWriteChannel("data_" + chanName + "_" + task.getName().split("__")[1], taskAD.getReferenceObject());
+                        if (tmlmodel.getChannelByName(wr2.getName()) != null) {
+                            wr2.addChannel(tmlmodel.getChannelByName(wr2.getName()));
+                        } else if (tmlmodel.getChannelByShortName(wr2.getName()) != null) {
+                            wr2.addChannel(tmlmodel.getChannelByShortName(wr2.getName()));
+                        }
+                        wr2.securityPattern =  secNonce;
+                        wr2.setNbOfSamples("1");
+                        taskAD.addElement(wr2);
+
+                        reqSend.setNewNext(wr, wr2);
+                        wr2.addNext(wr);
+                    }*/
+
+
+                    //Add read channel operator
+
+                    TMLReadChannel rd = new TMLReadChannel("retData_" + chanName + "_" + task.getName().split("__")[1], taskAD.getReferenceObject());
+                    if (tmlmodel.getChannelByName(rd.getName()) != null) {
+                        rd.addChannel(tmlmodel.getChannelByName(rd.getName()));
+                    } else if (tmlmodel.getChannelByShortName(rd.getName()) != null) {
+                        rd.addChannel(tmlmodel.getChannelByShortName(rd.getName()));
+                    }
+                    //rd.securityPattern = channelSecMap.get(chanName);
+                    rd.setNbOfSamples("1"); 
+                    // rd.setEncForm(false);
+                    taskAD.addElement(rd);
+
+                    wr.addNext(rd);
+                    rd.addNext(nextReadCh);
+
+                }
+            }
+            for (String channel : macInChannels.get(task)) {
+                //Add decryptmac after readchannel
+                Set<TMLActivityElement> channelInstances = new HashSet<TMLActivityElement>();
+                //Find read channel operator
+                TMLChannel tmlc = tmlmodel.getChannelByName(title + "__" + channel);
+                if (tmlc == null) {
+                    tmlc = tmlmodel.getChannelByDestinationPortName(channel);
+                }
+                if (tmlc == null) {
+                    continue;
+                }
+                for (TMLActivityElement elem : taskAD.getElements()) {
+                    if (elem instanceof TMLReadChannel) {
+                        TMLReadChannel readChannel = (TMLReadChannel) elem;
+                        for (int i = 0; i<readChannel.getNbOfChannels(); i++) {
+                            if (readChannel.getChannel(i).getName().equals(tmlc.getName()) && readChannel.securityPattern == null) {
+                                fromStart = taskAD.getPrevious(elem);
+                                if (fromStart != null) {
+                                    channelInstances.add(elem);
+                                }
+                            }
+                        } 
+                    }
+                }
+                for (TMLActivityElement elem : channelInstances) {
+                    fromStart = taskAD.getPrevious(elem);
+
+                    TMLReadChannel readChannel = (TMLReadChannel) elem;
+                    readChannel.securityPattern = channelSecMap.get(readChannel.getChannel(0).getName().replaceAll(title + "__", ""));
+                    //Create nonce and send it
+                    if (nonceInChannels.get(task).contains(channel)) {
+                        TMLExecC nonce = new TMLExecC("nonce_" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1], taskAD.getReferenceObject());
+                        SecurityPattern secNonce = new SecurityPattern(nonce.getName(), SecurityPattern.NONCE_PATTERN, overhead, "", encComp, decComp, "", "", "");
+                        nonce.securityPattern = secNonce;
+                        nonce.securityPattern.setProcess(SecurityPattern.ENCRYPTION_PROCESS);
+                        nonce.setAction(Integer.toString(secNonce.encTime));
+                        boolean addNewExecCNonce = true;
+                        for (TMLActivityElement elemT : taskAD.getElements()) {
+                            if (elemT instanceof TMLExecC) {
+                                TMLExecC exeCElem = (TMLExecC) elemT;
+                                if (exeCElem.securityPattern != null) {
+                                    if(exeCElem.securityPattern.getName().equals(secNonce.getName())) {
+                                        addNewExecCNonce = false;
+                                        break;
+                                    }
+                                }
+                            }
+                        }
+                        if (addNewExecCNonce) {
+                            //Create a nonce operator and a write channel operator
+                            tmlmodel.addSecurityPattern(secNonce);
+                            if (tmlmodel.securityTaskMap.containsKey(secNonce)) {
+                                if (!tmlmodel.securityTaskMap.get(secNonce).contains(task)) {
+                                    tmlmodel.securityTaskMap.get(secNonce).add(task);
+                                }
+                            } else {
+                                List<TMLTask> listTask = new ArrayList<TMLTask>();
+                                listTask.add(task);
+                                tmlmodel.securityTaskMap.put(secNonce, listTask);
+                            }
+                            TMLActivityElement first = taskAD.getFirst();
+                            TMLActivityElement nextFirst = first.getNextElement(0);
+                            taskAD.addElement(nonce);
+                            first.setNewNext(nextFirst, nonce);
+                            TMLWriteChannel wr = new TMLWriteChannel("", taskAD.getReferenceObject());
+                            //Send nonce along channel, the newly created nonce channel or an existing channel with the matching sender and receiver
+                            //Find matching channels
+                            List<TMLChannel> matches = tmlmodel.getChannels(tmlc.getDestinationTask(), tmlc.getOriginTask());
+
+                            if (matches.size() > 0) {
+                                wr.setName(matches.get(0).getName().replaceAll(title + "__", ""));
+                                if (tmlmodel.getChannelByName(wr.getName()) != null) {
+                                    wr.addChannel(tmlmodel.getChannelByName(wr.getName()));
+                                } else if (tmlmodel.getChannelByShortName(wr.getName()) != null) {
+                                    wr.addChannel(tmlmodel.getChannelByShortName(wr.getName()));
+                                }
+                            } else {
+                                wr.setName("nonceCh" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]);
+                                if (tmlmodel.getChannelByName(wr.getName()) != null) {
+                                    wr.addChannel(tmlmodel.getChannelByName(wr.getName()));
+                                } else if (tmlmodel.getChannelByShortName(wr.getName()) != null) {
+                                    wr.addChannel(tmlmodel.getChannelByShortName(wr.getName()));
+                                }
+                            }
+                            secNonce.originTask = wr.getChannel(0).getOriginTask().getName().replaceAll(title + "__", "");
+                            //send the nonce along the channel
+                            wr.setNbOfSamples("1");
+                            wr.securityPattern = secNonce;
+                            taskAD.addElement(wr);
+                            nonce.addNext(wr);
+                            wr.addNext(nextFirst);
+                        }
+                    }
+
+                    //Add decryption operator if it does not already exist
+                    TMLExecC dec = new TMLExecC(channelSecMap.get(readChannel.getChannel(0).getName().replaceAll(title + "__", "")).name, taskAD.getReferenceObject());
+                    dec.securityPattern = new SecurityPattern(channelSecMap.get(readChannel.getChannel(0).getName().replaceAll(title + "__", "")));
+                    dec.setAction(Integer.toString(dec.securityPattern.encTime));
+                    tmlmodel.addSecurityPattern(channelSecMap.get(readChannel.getChannel(0).getName().replaceAll(title + "__", "")));
+                    if (tmlmodel.securityTaskMap.containsKey(channelSecMap.get(readChannel.getChannel(0).getName().replaceAll(title + "__", "")))) {
+                        if (!tmlmodel.securityTaskMap.get(channelSecMap.get(readChannel.getChannel(0).getName().replaceAll(title + "__", ""))).contains(task)) {
+                            tmlmodel.securityTaskMap.get(channelSecMap.get(readChannel.getChannel(0).getName().replaceAll(title + "__", ""))).add(task);
+                        }
+                    } else {
+                        List<TMLTask> listTask = new ArrayList<TMLTask>();
+                        listTask.add(task);
+                        tmlmodel.securityTaskMap.put(channelSecMap.get(readChannel.getChannel(0).getName().replaceAll(title + "__", "")), listTask);
+                    }
+                    dec.securityPattern.setProcess(SecurityPattern.DECRYPTION_PROCESS);
+                    taskAD.addElement(dec);
+                    dec.addNext(readChannel.getNextElement(0));
+                    readChannel.setNewNext(readChannel.getNextElement(0), dec);
+                    //Shift everything down
+                    for (TMLActivityElement elemA : taskAD.getElements()) {
+                        if (elemA instanceof TMLReadChannel) {
+                            TMLReadChannel rdOfSameCh = (TMLReadChannel) elemA;
+                            for (int i=0; i<rdOfSameCh.getNbOfChannels(); i++) {
+                                if (channel.equals(rdOfSameCh.getChannel(i).getName().replaceAll(title + "__", "")) && rdOfSameCh.securityPattern == null) {
+                                    rdOfSameCh.securityPattern = channelSecMap.get(channel);
+                                    // rdOfSameCh.setEncForm(true);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            for (String channel : secInChannels.get(task)) {
+                TraceManager.addDev("securing channel " + channel);
+                //Find read channel operator
+                TMLChannel tmlc = tmlmodel.getChannelByName(title + "__" + channel);
+                if (tmlc == null) {
+                    tmlc = tmlmodel.getChannelByDestinationPortName(channel);
+                }
+                if (tmlc == null) {
+                    continue;
+                }
+                HashSet<TMLActivityElement> channelInstances = new HashSet<TMLActivityElement>();
+                for (TMLActivityElement elem : taskAD.getElements()) {
+                    if (elem instanceof TMLReadChannel) {
+                        TMLReadChannel readChannel = (TMLReadChannel) elem;
+                        for (int i=0; i<readChannel.getNbOfChannels(); i++) {
+                            if (readChannel.getChannel(i).getName().equals(tmlc.getName()) && readChannel.securityPattern == null) {
+                                fromStart = taskAD.getPrevious(elem);
+                                if (fromStart != null) {
+                                    channelInstances.add(elem);
+                                }
+                            }
+                        }
+                    }
+                }
+
+                for (TMLActivityElement elem : channelInstances) {
+                    TMLReadChannel readChannel = (TMLReadChannel) elem;
+                    fromStart = taskAD.getPrevious(elem);
+                    if (nonceInChannels.get(task).contains(channel)) {
+                        //Create a nonce operator and a write channel operator
+                        TMLExecC nonce = new TMLExecC("nonce_" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1], taskAD.getReferenceObject());
+                        SecurityPattern secNonce = new SecurityPattern(nonce.getName(), SecurityPattern.NONCE_PATTERN, overhead, "", encComp, decComp, "", "", "");
+                        nonce.securityPattern = secNonce;
+                        nonce.securityPattern.setProcess(SecurityPattern.ENCRYPTION_PROCESS);
+                        nonce.setAction(Integer.toString(secNonce.encTime));
+                        boolean addNewExecCNonce = true;
+                        for (TMLActivityElement elemT : taskAD.getElements()) {
+                            if (elemT instanceof TMLExecC) {
+                                TMLExecC exeCElem = (TMLExecC) elemT;
+                                if (exeCElem.securityPattern != null) {
+                                    if(exeCElem.securityPattern.getName().equals(secNonce.getName())) {
+                                        addNewExecCNonce = false;
+                                        break;
+                                    }
+                                }
+                            }
+                        }
+                        if (addNewExecCNonce) {
+                            tmlmodel.addSecurityPattern(secNonce);
+                            if (tmlmodel.securityTaskMap.containsKey(secNonce)) {
+                                if (!tmlmodel.securityTaskMap.get(secNonce).contains(task)) {
+                                    tmlmodel.securityTaskMap.get(secNonce).add(task);
+                                }
+                            } else {
+                                List<TMLTask> listTask = new ArrayList<TMLTask>();
+                                listTask.add(task);
+                                tmlmodel.securityTaskMap.put(secNonce, listTask);
+                            }
+
+                            taskAD.addElement(nonce);
+                            TMLActivityElement first = taskAD.getFirst();
+                            TMLActivityElement nextFirst = first.getNextElement(0);
+                            first.setNewNext(nextFirst, nonce);
+                            TMLWriteChannel wr = new TMLWriteChannel("", taskAD.getReferenceObject());
+                            //Send nonce along channel, the newly created nonce channel or an existing channel with the matching sender and receiver
+                            //Find matching channels
+                            List<TMLChannel> matches = tmlmodel.getChannels(tmlc.getDestinationTask(), tmlc.getOriginTask());
+
+                            if (matches.size() > 0) {
+                                wr.setName(matches.get(0).getName().replaceAll(title + "__", ""));
+                                if (tmlmodel.getChannelByName(wr.getName()) != null) {
+                                    wr.addChannel(tmlmodel.getChannelByName(wr.getName()));
+                                } else if (tmlmodel.getChannelByShortName(wr.getName()) != null) {
+                                    wr.addChannel(tmlmodel.getChannelByShortName(wr.getName()));
+                                }
+                            } else {
+                                wr.setName("nonceCh" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]);
+                                if (tmlmodel.getChannelByName(wr.getName()) != null) {
+                                    wr.addChannel(tmlmodel.getChannelByName(wr.getName()));
+                                } else if (tmlmodel.getChannelByShortName(wr.getName()) != null) {
+                                    wr.addChannel(tmlmodel.getChannelByShortName(wr.getName()));
+                                }
+                            }
+                            secNonce.originTask = wr.getChannel(0).getOriginTask().getName().replaceAll(title + "__", "");
+                            //send the nonce along the channel
+                            wr.setNbOfSamples("1");
+                            wr.securityPattern = secNonce;
+                            taskAD.addElement(wr);
+                            nonce.addNext(wr);
+                            wr.addNext(nextFirst);
+                        }
+                    }
+
+                    //Now add the decrypt operator
+                    String readChShortName = readChannel.getChannel(0).getName().replaceAll(title + "__", "");
+                    readChannel.securityPattern = channelSecMap.get(readChShortName);
+                    // readChannel.setEncForm(true);
+                    //Add decryption operator if it does not already exist
+                    TMLExecC dec = new TMLExecC(channelSecMap.get(readChShortName).name, taskAD.getReferenceObject());
+                    dec.securityPattern = new SecurityPattern(channelSecMap.get(readChShortName));
+                    dec.securityPattern.setProcess(SecurityPattern.DECRYPTION_PROCESS);
+                    dec.setAction(Integer.toString(channelSecMap.get(readChShortName).encTime));
+
+                    tmlmodel.addSecurityPattern(channelSecMap.get(readChShortName));
+                    if (tmlmodel.securityTaskMap.containsKey(channelSecMap.get(readChShortName))) {
+                        if (!tmlmodel.securityTaskMap.get(channelSecMap.get(readChShortName)).contains(task)) {
+                            tmlmodel.securityTaskMap.get(channelSecMap.get(readChShortName)).add(task);
+                        }
+                    } else {
+                        List<TMLTask> listTask = new ArrayList<TMLTask>();
+                        listTask.add(task);
+                        tmlmodel.securityTaskMap.put(channelSecMap.get(readChShortName), listTask);
+                    }
+
+                    taskAD.addElement(dec);
+                    dec.addNext(readChannel.getNextElement(0));
+                    readChannel.setNewNext(readChannel.getNextElement(0), dec);
+                    //Shift everything down
+                    for (TMLActivityElement elemA : taskAD.getElements()) {
+                        if (elemA instanceof TMLReadChannel) {
+                            TMLReadChannel rdOfSameCh = (TMLReadChannel) elemA;
+                            for (int i=0; i < rdOfSameCh.getNbOfChannels(); i++) {
+                                String readSameChShortName = rdOfSameCh.getChannel(i).getName().replaceAll(title + "__", "");
+                                if (channel.equals(readSameChShortName) && rdOfSameCh.securityPattern == null) {
+                                    rdOfSameCh.securityPattern = channelSecMap.get(readSameChShortName);
+                                    // rdOfSameCh.setEncForm(true);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return;
+    }
+
+    public void buildHSMActivityDiagram(String cpuName) {
+        TMLModeling<?> tmlmodel = tmap.getTMLModeling();
+        //Build HSM Activity diagram
+        TMLTask task = tmap.getTaskByName("HSM_" + cpuName);
+        TMLActivity taskAD = task.getActivityDiagram();
+        if (taskAD == null) {
+            return;
+        }
+
+        TMLActivityElement start = taskAD.getFirst();
+        if (start == null) {
+            start = new TMLStartState("start", taskAD.getReferenceObject());
+            taskAD.setFirst(start);
+        }
+        
+        //fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
+
+        if (hsmChannelMap.get(cpuName).size() == 0) {
+            TMLStopState stop = new TMLStopState("stop", taskAD.getReferenceObject());
+            taskAD.addElement(stop);
+            //Connect stop and start
+            start.addNext(stop);
+            return;
+        }
+        TMLActionState req = new TMLActionState("action", taskAD.getReferenceObject());
+        if (task.getAttributeByName("channelIndex") == null) {
+            TMLAttribute attrib = new TMLAttribute("channelIndex", new TMLType(TMLType.NATURAL), "0");
+            task.addAttribute(attrib);
+        }
+        if (task.getAttributeByName("arg0__req") == null) {
+            TMLAttribute attrib = new TMLAttribute("arg0__req", new TMLType(TMLType.NATURAL), "0");
+            task.addAttribute(attrib);
+        }
+        req.setAction("channelIndex = arg0__req");
+        taskAD.addElement(req);
+        //Connect start and readrequest
+        start.addNext(req);
+
+        TMLActivityElement lastCurElem = req;
+        List<String> readNonces = new ArrayList<String>();
+        List<String> writeNonces = new ArrayList<String>();
+        for (HSMChannel ch : hsmChannelMap.get(cpuName)) {
+            if (!ch.nonceName.equals("")) {
+                if (ch.secType == HSMChannel.DEC) {
+                    TMLExecC nonce = new TMLExecC("nonce_" + ch.task + "_" + tmlmodel.getChannelByShortName(ch.name).getOriginTask().getName().replaceAll(appName + "__", ""), taskAD.getReferenceObject());
+                    SecurityPattern secNonce = new SecurityPattern(nonce.getName(), SecurityPattern.NONCE_PATTERN, overhead, "", encComp, decComp, "", "", "");
+                    nonce.securityPattern = secNonce;
+                    nonce.securityPattern.setProcess(SecurityPattern.ENCRYPTION_PROCESS);
+                    nonce.setAction(Integer.toString(secNonce.encTime));
+                    if (!writeNonces.contains(nonce.getName())) {
+                        tmlmodel.addSecurityPattern(secNonce);
+                        if (tmlmodel.securityTaskMap.containsKey(secNonce)) {
+                            if (!tmlmodel.securityTaskMap.get(secNonce).contains(task)) {
+                                tmlmodel.securityTaskMap.get(secNonce).add(task);
+                            }
+                        } else {
+                            List<TMLTask> listTask = new ArrayList<TMLTask>();
+                            listTask.add(task);
+                            tmlmodel.securityTaskMap.put(secNonce, listTask);
+                        }
+
+                        taskAD.addElement(nonce);
+
+                        if (lastCurElem.getNbNext()>0) {
+                            lastCurElem.setNewNext(lastCurElem.getNextElement(0), nonce);
+                        } else {
+                            lastCurElem.addNext(nonce);
+                        }
+                        TMLWriteChannel wr = new TMLWriteChannel("", taskAD.getReferenceObject());
+                        wr.setName("nonceCh" + ch.task + "_" + tmlmodel.getChannelByShortName(ch.name).getOriginTask().getName().split("__")[1]);
+                        if (tmlmodel.getChannelByName(wr.getName()) != null) {
+                            wr.addChannel(tmlmodel.getChannelByName(wr.getName()));
+                        } else if (tmlmodel.getChannelByShortName(wr.getName()) != null) {
+                            wr.addChannel(tmlmodel.getChannelByShortName(wr.getName()));
+                        }
+                        secNonce.originTask = task.getName();
+                        //send the nonce along the channel
+                        wr.setNbOfSamples("1");
+                        wr.securityPattern = secNonce;
+                        taskAD.addElement(wr);
+                        nonce.addNext(wr);
+                        lastCurElem = wr;
+                        writeNonces.add(nonce.getName());
+                    }
+                } else {
+                    SecurityPattern secPatternNonce = new SecurityPattern("nonce_" + tmlmodel.getChannelByShortName(ch.name).getDestinationTask().getName().replaceAll(appName + "__", "") + "_" + ch.task, SecurityPattern.NONCE_PATTERN, overhead, "", encComp, decComp, "", "", "");
+                    if (!readNonces.contains(secPatternNonce.getName())) {
+                        //If we need to receive a nonce
+                        TMLReadChannel rd = new TMLReadChannel("", taskAD.getReferenceObject());
+                        //Receive any nonces if ensuring authenticity
+                        rd.setName("nonceCh" + tmlmodel.getChannelByShortName(ch.name).getDestinationTask().getName().replaceAll(appName + "__", "") + "_" + ch.task);
+                        if (tmlmodel.getChannelByName(rd.getName()) != null) {
+                            rd.addChannel(tmlmodel.getChannelByName(rd.getName()));
+                        } else if (tmlmodel.getChannelByShortName(rd.getName()) != null) {
+                            rd.addChannel(tmlmodel.getChannelByShortName(rd.getName()));
+                        }
+                        secPatternNonce.originTask = rd.getChannel(0).getOriginTask().getName().replaceAll(appName + "__", "");
+                        rd.securityPattern = secPatternNonce;
+                        rd.setNbOfSamples("1");
+                        if (lastCurElem.getNbNext() > 0) {
+                            lastCurElem.setNewNext(lastCurElem.getNextElement(0), rd);
+                        } else {
+                            lastCurElem.addNext(rd);
+                        }
+                        lastCurElem = rd;
+                        taskAD.addElement(rd);
+                        readNonces.add(secPatternNonce.getName());
+                    }
+                }
+            }
+        }
+       
+
+        TMLChoice choice = new TMLChoice("choice", taskAD.getReferenceObject());
+        taskAD.addElement(choice);
+
+        //Connect lastCurElem and choice
+        lastCurElem.addNext(choice);
+
+        //Allows 9 channels max to simplify the diagram
+
+        //If more than 3 channels, build 2 levels of choices
+
+        if (hsmChannelMap.get(cpuName).size() > 3) {
+            TMLChoice choice2 = new TMLChoice("choice2", taskAD.getReferenceObject());
+            int i = 0;
+            for (HSMChannel ch : hsmChannelMap.get(cpuName)) {
+                if (i > 8) {
+                    break;
+                }
+                if (i % 3 == 0) {
+                    //Add a new choice every third channel
+                    choice2 = new TMLChoice("choice2", taskAD.getReferenceObject());
+                    taskAD.addElement(choice2);
+                    //Connect new choice operator to top choice
+                    choice.addGuard("");
+                    choice.addNext(choice2);
+                }
+                choice2.addGuard("[channelIndex==" + channelIndexMap.get(ch.name) + "]");
+
+                if (choice.getGuard(choice.getNbGuard()-1).length() == 2) {
+                    choice.setGuardAt(choice.getNbGuard()-1,"[(" + choice2.getGuard(choice2.getNbGuard()-1).substring(1, choice2.getGuard(choice2.getNbGuard()-1).length()-1) + ")]");
+                } else {
+                    choice.setGuardAt(choice.getNbGuard()-1, choice.getGuard(choice.getNbGuard()-1).substring(0, choice.getGuard(choice.getNbGuard()-1).length()-1) + " or (" + choice2.getGuard(choice2.getNbGuard()-1).substring(1, choice2.getGuard(choice2.getNbGuard()-1).length()-1) + ")]");
+                }
+                
+                TMLActivityElement prevRd = choice2;
+                //If needed, receive nonce from task
+                /*if (!ch.nonceName.equals("")) {
+                    //Connect choice and readchannel
+                    TMLReadChannel rdNonce = new TMLReadChannel(("data_" + ch.name + "_" + ch.task), taskAD.getReferenceObject());
+                    rdNonce.addChannel(tmlmodel.getChannelByName("data_" + ch.name + "_" + ch.task));
+                    rdNonce.securityPattern = new SecurityPattern(ch.nonceName, SecurityPattern.NONCE_PATTERN, overhead, "", encComp, decComp, "", "", "");
+                    rdNonce.securityPattern.originTask = rdNonce.getChannel(0).getOriginTask().getName().replaceAll(appName + "__", "");
+                    rdNonce.setNbOfSamples("1"); 
+                    taskAD.addElement(rdNonce);
+
+                    //choice2.getNextElement(choice2.getNbNext()-1).addNext(rd);
+                    choice2.addNext(rdNonce);
+                    prevRd = rdNonce;
+                }*/
+                
+                TMLReadChannel rd = new TMLReadChannel("data_" + ch.name + "_" + ch.task, taskAD.getReferenceObject());
+                rd.addChannel(tmlmodel.getChannelByName("data_" + ch.name + "_" + ch.task));
+                //
+                rd.setNbOfSamples("1"); 
+                taskAD.addElement(rd);
+                prevRd.addNext(rd);
+                //Recieve plaintext data if encrypting
+                /* if (ch.secType != HSMChannel.DEC) {
+                    rd.setEncForm(false);
+                } */
+
+                TMLWriteChannel wr = new TMLWriteChannel("retData_" + ch.name + "_" + ch.task, taskAD.getReferenceObject());
+                wr.addChannel(tmlmodel.getChannelByName("retData_" + ch.name + "_" + ch.task));
+                taskAD.addElement(wr);
+                wr.setNbOfSamples("1");
+                if (ch.secType == HSMChannel.DEC) {
+                    rd.securityPattern = channelSecMap.get(ch.name);
+                    TMLExecC dec = new TMLExecC(channelSecMap.get(ch.name).name, taskAD.getReferenceObject());
+                    dec.securityPattern = new SecurityPattern(channelSecMap.get(ch.name));
+                    dec.securityPattern.setProcess(SecurityPattern.DECRYPTION_PROCESS);
+                    dec.setAction(Integer.toString(channelSecMap.get(ch.name).encTime));
+
+                    tmlmodel.addSecurityPattern(channelSecMap.get(ch.name));
+                    if (tmlmodel.securityTaskMap.containsKey(channelSecMap.get(ch.name))) {
+                        if (!tmlmodel.securityTaskMap.get(channelSecMap.get(ch.name)).contains(task)) {
+                            tmlmodel.securityTaskMap.get(channelSecMap.get(ch.name)).add(task);
+                        }
+                    } else {
+                        List<TMLTask> listTask = new ArrayList<TMLTask>();
+                        listTask.add(task);
+                        tmlmodel.securityTaskMap.put(channelSecMap.get(ch.name), listTask);
+                    }
+
+                    taskAD.addElement(dec);
+                    rd.addNext(dec);
+
+                    //Connect decrypt and writechannel
+                    dec.addNext(wr);
+                    //Add Stop
+                    TMLStopState stop = new TMLStopState("stop", taskAD.getReferenceObject());
+                    taskAD.addElement(stop);
+
+                    //Connext stop and write channel
+                    wr.addNext(stop);
+                } else {
+                    wr.securityPattern = channelSecMap.get(ch.name);
+                    TMLExecC enc = new TMLExecC(channelSecMap.get(ch.name).name, taskAD.getReferenceObject());
+                    enc.securityPattern = new SecurityPattern(channelSecMap.get(ch.name));
+                    enc.securityPattern.setProcess(SecurityPattern.ENCRYPTION_PROCESS);
+                    enc.setAction(Integer.toString(channelSecMap.get(ch.name).encTime));
+
+                    tmlmodel.addSecurityPattern(channelSecMap.get(ch.name));
+                    if (tmlmodel.securityTaskMap.containsKey(channelSecMap.get(ch.name))) {
+                        if (!tmlmodel.securityTaskMap.get(channelSecMap.get(ch.name)).contains(task)) {
+                            tmlmodel.securityTaskMap.get(channelSecMap.get(ch.name)).add(task);
+                        }
+                    } else {
+                        List<TMLTask> listTask = new ArrayList<TMLTask>();
+                        listTask.add(task);
+                        tmlmodel.securityTaskMap.put(channelSecMap.get(ch.name), listTask);
+                    }
+                    
+                    if (ch.secType == HSMChannel.SENC) {
+                        enc.securityPattern.type = SecurityPattern.SYMMETRIC_ENC_PATTERN;
+                    } else if (ch.secType == HSMChannel.AENC) {
+                        enc.securityPattern.type = SecurityPattern.ASYMMETRIC_ENC_PATTERN;
+                    } else if (ch.secType == HSMChannel.MAC) {
+                        enc.securityPattern.type = SecurityPattern.MAC_PATTERN;
+                    } else if (ch.secType == HSMChannel.NONCE) {
+                        enc.securityPattern.type = SecurityPattern.NONCE_PATTERN;
+                    }
+
+                    enc.securityPattern.overhead = Integer.parseInt(overhead);
+                    enc.securityPattern.encTime = Integer.parseInt(encComp);
+                    enc.securityPattern.decTime = Integer.parseInt(decComp);
+                    enc.securityPattern.nonce = ch.nonceName;
+                    taskAD.addElement(enc);
+
+                    //Connect encrypt and readchannel
+                    rd.addNext(enc);
+                    //Connect encrypt and writechannel
+                    enc.addNext(wr);
+
+                    //Add Stop
+                    TMLStopState stop = new TMLStopState("stop", taskAD.getReferenceObject());
+                    taskAD.addElement(stop);
+
+                    //Connext stop and write channel
+                    wr.addNext(stop);
+                }
+                i++;
+            }
+        } else {
+
+            for (HSMChannel ch : hsmChannelMap.get(cpuName)) {
+                //Add guard as channelindex
+                choice.addGuard("[channelIndex==" + channelIndexMap.get(ch.name) + "]");
+                
+                TMLActivityElement prevRd = choice;
+                //If needed, receive nonce from task
+                /*if (!ch.nonceName.equals("")) {
+                    TMLReadChannel rdNonce = new TMLReadChannel(("data_" + ch.name + "_" + ch.task), taskAD.getReferenceObject());
+                    rdNonce.addChannel(tmlmodel.getChannelByName("data_" + ch.name + "_" + ch.task));
+                    rdNonce.securityPattern = new SecurityPattern(ch.nonceName, SecurityPattern.NONCE_PATTERN, overhead, "", encComp, decComp, "", "", "");
+                    rdNonce.securityPattern.originTask = rdNonce.getChannel(0).getOriginTask().getName().replaceAll(appName + "__", "");
+                    rdNonce.setNbOfSamples("1"); 
+                    taskAD.addElement(rdNonce);
+
+                    choice.addNext(rdNonce);
+                    prevRd = rdNonce;
+                }*/
+
+                TMLReadChannel rd = new TMLReadChannel("data_" + ch.name + "_" + ch.task, taskAD.getReferenceObject());
+                rd.addChannel(tmlmodel.getChannelByName("data_" + ch.name + "_" + ch.task));
+                
+                rd.setNbOfSamples("1"); 
+                taskAD.addElement(rd);
+
+                //Recieve plaintext data if encrypting
+                /* if (ch.secType != HSMChannel.DEC) {
+                    rd.setEncForm(false);
+                } */
+
+                //Connect choice and readchannel
+                prevRd.addNext(rd);
+
+                //Send data back to task
+                TMLWriteChannel wr = new TMLWriteChannel("retData_" + ch.name + "_" + ch.task, taskAD.getReferenceObject());
+                wr.addChannel(tmlmodel.getChannelByName("retData_" + ch.name + "_" + ch.task));
+
+                //Return plaintext data if decrypting
+                /* if (ch.secType == HSMChannel.DEC) {
+                    wr.setEncForm(false);
+                } */
+                wr.setNbOfSamples("1");
+                
+                taskAD.addElement(wr);
+                if (ch.secType == HSMChannel.DEC) {
+                    rd.securityPattern = channelSecMap.get(ch.name);
+                    TraceManager.addDev("Add Decrypt operator");
+                    //Add Decrypt operator
+                    TMLExecC dec = new TMLExecC(channelSecMap.get(ch.name).name, taskAD.getReferenceObject());
+                    dec.securityPattern = new SecurityPattern(channelSecMap.get(ch.name));
+                    dec.securityPattern.setProcess(SecurityPattern.DECRYPTION_PROCESS);
+                    dec.setAction(Integer.toString(channelSecMap.get(ch.name).encTime));
+
+                    tmlmodel.addSecurityPattern(channelSecMap.get(ch.name));
+                    if (tmlmodel.securityTaskMap.containsKey(channelSecMap.get(ch.name))) {
+                        if (!tmlmodel.securityTaskMap.get(channelSecMap.get(ch.name)).contains(task)) {
+                            tmlmodel.securityTaskMap.get(channelSecMap.get(ch.name)).add(task);
+                        }
+                    } else {
+                        List<TMLTask> listTask = new ArrayList<TMLTask>();
+                        listTask.add(task);
+                        tmlmodel.securityTaskMap.put(channelSecMap.get(ch.name), listTask);
+                    }
+                    
+                    taskAD.addElement(dec);
+
+                    //Connect decrypt and readchannel
+                    rd.addNext(dec);
+
+                    //Connect decrypt and writechannel
+                    dec.addNext(wr);
+
+                    //Add Stop
+                    TMLStopState stop = new TMLStopState("stop", taskAD.getReferenceObject());
+                    taskAD.addElement(stop);
+
+                    //Connect stop and write channel
+                    wr.addNext(stop);
+
+                } else {
+                    wr.securityPattern = channelSecMap.get(ch.name);
+                    TraceManager.addDev("Add Encrypt operator");
+                    TMLExecC enc = new TMLExecC(channelSecMap.get(ch.name).name, taskAD.getReferenceObject());
+                    enc.securityPattern = new SecurityPattern(channelSecMap.get(ch.name));
+                    enc.securityPattern.setProcess(SecurityPattern.ENCRYPTION_PROCESS);
+                    enc.setAction(Integer.toString(channelSecMap.get(ch.name).encTime));
+
+                    tmlmodel.addSecurityPattern(channelSecMap.get(ch.name));
+                    if (tmlmodel.securityTaskMap.containsKey(channelSecMap.get(ch.name))) {
+                        if (!tmlmodel.securityTaskMap.get(channelSecMap.get(ch.name)).contains(task)) {
+                            tmlmodel.securityTaskMap.get(channelSecMap.get(ch.name)).add(task);
+                        }
+                    } else {
+                        List<TMLTask> listTask = new ArrayList<TMLTask>();
+                        listTask.add(task);
+                        tmlmodel.securityTaskMap.put(channelSecMap.get(ch.name), listTask);
+                    }
+
+                    if (ch.secType == HSMChannel.SENC) {
+                        enc.securityPattern.type = SecurityPattern.SYMMETRIC_ENC_PATTERN;
+                    } else if (ch.secType == HSMChannel.AENC) {
+                        enc.securityPattern.type = SecurityPattern.ASYMMETRIC_ENC_PATTERN;
+                    } else if (ch.secType == HSMChannel.MAC) {
+                        enc.securityPattern.type = SecurityPattern.MAC_PATTERN;
+                    } else if (ch.secType == HSMChannel.NONCE) {
+                        enc.securityPattern.type = SecurityPattern.NONCE_PATTERN;
+                    }
+
+                    enc.securityPattern.overhead = Integer.parseInt(overhead);
+                    enc.securityPattern.encTime = Integer.parseInt(encComp);
+                    enc.securityPattern.decTime = Integer.parseInt(decComp);
+                    enc.securityPattern.nonce = ch.nonceName;
+                    taskAD.addElement(enc);
+
+                    //Connect encrypt and readchannel
+                    rd.addNext(enc);
+
+                    //Connect encrypt and writechannel
+                    enc.addNext(wr);
+
+                    //Add Stop
+                    TMLStopState stop = new TMLStopState("stop", taskAD.getReferenceObject());
+                    taskAD.addElement(stop);
+                    //Connect stop and write channel
+                    wr.addNext(stop);
+                }
+            }
+
+        }
+    }
+
+    public TMLMapping<?> autoMapKeys() {
+        if (tmap == null) {
+            return tmap;
+        }
+        //Find all Security Patterns, if they don't have an associated memory at encrypt and decrypt, tmap them
+        TMLModeling<?> tmlm = tmap.getTMLModeling();
+        if (tmlm.securityTaskMap == null) {
+            return tmap;
+        }
+        for (SecurityPattern sp : tmlm.securityTaskMap.keySet()) {
+            if (sp.type.equals(SecurityPattern.SYMMETRIC_ENC_PATTERN) || sp.type.equals(SecurityPattern.MAC_PATTERN) || sp.type.equals(SecurityPattern.ASYMMETRIC_ENC_PATTERN)) {
+                for (TMLTask t : tmlm.securityTaskMap.get(sp)) {
+                    HwExecutionNode node1 = tmap.getHwNodeOf(t);
+                    boolean taskMappedToCPU = false;
+                    if (node1 != null) {
+                        if (node1 instanceof HwExecutionNode) {
+                            HwExecutionNode cpuNode = node1;
+                            taskMappedToCPU = true;
+                            boolean keyMappedtoMem = false;
+                            HwLink lastLink = null;
+                            for (int i=0; i < tmap.getArch().getHwLinks().size(); i++) {
+                                HwLink link = tmap.getArch().getHwLinks().get(i);
+                                if (!keyMappedtoMem && link.hwnode == node1) {
+                                    lastLink = link;
+                                    if (link.bus.privacy == 1) {
+                                        HwBus curBus = link.bus;
+                                        boolean keyFound = false;
+                                        HwMemory memNodeToMap = null;
+                                        outer:
+                                        for (HwLink linkBus : tmap.getArch().getHwLinks()) {
+                                            if (linkBus.bus == curBus) {
+                                                if (linkBus.hwnode instanceof HwMemory) {
+                                                    memNodeToMap = (HwMemory) linkBus.hwnode;
+                                                    List<SecurityPattern> keys = tmap.getMappedPatterns(memNodeToMap);
+                                                    if (keys.contains(sp)) {
+                                                        keyFound = true;
+                                                        keyMappedtoMem = true;
+                                                        break outer;
+                                                    }
+                                                }
+                                            }
+                                        }
+                                        if (!keyFound) {
+                                            if (memNodeToMap != null) {
+                                                TraceManager.addDev("Adding " + sp.name + " key to " + memNodeToMap.getName());
+                                                tmap.addSecurityPattern(memNodeToMap, sp);
+                                                keyMappedtoMem = true;
+                                            } else {
+                                                HwMemory newHwMemory = new HwMemory(cpuNode.getName() + "KeysMemory");
+                                                TraceManager.addDev("Creating new memory: " + newHwMemory.getName());
+                                                tmap.getArch().addHwNode(newHwMemory);
+                                                
+                                                //Connect Bus and Memory
+                                                HwLink linkNewMemWithBus = new HwLink("link_" + newHwMemory.getName() + "_to_" + curBus.getName());
+                                                linkNewMemWithBus.setNodes(curBus, newHwMemory);
+                                                tmap.getArch().getHwLinks().add(linkNewMemWithBus);
+                                                tmap.addSecurityPattern(newHwMemory, sp);
+                                                TraceManager.addDev("Adding " + sp.name + " key to " + newHwMemory.getName());
+                                                keyMappedtoMem = true;
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                            if (!keyMappedtoMem) {
+                                if (lastLink != null) {
+                                    HwBus lastBusNode = lastLink.bus;
+                                    HwExecutionNode cpuArchiNode = cpuNode;
+
+                                    HwBridge newBridge = new HwBridge(cpuNode.getName() + "KeysBrigde");
+                                    tmap.getArch().addHwNode(newBridge);
+
+                                    HwBus newPrivateBus = new HwBus(cpuNode.getName() + "KeysPrivateBus");
+                                    newPrivateBus.privacy = HwBus.BUS_PRIVATE;
+                                    for (TMLElement elem : tmap.getLisMappedChannels(lastBusNode)) {
+                                        if (elem instanceof TMLChannel) {
+                                            tmap.addCommToHwCommNode(elem, newPrivateBus);
+                                        }
+                                    }
+                                    tmap.getArch().addHwNode(newPrivateBus);
+                                   
+                                    HwMemory memNodeToMap = new HwMemory(cpuNode.getName() + "KeysMemory");
+                                    TraceManager.addDev("Creating new memory: " + memNodeToMap.getName());
+                                    tmap.getArch().addHwNode(memNodeToMap);
+
+                                    tmap.addSecurityPattern(memNodeToMap, sp);
+                                    TraceManager.addDev("Adding " + sp.name + " key to " + memNodeToMap.getName());
+                                    keyMappedtoMem = true;
+
+                                    //Connect Bus and Memory
+                                    HwLink newLinkBusMemory = new HwLink("Link_"+newPrivateBus.getName() + "_" + memNodeToMap.getName());
+                                    newLinkBusMemory.setNodes(newPrivateBus, memNodeToMap);
+                                    tmap.getArch().addHwLink(newLinkBusMemory);
+
+                                    //Connect new Private Bus and Bridge
+                                    HwLink newLinkPrivateBusBridge = new HwLink("Link_"+newPrivateBus.getName() + "_" + newBridge.getName());
+                                    newLinkPrivateBusBridge.setNodes(newPrivateBus, newBridge);
+                                    tmap.getArch().addHwLink(newLinkPrivateBusBridge);
+
+                                    //Connect Public Bus and Bridge
+                                    HwLink newLinkPublicBusBridge = new HwLink("Link_"+lastBusNode.getName() + "_" + newBridge.getName());
+                                    newLinkPublicBusBridge.setNodes(lastLink.bus, newBridge);
+                                    tmap.getArch().addHwLink(newLinkPublicBusBridge);
+
+                                    //Connect new Private Bus and CPU
+                                    HwLink newLinkPrivateBusCPU = new HwLink("Link_"+newPrivateBus.getName() + "_" + cpuArchiNode.getName());
+                                    newLinkPrivateBusCPU.setNodes(newPrivateBus, cpuArchiNode);
+                                    tmap.getArch().addHwLink(newLinkPrivateBusCPU);
+
+
+                                    //Disconnect Public Bus and CPU
+                                    HwLink linkToRemove = null;
+                                    for (HwLink li: tmap.getArch().getHwLinks()) {
+                                        if (li.bus == lastLink.bus && li.hwnode == cpuNode) {
+                                            TraceManager.addDev("Disconnect :" + li.bus.getName() + " and " + li.hwnode.getName());
+                                            linkToRemove = li;
+                                            break;
+                                        }       
+                                    }
+                                    if (linkToRemove != null) {
+                                        tmap.getArch().getHwLinks().remove(linkToRemove);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    if (!taskMappedToCPU) {
+                        TraceManager.addDev(t.getTaskName() + " has to be mapped to a CPU!");
+                    }
+                }
+            }
+        }
+        TraceManager.addDev("Mapping finished");
+        return tmap;
+    }
+
+    class HSMChannel {
+        public static final int SENC = 0;
+        public static final int NONCE_ENC = 1;
+        public static final int MAC = 2;
+        public static final int DEC = 3;
+        public static final int AENC = 4;
+        public static final int NONCE = 5;
+        public String name;
+        public String task;
+        public String securityContext = "";
+        public int secType;
+        public String nonceName = "";
+
+        public HSMChannel(String n, String t, int type) {
+            name = n;
+            task = t;
+            secType = type;
+        }
+    }
+
+    class ChannelData {
+        public String name;
+        public boolean isOrigin;
+        public boolean isChan;
+
+        public ChannelData(String n, boolean orig, boolean isCh) {
+            name = n;
+            isOrigin = orig;
+            isChan = isCh;
+        }
+
+    }
+
+}
diff --git a/src/main/java/tmltranslator/patternhandling/TMRGeneration.java b/src/main/java/tmltranslator/patternhandling/TMRGeneration.java
new file mode 100644
index 0000000000000000000000000000000000000000..1bb60747a4773e1d14a98010d207cf63570c521d
--- /dev/null
+++ b/src/main/java/tmltranslator/patternhandling/TMRGeneration.java
@@ -0,0 +1,856 @@
+/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
+ *
+ * ludovic.apvrille AT enst.fr
+ *
+ * This software is a computer program whose purpose is to allow the
+ * edition of TURTLE analysis, design and deployment diagrams, to
+ * allow the generation of RT-LOTOS or Java code from this diagram,
+ * and at last to allow the analysis of formal validation traces
+ * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
+ * from INRIA Rhone-Alpes.
+ *
+ * This software is governed by the CeCILL  license under French law and
+ * abiding by the rules of distribution of free software.  You can  use,
+ * modify and/ or redistribute the software under the terms of the CeCILL
+ * license as circulated by CEA, CNRS and INRIA at the following URL
+ * "http://www.cecill.info".
+ *
+ * As a counterpart to the access to the source code and  rights to copy,
+ * modify and redistribute granted by the license, users are provided only
+ * with a limited warranty  and the software's author,  the holder of the
+ * economic rights,  and the successive licensors  have only  limited
+ * liability.
+ *
+ * In this respect, the user's attention is drawn to the risks associated
+ * with loading,  using,  modifying and/or developing or reproducing the
+ * software by the user in light of its specific status of free software,
+ * that may mean  that it is complicated to manipulate,  and  that  also
+ * therefore means  that it is reserved for developers  and  experienced
+ * professionals having in-depth computer knowledge. Users are therefore
+ * encouraged to load and test the software's suitability as regards their
+ * requirements in conditions enabling the security of their systems and/or
+ * data to be ensured and,  more generally, to use and operate it in the
+ * same conditions as regards security.
+ *
+ * The fact that you are presently reading this means that you have had
+ * knowledge of the CeCILL license and that you accept its terms.
+ */
+
+
+package tmltranslator.patternhandling;
+/**
+ * Class TMRGeneration
+ * TMR Generation in separate thread
+ * Creation: 26/07/2023
+ *
+ * @author Jawher JERRAY
+ * @version 1.0 26/07/2023
+ */
+ 
+import myutil.TraceManager;
+import tmltranslator.*;
+
+import java.util.*;
+ 
+public class TMRGeneration implements Runnable {
+	private Map<String, List<String>> selectedSensorsTasks;
+	private String selectedRecieverTask;
+    private String interpretersCompTime;
+    private String voterCompTime;
+    private String voterTimeOut;
+	private TMLMapping<?> tmap;
+
+    public TMRGeneration(Map<String, List<String>> selectedSensorsTasks, String selectedRecieverTask, String interpretersCompTime, String voterCompTime, String voterTimeOut, TMLMapping<?> tmap) {
+		this.selectedSensorsTasks = selectedSensorsTasks;
+		this.selectedRecieverTask = selectedRecieverTask;
+		this.interpretersCompTime = interpretersCompTime;
+		this.voterCompTime = voterCompTime;
+		this.voterTimeOut = voterTimeOut;
+		this.tmap = tmap;
+	}
+    
+	public TMLMapping<?> startThread() {
+		Thread t = new Thread(this);
+		t.start();
+		try {
+			t.join();
+		}
+		catch (Exception e) {
+			TraceManager.addDev("Error in TMR Generation Thread");
+		}
+		return tmap;
+	}
+
+    public void run() {
+    	TraceManager.addDev("Adding TMR");
+        if (tmap == null) {
+            return;
+        }
+
+        TMLModeling<?> tmlmNew = tmap.getTMLModeling();
+        for (TMLTask task : tmlmNew.getTasks()) {
+            int index = task.getName().indexOf("__");
+            if (index > 0) {
+                task.setName(task.getName().substring(index + 2));
+            }
+        }
+        for (TMLChannel ch : tmlmNew.getChannels()) {
+            int index = ch.getName().indexOf("__");
+            if (index > 0) {
+                ch.setName(ch.getName().substring(index + 2));
+            }
+        }
+        for (TMLEvent evt : tmlmNew.getEvents()) {
+            int index = evt.getName().indexOf("__");
+            if (index > 0) {
+                evt.setName(evt.getName().substring(index + 2));
+            }
+        }
+        for (TMLRequest req : tmlmNew.getRequests()) {
+            int index = req.getName().indexOf("__");
+            if (index > 0) {
+                req.setName(req.getName().substring(index + 2));
+            }
+        }
+        
+        List<String> parameters = new ArrayList<String>();
+        parameters.add(interpretersCompTime);
+        parameters.add(voterTimeOut);
+        parameters.add(voterCompTime);
+        
+        if (selectedSensorsTasks.size() == 1) {
+            String taskMainSensor = selectedSensorsTasks.keySet().iterator().next();
+            for (int indexI=0; indexI < 2; indexI++) {
+                List<TMLChannel> channelsSensor = new ArrayList<TMLChannel>();
+                for (String channelSensorName: selectedSensorsTasks.get(taskMainSensor)) {
+                    TMLChannel channelSensor = tmlmNew.getChannelByName(channelSensorName);
+                    channelsSensor.add(channelSensor);
+                }
+                String newSensorName = taskMainSensor + "_duplicate" + (indexI+1);
+                tmap = duplicateSensor(tmap, channelsSensor, newSensorName);
+            }
+        }
+        List <String> sensorsTask = new ArrayList<String>(selectedSensorsTasks.keySet());
+        for (int i=0 ; i < selectedSensorsTasks.get(sensorsTask.get(0)).size() ; i++) {
+            List<TMLChannel> channelsSensorReceiverList = new ArrayList<TMLChannel>();
+            for (String taskSensor: selectedSensorsTasks.keySet()) {
+                TMLChannel channelSensor = tmlmNew.getChannelByName((selectedSensorsTasks.get(taskSensor)).get(i));
+                channelsSensorReceiverList.add(channelSensor);
+            }
+            tmap = tmrIntegration(tmap, channelsSensorReceiverList, parameters);
+        }
+	} 
+
+    TMLMapping<?> duplicateSensor(TMLMapping<?> _tmap, List<TMLChannel> _channelsBetweenSensorAndReceiver, String newSensorName) {
+
+        if (_channelsBetweenSensorAndReceiver.size() == 0) {
+            TraceManager.addDev("No channels between sensors and receiver");
+            return _tmap;
+        }
+        // Check if all channels have the same Destination Task (the same receiver)
+        TMLTask receiverTask = _channelsBetweenSensorAndReceiver.get(0).getDestinationTask();
+        boolean _isSameDestTask = true;
+        for (int i = 1 ; i < _channelsBetweenSensorAndReceiver.size() ; i++) {
+            if (_channelsBetweenSensorAndReceiver.get(i).getDestinationTask() != receiverTask) {
+                _isSameDestTask = false;
+                break;
+            }
+        }
+        if (!_isSameDestTask) {
+            TraceManager.addDev("Sensors are not connected to the same receiver");
+            return _tmap;
+        }
+        TMLTask sensorTask = _channelsBetweenSensorAndReceiver.get(0).getOriginTask();
+
+        TMLModeling<?> _tmlm = _tmap.getTMLModeling();
+        TMLTask duplicatedSensorTask = new TMLTask(newSensorName, receiverTask.getReferenceObject(), null);
+        _tmlm.addTask(duplicatedSensorTask);
+
+        // Add attributes of Sensor to the new one
+        duplicatedSensorTask.getAttributes().addAll(sensorTask.getAttributes());
+        Map<TMLChannel, TMLChannel> channelsSensorReceiver = new HashMap<TMLChannel, TMLChannel>();
+        for (TMLChannel channelSensorReceiver : _channelsBetweenSensorAndReceiver) {
+            // Create new channel between new sensor and receiver
+            TMLChannel channelDuplicatedSensorToReceiver = new TMLChannel(newSensorName.toLowerCase() + channelSensorReceiver.getName() + "_Data", duplicatedSensorTask.getReferenceObject());
+
+            channelDuplicatedSensorToReceiver.setPorts(new TMLPort(channelDuplicatedSensorToReceiver.getName(), channelDuplicatedSensorToReceiver.getReferenceObject()), new TMLPort(channelDuplicatedSensorToReceiver.getName(), channelDuplicatedSensorToReceiver.getReferenceObject()));
+            
+            channelDuplicatedSensorToReceiver.setOriginTask(duplicatedSensorTask);
+            channelDuplicatedSensorToReceiver.setDestinationTask(receiverTask);
+            channelDuplicatedSensorToReceiver.setType(channelSensorReceiver.getType());
+            channelDuplicatedSensorToReceiver.setSize(channelSensorReceiver.getSize());
+            channelDuplicatedSensorToReceiver.setMax(channelSensorReceiver.getMax());
+            // set Duplicated Sensor as Origin of channelDuplicatedSensorToReceiver
+            duplicatedSensorTask.addWriteTMLChannel(channelDuplicatedSensorToReceiver);
+            // set Receiver as Destination of channelDuplicatedSensorToReceiver
+            receiverTask.addReadTMLChannel(channelDuplicatedSensorToReceiver);
+            _tmlm.addChannel(channelDuplicatedSensorToReceiver);
+            channelsSensorReceiver.put(channelSensorReceiver, channelDuplicatedSensorToReceiver);
+            if (selectedSensorsTasks.containsKey(newSensorName)) {
+                selectedSensorsTasks.get(newSensorName).add(channelDuplicatedSensorToReceiver.getName());
+            } else {
+                List<String> newSensorChannelsName = new ArrayList<String>();
+                newSensorChannelsName.add(channelDuplicatedSensorToReceiver.getName());
+                selectedSensorsTasks.put(newSensorName, newSensorChannelsName);
+            }
+        }
+
+        //Build Activity Diagram for duplicatedSensorTask
+        TMLActivity duplicatedSensorTaskA = duplicatedSensorTask.getActivityDiagram();
+        
+        Map<TMLActivityElement, TMLActivityElement> replaceElem = new HashMap<TMLActivityElement, TMLActivityElement>();
+        Map<TMLActivityElement, TMLActivityElement> changeElemNext = new HashMap<TMLActivityElement, TMLActivityElement>();
+        Map<TMLActivityElement, TMLActivityElement> corrElemNext = new HashMap<TMLActivityElement, TMLActivityElement>();
+        Vector<TMLActivityElement> duplElements = new Vector<TMLActivityElement>();
+        for (int i=0; i < sensorTask.getActivityDiagram().getElements().size(); i++) {
+            try {
+                TMLActivityElement duplElement = sensorTask.getActivityDiagram().get(i).deepClone(_tmlm);
+                duplElement.setReferenceObject(duplicatedSensorTaskA.getReferenceObject());
+                duplElements.add(duplElement);
+                corrElemNext.put(sensorTask.getActivityDiagram().get(i), duplElement);
+            } catch (TMLCheckingError ex) {
+                
+            }
+            
+        }
+        
+        for (int i=0; i < sensorTask.getActivityDiagram().getElements().size(); i++) {
+            for (int j=0; j < sensorTask.getActivityDiagram().get(i).getNbNext(); j++) {
+                duplElements.elementAt(i).addNext(corrElemNext.get(sensorTask.getActivityDiagram().get(i).getNextElement(j)));
+            }
+        }
+        
+        for (int i=0; i < duplElements.size(); i++) {
+            TMLActivityElement elemDuplSens = duplElements.elementAt(i);
+            if (elemDuplSens instanceof TMLWriteChannel) {
+                TMLWriteChannel elemDuplSensWr = (TMLWriteChannel) sensorTask.getActivityDiagram().get(i);
+                if (elemDuplSensWr.getChannel(0).getDestinationTask() == receiverTask && channelsSensorReceiver.containsKey(elemDuplSensWr.getChannel(0))) {
+                    TMLChannel linkCh = channelsSensorReceiver.get(elemDuplSensWr.getChannel(0));
+                    TMLWriteChannel wrChannel = new TMLWriteChannel(linkCh.getName(), duplicatedSensorTaskA.getReferenceObject());
+                    wrChannel.setNbOfSamples(elemDuplSensWr.getNbOfSamples());
+                    wrChannel.addChannel(linkCh);
+                    for (TMLActivityElement nextElem : elemDuplSens.getNexts()) {
+                        wrChannel.addNext(nextElem);
+                    }
+                    duplicatedSensorTaskA.addElement(wrChannel);
+                    replaceElem.put(elemDuplSens, wrChannel);
+                } else {
+                    TMLActivityElement elemDuplSensNext = elemDuplSens.getNextElement(0);
+                    while(elemDuplSensNext instanceof TMLActivityElementEvent || (elemDuplSensNext instanceof TMLActivityElementChannel && ((TMLWriteChannel)elemDuplSensNext).getChannel(0).getDestinationTask() != receiverTask) || elemDuplSensNext instanceof TMLSendRequest) {
+                        elemDuplSensNext = elemDuplSensNext.getNextElement(0);
+                    }
+                    changeElemNext.put(elemDuplSens, elemDuplSensNext);
+                }
+            } else if (elemDuplSens instanceof TMLActivityElementEvent || elemDuplSens instanceof TMLActivityElementChannel || elemDuplSens instanceof TMLSendRequest) {
+                TMLActivityElement elemDuplSensNext = elemDuplSens.getNextElement(0);
+                while(elemDuplSensNext instanceof TMLActivityElementEvent || (elemDuplSensNext instanceof TMLActivityElementChannel && ((TMLWriteChannel)elemDuplSensNext).getChannel(0).getDestinationTask() != receiverTask) || elemDuplSensNext instanceof TMLSendRequest) {
+                    elemDuplSensNext = elemDuplSensNext.getNextElement(0);
+                }
+                changeElemNext.put(elemDuplSens, elemDuplSensNext);
+            } else {
+                duplicatedSensorTaskA.addElement(elemDuplSens);
+            }
+        }
+        
+        for (int i=0; i < duplicatedSensorTaskA.getElements().size(); i++) {
+            for (int j=0; j < duplicatedSensorTaskA.get(i).getNbNext(); j++) {
+                if (changeElemNext.containsKey(duplicatedSensorTaskA.get(i).getNextElement(j))) {
+                    duplicatedSensorTaskA.get(i).setNewNext(duplicatedSensorTaskA.get(i).getNextElement(j), changeElemNext.get(duplicatedSensorTaskA.get(i).getNextElement(j)));
+                }
+                if (replaceElem.containsKey(duplicatedSensorTaskA.get(i).getNextElement(j))) {
+                    duplicatedSensorTaskA.get(i).setNewNext(duplicatedSensorTaskA.get(i).getNextElement(j), replaceElem.get(duplicatedSensorTaskA.get(i).getNextElement(j)));
+                }
+            }
+        }
+        boolean findStart = false;
+        for (int i=0; i < duplicatedSensorTaskA.getElements().size(); i++) {
+            TMLActivityElement elemDuplSens = duplicatedSensorTaskA.get(i);
+            if (elemDuplSens instanceof TMLStartState) {
+                duplicatedSensorTaskA.setFirst(elemDuplSens);
+                findStart = true;
+                break;
+            }
+        }
+        if (!findStart) {
+            TMLStartState startDuplicatedSensor = new TMLStartState("start", duplicatedSensorTaskA.getReferenceObject());
+            duplicatedSensorTaskA.setFirst(startDuplicatedSensor);
+            for (int i=0; i < sensorTask.getActivityDiagram().getFirst().getNbNext(); i++) {
+                TMLActivityElement nextStart = corrElemNext.get(sensorTask.getActivityDiagram().getFirst().getNextElement(i));
+                if (changeElemNext.containsKey(nextStart)) {
+                    nextStart = changeElemNext.get(nextStart);
+                }
+                if (replaceElem.containsKey(nextStart)) {
+                    nextStart = changeElemNext.get(nextStart);
+                }
+                startDuplicatedSensor.addNext(nextStart);
+            }
+        } 
+
+        for (int i=0; i < duplicatedSensorTaskA.getElements().size(); i++) {
+            if (duplicatedSensorTaskA.get(i) instanceof TMLDelay) {
+                TMLDelay delay = (TMLDelay)duplicatedSensorTaskA.get(i);
+                delay.setMaxDelay("10");
+                delay.setMinDelay("10");
+                delay.setValue("10");
+            }
+        }
+
+        // Update Architecture
+        HwExecutionNode hwOfSensor = _tmap.getHwNodeOf(sensorTask);
+        if (hwOfSensor != null) {
+            _tmap.addTaskToHwExecutionNode(duplicatedSensorTask, hwOfSensor);
+        }
+        for (TMLChannel ch : _channelsBetweenSensorAndReceiver) { 
+            for (HwCommunicationNode commNode : _tmap.getAllCommunicationNodesOfChannel(ch)) {
+                _tmap.addCommToHwCommNode(channelsSensorReceiver.get(ch), commNode);
+            }
+        }
+        
+        return _tmap;
+    }
+
+    TMLMapping<?> tmrIntegration(TMLMapping<?> _tmap, List<TMLChannel> _channelsBetweenSensorsAndReceiver, List<String> _parameters) {
+        if (_channelsBetweenSensorsAndReceiver.size() == 0) {
+            TraceManager.addDev("No channels between sensors and receiver");
+            return _tmap;
+        }
+        // Check if all channels have the same Destination Task (the same receiver)
+        TMLTask receiverTask = _channelsBetweenSensorsAndReceiver.get(0).getDestinationTask();
+        boolean _isSameDestTask = true;
+        for (int i = 1 ; i < _channelsBetweenSensorsAndReceiver.size() ; i++) {
+            if (_channelsBetweenSensorsAndReceiver.get(i).getDestinationTask() != receiverTask) {
+                _isSameDestTask = false;
+                break;
+            }
+        }
+        if (!_isSameDestTask) {
+            TraceManager.addDev("Sensors are not connected to the same receiver");
+            return _tmap;
+        }
+        TMLModeling<?> _tmlm = _tmap.getTMLModeling();
+        // List Sensors Tasks
+        List<TMLTask> sensorsTasks = new ArrayList<TMLTask>();
+        for (TMLChannel channelSensorReceiver : _channelsBetweenSensorsAndReceiver) {
+            sensorsTasks.add(channelSensorReceiver.getOriginTask());
+        }
+        // Create an Interpreter Task for each sensor
+        List<TMLTask> interpretersTasks = new ArrayList<TMLTask>();
+        for (TMLChannel channelSensorReceiver : _channelsBetweenSensorsAndReceiver) {
+            TMLTask sensorTask = channelSensorReceiver.getOriginTask();
+            TMLTask interpreterTask = new TMLTask("Interpreter_" + channelSensorReceiver.getName(), receiverTask.getReferenceObject(), null);
+            TMLAttribute calTime = new TMLAttribute("calculationTimeInterpreter", new TMLType(TMLType.NATURAL), _parameters.get(0));
+            interpreterTask.addAttribute(calTime);
+            _tmlm.addTask(interpreterTask);
+
+            // Add attributes of Sensor to Interpreter
+            interpreterTask.getAttributes().addAll(sensorTask.getAttributes());
+
+            // set channel Destination (that was between Sensor and receiver) to Interpreter
+            channelSensorReceiver.setDestinationTask(interpreterTask);
+            channelSensorReceiver.setPorts(channelSensorReceiver.getOriginPort(), new TMLPort(channelSensorReceiver.getName(), channelSensorReceiver.getReferenceObject()));
+            interpreterTask.addReadTMLChannel(channelSensorReceiver);
+
+            // Create new channel between interpreter and voter
+            TMLChannel channelInterpreterToVoter = new TMLChannel(channelSensorReceiver.getOriginPort().getName() + "_ChInterpreter", interpreterTask.getReferenceObject());
+            channelInterpreterToVoter.setPorts(new TMLPort(channelInterpreterToVoter.getName(), channelInterpreterToVoter.getReferenceObject()), new TMLPort(channelInterpreterToVoter.getName(), channelInterpreterToVoter.getReferenceObject()));
+            // set Interpreter as Origin of channelInterpreterToVoter
+            channelInterpreterToVoter.setOriginTask(interpreterTask);
+            channelInterpreterToVoter.setType(TMLChannel.BRBW);
+            channelInterpreterToVoter.setSize(channelSensorReceiver.getSize());
+            channelInterpreterToVoter.setMax(channelSensorReceiver.getMax());
+            interpreterTask.addWriteTMLChannel(channelInterpreterToVoter);
+            _tmlm.addChannel(channelInterpreterToVoter);
+
+            // Create new event between interpreter and voter
+            TMLEvent evtInterpreter = new TMLEvent(channelSensorReceiver.getOriginPort().getName() + "_EvtInterpreter", interpreterTask.getReferenceObject(), 1, true);
+            evtInterpreter.setPorts(new TMLPort(evtInterpreter.getName(), evtInterpreter.getReferenceObject()), new TMLPort(evtInterpreter.getName(), evtInterpreter.getReferenceObject()));
+            // set Interpreter as Origin of evtInterpreter
+            evtInterpreter.setOriginTask(interpreterTask);
+            interpreterTask.addTMLEvent(evtInterpreter);
+            _tmlm.addEvent(evtInterpreter);
+
+            //Build Activity Diagram for Interpreter
+            TMLActivity interpreterA = interpreterTask.getActivityDiagram();
+            TMLStartState startInterpreter = new TMLStartState("start", interpreterA.getReferenceObject());
+            interpreterA.setFirst(startInterpreter);
+            // Add New loop Forever
+            TMLForLoop lForEverLoop = new TMLForLoop("loopForever", interpreterA.getReferenceObject());
+            lForEverLoop.setInfinite(true);
+            interpreterA.addElement(lForEverLoop);
+            startInterpreter.addNext(lForEverLoop);
+            
+            // Add New Read Channel
+            TMLReadChannel readChannel = new TMLReadChannel(channelSensorReceiver.getOriginPort().getName(), interpreterA.getReferenceObject());
+            readChannel.setNbOfSamples("1");
+            readChannel.addChannel(channelSensorReceiver);
+            interpreterA.addElement(readChannel);
+            lForEverLoop.addNext(readChannel);
+            
+            // Add New ExecC Opt
+            TMLExecC execCOpt = new TMLExecC("execC", interpreterA.getReferenceObject());
+            execCOpt.setValue(calTime.getName());
+            execCOpt.setAction(calTime.getName());
+            interpreterA.addElement(execCOpt);
+            readChannel.addNext(execCOpt);
+
+            // Add New Send Event
+            TMLSendEvent sendEvt = new TMLSendEvent("evt_" + channelSensorReceiver.getOriginPort().getName(), interpreterA.getReferenceObject());
+            sendEvt.setEvent(evtInterpreter);
+            interpreterA.addElement(sendEvt);
+            execCOpt.addNext(sendEvt);
+
+            // Add New Write Channel
+            TMLWriteChannel writeChInterpreter = new TMLWriteChannel("res_" + channelSensorReceiver.getOriginPort().getName(), interpreterA.getReferenceObject());
+            writeChInterpreter.setNbOfSamples("1");
+            writeChInterpreter.addChannel(channelInterpreterToVoter);
+            interpreterA.addElement(writeChInterpreter);
+            sendEvt.addNext(writeChInterpreter);
+
+            //Add Stop
+            TMLStopState stop = new TMLStopState("stop", interpreterA.getReferenceObject());
+            interpreterA.addElement(stop);
+            writeChInterpreter.addNext(stop);
+
+            //Add Stop for LoopforEver
+            TMLStopState stopLoopInterpreter = new TMLStopState("stop", interpreterA.getReferenceObject());
+            interpreterA.addElement(stopLoopInterpreter);
+            lForEverLoop.addNext(stopLoopInterpreter);
+
+            interpretersTasks.add(interpreterTask);
+        }
+
+        // Add a Timer Task for Voter
+        String prefixName = "";
+        for (TMLTask sensorTask : sensorsTasks) {
+            prefixName += sensorTask.getName() + "_";
+        }
+        //prefixName = prefixName.substring(0, prefixName.length() - 1);
+        prefixName += _channelsBetweenSensorsAndReceiver.get(0).getName();
+        String timerTaskName = "Timer_" + prefixName;
+        TMLTask timerTask = new TMLTask(timerTaskName, receiverTask.getReferenceObject(), null);
+        TMLAttribute timeOutReceivingData = new TMLAttribute("dataReceivingTimeout", new TMLType(TMLType.NATURAL), _parameters.get(1));
+  
+        timerTask.addAttribute(timeOutReceivingData);
+        _tmlm.addTask(timerTask);
+        
+        // Create new Event evtTimeout
+        TMLEvent evtTimer = new TMLEvent("evtTimeout_" + prefixName, timerTask.getReferenceObject(), 1, true);
+        evtTimer.setPorts(new TMLPort(evtTimer.getName(), evtTimer.getReferenceObject()), new TMLPort(evtTimer.getName(), evtTimer.getReferenceObject()));
+        // set Origin of Event to Timer 
+        evtTimer.setOriginTask(timerTask); 
+        timerTask.addTMLEvent(evtTimer);
+        _tmlm.addEvent(evtTimer);
+
+        // Build Activity Diagram For Timer
+        TMLActivity timerA = timerTask.getActivityDiagram();
+        TMLStartState startTimer = new TMLStartState("start", timerA.getReferenceObject());
+        timerA.setFirst(startTimer);
+        // Add new Loop Forever
+        TMLForLoop lForEverLoopTimer = new TMLForLoop("foreverLoop", timerA.getReferenceObject());
+        lForEverLoopTimer.setInfinite(true);
+        timerA.addElement(lForEverLoopTimer);
+        startTimer.addNext(lForEverLoopTimer);
+
+        // Add new Delay
+        TMLDelay delayTimeOut = new TMLDelay("delay", timerA.getReferenceObject());
+        delayTimeOut.setActiveDelay(true);
+        delayTimeOut.setMaxDelay(timeOutReceivingData.getName());
+        delayTimeOut.setMinDelay(timeOutReceivingData.getName());
+        delayTimeOut.setUnit("ns");
+        timerA.addElement(delayTimeOut);
+        lForEverLoopTimer.addNext(delayTimeOut);
+
+        // Add new Send Event
+        TMLSendEvent sendEventTimer = new TMLSendEvent("send" + evtTimer.getName(), timerA.getReferenceObject());
+        sendEventTimer.setEvent(evtTimer);
+        timerA.addElement(sendEventTimer);
+        delayTimeOut.addNext(sendEventTimer);
+
+        // Add new Stop
+        TMLStopState stopTimer = new TMLStopState("stop", timerA.getReferenceObject());
+        timerA.addElement(stopTimer);
+        sendEventTimer.addNext(stopTimer);
+
+        //Add Stop for LoopforEver
+        TMLStopState stopLoopTimer = new TMLStopState("stop", timerA.getReferenceObject());
+        timerA.addElement(stopLoopTimer);
+        lForEverLoopTimer.addNext(stopLoopTimer);
+
+
+        // Create Voter 
+        String voterTaskName = "Voter_" + prefixName;
+        TMLTask voterTask = new TMLTask(voterTaskName, receiverTask.getReferenceObject(), null);
+        TMLAttribute computationTimeVoter = new TMLAttribute("computationTimeVoter",  new TMLType(TMLType.NATURAL), _parameters.get(2));
+        voterTask.addAttribute(computationTimeVoter);
+        TMLAttribute resVoter = new TMLAttribute("res_" + prefixName ,  new TMLType(TMLType.BOOLEAN));
+        voterTask.addAttribute(resVoter);
+        _tmlm.addTask(voterTask);
+        
+        // set evtTimer as Destination Event to Voter Task (from Timer)
+        evtTimer.setDestinationTask(voterTask);
+        voterTask.addTMLEvent(evtTimer);
+
+        // set Destination Event and channel to Voter task (From interpreters)
+        for (TMLTask interpreterTask : interpretersTasks) {
+            // Destination event
+            interpreterTask.getSendEvents().get(0).getEvent().setDestinationTask(voterTask);
+            voterTask.addTMLEvent(interpreterTask.getSendEvents().get(0).getEvent());
+
+            //Destination channel
+            interpreterTask.getWriteChannels().get(0).getChannel(0).setDestinationTask(voterTask);
+            voterTask.addReadTMLChannel(interpreterTask.getWriteChannels().get(0).getChannel(0));
+            interpreterTask.getWriteChannels().get(0).getChannel(0).setPorts(new TMLPort(interpreterTask.getWriteChannels().get(0).getChannel(0).getName(), interpreterTask.getWriteChannels().get(0).getChannel(0).getReferenceObject()), new TMLPort(interpreterTask.getWriteChannels().get(0).getChannel(0).getName(), interpreterTask.getWriteChannels().get(0).getChannel(0).getReferenceObject()));
+        }   
+
+        //Create new Event moveto_FAIL_SAFE
+        TMLEvent evtResVoter = new TMLEvent("moveto_FAIL_SAFE_" + prefixName, voterTask.getReferenceObject(), 1, true);
+        evtResVoter.setPorts(new TMLPort(evtResVoter.getName(), evtResVoter.getReferenceObject()), new TMLPort(evtResVoter.getName(), evtResVoter.getReferenceObject()));
+        evtResVoter.addParam(new TMLType(TMLType.BOOLEAN));
+        // set Voter as Origin of evtResVoter
+        evtResVoter.setOriginTask(voterTask); 
+        voterTask.addTMLEvent(evtResVoter);
+        _tmlm.addEvent(evtResVoter);
+
+        // Create new Channel between Voter and Receiver Task
+        TMLChannel channelResultVoterReceiver = new TMLChannel("result_" + prefixName, voterTask.getReferenceObject());
+        channelResultVoterReceiver.setPorts(new TMLPort(channelResultVoterReceiver.getName(), channelResultVoterReceiver.getReferenceObject()), new TMLPort(channelResultVoterReceiver.getName(), channelResultVoterReceiver.getReferenceObject()));
+        channelResultVoterReceiver.setType(TMLChannel.BRBW);
+        channelResultVoterReceiver.setSize(_channelsBetweenSensorsAndReceiver.get(0).getSize());
+        channelResultVoterReceiver.setMax(_channelsBetweenSensorsAndReceiver.get(0).getMax());
+        
+        // set Voter as Origin of channelResultVoterReceiver
+        channelResultVoterReceiver.setOriginTask(voterTask); 
+        voterTask.addWriteTMLChannel(channelResultVoterReceiver);
+        _tmlm.addChannel(channelResultVoterReceiver);
+
+        // Build Activity Diagram For Voter
+        TMLActivity voterA = voterTask.getActivityDiagram();
+        TMLStartState startVoter = new TMLStartState("start", voterA.getReferenceObject());
+        voterA.setFirst(startVoter);
+        // Add new Loop Forever
+        TMLForLoop lForEverLoopVoter = new TMLForLoop("foreverLoop", voterA.getReferenceObject());
+        lForEverLoopVoter.setInfinite(true);
+        voterA.addElement(lForEverLoopVoter);
+        startVoter.addNext(lForEverLoopVoter);
+
+        // Add new Loop 
+        TMLForLoop loopEvtsVoter = new TMLForLoop("loop", voterA.getReferenceObject());
+        String counterEvtsFromInterpreters = "counter_" + prefixName;
+        TMLAttribute counterEvtsFromInterpretersAttrib = new TMLAttribute(counterEvtsFromInterpreters,  new TMLType(TMLType.NATURAL), "0");
+        voterTask.addAttribute(counterEvtsFromInterpretersAttrib);
+
+        loopEvtsVoter.setInit(counterEvtsFromInterpreters + " = 0");
+        loopEvtsVoter.setCondition(counterEvtsFromInterpreters + "<" + _channelsBetweenSensorsAndReceiver.size());
+        loopEvtsVoter.setIncrement("");
+        voterA.addElement(loopEvtsVoter);
+        lForEverLoopVoter.addNext(loopEvtsVoter);
+
+
+        // Add new Select Event
+        TMLSelectEvt selectEvtVoter = new TMLSelectEvt("selectEvent", voterA.getReferenceObject());
+        voterA.addElement(selectEvtVoter);
+        loopEvtsVoter.addNext(selectEvtVoter);
+        List<String> boolAttributesForEvtsName = new ArrayList<String>();
+        for (TMLTask interpreterTask : interpretersTasks) {
+            // Add new Wait event from an interpreter
+            TMLWaitEvent waitEventFromInterpreter = new TMLWaitEvent("waitEventFromInterpreter", voterA.getReferenceObject());
+            waitEventFromInterpreter.setEvent(interpreterTask.getEventSet().iterator().next());
+            voterA.addElement(waitEventFromInterpreter);
+            selectEvtVoter.addNext(waitEventFromInterpreter);
+
+            // Add new Read Channel from an interpreter
+            TMLReadChannel readChFromInterpreter = new TMLReadChannel("readChannelFromInterpreter", voterA.getReferenceObject());
+            readChFromInterpreter.setNbOfSamples("1");
+            readChFromInterpreter.addChannel(interpreterTask.getWriteChannels().get(0).getChannel(0));
+            voterA.addElement(readChFromInterpreter);
+            waitEventFromInterpreter.addNext(readChFromInterpreter);
+
+            // Add new Choice
+            TMLChoice choiceVoter = new TMLChoice("choice", voterA.getReferenceObject());
+
+            TMLAttribute isEventAlreadyReceived = new TMLAttribute("isEvt"+ interpreterTask.getName()+"Received",  new TMLType(TMLType.BOOLEAN), "false");
+            voterTask.addAttribute(isEventAlreadyReceived);
+
+            choiceVoter.addGuard(isEventAlreadyReceived.getName()+" == false");
+            voterA.addElement(choiceVoter);
+            readChFromInterpreter.addNext(choiceVoter);
+
+            // Add new Action State increment counter
+            TMLActionState actionIncrementCounterVoter = new TMLActionState("actionState", voterA.getReferenceObject());
+            actionIncrementCounterVoter.setAction(counterEvtsFromInterpreters + " = " + counterEvtsFromInterpreters + " + 1");
+            voterA.addElement(actionIncrementCounterVoter);
+            choiceVoter.addNext(actionIncrementCounterVoter);
+
+            // Add new Action State put attrib isEventAlreadyReceived to True 
+            TMLActionState actionFromAttribIsEventAlreadyReceived = new TMLActionState("actionState", voterA.getReferenceObject());
+            actionFromAttribIsEventAlreadyReceived.setAction(isEventAlreadyReceived.getName() + " = true");
+            boolAttributesForEvtsName.add(isEventAlreadyReceived.getName());
+            voterA.addElement(actionFromAttribIsEventAlreadyReceived);
+            actionIncrementCounterVoter.addNext(actionFromAttribIsEventAlreadyReceived);
+
+            // Add new Stop
+            TMLStopState stopVoter = new TMLStopState("stop", voterA.getReferenceObject());
+            voterA.addElement(stopVoter);
+            actionFromAttribIsEventAlreadyReceived.addNext(stopVoter);
+
+        }
+        
+        // Add new Wait event from an Timer
+        TMLWaitEvent waitEventFromTimer = new TMLWaitEvent("waitEventFromTimer", voterA.getReferenceObject());
+        waitEventFromTimer.setEvent(evtTimer);
+        voterA.addElement(waitEventFromTimer);
+        selectEvtVoter.addNext(waitEventFromTimer);
+
+        // Add new Action State change counter
+        TMLActionState actionChangeCounterVoter = new TMLActionState("actionChangeCounterVoter", voterA.getReferenceObject());
+        actionChangeCounterVoter.setAction(counterEvtsFromInterpreters + " = " + _channelsBetweenSensorsAndReceiver.size());
+        voterA.addElement(actionChangeCounterVoter);
+        waitEventFromTimer.addNext(actionChangeCounterVoter);
+
+        // Add new Stop
+        TMLStopState stopVoterAfterTimerEvt = new TMLStopState("stop", voterA.getReferenceObject());
+        voterA.addElement(stopVoterAfterTimerEvt);
+        actionChangeCounterVoter.addNext(stopVoterAfterTimerEvt);
+
+        // Add new Sequence
+        TMLSequence squenceVoter = new TMLSequence("sequence", voterA.getReferenceObject());
+        voterA.addElement(squenceVoter);
+        loopEvtsVoter.addNext(squenceVoter);
+
+        for (String boolAttributesForEvt : boolAttributesForEvtsName) {
+            // Add new Action State put attributes isEventAlreadyReceived to False 
+            TMLActionState actionFromAttribIsEventAlreadyReceived = new TMLActionState("actionState" + boolAttributesForEvt, voterA.getReferenceObject());
+            actionFromAttribIsEventAlreadyReceived.setAction(boolAttributesForEvt + " = false");
+            voterA.getElements().lastElement().addNext(actionFromAttribIsEventAlreadyReceived);
+            voterA.addElement(actionFromAttribIsEventAlreadyReceived);
+        }
+
+        // Add New ExecC Opt for Voter
+        TMLExecC execCOptVoter = new TMLExecC("execC", voterA.getReferenceObject());
+        execCOptVoter.setValue(computationTimeVoter.getName());
+        execCOptVoter.setAction(computationTimeVoter.getName());
+        voterA.getElements().lastElement().addNext(execCOptVoter);
+        voterA.addElement(execCOptVoter);
+        
+
+        // Add New Choice for Voter
+        TMLChoice choiceResVoter = new TMLChoice("choice", voterA.getReferenceObject());
+        voterA.addElement(choiceResVoter);
+        execCOptVoter.addNext(choiceResVoter);
+
+        // Add new Action State put result to True 
+        TMLActionState actionResAttribToTrue = new TMLActionState("actionResAttribToTrue", voterA.getReferenceObject());
+        actionResAttribToTrue.setAction(resVoter.getName() + " = true");
+        voterA.addElement(actionResAttribToTrue);
+        choiceResVoter.addGuard("");
+        choiceResVoter.addNext(actionResAttribToTrue);
+
+        // Add new Stop
+        TMLStopState stopAfterResTrueVoter = new TMLStopState("stop", voterA.getReferenceObject());
+        voterA.addElement(stopAfterResTrueVoter);
+        actionResAttribToTrue.addNext(stopAfterResTrueVoter);
+
+        // Add new Action State put result to False 
+        TMLActionState actionResAttribToFalse = new TMLActionState("actionResAttribToFalse", voterA.getReferenceObject());
+        actionResAttribToFalse.setAction(resVoter.getName() + " = false");
+        voterA.addElement(actionResAttribToFalse);
+        choiceResVoter.addGuard("");
+        choiceResVoter.addNext(actionResAttribToFalse);
+
+        // Add new Stop
+        TMLStopState stopAfterResFalseVoter = new TMLStopState("stop", voterA.getReferenceObject());
+        voterA.addElement(stopAfterResFalseVoter);
+        actionResAttribToFalse.addNext(stopAfterResFalseVoter);
+
+        // Add new Send Event with res in Parameter
+        TMLSendEvent sendEventResVoter = new TMLSendEvent("send" + evtResVoter.getName(), voterA.getReferenceObject());
+        sendEventResVoter.addParam(resVoter.getName());
+        sendEventResVoter.setEvent(evtResVoter);
+        voterA.addElement(sendEventResVoter);
+        squenceVoter.addNext(sendEventResVoter);
+
+        // Add new Write Channel
+        TMLWriteChannel writeChVoter = new TMLWriteChannel("write" + channelResultVoterReceiver.getName(), voterA.getReferenceObject());
+        writeChVoter.setNbOfSamples("1");
+        writeChVoter.addChannel(channelResultVoterReceiver);
+        voterA.addElement(writeChVoter);
+        sendEventResVoter.addNext(writeChVoter);
+
+        // Add new Stop
+        TMLStopState stopVoter = new TMLStopState("stop", voterA.getReferenceObject());
+        voterA.addElement(stopVoter);
+        writeChVoter.addNext(stopVoter);
+
+        //Add Stop for LoopforEver
+        TMLStopState stopLoopVoter = new TMLStopState("stop", voterA.getReferenceObject());
+        voterA.addElement(stopLoopVoter);
+        lForEverLoopVoter.addNext(stopLoopVoter);
+
+
+        // Receiver Updates
+
+        //Add Attribute
+        receiverTask.addAttribute(resVoter);
+
+        // Add new Read Channel to Receiver from Voter
+        channelResultVoterReceiver.setDestinationTask(receiverTask);
+        receiverTask.addReadTMLChannel(channelResultVoterReceiver);
+        
+
+        // Add new Wait Event to Receiver from Voter
+        evtResVoter.setDestinationTask(receiverTask);
+        receiverTask.addTMLEvent(evtResVoter);
+
+    
+        // Update Activity Diagram Receiver
+        TMLActivity receiverA = receiverTask.getActivityDiagram();
+        
+        int index_ch = 0;
+        List<TMLActivityElement> elemsToAdd = new ArrayList<TMLActivityElement>();
+        List<TMLActivityElement> elemsToRemove = new ArrayList<TMLActivityElement>();
+        for (TMLChannel ch : _channelsBetweenSensorsAndReceiver) {
+            for (TMLActivityElement elemReceiverA : receiverA.getElements()) {
+                if (elemReceiverA instanceof TMLReadChannel) {
+                    TMLReadChannel readElemReceiverA = (TMLReadChannel) elemReceiverA;
+                    if (readElemReceiverA.hasChannel(ch)) {
+                        List <TMLActivityElement> nextElems = elemReceiverA.getNexts();
+                        TMLActivityElement prevElem =  receiverA.getPrevious(elemReceiverA);
+                        if (index_ch == 0) {
+                            // Replace the channel from the first sensor connected to the receiver into the result Channel from Voter 
+  
+                            // Add new Wait event to Receiver from Voter
+                            TMLWaitEvent waitEventFromVoter = new TMLWaitEvent("waitEventFromVoter", receiverA.getReferenceObject());
+                            waitEventFromVoter.setEvent(evtResVoter);
+                            waitEventFromVoter.addParam(resVoter.getName());
+                            prevElem.setNewNext(elemReceiverA, waitEventFromVoter);
+                            elemsToAdd.add(waitEventFromVoter);
+                            
+                            // Replace the Read Channel of Receiver to the channel from Voter
+                            readElemReceiverA.replaceChannelWith(ch, channelResultVoterReceiver);
+                            waitEventFromVoter.addNext(readElemReceiverA);
+                        } else {
+                            // Delete channels connected to the receiver from the other sensors
+                            prevElem.removeNext(elemReceiverA);
+                            for (TMLActivityElement nextElem : nextElems) {
+                                prevElem.addNext(nextElem);
+                            }
+                            elemsToRemove.add(readElemReceiverA);
+                        }
+                    }
+                }
+            }
+            index_ch += 1;
+        }
+        for (TMLActivityElement elemToAdd : elemsToAdd) {
+            receiverA.addElement(elemToAdd);
+        }
+        for (TMLActivityElement elemToRemove : elemsToRemove) {
+            receiverA.removeElement(elemToRemove);
+        }
+        
+        // Remove from receiver channels that come from sensors
+        for (TMLChannel ch : receiverTask.getReadTMLChannels()) {
+            if (_channelsBetweenSensorsAndReceiver.contains(ch)) {
+                receiverTask.getReadTMLChannels().remove(ch);
+            }
+        }
+
+        // Update Architecture 
+        TMLArchitecture _tmlarch =  _tmap.getArch();
+        // New CPU for the Voter and interpreters Tasks 
+        HwCPU _cpuVoter = new HwCPU("CPU_" + voterTaskName);
+        // New Memory for the Voter and interpreters Channels 
+        HwMemory _memoryVoter = new HwMemory("Memory_" + voterTaskName);
+        // New Bridge for the Voter and interpreters Channels 
+        HwBridge _bridgeVoter = new HwBridge("Brigde_" + voterTaskName);
+        // New Bus for the Voter and interpreters Channels 
+        HwBus _busVoter = new HwBus("Bus_" + voterTaskName);
+
+        //Update Memory Voter properties
+        HwMemory memoryOfChannelSensor = _tmap.getMemoryOfChannel(_channelsBetweenSensorsAndReceiver.get(0));
+        if (memoryOfChannelSensor != null) {
+            _memoryVoter.byteDataSize = memoryOfChannelSensor.byteDataSize;
+            _memoryVoter.clockRatio = memoryOfChannelSensor.clockRatio;
+            _memoryVoter.bufferType = memoryOfChannelSensor.bufferType;
+        }
+        HwExecutionNode hwOfReceiver = _tmap.getHwNodeOf(receiverTask);
+        if (hwOfReceiver != null) {
+            if (hwOfReceiver instanceof HwCPU) {
+                HwCPU cpuOfReceiver = (HwCPU) hwOfReceiver;
+                //Update CPU Voter properties
+                _cpuVoter.byteDataSize = cpuOfReceiver.byteDataSize;
+                _cpuVoter.pipelineSize = cpuOfReceiver.pipelineSize;
+                _cpuVoter.goIdleTime = cpuOfReceiver.goIdleTime;
+                _cpuVoter.taskSwitchingTime = cpuOfReceiver.taskSwitchingTime;
+                _cpuVoter.branchingPredictionPenalty = cpuOfReceiver.branchingPredictionPenalty;
+                _cpuVoter.execiTime = cpuOfReceiver.execiTime;
+                HwLink linkBridgeVoterBusReceiver = new HwLink("link");
+                for (HwLink link : _tmlarch.getHwLinks()) {
+                    if (link.hwnode == cpuOfReceiver) {
+                        HwBus busOfReceiver = link.bus;
+                        // Add link BridgeVoter and BusReceiver
+                        linkBridgeVoterBusReceiver = new HwLink("link_" + _bridgeVoter.getName() + "_to_" + busOfReceiver.getName());
+                        linkBridgeVoterBusReceiver.bus = busOfReceiver;
+                        linkBridgeVoterBusReceiver.hwnode = _bridgeVoter;
+                        
+                    }
+                }
+                if (linkBridgeVoterBusReceiver.bus != null) {
+                    _tmlarch.addHwLink(linkBridgeVoterBusReceiver);
+                }
+            }
+        }
+        // Add New HWs to the architecture
+        _tmlarch.addHwNode(_cpuVoter);
+        _tmlarch.addHwNode(_memoryVoter);
+        _tmlarch.addHwNode(_bridgeVoter);
+        _tmlarch.addHwNode(_busVoter);
+        
+        // Add link CPUVoter and BusVoter
+        HwLink linkCPUBusVoter = new HwLink("link_" + _cpuVoter.getName() + "_to_" + _busVoter.getName());
+        linkCPUBusVoter.bus = _busVoter;
+        linkCPUBusVoter.hwnode = _cpuVoter;
+        _tmlarch.addHwLink(linkCPUBusVoter);
+        // Add link MemoryVoter and BusVoter
+        HwLink linkMemoryBusVoter = new HwLink("link_" + _memoryVoter.getName() + "_to_" + _busVoter.getName());
+        linkMemoryBusVoter.bus = _busVoter;
+        linkMemoryBusVoter.hwnode = _memoryVoter;
+        _tmlarch.addHwLink(linkMemoryBusVoter);
+        // Add link BridgeVoter and BusVoter
+        HwLink linkBridgeBusVoter = new HwLink("link_" + _bridgeVoter.getName() + "_to_" + _busVoter.getName());
+        linkBridgeBusVoter.bus = _busVoter;
+        linkBridgeBusVoter.hwnode = _bridgeVoter;
+        _tmlarch.addHwLink(linkBridgeBusVoter);
+        
+        // Mapping Voter, Timer and interpreters Tasks To CPUVoter
+        _tmap.addTaskToHwExecutionNode(voterTask, _cpuVoter);
+        _tmap.addTaskToHwExecutionNode(timerTask, _cpuVoter);
+        
+        for (TMLTask interpreterTask : interpretersTasks) {
+            _tmap.addTaskToHwExecutionNode(interpreterTask, _cpuVoter);
+        }
+        
+        // Mapping Voter and interpreters Channels To MemoryVoter
+        for (TMLTask interpreterTask : interpretersTasks) {
+            for (TMLChannel writeChannelInterpreter : interpreterTask.getWriteTMLChannels()) {
+                _tmap.addCommToHwCommNode(writeChannelInterpreter, _memoryVoter);
+                _tmap.addCommToHwCommNode(writeChannelInterpreter, _busVoter);
+                for (HwCommunicationNode mappedNode : _tmap.getAllCommunicationNodesOfChannel(_channelsBetweenSensorsAndReceiver.get(0))) {
+                    if (mappedNode instanceof HwBus) {
+                        _tmap.addCommToHwCommNode(writeChannelInterpreter, mappedNode);
+                    }   
+                }
+            }
+        }
+        
+        _tmap.addCommToHwCommNode(channelResultVoterReceiver, _memoryVoter);
+        _tmap.addCommToHwCommNode(channelResultVoterReceiver, _busVoter);
+        for (HwCommunicationNode mappedNode : _tmap.getAllCommunicationNodesOfChannel(_channelsBetweenSensorsAndReceiver.get(0))) {
+            if (mappedNode instanceof HwBus) {
+                _tmap.addCommToHwCommNode(channelResultVoterReceiver, mappedNode);
+            }   
+        }
+        
+        return _tmap;
+    }
+}
diff --git a/src/main/java/tmltranslator/patternhandling/TaskPattern.java b/src/main/java/tmltranslator/patternhandling/TaskPattern.java
new file mode 100644
index 0000000000000000000000000000000000000000..cb48dfaf28a131eec3a614f7060f7403b052cb2c
--- /dev/null
+++ b/src/main/java/tmltranslator/patternhandling/TaskPattern.java
@@ -0,0 +1,216 @@
+/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
+ *
+ * ludovic.apvrille AT enst.fr
+ *
+ * This software is a computer program whose purpose is to allow the
+ * edition of TURTLE analysis, design and deployment diagrams, to
+ * allow the generation of RT-LOTOS or Java code from this diagram,
+ * and at last to allow the analysis of formal validation traces
+ * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
+ * from INRIA Rhone-Alpes.
+ *
+ * This software is governed by the CeCILL  license under French law and
+ * abiding by the rules of distribution of free software.  You can  use,
+ * modify and/ or redistribute the software under the terms of the CeCILL
+ * license as circulated by CEA, CNRS and INRIA at the following URL
+ * "http://www.cecill.info".
+ *
+ * As a counterpart to the access to the source code and  rights to copy,
+ * modify and redistribute granted by the license, users are provided only
+ * with a limited warranty  and the software's author,  the holder of the
+ * economic rights,  and the successive licensors  have only  limited
+ * liability.
+ *
+ * In this respect, the user's attention is drawn to the risks associated
+ * with loading,  using,  modifying and/or developing or reproducing the
+ * software by the user in light of its specific status of free software,
+ * that may mean  that it is complicated to manipulate,  and  that  also
+ * therefore means  that it is reserved for developers  and  experienced
+ * professionals having in-depth computer knowledge. Users are therefore
+ * encouraged to load and test the software's suitability as regards their
+ * requirements in conditions enabling the security of their systems and/or
+ * data to be ensured and,  more generally, to use and operate it in the
+ * same conditions as regards security.
+ *
+ * The fact that you are presently reading this means that you have had
+ * knowledge of the CeCILL license and that you accept its terms.
+ */
+
+
+package tmltranslator.patternhandling;
+/**
+ * Class TaskPattern
+ * 
+ * Creation: 28/08/2023
+ *
+ * @author Jawher JERRAY
+ * @version 1.0 28/08/2023
+ */
+ 
+import tmltranslator.*;
+
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.*;
+
+import org.json.JSONArray;
+
+ 
+public class TaskPattern {
+    private List<AttributeTaskJsonFile> attributes;
+    private List<PortTaskJsonFile> internalPorts;
+    private List<PortTaskJsonFile> externalPorts;
+
+    public TaskPattern(List<AttributeTaskJsonFile> attributes, List<PortTaskJsonFile>  internalPorts, List<PortTaskJsonFile>  externalPorts) {
+        this.attributes = attributes;
+        this.internalPorts = internalPorts;
+        this.externalPorts = externalPorts;
+    }
+
+    public List<AttributeTaskJsonFile> getAttributes() {
+        return attributes;
+    }
+
+    public List<PortTaskJsonFile> getInternalPorts() {
+        return internalPorts;
+    }
+
+    public List<PortTaskJsonFile> getExternalPorts() {
+        return externalPorts;
+    }
+
+    public static LinkedHashMap<String, TaskPattern> parsePatternJsonFile(String pathPatternFoler, String fileName) {
+        Path jsonFilePath = Path.of(pathPatternFoler+"/"+fileName);
+        String jsonFilecontent = "";
+        LinkedHashMap<String, TaskPattern> tasksPattern = new LinkedHashMap<String, TaskPattern>();
+        try {
+            jsonFilecontent = Files.readString(jsonFilePath, Charset.defaultCharset());
+        } catch (IOException ioExc) {
+        } 
+        
+        JSONArray patternTasks = new JSONArray(jsonFilecontent);
+        for (int i = 0; i < patternTasks.length(); i++) {
+            String taskName = patternTasks.getJSONObject(i).getString(PatternCreation.NAME);
+            
+            JSONArray attributes = patternTasks.getJSONObject(i).getJSONArray(PatternCreation.ATTRIBUTES);
+            List<AttributeTaskJsonFile> attributeTaskList = new ArrayList<AttributeTaskJsonFile>();
+            for (int j = 0; j < attributes.length(); j++) {
+                String attribName = attributes.getJSONObject(j).getString(PatternCreation.NAME);
+                String attribType = attributes.getJSONObject(j).getString(PatternCreation.TYPE);
+                String attribValue = attributes.getJSONObject(j).getString(PatternCreation.VALUE);
+                AttributeTaskJsonFile attributeTaskJsonFile = new AttributeTaskJsonFile(attribName, attribType, attribValue);
+                attributeTaskList.add(attributeTaskJsonFile);
+            }
+            //patternTasksAttributes.put(taskName, attributeTaskList);
+
+            JSONArray externalPorts = patternTasks.getJSONObject(i).getJSONArray(PatternCreation.EXTERNALPORTS);
+            List<PortTaskJsonFile> externalPortsTaskList = new ArrayList<PortTaskJsonFile>();
+            for (int j = 0; j < externalPorts.length(); j++) {
+                String externalPortName = externalPorts.getJSONObject(j).getString(PatternCreation.NAME);
+                String externalPortType = externalPorts.getJSONObject(j).getString(PatternCreation.TYPE);
+                String externalPortMode = externalPorts.getJSONObject(j).getString(PatternCreation.MODE);
+                PortTaskJsonFile externalPortTaskJsonFile = new PortTaskJsonFile(externalPortName, externalPortType, externalPortMode);
+                if (externalPorts.getJSONObject(j).has(PatternCreation.CONFIDENTIALITY)) {
+                    externalPortTaskJsonFile.setConfidentiality(externalPorts.getJSONObject(j).getString(PatternCreation.CONFIDENTIALITY));
+                }
+                if (externalPorts.getJSONObject(j).has(PatternCreation.AUTHENTICITY)) {
+                    externalPortTaskJsonFile.setAuthenticity(externalPorts.getJSONObject(j).getString(PatternCreation.AUTHENTICITY));
+                }
+                externalPortsTaskList.add(externalPortTaskJsonFile);
+            }
+            //patternTasksExternalPorts.put(taskName, externalPortsTaskList);
+
+            JSONArray internalPorts = patternTasks.getJSONObject(i).getJSONArray(PatternCreation.INTERNALPORTS);
+            List<PortTaskJsonFile> internalPortsTaskList = new ArrayList<PortTaskJsonFile>();
+            for (int j = 0; j < internalPorts.length(); j++) {
+                String internalPortName = internalPorts.getJSONObject(j).getString(PatternCreation.NAME);
+                String internalPortType = internalPorts.getJSONObject(j).getString(PatternCreation.TYPE);
+                String internalPortMode = internalPorts.getJSONObject(j).getString(PatternCreation.MODE);
+                PortTaskJsonFile internalPortTaskJsonFile = new PortTaskJsonFile(internalPortName, internalPortType, internalPortMode);
+                if (internalPorts.getJSONObject(j).has(PatternCreation.CONFIDENTIALITY)) {
+                    internalPortTaskJsonFile.setConfidentiality(internalPorts.getJSONObject(j).getString(PatternCreation.CONFIDENTIALITY));
+                }
+                if (internalPorts.getJSONObject(j).has(PatternCreation.AUTHENTICITY)) {
+                    internalPortTaskJsonFile.setAuthenticity(internalPorts.getJSONObject(j).getString(PatternCreation.AUTHENTICITY));
+                }
+                internalPortsTaskList.add(internalPortTaskJsonFile);
+            }
+            //patternTasksInternalPorts.put(taskName, internalPortsTaskList);
+            TaskPattern taskPattern = new TaskPattern(attributeTaskList, internalPortsTaskList, externalPortsTaskList);
+            tasksPattern.put(taskName, taskPattern);
+        }
+        return tasksPattern;
+    }
+
+    public void removeExternalPort(String port) {
+        PortTaskJsonFile exPortToRemove = null; 
+        for (PortTaskJsonFile exPort : externalPorts) {
+            if (exPort.getName().equals(port)) {
+                exPortToRemove = exPort;
+            }
+        }
+        externalPorts.remove(exPortToRemove);
+    }
+
+    public static LinkedHashMap<String, TaskPattern> getPatternTasksLeft(LinkedHashMap<String, TaskPattern> _patternTasksAll, List<PatternConnection> patternConnections) {
+        LinkedHashMap<String, TaskPattern> patternTasksLeft = new LinkedHashMap<String, TaskPattern>();
+        for (String taskPattern: _patternTasksAll.keySet()) {
+            for (PortTaskJsonFile portTask : _patternTasksAll.get(taskPattern).getExternalPorts()) {
+                boolean isPortMapped = false;
+                for (PatternConnection patternConnection: patternConnections) {
+                    if (taskPattern.equals(patternConnection.getPatternTaskName()) && portTask.getName().equals(patternConnection.getPatternChannel())) {
+                        isPortMapped = true;
+                        break;
+                    }
+                }
+                if (!isPortMapped) {
+                    if (patternTasksLeft.containsKey(taskPattern)) {
+                        patternTasksLeft.get(taskPattern).getExternalPorts().add(portTask);
+                    } else {
+                        List<PortTaskJsonFile> portsExternal = new ArrayList<PortTaskJsonFile>();
+                        List<PortTaskJsonFile> portsInternal = new ArrayList<PortTaskJsonFile>();
+                        List<AttributeTaskJsonFile> attributes = new ArrayList<AttributeTaskJsonFile>();
+                        portsExternal.add(portTask);
+                        TaskPattern tp = new TaskPattern(attributes, portsInternal, portsExternal);
+                        patternTasksLeft.put(taskPattern, tp);
+                    }
+                }
+            }
+        }
+        /*for (String taskPattern: _patternTasksAll.keySet()) {
+            TaskPattern tp = new TaskPattern(_patternTasksAll.get(taskPattern).getAttributes(), _patternTasksAll.get(taskPattern).getInternalPorts(), _patternTasksAll.get(taskPattern).getExternalPorts());
+            patternTasksLeft.put(taskPattern, tp);
+        }
+        
+        for (String taskPattern: _patternTasksAll.keySet()) {
+            TraceManager.addDev("_patternTasks: task=" + taskPattern);
+            for (PortTaskJsonFile portTask : _patternTasksAll.get(taskPattern).getExternalPorts()) {
+                TraceManager.addDev("Port=" + portTask.getName());
+            }
+            if (_patternTasksAll.get(taskPattern).getExternalPorts().size() == 0) {
+                patternTasksLeft.remove(taskPattern);
+            }
+        }
+        for (PatternConnection patternConnection: patternConnections) {
+            TraceManager.addDev("patternConnection=" + patternConnection.getStringDisplay());
+            if (patternTasksLeft.containsKey(patternConnection.getPatternTaskName())) {
+                patternTasksLeft.get(patternConnection.getPatternTaskName()).removeExternalPort(patternConnection.getPatternChannel());
+                if (patternTasksLeft.get(patternConnection.getPatternTaskName()).getExternalPorts().size() == 0) {
+                    patternTasksLeft.remove(patternConnection.getPatternTaskName());
+                }
+            }
+        }*/
+        return patternTasksLeft;
+    }
+
+    public PortTaskJsonFile getExternalPortByName(String portName) {
+        for (PortTaskJsonFile exPort : externalPorts) {
+            if (exPort.getName().equals(portName)) {
+                return exPort;
+            }
+        }
+        return null;
+    }
+}
diff --git a/src/main/java/tmltranslator/patternhandling/TaskPorts.java b/src/main/java/tmltranslator/patternhandling/TaskPorts.java
new file mode 100644
index 0000000000000000000000000000000000000000..4365b9a5f9407291450cf792d53006be4f48e62d
--- /dev/null
+++ b/src/main/java/tmltranslator/patternhandling/TaskPorts.java
@@ -0,0 +1,223 @@
+/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
+ *
+ * ludovic.apvrille AT enst.fr
+ *
+ * This software is a computer program whose purpose is to allow the
+ * edition of TURTLE analysis, design and deployment diagrams, to
+ * allow the generation of RT-LOTOS or Java code from this diagram,
+ * and at last to allow the analysis of formal validation traces
+ * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
+ * from INRIA Rhone-Alpes.
+ *
+ * This software is governed by the CeCILL  license under French law and
+ * abiding by the rules of distribution of free software.  You can  use,
+ * modify and/ or redistribute the software under the terms of the CeCILL
+ * license as circulated by CEA, CNRS and INRIA at the following URL
+ * "http://www.cecill.info".
+ *
+ * As a counterpart to the access to the source code and  rights to copy,
+ * modify and redistribute granted by the license, users are provided only
+ * with a limited warranty  and the software's author,  the holder of the
+ * economic rights,  and the successive licensors  have only  limited
+ * liability.
+ *
+ * In this respect, the user's attention is drawn to the risks associated
+ * with loading,  using,  modifying and/or developing or reproducing the
+ * software by the user in light of its specific status of free software,
+ * that may mean  that it is complicated to manipulate,  and  that  also
+ * therefore means  that it is reserved for developers  and  experienced
+ * professionals having in-depth computer knowledge. Users are therefore
+ * encouraged to load and test the software's suitability as regards their
+ * requirements in conditions enabling the security of their systems and/or
+ * data to be ensured and,  more generally, to use and operate it in the
+ * same conditions as regards security.
+ *
+ * The fact that you are presently reading this means that you have had
+ * knowledge of the CeCILL license and that you accept its terms.
+ */
+
+
+package tmltranslator.patternhandling;
+/**
+ * Class TaskPorts
+ * 
+ * Creation: 07/09/2023
+ *
+ * @author Jawher JERRAY
+ * @version 1.0 07/09/2023
+ */
+ 
+import tmltranslator.*;
+
+import java.util.*;
+
+public class TaskPorts {
+    public final static int WRITE_CHANNEL = 1;
+    public final static int READ_CHANNEL = 2;
+    public final static int SEND_EVENT = 3;
+    public final static int WAIT_EVENT = 4;
+
+    private List<String> writeChannels = new ArrayList<String>();
+    private List<String> readChannels = new ArrayList<String>();
+    private List<String> sendEvents = new ArrayList<String>();
+    private List<String> waitEvents = new ArrayList<String>();
+
+    public TaskPorts(List<String> writeChannels, List<String> readChannels, List<String> sendEvents, List<String> waitEvents) {
+        this.writeChannels = writeChannels;
+        this.readChannels = readChannels;
+        this.sendEvents = sendEvents;
+        this.waitEvents = waitEvents;
+    }
+
+
+    public List<String> getWriteChannels() {
+        return writeChannels;
+    }
+
+    public List<String> getReadChannels() {
+        return readChannels;
+    }
+
+    public List<String> getSendEvents() {
+        return sendEvents;
+    }
+
+    public List<String> getWaitEvents() {
+        return waitEvents;
+    }
+
+    public void removePort(String port) {
+        writeChannels.remove(port);
+        readChannels.remove(port);
+        sendEvents.remove(port);
+        waitEvents.remove(port);
+    }
+
+    public static LinkedHashMap<String, TaskPorts> getListPortsTask(TMLModeling<?> tmlmodel) {
+        LinkedHashMap<String, TaskPorts> listPortsTask = new LinkedHashMap<String, TaskPorts>();
+        for (TMLTask task : tmlmodel.getTasks()) {
+            List<String> writeChannels = new ArrayList<String>();
+            List<String> readChannels = new ArrayList<String>();
+            List<String> sendEvents = new ArrayList<String>();
+            List<String> waitEvents = new ArrayList<String>();
+            
+            for (TMLWriteChannel wc : task.getWriteChannels()) {
+                if (!writeChannels.contains(wc.getChannel(0).getName())) {
+                    writeChannels.add(wc.getChannel(0).getName());
+                }
+            }
+            for (TMLReadChannel rc : task.getReadChannels()) {
+                if (!readChannels.contains(rc.getChannel(0).getName())) {
+                    readChannels.add(rc.getChannel(0).getName());
+                }
+            }
+            for (TMLSendEvent se : task.getSendEvents()) {
+                if (!sendEvents.contains(se.getEvent().getName())) {
+                    sendEvents.add(se.getEvent().getName());
+                }
+            }
+            for (TMLWaitEvent we : task.getWaitEvents()) {
+                if (!waitEvents.contains(we.getEvent().getName())) {
+                    waitEvents.add(we.getEvent().getName());
+                }
+            }
+            TaskPorts portTask = new TaskPorts(writeChannels, readChannels, sendEvents, waitEvents);
+            listPortsTask.put(task.getName(), portTask);
+        }
+        return listPortsTask;
+    }
+
+    public static TaskPorts cloneTaskPort(TaskPorts taskPorts) {
+        List<String> wcs = new ArrayList<String>(taskPorts.getWriteChannels());
+        List<String> rcs = new ArrayList<String>(taskPorts.getReadChannels());
+        List<String> ses = new ArrayList<String>(taskPorts.getSendEvents());
+        List<String> wes = new ArrayList<String>(taskPorts.getWaitEvents());
+        return new TaskPorts(wcs, rcs, ses, wes);
+    }
+
+    public int getPortTypeByName(String portName) {
+        if (writeChannels.contains(portName)) {
+            return WRITE_CHANNEL;
+        } else if (readChannels.contains(portName)) {
+            return READ_CHANNEL;
+        } else if (sendEvents.contains(portName)) {
+            return SEND_EVENT;
+        } else if (waitEvents.contains(portName)) {
+            return WAIT_EVENT;
+        }
+        return 0;
+    }
+
+    public static LinkedHashMap<String, TaskPorts> getPortsTaskOfModelLeft(LinkedHashMap<String, TaskPorts> _portsTaskOfModelAll, List<PatternConnection> patternConnections) {
+        
+        LinkedHashMap<String, TaskPorts> portsTaskModelLeft = new LinkedHashMap<String, TaskPorts>();
+        for (String task: _portsTaskOfModelAll.keySet()) {
+            List<String> wcs = new ArrayList<String>();
+            List<String> rcs = new ArrayList<String>();
+            List<String> ses = new ArrayList<String>();
+            List<String> wes = new ArrayList<String>();
+            TaskPorts tp = new TaskPorts(wcs, rcs, ses, wes);
+            portsTaskModelLeft.put(task, tp);
+            for (String wr : _portsTaskOfModelAll.get(task).getWriteChannels()) {
+                boolean isMappedPort = false;
+                for (PatternConnection patternConnection: patternConnections) {
+                   if (patternConnection.getModelTaskName().equals(task) && patternConnection.getModelChannelName().equals(wr) && !patternConnection.isNewPort()) {
+                        isMappedPort = true;
+                        break;
+                   }
+                }
+                if (!isMappedPort) {
+                    portsTaskModelLeft.get(task).getWriteChannels().add(wr);
+                }
+            }
+            for (String rd : _portsTaskOfModelAll.get(task).getReadChannels()) {
+                boolean isMappedPort = false;
+                for (PatternConnection patternConnection: patternConnections) {
+                   if (patternConnection.getModelTaskName().equals(task) && patternConnection.getModelChannelName().equals(rd) && !patternConnection.isNewPort()) {
+                        isMappedPort = true;
+                        break;
+                   }
+                }
+                if (!isMappedPort) {
+                    portsTaskModelLeft.get(task).getReadChannels().add(rd);
+                }
+            }
+            for (String se : _portsTaskOfModelAll.get(task).getSendEvents()) {
+                boolean isMappedPort = false;
+                for (PatternConnection patternConnection: patternConnections) {
+                   if (patternConnection.getModelTaskName().equals(task) && patternConnection.getModelChannelName().equals(se) && !patternConnection.isNewPort()) {
+                        isMappedPort = true;
+                        break;
+                   }
+                }
+                if (!isMappedPort) {
+                    portsTaskModelLeft.get(task).getSendEvents().add(se);
+                }
+            }
+            for (String we : _portsTaskOfModelAll.get(task).getWaitEvents()) {
+                boolean isMappedPort = false;
+                for (PatternConnection patternConnection: patternConnections) {
+                   if (patternConnection.getModelTaskName().equals(task) && patternConnection.getModelChannelName().equals(we) && !patternConnection.isNewPort()) {
+                        isMappedPort = true;
+                        break;
+                   }
+                }
+                if (!isMappedPort) {
+                    portsTaskModelLeft.get(task).getWaitEvents().add(we);
+                }
+            }
+        }
+        /*LinkedHashMap<String, TaskPorts> portsTaskModelLeft = new LinkedHashMap<String, TaskPorts>(_portsTaskOfModelAll);
+        for (PatternConnection patternConnection: patternConnections) {
+            if (portsTaskModelLeft.containsKey(patternConnection.getModelTaskName())) {
+                portsTaskModelLeft.get(patternConnection.getModelTaskName()).removePort(patternConnection.getModelChannelName());
+            }
+        }
+        for (PatternConnection patternConnection: patternConnections) {
+            if (portsTaskModelLeft.containsKey(patternConnection.getModelTaskName())) {
+                portsTaskModelLeft.get(patternConnection.getModelTaskName()).removePort(patternConnection.getModelChannelName());
+            }
+        }*/
+        return portsTaskModelLeft;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/tmltranslator/toavatar/FullTML2Avatar.java b/src/main/java/tmltranslator/toavatar/FullTML2Avatar.java
index 5c52f962a13035ea127dd03b402f569957686905..406a4befd47f7076fdc06e2845f4989e59c0ea85 100644
--- a/src/main/java/tmltranslator/toavatar/FullTML2Avatar.java
+++ b/src/main/java/tmltranslator/toavatar/FullTML2Avatar.java
@@ -48,6 +48,8 @@ import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.apache.batik.anim.timing.Trace;
+
 /**
  * Class FullTML2Avatar
  * Creation: 29/02/2016
@@ -374,17 +376,19 @@ public class FullTML2Avatar {
             block.addAttribute(loop_index);
 
             for (TMLAttribute attr : task.getAttributes()) {
-                AvatarType type;
-                if (attr.getType().getType() == TMLType.NATURAL) {
-                    type = AvatarType.INTEGER;
-                } else if (attr.getType().getType() == TMLType.BOOLEAN) {
-                    type = AvatarType.BOOLEAN;
-                } else {
-                    type = AvatarType.UNDEFINED;
+                if (!attr.getName().endsWith("__req")) {
+                    AvatarType type;
+                    if (attr.getType().getType() == TMLType.NATURAL) {
+                        type = AvatarType.INTEGER;
+                    } else if (attr.getType().getType() == TMLType.BOOLEAN) {
+                        type = AvatarType.BOOLEAN;
+                    } else {
+                        type = AvatarType.UNDEFINED;
+                    }
+                    AvatarAttribute avattr = new AvatarAttribute(attr.getName(), type, block, null);
+                    avattr.setInitialValue(attr.getInitialValue());
+                    block.addAttribute(avattr);
                 }
-                AvatarAttribute avattr = new AvatarAttribute(reworkStringName(attr.getName()), type, block, null);
-                avattr.setInitialValue(attr.getInitialValue());
-                block.addAttribute(avattr);
             }
             //AvatarTransition last;
             AvatarStateMachine asm = block.getStateMachine();
diff --git a/src/main/java/tmltranslator/toavatarsec/TML2Avatar.java b/src/main/java/tmltranslator/toavatarsec/TML2Avatar.java
index b129bb5da5dcdfe492a09c13e98fa262a7082c38..54912cb5aee10dff1a478b27e901055d3d83a05e 100644
--- a/src/main/java/tmltranslator/toavatarsec/TML2Avatar.java
+++ b/src/main/java/tmltranslator/toavatarsec/TML2Avatar.java
@@ -78,6 +78,7 @@ public class TML2Avatar {
     boolean security = false;
     private TMLMapping<?> tmlmap;
     private TMLModeling<?> tmlmodel;
+    private Set<SecurityPattern> keysPublicBus = new HashSet<SecurityPattern>();
     private Map<SecurityPattern, List<AvatarAttribute>> symKeys = new HashMap<SecurityPattern, List<AvatarAttribute>>();
     private Map<SecurityPattern, List<AvatarAttribute>> pubKeys = new HashMap<SecurityPattern, List<AvatarAttribute>>();
     private Map<String, String> nameMap = new HashMap<String, String>();
@@ -104,6 +105,12 @@ public class TML2Avatar {
         for (TMLTask t1 : tmlmodel.getTasks()) {
             List<SecurityPattern> keys = new ArrayList<SecurityPattern>();
             accessKeys.put(t1, keys);
+            for (HwLink link : links) {
+                if (link.bus.privacy == HwBus.BUS_PUBLIC &&  link.hwnode instanceof HwMemory) {
+                    List<SecurityPattern> patterns = tmlmap.getMappedPatterns((HwMemory) link.hwnode);
+                    keysPublicBus.addAll(patterns);
+                }
+            }
 
             HwExecutionNode node1 = tmlmap.getHwNodeOf(t1);
             //Try to find memory using only private buses from origin
@@ -1310,7 +1317,7 @@ public class TML2Avatar {
                         }
 
                         secChannelMap.get(ae.securityPattern.name).add(ch.getName());
-                        if (aec.getEncForm()) {
+                        if (!ae.securityPattern.type.equals(SecurityPattern.NONCE_PATTERN)) {
                             as.addValue(ae.securityPattern.name + "_encrypted");
                             AvatarAttribute data = new AvatarAttribute(ae.securityPattern.name + "_encrypted", AvatarType.INTEGER, block, null);
                             block.addAttribute(data);
@@ -1406,7 +1413,7 @@ public class TML2Avatar {
                             AvatarAttribute attr = block.getAvatarAttributeWithName(ch.getOriginPort().getName() + "_chData");
                             if (attr != null) {
                                 attrsToCheck.add(ch.getOriginPort().getName() + "_chData");
-                                avspec.addPragma(new AvatarPragmaSecret("#Confidentiality " + block.getName() + "." + ch.getName() +
+                                avspec.addPragma(new AvatarPragmaSecret("#Confidentiality " + block.getName() + "." + ch.getOriginPort().getName() +
                                         "_chData", ch.getReferenceObject(), attr));
                             }
                         }
@@ -1451,7 +1458,7 @@ public class TML2Avatar {
                     } else {
                         //send encrypted data 
                         //
-                        if (aec.getEncForm()) {
+                        if (!ae.securityPattern.type.equals(SecurityPattern.NONCE_PATTERN)) {
                             as.addValue(ae.securityPattern.name + "_encrypted");
                             AvatarAttribute data = new AvatarAttribute(ae.securityPattern.name + "_encrypted", AvatarType.INTEGER, block, null);
                             block.addAttribute(data);
@@ -1875,17 +1882,19 @@ public class TML2Avatar {
             AvatarAttribute loop_index = new AvatarAttribute("loop_index", AvatarType.INTEGER, block, null);
             block.addAttribute(loop_index);
             for (TMLAttribute attr : task.getAttributes()) {
-                AvatarType type;
-                if (attr.getType().getType() == TMLType.NATURAL) {
-                    type = AvatarType.INTEGER;
-                } else if (attr.getType().getType() == TMLType.BOOLEAN) {
-                    type = AvatarType.BOOLEAN;
-                } else {
-                    type = AvatarType.UNDEFINED;
+                if (!attr.getName().endsWith("__req")) {
+                    AvatarType type;
+                    if (attr.getType().getType() == TMLType.NATURAL) {
+                        type = AvatarType.INTEGER;
+                    } else if (attr.getType().getType() == TMLType.BOOLEAN) {
+                        type = AvatarType.BOOLEAN;
+                    } else {
+                        type = AvatarType.UNDEFINED;
+                    }
+                    AvatarAttribute avattr = new AvatarAttribute(attr.getName(), type, block, null);
+                    avattr.setInitialValue(attr.getInitialValue());
+                    block.addAttribute(avattr);
                 }
-                AvatarAttribute avattr = new AvatarAttribute(attr.getName(), type, block, null);
-                avattr.setInitialValue(attr.getInitialValue());
-                block.addAttribute(avattr);
             }
             //AvatarTransition last;
             AvatarStateMachine asm = block.getStateMachine();
@@ -1895,6 +1904,27 @@ public class TML2Avatar {
                 //Create iteration attribute
                 AvatarAttribute req_loop_index = new AvatarAttribute("req_loop_index", AvatarType.INTEGER, block, null);
                 block.addAttribute(req_loop_index);
+                for (Object obj : tmlmodel.getRequestsToMe(task)) {
+                    TMLRequest req = (TMLRequest) obj;
+                    for (int i = 0; i < req.getNbOfParams(); i++) {
+                        if (block.getAvatarAttributeWithName(req.getParam(i)) == null) {
+                            AvatarType type;
+                            if (req.getParam(i).matches("-?\\d+")) {
+                                type = AvatarType.INTEGER;
+                            } else if (req.getParam(i).matches("(?i)^(true|false)")) {
+                                type = AvatarType.BOOLEAN;
+                            } else {
+                                type = AvatarType.UNDEFINED;
+                            }
+                            String nameNewAtt = "arg"+ (i+1) +"_req";
+                            if (block.getAvatarAttributeWithName(nameNewAtt) == null) {
+                                AvatarAttribute avattr = new AvatarAttribute(nameNewAtt, type, block, null);
+                                avattr.setInitialValue(req.getParam(i));
+                                block.addAttribute(avattr);
+                            }
+                        }
+                    }
+                }
 
                 //TMLRequest request= tmlmodel.getRequestToMe(task);
                 //Oh this is fun...let's restructure the state machine
@@ -1922,7 +1952,7 @@ public class TML2Avatar {
 
                 for (AvatarStateMachineElement e : elementList) {
                     e.setName(processName(e.getName(), e.getID()));
-                    stateObjectMap.put(task.getName().split("__")[1] + "__" + e.getName(), e.getReferenceObject());
+                    stateObjectMap.put(task.getName().split("__")[task.getName().split("__").length-1] + "__" + e.getName(), e.getReferenceObject());
 
                     if (e instanceof AvatarStopState) {
                         //ignore it
@@ -1976,25 +2006,8 @@ public class TML2Avatar {
 						block.addAttribute(requestData);*/
                     for (int i = 0; i < req.getNbOfParams(); i++) {
                         if (block.getAvatarAttributeWithName(req.getParam(i)) == null) {
-                            //Throw Error
-                            AvatarType type;
-                            if (req.getParam(i).matches("-?\\d+")) {
-                                type = AvatarType.INTEGER;
-                            } else if (req.getParam(i).matches("(?i)^(true|false)")) {
-                                type = AvatarType.BOOLEAN;
-                            } else {
-                                type = AvatarType.UNDEFINED;
-                            }
-                            String nameNewAtt = req.getName() + "_" + req.getID() + "_" + i + "_" + req.getParam(i);
-                            if (block.getAvatarAttributeWithName(nameNewAtt) == null) {
-                                AvatarAttribute avattr = new AvatarAttribute(nameNewAtt, type, block, null);
-                                avattr.setInitialValue(req.getParam(i));
-                                block.addAttribute(avattr);
-                                as.addValue(avattr.getName());
-                                TraceManager.addDev("Missing Attribute " + req.getParam(i));
-                            } else {
-                                as.addValue(block.getAvatarAttributeWithName(nameNewAtt).getName());
-                            }
+                            String nameNewAtt = "arg"+ (i+1) +"_req";
+                            as.addValue(block.getAvatarAttributeWithName(nameNewAtt).getName());
                         } else {
                             //	Add parameter to signal and actiononsignal
                             as.addValue(req.getParam(i));
@@ -2030,7 +2043,7 @@ public class TML2Avatar {
                 for (AvatarStateMachineElement e : elementList) {
                     e.setName(processName(e.getName(), e.getID()));
                     asm.addElement(e);
-                    stateObjectMap.put(task.getName().split("__")[1] + "__" + e.getName(), e.getReferenceObject());
+                    stateObjectMap.put(task.getName().split("__")[task.getName().split("__").length-1] + "__" + e.getName(), e.getReferenceObject());
                 }
                 asm.setStartState((AvatarStartState) elementList.get(0));
             }
@@ -2065,7 +2078,6 @@ public class TML2Avatar {
 
         }
 
-
         // Add authenticity pragmas
         for (String s : signalAuthOriginMap.keySet()) {
             for (AvatarAttributeState attributeStateOrigin : signalAuthOriginMap.get(s)) {
@@ -2463,7 +2475,20 @@ public class TML2Avatar {
                 for (AvatarAttribute key : symKeys.get(sp)) {
                     keys = keys + " " + key.getBlock().getName() + "." + key.getName();
                 }
-                avspec.addPragma(new AvatarPragmaInitialKnowledge("#InitialSessionKnowledge " + keys, null, symKeys.get(sp), true));
+                avspec.addPragma(new AvatarPragmaInitialKnowledge("#InitialSystemKnowledge " + keys, null, symKeys.get(sp), true));
+            }
+        }
+        
+        for (SecurityPattern sp : keysPublicBus) {
+            for (TMLTask taskPattern : tmlmodel.securityTaskMap.get(sp)) {
+                AvatarBlock b = taskBlockMap.get(taskPattern);
+                AvatarAttribute attrib = b.getAvatarAttributeWithName("key_"+sp.getName());
+                if (attrib!=null) {
+                    LinkedList<AvatarAttribute> arguments = new LinkedList<AvatarAttribute>();
+                    arguments.add(attrib);
+                    avspec.addPragma(new AvatarPragmaPublic("#Public " + b.getName() + "." + attrib.getName(), null, arguments));
+                }
+                
             }
         }
         for (SecurityPattern sp : pubKeys.keySet()) {
diff --git a/src/main/java/ui/ActionPerformer.java b/src/main/java/ui/ActionPerformer.java
index 33c663d9e1fe2537c2c8c0308020dc9dee6885c3..3e11a673fb801e37cbd5857a85d770c1c0d2b531 100644
--- a/src/main/java/ui/ActionPerformer.java
+++ b/src/main/java/ui/ActionPerformer.java
@@ -367,6 +367,8 @@ public class ActionPerformer {
             mgui.avatarStaticAnalysis();
         } else if (command.equals(mgui.actions[TGUIAction.ACT_AVATAR_EXECUTABLE_GENERATION].getActionCommand())) {
             mgui.avatarExecutableCodeGeneration();
+        } else if (command.equals(mgui.actions[TGUIAction.ACT_PATTERN_HANDLING].getActionCommand())) {
+            mgui.patternHandling();
 
             // AVATAR BD
         } else if (command.equals(mgui.actions[TGUIAction.ABD_BLOCK].getActionCommand())) {
diff --git a/src/main/java/ui/ActivityDiagram2TMLTranslator.java b/src/main/java/ui/ActivityDiagram2TMLTranslator.java
index 33d77df48c7e692a145803649b649ccd4ece21a5..118ec4a97d76f17f6d363e47f17f1e400bd205c0 100644
--- a/src/main/java/ui/ActivityDiagram2TMLTranslator.java
+++ b/src/main/java/ui/ActivityDiagram2TMLTranslator.java
@@ -375,7 +375,7 @@ public class ActivityDiagram2TMLTranslator {
                         } else {
                             tmlreadchannel = new TMLReadChannel("read channel", tgc);
                             tmlreadchannel.setNbOfSamples(modifyString(((TMLADReadChannel) tgc).getSamplesValue()));
-                            tmlreadchannel.setEncForm(((TMLADReadChannel) tgc).getEncForm());
+                            // tmlreadchannel.setEncForm(((TMLADReadChannel) tgc).getEncForm());
                             tmlreadchannel.addChannel(channel);
                             //security pattern
                             if (securityPatterns.get(((TMLADReadChannel) tgc).getSecurityContext()) != null) {
@@ -411,7 +411,6 @@ public class ActivityDiagram2TMLTranslator {
                             if (tmltask.isAttacker()) {
                                 tmlreadchannel.setAttacker(true);
                             }
-                            activity.addElement(tmlreadchannel);
                             addElement(activity, tmlreadchannel, tgc);
                             ((BasicErrorHighlight) tgc).setStateAction(ErrorHighlight.OK);
                             corrTgElement.addCor(tmlreadchannel, tgc);
@@ -763,7 +762,7 @@ public class ActivityDiagram2TMLTranslator {
 
                         tmlwritechannel = new TMLWriteChannel("write channel", tgc);
                         tmlwritechannel.setNbOfSamples(modifyString(((TMLADWriteChannel) tgc).getSamplesValue()));
-                        tmlwritechannel.setEncForm(((TMLADWriteChannel) tgc).getEncForm());
+                        // tmlwritechannel.setEncForm(((TMLADWriteChannel) tgc).getEncForm());
 
 
                         for (int i = 0; i < channels.length; i++) {
diff --git a/src/main/java/ui/DrawerTMAPModeling.java b/src/main/java/ui/DrawerTMAPModeling.java
index b2f85a693ee36c7d83994bca83839517ba012e44..b7f371d4417c1fcfaf17cafa3cf17dbb0b4fe5a9 100644
--- a/src/main/java/ui/DrawerTMAPModeling.java
+++ b/src/main/java/ui/DrawerTMAPModeling.java
@@ -46,6 +46,7 @@ import ui.tmlcompd.TMLCPortConnector;
 import ui.tmldd.*;
 
 import java.awt.*;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 
@@ -100,6 +101,7 @@ public class DrawerTMAPModeling {
             return;
         }
 
+        tmap.NullifyAutomata();
         TMLSyntaxChecking syntax = new TMLSyntaxChecking(tmap);
         syntax.checkSyntax();
         if (syntax.hasErrors() > 0) {
@@ -309,6 +311,10 @@ public class DrawerTMAPModeling {
             if (splitName.length >= 2) {
                 artifact.setTaskName(splitName[1]);
                 artifact.setReferenceTaskName(splitName[0]);
+            } else if (splitName.length == 1) {
+                String tabName = ((TGComponent)tmap.getTMLModeling().getReference()).getTDiagramPanel().tp.getNameOfTab();
+                artifact.setTaskName(refAndName);
+                artifact.setReferenceTaskName(tabName);
             } else {
                 artifact.setTaskName(refAndName);
             }
@@ -328,30 +334,82 @@ public class DrawerTMAPModeling {
         List<TMLElement> elts = tmap.getMappedCommunicationElement();
 
         check(oncommnodes.size() == elts.size(), "Tasks and execution nodes in mapping should be of the same dimension");
-
-        for(cpt=0; cpt < oncommnodes.size(); cpt ++) {
-            HwCommunicationNode node = oncommnodes.get(cpt);
-            TMLElement elt = elts.get(cpt);
-
-            TGComponent tgc = nodeMap.get(node);
-            check(tgc != null, "No graphical component corresponding to communication node " + node.getName());
-            check(tgc instanceof SwallowTGComponent && tgc instanceof TMLArchiElementInterface,
-                    "Invalid graphical component for task " + node.getName());
-
-            Point p = getRandomCoordinate(tgc);
-            TMLArchiCommunicationArtifact artifact = new TMLArchiCommunicationArtifact(p.x, p.y, panel.getMinX(), panel.getMaxX(),
-                    panel.getMinY(), panel.getMaxY(), false, tgc, panel);
-
-            String refAndName = elt.getName();
-            String[] splitName = refAndName.split("__");
-            if (splitName.length >= 2) {
-                artifact.setCommunicationName(splitName[1]);
-                artifact.setReferenceCommunicationName(splitName[0]);
-            } else {
-                artifact.setCommunicationName(refAndName);
+        boolean isMultiMapping = false;
+        List<TMLElement> mappedElems = new ArrayList<TMLElement>();
+        for (TMLElement elem : elts) {
+            if (!mappedElems.contains(elem)) {
+                if (elem instanceof TMLChannel) {
+                    TMLChannel ch = (TMLChannel) elem;
+                    ArrayList<HwCommunicationNode> commNodes = tmap.getAllCommunicationNodesOfChannel(ch);
+                    for (HwCommunicationNode node : commNodes) {
+                        if (node instanceof HwMemory) {
+                            TGComponent tgc = nodeMap.get(node);
+                            check(tgc != null, "No graphical component corresponding to communication node " + node.getName());
+                            check(tgc instanceof SwallowTGComponent && tgc instanceof TMLArchiElementInterface,
+                                    "Invalid graphical component for task " + node.getName());
+
+                            Point p = getRandomCoordinate(tgc);
+                            TMLArchiCommunicationArtifact artifact = new TMLArchiCommunicationArtifact(p.x, p.y, panel.getMinX(), panel.getMaxX(),
+                                    panel.getMinY(), panel.getMaxY(), false, tgc, panel);
+                            
+                            String refAndName = elem.getName();
+                            String[] splitName = refAndName.split("__");
+                            if (splitName.length >= 2) {
+                                artifact.setCommunicationName(splitName[1]);
+                                artifact.setReferenceCommunicationName(splitName[0]);
+                            } else if (splitName.length == 1) {
+                                String tabName = ((TGComponent)tmap.getTMLModeling().getReference()).getTDiagramPanel().tp.getNameOfTab();
+                                artifact.setCommunicationName(refAndName);
+                                artifact.setReferenceCommunicationName(tabName);
+                            } else {
+                                artifact.setCommunicationName(refAndName);
+                            }
+                            ArrayList<String> otherCommNames = new ArrayList<String>();
+                            for (HwCommunicationNode otherNode : commNodes) {
+                                if (otherNode != node) {
+                                    otherCommNames.add(otherNode.getName());
+                                }
+                            }
+                            artifact.addNewOtherCommunicationNames(otherCommNames);
+                            panel.addComponent(artifact, p.x, p.y, true, true);
+                            isMultiMapping = true;
+                            mappedElems.add(elem);
+                            break;
+                        }
+                    }
+                }
+                if (!isMultiMapping) {
+                    for(cpt=0; cpt < oncommnodes.size(); cpt ++) {
+                        TMLElement elt = elts.get(cpt);
+                        if (elem.equals(elt)) {
+                            HwCommunicationNode node = oncommnodes.get(cpt);
+                        
+                            TGComponent tgc = nodeMap.get(node);
+                            check(tgc != null, "No graphical component corresponding to communication node " + node.getName());
+                            check(tgc instanceof SwallowTGComponent && tgc instanceof TMLArchiElementInterface,
+                                    "Invalid graphical component for task " + node.getName());
+
+                            Point p = getRandomCoordinate(tgc);
+                            TMLArchiCommunicationArtifact artifact = new TMLArchiCommunicationArtifact(p.x, p.y, panel.getMinX(), panel.getMaxX(),
+                                    panel.getMinY(), panel.getMaxY(), false, tgc, panel);
+                            String refAndName = elt.getName();
+                            String[] splitName = refAndName.split("__");
+                            if (splitName.length >= 2) {
+                                artifact.setCommunicationName(splitName[1]);
+                                artifact.setReferenceCommunicationName(splitName[0]);
+                            } else if (splitName.length == 1) {
+                                String tabName = ((TGComponent)tmap.getTMLModeling().getReference()).getTDiagramPanel().tp.getNameOfTab();
+                                artifact.setCommunicationName(refAndName);
+                                artifact.setReferenceCommunicationName(tabName);
+                            } else {
+                                artifact.setCommunicationName(refAndName);
+                            }
+                            panel.addComponent(artifact, p.x, p.y, true, true);
+                        }
+                    }
+                    mappedElems.add(elem);
+                }
             }
-
-            panel.addComponent(artifact, p.x, p.y, true, true);
         }
     }
 
diff --git a/src/main/java/ui/DrawerTMLModeling.java b/src/main/java/ui/DrawerTMLModeling.java
index 2178535d5a59a1500aca8e6f5c7dba26a8a7d138..11bc33f227d0d9804e25a538ea7a394c1054d871 100644
--- a/src/main/java/ui/DrawerTMLModeling.java
+++ b/src/main/java/ui/DrawerTMLModeling.java
@@ -209,6 +209,11 @@ public class DrawerTMLModeling  {
                 }
             }
         }
+        String longName = task.getName();
+        int index = longName.indexOf("__");
+        if (index <= 0) {
+            task.setName(panel.getNameOfTab() + "__" + longName);
+        }
 
     }
 
@@ -281,6 +286,12 @@ public class DrawerTMLModeling  {
             p2.checkWeakAuthStatus = TMLCPrimitivePort.TOCHECK;
         }
 
+        String longName = chan.getName();
+        int index = longName.indexOf("__");
+        if (index <= 0) {
+            chan.setName(panel.getNameOfTab() + "__" + longName);
+        }
+
     }
 
     // Assumes 1 to 1 event
@@ -316,6 +327,12 @@ public class DrawerTMLModeling  {
         // Connecting the ports
         addPortConnector(p1, p2, panel);
 
+        String longName = evt.getName();
+        int index = longName.indexOf("__");
+        if (index <= 0) {
+            evt.setName(panel.getNameOfTab() + "__" + longName);
+        }
+
     }
 
     // Assumes n to 1 requests
@@ -357,6 +374,12 @@ public class DrawerTMLModeling  {
             addPortConnector(p1, p2, panel);
         }
 
+        String longName = req.getName();
+        int index = longName.indexOf("__");
+        if (index <= 0) {
+            req.setName(panel.getNameOfTab() + "__" + longName);
+        }
+
     }
 
     private TMLCChannelOutPort addPort(TGComponent tgc, String name, int portType, boolean isOrigin, boolean isLossy,
@@ -678,6 +701,8 @@ public class DrawerTMLModeling  {
             read.setSamples(readT.getNbOfSamples());
             if (readT.securityPattern != null) {
                 read.setSecurityContext(readT.securityPattern.name);
+                // read.setEncForm(readT.getEncForm());
+                read.setIsAttacker(readT.isAttacker());
             }
             return read;
 
@@ -722,6 +747,8 @@ public class DrawerTMLModeling  {
 
             if (writeT.securityPattern != null) {
                 write.setSecurityContext(writeT.securityPattern.name);
+                // write.setEncForm(writeT.getEncForm());
+                write.setIsAttacker(writeT.isAttacker());
             }
 
             return write;
diff --git a/src/main/java/ui/GTURTLEModeling.java b/src/main/java/ui/GTURTLEModeling.java
index 4e017e9bee6fcad87aa2b793b9da8a100797656c..15dde278071e44f50324277988306753f32691a2 100644
--- a/src/main/java/ui/GTURTLEModeling.java
+++ b/src/main/java/ui/GTURTLEModeling.java
@@ -72,6 +72,13 @@ import sdtranslator.SDTranslator;
 import tmatrix.RequirementModeling;
 import tmltranslator.*;
 import tmltranslator.modelcompiler.TMLModelCompiler;
+import tmltranslator.patternhandling.PatternConfig2Json;
+import tmltranslator.patternhandling.PatternConfiguration;
+import tmltranslator.patternhandling.PatternCreation;
+import tmltranslator.patternhandling.PatternIntegration;
+import tmltranslator.patternhandling.SecurityGenerationForTMAP;
+import tmltranslator.patternhandling.TMRGeneration;
+import tmltranslator.patternhandling.TaskPattern;
 import tmltranslator.toautomata.TML2AUT;
 import tmltranslator.toautomata.TML2AUTviaLOTOS;
 import tmltranslator.toavatar.FullTML2Avatar;
@@ -131,6 +138,7 @@ import ui.tree.*;
 import ui.ucd.UseCaseDiagramPanel;
 import ui.util.DefaultText;
 import ui.util.IconManager;
+import ui.window.JDialogProverifVerification;
 import ui.window.JFrameSimulationTrace;
 import uppaaldesc.UPPAALSpec;
 
@@ -144,6 +152,7 @@ import java.io.*;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.List;
+import java.util.Map.Entry;
 import java.util.*;
 
 // AVATAR
@@ -1613,6 +1622,68 @@ public class GTURTLEModeling {
         hsm.startThread();
     }
 
+    @SuppressWarnings("unchecked")
+    public void addPattern(MainGUI gui, Map<String, List<String>> selectedSensorsTasks, String selectedRecieverTask, String interpretersCompTime, String voterCompTime, String voterTimeOut) {
+        TMRGeneration tmr = new TMRGeneration(selectedSensorsTasks, selectedRecieverTask, interpretersCompTime, voterCompTime, voterTimeOut, tmap);
+        tmap = (TMLMapping<TGComponent>) tmr.startThread();
+        try {
+            String archTabName = ((CorrespondanceTGElement)(tmap.getCorrespondanceList())).getTG(tmap.getArch().getFirstCPU()).getTDiagramPanel().tp.getNameOfTab();
+            String appTabName = ((TGComponent)tmap.getTMLModeling().getReference()).getTDiagramPanel().tp.getNameOfTab();
+            gui.drawTMLAndTMAPSpecification(tmap, appTabName + "_tmr", archTabName + "_tmr");
+        } catch (MalformedTMLDesignException e) {
+            TraceManager.addDev("Error when Drawing TML");
+        }
+    }
+
+    public void createPattern(List<String> selectedTasks, String patternName, String patternsPath) {
+        PatternCreation pattern = new PatternCreation(selectedTasks, patternName, patternsPath, tmap);
+        pattern.startThread();
+    }
+
+    public static void createPatternFromTmap(List<String> selectedTasks, String patternName, String patternsPath, TMLMapping<?> _tmap) {
+        PatternCreation pattern = new PatternCreation(selectedTasks, patternName, patternsPath, _tmap);
+        pattern.startThread();
+    }
+
+    public void integratePattern(MainGUI gui, String patternPath, String patternName) {
+        integratePattern(gui, patternPath, patternName,  patternPath+"/"+patternName+"-config.json");
+    }
+    
+    @SuppressWarnings("unchecked")
+    public void integratePattern(MainGUI gui, String patternPath, String patternName,  String configPatternPath) {
+        String appTabName = ((TGComponent)tmap.getTMLModeling().getReference()).getTDiagramPanel().tp.getNameOfTab();
+        tmap = (TMLMapping<TGComponent>) integratePatternTMAP(appTabName, patternPath, patternName, configPatternPath, tmap);
+        try {
+            String archTabName = ((CorrespondanceTGElement)(tmap.getCorrespondanceList())).getTG(tmap.getArch().getFirstCPU()).getTDiagramPanel().tp.getNameOfTab();
+            gui.drawTMLAndTMAPSpecification(tmap, appTabName + "_" + patternName, archTabName + "_" + patternName);
+        } catch (MalformedTMLDesignException e) {
+            TraceManager.addDev("Error when Drawing TML");
+        }
+    }
+    
+    public static TMLMapping<?> integratePatternTMAP(String appTab, String patternPath, String patternName, String configPatternPath, TMLMapping<?> _tmap) {
+        PatternConfig2Json patternConfig2Json = new PatternConfig2Json(configPatternPath);
+        patternConfig2Json.json2patternConfiguration();
+        PatternConfiguration patternConfiguration = patternConfig2Json.getPaternConfiguration();
+        LinkedHashMap<String, TaskPattern> patternTasks = TaskPattern.parsePatternJsonFile(patternPath, patternName+".json");
+        PatternIntegration patternInteg = new PatternIntegration(appTab, patternPath, patternName, patternConfiguration, patternTasks, _tmap);
+        TMLMapping<?> tmapPattern = patternInteg.startThread();
+        return tmapPattern;
+    }
+
+    public static void createJsonPatternConfigFile(String patternPath, String patternName, PatternConfiguration patternConfiguration) {
+        PatternConfig2Json patternConfig2Json = new PatternConfig2Json(patternPath+"/"+patternName+"-config.json", patternConfiguration);
+        patternConfig2Json.patternConfiguration2Json();
+    }
+
+    public static void createJsonPatternConfigFile(String pathConfigJsonFile, PatternConfiguration patternConfiguration) {
+        if (!pathConfigJsonFile.endsWith(".json")) {
+            pathConfigJsonFile += ".json";
+        }
+        PatternConfig2Json patternConfig2Json = new PatternConfig2Json(pathConfigJsonFile, patternConfiguration);
+        patternConfig2Json.patternConfiguration2Json();
+    }
+    
     @SuppressWarnings("unchecked")
     public boolean generateGraphicalMapping(TMLMapping map) {
         TURTLEPanel tmlap = ((CorrespondanceTGElement)(tmap.getCorrespondanceList())).getTG(tmap.getArch().getFirstCPU()).getTDiagramPanel().tp;
@@ -1705,6 +1776,99 @@ public class GTURTLEModeling {
         return autoSecure(gui, newTabSuffix, tmap, newarch, encComp, overhead, decComp, autoConf, autoWeakAuth, autoStrongAuth, selectedCpuTasks);
     }
 
+    @SuppressWarnings("unchecked")
+    public void autoSecure(MainGUI gui, String encComp, String overhead, String decComp, Vector<String> channelsToAddSec, Map<String, List<String>> selectedCpuTasks) {
+        if (tmap == null) {
+            return;
+        }
+        boolean checkAddSec = false;
+        for (String channelToAddSec : channelsToAddSec) {
+            String channelName = channelToAddSec.split(": ")[0];
+            String secToAdd = channelToAddSec.split(": ")[1];
+            TMLChannel ch = tmap.getTMLModeling().getChannelByShortName(channelName);
+            if (ch != null) {
+                String[] sec = secToAdd.split(" \\+ ");
+                for (String s : sec) {
+                    if (s.equals(JDialogProverifVerification.ADD_CONFIDENTIALITY)) {
+                        ch.setEnsureConf(true);
+                        ch.checkConf = true;
+                        checkAddSec = true;
+                    }
+                    if (s.equals(JDialogProverifVerification.ADD_WEAK_AUTHENTICITY)) {
+                        ch.setEnsureWeakAuth(true);
+                        ch.checkAuth = true;
+                        checkAddSec = true;
+                    }
+                    if (s.equals(JDialogProverifVerification.ADD_STRONG_AUTHENTICITY)) {
+                        ch.setEnsureWeakAuth(true);
+                        ch.setEnsureStrongAuth(true);
+                        ch.checkAuth = true;
+                        checkAddSec = true;
+                    }
+                }
+            }
+        }
+        if (checkAddSec) {
+            String appTabName = ((TGComponent) tmap.getTMLModeling().getReference()).getTDiagramPanel().tp.getNameOfTab();
+            SecurityGenerationForTMAP secgen = new SecurityGenerationForTMAP(appTabName, tmap, encComp, overhead, decComp, selectedCpuTasks);
+            tmap = (TMLMapping<TGComponent>) secgen.startThread();
+            if (tmap != null) 
+                TraceManager.addDev("Map keys Auto");{
+                tmap = (TMLMapping<TGComponent>) secgen.autoMapKeys();
+            }
+            
+            for (TMLTask task : tmap.getTMLModeling().getTasks()) {
+                String[] taskNameSplit = task.getName().split("__");
+                task.setName(taskNameSplit[taskNameSplit.length-1]);
+            }
+            for (TMLChannel ch : tmap.getTMLModeling().getChannels()) {
+                String[] channelNameSplit = ch.getName().split("__");
+                ch.setName(channelNameSplit[channelNameSplit.length-1]);
+            }
+            for (TMLEvent evt : tmap.getTMLModeling().getEvents()) {
+                String[] eventNameSplit = evt.getName().split("__");
+                evt.setName(eventNameSplit[eventNameSplit.length-1]);
+            }
+            for (TMLRequest req : tmap.getTMLModeling().getRequests()) {
+                String[] requestNameSplit = req.getName().split("__");
+                req.setName(requestNameSplit[requestNameSplit.length-1]);
+            }
+
+            try {
+                String archTabName = ((CorrespondanceTGElement)(tmap.getCorrespondanceList())).getTG(tmap.getArch().getFirstCPU()).getTDiagramPanel().tp.getNameOfTab();
+                gui.drawTMLAndTMAPSpecification(tmap, appTabName + "_enc", archTabName + "_enc");
+            } catch (MalformedTMLDesignException e) {
+                TraceManager.addDev("Error when Drawing TML");
+            }
+            for (TMLTask task : tmap.getTMLModeling().getTasks()) {
+                String[] taskNameSplit = task.getName().split("__");
+                if (taskNameSplit.length == 1) {
+                    task.setName(appTabName + "__" + task.getName());
+                }
+            }
+            for (TMLChannel ch : tmap.getTMLModeling().getChannels()) {
+                String[] channelNameSplit = ch.getName().split("__");
+                if (channelNameSplit.length == 1) {
+                    ch.setName(appTabName + "__" + ch.getName());
+                }
+            }
+            for (TMLEvent evt : tmap.getTMLModeling().getEvents()) {
+                String[] eventNameSplit = evt.getName().split("__");
+                if (eventNameSplit.length == 1) {
+                    evt.setName(appTabName + "__" + evt.getName());
+                }
+            }
+            for (TMLRequest req : tmap.getTMLModeling().getRequests()) {
+                String[] requestNameSplit = req.getName().split("__");
+                if (requestNameSplit.length == 1) {
+                    req.setName(appTabName + "__" + req.getName());
+                }
+            }
+        }
+        
+
+    }
+
     public TMLMapping<TGComponent> autoSecure(MainGUI gui, String name, TMLMapping<TGComponent> map, TMLArchiPanel newarch, String encComp, String
             overhead, String decComp) {
         return autoSecure(gui, name, tmap, newarch, encComp, overhead, decComp, true, false, false,
diff --git a/src/main/java/ui/JMenuBarTurtle.java b/src/main/java/ui/JMenuBarTurtle.java
index a72929bbc04ddff20d8294dc2eff2ceac13f90f2..463e3c21e01de15960718afc23e9f6ac25b03c5c 100644
--- a/src/main/java/ui/JMenuBarTurtle.java
+++ b/src/main/java/ui/JMenuBarTurtle.java
@@ -622,6 +622,7 @@ public class JMenuBarTurtle extends JMenuBar {
         menuItem = vAndV.add(mgui.actions[TGUIAction.ACT_AVATAR_FV_STATICANALYSIS]);
         menuItem.setName("V&V Avatar Static Analysis");
         menuItem.addMouseListener(mgui.mouseHandler);
+        
 
         // Code generation
 
@@ -646,6 +647,10 @@ public class JMenuBarTurtle extends JMenuBar {
         menuItem = codeG.add(mgui.actions[TGUIAction.ACT_AVATAR_EXECUTABLE_GENERATION]);
         menuItem.setName("CodeG Executable");
         menuItem.addMouseListener(mgui.mouseHandler);
+
+        menuItem = codeG.add(mgui.actions[TGUIAction.ACT_PATTERN_HANDLING]);
+        menuItem.setName("CodeG Pattern Handling");
+        menuItem.addMouseListener(mgui.mouseHandler);
     
         // View
         menuItem = view.add(mgui.actions[TGUIAction.ACT_VIEW_BIRDEYES_EMB]);
diff --git a/src/main/java/ui/JToolBarMainTurtle.java b/src/main/java/ui/JToolBarMainTurtle.java
index 8ca91acc97caac232d6d303c748f607e1776010f..e97500599f541a384d0dbe59f26117e5f3890f0c 100644
--- a/src/main/java/ui/JToolBarMainTurtle.java
+++ b/src/main/java/ui/JToolBarMainTurtle.java
@@ -71,8 +71,8 @@ public  class JToolBarMainTurtle extends JToolBar implements ActionListener
             -1, TGUIAction.ACT_ZOOM_LESS, TGUIAction.ACT_SHOW_ZOOM, TGUIAction.ACT_ZOOM_MORE, -1, -1, TGUIAction.ACT_MODEL_CHECKING};
 
     // Avatar
-    private JButton  avatarSimu, avatarFVUPPAAL, avatarFVProVerif, avatarFVStaticAnalysis, avatarCodeGeneration, avatarMC;
-    private JMenuItem avatarSimuMI, avatarFVUPPAALMI, avatarFVProVerifMI, avatarFVStaticAnalysisMI, avatarCodeGenerationMI, avatarMCMI;
+    private JButton  avatarSimu, avatarFVUPPAAL, avatarFVProVerif, avatarFVStaticAnalysis, avatarCodeGeneration, avatarMC, patterHandling;
+    private JMenuItem avatarSimuMI, avatarFVUPPAALMI, avatarFVProVerifMI, avatarFVStaticAnalysisMI, avatarCodeGenerationMI, avatarMCMI, patterHandlingMI;
 
     // Other
     private JButton genrtlotos, genlotos, genuppaal, gendesign, genMapping, dse, dseZ3, noc;
@@ -223,6 +223,10 @@ public  class JToolBarMainTurtle extends JToolBar implements ActionListener
         avatarFVStaticAnalysis.addMouseListener(mgui.mouseHandler);
         avatarFVStaticAnalysisMI = addMenu(mgui.actions[TGUIAction.ACT_AVATAR_FV_STATICANALYSIS]);
 
+        patterHandling = add(mgui.actions[TGUIAction.ACT_PATTERN_HANDLING]);
+        patterHandling.addMouseListener(mgui.mouseHandler);
+        patterHandlingMI = addMenu(mgui.actions[TGUIAction.ACT_PATTERN_HANDLING]);
+
 
         addSeparator();
         menu.addSeparator();
@@ -436,6 +440,8 @@ public  class JToolBarMainTurtle extends JToolBar implements ActionListener
         avatarCodeGeneration.setVisible(b);
         avatarFVStaticAnalysisMI.setVisible(b);
         avatarCodeGenerationMI.setVisible(b);
+        patterHandling.setVisible(b);
+        patterHandlingMI.setVisible(b);
 
         if (genrtlotosMI != null) {
             genrtlotosMI.setVisible(!b);
@@ -589,6 +595,8 @@ public  class JToolBarMainTurtle extends JToolBar implements ActionListener
         avatarFVStaticAnalysis.setVisible(!b);
         avatarFVUPPAALMI.setVisible(!b);
         avatarFVStaticAnalysisMI.setVisible(!b);
+        patterHandling.setVisible(!b);
+        patterHandlingMI.setVisible(!b);
 
         if (avatarFVProVerif != null) {
             avatarFVProVerif.setVisible(b);
diff --git a/src/main/java/ui/MainGUI.java b/src/main/java/ui/MainGUI.java
index 2c90314f311148110bda20c26e3d63cb49e0e4a0..5e52a0a94bf4cc62fcb907557cb3be10d57eb39d 100644
--- a/src/main/java/ui/MainGUI.java
+++ b/src/main/java/ui/MainGUI.java
@@ -1932,6 +1932,31 @@ public class MainGUI implements ActionListener, WindowListener, KeyListener, Per
         TraceManager.addDev("Draw TMAP Spec 4");
     }
 
+    public void drawTMLAndTMAPSpecification(TMLMapping tmap, String titleApp, String titleArch) throws MalformedTMLDesignException {
+        DateFormat dateFormat = new SimpleDateFormat("HHmmss");
+        Date date = new Date();
+        String dateAndTime = dateFormat.format(date);
+        String tabNameArch = titleArch + "_" + dateAndTime;
+        String tabNameApp = titleApp + "_" + dateAndTime;
+        
+        TraceManager.addDev("Draw TML Spec 1");
+        int indexApp = createTMLComponentDesign(tabNameApp);
+        TraceManager.addDev("Draw TML Spec 2");
+        TMLComponentDesignPanel tmlcdp = (TMLComponentDesignPanel) (tabs.elementAt(indexApp));
+        TraceManager.addDev("Draw TML Spec 3");
+        DrawerTMLModeling drawerApp = new DrawerTMLModeling(this);
+        drawerApp.drawTMLModelingPanel(tmap.getTMLModeling(), tmlcdp);
+
+        TraceManager.addDev("Draw TMAP Spec 1");
+        int indexArch = createTMLArchitecture(tabNameArch + "_Mapping");
+        TraceManager.addDev("Draw TMAP Spec 2");
+        TMLArchiPanel tmlap = (TMLArchiPanel) (tabs.elementAt(indexArch));
+        TraceManager.addDev("to Draw TMAP Spec 3");
+        DrawerTMAPModeling drawerArch = new DrawerTMAPModeling(this);
+        drawerArch.drawTMAPModelingPanel(tmap, tmlap);
+        TraceManager.addDev("Draw TMAP Spec 4");
+    }
+
     // Creates the status bar.
     private JLabel createStatusBar() {
         status = new JLabel("Ready...");
@@ -5190,6 +5215,21 @@ public class MainGUI implements ActionListener, WindowListener, KeyListener, Per
         dtree.toBeUpdated();
     }
 
+    public void patternHandling() {
+        boolean limit = true;
+        TraceManager.addDev("PATTERN HANDLING");
+        TURTLEPanel tp = this.getCurrentTURTLEPanel();
+        AvatarDesignPanel adp = null;
+        if (tp instanceof AvatarDesignPanel) {
+            adp = (AvatarDesignPanel) tp;
+            limit = false;
+        }
+        JDialogPatternHandling jgen = new JDialogPatternHandling(frame, this, "Pattern Handling", "../ttool/build/resources/main/patterns/");
+        GraphicLib.centerOnParent(jgen, 600, 800);
+        jgen.setVisible(true);
+        dtree.toBeUpdated();
+    }
+
     public void dse() {
         // TraceManager.addDev("Design space exploration");
         JDialogDSE jdse = new JDialogDSE(frame, this, "Design Space Exploration", SpecConfigTTool.SystemCCodeDirectory,
diff --git a/src/main/java/ui/ModeManager.java b/src/main/java/ui/ModeManager.java
index d7d6df2f5c11ac74b8eeae39079195812811acac..e99622e0515cc26b561843d06c82545062b61e36 100644
--- a/src/main/java/ui/ModeManager.java
+++ b/src/main/java/ui/ModeManager.java
@@ -152,6 +152,7 @@ public class ModeManager {
             actions[TGUIAction.ACT_GEN_LOTOS].setEnabled(true);
             if (mgui.getCurrentTURTLEPanel() instanceof TMLArchiPanel) {
                 actions[TGUIAction.ACT_GEN_MAPPING].setEnabled(true);
+                actions[TGUIAction.ACT_PATTERN_HANDLING].setEnabled(true);
             }
             actions[TGUIAction.ACT_DSE].setEnabled(true);
             actions[TGUIAction.ACT_DSE_Z3].setEnabled(true);
@@ -269,6 +270,7 @@ public class ModeManager {
             actions[TGUIAction.ACT_AVATAR_FV_PROVERIF].setEnabled(false);
             actions[TGUIAction.ACT_AVATAR_FV_STATICANALYSIS].setEnabled(false);
             actions[TGUIAction.ACT_AVATAR_EXECUTABLE_GENERATION].setEnabled(false);           
+            actions[TGUIAction.ACT_PATTERN_HANDLING].setEnabled(false);           
             break;
         case MainGUI.METHO_CHANGED:
             actions[TGUIAction.ACT_GEN_RTLOTOS].setEnabled(false);
@@ -319,6 +321,7 @@ public class ModeManager {
             actions[TGUIAction.ACT_AVATAR_FV_PROVERIF].setEnabled(false);
             actions[TGUIAction.ACT_AVATAR_FV_STATICANALYSIS].setEnabled(false);
             actions[TGUIAction.ACT_AVATAR_EXECUTABLE_GENERATION].setEnabled(false);            
+            actions[TGUIAction.ACT_PATTERN_HANDLING].setEnabled(false);            
             break;
 
         case MainGUI.MODEL_SAVED:
diff --git a/src/main/java/ui/SecurityGeneration.java b/src/main/java/ui/SecurityGeneration.java
index 7a50f0ca1ee87f65f70fb99c9cadd9213da0e3cf..bab318ccf8e83512615d91eff9f1fc13dc2c83b0 100644
--- a/src/main/java/ui/SecurityGeneration.java
+++ b/src/main/java/ui/SecurityGeneration.java
@@ -961,7 +961,7 @@ public class SecurityGeneration implements Runnable {
                             TMLADWriteChannel wChannel = (TMLADWriteChannel) tg;
                             if (channel.equals(wChannel.getChannelName()) && wChannel.getSecurityContext().equals("")) {
                                 wChannel.setSecurityContext(channelSecMap.get(channel));
-                                wChannel.setEncForm(true);
+                                // wChannel.setEncForm(true);
 
                             }
                         }
@@ -1059,7 +1059,7 @@ public class SecurityGeneration implements Runnable {
                             TMLADWriteChannel wChannel = (TMLADWriteChannel) tg;
                             if (channel.equals(wChannel.getChannelName()) && wChannel.getSecurityContext().equals("")) {
                                 wChannel.setSecurityContext(channelSecMap.get(channel));
-                                wChannel.setEncForm(true);
+                                // wChannel.setEncForm(true);
                                 tad.repaint();
                             }
                         }
@@ -1097,7 +1097,7 @@ public class SecurityGeneration implements Runnable {
                         continue;
                     }
                     writeChannel.setSecurityContext(channelSecMap.get(chanName));
-                    writeChannel.setEncForm(true);
+                    // writeChannel.setEncForm(true);
                     xpos = chan.getX();
                     ypos = chan.getY();
                     fromStart = tad.findTGConnectorEndingAt(chan.getTGConnectingPointAtIndex(0));
@@ -1129,7 +1129,7 @@ public class SecurityGeneration implements Runnable {
                     //Add write channel operator
                     wr = new TMLADWriteChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
                     wr.setChannelName("data_" + chanName + "_" + task.getName().split("__")[1]);
-                    wr.setEncForm(false);
+                    // wr.setEncForm(false);
                     wr.setSecurityContext(channelSecMap.get(chanName));
                     tad.addComponent(wr, xpos, ypos + yShift, false, true);
 
@@ -1248,7 +1248,7 @@ public class SecurityGeneration implements Runnable {
                         continue;
                     }
                     readChannel.setSecurityContext(channelSecMap.get(chanName));
-                    readChannel.setEncForm(true);
+                    // readChannel.setEncForm(true);
                     xpos = chan.getX() + 1;
                     ypos = chan.getY() + 1;
                     fromStart = tad.findTGConnectorStartingAt(chan.getTGConnectingPointAtIndex(1));
@@ -1364,7 +1364,7 @@ public class SecurityGeneration implements Runnable {
                     TMLADReadChannel rd = new TMLADReadChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
                     rd.setChannelName("retData_" + chanName + "_" + task.getName().split("__")[1]);
                     rd.setSecurityContext(channelSecMap.get(chanName));
-                    rd.setEncForm(false);
+                    // rd.setEncForm(false);
                     tad.addComponent(rd, xpos, ypos + yShift, false, true);
 
                     fromStart.setP2(rd.getTGConnectingPointAtIndex(0));
@@ -1495,7 +1495,7 @@ public class SecurityGeneration implements Runnable {
 
                             if (channel.equals(readChannel.getChannelName()) && readChannel.getSecurityContext().equals("")) {
                                 readChannel.setSecurityContext(channelSecMap.get(readChannel.getChannelName()));
-                                readChannel.setEncForm(true);
+                                // readChannel.setEncForm(true);
 
                             }
                         }
@@ -1595,7 +1595,7 @@ public class SecurityGeneration implements Runnable {
                     //Now add the decrypt operator
                     yShift += 40;
                     readChannel.setSecurityContext(channelSecMap.get(readChannel.getChannelName()));
-                    readChannel.setEncForm(true);
+                    // readChannel.setEncForm(true);
                     tad.repaint();
                     //Add decryption operator if it does not already exist
                     xpos = readChannel.getX();
@@ -1616,7 +1616,7 @@ public class SecurityGeneration implements Runnable {
                             readChannel = (TMLADReadChannel) tg;
                             if (channel.equals(readChannel.getChannelName()) && readChannel.getSecurityContext().equals("")) {
                                 readChannel.setSecurityContext(channelSecMap.get(readChannel.getChannelName()));
-                                readChannel.setEncForm(true);
+                                // readChannel.setEncForm(true);
 
                             }
                         }
@@ -1828,9 +1828,9 @@ public class SecurityGeneration implements Runnable {
                 tad.addComponent(rd, xc, 300, false, true);
 
                 //Recieve plaintext data if encrypting
-                if (ch.secType != HSMChannel.DEC) {
+                /* if (ch.secType != HSMChannel.DEC) {
                     rd.setEncForm(false);
-                }
+                } */
 
                 //Connect choice and readchannel
 
@@ -1868,9 +1868,9 @@ public class SecurityGeneration implements Runnable {
                 wr.setChannelName("retData_" + ch.name + "_" + ch.task);
 
                 //Return plaintext data if decrypting
-                if (ch.secType == HSMChannel.DEC) {
+                /* if (ch.secType == HSMChannel.DEC) {
                     wr.setEncForm(false);
-                }
+                } */
 
 
                 tad.addComponent(wr, xc, 600, false, true);
diff --git a/src/main/java/ui/TGUIAction.java b/src/main/java/ui/TGUIAction.java
index c4f7026fc3de61a6c5d95880cce1730a63641a8b..07ca9f9d8485714b424f07edffa9d0aab32b0428 100644
--- a/src/main/java/ui/TGUIAction.java
+++ b/src/main/java/ui/TGUIAction.java
@@ -678,6 +678,7 @@ public class TGUIAction extends AbstractAction {
     public static final int ACT_AVATAR_FV_PROVERIF = 338;
     public static final int ACT_AVATAR_FV_STATICANALYSIS = 365;
     public static final int ACT_AVATAR_EXECUTABLE_GENERATION = 340;
+    public static final int ACT_PATTERN_HANDLING = 565;
 
     // DSE
     public static final int ACT_GEN_MAPPING = 528;
@@ -731,7 +732,7 @@ public class TGUIAction extends AbstractAction {
 
 
 
-    public static final int NB_ACTION = 565; // Last + 1
+    public static final int NB_ACTION = 566; // Last + 1
 
     private static final TAction [] actions = new TAction[NB_ACTION];
 
@@ -964,6 +965,7 @@ public class TGUIAction extends AbstractAction {
                 IconManager.imgic96, IconManager.imgic96, "Mutual exclusion analysis with invariants",  "Mutual exclusion analysis with invariants",
                 '5');
         actions[ACT_AVATAR_EXECUTABLE_GENERATION] = new TAction("avatar-executable-generation", "Code generation" , IconManager.imgic94, IconManager.imgic94, "Code generation",  "Generation of C-POSIX executable code from AVATAR design under edition", '6');
+        actions[ACT_PATTERN_HANDLING] = new TAction("pattern-handling", "Pattern Handling", IconManager.imgic88, IconManager.imgic88, "Pattern Handling",  "Pattern Handling", '7');
 
 
         actions[ACT_VIEW_JAVA] = new TAction("view-java", "Display Java code", IconManager.imgic38, IconManager.imgic39, "Display Java code",  "Display the java code of the pointed component", 0);
diff --git a/src/main/java/ui/tmlad/TMLADReadCAMS.java b/src/main/java/ui/tmlad/TMLADReadCAMS.java
index 7beb88b006c3f3c4c53b5581271126bf48e0f604..e1f8d4fe2cda47818c78f79e9973130576abbfae 100755
--- a/src/main/java/ui/tmlad/TMLADReadCAMS.java
+++ b/src/main/java/ui/tmlad/TMLADReadCAMS.java
@@ -109,7 +109,7 @@ public class TMLADReadCAMS extends TADComponentWithoutSubcomponents/* Issue #69
 
     public int reachabilityInformation;
 
-	public boolean isEncForm = true;
+	// public boolean isEncForm = true;
 	
     public TMLADReadCAMS(int _x, int _y, int _minX, int _maxX, int _minY, int _maxY, boolean _pos, TGComponent _father, TDiagramPanel _tdp) {
         super(_x, _y, _minX, _maxX, _minY, _maxY, _pos, _father, _tdp);
@@ -200,9 +200,9 @@ public class TMLADReadCAMS extends TADComponentWithoutSubcomponents/* Issue #69
 
         if (!securityContext.equals("")) {
         	c = g.getColor();
-	        if (!isEncForm){
+	        /* if (!isEncForm){
 	        	g.setColor(Color.RED);
-	        }
+	        } */
             g.drawString("sec:" + securityContext, x + 3 * width / 4, y + height + textY1 - decSec);
             g.setColor(c);
         }
@@ -307,14 +307,14 @@ public class TMLADReadCAMS extends TADComponentWithoutSubcomponents/* Issue #69
         tab1.help = help;
 
         TabInfo tab2 = new TabInfo("Security");
-        labels = new String[3];
-        values = new String[3];
+        labels = new String[2];
+        values = new String[2];
         labels[0] = "Security Pattern";
         values[0] = securityContext;
         labels[1] = "Attacker?";
         values[1] = isAttacker ? "Yes" : "No";
-        labels[2] = "Encrypted Form?";
-        values[2] = isEncForm ? "Yes" : "No";        
+        // labels[2] = "Encrypted Form?";
+        // values[2] = isEncForm ? "Yes" : "No";        
         help = new ArrayList<String[]>();
         String[] choice = new String[]{"Yes", "No"};
         help.add(tdp.getMGUI().getCurrentCryptoConfig());
@@ -323,7 +323,7 @@ public class TMLADReadCAMS extends TADComponentWithoutSubcomponents/* Issue #69
         tab2.labels=labels;
         tab2.values =  values;
         tab2.help = help;
-        tab2.helpButtom = new String[]{null, "cryptographicconfiguration.html", "cryptographicconfiguration.html"};
+        tab2.helpButtom = new String[]{null, "cryptographicconfiguration.html"};
 
         List<TabInfo> tabs = new ArrayList<>();
         tabs.add(tab1);
@@ -340,7 +340,7 @@ public class TMLADReadCAMS extends TADComponentWithoutSubcomponents/* Issue #69
             nbOfSamples = jdmsat.getString(0, 1);
             securityContext = jdmsat.getString(1, 0);
             isAttacker = jdmsat.getString(1, 1).equals("Yes");
-            isEncForm = jdmsat.getString(1, 2).equals("Yes");
+            // isEncForm = jdmsat.getString(1, 2).equals("Yes");
             makeValue();
             return true;
         }
@@ -364,8 +364,8 @@ public class TMLADReadCAMS extends TADComponentWithoutSubcomponents/* Issue #69
         sb.append(securityContext);
         sb.append("\" isAttacker=\"");
         sb.append(isAttacker ? "Yes" : "No");
-        sb.append("\" isEncForm=\"");
-        sb.append(isEncForm ? "Yes" : "No");
+        // sb.append("\" isEncForm=\"");
+        // sb.append(isEncForm ? "Yes" : "No");
         sb.append("\" />\n");
         sb.append("</extraparam>\n");
         return new String(sb);
@@ -392,12 +392,12 @@ public class TMLADReadCAMS extends TADComponentWithoutSubcomponents/* Issue #69
                                 nbOfSamples = elt.getAttribute("nbOfSamples");
                                 securityContext = elt.getAttribute("secPattern");
                                 isAttacker = elt.getAttribute("isAttacker").equals("Yes");
-                                isEncForm = elt.getAttribute("isEncForm").equals("Yes");    
+                                /* isEncForm = elt.getAttribute("isEncForm").equals("Yes");    
                                 if (elt.getAttribute("isEncForm").equals("") || !elt.hasAttribute("isEncForm")){
                                 	if (!securityContext.equals("")){
                                 		isEncForm=true;
                                 	}
-                                }
+                                } */
                             }
                         }
                     }
@@ -437,13 +437,13 @@ public class TMLADReadCAMS extends TADComponentWithoutSubcomponents/* Issue #69
         stateOfError = _stateAction;
     }
 
-    public boolean getEncForm(){
+    /* public boolean getEncForm(){
 		return isEncForm;
 	}
 		
 	public void setEncForm(boolean encForm){
 		isEncForm=encForm;
-	}
+	} */
 
 
     public void setChannelName(String s) {
diff --git a/src/main/java/ui/tmlad/TMLADReadChannel.java b/src/main/java/ui/tmlad/TMLADReadChannel.java
index 3b36ef69251431ba8ffd3c25c9620dbfa98f5479..01486295204cddf71639122e1113fdb4f2dba915 100755
--- a/src/main/java/ui/tmlad/TMLADReadChannel.java
+++ b/src/main/java/ui/tmlad/TMLADReadChannel.java
@@ -114,7 +114,7 @@ public class TMLADReadChannel extends TADComponentWithoutSubcomponents/* Issue #
 
     public int reachabilityInformation;
 
-	public boolean isEncForm = true;
+	// public boolean isEncForm = true;
 
     private int securityMaxX;
 	
@@ -218,9 +218,9 @@ public class TMLADReadChannel extends TADComponentWithoutSubcomponents/* Issue #
         }
         if (!securityContext.equals("")) {
         	c = g.getColor();
-	        if (!isEncForm) {
+	        /* if (!isEncForm) {
 	        	g.setColor(Color.RED);
-	        }
+	        } */
             drawSingleString(g,"sec:" + securityContext, x + 3 * width / 4, y + height + textY1 - decSec);
             if (!tdp.isScaled()) {
                 //TraceManager.addDev("Size of \""  +  ("sec:" + securityContext) +"\": " +  g.getFontMetrics().stringWidth("sec:" +
@@ -421,14 +421,14 @@ public class TMLADReadChannel extends TADComponentWithoutSubcomponents/* Issue #
         tab1.help = help;
 
         TabInfo tab2 = new TabInfo("Security");
-        labels = new String[3];
-        values = new String[3];
+        labels = new String[2];
+        values = new String[2];
         labels[0] = "Security Pattern";
         values[0] = securityContext;
         labels[1] = "Attacker?";
         values[1] = isAttacker ? "Yes" : "No";
-        labels[2] = "Encrypted Form?";
-        values[2] = isEncForm ? "Yes" : "No";        
+        // labels[2] = "Encrypted Form?";
+        // values[2] = isEncForm ? "Yes" : "No";        
         help = new ArrayList<String[]>();
         String[] choice = new String[]{"Yes", "No"};
         help.add(tdp.getMGUI().getCurrentCryptoConfig());
@@ -437,7 +437,7 @@ public class TMLADReadChannel extends TADComponentWithoutSubcomponents/* Issue #
         tab2.labels=labels;
         tab2.values =  values;
         tab2.help = help;
-        tab2.helpButtom = new String[]{null, "cryptographicconfiguration.html", "cryptographicconfiguration.html"};
+        tab2.helpButtom = new String[]{null, "cryptographicconfiguration.html"};
 
         List<TabInfo> tabs = new ArrayList<>();
         tabs.add(tab1);
@@ -454,7 +454,7 @@ public class TMLADReadChannel extends TADComponentWithoutSubcomponents/* Issue #
             nbOfSamples = jdmsat.getString(0, 1);
             securityContext = jdmsat.getString(1, 0);
             isAttacker = jdmsat.getString(1, 1).equals("Yes");
-            isEncForm = jdmsat.getString(1, 2).equals("Yes");
+            // isEncForm = jdmsat.getString(1, 2).equals("Yes");
             makeValue();
             return true;
         }
@@ -478,8 +478,8 @@ public class TMLADReadChannel extends TADComponentWithoutSubcomponents/* Issue #
         sb.append(securityContext);
         sb.append("\" isAttacker=\"");
         sb.append(isAttacker ? "Yes" : "No");
-        sb.append("\" isEncForm=\"");
-        sb.append(isEncForm ? "Yes" : "No");
+        // sb.append("\" isEncForm=\"");
+        // sb.append(isEncForm ? "Yes" : "No");
         sb.append("\" />\n");
         sb.append("</extraparam>\n");
         return new String(sb);
@@ -506,12 +506,12 @@ public class TMLADReadChannel extends TADComponentWithoutSubcomponents/* Issue #
                                 nbOfSamples = elt.getAttribute("nbOfSamples");
                                 securityContext = elt.getAttribute("secPattern");
                                 isAttacker = elt.getAttribute("isAttacker").equals("Yes");
-                                isEncForm = elt.getAttribute("isEncForm").equals("Yes");    
+                                /* isEncForm = elt.getAttribute("isEncForm").equals("Yes");    
                                 if (elt.getAttribute("isEncForm").equals("") || !elt.hasAttribute("isEncForm")) {
                                 	if (!securityContext.equals("")) {
                                 		isEncForm=true;
                                 	}
-                                }
+                                } */
                             }
                         }
                     }
@@ -536,6 +536,10 @@ public class TMLADReadChannel extends TADComponentWithoutSubcomponents/* Issue #
         return isAttacker;
     }
 
+    public void setIsAttacker(boolean _isAttacker) {
+        isAttacker = _isAttacker;
+    }
+
     @Override
     public int getType() {
         return TGComponentManager.TMLAD_READ_CHANNEL;
@@ -551,13 +555,13 @@ public class TMLADReadChannel extends TADComponentWithoutSubcomponents/* Issue #
         stateOfError = _stateAction;
     }
 
-    public boolean getEncForm() {
+    /* public boolean getEncForm() {
 		return isEncForm;
 	}
 		
 	public void setEncForm(boolean encForm) {
 		isEncForm=encForm;
-	}
+	} */
 
 
     public void setChannelName(String s) {
diff --git a/src/main/java/ui/tmlad/TMLADWriteCAMS.java b/src/main/java/ui/tmlad/TMLADWriteCAMS.java
index 7cbec8ee5121fbd93dc6a2a264193ab14f1077d3..738ed87b594b1c8db358531d228362aefa8b2890 100755
--- a/src/main/java/ui/tmlad/TMLADWriteCAMS.java
+++ b/src/main/java/ui/tmlad/TMLADWriteCAMS.java
@@ -109,7 +109,7 @@ public class TMLADWriteCAMS extends TADComponentWithoutSubcomponents/* Issue #69
 
     public int reachabilityInformation;
 
-	public boolean isEncForm = true;
+	// public boolean isEncForm = true;
 
     public TMLADWriteCAMS(int _x, int _y, int _minX, int _maxX, int _minY, int _maxY, boolean _pos, TGComponent _father, TDiagramPanel _tdp) {
         super(_x, _y, _minX, _maxX, _minY, _maxY, _pos, _father, _tdp);
@@ -195,9 +195,9 @@ public class TMLADWriteCAMS extends TADComponentWithoutSubcomponents/* Issue #69
         g.drawString(value, x + (width - w) / 2, y + textY);
         if (!securityContext.equals("")) {
 	        c = g.getColor();
-	        if (!isEncForm){
+	        /* if (!isEncForm){
 	        	g.setColor(Color.RED);
-	        }
+	        } */
             g.drawString("sec:" + securityContext, x + 3 * width / 4, y + height + textY - decSec);
             g.setColor(c);
         }
@@ -328,14 +328,14 @@ public class TMLADWriteCAMS extends TADComponentWithoutSubcomponents/* Issue #69
         tab1.help = help;
 
         TabInfo tab2 = new TabInfo("Security");
-        labels = new String[3];
-        values = new String[3];
+        labels = new String[2];
+        values = new String[2];
         labels[0] = "Security Pattern";
         values[0] = securityContext;
         labels[1] = "Attacker?";
         values[1] = isAttacker ? "Yes" : "No";
-        labels[2] = "Encrypted Form?";
-        values[2] = isEncForm ? "Yes" : "No";        
+        // labels[2] = "Encrypted Form?";
+        // values[2] = isEncForm ? "Yes" : "No";        
         help = new ArrayList<String[]>();
 
         help.add(tdp.getMGUI().getCurrentCryptoConfig());
@@ -344,7 +344,7 @@ public class TMLADWriteCAMS extends TADComponentWithoutSubcomponents/* Issue #69
         tab2.labels=labels;
         tab2.values =  values;
         tab2.help = help;
-        tab2.helpButtom = new String[]{null, "cryptographicconfiguration.html", "cryptographicconfiguration.html"};
+        tab2.helpButtom = new String[]{null, "cryptographicconfiguration.html"};
 
         List<TabInfo> tabs = new ArrayList<>();
         tabs.add(tab1);
@@ -362,7 +362,7 @@ public class TMLADWriteCAMS extends TADComponentWithoutSubcomponents/* Issue #69
             nbOfSamples = jdmsat.getString(0, 1);
             securityContext = jdmsat.getString(1, 0);
             isAttacker = jdmsat.getString(1, 1).equals("Yes");
-            isEncForm = jdmsat.getString(1, 2).equals("Yes");
+            // isEncForm = jdmsat.getString(1, 2).equals("Yes");
             makeValue();
             
             return true;
@@ -382,8 +382,8 @@ public class TMLADWriteCAMS extends TADComponentWithoutSubcomponents/* Issue #69
         sb.append(securityContext);
         sb.append("\" isAttacker=\"");
         sb.append(isAttacker ? "Yes" : "No");
-        sb.append("\" isEncForm=\"");
-        sb.append(isEncForm ? "Yes" : "No");
+        // sb.append("\" isEncForm=\"");
+        // sb.append(isEncForm ? "Yes" : "No");
         sb.append("\" />\n");
         sb.append("</extraparam>\n");
         return new String(sb);
@@ -411,12 +411,12 @@ public class TMLADWriteCAMS extends TADComponentWithoutSubcomponents/* Issue #69
                                 nbOfSamples = elt.getAttribute("nbOfSamples");
                                 securityContext = elt.getAttribute("secPattern");
                                 isAttacker = elt.getAttribute("isAttacker").equals("Yes");
-                                isEncForm = elt.getAttribute("isEncForm").equals("Yes");                                   
+                                /* isEncForm = elt.getAttribute("isEncForm").equals("Yes");                                   
                                 if (elt.getAttribute("isEncForm").equals("") || !elt.hasAttribute("isEncForm")){
                                 	if (!securityContext.equals("")){
                                 		isEncForm=true;
                                 	}
-                                }
+                                } */
                             }
                         }
                     }
@@ -465,14 +465,14 @@ public class TMLADWriteCAMS extends TADComponentWithoutSubcomponents/* Issue #69
         return isAttacker;
     }
 
-	public boolean getEncForm(){
+	/* public boolean getEncForm(){
 		return isEncForm;
 	}
 	
 	
 	public void setEncForm(boolean encForm){
 		isEncForm=encForm;
-	}
+	} */
 
     @Override
     public void setStateAction(int _stateAction) {
diff --git a/src/main/java/ui/tmlad/TMLADWriteChannel.java b/src/main/java/ui/tmlad/TMLADWriteChannel.java
index 57d39853cccfb933f392a574570e797bf551e459..6c75be7719b8c26392a0074e34c5d18dd1368014 100755
--- a/src/main/java/ui/tmlad/TMLADWriteChannel.java
+++ b/src/main/java/ui/tmlad/TMLADWriteChannel.java
@@ -112,7 +112,7 @@ public class TMLADWriteChannel extends TADComponentWithoutSubcomponents/* Issue
     public final static int NOT_REACHABLE = 2;
 
 
-	public boolean isEncForm = true;
+	// public boolean isEncForm = true;
 
     private int securityMaxX;
 
@@ -205,9 +205,9 @@ public class TMLADWriteChannel extends TADComponentWithoutSubcomponents/* Issue
         }
         if (!securityContext.equals("")) {
 	        c = g.getColor();
-	        if (!isEncForm){
+	        /* if (!isEncForm){
 	        	g.setColor(Color.RED);
-	        }
+	        } */
             drawSingleString(g,"sec:" + securityContext, x + 3 * width / 4, y + height + textY - scale( 4 ) );
 
             if (!tdp.isScaled()) {
@@ -349,14 +349,14 @@ public class TMLADWriteChannel extends TADComponentWithoutSubcomponents/* Issue
         tab1.help = help;
 
         TabInfo tab2 = new TabInfo("Security");
-        labels = new String[3];
-        values = new String[3];
+        labels = new String[2];
+        values = new String[2];
         labels[0] = "Security Pattern";
         values[0] = securityContext;
         labels[1] = "Attacker?";
         values[1] = isAttacker ? "Yes" : "No";
-        labels[2] = "Encrypted Form?";
-        values[2] = isEncForm ? "Yes" : "No";        
+        // labels[2] = "Encrypted Form?";
+        // values[2] = isEncForm ? "Yes" : "No";        
         help = new ArrayList<String[]>();
 
         help.add(tdp.getMGUI().getCurrentCryptoConfig());
@@ -365,7 +365,7 @@ public class TMLADWriteChannel extends TADComponentWithoutSubcomponents/* Issue
         tab2.labels=labels;
         tab2.values =  values;
         tab2.help = help;
-        tab2.helpButtom = new String[]{null, "cryptographicconfiguration.html", "cryptographicconfiguration.html"};
+        tab2.helpButtom = new String[]{null, "cryptographicconfiguration.html"};
 
         List<TabInfo> tabs = new ArrayList<>();
         tabs.add(tab1);
@@ -383,7 +383,7 @@ public class TMLADWriteChannel extends TADComponentWithoutSubcomponents/* Issue
             nbOfSamples = jdmsat.getString(0, 1);
             securityContext = jdmsat.getString(1, 0);
             isAttacker = jdmsat.getString(1, 1).equals("Yes");
-            isEncForm = jdmsat.getString(1, 2).equals("Yes");
+            // isEncForm = jdmsat.getString(1, 2).equals("Yes");
             makeValue();
             
             return true;
@@ -403,8 +403,8 @@ public class TMLADWriteChannel extends TADComponentWithoutSubcomponents/* Issue
         sb.append(securityContext);
         sb.append("\" isAttacker=\"");
         sb.append(isAttacker ? "Yes" : "No");
-        sb.append("\" isEncForm=\"");
-        sb.append(isEncForm ? "Yes" : "No");
+        // sb.append("\" isEncForm=\"");
+        // sb.append(isEncForm ? "Yes" : "No");
         sb.append("\" />\n");
         sb.append("</extraparam>\n");
         return new String(sb);
@@ -432,12 +432,12 @@ public class TMLADWriteChannel extends TADComponentWithoutSubcomponents/* Issue
                                 nbOfSamples = elt.getAttribute("nbOfSamples");
                                 securityContext = elt.getAttribute("secPattern");
                                 isAttacker = elt.getAttribute("isAttacker").equals("Yes");
-                                isEncForm = elt.getAttribute("isEncForm").equals("Yes");                                   
+                                /* isEncForm = elt.getAttribute("isEncForm").equals("Yes");                                   
                                 if (elt.getAttribute("isEncForm").equals("") || !elt.hasAttribute("isEncForm")){
                                 	if (!securityContext.equals("")){
                                 		isEncForm=true;
                                 	}
-                                }
+                                } */
                             }
                         }
                     }
@@ -486,14 +486,18 @@ public class TMLADWriteChannel extends TADComponentWithoutSubcomponents/* Issue
         return isAttacker;
     }
 
-	public boolean getEncForm(){
+    public void setIsAttacker(boolean _isAttacker) {
+        isAttacker = _isAttacker;
+    }
+
+	/* public boolean getEncForm(){
 		return isEncForm;
 	}
 	
 	
 	public void setEncForm(boolean encForm){
 		isEncForm=encForm;
-	}
+	} */
 
     @Override
     public void setStateAction(int _stateAction) {
diff --git a/src/main/java/ui/tmldd/TMLArchiKey.java b/src/main/java/ui/tmldd/TMLArchiKey.java
index 11e164b97fe9db7d9669ed0694746cc2b4d142f8..df0b12822cbd74551d1eb9b997a6559ac6144244 100755
--- a/src/main/java/ui/tmldd/TMLArchiKey.java
+++ b/src/main/java/ui/tmldd/TMLArchiKey.java
@@ -67,10 +67,11 @@ public class TMLArchiKey extends TGCWithoutInternalComponent implements Swallowe
 //    protected int fileX = 20;
 //    protected int fileY = 25;
 //    protected int cran = 5;
+    private static final int SPACE = 6;
 	private static final int KEY_OFFSET_Y = 5;
-	private static final int KEY_OFFSET_X = 20;
+	private static final int KEY_OFFSET_X = 15;
 
-    //protected String oldValue = "";
+    protected String oldValue = "";
     protected String referenceKey = "TMLKey";
     protected String typeName = "key";
     protected int priority = 5; // Between 0 and 10
@@ -132,32 +133,35 @@ public class TMLArchiKey extends TGCWithoutInternalComponent implements Swallowe
     protected void internalDrawing(Graphics g) {
 
     	// Issue #31
-//    	if (oldValue.compareTo(value) != 0) {
-//            setValue(value, g);
-//        }
-    	checkWidth( g );
+        if (oldValue.compareTo(value) != 0) {
+            setValue(value, g);
+        }
+
+        // Issue #31
+        final int space = scale( SPACE );
+        final int keyOffsetX = scale( KEY_OFFSET_X + SPACE);
+        final int keyOffsetY = scale( KEY_OFFSET_Y);
+        final int shaftWidth = scale( 3 );
 
+        checkWidth( g );
+    
         g.drawRect(x, y, width, height);
         Color c = g.getColor();
         g.setColor(ColorManager.MEMORY_BOX_2);
         g.fillRect(x+1, y+1, width-1, height-1);
         g.setColor(c);
-
-        // Issue #31
-        final int keyOffsetX = scale( KEY_OFFSET_X );
-        final int keyOffsetY = scale( KEY_OFFSET_Y );
-        final int shaftWidth = scale( 3 );
         
         // Key head
-		g.fillOval(x+width-keyOffsetX, y+keyOffsetY, height/3, height/3);
+        final int keyHeadDiameter = scale(13);
+		g.fillOval(x+width-keyOffsetX, y+keyOffsetY, keyHeadDiameter, keyHeadDiameter);
 		
 		// Key shaft
-		g.fillRect(x+width-keyOffsetY-keyOffsetX/2,y+keyOffsetY, shaftWidth/*3*/, height*3/4-keyOffsetY);
+		g.fillRect(x+width-keyOffsetX+space,y+keyOffsetY, shaftWidth/*3*/, height*3/4-keyOffsetY);
 		
 		// key teeth
 		final int teethLength = scale( 8 );
-		g.fillRect(x+width-keyOffsetY-keyOffsetX/2, y+height*3/4, teethLength/*8*/, shaftWidth/*3*/);
-		g.fillRect(x+width-keyOffsetY-keyOffsetX/2, y+height*2/3, teethLength/*8*/, shaftWidth/*3*/);
+		g.fillRect(x+width-keyOffsetX+space, y+height*3/4, teethLength/*8*/, shaftWidth/*3*/);
+		g.fillRect(x+width-keyOffsetX+space, y+height*2/3, teethLength/*8*/, shaftWidth/*3*/);
 /*
         //g.drawRoundRect(x, y, width, height, arc, arc);
         g.drawLine(x+width-space-fileX, y + space, x+width-space-fileX, y+space+fileY);
@@ -181,18 +185,22 @@ public class TMLArchiKey extends TGCWithoutInternalComponent implements Swallowe
     }
 
     // Issue #31
-    //private void setValue(String val/*, Graphics g*/) {
-//    	oldValue = value;
-//    	int w  = fileX + g.getFontMetrics().stringWidth(value) + textX;
-//    	int w1 = Math.max(minWidth, w);
-//
-//    	//TraceManager.addDev("      Width=" + width + " w1=" + w1 + " value=" + value);
-//    	if (w1 != width) {
-//    		width = w1;
-//    		resizeWithFather();
-//    	}
-    	//TraceManager.addDev("      Width=" + width + " w1=" + w1 + " value=" + value);
-//    }
+    public void setValue(String val, Graphics g) {
+        oldValue = val;
+        int w  = g.getFontMetrics().stringWidth(val);
+
+        // Issue #31
+        final int keyOffsetX = scale( KEY_OFFSET_X + SPACE);
+
+        int w1 = Math.max(minWidth, w + 2 * textX + keyOffsetX /*fileX + space*/);
+
+        //
+        if (w1 != width) {
+            width = w1;
+            resizeWithFather();
+        }
+        //
+    }
 
     @Override
     public void resizeWithFather() {
diff --git a/src/main/java/ui/window/JDialogPatternHandling.java b/src/main/java/ui/window/JDialogPatternHandling.java
new file mode 100644
index 0000000000000000000000000000000000000000..fa39890726f2cb642be67e7f11be892fb99f8c7e
--- /dev/null
+++ b/src/main/java/ui/window/JDialogPatternHandling.java
@@ -0,0 +1,2400 @@
+/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
+ *
+ * ludovic.apvrille AT enst.fr
+ *
+ * This software is a computer program whose purpose is to allow the
+ * edition of TURTLE analysis, design and deployment diagrams, to
+ * allow the generation of RT-LOTOS or Java code from this diagram,
+ * and at last to allow the analysis of formal validation traces
+ * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
+ * from INRIA Rhone-Alpes.
+ *
+ * This software is governed by the CeCILL  license under French law and
+ * abiding by the rules of distribution of free software.  You can  use,
+ * modify and/ or redistribute the software under the terms of the CeCILL
+ * license as circulated by CEA, CNRS and INRIA at the following URL
+ * "http://www.cecill.info".
+ *
+ * As a counterpart to the access to the source code and  rights to copy,
+ * modify and redistribute granted by the license, users are provided only
+ * with a limited warranty  and the software's author,  the holder of the
+ * economic rights,  and the successive licensors  have only  limited
+ * liability.
+ *
+ * In this respect, the user's attention is drawn to the risks associated
+ * with loading,  using,  modifying and/or developing or reproducing the
+ * software by the user in light of its specific status of free software,
+ * that may mean  that it is complicated to manipulate,  and  that  also
+ * therefore means  that it is reserved for developers  and  experienced
+ * professionals having in-depth computer knowledge. Users are therefore
+ * encouraged to load and test the software's suitability as regards their
+ * requirements in conditions enabling the security of their systems and/or
+ * data to be ensured and,  more generally, to use and operate it in the
+ * same conditions as regards security.
+ *
+ * The fact that you are presently reading this means that you have had
+ * knowledge of the CeCILL license and that you accept its terms.
+ */
+
+package ui.window;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Dialog;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.Frame;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
+import javax.swing.ButtonGroup;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+import javax.swing.JScrollPane;
+import javax.swing.JTabbedPane;
+import javax.swing.JTextField;
+import javax.swing.ListSelectionModel;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+
+import launcher.LauncherException;
+import launcher.RshClient;
+import myutil.GraphicLib;
+import myutil.MasterProcessInterface;
+import myutil.TraceManager;
+import tmltranslator.HwNode;
+import tmltranslator.TMLArchitecture;
+import tmltranslator.TMLChannel;
+import tmltranslator.TMLEvent;
+import tmltranslator.TMLModeling;
+import tmltranslator.TMLRequest;
+import tmltranslator.TMLTask;
+import tmltranslator.patternhandling.AttributeTaskJsonFile;
+import tmltranslator.patternhandling.MappingPatternChannel;
+import tmltranslator.patternhandling.MappingPatternTask;
+import tmltranslator.patternhandling.PatternChannelWithSecurity;
+import tmltranslator.patternhandling.PatternCloneTask;
+import tmltranslator.patternhandling.PatternConfiguration;
+import tmltranslator.patternhandling.PatternConnection;
+import tmltranslator.patternhandling.PatternCreation;
+import tmltranslator.patternhandling.PatternPortsConfig;
+import tmltranslator.patternhandling.PortTaskJsonFile;
+import tmltranslator.patternhandling.TaskPattern;
+import tmltranslator.patternhandling.TaskPorts;
+import ui.*;
+import ui.util.IconManager;
+
+/**
+ * Class JDialogPatternHandling
+ * Dialog for managing the generation of Patterns
+ *
+ * Creation: 16/08/2023
+ *
+ * @author Jawher JERRAY
+ * @version 1.0 16/08/2023
+ */
+
+public class JDialogPatternHandling extends JDialog implements ActionListener, ListSelectionListener, MouseListener, Runnable,
+        MasterProcessInterface {
+
+    private static final Insets WEST_INSETS = new Insets(0, 0, 0, 0);
+
+    protected MainGUI mgui;
+
+    protected final static int NOT_STARTED = 1;
+    protected final static int STARTED = 2;
+    protected final static int STOPPED = 3;
+
+    private String pathPatterns;
+
+    private int mode;
+
+    // Pattern Creation
+    private String newPatternName;
+    private JTextField jFieldNewPatternName;
+    private JButton buttonAddAllTasksAsPattern, buttonAddSelectedTasksAsPattern, buttonRemoveAllTasksAsPattern, buttonRemoveSelectedTasksAsPattern;
+    private JList<String> jListNoSelectedTasksAsPattern, jListSelectedTasksAsPattern;
+    private Vector<String> selectedTasksAsPattern = new Vector<String>();
+    private Vector<String> noSelectedTasksAsPattern = new Vector<String>();
+    private Map<String, String> tasksFullName = new LinkedHashMap<String, String>();
+    private JPanel jPanelPatternSelection;
+
+    // Pattern Configuration
+    private Vector<String> listPatterns = new Vector<String>();
+    private Vector<String> tasksOfPatternWithExternalPort = new Vector<String>();
+    private Vector<String> externalPortsOfTaskInPattern = new Vector<String>();
+    private Vector<String> tasksOfModel = new Vector<String>();
+    private Vector<String> portsOfTaskInModel = new Vector<String>();
+    private JComboBox<String> jComboBoxPatterns;
+    private JComboBox<String> jComboBoxPatternsTaskWithExternalPort;
+    private DefaultComboBoxModel<String> modelPatternsTaskWithExternalPort = new DefaultComboBoxModel<>(tasksOfPatternWithExternalPort);
+    private JComboBox<String> jComboBoxPatternExternalPortOfATask;
+    private DefaultComboBoxModel<String> modelPatternExternalPortOfATask = new DefaultComboBoxModel<>(externalPortsOfTaskInPattern);
+    private JComboBox<String> jComboBoxModelsTask;
+    private DefaultComboBoxModel<String> modelTask = new DefaultComboBoxModel<>(tasksOfModel);
+    private JComboBox<String> jComboBoxModelsPortOfTask;
+    private DefaultComboBoxModel<String> modelPortOfATask = new DefaultComboBoxModel<>(portsOfTaskInModel);
+    private JCheckBox jCheckBoxConnectToNewPort;
+    private JCheckBox jCheckBoxAddConfidentiality;
+    private JLabel jLabelAddAuthenticity;
+    private Vector<String> authenticityModes = new Vector<String>(Arrays.asList(PatternCreation.WITHOUT_AUTHENTICITY, PatternCreation.WEAK_AUTHENTICITY, PatternCreation.STRONG_AUTHENTICITY));
+    private JComboBox<String> jComboBoxAddAuthenticity;
+    private JList<String> jListConnectedPorts;
+    private Vector<String> connectedPorts = new Vector<String>();
+    private List<PatternConnection> patternConnectionList = new ArrayList<PatternConnection>();
+    private JButton addConnectionBetweenSelectedPorts, removeConnectionBetweenPorts;
+    private JButton buttonCloneTask;
+    private Vector<String> portsConfig = new Vector<String>();
+    private JComboBox<String> jComboBoxPortsConfig;
+    private DefaultComboBoxModel<String> modelPortsConfig = new DefaultComboBoxModel<>(portsConfig);
+    private ButtonGroup portsConfigGroup;
+    private JRadioButton jRadioPortConfigRemove, jRadioPortConfigMerge;
+    private Vector<String> portsConfigMerge = new Vector<String>();
+    private DefaultComboBoxModel<String> modelPortsConfigMerge = new DefaultComboBoxModel<>(portsConfigMerge);
+    private JComboBox<String> jComboBoxPortsConfigMerge;
+    private JList<String> jListConfigPorts;
+    private Vector<String> configuredPorts = new Vector<String>();
+    private List<PatternPortsConfig> configuredPortsList = new ArrayList<PatternPortsConfig>();
+    private JButton addConfigPorts, removeConfigPorts;
+    private JButton buttonTasksMapInArch;
+    private JButton buttonChannelsMapInArch;
+    private JButton buttonUpdatePatternsAttributes;
+
+    private Vector<String> tasksCanBeCloned = new Vector<String>();
+    private DefaultComboBoxModel<String> modelTaskToClone = new DefaultComboBoxModel<>(tasksCanBeCloned);
+    private JComboBox<String> jComboBoxTaskToClone;
+    private String newClonedTaskName;
+    private JTextField jFieldNewClonedTaskName;
+    private JButton addClonedTask, removeClonedTask;
+    private JList<String> jListClonedTasks;
+    private Vector<String> clonedTasks = new Vector<String>();
+    private List<PatternCloneTask> clonedTasksList = new ArrayList<PatternCloneTask>();
+
+    private ButtonGroup mapTaskGroup;
+    private JRadioButton jRadioMapTaskInExistingHw, jRadioMapTaskInNewHw;
+    private Vector<String> tasksToMap = new Vector<String>();
+    private List<MappingPatternTask> tasksToMapList = new ArrayList<MappingPatternTask>();
+    private Vector<String> tasksToMapInSameHw = new Vector<String>();
+    private List<MappingPatternTask> tasksToMapInSameHwList = new ArrayList<MappingPatternTask>();
+    private Vector<String> busToLinkNewHw = new Vector<String>();
+    private DefaultComboBoxModel<String> modelTaskToMap = new DefaultComboBoxModel<>(tasksToMap);
+    private DefaultComboBoxModel<String> modelMapTaskInSameHwAs = new DefaultComboBoxModel<>(tasksToMapInSameHw);
+    private JComboBox<String> jComboBoxTaskToMap, jComboBoxMapTaskInSameHwAs, jComboBoxMapTaskInNewHw;
+    private JButton addMappedTask, removeMappedTask;
+    private JList<String> jListMappedTasks;
+    private Vector<String> mappedTasks = new Vector<String>();
+    private List<MappingPatternTask> mappedTasksList = new ArrayList<MappingPatternTask>();
+
+    private ButtonGroup mapChannelGroup;
+    private JRadioButton jRadioMapChannelInExistingMem, jRadioMapChannelInNewMem;
+    private Vector<String> channelsToMap = new Vector<String>();
+    private List<MappingPatternChannel> channelsToMapList = new ArrayList<MappingPatternChannel>();
+    private Vector<String> channelsToMapInSameMem = new Vector<String>();
+    private List<MappingPatternChannel> channelsToMapInSameMemList = new ArrayList<MappingPatternChannel>();
+    private Vector<String> busToLinkNewMem = new Vector<String>();
+    private DefaultComboBoxModel<String> modelChannelToMap = new DefaultComboBoxModel<>(channelsToMap);
+    private DefaultComboBoxModel<String> modelMapChannelInSameMemAs = new DefaultComboBoxModel<>(channelsToMapInSameMem);
+    private JComboBox<String> jComboBoxChannelToMap, jComboBoxMapChannelInSameMemAs, jComboBoxMapChannelInNewMem;
+    private JButton addMappedChannel, removeMappedChannel;
+    private JList<String> jListMappedChannels;
+    private Vector<String> mappedChannels = new Vector<String>();
+    private List<MappingPatternChannel> mappedChannelsList = new ArrayList<MappingPatternChannel>();
+
+    private Vector<String> tasksToUpdateAttributes = new Vector<String>();
+    private DefaultComboBoxModel<String> modelTasksToUpdateAttributes = new DefaultComboBoxModel<>(tasksToUpdateAttributes);
+    private JComboBox<String> jComboBoxTasksToUpdateAttributes;
+    private Vector<String> attributesOfTaskToUpdate = new Vector<String>();
+    private DefaultComboBoxModel<String> modelAttributesOfTaskToUpdate = new DefaultComboBoxModel<>(attributesOfTaskToUpdate);
+    private JComboBox<String> jComboBoxAttributesOfTaskToUpdate;
+    private String newTaskAttibuteValue;
+    private JTextField jFieldNewTaskAttibuteValue;
+    private JButton buttonUpdateTaskAttributeValue;
+    
+
+    //LinkedHashMap<String, List<AttributeTaskJsonFile>> patternTasksAttributes = new LinkedHashMap<String, List<AttributeTaskJsonFile>>();
+    //LinkedHashMap<String, List<PortTaskJsonFile>> patternTasksExternalPorts = new LinkedHashMap<String, List<PortTaskJsonFile>>();
+    //LinkedHashMap<String, List<PortTaskJsonFile>> patternTasksInternalPorts = new LinkedHashMap<String, List<PortTaskJsonFile>>();
+    private LinkedHashMap<String, TaskPattern> patternTasksAll = new LinkedHashMap<String, TaskPattern>();
+    private LinkedHashMap<String, TaskPattern> patternTasksNotConnected = new LinkedHashMap<String, TaskPattern>();
+    private LinkedHashMap<String, TaskPorts> portsTaskOfModelAll = new LinkedHashMap<String, TaskPorts>();
+    private LinkedHashMap<String, TaskPorts> portsTaskOfModelLeft = new LinkedHashMap<String, TaskPorts>();
+    private List<PatternPortsConfig> portsTaskConfig = new ArrayList<PatternPortsConfig>();
+    private LinkedHashMap<String, List<AttributeTaskJsonFile>> updatedPatternAttributes = new LinkedHashMap<String, List<AttributeTaskJsonFile>>();
+    private List<PatternChannelWithSecurity> channelsWithSecurity = new ArrayList<PatternChannelWithSecurity>();
+    
+    private List<String> busesOfModel = new ArrayList<String>();
+
+    // Pattern Integration
+    private Vector<String> listPatternsJson = new Vector<String>();
+    private JComboBox<String> jComboBoxPatternsJson;
+    private String patternJsonPathValue;
+    private JTextField jFieldPatternJsonPath;
+
+    //components
+    private JScrollPane jsp;
+    private JPanel jta;
+    private JButton startButton;
+    private JButton stop;
+    private JButton close;
+    private boolean go = false;
+
+    private RshClient rshc;
+    private JTabbedPane jp1;
+
+    /*
+     * Creates new form
+     */
+    public JDialogPatternHandling(Frame f, MainGUI _mgui, String title, String _pathPatterns) {
+        super(f, title, Dialog.ModalityType.DOCUMENT_MODAL);
+
+        mgui = _mgui;
+        this.pathPatterns = _pathPatterns;
+
+        TMLModeling<?> tmlmNew = mgui.gtm.getTMLMapping().getTMLModeling();
+        for (TMLTask task : tmlmNew.getTasks()) {
+            String[] taskNameSplit = task.getName().split("__");
+            task.setName(taskNameSplit[taskNameSplit.length-1]);
+        }
+        for (TMLChannel ch : tmlmNew.getChannels()) {
+            String[] channelNameSplit = ch.getName().split("__");
+            ch.setName(channelNameSplit[channelNameSplit.length-1]);
+        }
+        for (TMLEvent evt : tmlmNew.getEvents()) {
+            String[] eventNameSplit = evt.getName().split("__");
+            evt.setName(eventNameSplit[eventNameSplit.length-1]);
+        }
+        for (TMLRequest req : tmlmNew.getRequests()) {
+            String[] requestNameSplit = req.getName().split("__");
+            req.setName(requestNameSplit[requestNameSplit.length-1]);
+        }
+
+        for (int i=0; i < mgui.gtm.getTMLMapping().getMappedTasks().size(); i++) {
+            String taskFullName = mgui.gtm.getTMLMapping().getMappedTasks().get(i).getName();
+            String taskShortName = taskFullName.split("__")[taskFullName.split("__").length - 1];
+            tasksFullName.put(taskShortName, taskFullName);
+            noSelectedTasksAsPattern.add(taskShortName);
+        } 
+        listPatterns = getFoldersName(_pathPatterns);
+        listPatternsJson = getFoldersName(_pathPatterns);
+        portsTaskOfModelAll = TaskPorts.getListPortsTask(mgui.gtm.getTMLMapping().getTMLModeling());
+        portsTaskOfModelLeft = TaskPorts.getListPortsTask(mgui.gtm.getTMLMapping().getTMLModeling());
+        busesOfModel = getListBus(mgui.gtm.getTMLMapping().getArch());
+        initComponents();
+        myInitComponents();
+        pack();
+    }
+
+    protected void myInitComponents() {
+        mode = NOT_STARTED;
+        setButtons();
+    }
+
+    List<String> getListBus(TMLArchitecture tmlarch) {
+        List<String> listBusName = new ArrayList<String>();
+        for (HwNode bus : tmlarch.getBUSs()) {
+            listBusName.add(bus.getName());
+        }
+        return listBusName;
+    }
+
+    Vector<String> getFoldersName(String path) {
+        Vector<String> folders = new Vector<String>();
+        File directoryPath = new File(path);
+        String[] directories = directoryPath.list((dir, name) -> new File(dir, name).isDirectory());
+        if (directories != null) {
+            folders = new Vector<String>(Arrays.asList(directories));
+        }
+        return folders;
+    }
+
+    private GridBagConstraints createGbc(int y) {
+        GridBagConstraints gbc = new GridBagConstraints();
+        gbc.gridx = 0;
+        gbc.gridy = y;
+        gbc.gridwidth = 1;
+        gbc.gridheight = 1;
+
+        gbc.anchor = GridBagConstraints.WEST;
+        gbc.fill = GridBagConstraints.BOTH;
+
+        gbc.insets = WEST_INSETS;
+        gbc.weightx = 1.0;
+        gbc.weighty = 1.0;
+        return gbc;
+    }
+
+    protected void panelPatternCreation() {
+        JPanel jp01 = new JPanel();
+        GridBagLayout gridbag01 = new GridBagLayout();
+        GridBagConstraints c01 = new GridBagConstraints();
+        jp01.setLayout(gridbag01);
+        jp01.setBorder(new javax.swing.border.TitledBorder("Pattern Creation"));
+
+        c01.weighty = 1.0;
+        c01.weightx = 1.0;
+        c01.fill = GridBagConstraints.HORIZONTAL;
+        c01.gridheight = 1;
+        c01.gridwidth = 2;
+        
+        JLabel labelPatternName = new JLabel("Name of the new pattern: ");
+        jp01.add(labelPatternName, c01);
+        //addComponent(jp01, labelPatternName, 0, curY, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);
+        c01.gridwidth = GridBagConstraints.REMAINDER;
+        jFieldNewPatternName = new JTextField(newPatternName, 10);
+        jFieldNewPatternName.setPreferredSize(new Dimension(10, 25));
+        jp01.add(jFieldNewPatternName, c01);
+        //addComponent(jp01, jFieldNewPatternName, 1, curY, 3, GridBagConstraints.EAST, GridBagConstraints.BOTH);
+        c01.gridwidth = GridBagConstraints.REMAINDER;
+        jp01.add(new JLabel(" "), c01);
+        c01.gridwidth = GridBagConstraints.REMAINDER;
+        JLabel labelSelectPattern = new JLabel("Select tasks of the new Pattern: ");
+        jp01.add(labelSelectPattern, c01);
+        //addComponent(jp01, labelSelectPattern, 0, curY, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);
+        jListNoSelectedTasksAsPattern = new JList<String>(noSelectedTasksAsPattern);
+		jPanelPatternSelection = new JPanel();
+		jPanelPatternSelection.setPreferredSize(new Dimension(250, 200));
+		GridBagConstraints c02 = new GridBagConstraints();
+		c02.gridwidth = 1;
+		c02.gridheight = 1;
+		c02.fill= GridBagConstraints.BOTH;
+     	jListNoSelectedTasksAsPattern.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
+
+        jListNoSelectedTasksAsPattern.addListSelectionListener(this);
+        JScrollPane scrollPane1 = new JScrollPane(jListNoSelectedTasksAsPattern);
+        scrollPane1.setPreferredSize(new Dimension(250, 200));
+        jPanelPatternSelection.add(scrollPane1, BorderLayout.WEST);
+
+        JPanel buttonPanel = new JPanel();
+        GridBagConstraints c13 = new GridBagConstraints();
+        c13.gridwidth = GridBagConstraints.REMAINDER;
+        c13.gridheight = 1;
+        
+        buttonAddAllTasksAsPattern = new JButton(IconManager.imgic50);
+        buttonAddAllTasksAsPattern.setPreferredSize(new Dimension(50, 25));
+        buttonAddAllTasksAsPattern.addActionListener(this);
+        buttonAddAllTasksAsPattern.setActionCommand("allTasksSelectedAsPattern");
+        buttonPanel.add(buttonAddAllTasksAsPattern, c13);
+		//buttonAddAllTasksAsPattern.setEnabled(false);
+
+        buttonAddSelectedTasksAsPattern = new JButton(IconManager.imgic48);
+        buttonAddSelectedTasksAsPattern.setPreferredSize(new Dimension(50, 25));
+        buttonAddSelectedTasksAsPattern.addActionListener(this);
+        buttonAddSelectedTasksAsPattern.setActionCommand("addTaskAsPattern");
+        buttonPanel.add(buttonAddSelectedTasksAsPattern, c13);
+		//buttonAddSelectedTasksAsPattern.setEnabled(false);
+
+        buttonPanel.add(new JLabel(" "), c13);
+
+        buttonRemoveSelectedTasksAsPattern = new JButton(IconManager.imgic46);
+        buttonRemoveSelectedTasksAsPattern.addActionListener(this);
+        buttonRemoveSelectedTasksAsPattern.setPreferredSize(new Dimension(50, 25));
+        buttonRemoveSelectedTasksAsPattern.setActionCommand("removeTaskAsPattern");
+        buttonPanel.add(buttonRemoveSelectedTasksAsPattern, c13);
+		//buttonRemoveSelectedTasksAsPattern.setEnabled(false);
+
+        buttonRemoveAllTasksAsPattern = new JButton(IconManager.imgic44);
+        buttonRemoveAllTasksAsPattern.addActionListener(this);
+        buttonRemoveAllTasksAsPattern.setPreferredSize(new Dimension(50, 25));
+        buttonRemoveAllTasksAsPattern.setActionCommand("allTasksNoSelectedAsPattern");
+        buttonPanel.add(buttonRemoveAllTasksAsPattern, c13);
+        jPanelPatternSelection.add(buttonPanel, c02);
+        buttonPanel.setPreferredSize(new Dimension(50, 200));
+		//buttonRemoveAllTasksAsPattern.setEnabled(false);
+		
+        jListSelectedTasksAsPattern = new JList<String>(selectedTasksAsPattern);
+
+        jListSelectedTasksAsPattern.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
+        jListSelectedTasksAsPattern.addListSelectionListener(this);
+        JScrollPane scrollPane2 = new JScrollPane(jListSelectedTasksAsPattern);
+        scrollPane2.setPreferredSize(new Dimension(250, 200));
+        jPanelPatternSelection.add(scrollPane2, BorderLayout.CENTER);
+        jPanelPatternSelection.setPreferredSize(new Dimension(600, 250));
+        jPanelPatternSelection.setMinimumSize(new Dimension(600, 250));
+        //c01.gridheight = 10;
+        jp01.add(jPanelPatternSelection, c01);
+        //c02.gridheight = 1;
+
+        jp1.add("Pattern Creation", jp01);
+    }
+
+    protected void panelPatternConfiguration() {
+        JPanel jp02 = new JPanel();
+        GridBagLayout gridbag02 = new GridBagLayout();
+        GridBagConstraints c02 = new GridBagConstraints();
+        jp02.setLayout(gridbag02);
+        jp02.setBorder(new javax.swing.border.TitledBorder("Pattern Selection and Configuration"));
+
+        c02.weighty = 1.0;
+        c02.weightx = 1.0;
+        c02.fill = GridBagConstraints.HORIZONTAL;
+        c02.anchor = GridBagConstraints.LINE_START;
+        c02.gridheight = 1;
+        c02.gridwidth = 1;
+        
+        JPanel jpPatternSelection = new JPanel();
+        jpPatternSelection.setLayout(new GridBagLayout());
+        GridBagConstraints cPatternSelection = new GridBagConstraints();
+        cPatternSelection.gridx = 0;
+        cPatternSelection.gridy = 0;
+        cPatternSelection.fill = GridBagConstraints.HORIZONTAL;
+        cPatternSelection.anchor = GridBagConstraints.LINE_START;
+        cPatternSelection.weightx = 0.5;
+
+        JLabel labelPatternName = new JLabel("Select a pattern: ");
+        jpPatternSelection.add(labelPatternName, cPatternSelection);
+        jComboBoxPatterns = new JComboBox<String>(listPatterns);
+        jComboBoxPatterns.setSelectedIndex(-1);
+        jComboBoxPatterns.addActionListener(this);
+        cPatternSelection.gridx = 1;
+        jpPatternSelection.add(jComboBoxPatterns, cPatternSelection);
+        jp02.add(jpPatternSelection, c02);
+
+        JPanel jpPatternConnetionMain = new JPanel();
+        jpPatternConnetionMain.setLayout(new GridBagLayout());
+        GridBagConstraints cPatternConnetionMain = new GridBagConstraints();
+        cPatternConnetionMain.gridx = 0;
+        cPatternConnetionMain.gridy = 0;
+        cPatternConnetionMain.fill = GridBagConstraints.HORIZONTAL;
+        cPatternConnetionMain.anchor = GridBagConstraints.LINE_START;
+        cPatternConnetionMain.weightx = 1.0;
+        jpPatternConnetionMain.add(new JLabel("Connect pattern's external ports:"), cPatternConnetionMain);
+
+        
+        JPanel jpPatternConnetion = new JPanel();
+        jpPatternConnetion.setLayout(new GridBagLayout());
+        GridBagConstraints cPatternConnetion = new GridBagConstraints();
+        cPatternConnetion.gridx = 0;
+        cPatternConnetion.gridy = 0;
+        cPatternConnetion.fill = GridBagConstraints.HORIZONTAL;
+        cPatternConnetion.anchor = GridBagConstraints.LINE_START;
+        jpPatternConnetion.add(new JLabel("Select an external port of the pattern:"), cPatternConnetion);
+        
+        
+        jComboBoxPatternsTaskWithExternalPort = new JComboBox<String>(modelPatternsTaskWithExternalPort);
+        jComboBoxPatternsTaskWithExternalPort.setSelectedIndex(-1);
+        jComboBoxPatternsTaskWithExternalPort.setEnabled(false);
+        jComboBoxPatternsTaskWithExternalPort.addActionListener(this);
+        cPatternConnetion.weightx = 0.4;
+        cPatternConnetion.gridy = 1;
+        jpPatternConnetion.add(jComboBoxPatternsTaskWithExternalPort, cPatternConnetion);
+        jComboBoxPatternExternalPortOfATask = new JComboBox<String>(modelPatternExternalPortOfATask);
+        jComboBoxPatternExternalPortOfATask.setSelectedIndex(-1);
+        jComboBoxPatternExternalPortOfATask.setEnabled(false);
+        jComboBoxPatternExternalPortOfATask.addActionListener(this);
+        cPatternConnetion.gridx = 1;
+        cPatternConnetion.weightx = 0.8;
+        jpPatternConnetion.add(jComboBoxPatternExternalPortOfATask, cPatternConnetion);
+        buttonCloneTask = new JButton("Clone Task");
+        //buttonCloneTask.setPreferredSize(new Dimension(50, 25));
+        buttonCloneTask.setEnabled(false);
+        buttonCloneTask.addActionListener(this);
+        buttonCloneTask.setActionCommand("cloneTask");
+        cPatternConnetion.gridx = 2;
+        cPatternConnetion.weightx = 0;
+        jpPatternConnetion.add(buttonCloneTask, cPatternConnetion);
+
+        jComboBoxModelsTask = new JComboBox<String>(modelTask);
+        jComboBoxModelsTask.setSelectedIndex(-1);
+        jComboBoxModelsTask.setEnabled(false);
+        jComboBoxModelsTask.addActionListener(this);
+        cPatternConnetion.gridx = 0;
+        cPatternConnetion.gridy = 2;
+        
+        jpPatternConnetion.add(new JLabel("Select a model port to connect with:"), cPatternConnetion);
+        cPatternConnetion.gridy = 3;
+        cPatternConnetion.weightx = 0.8;
+        jpPatternConnetion.add(jComboBoxModelsTask, cPatternConnetion);
+
+        jComboBoxModelsPortOfTask = new JComboBox<String>(modelPortOfATask);
+        jComboBoxModelsPortOfTask.setSelectedIndex(-1);
+        jComboBoxModelsPortOfTask.setEnabled(false);
+        jComboBoxModelsPortOfTask.addActionListener(this);
+        cPatternConnetion.gridx = 1;
+        cPatternConnetion.weightx = 0.8;
+        jpPatternConnetion.add(jComboBoxModelsPortOfTask, cPatternConnetion);
+        jCheckBoxConnectToNewPort = new JCheckBox("Connect to new Port");
+        jCheckBoxConnectToNewPort.setEnabled(false);
+        jCheckBoxConnectToNewPort.addActionListener(this);
+        cPatternConnetion.gridx = 2;
+        cPatternConnetion.weightx = 0;
+        jpPatternConnetion.add(jCheckBoxConnectToNewPort, cPatternConnetion);
+
+        cPatternConnetion.gridy = 4;
+        cPatternConnetion.gridx = 0;
+        jCheckBoxAddConfidentiality = new JCheckBox("Add Confidentiality");
+        jCheckBoxAddConfidentiality.setEnabled(false);
+        jCheckBoxAddConfidentiality.setVisible(false);
+        jCheckBoxAddConfidentiality.addActionListener(this);
+        jpPatternConnetion.add(jCheckBoxAddConfidentiality, cPatternConnetion);
+        cPatternConnetion.gridx = 1;
+        jLabelAddAuthenticity = new JLabel("Add Authenticity:");
+        jLabelAddAuthenticity.setVisible(false);
+        jpPatternConnetion.add(jLabelAddAuthenticity, cPatternConnetion);
+        cPatternConnetion.gridx = 2;
+        jComboBoxAddAuthenticity = new JComboBox<String>(authenticityModes);
+        jComboBoxAddAuthenticity.setSelectedIndex(authenticityModes.indexOf(PatternCreation.WITHOUT_AUTHENTICITY));
+        jComboBoxAddAuthenticity.setEnabled(false);
+        jComboBoxAddAuthenticity.setVisible(false);
+        jComboBoxAddAuthenticity.addActionListener(this);
+        jpPatternConnetion.add(jComboBoxAddAuthenticity, cPatternConnetion);
+
+        cPatternConnetionMain.gridy = 1;
+        jpPatternConnetionMain.add(jpPatternConnetion, cPatternConnetionMain);
+
+
+        jListConnectedPorts = new JList<String>(connectedPorts);
+		JPanel jPanelPatternIntegration = new JPanel();
+        jPanelPatternIntegration.setLayout(new GridBagLayout());
+        GridBagConstraints cPatternIntegration = new GridBagConstraints();
+        cPatternIntegration.gridx = 0;
+        cPatternIntegration.gridy = 0;
+        cPatternIntegration.weightx = 0.9;
+        cPatternIntegration.fill = GridBagConstraints.HORIZONTAL;
+        cPatternIntegration.anchor = GridBagConstraints.LINE_START;
+        
+		//jPanelPatternIntegration.setPreferredSize(new Dimension(600, 130));
+        jListConnectedPorts.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
+
+        jListConnectedPorts.addListSelectionListener(this);
+        JScrollPane scrollPaneConnectedPorts = new JScrollPane(jListConnectedPorts);
+        scrollPaneConnectedPorts.setPreferredSize(new Dimension(450, 125));
+        jPanelPatternIntegration.add(scrollPaneConnectedPorts, cPatternIntegration);
+        
+        JPanel pannelButtonConnectPorts = new JPanel();
+        pannelButtonConnectPorts.setLayout(new GridBagLayout());
+        GridBagConstraints cConnectedPorts = new GridBagConstraints();
+        cConnectedPorts.gridx = 0;
+        cConnectedPorts.weightx = 1.0;
+        cConnectedPorts.gridy = 0;
+        cConnectedPorts.fill = GridBagConstraints.HORIZONTAL;
+        cConnectedPorts.anchor = GridBagConstraints.LINE_START;
+        addConnectionBetweenSelectedPorts = new JButton("+");
+        addConnectionBetweenSelectedPorts.setEnabled(false);
+        addConnectionBetweenSelectedPorts.setPreferredSize(new Dimension(50, 25));
+        addConnectionBetweenSelectedPorts.addActionListener(this);
+        addConnectionBetweenSelectedPorts.setActionCommand("addConnectionBetweenSelectedPorts");
+        pannelButtonConnectPorts.add(addConnectionBetweenSelectedPorts, cConnectedPorts);
+
+        removeConnectionBetweenPorts = new JButton("-");
+        removeConnectionBetweenPorts.setEnabled(false);
+        removeConnectionBetweenPorts.setPreferredSize(new Dimension(50, 25));
+        removeConnectionBetweenPorts.addActionListener(this);
+        removeConnectionBetweenPorts.setActionCommand("removeConnectionBetweenPorts");
+        cConnectedPorts.gridy = 1;
+        pannelButtonConnectPorts.add(removeConnectionBetweenPorts, cConnectedPorts);
+        //pannelButtonConnectPorts.setPreferredSize(new Dimension(50, 125));
+        //jPanelPatternIntegration.setMinimumSize(new Dimension(600, 130));
+        cPatternIntegration.gridx = 1;
+        cPatternIntegration.weightx = 0.1;
+        jPanelPatternIntegration.add(pannelButtonConnectPorts, cPatternIntegration);
+        cPatternConnetionMain.gridy = 2;
+        jpPatternConnetionMain.add(jPanelPatternIntegration, cPatternConnetionMain);
+        //c02.gridwidth = GridBagConstraints.REMAINDER;
+        c02.gridy = 1;
+        c02.insets = new Insets(10,0,0,0); 
+        jp02.add(jpPatternConnetionMain, c02);
+        
+        JPanel jpPortConfigurationMain = new JPanel();
+        jpPortConfigurationMain.setLayout(new GridBagLayout());
+        GridBagConstraints cPortConfigurationMain = new GridBagConstraints();
+        cPortConfigurationMain.gridx = 0;
+        cPortConfigurationMain.gridy = 0;
+        cPortConfigurationMain.gridwidth = 2;
+        cPortConfigurationMain.anchor = GridBagConstraints.LINE_START;
+        //cPortConfigurationMain.fill= GridBagConstraints.BOTH;
+
+        jpPortConfigurationMain.add(new JLabel("Ports to configure:"), cPortConfigurationMain);
+        //cPortConfigurationMain.gridwidth = GridBagConstraints.REMAINDER;
+        JPanel jpPortConfiguration = new JPanel();
+        jpPortConfiguration.setLayout(new GridBagLayout());
+        GridBagConstraints cPortConfiguration = new GridBagConstraints();
+        cPortConfiguration.gridx = 0;
+        cPortConfiguration.gridy = 0;
+        cPortConfiguration.gridwidth = 2;
+        cPortConfiguration.fill = GridBagConstraints.HORIZONTAL;
+        cPortConfiguration.anchor = GridBagConstraints.LINE_START;
+
+        jComboBoxPortsConfig = new JComboBox<String>(modelPortsConfig);
+        jComboBoxPortsConfig.setSelectedIndex(-1);
+        jComboBoxPortsConfig.setEnabled(false);
+        jComboBoxPortsConfig.addActionListener(this);
+        jpPortConfiguration.add(jComboBoxPortsConfig, cPortConfiguration);
+        //cPortConfiguration.gridwidth = GridBagConstraints.REMAINDER;
+        portsConfigGroup =new ButtonGroup();
+        jRadioPortConfigRemove = new JRadioButton("Remove port");
+        jRadioPortConfigRemove.setEnabled(false);
+        jRadioPortConfigRemove.addActionListener(this);
+        cPortConfiguration.gridy = 1;
+        jpPortConfiguration.add(jRadioPortConfigRemove, cPortConfiguration);
+        
+        jRadioPortConfigMerge = new JRadioButton("Merge with:");
+        jRadioPortConfigMerge.setEnabled(false);
+        jRadioPortConfigMerge.addActionListener(this);
+        cPortConfiguration.gridy = 2;
+        cPortConfiguration.gridwidth = 1;
+        jpPortConfiguration.add(jRadioPortConfigMerge, cPortConfiguration);
+        //cPortConfiguration.gridwidth = GridBagConstraints.REMAINDER;
+        portsConfigGroup.add(jRadioPortConfigRemove);
+        portsConfigGroup.add(jRadioPortConfigMerge);
+        jComboBoxPortsConfigMerge = new JComboBox<String>(modelPortsConfigMerge);
+        jComboBoxPortsConfigMerge.setSelectedIndex(-1);
+        jComboBoxPortsConfigMerge.setEnabled(false);
+        jComboBoxPortsConfigMerge.addActionListener(this);
+        jComboBoxPortsConfigMerge.setPreferredSize(new Dimension(200, 25));
+        cPortConfiguration.gridx = 1;
+        cPortConfiguration.weightx = 1.0;
+        jpPortConfiguration.add(jComboBoxPortsConfigMerge, cPortConfiguration);
+        
+        cPortConfigurationMain.gridx = 0;
+        cPortConfigurationMain.gridy = 1;
+        cPortConfigurationMain.weightx = 0.6;
+        cPortConfigurationMain.gridwidth = 1;
+        //cPortConfigurationMain.ipady = 100;
+        //cPortConfigurationMain.fill = GridBagConstraints.BOTH;
+        cPortConfigurationMain.anchor = GridBagConstraints.FIRST_LINE_START;
+        //jpPortConfiguration.setBackground(Color.gray);
+        cPortConfigurationMain.insets = new Insets(5,0,0,0);  //top padding
+        jpPortConfigurationMain.add(jpPortConfiguration, cPortConfigurationMain);
+        //cPortConfigurationMain.gridwidth = GridBagConstraints.REMAINDER;
+
+        jListConfigPorts = new JList<String>(configuredPorts);
+		JPanel jPanelConfigPorts = new JPanel(new GridBagLayout());
+        jPanelConfigPorts.setLayout(new GridBagLayout());
+        GridBagConstraints cConfigPorts = new GridBagConstraints();
+		//jPanelConfigPorts.setPreferredSize(new Dimension(200, 100));
+        jListConfigPorts.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
+
+        jListConfigPorts.addListSelectionListener(this);
+        JScrollPane scrollPaneConfigPorts = new JScrollPane(jListConfigPorts);
+        //scrollPaneConfigPorts.setPreferredSize(new Dimension(200, 100));
+        cConfigPorts.gridx = 0;
+        cConfigPorts.gridy = 0;
+        cConfigPorts.fill = GridBagConstraints.HORIZONTAL;
+        jPanelConfigPorts.add(scrollPaneConfigPorts, cConfigPorts);
+        
+        JPanel pannelButtonConfigPorts = new JPanel();
+        pannelButtonConfigPorts.setLayout(new GridBagLayout());
+        GridBagConstraints cButtonConfigPorts = new GridBagConstraints();
+        cButtonConfigPorts.gridx = 0;
+        cButtonConfigPorts.gridy = 0;
+        addConfigPorts = new JButton("+");
+        addConfigPorts.setEnabled(false);
+        addConfigPorts.setPreferredSize(new Dimension(50, 25));
+        addConfigPorts.addActionListener(this);
+        addConfigPorts.setActionCommand("addConfigPorts");
+        pannelButtonConfigPorts.add(addConfigPorts, cButtonConfigPorts);
+
+        removeConfigPorts = new JButton("-");
+        removeConfigPorts.setEnabled(false);
+        removeConfigPorts.setPreferredSize(new Dimension(50, 25));
+        removeConfigPorts.addActionListener(this);
+        removeConfigPorts.setActionCommand("removeConfigPorts");
+        cButtonConfigPorts.gridx = 1;
+        pannelButtonConfigPorts.add(removeConfigPorts, cButtonConfigPorts);
+        //pannelButtonConfigPorts.setPreferredSize(new Dimension(200, 30));
+        //jPanelConfigPorts.setMinimumSize(new Dimension(220, 110));
+        cConfigPorts.gridy = 1;
+        jPanelConfigPorts.add(pannelButtonConfigPorts, cConfigPorts);
+
+        cPortConfigurationMain.gridx = 1;
+        cPortConfigurationMain.gridy = 1;
+        cPortConfigurationMain.weightx = 0.4;
+        cPortConfigurationMain.fill = GridBagConstraints.HORIZONTAL;
+        cPortConfigurationMain.anchor = GridBagConstraints.FIRST_LINE_START;
+        //jPanelConfigPorts.setBackground(Color.red);  
+        jpPortConfigurationMain.add(jPanelConfigPorts, cPortConfigurationMain);
+        c02.gridy = 2;
+        jp02.add(jpPortConfigurationMain, c02);
+        //c02.gridwidth = GridBagConstraints.REMAINDER;
+
+        JPanel jpOptions = new JPanel();
+        jpOptions.setLayout(new GridBagLayout());
+        GridBagConstraints cOptions = new GridBagConstraints();
+        cOptions.gridx = 0;
+        cOptions.gridy = 0;
+        cOptions.fill = GridBagConstraints.HORIZONTAL;
+        cOptions.anchor = GridBagConstraints.FIRST_LINE_START;
+        cOptions.weightx = 1.0;
+        cOptions.gridwidth = 3;
+        jpOptions.add(new JLabel("Options:"), cOptions);
+        
+        
+        buttonTasksMapInArch = new JButton("Map pattern tasks");
+        buttonTasksMapInArch.setEnabled(false);
+        buttonTasksMapInArch.addActionListener(this);
+        buttonTasksMapInArch.setActionCommand("mapTasksManuallyInArchitecture");
+        cOptions.gridy = 1;
+        cOptions.gridwidth = 1;
+        //cOptions.weightx = 0.3;
+        cOptions.fill = GridBagConstraints.NONE;
+        jpOptions.add(buttonTasksMapInArch, cOptions);
+
+        buttonChannelsMapInArch = new JButton("Map pattern channels");
+        buttonChannelsMapInArch.setEnabled(false);
+        buttonChannelsMapInArch.addActionListener(this);
+        buttonChannelsMapInArch.setActionCommand("mapChannelsManuallyInArchitecture");
+        cOptions.gridx = 1;
+        jpOptions.add(buttonChannelsMapInArch, cOptions);
+
+        buttonUpdatePatternsAttributes = new JButton("Update Pattern's Attributes values");
+        buttonUpdatePatternsAttributes.setEnabled(false);
+        buttonUpdatePatternsAttributes.addActionListener(this);
+        buttonUpdatePatternsAttributes.setActionCommand("updatePatternsAttributes");
+        cOptions.gridx = 2;
+        jpOptions.add(buttonUpdatePatternsAttributes, cOptions);
+
+        c02.gridy = 3;
+        jp02.add(jpOptions, c02);
+
+        jp1.add("Pattern Selection and Configuration", jp02);
+    }
+
+    protected void panelPatternIntegration() {
+        JPanel jp02 = new JPanel();
+        GridBagLayout gridbag02 = new GridBagLayout();
+        GridBagConstraints c02 = new GridBagConstraints();
+        jp02.setLayout(gridbag02);
+        jp02.setBorder(new javax.swing.border.TitledBorder("Pattern Integration"));
+
+        c02.weighty = 1.0;
+        c02.weightx = 1.0;
+        c02.fill = GridBagConstraints.HORIZONTAL;
+        c02.anchor = GridBagConstraints.LINE_START;
+        c02.gridheight = 1;
+        c02.gridwidth = 1;
+        
+        JPanel jpPatternSelection = new JPanel();
+        jpPatternSelection.setLayout(new GridBagLayout());
+        GridBagConstraints cPatternSelection = new GridBagConstraints();
+        cPatternSelection.gridx = 0;
+        cPatternSelection.gridy = 0;
+        cPatternSelection.fill = GridBagConstraints.HORIZONTAL;
+        cPatternSelection.anchor = GridBagConstraints.LINE_START;
+        cPatternSelection.weightx = 0.5;
+
+        JLabel labelPatternName = new JLabel("Select a pattern: ");
+        jpPatternSelection.add(labelPatternName, cPatternSelection);
+
+        jComboBoxPatternsJson = new JComboBox<String>(listPatternsJson);
+        jComboBoxPatternsJson.setSelectedIndex(-1);
+        jComboBoxPatternsJson.addActionListener(this);
+        cPatternSelection.gridx = 1;
+        jpPatternSelection.add(jComboBoxPatternsJson, cPatternSelection);
+
+        cPatternSelection.gridy = 1;
+        cPatternSelection.gridx = 0;
+        jpPatternSelection.add(new JLabel("Path To Json File :"), cPatternSelection);
+
+
+        jFieldPatternJsonPath = new JTextField(patternJsonPathValue, 10);
+        jFieldPatternJsonPath.setEnabled(false);
+        jFieldPatternJsonPath.setPreferredSize(new Dimension(10, 25));
+        jFieldPatternJsonPath.addActionListener(this);
+        cPatternSelection.gridx = 1;
+        jpPatternSelection.add(jFieldPatternJsonPath, cPatternSelection);
+        jp02.add(jpPatternSelection, c02);
+
+        jp1.add("Pattern Integration", jp02);
+    }
+
+    protected void initComponents() {
+
+        jp1 = GraphicLib.createTabbedPane();
+        Container c = getContentPane();
+        setFont(new Font("Helvetica", Font.PLAIN, 14));
+        c.setLayout(new BorderLayout());
+
+        jta = new JPanel();
+        jta.setLayout(new GridBagLayout());
+        jta.setBorder(new javax.swing.border.TitledBorder("Results"));
+        Font f = new Font("Courrier", Font.BOLD, 12);
+        jta.setFont(f);
+
+        jsp = new JScrollPane(jta, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+        jsp.setPreferredSize(new Dimension(300, 100));
+        c.add(jsp, BorderLayout.CENTER);
+
+        startButton = new JButton("Start", IconManager.imgic53);
+        stop = new JButton("Stop", IconManager.imgic55);
+        close = new JButton("Close", IconManager.imgic27);
+
+        startButton.setPreferredSize(new Dimension(100, 30));
+        stop.setPreferredSize(new Dimension(100, 30));
+        close.setPreferredSize(new Dimension(120, 30));
+
+        startButton.addActionListener(this);
+        stop.addActionListener(this);
+        close.addActionListener(this);
+
+        JPanel jp2 = new JPanel();
+        jp2.add(startButton);
+        jp2.add(stop);
+        jp2.add(close);
+
+        panelPatternCreation();
+        panelPatternConfiguration();
+        panelPatternIntegration();
+
+        c.add(jp1, BorderLayout.NORTH);
+        c.add(jp2, BorderLayout.SOUTH);
+    }
+
+    private void removeTaskAsPattern() {
+        int[] list = jListSelectedTasksAsPattern.getSelectedIndices();
+        Vector<String> v = new Vector<String>();
+        String o;
+        for (int i = 0; i < list.length; i++) {
+            o = selectedTasksAsPattern.elementAt(list[i]);
+            noSelectedTasksAsPattern.addElement(o);
+            v.addElement(o);
+        }
+
+        selectedTasksAsPattern.removeAll(v);
+        jListNoSelectedTasksAsPattern.setListData(noSelectedTasksAsPattern);
+        jListSelectedTasksAsPattern.setListData(selectedTasksAsPattern);
+        setButtons();
+    }
+
+    private void addTaskAsPattern() {
+        int[] list = jListNoSelectedTasksAsPattern.getSelectedIndices();
+        Vector<String> v = new Vector<String>();
+        String o;
+
+        for (int i = 0; i < list.length; i++) {
+            o = noSelectedTasksAsPattern.elementAt(list[i]);
+            selectedTasksAsPattern.addElement(o);
+            v.addElement(o);
+        }
+        noSelectedTasksAsPattern.removeAll(v);
+        jListNoSelectedTasksAsPattern.setListData(noSelectedTasksAsPattern);
+        jListSelectedTasksAsPattern.setListData(selectedTasksAsPattern);
+        setButtons();
+    }
+
+    private void allTasksSelectedAsPattern() {
+        selectedTasksAsPattern.addAll(noSelectedTasksAsPattern);
+        noSelectedTasksAsPattern.removeAllElements();
+        jListNoSelectedTasksAsPattern.setListData(noSelectedTasksAsPattern);
+        jListSelectedTasksAsPattern.setListData(selectedTasksAsPattern);
+        setButtons();
+    }
+
+    private void allTasksNoSelectedAsPattern() {
+        noSelectedTasksAsPattern.addAll(selectedTasksAsPattern);
+        selectedTasksAsPattern.removeAllElements();
+        jListNoSelectedTasksAsPattern.setListData(noSelectedTasksAsPattern);
+        jListSelectedTasksAsPattern.setListData(selectedTasksAsPattern);
+        setButtons();
+    }
+
+    private void mapTasksManuallyInArchitecture() {
+        JDialog mapTasksInArchDialog = new JDialog(this.getOwner(), "Map manually tasks of the pattern in the architecture", Dialog.ModalityType.DOCUMENT_MODAL);
+        Container contMapTasksInArch = mapTasksInArchDialog.getContentPane();
+        contMapTasksInArch.setLayout(new BorderLayout());
+        JPanel jpMapTasksInArch = new JPanel();
+        jpMapTasksInArch.setLayout(new GridBagLayout());
+        GridBagConstraints cMapTasksInArch = new GridBagConstraints();
+        cMapTasksInArch.gridx = 0;
+        cMapTasksInArch.gridy = 0;
+        cMapTasksInArch.fill = GridBagConstraints.HORIZONTAL;
+        cMapTasksInArch.anchor = GridBagConstraints.FIRST_LINE_START;
+        cMapTasksInArch.weightx = 0.0;
+        cMapTasksInArch.insets = new Insets(10,0,0,0);  //top padding
+        jpMapTasksInArch.add(new JLabel("Select a Task to map:"), cMapTasksInArch);
+
+        jComboBoxTaskToMap = new JComboBox<String>(modelTaskToMap);
+        jComboBoxTaskToMap.setSelectedIndex(-1);
+        //jComboBoxTaskToMap.setEnabled(false);
+        jComboBoxTaskToMap.addActionListener(this);
+        //jComboBoxPortsConfigMerge.setPreferredSize(new Dimension(150, 25));
+        cMapTasksInArch.gridx = 1;
+        cMapTasksInArch.weightx = 1.0;
+        jpMapTasksInArch.add(jComboBoxTaskToMap, cMapTasksInArch);
+        cMapTasksInArch.gridx = 0;
+        cMapTasksInArch.gridy = 1;
+        cMapTasksInArch.weightx = 0.0;
+        
+        mapTaskGroup =new ButtonGroup();
+        jRadioMapTaskInExistingHw = new JRadioButton("Map in the same HW as : ");
+        jRadioMapTaskInExistingHw.setEnabled(false);
+        jRadioMapTaskInExistingHw.addActionListener(this);
+        jpMapTasksInArch.add(jRadioMapTaskInExistingHw, cMapTasksInArch);
+        cMapTasksInArch.gridx = 1;
+        cMapTasksInArch.weightx = 1.0;
+        jComboBoxMapTaskInSameHwAs = new JComboBox<String>(modelMapTaskInSameHwAs);
+        jComboBoxMapTaskInSameHwAs.setSelectedIndex(-1);
+        jComboBoxMapTaskInSameHwAs.setEnabled(false);
+        jComboBoxMapTaskInSameHwAs.addActionListener(this);
+        jpMapTasksInArch.add(jComboBoxMapTaskInSameHwAs, cMapTasksInArch);
+
+        cMapTasksInArch.gridy = 2;
+        cMapTasksInArch.gridx = 0;
+        cMapTasksInArch.weightx = 0.0;
+        jRadioMapTaskInNewHw = new JRadioButton("Map in a new HW that will be linked to bus :");
+        jRadioMapTaskInNewHw.setEnabled(false);
+        jRadioMapTaskInNewHw.addActionListener(this);
+        jpMapTasksInArch.add(jRadioMapTaskInNewHw, cMapTasksInArch);
+        cMapTasksInArch.gridx = 1;
+        cMapTasksInArch.weightx = 1.0;
+        busToLinkNewHw = new Vector<String>(busesOfModel) ;
+        jComboBoxMapTaskInNewHw = new JComboBox<String>(busToLinkNewHw);
+        jComboBoxMapTaskInNewHw.setSelectedIndex(-1);
+        jComboBoxMapTaskInNewHw.setEnabled(false);
+        jComboBoxMapTaskInNewHw.addActionListener(this);
+        jpMapTasksInArch.add(jComboBoxMapTaskInNewHw, cMapTasksInArch);
+        mapTaskGroup.add(jRadioMapTaskInExistingHw);
+        mapTaskGroup.add(jRadioMapTaskInNewHw);
+
+
+        jListMappedTasks = new JList<String>(mappedTasks);
+		JPanel jPanelMappedTasks = new JPanel();
+        jPanelMappedTasks.setLayout(new GridBagLayout());
+        GridBagConstraints cMappedTasks = new GridBagConstraints();
+        cMappedTasks.gridx = 0;
+        cMappedTasks.gridy = 0;
+        cMappedTasks.weightx = 0.95;
+        cMappedTasks.fill = GridBagConstraints.HORIZONTAL;
+        cMappedTasks.anchor = GridBagConstraints.LINE_START;
+        
+        jListMappedTasks.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
+        jListMappedTasks.addListSelectionListener(this);
+        JScrollPane scrollPaneMappedTasks = new JScrollPane(jListMappedTasks);
+        scrollPaneMappedTasks.setPreferredSize(new Dimension(250, 175));
+        jPanelMappedTasks.add(scrollPaneMappedTasks, cMappedTasks);
+        
+        JPanel pannelButtonMappedTasks = new JPanel();
+        pannelButtonMappedTasks.setLayout(new GridBagLayout());
+        GridBagConstraints cButtonMappedTasks = new GridBagConstraints();
+        cButtonMappedTasks.gridx = 0;
+        cButtonMappedTasks.weightx = 1.0;
+        cButtonMappedTasks.gridy = 0;
+        cButtonMappedTasks.fill = GridBagConstraints.HORIZONTAL;
+        cButtonMappedTasks.anchor = GridBagConstraints.LINE_START;
+        addMappedTask = new JButton("+");
+        addMappedTask.setEnabled(false);
+        addMappedTask.setPreferredSize(new Dimension(40, 25));
+        addMappedTask.addActionListener(this);
+        addMappedTask.setActionCommand("addMappedTask");
+        pannelButtonMappedTasks.add(addMappedTask, cButtonMappedTasks);
+
+        removeMappedTask = new JButton("-");
+        //removeMappedTask.setEnabled(false);
+        removeMappedTask.setPreferredSize(new Dimension(40, 25));
+        removeMappedTask.addActionListener(this);
+        removeMappedTask.setActionCommand("removeMappedTask");
+        cButtonMappedTasks.gridy = 1;
+        pannelButtonMappedTasks.add(removeMappedTask, cButtonMappedTasks);
+
+        cMappedTasks.gridx = 1;
+        cMappedTasks.weightx = 0.05;
+        jPanelMappedTasks.add(pannelButtonMappedTasks, cMappedTasks);
+        cMapTasksInArch.gridy = 3;
+        cMapTasksInArch.gridx = 0;
+        cMapTasksInArch.gridwidth = 2;
+        jpMapTasksInArch.add(jPanelMappedTasks, cMapTasksInArch);
+        contMapTasksInArch.add(jpMapTasksInArch, BorderLayout.NORTH);
+        GraphicLib.centerOnParent(mapTasksInArchDialog, 500, 400);
+        mapTasksInArchDialog.setVisible(true);
+    }
+
+    private void mapChannelsManuallyInArchitecture() {
+        JDialog mapChannelsInArchDialog = new JDialog(this.getOwner(), "Map manually channels of the pattern in the architecture", Dialog.ModalityType.DOCUMENT_MODAL);
+        Container contMapChannelsInArch = mapChannelsInArchDialog.getContentPane();
+        contMapChannelsInArch.setLayout(new BorderLayout());
+        JPanel jpMapChannelsInArch = new JPanel();
+        jpMapChannelsInArch.setLayout(new GridBagLayout());
+        GridBagConstraints cMapChannelsInArch = new GridBagConstraints();
+        cMapChannelsInArch.gridx = 0;
+        cMapChannelsInArch.gridy = 0;
+        cMapChannelsInArch.fill = GridBagConstraints.HORIZONTAL;
+        cMapChannelsInArch.anchor = GridBagConstraints.FIRST_LINE_START;
+        cMapChannelsInArch.weightx = 0.0;
+        cMapChannelsInArch.insets = new Insets(10,0,0,0);  //top padding
+        jpMapChannelsInArch.add(new JLabel("Select a Channel to map:"), cMapChannelsInArch);
+
+        jComboBoxChannelToMap = new JComboBox<String>(modelChannelToMap);
+        jComboBoxChannelToMap.setSelectedIndex(-1);
+        //jComboBoxChannelToMap.setEnabled(false);
+        jComboBoxChannelToMap.addActionListener(this);
+        //jComboBoxPortsConfigMerge.setPreferredSize(new Dimension(150, 25));
+        cMapChannelsInArch.gridx = 1;
+        cMapChannelsInArch.weightx = 1.0;
+        jpMapChannelsInArch.add(jComboBoxChannelToMap, cMapChannelsInArch);
+        cMapChannelsInArch.gridx = 0;
+        cMapChannelsInArch.gridy = 1;
+        cMapChannelsInArch.weightx = 0.0;
+        
+        mapChannelGroup =new ButtonGroup();
+        jRadioMapChannelInExistingMem = new JRadioButton("Map in the same Memory as : ");
+        jRadioMapChannelInExistingMem.setEnabled(false);
+        jRadioMapChannelInExistingMem.addActionListener(this);
+        jpMapChannelsInArch.add(jRadioMapChannelInExistingMem, cMapChannelsInArch);
+        cMapChannelsInArch.gridx = 1;
+        cMapChannelsInArch.weightx = 1.0;
+        jComboBoxMapChannelInSameMemAs = new JComboBox<String>(modelMapChannelInSameMemAs);
+        jComboBoxMapChannelInSameMemAs.setSelectedIndex(-1);
+        jComboBoxMapChannelInSameMemAs.setEnabled(false);
+        jComboBoxMapChannelInSameMemAs.addActionListener(this);
+        jpMapChannelsInArch.add(jComboBoxMapChannelInSameMemAs, cMapChannelsInArch);
+
+        cMapChannelsInArch.gridy = 2;
+        cMapChannelsInArch.gridx = 0;
+        cMapChannelsInArch.weightx = 0.0;
+        jRadioMapChannelInNewMem = new JRadioButton("Map in a new Memory that will be linked to bus :");
+        jRadioMapChannelInNewMem.setEnabled(false);
+        jRadioMapChannelInNewMem.addActionListener(this);
+        jpMapChannelsInArch.add(jRadioMapChannelInNewMem, cMapChannelsInArch);
+        cMapChannelsInArch.gridx = 1;
+        cMapChannelsInArch.weightx = 1.0;
+        busToLinkNewMem = new Vector<String>(busesOfModel) ;
+        jComboBoxMapChannelInNewMem = new JComboBox<String>(busToLinkNewMem);
+        jComboBoxMapChannelInNewMem.setSelectedIndex(-1);
+        jComboBoxMapChannelInNewMem.setEnabled(false);
+        jComboBoxMapChannelInNewMem.addActionListener(this);
+        jpMapChannelsInArch.add(jComboBoxMapChannelInNewMem, cMapChannelsInArch);
+        mapChannelGroup.add(jRadioMapChannelInExistingMem);
+        mapChannelGroup.add(jRadioMapChannelInNewMem);
+
+
+        jListMappedChannels = new JList<String>(mappedChannels);
+		JPanel jPanelMappedChannels = new JPanel();
+        jPanelMappedChannels.setLayout(new GridBagLayout());
+        GridBagConstraints cMappedChannels = new GridBagConstraints();
+        cMappedChannels.gridx = 0;
+        cMappedChannels.gridy = 0;
+        cMappedChannels.weightx = 0.95;
+        cMappedChannels.fill = GridBagConstraints.HORIZONTAL;
+        cMappedChannels.anchor = GridBagConstraints.LINE_START;
+        
+        jListMappedChannels.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
+        jListMappedChannels.addListSelectionListener(this);
+        JScrollPane scrollPaneMappedChannels = new JScrollPane(jListMappedChannels);
+        scrollPaneMappedChannels.setPreferredSize(new Dimension(250, 175));
+        jPanelMappedChannels.add(scrollPaneMappedChannels, cMappedChannels);
+        
+        JPanel pannelButtonMappedChannels = new JPanel();
+        pannelButtonMappedChannels.setLayout(new GridBagLayout());
+        GridBagConstraints cButtonMappedChannels = new GridBagConstraints();
+        cButtonMappedChannels.gridx = 0;
+        cButtonMappedChannels.weightx = 1.0;
+        cButtonMappedChannels.gridy = 0;
+        cButtonMappedChannels.fill = GridBagConstraints.HORIZONTAL;
+        cButtonMappedChannels.anchor = GridBagConstraints.LINE_START;
+        addMappedChannel = new JButton("+");
+        addMappedChannel.setEnabled(false);
+        addMappedChannel.setPreferredSize(new Dimension(40, 25));
+        addMappedChannel.addActionListener(this);
+        addMappedChannel.setActionCommand("addMappedChannel");
+        pannelButtonMappedChannels.add(addMappedChannel, cButtonMappedChannels);
+
+        removeMappedChannel = new JButton("-");
+        //removeMappedChannel.setEnabled(false);
+        removeMappedChannel.setPreferredSize(new Dimension(40, 25));
+        removeMappedChannel.addActionListener(this);
+        removeMappedChannel.setActionCommand("removeMappedChannel");
+        cButtonMappedChannels.gridy = 1;
+        pannelButtonMappedChannels.add(removeMappedChannel, cButtonMappedChannels);
+
+        cMappedChannels.gridx = 1;
+        cMappedChannels.weightx = 0.05;
+        jPanelMappedChannels.add(pannelButtonMappedChannels, cMappedChannels);
+        cMapChannelsInArch.gridy = 3;
+        cMapChannelsInArch.gridx = 0;
+        cMapChannelsInArch.gridwidth = 2;
+        jpMapChannelsInArch.add(jPanelMappedChannels, cMapChannelsInArch);
+        contMapChannelsInArch.add(jpMapChannelsInArch, BorderLayout.NORTH);
+        GraphicLib.centerOnParent(mapChannelsInArchDialog, 500, 400);
+        mapChannelsInArchDialog.setVisible(true);
+    }
+
+    private void cloneTask() {
+        JDialog cloneTaskDialog = new JDialog(this.getOwner(), "Clone a Task", Dialog.ModalityType.DOCUMENT_MODAL);
+        Container contCloneTask = cloneTaskDialog.getContentPane();
+        contCloneTask.setLayout(new BorderLayout());
+        JPanel jpCloneTask = new JPanel();
+        jpCloneTask.setLayout(new GridBagLayout());
+        GridBagConstraints cCloneTask = new GridBagConstraints();
+        cCloneTask.gridx = 0;
+        cCloneTask.gridy = 0;
+        cCloneTask.fill = GridBagConstraints.HORIZONTAL;
+        cCloneTask.anchor = GridBagConstraints.FIRST_LINE_START;
+        cCloneTask.weightx = 1.0;
+        cCloneTask.insets = new Insets(10,0,0,0);  //top padding
+        jpCloneTask.add(new JLabel("Select a Task to clone:"), cCloneTask);
+
+        tasksCanBeCloned.removeAllElements();
+        for (String s : portsTaskOfModelAll.keySet()) {
+            tasksCanBeCloned.add(s);
+        }
+        jComboBoxTaskToClone = new JComboBox<String>(modelTaskToClone);
+        jComboBoxTaskToClone.setSelectedIndex(-1);
+        //jComboBoxTaskToClone.setEnabled(false);
+        jComboBoxTaskToClone.addActionListener(this);
+        //jComboBoxPortsConfigMerge.setPreferredSize(new Dimension(150, 25));
+        cCloneTask.gridx = 1;
+        jpCloneTask.add(jComboBoxTaskToClone, cCloneTask);
+        cCloneTask.gridx = 0;
+        cCloneTask.gridy = 1;
+        jpCloneTask.add(new JLabel("Cloned task name:"), cCloneTask);
+        jFieldNewClonedTaskName = new JTextField(newClonedTaskName, 10);
+        jFieldNewClonedTaskName.setEnabled(false);
+        jFieldNewClonedTaskName.setPreferredSize(new Dimension(10, 25));
+        cCloneTask.gridx = 1;
+        jpCloneTask.add(jFieldNewClonedTaskName, cCloneTask);
+
+        jListClonedTasks = new JList<String>(clonedTasks);
+		JPanel jPanelClonedTasks = new JPanel();
+        jPanelClonedTasks.setLayout(new GridBagLayout());
+        GridBagConstraints cClonedTasks = new GridBagConstraints();
+        cClonedTasks.gridx = 0;
+        cClonedTasks.gridy = 0;
+        cClonedTasks.weightx = 0.95;
+        cClonedTasks.fill = GridBagConstraints.HORIZONTAL;
+        cClonedTasks.anchor = GridBagConstraints.LINE_START;
+        
+        jListClonedTasks.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
+        jListClonedTasks.addListSelectionListener(this);
+        JScrollPane scrollPaneClonedTasks = new JScrollPane(jListClonedTasks);
+        scrollPaneClonedTasks.setPreferredSize(new Dimension(250, 150));
+        jPanelClonedTasks.add(scrollPaneClonedTasks, cClonedTasks);
+        
+        JPanel pannelButtonClonedTasks = new JPanel();
+        pannelButtonClonedTasks.setLayout(new GridBagLayout());
+        GridBagConstraints cButtonClonedTasks = new GridBagConstraints();
+        cButtonClonedTasks.gridx = 0;
+        cButtonClonedTasks.weightx = 1.0;
+        cButtonClonedTasks.gridy = 0;
+        cButtonClonedTasks.fill = GridBagConstraints.HORIZONTAL;
+        cButtonClonedTasks.anchor = GridBagConstraints.LINE_START;
+        addClonedTask = new JButton("+");
+        addClonedTask.setEnabled(false);
+        addClonedTask.setPreferredSize(new Dimension(40, 25));
+        addClonedTask.addActionListener(this);
+        addClonedTask.setActionCommand("addClonedTask");
+        pannelButtonClonedTasks.add(addClonedTask, cButtonClonedTasks);
+
+        removeClonedTask = new JButton("-");
+        //removeClonedTask.setEnabled(false);
+        removeClonedTask.setPreferredSize(new Dimension(40, 25));
+        removeClonedTask.addActionListener(this);
+        removeClonedTask.setActionCommand("removeClonedTask");
+        cButtonClonedTasks.gridy = 1;
+        pannelButtonClonedTasks.add(removeClonedTask, cButtonClonedTasks);
+
+        cClonedTasks.gridx = 1;
+        cClonedTasks.weightx = 0.05;
+        jPanelClonedTasks.add(pannelButtonClonedTasks, cClonedTasks);
+        cCloneTask.gridy = 2;
+        cCloneTask.gridx = 0;
+        cCloneTask.gridwidth = 2;
+        jpCloneTask.add(jPanelClonedTasks, cCloneTask);
+        contCloneTask.add(jpCloneTask, BorderLayout.NORTH);
+        GraphicLib.centerOnParent(cloneTaskDialog, 470, 350);
+        cloneTaskDialog.setVisible(true);
+    }
+
+    private void updatePatternsAttributes() {
+        JDialog updatePatternsAttributesDialog = new JDialog(this.getOwner(), "Update Pattern's Attributes Values", Dialog.ModalityType.DOCUMENT_MODAL);
+        Container contUpdatePatternsAttributes = updatePatternsAttributesDialog.getContentPane();
+        contUpdatePatternsAttributes.setLayout(new BorderLayout());
+        JPanel jpUpdatePatternsAttributes = new JPanel();
+        jpUpdatePatternsAttributes.setLayout(new GridBagLayout());
+        GridBagConstraints cUpdatePatternsAttributes = new GridBagConstraints();
+        cUpdatePatternsAttributes.gridx = 0;
+        cUpdatePatternsAttributes.gridy = 0;
+        cUpdatePatternsAttributes.fill = GridBagConstraints.HORIZONTAL;
+        cUpdatePatternsAttributes.anchor = GridBagConstraints.FIRST_LINE_START;
+        cUpdatePatternsAttributes.weightx = 1.0;
+        cUpdatePatternsAttributes.insets = new Insets(10,0,0,0);  //top padding
+        jpUpdatePatternsAttributes.add(new JLabel("Select a Task to update its attributes:"), cUpdatePatternsAttributes);
+
+        tasksToUpdateAttributes.removeAllElements();
+        for (String s : patternTasksAll.keySet()) {
+            tasksToUpdateAttributes.add(s);
+        }
+        jComboBoxTasksToUpdateAttributes = new JComboBox<String>(modelTasksToUpdateAttributes);
+        jComboBoxTasksToUpdateAttributes.setSelectedIndex(-1);
+        //jComboBoxTasksToUpdateAttributes.setEnabled(false);
+        jComboBoxTasksToUpdateAttributes.addActionListener(this);
+        cUpdatePatternsAttributes.gridx = 1;
+        jpUpdatePatternsAttributes.add(jComboBoxTasksToUpdateAttributes, cUpdatePatternsAttributes);
+
+        cUpdatePatternsAttributes.gridx = 0;
+        cUpdatePatternsAttributes.gridy = 1;
+        jpUpdatePatternsAttributes.add(new JLabel("Select an attribute to update:"), cUpdatePatternsAttributes);
+        attributesOfTaskToUpdate.removeAllElements();
+        jComboBoxAttributesOfTaskToUpdate = new JComboBox<String>(modelAttributesOfTaskToUpdate);
+        jComboBoxAttributesOfTaskToUpdate.setSelectedIndex(-1);
+        jComboBoxAttributesOfTaskToUpdate.setEnabled(false);
+        jComboBoxAttributesOfTaskToUpdate.addActionListener(this);
+        cUpdatePatternsAttributes.gridx = 1;
+        jpUpdatePatternsAttributes.add(jComboBoxAttributesOfTaskToUpdate, cUpdatePatternsAttributes);
+
+        cUpdatePatternsAttributes.gridx = 0;
+        cUpdatePatternsAttributes.gridy = 2;
+        jpUpdatePatternsAttributes.add(new JLabel("New Value:"), cUpdatePatternsAttributes);
+        jFieldNewTaskAttibuteValue = new JTextField(newTaskAttibuteValue, 10);
+        jFieldNewTaskAttibuteValue.setEnabled(false);
+        jFieldNewTaskAttibuteValue.setPreferredSize(new Dimension(10, 25));
+        jFieldNewTaskAttibuteValue.addActionListener(this);
+        cUpdatePatternsAttributes.gridx = 1;
+        jpUpdatePatternsAttributes.add(jFieldNewTaskAttibuteValue, cUpdatePatternsAttributes);
+        
+        JPanel pannelButtonUpdatePatternsAttributesValues = new JPanel();
+        pannelButtonUpdatePatternsAttributesValues.setLayout(new GridBagLayout());
+        GridBagConstraints cButtonUpdatePatternsAttributesValues = new GridBagConstraints();
+        cButtonUpdatePatternsAttributesValues.gridx = 0;
+        cButtonUpdatePatternsAttributesValues.weightx = 1.0;
+        cButtonUpdatePatternsAttributesValues.gridy = 0;
+        cButtonUpdatePatternsAttributesValues.fill = GridBagConstraints.HORIZONTAL;
+        cButtonUpdatePatternsAttributesValues.anchor = GridBagConstraints.LINE_START;
+        buttonUpdateTaskAttributeValue = new JButton("Update");
+        buttonUpdateTaskAttributeValue.setEnabled(false);
+        buttonUpdateTaskAttributeValue.setPreferredSize(new Dimension(100, 50));
+        buttonUpdateTaskAttributeValue.addActionListener(this);
+        buttonUpdateTaskAttributeValue.setActionCommand("updateTaskAttributeValue");
+        pannelButtonUpdatePatternsAttributesValues.add(buttonUpdateTaskAttributeValue, cButtonUpdatePatternsAttributesValues);
+
+        cUpdatePatternsAttributes.gridy = 3;
+        cUpdatePatternsAttributes.gridx = 0;
+        cUpdatePatternsAttributes.gridwidth = 2;
+        cUpdatePatternsAttributes.fill = GridBagConstraints.NONE;
+        cUpdatePatternsAttributes.anchor = GridBagConstraints.CENTER;
+        jpUpdatePatternsAttributes.add(pannelButtonUpdatePatternsAttributesValues, cUpdatePatternsAttributes);
+        contUpdatePatternsAttributes.add(jpUpdatePatternsAttributes, BorderLayout.NORTH);
+        GraphicLib.centerOnParent(updatePatternsAttributesDialog, 470, 350);
+        updatePatternsAttributesDialog.setVisible(true);
+    }
+
+    private void updateTaskAttributeValue() {
+        String selectedTaskToUpdateAttributes = jComboBoxTasksToUpdateAttributes.getSelectedItem().toString();
+        String selectedAttributeToUpdate = jComboBoxAttributesOfTaskToUpdate.getSelectedItem().toString();
+        String newValueAttribute = jFieldNewTaskAttibuteValue.getText();
+        if (newValueAttribute.matches("-?\\d+") || newValueAttribute.matches("(?i)^(true|false)")) {
+            for (AttributeTaskJsonFile attributeTaskJsonFile : patternTasksAll.get(selectedTaskToUpdateAttributes).getAttributes()) {
+                if (attributeTaskJsonFile.getName().equals(selectedAttributeToUpdate)) {
+                    attributeTaskJsonFile.setValue(newValueAttribute);
+                    jFieldNewTaskAttibuteValue.setText(attributeTaskJsonFile.getValue());
+                    if (updatedPatternAttributes.containsKey(selectedTaskToUpdateAttributes)) {
+                        boolean attributeExist = false;
+                        for (AttributeTaskJsonFile attribUpdate : updatedPatternAttributes.get(selectedTaskToUpdateAttributes)) {
+                            if (attribUpdate.getName().equals(selectedAttributeToUpdate)) {
+                                attribUpdate.setValue(newValueAttribute);
+                                attributeExist = true;
+                            }
+                        }
+                        if (!attributeExist) {
+                            AttributeTaskJsonFile attrib = new AttributeTaskJsonFile(selectedAttributeToUpdate, attributeTaskJsonFile.getType(), newValueAttribute);
+                            updatedPatternAttributes.get(selectedTaskToUpdateAttributes).add(attrib);
+                        }
+                    } else {
+                        List<AttributeTaskJsonFile> listAttrib = new ArrayList<AttributeTaskJsonFile>();
+                        AttributeTaskJsonFile attrib = new AttributeTaskJsonFile(selectedAttributeToUpdate, attributeTaskJsonFile.getType(), newValueAttribute);
+                        listAttrib.add(attrib);
+                        updatedPatternAttributes.put(selectedTaskToUpdateAttributes, listAttrib);
+                    }
+                    
+                }
+            }
+        }
+    }
+
+    private void addConnectionBetweenSelectedPorts() {
+        String patternTaskName = jComboBoxPatternsTaskWithExternalPort.getSelectedItem().toString();
+        String patternTaskPortName = jComboBoxPatternExternalPortOfATask.getSelectedItem().toString();
+        String modelTaskName = jComboBoxModelsTask.getSelectedItem().toString();
+        String modelTaskPortName = jComboBoxModelsPortOfTask.getSelectedItem().toString();
+        Boolean isNewPort = jCheckBoxConnectToNewPort.isSelected();
+        PatternConnection patternConnection = new PatternConnection(patternTaskName, patternTaskPortName, modelTaskName, modelTaskPortName, isNewPort);
+        
+        connectedPorts.add(patternConnection.getStringDisplay());
+        if (!isNewPort) {
+            TaskPorts pt = portsTaskOfModelLeft.get(modelTaskName);
+            if (pt.getWriteChannels().contains(modelTaskPortName)) {
+                pt.getWriteChannels().remove(modelTaskPortName);
+            } else if (pt.getReadChannels().contains(modelTaskPortName)) {
+                pt.getReadChannels().remove(modelTaskPortName);
+            } else if (pt.getSendEvents().contains(modelTaskPortName)) {
+                pt.getSendEvents().remove(modelTaskPortName);
+            } else if (pt.getWaitEvents().contains(modelTaskPortName)) {
+                pt.getWaitEvents().remove(modelTaskPortName);
+            } 
+        }
+        TaskPattern tp = patternTasksNotConnected.get(patternTaskName);
+        int indexElemToRemove = -1;
+        for (int i = 0; i < tp.getExternalPorts().size(); i++){
+            if (tp.getExternalPorts().get(i).getName().equals(patternTaskPortName)) {
+                indexElemToRemove = i;
+                break;
+            }
+        }
+        if (indexElemToRemove >= 0) {
+            tp.getExternalPorts().remove(indexElemToRemove);
+        }
+        if (tp.getExternalPorts().size() == 0) {
+            patternTasksNotConnected.remove(patternTaskName);
+            tasksOfPatternWithExternalPort.removeAllElements();
+            for (String pTaskName : patternTasksNotConnected.keySet()) {
+                if (patternTasksNotConnected.get(pTaskName).getExternalPorts().size() > 0) {
+                    tasksOfPatternWithExternalPort.add(pTaskName);
+                }
+            }
+        }
+
+        for (PortTaskJsonFile  portTaskJsonFile : patternTasksAll.get(patternTaskName).getExternalPorts()) {
+            if (portTaskJsonFile.getName().equals(patternTaskPortName)) {
+                if (portTaskJsonFile.getType().equals(PatternCreation.CHANNEL)) {
+                    if (jCheckBoxAddConfidentiality.isSelected()) {
+                        portTaskJsonFile.setConfidentiality(PatternCreation.WITH_CONFIDENTIALITY);
+                    } else {
+                        portTaskJsonFile.setConfidentiality(PatternCreation.WITHOUT_CONFIDENTIALITY);
+                    }
+                    portTaskJsonFile.setAuthenticity(jComboBoxAddAuthenticity.getSelectedItem().toString());
+                    break;
+                }
+            }
+        }
+
+        patternConnectionList.add(patternConnection);
+        
+        /*if (jCheckBoxAddConfidentiality.isSelected() || (jComboBoxAddAuthenticity.getSelectedIndex() >= 0 && !jComboBoxAddAuthenticity.getSelectedItem().toString().toUpperCase().equals(PatternCreation.WITHOUT_AUTHENTICITY.toUpperCase()))) {
+            if (channelsWithSecurity.containsKey(patternTaskName)) {
+                boolean channelWithSecToUpdate = false;
+                for (PortTaskJsonFile pt : channelsWithSecurity.get(patternTaskName)) {
+                    if (pt.getName().equals(patternTaskPortName)) {
+                        if (jCheckBoxAddConfidentiality.isSelected()) {
+                            pt.setConfidentiality(PatternCreation.WITH_CONFIDENTIALITY);
+                        }
+                        if (jComboBoxAddAuthenticity.getSelectedIndex() >= 0 && !jComboBoxAddAuthenticity.getSelectedItem().toString().toUpperCase().equals(PatternCreation.WITHOUT_AUTHENTICITY.toUpperCase())) {
+                            pt.setAuthenticity(jComboBoxAddAuthenticity.getSelectedItem().toString());
+                        }
+                        channelWithSecToUpdate = true;
+                        break;
+                    }
+                }
+                if (!channelWithSecToUpdate) {
+                    for (PortTaskJsonFile  portTaskJsonFile : patternTasksAll.get(patternTaskName).getExternalPorts()) {
+                        if (portTaskJsonFile.getName().equals(patternTaskPortName)) {
+                            if (jCheckBoxAddConfidentiality.isSelected()) {
+                                portTaskJsonFile.setConfidentiality(PatternCreation.WITH_CONFIDENTIALITY);
+                            }
+                            if (jComboBoxAddAuthenticity.getSelectedIndex() >= 0 && !jComboBoxAddAuthenticity.getSelectedItem().toString().toUpperCase().equals(PatternCreation.WITHOUT_AUTHENTICITY.toUpperCase())) {
+                                portTaskJsonFile.setAuthenticity(jComboBoxAddAuthenticity.getSelectedItem().toString());
+                            }
+                            channelsWithSecurity.get(patternTaskName).add(portTaskJsonFile);
+                            break;
+                        }
+                    }
+                }
+            } else {
+                List<PortTaskJsonFile> channelWithSecInfo = new ArrayList<PortTaskJsonFile>();
+                for (PortTaskJsonFile  portTaskJsonFile : patternTasksAll.get(patternTaskName).getExternalPorts()) {
+                    if (portTaskJsonFile.getName().equals(patternTaskPortName)) {
+                        if (jCheckBoxAddConfidentiality.isSelected()) {
+                            portTaskJsonFile.setConfidentiality(PatternCreation.WITH_CONFIDENTIALITY);
+                        }
+                        if (jComboBoxAddAuthenticity.getSelectedIndex() >= 0 && !jComboBoxAddAuthenticity.getSelectedItem().toString().toUpperCase().equals(PatternCreation.WITHOUT_AUTHENTICITY.toUpperCase())) {
+                            portTaskJsonFile.setAuthenticity(jComboBoxAddAuthenticity.getSelectedItem().toString());
+                        }
+                        channelWithSecInfo.add(portTaskJsonFile);
+                        channelsWithSecurity.put(patternTaskName, channelWithSecInfo);
+                        break;
+                    }
+                }
+            } 
+        }*/
+
+        jComboBoxPatternsTaskWithExternalPort.setSelectedIndex(-1);
+        jCheckBoxConnectToNewPort.setSelected(false);
+        jListConnectedPorts.setListData(connectedPorts);
+        setButtons();
+    }
+
+    private void removeConnectionBetweenPorts() {
+        int[] list = jListConnectedPorts.getSelectedIndices();
+        List<PatternConnection> patternConnectionsToRemove = new ArrayList<PatternConnection>();
+        for (int i = 0; i < list.length; i++) {
+            PatternConnection patternConnection = patternConnectionList.get(list[i]);
+            String patternTaskName = patternConnection.getPatternTaskName();
+            String patternTaskPortName = patternConnection.getPatternChannel();
+            String modelTaskName = patternConnection.getModelTaskName();
+            String modelTaskPortName = patternConnection.getModelChannelName();
+            for (String patternTask : patternTasksAll.keySet()) {
+                for (PortTaskJsonFile  portTaskJsonFile : patternTasksAll.get(patternTask).getExternalPorts()) {
+                    if (portTaskJsonFile.getName().equals(patternTaskPortName)) {
+                        if (patternTasksNotConnected.containsKey(patternTaskName)) {
+                            TaskPattern tp  = patternTasksNotConnected.get(patternTaskName);
+                            tp.getExternalPorts().add(portTaskJsonFile);
+                        } else {
+                            List<PortTaskJsonFile> portTaskJsonFilesList = new ArrayList<PortTaskJsonFile>(Arrays.asList(portTaskJsonFile));
+                            TaskPattern tp = new TaskPattern(patternTasksAll.get(patternTask).getAttributes(), patternTasksAll.get(patternTask).getInternalPorts(), portTaskJsonFilesList);
+                            patternTasksNotConnected.put(patternTaskName, tp);
+                            tasksOfPatternWithExternalPort.removeAllElements();
+                            for (String pTaskName : patternTasksNotConnected.keySet()) {
+                                if (patternTasksNotConnected.get(pTaskName).getExternalPorts().size() > 0) {
+                                    tasksOfPatternWithExternalPort.add(pTaskName);
+                                }
+                            }
+                        }
+                        break;
+                    }
+                }
+            }
+            if (!patternConnection.isNewPort()) {
+                TaskPorts pt = portsTaskOfModelLeft.get(modelTaskName);
+                TaskPorts ptAll = portsTaskOfModelAll.get(modelTaskName);
+                if (ptAll.getWriteChannels().contains(modelTaskPortName)) {
+                    pt.getWriteChannels().add(modelTaskPortName);
+                } else if (ptAll.getReadChannels().contains(modelTaskPortName)) {
+                    pt.getReadChannels().add(modelTaskPortName);
+                } else if (ptAll.getSendEvents().contains(modelTaskPortName)) {
+                    pt.getSendEvents().add(modelTaskPortName);
+                } else if (ptAll.getWaitEvents().contains(modelTaskPortName)) {
+                    pt.getWaitEvents().add(modelTaskPortName);
+                } 
+            }
+            connectedPorts.remove(list[i]);
+            patternConnectionsToRemove.add(patternConnection);
+            jComboBoxPatternsTaskWithExternalPort.setSelectedIndex(-1);
+            jCheckBoxConnectToNewPort.setSelected(false);
+        }
+        patternConnectionList.removeAll(patternConnectionsToRemove);
+        jListConnectedPorts.setListData(connectedPorts);
+        setButtons();
+    }
+
+    private void addClonedTask() {
+        String selectedTaskToClone = jComboBoxTaskToClone.getSelectedItem().toString();
+        String nameNewTaskToClone = jFieldNewClonedTaskName.getText();
+        
+        if (!tasksCanBeCloned.contains(nameNewTaskToClone) && !tasksOfModel.contains(nameNewTaskToClone) && !nameNewTaskToClone.contains(" ")) {
+            PatternCloneTask patternCloneTask = new PatternCloneTask(nameNewTaskToClone, selectedTaskToClone);
+            clonedTasks.add(patternCloneTask.getStringDisplay());
+            clonedTasksList.add(patternCloneTask);
+            List<String> wcs = new ArrayList<String>(portsTaskOfModelAll.get(selectedTaskToClone).getWriteChannels());
+            List<String> rcs = new ArrayList<String>(portsTaskOfModelAll.get(selectedTaskToClone).getReadChannels());
+            List<String> ses = new ArrayList<String>(portsTaskOfModelAll.get(selectedTaskToClone).getSendEvents());
+            List<String> wes = new ArrayList<String>(portsTaskOfModelAll.get(selectedTaskToClone).getWaitEvents());
+
+            List<String> wcs1 = new ArrayList<String>(portsTaskOfModelAll.get(selectedTaskToClone).getWriteChannels());
+            List<String> rcs1 = new ArrayList<String>(portsTaskOfModelAll.get(selectedTaskToClone).getReadChannels());
+            List<String> ses1 = new ArrayList<String>(portsTaskOfModelAll.get(selectedTaskToClone).getSendEvents());
+            List<String> wes1 = new ArrayList<String>(portsTaskOfModelAll.get(selectedTaskToClone).getWaitEvents());
+
+            TaskPorts portTasksClone = new TaskPorts(wcs, rcs, ses, wes);
+            TaskPorts portTasksClone1 = new TaskPorts(wcs1, rcs1, ses1, wes1);
+            portsTaskOfModelLeft.put(nameNewTaskToClone, portTasksClone);
+            portsTaskOfModelAll.put(nameNewTaskToClone, portTasksClone1);
+        }
+        tasksOfModel.removeAllElements();
+        for (String pTaskName : portsTaskOfModelLeft.keySet()) {
+            tasksOfModel.add(pTaskName);
+        }
+        jListClonedTasks.setListData(clonedTasks);
+        setButtons();
+    }
+
+    private void removeClonedTask() {
+        int[] list = jListClonedTasks.getSelectedIndices();
+        List<PatternCloneTask> patternCloneTasksToRemove = new ArrayList<PatternCloneTask>();
+        for (int i = 0; i < list.length; i++) {
+            PatternCloneTask patternCloneTask = clonedTasksList.get(list[i]);
+            patternCloneTasksToRemove.add(patternCloneTask);
+            portsTaskOfModelLeft.remove(patternCloneTask.getClonedTask());
+            portsTaskOfModelAll.remove(patternCloneTask.getClonedTask());
+            List<PatternConnection> patternConnectionsToRemove = new ArrayList<PatternConnection>();
+            for (PatternConnection pConnection : patternConnectionList) {
+                String patternTaskName = pConnection.getPatternTaskName();
+                String patternTaskPortName = pConnection.getPatternChannel();
+                String modelTaskName = pConnection.getModelTaskName();
+
+                if (modelTaskName.equals(patternCloneTask.getClonedTask())) {
+                    for (String patternTask : patternTasksAll.keySet()) {
+                        for (PortTaskJsonFile  portTaskJsonFile : patternTasksAll.get(patternTask).getExternalPorts()) {
+                            if (portTaskJsonFile.getName().equals(patternTaskPortName)) {
+                                if (patternTasksNotConnected.containsKey(patternTaskName)) {
+                                    TaskPattern tp  = patternTasksNotConnected.get(patternTaskName);
+                                    tp.getExternalPorts().add(portTaskJsonFile);
+                                } else {
+                                    List<PortTaskJsonFile> portTaskJsonFilesList = new ArrayList<PortTaskJsonFile>(Arrays.asList(portTaskJsonFile));
+                                    TaskPattern tp = new TaskPattern(patternTasksAll.get(patternTask).getAttributes(), patternTasksAll.get(patternTask).getInternalPorts(), portTaskJsonFilesList);
+                                    patternTasksNotConnected.put(patternTaskName, tp);
+                                    tasksOfPatternWithExternalPort.removeAllElements();
+                                    for (String pTaskName : patternTasksNotConnected.keySet()) {
+                                        if (patternTasksNotConnected.get(pTaskName).getExternalPorts().size() > 0) {
+                                            tasksOfPatternWithExternalPort.add(pTaskName);
+                                        }
+                                    }
+                                }
+                                break;
+                            }
+                        }
+                    }
+                    connectedPorts.remove(pConnection.getStringDisplay());
+                    patternConnectionsToRemove.add(pConnection);
+                }
+            }
+            clonedTasks.remove(list[i]);
+            patternConnectionList.removeAll(patternConnectionsToRemove);
+            jListConnectedPorts.setListData(connectedPorts);
+        }
+        clonedTasksList.removeAll(patternCloneTasksToRemove);
+
+        tasksOfModel.removeAllElements();
+        for (String pTaskName : portsTaskOfModelLeft.keySet()) {
+            tasksOfModel.add(pTaskName);
+        }
+        jListClonedTasks.setListData(clonedTasks);
+        setButtons();
+    }
+
+    private void addConfigPorts() {
+        String selectedTaskToConfig = jComboBoxPortsConfig.getSelectedItem().toString();
+        String[] taskAndChannelSelected = PatternPortsConfig.seperateTaskAndChannel(selectedTaskToConfig);
+        PatternPortsConfig patternPortConfig = new PatternPortsConfig(taskAndChannelSelected[0], taskAndChannelSelected[1]);
+        if (jRadioPortConfigRemove.isSelected()) {
+            patternPortConfig.setIsChannelToRemove(true);
+        } else if (jRadioPortConfigMerge.isSelected()) {
+            patternPortConfig.setMergeWith(jComboBoxPortsConfigMerge.getSelectedItem().toString());
+        }
+        configuredPorts.add(patternPortConfig.getStringDisplay());
+        configuredPortsList.add(patternPortConfig);
+        portsConfig.remove(selectedTaskToConfig);
+        jComboBoxPortsConfig.setSelectedIndex(-1);
+        jListConfigPorts.setListData(configuredPorts);
+        setButtons();
+    }
+
+    private void removeConfigPorts() {
+        int[] list = jListConfigPorts.getSelectedIndices();
+        List<PatternPortsConfig> patternPortsConfigToRemove = new ArrayList<PatternPortsConfig>();
+        for (int i = 0; i < list.length; i++) {
+            PatternPortsConfig patternPortConfigToRemove = configuredPortsList.get(list[i]);
+            portsConfig.add(patternPortConfigToRemove.getTaskChannelToConfig());
+            configuredPorts.remove(list[i]);
+            patternPortsConfigToRemove.add(patternPortConfigToRemove);
+        }
+        configuredPortsList.removeAll(patternPortsConfigToRemove);
+        jListConfigPorts.setListData(configuredPorts);
+        jComboBoxPortsConfig.setSelectedIndex(-1);
+        setButtons();
+    }
+
+    private void addMappedTask() {
+        //String selectedTaskToMap = jComboBoxTaskToMap.getSelectedItem().toString();
+        int selectedTaskToMapIndice = jComboBoxTaskToMap.getSelectedIndex();
+        MappingPatternTask mappingPatternTask = tasksToMapList.get(selectedTaskToMapIndice);
+        if (jRadioMapTaskInExistingHw.isSelected()) {
+            int selectedTaskInSameHwIndice = jComboBoxMapTaskInSameHwAs.getSelectedIndex();
+            MappingPatternTask sameHwTask = tasksToMapInSameHwList.get(selectedTaskInSameHwIndice);
+            mappingPatternTask.setSameHwAs(sameHwTask.getTaskToMapName(), sameHwTask.getOrigin());
+        } else if (jRadioMapTaskInNewHw.isSelected()) {
+            mappingPatternTask.setBusNameForNewHw(jComboBoxMapTaskInNewHw.getSelectedItem().toString());
+        }
+        mappedTasks.add(mappingPatternTask.getStringDisplay());
+        mappedTasksList.add(mappingPatternTask);
+        tasksToMapInSameHw.add(tasksToMap.remove(selectedTaskToMapIndice));
+        tasksToMapInSameHwList.add(tasksToMapList.remove(selectedTaskToMapIndice));
+        jComboBoxTaskToMap.setSelectedIndex(-1);
+        jListMappedTasks.setListData(mappedTasks);
+        setButtons();
+    }
+
+    private void removeMappedTask() {
+        int[] list = jListMappedTasks.getSelectedIndices();
+        List<MappingPatternTask> mappingPatternTasksToRemove = new ArrayList<MappingPatternTask>();
+        for (int i = 0; i < list.length; i++) {
+            MappingPatternTask mappingPatternTaskSelected = mappedTasksList.get(list[i]);
+            tasksToMap.add(mappingPatternTaskSelected.getTaskToMapName());
+            tasksToMapList.add(mappingPatternTaskSelected);
+            tasksToMapInSameHw.remove(mappingPatternTaskSelected.getSameHwAs());
+            tasksToMapInSameHwList.remove(mappingPatternTaskSelected);
+            mappingPatternTasksToRemove.add(mappingPatternTaskSelected);
+            mappedTasks.remove(list[i]);
+        }
+        mappedTasksList.removeAll(mappingPatternTasksToRemove);
+        jListMappedTasks.setListData(mappedTasks);
+        jComboBoxTaskToMap.setSelectedIndex(-1);
+        setButtons();
+    }
+
+    private void addMappedChannel() {
+        //String selectedChannelToMap = jComboBoxChannelToMap.getSelectedItem().toString();
+        int selectedChannelToMapIndex = jComboBoxChannelToMap.getSelectedIndex();
+        //String[] taskAndChannelSelected = MappingPatternChannel.seperateTaskAndChannel(selectedChannelToMap);
+        if (selectedChannelToMapIndex >= 0) {
+            MappingPatternChannel mappingPatternChannel = channelsToMapList.get(selectedChannelToMapIndex);
+            if (jRadioMapChannelInExistingMem.isSelected()) {
+                int selectedChannelSameMemIndex = jComboBoxMapChannelInSameMemAs.getSelectedIndex();
+                if (selectedChannelSameMemIndex >= 0) {
+                    MappingPatternChannel mappingPatternChannelSameMem = channelsToMapInSameMemList.get(selectedChannelSameMemIndex);
+                    mappingPatternChannel.setTaskAndChannelInSameMem(mappingPatternChannelSameMem.getTaskOfChannelToMap(), mappingPatternChannelSameMem.getChannelToMapName(), mappingPatternChannelSameMem.getOrigin());
+                }
+            } else if (jRadioMapChannelInNewMem.isSelected()) {
+                mappingPatternChannel.setBusNameForNewMem(jComboBoxMapChannelInNewMem.getSelectedItem().toString());
+            }
+            mappedChannels.add(mappingPatternChannel.getStringDisplay());
+            channelsToMap.remove(mappingPatternChannel.getTaskChannelToMap());
+            channelsToMapList.remove(mappingPatternChannel);
+            mappedChannelsList.add(mappingPatternChannel);
+            channelsToMapInSameMem.add(mappingPatternChannel.getTaskChannelToMap());
+            channelsToMapInSameMemList.add(mappingPatternChannel);
+            jComboBoxChannelToMap.setSelectedIndex(-1);
+            jListMappedChannels.setListData(mappedChannels);
+            setButtons();
+        }   
+    }
+
+    private void removeMappedChannel() {
+        int[] list = jListMappedChannels.getSelectedIndices();
+        List<MappingPatternChannel> mappingPatternChannelsToRemove = new ArrayList<MappingPatternChannel>();
+        for (int i = 0; i < list.length; i++) {
+            MappingPatternChannel mappingPatternChannelSelected = mappedChannelsList.get(list[i]);
+            channelsToMap.add(mappingPatternChannelSelected.getTaskChannelToMap());
+            channelsToMapList.add(mappingPatternChannelSelected);
+            channelsToMapInSameMem.remove(mappingPatternChannelSelected.getTaskChannelToMap());
+            channelsToMapInSameMemList.remove(mappingPatternChannelSelected);
+            mappingPatternChannelsToRemove.add(mappingPatternChannelSelected);
+            mappedChannels.remove(list[i]);
+        }
+        mappedChannelsList.removeAll(mappingPatternChannelsToRemove);
+        jListMappedChannels.setListData(mappedChannels);
+        jComboBoxChannelToMap.setSelectedIndex(-1);
+        setButtons();
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent evt) {
+        String command = evt.getActionCommand();
+
+        switch (command) {
+            case "Start":
+                startProcess();
+                break;
+            case "Stop":
+                stopProcess();
+                break;
+            case "Close":
+                closeDialog();
+                break;
+            default:
+                if (command.equals("addTaskAsPattern")) {
+                    addTaskAsPattern();
+                } else if (command.equals("removeTaskAsPattern")) {
+                    removeTaskAsPattern();
+                } else if (command.equals("allTasksSelectedAsPattern")) {
+                    allTasksSelectedAsPattern();
+                } else if (command.equals("allTasksNoSelectedAsPattern")) {
+                    allTasksNoSelectedAsPattern();
+                } else if (command.equals("cloneTask")) {
+                    cloneTask();
+                } else if (command.equals("mapTasksManuallyInArchitecture")) {
+                    mapTasksManuallyInArchitecture();
+                } else if (command.equals("mapChannelsManuallyInArchitecture")) {
+                    mapChannelsManuallyInArchitecture();
+                } else if (command.equals("updatePatternsAttributes")) {
+                    updatePatternsAttributes();
+                } else if (command.equals("addClonedTask")) {
+                    addClonedTask();
+                } else if (command.equals("removeClonedTask")) {
+                    removeClonedTask();
+                } else if (command.equals("addConnectionBetweenSelectedPorts")) {
+                    addConnectionBetweenSelectedPorts();
+                } else if (command.equals("removeConnectionBetweenPorts")) {
+                    removeConnectionBetweenPorts();
+                } else if (command.equals("addConfigPorts")) {
+                    addConfigPorts();
+                } else if (command.equals("removeConfigPorts")) {
+                    removeConfigPorts();
+                } else if (command.equals("addMappedTask")) {
+                    addMappedTask();
+                } else if (command.equals("removeMappedTask")) {
+                    removeMappedTask();
+                } else if (command.equals("addMappedChannel")) {
+                    addMappedChannel();
+                } else if (command.equals("removeMappedChannel")) {
+                    removeMappedChannel();
+                } else if (command.equals("updateTaskAttributeValue")) {
+                    updateTaskAttributeValue();
+                }
+                if (evt.getSource() == jp1) {
+                    listPatterns = getFoldersName(pathPatterns);
+                    listPatternsJson = getFoldersName(pathPatterns);
+                }
+                if (evt.getSource() == jComboBoxPatterns) {
+                    int selectedPatternIndex = jComboBoxPatterns.getSelectedIndex();
+                    patternTasksAll = TaskPattern.parsePatternJsonFile(pathPatterns + listPatterns.get(selectedPatternIndex), listPatterns.get(selectedPatternIndex)+".json");
+                    patternTasksNotConnected = TaskPattern.parsePatternJsonFile(pathPatterns + listPatterns.get(selectedPatternIndex), listPatterns.get(selectedPatternIndex)+".json");
+                    portsTaskOfModelLeft = TaskPorts.getListPortsTask(mgui.gtm.getTMLMapping().getTMLModeling());
+                    //Vector<String> patternTasksVector = new Vector<String>();
+                    tasksOfPatternWithExternalPort.removeAllElements();
+                    clonedTasks.removeAllElements();
+                    clonedTasksList.clear();
+                    for (String pTaskName : patternTasksNotConnected.keySet()) {
+                        if (patternTasksNotConnected.get(pTaskName).getExternalPorts().size() > 0) {
+                            tasksOfPatternWithExternalPort.add(pTaskName);
+                        }
+                    }
+                    
+                    //tasksOfPatternWithExternalPort = patternTasksVector;
+                    //modelPatternsTaskWithExternalPort.removeAllElements();
+                    
+                    //modelPatternsTaskWithExternalPort.addAll(tasksOfPatternWithExternalPort);
+                    jComboBoxPatternsTaskWithExternalPort.setEnabled(true);
+                    jComboBoxPatternsTaskWithExternalPort.setSelectedIndex(-1);
+                    buttonCloneTask.setEnabled(true);
+                    removeConnectionBetweenPorts.setEnabled(true);
+                    connectedPorts.removeAllElements();
+                    patternConnectionList.clear();
+                    jListConnectedPorts.setListData(connectedPorts);
+                    portsConfig.removeAllElements();
+                    configuredPorts.removeAllElements();
+                    mappedTasks.removeAllElements();
+                    mappedTasksList.clear();
+                    tasksToMap.removeAllElements();
+                    tasksToMapList.clear();
+                    channelsToMap.removeAllElements();
+                    channelsToMapList.clear();
+                    mappedChannels.removeAllElements();
+                    mappedChannelsList.clear();
+                }
+                if (evt.getSource() == jComboBoxPatternsTaskWithExternalPort) {
+                    externalPortsOfTaskInPattern.removeAllElements();
+                    if (jComboBoxPatternsTaskWithExternalPort.getSelectedIndex() >= 0) {
+                        for (PortTaskJsonFile portTask : patternTasksNotConnected.get(jComboBoxPatternsTaskWithExternalPort.getSelectedItem().toString()).getExternalPorts()) {
+                            externalPortsOfTaskInPattern.add(portTask.getName());
+                        }
+                        jComboBoxPatternExternalPortOfATask.setEnabled(true);
+                    } else {
+                        jComboBoxPatternExternalPortOfATask.setEnabled(false);
+                    }
+                    //modelPatternExternalPortOfATask.removeAllElements();
+                    //modelPatternExternalPortOfATask.addAll(externalPortsOfTaskInPattern);
+                    jComboBoxPatternExternalPortOfATask.setSelectedIndex(-1);
+                    if (tasksOfPatternWithExternalPort.size() == 0) {
+                        removeConfigPorts.setEnabled(true);
+                        configuredPorts.removeAllElements();
+                        portsConfig.removeAllElements();
+                        List<String> clonedTasksAll = new ArrayList<String>();
+                        for (PatternCloneTask cloneT : clonedTasksList) {
+                            clonedTasksAll.add(cloneT.getClonedTask());
+                        }
+                        portsTaskConfig = PatternPortsConfig.getPortsToConfig(portsTaskOfModelAll, portsTaskOfModelLeft, clonedTasksAll, mgui.gtm.getTMLMapping().getTMLModeling());
+                        for (PatternPortsConfig portTaskConfig : portsTaskConfig) {
+                            portTaskConfig.setIsChannelToRemove(true);
+                            configuredPorts.add(portTaskConfig.getStringDisplay());
+                            configuredPortsList.add(portTaskConfig);
+                        }
+                        jListConfigPorts.setListData(configuredPorts);
+                        jComboBoxPortsConfig.setSelectedIndex(-1);
+                        jComboBoxPortsConfig.setEnabled(true);
+                    } else {
+                        configuredPorts.removeAllElements();
+                        jListConfigPorts.setListData(configuredPorts);
+                        portsConfig.removeAllElements();
+                        jComboBoxPortsConfig.setEnabled(false);
+                        removeConfigPorts.setEnabled(false);
+                        mappedTasks.removeAllElements();
+                        mappedTasksList.clear();
+                        tasksToMap.removeAllElements();
+                        tasksToMapList.clear();
+                        channelsToMap.removeAllElements();
+                        channelsToMapList.clear();
+                        mappedChannels.removeAllElements();
+                        mappedChannelsList.clear();
+                        buttonTasksMapInArch.setEnabled(false);
+                        buttonChannelsMapInArch.setEnabled(false);
+                        buttonUpdatePatternsAttributes.setEnabled(false);
+                    }
+                }
+                if (evt.getSource() == jComboBoxPatternExternalPortOfATask) {
+                    if (jComboBoxPatternExternalPortOfATask.getSelectedIndex() >= 0) {
+                        jComboBoxModelsTask.setEnabled(true);
+                        tasksOfModel.removeAllElements();
+                        for (String pTaskName : portsTaskOfModelLeft.keySet()) {
+                            tasksOfModel.add(pTaskName);
+                        }
+                    } else {
+                        jComboBoxModelsTask.setEnabled(false);
+                    }
+                    jComboBoxModelsTask.setSelectedIndex(-1);
+                }
+                if (evt.getSource() == jComboBoxModelsTask || evt.getSource() == jCheckBoxConnectToNewPort) {
+                    if (jComboBoxModelsTask.getSelectedIndex() >= 0) {
+                        jComboBoxModelsPortOfTask.setEnabled(true);
+                        jCheckBoxConnectToNewPort.setEnabled(true);
+                        String selectedModelTask = jComboBoxModelsTask.getSelectedItem().toString();
+                        String selectedPatternTask = jComboBoxPatternsTaskWithExternalPort.getSelectedItem().toString();
+                        int selectedIndexPatternPort = jComboBoxPatternExternalPortOfATask.getSelectedIndex();
+                        
+                        portsOfTaskInModel.removeAllElements();
+                        if (!jCheckBoxConnectToNewPort.isSelected()) { 
+                            String modeSelectedPatternPort = patternTasksNotConnected.get(selectedPatternTask).getExternalPorts().get(selectedIndexPatternPort).getMode();
+                            String typeSelectedPatternPort = patternTasksNotConnected.get(selectedPatternTask).getExternalPorts().get(selectedIndexPatternPort).getType();
+                            if (typeSelectedPatternPort.equals(PatternCreation.CHANNEL)) {
+                                if (modeSelectedPatternPort.equals(PatternCreation.MODE_INPUT)) {
+                                    for (String st : portsTaskOfModelLeft.get(selectedModelTask).getWriteChannels()) {
+                                        portsOfTaskInModel.add(st);
+                                    }
+                                } else if (modeSelectedPatternPort.equals(PatternCreation.MODE_OUTPUT)) {
+                                    for (String st : portsTaskOfModelLeft.get(selectedModelTask).getReadChannels()) {
+                                        portsOfTaskInModel.add(st);
+                                    }
+                                }
+                            } else if (typeSelectedPatternPort.equals(PatternCreation.EVENT)) {
+                                if (modeSelectedPatternPort.equals(PatternCreation.MODE_INPUT)) {
+                                    for (String st : portsTaskOfModelLeft.get(selectedModelTask).getSendEvents()) {
+                                        portsOfTaskInModel.add(st);
+                                    }
+                                } else if (modeSelectedPatternPort.equals(PatternCreation.MODE_OUTPUT)) {
+                                    for (String st : portsTaskOfModelLeft.get(selectedModelTask).getWaitEvents()) {
+                                        portsOfTaskInModel.add(st);
+                                    }
+                                }
+                            }
+                        } else {
+                            for (String st : portsTaskOfModelAll.get(selectedModelTask).getWriteChannels()) {
+                                portsOfTaskInModel.add(st);
+                            }
+                            for (String st : portsTaskOfModelAll.get(selectedModelTask).getReadChannels()) {
+                                portsOfTaskInModel.add(st);
+                            }
+                            for (String st : portsTaskOfModelAll.get(selectedModelTask).getSendEvents()) {
+                                portsOfTaskInModel.add(st);
+                            }
+                            for (String st : portsTaskOfModelAll.get(selectedModelTask).getWaitEvents()) {
+                                portsOfTaskInModel.add(st);
+                            }
+                        }
+                        
+                    } else {
+                        jComboBoxModelsPortOfTask.setEnabled(false);
+                        jCheckBoxConnectToNewPort.setEnabled(false);
+                    }
+                    jComboBoxModelsPortOfTask.setSelectedIndex(-1);
+                }
+                if (evt.getSource() == jComboBoxModelsPortOfTask) {
+                    if (jComboBoxModelsPortOfTask.getSelectedIndex() >= 0) {
+                        String selectedPatternTask = jComboBoxPatternsTaskWithExternalPort.getSelectedItem().toString();
+                        int selectedIndexPatternPort = jComboBoxPatternExternalPortOfATask.getSelectedIndex();
+                        String typeSelectedPatternPort = patternTasksNotConnected.get(selectedPatternTask).getExternalPorts().get(selectedIndexPatternPort).getType();
+                        if (typeSelectedPatternPort.equals(PatternCreation.CHANNEL)){
+                            String confSelectedPatternPort = patternTasksNotConnected.get(selectedPatternTask).getExternalPorts().get(selectedIndexPatternPort).getConfidentiality();
+                            String authSelectedPatternPort = patternTasksNotConnected.get(selectedPatternTask).getExternalPorts().get(selectedIndexPatternPort).getAuthenticity();
+                            jCheckBoxAddConfidentiality.setVisible(true);
+                            jCheckBoxAddConfidentiality.setEnabled(true);
+                            if (confSelectedPatternPort.toUpperCase().equals(PatternCreation.WITH_CONFIDENTIALITY.toUpperCase())) {
+                                jCheckBoxAddConfidentiality.setSelected(true);
+                            }
+                            for (int indexModeAuth = 0; indexModeAuth < authenticityModes.size(); indexModeAuth++) {
+                                if (authSelectedPatternPort.toUpperCase().equals(authenticityModes.get(indexModeAuth).toUpperCase())) {
+                                    jComboBoxAddAuthenticity.setSelectedIndex(indexModeAuth);
+                                }
+                            }
+                            jComboBoxAddAuthenticity.setEnabled(true);
+                            jComboBoxAddAuthenticity.setVisible(true);
+                            jLabelAddAuthenticity.setVisible(true);
+                        }
+                        addConnectionBetweenSelectedPorts.setEnabled(true);
+                    } else {
+                        addConnectionBetweenSelectedPorts.setEnabled(false);
+                        jCheckBoxAddConfidentiality.setVisible(false);
+                        jCheckBoxAddConfidentiality.setEnabled(false);
+                        jCheckBoxAddConfidentiality.setSelected(false);
+                        jComboBoxAddAuthenticity.setEnabled(false);
+                        jComboBoxAddAuthenticity.setVisible(false);
+                        jComboBoxAddAuthenticity.setSelectedIndex(authenticityModes.indexOf(PatternCreation.WITHOUT_AUTHENTICITY));
+                        jLabelAddAuthenticity.setVisible(false);
+                    }
+                }
+                if (evt.getSource() == jComboBoxTaskToClone) {
+                    if (jComboBoxTaskToClone.getSelectedIndex() >= 0) {
+                        jFieldNewClonedTaskName.setEnabled(true);
+                        addClonedTask.setEnabled(true);
+                    } else {
+                        jFieldNewClonedTaskName.setEnabled(false);
+                        addClonedTask.setEnabled(false);
+                    }
+                }
+
+                if (evt.getSource() == jComboBoxPortsConfig) {
+                    if (jComboBoxPortsConfig.getSelectedIndex() >= 0) {
+                        jRadioPortConfigRemove.setEnabled(true);
+                        jRadioPortConfigMerge.setEnabled(true);
+                        
+                    } else {
+                        jRadioPortConfigRemove.setEnabled(false);
+                        jRadioPortConfigMerge.setEnabled(false);
+                    }
+                    if (portsConfig.size() == 0 && tasksOfPatternWithExternalPort.size() == 0) {
+                        tasksToMap.removeAllElements();
+                        tasksToMapList.clear();
+                        tasksToMapInSameHw.removeAllElements();
+                        tasksToMapInSameHwList.clear();
+                        mappedTasks.removeAllElements();
+                        mappedTasksList.clear();
+                        channelsToMap.removeAllElements();
+                        channelsToMapList.clear();
+                        channelsToMapInSameMem.removeAllElements();
+                        channelsToMapInSameMemList.clear();
+                        mappedChannels.removeAllElements();
+                        mappedChannelsList.clear();
+                        List<String> clonedTasksName = new ArrayList<String>();
+                        for(PatternCloneTask cloneT: clonedTasksList) {
+                            tasksToMap.add(cloneT.getClonedTask());
+                            MappingPatternTask mapTask = new MappingPatternTask(cloneT.getClonedTask(), MappingPatternTask.ORIGIN_CLONE);
+                            tasksToMapList.add(mapTask);
+                            clonedTasksName.add(cloneT.getClonedTask());
+                        }
+                        for(String st : patternTasksAll.keySet()) {
+                            tasksToMap.add(st);
+                            MappingPatternTask mapTask = new MappingPatternTask(st, MappingPatternTask.ORIGIN_PATTERN);
+                            tasksToMapList.add(mapTask);
+                        }
+                        for(String st : portsTaskOfModelAll.keySet()) {
+                            if (!clonedTasksName.contains(st)) {
+                                tasksToMapInSameHw.add(st);
+                                MappingPatternTask mapTask = new MappingPatternTask(st, MappingPatternTask.ORIGIN_MODEL);
+                                tasksToMapInSameHwList.add(mapTask);
+                            }
+                        }
+                        List<MappingPatternChannel> channelsToMapListA = MappingPatternChannel.getChannelsToMap(patternConnectionList, patternTasksAll, clonedTasksList);
+                        for(MappingPatternChannel channelToMap : channelsToMapListA) {
+                            channelsToMap.add(channelToMap.getTaskChannelToMap());
+                            channelsToMapList.add(channelToMap);
+                        }
+                        
+                        for(String st : portsTaskOfModelAll.keySet()) {
+                            if (!clonedTasksName.contains(st)) {
+                                for (String wc : portsTaskOfModelAll.get(st).getWriteChannels()) {
+                                    if (!channelsToMapInSameMem.contains(MappingPatternChannel.getTaskChannel(st, wc))) {
+                                        MappingPatternChannel mappingPatternChannel = new MappingPatternChannel(st, wc, MappingPatternChannel.ORIGIN_MODEL);
+                                        channelsToMapInSameMem.add(mappingPatternChannel.getTaskChannelToMap());
+                                        channelsToMapInSameMemList.add(mappingPatternChannel);
+                                    } 
+                                }
+                            }
+                        }
+                        
+                        buttonTasksMapInArch.setEnabled(true);
+                        buttonChannelsMapInArch.setEnabled(true); 
+                        buttonUpdatePatternsAttributes.setEnabled(true); 
+                    } else {
+                        buttonTasksMapInArch.setEnabled(false);
+                        buttonChannelsMapInArch.setEnabled(false);
+                        buttonUpdatePatternsAttributes.setEnabled(false);
+                    }
+                    
+                    jRadioPortConfigRemove.setSelected(false);
+                    jRadioPortConfigMerge.setSelected(false);
+                    portsConfigGroup.clearSelection();
+                    portsConfigMerge.removeAllElements();
+                    jComboBoxPortsConfigMerge.setSelectedIndex(-1);
+                }
+                if (evt.getSource() == jRadioPortConfigRemove) {
+                    jComboBoxPortsConfigMerge.setSelectedIndex(-1);
+                    jComboBoxPortsConfigMerge.setEnabled(false);
+                }
+
+                if (evt.getSource() == jRadioPortConfigMerge) {
+                    if (jRadioPortConfigMerge.isSelected()) {
+                        jComboBoxPortsConfigMerge.setEnabled(true);
+                        String jCo = jComboBoxPortsConfig.getSelectedItem().toString();
+                        String[] taskPortSelected = PatternPortsConfig.seperateTaskAndChannel(jCo);
+                        String taskSelected = taskPortSelected[0];
+                        List<String> portsToConfOfTaskAll = new ArrayList<String>();
+                        for (PatternPortsConfig portTaskConfig : portsTaskConfig) {
+                            if (taskSelected.equals(portTaskConfig.getTaskOfChannelToConfig())) {
+                                portsToConfOfTaskAll.add(portTaskConfig.getChannelToConfig());
+                            }
+                        }
+                        for (String wc : portsTaskOfModelAll.get(taskSelected).getWriteChannels()) {
+                            if (!portsToConfOfTaskAll.contains(wc)) {
+                                portsConfigMerge.add(wc);
+                            }
+                        }
+                        for (String rc : portsTaskOfModelAll.get(taskSelected).getReadChannels()) {
+                            if (!portsToConfOfTaskAll.contains(rc)) {
+                                portsConfigMerge.add(rc);
+                            }
+                        }
+                        for (String se : portsTaskOfModelAll.get(taskSelected).getSendEvents()) {
+                            if (!portsToConfOfTaskAll.contains(se)) {
+                                portsConfigMerge.add(se);
+                            }
+                        }
+                        for (String we : portsTaskOfModelAll.get(taskSelected).getWaitEvents()) {
+                            if (!portsToConfOfTaskAll.contains(we)) {
+                                portsConfigMerge.add(we);
+                            }
+                        } 
+                        
+                    } else {
+                        jComboBoxPortsConfigMerge.setEnabled(false);
+                    }
+                    jComboBoxPortsConfigMerge.setSelectedIndex(-1);
+                }
+
+                if (evt.getSource() == jRadioPortConfigMerge || evt.getSource() == jRadioPortConfigRemove || evt.getSource() == jComboBoxPortsConfigMerge) {
+                    if (portsConfig.size()>0 && (jRadioPortConfigRemove.isSelected() || (jRadioPortConfigMerge.isSelected() && jComboBoxPortsConfigMerge.getSelectedIndex() >= 0))) {
+                        addConfigPorts.setEnabled(true);
+                    } else {
+                        addConfigPorts.setEnabled(false);
+                    }
+                }
+                if (evt.getSource() == jComboBoxTaskToMap) {
+                    if (jComboBoxTaskToMap.getSelectedIndex() >= 0) {
+                        jRadioMapTaskInNewHw.setEnabled(true);
+                        jRadioMapTaskInExistingHw.setEnabled(true);
+                    } else {
+                        jRadioMapTaskInNewHw.setEnabled(false);
+                        jRadioMapTaskInExistingHw.setEnabled(false);
+                    }
+                    mapTaskGroup.clearSelection();
+                    jComboBoxMapTaskInSameHwAs.setEnabled(false);
+                    jComboBoxMapTaskInNewHw.setEnabled(false);
+                    jComboBoxMapTaskInSameHwAs.setSelectedIndex(-1);
+                    jComboBoxMapTaskInNewHw.setSelectedIndex(-1);
+                }
+                if (evt.getSource() == jRadioMapTaskInNewHw) {
+                    if (jRadioMapTaskInNewHw.isSelected()) {
+                        jComboBoxMapTaskInNewHw.setEnabled(true);
+                        jComboBoxMapTaskInSameHwAs.setEnabled(false);
+                        jComboBoxMapTaskInSameHwAs.setSelectedIndex(-1);
+                    } else {
+                        jComboBoxMapTaskInNewHw.setEnabled(false);
+                    }
+                }
+                if (evt.getSource() == jRadioMapTaskInExistingHw) {
+                    if (jRadioMapTaskInExistingHw.isSelected()) {
+                        jComboBoxMapTaskInSameHwAs.setEnabled(true);
+                        jComboBoxMapTaskInNewHw.setEnabled(false);
+                        jComboBoxMapTaskInNewHw.setSelectedIndex(-1);
+                    } else {
+                        jComboBoxMapTaskInSameHwAs.setEnabled(false);
+                    }
+                }
+                if (evt.getSource() == jComboBoxMapTaskInSameHwAs || evt.getSource() == jComboBoxMapTaskInNewHw) {
+                    if (tasksToMap.size() > 0 && ((jRadioMapTaskInExistingHw.isSelected() &&  jComboBoxMapTaskInSameHwAs.getSelectedIndex() >= 0) || (jRadioMapTaskInNewHw.isSelected() && jComboBoxMapTaskInNewHw.getSelectedIndex() >= 0))) {
+                        addMappedTask.setEnabled(true);
+                    } else {
+                        addMappedTask.setEnabled(false);
+                    }
+                }
+                if (evt.getSource() == jComboBoxChannelToMap) {
+                    if (jComboBoxChannelToMap.getSelectedIndex() >= 0) {
+                        jRadioMapChannelInNewMem.setEnabled(true);
+                        jRadioMapChannelInExistingMem.setEnabled(true);
+                    } else {
+                        jRadioMapChannelInNewMem.setEnabled(false);
+                        jRadioMapChannelInExistingMem.setEnabled(false);
+                    }
+                    mapChannelGroup.clearSelection();
+                    jComboBoxMapChannelInSameMemAs.setEnabled(false);
+                    jComboBoxMapChannelInNewMem.setEnabled(false);
+                    jComboBoxMapChannelInSameMemAs.setSelectedIndex(-1);
+                    jComboBoxMapChannelInNewMem.setSelectedIndex(-1);
+                }
+                if (evt.getSource() == jRadioMapChannelInNewMem) {
+                    if (jRadioMapChannelInNewMem.isSelected()) {
+                        jComboBoxMapChannelInNewMem.setEnabled(true);
+                        jComboBoxMapChannelInSameMemAs.setEnabled(false);
+                        jComboBoxMapChannelInSameMemAs.setSelectedIndex(-1);
+                    } else {
+                        jComboBoxMapChannelInNewMem.setEnabled(false);
+                    }
+                }
+                if (evt.getSource() == jRadioMapChannelInExistingMem) {
+                    if (jRadioMapChannelInExistingMem.isSelected()) {
+                        jComboBoxMapChannelInSameMemAs.setEnabled(true);
+                        jComboBoxMapChannelInNewMem.setEnabled(false);
+                        jComboBoxMapChannelInNewMem.setSelectedIndex(-1);
+                    } else {
+                        jComboBoxMapChannelInSameMemAs.setEnabled(false);
+                    }
+                }
+                if (evt.getSource() == jComboBoxMapChannelInSameMemAs || evt.getSource() == jComboBoxMapChannelInNewMem) {
+                    if (channelsToMap.size() > 0 && ((jRadioMapChannelInExistingMem.isSelected() &&  jComboBoxMapChannelInSameMemAs.getSelectedIndex() >= 0) || (jRadioMapChannelInNewMem.isSelected() && jComboBoxMapChannelInNewMem.getSelectedIndex() >= 0))) {
+                        addMappedChannel.setEnabled(true);
+                    } else {
+                        addMappedChannel.setEnabled(false);
+                    }
+                }
+
+                if (evt.getSource() == jComboBoxTasksToUpdateAttributes) {
+                    attributesOfTaskToUpdate.removeAllElements();
+                    if (jComboBoxTasksToUpdateAttributes.getSelectedIndex() >= 0) {
+                        jComboBoxAttributesOfTaskToUpdate.setEnabled(true);
+                        String selectedTaskToUpdateAttributes = jComboBoxTasksToUpdateAttributes.getSelectedItem().toString();
+                        for (AttributeTaskJsonFile attributeTaskJsonFile : patternTasksAll.get(selectedTaskToUpdateAttributes).getAttributes()) {
+                            attributesOfTaskToUpdate.add(attributeTaskJsonFile.getName());
+                        }
+                    } else {
+                        jComboBoxAttributesOfTaskToUpdate.setEnabled(false);
+                    }
+                    jComboBoxAttributesOfTaskToUpdate.setSelectedIndex(-1);
+                    jFieldNewTaskAttibuteValue.setText("");
+                }
+
+                if (evt.getSource() == jComboBoxAttributesOfTaskToUpdate) {
+                    if (jComboBoxAttributesOfTaskToUpdate.getSelectedIndex() >= 0) {
+                        jFieldNewTaskAttibuteValue.setEnabled(true);
+                        buttonUpdateTaskAttributeValue.setEnabled(true);
+                        String selectedTaskToUpdateAttributes = jComboBoxTasksToUpdateAttributes.getSelectedItem().toString();
+                        String selectedAttributeToUpdate = jComboBoxAttributesOfTaskToUpdate.getSelectedItem().toString();
+                        for (AttributeTaskJsonFile attributeTaskJsonFile : patternTasksAll.get(selectedTaskToUpdateAttributes).getAttributes()) {
+                            if (attributeTaskJsonFile.getName().equals(selectedAttributeToUpdate)) {
+                                jFieldNewTaskAttibuteValue.setText(attributeTaskJsonFile.getValue());
+                            }
+                        }
+                    } else {
+                        jFieldNewTaskAttibuteValue.setEnabled(false);
+                        jFieldNewTaskAttibuteValue.setText("");
+                        buttonUpdateTaskAttributeValue.setEnabled(false);
+                    }
+                }
+
+                if (evt.getSource() == jComboBoxPatternsJson) {
+                    if (jComboBoxPatternsJson.getSelectedIndex() >= 0) {
+                        jFieldPatternJsonPath.setEnabled(true);
+                        jFieldPatternJsonPath.setText(pathPatterns + listPatternsJson.get(jComboBoxPatternsJson.getSelectedIndex()) + "/"+listPatternsJson.get(jComboBoxPatternsJson.getSelectedIndex())+"-config.json");
+                    } else {
+                        jFieldPatternJsonPath.setEnabled(false);
+                        jFieldPatternJsonPath.setText("");
+                    }
+                }
+        }
+    }
+
+    private void closeDialog() {
+        if (mode == STARTED) {
+            stopProcess();
+        }
+        dispose();
+    }
+
+    private void stopProcess() {
+        if (rshc != null) {
+            try {
+                rshc.stopCommand();
+            } catch (LauncherException ignored) {
+            }
+        }
+        rshc = null;
+        mode = STOPPED;
+        setButtons();
+        go = false;
+    }
+
+    private void startProcess() {
+        Thread t = new Thread(this);
+        mode = STARTED;
+        setButtons();
+        go = true;
+        t.start();
+    }
+
+    @Override
+    public void run() {
+        TraceManager.addDev("Thread started");
+        int currentPosY = 0;
+        int stepY = 10; 
+        if (jp1.getSelectedIndex() == 0) {
+            newPatternName = jFieldNewPatternName.getText();
+            jta.removeAll();
+            boolean findErr = false;
+            if (selectedTasksAsPattern.size() == 0) {
+                JLabel label = new JLabel("ERROR: No Task Selected As Pattern");
+                label.setAlignmentX(Component.LEFT_ALIGNMENT);
+                this.jta.add(label, this.createGbc(currentPosY));
+                currentPosY += stepY;
+                findErr = true;
+            }
+            if (newPatternName.length() <= 0) {
+                JLabel label = new JLabel("ERROR: Pattern name is missing");
+                label.setAlignmentX(Component.LEFT_ALIGNMENT);
+                this.jta.add(label, this.createGbc(currentPosY));
+                currentPosY += stepY;
+                findErr = true;
+            }
+            /*if (selectedTasksAsPattern.size() > 1) {
+                for (int i = 0; i < selectedTasksAsPattern.size(); i++) {
+                    boolean isLinkedToPattern = false;
+                    for (int j = 0; j < selectedTasksAsPattern.size(); j++) {
+                        if (i != j) {
+                            int nbChWr = getListChannelsBetweenTwoTasks(tasksFullName.get(selectedTasksAsPattern.get(i)), tasksFullName.get(selectedTasksAsPattern.get(j))).size();
+                            int nbChRd = getListChannelsBetweenTwoTasks(tasksFullName.get(selectedTasksAsPattern.get(j)), tasksFullName.get(selectedTasksAsPattern.get(i))).size();
+                            if (nbChWr != 0 || nbChRd != 0) {
+                                isLinkedToPattern = true;
+                                break;
+                            }   
+                        }
+                    }
+                    if (!isLinkedToPattern) {
+                        JLabel label = new JLabel("ERROR: The task " + selectedTasksAsPattern.get(i) +" is not linked to the others selected tasks");
+                        label.setAlignmentX(Component.LEFT_ALIGNMENT);
+                        this.jta.add(label, this.createGbc(currentPosY));
+                        currentPosY += stepY;
+                        findErr = true;
+                    }
+                }
+            }*/
+    
+            if (!findErr) {
+                mgui.gtm.createPattern(selectedTasksAsPattern, newPatternName, pathPatterns);
+                JLabel label = new JLabel("Pattern Creation Completed");
+                label.setAlignmentX(Component.LEFT_ALIGNMENT);
+                this.jta.add(label, this.createGbc(currentPosY));
+            }
+            mode = NOT_STARTED;
+        } else  if (jp1.getSelectedIndex() == 1) {
+            newPatternName = jFieldNewPatternName.getText();
+            jta.removeAll();
+            boolean findErr = false;
+            if (tasksOfPatternWithExternalPort.size() > 0) {
+                JLabel label = new JLabel("ERROR: Some connections between the pattern and the model are missing");
+                label.setAlignmentX(Component.LEFT_ALIGNMENT);
+                this.jta.add(label, this.createGbc(currentPosY));
+                currentPosY += stepY;
+                findErr = true;
+            }
+            if (portsConfig.size() > 0) {
+                JLabel label = new JLabel("ERROR: There are some port's configurations left to do");
+                label.setAlignmentX(Component.LEFT_ALIGNMENT);
+                this.jta.add(label, this.createGbc(currentPosY));
+                currentPosY += stepY;
+                findErr = true;
+            }
+            if (!findErr) {
+                int selectedPatternIndex = jComboBoxPatterns.getSelectedIndex();
+                String selectedPatternPath = pathPatterns+listPatterns.get(selectedPatternIndex)+"/";
+                String selectedPatternName = listPatterns.get(selectedPatternIndex);
+                PatternConfiguration patternConfiguration = new PatternConfiguration(patternConnectionList, clonedTasksList, configuredPortsList, mappedTasksList, mappedChannelsList, updatedPatternAttributes, channelsWithSecurity);
+                patternConfiguration.loadChannelsWithSecurity(patternTasksAll);
+                GTURTLEModeling.createJsonPatternConfigFile(selectedPatternPath, selectedPatternName, patternConfiguration);
+                mgui.gtm.integratePattern(mgui, selectedPatternPath, selectedPatternName);
+                JLabel label = new JLabel("Pattern Configuration Completed");
+                label.setAlignmentX(Component.LEFT_ALIGNMENT);
+                this.jta.add(label, this.createGbc(currentPosY));
+            }
+            mode = NOT_STARTED;
+        } else  if (jp1.getSelectedIndex() == 2) {
+            jta.removeAll();
+            boolean findErr = false;
+            String textJFieldPathJson = jFieldPatternJsonPath.getText();
+            File f = new File(textJFieldPathJson);
+            
+            if (jComboBoxPatternsJson.getSelectedIndex() == -1) {
+                JLabel label = new JLabel("ERROR: Select a pattern");
+                label.setAlignmentX(Component.LEFT_ALIGNMENT);
+                this.jta.add(label, this.createGbc(currentPosY));
+                currentPosY += stepY;
+                findErr = true;
+            }
+            if (!f.isFile() || !f.exists()) { 
+                JLabel label = new JLabel("ERROR: Json file doesn't exist");
+                label.setAlignmentX(Component.LEFT_ALIGNMENT);
+                this.jta.add(label, this.createGbc(currentPosY));
+                currentPosY += stepY;
+                findErr = true;
+            }
+
+            if (!findErr) {
+                int selectedPatternIndex = jComboBoxPatternsJson.getSelectedIndex();
+                String selectedPatternPath = pathPatterns+listPatternsJson.get(selectedPatternIndex) + "/";
+                String selectedPatternName = listPatternsJson.get(selectedPatternIndex);
+                mgui.gtm.integratePattern(mgui, selectedPatternPath, selectedPatternName, textJFieldPathJson);
+                JLabel label = new JLabel("Pattern Integration Completed");
+                label.setAlignmentX(Component.LEFT_ALIGNMENT);
+                this.jta.add(label, this.createGbc(currentPosY));
+            }
+            mode = NOT_STARTED;
+        }
+        setButtons();
+    }
+
+    protected void setButtons() {
+        switch (mode) {
+            case NOT_STARTED:
+                startButton.setEnabled(true);
+                stop.setEnabled(false);
+                close.setEnabled(true);
+                getGlassPane().setVisible(false);
+                break;
+            case STARTED:
+                startButton.setEnabled(false);
+                stop.setEnabled(true);
+                close.setEnabled(false);
+                getGlassPane().setVisible(true);
+                break;
+            case STOPPED:
+            default:
+                startButton.setEnabled(false);
+                stop.setEnabled(false);
+                close.setEnabled(true);
+                getGlassPane().setVisible(false);
+                break;
+        }
+    }
+
+    @Override
+    public void setError() {
+    }
+
+    @Override
+    public void appendOut(String s) {
+    }
+
+    @Override
+    public boolean hasToContinue() {
+        return this.go;
+    }
+
+    @Override
+    public void mouseClicked(MouseEvent e) {
+    }
+
+    @Override
+    public void mouseEntered(MouseEvent e) {
+    }
+
+    @Override
+    public void mouseExited(MouseEvent e) {
+    }
+
+    @Override
+    public void mousePressed(MouseEvent e) {
+
+    }
+
+    @Override
+    public void mouseReleased(MouseEvent e) {
+
+    }
+
+    @Override
+    public void valueChanged(ListSelectionEvent e) {
+
+    }
+
+}
diff --git a/src/main/java/ui/window/JDialogProverifVerification.java b/src/main/java/ui/window/JDialogProverifVerification.java
index d91af85707ee1afd8676f18192e978ecde9ddf6a..a38e02aadd96e2567db00a30661535ad9b1c8ab4 100644
--- a/src/main/java/ui/window/JDialogProverifVerification.java
+++ b/src/main/java/ui/window/JDialogProverifVerification.java
@@ -61,10 +61,12 @@ import java.io.OutputStreamWriter;
 import java.io.PipedInputStream;
 import java.io.PipedOutputStream;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -138,6 +140,10 @@ public class JDialogProverifVerification extends JDialog implements ActionListen
     private static boolean PI_CALCULUS = true;
     public static int LOOP_ITERATION = 1;
 
+    public static String ADD_CONFIDENTIALITY = "Conf";
+    public static String ADD_WEAK_AUTHENTICITY = "Integrity";
+    public static String ADD_STRONG_AUTHENTICITY = "Strong Authenticity";
+
     private static boolean DRAW_AVATAR = false;
 
     private JLabel labelError;
@@ -167,10 +173,48 @@ public class JDialogProverifVerification extends JDialog implements ActionListen
     JList<String> listSelected;
     JList<String> listIgnored;
 
+    Vector<String> selectedChannelsToAddSec = new Vector<String>();
+    Vector<String> ignoredChannelsToAddSec = new Vector<String>();
+    JList<String> listSelectedChannelsToAddSec;
+    JList<String> listIgnoredChannelsToAddSec;
+
+    //Patterns
+    Vector<String> listPatterns = new Vector<String>(Arrays.asList("TMR"));
+    
+    JComboBox<String> jComboBoxPatterns;
+    JComboBox<String> listCompSelectReceiver;
+    JComboBox<String> listCompSelectMainSensor, listChannelsMainSensor;
+    JComboBox<String> listCompSelectSecondSensor, listChannelsSecondSensor;
+    JComboBox<String> listCompSelectThirdSensor, listChannelsThirdSensor;
+    Vector<String> allTasksFullName = new Vector<String>();
+    Vector<String> allTasksAsReceiver = new Vector<String>();
+    Vector<String> allTasksAsMainSensor = new Vector<String>();
+    Vector<String> allTasksAsSecondSensor = new Vector<String>();
+    Vector<String> allTasksAsThirdSensor = new Vector<String>();
+    Vector<String> allChannelsMainSensor = new Vector<String>();
+    Vector<String> allChannelsSecondSensor = new Vector<String>();
+    Vector<String> allChannelsThirdSensor = new Vector<String>();
+    JButton addChannelFromMainSensor, removeChannelFromMainSensor, moveUpChannelFromMainSensor, moveDownChannelFromMainSensor;
+    JButton addChannelFromSecondSensor, removeChannelFromSecondSensor, moveUpChannelFromSecondSensor, moveDownChannelFromSecondSensor;
+    JButton addChannelFromThirdSensor, removeChannelFromThirdSensor, moveUpChannelFromThirdSensor, moveDownChannelFromThirdSensor;
+    JList<String> listSelectedChannelsMainSensor;
+    JList<String> listSelectedChannelsSecondSensor;
+    JList<String> listSelectedChannelsThirdSensor;
+    Vector<String> selectedChannelsMainSensor = new Vector<String>();
+    Vector<String> selectedChannelsSecondSensor = new Vector<String>();
+    Vector<String> selectedChannelsThirdSensor = new Vector<String>();
+    Map<String, List<String>> selectedSensors = new LinkedHashMap<String, List<String>>();
+
+    protected JCheckBox selectTwoSensors;
+    protected JTextField interpretersCompTime, voterCompTime, voterTimeOut;
+    protected static String interpretersCompTimeDefault = "10";
+    protected static String voterCompTimeDefault = "10";
+    protected static String voterTimeOutDefault = "1000";
 
     protected static String encCC = "100";
     protected static String decCC = "100";
     protected static String secOv = "100";
+
     private ProVerifOutputAnalyzer pvoa;
 
     //components
@@ -190,6 +234,7 @@ public class JDialogProverifVerification extends JDialog implements ActionListen
     protected JTextField encTime, decTime, secOverhead;
     protected JComboBox<String> addtoCPU;
 	protected JButton allValidated, addOneValidated, allIgnored, addOneIgnored;
+	protected JButton addAllChannelsToAddSec, addOneChannelToAddSec, removeAllChannelsToAddSec, removeOneChannelToAddSec;
 
     protected JCheckBox removeForkAndJoin;
 
@@ -274,7 +319,26 @@ public class JDialogProverifVerification extends JDialog implements ActionListen
                 taskCpuMap.put(task, cpu);
             }
         }
+
         currPanel = mgui.getCurrentTURTLEPanel();
+        
+        if (currPanel instanceof TMLArchiPanel) {
+            for (int i=0; i < mgui.gtm.getTMLMapping().getTMLModeling().getChannels().size(); i++) {
+                String channelFullName = mgui.gtm.getTMLMapping().getTMLModeling().getChannels().get(i).getName();
+                String channelShortName = channelFullName.split("__")[channelFullName.split("__").length - 1];
+                ignoredChannelsToAddSec.add(channelShortName);
+            }
+
+            for (int i=0; i<mgui.gtm.getTMLMapping().getMappedTasks().size(); i++) {
+                String taskFullName = mgui.gtm.getTMLMapping().getMappedTasks().get(i).getName();
+                String taskShortName = taskFullName.split("__")[taskFullName.split("__").length - 1];
+                allTasksFullName.add(taskFullName);
+                allTasksAsReceiver.add(taskShortName);
+                allTasksAsMainSensor.add(taskShortName);
+                allTasksAsSecondSensor.add(taskShortName);
+                allTasksAsThirdSensor.add(taskShortName);
+            }
+        }
 
         initComponents();
         myInitComponents();
@@ -311,6 +375,376 @@ public class JDialogProverifVerification extends JDialog implements ActionListen
         return gbc;
     }
 
+    Vector<String> getListChannelsBetweenTwoTasks(String originTaskName, String destinationTaskName) {
+        Vector<String> channels = new Vector<String>();
+        if (mgui.gtm.getTMLMapping().getTaskByName(originTaskName) != null && mgui.gtm.getTMLMapping().getTaskByName(destinationTaskName) != null) {
+            if (mgui.gtm.getTMLMapping().getTaskByName(originTaskName).getWriteChannels().size() > 0) {
+                for (int i=0; i < mgui.gtm.getTMLMapping().getTaskByName(destinationTaskName).getReadChannels().size(); i++) {
+                    for (int j=0 ; j < mgui.gtm.getTMLMapping().getTaskByName(destinationTaskName).getReadChannels().get(i).getNbOfChannels(); j++) {
+                        for (int k=0; k < mgui.gtm.getTMLMapping().getTaskByName(originTaskName).getWriteChannels().size(); k++) {
+                            for (int l=0; l < mgui.gtm.getTMLMapping().getTaskByName(originTaskName).getWriteChannels().get(k).getNbOfChannels(); l++) {
+                                if (mgui.gtm.getTMLMapping().getTaskByName(originTaskName).getWriteChannels().get(k).getChannel(l) == mgui.gtm.getTMLMapping().getTaskByName(destinationTaskName).getReadChannels().get(i).getChannel(j)) {
+                                    String channelLongName = mgui.gtm.getTMLMapping().getTaskByName(destinationTaskName).getReadChannels().get(i).getChannel(j).getName();
+                                    String channelShortName = channelLongName.split("__")[channelLongName.split("__").length - 1];
+                                    if (!channels.contains(channelShortName)) {
+                                        channels.add(channelShortName);
+                                    }
+                                }
+                            }
+                        }
+                    } 
+                }
+            }
+        }
+        return channels;
+    }
+
+    protected void panelAutoPattern() {
+        JPanel jp03 = new JPanel();
+        GridBagLayout gridbag03 = new GridBagLayout();
+        GridBagConstraints c03 = new GridBagConstraints();
+        jp03.setLayout(gridbag03);
+        jp03.setBorder(new javax.swing.border.TitledBorder("Auto add Pattern"));
+
+        c03.weighty = 1.0;
+        c03.weightx = 1.0;
+        c03.fill = GridBagConstraints.HORIZONTAL;
+        c03.gridheight = 1;
+        c03.gridwidth = 2;
+        jp03.add(new JLabel("Select Pattern:"), c03);
+        c03.gridwidth = GridBagConstraints.REMAINDER;
+        jComboBoxPatterns = new JComboBox<String>(listPatterns);
+        jp03.add(jComboBoxPatterns, c03);
+
+        jp03.add(new JLabel("Select receiver Component:"), c03);
+        c03.gridwidth = GridBagConstraints.REMAINDER;
+        listCompSelectReceiver = new JComboBox<String>(allTasksAsReceiver);
+        listCompSelectReceiver.setSelectedIndex(-1);
+        listCompSelectReceiver.addActionListener(this);
+        
+        jp03.add(listCompSelectReceiver, c03);
+        c03.gridwidth = GridBagConstraints.REMAINDER;
+
+        jp03.add(new JLabel("Select a sensor and its ports for which a TMR will be integrated:"), c03);
+        c03.gridwidth = 2;
+        listCompSelectMainSensor = new JComboBox<String>(allTasksAsMainSensor);
+        listCompSelectMainSensor.setSelectedIndex(-1);
+        listCompSelectMainSensor.addActionListener(this);
+        jp03.add(listCompSelectMainSensor, c03);
+        c03.gridwidth = GridBagConstraints.REMAINDER;
+
+        listChannelsMainSensor = new JComboBox<String>(allChannelsMainSensor);
+        listChannelsMainSensor.setSelectedIndex(-1);
+        listChannelsMainSensor.addActionListener(this);
+        jp03.add(listChannelsMainSensor, c03);
+        c03.gridwidth = GridBagConstraints.REMAINDER;
+
+        listSelectedChannelsMainSensor = new JList<String>(selectedChannelsMainSensor);
+		JPanel panelSelectChannelsMainSensor = new JPanel();
+		panelSelectChannelsMainSensor.setPreferredSize(new Dimension(200, 100));
+        listSelectedChannelsMainSensor.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
+
+        listSelectedChannelsMainSensor.addListSelectionListener(this);
+        JScrollPane scrollPaneSelectedChannelsMainSensor = new JScrollPane(listSelectedChannelsMainSensor);
+        scrollPaneSelectedChannelsMainSensor.setPreferredSize(new Dimension(200, 100));
+        panelSelectChannelsMainSensor.add(scrollPaneSelectedChannelsMainSensor, BorderLayout.WEST);
+        
+        JPanel selectChannelsMainSensorPanel = new JPanel();
+        GridBagConstraints c13MainSensor = new GridBagConstraints();
+        c13MainSensor.gridwidth = GridBagConstraints.REMAINDER;
+        c13MainSensor.gridheight = 1;
+        addChannelFromMainSensor = new JButton("+");
+        addChannelFromMainSensor.setPreferredSize(new Dimension(50, 25));
+        addChannelFromMainSensor.addActionListener(this);
+        addChannelFromMainSensor.setActionCommand("addChannelMainSensor");
+        selectChannelsMainSensorPanel.add(addChannelFromMainSensor, c13MainSensor);
+
+        removeChannelFromMainSensor = new JButton("-");
+        removeChannelFromMainSensor.setPreferredSize(new Dimension(50, 25));
+        removeChannelFromMainSensor.addActionListener(this);
+        removeChannelFromMainSensor.setActionCommand("removeChannelMainSensor");
+        selectChannelsMainSensorPanel.add(removeChannelFromMainSensor, c13MainSensor);
+
+        moveUpChannelFromMainSensor = new JButton(IconManager.imgic78);
+        moveUpChannelFromMainSensor.setPreferredSize(new Dimension(50, 25));
+        moveUpChannelFromMainSensor.addActionListener(this);
+        moveUpChannelFromMainSensor.setActionCommand("moveUpChannelMainSensor");
+        selectChannelsMainSensorPanel.add(moveUpChannelFromMainSensor, c13MainSensor);
+
+        moveDownChannelFromMainSensor = new JButton(IconManager.imgic79);
+        moveDownChannelFromMainSensor.setPreferredSize(new Dimension(50, 25));
+        moveDownChannelFromMainSensor.addActionListener(this);
+        moveDownChannelFromMainSensor.setActionCommand("moveDownChannelMainSensor");
+        selectChannelsMainSensorPanel.add(moveDownChannelFromMainSensor, c13MainSensor);
+
+        panelSelectChannelsMainSensor.add(selectChannelsMainSensorPanel, c03);
+        jp03.add(panelSelectChannelsMainSensor, c03);
+
+
+		GridBagConstraints c04 = new GridBagConstraints();
+        c04.weighty = 1.0;
+        c04.weightx = 1.0;
+		c04.gridwidth = GridBagConstraints.REMAINDER;
+        c04.gridheight = 1;
+		c04.fill= GridBagConstraints.HORIZONTAL;
+        jp03.add(new JLabel(""), c04);
+
+        selectTwoSensors = new JCheckBox("Select two other sensors");
+        jp03.add(selectTwoSensors, c03);
+        selectTwoSensors.addActionListener(this);
+
+        c03.gridwidth = 2;
+        listCompSelectSecondSensor = new JComboBox<String>(allTasksAsSecondSensor);
+        listCompSelectSecondSensor.setSelectedIndex(-1);
+        listCompSelectSecondSensor.setEnabled(false);
+        listCompSelectSecondSensor.addActionListener(this);
+        jp03.add(listCompSelectSecondSensor, c03);
+        c03.gridwidth = GridBagConstraints.REMAINDER;
+
+        listChannelsSecondSensor = new JComboBox<String>(allChannelsSecondSensor);
+        listChannelsSecondSensor.setSelectedIndex(-1);
+        listChannelsSecondSensor.setEnabled(false);
+        listChannelsSecondSensor.addActionListener(this);
+        jp03.add(listChannelsSecondSensor, c03);
+        c03.gridwidth = GridBagConstraints.REMAINDER;
+
+        listSelectedChannelsSecondSensor = new JList<String>(selectedChannelsSecondSensor);
+		JPanel panelSelectChannelsSecondSensor = new JPanel();
+		panelSelectChannelsSecondSensor.setPreferredSize(new Dimension(200, 100));
+        listSelectedChannelsSecondSensor.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
+
+        listSelectedChannelsSecondSensor.addListSelectionListener(this);
+        JScrollPane scrollPaneSelectedChannelsSecondSensor = new JScrollPane(listSelectedChannelsSecondSensor);
+        scrollPaneSelectedChannelsSecondSensor.setPreferredSize(new Dimension(200, 100));
+        panelSelectChannelsSecondSensor.add(scrollPaneSelectedChannelsSecondSensor, BorderLayout.WEST);
+        
+        JPanel selectChannelsSecondSensorPanel = new JPanel();
+        GridBagConstraints c13SecondSensor = new GridBagConstraints();
+        c13SecondSensor.gridwidth = GridBagConstraints.REMAINDER;
+        c13SecondSensor.gridheight = 1;
+        addChannelFromSecondSensor = new JButton("+");
+        addChannelFromSecondSensor.setEnabled(false);
+        addChannelFromSecondSensor.setPreferredSize(new Dimension(50, 25));
+        addChannelFromSecondSensor.addActionListener(this);
+        addChannelFromSecondSensor.setActionCommand("addChannelSecondSensor");
+        selectChannelsSecondSensorPanel.add(addChannelFromSecondSensor, c13SecondSensor);
+
+        removeChannelFromSecondSensor = new JButton("-");
+        removeChannelFromSecondSensor.setEnabled(false);
+        removeChannelFromSecondSensor.setPreferredSize(new Dimension(50, 25));
+        removeChannelFromSecondSensor.addActionListener(this);
+        removeChannelFromSecondSensor.setActionCommand("removeChannelSecondSensor");
+        selectChannelsSecondSensorPanel.add(removeChannelFromSecondSensor, c13SecondSensor);
+
+        moveUpChannelFromSecondSensor = new JButton(IconManager.imgic78);
+        moveUpChannelFromSecondSensor.setEnabled(false);
+        moveUpChannelFromSecondSensor.setPreferredSize(new Dimension(50, 25));
+        moveUpChannelFromSecondSensor.addActionListener(this);
+        moveUpChannelFromSecondSensor.setActionCommand("moveUpChannelSecondSensor");
+        selectChannelsSecondSensorPanel.add(moveUpChannelFromSecondSensor, c13SecondSensor);
+
+        moveDownChannelFromSecondSensor = new JButton(IconManager.imgic79);
+        moveDownChannelFromSecondSensor.setEnabled(false);
+        moveDownChannelFromSecondSensor.setPreferredSize(new Dimension(50, 25));
+        moveDownChannelFromSecondSensor.addActionListener(this);
+        moveDownChannelFromSecondSensor.setActionCommand("moveDownChannelSecondSensor");
+        selectChannelsSecondSensorPanel.add(moveDownChannelFromSecondSensor, c13SecondSensor);
+
+        panelSelectChannelsSecondSensor.add(selectChannelsSecondSensorPanel, c04);
+        jp03.add(panelSelectChannelsSecondSensor, c04);
+
+        c03.gridwidth = 2;
+        listCompSelectThirdSensor = new JComboBox<String>(allTasksAsThirdSensor);
+        listCompSelectThirdSensor.setSelectedIndex(-1);
+        listCompSelectThirdSensor.setEnabled(false);
+        listCompSelectThirdSensor.addActionListener(this);
+        jp03.add(listCompSelectThirdSensor, c03);
+        c03.gridwidth = GridBagConstraints.REMAINDER;
+
+        listChannelsThirdSensor = new JComboBox<String>(allChannelsThirdSensor);
+        listChannelsThirdSensor.setSelectedIndex(-1);
+        listChannelsThirdSensor.setEnabled(false);
+        listChannelsThirdSensor.addActionListener(this);
+        jp03.add(listChannelsThirdSensor, c03);
+        c03.gridwidth = GridBagConstraints.REMAINDER;
+
+        listSelectedChannelsThirdSensor = new JList<String>(selectedChannelsThirdSensor);
+		JPanel panelSelectChannelsThirdSensor = new JPanel();
+		panelSelectChannelsThirdSensor.setPreferredSize(new Dimension(200, 100));
+        listSelectedChannelsThirdSensor.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
+
+        listSelectedChannelsThirdSensor.addListSelectionListener(this);
+        JScrollPane scrollPaneSelectedChannelsThirdSensor = new JScrollPane(listSelectedChannelsThirdSensor);
+        scrollPaneSelectedChannelsThirdSensor.setPreferredSize(new Dimension(200, 100));
+        panelSelectChannelsThirdSensor.add(scrollPaneSelectedChannelsThirdSensor, BorderLayout.WEST);
+        
+        JPanel selectChannelsThirdSensorPanel = new JPanel();
+        GridBagConstraints c13ThirdSensor = new GridBagConstraints();
+        c13ThirdSensor.gridwidth = GridBagConstraints.REMAINDER;
+        c13ThirdSensor.gridheight = 1;
+        addChannelFromThirdSensor = new JButton("+");
+        addChannelFromThirdSensor.setEnabled(false);
+        addChannelFromThirdSensor.setPreferredSize(new Dimension(50, 25));
+        addChannelFromThirdSensor.addActionListener(this);
+        addChannelFromThirdSensor.setActionCommand("addChannelThirdSensor");
+        selectChannelsThirdSensorPanel.add(addChannelFromThirdSensor, c13ThirdSensor);
+
+        removeChannelFromThirdSensor = new JButton("-");
+        removeChannelFromThirdSensor.setEnabled(false);
+        removeChannelFromThirdSensor.setPreferredSize(new Dimension(50, 25));
+        removeChannelFromThirdSensor.addActionListener(this);
+        removeChannelFromThirdSensor.setActionCommand("removeChannelThirdSensor");
+        selectChannelsThirdSensorPanel.add(removeChannelFromThirdSensor, c13ThirdSensor);
+
+        moveUpChannelFromThirdSensor = new JButton(IconManager.imgic78);
+        moveUpChannelFromThirdSensor.setEnabled(false);
+        moveUpChannelFromThirdSensor.setPreferredSize(new Dimension(50, 25));
+        moveUpChannelFromThirdSensor.addActionListener(this);
+        moveUpChannelFromThirdSensor.setActionCommand("moveUpChannelThirdSensor");
+        selectChannelsThirdSensorPanel.add(moveUpChannelFromThirdSensor, c13ThirdSensor);
+
+        moveDownChannelFromThirdSensor = new JButton(IconManager.imgic79);
+        moveDownChannelFromThirdSensor.setEnabled(false);
+        moveDownChannelFromThirdSensor.setPreferredSize(new Dimension(50, 25));
+        moveDownChannelFromThirdSensor.addActionListener(this);
+        moveDownChannelFromThirdSensor.setActionCommand("moveDownChannelThirdSensor");
+        selectChannelsThirdSensorPanel.add(moveDownChannelFromThirdSensor, c13ThirdSensor);
+
+        panelSelectChannelsThirdSensor.add(selectChannelsThirdSensorPanel, c04);
+        jp03.add(panelSelectChannelsThirdSensor, c04);
+
+        jp03.add(new JLabel("Interpreters computation time:"), c04);
+        c04.gridwidth = GridBagConstraints.REMAINDER;
+        interpretersCompTime = new JTextField(interpretersCompTimeDefault);
+        jp03.add(interpretersCompTime, c04);
+        jp03.add(new JLabel("Voter computation time:"), c04);
+        c04.gridwidth = GridBagConstraints.REMAINDER;
+        voterCompTime = new JTextField(voterCompTimeDefault);
+        jp03.add(voterCompTime, c04);
+        jp03.add(new JLabel("Timeout voter:"), c04);
+        c04.gridwidth = GridBagConstraints.REMAINDER;
+        voterTimeOut = new JTextField(voterTimeOutDefault);
+        jp03.add(voterTimeOut, c04);
+        if (currPanel instanceof TMLArchiPanel) {
+            //Can only secure a mapping
+            jp1.add("Auto add Pattern", jp03);
+        }
+    }
+
+    private void addChannelMainSensor() {
+        if (listChannelsMainSensor.getSelectedIndex() >= 0) {
+            String selectedChannel = listChannelsMainSensor.getSelectedItem().toString();
+            if (selectedChannel != "" && !selectedChannelsMainSensor.contains(selectedChannel)) {
+                selectedChannelsMainSensor.addElement(selectedChannel);
+                listSelectedChannelsMainSensor.setListData(selectedChannelsMainSensor);
+            }
+        }
+    }
+
+    private void removeChannelMainSensor() {
+        int selectedChannelIndex = listSelectedChannelsMainSensor.getSelectedIndex();
+        if (selectedChannelIndex >= 0) {
+            selectedChannelsMainSensor.remove(selectedChannelIndex);
+            listSelectedChannelsMainSensor.setListData(selectedChannelsMainSensor);
+        }
+    }
+
+    private void moveUpChannelMainSensor() {
+        int selectedChannelIndex = listSelectedChannelsMainSensor.getSelectedIndex();
+        String selectedChannel = listSelectedChannelsMainSensor.getSelectedValue();
+        if (selectedChannelIndex > 0) {
+            selectedChannelsMainSensor.remove(selectedChannelIndex);
+            selectedChannelsMainSensor.add(selectedChannelIndex-1, selectedChannel);
+            listSelectedChannelsMainSensor.setListData(selectedChannelsMainSensor);
+        }
+    }
+
+    private void moveDownChannelMainSensor() {
+        int selectedChannelIndex = listSelectedChannelsMainSensor.getSelectedIndex();
+        String selectedChannel = listSelectedChannelsMainSensor.getSelectedValue();
+        if (selectedChannelIndex < selectedChannelsMainSensor.size()-1 && selectedChannelIndex >= 0) {
+            selectedChannelsMainSensor.remove(selectedChannelIndex);
+            selectedChannelsMainSensor.add(selectedChannelIndex+1, selectedChannel);  
+            listSelectedChannelsMainSensor.setListData(selectedChannelsMainSensor);
+        }
+    }
+
+    private void addChannelSecondSensor() {
+        if (listChannelsSecondSensor.getSelectedIndex() >= 0) {
+            String selectedChannel = listChannelsSecondSensor.getSelectedItem().toString();
+            if (selectedChannel != "" && !selectedChannelsSecondSensor.contains(selectedChannel)) {
+                selectedChannelsSecondSensor.addElement(selectedChannel);
+                listSelectedChannelsSecondSensor.setListData(selectedChannelsSecondSensor);
+            }
+        }
+    }
+
+    private void removeChannelSecondSensor() {
+        int selectedChannelIndex = listSelectedChannelsSecondSensor.getSelectedIndex();
+        if (selectedChannelIndex >= 0) {
+            selectedChannelsSecondSensor.remove(selectedChannelIndex);
+            listSelectedChannelsSecondSensor.setListData(selectedChannelsSecondSensor);
+        }
+    }
+
+    private void moveUpChannelSecondSensor() {
+        int selectedChannelIndex = listSelectedChannelsSecondSensor.getSelectedIndex();
+        String selectedChannel = listSelectedChannelsSecondSensor.getSelectedValue();
+        if (selectedChannelIndex > 0) {
+            selectedChannelsSecondSensor.remove(selectedChannelIndex);
+            selectedChannelsSecondSensor.add(selectedChannelIndex-1, selectedChannel);
+            listSelectedChannelsSecondSensor.setListData(selectedChannelsSecondSensor);
+        } 
+    }
+
+    private void moveDownChannelSecondSensor() {
+        int selectedChannelIndex = listSelectedChannelsSecondSensor.getSelectedIndex();
+        String selectedChannel = listSelectedChannelsSecondSensor.getSelectedValue();
+        if (selectedChannelIndex < selectedChannelsSecondSensor.size()-1 && selectedChannelIndex >= 0) {
+            selectedChannelsSecondSensor.remove(selectedChannelIndex);
+            selectedChannelsSecondSensor.add(selectedChannelIndex+1, selectedChannel);
+            listSelectedChannelsSecondSensor.setListData(selectedChannelsSecondSensor);
+        }
+    }
+
+    private void addChannelThirdSensor() {
+        if (listChannelsThirdSensor.getSelectedIndex() >= 0) {
+            String selectedChannel = listChannelsThirdSensor.getSelectedItem().toString();
+            if (selectedChannel != "" && !selectedChannelsThirdSensor.contains(selectedChannel)) {
+                selectedChannelsThirdSensor.addElement(selectedChannel);
+                listSelectedChannelsThirdSensor.setListData(selectedChannelsThirdSensor);
+            }
+        }
+    }
+
+    private void removeChannelThirdSensor() {
+        int selectedChannelIndex = listSelectedChannelsThirdSensor.getSelectedIndex();
+        if (selectedChannelIndex >= 0) {
+            selectedChannelsThirdSensor.remove(selectedChannelIndex);
+            listSelectedChannelsThirdSensor.setListData(selectedChannelsThirdSensor);
+        }
+    }
+
+    private void moveUpChannelThirdSensor() {
+        int selectedChannelIndex = listSelectedChannelsThirdSensor.getSelectedIndex();
+        String selectedChannel = listSelectedChannelsThirdSensor.getSelectedValue();
+        if (selectedChannelIndex > 0) {
+            selectedChannelsThirdSensor.remove(selectedChannelIndex);
+            selectedChannelsThirdSensor.add(selectedChannelIndex-1, selectedChannel);
+            listSelectedChannelsThirdSensor.setListData(selectedChannelsThirdSensor); 
+        }
+    }
+
+    private void moveDownChannelThirdSensor() {
+        int selectedChannelIndex = listSelectedChannelsThirdSensor.getSelectedIndex();
+        String selectedChannel = listSelectedChannelsThirdSensor.getSelectedValue();
+        if (selectedChannelIndex < selectedChannelsThirdSensor.size()-1 && selectedChannelIndex >= 0) {
+            selectedChannelsThirdSensor.remove(selectedChannelIndex);
+            selectedChannelsThirdSensor.add(selectedChannelIndex+1, selectedChannel);  
+            listSelectedChannelsThirdSensor.setListData(selectedChannelsThirdSensor);
+        }
+    }
+
     protected void initComponents() {
 
         jp1 = GraphicLib.createTabbedPane();//new JTabbedPane();
@@ -352,29 +786,89 @@ public class JDialogProverifVerification extends JDialog implements ActionListen
         autoStrongAuth = new JCheckBox("Add security (Strong Authenticity)");
         autoStrongAuth.setEnabled(false);
         jp02.add(autoStrongAuth, c01);
-
 		autoStrongAuth.addActionListener(this);
 		
+        listIgnoredChannelsToAddSec = new JList<String>(ignoredChannelsToAddSec);
+        JPanel panelListChannelsAddSec = new JPanel();
+        panelListChannelsAddSec.setPreferredSize(new Dimension(250, 150));
+        GridBagConstraints cListChannelsAddSec = new GridBagConstraints();
+		cListChannelsAddSec.gridwidth = 1;
+		cListChannelsAddSec.gridheight = 1;
+		cListChannelsAddSec.fill= GridBagConstraints.BOTH;
+     	listIgnoredChannelsToAddSec.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
+     	listIgnoredChannelsToAddSec.addListSelectionListener(this);
+
+        JScrollPane scrollPane1ChannelsToAddSec = new JScrollPane(listIgnoredChannelsToAddSec);
+        scrollPane1ChannelsToAddSec.setPreferredSize(new Dimension(250, 150));
+        panelListChannelsAddSec.add(scrollPane1ChannelsToAddSec, BorderLayout.WEST);
+
+        JPanel buttonPanelChannelsToAddSec = new JPanel();
+        GridBagConstraints cButtonChannelsToAddSec = new GridBagConstraints();
+        cButtonChannelsToAddSec.gridwidth = GridBagConstraints.REMAINDER;
+        cButtonChannelsToAddSec.gridheight = 1;
+
+        addAllChannelsToAddSec = new JButton(IconManager.imgic50);
+        addAllChannelsToAddSec.setPreferredSize(new Dimension(50, 25));
+        addAllChannelsToAddSec.setEnabled(false);
+        addAllChannelsToAddSec.addActionListener(this);
+        addAllChannelsToAddSec.setActionCommand("addAllChannelsToAddSec");
+        buttonPanelChannelsToAddSec.add(addAllChannelsToAddSec, cButtonChannelsToAddSec);
+
+        addOneChannelToAddSec = new JButton(IconManager.imgic48);
+        addOneChannelToAddSec.setPreferredSize(new Dimension(50, 25));
+        addOneChannelToAddSec.setEnabled(false);
+        addOneChannelToAddSec.addActionListener(this);
+        addOneChannelToAddSec.setActionCommand("addOneChannelToAddSec");
+        buttonPanelChannelsToAddSec.add(addOneChannelToAddSec, cButtonChannelsToAddSec);
+
+        buttonPanelChannelsToAddSec.add(new JLabel(" "), cButtonChannelsToAddSec);
+
+        removeOneChannelToAddSec = new JButton(IconManager.imgic46);
+        removeOneChannelToAddSec.setEnabled(false);
+        removeOneChannelToAddSec.addActionListener(this);
+        removeOneChannelToAddSec.setPreferredSize(new Dimension(50, 25));
+        removeOneChannelToAddSec.setActionCommand("removeOneChannelToAddSec");
+        buttonPanelChannelsToAddSec.add(removeOneChannelToAddSec, cButtonChannelsToAddSec);
+
+        removeAllChannelsToAddSec = new JButton(IconManager.imgic44);
+        removeAllChannelsToAddSec.setEnabled(false);
+        removeAllChannelsToAddSec.addActionListener(this);
+        removeAllChannelsToAddSec.setPreferredSize(new Dimension(50, 25));
+        removeAllChannelsToAddSec.setActionCommand("removeAllChannelsToAddSec");
+        buttonPanelChannelsToAddSec.add(removeAllChannelsToAddSec, cButtonChannelsToAddSec);
+        buttonPanelChannelsToAddSec.setPreferredSize(new Dimension(50, 150));
+        panelListChannelsAddSec.add(buttonPanelChannelsToAddSec, cListChannelsAddSec);
+
+        listSelectedChannelsToAddSec = new JList<String>(selectedChannelsToAddSec);
+        listSelectedChannelsToAddSec.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
+        listSelectedChannelsToAddSec.addListSelectionListener(this);
+        JScrollPane scrollPane2ChannelsToAddSec = new JScrollPane(listSelectedChannelsToAddSec);
+        scrollPane2ChannelsToAddSec.setPreferredSize(new Dimension(250, 150));
+        panelListChannelsAddSec.add(scrollPane2ChannelsToAddSec, BorderLayout.CENTER);
+        panelListChannelsAddSec.setPreferredSize(new Dimension(600, 175));
+        panelListChannelsAddSec.setMinimumSize(new Dimension(600, 175));
+        c01.gridheight = 10;
+        jp02.add(panelListChannelsAddSec, c01);
+
 		addHSM = new JCheckBox("Add HSM to component:");
         addHSM.addActionListener(this);
 		addHSM.setEnabled(false);
 		jp02.add(addHSM, c01);
 		
-		
 		listIgnored = new JList<String>(ignoredTasks);
 
 
 		listPanel = new JPanel();
-		listPanel.setPreferredSize(new Dimension(250, 200));
+		listPanel.setPreferredSize(new Dimension(250, 150));
 		GridBagConstraints c02 = new GridBagConstraints();
 		c02.gridwidth=1;
 		c02.gridheight=1;
 		c02.fill= GridBagConstraints.BOTH;
-     	listIgnored.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION );
+     	listIgnored.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
 
         listIgnored.addListSelectionListener(this);
         JScrollPane scrollPane1 = new JScrollPane(listIgnored);
-        scrollPane1.setPreferredSize(new Dimension(250, 200));
+        scrollPane1.setPreferredSize(new Dimension(250, 150));
         listPanel.add(scrollPane1, BorderLayout.WEST);
 
         JPanel buttonPanel = new JPanel();
@@ -416,7 +910,7 @@ public class JDialogProverifVerification extends JDialog implements ActionListen
         allIgnored.setActionCommand("allIgnored");
         buttonPanel.add(allIgnored, c13);
         listPanel.add(buttonPanel, c02);
-        buttonPanel.setPreferredSize(new Dimension(50, 200));
+        buttonPanel.setPreferredSize(new Dimension(50, 150));
 
 		allIgnored.setEnabled(false);
 		
@@ -426,10 +920,10 @@ public class JDialogProverifVerification extends JDialog implements ActionListen
         listSelected.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
         listSelected.addListSelectionListener(this);
         JScrollPane scrollPane2 = new JScrollPane(listSelected);
-        scrollPane2.setPreferredSize(new Dimension(250, 200));
+        scrollPane2.setPreferredSize(new Dimension(250, 150));
         listPanel.add(scrollPane2, BorderLayout.CENTER);
-        listPanel.setPreferredSize(new Dimension(600, 250));
-        listPanel.setMinimumSize(new Dimension(600, 250));
+        listPanel.setPreferredSize(new Dimension(600, 175));
+        listPanel.setMinimumSize(new Dimension(600, 175));
         c01.gridheight = 10;
         jp02.add(listPanel, c01);
         c02.gridheight = 1;
@@ -609,6 +1103,7 @@ public class JDialogProverifVerification extends JDialog implements ActionListen
             //Can only secure a mapping
             jp1.add("Automated Security", jp02);
         }
+        panelAutoPattern();
         c.add(jp1, BorderLayout.NORTH);
         c.add(jp2, BorderLayout.SOUTH);
 
@@ -672,6 +1167,84 @@ public class JDialogProverifVerification extends JDialog implements ActionListen
         setButtons();
     }
 
+    private void addAllChannelsToAddSec() {
+        for(String ch : ignoredChannelsToAddSec) {
+            String toAdd = ch;
+            if (autoConf.isSelected() || autoStrongAuth.isSelected() || autoWeakAuth.isSelected()) {
+                toAdd += ":";
+                if (autoConf.isSelected()) {
+                    toAdd += " " + ADD_CONFIDENTIALITY + " +"; 
+                }
+                if (autoStrongAuth.isSelected()) {
+                    toAdd += " " + ADD_STRONG_AUTHENTICITY + " +"; 
+                } else if (autoWeakAuth.isSelected()) {
+                    toAdd += " " + ADD_WEAK_AUTHENTICITY + " +"; 
+                }
+                toAdd = toAdd.substring(0, toAdd.length() - 2);
+            }
+            selectedChannelsToAddSec.add(toAdd);
+        }
+        ignoredChannelsToAddSec.removeAllElements();
+        listIgnoredChannelsToAddSec.setListData(ignoredChannelsToAddSec);
+        listSelectedChannelsToAddSec.setListData(selectedChannelsToAddSec);
+        setButtons();
+    }
+
+    private void removeAllChannelsToAddSec() {
+        for(String ch : selectedChannelsToAddSec) {
+            ignoredChannelsToAddSec.add(ch.split(": ")[0]);
+        }
+        selectedChannelsToAddSec.removeAllElements();
+        listIgnoredChannelsToAddSec.setListData(ignoredChannelsToAddSec);
+        listSelectedChannelsToAddSec.setListData(selectedChannelsToAddSec);
+        setButtons();
+    }
+
+    private void addOneChannelToAddSec() {
+        int[] list = listIgnoredChannelsToAddSec.getSelectedIndices();
+        Vector<String> v = new Vector<String>();
+        String o;
+
+        for (int i = 0; i < list.length; i++) {
+            o = ignoredChannelsToAddSec.elementAt(list[i]);
+            String toAdd = o;
+            if (autoConf.isSelected() || autoStrongAuth.isSelected() || autoWeakAuth.isSelected()) {
+                toAdd += ":";
+                if (autoConf.isSelected()) {
+                    toAdd += " " + ADD_CONFIDENTIALITY + " +"; 
+                }
+                if (autoStrongAuth.isSelected()) {
+                    toAdd += " " + ADD_STRONG_AUTHENTICITY + " +"; 
+                } else if (autoWeakAuth.isSelected()) {
+                    toAdd += " " + ADD_WEAK_AUTHENTICITY + " +"; 
+                }
+                toAdd = toAdd.substring(0, toAdd.length() - 2);
+            }
+            selectedChannelsToAddSec.addElement(toAdd);
+            v.addElement(o);
+        }
+        ignoredChannelsToAddSec.removeAll(v);
+        listIgnoredChannelsToAddSec.setListData(ignoredChannelsToAddSec);
+        listSelectedChannelsToAddSec.setListData(selectedChannelsToAddSec);
+        setButtons();
+    }
+
+    private void removeOneChannelToAddSec() {
+        int[] list = listSelectedChannelsToAddSec.getSelectedIndices();
+        Vector<String> v = new Vector<String>();
+        String o;
+
+        for (int i = 0; i < list.length; i++) {
+            o = selectedChannelsToAddSec.elementAt(list[i]);
+            ignoredChannelsToAddSec.addElement(o.split(": ")[0]);
+            v.addElement(o);
+        }
+        selectedChannelsToAddSec.removeAll(v);
+        listIgnoredChannelsToAddSec.setListData(ignoredChannelsToAddSec);
+        listSelectedChannelsToAddSec.setListData(selectedChannelsToAddSec);
+        setButtons();
+    }
+
     @Override
     public void actionPerformed(ActionEvent evt) {
         String command = evt.getActionCommand();
@@ -762,6 +1335,38 @@ public class JDialogProverifVerification extends JDialog implements ActionListen
                     allValidated();
                 } else if (command.equals("allIgnored")) {
                     allIgnored();
+                }  else if (command.equals("addAllChannelsToAddSec")) {
+                    addAllChannelsToAddSec();
+                } else if (command.equals("removeAllChannelsToAddSec")) {
+                    removeAllChannelsToAddSec();
+                } else if (command.equals("addOneChannelToAddSec")) {
+                    addOneChannelToAddSec();
+                } else if (command.equals("removeOneChannelToAddSec")) {
+                    removeOneChannelToAddSec();
+                } else if (command.equals("addChannelMainSensor")) {
+                    addChannelMainSensor();
+                } else if (command.equals("removeChannelMainSensor")) {
+                    removeChannelMainSensor();
+                } else if (command.equals("moveUpChannelMainSensor")) {
+                    moveUpChannelMainSensor();
+                } else if (command.equals("moveDownChannelMainSensor")) {
+                    moveDownChannelMainSensor();
+                } else if (command.equals("addChannelSecondSensor")) {
+                    addChannelSecondSensor();
+                } else if (command.equals("removeChannelSecondSensor")) {
+                    removeChannelSecondSensor();
+                } else if (command.equals("moveUpChannelSecondSensor")) {
+                    moveUpChannelSecondSensor();
+                } else if (command.equals("moveDownChannelSecondSensor")) {
+                    moveDownChannelSecondSensor();
+                } else if (command.equals("addChannelThirdSensor")) {
+                    addChannelThirdSensor();
+                } else if (command.equals("removeChannelThirdSensor")) {
+                    removeChannelThirdSensor();
+                } else if (command.equals("moveUpChannelThirdSensor")) {
+                    moveUpChannelThirdSensor();
+                } else if (command.equals("moveDownChannelThirdSensor")) {
+                    moveDownChannelThirdSensor();
                 }
                 if (evt.getSource() == autoConf || evt.getSource() == autoSec || evt.getSource() == autoMapKeys || evt.getSource() == autoWeakAuth || evt.getSource()==addHSM) {
                     //autoWeakAuth.setEnabled(autoConf.isSelected());
@@ -778,13 +1383,102 @@ public class JDialogProverifVerification extends JDialog implements ActionListen
                         autoConf.setSelected(false);
                         autoWeakAuth.setSelected(false);
                         autoStrongAuth.setSelected(false);
+                        addHSM.setSelected(false);
+
+                        autoConf.setEnabled(false);
+                        autoWeakAuth.setEnabled(false);
+                        autoStrongAuth.setEnabled(false);
+                        allIgnored();
+                        removeAllChannelsToAddSec();
+                    }
+
+                    if (!autoWeakAuth.isSelected()) {
+                        autoStrongAuth.setSelected(false);
+                    }
+                }
+                if (evt.getSource() == autoSec || evt.getSource() == autoConf || evt.getSource() == autoWeakAuth) {
+                    if (autoSec.isSelected() && (autoWeakAuth.isSelected() || autoConf.isSelected())) {
+                        addAllChannelsToAddSec.setEnabled(true);
+                        addOneChannelToAddSec.setEnabled(true);
+                        removeAllChannelsToAddSec.setEnabled(true);
+                        removeOneChannelToAddSec.setEnabled(true);
+                    } else {
+                        addAllChannelsToAddSec.setEnabled(false);
+                        addOneChannelToAddSec.setEnabled(false);
+                        removeAllChannelsToAddSec.setEnabled(false);
+                        removeOneChannelToAddSec.setEnabled(false);
                     }
                 }
+
                 if (evt.getSource() == custom) {
                     encTime.setEnabled(custom.isSelected());
                     decTime.setEnabled(custom.isSelected());
                     secOverhead.setEnabled(custom.isSelected());
                 }
+                if (evt.getSource() == selectTwoSensors) {
+                    addChannelFromSecondSensor.setEnabled(selectTwoSensors.isSelected());
+                    removeChannelFromSecondSensor.setEnabled(selectTwoSensors.isSelected());
+                    moveUpChannelFromSecondSensor.setEnabled(selectTwoSensors.isSelected());
+                    moveDownChannelFromSecondSensor.setEnabled(selectTwoSensors.isSelected());
+                    listCompSelectSecondSensor.setEnabled(selectTwoSensors.isSelected());
+                    listChannelsSecondSensor.setEnabled(selectTwoSensors.isSelected());
+
+                    addChannelFromThirdSensor.setEnabled(selectTwoSensors.isSelected());
+                    removeChannelFromThirdSensor.setEnabled(selectTwoSensors.isSelected());
+                    moveUpChannelFromThirdSensor.setEnabled(selectTwoSensors.isSelected());
+                    moveDownChannelFromThirdSensor.setEnabled(selectTwoSensors.isSelected());
+                    listCompSelectThirdSensor.setEnabled(selectTwoSensors.isSelected());
+                    listChannelsThirdSensor.setEnabled(selectTwoSensors.isSelected());
+                }
+                if (evt.getSource() == listCompSelectReceiver || evt.getSource() == listCompSelectMainSensor) {
+                    int selectedReceiverIndex = listCompSelectReceiver.getSelectedIndex();
+                    int selectedMainSensorIndex = listCompSelectMainSensor.getSelectedIndex();
+                    listChannelsMainSensor.removeAllItems();
+                    if (selectedMainSensorIndex >= 0 && selectedReceiverIndex >= 0 && selectedMainSensorIndex != selectedReceiverIndex) {
+                        allChannelsMainSensor = getListChannelsBetweenTwoTasks(allTasksFullName.get(selectedMainSensorIndex), allTasksFullName.get(selectedReceiverIndex));
+                        
+                        for(String chName : allChannelsMainSensor) {
+                            listChannelsMainSensor.addItem(chName);
+                        }
+                    }
+                    listChannelsMainSensor.setSelectedItem(-1);
+                    listChannelsMainSensor.addActionListener(this);
+                    selectedChannelsMainSensor.removeAllElements();
+                    listSelectedChannelsMainSensor.setListData(selectedChannelsMainSensor);
+                }
+
+                if (evt.getSource() == listCompSelectReceiver || evt.getSource() == listCompSelectSecondSensor) {
+                    int selectedReceiverIndex = listCompSelectReceiver.getSelectedIndex();
+                    int selectedSecondSensorIndex = listCompSelectSecondSensor.getSelectedIndex();
+                    listChannelsSecondSensor.removeAllItems();
+                    if (selectedReceiverIndex >= 0 && selectedSecondSensorIndex >= 0  && selectedSecondSensorIndex!=selectedReceiverIndex) {
+                        allChannelsSecondSensor = getListChannelsBetweenTwoTasks(allTasksFullName.get(selectedSecondSensorIndex), allTasksFullName.get(selectedReceiverIndex));
+                        
+                        for(String chName : allChannelsSecondSensor) {
+                            listChannelsSecondSensor.addItem(chName);
+                        }
+                    }
+                    listChannelsSecondSensor.setSelectedItem(-1);
+                    listChannelsSecondSensor.addActionListener(this);
+                    selectedChannelsSecondSensor.removeAllElements();
+                    listSelectedChannelsSecondSensor.setListData(selectedChannelsSecondSensor);
+                }
+                if (evt.getSource() == listCompSelectReceiver || evt.getSource() == listCompSelectThirdSensor) {
+                    int selectedReceiverIndex = listCompSelectReceiver.getSelectedIndex();
+                    int selectedThirdSensorIndex = listCompSelectThirdSensor.getSelectedIndex();
+                    listChannelsThirdSensor.removeAllItems();
+                    if (selectedReceiverIndex >= 0 && selectedThirdSensorIndex >= 0  && selectedThirdSensorIndex!=selectedReceiverIndex) {
+                        allChannelsThirdSensor = getListChannelsBetweenTwoTasks(allTasksFullName.get(selectedThirdSensorIndex), allTasksFullName.get(selectedReceiverIndex));
+                        
+                        for(String chName : allChannelsThirdSensor) {
+                            listChannelsThirdSensor.addItem(chName);
+                        }
+                    }
+                    listChannelsThirdSensor.setSelectedItem(-1);
+                    listChannelsThirdSensor.addActionListener(this);
+                    selectedChannelsThirdSensor.removeAllElements();
+                    listSelectedChannelsThirdSensor.setListData(selectedChannelsThirdSensor);
+                }
         }
     }
 
@@ -857,176 +1551,260 @@ public class JDialogProverifVerification extends JDialog implements ActionListen
         TraceManager.addDev("Thread started");
         File testFile;
         Map<String, List<String>> selectedCpuTasks = new HashMap<String, java.util.List<String>>();
-        try {
-            if (jp1.getSelectedIndex() == 1) {
-            	if (autoSec.isSelected()){
-	                encCC = encTime.getText();
-	                decCC = decTime.getText();
-	                secOv = secOverhead.getText();
-	                TMLMapping map;
-	                if (addHSM.isSelected() && selectedTasks.size()>0) {
-	                	
-
-                    	for (String task : selectedTasks) {
-                        	String cpu = taskCpuMap.get(task);
-                        	if (selectedCpuTasks.containsKey(cpu)) {
-                            	selectedCpuTasks.get(cpu).add(task);
-                        	} else {
-                            	ArrayList<String> tasks = new ArrayList<String>();
-                            	tasks.add(task);
-                            	selectedCpuTasks.put(cpu, tasks);
-                        	}
-                    	}
-                    	//mgui.gtm.addHSM(mgui, selectedCpuTasks);
-	                }
-		            if (autoConf.isSelected() || autoWeakAuth.isSelected() || autoStrongAuth.isSelected()) {
-                    	if (custom.isSelected()) {
-                    	    map = mgui.gtm.autoSecure(mgui, encCC, secOv, decCC, autoConf.isSelected(), autoWeakAuth.isSelected(),
-                                    autoStrongAuth.isSelected(), selectedCpuTasks);
-                    	} else {
-                        	map = mgui.gtm.autoSecure(mgui, "100", "0", "100", autoConf.isSelected(),
-                                    autoWeakAuth.isSelected(), autoStrongAuth.isSelected(), selectedCpuTasks);
-                    	}
-                	}
-                } 
-                else if (autoMapKeys.isSelected()) {
-                    mgui.gtm.autoMapKeys();
+        int currentPosY = 0;
+        int stepY = 10; 
+        if (jp1.getSelectedIndex() == 2) {
+            interpretersCompTimeDefault = interpretersCompTime.getText();
+            voterCompTimeDefault = voterCompTime.getText();
+            voterTimeOutDefault = voterTimeOut.getText();
+            jta.removeAll();
+            boolean findErr = false;
+            if (listCompSelectReceiver.getSelectedIndex() < 0) {
+                JLabel label = new JLabel("ERROR: Receiver not selected");
+                label.setAlignmentX(Component.LEFT_ALIGNMENT);
+                this.jta.add(label, this.createGbc(currentPosY));
+                currentPosY += stepY;
+                findErr = true;
+            }
+            if (listCompSelectMainSensor.getSelectedIndex() < 0) {
+                JLabel label = new JLabel("ERROR: Main Sensor not selected");
+                label.setAlignmentX(Component.LEFT_ALIGNMENT);
+                this.jta.add(label, this.createGbc(currentPosY));
+                currentPosY += stepY;
+                findErr = true;
+            }
+            if (listCompSelectMainSensor.getSelectedItem() == listCompSelectReceiver.getSelectedItem()) {
+                JLabel label = new JLabel("ERROR: Receiver and Main Sensor must be different");
+                label.setAlignmentX(Component.LEFT_ALIGNMENT);
+                this.jta.add(label, this.createGbc(currentPosY));
+                currentPosY += stepY;
+                findErr = true;
+            }
+            if (selectedChannelsMainSensor.size() == 0) {
+                JLabel label = new JLabel("ERROR: No Channel of main sensor is selected");
+                label.setAlignmentX(Component.LEFT_ALIGNMENT);
+                this.jta.add(label, this.createGbc(currentPosY));
+                currentPosY += stepY;
+                findErr = true;
+            }
+            if (selectTwoSensors.isSelected() && listCompSelectSecondSensor.getSelectedIndex() < 0) {
+                JLabel label = new JLabel("ERROR: Second Sensor not selected");
+                label.setAlignmentX(Component.LEFT_ALIGNMENT);
+                this.jta.add(label, this.createGbc(currentPosY));
+                currentPosY += stepY;
+                findErr = true;
+            }
+            if (selectTwoSensors.isSelected() && selectedChannelsSecondSensor.size() == 0) {
+                JLabel label = new JLabel("ERROR: No Channel of second sensor is selected");
+                label.setAlignmentX(Component.LEFT_ALIGNMENT);
+                this.jta.add(label, this.createGbc(currentPosY));
+                currentPosY += stepY;
+                findErr = true;
+            }
+            if (selectTwoSensors.isSelected() && listCompSelectThirdSensor.getSelectedIndex() < 0) {
+                JLabel label = new JLabel("ERROR: Third Sensor not selected");
+                label.setAlignmentX(Component.LEFT_ALIGNMENT);
+                this.jta.add(label, this.createGbc(currentPosY));
+                currentPosY += stepY;
+                findErr = true;
+            }
+            if (selectTwoSensors.isSelected() && selectedChannelsThirdSensor.size() == 0) {
+                JLabel label = new JLabel("ERROR: No Channel of third sensor is selected");
+                label.setAlignmentX(Component.LEFT_ALIGNMENT);
+                this.jta.add(label, this.createGbc(currentPosY));
+                currentPosY += stepY;
+                findErr = true;
+            }
+            if (selectTwoSensors.isSelected() && (selectedChannelsThirdSensor.size() != selectedChannelsSecondSensor.size() || selectedChannelsThirdSensor.size() != selectedChannelsMainSensor.size() || selectedChannelsMainSensor.size() != selectedChannelsSecondSensor.size())) {
+                JLabel label = new JLabel("ERROR: The number of selected channels is not the same for the 3 sensors");
+                label.setAlignmentX(Component.LEFT_ALIGNMENT);
+                this.jta.add(label, this.createGbc(currentPosY));
+                currentPosY += stepY;
+                findErr = true;
+            }
+            if (selectTwoSensors.isSelected() && listCompSelectMainSensor.getSelectedItem() == listCompSelectSecondSensor.getSelectedItem()) {
+                JLabel label = new JLabel("ERROR: Main and second Sensors must be different");
+                label.setAlignmentX(Component.LEFT_ALIGNMENT);
+                this.jta.add(label, this.createGbc(currentPosY));
+                currentPosY += stepY;
+                findErr = true;
+            }
+            if (selectTwoSensors.isSelected() && listCompSelectSecondSensor.getSelectedItem() == listCompSelectThirdSensor.getSelectedItem()) {
+                JLabel label = new JLabel("ERROR: Second and third Sensors must be different");
+                label.setAlignmentX(Component.LEFT_ALIGNMENT);
+                this.jta.add(label, this.createGbc(currentPosY));
+                currentPosY += stepY;
+                findErr = true;
+            }
+            if (selectTwoSensors.isSelected() && listCompSelectMainSensor.getSelectedItem() == listCompSelectThirdSensor.getSelectedItem()) {
+                JLabel label = new JLabel("ERROR: Main and third Sensors must be different");
+                label.setAlignmentX(Component.LEFT_ALIGNMENT);
+                this.jta.add(label, this.createGbc(currentPosY));
+                currentPosY += stepY;
+                findErr = true;
+            }
+            if (selectTwoSensors.isSelected() && listCompSelectReceiver.getSelectedItem() == listCompSelectSecondSensor.getSelectedItem()) {
+                JLabel label = new JLabel("ERROR: Receiver and second Sensor must be different");
+                label.setAlignmentX(Component.LEFT_ALIGNMENT);
+                this.jta.add(label, this.createGbc(currentPosY));
+                currentPosY += stepY;
+                findErr = true;
+            }
+            if (selectTwoSensors.isSelected() && listCompSelectReceiver.getSelectedItem() == listCompSelectThirdSensor.getSelectedItem()) {
+                JLabel label = new JLabel("ERROR: Receiver and third Sensor must be different");
+                label.setAlignmentX(Component.LEFT_ALIGNMENT);
+                this.jta.add(label, this.createGbc(currentPosY));
+                currentPosY += stepY;
+                findErr = true;
+            }
+            if (!findErr) {
+                selectedSensors.put(listCompSelectMainSensor.getSelectedItem().toString(), selectedChannelsMainSensor);
+                if (selectTwoSensors.isSelected()) {
+                    selectedSensors.put(listCompSelectSecondSensor.getSelectedItem().toString(), selectedChannelsSecondSensor);
+                    selectedSensors.put(listCompSelectThirdSensor.getSelectedItem().toString(), selectedChannelsThirdSensor);
                 }
-            	
-                jta.removeAll();
-                JLabel label = new JLabel("Security Generation Complete");
-            	label.setAlignmentX(Component.LEFT_ALIGNMENT);
-            	this.jta.add(label, this.createGbc(0));
-                mode = NOT_STARTED;
+                mgui.gtm.addPattern(mgui, selectedSensors, listCompSelectReceiver.getSelectedItem().toString(), interpretersCompTimeDefault, voterCompTimeDefault, voterTimeOutDefault);
+                JLabel label = new JLabel("Pattern Generation Complete");
+                label.setAlignmentX(Component.LEFT_ALIGNMENT);
+                this.jta.add(label, this.createGbc(currentPosY));
             }
-            else {
-
-
+            mode = NOT_STARTED;
+        } else {
+            try {
+                if (jp1.getSelectedIndex() == 1) {
+                    if (autoSec.isSelected()){
+                        encCC = encTime.getText();
+                        decCC = decTime.getText();
+                        secOv = secOverhead.getText();
+                        TMLMapping map;
+                        if (addHSM.isSelected() && selectedTasks.size()>0) {
+                            
+
+                            for (String task : selectedTasks) {
+                                String cpu = taskCpuMap.get(task);
+                                if (selectedCpuTasks.containsKey(cpu)) {
+                                    selectedCpuTasks.get(cpu).add(task);
+                                } else {
+                                    ArrayList<String> tasks = new ArrayList<String>();
+                                    tasks.add(task);
+                                    selectedCpuTasks.put(cpu, tasks);
+                                }
+                            }
+                            //mgui.gtm.addHSM(mgui, selectedCpuTasks);
+                        }
+                        if (autoConf.isSelected() || autoWeakAuth.isSelected() || autoStrongAuth.isSelected()) {
+                            /*if (custom.isSelected()) {
+                                map = mgui.gtm.autoSecure(mgui, encCC, secOv, decCC, autoConf.isSelected(), autoWeakAuth.isSelected(),
+                                        autoStrongAuth.isSelected(), selectedCpuTasks);
+                            } else {
+                                map = mgui.gtm.autoSecure(mgui, "100", "0", "100", autoConf.isSelected(),
+                                        autoWeakAuth.isSelected(), autoStrongAuth.isSelected(), selectedCpuTasks);
+                            }*/
+                            mgui.gtm.autoSecure(mgui, encCC, secOv, decCC, selectedChannelsToAddSec, selectedCpuTasks);
+                        }
+                    } 
+                    else if (autoMapKeys.isSelected()) {
+                        mgui.gtm.autoMapKeys();
+                    }
+                    
+                    jta.removeAll();
+                    JLabel label = new JLabel("Security Generation Complete");
+                    label.setAlignmentX(Component.LEFT_ALIGNMENT);
+                    this.jta.add(label, this.createGbc(0));
+                    mode = NOT_STARTED;
+                }
+                else {
+                    testGo();
+                    pathCode = code1.getText().trim();
 
+                    SpecConfigTTool.checkAndCreateProverifDir(pathCode);
 
-                testGo();
-                pathCode = code1.getText().trim();
+                    pathCode += "pvspec";
+                    testFile = new File(pathCode);
 
-                SpecConfigTTool.checkAndCreateProverifDir(pathCode);
 
-                pathCode += "pvspec";
-                testFile = new File(pathCode);
+                    File dir = testFile.getParentFile();
 
+                    if (dir == null || !dir.exists()) {
+                        mode = STOPPED;
+                        setButtons();
+                        throw new ProVerifVerificationException("Error: invalid file: " + pathCode);
+                    }
 
-                File dir = testFile.getParentFile();
 
-                if (dir == null || !dir.exists()) {
-                    mode = STOPPED;
-                    setButtons();
-                    throw new ProVerifVerificationException("Error: invalid file: " + pathCode);
-                }
+                    if (testFile.exists()) {
+                        // FIXME Raise error if modified since last
+                        TraceManager.addDev("FILE EXISTS!!!");
+                    }
 
 
-                if (testFile.exists()) {
-                    // FIXME Raise error if modified since last
-                    TraceManager.addDev("FILE EXISTS!!!");
-                }
-
+                    if (!mgui.gtm.generateProVerifFromAVATAR(
+                            pathCode,
+                            stateReachabilityAll.isSelected() ? REACHABILITY_ALL :
+                                    stateReachabilitySelected.isSelected() ? REACHABILITY_SELECTED : REACHABILITY_NONE,
+                            typedLanguage.isSelected(),
+                            privateChannelDup.isSelected(),
+                            loopLimit.getText())
+                            ) {
+                        throw new ProVerifVerificationException("Could not generate proverif code");
+                    }
 
-                if (!mgui.gtm.generateProVerifFromAVATAR(
-                        pathCode,
-                        stateReachabilityAll.isSelected() ? REACHABILITY_ALL :
-                                stateReachabilitySelected.isSelected() ? REACHABILITY_SELECTED : REACHABILITY_NONE,
-                        typedLanguage.isSelected(),
-                        privateChannelDup.isSelected(),
-                        loopLimit.getText())
-                        ) {
-                    mode = NOT_STARTED; setButtons();
-                    throw new ProVerifVerificationException("Could not generate proverif code");
-                }
 
+                    String cmd = exe2.getText().trim();
 
-                String cmd = exe2.getText().trim();
-                /*File proverifVerifier= new File(cmd);
-                if (!proverifVerifier.exists()) {
-                    mode = NOT_STARTED; setButtons();
-                    throw new ProVerifVerificationException(cmd + ": Proverif prover not found");
-                }*/
-
-                // Must test if this command corresponds to ProVerif
-                this.rshc = new RshClient(hostProVerif);
-                this.rshc.setCmd(cmd + " -help");
-                this.rshc.sendExecuteCommandRequest();
-                RshClientReader readerHelp = this.rshc.getDataReaderFromProcess();
-                BufferedReader bReader = new BufferedReader(readerHelp);
-                String str;
-                boolean foundProverif = false;
-                while ((str = bReader.readLine()) != null) {
-                    if (str.contains("Proverif")) {
-                        foundProverif = true;
+                    if (this.typedLanguage.isSelected()) {
+                        cmd += " -in pitype ";
+                    } else {
+                        cmd += " -in pi ";
                     }
-                }
-
-                if (!foundProverif) {
-                    mode = NOT_STARTED; setButtons();
-                    throw new ProVerifVerificationException("\"" + cmd + "\" refers to an invalid Proverif prover");
-                }
-
 
-                if (this.typedLanguage.isSelected()) {
-                    cmd += " -in pitype ";
-                } else {
-                    cmd += " -in pi ";
-                }
+                    cmd += pathCode;
+                    TraceManager.addDev("Executing command:" + cmd);
 
-                cmd += pathCode;
-                TraceManager.addDev("Executing command:" + cmd);
+                    testGo();
 
-                testGo();
+                    this.rshc = new RshClient(hostProVerif);
+                    this.rshc.setCmd(cmd);
+                    this.rshc.sendExecuteCommandRequest();
+                    RshClientReader reader = this.rshc.getDataReaderFromProcess();
 
-                this.rshc = new RshClient(hostProVerif);
-                this.rshc.setCmd(cmd);
-                this.rshc.sendExecuteCommandRequest();
-                RshClientReader reader = this.rshc.getDataReaderFromProcess();
+                    if (this.pvoa == null) {
+                        this.pvoa = mgui.gtm.getProVerifOutputAnalyzer();
+                        this.pvoa.addListener(this);
+                    }
+                    //try {
+                        this.pvoa.analyzeOutput(reader, typedLanguage.isSelected());
+                    /*} catch (Exception e) {
+                        TraceManager.addDev("Traces could not be analyzed: " + e.getMessage());
+                    }*/
 
+                    mgui.modelBacktracingProVerif(pvoa);
 
-                if (this.pvoa == null) {
-                    this.pvoa = mgui.gtm.getProVerifOutputAnalyzer();
-                    this.pvoa.addListener(this);
-                }
-                //try {
-                    this.pvoa.analyzeOutput(reader, typedLanguage.isSelected());
-                /*} catch (Exception e) {
-                    TraceManager.addDev("Traces could not be analyzed: " + e.getMessage());
-                }*/
+                    if (drawAvatarDesign != null) {
+                        if (drawAvatarDesign.isSelected()) {
+                            mgui.drawAvatarSpecification(mgui.gtm.getAvatarSpecification());
+                        }
+                    }
 
-                mgui.modelBacktracingProVerif(pvoa);
+                    mode = NOT_STARTED;
 
-                if (drawAvatarDesign != null) {
-                    if (drawAvatarDesign.isSelected()) {
-                        mgui.drawAvatarSpecification(mgui.gtm.getAvatarSpecification());
-                    }
                 }
-
+            } catch (LauncherException | ProVerifVerificationException le) {
+                JLabel label = new JLabel("Error: " + le.getMessage());
+                label.setAlignmentX(Component.LEFT_ALIGNMENT);
+                this.jta.add(label, this.createGbc(0));
+                mode = STOPPED;
+            } catch (InterruptedException ie) {
                 mode = NOT_STARTED;
-
+            } catch (FileException e) {
+                System.err.println(e.getMessage() + " : Can't generate proverif file.");
+            } catch (Exception e) {
+                mode = STOPPED;
+                TraceManager.addDev("General exception in ProVerif proof or trace generation: " + e.getMessage());
+                //throw e;
             }
-        } catch (LauncherException | ProVerifVerificationException le) {
-            this.jta.removeAll();
-            labelError = new JLabel("Error: " + le.getMessage());
-            labelError.setAlignmentX(Component.LEFT_ALIGNMENT);
-            this.jta.add(labelError, this.createGbc(0));
-            mode = NOT_STARTED;
-        } catch (InterruptedException ie) {
-            TraceManager.addDev("Proverif thread interrupted: " + ie.getMessage());
-            mode = NOT_STARTED;
-        } catch (FileException e) {
-            TraceManager.addDev("Proverif file couldnot be generated: " + e.getMessage());
-            System.err.println(e.getMessage() + " : Can't generate proverif file.");
-        } catch (Exception e) {
-            mode = STOPPED;
-            TraceManager.addDev("General exception in ProVerif proof or trace generation: " + e.getMessage());
-            //throw e;
         }
-
-
         setButtons();
-
     }
 
     protected void setButtons() {
diff --git a/ttool/src/test/java/cli/CLIPatternHandlingTest.java b/ttool/src/test/java/cli/CLIPatternHandlingTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..5ee0b0ad13cb3b62dab5ea7939ff6267e43221e1
--- /dev/null
+++ b/ttool/src/test/java/cli/CLIPatternHandlingTest.java
@@ -0,0 +1,249 @@
+/**Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
+ *
+ * ludovic.apvrille AT enst.fr
+ *
+ * This software is a computer program whose purpose is to allow the
+ * edition of TURTLE analysis, design and deployment diagrams, to
+ * allow the generation of RT-LOTOS or Java code from this diagram,
+ * and at last to allow the analysis of formal validation traces
+ * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
+ * from INRIA Rhone-Alpes.
+ *
+ * This software is governed by the CeCILL  license under French law and
+ * abiding by the rules of distribution of free software.  You can  use,
+ * modify and/ or redistribute the software under the terms of the CeCILL
+ * license as circulated by CEA, CNRS and INRIA at the following URL
+ * "http://www.cecill.info".
+ *
+ * As a counterpart to the access to the source code and  rights to copy,
+ * modify and redistribute granted by the license, users are provided only
+ * with a limited warranty  and the software's author,  the holder of the
+ * economic rights,  and the successive licensors  have only  limited
+ * liability.
+ *
+ * In this respect, the user's attention is drawn to the risks associated
+ * with loading,  using,  modifying and/or developing or reproducing the
+ * software by the user in light of its specific status of free software,
+ * that may mean  that it is complicated to manipulate,  and  that  also
+ * therefore means  that it is reserved for developers  and  experienced
+ * professionals having in-depth computer knowledge. Users are therefore
+ * encouraged to load and test the software's suitability as regards their
+ * requirements in conditions enabling the security of their systems and/or
+ * data to be ensured and,  more generally, to use and operate it in the
+ * same conditions as regards security.
+ *
+ * The fact that you are presently reading this means that you have had
+ * knowledge of the CeCILL license and that you accept its terms.
+ *
+ * /**
+ * Class CLIPatternHandlingTest
+ * Creation: 13/11/2023
+ * @version 1.0 13/11/2023
+ * @author Jawher JERRAY
+ * @see
+ */
+
+package cli;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import common.ConfigurationTTool;
+import common.SpecConfigTTool;
+import graph.AUTGraph;
+import graph.AUTTransition;
+import myutil.Conversion;
+import myutil.TraceManager;
+import org.junit.Test;
+import test.AbstractTest;
+import tmltranslator.compareTMLTest.CompareTML;
+import tmltranslator.compareTMLTest.CompareTMAP;
+import tmltranslator.TMLMapping;
+import tmltranslator.TMLMappingTextSpecification;
+import tmltranslator.TMLSyntaxChecking;
+import tmltranslator.TMLError;
+import cli.PatternHandling;
+
+
+public class CLIPatternHandlingTest extends AbstractTest implements InterpreterOutputInterface {
+
+    private final static String PATH_TO_TEST_FILE = "cli/testPatternHandling/";
+    private static final String PATH_PATTERNS [] = {PATH_TO_TEST_FILE + "tmr/"};
+    private static final String PATH_CLI_TO_CREATE_PATTERNS [] = {"cli/create-tmr"};
+
+    private static final String PATH_CLI_TO_CONFIGURATE_TMR_IN_MODELS [] = {"cli/configurate-tmr-for-modelWithOneSensor", "cli/configurate-tmr-for-modelWithThreeSensors"};
+    private static final String PATH_CLI_TO_APPLY_TMR_IN_MODELS [] = {"cli/apply-tmr-in-modelWithOneSensor", "cli/apply-tmr-in-modelWithThreeSensors"};
+    private static final String EXPECTED_MODELS_AFTER_INTEGRATING_TMR_TMAP [] = {"expected/modelWithOneSensorIntegTMR.tmap", "expected/modelWithThreeSensorsIntegTMR.tmap"};
+    private static final String EXPECTED_MODELS_AFTER_INTEGRATING_TMR_TARCHI [] = {"expected/modelWithOneSensorIntegTMR.tarchi", "expected/modelWithThreeSensorsIntegTMR.tarchi"};
+    private static final String EXPECTED_MODELS_AFTER_INTEGRATING_TMR_TML [] = {"expected/modelWithOneSensorIntegTMR.tml", "expected/modelWithThreeSensorsIntegTMR.tml"};
+
+    private static final String OBTAINED_MODELS_PATH = "resources/test/cli/testPatternHandling/tmr/";
+    private static final String OBTAINED_MODELS_AFTER_INTEGRATING_TMR_TMAP [] = {"modelsAfterIntegratingTMR/modelWithOneSensorIntegTMR.tmap", "modelsAfterIntegratingTMR/modelWithThreeSensorsIntegTMR.tmap"};
+    private static final String OBTAINED_MODELS_AFTER_INTEGRATING_TMR_TARCHI [] = {"modelsAfterIntegratingTMR/modelWithOneSensorIntegTMR.tarchi", "modelsAfterIntegratingTMR/modelWithThreeSensorsIntegTMR.tarchi"};
+    private static final String OBTAINED_MODELS_AFTER_INTEGRATING_TMR_TML [] = {"modelsAfterIntegratingTMR/modelWithOneSensorIntegTMR.tml", "modelsAfterIntegratingTMR/modelWithThreeSensorsIntegTMR.tml"};
+    
+    private static final String PATH_CLI_CONFIGURATION_WITH_ERRORS_TMR_IN_MODELS [] = {"cli/incomplete-configuration-tmr-for-modelWithOneSensor"};
+
+    private StringBuilder outputResult;
+    private List<String> errorOutputs = new ArrayList<String>();
+    
+	
+	public CLIPatternHandlingTest() {
+	    //
+    }
+	
+    public void exit(int reason) {
+	    TraceManager.addDev("Exit reason=" + reason);
+	    assertTrue(reason == 0);
+    }
+
+    public void printError(String error) {
+        TraceManager.addDev("Error=" + error);
+        errorOutputs.add(error);
+    }
+
+    public void print(String s) {
+	    TraceManager.addDev("info from interpreter:" + s);
+	    outputResult.append(s);
+    }
+	
+	@Test
+    public void testIntegratingTMR() throws Exception {
+        String filePathCreateTMR = getBaseResourcesDir() + PATH_PATTERNS[0] +  PATH_CLI_TO_CREATE_PATTERNS[0];
+        String script;
+        outputResult = new StringBuilder();
+
+        File f = new File(filePathCreateTMR);
+        assertTrue(myutil.FileUtils.checkFileForOpen(f));
+
+        script = myutil.FileUtils.loadFileData(f);
+
+        assertTrue(script.length() > 0);
+
+        boolean show = false;
+        Interpreter interpret = new Interpreter(script, (InterpreterOutputInterface)this, show);
+        interpret.interpret();
+
+        for (int i = 0; i < PATH_CLI_TO_CONFIGURATE_TMR_IN_MODELS.length; i++) {
+            String filePathConfigModel = getBaseResourcesDir() + PATH_PATTERNS[0] +  PATH_CLI_TO_CONFIGURATE_TMR_IN_MODELS[i];
+            String scriptConfig;
+            outputResult = new StringBuilder();
+            File fConfig = new File(filePathConfigModel);
+            assertTrue(myutil.FileUtils.checkFileForOpen(fConfig));
+            scriptConfig = myutil.FileUtils.loadFileData(fConfig);
+            assertTrue(scriptConfig.length() > 0);
+            Interpreter interpretConfigModel = new Interpreter(scriptConfig, (InterpreterOutputInterface)this, false);
+            interpretConfigModel.interpret();
+
+            String filePathApplyToModel = getBaseResourcesDir() + PATH_PATTERNS[0] +  PATH_CLI_TO_APPLY_TMR_IN_MODELS[i];
+            String scriptApplyToModel;
+            outputResult = new StringBuilder();
+            File fApplyToModel = new File(filePathApplyToModel);
+            assertTrue(myutil.FileUtils.checkFileForOpen(fApplyToModel));
+            scriptApplyToModel = myutil.FileUtils.loadFileData(fApplyToModel);
+            assertTrue(scriptApplyToModel.length() > 0);
+            Interpreter interpretApplyToModel = new Interpreter(scriptApplyToModel, (InterpreterOutputInterface)this, false);
+            interpretApplyToModel.interpret();
+           
+            String filePathObtainedTmap = OBTAINED_MODELS_PATH + OBTAINED_MODELS_AFTER_INTEGRATING_TMR_TMAP[i];
+            String folderPathObtainedTmap = filePathObtainedTmap.substring(0, filePathObtainedTmap.lastIndexOf("/")+1);
+            String fileName = filePathObtainedTmap.split("/")[filePathObtainedTmap.split("/").length -1];
+            String modelName = fileName.split("\\.")[0];
+            File fObtainedTmap = new File(filePathObtainedTmap);
+            assertTrue(myutil.FileUtils.checkFileForOpen(fObtainedTmap));
+
+            TMLMappingTextSpecification tmts = new TMLMappingTextSpecification(modelName);
+            TraceManager.addDev("Loading file: " + fObtainedTmap.getAbsolutePath());
+            String obtainedOutputTmap = null;
+            try {
+                obtainedOutputTmap = myutil.FileUtils.loadFileData(fObtainedTmap);
+            } catch (Exception e) {
+                TraceManager.addDev("Exception executing: loading " + modelName);
+                assertTrue(false);
+            }
+            TraceManager.addDev("Testing spec " + modelName);
+            assertTrue(obtainedOutputTmap != null);
+            TraceManager.addDev("Going to parse " + modelName);
+            boolean parsed = tmts.makeTMLMapping(obtainedOutputTmap, folderPathObtainedTmap);
+            assertTrue(parsed);
+
+            TraceManager.addDev("Checking syntax " + modelName);
+            // Checking syntax
+            TMLMapping tmap = tmts.getTMLMapping();
+
+            TMLSyntaxChecking syntax = new TMLSyntaxChecking(tmap);
+            syntax.checkSyntax();
+
+            if (syntax.hasErrors() > 0) {
+                for (TMLError error: syntax.getErrors()) {
+                    TraceManager.addDev("Error: " + error.toString());
+                }
+
+            }
+            assertTrue(syntax.hasErrors() == 0);
+
+
+            String filePathExpectedTmap = getBaseResourcesDir() + PATH_PATTERNS[0] + EXPECTED_MODELS_AFTER_INTEGRATING_TMR_TMAP[i];
+            File fExpectedTmap = new File(filePathExpectedTmap);
+            assertTrue(myutil.FileUtils.checkFileForOpen(fExpectedTmap));
+            String expectedOutputTmap = myutil.FileUtils.loadFileData(fExpectedTmap);
+            //TraceManager.addDev("\nExpected:>" + expectedOutputTmap + "<");
+            //TraceManager.addDev("\nObtained:>" + obtainedOutputTmap + "<");
+            CompareTMAP ctmap = new CompareTMAP();
+            assertTrue("comparing between 2 TMAP files", ctmap.CompareTMAPFiles(fObtainedTmap, fExpectedTmap));
+            
+
+            String filePathObtainedTarchi = OBTAINED_MODELS_PATH + OBTAINED_MODELS_AFTER_INTEGRATING_TMR_TARCHI[i];
+            File fObtainedTarchi = new File(filePathObtainedTarchi);
+            assertTrue(myutil.FileUtils.checkFileForOpen(fObtainedTarchi));
+            String obtainedOutputTarchi = myutil.FileUtils.loadFileData(fObtainedTarchi);
+            String filePathExpectedTarchi = getBaseResourcesDir() + PATH_PATTERNS[0] + EXPECTED_MODELS_AFTER_INTEGRATING_TMR_TARCHI[i];
+            File fExpectedTarchi = new File(filePathExpectedTarchi);
+            assertTrue(myutil.FileUtils.checkFileForOpen(fExpectedTarchi));
+            String expectedOutputTarchi = myutil.FileUtils.loadFileData(fExpectedTarchi);
+            CompareTMAP ctarchi = new CompareTMAP();
+            assertTrue("comparing between 2 Tarchi files", ctarchi.CompareTMAPFiles(fObtainedTarchi, fExpectedTarchi));
+            //TraceManager.addDev("\nExpected Tarchi:>" + expectedOutputTarchi + "<");
+            //TraceManager.addDev("\nObtained Tarchi:>" + obtainedOutputTarchi + "<");
+
+            String filePathObtainedTML = OBTAINED_MODELS_PATH + OBTAINED_MODELS_AFTER_INTEGRATING_TMR_TML[i];
+            File fObtainedTML = new File(filePathObtainedTML);
+            assertTrue(myutil.FileUtils.checkFileForOpen(fObtainedTML));
+            String obtainedOutputTML = myutil.FileUtils.loadFileData(fObtainedTML);
+            String filePathExpectedTML = getBaseResourcesDir() + PATH_PATTERNS[0] + EXPECTED_MODELS_AFTER_INTEGRATING_TMR_TML[i];
+            File fExpectedTML = new File(filePathExpectedTML);
+            assertTrue(myutil.FileUtils.checkFileForOpen(fExpectedTML));
+            String expectedOutputTML = myutil.FileUtils.loadFileData(fExpectedTML);
+            CompareTML ctml = new CompareTML();
+            assertTrue("comparing between 2 TML files", ctml.compareTML(fObtainedTML, fExpectedTML));
+            //TraceManager.addDev("\nExpected TML:>" + expectedOutputTML + "<");
+            //TraceManager.addDev("\nObtained TML:>" + obtainedOutputTML + "<");
+        }
+
+        for (int i = 0; i < PATH_CLI_CONFIGURATION_WITH_ERRORS_TMR_IN_MODELS.length; i++) {
+            String filePathConfigModel = getBaseResourcesDir() + PATH_PATTERNS[0] +  PATH_CLI_CONFIGURATION_WITH_ERRORS_TMR_IN_MODELS[i];
+            String scriptConfig;
+            outputResult = new StringBuilder();
+            File fConfig = new File(filePathConfigModel);
+            assertTrue(myutil.FileUtils.checkFileForOpen(fConfig));
+            scriptConfig = myutil.FileUtils.loadFileData(fConfig);
+            assertTrue(scriptConfig.length() > 0);
+            Interpreter interpretConfigModel = new Interpreter(scriptConfig, (InterpreterOutputInterface)this, false);
+            String interp = interpretConfigModel.interpretUntilError();
+            assertTrue("expected error: ", interp.equals(PatternHandling.PATTERN_NOT_CONNECTED));
+            
+            //TraceManager.addDev("\noutputResult:>" + outputResult);
+            //assertTrue("comparing between 2 TML files", outputResult.equals(PatternHandling.PATTERN_NOT_CONNECTED));
+            
+
+        }
+        
+    }
+}
diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/cli/apply-tmr-in-modelWithOneSensor b/ttool/src/test/resources/cli/testPatternHandling/tmr/cli/apply-tmr-in-modelWithOneSensor
new file mode 100644
index 0000000000000000000000000000000000000000..0cb6a393e473d08fb2c2435d3db4529e29b58c69
--- /dev/null
+++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/cli/apply-tmr-in-modelWithOneSensor
@@ -0,0 +1,4 @@
+pa dltmap ../src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithOneSensor.tmap
+pa a -p resources/test/cli/testPatternHandling/tmr/
+pa a -pc resources/test/cli/testPatternHandling/tmr/modelWithOneSensor-config.json
+pa a -g resources/test/cli/testPatternHandling/tmr/modelsAfterIntegratingTMR/ modelWithOneSensorIntegTMR
diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/cli/apply-tmr-in-modelWithThreeSensors b/ttool/src/test/resources/cli/testPatternHandling/tmr/cli/apply-tmr-in-modelWithThreeSensors
new file mode 100644
index 0000000000000000000000000000000000000000..5af221b880609dd97adb2bf5a1728a0785ed4dc8
--- /dev/null
+++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/cli/apply-tmr-in-modelWithThreeSensors
@@ -0,0 +1,4 @@
+pa dltmap ../src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithThreeSensors.tmap
+pa a -p resources/test/cli/testPatternHandling/tmr/
+pa a -pc resources/test/cli/testPatternHandling/tmr/modelWithThreeSensors-config.json
+pa a -g resources/test/cli/testPatternHandling/tmr/modelsAfterIntegratingTMR/ modelWithThreeSensorsIntegTMR
diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/cli/configurate-tmr-for-modelWithOneSensor b/ttool/src/test/resources/cli/testPatternHandling/tmr/cli/configurate-tmr-for-modelWithOneSensor
new file mode 100644
index 0000000000000000000000000000000000000000..3f0a43c53589feb2918972880e2c76ca3707b439
--- /dev/null
+++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/cli/configurate-tmr-for-modelWithOneSensor
@@ -0,0 +1,29 @@
+pa dltmap ../src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithOneSensor.tmap
+pa sc -p resources/test/cli/testPatternHandling/tmr/
+pa sc -sp
+pa sc -ct SensorClone Sensor
+pa sc -ct SensorClone2 Sensor
+pa sc -ctl
+pa sc -ctr SensorClone
+pa sc -ct SensorClone1 Sensor
+pa sc -plnc
+pa sc -pl InterpreterC.dataC
+pa sc -co InterpreterA.dataA Sensor.sensorData
+pa sc -co InterpreterB.dataB SensorClone1.sensorData 
+pa sc -co InterpreterC.dataC SensorClone2.sensorData
+pa sc -co Voter.resultData Receiver.sensorData
+pa sc -cor InterpreterA.dataA
+pa sc -co InterpreterA.dataA Sensor.sensorData
+pa sc -co Voter.moveto_FAIL_SAFE Receiver.sensorData NEW
+pa sc -col
+pa sc -cptl
+pa sc -cpd ALL
+pa sc -tctl
+pa sc -tcn SensorClone1 BusEnvironment
+pa sc -tcm SensorClone2 SensorClone1
+pa sc -tcn Voter MainBus
+pa sc -mcn SensorClone1.sensorData BusReceiver
+pa sc -mcm InterpreterA.resA SensorClone1.sensorData
+pa sc -mctl
+pa sc -ua Timer dataReceivingTimeout 1000
+pa sc -m resources/test/cli/testPatternHandling/tmr/modelWithOneSensor-config.json
diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/cli/configurate-tmr-for-modelWithThreeSensors b/ttool/src/test/resources/cli/testPatternHandling/tmr/cli/configurate-tmr-for-modelWithThreeSensors
new file mode 100644
index 0000000000000000000000000000000000000000..dec9cdaa649379bd400d177816113939f24ee78e
--- /dev/null
+++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/cli/configurate-tmr-for-modelWithThreeSensors
@@ -0,0 +1,16 @@
+pa dltmap ../src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithThreeSensors.tmap
+pa sc -p resources/test/cli/testPatternHandling/tmr/
+pa sc -sp
+pa sc -ctl
+pa sc -plnc
+pa sc -pl InterpreterC.dataC
+pa sc -co InterpreterA.dataA Sensor1.sensorData1
+pa sc -co InterpreterB.dataB Sensor2.sensorData2
+pa sc -co InterpreterC.dataC Sensor3.sensorData3
+pa sc -co Voter.resultData Receiver.sensorData1
+pa sc -co Voter.moveto_FAIL_SAFE Receiver.sensorData1 NEW
+pa sc -cpd ALL
+pa sc -tcn InterpreterB MainBus
+pa sc -tcm InterpreterA InterpreterB
+pa sc -ua Timer dataReceivingTimeout 500
+pa sc -m resources/test/cli/testPatternHandling/tmr/modelWithThreeSensors-config.json
diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/cli/create-tmr b/ttool/src/test/resources/cli/testPatternHandling/tmr/cli/create-tmr
new file mode 100644
index 0000000000000000000000000000000000000000..2e16045700f0046a4f188984ee51df856d99cad3
--- /dev/null
+++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/cli/create-tmr
@@ -0,0 +1,9 @@
+pa dltmap ../src/test/resources/cli/testPatternHandling/tmr/input/tmrPattern.tmap
+pa c -n tmr
+pa c -p resources/test/cli/testPatternHandling/
+pa c -t
+pa c -a Voter Timer InterpreterA InterpreterB
+pa c -r Timer
+pa c -a InterpreterC Timer
+pa c -l
+pa c -m
\ No newline at end of file
diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithOneSensorIntegTMR.tarchi b/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithOneSensorIntegTMR.tarchi
new file mode 100644
index 0000000000000000000000000000000000000000..17c6c9238731581ff169df68dbb33cc8e7028154
--- /dev/null
+++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithOneSensorIntegTMR.tarchi
@@ -0,0 +1,220 @@
+// Master clock frequency - in MHz
+MASTERCLOCKFREQUENCY 200
+
+NODE BRIDGE BridgeEnvironmentPrivate
+SET BridgeEnvironmentPrivate bufferByteSize 4
+SET BridgeEnvironmentPrivate clockDivider 1
+
+NODE BRIDGE BridgeReceiverPrivate
+SET BridgeReceiverPrivate bufferByteSize 4
+SET BridgeReceiverPrivate clockDivider 1
+
+NODE BUS BusEnvironmentPrivate
+SET BusEnvironmentPrivate byteDataSize 4
+SET BusEnvironmentPrivate pipelineSize 1
+SET BusEnvironmentPrivate arbitration 0
+SET BusEnvironmentPrivate sliceTime 10000
+SET BusEnvironmentPrivate burstSize 100
+SET BusEnvironmentPrivate privacy private
+SET BusEnvironmentPrivate clockDivider 1
+
+NODE BUS BusReceiverPrivate
+SET BusReceiverPrivate byteDataSize 4
+SET BusReceiverPrivate pipelineSize 1
+SET BusReceiverPrivate arbitration 0
+SET BusReceiverPrivate sliceTime 10000
+SET BusReceiverPrivate burstSize 100
+SET BusReceiverPrivate privacy private
+SET BusReceiverPrivate clockDivider 1
+
+NODE MEMORY MemoryEnvironmentPrivate
+SET MemoryEnvironmentPrivate byteDataSize 4
+SET MemoryEnvironmentPrivate clockDivider 1
+
+NODE MEMORY MemoryReceiverPrivate
+SET MemoryReceiverPrivate byteDataSize 4
+SET MemoryReceiverPrivate clockDivider 1
+
+NODE MEMORY MemoryReceiver
+SET MemoryReceiver byteDataSize 4
+SET MemoryReceiver clockDivider 1
+
+NODE MEMORY MemoryEnvironment
+SET MemoryEnvironment byteDataSize 4
+SET MemoryEnvironment clockDivider 1
+
+NODE CPU CPUReceiver
+SET CPUReceiver nbOfCores 1
+SET CPUReceiver byteDataSize 4
+SET CPUReceiver pipelineSize 5
+SET CPUReceiver goIdleTime 10
+SET CPUReceiver maxConsecutiveIdleCycles 10
+SET CPUReceiver taskSwitchingTime 20
+SET CPUReceiver branchingPredictionPenalty 2
+SET CPUReceiver cacheMiss 5
+SET CPUReceiver schedulingPolicy 0
+SET CPUReceiver sliceTime 10000
+SET CPUReceiver execiTime 1
+SET CPUReceiver execcTime 1
+SET CPUReceiver clockDivider 1
+
+NODE CPU CPUEnvironment
+SET CPUEnvironment nbOfCores 1
+SET CPUEnvironment byteDataSize 4
+SET CPUEnvironment pipelineSize 5
+SET CPUEnvironment goIdleTime 10
+SET CPUEnvironment maxConsecutiveIdleCycles 10
+SET CPUEnvironment taskSwitchingTime 20
+SET CPUEnvironment branchingPredictionPenalty 2
+SET CPUEnvironment cacheMiss 5
+SET CPUEnvironment schedulingPolicy 0
+SET CPUEnvironment sliceTime 10000
+SET CPUEnvironment execiTime 1
+SET CPUEnvironment execcTime 1
+SET CPUEnvironment clockDivider 1
+
+NODE BUS BusReceiver
+SET BusReceiver byteDataSize 4
+SET BusReceiver pipelineSize 1
+SET BusReceiver arbitration 0
+SET BusReceiver sliceTime 10000
+SET BusReceiver burstSize 100
+SET BusReceiver privacy public
+SET BusReceiver clockDivider 1
+
+NODE BUS BusEnvironment
+SET BusEnvironment byteDataSize 4
+SET BusEnvironment pipelineSize 1
+SET BusEnvironment arbitration 0
+SET BusEnvironment sliceTime 10000
+SET BusEnvironment burstSize 100
+SET BusEnvironment privacy public
+SET BusEnvironment clockDivider 1
+
+NODE BRIDGE BridgeReceiver
+SET BridgeReceiver bufferByteSize 4
+SET BridgeReceiver clockDivider 1
+
+NODE BRIDGE BridgeEnvironment
+SET BridgeEnvironment bufferByteSize 4
+SET BridgeEnvironment clockDivider 1
+
+NODE BUS MainBus
+SET MainBus byteDataSize 4
+SET MainBus pipelineSize 1
+SET MainBus arbitration 0
+SET MainBus sliceTime 10000
+SET MainBus burstSize 100
+SET MainBus privacy public
+SET MainBus clockDivider 1
+
+NODE CPU CPU_SensorClone1
+SET CPU_SensorClone1 nbOfCores 1
+SET CPU_SensorClone1 byteDataSize 4
+SET CPU_SensorClone1 pipelineSize 5
+SET CPU_SensorClone1 goIdleTime 10
+SET CPU_SensorClone1 maxConsecutiveIdleCycles 10
+SET CPU_SensorClone1 taskSwitchingTime 20
+SET CPU_SensorClone1 branchingPredictionPenalty 2
+SET CPU_SensorClone1 cacheMiss 5
+SET CPU_SensorClone1 schedulingPolicy 0
+SET CPU_SensorClone1 sliceTime 10000
+SET CPU_SensorClone1 execiTime 1
+SET CPU_SensorClone1 execcTime 1
+SET CPU_SensorClone1 clockDivider 1
+
+NODE CPU CPU_Voter
+SET CPU_Voter nbOfCores 1
+SET CPU_Voter byteDataSize 4
+SET CPU_Voter pipelineSize 5
+SET CPU_Voter goIdleTime 10
+SET CPU_Voter maxConsecutiveIdleCycles 10
+SET CPU_Voter taskSwitchingTime 20
+SET CPU_Voter branchingPredictionPenalty 2
+SET CPU_Voter cacheMiss 5
+SET CPU_Voter schedulingPolicy 0
+SET CPU_Voter sliceTime 10000
+SET CPU_Voter execiTime 1
+SET CPU_Voter execcTime 1
+SET CPU_Voter clockDivider 1
+
+NODE MEMORY Memory_sensorData
+SET Memory_sensorData byteDataSize 4
+SET Memory_sensorData clockDivider 1
+
+NODE MEMORY MemoryC
+SET MemoryC byteDataSize 4
+SET MemoryC clockDivider 1
+
+NODE LINK link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate
+SET link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate node MemoryEnvironmentPrivate
+SET link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate bus BusEnvironmentPrivate
+SET link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate priority 0
+NODE LINK link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate
+SET link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate node BridgeEnvironmentPrivate
+SET link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate bus BusEnvironmentPrivate
+SET link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate priority 0
+NODE LINK link_BridgeEnvironmentPrivate_to_BusEnvironment
+SET link_BridgeEnvironmentPrivate_to_BusEnvironment node BridgeEnvironmentPrivate
+SET link_BridgeEnvironmentPrivate_to_BusEnvironment bus BusEnvironment
+SET link_BridgeEnvironmentPrivate_to_BusEnvironment priority 0
+NODE LINK link_MemoryReceiverPrivate_to_BusReceiverPrivate
+SET link_MemoryReceiverPrivate_to_BusReceiverPrivate node MemoryReceiverPrivate
+SET link_MemoryReceiverPrivate_to_BusReceiverPrivate bus BusReceiverPrivate
+SET link_MemoryReceiverPrivate_to_BusReceiverPrivate priority 0
+NODE LINK link_BridgeReceiverPrivate_to_BusReceiverPrivate
+SET link_BridgeReceiverPrivate_to_BusReceiverPrivate node BridgeReceiverPrivate
+SET link_BridgeReceiverPrivate_to_BusReceiverPrivate bus BusReceiverPrivate
+SET link_BridgeReceiverPrivate_to_BusReceiverPrivate priority 0
+NODE LINK link_BridgeReceiverPrivate_to_BusReceiver
+SET link_BridgeReceiverPrivate_to_BusReceiver node BridgeReceiverPrivate
+SET link_BridgeReceiverPrivate_to_BusReceiver bus BusReceiver
+SET link_BridgeReceiverPrivate_to_BusReceiver priority 0
+NODE LINK link_CPUEnvironment_to_BusEnvironmentPrivate
+SET link_CPUEnvironment_to_BusEnvironmentPrivate node CPUEnvironment
+SET link_CPUEnvironment_to_BusEnvironmentPrivate bus BusEnvironmentPrivate
+SET link_CPUEnvironment_to_BusEnvironmentPrivate priority 0
+NODE LINK link_MemoryEnvironment_to_BusEnvironment
+SET link_MemoryEnvironment_to_BusEnvironment node MemoryEnvironment
+SET link_MemoryEnvironment_to_BusEnvironment bus BusEnvironment
+SET link_MemoryEnvironment_to_BusEnvironment priority 0
+NODE LINK link_BridgeEnvironment_to_BusEnvironment
+SET link_BridgeEnvironment_to_BusEnvironment node BridgeEnvironment
+SET link_BridgeEnvironment_to_BusEnvironment bus BusEnvironment
+SET link_BridgeEnvironment_to_BusEnvironment priority 0
+NODE LINK link_BridgeEnvironment_to_MainBus
+SET link_BridgeEnvironment_to_MainBus node BridgeEnvironment
+SET link_BridgeEnvironment_to_MainBus bus MainBus
+SET link_BridgeEnvironment_to_MainBus priority 0
+NODE LINK link_BridgeReceiver_to_BusReceiver
+SET link_BridgeReceiver_to_BusReceiver node BridgeReceiver
+SET link_BridgeReceiver_to_BusReceiver bus BusReceiver
+SET link_BridgeReceiver_to_BusReceiver priority 0
+NODE LINK link_BridgeReceiver_to_MainBus
+SET link_BridgeReceiver_to_MainBus node BridgeReceiver
+SET link_BridgeReceiver_to_MainBus bus MainBus
+SET link_BridgeReceiver_to_MainBus priority 0
+NODE LINK link_CPUReceiver_to_BusReceiverPrivate
+SET link_CPUReceiver_to_BusReceiverPrivate node CPUReceiver
+SET link_CPUReceiver_to_BusReceiverPrivate bus BusReceiverPrivate
+SET link_CPUReceiver_to_BusReceiverPrivate priority 0
+NODE LINK link_MemoryReceiver_to_BusReceiver
+SET link_MemoryReceiver_to_BusReceiver node MemoryReceiver
+SET link_MemoryReceiver_to_BusReceiver bus BusReceiver
+SET link_MemoryReceiver_to_BusReceiver priority 0
+NODE LINK link_CPU_SensorClone1_to_BusEnvironment
+SET link_CPU_SensorClone1_to_BusEnvironment node CPU_SensorClone1
+SET link_CPU_SensorClone1_to_BusEnvironment bus BusEnvironment
+SET link_CPU_SensorClone1_to_BusEnvironment priority 0
+NODE LINK link_CPU_Voter_to_MainBus
+SET link_CPU_Voter_to_MainBus node CPU_Voter
+SET link_CPU_Voter_to_MainBus bus MainBus
+SET link_CPU_Voter_to_MainBus priority 0
+NODE LINK link_Memory_sensorData_to_BusReceiver
+SET link_Memory_sensorData_to_BusReceiver node Memory_sensorData
+SET link_Memory_sensorData_to_BusReceiver bus BusReceiver
+SET link_Memory_sensorData_to_BusReceiver priority 0
+NODE LINK link_MemoryC_to_MainBus
+SET link_MemoryC_to_MainBus node MemoryC
+SET link_MemoryC_to_MainBus bus MainBus
+SET link_MemoryC_to_MainBus priority 0
diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithOneSensorIntegTMR.tmap b/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithOneSensorIntegTMR.tmap
new file mode 100644
index 0000000000000000000000000000000000000000..51003f7426edc8f3291915e4a17a8e6bd796295b
--- /dev/null
+++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithOneSensorIntegTMR.tmap
@@ -0,0 +1,98 @@
+TMLSPEC
+    #include "modelWithOneSensorIntegTMR.tml"
+ENDTMLSPEC
+
+TMLARCHI
+    #include "modelWithOneSensorIntegTMR.tarchi"
+ENDTMLARCHI
+
+TMLMAPPING
+    MAP CPUReceiver ModelOneSensor__Receiver
+    SET ModelOneSensor__Receiver priority 0
+    MAP CPUEnvironment ModelOneSensor__Sensor
+    SET ModelOneSensor__Sensor priority 0
+    MAP CPU_SensorClone1 ModelOneSensor__SensorClone1
+    SET ModelOneSensor__SensorClone1 priority 0
+    MAP CPU_SensorClone1 ModelOneSensor__SensorClone2
+    SET ModelOneSensor__SensorClone2 priority 0
+    MAP CPU_Voter ModelOneSensor__Voter
+    SET ModelOneSensor__Voter priority 0
+    MAP CPU_Voter ModelOneSensor__InterpreterA
+    SET ModelOneSensor__InterpreterA priority 0
+    MAP CPU_Voter ModelOneSensor__InterpreterC
+    SET ModelOneSensor__InterpreterC priority 0
+    MAP CPU_Voter ModelOneSensor__InterpreterB
+    SET ModelOneSensor__InterpreterB priority 0
+    MAP CPU_Voter ModelOneSensor__Timer
+    SET ModelOneSensor__Timer priority 0
+    MAP MemoryEnvironment ModelOneSensor__sensorData
+    SET ModelOneSensor__sensorData priority 0
+    MAP BusEnvironment ModelOneSensor__sensorData
+    SET ModelOneSensor__sensorData priority 0
+    MAP MainBus ModelOneSensor__sensorData
+    SET ModelOneSensor__sensorData priority 0
+    MAP BusReceiver ModelOneSensor__sensorData
+    SET ModelOneSensor__sensorData priority 0
+    MAP BusReceiverPrivate ModelOneSensor__sensorData
+    SET ModelOneSensor__sensorData priority 0
+    MAP BusEnvironmentPrivate ModelOneSensor__sensorData
+    SET ModelOneSensor__sensorData priority 0
+    MAP Memory_sensorData ModelOneSensor__sensorData1
+    SET ModelOneSensor__sensorData1 priority 0
+    MAP BusReceiver ModelOneSensor__sensorData1
+    SET ModelOneSensor__sensorData1 priority 0
+    MAP Memory_sensorData ModelOneSensor__resA
+    SET ModelOneSensor__resA priority 0
+    MAP BusReceiver ModelOneSensor__resA
+    SET ModelOneSensor__resA priority 0
+    MAP BusEnvironment ModelOneSensor__sensorData0
+    SET ModelOneSensor__sensorData0 priority 0
+    MAP MainBus ModelOneSensor__sensorData0
+    SET ModelOneSensor__sensorData0 priority 0
+    MAP BusReceiver ModelOneSensor__sensorData0
+    SET ModelOneSensor__sensorData0 priority 0
+    MAP BusReceiverPrivate ModelOneSensor__sensorData0
+    SET ModelOneSensor__sensorData0 priority 0
+    MAP BusEnvironmentPrivate ModelOneSensor__sensorData0
+    SET ModelOneSensor__sensorData0 priority 0
+    MAP MemoryC ModelOneSensor__sensorData0
+    SET ModelOneSensor__sensorData0 priority 0
+    MAP MainBus ModelOneSensor__sensorData0
+    SET ModelOneSensor__sensorData0 priority 0
+    MAP Memory_sensorData ModelOneSensor__resultData
+    SET ModelOneSensor__resultData priority 0
+    MAP BusReceiver ModelOneSensor__resultData
+    SET ModelOneSensor__resultData priority 0
+    MAP BusEnvironment ModelOneSensor__resultData
+    SET ModelOneSensor__resultData priority 0
+    MAP MainBus ModelOneSensor__resultData
+    SET ModelOneSensor__resultData priority 0
+    MAP BusReceiverPrivate ModelOneSensor__resultData
+    SET ModelOneSensor__resultData priority 0
+    MAP BusEnvironmentPrivate ModelOneSensor__resultData
+    SET ModelOneSensor__resultData priority 0
+    MAP Memory_sensorData ModelOneSensor__resC
+    SET ModelOneSensor__resC priority 0
+    MAP BusReceiver ModelOneSensor__resC
+    SET ModelOneSensor__resC priority 0
+    MAP BusEnvironment ModelOneSensor__resC
+    SET ModelOneSensor__resC priority 0
+    MAP MainBus ModelOneSensor__resC
+    SET ModelOneSensor__resC priority 0
+    MAP BusReceiverPrivate ModelOneSensor__resC
+    SET ModelOneSensor__resC priority 0
+    MAP BusEnvironmentPrivate ModelOneSensor__resC
+    SET ModelOneSensor__resC priority 0
+    MAP Memory_sensorData ModelOneSensor__resB
+    SET ModelOneSensor__resB priority 0
+    MAP BusReceiver ModelOneSensor__resB
+    SET ModelOneSensor__resB priority 0
+    MAP BusEnvironment ModelOneSensor__resB
+    SET ModelOneSensor__resB priority 0
+    MAP MainBus ModelOneSensor__resB
+    SET ModelOneSensor__resB priority 0
+    MAP BusReceiverPrivate ModelOneSensor__resB
+    SET ModelOneSensor__resB priority 0
+    MAP BusEnvironmentPrivate ModelOneSensor__resB
+    SET ModelOneSensor__resB priority 0
+ENDTMLMAPPING
diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithOneSensorIntegTMR.tml b/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithOneSensorIntegTMR.tml
new file mode 100644
index 0000000000000000000000000000000000000000..c77ae19649a57ce69ab6f12d7ad76967f0710ef6
--- /dev/null
+++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithOneSensorIntegTMR.tml
@@ -0,0 +1,194 @@
+// TML Application - FORMAT 0.2
+// Application: tmr
+// Generated: Mon Nov 13 12:49:10 CET 2023
+
+// PRAGMAS
+
+// Channels
+CHANNEL ModelOneSensor__resA BRBW 8 8 OUT ModelOneSensor__InterpreterA IN ModelOneSensor__Voter
+VCCHANNEL ModelOneSensor__resA 0
+CONFCHANNEL ModelOneSensor__resA
+AUTHCHANNEL ModelOneSensor__resA
+CHANNEL ModelOneSensor__resB BRBW 8 8 OUT ModelOneSensor__InterpreterB IN ModelOneSensor__Voter
+VCCHANNEL ModelOneSensor__resB 0
+CONFCHANNEL ModelOneSensor__resB
+AUTHCHANNEL ModelOneSensor__resB
+CHANNEL ModelOneSensor__resC BRBW 8 8 OUT ModelOneSensor__InterpreterC IN ModelOneSensor__Voter
+VCCHANNEL ModelOneSensor__resC 0
+CONFCHANNEL ModelOneSensor__resC
+AUTHCHANNEL ModelOneSensor__resC
+CHANNEL ModelOneSensor__resultData BRBW 8 8 OUT ModelOneSensor__Voter IN ModelOneSensor__Receiver
+VCCHANNEL ModelOneSensor__resultData 0
+CONFCHANNEL ModelOneSensor__resultData
+AUTHCHANNEL ModelOneSensor__resultData
+CHANNEL ModelOneSensor__sensorData BRNBW 4 OUT ModelOneSensor__Sensor IN ModelOneSensor__InterpreterA
+VCCHANNEL ModelOneSensor__sensorData 0
+CHANNEL ModelOneSensor__sensorData0 BRNBW 4 OUT ModelOneSensor__SensorClone2 IN ModelOneSensor__InterpreterC
+VCCHANNEL ModelOneSensor__sensorData0 0
+CHANNEL ModelOneSensor__sensorData1 BRNBW 4 OUT ModelOneSensor__SensorClone1 IN ModelOneSensor__InterpreterB
+VCCHANNEL ModelOneSensor__sensorData1 0
+
+// Events
+EVENT ModelOneSensor__evtA() NIB 8 ModelOneSensor__InterpreterA ModelOneSensor__Voter
+EVENT ModelOneSensor__evtB() NIB 8 ModelOneSensor__InterpreterB ModelOneSensor__Voter
+EVENT ModelOneSensor__evtC() NIB 8 ModelOneSensor__InterpreterC ModelOneSensor__Voter
+EVENT ModelOneSensor__evtTimeout() NIB 8 ModelOneSensor__Timer ModelOneSensor__Voter
+EVENT ModelOneSensor__moveto_FAIL_SAFE(bool) NIB 8 ModelOneSensor__Voter ModelOneSensor__Receiver
+
+// Requests
+
+TASK ModelOneSensor__InterpreterA
+    TASKOP
+    //Local variables
+    int size = 50
+    int sizeA = 10
+    
+    //Behavior
+    READ ModelOneSensor__sensorData size
+    EXECC size
+    NOTIFY ModelOneSensor__evtA
+    WRITE ModelOneSensor__resA sizeA
+ENDTASK
+
+TASK ModelOneSensor__InterpreterB
+    TASKOP
+    //Local variables
+    int size = 50
+    int sizeB = 10
+    
+    //Behavior
+    READ ModelOneSensor__sensorData1 size
+    EXECC size
+    NOTIFY ModelOneSensor__evtB
+    WRITE ModelOneSensor__resB sizeB
+ENDTASK
+
+TASK ModelOneSensor__InterpreterC
+    TASKOP
+    //Local variables
+    int size = 50
+    int sizeC = 10
+    
+    //Behavior
+    READ ModelOneSensor__sensorData0 size
+    EXECC size
+    NOTIFY ModelOneSensor__evtC
+    WRITE ModelOneSensor__resC sizeC
+ENDTASK
+
+TASK ModelOneSensor__Receiver
+    TASKOP
+    //Local variables
+    int executeSensor = 10
+    bool x = false
+    
+    //Behavior
+    FOR(; ; )
+        WAIT ModelOneSensor__moveto_FAIL_SAFE x
+        READ ModelOneSensor__resultData 1
+        EXECI executeSensor
+    ENDFOR
+ENDTASK
+
+TASK ModelOneSensor__Sensor
+    TASKOP
+    //Local variables
+    
+    //Behavior
+    FOR(; ; )
+        WRITE ModelOneSensor__sensorData 1
+        DELAY 10 ms isActiveDelay false
+    ENDFOR
+ENDTASK
+
+TASK ModelOneSensor__SensorClone1
+    TASKOP
+    //Local variables
+    
+    //Behavior
+    FOR(; ; )
+        WRITE ModelOneSensor__sensorData1 1
+        DELAY 10 ms isActiveDelay false
+    ENDFOR
+ENDTASK
+
+TASK ModelOneSensor__SensorClone2
+    TASKOP
+    //Local variables
+    
+    //Behavior
+    FOR(; ; )
+        WRITE ModelOneSensor__sensorData0 1
+        DELAY 10 ms isActiveDelay false
+    ENDFOR
+ENDTASK
+
+TASK ModelOneSensor__Timer
+    TASKOP
+    //Local variables
+    int dataReceivingTimeout = 1000
+    
+    //Behavior
+    DELAY dataReceivingTimeout ns isActiveDelay false
+    NOTIFY ModelOneSensor__evtTimeout
+ENDTASK
+
+TASK ModelOneSensor__Voter
+    TASKOP
+    //Local variables
+    bool x = false
+    int interpreteTime = 5
+    bool dataProcessed = false
+    int indexA = 0
+    int indexB = 0
+    int indexC = 0
+    int sizeA = 10
+    int sizeB = 10
+    int sizeC = 10
+    int i = 0
+    
+    //Behavior
+    FOR(i=0; i<3; )
+        SELECTEVT
+            CASE ModelOneSensor__evtTimeout
+                i=3
+            ENDCASE
+            CASE ModelOneSensor__evtC
+                READ ModelOneSensor__resC sizeC
+                indexC=indexC+1
+                IF (indexC==1)
+                    i=i+1
+                ELSE
+                ENDIF
+            ENDCASE
+            CASE ModelOneSensor__evtB
+                READ ModelOneSensor__resB sizeB
+                indexB=indexB+1
+                IF (indexB==1)
+                    i=i+1
+                ELSE
+                ENDIF
+            ENDCASE
+            CASE ModelOneSensor__evtA
+                READ ModelOneSensor__resA sizeA
+                indexA=indexA+1
+                IF (indexA==1)
+                    i=i+1
+                ELSE
+                ENDIF
+            ENDCASE
+        ENDSELECTEVT
+    ENDFOR
+    EXECC interpreteTime
+    RAND
+        CASERAND 50
+            x=true
+        ENDCASERAND
+        CASERAND 50
+            x=false
+        ENDCASERAND
+    ENDRAND
+    NOTIFY ModelOneSensor__moveto_FAIL_SAFE x
+    WRITE ModelOneSensor__resultData 1
+ENDTASK
+
diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithThreeSensorsIntegTMR.tarchi b/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithThreeSensorsIntegTMR.tarchi
new file mode 100644
index 0000000000000000000000000000000000000000..50a23411eef7f93e1b25f46a2b985b355d405617
--- /dev/null
+++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithThreeSensorsIntegTMR.tarchi
@@ -0,0 +1,193 @@
+// Master clock frequency - in MHz
+MASTERCLOCKFREQUENCY 200
+
+NODE BRIDGE BridgeEnvironmentPrivate
+SET BridgeEnvironmentPrivate bufferByteSize 4
+SET BridgeEnvironmentPrivate clockDivider 1
+
+NODE BRIDGE BridgeReceiverPrivate
+SET BridgeReceiverPrivate bufferByteSize 4
+SET BridgeReceiverPrivate clockDivider 1
+
+NODE BUS BusEnvironmentPrivate
+SET BusEnvironmentPrivate byteDataSize 4
+SET BusEnvironmentPrivate pipelineSize 1
+SET BusEnvironmentPrivate arbitration 0
+SET BusEnvironmentPrivate sliceTime 10000
+SET BusEnvironmentPrivate burstSize 100
+SET BusEnvironmentPrivate privacy private
+SET BusEnvironmentPrivate clockDivider 1
+
+NODE BUS BusReceiverPrivate
+SET BusReceiverPrivate byteDataSize 4
+SET BusReceiverPrivate pipelineSize 1
+SET BusReceiverPrivate arbitration 0
+SET BusReceiverPrivate sliceTime 10000
+SET BusReceiverPrivate burstSize 100
+SET BusReceiverPrivate privacy private
+SET BusReceiverPrivate clockDivider 1
+
+NODE MEMORY MemoryEnvironmentPrivate
+SET MemoryEnvironmentPrivate byteDataSize 4
+SET MemoryEnvironmentPrivate clockDivider 1
+
+NODE MEMORY MemoryReceiverPrivate
+SET MemoryReceiverPrivate byteDataSize 4
+SET MemoryReceiverPrivate clockDivider 1
+
+NODE MEMORY MemoryReceiver
+SET MemoryReceiver byteDataSize 4
+SET MemoryReceiver clockDivider 1
+
+NODE MEMORY MemoryEnvironment
+SET MemoryEnvironment byteDataSize 4
+SET MemoryEnvironment clockDivider 1
+
+NODE CPU CPUReceiver
+SET CPUReceiver nbOfCores 1
+SET CPUReceiver byteDataSize 4
+SET CPUReceiver pipelineSize 5
+SET CPUReceiver goIdleTime 10
+SET CPUReceiver maxConsecutiveIdleCycles 10
+SET CPUReceiver taskSwitchingTime 20
+SET CPUReceiver branchingPredictionPenalty 2
+SET CPUReceiver cacheMiss 5
+SET CPUReceiver schedulingPolicy 0
+SET CPUReceiver sliceTime 10000
+SET CPUReceiver execiTime 1
+SET CPUReceiver execcTime 1
+SET CPUReceiver clockDivider 1
+
+NODE CPU CPUEnvironment
+SET CPUEnvironment nbOfCores 1
+SET CPUEnvironment byteDataSize 4
+SET CPUEnvironment pipelineSize 5
+SET CPUEnvironment goIdleTime 10
+SET CPUEnvironment maxConsecutiveIdleCycles 10
+SET CPUEnvironment taskSwitchingTime 20
+SET CPUEnvironment branchingPredictionPenalty 2
+SET CPUEnvironment cacheMiss 5
+SET CPUEnvironment schedulingPolicy 0
+SET CPUEnvironment sliceTime 10000
+SET CPUEnvironment execiTime 1
+SET CPUEnvironment execcTime 1
+SET CPUEnvironment clockDivider 1
+
+NODE BUS BusReceiver
+SET BusReceiver byteDataSize 4
+SET BusReceiver pipelineSize 1
+SET BusReceiver arbitration 0
+SET BusReceiver sliceTime 10000
+SET BusReceiver burstSize 100
+SET BusReceiver privacy public
+SET BusReceiver clockDivider 1
+
+NODE BUS BusEnvironment
+SET BusEnvironment byteDataSize 4
+SET BusEnvironment pipelineSize 1
+SET BusEnvironment arbitration 0
+SET BusEnvironment sliceTime 10000
+SET BusEnvironment burstSize 100
+SET BusEnvironment privacy public
+SET BusEnvironment clockDivider 1
+
+NODE BRIDGE BridgeReceiver
+SET BridgeReceiver bufferByteSize 4
+SET BridgeReceiver clockDivider 1
+
+NODE BRIDGE BridgeEnvironment
+SET BridgeEnvironment bufferByteSize 4
+SET BridgeEnvironment clockDivider 1
+
+NODE BUS MainBus
+SET MainBus byteDataSize 4
+SET MainBus pipelineSize 1
+SET MainBus arbitration 0
+SET MainBus sliceTime 10000
+SET MainBus burstSize 100
+SET MainBus privacy public
+SET MainBus clockDivider 1
+
+NODE CPU CPU_InterpreterB
+SET CPU_InterpreterB nbOfCores 1
+SET CPU_InterpreterB byteDataSize 4
+SET CPU_InterpreterB pipelineSize 5
+SET CPU_InterpreterB goIdleTime 10
+SET CPU_InterpreterB maxConsecutiveIdleCycles 10
+SET CPU_InterpreterB taskSwitchingTime 20
+SET CPU_InterpreterB branchingPredictionPenalty 2
+SET CPU_InterpreterB cacheMiss 5
+SET CPU_InterpreterB schedulingPolicy 0
+SET CPU_InterpreterB sliceTime 10000
+SET CPU_InterpreterB execiTime 1
+SET CPU_InterpreterB execcTime 1
+SET CPU_InterpreterB clockDivider 1
+
+NODE MEMORY MemoryVoter
+SET MemoryVoter byteDataSize 4
+SET MemoryVoter clockDivider 1
+
+NODE LINK link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate
+SET link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate node MemoryEnvironmentPrivate
+SET link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate bus BusEnvironmentPrivate
+SET link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate priority 0
+NODE LINK link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate
+SET link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate node BridgeEnvironmentPrivate
+SET link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate bus BusEnvironmentPrivate
+SET link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate priority 0
+NODE LINK link_BridgeEnvironmentPrivate_to_BusEnvironment
+SET link_BridgeEnvironmentPrivate_to_BusEnvironment node BridgeEnvironmentPrivate
+SET link_BridgeEnvironmentPrivate_to_BusEnvironment bus BusEnvironment
+SET link_BridgeEnvironmentPrivate_to_BusEnvironment priority 0
+NODE LINK link_MemoryReceiverPrivate_to_BusReceiverPrivate
+SET link_MemoryReceiverPrivate_to_BusReceiverPrivate node MemoryReceiverPrivate
+SET link_MemoryReceiverPrivate_to_BusReceiverPrivate bus BusReceiverPrivate
+SET link_MemoryReceiverPrivate_to_BusReceiverPrivate priority 0
+NODE LINK link_BridgeReceiverPrivate_to_BusReceiverPrivate
+SET link_BridgeReceiverPrivate_to_BusReceiverPrivate node BridgeReceiverPrivate
+SET link_BridgeReceiverPrivate_to_BusReceiverPrivate bus BusReceiverPrivate
+SET link_BridgeReceiverPrivate_to_BusReceiverPrivate priority 0
+NODE LINK link_BridgeReceiverPrivate_to_BusReceiver
+SET link_BridgeReceiverPrivate_to_BusReceiver node BridgeReceiverPrivate
+SET link_BridgeReceiverPrivate_to_BusReceiver bus BusReceiver
+SET link_BridgeReceiverPrivate_to_BusReceiver priority 0
+NODE LINK link_CPUEnvironment_to_BusEnvironmentPrivate
+SET link_CPUEnvironment_to_BusEnvironmentPrivate node CPUEnvironment
+SET link_CPUEnvironment_to_BusEnvironmentPrivate bus BusEnvironmentPrivate
+SET link_CPUEnvironment_to_BusEnvironmentPrivate priority 0
+NODE LINK link_MemoryEnvironment_to_BusEnvironment
+SET link_MemoryEnvironment_to_BusEnvironment node MemoryEnvironment
+SET link_MemoryEnvironment_to_BusEnvironment bus BusEnvironment
+SET link_MemoryEnvironment_to_BusEnvironment priority 0
+NODE LINK link_BridgeEnvironment_to_BusEnvironment
+SET link_BridgeEnvironment_to_BusEnvironment node BridgeEnvironment
+SET link_BridgeEnvironment_to_BusEnvironment bus BusEnvironment
+SET link_BridgeEnvironment_to_BusEnvironment priority 0
+NODE LINK link_BridgeEnvironment_to_MainBus
+SET link_BridgeEnvironment_to_MainBus node BridgeEnvironment
+SET link_BridgeEnvironment_to_MainBus bus MainBus
+SET link_BridgeEnvironment_to_MainBus priority 0
+NODE LINK link_BridgeReceiver_to_BusReceiver
+SET link_BridgeReceiver_to_BusReceiver node BridgeReceiver
+SET link_BridgeReceiver_to_BusReceiver bus BusReceiver
+SET link_BridgeReceiver_to_BusReceiver priority 0
+NODE LINK link_BridgeReceiver_to_MainBus
+SET link_BridgeReceiver_to_MainBus node BridgeReceiver
+SET link_BridgeReceiver_to_MainBus bus MainBus
+SET link_BridgeReceiver_to_MainBus priority 0
+NODE LINK link_CPUReceiver_to_BusReceiverPrivate
+SET link_CPUReceiver_to_BusReceiverPrivate node CPUReceiver
+SET link_CPUReceiver_to_BusReceiverPrivate bus BusReceiverPrivate
+SET link_CPUReceiver_to_BusReceiverPrivate priority 0
+NODE LINK link_MemoryReceiver_to_BusReceiver
+SET link_MemoryReceiver_to_BusReceiver node MemoryReceiver
+SET link_MemoryReceiver_to_BusReceiver bus BusReceiver
+SET link_MemoryReceiver_to_BusReceiver priority 0
+NODE LINK link_CPU_InterpreterB_to_MainBus
+SET link_CPU_InterpreterB_to_MainBus node CPU_InterpreterB
+SET link_CPU_InterpreterB_to_MainBus bus MainBus
+SET link_CPU_InterpreterB_to_MainBus priority 0
+NODE LINK link_MemoryVoter_to_BusReceiverPrivate
+SET link_MemoryVoter_to_BusReceiverPrivate node MemoryVoter
+SET link_MemoryVoter_to_BusReceiverPrivate bus BusReceiverPrivate
+SET link_MemoryVoter_to_BusReceiverPrivate priority 0
diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithThreeSensorsIntegTMR.tmap b/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithThreeSensorsIntegTMR.tmap
new file mode 100644
index 0000000000000000000000000000000000000000..ccd2d7e4ce92ccbe06509a43a25583d2ba9be5dd
--- /dev/null
+++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithThreeSensorsIntegTMR.tmap
@@ -0,0 +1,114 @@
+TMLSPEC
+    #include "modelWithThreeSensorsIntegTMR.tml"
+ENDTMLSPEC
+
+TMLARCHI
+    #include "modelWithThreeSensorsIntegTMR.tarchi"
+ENDTMLARCHI
+
+TMLMAPPING
+    MAP CPUReceiver ModelThreeSensors__Receiver
+    SET ModelThreeSensors__Receiver priority 0
+    MAP CPUEnvironment ModelThreeSensors__Sensor3
+    SET ModelThreeSensors__Sensor3 priority 0
+    MAP CPUEnvironment ModelThreeSensors__Sensor2
+    SET ModelThreeSensors__Sensor2 priority 0
+    MAP CPUEnvironment ModelThreeSensors__Sensor1
+    SET ModelThreeSensors__Sensor1 priority 0
+    MAP CPU_InterpreterB ModelThreeSensors__InterpreterB
+    SET ModelThreeSensors__InterpreterB priority 0
+    MAP CPU_InterpreterB ModelThreeSensors__InterpreterA
+    SET ModelThreeSensors__InterpreterA priority 0
+    MAP CPU_InterpreterB ModelThreeSensors__Voter
+    SET ModelThreeSensors__Voter priority 0
+    MAP CPU_InterpreterB ModelThreeSensors__InterpreterC
+    SET ModelThreeSensors__InterpreterC priority 0
+    MAP CPU_InterpreterB ModelThreeSensors__Timer
+    SET ModelThreeSensors__Timer priority 0
+    MAP MemoryEnvironment ModelThreeSensors__sensorData3
+    SET ModelThreeSensors__sensorData3 priority 0
+    MAP BusEnvironment ModelThreeSensors__sensorData3
+    SET ModelThreeSensors__sensorData3 priority 0
+    MAP MainBus ModelThreeSensors__sensorData3
+    SET ModelThreeSensors__sensorData3 priority 0
+    MAP BusReceiverPrivate ModelThreeSensors__sensorData3
+    SET ModelThreeSensors__sensorData3 priority 0
+    MAP BusEnvironmentPrivate ModelThreeSensors__sensorData3
+    SET ModelThreeSensors__sensorData3 priority 0
+    MAP BusReceiver ModelThreeSensors__sensorData3
+    SET ModelThreeSensors__sensorData3 priority 0
+    MAP MemoryEnvironment ModelThreeSensors__sensorData1
+    SET ModelThreeSensors__sensorData1 priority 0
+    MAP BusEnvironment ModelThreeSensors__sensorData1
+    SET ModelThreeSensors__sensorData1 priority 0
+    MAP MainBus ModelThreeSensors__sensorData1
+    SET ModelThreeSensors__sensorData1 priority 0
+    MAP BusReceiver ModelThreeSensors__sensorData1
+    SET ModelThreeSensors__sensorData1 priority 0
+    MAP BusReceiverPrivate ModelThreeSensors__sensorData1
+    SET ModelThreeSensors__sensorData1 priority 0
+    MAP BusEnvironmentPrivate ModelThreeSensors__sensorData1
+    SET ModelThreeSensors__sensorData1 priority 0
+    MAP MemoryEnvironment ModelThreeSensors__sensorData2
+    SET ModelThreeSensors__sensorData2 priority 0
+    MAP BusEnvironment ModelThreeSensors__sensorData2
+    SET ModelThreeSensors__sensorData2 priority 0
+    MAP MainBus ModelThreeSensors__sensorData2
+    SET ModelThreeSensors__sensorData2 priority 0
+    MAP BusEnvironmentPrivate ModelThreeSensors__sensorData2
+    SET ModelThreeSensors__sensorData2 priority 0
+    MAP BusReceiverPrivate ModelThreeSensors__sensorData2
+    SET ModelThreeSensors__sensorData2 priority 0
+    MAP BusReceiver ModelThreeSensors__sensorData2
+    SET ModelThreeSensors__sensorData2 priority 0
+    MAP BusEnvironment ModelThreeSensors__resultData
+    SET ModelThreeSensors__resultData priority 0
+    MAP MainBus ModelThreeSensors__resultData
+    SET ModelThreeSensors__resultData priority 0
+    MAP BusEnvironmentPrivate ModelThreeSensors__resultData
+    SET ModelThreeSensors__resultData priority 0
+    MAP BusReceiverPrivate ModelThreeSensors__resultData
+    SET ModelThreeSensors__resultData priority 0
+    MAP BusReceiver ModelThreeSensors__resultData
+    SET ModelThreeSensors__resultData priority 0
+    MAP MemoryVoter ModelThreeSensors__resultData
+    SET ModelThreeSensors__resultData priority 0
+    MAP BusReceiverPrivate ModelThreeSensors__resultData
+    SET ModelThreeSensors__resultData priority 0
+    MAP MemoryVoter ModelThreeSensors__resA
+    SET ModelThreeSensors__resA priority 0
+    MAP BusEnvironment ModelThreeSensors__resA
+    SET ModelThreeSensors__resA priority 0
+    MAP MainBus ModelThreeSensors__resA
+    SET ModelThreeSensors__resA priority 0
+    MAP BusEnvironmentPrivate ModelThreeSensors__resA
+    SET ModelThreeSensors__resA priority 0
+    MAP BusReceiverPrivate ModelThreeSensors__resA
+    SET ModelThreeSensors__resA priority 0
+    MAP BusReceiver ModelThreeSensors__resA
+    SET ModelThreeSensors__resA priority 0
+    MAP MemoryVoter ModelThreeSensors__resC
+    SET ModelThreeSensors__resC priority 0
+    MAP BusEnvironment ModelThreeSensors__resC
+    SET ModelThreeSensors__resC priority 0
+    MAP MainBus ModelThreeSensors__resC
+    SET ModelThreeSensors__resC priority 0
+    MAP BusEnvironmentPrivate ModelThreeSensors__resC
+    SET ModelThreeSensors__resC priority 0
+    MAP BusReceiverPrivate ModelThreeSensors__resC
+    SET ModelThreeSensors__resC priority 0
+    MAP BusReceiver ModelThreeSensors__resC
+    SET ModelThreeSensors__resC priority 0
+    MAP MemoryVoter ModelThreeSensors__resB
+    SET ModelThreeSensors__resB priority 0
+    MAP BusEnvironment ModelThreeSensors__resB
+    SET ModelThreeSensors__resB priority 0
+    MAP MainBus ModelThreeSensors__resB
+    SET ModelThreeSensors__resB priority 0
+    MAP BusEnvironmentPrivate ModelThreeSensors__resB
+    SET ModelThreeSensors__resB priority 0
+    MAP BusReceiverPrivate ModelThreeSensors__resB
+    SET ModelThreeSensors__resB priority 0
+    MAP BusReceiver ModelThreeSensors__resB
+    SET ModelThreeSensors__resB priority 0
+ENDTMLMAPPING
diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithThreeSensorsIntegTMR.tml b/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithThreeSensorsIntegTMR.tml
new file mode 100644
index 0000000000000000000000000000000000000000..9a3a122ffc32b9ec5e7d8f2e69ce66a467474d7f
--- /dev/null
+++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithThreeSensorsIntegTMR.tml
@@ -0,0 +1,194 @@
+// TML Application - FORMAT 0.2
+// Application: tmr
+// Generated: Mon Nov 13 12:40:36 CET 2023
+
+// PRAGMAS
+
+// Channels
+CHANNEL ModelThreeSensors__resA BRBW 8 8 OUT ModelThreeSensors__InterpreterA IN ModelThreeSensors__Voter
+VCCHANNEL ModelThreeSensors__resA 0
+CONFCHANNEL ModelThreeSensors__resA
+AUTHCHANNEL ModelThreeSensors__resA
+CHANNEL ModelThreeSensors__resB BRBW 8 8 OUT ModelThreeSensors__InterpreterB IN ModelThreeSensors__Voter
+VCCHANNEL ModelThreeSensors__resB 0
+CONFCHANNEL ModelThreeSensors__resB
+AUTHCHANNEL ModelThreeSensors__resB
+CHANNEL ModelThreeSensors__resC BRBW 8 8 OUT ModelThreeSensors__InterpreterC IN ModelThreeSensors__Voter
+VCCHANNEL ModelThreeSensors__resC 0
+CONFCHANNEL ModelThreeSensors__resC
+AUTHCHANNEL ModelThreeSensors__resC
+CHANNEL ModelThreeSensors__resultData BRBW 8 8 OUT ModelThreeSensors__Voter IN ModelThreeSensors__Receiver
+VCCHANNEL ModelThreeSensors__resultData 0
+CONFCHANNEL ModelThreeSensors__resultData
+AUTHCHANNEL ModelThreeSensors__resultData
+CHANNEL ModelThreeSensors__sensorData1 BRNBW 4 OUT ModelThreeSensors__Sensor1 IN ModelThreeSensors__InterpreterA
+VCCHANNEL ModelThreeSensors__sensorData1 0
+CHANNEL ModelThreeSensors__sensorData2 BRNBW 4 OUT ModelThreeSensors__Sensor2 IN ModelThreeSensors__InterpreterB
+VCCHANNEL ModelThreeSensors__sensorData2 0
+CHANNEL ModelThreeSensors__sensorData3 BRNBW 4 OUT ModelThreeSensors__Sensor3 IN ModelThreeSensors__InterpreterC
+VCCHANNEL ModelThreeSensors__sensorData3 0
+
+// Events
+EVENT ModelThreeSensors__evtA() NIB 8 ModelThreeSensors__InterpreterA ModelThreeSensors__Voter
+EVENT ModelThreeSensors__evtB() NIB 8 ModelThreeSensors__InterpreterB ModelThreeSensors__Voter
+EVENT ModelThreeSensors__evtC() NIB 8 ModelThreeSensors__InterpreterC ModelThreeSensors__Voter
+EVENT ModelThreeSensors__evtTimeout() NIB 8 ModelThreeSensors__Timer ModelThreeSensors__Voter
+EVENT ModelThreeSensors__moveto_FAIL_SAFE(bool) NIB 8 ModelThreeSensors__Voter ModelThreeSensors__Receiver
+
+// Requests
+
+TASK ModelThreeSensors__InterpreterA
+    TASKOP
+    //Local variables
+    int size = 50
+    int sizeA = 10
+    
+    //Behavior
+    READ ModelThreeSensors__sensorData1 size
+    EXECC size
+    NOTIFY ModelThreeSensors__evtA
+    WRITE ModelThreeSensors__resA sizeA
+ENDTASK
+
+TASK ModelThreeSensors__InterpreterB
+    TASKOP
+    //Local variables
+    int size = 50
+    int sizeB = 10
+    
+    //Behavior
+    READ ModelThreeSensors__sensorData2 size
+    EXECC size
+    NOTIFY ModelThreeSensors__evtB
+    WRITE ModelThreeSensors__resB sizeB
+ENDTASK
+
+TASK ModelThreeSensors__InterpreterC
+    TASKOP
+    //Local variables
+    int size = 50
+    int sizeC = 10
+    
+    //Behavior
+    READ ModelThreeSensors__sensorData3 size
+    EXECC size
+    NOTIFY ModelThreeSensors__evtC
+    WRITE ModelThreeSensors__resC sizeC
+ENDTASK
+
+TASK ModelThreeSensors__Receiver
+    TASKOP
+    //Local variables
+    int executeSensor = 10
+    bool x = false
+    
+    //Behavior
+    FOR(; ; )
+        WAIT ModelThreeSensors__moveto_FAIL_SAFE x
+        READ ModelThreeSensors__resultData 1
+        EXECI executeSensor
+    ENDFOR
+ENDTASK
+
+TASK ModelThreeSensors__Sensor1
+    TASKOP
+    //Local variables
+    
+    //Behavior
+    FOR(; ; )
+        WRITE ModelThreeSensors__sensorData1 1
+        DELAY 10 ms isActiveDelay false
+    ENDFOR
+ENDTASK
+
+TASK ModelThreeSensors__Sensor2
+    TASKOP
+    //Local variables
+    
+    //Behavior
+    FOR(; ; )
+        WRITE ModelThreeSensors__sensorData2 1
+        DELAY 10 ms isActiveDelay false
+    ENDFOR
+ENDTASK
+
+TASK ModelThreeSensors__Sensor3
+    TASKOP
+    //Local variables
+    
+    //Behavior
+    FOR(; ; )
+        WRITE ModelThreeSensors__sensorData3 1
+        DELAY 10 ms isActiveDelay false
+    ENDFOR
+ENDTASK
+
+TASK ModelThreeSensors__Timer
+    TASKOP
+    //Local variables
+    int dataReceivingTimeout = 500
+    
+    //Behavior
+    DELAY dataReceivingTimeout ns isActiveDelay false
+    NOTIFY ModelThreeSensors__evtTimeout
+ENDTASK
+
+TASK ModelThreeSensors__Voter
+    TASKOP
+    //Local variables
+    bool x = false
+    int interpreteTime = 5
+    bool dataProcessed = false
+    int indexA = 0
+    int indexB = 0
+    int indexC = 0
+    int sizeA = 10
+    int sizeB = 10
+    int sizeC = 10
+    int i = 0
+    
+    //Behavior
+    FOR(i=0; i<3; )
+        SELECTEVT
+            CASE ModelThreeSensors__evtTimeout
+                i=3
+            ENDCASE
+            CASE ModelThreeSensors__evtC
+                READ ModelThreeSensors__resC sizeC
+                indexC=indexC+1
+                IF (indexC==1)
+                    i=i+1
+                ELSE
+                ENDIF
+            ENDCASE
+            CASE ModelThreeSensors__evtB
+                READ ModelThreeSensors__resB sizeB
+                indexB=indexB+1
+                IF (indexB==1)
+                    i=i+1
+                ELSE
+                ENDIF
+            ENDCASE
+            CASE ModelThreeSensors__evtA
+                READ ModelThreeSensors__resA sizeA
+                indexA=indexA+1
+                IF (indexA==1)
+                    i=i+1
+                ELSE
+                ENDIF
+            ENDCASE
+        ENDSELECTEVT
+    ENDFOR
+    EXECC interpreteTime
+    RAND
+        CASERAND 50
+            x=true
+        ENDCASERAND
+        CASERAND 50
+            x=false
+        ENDCASERAND
+    ENDRAND
+    NOTIFY ModelThreeSensors__moveto_FAIL_SAFE x
+    WRITE ModelThreeSensors__resultData 1
+ENDTASK
+
diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithOneSensor.tarchi b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithOneSensor.tarchi
new file mode 100644
index 0000000000000000000000000000000000000000..b6c92cd2d1c8b973d97ca917dd1838c369ecdcb7
--- /dev/null
+++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithOneSensor.tarchi
@@ -0,0 +1,166 @@
+// Master clock frequency - in MHz
+MASTERCLOCKFREQUENCY 200
+
+NODE BRIDGE BridgeEnvironmentPrivate
+SET BridgeEnvironmentPrivate bufferByteSize 4
+SET BridgeEnvironmentPrivate clockDivider 1
+
+NODE BRIDGE BridgeReceiverPrivate
+SET BridgeReceiverPrivate bufferByteSize 4
+SET BridgeReceiverPrivate clockDivider 1
+
+NODE BUS BusEnvironmentPrivate
+SET BusEnvironmentPrivate byteDataSize 4
+SET BusEnvironmentPrivate pipelineSize 1
+SET BusEnvironmentPrivate arbitration 0
+SET BusEnvironmentPrivate sliceTime 10000
+SET BusEnvironmentPrivate burstSize 100
+SET BusEnvironmentPrivate privacy private
+SET BusEnvironmentPrivate clockDivider 1
+
+NODE BUS BusReceiverPrivate
+SET BusReceiverPrivate byteDataSize 4
+SET BusReceiverPrivate pipelineSize 1
+SET BusReceiverPrivate arbitration 0
+SET BusReceiverPrivate sliceTime 10000
+SET BusReceiverPrivate burstSize 100
+SET BusReceiverPrivate privacy private
+SET BusReceiverPrivate clockDivider 1
+
+NODE MEMORY MemoryEnvironmentPrivate
+SET MemoryEnvironmentPrivate byteDataSize 4
+SET MemoryEnvironmentPrivate clockDivider 1
+
+NODE MEMORY MemoryReceiverPrivate
+SET MemoryReceiverPrivate byteDataSize 4
+SET MemoryReceiverPrivate clockDivider 1
+
+NODE MEMORY MemoryReceiver
+SET MemoryReceiver byteDataSize 4
+SET MemoryReceiver clockDivider 1
+
+NODE MEMORY MemoryEnvironment
+SET MemoryEnvironment byteDataSize 4
+SET MemoryEnvironment clockDivider 1
+
+NODE CPU CPUReceiver
+SET CPUReceiver nbOfCores 1
+SET CPUReceiver byteDataSize 4
+SET CPUReceiver pipelineSize 5
+SET CPUReceiver goIdleTime 10
+SET CPUReceiver maxConsecutiveIdleCycles 10
+SET CPUReceiver taskSwitchingTime 20
+SET CPUReceiver branchingPredictionPenalty 2
+SET CPUReceiver cacheMiss 5
+SET CPUReceiver schedulingPolicy 0
+SET CPUReceiver sliceTime 10000
+SET CPUReceiver execiTime 1
+SET CPUReceiver execcTime 1
+SET CPUReceiver clockDivider 1
+
+NODE CPU CPUEnvironment
+SET CPUEnvironment nbOfCores 1
+SET CPUEnvironment byteDataSize 4
+SET CPUEnvironment pipelineSize 5
+SET CPUEnvironment goIdleTime 10
+SET CPUEnvironment maxConsecutiveIdleCycles 10
+SET CPUEnvironment taskSwitchingTime 20
+SET CPUEnvironment branchingPredictionPenalty 2
+SET CPUEnvironment cacheMiss 5
+SET CPUEnvironment schedulingPolicy 0
+SET CPUEnvironment sliceTime 10000
+SET CPUEnvironment execiTime 1
+SET CPUEnvironment execcTime 1
+SET CPUEnvironment clockDivider 1
+
+NODE BUS BusReceiver
+SET BusReceiver byteDataSize 4
+SET BusReceiver pipelineSize 1
+SET BusReceiver arbitration 0
+SET BusReceiver sliceTime 10000
+SET BusReceiver burstSize 100
+SET BusReceiver privacy public
+SET BusReceiver clockDivider 1
+
+NODE BUS BusEnvironment
+SET BusEnvironment byteDataSize 4
+SET BusEnvironment pipelineSize 1
+SET BusEnvironment arbitration 0
+SET BusEnvironment sliceTime 10000
+SET BusEnvironment burstSize 100
+SET BusEnvironment privacy public
+SET BusEnvironment clockDivider 1
+
+NODE BRIDGE BridgeReceiver
+SET BridgeReceiver bufferByteSize 4
+SET BridgeReceiver clockDivider 1
+
+NODE BRIDGE BridgeEnvironment
+SET BridgeEnvironment bufferByteSize 4
+SET BridgeEnvironment clockDivider 1
+
+NODE BUS MainBus
+SET MainBus byteDataSize 4
+SET MainBus pipelineSize 1
+SET MainBus arbitration 0
+SET MainBus sliceTime 10000
+SET MainBus burstSize 100
+SET MainBus privacy public
+SET MainBus clockDivider 1
+
+NODE LINK link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate
+SET link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate node MemoryEnvironmentPrivate
+SET link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate bus BusEnvironmentPrivate
+SET link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate priority 0
+NODE LINK link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate
+SET link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate node BridgeEnvironmentPrivate
+SET link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate bus BusEnvironmentPrivate
+SET link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate priority 0
+NODE LINK link_BridgeEnvironmentPrivate_to_BusEnvironment
+SET link_BridgeEnvironmentPrivate_to_BusEnvironment node BridgeEnvironmentPrivate
+SET link_BridgeEnvironmentPrivate_to_BusEnvironment bus BusEnvironment
+SET link_BridgeEnvironmentPrivate_to_BusEnvironment priority 0
+NODE LINK link_MemoryReceiverPrivate_to_BusReceiverPrivate
+SET link_MemoryReceiverPrivate_to_BusReceiverPrivate node MemoryReceiverPrivate
+SET link_MemoryReceiverPrivate_to_BusReceiverPrivate bus BusReceiverPrivate
+SET link_MemoryReceiverPrivate_to_BusReceiverPrivate priority 0
+NODE LINK link_BridgeReceiverPrivate_to_BusReceiverPrivate
+SET link_BridgeReceiverPrivate_to_BusReceiverPrivate node BridgeReceiverPrivate
+SET link_BridgeReceiverPrivate_to_BusReceiverPrivate bus BusReceiverPrivate
+SET link_BridgeReceiverPrivate_to_BusReceiverPrivate priority 0
+NODE LINK link_BridgeReceiverPrivate_to_BusReceiver
+SET link_BridgeReceiverPrivate_to_BusReceiver node BridgeReceiverPrivate
+SET link_BridgeReceiverPrivate_to_BusReceiver bus BusReceiver
+SET link_BridgeReceiverPrivate_to_BusReceiver priority 0
+NODE LINK link_CPUEnvironment_to_BusEnvironmentPrivate
+SET link_CPUEnvironment_to_BusEnvironmentPrivate node CPUEnvironment
+SET link_CPUEnvironment_to_BusEnvironmentPrivate bus BusEnvironmentPrivate
+SET link_CPUEnvironment_to_BusEnvironmentPrivate priority 0
+NODE LINK link_MemoryEnvironment_to_BusEnvironment
+SET link_MemoryEnvironment_to_BusEnvironment node MemoryEnvironment
+SET link_MemoryEnvironment_to_BusEnvironment bus BusEnvironment
+SET link_MemoryEnvironment_to_BusEnvironment priority 0
+NODE LINK link_BridgeEnvironment_to_BusEnvironment
+SET link_BridgeEnvironment_to_BusEnvironment node BridgeEnvironment
+SET link_BridgeEnvironment_to_BusEnvironment bus BusEnvironment
+SET link_BridgeEnvironment_to_BusEnvironment priority 0
+NODE LINK link_BridgeEnvironment_to_MainBus
+SET link_BridgeEnvironment_to_MainBus node BridgeEnvironment
+SET link_BridgeEnvironment_to_MainBus bus MainBus
+SET link_BridgeEnvironment_to_MainBus priority 0
+NODE LINK link_BridgeReceiver_to_BusReceiver
+SET link_BridgeReceiver_to_BusReceiver node BridgeReceiver
+SET link_BridgeReceiver_to_BusReceiver bus BusReceiver
+SET link_BridgeReceiver_to_BusReceiver priority 0
+NODE LINK link_BridgeReceiver_to_MainBus
+SET link_BridgeReceiver_to_MainBus node BridgeReceiver
+SET link_BridgeReceiver_to_MainBus bus MainBus
+SET link_BridgeReceiver_to_MainBus priority 0
+NODE LINK link_CPUReceiver_to_BusReceiverPrivate
+SET link_CPUReceiver_to_BusReceiverPrivate node CPUReceiver
+SET link_CPUReceiver_to_BusReceiverPrivate bus BusReceiverPrivate
+SET link_CPUReceiver_to_BusReceiverPrivate priority 0
+NODE LINK link_MemoryReceiver_to_BusReceiver
+SET link_MemoryReceiver_to_BusReceiver node MemoryReceiver
+SET link_MemoryReceiver_to_BusReceiver bus BusReceiver
+SET link_MemoryReceiver_to_BusReceiver priority 0
diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithOneSensor.tmap b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithOneSensor.tmap
new file mode 100644
index 0000000000000000000000000000000000000000..cd705fcb3e9900a64d8062dd4029d58a6db203d6
--- /dev/null
+++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithOneSensor.tmap
@@ -0,0 +1,26 @@
+TMLSPEC
+    #include "modelWithOneSensor.tml"
+ENDTMLSPEC
+
+TMLARCHI
+    #include "modelWithOneSensor.tarchi"
+ENDTMLARCHI
+
+TMLMAPPING
+    MAP CPUReceiver ModelOneSensor__Receiver
+    SET ModelOneSensor__Receiver priority 0
+    MAP CPUEnvironment ModelOneSensor__Sensor
+    SET ModelOneSensor__Sensor priority 0
+    MAP MemoryEnvironment ModelOneSensor__sensorData
+    SET ModelOneSensor__sensorData priority 0
+    MAP BusEnvironment ModelOneSensor__sensorData
+    SET ModelOneSensor__sensorData priority 0
+    MAP MainBus ModelOneSensor__sensorData
+    SET ModelOneSensor__sensorData priority 0
+    MAP BusReceiver ModelOneSensor__sensorData
+    SET ModelOneSensor__sensorData priority 0
+    MAP BusReceiverPrivate ModelOneSensor__sensorData
+    SET ModelOneSensor__sensorData priority 0
+    MAP BusEnvironmentPrivate ModelOneSensor__sensorData
+    SET ModelOneSensor__sensorData priority 0
+ENDTMLMAPPING
diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithOneSensor.tml b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithOneSensor.tml
new file mode 100644
index 0000000000000000000000000000000000000000..bd0e0f6006f221776f4fb75a59bc11d483f5c4cd
--- /dev/null
+++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithOneSensor.tml
@@ -0,0 +1,37 @@
+// TML Application - FORMAT 0.2
+// Application: modelWithOneSensor.xml
+// Generated: Sat Nov 11 15:57:04 CET 2023
+
+// PRAGMAS
+
+// Channels
+CHANNEL ModelOneSensor__sensorData BRNBW 4 OUT ModelOneSensor__Sensor IN ModelOneSensor__Receiver
+VCCHANNEL ModelOneSensor__sensorData 0
+
+// Events
+
+// Requests
+
+TASK ModelOneSensor__Receiver
+    TASKOP
+    //Local variables
+    int executeSensor = 10
+    
+    //Behavior
+    FOR( ; ; )
+        READ ModelOneSensor__sensorData 1
+        EXECI executeSensor
+    ENDFOR
+ENDTASK
+
+TASK ModelOneSensor__Sensor
+    TASKOP
+    //Local variables
+    
+    //Behavior
+    FOR( ; ; )
+        WRITE ModelOneSensor__sensorData 1
+        DELAY 10 ms isActiveDelay false
+    ENDFOR
+ENDTASK
+
diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithThreeSensors.tarchi b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithThreeSensors.tarchi
new file mode 100644
index 0000000000000000000000000000000000000000..b6c92cd2d1c8b973d97ca917dd1838c369ecdcb7
--- /dev/null
+++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithThreeSensors.tarchi
@@ -0,0 +1,166 @@
+// Master clock frequency - in MHz
+MASTERCLOCKFREQUENCY 200
+
+NODE BRIDGE BridgeEnvironmentPrivate
+SET BridgeEnvironmentPrivate bufferByteSize 4
+SET BridgeEnvironmentPrivate clockDivider 1
+
+NODE BRIDGE BridgeReceiverPrivate
+SET BridgeReceiverPrivate bufferByteSize 4
+SET BridgeReceiverPrivate clockDivider 1
+
+NODE BUS BusEnvironmentPrivate
+SET BusEnvironmentPrivate byteDataSize 4
+SET BusEnvironmentPrivate pipelineSize 1
+SET BusEnvironmentPrivate arbitration 0
+SET BusEnvironmentPrivate sliceTime 10000
+SET BusEnvironmentPrivate burstSize 100
+SET BusEnvironmentPrivate privacy private
+SET BusEnvironmentPrivate clockDivider 1
+
+NODE BUS BusReceiverPrivate
+SET BusReceiverPrivate byteDataSize 4
+SET BusReceiverPrivate pipelineSize 1
+SET BusReceiverPrivate arbitration 0
+SET BusReceiverPrivate sliceTime 10000
+SET BusReceiverPrivate burstSize 100
+SET BusReceiverPrivate privacy private
+SET BusReceiverPrivate clockDivider 1
+
+NODE MEMORY MemoryEnvironmentPrivate
+SET MemoryEnvironmentPrivate byteDataSize 4
+SET MemoryEnvironmentPrivate clockDivider 1
+
+NODE MEMORY MemoryReceiverPrivate
+SET MemoryReceiverPrivate byteDataSize 4
+SET MemoryReceiverPrivate clockDivider 1
+
+NODE MEMORY MemoryReceiver
+SET MemoryReceiver byteDataSize 4
+SET MemoryReceiver clockDivider 1
+
+NODE MEMORY MemoryEnvironment
+SET MemoryEnvironment byteDataSize 4
+SET MemoryEnvironment clockDivider 1
+
+NODE CPU CPUReceiver
+SET CPUReceiver nbOfCores 1
+SET CPUReceiver byteDataSize 4
+SET CPUReceiver pipelineSize 5
+SET CPUReceiver goIdleTime 10
+SET CPUReceiver maxConsecutiveIdleCycles 10
+SET CPUReceiver taskSwitchingTime 20
+SET CPUReceiver branchingPredictionPenalty 2
+SET CPUReceiver cacheMiss 5
+SET CPUReceiver schedulingPolicy 0
+SET CPUReceiver sliceTime 10000
+SET CPUReceiver execiTime 1
+SET CPUReceiver execcTime 1
+SET CPUReceiver clockDivider 1
+
+NODE CPU CPUEnvironment
+SET CPUEnvironment nbOfCores 1
+SET CPUEnvironment byteDataSize 4
+SET CPUEnvironment pipelineSize 5
+SET CPUEnvironment goIdleTime 10
+SET CPUEnvironment maxConsecutiveIdleCycles 10
+SET CPUEnvironment taskSwitchingTime 20
+SET CPUEnvironment branchingPredictionPenalty 2
+SET CPUEnvironment cacheMiss 5
+SET CPUEnvironment schedulingPolicy 0
+SET CPUEnvironment sliceTime 10000
+SET CPUEnvironment execiTime 1
+SET CPUEnvironment execcTime 1
+SET CPUEnvironment clockDivider 1
+
+NODE BUS BusReceiver
+SET BusReceiver byteDataSize 4
+SET BusReceiver pipelineSize 1
+SET BusReceiver arbitration 0
+SET BusReceiver sliceTime 10000
+SET BusReceiver burstSize 100
+SET BusReceiver privacy public
+SET BusReceiver clockDivider 1
+
+NODE BUS BusEnvironment
+SET BusEnvironment byteDataSize 4
+SET BusEnvironment pipelineSize 1
+SET BusEnvironment arbitration 0
+SET BusEnvironment sliceTime 10000
+SET BusEnvironment burstSize 100
+SET BusEnvironment privacy public
+SET BusEnvironment clockDivider 1
+
+NODE BRIDGE BridgeReceiver
+SET BridgeReceiver bufferByteSize 4
+SET BridgeReceiver clockDivider 1
+
+NODE BRIDGE BridgeEnvironment
+SET BridgeEnvironment bufferByteSize 4
+SET BridgeEnvironment clockDivider 1
+
+NODE BUS MainBus
+SET MainBus byteDataSize 4
+SET MainBus pipelineSize 1
+SET MainBus arbitration 0
+SET MainBus sliceTime 10000
+SET MainBus burstSize 100
+SET MainBus privacy public
+SET MainBus clockDivider 1
+
+NODE LINK link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate
+SET link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate node MemoryEnvironmentPrivate
+SET link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate bus BusEnvironmentPrivate
+SET link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate priority 0
+NODE LINK link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate
+SET link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate node BridgeEnvironmentPrivate
+SET link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate bus BusEnvironmentPrivate
+SET link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate priority 0
+NODE LINK link_BridgeEnvironmentPrivate_to_BusEnvironment
+SET link_BridgeEnvironmentPrivate_to_BusEnvironment node BridgeEnvironmentPrivate
+SET link_BridgeEnvironmentPrivate_to_BusEnvironment bus BusEnvironment
+SET link_BridgeEnvironmentPrivate_to_BusEnvironment priority 0
+NODE LINK link_MemoryReceiverPrivate_to_BusReceiverPrivate
+SET link_MemoryReceiverPrivate_to_BusReceiverPrivate node MemoryReceiverPrivate
+SET link_MemoryReceiverPrivate_to_BusReceiverPrivate bus BusReceiverPrivate
+SET link_MemoryReceiverPrivate_to_BusReceiverPrivate priority 0
+NODE LINK link_BridgeReceiverPrivate_to_BusReceiverPrivate
+SET link_BridgeReceiverPrivate_to_BusReceiverPrivate node BridgeReceiverPrivate
+SET link_BridgeReceiverPrivate_to_BusReceiverPrivate bus BusReceiverPrivate
+SET link_BridgeReceiverPrivate_to_BusReceiverPrivate priority 0
+NODE LINK link_BridgeReceiverPrivate_to_BusReceiver
+SET link_BridgeReceiverPrivate_to_BusReceiver node BridgeReceiverPrivate
+SET link_BridgeReceiverPrivate_to_BusReceiver bus BusReceiver
+SET link_BridgeReceiverPrivate_to_BusReceiver priority 0
+NODE LINK link_CPUEnvironment_to_BusEnvironmentPrivate
+SET link_CPUEnvironment_to_BusEnvironmentPrivate node CPUEnvironment
+SET link_CPUEnvironment_to_BusEnvironmentPrivate bus BusEnvironmentPrivate
+SET link_CPUEnvironment_to_BusEnvironmentPrivate priority 0
+NODE LINK link_MemoryEnvironment_to_BusEnvironment
+SET link_MemoryEnvironment_to_BusEnvironment node MemoryEnvironment
+SET link_MemoryEnvironment_to_BusEnvironment bus BusEnvironment
+SET link_MemoryEnvironment_to_BusEnvironment priority 0
+NODE LINK link_BridgeEnvironment_to_BusEnvironment
+SET link_BridgeEnvironment_to_BusEnvironment node BridgeEnvironment
+SET link_BridgeEnvironment_to_BusEnvironment bus BusEnvironment
+SET link_BridgeEnvironment_to_BusEnvironment priority 0
+NODE LINK link_BridgeEnvironment_to_MainBus
+SET link_BridgeEnvironment_to_MainBus node BridgeEnvironment
+SET link_BridgeEnvironment_to_MainBus bus MainBus
+SET link_BridgeEnvironment_to_MainBus priority 0
+NODE LINK link_BridgeReceiver_to_BusReceiver
+SET link_BridgeReceiver_to_BusReceiver node BridgeReceiver
+SET link_BridgeReceiver_to_BusReceiver bus BusReceiver
+SET link_BridgeReceiver_to_BusReceiver priority 0
+NODE LINK link_BridgeReceiver_to_MainBus
+SET link_BridgeReceiver_to_MainBus node BridgeReceiver
+SET link_BridgeReceiver_to_MainBus bus MainBus
+SET link_BridgeReceiver_to_MainBus priority 0
+NODE LINK link_CPUReceiver_to_BusReceiverPrivate
+SET link_CPUReceiver_to_BusReceiverPrivate node CPUReceiver
+SET link_CPUReceiver_to_BusReceiverPrivate bus BusReceiverPrivate
+SET link_CPUReceiver_to_BusReceiverPrivate priority 0
+NODE LINK link_MemoryReceiver_to_BusReceiver
+SET link_MemoryReceiver_to_BusReceiver node MemoryReceiver
+SET link_MemoryReceiver_to_BusReceiver bus BusReceiver
+SET link_MemoryReceiver_to_BusReceiver priority 0
diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithThreeSensors.tmap b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithThreeSensors.tmap
new file mode 100644
index 0000000000000000000000000000000000000000..7b951259eeabbea59f3c517638ca731da1eecccf
--- /dev/null
+++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithThreeSensors.tmap
@@ -0,0 +1,54 @@
+TMLSPEC
+    #include "modelWithThreeSensors.tml"
+ENDTMLSPEC
+
+TMLARCHI
+    #include "modelWithThreeSensors.tarchi"
+ENDTMLARCHI
+
+TMLMAPPING
+    MAP CPUReceiver ModelThreeSensors__Receiver
+    SET ModelThreeSensors__Receiver priority 0
+    MAP CPUEnvironment ModelThreeSensors__Sensor3
+    SET ModelThreeSensors__Sensor3 priority 0
+    MAP CPUEnvironment ModelThreeSensors__Sensor2
+    SET ModelThreeSensors__Sensor2 priority 0
+    MAP CPUEnvironment ModelThreeSensors__Sensor1
+    SET ModelThreeSensors__Sensor1 priority 0
+    MAP MemoryEnvironment ModelThreeSensors__sensorData3
+    SET ModelThreeSensors__sensorData3 priority 0
+    MAP BusEnvironment ModelThreeSensors__sensorData3
+    SET ModelThreeSensors__sensorData3 priority 0
+    MAP MainBus ModelThreeSensors__sensorData3
+    SET ModelThreeSensors__sensorData3 priority 0
+    MAP BusReceiverPrivate ModelThreeSensors__sensorData3
+    SET ModelThreeSensors__sensorData3 priority 0
+    MAP BusEnvironmentPrivate ModelThreeSensors__sensorData3
+    SET ModelThreeSensors__sensorData3 priority 0
+    MAP BusReceiver ModelThreeSensors__sensorData3
+    SET ModelThreeSensors__sensorData3 priority 0
+    MAP MemoryEnvironment ModelThreeSensors__sensorData1
+    SET ModelThreeSensors__sensorData1 priority 0
+    MAP BusEnvironment ModelThreeSensors__sensorData1
+    SET ModelThreeSensors__sensorData1 priority 0
+    MAP MainBus ModelThreeSensors__sensorData1
+    SET ModelThreeSensors__sensorData1 priority 0
+    MAP BusReceiver ModelThreeSensors__sensorData1
+    SET ModelThreeSensors__sensorData1 priority 0
+    MAP BusReceiverPrivate ModelThreeSensors__sensorData1
+    SET ModelThreeSensors__sensorData1 priority 0
+    MAP BusEnvironmentPrivate ModelThreeSensors__sensorData1
+    SET ModelThreeSensors__sensorData1 priority 0
+    MAP MemoryEnvironment ModelThreeSensors__sensorData2
+    SET ModelThreeSensors__sensorData2 priority 0
+    MAP BusEnvironment ModelThreeSensors__sensorData2
+    SET ModelThreeSensors__sensorData2 priority 0
+    MAP MainBus ModelThreeSensors__sensorData2
+    SET ModelThreeSensors__sensorData2 priority 0
+    MAP BusEnvironmentPrivate ModelThreeSensors__sensorData2
+    SET ModelThreeSensors__sensorData2 priority 0
+    MAP BusReceiverPrivate ModelThreeSensors__sensorData2
+    SET ModelThreeSensors__sensorData2 priority 0
+    MAP BusReceiver ModelThreeSensors__sensorData2
+    SET ModelThreeSensors__sensorData2 priority 0
+ENDTMLMAPPING
diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithThreeSensors.tml b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithThreeSensors.tml
new file mode 100644
index 0000000000000000000000000000000000000000..ea7cbae4f75bd73c4e2d02ecb82884ce48d7ecc7
--- /dev/null
+++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithThreeSensors.tml
@@ -0,0 +1,65 @@
+// TML Application - FORMAT 0.2
+// Application: modelWithThreeSensors.xml
+// Generated: Sat Nov 11 16:00:27 CET 2023
+
+// PRAGMAS
+
+// Channels
+CHANNEL ModelThreeSensors__sensorData1 BRNBW 4 OUT ModelThreeSensors__Sensor1 IN ModelThreeSensors__Receiver
+VCCHANNEL ModelThreeSensors__sensorData1 0
+CHANNEL ModelThreeSensors__sensorData2 BRNBW 4 OUT ModelThreeSensors__Sensor2 IN ModelThreeSensors__Receiver
+VCCHANNEL ModelThreeSensors__sensorData2 0
+CHANNEL ModelThreeSensors__sensorData3 BRNBW 4 OUT ModelThreeSensors__Sensor3 IN ModelThreeSensors__Receiver
+VCCHANNEL ModelThreeSensors__sensorData3 0
+
+// Events
+
+// Requests
+
+TASK ModelThreeSensors__Receiver
+    TASKOP
+    //Local variables
+    int executeSensor = 10
+    
+    //Behavior
+    FOR( ; ; )
+        READ ModelThreeSensors__sensorData1 1
+        READ ModelThreeSensors__sensorData2 1
+        READ ModelThreeSensors__sensorData3 1
+        EXECI executeSensor
+    ENDFOR
+ENDTASK
+
+TASK ModelThreeSensors__Sensor1
+    TASKOP
+    //Local variables
+    
+    //Behavior
+    FOR( ; ; )
+        WRITE ModelThreeSensors__sensorData1 1
+        DELAY 10 ms isActiveDelay false
+    ENDFOR
+ENDTASK
+
+TASK ModelThreeSensors__Sensor2
+    TASKOP
+    //Local variables
+    
+    //Behavior
+    FOR( ; ; )
+        WRITE ModelThreeSensors__sensorData2 1
+        DELAY 10 ms isActiveDelay false
+    ENDFOR
+ENDTASK
+
+TASK ModelThreeSensors__Sensor3
+    TASKOP
+    //Local variables
+    
+    //Behavior
+    FOR( ; ; )
+        WRITE ModelThreeSensors__sensorData3 1
+        DELAY 10 ms isActiveDelay false
+    ENDFOR
+ENDTASK
+
diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/input/tmrPattern.tarchi b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/tmrPattern.tarchi
new file mode 100644
index 0000000000000000000000000000000000000000..edc6b1fdd3385da6b13e58be43bfce5a421c1872
--- /dev/null
+++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/tmrPattern.tarchi
@@ -0,0 +1,223 @@
+// Master clock frequency - in MHz
+MASTERCLOCKFREQUENCY 200
+
+NODE BRIDGE BridgeV_Voter
+SET BridgeV_Voter bufferByteSize 4
+SET BridgeV_Voter clockDivider 1
+
+NODE BRIDGE BridgeC_Voter
+SET BridgeC_Voter bufferByteSize 4
+SET BridgeC_Voter clockDivider 1
+
+NODE BRIDGE BridgeB_Voter
+SET BridgeB_Voter bufferByteSize 4
+SET BridgeB_Voter clockDivider 1
+
+NODE BRIDGE BridgeA_Voter
+SET BridgeA_Voter bufferByteSize 4
+SET BridgeA_Voter clockDivider 1
+
+NODE BUS BusVoter
+SET BusVoter byteDataSize 4
+SET BusVoter pipelineSize 1
+SET BusVoter arbitration 0
+SET BusVoter sliceTime 10000
+SET BusVoter burstSize 100
+SET BusVoter privacy public
+SET BusVoter clockDivider 1
+
+NODE BUS BusC
+SET BusC byteDataSize 4
+SET BusC pipelineSize 1
+SET BusC arbitration 0
+SET BusC sliceTime 10000
+SET BusC burstSize 100
+SET BusC privacy public
+SET BusC clockDivider 1
+
+NODE BUS BusB
+SET BusB byteDataSize 4
+SET BusB pipelineSize 1
+SET BusB arbitration 0
+SET BusB sliceTime 10000
+SET BusB burstSize 100
+SET BusB privacy public
+SET BusB clockDivider 1
+
+NODE BUS BusA
+SET BusA byteDataSize 4
+SET BusA pipelineSize 1
+SET BusA arbitration 0
+SET BusA sliceTime 10000
+SET BusA burstSize 100
+SET BusA privacy public
+SET BusA clockDivider 1
+
+NODE CPU user
+SET user nbOfCores 1
+SET user byteDataSize 4
+SET user pipelineSize 5
+SET user goIdleTime 10
+SET user maxConsecutiveIdleCycles 10
+SET user taskSwitchingTime 20
+SET user branchingPredictionPenalty 2
+SET user cacheMiss 5
+SET user schedulingPolicy 0
+SET user sliceTime 10000
+SET user execiTime 1
+SET user execcTime 1
+SET user clockDivider 1
+
+NODE BUS BusV
+SET BusV byteDataSize 4
+SET BusV pipelineSize 1
+SET BusV arbitration 0
+SET BusV sliceTime 10000
+SET BusV burstSize 100
+SET BusV privacy public
+SET BusV clockDivider 1
+
+NODE MEMORY MemoryVoter
+SET MemoryVoter byteDataSize 4
+SET MemoryVoter clockDivider 1
+
+NODE CPU voter
+SET voter nbOfCores 8
+SET voter byteDataSize 4
+SET voter pipelineSize 5
+SET voter goIdleTime 10
+SET voter maxConsecutiveIdleCycles 10
+SET voter taskSwitchingTime 20
+SET voter branchingPredictionPenalty 2
+SET voter cacheMiss 5
+SET voter schedulingPolicy 0
+SET voter sliceTime 10000
+SET voter execiTime 1
+SET voter execcTime 1
+SET voter clockDivider 1
+
+NODE CPU sensorC
+SET sensorC nbOfCores 4
+SET sensorC byteDataSize 4
+SET sensorC pipelineSize 5
+SET sensorC goIdleTime 10
+SET sensorC maxConsecutiveIdleCycles 10
+SET sensorC taskSwitchingTime 20
+SET sensorC branchingPredictionPenalty 2
+SET sensorC cacheMiss 5
+SET sensorC schedulingPolicy 0
+SET sensorC sliceTime 10000
+SET sensorC execiTime 1
+SET sensorC execcTime 1
+SET sensorC clockDivider 1
+
+NODE MEMORY MemoryB
+SET MemoryB byteDataSize 4
+SET MemoryB clockDivider 1
+
+NODE CPU sensorA
+SET sensorA nbOfCores 4
+SET sensorA byteDataSize 4
+SET sensorA pipelineSize 5
+SET sensorA goIdleTime 10
+SET sensorA maxConsecutiveIdleCycles 10
+SET sensorA taskSwitchingTime 20
+SET sensorA branchingPredictionPenalty 2
+SET sensorA cacheMiss 5
+SET sensorA schedulingPolicy 0
+SET sensorA sliceTime 10000
+SET sensorA execiTime 1
+SET sensorA execcTime 1
+SET sensorA clockDivider 1
+
+NODE CPU sensorB
+SET sensorB nbOfCores 4
+SET sensorB byteDataSize 4
+SET sensorB pipelineSize 5
+SET sensorB goIdleTime 10
+SET sensorB maxConsecutiveIdleCycles 10
+SET sensorB taskSwitchingTime 20
+SET sensorB branchingPredictionPenalty 2
+SET sensorB cacheMiss 5
+SET sensorB schedulingPolicy 0
+SET sensorB sliceTime 10000
+SET sensorB execiTime 1
+SET sensorB execcTime 1
+SET sensorB clockDivider 1
+
+NODE MEMORY MemoryC
+SET MemoryC byteDataSize 4
+SET MemoryC clockDivider 1
+
+NODE MEMORY MemoryA
+SET MemoryA byteDataSize 4
+SET MemoryA clockDivider 1
+
+NODE LINK link_BridgeV_Voter_to_BusV
+SET link_BridgeV_Voter_to_BusV node BridgeV_Voter
+SET link_BridgeV_Voter_to_BusV bus BusV
+SET link_BridgeV_Voter_to_BusV priority 0
+NODE LINK link_BridgeV_Voter_to_BusVoter
+SET link_BridgeV_Voter_to_BusVoter node BridgeV_Voter
+SET link_BridgeV_Voter_to_BusVoter bus BusVoter
+SET link_BridgeV_Voter_to_BusVoter priority 0
+NODE LINK link_voter_to_BusVoter
+SET link_voter_to_BusVoter node voter
+SET link_voter_to_BusVoter bus BusVoter
+SET link_voter_to_BusVoter priority 0
+NODE LINK link_BridgeA_Voter_to_BusVoter
+SET link_BridgeA_Voter_to_BusVoter node BridgeA_Voter
+SET link_BridgeA_Voter_to_BusVoter bus BusVoter
+SET link_BridgeA_Voter_to_BusVoter priority 0
+NODE LINK link_BridgeB_Voter_to_BusVoter
+SET link_BridgeB_Voter_to_BusVoter node BridgeB_Voter
+SET link_BridgeB_Voter_to_BusVoter bus BusVoter
+SET link_BridgeB_Voter_to_BusVoter priority 0
+NODE LINK link_BridgeC_Voter_to_BusVoter
+SET link_BridgeC_Voter_to_BusVoter node BridgeC_Voter
+SET link_BridgeC_Voter_to_BusVoter bus BusVoter
+SET link_BridgeC_Voter_to_BusVoter priority 0
+NODE LINK link_BridgeC_Voter_to_BusC
+SET link_BridgeC_Voter_to_BusC node BridgeC_Voter
+SET link_BridgeC_Voter_to_BusC bus BusC
+SET link_BridgeC_Voter_to_BusC priority 0
+NODE LINK link_BridgeB_Voter_to_BusB
+SET link_BridgeB_Voter_to_BusB node BridgeB_Voter
+SET link_BridgeB_Voter_to_BusB bus BusB
+SET link_BridgeB_Voter_to_BusB priority 0
+NODE LINK link_BridgeA_Voter_to_BusA
+SET link_BridgeA_Voter_to_BusA node BridgeA_Voter
+SET link_BridgeA_Voter_to_BusA bus BusA
+SET link_BridgeA_Voter_to_BusA priority 0
+NODE LINK link_user_to_BusV
+SET link_user_to_BusV node user
+SET link_user_to_BusV bus BusV
+SET link_user_to_BusV priority 0
+NODE LINK link_MemoryC_to_BusC
+SET link_MemoryC_to_BusC node MemoryC
+SET link_MemoryC_to_BusC bus BusC
+SET link_MemoryC_to_BusC priority 0
+NODE LINK link_MemoryB_to_BusB
+SET link_MemoryB_to_BusB node MemoryB
+SET link_MemoryB_to_BusB bus BusB
+SET link_MemoryB_to_BusB priority 0
+NODE LINK link_sensorC_to_BusC
+SET link_sensorC_to_BusC node sensorC
+SET link_sensorC_to_BusC bus BusC
+SET link_sensorC_to_BusC priority 0
+NODE LINK link_sensorB_to_BusB
+SET link_sensorB_to_BusB node sensorB
+SET link_sensorB_to_BusB bus BusB
+SET link_sensorB_to_BusB priority 0
+NODE LINK link_MemoryA_to_BusA
+SET link_MemoryA_to_BusA node MemoryA
+SET link_MemoryA_to_BusA bus BusA
+SET link_MemoryA_to_BusA priority 0
+NODE LINK link_sensorA_to_BusA
+SET link_sensorA_to_BusA node sensorA
+SET link_sensorA_to_BusA bus BusA
+SET link_sensorA_to_BusA priority 0
+NODE LINK link_MemoryVoter_to_BusV
+SET link_MemoryVoter_to_BusV node MemoryVoter
+SET link_MemoryVoter_to_BusV bus BusV
+SET link_MemoryVoter_to_BusV priority 0
diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/input/tmrPattern.tmap b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/tmrPattern.tmap
new file mode 100644
index 0000000000000000000000000000000000000000..6db66f5cded5b3fac1e99da09800b2a2a401be13
--- /dev/null
+++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/tmrPattern.tmap
@@ -0,0 +1,70 @@
+TMLSPEC
+    #include "tmrPattern.tml"
+ENDTMLSPEC
+
+TMLARCHI
+    #include "tmrPattern.tarchi"
+ENDTMLARCHI
+
+TMLMAPPING
+    MAP user TMR__User
+    SET TMR__User priority 0
+    MAP voter TMR__Timer
+    SET TMR__Timer priority 0
+    MAP voter TMR__Voter
+    SET TMR__Voter priority 0
+    MAP voter TMR__InterpreterA
+    SET TMR__InterpreterA priority 0
+    MAP voter TMR__InterpreterB
+    SET TMR__InterpreterB priority 0
+    MAP voter TMR__InterpreterC
+    SET TMR__InterpreterC priority 0
+    MAP sensorC TMR__SensorC
+    SET TMR__SensorC priority 0
+    MAP sensorA TMR__SensorA
+    SET TMR__SensorA priority 0
+    MAP sensorB TMR__SensorB
+    SET TMR__SensorB priority 0
+    MAP MemoryVoter TMR__resultData
+    SET TMR__resultData priority 0
+    MAP BusV TMR__resultData
+    SET TMR__resultData priority 0
+    MAP BusVoter TMR__resultData
+    SET TMR__resultData priority 0
+    MAP MemoryVoter TMR__resA
+    SET TMR__resA priority 0
+    MAP BusV TMR__resA
+    SET TMR__resA priority 0
+    MAP BusVoter TMR__resA
+    SET TMR__resA priority 0
+    MAP MemoryVoter TMR__resC
+    SET TMR__resC priority 0
+    MAP BusV TMR__resC
+    SET TMR__resC priority 0
+    MAP BusVoter TMR__resC
+    SET TMR__resC priority 0
+    MAP MemoryVoter TMR__resB
+    SET TMR__resB priority 0
+    MAP BusV TMR__resB
+    SET TMR__resB priority 0
+    MAP BusVoter TMR__resB
+    SET TMR__resB priority 0
+    MAP MemoryB TMR__dataB
+    SET TMR__dataB priority 0
+    MAP BusB TMR__dataB
+    SET TMR__dataB priority 0
+    MAP BusVoter TMR__dataB
+    SET TMR__dataB priority 0
+    MAP MemoryC TMR__dataC
+    SET TMR__dataC priority 0
+    MAP BusC TMR__dataC
+    SET TMR__dataC priority 0
+    MAP BusVoter TMR__dataC
+    SET TMR__dataC priority 0
+    MAP MemoryA TMR__dataA
+    SET TMR__dataA priority 0
+    MAP BusA TMR__dataA
+    SET TMR__dataA priority 0
+    MAP BusVoter TMR__dataA
+    SET TMR__dataA priority 0
+ENDTMLMAPPING
diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/input/tmrPattern.tml b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/tmrPattern.tml
new file mode 100644
index 0000000000000000000000000000000000000000..07c6f5831a0d9f8ddd7a2641fe73e9cecf5233ee
--- /dev/null
+++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/tmrPattern.tml
@@ -0,0 +1,190 @@
+// TML Application - FORMAT 0.2
+// Application: tmrPattern.xml
+// Generated: Sat Nov 11 15:19:32 CET 2023
+
+// PRAGMAS
+
+// Channels
+CHANNEL TMR__dataA BRBW 8 8 OUT TMR__SensorA IN TMR__InterpreterA
+VCCHANNEL TMR__dataA 0
+CONFCHANNEL TMR__dataA
+AUTHCHANNEL TMR__dataA
+CHANNEL TMR__dataB BRBW 8 8 OUT TMR__SensorB IN TMR__InterpreterB
+VCCHANNEL TMR__dataB 0
+CONFCHANNEL TMR__dataB
+AUTHCHANNEL TMR__dataB
+CHANNEL TMR__dataC BRBW 8 8 OUT TMR__SensorC IN TMR__InterpreterC
+VCCHANNEL TMR__dataC 0
+CONFCHANNEL TMR__dataC
+AUTHCHANNEL TMR__dataC
+CHANNEL TMR__resA BRBW 8 8 OUT TMR__InterpreterA IN TMR__Voter
+VCCHANNEL TMR__resA 0
+CONFCHANNEL TMR__resA
+AUTHCHANNEL TMR__resA
+CHANNEL TMR__resB BRBW 8 8 OUT TMR__InterpreterB IN TMR__Voter
+VCCHANNEL TMR__resB 0
+CONFCHANNEL TMR__resB
+AUTHCHANNEL TMR__resB
+CHANNEL TMR__resC BRBW 8 8 OUT TMR__InterpreterC IN TMR__Voter
+VCCHANNEL TMR__resC 0
+CONFCHANNEL TMR__resC
+AUTHCHANNEL TMR__resC
+CHANNEL TMR__resultData BRBW 8 8 OUT TMR__Voter IN TMR__User
+VCCHANNEL TMR__resultData 0
+CONFCHANNEL TMR__resultData
+AUTHCHANNEL TMR__resultData
+
+// Events
+EVENT TMR__evtA__TMR__evtA() NIB 8 TMR__InterpreterA TMR__Voter
+EVENT TMR__evtB__TMR__evtB() NIB 8 TMR__InterpreterB TMR__Voter
+EVENT TMR__evtC__TMR__evtC() NIB 8 TMR__InterpreterC TMR__Voter
+EVENT TMR__evtTimeout__TMR__evtTimeout() NIB 8 TMR__Timer TMR__Voter
+EVENT TMR__moveto_FAIL_SAFE__TMR__moveto_FAIL_SAFE(bool) NIB 8 TMR__Voter TMR__User
+
+// Requests
+
+TASK TMR__InterpreterA
+    TASKOP
+    //Local variables
+    int size = 50
+    int sizeA = 10
+    
+    //Behavior
+    READ TMR__dataA size
+    EXECC size
+    NOTIFY TMR__evtA__TMR__evtA
+    WRITE TMR__resA sizeA
+ENDTASK
+
+TASK TMR__InterpreterB
+    TASKOP
+    //Local variables
+    int size = 50
+    int sizeB = 10
+    
+    //Behavior
+    READ TMR__dataB size
+    EXECC size
+    NOTIFY TMR__evtB__TMR__evtB
+    WRITE TMR__resB sizeB
+ENDTASK
+
+TASK TMR__InterpreterC
+    TASKOP
+    //Local variables
+    int size = 50
+    int sizeC = 10
+    
+    //Behavior
+    READ TMR__dataC size
+    EXECC size
+    NOTIFY TMR__evtC__TMR__evtC
+    WRITE TMR__resC sizeC
+ENDTASK
+
+TASK TMR__SensorA
+    TASKOP
+    //Local variables
+    int size = 50
+    
+    //Behavior
+    WRITE TMR__dataA size
+ENDTASK
+
+TASK TMR__SensorB
+    TASKOP
+    //Local variables
+    int size = 50
+    
+    //Behavior
+    WRITE TMR__dataB size
+ENDTASK
+
+TASK TMR__SensorC
+    TASKOP
+    //Local variables
+    int size = 50
+    
+    //Behavior
+    WRITE TMR__dataC size
+ENDTASK
+
+TASK TMR__Timer
+    TASKOP
+    //Local variables
+    int dataReceivingTimeout = 2500
+    
+    //Behavior
+    DELAY dataReceivingTimeout ns isActiveDelay false
+    NOTIFY TMR__evtTimeout__TMR__evtTimeout
+ENDTASK
+
+TASK TMR__User
+    TASKOP
+    //Local variables
+    bool x
+    
+    //Behavior
+    WAIT TMR__moveto_FAIL_SAFE__TMR__moveto_FAIL_SAFE x
+    READ TMR__resultData 1
+ENDTASK
+
+TASK TMR__Voter
+    TASKOP
+    //Local variables
+    bool x
+    int interpreteTime = 5
+    bool dataProcessed = false
+    int indexA = 0
+    int indexB = 0
+    int indexC = 0
+    int sizeA = 10
+    int sizeB = 10
+    int sizeC = 10
+    int i = 0
+    
+    //Behavior
+    FOR(i=0; i<3; )
+        SELECTEVT
+            CASE TMR__evtTimeout__TMR__evtTimeout
+                i=3
+            ENDCASE
+            CASE TMR__evtC__TMR__evtC
+                READ TMR__resC sizeC
+                indexC=indexC+1
+                IF (indexC==1)
+                    i=i+1
+                ELSE
+                ENDIF
+            ENDCASE
+            CASE TMR__evtB__TMR__evtB
+                READ TMR__resB sizeB
+                indexB=indexB+1
+                IF (indexB==1)
+                    i=i+1
+                ELSE
+                ENDIF
+            ENDCASE
+            CASE TMR__evtA__TMR__evtA
+                READ TMR__resA sizeA
+                indexA=indexA+1
+                IF (indexA==1)
+                    i=i+1
+                ELSE
+                ENDIF
+            ENDCASE
+        ENDSELECTEVT
+    ENDFOR
+    EXECC interpreteTime
+    RAND
+        CASERAND 50
+            x=true
+        ENDCASERAND
+        CASERAND 50
+            x=false
+        ENDCASERAND
+    ENDRAND
+    NOTIFY TMR__moveto_FAIL_SAFE__TMR__moveto_FAIL_SAFE x
+    WRITE TMR__resultData 1
+ENDTASK
+