diff --git a/src/main/java/tmltranslator/toavatar/TML2Avatar.java b/src/main/java/tmltranslator/toavatar/TML2Avatar.java
index f32e1404f4aee4910b653fba19620e7bcfa57580..cac9761a2308ad90b69ee9b3e26dbca7ed6c6143 100644
--- a/src/main/java/tmltranslator/toavatar/TML2Avatar.java
+++ b/src/main/java/tmltranslator/toavatar/TML2Avatar.java
@@ -94,7 +94,7 @@ public class TML2Avatar {
         this.tmlmap = tmlmap;
 
         this.tmlmodel = tmlmap.getTMLModeling();
-        
+
      
         allStates = new ArrayList<String>();
         attrsToCheck = new ArrayList<String>();
@@ -1482,6 +1482,30 @@ public class TML2Avatar {
         }
         attrsToCheck.clear();
         tmlmodel.removeForksAndJoins();
+        
+        System.out.println("MODIFIED model " + tmlmodel);
+        
+        for (TMLChannel chan: tmlmodel.getChannels()){
+        	System.out.println("chan " + chan);
+        	TMLTask task = chan.getOriginTask();
+        	
+        	TMLTask task2 = chan.getDestinationTask();
+        	HwExecutionNode node = (HwExecutionNode) tmlmap.getHwNodeOf(task);
+        	HwExecutionNode node2 = (HwExecutionNode) tmlmap.getHwNodeOf(task2);
+        	if (node==null){
+        		tmlmap.addTaskToHwExecutionNode(task, node2);
+        	}
+        	
+        	if (node2==null){
+        		tmlmap.addTaskToHwExecutionNode(task2, node);
+        	}
+        	
+        	if (chan.getName().contains("fork__") || chan.getName().contains("FORKCHANNEL")){
+        		chan.setName(chan.getName().replaceAll("__",""));
+        	}
+        	
+        }
+        
         //Only set the loop limit if it's a number
         String pattern = "^[0-9]{1,2}$";
         Pattern r = Pattern.compile(pattern);
diff --git a/src/main/java/ui/AvatarDesignPanel.java b/src/main/java/ui/AvatarDesignPanel.java
index f2e923013b2011e39438aee7aba9cbe4b8aa05d1..bda2bf683f547caa26274c4c42f347de70859238 100644
--- a/src/main/java/ui/AvatarDesignPanel.java
+++ b/src/main/java/ui/AvatarDesignPanel.java
@@ -45,11 +45,14 @@ import avatartranslator.AvatarAttribute;
 import avatartranslator.AvatarPragmaAuthenticity;
 import avatartranslator.AvatarPragmaReachability;
 import avatartranslator.AvatarPragmaSecret;
+import avatartranslator.AvatarPragma;
 import avatartranslator.AvatarPragmaLatency;
 import myutil.GraphicLib;
 import proverifspec.ProVerifOutputAnalyzer;
 import proverifspec.ProVerifQueryAuthResult;
 import proverifspec.ProVerifQueryResult;
+import proverifspec.ProVerifResultTrace;
+
 import ui.avatarbd.*;
 import ui.avatardd.ADDDiagramPanel;
 import ui.avatarsmd.AvatarSMDPanel;
@@ -453,17 +456,17 @@ public class AvatarDesignPanel extends TURTLEPanel {
 
         // Confidential attributes
         Map<AvatarPragmaSecret, ProVerifQueryResult> confResults = pvoa.getConfidentialityResults();
-        List<AvatarAttribute> secretAttributes = new LinkedList<AvatarAttribute> ();
-        List<AvatarAttribute> nonSecretAttributes = new LinkedList<AvatarAttribute> ();
+        HashMap<AvatarAttribute, AvatarPragma> secretAttributes = new HashMap<AvatarAttribute, AvatarPragma> ();
+        HashMap<AvatarAttribute, AvatarPragma> nonSecretAttributes = new HashMap<AvatarAttribute, AvatarPragma> ();
         for (AvatarPragmaSecret pragma: confResults.keySet())
         {
             ProVerifQueryResult result = confResults.get(pragma);
             if (result.isProved())
             {
                 if (result.isSatisfied())
-                    secretAttributes.add(pragma.getArg());
+                    secretAttributes.put(pragma.getArg(), pragma);
                 else
-                    nonSecretAttributes.add(pragma.getArg());
+                    nonSecretAttributes.put(pragma.getArg(),pragma);
             }
         }
 
@@ -474,15 +477,23 @@ public class AvatarDesignPanel extends TURTLEPanel {
                     int toBeFound = types.size ();
                     boolean ko = false;
                     for (TAttribute type: types) {
-                        for(AvatarAttribute attribute: secretAttributes)
+                        for(AvatarAttribute attribute: secretAttributes.keySet())
                             if (attribute.getBlock ().getName ().equals (bdBlock.getBlockName ()) && attribute.getName ().equals (tattr.getId () + "__" + type.getId ())) {
                                 toBeFound --;
+                                ProVerifResultTrace trace = confResults.get(secretAttributes.get(attribute)).getTrace();
+								if (trace!=null){
+									bdBlock.addProVerifTrace(tattr, trace);
+								}
                                 break;
                             }
 
-                        for(AvatarAttribute attribute: nonSecretAttributes)
+                        for(AvatarAttribute attribute: nonSecretAttributes.keySet())
                             if (attribute.getBlock ().getName ().equals (bdBlock.getBlockName ()) && attribute.getName ().equals (tattr.getId () + "__" + type.getId ())) {
                                 ko = true;
+                                ProVerifResultTrace trace = confResults.get(nonSecretAttributes.get(attribute)).getTrace();
+								if (trace!=null){
+									bdBlock.addProVerifTrace(tattr, trace);
+								}
                                 break;
                             }
 
@@ -490,17 +501,31 @@ public class AvatarDesignPanel extends TURTLEPanel {
                             break;
                     }
 
-                    if (ko)
+                    if (ko){
                         tattr.setConfidentialityVerification(TAttribute.CONFIDENTIALITY_KO);
-                    else if (toBeFound == 0)
+                      
+                    }
+                    else if (toBeFound == 0) {
                         tattr.setConfidentialityVerification(TAttribute.CONFIDENTIALITY_OK);
+                        
+                    }
                 } else {
-                    for(AvatarAttribute attribute: secretAttributes)
-                        if (attribute.getBlock ().getName ().equals (bdBlock.getBlockName ()) && attribute.getName ().equals (tattr.getId ()))
+                    for(AvatarAttribute attribute: secretAttributes.keySet())
+                        if (attribute.getBlock ().getName ().equals (bdBlock.getBlockName ()) && attribute.getName ().equals (tattr.getId ())){
                             tattr.setConfidentialityVerification(TAttribute.CONFIDENTIALITY_OK);
-                    for(AvatarAttribute attribute: nonSecretAttributes)
-                        if (attribute.getBlock ().getName ().equals (bdBlock.getBlockName ()) && attribute.getName ().equals (tattr.getId ()))
+                            ProVerifResultTrace trace = confResults.get(secretAttributes.get(attribute)).getTrace();
+							if (trace!=null){
+								bdBlock.addProVerifTrace(tattr, trace);
+							}
+                        }
+                    for(AvatarAttribute attribute: nonSecretAttributes.keySet())
+                        if (attribute.getBlock ().getName ().equals (bdBlock.getBlockName ()) && attribute.getName ().equals (tattr.getId ())){
                             tattr.setConfidentialityVerification(TAttribute.CONFIDENTIALITY_KO);
+                            ProVerifResultTrace trace = confResults.get(nonSecretAttributes.get(attribute)).getTrace();
+							if (trace!=null){
+								bdBlock.addProVerifTrace(tattr, trace);
+							}
+                        }
                 }
             }
 
@@ -565,7 +590,7 @@ public class AvatarDesignPanel extends TURTLEPanel {
                             boolean weakKo = false;
                             boolean isNotProved = false;
                             boolean weakIsNotProved = false;
-
+							ProVerifQueryAuthResult result= new ProVerifQueryAuthResult(false, false);
                             for (TAttribute type: types) {
                                 for (AvatarPragmaAuthenticity pragmaAuth: authResults.keySet())
                                 {
@@ -577,7 +602,7 @@ public class AvatarDesignPanel extends TURTLEPanel {
                                             || !pragmaAuth.getAttrB().getState().getName().equals(argB[1].replaceAll("\\.", "__")))
                                         continue;
 
-                                    ProVerifQueryAuthResult result = authResults.get(pragmaAuth);
+                                    result = authResults.get(pragmaAuth);
                                     toBeFound --;
 
                                     if (result.isProved())
@@ -625,7 +650,10 @@ public class AvatarDesignPanel extends TURTLEPanel {
                                 else
                                     pragma.authWeakMap.put(prop, 1);
                             }
-
+							ProVerifResultTrace trace = result.getTrace();
+							if (trace!=null){
+								pragma.pragmaTraceMap.put(prop, trace);
+							}
                         } else {
                             for (AvatarPragmaAuthenticity pragmaAuth: authResults.keySet())
                             {
@@ -670,7 +698,11 @@ public class AvatarDesignPanel extends TURTLEPanel {
                                 {
                                     pragma.authWeakMap.put(prop, 3);
                                 }
-
+								//Add ProVerif Result Trace to pragma
+								ProVerifResultTrace trace = pvoa.getResults().get(pragmaAuth).getTrace();
+								if (trace!=null){
+									pragma.pragmaTraceMap.put(prop, trace);
+								}
                                 break;
                             }
                         }
diff --git a/src/main/java/ui/TDiagramPanel.java b/src/main/java/ui/TDiagramPanel.java
index 832e888d50e956156512b804a51da518c11c4968..28e5a9e262515122baa22f8cc3651a5f5c60b4c7 100755
--- a/src/main/java/ui/TDiagramPanel.java
+++ b/src/main/java/ui/TDiagramPanel.java
@@ -44,6 +44,7 @@ import ui.atd.ATDAttack;
 import ui.atd.ATDBlock;
 import ui.avatarad.AvatarADActivity;
 import ui.avatarbd.AvatarBDBlock;
+import ui.avatarbd.AvatarBDPragma;
 import ui.avatarbd.AvatarBDDataType;
 import ui.avatarbd.AvatarBDLibraryFunction;
 import ui.avatarcd.AvatarCDBlock;
@@ -1859,6 +1860,12 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
         	if (componentPopup instanceof TMLCPrimitivePort){
         		((TMLCPrimitivePort) componentPopup).showTrace();
         	}
+        	else if (componentPopup instanceof AvatarBDBlock){
+        		((AvatarBDBlock) componentPopup).showTrace(currentY);
+        	}
+        	else if (componentPopup instanceof AvatarBDPragma){
+        		((AvatarBDPragma) componentPopup).showTrace(currentY);
+        	}
         }
         
         if (e.getSource() == checkMasterMutex) {
@@ -2114,11 +2121,12 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
 
         }
         
-        if (componentPointed instanceof TMLCPrimitivePort){
+        if (componentPointed instanceof TMLCPrimitivePort || componentPointed instanceof AvatarBDBlock || componentPointed instanceof AvatarBDPragma){
         	showProVerifTrace.setEnabled(true);
         } else {
         	showProVerifTrace.setEnabled(false);
         }
+
         
 
         if (componentPointed instanceof CheckableInvariant) {
diff --git a/src/main/java/ui/avatarbd/AvatarBDBlock.java b/src/main/java/ui/avatarbd/AvatarBDBlock.java
index 53d55718ebd963376ae567bfd322f5252ba80946..0cc3a230edd5af6f24c7f1090019c4680590bd83 100644
--- a/src/main/java/ui/avatarbd/AvatarBDBlock.java
+++ b/src/main/java/ui/avatarbd/AvatarBDBlock.java
@@ -51,11 +51,23 @@ import ui.avatarsmd.AvatarSMDPanel;
 import ui.util.IconManager;
 import ui.window.JDialogAvatarBlock;
 
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+
+
 import javax.swing.*;
 import java.awt.*;
 import java.util.Iterator;
 import java.util.LinkedList;
-
+import java.util.HashMap;
+import proverifspec.ProVerifResultTrace;
+import proverifspec.ProVerifResultTraceStep;
+import ui.interactivesimulation.JFrameSimulationSDPanel;
 
 /**
  * Class AvatarBDBlock
@@ -96,7 +108,9 @@ public class AvatarBDBlock extends TGCScalableWithInternalComponent implements S
     protected LinkedList<AvatarSignal> mySignals;
     protected String[] globalCode;
 
-
+	protected HashMap<TAttribute, ProVerifResultTrace> attrTraceMap = new HashMap<TAttribute, ProVerifResultTrace>();
+	protected HashMap<TAttribute, Integer> attrLocMap = new HashMap<TAttribute, Integer>();
+	
     public String oldValue;
 
     public AvatarBDBlock(int _x, int _y, int _minX, int _maxX, int _minY, int _maxY, boolean _pos, TGComponent _father, TDiagramPanel _tdp) {
@@ -160,6 +174,10 @@ public class AvatarBDBlock extends TGCScalableWithInternalComponent implements S
         this.internalDrawingAux(graph);
         graph.setFont(font);
     }
+    
+    public void addProVerifTrace(TAttribute attr, ProVerifResultTrace trace){
+    	attrTraceMap.put(attr,trace);
+    }	
 
     public void setSignalsAsNonAttached() {
         for (AvatarSignal mySig : mySignals) mySig.attachedToARelation = false;
@@ -332,6 +350,8 @@ public class AvatarBDBlock extends TGCScalableWithInternalComponent implements S
 
             // Try to draw it
             w = graph.getFontMetrics().stringWidth(attrString);
+            
+            attrLocMap.put(attr,this.y+h);
             if (w + 2 * textX < this.width) {
                 graph.drawString(attrString, this.x + textX, this.y + h);
                 this.drawConfidentialityVerification(attr.getConfidentialityVerification(), graph, this.x, this.y + h);
@@ -498,6 +518,45 @@ public class AvatarBDBlock extends TGCScalableWithInternalComponent implements S
         g.setColor(c);
     }
 
+	public void showTrace(int y){
+
+		if (y< limitAttr){
+			for (TAttribute attr: attrLocMap.keySet()){
+    		if (attrLocMap.get(attr) < y && y < attrLocMap.get(attr) +currentFontSize && attrTraceMap.get(attr)!=null){
+    			PipedOutputStream pos = new PipedOutputStream();
+       			try {
+        			PipedInputStream pis = new PipedInputStream(pos, 4096);
+            		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(pos));
+
+		            JFrameSimulationSDPanel jfssdp = new JFrameSimulationSDPanel(null, tdp.getMGUI(), "Confidentiality " + attr.toString());
+		            jfssdp.setIconImage(IconManager.img8);
+    		        GraphicLib.centerOnParent(jfssdp, 600, 600);
+   			        jfssdp.setFileReference(new BufferedReader(new InputStreamReader(pis)));
+            		jfssdp.setVisible(true);
+                        //jfssdp.setModalExclusionType(ModalExclusionType
+                          //      .APPLICATION_EXCLUDE);
+            		jfssdp.toFront();
+
+                        // TraceManager.addDev("\n--- Trace ---");
+            		int i = 0;
+            		for (ProVerifResultTraceStep step : attrTraceMap.get(attr).getTrace()) {
+		            	step.describeAsTMLSDTransaction(bw, i);
+    	        	    i++;
+           			}
+            		bw.close();
+        		} catch (IOException e) {
+        			TraceManager.addDev("Error when writing trace step SD transaction");
+        		} finally {
+        			try {
+        				pos.close();
+        	    	} catch (IOException ignored) {
+        			}
+        		}
+
+    		}
+    	}
+		}
+	}
 
     private void drawConfidentialityVerification(int confidentialityVerification, Graphics g, int _x, int _y) {
         Color c = g.getColor();
diff --git a/src/main/java/ui/avatarbd/AvatarBDPragma.java b/src/main/java/ui/avatarbd/AvatarBDPragma.java
index 65fe6e83b48bf43107216edef2bf8ab8001f77da..7dd4d58ffcd5f8878fcc683c6cc9c7b1d1a121a1 100755
--- a/src/main/java/ui/avatarbd/AvatarBDPragma.java
+++ b/src/main/java/ui/avatarbd/AvatarBDPragma.java
@@ -41,13 +41,31 @@ package ui.avatarbd;
 
 import myutil.Conversion;
 import myutil.GraphicLib;
+import myutil.TraceManager;
+
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
+
+
 import ui.*;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+
 import ui.util.IconManager;
 import ui.window.JDialogPragma;
 
+import proverifspec.ProVerifResultTrace;
+import proverifspec.ProVerifResultTraceStep;
+
+import ui.interactivesimulation.JFrameSimulationSDPanel;
+
 import javax.swing.*;
 import java.awt.*;
 import java.util.ArrayList;
@@ -93,6 +111,10 @@ public class AvatarBDPragma extends TGCScalableWithoutInternalComponent {
     public final static int NOT_PROVED = 3;
     public HashMap<String, Integer> authStrongMap = new HashMap<String, Integer>();
     public HashMap<String, Integer> authWeakMap = new HashMap<String, Integer>();
+    
+    protected HashMap<String, Integer> pragmaLocMap = new HashMap<String, Integer>();
+    
+    public HashMap<String, ProVerifResultTrace> pragmaTraceMap = new HashMap<String, ProVerifResultTrace>();
 
     public AvatarBDPragma(int _x, int _y, int _minX, int _maxX, int _minY, int _maxY, boolean _pos, TGComponent _father, TDiagramPanel _tdp) {
         super(_x, _y, _minX, _maxX, _minY, _maxY, _pos, _father, _tdp);
@@ -232,6 +254,7 @@ public class AvatarBDPragma extends TGCScalableWithoutInternalComponent {
         g.drawString("Security features", x + textX, y + textY + currentFontSize);
         g.setFont(fold);
         for (String s : models) {
+        	pragmaLocMap.put(s,y + textY + (i + 1) * currentFontSize);
             g.drawString(s, x + textX, y + textY + (i + 1) * currentFontSize);
             if (syntaxErrors.contains(s)) {
                 Color ctmp = g.getColor();
@@ -259,7 +282,7 @@ public class AvatarBDPragma extends TGCScalableWithoutInternalComponent {
                 g.setFont(fold);
             }
             g.drawString(s, x + textX, y + textY + (i + 1) * currentFontSize);
-
+        	pragmaLocMap.put(s,y + textY + i * currentFontSize);
             if (syntaxErrors.contains(s)) {
                 Color ctmp = g.getColor();
                 g.setColor(Color.red);
@@ -481,4 +504,46 @@ public class AvatarBDPragma extends TGCScalableWithoutInternalComponent {
             throw new MalformedModelingException();
         }
     }
+    
+    public void showTrace(int y){
+    	
+    	//TraceManager.addDev(pragmaTraceMap + " " + pragmaLocMap + " " + y);
+    	//On right click, display verification trace
+    	for (String pragma: pragmaLocMap.keySet()){
+    		if (pragmaLocMap.get(pragma) < y && y <pragmaLocMap.get(pragma) +currentFontSize && pragmaTraceMap.get(pragma)!=null){
+    			PipedOutputStream pos = new PipedOutputStream();
+       			try {
+        			PipedInputStream pis = new PipedInputStream(pos, 4096);
+            		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(pos));
+
+		            JFrameSimulationSDPanel jfssdp = new JFrameSimulationSDPanel(null, tdp.getMGUI(), pragma);
+		            jfssdp.setIconImage(IconManager.img8);
+    		        GraphicLib.centerOnParent(jfssdp, 600, 600);
+   			        jfssdp.setFileReference(new BufferedReader(new InputStreamReader(pis)));
+            		jfssdp.setVisible(true);
+                        //jfssdp.setModalExclusionType(ModalExclusionType
+                          //      .APPLICATION_EXCLUDE);
+            		jfssdp.toFront();
+
+                        // TraceManager.addDev("\n--- Trace ---");
+            		int i = 0;
+            		for (ProVerifResultTraceStep step : pragmaTraceMap.get(pragma).getTrace()) {
+		            	step.describeAsTMLSDTransaction(bw, i);
+    	        	    i++;
+           			}
+            		bw.close();
+        		} catch (IOException e) {
+        			TraceManager.addDev("Error when writing trace step SD transaction");
+        		} finally {
+        			try {
+        				pos.close();
+        	    	} catch (IOException ignored) {
+        			}
+        		}
+        		break;
+
+    		}
+    	}
+		//
+	}
 }
diff --git a/src/main/java/ui/interactivesimulation/JFrameInteractiveSimulation.java b/src/main/java/ui/interactivesimulation/JFrameInteractiveSimulation.java
index 0280a3ee7ffbcf9ebf29e42a6f36a760814e7190..ec11c83c40cd2a3873e75760254448a477274438 100755
--- a/src/main/java/ui/interactivesimulation/JFrameInteractiveSimulation.java
+++ b/src/main/java/ui/interactivesimulation/JFrameInteractiveSimulation.java
@@ -146,10 +146,17 @@ public class JFrameInteractiveSimulation extends JFrame implements ActionListene
     protected JTextField stateFileName;
     protected JTextField benchmarkFileName;
     protected JComboBox<String> cpus, busses, mems, tasks, chans;
-    private Map<String, List<Integer>> channelIDMap= new HashMap<String, List<Integer>>();
+    private Map<String, List<Integer>> origChannelIDMap= new HashMap<String, List<Integer>>();
+    private Map<String, List<Integer>> destChannelIDMap= new HashMap<String, List<Integer>>();
 
     private String[] cpuIDs, busIDs, memIDs, taskIDs, chanIDs;
 	private List<String> simtraces= new ArrayList<String>();
+	
+	//Find matching channels
+	public Map<String, List<Integer>> channelMsgIdMap = new HashMap<String, List<Integer>>();
+	public Map<Integer, String> msgIdStartTimeMap = new HashMap<Integer, String>();
+	public Map<Integer, String> msgIdEndTimeMap = new HashMap<Integer, String>();
+		
     // Status elements
 	private JLabel status, time, info;
 
@@ -1383,7 +1390,11 @@ public class JFrameInteractiveSimulation extends JFrame implements ActionListene
 	public void resetSimTrace(){
 		msgTimes.clear();
 		chanId=0;
-		channelIDMap.clear();
+		channelMsgIdMap.clear();
+		msgIdStartTimeMap.clear();
+		msgIdEndTimeMap.clear();
+		origChannelIDMap.clear();
+		destChannelIDMap.clear();	
 		simtraces.clear();
 		simIndex=0;
 	}
@@ -1563,21 +1574,31 @@ public class JFrameInteractiveSimulation extends JFrame implements ActionListene
 							msgTimes.put(tran.channelName, new ArrayList<String>());
 						} 
 						if (!msgTimes.get(tran.channelName).contains(tran.endTime)){
-							if (channelIDMap.containsKey(tran.channelName) && channelIDMap.get(tran.channelName).size()>0){
-								msgId=channelIDMap.get(tran.channelName).remove(0);
-							}
-							else {
-								if (!channelIDMap.containsKey(tran.channelName)){
-									channelIDMap.put(tran.channelName, new ArrayList<Integer>());
-								}
-								channelIDMap.get(tran.channelName).add(msgId);
-								chanId++;
-							}
 							String trace="";
 							if (command.equals("Write")){
+								if (destChannelIDMap.containsKey(tran.channelName) && destChannelIDMap.get(tran.channelName).size()>0){
+									msgId=destChannelIDMap.get(tran.channelName).remove(0);
+								}
+								else {
+									if (!origChannelIDMap.containsKey(tran.channelName)){
+										origChannelIDMap.put(tran.channelName, new ArrayList<Integer>());
+									}
+									origChannelIDMap.get(tran.channelName).add(msgId);
+									chanId++;
+								}
 								trace = "time=" + tran.endTime+ " block="+ originTask.getName() + " type="+asynchType+ " blockdestination="+ destTask.getName() + " channel="+tran.channelName+" msgid="+ msgId + " params=\"" +chan.getSize()+"\"";	
 							}
 							else {
+								if (origChannelIDMap.containsKey(tran.channelName) && origChannelIDMap.get(tran.channelName).size()>0){
+									msgId=origChannelIDMap.get(tran.channelName).remove(0);
+								}
+								else {
+									if (!destChannelIDMap.containsKey(tran.channelName)){
+										destChannelIDMap.put(tran.channelName, new ArrayList<Integer>());
+									}
+									destChannelIDMap.get(tran.channelName).add(msgId);
+									chanId++;
+								}
 								trace = "time=" + tran.endTime+ " block="+ destTask.getName() + " type="+asynchType+ " blockdestination="+ destTask.getName() + " channel="+tran.channelName+" msgid="+ msgId + " params=\"" +chan.getSize()+"\"";	
 							}
 							//	
@@ -1611,21 +1632,31 @@ public class JFrameInteractiveSimulation extends JFrame implements ActionListene
 							msgTimes.put(tran.channelName, new ArrayList<String>());
 						} 
 						if (!msgTimes.get(tran.channelName).contains(tran.endTime)){
-							if (channelIDMap.containsKey(tran.channelName) && channelIDMap.get(tran.channelName).size()>0){
-								msgId=channelIDMap.get(tran.channelName).remove(0);
-							}
-							else {
-								if (!channelIDMap.containsKey(tran.channelName)){
-									channelIDMap.put(tran.channelName, new ArrayList<Integer>());
-								}
-								channelIDMap.get(tran.channelName).add(msgId);
-								chanId++;
-							}
 							String trace="";
 							if (command.equals("Send")){
+								if (destChannelIDMap.containsKey(tran.channelName) && destChannelIDMap.get(tran.channelName).size()>0){
+									msgId=destChannelIDMap.get(tran.channelName).remove(0);
+								}
+								else {
+									if (!origChannelIDMap.containsKey(tran.channelName)){
+										origChannelIDMap.put(tran.channelName, new ArrayList<Integer>());
+									}
+									origChannelIDMap.get(tran.channelName).add(msgId);
+									chanId++;
+								}
 								trace = "time=" + tran.endTime+ " block="+ originTask.getName() + " type="+asynchType+ " blockdestination="+ destTask.getName() + " channel="+tran.channelName+" msgid="+ msgId + " params=\"";	
 							}
 							else {
+								if (origChannelIDMap.containsKey(tran.channelName) && origChannelIDMap.get(tran.channelName).size()>0){
+									msgId=origChannelIDMap.get(tran.channelName).remove(0);
+								}
+								else {
+									if (!destChannelIDMap.containsKey(tran.channelName)){
+										destChannelIDMap.put(tran.channelName, new ArrayList<Integer>());
+									}
+									destChannelIDMap.get(tran.channelName).add(msgId);
+									chanId++;
+								}
 								trace = "time=" + tran.endTime+ " block="+ destTask.getName() + " type="+asynchType+ " blockdestination="+ destTask.getName() + " channel="+tran.channelName+" msgid="+ msgId + " params=\"";
 							}
 							//	
@@ -1666,25 +1697,47 @@ public class JFrameInteractiveSimulation extends JFrame implements ActionListene
 						int msgId=chanId;
 						if (!msgTimes.containsKey(tran.channelName)){
 							msgTimes.put(tran.channelName, new ArrayList<String>());
+						}
+						if (!channelMsgIdMap.containsKey(tran.channelName)){
+							channelMsgIdMap.put(tran.channelName, new ArrayList<Integer>());
 						} 
+						
+
+
 						if (!msgTimes.get(tran.channelName).contains(tran.endTime)){
-							if (channelIDMap.containsKey(tran.channelName) && channelIDMap.get(tran.channelName).size()>0){
-								msgId=channelIDMap.get(tran.channelName).remove(0);
-							}
-							else {
-								if (!channelIDMap.containsKey(tran.channelName)){
-									channelIDMap.put(tran.channelName, new ArrayList<Integer>());
-								}
-								channelIDMap.get(tran.channelName).add(msgId);
-								chanId++;
-							}
+							
+							
 							String trace="";
 							if (command.equals("Request")){
+								if (destChannelIDMap.containsKey(tran.channelName) && destChannelIDMap.get(tran.channelName).size()>0){
+									msgId=destChannelIDMap.get(tran.channelName).remove(0);
+								}
+								else {
+									if (!origChannelIDMap.containsKey(tran.channelName)){
+										origChannelIDMap.put(tran.channelName, new ArrayList<Integer>());
+									}
+									origChannelIDMap.get(tran.channelName).add(msgId);
+									chanId++;
+								}				
 								trace = "time=" + tran.endTime+ " block="+ tran.taskName + " type="+asynchType+ " blockdestination="+ destTask.getName() + " channel="+tran.channelName+" msgid="+ msgId + " params=\"";	
+								msgIdStartTimeMap.put(msgId, tran.endTime);
 							}
 							else {
+								if (origChannelIDMap.containsKey(tran.channelName) && origChannelIDMap.get(tran.channelName).size()>0){
+									msgId=origChannelIDMap.get(tran.channelName).remove(0);
+								}
+								else {
+									if (!destChannelIDMap.containsKey(tran.channelName)){
+										destChannelIDMap.put(tran.channelName, new ArrayList<Integer>());
+									}
+									destChannelIDMap.get(tran.channelName).add(msgId);
+									chanId++;
+								}
 								trace = "time=" + tran.endTime+ " block="+ destTask.getName() + " type="+asynchType+ " blockdestination="+ destTask.getName() + " channel="+tran.channelName+" msgid="+ msgId + " params=\"";	
+								msgIdEndTimeMap.put(msgId, tran.endTime);
 							}
+							
+							channelMsgIdMap.get(tran.channelName).add(msgId);
 							//	
 							if (!simtraces.contains(trace)){
 								simtraces.add(trace);
@@ -1727,6 +1780,73 @@ public class JFrameInteractiveSimulation extends JFrame implements ActionListene
 		}
 	}
     
+    public void calculateCorrespondingTimes(){
+	    for (String channel: channelMsgIdMap.keySet()){
+	    	List<Integer> minTimes = new ArrayList<Integer>();
+	    	for (int msgId: channelMsgIdMap.get(channel)){
+	    		String startTime = msgIdStartTimeMap.get(msgId);
+	    		String endTime = msgIdEndTimeMap.get(msgId);
+	    		if (startTime!=null && endTime !=null){
+	    			int diff = Integer.valueOf(endTime) - Integer.valueOf(startTime); 
+	    			minTimes.add(diff);
+	    		}
+	    	}  
+	    	SimulationLatency sl = new SimulationLatency();
+        	sl.setTransaction1("Send Req: " + channel);
+        	sl.setTransaction2("Corresponding Wait Req " + channel);
+        	
+        	
+        	
+        	
+       		sl.setMinTime("??");
+       		sl.setMaxTime("??");
+        	sl.setAverageTime("??");
+        	sl.setStDev("??");
+        	boolean found=false;
+        	for (Object o:latencies){
+        	    SimulationLatency s = (SimulationLatency) o;
+        	    if (s.getTransaction1().equals(sl.getTransaction1()) && s.getTransaction2().equals(sl.getTransaction2())){
+        	    	sl = s;
+        	        found=true;
+        	    }
+        	}
+        	if (!found){
+        	    latencies.add(sl);
+        	}
+        	if (minTimes.size()>0){
+            	int sum=0;
+                sl.setMinTime(Integer.toString(Collections.min(minTimes)));
+                sl.setMaxTime(Integer.toString(Collections.max(minTimes)));
+                for (int time: minTimes){
+                	sum+=time;
+                }
+                double average = (double) sum/ (double) minTimes.size();
+                double stdev =0.0;
+                for (int time:minTimes){
+                	stdev +=(time - average)*(time-average);
+                }
+                stdev= stdev/minTimes.size();
+                stdev = Math.sqrt(stdev);
+                sl.setAverageTime(String.format("%.1f",average));
+                sl.setStDev(String.format("%.1f",stdev)); 
+            }
+        	
+        	
+        	//updateLatency();
+        //	if (latm !=null && latencies.size()>0){
+        	 //   latm.setData(latencies);
+        //	}
+        	
+	    	
+	    }
+	    
+	    
+	    
+    	//System.out.println(channelMsgIdMap);
+    	//System.out.println(msgIdStartTimeMap);
+    	//System.out.println(msgIdEndTimeMap);
+    }
+    
     protected void addStatusToNode(String status, String task){
         mgui.addStatus(task,status);
     }
@@ -2681,10 +2801,12 @@ public class JFrameInteractiveSimulation extends JFrame implements ActionListene
             //calcuate response + checkpoint 1 id + checkpoint 2 id
             List<String> id1List = nameIdMap.get(sl.getTransaction1());
             List<String> id2List = nameIdMap.get(sl.getTransaction2());            
-            for (String id1: id1List){
-            	for (String id2: id2List){
-        	    	sendCommand("cl " + id1 + " " + id2);
-        	    }
+            if (id1List!=null && id2List!=null){
+	            for (String id1: id1List){
+    	        	for (String id2: id2List){
+    	    	    	sendCommand("cl " + id1 + " " + id2);
+    	    	    }
+    	    	}
         	}
         }
     }
@@ -2704,21 +2826,23 @@ public class JFrameInteractiveSimulation extends JFrame implements ActionListene
             List<String> ids2 = nameIdMap.get(sl.getTransaction2());
             List<Integer> times1 = new ArrayList<Integer>();
             List<Integer> times2 = new ArrayList<Integer>();
-			for (String id1: ids1){
-				if (transTimes.containsKey(id1)){
-					for(String time1: transTimes.get(id1)){
-	                	times1.add(Integer.valueOf(time1));
-	                }
+            if (ids1!=null && ids2!=null){
+				for (String id1: ids1){
+					if (transTimes.containsKey(id1)){
+						for(String time1: transTimes.get(id1)){
+		                	times1.add(Integer.valueOf(time1));
+		                }
+					}
 				}
-			}
-			for (String id2: ids2){
-				if (transTimes.containsKey(id2)){			
-                	ArrayList<Integer> minTimes = new ArrayList<Integer>();
-                    for (String time2: transTimes.get(id2)){
-	                	times2.add(Integer.valueOf(time2));
-	                }
-	            }
-	        }
+				for (String id2: ids2){
+					if (transTimes.containsKey(id2)){			
+    	            	ArrayList<Integer> minTimes = new ArrayList<Integer>();
+    	                for (String time2: transTimes.get(id2)){
+		                	times2.add(Integer.valueOf(time2));
+		                }
+		            }
+		        }
+		    }
 	       // 
 	       //
 	        List<Integer> minTimes = new ArrayList<Integer>();
@@ -2756,6 +2880,7 @@ public class JFrameInteractiveSimulation extends JFrame implements ActionListene
 				} 
             }
         }
+        calculateCorrespondingTimes();
         if (latm!=null && latencies.size()>0){
             latm.setData(latencies);
         }
@@ -3449,7 +3574,7 @@ public class JFrameInteractiveSimulation extends JFrame implements ActionListene
 			checkedTransactions.add(compName+" (ID: " + tgc.getDIPLOID() + ")");
 			if (!nameIdMap.containsKey(compName)){
 				nameIdMap.put(compName,new ArrayList<String>());
-				checkedTransactions.add(compName);
+				checkedTransactions.add(compName + " (all instances)");
 			}
 			nameIdMap.get(compName).add(Integer.toString(tgc.getDIPLOID()));
 			nameIdMap.put(compName+" (ID: " + tgc.getDIPLOID() + ")",new ArrayList<String>());