diff --git a/src/main/java/ui/interactivesimulation/JFrameInteractiveSimulation.java b/src/main/java/ui/interactivesimulation/JFrameInteractiveSimulation.java
index a07e5e58a89c32163ceb8daf156c658e3db453d4..7d5ddb40541029d6d31b64acc4769cfaca02c497 100755
--- a/src/main/java/ui/interactivesimulation/JFrameInteractiveSimulation.java
+++ b/src/main/java/ui/interactivesimulation/JFrameInteractiveSimulation.java
@@ -1392,6 +1392,17 @@ public class JFrameInteractiveSimulation extends JFrame implements ActionListene
 	public void writeSimTrace(){
 		try {
 			tmlSimPanel = new JFrameTMLSimulationPanel(new Frame(), mgui, "Simulation Transactions");
+			HashMap<String, ArrayList<String>> deviceTaskMap = new HashMap<String, ArrayList<String>>();
+			for (HwNode node : tmap.getTMLArchitecture().getHwNodes()){
+				deviceTaskMap.put(node.getName(), new ArrayList<String>());
+			}
+			for (TMLTask task: tmap.getTMLModeling().getTasks()){
+				HwNode node = tmap.getHwNodeOf(task);
+				if (node!=null){
+					deviceTaskMap.get(node.getName()).add(task.getName());
+				}
+			}
+			tmlSimPanel.getSDPanel().setDevices(deviceTaskMap);
 			pos = new PipedOutputStream();
 			pis = new PipedInputStream(pos, 4096);
 			tmlSimPanel.setFileReference(new BufferedReader(new InputStreamReader(pis)));
@@ -1573,37 +1584,98 @@ public class JFrameInteractiveSimulation extends JFrame implements ActionListene
 					simtraces.add(trace);
 				}
 			}
-			else if (command.equals("Send")){
+			else if ((command.equals("Send") || command.equals("Wait"))  && tran.deviceName.contains("CPU")){
 				TMLEvent evt = tmap.getTMLModeling().getEventByShortName(tran.channelName);
 				if (evt!=null){
 					TMLTask originTask = evt.getOriginTask();
 					TMLTask destTask = evt.getDestinationTask();
 					if (originTask!=null && destTask!=null){
-						String trace = "time=" + tran.endTime+ " block="+ originTask.getName() + " type=synchro blockdestination="+ destTask.getName() + " channel="+tran.channelName+ " params=\"";
-						if (!simtraces.contains(trace)){
-							simtraces.add(trace);
+							String asynchType = (command.equals("Send") ? "send_async" : "receive_async");
+							int msgId=chanId;
+							if (!msgTimes.containsKey(tran.channelName)){
+								msgTimes.put(tran.channelName, new ArrayList<String>());
+							} 
+							if (!msgTimes.get(tran.channelName).contains(tran.endTime)){
+	//						int tmp=msgId-1;
+						
+							if (command.equals("Send")){	
+								if (!channelIDMap.containsKey(tran.channelName)){
+									channelIDMap.put(tran.channelName, new ArrayList<Integer>());
+								}
+								channelIDMap.get(tran.channelName).add(msgId);
+								chanId++;
+							}
+							else {
+								if (channelIDMap.containsKey(tran.channelName) && channelIDMap.get(tran.channelName).size()>0){
+									msgId=channelIDMap.get(tran.channelName).remove(0);
+								}
+							
+							}
+						String trace="";
+						if (command.equals("Send")){
+							trace = "time=" + tran.endTime+ " block="+ originTask.getName() + " type="+asynchType+ " blockdestination="+ destTask.getName() + " channel="+tran.channelName+" msgid="+ msgId + " params=\"";	
 						}
+						else {
+							trace = "time=" + tran.endTime+ " block="+ destTask.getName() + " type="+asynchType+ " blockdestination="+ destTask.getName() + " channel="+tran.channelName+" msgid="+ msgId + " params=\"";
+						}
+						//	System.out.println("sending asynch " + trace);
+							if (!simtraces.contains(trace)){
+								simtraces.add(trace);
+								if (!msgTimes.containsKey(tran.channelName)){
+									msgTimes.put(tran.channelName, new ArrayList<String>());
+								}
+								msgTimes.get(tran.channelName).add(tran.endTime);
+							}
+						//}
 					}
 				}
+				}
 			}
-			else if (command.equals("Wait")){
-				//
-			}
-			else if (command.equals("Request")){
+			else if ((command.equals("Request") || command.equals("Notified")) && tran.deviceName.contains("CPU")){
 				TMLRequest req = tmap.getTMLModeling().getRequestByShortName(tran.channelName);
 				if (req!=null){
-//					TMLTask originTask = req.getOriginTask();
 					TMLTask destTask = req.getDestinationTask();
 					if (destTask!=null){
-						String trace = "time=" + tran.endTime+ " block="+ tran.taskName + " type=synchro blockdestination="+ destTask.getName() + " channel="+tran.channelName + " params=\"";
-						if (!simtraces.contains(trace)){
-							simtraces.add(trace);
+							String asynchType = (command.equals("Request") ? "send_async" : "receive_async");
+							int msgId=chanId;
+							if (!msgTimes.containsKey(tran.channelName)){
+								msgTimes.put(tran.channelName, new ArrayList<String>());
+							} 
+							if (!msgTimes.get(tran.channelName).contains(tran.endTime)){
+	//						int tmp=msgId-1;
+						
+							if (command.equals("Request")){	
+								if (!channelIDMap.containsKey(tran.channelName)){
+									channelIDMap.put(tran.channelName, new ArrayList<Integer>());
+								}
+								channelIDMap.get(tran.channelName).add(msgId);
+								chanId++;
+							}
+							else {
+								if (channelIDMap.containsKey(tran.channelName) && channelIDMap.get(tran.channelName).size()>0){
+									msgId=channelIDMap.get(tran.channelName).remove(0);
+								}
+							
+							}
+						String trace="";
+						if (command.equals("Request")){
+							trace = "time=" + tran.endTime+ " block="+ tran.taskName + " type="+asynchType+ " blockdestination="+ destTask.getName() + " channel="+tran.channelName+" msgid="+ msgId + " params=\"";	
 						}
+						else {
+							trace = "time=" + tran.endTime+ " block="+ destTask.getName() + " type="+asynchType+ " blockdestination="+ destTask.getName() + " channel="+tran.channelName+" msgid="+ msgId + " params=\"";	
+						}
+						//	System.out.println("sending asynch " + trace);
+							if (!simtraces.contains(trace)){
+								simtraces.add(trace);
+								if (!msgTimes.containsKey(tran.channelName)){
+									msgTimes.put(tran.channelName, new ArrayList<String>());
+								}
+								msgTimes.get(tran.channelName).add(tran.endTime);
+							}
+						//}
 					}
 				}
-			}
-			else if (command.equals("Notified")){
-				//
+				}
 			}
 			else if (command.contains("Execi")){
 				String trace="time="+tran.endTime+ " block=" + tran.taskName + " type=state_entering state=exec" + tran.length;
diff --git a/src/main/java/ui/interactivesimulation/JFrameTMLSimulationPanel.java b/src/main/java/ui/interactivesimulation/JFrameTMLSimulationPanel.java
index 423db8356026c797e4eab3a0e4c6b72b5b28e0fe..d3a55082f0f91ddf160b748142b675ad0fc48149 100644
--- a/src/main/java/ui/interactivesimulation/JFrameTMLSimulationPanel.java
+++ b/src/main/java/ui/interactivesimulation/JFrameTMLSimulationPanel.java
@@ -135,6 +135,10 @@ public	class JFrameTMLSimulationPanel extends JFrame implements ActionListener {
         //System.out.println("Row table:" + rowTable.toString());
         //System.out.println("Value table:" + valueTable.toString());
 	}
+
+	public JSimulationTMLPanel getSDPanel(){
+		return sdpanel;
+	}
     
     private	void initActions() {
         actions = new InteractiveSimulationActions[InteractiveSimulationActions.NB_ACTION];
diff --git a/src/main/java/ui/interactivesimulation/JSimulationTMLPanel.java b/src/main/java/ui/interactivesimulation/JSimulationTMLPanel.java
index 04143c93472a07916ffbe4dfdb64ff47b7bd31cd..6cff97da0a1ea742f8f1a63e6240671b1a0d1354 100644
--- a/src/main/java/ui/interactivesimulation/JSimulationTMLPanel.java
+++ b/src/main/java/ui/interactivesimulation/JSimulationTMLPanel.java
@@ -55,6 +55,8 @@ import java.awt.image.BufferedImage;
 import java.io.*;
 import java.util.Hashtable;
 import java.util.Vector;
+import java.util.ArrayList;
+import java.util.HashMap;
 
 /**
  * Class JSimulationSDPanel
@@ -81,7 +83,7 @@ public class JSimulationTMLPanel extends JPanel implements MouseMotionListener,
     private boolean spaceBetweenLifeLinesComputed = false;
     private int spaceAtEnd = 50;
     private int spaceAtTop = 50;
-    private int spaceVerticalText = 2;
+    private int spaceVerticalText = 4;
     private int spaceHorizontalText = 2;
     private int verticalLink = 10;
 
@@ -107,6 +109,8 @@ public class JSimulationTMLPanel extends JPanel implements MouseMotionListener,
     // Or the list is described in the trace (header information)
     private Vector <String> entityNames;
 
+	private HashMap<String, ArrayList<String>> deviceTaskMap = new HashMap<String, ArrayList<String>>();
+
     private final int NO_MODE = 0;
     private final int FILE_MODE = 1;
     private final int STREAM_MODE = 2;
@@ -175,6 +179,15 @@ public class JSimulationTMLPanel extends JPanel implements MouseMotionListener,
         this.repaint();
     }
 
+	public void setDevices(HashMap<String, ArrayList<String>> map){
+		deviceTaskMap = map;
+		for (String device: deviceTaskMap.keySet()){
+			for (String task: deviceTaskMap.get(device)){
+				addEntityNameIfApplicable(task);
+			}
+		}
+	}
+
     protected void paintComponent(Graphics g) {
         super.paintComponent(g);
         int currentY = spaceAtTop;
@@ -225,13 +238,30 @@ public class JSimulationTMLPanel extends JPanel implements MouseMotionListener,
     private int paintTopElements(Graphics g, int currentX, int currentY) {
         int w;
 
-        for(String name : entityNames) {
-            g.drawLine(currentX + (spaceBetweenLifeLines/4), currentY, currentX + (3*spaceBetweenLifeLines/4), currentY);
-            g.drawLine(currentX + (spaceBetweenLifeLines/2), currentY, currentX + (spaceBetweenLifeLines/2), currentY + verticalSpaceUnderBlocks);
-            w = g.getFontMetrics().stringWidth(name);
-            g.drawString(name, currentX + ((spaceBetweenLifeLines-w)/2), currentY - spaceVerticalText);
-            currentX += spaceBetweenLifeLines;
-        }
+		if (deviceTaskMap.keySet().size()==0){
+	        for(String name : entityNames) {
+    	        g.drawLine(currentX + (spaceBetweenLifeLines/4), currentY, currentX + (3*spaceBetweenLifeLines/4), currentY);
+    	        g.drawLine(currentX + (spaceBetweenLifeLines/2), currentY, currentX + (spaceBetweenLifeLines/2), currentY + verticalSpaceUnderBlocks);
+    	        w = g.getFontMetrics().stringWidth(name);
+    	        g.drawString(name, currentX + ((spaceBetweenLifeLines-w)/2), currentY - spaceVerticalText);
+    	        currentX += spaceBetweenLifeLines;
+    	    }
+		}
+		else {
+			for (String device: deviceTaskMap.keySet()){
+				if (deviceTaskMap.get(device).size()>0){
+					w = g.getFontMetrics().stringWidth(device);
+					g.drawString(device, currentX + (deviceTaskMap.get(device).size()-1)*((spaceBetweenLifeLines-w)/2), (currentY - spaceVerticalText)/2);
+					for(String name : deviceTaskMap.get(device)) {
+	    	        	g.drawLine(currentX + (spaceBetweenLifeLines/4), currentY, currentX + (3*spaceBetweenLifeLines/4), currentY);
+	    	        	g.drawLine(currentX + (spaceBetweenLifeLines/2), currentY, currentX + (spaceBetweenLifeLines/2), currentY + verticalSpaceUnderBlocks);
+	    	        	w = g.getFontMetrics().stringWidth(name);
+	    	        	g.drawString(name, currentX + ((spaceBetweenLifeLines-w)/2), currentY - spaceVerticalText);
+	    	        	currentX += spaceBetweenLifeLines;	
+					}
+				}
+    	    }
+		}
 
         maxX = currentX;