diff --git a/src/main/java/avatartranslator/toproverif/AVATAR2ProVerif.java b/src/main/java/avatartranslator/toproverif/AVATAR2ProVerif.java
index 69eb54cfa615ccfd3114eafb5dcd9b91340f9cd9..932a74073f476b904837c299c1bcb87c231b266c 100755
--- a/src/main/java/avatartranslator/toproverif/AVATAR2ProVerif.java
+++ b/src/main/java/avatartranslator/toproverif/AVATAR2ProVerif.java
@@ -557,6 +557,7 @@ public class AVATAR2ProVerif implements AvatarTranslator {
 
                 String varName = AVATAR2ProVerif.translateTerm (trueAttr, null);
                 this.spec.addDeclaration (new ProVerifQueryAtt   (varName, true));
+                
                 TraceManager.addDev("|    attacker (" + varName + ")"); 
 
                 this.secrecyChecked.add (trueAttr);
@@ -1255,7 +1256,9 @@ public class AVATAR2ProVerif implements AvatarTranslator {
 
                         if (this.secrecyChecked.contains (attr)) {
                             UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, "'" + attr.getName () + "' is re-assigned while its secrecy is being checked. Note that the proof will only guarantee the secrecy of the initial value of " + attr.getName () + ".");
-                            ce.setTDiagramPanel(((AvatarDesignPanel)(this.avspec.getReferenceObject())).getAvatarSMDPanel(arg.block.getName()));
+                            if (this.avspec.getReferenceObject() instanceof AvatarDesignPanel){
+	                            ce.setTDiagramPanel(((AvatarDesignPanel)(this.avspec.getReferenceObject())).getAvatarSMDPanel(arg.block.getName()));
+	                        }
                             ce.setTGComponent((TGComponent)(_asme.getReferenceObject()));
                             this.warnings.add(ce);
                         }
diff --git a/src/main/java/dseengine/DSEConfiguration.java b/src/main/java/dseengine/DSEConfiguration.java
index d8cf3eb5f2712bb6735890c39f0333f438471529..7e61f1c9783ebc185febd9e5760e7adee73a4278 100755
--- a/src/main/java/dseengine/DSEConfiguration.java
+++ b/src/main/java/dseengine/DSEConfiguration.java
@@ -1501,7 +1501,7 @@ public class DSEConfiguration implements Runnable  {
                 // TraceManager.addDev("tmlcdp " + tmlcdp);
                 //
                 //Repeat for secured mapping
-                TMLMapping<TGComponent> secMapping = mainGUI.gtm.autoSecure(mainGUI, "mapping" +(cpt-1),tmla, newArch, encComp, overhead, decComp,true,false,false);
+                TMLMapping<TGComponent> secMapping = mainGUI.gtm.autoSecure(mainGUI, "mapping" +(cpt-1),tmla, newArch, encComp, overhead, decComp,true,false,false, new HashMap<String, java.util.List<String>>());
 
                 //Run simulations on this mapping
                 if (generateAndCompileMappingCode(secMapping, _debug, _optimize)  >= 0) {
diff --git a/src/main/java/proverifspec/ProVerifOutputAnalyzer.java b/src/main/java/proverifspec/ProVerifOutputAnalyzer.java
index aa392822f91be29e2125df94a54457c0701e465d..cbdda1594ad0b1831fc3f34333b3ff9feef064b5 100644
--- a/src/main/java/proverifspec/ProVerifOutputAnalyzer.java
+++ b/src/main/java/proverifspec/ProVerifOutputAnalyzer.java
@@ -166,6 +166,8 @@ public class ProVerifOutputAnalyzer {
                 {
                     // Remove 'RESULT ' at the begining
                     str = str.substring(7);
+                    
+                    
                     ProVerifQueryResult result = new ProVerifQueryResult(true, true);
 
                     // This concerns an enteringState event
@@ -246,7 +248,9 @@ public class ProVerifOutputAnalyzer {
                             {
                                 if (pragma instanceof AvatarPragmaSecret)
                                 {
+
                                     String trueName = this.avatar2proverif.getTrueName(((AvatarPragmaSecret) pragma).getArg());
+                                    
                                     if (trueName != null && trueName.equals(attributeName))
                                     {
                                         this.results.put(pragma, result);
diff --git a/src/main/java/tmltranslator/TMLModeling.java b/src/main/java/tmltranslator/TMLModeling.java
index 89a1779d5d8200a704de478ae8ade221c37bb673..31b7ead148bda8a7ed2ee2405933d96172a3b3cd 100755
--- a/src/main/java/tmltranslator/TMLModeling.java
+++ b/src/main/java/tmltranslator/TMLModeling.java
@@ -44,6 +44,7 @@ package tmltranslator;
 import avatartranslator.AvatarAttribute;
 import avatartranslator.AvatarPragmaAuthenticity;
 import avatartranslator.AvatarPragmaSecret;
+import avatartranslator.AvatarPragmaReachability;
 import myutil.Conversion;
 import myutil.TraceManager;
 import proverifspec.ProVerifOutputAnalyzer;
@@ -760,6 +761,7 @@ public class TMLModeling<E> {
         Map<AvatarPragmaSecret, ProVerifQueryResult> confResults = pvoa.getConfidentialityResults();
 
         for (AvatarPragmaSecret pragma: confResults.keySet()) {
+        //	System.out.println("pragma "  +pragma);
             ProVerifQueryResult result = confResults.get(pragma);
             if (!result.isProved())
                 continue;
@@ -768,9 +770,40 @@ public class TMLModeling<E> {
             AvatarAttribute attr = pragma.getArg();
 
             TMLChannel channel = getChannelByShortName(attr.getName().replaceAll("_chData",""));
+            boolean invalidate=false;
+            //If an attribute is confidential because it has never been sent on that channel, do not backtrace that result since it is misleading
             if (channel!=null){
+            	//Mark the result only if the writechannel operator is reachable
+            	Map<AvatarPragmaReachability, ProVerifQueryResult> reachResults = pvoa.getReachabilityResults();
+            	if (reachResults.size()>0){
+	            	for (AvatarPragmaReachability reachPragma: reachResults.keySet()){
+    	        		if (reachPragma.getState().getName().equals("aftersignalstate_reachannel_"+channel.getName())){
+    	        			if (!reachResults.get(reachPragma).isSatisfied()){
+    	        				invalidate=true;
+    	        			}	
+            			}
+            		}
+            	}
+            	//Next check if there exists a writechannel operator that sends unencrypted data
+            	boolean found=false;
+            	for (TMLTask task: getTasks()){
+            		TMLActivity act = task.getActivityDiagram();
+            		for (TMLActivityElement elem: act.getElements()){
+            			if (elem instanceof TMLWriteChannel){
+            				TMLWriteChannel wr = (TMLWriteChannel) elem;
+            				if(wr.getChannel(0).getName().equals(channel.getName())){
+            					if (wr.securityPattern==null){
+            						found=true;
+            					}
+            				}
+            			}
+            		}
+            	}
+            	if (!found){
+            		invalidate=true;
+            	}
                 for (TMLCPrimitivePort port:channel.ports){
-                    if (port.checkConf){
+                    if (port.checkConf && !invalidate){
                         port.checkConfStatus = r;
                         port.mappingName= mappingName;
                     }
@@ -796,6 +829,7 @@ public class TMLModeling<E> {
                     ev.port2.mappingName=mappingName;
                 }
             }
+            
             List<String> channels=secChannelMap.get(attr.getName());
             if (channels != null) {
                 for (String channelName: channels) {
@@ -810,7 +844,7 @@ public class TMLModeling<E> {
                     }
                 }
             }
-            for (TMLTask t:getTasks()){
+            /*for (TMLTask t:getTasks()){
                 if (t.getReferenceObject()==null){
                     continue;
                 }
@@ -821,7 +855,7 @@ public class TMLModeling<E> {
                         if (a.getId().equals(attr.getName()))
                             a.setConfidentialityVerification(result.isSatisfied() ? TAttribute.CONFIDENTIALITY_OK : TAttribute.CONFIDENTIALITY_KO);
                 }
-            }
+            }*/
         }
     }
 	public TGComponent getTGComponent(){
@@ -978,7 +1012,7 @@ public class TMLModeling<E> {
                         }
                     }
                     signalName = s.toString().split("__decrypt")[0];
-                    TraceManager.addDev("signalName " +signalName);
+
                     /*for (TMLTask t: getTasks()){
                       if (signalName.contains(t.getName())){
                       signalName = signalName.replace(t.getName()+"__","");
diff --git a/src/main/java/tmltranslator/TMLTextSpecification.java b/src/main/java/tmltranslator/TMLTextSpecification.java
index 61d13dea36d765567c8c9a609a2b566dd1c26973..b3fcddaba73fd4e0277b54d1e2770ffcade42e58 100755
--- a/src/main/java/tmltranslator/TMLTextSpecification.java
+++ b/src/main/java/tmltranslator/TMLTextSpecification.java
@@ -47,11 +47,17 @@ import myutil.FileException;
 import myutil.FileUtils;
 import myutil.TraceManager;
 
+import tmltranslator.SecurityPattern;
+
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.StringReader;
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.Map;
+import java.util.HashMap;
+
+
 
 import common.SpecConfigTTool;
 
@@ -68,6 +74,15 @@ public class TMLTextSpecification<E> {
     public final static String CR2 = "\n\n";
     public final static String SC = ";";
     public final static String C = ",";
+    
+    
+	public final static String AENCRYPT="AE";
+	public final static String SENCRYPT="SE";
+	public final static String MAC="MAC";
+	public final static String NONCE="NONCE";
+	public final static String HASH="HASH";
+	public final static String ADV="ADV";
+	
 
     private String spec;
     private String title;
@@ -85,6 +100,8 @@ public class TMLTextSpecification<E> {
     private TMLActivityElement tmlae;
     private ArrayList<TMLParserSaveElt> parses;
 
+    private Map<String, SecurityPattern> securityPatternMap = new HashMap<String, SecurityPattern>();
+
     private static String keywords[] = {"BOOL", "INT", "NAT", "CHANNEL", "EVENT", "REQUEST", "LOSSYCHANNEL", "LOSSYEVENT", "LOSSYREQUEST", "BRBW", "NBRNBW",
                                         "BRNBW", "INF", "NIB", "NINB", "TASK", "ENDTASK", "IF", "ELSE", "ORIF", "ENDIF", "FOR", "ENDFOR",
                                         "SELECTEVT", "CASE", "ENDSELECTEVT", "ENDCASE", "WRITE", "READ", "WAIT", "NOTIFY", "NOTIFIED", "RAND", "CASERAND", "ENDRAND", "ENDCASERAND", "EXECI", "EXECC", "DELAY", "RANDOM",
@@ -96,6 +113,10 @@ public class TMLTextSpecification<E> {
     private String beginArray[] = {"TASK", "FOR", "IF", "ELSE", "ORIF", "SELECTEVT", "CASE", "RAND", "CASERAND", "RANDOMSEQ", "SEQ"};
     private String endArray[] = {"ENDTASK", "ENDFOR", "ENDIF", "ELSE", "ORIF", "ENDSELECTEVT", "ENDCASE", "ENDRAND", "ENDCASERAND", "ENDRANDOMSEQ", "ENDSEQ"};
 
+// New argument to be added on EXECC for security: CC_name Type Encrypt_complexity Decrypt_Complexity Overhead Size Nonce Key
+// New argument on Read/Write Channels: CC_name
+
+
     public TMLTextSpecification(String _title) {
         title = _title;
     }
@@ -185,16 +206,23 @@ public class TMLTextSpecification<E> {
     public String toString() {
         return spec;
     }
+    
+
 
     public String toTextFormat(TMLModeling<E> tmlm) {
 	tmlm.removeForksAndJoins();
         tmlm.sortByName();
         spec = makeDeclarations(tmlm);
+        //Set up Cryptographic Configurations
+        
         spec += makeTasks(tmlm);
         indent();
         return spec;
     }
 
+
+
+
     public String makeDeclarations(TMLModeling<E> tmlm) {
         int i;
         String sb = "";
@@ -344,7 +372,31 @@ public class TMLTextSpecification<E> {
             return code + makeBehavior(task, elt.getNextElement(0));
 
         } else if (elt instanceof TMLExecC) {
-            code = "EXECC" + SP + modifyString(((TMLExecC)elt).getAction()) + CR;
+        	if (elt.securityPattern==null){
+	            code = "EXECC" + SP + modifyString(((TMLExecC)elt).getAction()) + CR;
+	        }
+	        else {
+	        	String type="";
+	        	if (elt.securityPattern.type.equals("Asymmetric Encryption")){
+	        		type = AENCRYPT;
+	        	}
+	        	else if (elt.securityPattern.type.equals("Symmetric Encryption")){
+	        		type = SENCRYPT;
+	        	}
+	        	else if (elt.securityPattern.type.equals("MAC")){
+	        		type = MAC;
+	        	}
+	        	else if (elt.securityPattern.type.equals("Nonce")){
+	        		type = NONCE;
+	        	}
+	        	else if (elt.securityPattern.type.equals("Hash")){
+	        		type = HASH;
+	        	}	        		        	
+	        	else {
+	        		type = ADV;
+	        	}	        	
+	        	code = "EXECC" + SP +  modifyString(((TMLExecC)elt).getAction()) + SP + elt.securityPattern.name + SP + type + SP + elt.securityPattern.encTime + SP + elt.securityPattern.decTime + SP + elt.securityPattern.overhead + SP + elt.securityPattern.size + SP + elt.securityPattern.nonce + SP + elt.securityPattern.key+   CR;
+	        }
             return code + makeBehavior(task, elt.getNextElement(0));
 
         } else if (elt instanceof TMLExecCInterval) {
@@ -387,12 +439,23 @@ public class TMLTextSpecification<E> {
             for(int k=0; k<tmlch.getNbOfChannels(); k++) {
                 code = code + tmlch.getChannel(k).getName() + SP;
             }
-            code = code + modifyString(tmlch.getNbOfSamples()) + CR;
+            code = code + modifyString(tmlch.getNbOfSamples());
+            if (elt.securityPattern!=null){
+            	code = code + SP + elt.securityPattern.name + CR;
+            }
+            else {
+            	code = code + CR;
+            }
             return code + makeBehavior(task, elt.getNextElement(0));
 
         } else if (elt instanceof TMLReadChannel) {
             tmlch = (TMLActivityElementChannel)elt;
-            code = "READ " + tmlch.getChannel(0).getName() + SP + modifyString(tmlch.getNbOfSamples()) + CR;
+            if (elt.securityPattern==null){      
+            	code = "READ " + tmlch.getChannel(0).getName() + SP + modifyString(tmlch.getNbOfSamples()) + CR;
+            }
+            else {
+            	code = "READ " + tmlch.getChannel(0).getName() + SP + modifyString(tmlch.getNbOfSamples()) + SP + elt.securityPattern.name + CR;     	
+            }
             return code + makeBehavior(task, elt.getNextElement(0));
 
         } else if (elt instanceof TMLSendEvent) {
@@ -595,6 +658,35 @@ public class TMLTextSpecification<E> {
 
         parses = new ArrayList<TMLParserSaveElt>();
 
+		//Start by reading once and creating all Cryptographic Configuration
+		 try {
+            while((s = br.readLine()) != null) {
+                if (s != null) {
+                    s = s.trim();
+                    //TraceManager.addDev("s=" + s);
+                    s = removeUndesiredWhiteSpaces(s, lineNb);
+                    s1 = Conversion.replaceAllString(s, "\t", " ");
+                    s1 = Conversion.replaceRecursiveAllString(s1, "  ", " ");
+                    //TraceManager.addDev("s1=" + s1);
+                    if (s1 != null) {
+                        split = s1.split("\\s");
+                        if (split.length > 0) {
+                            findSec(split);
+                            
+                        }
+                    }
+
+                    lineNb++;
+                }
+            }
+		
+		} catch (Exception e){
+            TraceManager.addError("Exception when reading specification: " + e.getMessage());
+            addError(0, lineNb, 0, "Exception when reading specification");
+		}
+		
+		lineNb=0;
+		br = new BufferedReader(new StringReader(spec));
         try {
             while((s = br.readLine()) != null) {
                 if (s != null) {
@@ -622,6 +714,38 @@ public class TMLTextSpecification<E> {
         }
     }
 
+	public void findSec(String[] _split){
+		if (isInstruction(_split[0],"EXECC")){
+			if (_split.length>4){
+				String ccName = _split[3];
+				String type = _split[4];
+				String stringType="";
+				if (type.equals(AENCRYPT)){
+					stringType="Symmetric Encryption";		
+				}
+				else if (type.equals(SENCRYPT)){
+					stringType="Symmetric Encryption";
+				}
+				else if (type.equals(HASH)){
+					stringType = "Hash";
+				}
+				else if (type.equals(MAC)){
+					stringType = "MAC";
+				}
+				else if (type.equals(NONCE)){
+					stringType = "Nonce";
+				}
+				else if (type.equals(ADV)){
+					stringType = "Advanced";
+				}
+				if (!stringType.equals("")){
+					SecurityPattern sp = new SecurityPattern(ccName, stringType, _split[6], _split[7], _split[4], _split[5], _split[8], "", _split[9]);
+					securityPatternMap.put(ccName, sp);
+				}
+			}
+		}
+	}
+
     public void addError(int _type, int _lineNb, int _charNb, String _msg) {
         TMLTXTError error = new TMLTXTError(_type);
         error.lineNb = _lineNb;
@@ -1213,8 +1337,8 @@ public class TMLTextSpecification<E> {
             inTaskDec = false;
          //   inTaskBehavior = true;
 
-            if (_split.length != 3) {
-                error = "A READ operation must be declared with exactly 3 parameters, and not " + (_split.length - 1) ;
+            if (_split.length != 3 && _split.length!= 4) {
+                error = "A READ operation must be declared with exactly 3 or 4 parameters, and not " + (_split.length - 1) ;
                 addError(0, _lineNb, 0, error);
                 return -1;
             }
@@ -1245,6 +1369,13 @@ public class TMLTextSpecification<E> {
             tmlrch.setNbOfSamples(_split[2]);
             task.getActivityDiagram().addElement(tmlrch);
             tmlae.addNext(tmlrch);
+                        
+            if (_split.length==4){
+            	if (securityPatternMap.containsKey(_split[3])){
+            		tmlrch.securityPattern = securityPatternMap.get(_split[3]); 
+            	}
+			}		
+            
             tmlae = tmlrch;
 
         } // READ
@@ -1263,8 +1394,10 @@ public class TMLTextSpecification<E> {
             inTaskDec = false;
          //   inTaskBehavior = true;
 
-            if (_split.length < 3) {
-                error = "A WRITE operation must be declared with at most 3 parameters, and not " + (_split.length - 1) ;
+	
+			
+            if (_split.length > 5 || _split.length <2) {
+                error = "A WRITE operation must be declared with at most 4 parameters, and not " + (_split.length - 1) ;
                 addError(0, _lineNb, 0, error);
                 return -1;
             }
@@ -1275,29 +1408,56 @@ public class TMLTextSpecification<E> {
 
 	    //TraceManager.addDev("Handling write channel 1");
             TMLWriteChannel tmlwch = new TMLWriteChannel(_split[1], null);
-            for(int k=0; k<_split.length-2; k++) {
-		//TraceManager.addDev("Handling write channel 1.1");
-                ch = tmlm.getChannelByName(_split[1+k]);
-                if (ch == null ){
-                    error = "Undeclared channel: " +  _split[1+k];
-                    addError(0, _lineNb, 0, error);
-                    return -1;
-                }
-		//TraceManager.addDev("Handling write channel 1.2 for task: " + task.getName());
-                if (!(ch.hasOriginTask(task))){		    
-		    error = "WRITE operations must be done only in origin task(s). Should be in task(s): " + ch.getNameOfOriginTasks();		    
-                    addError(0, _lineNb, 0, error);
-                    return -1;
-                }
-		//TraceManager.addDev("Handling write channel 1.3");
-
-                tmlwch.addChannel(ch);
-            }
-
-	    //TraceManager.addDev("Handling write channel 2");
+            if (_split.length>3){
+            	if (securityPatternMap.containsKey(_split[_split.length-1])){
+            		tmlwch.securityPattern = securityPatternMap.get(_split[_split.length-1]); 
+            	}
+            	for(int k=0; k<_split.length-3; k++) {
+				//TraceManager.addDev("Handling write channel 1.1");
+                	ch = tmlm.getChannelByName(_split[1+k]);
+                	if (ch == null ){
+                    	error = "Undeclared channel: " +  _split[1+k];
+                   		addError(0, _lineNb, 0, error);
+                    	return -1;
+                	}
+					//TraceManager.addDev("Handling write channel 1.2 for task: " + task.getName());
+                	if (!(ch.hasOriginTask(task))){		    
+		    		error = "WRITE operations must be done only in origin task(s). Should be in task(s): " + ch.getNameOfOriginTasks();		    
+                	    addError(0, _lineNb, 0, error);
+                	    return -1;
+                	}
+					//TraceManager.addDev("Handling write channel 1.3");
+
+                	tmlwch.addChannel(ch);
+            	}
+			}		    
+            else {
+            
+            	for(int k=0; k<_split.length-2; k++) {
+				//TraceManager.addDev("Handling write channel 1.1");
+                	ch = tmlm.getChannelByName(_split[1+k]);
+                	if (ch == null ){
+                    	error = "Undeclared channel: " +  _split[1+k];
+                   		addError(0, _lineNb, 0, error);
+                    	return -1;
+                	}
+					//TraceManager.addDev("Handling write channel 1.2 for task: " + task.getName());
+                	if (!(ch.hasOriginTask(task))){		    
+		    		error = "WRITE operations must be done only in origin task(s). Should be in task(s): " + ch.getNameOfOriginTasks();		    
+                	    addError(0, _lineNb, 0, error);
+                	    return -1;
+                	}
+					//TraceManager.addDev("Handling write channel 1.3");
+
+                	tmlwch.addChannel(ch);
+            	}
+			}
+	    	//TraceManager.addDev("Handling write channel 2");
             tmlwch.setNbOfSamples(_split[2]);
             task.getActivityDiagram().addElement(tmlwch);
             tmlae.addNext(tmlwch);
+            
+
             tmlae = tmlwch;
 
         } // WRITE
@@ -2301,26 +2461,37 @@ public class TMLTextSpecification<E> {
             inTask = true;
             inTaskDec = false;
       //     inTaskBehavior = true;
-
-            if ((_split.length < 2) ||(_split.length > 4)) {
-                error = "An EXECC operation must be declared with 1 or 2 parameters, and not " + (_split.length - 1) ;
-                addError(0, _lineNb, 0, error);
-                return -1;
-            }
-
-            if (_split.length == 2) {
-                TMLExecC execc = new TMLExecC("execc", null);
-                execc.setAction(_split[1]);
-                tmlae.addNext(execc);
-                task.getActivityDiagram().addElement(execc);
-                tmlae = execc;
-            } else {
-                TMLExecCInterval execci = new TMLExecCInterval("execci", null);
-                execci.setMinDelay(_split[1]);
-                execci.setMaxDelay(_split[2]);
-                tmlae.addNext(execci);
-                task.getActivityDiagram().addElement(execci);
-                tmlae = execci;
+      		if (_split.length>4){
+ 				if (securityPatternMap.containsKey(_split[2])){
+ 					//Security operation
+ 					TMLExecC execc = new TMLExecC("execc", null);
+            	    execc.setAction(_split[1]);
+            	    execc.securityPattern = securityPatternMap.get(_split[2]);
+            	    tmlae.addNext(execc);
+            	    task.getActivityDiagram().addElement(execc);
+            	    tmlae = execc;
+ 				}
+ 			}
+			else {
+	            if ((_split.length < 2) ||(_split.length > 4)) {
+	                error = "An EXECC operation must be declared with 1, 2 parameters, and not " + (_split.length - 1) ;
+	                addError(0, _lineNb, 0, error);
+	                return -1;
+	            }
+            	if (_split.length == 2) {
+            	    TMLExecC execc = new TMLExecC("execc", null);
+            	    execc.setAction(_split[1]);
+            	    tmlae.addNext(execc);
+            	    task.getActivityDiagram().addElement(execc);
+            	    tmlae = execc;
+            	} else {
+            	    TMLExecCInterval execci = new TMLExecCInterval("execci", null);
+            	    execci.setMinDelay(_split[1]);
+            	    execci.setMaxDelay(_split[2]);
+            	    tmlae.addNext(execci);
+            	    task.getActivityDiagram().addElement(execci);
+            	    tmlae = execci;
+            	}
             }
         } // EXECC
 
diff --git a/src/main/java/tmltranslator/toavatar/TML2Avatar.java b/src/main/java/tmltranslator/toavatar/TML2Avatar.java
index 5f07b740da043ca8dae91cb23f5027c1f4b020d9..8ef89d096b5ac82891979a58d7062d503ed7cf05 100644
--- a/src/main/java/tmltranslator/toavatar/TML2Avatar.java
+++ b/src/main/java/tmltranslator/toavatar/TML2Avatar.java
@@ -1675,497 +1675,519 @@ public class TML2Avatar {
 							tran.addNext(newStart);
 						}*/
 
-                }
-
-
-                asm.setStartState(ss);
-
-            } else {
-                //Not requested
-                List<AvatarStateMachineElement> elementList = translateState(task.getActivityDiagram().get(0), block);
-                for (AvatarStateMachineElement e : elementList) {
-                    e.setName(processName(e.getName(), e.getID()));
-                    asm.addElement(e);
-                    stateObjectMap.put(task.getName().split("__")[1] + "__" + e.getName(), e.getReferenceObject());
-                }
-                asm.setStartState((AvatarStartState) elementList.get(0));
-            }
-            for (SecurityPattern secPattern : secPatterns) {
-                AvatarAttribute sec = new AvatarAttribute(secPattern.name, AvatarType.INTEGER, block, null);
-                AvatarAttribute enc = new AvatarAttribute(secPattern.name + "_encrypted", AvatarType.INTEGER, block, null);
-                block.addAttribute(sec);
-                block.addAttribute(enc);
-                avspec.addPragma(new AvatarPragmaSecret("#Confidentiality " + block.getName() + "." + secPattern.name, null, sec));
-            }
-
-        }
-
-
-        //Add authenticity pragmas
-        for (String s : signalAuthOriginMap.keySet()) {
-            if (signalAuthDestMap.containsKey(s)) {
-                AvatarPragmaAuthenticity pragma = new AvatarPragmaAuthenticity("#Authenticity " + signalAuthOriginMap.get(s).getName() + " " + signalAuthDestMap.get(s).getName(), signalAuthOriginMap.get(s).getReferenceObject(), signalAuthOriginMap.get(s), signalAuthDestMap.get(s));
-                //TraceManager.addDev("adding pragma " + s);
-                avspec.addPragma(pragma);
-            }
-        }
-
-        //Create relations
-        //Channels are ?? to ??
-        //Requests are n to 1
-        //Events are ?? to ??
-        AvatarBlock fifo = new AvatarBlock("FIFO", avspec, null);
-        for (TMLChannel channel : tmlmodel.getChannels()) {
-            if (channel.getName().contains("JOINCHANNEL")) {
-                AvatarRelation ar = new AvatarRelation(channel.getName(), taskBlockMap.get(channel.getOriginTask()), taskBlockMap.get(channel.getDestinationTask()), channel.getReferenceObject());
-                ar.setPrivate(false);
-                if (channel.getType() == TMLChannel.BRBW) {
-                    ar.setAsynchronous(true);
-                    ar.setSizeOfFIFO(channel.getSize());
-                    ar.setBlocking(true);
-                } else if (channel.getType() == TMLChannel.BRNBW) {
-                    ar.setAsynchronous(true);
-                    ar.setSizeOfFIFO(channel.getSize());
-                    ar.setBlocking(false);
-                } else {
-                    //Create new block, hope for best
-                    if (mc) {
-                        fifo = createFifo(channel.getName());
-                        ar.setAsynchronous(false);
-                    }
-                }
-                //TraceManager.addDev(channel.getName() + " " +channel.getOriginTask().getName() + " " + channel.getDestinationTask().getName());
-                //Find in signal
-                //Sig1 contains IN Signals, Sig2 contains OUT signals
-                List<AvatarSignal> sig1 = new ArrayList<AvatarSignal>();
-                List<AvatarSignal> sig2 = new ArrayList<AvatarSignal>();
-                for (AvatarSignal sig : taskBlockMap.get(channel.getDestinationTask()).getSignals()) {
-                    if (sig.getInOut() == AvatarSignal.IN) {
-                        String name = sig.getName();
-                        String tmp = getName(channel.getName());
-                        if (name.equals(tmp.split("JOIN")[tmp.split("JOIN").length - 1]) || name.equals(tmp)) {
-                            sig1.add(sig);
-                        }
-                    }
-                }
-                for (AvatarSignal sig : taskBlockMap.get(channel.getOriginTask()).getSignals()) {
-                    if (sig.getInOut() == AvatarSignal.OUT) {
-                        String name = sig.getName();
-                        String tmp = getName(channel.getName());
-                        if (name.equals(tmp.split("JOIN")[tmp.split("JOIN").length - 1]) || name.equals(tmp)) {
-                            sig2.add(sig);
-                        }
-                    }
-                }
-                TraceManager.addDev("Signals " + sig1 + " " + sig2);
-                if (sig1.size() == 1 && sig2.size() == 1) {
-                    if (channel.getType() == TMLChannel.NBRNBW && mc) {
-                        AvatarSignal read = fifo.getSignalByName("readSignal");
-
-                        ar.block2 = fifo;
-                        //Set IN signal with read
-                        ar.addSignals(sig1.get(0), read);
-                        AvatarRelation ar2 = new AvatarRelation(channel.getName() + "2", fifo, taskBlockMap.get(channel.getDestinationTask()), channel.getReferenceObject());
-                        AvatarSignal write = fifo.getSignalByName("writeSignal");
-                        //set OUT signal with write
-                        ar2.addSignals(write, sig2.get(0));
-                        TraceManager.addDev("Set " + sig2.get(0) + " and write");
-                        ar2.setAsynchronous(false);
-                        avspec.addRelation(ar2);
-                    } else {
-                        ar.addSignals(sig2.get(0), sig1.get(0));
-                    }
-                }
-                avspec.addRelation(ar);
-            } else if (channel.isBasicChannel()) {
-                //TraceManager.addDev("checking channel " + channel.getName());
-                AvatarRelation ar = new AvatarRelation(channel.getName(), taskBlockMap.get(channel.getOriginTask()), taskBlockMap.get(channel.getDestinationTask()), channel.getReferenceObject());
-                LinkedList<HwCommunicationNode> path = tmlmap.findNodesForElement(channel);
-                if (path.size() != 0) {
-                    ar.setPrivate(true);
-                    for (HwCommunicationNode node : path) {
-                        if (node instanceof HwBus) {
-                            if (((HwBus) node).privacy == 0) {
-                                ar.setPrivate(false);
-                            }
-                        }
-                    }
-                } else {
-                    ar.setPrivate(originDestMap.get(channel.getOriginTask().getName() + "__" + channel.getDestinationTask().getName()) == 1);
-                }
-                if (channel.getType() == TMLChannel.BRBW) {
-                    ar.setAsynchronous(true);
-                    ar.setSizeOfFIFO(channel.getSize());
-                    ar.setBlocking(true);
-                } else if (channel.getType() == TMLChannel.BRNBW) {
-                    ar.setAsynchronous(true);
-                    ar.setSizeOfFIFO(channel.getSize());
-                    ar.setBlocking(false);
-                } else {
-                    //Create new block, hope for best
-                    if (mc) {
-                        fifo = createFifo(channel.getName());
-                        ar.setAsynchronous(false);
-                    }
-                }
-                //Find in signal
-                List<AvatarSignal> sig1 = new ArrayList<AvatarSignal>();
-                //Sig1 contains IN Signals, Sig2 contains OUT signals
-                List<AvatarSignal> sig2 = new ArrayList<AvatarSignal>();
-                for (AvatarSignal sig : signals) {
-                    if (sig.getInOut() == AvatarSignal.IN) {
-                        String name = sig.getName();
-                        if (name.equals(getName(channel.getName()))) {
-                            sig1.add(sig);
-                        }
-                    }
-                }
-                //Find out signal
-                for (AvatarSignal sig : signals) {
-                    if (sig.getInOut() == AvatarSignal.OUT) {
-                        String name = sig.getName();
-                        if (name.equals(getName(channel.getName()))) {
-                            sig2.add(sig);
-                        }
-                    }
-                }
-                if (sig1.size() == 0) {
-                    sig1.add(new AvatarSignal(getName(channel.getName()), AvatarSignal.IN, null));
-                }
-                if (sig2.size() == 0) {
-                    sig2.add(new AvatarSignal(getName(channel.getName()), AvatarSignal.OUT, null));
-                }
-                if (sig1.size() == 1 && sig2.size() == 1) {
-                    if (channel.getType() == TMLChannel.NBRNBW && mc) {
-                        AvatarSignal read = fifo.getSignalByName("readSignal");
-
-                        ar.block2 = fifo;
-                        //Set IN signal with read
-                        ar.addSignals(sig1.get(0), read);
-                        AvatarRelation ar2 = new AvatarRelation(channel.getName() + "2", fifo, taskBlockMap.get(channel.getDestinationTask()), channel.getReferenceObject());
-                        AvatarSignal write = fifo.getSignalByName("writeSignal");
-                        //set OUT signal with write
-                        ar2.addSignals(write, sig2.get(0));
-                        TraceManager.addDev("Set " + sig2.get(0) + " and write");
-                        ar2.setAsynchronous(false);
-                        avspec.addRelation(ar2);
-                    } else {
-                        ar.addSignals(sig2.get(0), sig1.get(0));
-                    }
-                } else {
-                    //Create relation if it does not exist
-                    if (top.getSignalByName(getName(channel.getName()) + "in") == null) {
-                        AvatarRelation relation = new AvatarRelation(channel.getName(), top, top, channel.getReferenceObject());
-                        AvatarSignal s1 = new AvatarSignal(getName(channel.getName()) + "in", AvatarSignal.IN, null);
-                        AvatarSignal s2 = new AvatarSignal(getName(channel.getName()) + "out", AvatarSignal.OUT, null);
-                        top.addSignal(s1);
-                        top.addSignal(s2);
-                        relation.addSignals(s2, s1);
-                        avspec.addRelation(relation);
-                        TraceManager.addDev("Failure to match signals for TMLChannel " + channel.getName());
-                    }
-                }
-                avspec.addRelation(ar);
-            } else {
-                TraceManager.addDev("Found non-basic channel");
-                //If not a basic channel, create a relation between TOP block and itself
-                AvatarRelation relation = new AvatarRelation(channel.getName(), top, top, channel.getReferenceObject());
-                AvatarSignal s1 = new AvatarSignal(getName(channel.getName()) + "in", AvatarSignal.IN, null);
-                AvatarSignal s2 = new AvatarSignal(getName(channel.getName()) + "out", AvatarSignal.OUT, null);
-                top.addSignal(s1);
-                top.addSignal(s2);
-                relation.addSignals(s2, s1);
-                avspec.addRelation(relation);
-                for (TMLTask t1 : channel.getOriginTasks()) {
-                    for (TMLTask t2 : channel.getDestinationTasks()) {
-                        AvatarRelation ar = new AvatarRelation(channel.getName(), taskBlockMap.get(t1), taskBlockMap.get(t2), channel.getReferenceObject());
-                        ar.setPrivate(originDestMap.get(t1.getName() + "__" + t2.getName()) == 1);
-                        //Find in signal
-                        List<AvatarSignal> sig1 = new ArrayList<AvatarSignal>();
-                        List<AvatarSignal> sig2 = new ArrayList<AvatarSignal>();
-                        for (AvatarSignal sig : signals) {
-                            if (sig.getInOut() == AvatarSignal.IN) {
-                                String name = sig.getName();
-                                if (name.equals(getName(channel.getName()))) {
-                                    sig1.add(sig);
-                                }
-                            }
-                        }
-                        //Find out signal
-                        for (AvatarSignal sig : signals) {
-                            if (sig.getInOut() == AvatarSignal.OUT) {
-                                String name = sig.getName();
-                                if (name.equals(getName(channel.getName()))) {
-                                    sig2.add(sig);
-                                }
-                            }
-                        }
-                        if (sig1.size() == 0) {
-                            sig1.add(new AvatarSignal(getName(channel.getName()), AvatarSignal.IN, null));
-                        }
-                        if (sig2.size() == 0) {
-                            sig2.add(new AvatarSignal(getName(channel.getName()), AvatarSignal.OUT, null));
-                        }
-                        if (sig1.size() == 1 && sig2.size() == 1) {
-                            ar.addSignals(sig2.get(0), sig1.get(0));
-                        } else {
-                            TraceManager.addDev("Failure to match signals for TMLChannel " + channel.getName() + " between " + t1.getName() + " and " + t2.getName());
-                        }
-                        avspec.addRelation(ar);
-                    }
-                }
-            }
-        }
-        for (TMLRequest request : tmlmodel.getRequests()) {
-            for (TMLTask t1 : request.getOriginTasks()) {
-                AvatarRelation ar = new AvatarRelation(request.getName(), taskBlockMap.get(t1), taskBlockMap.get(request.getDestinationTask()), request.getReferenceObject());
-                ar.setPrivate(originDestMap.get(t1.getName() + "__" + request.getDestinationTask().getName()) == 1);
-                List<AvatarSignal> sig1 = new ArrayList<AvatarSignal>();
-                List<AvatarSignal> sig2 = new ArrayList<AvatarSignal>();
-                for (AvatarSignal sig : signals) {
-                    if (sig.getInOut() == AvatarSignal.IN) {
-                        String name = sig.getName();
-
-                        if (name.equals(getName(request.getName()))) {
-                            sig1.add(sig);
-                        }
-                    }
-                }
-                //Find out signal
-                for (AvatarSignal sig : signals) {
-                    if (sig.getInOut() == AvatarSignal.OUT) {
-                        String name = sig.getName();
-
-                        if (name.equals(getName(request.getName()))) {
-                            sig2.add(sig);
-                        }
-                    }
-                }
-                if (sig1.size() == 0) {
-                    sig1.add(new AvatarSignal(getName(request.getName()), AvatarSignal.IN, null));
-                }
-                if (sig2.size() == 0) {
-                    sig2.add(new AvatarSignal(getName(request.getName()), AvatarSignal.OUT, null));
-                }
-                if (sig1.size() == 1 && sig2.size() == 1) {
-                    ar.addSignals(sig2.get(0), sig1.get(0));
-                } else {
-                    //Throw error
-                    TraceManager.addDev("Could not match for " + request.getName());
-                }
+					}
 
-                ar.setAsynchronous(false);
-                avspec.addRelation(ar);
-            }
-        }
-        for (TMLEvent event : tmlmodel.getEvents()) {
 
-            AvatarRelation ar = new AvatarRelation(event.getName(), taskBlockMap.get(event.getOriginTask()), taskBlockMap.get(event.getDestinationTask()), event.getReferenceObject());
-            ar.setPrivate(originDestMap.get(event.getOriginTask().getName() + "__" + event.getDestinationTask().getName()) == 1);
-            List<AvatarSignal> sig1 = new ArrayList<AvatarSignal>();
-            List<AvatarSignal> sig2 = new ArrayList<AvatarSignal>();
-            for (AvatarSignal sig : signals) {
-                if (sig.getInOut() == AvatarSignal.IN) {
-                    String name = sig.getName();
-                    if (name.equals(getName(event.getName()))) {
-                        sig1.add(sig);
-                    }
-                }
-            }
-            //Find out signal
-            for (AvatarSignal sig : signals) {
-                if (sig.getInOut() == AvatarSignal.OUT) {
-                    String name = sig.getName();
-                    if (name.equals(getName(event.getName()))) {
-                        sig2.add(sig);
-                    }
-                }
-            }
-            if (sig1.size() == 0) {
-                sig1.add(new AvatarSignal(getName(event.getName()), AvatarSignal.IN, null));
-            }
-            if (sig2.size() == 0) {
-                sig2.add(new AvatarSignal(getName(event.getName()), AvatarSignal.OUT, null));
-            }
-            if (sig1.size() == 1 && sig2.size() == 1) {
-                ar.addSignals(sig2.get(0), sig1.get(0));
-            } else {
-                //Throw error
-                TraceManager.addDev("Could not match for " + event.getName());
-            }
-            if (event.isBlocking()) {
-                ar.setAsynchronous(true);
-                ar.setBlocking(true);
-                ar.setSizeOfFIFO(event.getMaxSize());
-            } else {
-                ar.setAsynchronous(true);
-                ar.setBlocking(false);
-                ar.setSizeOfFIFO(event.getMaxSize());
+					asm.setStartState(ss);
 
-            }
-            avspec.addRelation(ar);
-        }
-        for (AvatarSignal sig : signals) {
-            //check that all signals are put in relations
-            AvatarRelation ar = avspec.getAvatarRelationWithSignal(sig);
-            if (ar == null) {
-                TraceManager.addDev("missing relation for " + sig.getName());
-            }
-        }
-        //Check if we matched up all signals
-        for (SecurityPattern sp : symKeys.keySet()) {
-            if (symKeys.get(sp).size() > 1) {
-                String keys = "";
-                for (AvatarAttribute key : symKeys.get(sp)) {
-                    keys = keys + " " + key.getBlock().getName() + "." + key.getName();
-                }
-                avspec.addPragma(new AvatarPragmaInitialKnowledge("#InitialSessionKnowledge " + keys, null, symKeys.get(sp), true));
-            }
-        }
-        for (SecurityPattern sp : pubKeys.keySet()) {
-            if (pubKeys.get(sp).size() != 0) {
-                String keys = "";
-                for (AvatarAttribute key : pubKeys.get(sp)) {
-                    keys = keys + " " + key.getBlock().getName() + "." + key.getName();
-                }
-                avspec.addPragma(new AvatarPragmaInitialKnowledge("#InitialSessionKnowledge " + keys, null, pubKeys.get(sp), true));
-            }
-        }
-        tmlmap.getTMLModeling().secChannelMap = secChannelMap;
+				}
+				else {
+					//Not requested
+					List<AvatarStateMachineElement> elementList= translateState(task.getActivityDiagram().get(0), block);
+					for (AvatarStateMachineElement e: elementList){
+						e.setName(processName(e.getName(), e.getID()));
+						asm.addElement(e);
+						stateObjectMap.put(task.getName().split("__")[1]+"__"+e.getName(), e.getReferenceObject());
+					}
+					asm.setStartState((AvatarStartState) elementList.get(0));
+				}
+				for (SecurityPattern secPattern: secPatterns){
+					AvatarAttribute sec = block.getAvatarAttributeWithName(secPattern.name);
+					if (sec==null){
+						sec = new AvatarAttribute(secPattern.name, AvatarType.INTEGER, block, null);
+						AvatarAttribute enc = new AvatarAttribute(secPattern.name+"_encrypted", AvatarType.INTEGER, block, null);
+						block.addAttribute(sec);
+						block.addAttribute(enc);
+					}
+					avspec.addPragma(new AvatarPragmaSecret("#Confidentiality "+block.getName() + "."+ secPattern.name, null, sec));
+				}
 
-        //	TraceManager.addDev("avatar spec\n" +avspec);
-        return avspec;
-    }
+			}
 
-    public void backtraceReachability(Map<AvatarPragmaReachability, ProVerifQueryResult> reachabilityResults) {
-        for (AvatarPragmaReachability pragma : reachabilityResults.keySet()) {
-            ProVerifQueryResult result = reachabilityResults.get(pragma);
-            if (!result.isProved())
-                continue;
 
-            int r = result.isSatisfied() ? 1 : 2;
+			//Add authenticity pragmas
+			for (String s: signalAuthOriginMap.keySet()){
+				if (signalAuthDestMap.containsKey(s)){
+					AvatarPragmaAuthenticity pragma = new AvatarPragmaAuthenticity("#Authenticity " + signalAuthOriginMap.get(s).getName() + " " + signalAuthDestMap.get(s).getName(), signalAuthOriginMap.get(s).getReferenceObject(), signalAuthOriginMap.get(s), signalAuthDestMap.get(s));
+					//System.out.println("adding pragma " + s);
+					avspec.addPragma(pragma);
+				}
+			}
+
+			//Create relations
+			//Channels are ?? to ??
+			//Requests are n to 1
+			//Events are ?? to ??
+			AvatarBlock fifo = new AvatarBlock("FIFO", avspec,null);
+			for (TMLChannel channel:tmlmodel.getChannels()){
+				if (channel.getName().contains("JOINCHANNEL")){
+					AvatarRelation ar= new AvatarRelation(channel.getName(), taskBlockMap.get(channel.getOriginTask()), taskBlockMap.get(channel.getDestinationTask()), channel.getReferenceObject());
+					ar.setPrivate(false);
+					if (channel.getType()==TMLChannel.BRBW){
+						ar.setAsynchronous(true);		
+						ar.setSizeOfFIFO(channel.getSize());
+						ar.setBlocking(true);
+					}
+					else if (channel.getType()==TMLChannel.BRNBW){
+						ar.setAsynchronous(true);
+						ar.setSizeOfFIFO(channel.getSize());
+						ar.setBlocking(false);
+					}
+					else {
+						//Create new block, hope for best
+						if (mc){
+							fifo = createFifo(channel.getName());
+							ar.setAsynchronous(false);
+						}
+					}
+					//System.out.println(channel.getName() + " " +channel.getOriginTask().getName() + " " + channel.getDestinationTask().getName());
+					//Find in signal
+					//Sig1 contains IN Signals, Sig2 contains OUT signals
+					List<AvatarSignal> sig1 = new ArrayList<AvatarSignal>();
+					List<AvatarSignal> sig2 = new ArrayList<AvatarSignal>();
+					for (AvatarSignal sig: taskBlockMap.get(channel.getDestinationTask()).getSignals()){
+						if (sig.getInOut()==AvatarSignal.IN){
+							String name = sig.getName();
+							String tmp = getName(channel.getName());
+							if (name.equals(tmp.split("JOIN")[tmp.split("JOIN").length-1]) || name.equals(tmp)){
+								sig1.add(sig);
+							}
+						}
+					}
+					for (AvatarSignal sig: taskBlockMap.get(channel.getOriginTask()).getSignals()){
+						if (sig.getInOut()==AvatarSignal.OUT){
+							String name = sig.getName();
+							String tmp = getName(channel.getName());
+							if (name.equals(tmp.split("JOIN")[tmp.split("JOIN").length-1]) || name.equals(tmp)){
+								sig2.add(sig);
+							}
+						}
+					}
 
-            String s = pragma.getBlock().getName() + "__" + pragma.getState().getName();
+					if (sig1.size()==1 && sig2.size()==1){
+						if (channel.getType()==TMLChannel.NBRNBW && mc){
+							AvatarSignal read = fifo.getSignalByName("readSignal");
+
+							ar.block2= fifo;
+							//Set IN signal with read
+							ar.addSignals(sig1.get(0), read);
+							AvatarRelation ar2= new AvatarRelation(channel.getName()+"2", fifo, taskBlockMap.get(channel.getDestinationTask()), channel.getReferenceObject());
+							AvatarSignal write = fifo.getSignalByName("writeSignal");
+							//set OUT signal with write
+							ar2.addSignals(write, sig2.get(0));
+							ar2.setAsynchronous(false);
+							avspec.addRelation(ar2);
+						}
+						else {
+							ar.addSignals(sig2.get(0), sig1.get(0));
+						}
+					}		
+					avspec.addRelation(ar);
+				}
 
-            if (stateObjectMap.containsKey(s)) {
-                Object obj = stateObjectMap.get(s);
-                if (obj instanceof TMLADWriteChannel) {
-                    TMLADWriteChannel wc = (TMLADWriteChannel) obj;
-                    wc.reachabilityInformation = r;
-                }
-                if (obj instanceof TMLADReadChannel) {
-                    TMLADReadChannel wc = (TMLADReadChannel) obj;
-                    wc.reachabilityInformation = r;
-                }
+				else if (channel.isBasicChannel()){
+					//System.out.println("checking channel " + channel.getName());
+					AvatarRelation ar= new AvatarRelation(channel.getName(), taskBlockMap.get(channel.getOriginTask()), taskBlockMap.get(channel.getDestinationTask()), channel.getReferenceObject());
+					LinkedList<HwCommunicationNode> path =tmlmap.findNodesForElement(channel);
+					if (path.size()!=0){
+						ar.setPrivate(true);
+						for (HwCommunicationNode node:path){
+							if (node instanceof HwBus){
+								if (((HwBus) node).privacy ==0){
+									ar.setPrivate(false);
+								}
+							}
+						}
+					}
+					else {
+						ar.setPrivate(originDestMap.get(channel.getOriginTask().getName()+"__"+channel.getDestinationTask().getName())==1);
+					}
+					if (channel.getType()==TMLChannel.BRBW){
+						ar.setAsynchronous(true);		
+						ar.setSizeOfFIFO(channel.getSize());
+						ar.setBlocking(true);
+					}
+					else if (channel.getType()==TMLChannel.BRNBW){
+						ar.setAsynchronous(true);
+						ar.setSizeOfFIFO(channel.getSize());
+						ar.setBlocking(false);
+					}
+					else {
+						//Create new block, hope for best
+						if (mc){
+							fifo = createFifo(channel.getName());
+							ar.setAsynchronous(false);
+						}
+					}
+					//Find in signal
+					List<AvatarSignal> sig1 = new ArrayList<AvatarSignal>();
+					//Sig1 contains IN Signals, Sig2 contains OUT signals
+					List<AvatarSignal> sig2 = new ArrayList<AvatarSignal>();
+					for (AvatarSignal sig: signals){
+						if (sig.getInOut()==AvatarSignal.IN){
+							String name = sig.getName();
+							if (name.equals(getName(channel.getName()))){
+								sig1.add(sig);
+							}
+						}
+					}
+					//Find out signal
+					for (AvatarSignal sig: signals){
+						if (sig.getInOut()==AvatarSignal.OUT){
+							String name = sig.getName();
+							if (name.equals(getName(channel.getName()))){
+								sig2.add(sig);
+							}
+						}
+					}
+					if (sig1.size()==0){
+						sig1.add(new AvatarSignal(getName(channel.getName()), AvatarSignal.IN, null));
+					}
+					if (sig2.size()==0){
+						sig2.add(new AvatarSignal(getName(channel.getName()), AvatarSignal.OUT, null));
+					}
+					if (sig1.size()==1 && sig2.size()==1){
+						if (channel.getType()==TMLChannel.NBRNBW && mc){
+							AvatarSignal read = fifo.getSignalByName("readSignal");
+
+							ar.block2= fifo;
+							//Set IN signal with read
+							ar.addSignals(sig1.get(0), read);
+							AvatarRelation ar2= new AvatarRelation(channel.getName()+"2", fifo, taskBlockMap.get(channel.getDestinationTask()), channel.getReferenceObject());
+							AvatarSignal write = fifo.getSignalByName("writeSignal");
+							//set OUT signal with write
+							ar2.addSignals(write, sig2.get(0));
+							System.out.println("Set " + sig2.get(0) + " and write");
+							ar2.setAsynchronous(false);
+							avspec.addRelation(ar2);
+						}
+						else {
+							ar.addSignals(sig2.get(0), sig1.get(0));
+						}
+					}
+					else {
+						//Create relation if it does not exist
+						if (top.getSignalByName(getName(channel.getName())+"in")==null){
+							AvatarRelation relation= new AvatarRelation(channel.getName(), top, top, channel.getReferenceObject());
+							AvatarSignal s1 = new AvatarSignal(getName(channel.getName())+"in", AvatarSignal.IN, null);
+							AvatarSignal s2 = new AvatarSignal(getName(channel.getName())+"out", AvatarSignal.OUT, null);
+							top.addSignal(s1);
+							top.addSignal(s2);
+							relation.addSignals(s2,s1);
+							avspec.addRelation(relation);
+							System.out.println("Failure to match signals for TMLChannel "+ channel.getName());
+						}
+					}
+					avspec.addRelation(ar);
+				}
+				else {
+					System.out.println("Found non-basic channel");
+					//If not a basic channel, create a relation between TOP block and itself
+					AvatarRelation relation= new AvatarRelation(channel.getName(), top, top, channel.getReferenceObject());
+					AvatarSignal s1 = new AvatarSignal(getName(channel.getName())+"in", AvatarSignal.IN, null);
+					AvatarSignal s2 = new AvatarSignal(getName(channel.getName())+"out", AvatarSignal.OUT, null);
+					top.addSignal(s1);
+					top.addSignal(s2);
+					relation.addSignals(s2,s1);
+					avspec.addRelation(relation);
+					for (TMLTask t1: channel.getOriginTasks()){
+						for (TMLTask t2: channel.getDestinationTasks()){
+							AvatarRelation ar= new AvatarRelation(channel.getName(), taskBlockMap.get(t1), taskBlockMap.get(t2), channel.getReferenceObject());
+							ar.setPrivate(originDestMap.get(t1.getName()+"__"+t2.getName())==1);
+							//Find in signal
+							List<AvatarSignal> sig1 = new ArrayList<AvatarSignal>();
+							List<AvatarSignal> sig2 = new ArrayList<AvatarSignal>();
+							for (AvatarSignal sig: signals){
+								if (sig.getInOut()==AvatarSignal.IN){
+									String name = sig.getName();
+									if (name.equals(getName(channel.getName()))){
+										sig1.add(sig);
+									}
+								}
+							}
+							//Find out signal
+							for (AvatarSignal sig: signals){
+								if (sig.getInOut()==AvatarSignal.OUT){
+									String name = sig.getName();
+									if (name.equals(getName(channel.getName()))){
+										sig2.add(sig);
+									}
+								}
+							}
+							if (sig1.size()==0){
+								sig1.add(new AvatarSignal(getName(channel.getName()), AvatarSignal.IN, null));
+							}
+							if (sig2.size()==0){
+								sig2.add(new AvatarSignal(getName(channel.getName()), AvatarSignal.OUT, null));
+							}
+							if (sig1.size()==1 && sig2.size()==1){
+								ar.addSignals(sig2.get(0), sig1.get(0));
+							}
+							else {
+								System.out.println("Failure to match signals for TMLChannel "+ channel.getName() + " between " + t1.getName() + " and "+ t2.getName());
+							}
+							avspec.addRelation(ar);
+						}
+					}
+				}
+			}
+			for (TMLRequest request: tmlmodel.getRequests()){
+				for (TMLTask t1: request.getOriginTasks()){
+					AvatarRelation ar = new AvatarRelation(request.getName(), taskBlockMap.get(t1), taskBlockMap.get(request.getDestinationTask()), request.getReferenceObject());
+					ar.setPrivate(originDestMap.get(t1.getName()+"__"+request.getDestinationTask().getName())==1);		
+					List<AvatarSignal> sig1 = new ArrayList<AvatarSignal>();
+					List<AvatarSignal> sig2 = new ArrayList<AvatarSignal>();
+					for (AvatarSignal sig: signals){
+						if (sig.getInOut()==AvatarSignal.IN){
+							String name = sig.getName();
+
+							if (name.equals(getName(request.getName()))){
+								sig1.add(sig);
+							}
+						}
+					}
+					//Find out signal
+					for (AvatarSignal sig: signals){
+						if (sig.getInOut()==AvatarSignal.OUT){
+							String name = sig.getName();
 
-                if (obj instanceof TMLADSendEvent) {
-                    TMLADSendEvent wc = (TMLADSendEvent) obj;
-                    wc.reachabilityInformation = r;
-                }
+							if (name.equals(getName(request.getName()))){
+								sig2.add(sig);
+							}
+						}
+					}
+					if (sig1.size()==0){
+						sig1.add(new AvatarSignal(getName(request.getName()), AvatarSignal.IN, null));
+					}
+					if (sig2.size()==0){
+						sig2.add(new AvatarSignal(getName(request.getName()), AvatarSignal.OUT, null));
+					}
+					if (sig1.size()==1 && sig2.size()==1){
+						ar.addSignals(sig2.get(0), sig1.get(0));
+					}
+					else {
+						//Throw error
+						System.out.println("Could not match for " + request.getName());
+					}
 
-                if (obj instanceof TMLADSendRequest) {
-                    TMLADSendRequest wc = (TMLADSendRequest) obj;
-                    wc.reachabilityInformation = r;
-                }
-                if (obj instanceof TMLADWaitEvent) {
-                    TMLADWaitEvent wc = (TMLADWaitEvent) obj;
-                    wc.reachabilityInformation = r;
-                }
-            }
-        }
-    }
+					ar.setAsynchronous(false);
+					avspec.addRelation(ar);
+				}
+			}
+			for (TMLEvent event: tmlmodel.getEvents()){
+
+				AvatarRelation ar = new AvatarRelation(event.getName(), taskBlockMap.get(event.getOriginTask()), taskBlockMap.get(event.getDestinationTask()), event.getReferenceObject());
+				ar.setPrivate(originDestMap.get(event.getOriginTask().getName()+"__"+event.getDestinationTask().getName())==1);
+				List<AvatarSignal> sig1 = new ArrayList<AvatarSignal>();
+				List<AvatarSignal> sig2 = new ArrayList<AvatarSignal>();
+				for (AvatarSignal sig: signals){
+					if (sig.getInOut()==AvatarSignal.IN){
+						String name = sig.getName();
+						if (name.equals(getName(event.getName()))){
+							sig1.add(sig);
+						}
+					}
+				}
+				//Find out signal
+				for (AvatarSignal sig: signals){
+					if (sig.getInOut()==AvatarSignal.OUT){
+						String name = sig.getName();
+						if (name.equals(getName(event.getName()))){
+							sig2.add(sig);
+						}
+					}
+				}
+				if (sig1.size()==0){
+					sig1.add(new AvatarSignal(getName(event.getName()), AvatarSignal.IN, null));
+				}
+				if (sig2.size()==0){
+					sig2.add(new AvatarSignal(getName(event.getName()), AvatarSignal.OUT, null));
+				}
+				if (sig1.size()==1 && sig2.size()==1){
+					ar.addSignals(sig2.get(0), sig1.get(0));
+				}
+				else {
+					//Throw error
+					System.out.println("Could not match for " + event.getName());
+				}
+				if (event.isBlocking()){
+					ar.setAsynchronous(true);
+					ar.setBlocking(true);
+					ar.setSizeOfFIFO(event.getMaxSize());
+				}
+				else {
+					ar.setAsynchronous(true);
+					ar.setBlocking(false);
+					ar.setSizeOfFIFO(event.getMaxSize());
 
-    public void distributeKeys() {
-        List<TMLTask> tasks = tmlmap.getTMLModeling().getTasks();
-        for (TMLTask t : accessKeys.keySet()) {
-            AvatarBlock b = taskBlockMap.get(t);
-            for (SecurityPattern sp : accessKeys.get(t)) {
-                if (sp.type.equals("Symmetric Encryption") || sp.type.equals("MAC")) {
-                    AvatarAttribute key = new AvatarAttribute("key_" + sp.name, AvatarType.INTEGER, b, null);
-                    if (symKeys.containsKey(sp)) {
-                        symKeys.get(sp).add(key);
-                    } else {
-                        LinkedList<AvatarAttribute> tmp = new LinkedList<AvatarAttribute>();
-                        tmp.add(key);
-                        symKeys.put(sp, tmp);
-                    }
-                    b.addAttribute(key);
-                } else if (sp.type.equals("Asymmetric Encryption")) {
-                    AvatarAttribute pubkey = new AvatarAttribute("pubKey_" + sp.name, AvatarType.INTEGER, b, null);
-                    b.addAttribute(pubkey);
-
-                    AvatarAttribute privkey = new AvatarAttribute("privKey_" + sp.name, AvatarType.INTEGER, b, null);
-                    b.addAttribute(privkey);
-                    avspec.addPragma(new AvatarPragmaPrivatePublicKey("#PrivatePublicKeys " + b.getName() + " " + privkey.getName() + " " + pubkey.getName(), null, privkey, pubkey));
-                    if (pubKeys.containsKey(sp)) {
-                        pubKeys.get(sp).add(pubkey);
-                    } else {
-                        LinkedList<AvatarAttribute> tmp = new LinkedList<AvatarAttribute>();
-                        tmp.add(pubkey);
-                        pubKeys.put(sp, tmp);
-                    }
-                    //Distribute public key everywhere
-                    for (TMLTask task2 : tasks) {
-                        AvatarBlock b2 = taskBlockMap.get(task2);
-                        pubkey = new AvatarAttribute("pubKey_" + sp.name, AvatarType.INTEGER, b2, null);
-                        b2.addAttribute(pubkey);
-                        if (pubKeys.containsKey(sp)) {
-                            pubKeys.get(sp).add(pubkey);
-                        }
-                    }
-                }
-            }
-        }
+				}
+				avspec.addRelation(ar);
+			}
+			for (AvatarSignal sig: signals){
+				//check that all signals are put in relations
+				AvatarRelation ar = avspec.getAvatarRelationWithSignal(sig);
+				if (ar==null){
+					System.out.println("missing relation for " + sig.getName());
+				}
+			}
+			//Check if we matched up all signals
+			for (SecurityPattern sp:symKeys.keySet()){
+				if (symKeys.get(sp).size()>1){	
+					String keys = "";
+					for (AvatarAttribute key: symKeys.get(sp)){
+						keys= keys+" "+key.getBlock().getName() + "."+key.getName();
+					}
+					avspec.addPragma(new AvatarPragmaInitialKnowledge("#InitialSessionKnowledge "+ keys, null, symKeys.get(sp), true));
+				}
+			}
+			for (SecurityPattern sp:pubKeys.keySet()){
+				if (pubKeys.get(sp).size()!=0){
+					String keys = "";
+					for (AvatarAttribute key: pubKeys.get(sp)){
+						keys= keys+" "+key.getBlock().getName() + "."+key.getName();
+					}
+					avspec.addPragma(new AvatarPragmaInitialKnowledge("#InitialSessionKnowledge "+keys, null, pubKeys.get(sp),true));
+				}
+			}
+			tmlmap.getTMLModeling().secChannelMap = secChannelMap;
+	
+		//	System.out.println("avatar spec\n" +avspec);
+			return avspec;
+		}
+
+		public void backtraceReachability( Map<AvatarPragmaReachability, ProVerifQueryResult> reachabilityResults) {
+			for (AvatarPragmaReachability pragma: reachabilityResults.keySet())
+			{
+				ProVerifQueryResult result = reachabilityResults.get(pragma);
+				if (!result.isProved())
+					continue;
+
+				int r = result.isSatisfied() ? 1 : 2;
+
+				String s = pragma.getBlock().getName() + "__" + pragma.getState().getName();
+
+				if (stateObjectMap.containsKey(s)) {
+					Object obj = stateObjectMap.get(s);
+					if (obj instanceof TMLADWriteChannel){
+						TMLADWriteChannel wc =(TMLADWriteChannel) obj;
+						wc.reachabilityInformation=r;
+					}
+					if (obj instanceof TMLADReadChannel){
+						TMLADReadChannel wc =(TMLADReadChannel) obj;
+						wc.reachabilityInformation=r;
+					}
 
-    }
+					if (obj instanceof TMLADSendEvent){
+						TMLADSendEvent wc =(TMLADSendEvent) obj;
+						wc.reachabilityInformation=r;
+					}
 
-    public AvatarBlock createFifo(String name) {
-        AvatarBlock fifo = new AvatarBlock("FIFO__FIFO" + name, avspec, null);
-        AvatarState root = new AvatarState("root", null, false, false);
-        AvatarSignal read = new AvatarSignal("readSignal", AvatarSignal.IN, null);
-        AvatarAttribute data = new AvatarAttribute("data", AvatarType.INTEGER, fifo, null);
-        fifo.addAttribute(data);
-        read.addParameter(data);
-        AvatarSignal write = new AvatarSignal("writeSignal", AvatarSignal.OUT, null);
-        write.addParameter(data);
-        AvatarStartState start = new AvatarStartState("start", null);
-        AvatarTransition afterStart = new AvatarTransition(fifo, "afterStart", null);
-        fifo.addSignal(read);
-        fifo.addSignal(write);
-        AvatarTransition toRead = new AvatarTransition(fifo, "toReadSignal", null);
-        AvatarTransition toWrite = new AvatarTransition(fifo, "toWriteSignal", null);
-        AvatarTransition afterRead = new AvatarTransition(fifo, "afterReadSignal", null);
-        AvatarTransition afterWrite = new AvatarTransition(fifo, "afterWriteSignal", null);
-        AvatarActionOnSignal readAction = new AvatarActionOnSignal("read", read, null);
-        AvatarActionOnSignal writeAction = new AvatarActionOnSignal("write", write, null);
-
-        AvatarStateMachine asm = fifo.getStateMachine();
-        asm.addElement(start);
-        asm.setStartState(start);
-        asm.addElement(afterStart);
-        asm.addElement(root);
-        asm.addElement(toRead);
-        asm.addElement(toWrite);
-        asm.addElement(afterRead);
-        asm.addElement(afterWrite);
-        asm.addElement(readAction);
-        asm.addElement(writeAction);
-
-        start.addNext(afterStart);
-        afterStart.addNext(root);
-        root.addNext(toRead);
-        root.addNext(toWrite);
-        toRead.addNext(readAction);
-        toWrite.addNext(writeAction);
-        readAction.addNext(afterRead);
-        writeAction.addNext(afterWrite);
-        afterRead.addNext(root);
-        afterWrite.addNext(root);
-
-        avspec.addBlock(fifo);
-        return fifo;
-    }
+					if (obj instanceof TMLADSendRequest){
+						TMLADSendRequest wc =(TMLADSendRequest) obj;
+						wc.reachabilityInformation=r;
+					}
+					if (obj instanceof TMLADWaitEvent){
+						TMLADWaitEvent wc =(TMLADWaitEvent) obj;
+						wc.reachabilityInformation=r;
+					}		
+				}
+			}
+		}
 
+		public void distributeKeys(){
+			List<TMLTask> tasks = tmlmap.getTMLModeling().getTasks();
+			for (TMLTask t:accessKeys.keySet()){
+				AvatarBlock b = taskBlockMap.get(t);
+				for (SecurityPattern sp: accessKeys.get(t)){
+					if (sp.type.equals("Symmetric Encryption") || sp.type.equals("MAC")){
+						AvatarAttribute key = new AvatarAttribute("key_"+sp.name, AvatarType.INTEGER, b, null);
+						if (symKeys.containsKey(sp)){
+							symKeys.get(sp).add(key);
+						}
+						else {
+							LinkedList<AvatarAttribute> tmp = new LinkedList<AvatarAttribute>();
+							tmp.add(key);
+							symKeys.put(sp, tmp);
+						}
+						b.addAttribute(key);
+					}
+					else if (sp.type.equals("Asymmetric Encryption")){
+						AvatarAttribute pubkey = new AvatarAttribute("pubKey_"+sp.name, AvatarType.INTEGER, b, null);
+						b.addAttribute(pubkey);
+						
+						AvatarAttribute privkey = new AvatarAttribute("privKey_"+sp.name, AvatarType.INTEGER, b, null);
+						b.addAttribute(privkey);
+						avspec.addPragma(new AvatarPragmaPrivatePublicKey("#PrivatePublicKeys " +  b.getName() + " " + privkey.getName() + " " + pubkey.getName(), null, privkey, pubkey));
+						if (pubKeys.containsKey(sp)){
+							pubKeys.get(sp).add(pubkey);
+						}
+						else {
+							LinkedList<AvatarAttribute> tmp = new LinkedList<AvatarAttribute>();
+							tmp.add(pubkey);
+							pubKeys.put(sp, tmp);
+						}
+						//Distribute public key everywhere
+						for (TMLTask task2 : tasks){
+							AvatarBlock b2 = taskBlockMap.get(task2);
+							pubkey = new AvatarAttribute("pubKey_"+sp.name, AvatarType.INTEGER, b2, null);
+							b2.addAttribute(pubkey);
+							if (pubKeys.containsKey(sp)){
+								pubKeys.get(sp).add(pubkey);
+							}
+						}		
+					}
+				}
+			}
+			
+		}
+		public AvatarBlock createFifo(String name){
+			AvatarBlock fifo = new AvatarBlock("FIFO__FIFO"+name, avspec, null);
+			AvatarState root = new AvatarState("root",null, false, false);
+			AvatarSignal read = new AvatarSignal("readSignal", AvatarSignal.IN, null);
+			AvatarAttribute data = new AvatarAttribute("data", AvatarType.INTEGER, fifo, null);
+			fifo.addAttribute(data); 
+			read.addParameter(data);
+			AvatarSignal write = new AvatarSignal("writeSignal", AvatarSignal.OUT, null);
+			write.addParameter(data);
+			AvatarStartState start = new AvatarStartState("start", null);
+			AvatarTransition afterStart = new AvatarTransition(fifo, "afterStart", null);
+			fifo.addSignal(read);
+			fifo.addSignal(write);
+			AvatarTransition toRead = new AvatarTransition(fifo, "toReadSignal", null);
+			AvatarTransition toWrite = new AvatarTransition(fifo, "toWriteSignal", null);
+			AvatarTransition afterRead = new AvatarTransition(fifo, "afterReadSignal", null);
+			AvatarTransition afterWrite = new AvatarTransition(fifo, "afterWriteSignal", null);
+			AvatarActionOnSignal readAction= new AvatarActionOnSignal("read", read, null);	
+			AvatarActionOnSignal writeAction= new AvatarActionOnSignal("write", write, null);	
+
+			AvatarStateMachine asm = fifo.getStateMachine();
+			asm.addElement(start);
+			asm.setStartState(start);
+			asm.addElement(afterStart);
+			asm.addElement(root);
+			asm.addElement(toRead);
+			asm.addElement(toWrite);
+			asm.addElement(afterRead);
+			asm.addElement(afterWrite);
+			asm.addElement(readAction);
+			asm.addElement(writeAction);
+
+			start.addNext(afterStart);
+			afterStart.addNext(root);
+			root.addNext(toRead);
+			root.addNext(toWrite);
+			toRead.addNext(readAction);
+			toWrite.addNext(writeAction);
+			readAction.addNext(afterRead);
+			writeAction.addNext(afterWrite);
+			afterRead.addNext(root);
+			afterWrite.addNext(root);
+
+			avspec.addBlock(fifo);
+			return fifo;
+		}
+
+	
     public AvatarSpecification convertToSecurityType(AvatarSpecification spec) {
         return spec;
     }
@@ -2173,3 +2195,4 @@ public class TML2Avatar {
 }
 
 
+
diff --git a/src/main/java/ui/GTURTLEModeling.java b/src/main/java/ui/GTURTLEModeling.java
index 31b75a24b5bf998742e9e1c6b256809ddd155f26..907017bb74dfc45656762f51e58eb92cdc90fb45 100644
--- a/src/main/java/ui/GTURTLEModeling.java
+++ b/src/main/java/ui/GTURTLEModeling.java
@@ -1075,12 +1075,12 @@ public class GTURTLEModeling {
     }
 
     public TMLMapping<TGComponent> autoSecure(MainGUI gui, String name, TMLMapping<TGComponent> map, TMLArchiPanel newarch) {
-        return autoSecure(gui, name, map, newarch, "100", "0", "100", true, false, false);
+        return autoSecure(gui, name, map, newarch, "100", "0", "100", true, false, false, new HashMap<String, java.util.List<String>>());
     }
 
     public TMLMapping<TGComponent> autoSecure(MainGUI gui, String name, TMLMapping<TGComponent> map, TMLArchiPanel newarch, boolean autoConf,
                                               boolean autoWeakAuth, boolean autoStrongAuth) {
-        return autoSecure(gui, name, map, newarch, "100", "0", "100", autoConf, autoWeakAuth, autoStrongAuth);
+        return autoSecure(gui, name, map, newarch, "100", "0", "100", autoConf, autoWeakAuth, autoStrongAuth,new HashMap<String, java.util.List<String>>());
     }
 
     public TMLMapping<TGComponent> autoSecure(MainGUI gui, String encComp, String overhead, String decComp) {
@@ -1091,11 +1091,11 @@ public class GTURTLEModeling {
         int arch = gui.tabs.indexOf(tmlap);
         gui.cloneRenameTab(arch, "enc");
         TMLArchiPanel newarch = (TMLArchiPanel) gui.tabs.get(gui.tabs.size() - 1);
-        return autoSecure(gui, "enc", tmap, newarch, encComp, overhead, decComp, true, false, false);
+        return autoSecure(gui, "enc", tmap, newarch, encComp, overhead, decComp, true, false, false,new HashMap<String, java.util.List<String>>());
     }
 
     public TMLMapping<TGComponent> autoSecure(MainGUI gui, String encComp, String overhead, String decComp, boolean autoConf, boolean autoWeakAuth,
-                                              boolean autoStrongAuth) {
+                                              boolean autoStrongAuth,Map<String, List<String>> selectedCpuTasks ) {
         if (tmap == null) {
             return null;
         }
@@ -1103,20 +1103,23 @@ public class GTURTLEModeling {
         int arch = gui.tabs.indexOf(tmlap);
         gui.cloneRenameTab(arch, "enc");
         TMLArchiPanel newarch = (TMLArchiPanel) gui.tabs.get(gui.tabs.size() - 1);
-        return autoSecure(gui, "enc", tmap, newarch, encComp, overhead, decComp, autoConf, autoWeakAuth, autoStrongAuth);
+        return autoSecure(gui, "enc", tmap, newarch, encComp, overhead, decComp, autoConf, autoWeakAuth, autoStrongAuth, selectedCpuTasks);
     }
 
     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);
+        return autoSecure(gui, name, tmap, newarch, encComp, overhead, decComp, true, false, false, new HashMap<String, java.util.List<String>>());
     }
 
-    public TMLMapping<TGComponent> autoSecure(MainGUI gui, String name, TMLMapping<TGComponent> map, TMLArchiPanel newarch, String encComp, String overhead, String decComp, boolean autoConf, boolean autoWeakAuth, boolean autoStrongAuth) {
+
+    public TMLMapping<TGComponent> autoSecure(MainGUI gui, String name, TMLMapping<TGComponent> map, TMLArchiPanel newarch, String encComp, String overhead, String decComp, boolean autoConf, boolean autoWeakAuth, boolean autoStrongAuth, Map<String, List<String>> selectedCpuTasks ) {
     
             
         //move to another thread
-        SecurityGeneration secgen = new SecurityGeneration(gui, name, map, newarch, encComp, overhead, decComp, autoConf, autoWeakAuth, autoStrongAuth);
-        return secgen.startThread();
+        SecurityGeneration secgen = new SecurityGeneration(gui, name, map, newarch, encComp, overhead, decComp, autoConf, autoWeakAuth, autoStrongAuth, selectedCpuTasks);
+        tmap = secgen.startThread();
+        autoMapKeys();
+        return tmap;
     }
 
 
@@ -1187,13 +1190,13 @@ public class GTURTLEModeling {
     }
 
     public void autoMapKeys() {
-        TraceManager.addDev("auto map keys");
         if (tmap == null) {
             return;
         }
         List<HwLink> links = tmap.getArch().getHwLinks();
         //Find all Security Patterns, if they don't have an associated memory at encrypt and decrypt, map them
         TMLModeling<TGComponent> tmlm = tmap.getTMLModeling();
+        
         if (tmlm.securityTaskMap == null) {
             return;
         }
@@ -1377,6 +1380,9 @@ public class GTURTLEModeling {
         //tml2uppaal.setChoiceDeterministic(choices);
         //tml2uppaal.setSizeInfiniteFIFO(_size);
         proverif = avatar2proverif.generateProVerif(true, true, _stateReachability, _typed, allowPrivateChannelDuplication);
+        
+       // System.out.println(proverif.getStringSpec());
+        
         warnings = avatar2proverif.getWarnings();
         languageID = PROVERIF;
         mgui.setMode(MainGUI.EDIT_PROVERIF_OK);
diff --git a/src/main/java/ui/HSMGeneration.java b/src/main/java/ui/HSMGeneration.java
index 9164d5da9fe8def68586b035b91ee261a1b1f96a..61fa4cf33ae963e3267825c289ec8444c073c8a6 100644
--- a/src/main/java/ui/HSMGeneration.java
+++ b/src/main/java/ui/HSMGeneration.java
@@ -173,7 +173,7 @@ public class HSMGeneration implements Runnable {
 
         TGConnector fromStart;
         Map<String, HSMChannel> secChannels = new HashMap<String, HSMChannel>();
-        //Add a HSM for each selected CPU on the component diagram
+        //Add a HSM Task for each selected CPU on the component diagram
         for (String cpuName : selectedCpuTasks.keySet()) {
             Map<String, HSMChannel> hsmChannels = new HashMap<String, HSMChannel>();
             TMLCPrimitiveComponent hsm = new TMLCPrimitiveComponent(0, 500, tcdp.getMinX(), tcdp.getMaxX(), tcdp.getMinY(), tcdp.getMaxY(), false, null, tcdp);
@@ -210,8 +210,6 @@ public class HSMGeneration implements Runnable {
                 //
                 continue;
             }
-            //  
-            //
             for (TMLCPrimitiveComponent comp : comps) {
 
                 Map<String, HSMChannel> compChannels = new HashMap<String, HSMChannel>();
@@ -473,15 +471,9 @@ public class HSMGeneration implements Runnable {
                     }
                     TGConnectingPoint point = fromStart.getTGConnectingPointP2();
 
-                    //Set isEnc to false
-                    int yShift = 50;
-              //      TMLADActionState act = new TMLADActionState(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
-                //    act.setValue("isEnc=false");
-                  //  tad.addComponent(act, xpos, ypos + yShift, false, true);
-                    //fromStart.setP2(act.getTGConnectingPointAtIndex(0));
 
+                    int yShift = 50;
 
-                    //Add send request operator
 
                     yShift += 50;
                     TMLADSendRequest req = new TMLADSendRequest(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
@@ -493,11 +485,8 @@ public class HSMGeneration implements Runnable {
                     tad.addComponent(req, xpos, ypos + yShift, false, true);
 
 
-                    //Add connection
-                   // fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
-                  //  fromStart.setP1(act.getTGConnectingPointAtIndex(1));
                     fromStart.setP2(req.getTGConnectingPointAtIndex(0));
-                  //  tad.addComponent(fromStart, xpos, ypos, false, true);
+
 
 
                     yShift += 50;
@@ -547,9 +536,6 @@ public class HSMGeneration implements Runnable {
                     tad.setMaxPanelSize(tad.getMaxX(), tad.getMaxY() + yShift);
                     tad.repaint();
                 }
-                //for (String chan: chanNames){
-                //                        hsmChannels.put(chan, compName);
-                //}
             }
 
             int xpos = 0;
diff --git a/src/main/java/ui/SecurityGeneration.java b/src/main/java/ui/SecurityGeneration.java
index c8a2e0b0eb76893b45a152dcadbbad3a8e7cb687..bab0866e1ac1567a1cade412d764f89c060914a4 100644
--- a/src/main/java/ui/SecurityGeneration.java
+++ b/src/main/java/ui/SecurityGeneration.java
@@ -46,17 +46,30 @@ public class SecurityGeneration implements Runnable {
 	String encComp;
 	String overhead;
 	String decComp;
+	Map<String, List<String>> selectedCPUTasks;
 	boolean autoConf;
 	boolean autoWeakAuth;
 	boolean autoStrongAuth;
+	int channelIndex=0;
 	
+	TMLComponentDesignPanel tmlcdp;
 	AVATAR2ProVerif avatar2proverif;
 	AvatarSpecification avatarspec;
 	ProVerifSpec proverif;
+	Map<String, HSMChannel> hsmChannels = new HashMap<String, HSMChannel>();
 	
+	Map<String, HSMChannel> secChannels = new HashMap<String, HSMChannel>();
 	
+	Map<String, Integer> channelIndexMap = new HashMap<String, Integer>();
 	
-	public SecurityGeneration(MainGUI gui, String name, TMLMapping<TGComponent> map, TMLArchiPanel newarch, String encComp, String overhead, String decComp, boolean autoConf, boolean autoWeakAuth, boolean autoStrongAuth){
+	Map<String, List<HSMChannel>> hsmChannelMap = new HashMap<String, List<HSMChannel>>();
+	
+	Map<String, String> taskHSMMap = new HashMap<String, String>();
+	List<String> hsmTasks = new ArrayList<String>();
+	
+	Map<String, String> channelSecMap = new HashMap<String, String>();
+	
+	public SecurityGeneration(MainGUI gui, String name, TMLMapping<TGComponent> map, TMLArchiPanel newarch, String encComp, String overhead, String decComp, boolean autoConf, boolean autoWeakAuth, boolean autoStrongAuth,	Map<String, List<String>> selectedCPUTasks){
 	
 		this.gui = gui;
 		this.name=name;
@@ -68,6 +81,7 @@ public class SecurityGeneration implements Runnable {
 		this.autoConf=autoConf;
 		this.autoWeakAuth = autoWeakAuth;
 		this.autoStrongAuth = autoStrongAuth;
+		this.selectedCPUTasks = selectedCPUTasks;
 	}
 	public void proverifAnalysis(TMLMapping<TGComponent> map, List<String> nonAuthChans, List<String> nonSecChans) {
         if (map == null) {
@@ -145,6 +159,7 @@ public class SecurityGeneration implements Runnable {
 		}
 		catch (Exception e){
 			TraceManager.addDev("Error in Security Generation Thread");
+			System.out.println("Error in Security Generation Thread");
 		}
 		return map;
 	}
@@ -158,9 +173,27 @@ public class SecurityGeneration implements Runnable {
         Map<TMLTask, List<String>> nonceInChannels = new HashMap<TMLTask, List<String>>();
         Map<TMLTask, List<String>> macOutChannels = new HashMap<TMLTask, List<String>>();
         Map<TMLTask, List<String>> macInChannels = new HashMap<TMLTask, List<String>>();
-        Map<TMLTask, List<String>> macNonceOutChannels = new HashMap<TMLTask, List<String>>();
-        Map<TMLTask, List<String>> macNonceInChannels = new HashMap<TMLTask, List<String>>();
-        TraceManager.addDev("mapping " + map.getSummaryTaskMapping());
+
+        Map<TMLTask, List<String>> hsmSecInChannels = new HashMap<TMLTask, List<String>>();
+        Map<TMLTask, List<String>> hsmSecOutChannels = new HashMap<TMLTask, List<String>>();  
+
+        //TraceManager.addDev("mapping " + map.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>());
+        	
+        }
+        
+
+        //Proverif Analysis channels
         List<String> nonAuthChans = new ArrayList<String>();
         List<String> nonSecChans = new ArrayList<String>();
 
@@ -177,7 +210,7 @@ public class SecurityGeneration implements Runnable {
 
         //Create clone of Component Diagram + Activity diagrams to secure
         TGComponent tgcomp = map.getTMLModeling().getTGComponent();
-        TMLComponentDesignPanel tmlcdp = (TMLComponentDesignPanel) tgcomp.getTDiagramPanel().tp;
+        tmlcdp = (TMLComponentDesignPanel) tgcomp.getTDiagramPanel().tp;
 //        TMLComponentDesignPanel tmlcdp = map.getTMLCDesignPanel();
         int ind = gui.tabs.indexOf(tmlcdp);
         if (ind == -1) {
@@ -186,9 +219,9 @@ public class SecurityGeneration implements Runnable {
         }
         String tabName = gui.getTitleAt(tmlcdp);
         gui.cloneRenameTab(ind, name);
-        TMLComponentDesignPanel t = (TMLComponentDesignPanel) gui.tabs.get(gui.tabs.size() - 1);
+        tmlcdp = (TMLComponentDesignPanel) gui.tabs.get(gui.tabs.size() - 1);
 
-        TMLComponentTaskDiagramPanel tcdp = t.tmlctdp;
+        TMLComponentTaskDiagramPanel tcdp = tmlcdp.tmlctdp;
         //Create clone of architecture panel and map tasks to it
         newarch.renameMapping(tabName, tabName + "_" + name);
 
@@ -203,6 +236,8 @@ public class SecurityGeneration implements Runnable {
             List<String> tmp8 = new ArrayList<String>();
             List<String> tmp9 = new ArrayList<String>();
             List<String> tmp10 = new ArrayList<String>();
+            
+            
             secInChannels.put(task, tmp);
             secOutChannels.put(task, tmp2);
             toSecure.put(task, tmp3);
@@ -211,13 +246,17 @@ public class SecurityGeneration implements Runnable {
             nonceOutChannels.put(task, tmp6);
             macInChannels.put(task, tmp7);
             macOutChannels.put(task, tmp8);
-            macNonceOutChannels.put(task, tmp9);
-            macNonceInChannels.put(task, tmp10);
+
+        	hsmSecInChannels.put(task, tmp9);
+        	hsmSecOutChannels.put(task, tmp10);
+            
         }
+
+        
         //With the proverif results, check which channels need to be secured
         for (TMLTask task : map.getTMLModeling().getTasks()) {
             //Check if all channel operators are secured
-            TMLActivityDiagramPanel tad = t.getTMLActivityDiagramPanel(task.getName());
+            TMLActivityDiagramPanel tad = tmlcdp.getTMLActivityDiagramPanel(task.getName());
             for (TGComponent tg : tad.getComponentList()) {
                 if (tg instanceof TMLADWriteChannel) {
                     TMLADWriteChannel writeChannel = (TMLADWriteChannel) tg;
@@ -226,49 +265,287 @@ public class SecurityGeneration implements Runnable {
                         TMLChannel chan = tmlmodel.getChannelByName(tabName + "__" + writeChannel.getChannelName());
                         //
                         if (chan != null) {
-                            if (chan.checkConf && autoConf) {
-                                //        
-                                if (nonSecChans.contains(chan.getOriginTask().getName().split("__")[1] + "__" + writeChannel.getChannelName() + "_chData") && !secInChannels.get(chan.getDestinationTask()).contains(writeChannel.getChannelName())) {
-                                    //                                                                                            if (!securePath(map, chan.getOriginTask(), chan.getDestinationTask())){
-                                    secOutChannels.get(chan.getOriginTask()).add(writeChannel.getChannelName());
-                                    secInChannels.get(chan.getDestinationTask()).add(writeChannel.getChannelName());
-                                    toSecure.get(chan.getOriginTask()).add(chan.getDestinationTask());
-                                    if (chan.checkAuth && autoStrongAuth) {
-                                        toSecureRev.get(chan.getDestinationTask()).add(chan.getOriginTask());
-                                        nonceOutChannels.get(chan.getOriginTask()).add(writeChannel.getChannelName());
-                                        nonceInChannels.get(chan.getDestinationTask()).add(writeChannel.getChannelName());
-                                    }
+                            if (chan.checkConf && autoConf && nonSecChans.contains(chan.getOriginTask().getName().split("__")[1] + "__" + writeChannel.getChannelName() + "_chData")) {
+                            	toSecure.get(chan.getOriginTask()).add(chan.getDestinationTask());
+                            	if (chan.checkAuth && autoStrongAuth) {
+                                	toSecureRev.get(chan.getDestinationTask()).add(chan.getOriginTask());
                                 }
-                            } else if (chan.checkAuth && autoWeakAuth) {
-                                if (nonAuthChans.contains(chan.getDestinationTask().getName().split("__")[1] + "__" + writeChannel.getChannelName())) {
-                                    toSecure.get(chan.getOriginTask()).add(chan.getDestinationTask());
-                                    macOutChannels.get(chan.getOriginTask()).add(writeChannel.getChannelName());
-                                    macInChannels.get(chan.getDestinationTask()).add(writeChannel.getChannelName());
-                                    if (autoStrongAuth) {
-                                        toSecureRev.get(chan.getDestinationTask()).add(chan.getOriginTask());
-                                        macNonceInChannels.get(chan.getDestinationTask()).add(writeChannel.getChannelName());
-                                        macNonceOutChannels.get(chan.getOriginTask()).add(writeChannel.getChannelName());
+                            	if (hsmTasks.contains(chan.getOriginTask().getName().split("__")[1])){
+                            		if (!hsmSecOutChannels.get(chan.getOriginTask()).contains(writeChannel.getChannelName())){
+                            			HSMChannel hsmchan = new HSMChannel(writeChannel.getChannelName(),  chan.getOriginTask().getName().split("__")[1], HSMChannel.SENC);
+                            			hsmChannelMap.get(taskHSMMap.get(chan.getOriginTask().getName().split("__")[1])).add(hsmchan);
+                            			hsmSecOutChannels.get(chan.getOriginTask()).add(writeChannel.getChannelName());
+                            			channelSecMap.put(writeChannel.getChannelName(), "hsmSec_"+writeChannel.getChannelName());
+                            			if (chan.checkAuth && autoStrongAuth) {
+                                    		nonceOutChannels.get(chan.getOriginTask()).add(writeChannel.getChannelName());
+                                    		hsmchan.nonceName="nonce_" + chan.getDestinationTask().getName().split("__")[1] + "_" + chan.getOriginTask().getName().split("__")[1];
+                                    	}
                                     }
+                            	}
+                            	else {
+                            		if (!secInChannels.get(chan.getOriginTask()).contains(writeChannel.getChannelName())) {
+                            			secOutChannels.get(chan.getOriginTask()).add(writeChannel.getChannelName());
+                            			channelSecMap.put(writeChannel.getChannelName(), "autoEncrypt_"+writeChannel.getChannelName());	
+                            	        if (chan.checkAuth && autoStrongAuth) {
+                                    		nonceOutChannels.get(chan.getOriginTask()).add(writeChannel.getChannelName());
+                                    	}
+                            		}
+                            	}
+                            	
+                            	if (hsmTasks.contains(chan.getDestinationTask().getName().split("__")[1])){
+                            		if (!hsmSecOutChannels.get(chan.getDestinationTask()).contains(writeChannel.getChannelName())) {
+                            			HSMChannel hsmchan = new HSMChannel(writeChannel.getChannelName(),  chan.getDestinationTask().getName().split("__")[1], HSMChannel.DEC);
+                            			hsmChannelMap.get(taskHSMMap.get(chan.getDestinationTask().getName().split("__")[1])).add(hsmchan);
+                            			hsmSecInChannels.get(chan.getDestinationTask()).add(writeChannel.getChannelName());
+                            			if (chan.checkAuth && autoStrongAuth) {
+                                    		nonceInChannels.get(chan.getDestinationTask()).add(writeChannel.getChannelName());
+                                    		hsmchan.nonceName="nonce_" + chan.getDestinationTask().getName().split("__")[1] + "_" + chan.getOriginTask().getName().split("__")[1];
+                                		}
+                            		}
+                            	}
+                            	else {
+                            		if (!secInChannels.get(chan.getDestinationTask()).contains(writeChannel.getChannelName())) {
+                            			secInChannels.get(chan.getDestinationTask()).add(writeChannel.getChannelName());
+                            			if (chan.checkAuth && autoStrongAuth) {
+                                    	    nonceInChannels.get(chan.getDestinationTask()).add(writeChannel.getChannelName());
+                                    	}
+                            		}
+                            	}                            	
+                            	
+                            } else if (chan.checkAuth && autoWeakAuth && nonAuthChans.contains(chan.getDestinationTask().getName().split("__")[1] + "__" + writeChannel.getChannelName())) {
+                                toSecure.get(chan.getOriginTask()).add(chan.getDestinationTask());
+                            	if (autoStrongAuth) {
+                                	toSecureRev.get(chan.getDestinationTask()).add(chan.getOriginTask());
                                 }
-
+                            	if (hsmTasks.contains(chan.getOriginTask().getName().split("__")[1])){
+                            		if (!hsmSecOutChannels.get(chan.getOriginTask()).contains(writeChannel.getChannelName())){
+                            			HSMChannel hsmchan = new HSMChannel(writeChannel.getChannelName(),  chan.getOriginTask().getName().split("__")[1], HSMChannel.MAC);
+                            			hsmChannelMap.get(taskHSMMap.get(chan.getOriginTask().getName().split("__")[1])).add(hsmchan);
+                            			hsmSecOutChannels.get(chan.getOriginTask()).add(writeChannel.getChannelName());
+                            			channelSecMap.put(writeChannel.getChannelName(), "hsmSec_"+writeChannel.getChannelName());
+                            			if (autoStrongAuth) {
+                                    		nonceOutChannels.get(chan.getOriginTask()).add(writeChannel.getChannelName());
+                                    		hsmchan.nonceName="nonce_" + chan.getDestinationTask().getName().split("__")[1] + "_" + chan.getOriginTask().getName().split("__")[1];
+                                    	}
+                                    }
+                            	}
+                            	else {
+                            		if (!macInChannels.get(chan.getOriginTask()).contains(writeChannel.getChannelName())) {
+                            			macOutChannels.get(chan.getOriginTask()).add(writeChannel.getChannelName());
+                            			channelSecMap.put(writeChannel.getChannelName(), "autoEncrypt_"+writeChannel.getChannelName());	
+                            	        if (autoStrongAuth) {
+                                        	nonceOutChannels.get(chan.getOriginTask()).add(writeChannel.getChannelName());
+                                    	}
+                            		}
+                            	}
+                            	
+                            	if (hsmTasks.contains(chan.getDestinationTask().getName().split("__")[1])){
+                            		if (!hsmSecOutChannels.get(chan.getDestinationTask()).contains(writeChannel.getChannelName())) {
+                            			HSMChannel hsmchan = new HSMChannel(writeChannel.getChannelName(),  chan.getDestinationTask().getName().split("__")[1], HSMChannel.DEC);
+                            			hsmChannelMap.get(taskHSMMap.get(chan.getDestinationTask().getName().split("__")[1])).add(hsmchan);
+                            			hsmSecInChannels.get(chan.getDestinationTask()).add(writeChannel.getChannelName());
+                            			if (chan.checkAuth && autoStrongAuth) {
+                                    		nonceInChannels.get(chan.getDestinationTask()).add(writeChannel.getChannelName());
+                                    		hsmchan.nonceName="nonce_" + chan.getDestinationTask().getName().split("__")[1] + "_" + chan.getOriginTask().getName().split("__")[1];
+                                		}
+                            		}
+                            	}
+                            	else {
+                            		if (!secInChannels.get(chan.getDestinationTask()).contains(writeChannel.getChannelName())) {
+                            			secInChannels.get(chan.getDestinationTask()).add(writeChannel.getChannelName());
+                            			if (chan.checkAuth && autoStrongAuth) {
+                                    	    nonceInChannels.get(chan.getDestinationTask()).add(writeChannel.getChannelName());
+                                    	}
+                            		}
+                            	}  
                             }
                         }
                     }
                 }
             }
         }
+        
+       // System.out.println("hsmchannelmap" + hsmChannelMap);
+        
+        
         TraceManager.addDev("macoutchans " + macOutChannels);
         TraceManager.addDev("macinchans " + macInChannels);
         TraceManager.addDev("nonsecin " + secInChannels);
         TraceManager.addDev("nonsecout " + secOutChannels);
         TraceManager.addDev("noncein " + nonceInChannels);
         TraceManager.addDev("nonceout " + nonceOutChannels);
+        
+        
+        //Add a HSM Task for each selected CPU on the component diagram, add associated channels, etc
+        for (String cpuName : selectedCPUTasks.keySet()) {
+            TMLCPrimitiveComponent hsm = new TMLCPrimitiveComponent(0, 500, tcdp.getMinX(), tcdp.getMaxX(), tcdp.getMinY(), tcdp.getMaxY(), false, null, tcdp);
+            TAttribute index = new TAttribute(2, "channelIndex", "0", 0);
+            hsm.getAttributeList().add(index);
+            tcdp.addComponent(hsm, 0, 500, false, true);
+            hsm.setValueWithChange("HSM_" + cpuName);
+            //Find all associated components
+            List<TMLCPrimitiveComponent> comps = new ArrayList<TMLCPrimitiveComponent>();
+            //Find the component to add a HSM to
+
+            for (TGComponent tg : tcdp.getComponentList()) {
+                if (tg instanceof TMLCPrimitiveComponent) {
+                    for (String compName : selectedCPUTasks.get(cpuName)) {
+                        if (tg.getValue().equals(compName)) {
+                            comps.add((TMLCPrimitiveComponent) tg);
+                            break;
+                        }
+                    }
+                } else if (tg instanceof TMLCCompositeComponent) {
+                    TMLCCompositeComponent cc = (TMLCCompositeComponent) tg;
+                    List<TMLCPrimitiveComponent> pcomps = cc.getAllPrimitiveComponents();
+                    for (TMLCPrimitiveComponent pc : pcomps) {
+                        for (String compName : selectedCPUTasks.get(cpuName)) {
+                            if (pc.getValue().equals(compName)) {
+                                comps.add(pc);
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+            if (comps.size() == 0) {
+                //System.out.println("No Components found");
+                continue;
+            }
+
+            for (TMLCPrimitiveComponent 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.getValue())){
+                		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) {
+                    TMLCChannelOutPort originPort = new TMLCChannelOutPort(comp.getX(), comp.getY(), tcdp.getMinX(), tcdp.getMaxX(), tcdp.getMinY(), tcdp.getMaxX(), true, hsm, tcdp);
+                    TMLCChannelOutPort destPort = new TMLCChannelOutPort(comp.getX(), comp.getY(), tcdp.getMinX(), tcdp.getMaxX(), tcdp.getMinY(), tcdp.getMaxX(), true, comp, tcdp);
+                    originPort.commName = hsmChan.name;
+                    originPort.isOrigin = hsmChan.isOrigin;
+                    tcdp.addComponent(originPort, hsm.getX(), hsm.getY(), true, true);
+                    destPort.commName = hsmChan.name;
+                    if (!hsmChan.isChan) {
+                        originPort.typep = 2;
+                        destPort.typep = 2;
+                        originPort.setParam(0, new TType(1));
+                        destPort.setParam(0, new TType(1));
+                    }
+                    destPort.isOrigin = !hsmChan.isOrigin;
+
+                    tcdp.addComponent(destPort, comp.getX(), comp.getY(), true, true);
+
+                    TMLCPortConnector conn = new TMLCPortConnector(0, 0, tcdp.getMinX(), tcdp.getMaxX(), tcdp.getMinY(), tcdp.getMaxX(), true, null, tcdp, originPort.getTGConnectingPointAtIndex(0), destPort.getTGConnectingPointAtIndex(0), new Vector<Point>());
+                    tcdp.addComponent(conn, 0, 0, false, true);
+                }
+        	}
+        }
+        
+        
+		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
+            TMLArchiDiagramPanel archPanel = newarch.tmlap;
+            TMLArchiCPUNode cpu = null;
+            String refTask = "";
+            for (TGComponent tg : archPanel.getComponentList()) {
+                if (tg instanceof TMLArchiCPUNode) {
+                    if (tg.getName().equals(cpuName)) {
+                        cpu = (TMLArchiCPUNode) tg;
+                        TMLArchiArtifact art = cpu.getArtifactList().get(0);
+                        refTask = art.getReferenceTaskName();
+                        break;
+
+                    }
+                }
+            }
+
+            if (cpu == null) {
+                return;
+            }
+
+            //Add new memory
+            TMLArchiMemoryNode mem = new TMLArchiMemoryNode(cpu.getX(), archPanel.getMaxY()-400, archPanel.getMinX(), archPanel.getMaxX(), archPanel.getMinY(), archPanel.getMaxY(), true, null, archPanel);
+            archPanel.addComponent(mem, cpu.getX(), archPanel.getMaxY()-400, false, true);
+            mem.setName("HSMMemory_" + cpuName);
+            //Add Hardware Accelerator
+
+            TMLArchiHWANode hwa = new TMLArchiHWANode(cpu.getX() + 100, cpu.getY() + 100, archPanel.getMinX(), archPanel.getMaxX(), archPanel.getMinY(), archPanel.getMaxY(), true, null, archPanel);
+            archPanel.addComponent(hwa, cpu.getX() + 100, cpu.getY() + 100, false, true);
+            hwa.setName("HSM_" + cpuName);
+            //Add hsm task to hwa
+
+
+            TMLArchiArtifact hsmArt = new TMLArchiArtifact(cpu.getX() + 100, cpu.getY() + 100, archPanel.getMinX(), archPanel.getMaxX(), archPanel.getMinY(), archPanel.getMaxY(), true, hwa, archPanel);
+            archPanel.addComponent(hsmArt, cpu.getX() + 100, cpu.getY() + 100, true, true);
+            hsmArt.setFullName("HSM_" + cpuName, refTask);
+            //Add bus connecting the cpu and HWA
+
+            TMLArchiBUSNode bus = new TMLArchiBUSNode(cpu.getX() + 100, cpu.getY() + 100, archPanel.getMinX(), archPanel.getMaxX(), archPanel.getMinY(), archPanel.getMaxY(), true, null, archPanel);
+            bus.setPrivacy(1);
+            bus.setName("HSMBus_" + cpuName);
+            archPanel.addComponent(bus, cpu.getX() + 200, cpu.getY() + 200, false, true);
+
+            //Connect Bus and CPU
+            TMLArchiConnectorNode connect = new TMLArchiConnectorNode(cpu.getX() + 100, cpu.getY() + 100, archPanel.getMinX(), archPanel.getMaxX(), archPanel.getMinY(), archPanel.getMaxY(), true, null, archPanel, null, null, new Vector<Point>());
+            TGConnectingPoint p1 = bus.findFirstFreeTGConnectingPoint(true, true);
+            p1.setFree(false);
+            connect.setP2(p1);
+
+
+            TGConnectingPoint p2 = cpu.findFirstFreeTGConnectingPoint(true, true);
+            p1.setFree(false);
+            connect.setP1(p2);
+            archPanel.addComponent(connect, cpu.getX() + 100, cpu.getY() + 100, false, true);
+            //Connect Bus and HWA
+
+            connect = new TMLArchiConnectorNode(cpu.getX() + 100, cpu.getY() + 100, archPanel.getMinX(), archPanel.getMaxX(), archPanel.getMinY(), archPanel.getMaxY(), true, null, archPanel, null, null, new Vector<Point>());
+            p1 = bus.findFirstFreeTGConnectingPoint(true, true);
+            p1.setFree(false);
+            connect.setP2(p1);
+
+            p2 = hwa.findFirstFreeTGConnectingPoint(true, true);
+            p1.setFree(false);
+            connect.setP1(p2);
+
+            archPanel.addComponent(connect, cpu.getX() + 100, cpu.getY() + 100, false, true);
+            //Connect Bus and Memory
+
+            connect = new TMLArchiConnectorNode(cpu.getX() + 100, cpu.getY() + 100, archPanel.getMinX(), archPanel.getMaxX(), archPanel.getMinY(), archPanel.getMaxY(), true, null, archPanel, null, null, new Vector<Point>());
+            p1 = bus.findFirstFreeTGConnectingPoint(true, true);
+            p1.setFree(false);
+            connect.setP2(p1);
+
+            p2 = mem.findFirstFreeTGConnectingPoint(true, true);
+            p1.setFree(false);
+            connect.setP1(p2);
+            archPanel.addComponent(connect, cpu.getX() + 100, cpu.getY() + 100, false, true);
+        }
 
         //        
         //        int num=0;
         //int nonceNum=0;
         //Create reverse channels on component diagram to send nonces if they don't already exist
 
+
         for (TMLTask task : toSecureRev.keySet()) {
             TraceManager.addDev("Adding nonces to " + task.getName());
             List<TMLChannel> chans = tmlmodel.getChannelsFromMe(task);
@@ -321,12 +598,16 @@ public class SecurityGeneration implements Runnable {
                 }
             }
         }
+        
+        
+
+        
         //  }
         //Add encryption/nonces to activity diagram
         for (TMLTask task : toSecure.keySet()) {
-            String title = task.getName().split("__")[0];
+		    String title = task.getName().split("__")[0];
             TraceManager.addDev("Securing task " + task.getName());
-            TMLActivityDiagramPanel tad = t.getTMLActivityDiagramPanel(task.getName());
+            TMLActivityDiagramPanel tad = tmlcdp.getTMLActivityDiagramPanel(task.getName());
             //Get start state position, shift everything down
             int xpos = 0;
             int ypos = 0;
@@ -336,6 +617,7 @@ public class SecurityGeneration implements Runnable {
 
             //For each occurence of a write channel operator, add encryption/nonces before it
 
+
             for (String channel : secOutChannels.get(task)) {
                 Set<TGComponent> channelInstances = new HashSet<TGComponent>();
                 int yShift = 50;
@@ -385,7 +667,7 @@ public class SecurityGeneration implements Runnable {
                         }
                     }
 
-                    enc.securityContext = "autoEncrypt_" + channel;
+                    enc.securityContext = channelSecMap.get(channel);
                     enc.type = "Symmetric Encryption";
                     enc.message_overhead = overhead;
                     enc.encTime = encComp;
@@ -407,7 +689,7 @@ public class SecurityGeneration implements Runnable {
                             TraceManager.addDev("Inspecting write channel " + wChannel.getChannelName());
                             if (channel.equals(wChannel.getChannelName()) && wChannel.getSecurityContext().equals("")) {
                                 TraceManager.addDev("Securing write channel " + wChannel.getChannelName());
-                                wChannel.setSecurityContext("autoEncrypt_" + wChannel.getChannelName());
+                                wChannel.setSecurityContext(channelSecMap.get(channel));
 
                             }
                         }
@@ -450,7 +732,7 @@ public class SecurityGeneration implements Runnable {
 
                     //If we need to receive a nonce
                     TMLADReadChannel rd = new TMLADReadChannel(0, 0, 0, 0, 0, 0, false, null, tad);
-                    if (macNonceOutChannels.get(task).contains(channel)) {
+                    if (nonceOutChannels.get(task).contains(channel)) {
                         //Receive any nonces if ensuring authenticity
                         rd = new TMLADReadChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
                         List<TMLChannel> matches = tmlmodel.getChannels(tmlc.getDestinationTask(), tmlc.getOriginTask());
@@ -476,7 +758,7 @@ public class SecurityGeneration implements Runnable {
 
                     //Add encryption operator
 
-                    enc.securityContext = "autoEncrypt_" + channel;
+                    enc.securityContext = channelSecMap.get(channel);
                     enc.type = "MAC";
                     enc.message_overhead = overhead;
                     enc.encTime = encComp;
@@ -499,7 +781,7 @@ public class SecurityGeneration implements Runnable {
                             TraceManager.addDev("Inspecting write channel " + wChannel.getChannelName());
                             if (channel.equals(wChannel.getChannelName()) && wChannel.getSecurityContext().equals("")) {
                                 TraceManager.addDev("Securing write channel " + wChannel.getChannelName());
-                                wChannel.setSecurityContext("autoEncrypt_" + wChannel.getChannelName());
+                                wChannel.setSecurityContext(channelSecMap.get(channel));
                                 tad.repaint();
                             }
                         }
@@ -510,6 +792,324 @@ public class SecurityGeneration implements Runnable {
                     tad.setMaxPanelSize(tad.getMaxX(), tad.getMaxY() + yShift);
                 }
             }
+            for (String channel: hsmSecOutChannels.get(task)){
+           		Set<TGComponent> channelInstances = new HashSet<TGComponent>();
+				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 (TGComponent tg : tad.getComponentList()) {
+                    if (tg instanceof TMLADWriteChannel) {
+                        TMLADWriteChannel writeChannel = (TMLADWriteChannel) tg;
+                        if (writeChannel.getChannelName().equals(channel) && writeChannel.getSecurityContext().equals("")) {
+                            fromStart = tad.findTGConnectorEndingAt(tg.getTGConnectingPointAtIndex(0));
+                            if (fromStart != null) {
+                                channelInstances.add(tg);
+                            }
+                        }
+                    }
+                }
+                for (TGComponent chan : channelInstances) {
+
+                	TMLADWriteChannel writeChannel = (TMLADWriteChannel) chan;
+                    String chanName = writeChannel.getChannelName();
+                    TMLChannel tmlc = tmlmodel.getChannelByName(title + "__" + chanName);
+                    writeChannel.setSecurityContext(channelSecMap.get(chanName));
+                    xpos = chan.getX();
+                    ypos = chan.getY();
+                    fromStart = tad.findTGConnectorEndingAt(chan.getTGConnectingPointAtIndex(0));
+                    point = fromStart.getTGConnectingPointP2();
+
+                    int yShift = 50;
+                    
+
+                    
+
+                    TMLADSendRequest req = new TMLADSendRequest(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
+                    req.setRequestName("startHSM_" + taskHSMMap.get(task.getName().split("__")[1]));
+                    
+
+                    req.setParam(0, Integer.toString(channelIndexMap.get(chanName)));
+                    req.makeValue();
+                    tad.addComponent(req, xpos, ypos + yShift, false, true);
+
+                    fromStart.setP2(req.getTGConnectingPointAtIndex(0));
+                    tad.addComponent(fromStart, xpos, ypos, false, true);
+
+                    //Add connection
+                    fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
+                    fromStart.setP1(req.getTGConnectingPointAtIndex(1));
+                    
+
+                    
+                    
+                    
+                    TMLADWriteChannel wr = new TMLADWriteChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
+
+	
+
+                    yShift += 50;
+                    //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.setSecurityContext(channelSecMap.get(chanName));
+                    tad.addComponent(wr, xpos, ypos + yShift, false, true);
+
+
+                    fromStart.setP2(wr.getTGConnectingPointAtIndex(0));
+                    tad.addComponent(fromStart, xpos, ypos, false, true);
+
+                    fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
+                    tad.addComponent(fromStart, xpos, ypos, false, true);
+                    fromStart.setP1(wr.getTGConnectingPointAtIndex(1));
+
+
+					TMLADReadChannel rd = new TMLADReadChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
+					
+					TMLADWriteChannel wr2 = new TMLADWriteChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
+					
+                    //Receive any nonces if ensuring authenticity           
+                    if (nonceOutChannels.get(task).contains(channel)) {
+                    	//Read nonce from rec task
+                        yShift+=50;
+                        
+                        List<TMLChannel> matches = tmlmodel.getChannels(tmlc.getDestinationTask(), tmlc.getOriginTask());
+						rd = new TMLADReadChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
+                        if (matches.size() > 0) {
+                            rd.setChannelName(matches.get(0).getName().replaceAll(title + "__", ""));
+                        } else {
+                            rd.setChannelName("nonceCh" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]);
+                        }
+                        rd.setSecurityContext("nonce_" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]);
+                        tad.addComponent(rd, xpos, ypos + yShift, false, true);
+                        fromStart.setP2(rd.getTGConnectingPointAtIndex(0));
+                        
+                        fromStart = new TGConnectorTMLAD(rd.getX(), rd.getY(), tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
+                        tad.addComponent(fromStart, xpos, ypos, false, true);
+                        fromStart.setP1(rd.getTGConnectingPointAtIndex(1));
+                        
+                        
+                        //Also send nonce to hsm
+                        yShift+=50;
+ 		                wr2 = new TMLADWriteChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);       
+                    	wr2.setChannelName("data_" + chanName + "_" + task.getName().split("__")[1]);
+                    	wr2.setSecurityContext(channelSecMap.get(chanName));
+                    	tad.addComponent(wr2, xpos, ypos + yShift, false, true);
+                    	
+                    	TGConnectorTMLAD tmp = new TGConnectorTMLAD(wr2.getX(), wr2.getY() + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, rd.getTGConnectingPointAtIndex(1), wr2.getTGConnectingPointAtIndex(0), new Vector<Point>());
+                        tad.addComponent(tmp, xpos, ypos, false, true);
+                        
+                    	fromStart.setP2(wr2.getTGConnectingPointAtIndex(0));
+                        
+                        fromStart = new TGConnectorTMLAD(rd.getX(), rd.getY(), tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
+                        tad.addComponent(fromStart, xpos, ypos, false, true);
+                        fromStart.setP1(wr2.getTGConnectingPointAtIndex(1));
+                        
+                        
+                        
+                        yShift += 60;
+                    }
+                    
+
+                    //Read channel operator to receive hsm data
+
+                    yShift += 60;
+                    TMLADReadChannel rd2 = new TMLADReadChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
+                    rd2.setChannelName("retData_" + chanName + "_" + task.getName().split("__")[1]);
+                    rd2.setSecurityContext(channelSecMap.get(chanName));
+                    tad.addComponent(rd2, xpos, ypos + yShift, false, true);
+
+                    fromStart.setP2(rd2.getTGConnectingPointAtIndex(0));
+                    yShift += 50;
+
+                    //Add connector
+                    fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
+                    tad.addComponent(fromStart, xpos, ypos, false, true);
+                    fromStart.setP1(rd2.getTGConnectingPointAtIndex(1));
+                    yShift += 50;
+
+                    //Direct the last TGConnector back to the start of the write channel operator
+
+
+                    fromStart.setP2(point);
+                    //Shift components down to make room for the added ones, and add security contexts to write channels
+                    for (TGComponent tg : tad.getComponentList()) {
+                        if (tg.getY() >= ypos && tg != wr && tg != req && tg != rd && tg!=wr2 && tg!=rd2) {
+                            tg.setCd(tg.getX(), tg.getY() + yShift);
+                        }
+                    }
+                    tad.setMaxPanelSize(tad.getMaxX(), tad.getMaxY() + yShift);
+                    tad.repaint();        
+            	}   	
+            }
+        	
+            for (String channel: hsmSecInChannels.get(task)){
+           		Set<TGComponent> channelInstances = new HashSet<TGComponent>();
+				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 (TGComponent tg : tad.getComponentList()) {
+                    if (tg instanceof TMLADReadChannel) {
+                        TMLADReadChannel readChannel = (TMLADReadChannel) tg;
+                        if (readChannel.getChannelName().equals(channel) && readChannel.getSecurityContext().equals("")) {
+                            fromStart = tad.findTGConnectorEndingAt(tg.getTGConnectingPointAtIndex(0));
+                            if (fromStart != null) {
+                                channelInstances.add(tg);
+                            }
+                        }
+                    }
+                }
+                for (TGComponent chan : channelInstances) {
+                	TMLADReadChannel readChannel = (TMLADReadChannel) chan;
+                    String chanName = readChannel.getChannelName();
+                    TMLChannel tmlc = tmlmodel.getChannelByName(title + "__" + chanName);
+                    readChannel.setSecurityContext(channelSecMap.get(chanName));
+                    xpos = chan.getX();
+                    ypos = chan.getY();
+                    fromStart = tad.findTGConnectorEndingAt(chan.getTGConnectingPointAtIndex(0));
+                    point = fromStart.getTGConnectingPointP2();
+
+                    int yShift = 50;
+                    
+                    
+                    
+                    
+
+                    TMLADSendRequest req = new TMLADSendRequest(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
+                    req.setRequestName("startHSM_" + taskHSMMap.get(task.getName().split("__")[1]));
+                    
+                   
+                    
+
+                    req.setParam(0, Integer.toString(channelIndexMap.get(chanName)));
+                    req.makeValue();
+                    tad.addComponent(req, xpos, ypos + yShift, false, true);
+
+                    fromStart.setP2(req.getTGConnectingPointAtIndex(0));
+                    tad.addComponent(fromStart, xpos, ypos, false, true);
+
+                    //Add connection
+                    fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
+                    fromStart.setP1(req.getTGConnectingPointAtIndex(1));
+                    TMLADWriteChannel wr = new TMLADWriteChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
+
+                    yShift += 50;
+                    //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.setSecurityContext(channelSecMap.get(chanName));
+                    tad.addComponent(wr, xpos, ypos + yShift, false, true);
+
+
+                    fromStart.setP2(wr.getTGConnectingPointAtIndex(0));
+                    tad.addComponent(fromStart, xpos, ypos, false, true);
+
+                    fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
+                    tad.addComponent(fromStart, xpos, ypos, false, true);
+                    fromStart.setP1(wr.getTGConnectingPointAtIndex(1));
+
+
+
+
+
+
+ 					//If needed, forge nonce, send it to receiving task
+                    TMLADEncrypt nonce = new TMLADEncrypt(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
+                    TMLADWriteChannel wr3 = new TMLADWriteChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
+                    TMLADWriteChannel wr2 = new TMLADWriteChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
+                    
+                    if (nonceInChannels.get(task).contains(channel)) {
+                        //Create a nonce operator and a write channel operator
+                        yShift+=60;
+                        nonce = new TMLADEncrypt(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
+                        nonce.securityContext = "nonce_" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1];
+                        nonce.type = "Nonce";
+                        nonce.message_overhead = overhead;
+                        nonce.encTime = encComp;
+                        nonce.decTime = decComp;
+                        tad.addComponent(nonce, xpos, ypos + yShift, false, true);
+                        fromStart.setP2(nonce.getTGConnectingPointAtIndex(0));
+                        yShift += 50;
+                        
+                        wr3 = new TMLADWriteChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
+                        //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.setChannelName(matches.get(0).getName().replaceAll(title + "__", ""));
+                        } else {
+                            wr3.setChannelName("nonceCh" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]);
+                        }
+                        //send the nonce along the channel
+                        wr3.setSecurityContext("nonce_" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]);
+                        tad.addComponent(wr3, xpos, ypos + yShift, false, true);
+                        
+                        wr3.makeValue();
+                        TGConnector tmp = new TGConnectorTMLAD(wr3.getX(), wr3.getY() + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, nonce.getTGConnectingPointAtIndex(1), wr3.getTGConnectingPointAtIndex(0), new Vector<Point>());
+                        tad.addComponent(tmp, xpos, ypos, false, true);
+                        
+                        
+                        //Also send nonce to hsm
+                        yShift+=50;
+                        wr2 = new TMLADWriteChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
+                    	wr2.setChannelName("data_" + chanName + "_" + task.getName().split("__")[1]);
+                    	wr2.setSecurityContext("nonce_" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]);
+                    	tad.addComponent(wr2, xpos, ypos + yShift, false, true);
+                    	
+                    	tmp = new TGConnectorTMLAD(wr2.getX(), wr2.getY() + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, wr3.getTGConnectingPointAtIndex(1), wr2.getTGConnectingPointAtIndex(0), new Vector<Point>());
+                        tad.addComponent(tmp, xpos, ypos, false, true);
+                        
+                        fromStart = new TGConnectorTMLAD(wr2.getX(), wr.getY(), tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, wr2.getTGConnectingPointAtIndex(1), null, new Vector<Point>());
+                        tad.addComponent(fromStart, xpos, ypos, false, true);
+                        //Connect created write channel operator to start of read channel operator
+                        fromStart.setP1(wr2.getTGConnectingPointAtIndex(1));
+                        fromStart.setP2(point);
+                        
+                                                
+
+                        
+                        
+                        
+                      /*  //Shift everything from the read channel on down
+                        for (TGComponent tg : tad.getComponentList()) {
+                            if (tg.getY() >= ypos && tg != nonce && tg != wr2 && tg!=wr3) {
+                                tg.setCd(tg.getX(), tg.getY() + yShift);
+                            }
+                        }*/
+                    }
+
+
+
+
+                    //Add read channel operator
+
+                    yShift += 60;
+                    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));
+                    tad.addComponent(rd, xpos, ypos + yShift, false, true);
+
+                    fromStart.setP2(rd.getTGConnectingPointAtIndex(0));
+                    yShift += 50;
+
+                    //Add connector
+                    fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
+                    tad.addComponent(fromStart, xpos, ypos, false, true);
+                    fromStart.setP1(rd.getTGConnectingPointAtIndex(1));
+                    yShift += 50;
+
+                    //Direct the last TGConnector back to the start of the read channel operator
+
+
+                    fromStart.setP2(point);
+                    //Shift components down to make room for the added ones, and add security contexts to write channels
+                    for (TGComponent tg : tad.getComponentList()) {
+                        if (tg.getY() >= ypos && tg != wr && tg != req && tg != rd && tg!=wr2 && tg!=nonce && tg!=wr3) {
+                            tg.setCd(tg.getX(), tg.getY() + yShift);
+                        }
+                    }
+                    tad.setMaxPanelSize(tad.getMaxX(), tad.getMaxY() + yShift);
+                    tad.repaint();        
+            	}   	
+            }
             for (String channel : macInChannels.get(task)) {
                 //Add decryptmac after readchannel
                 int yShift = 50;
@@ -543,13 +1143,13 @@ public class SecurityGeneration implements Runnable {
 
                     TMLADReadChannel readChannel = (TMLADReadChannel) comp;
                     TraceManager.addDev("Securing read channel " + readChannel.getChannelName());
-                    readChannel.setSecurityContext("autoEncrypt_" + readChannel.getChannelName());
+                    readChannel.setSecurityContext(channelSecMap.get(readChannel.getChannelName()));
                     tad.repaint();
 
                     TMLADWriteChannel wr = new TMLADWriteChannel(0, 0, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
                     //Create nonce and send it
                     TMLChannel tmlc = tmlmodel.getChannelByName(title + "__" + channel);
-                    if (macNonceInChannels.get(task).contains(channel)) {
+                    if (nonceInChannels.get(task).contains(channel)) {
                         //Create a nonce operator and a write channel operator
                         TMLADEncrypt nonce = new TMLADEncrypt(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
                         nonce.securityContext = "nonce_" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1];
@@ -594,7 +1194,7 @@ public class SecurityGeneration implements Runnable {
                     ypos = conn.getY();
 
                     TMLADDecrypt dec = new TMLADDecrypt(xpos + 10, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
-                    dec.securityContext = "autoEncrypt_" + readChannel.getChannelName();
+                    dec.securityContext = channelSecMap.get(readChannel.getChannelName());
                     tad.addComponent(dec, dec.getX(), dec.getY(), false, true);
                     conn.setP2(dec.getTGConnectingPointAtIndex(0));
                     yShift += 60;
@@ -609,7 +1209,7 @@ public class SecurityGeneration implements Runnable {
                             TraceManager.addDev("Inspecting read channel " + readChannel.getChannelName());
                             if (channel.equals(readChannel.getChannelName()) && readChannel.getSecurityContext().equals("")) {
                                 TraceManager.addDev("Securing read channel " + readChannel.getChannelName());
-                                readChannel.setSecurityContext("autoEncrypt_" + readChannel.getChannelName());
+                                readChannel.setSecurityContext(channelSecMap.get(readChannel.getChannelName()));
 
                             }
                         }
@@ -699,16 +1299,16 @@ public class SecurityGeneration implements Runnable {
                     //Now add the decrypt operator
                     yShift = 40;
                     TraceManager.addDev("Securing read channel " + readChannel.getChannelName());
-                    readChannel.setSecurityContext("autoEncrypt_" + readChannel.getChannelName());
+                    readChannel.setSecurityContext(channelSecMap.get(readChannel.getChannelName()));
                     tad.repaint();
                     //Add decryption operator if it does not already exist
                     xpos = readChannel.getX();
                     ypos = readChannel.getY();
                     TMLADDecrypt dec = new TMLADDecrypt(xpos + 10, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
-                    dec.securityContext = "autoEncrypt_" + readChannel.getChannelName();
+                    dec.securityContext = channelSecMap.get(readChannel.getChannelName());
                     tad.addComponent(dec, dec.getX(), dec.getY(), false, true);
                     conn.setP2(dec.getTGConnectingPointAtIndex(0));
-                    yShift += 100;
+                    yShift += 60;
                     conn = new TGConnectorTMLAD(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, dec.getTGConnectingPointAtIndex(1), next, new Vector<Point>());
                     conn.setP1(dec.getTGConnectingPointAtIndex(1));
 
@@ -721,7 +1321,7 @@ public class SecurityGeneration implements Runnable {
                             TraceManager.addDev("Inspecting read channel " + readChannel.getChannelName());
                             if (channel.equals(readChannel.getChannelName()) && readChannel.getSecurityContext().equals("")) {
                                 TraceManager.addDev("Securing read channel " + readChannel.getChannelName());
-                                readChannel.setSecurityContext("autoEncrypt_" + readChannel.getChannelName());
+                                readChannel.setSecurityContext( channelSecMap.get(readChannel.getChannelName()));
 
                             }
                         }
@@ -737,9 +1337,12 @@ public class SecurityGeneration implements Runnable {
                 }
             }
         }
-        GTMLModeling gtm = new GTMLModeling(t, false);
-        TMLModeling<TGComponent> newmodel = gtm.translateToTMLModeling(false, false);
-        for (TMLTask task : newmodel.getTasks()) {
+        
+        
+        
+        GTMLModeling gtm = new GTMLModeling(newarch, false);
+        map = gtm.translateToTMLMapping();
+        /*for (TMLTask task : newmodel.getTasks()) {
             task.setName(tabName + "_" + name + "__" + task.getName());
         }
         for (TMLTask task : tmlmodel.getTasks()) {
@@ -750,11 +1353,318 @@ public class SecurityGeneration implements Runnable {
             } else {
                 
             }
-        }
+        }*/
         //map.setTMLModeling(newmodel);
-        //
-        //TMLMapping newMap = gtm.translateToTMLMapping();
-        map.setTMLModeling(newmodel);
+
+//        map.setTMLModeling(newmodel);
+
         return;
 	}
+	public void buildHSMActivityDiagram(String cpuName){
+		int xpos = 0;
+        int ypos = 0;
+        TGConnector fromStart;
+		//Build HSM Activity diagram
+
+    	TMLActivityDiagramPanel tad = tmlcdp.getTMLActivityDiagramPanel("HSM_" + cpuName);
+    	if (tad ==null){
+    		System.out.println("Missing task ");
+    		return;
+    	}
+
+        TMLADStartState start = (TMLADStartState) tad.getComponentList().get(0);
+        fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
+
+
+        TMLADReadRequestArg req = new TMLADReadRequestArg(300, 100, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
+        tad.addComponent(req, 300, 100, false, true);
+        req.setParam(0, "channelIndex");
+        req.makeValue();
+
+        //Connect start and readrequest
+        fromStart.setP1(start.getTGConnectingPointAtIndex(0));
+        fromStart.setP2(req.getTGConnectingPointAtIndex(0));
+        tad.addComponent(fromStart, 300, 200, false, true);
+
+
+        TMLADChoice choice = new TMLADChoice(300, 200, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
+        tad.addComponent(choice, 300, 200, false, true);
+
+
+        //Connect readrequest and choice
+        fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
+        fromStart.setP1(req.getTGConnectingPointAtIndex(1));
+        fromStart.setP2(choice.getTGConnectingPointAtIndex(0));
+        tad.addComponent(fromStart, 300, 200, false, true);
+
+
+        int xc = 150;
+            //Allows 9 channels max to simplify the diagram
+
+            //If more than 3 channels, build 2 levels of choices
+
+        if (hsmChannelMap.get(cpuName).size() > 3) {
+                TMLADChoice choice2 = new TMLADChoice(xc, 400, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
+                int i = 0;
+                for (HSMChannel ch : hsmChannelMap.get(cpuName)) {
+                    if (i % 3 == 0) {
+                        //Add a new choice every third channel
+                        choice2 = new TMLADChoice(xc, 250, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
+                        tad.addComponent(choice2, xc, 400, false, true);
+                        //Connect new choice operator to top choice
+                        fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
+                        fromStart.setP1(choice.getTGConnectingPointAtIndex(i / 3 + 1));
+                        fromStart.setP2(choice2.getTGConnectingPointAtIndex(0));
+                        tad.addComponent(fromStart, 300, 200, false, true);
+                    }
+                    TMLADReadChannel rd = new TMLADReadChannel(xc, 300, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
+                    rd.setChannelName("data_" + ch.name + "_" + ch.task);
+                    rd.setSecurityContext(channelSecMap.get(ch.name));
+                    tad.addComponent(rd, xc, 300, false, true);
+                    //Connect choice and readchannel
+                    fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
+                    fromStart.setP1(choice2.getTGConnectingPointAtIndex(i % 3 + 1));
+                    fromStart.setP2(rd.getTGConnectingPointAtIndex(0));
+
+                    tad.addComponent(fromStart, 300, 200, false, true);
+                    TMLADWriteChannel wr = new TMLADWriteChannel(xc, 600, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
+                    wr.setChannelName("retData_" + ch.name + "_" + ch.task);
+                    tad.addComponent(wr, xc, 600, false, true);
+                    wr.setSecurityContext(channelSecMap.get(ch.name));
+
+
+                    if (ch.secType == HSMChannel.DEC) {
+                        TMLADDecrypt dec = new TMLADDecrypt(xc, 500, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
+                        dec.securityContext = channelSecMap.get(ch.name);
+                        tad.addComponent(dec, xc, 500, false, true);
+                        fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
+                        fromStart.setP1(rd.getTGConnectingPointAtIndex(1));
+                        fromStart.setP2(dec.getTGConnectingPointAtIndex(0));
+                        tad.addComponent(fromStart, 300, 200, false, true);
+
+                        fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
+                        fromStart.setP1(rd.getTGConnectingPointAtIndex(1));
+                        fromStart.setP2(dec.getTGConnectingPointAtIndex(0));
+                        tad.addComponent(fromStart, 300, 200, false, true);
+
+                        //Connect encrypt and writechannel
+                        fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
+                        fromStart.setP1(dec.getTGConnectingPointAtIndex(1));
+                        fromStart.setP2(wr.getTGConnectingPointAtIndex(0));
+                        tad.addComponent(fromStart, 300, 200, false, true);
+                    } else {
+                        TMLADEncrypt enc = new TMLADEncrypt(xc, 500, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
+                        enc.securityContext = channelSecMap.get(ch.name);
+                        if (ch.secType == HSMChannel.SENC) {
+                            enc.type = "Symmetric Encryption";
+                        } else if (ch.secType == HSMChannel.AENC) {
+                            enc.type = "Asymmetric Encryption";
+                        } else if (ch.secType == HSMChannel.MAC) {
+                            enc.type = "MAC";
+                        } else if (ch.secType == HSMChannel.NONCE) {
+                            enc.type = "Nonce";
+                        }
+
+                        enc.message_overhead = overhead;
+                        enc.encTime = encComp;
+                        enc.decTime = decComp;
+                        enc.nonce = ch.nonceName;
+                        tad.addComponent(enc, xc, 500, false, true);
+
+                        //Connect encrypt and readchannel
+                        fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
+                        fromStart.setP1(rd.getTGConnectingPointAtIndex(1));
+                        fromStart.setP2(enc.getTGConnectingPointAtIndex(0));
+                        tad.addComponent(fromStart, 300, 200, false, true);
+
+                        //Connect encrypt and writechannel
+                        fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
+                        fromStart.setP1(enc.getTGConnectingPointAtIndex(1));
+                        fromStart.setP2(wr.getTGConnectingPointAtIndex(0));
+                        tad.addComponent(fromStart, 300, 200, false, true);
+                        
+                        //Add Stop
+                        TMLADStopState stop = new TMLADStopState(xc, 600, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
+                        tad.addComponent(stop, xc, 700, false, true);
+
+
+						//Connext stop and write channel
+                        fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
+                        fromStart.setP1(wr.getTGConnectingPointAtIndex(1));
+                        fromStart.setP2(stop.getTGConnectingPointAtIndex(0));
+                        tad.addComponent(fromStart, 300, 200, false, true);
+
+                    }
+                    xc += 300;
+                    i++;
+                }
+            } else {
+
+                int i = 1;
+
+                for (HSMChannel ch : hsmChannelMap.get(cpuName)) {
+                
+                	//Add guard as channelindex
+                	choice.setGuard("[channelIndex=="+channelIndexMap.get(ch.name)+"]",i-1);
+                	
+                    TMLADReadChannel rd = new TMLADReadChannel(xc, 300, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
+                    rd.setChannelName("data_" + ch.name + "_" + ch.task);
+                    rd.setSecurityContext(channelSecMap.get(ch.name));
+                    tad.addComponent(rd, xc, 300, false, true);
+                    //Connect choice and readchannel
+
+                    fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
+                    fromStart.setP1(choice.getTGConnectingPointAtIndex(i));
+                    fromStart.setP2(rd.getTGConnectingPointAtIndex(0));              
+                    tad.addComponent(fromStart, xc, 300, false, true);
+                    
+                    
+                    fromStart = new TGConnectorTMLAD(xc, 350, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
+                    fromStart.setP1(rd.getTGConnectingPointAtIndex(1));
+
+                    
+                    //If needed, receive nonce from task
+                    if (!ch.nonceName.equals("")){
+
+                   	 	tad.addComponent(fromStart, 300, 200, false, true);
+                    	
+                    	rd = new TMLADReadChannel(xc, 350, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
+						rd.setChannelName("data_" + ch.name + "_" + ch.task);
+                        rd.setSecurityContext(ch.nonceName);
+                        tad.addComponent(rd, xc, 350, false, true);
+                        
+
+                    	fromStart.setP2(rd.getTGConnectingPointAtIndex(0));
+                    	
+                    	fromStart = new TGConnectorTMLAD(xc, 350, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
+                    	fromStart.setP1(rd.getTGConnectingPointAtIndex(1));
+                    	
+                    }
+
+
+					//Send data back to task
+                    TMLADWriteChannel wr = new TMLADWriteChannel(xc, 600, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
+                    wr.setChannelName("retData_" + ch.name + "_" + ch.task);
+                    
+
+                    
+                    tad.addComponent(wr, xc, 600, false, true);
+                    wr.setSecurityContext(channelSecMap.get(ch.name));
+
+
+                    if (ch.secType == HSMChannel.DEC) {
+                    	//Add Decrypt operator
+                        TMLADDecrypt dec = new TMLADDecrypt(xc, 500, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
+                        dec.securityContext = channelSecMap.get(ch.name);
+                        tad.addComponent(dec, xc, 500, false, true);
+
+						//Connect decrypt and readchannel
+                        fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
+                        fromStart.setP1(rd.getTGConnectingPointAtIndex(1));
+                        fromStart.setP2(dec.getTGConnectingPointAtIndex(0));
+                        tad.addComponent(fromStart, 300, 200, false, true);
+
+                        //Connect encrypt and writechannel
+                        fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
+                        fromStart.setP1(dec.getTGConnectingPointAtIndex(1));
+                        fromStart.setP2(wr.getTGConnectingPointAtIndex(0));
+                        tad.addComponent(fromStart, 300, 200, false, true);
+                        
+                         //Add Stop
+                        TMLADStopState stop = new TMLADStopState(xc, 700, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
+                        tad.addComponent(stop, xc, 700, false, true);
+
+
+						//Connect stop and write channel
+                        fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
+                        fromStart.setP1(wr.getTGConnectingPointAtIndex(1));
+                        fromStart.setP2(stop.getTGConnectingPointAtIndex(0));
+                        tad.addComponent(fromStart, 300, 200, false, true);
+                        
+                    } else {
+                        TMLADEncrypt enc = new TMLADEncrypt(xc, 500, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
+                        enc.securityContext = channelSecMap.get(ch.name);
+                        if (ch.secType == HSMChannel.SENC) {
+                            enc.type = "Symmetric Encryption";
+                        } else if (ch.secType == HSMChannel.AENC) {
+                            enc.type = "Asymmetric Encryption";
+                        } else if (ch.secType == HSMChannel.MAC) {
+                            enc.type = "MAC";
+                        } else if (ch.secType == HSMChannel.NONCE) {
+                            enc.type = "Nonce";
+                        }
+
+                        enc.message_overhead = overhead;
+                        enc.encTime = encComp;
+                        enc.decTime = decComp;
+                        tad.addComponent(enc, xc, 500, false, true);
+
+                        //Connect encrypt and readchannel
+                        fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
+                        fromStart.setP1(rd.getTGConnectingPointAtIndex(1));
+                        fromStart.setP2(enc.getTGConnectingPointAtIndex(0));
+                        tad.addComponent(fromStart, 300, 200, false, true);
+
+                        //Connect encrypt and writechannel
+                        fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
+                        fromStart.setP1(enc.getTGConnectingPointAtIndex(1));
+                        fromStart.setP2(wr.getTGConnectingPointAtIndex(0));
+                        tad.addComponent(fromStart, 300, 200, false, true);
+                        
+                        //Add Stop
+                        TMLADStopState stop = new TMLADStopState(xc, 700, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
+                        tad.addComponent(stop, xc, 700, false, true);
+
+
+						//Connect stop and write channel
+                        fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
+                        fromStart.setP1(wr.getTGConnectingPointAtIndex(1));
+                        fromStart.setP2(stop.getTGConnectingPointAtIndex(0));
+                        tad.addComponent(fromStart, 300, 200, false, true);
+
+
+                    }
+
+               
+                    xc += 300;
+                    i++;
+                }
+
+            }
+
+	}
+	
+	class HSMChannel {
+        public String name;
+        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 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/ui/tmlad/TMLADWriteChannel.java b/src/main/java/ui/tmlad/TMLADWriteChannel.java
index 9fd95d7744d6e20a315e84c42556903c699f0fae..07ca8cde9fa33edd50e9d451e73f780af1526fb9 100755
--- a/src/main/java/ui/tmlad/TMLADWriteChannel.java
+++ b/src/main/java/ui/tmlad/TMLADWriteChannel.java
@@ -283,15 +283,24 @@ public class TMLADWriteChannel extends TGCWithoutInternalComponent implements Ch
         values[0] = channelName;
         labels[1] = "Nb of samples";
         values[1] = nbOfSamples;
+
+      /*  labels[2] = "Security Pattern";
+        values[2] = securityContext;
+		labels[3] = "Attacker?";
+		values[3] = isAttacker ? "Yes" : "No"; */
+        ArrayList<String []> help = new ArrayList<String []>();
+		String[] allOutChannels = tdp.getMGUI().getAllOutChannels();
+		if (isAttacker){
+			allOutChannels =tdp.getMGUI().getAllCompOutChannels();
+		}
+		String[] choice = new String[]{"Yes", "No"};
+		help.add(allOutChannels);
+		help.add(null);
+	//	help.add(tdp.getMGUI().getCurrentCryptoConfig());
+		//help.add(choice);
+
         tab1.labels=labels;
         tab1.values =  values;
-        ArrayList<String[]> help = new ArrayList<String[]>();
-        String[] allOutChannels = tdp.getMGUI().getAllOutChannels();
-        if (isAttacker) {
-            allOutChannels = tdp.getMGUI().getAllCompOutChannels();
-        }
-        help.add(allOutChannels);
-        help.add(null);
         tab1.help = help;
 
         TabInfo tab2 = new TabInfo("Security");
@@ -302,7 +311,7 @@ public class TMLADWriteChannel extends TGCWithoutInternalComponent implements Ch
         labels[1] = "Attacker?";
         values[1] = isAttacker ? "Yes" : "No";
         help = new ArrayList<String[]>();
-        String[] choice = new String[]{"Yes", "No"};
+
         help.add(tdp.getMGUI().getCurrentCryptoConfig());
         help.add(choice);
         tab2.labels=labels;
@@ -313,6 +322,7 @@ public class TMLADWriteChannel extends TGCWithoutInternalComponent implements Ch
         tabs.add(tab1);
         tabs.add(tab2);
 
+
         //JDialogTwoString jdts = new JDialogTwoString(frame, "Setting channel's properties", "Channel name", channelName, "Nb of samples", nbOfSamples);
         JDialogMultiStringAndTabs jdmsat = new JDialogMultiStringAndTabs(frame, "Write in channel", tabs);
         //jdms.setSize(600, 300);
@@ -325,6 +335,9 @@ public class TMLADWriteChannel extends TGCWithoutInternalComponent implements Ch
             securityContext = jdmsat.getString(1, 0);
             isAttacker = jdmsat.getString(1, 1).equals("Yes");
             makeValue();
+            
+            System.out.println(channelName + " " + securityContext + " " + isAttacker);
+            
             return true;
         }
 
diff --git a/src/main/java/ui/window/JDialogProverifVerification.java b/src/main/java/ui/window/JDialogProverifVerification.java
index 077b43ce7e25dede1bcaaea42c2d91c6daaa7e7c..2ea0ef7164a7881bc9cc2b5c1e7fc4a7725dc985 100644
--- a/src/main/java/ui/window/JDialogProverifVerification.java
+++ b/src/main/java/ui/window/JDialogProverifVerification.java
@@ -178,10 +178,11 @@ public class JDialogProverifVerification extends JDialog implements ActionListen
     //security generation buttons
     ButtonGroup secGroup;
 
-    protected JCheckBox autoConf, autoWeakAuth, autoStrongAuth, custom;
-	protected JRadioButton autoSec, autoMapKeys, addHSM;
+    protected JCheckBox autoConf, autoWeakAuth, autoStrongAuth, custom, addHSM;
+	protected JRadioButton autoSec, autoMapKeys;
     protected JTextField encTime, decTime, secOverhead;
     protected JComboBox<String> addtoCPU;
+	protected JButton allValidated, addOneValidated, allIgnored, addOneIgnored;
 
     protected JCheckBox removeForkAndJoin;
 
@@ -347,19 +348,17 @@ public class JDialogProverifVerification extends JDialog implements ActionListen
         jp02.add(autoStrongAuth, c01);
 
 		autoStrongAuth.addActionListener(this);
-        autoMapKeys= new JRadioButton("Add Keys");
-		autoMapKeys.addActionListener(this);
-        jp02.add(autoMapKeys, c01);
-		secGroup.add(autoMapKeys);
-        addHSM = new JRadioButton("Add HSM");
-        jp02.add(addHSM,c01);
-		addHSM.addActionListener(this);
-		secGroup.add(addHSM);
-		jp02.add(new JLabel("Add HSM to component:"),c01);
+		
+		addHSM = new JCheckBox("Add HSM to component:");
+		addHSM.setEnabled(false);
+		jp02.add(addHSM, c01);
+		
+		
 		listIgnored = new JList<String>(ignoredTasks);
 
 
 		listPanel = new JPanel();
+		listPanel.setPreferredSize(new Dimension(250, 200));
 		GridBagConstraints c02 = new GridBagConstraints();
 		c02.gridwidth=1;
 		c02.gridheight=1;
@@ -375,27 +374,36 @@ public class JDialogProverifVerification extends JDialog implements ActionListen
         GridBagConstraints c13 = new GridBagConstraints();
         c13.gridwidth = GridBagConstraints.REMAINDER;
         c13.gridheight = 1;
-        JButton allValidated = new JButton(IconManager.imgic50);
+        
+        allValidated = new JButton(IconManager.imgic50);
         allValidated.setPreferredSize(new Dimension(50, 25));
         allValidated.addActionListener(this);
         allValidated.setActionCommand("allValidated");
         buttonPanel.add(allValidated, c13);
 
-        JButton addOneValidated = new JButton(IconManager.imgic48);
+		allValidated.setEnabled(false);
+		
+
+        addOneValidated = new JButton(IconManager.imgic48);
         addOneValidated.setPreferredSize(new Dimension(50, 25));
         addOneValidated.addActionListener(this);
         addOneValidated.setActionCommand("addOneValidated");
         buttonPanel.add(addOneValidated, c13);
 
+
+		addOneValidated.setEnabled(false);
+
         buttonPanel.add(new JLabel(" "), c13);
 
-        JButton addOneIgnored = new JButton(IconManager.imgic46);
+        addOneIgnored = new JButton(IconManager.imgic46);
         addOneIgnored.addActionListener(this);
         addOneIgnored.setPreferredSize(new Dimension(50, 25));
         addOneIgnored.setActionCommand("addOneIgnored");
         buttonPanel.add(addOneIgnored, c13);
 
-        JButton allIgnored = new JButton(IconManager.imgic44);
+		addOneIgnored.setEnabled(false);
+
+        allIgnored = new JButton(IconManager.imgic44);
         allIgnored.addActionListener(this);
         allIgnored.setPreferredSize(new Dimension(50, 25));
         allIgnored.setActionCommand("allIgnored");
@@ -403,6 +411,8 @@ public class JDialogProverifVerification extends JDialog implements ActionListen
         listPanel.add(buttonPanel, c02);
         buttonPanel.setPreferredSize(new Dimension(50, 200));
 
+		allIgnored.setEnabled(false);
+		
         listSelected = new JList<String>(selectedTasks);
 
         //listValidated.setPreferredSize(new Dimension(200, 250));
@@ -417,6 +427,31 @@ public class JDialogProverifVerification extends JDialog implements ActionListen
         jp02.add(listPanel, c01);
         c02.gridheight = 1;
 		
+		custom = new JCheckBox("Custom performance attributes");
+        jp02.add(custom, c01);
+        custom.addActionListener(this);
+
+        jp02.add(new JLabel("Encryption Computational Complexity"), c01);
+        encTime = new JTextField(encCC);
+        encTime.setEnabled(false);
+        jp02.add(encTime, c01);
+
+        jp02.add(new JLabel("Decryption Computational Complexity"), c01);
+        decTime = new JTextField(decCC);
+        decTime.setEnabled(false);
+        jp02.add(decTime, c01);
+
+        jp02.add(new JLabel("Data Overhead (bits)"), c01);
+        secOverhead = new JTextField(secOv);
+        secOverhead.setEnabled(false);
+        jp02.add(secOverhead, c01);
+		
+		
+        autoMapKeys= new JRadioButton("Add Keys Only");
+		autoMapKeys.addActionListener(this);
+        jp02.add(autoMapKeys, c01);
+		secGroup.add(autoMapKeys);
+
 		
 /*
 		for (String cpuName: cpuTaskMap.keySet()){
@@ -442,30 +477,13 @@ public class JDialogProverifVerification extends JDialog implements ActionListen
         //     addToComp = new JTextField(compName);
         //jp01.add(addToComp,c01);
 
-        removeForkAndJoin = new JCheckBox("Remove fork and join operators");
+   /*     removeForkAndJoin = new JCheckBox("Remove fork and join operators");
         if (mgui.isExperimentalOn()) {
             //jp02.add(removeForkAndJoin, c01);
             //removeForkAndJoin.addActionListener(this);
-        }
+        }*/
 
-        custom = new JCheckBox("Custom performance attributes");
-        jp02.add(custom, c01);
-        custom.addActionListener(this);
-
-        jp02.add(new JLabel("Encryption Computational Complexity"), c01);
-        encTime = new JTextField(encCC);
-        encTime.setEnabled(false);
-        jp02.add(encTime, c01);
-
-        jp02.add(new JLabel("Decryption Computational Complexity"), c01);
-        decTime = new JTextField(decCC);
-        decTime.setEnabled(false);
-        jp02.add(decTime, c01);
-
-        jp02.add(new JLabel("Data Overhead (bits)"), c01);
-        secOverhead = new JTextField(secOv);
-        secOverhead.setEnabled(false);
-        jp02.add(secOverhead, c01);
+       
 
 
         JPanel jp01 = new JPanel();
@@ -715,14 +733,17 @@ public class JDialogProverifVerification extends JDialog implements ActionListen
                 } else if (command.equals("allIgnored")) {
                     allIgnored();
                 }
-                if (evt.getSource() == addHSM) {
-                    listPanel.setEnabled(addHSM.isSelected());
-                }
-                if (evt.getSource() == autoConf || evt.getSource() == autoSec || evt.getSource() == autoMapKeys || evt.getSource() == addHSM || evt.getSource() == autoWeakAuth) {
+                if (evt.getSource() == autoConf || evt.getSource() == autoSec || evt.getSource() == autoMapKeys || evt.getSource() == autoWeakAuth) {
                     //autoWeakAuth.setEnabled(autoConf.isSelected());
                     autoConf.setEnabled(autoSec.isSelected());
+                    addHSM.setEnabled(autoSec.isSelected());
+                    addOneValidated.setEnabled(autoSec.isSelected());
+                    allValidated.setEnabled(autoSec.isSelected());
+                    addOneIgnored.setEnabled(autoSec.isSelected());
+                    allIgnored.setEnabled(autoSec.isSelected());
                     autoWeakAuth.setEnabled(autoSec.isSelected());
                     autoStrongAuth.setEnabled(autoWeakAuth.isSelected());
+                    
                     if (!autoSec.isSelected()) {
                         autoConf.setSelected(false);
                         autoWeakAuth.setSelected(false);
@@ -788,50 +809,38 @@ public class JDialogProverifVerification extends JDialog implements ActionListen
     public void run() {
         TraceManager.addDev("Thread started");
         File testFile;
+        Map<String, java.util.List<String>> selectedCpuTasks = new HashMap<String, java.util.List<String>>();
         try {
             if (jp1.getSelectedIndex() == 1) {
-                encCC = encTime.getText();
-                decCC = decTime.getText();
-                secOv = secOverhead.getText();
-                TMLMapping map;
-                if (autoConf.isSelected() || autoWeakAuth.isSelected() || autoStrongAuth.isSelected()) {
-                    if (custom.isSelected()) {
-                        map = mgui.gtm.autoSecure(mgui, encCC, secOv, decCC, autoConf.isSelected(), autoWeakAuth.isSelected(), autoStrongAuth
-                                .isSelected());
-                    } else {
-                        map = mgui.gtm.autoSecure(mgui, autoConf.isSelected(), autoWeakAuth.isSelected(), autoStrongAuth.isSelected());
-                    }
-                } else if (addHSM.isSelected()) {
-
-                    //	ArrayList<String> comps = new ArrayList<String>();
-                    //	comps.add(addToComp.getText());
-                    Map<String, java.util.List<String>> selectedCpuTasks = new HashMap<String, java.util.List<String>>();
-
-                    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);
-                        }
-                    }
-				/*for (JCheckBox cpu: cpuTaskObjs.keySet()){
-					ArrayList<String> tasks = new ArrayList<String>();	
-					for (JCheckBox task: cpuTaskObjs.get(cpu)){
-						if (task.isSelected()){
-							tasks.add(task.getText());
-						}
-					}
-					if (tasks.size()>0){
-						selectedCpuTasks.put(cpu.getText(), tasks);
-					}
-				}
-				mgui.gtm.addHSM(mgui, selectedCpuTasks);*/
-                    mgui.gtm.addHSM(mgui, selectedCpuTasks);
-                }
-                if (autoMapKeys.isSelected()) {
+            	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();
                 }
                 mode = NOT_STARTED;
@@ -840,11 +849,6 @@ public class JDialogProverifVerification extends JDialog implements ActionListen
                 testGo();
                 pathCode = code1.getText().trim();
 
-                // Issue #131: Not needed. Would duplicate file name
-//                if (pathCode.isEmpty()) {
-//                    pathCode += "pvspec";
-//                }
-
                 SpecConfigTTool.checkAndCreateProverifDir(pathCode);
 
                 pathCode += "pvspec";