diff --git a/src/Ctranslator/BaseBuffer.java b/src/Ctranslator/BaseBuffer.java
index 5889f65c99e18de9c9b25977245f4b28d0161f89..c4c71dfa8f8c0dba21b8d14fb3d3e20c642bb915 100755
--- a/src/Ctranslator/BaseBuffer.java
+++ b/src/Ctranslator/BaseBuffer.java
@@ -55,13 +55,13 @@ public class BaseBuffer extends Buffer	{
 	protected String base_address;
 	protected int base_address_value;
 
-	public BaseBuffer( String _name, String _type, int _base_address_value )	{
+	/*public BaseBuffer( String _name, String _type, int _base_address_value )	{
 		name = _name;
 		base_address_value = _base_address_value;
 		base_address = _type + SP + POINTER + "base_address" + SP + "=" + SP + base_address_value + SC;
-	}
+	}*/
 
-	public String getCode()	{
+	@Override public String getCode()	{
 		code = "struct" + SP + name + TAB + "{" + CR + base_address + CR + "}" + SC;
 		return code;
 	}
diff --git a/src/Ctranslator/Buffer.java b/src/Ctranslator/Buffer.java
index d2d808cb0adc36ca42098ad7c329a179bf38b61e..92787cb9a8d9566b7e0fcb1d2a2e249bbe47e93d 100755
--- a/src/Ctranslator/Buffer.java
+++ b/src/Ctranslator/Buffer.java
@@ -49,6 +49,7 @@ package Ctranslator;
 import java.util.*;
 import java.nio.*;
 import myutil.*;
+import tmltranslator.*;
 
 public abstract class Buffer	{
 
@@ -59,7 +60,10 @@ public abstract class Buffer	{
 	public String POINTER = "*";
 
 	protected String code = "VOID";
-	protected String name = "BUFFER_TYPE";
+	protected String name = "";
+	protected String type = "";
+
+	protected TMLTask task;
 	
 	public Buffer()	{
 		code = "struct" + SP + name + TAB + "{" + CR + "}" + SC;
@@ -69,4 +73,19 @@ public abstract class Buffer	{
 		return code;
 	}
 
+	public String getName()	{
+		return name;
+	}
+
+	public String getType()	{
+		return type;
+	}
+
+	public String getCode()	{
+		return code;
+	}
+
+	public TMLTask getTask()	{
+		return task;
+	}
 }	//End of class
diff --git a/src/Ctranslator/FEPBuffer.java b/src/Ctranslator/FEPBuffer.java
index 2799925235c92bf63ef2a308b3eb29c34d8af7e5..2eeddf9d6dde3464b124e8fa550dc67e190f5cfa 100755
--- a/src/Ctranslator/FEPBuffer.java
+++ b/src/Ctranslator/FEPBuffer.java
@@ -49,6 +49,7 @@ package Ctranslator;
 import java.util.*;
 import java.nio.*;
 import myutil.*;
+import tmltranslator.*;
 
 public class FEPBuffer extends BaseBuffer	{
 
@@ -57,15 +58,18 @@ public class FEPBuffer extends BaseBuffer	{
 	protected String baseAddress = "int" + SP + "b" + SC;
 	protected String bank = "int" + SP + "q" + SC;
 	protected String dataType = "int" + SP + "t" + SC;
+	public static final String DECLARATION = "struct FEP_BUFFER_TYPE {\n\tint num_samples;\n\tint base_ddress;\n\tint bank;\n\tint type;\n};";
 
 	
-	public FEPBuffer( String _type, int _base_address_value )	{
+	/*public FEPBuffer( String _type, int _base_address_value )	{
 		super( "FEP_BUFF_TYPE", _type, _base_address_value );
 		code = "struct" + SP + name + TAB + "{" + CR + length + CR + baseAddress + CR + bank + CR + dataType + CR + "}" + SC;
+	}*/
+
+	public FEPBuffer( String _name, TMLTask _task )	{
+		type = "FEP_BUFFER_TYPE";
+		name = _name;
+		task = _task;
 	}
 	
-	public String getCode()	{
-		return code;
-	}
-
 }	//End of class
diff --git a/src/Ctranslator/MAPPERBuffer.java b/src/Ctranslator/MAPPERBuffer.java
index 961644d3bfd8837cc1e4dd623983a5dc9fbebbd8..d969db3da9e7e8ce01a5f39ea281e625f63ee22f 100644
--- a/src/Ctranslator/MAPPERBuffer.java
+++ b/src/Ctranslator/MAPPERBuffer.java
@@ -49,6 +49,7 @@ package Ctranslator;
 import java.util.*;
 import java.nio.*;
 import myutil.*;
+import tmltranslator.*;
 
 public class MAPPERBuffer extends BaseBuffer	{
 
@@ -58,8 +59,9 @@ public class MAPPERBuffer extends BaseBuffer	{
 	protected String bits_per_symbol;
 	protected String symmetrical;
 	protected int symmetrical_value;
+	public static final String DECLARATION = "struct MAPPER_BUFFER_TYPE {\n\tint num_samples;\n\tint base_address;\n};";
 	
-	public MAPPERBuffer( String _name, String _type, int _base_address_value, int _num_samples_value, int _bits_per_symbol_value, int _symmetrical_value )	{
+	/*public MAPPERBuffer( String _name, String _type, int _base_address_value, int _num_samples_value, int _bits_per_symbol_value, int _symmetrical_value )	{
 		super( _name, _type, _base_address_value );
 		num_samples_value = _num_samples_value;
 		num_samples = "int" + SP + "num_samples" + SP + "=" + SP + num_samples_value;
@@ -67,9 +69,15 @@ public class MAPPERBuffer extends BaseBuffer	{
 		bits_per_symbol = "int" + SP + "bits_per_symbol" + SP + "=" + SP + bits_per_symbol_value + SC;
 		symmetrical_value = _symmetrical_value;
 		symmetrical = "bool" + SP + "symmetrical" + SP + "=" + SP + symmetrical_value + SC;
+	}*/
+
+	public MAPPERBuffer( String _name, TMLTask _task )	{
+		type = "MAPPER_BUFFER_TYPE";
+		name = _name;
+		task = _task;
 	}
 
-	public String getCode()	{
+	@Override public String getCode()	{
 		code = "struct" + SP + name + TAB + "{" + CR + num_samples + CR + symmetrical + CR + bits_per_symbol + CR + base_address + CR + "}" + SC;
 		return code;
 	}
diff --git a/src/Ctranslator/MMBuffer.java b/src/Ctranslator/MMBuffer.java
index bf575328d5119b03482d23b751e332ac29c2e0fa..b45f7aabfedbaf76a8905455bc314787636f7c25 100644
--- a/src/Ctranslator/MMBuffer.java
+++ b/src/Ctranslator/MMBuffer.java
@@ -49,22 +49,30 @@ package Ctranslator;
 import java.util.*;
 import java.nio.*;
 import myutil.*;
+import tmltranslator.*;
 
 public class MMBuffer extends BaseBuffer	{
 
 	protected int num_samples;
 	protected String num_samples_value;
+	public static final String DECLARATION = "struct MM_BUFFER_TYPE {\n\tint num_samples;\n\tint base_address;\n};";
 
-	public MMBuffer( String _name, String _type, int _base_address_value, int _num_samples_value )	{
+	/*public MMBuffer( String _name, String _type, int _base_address_value, int _num_samples_value )	{
 		super( _name, _type, _base_address_value );
 		num_samples_value = _num_samples_value;
 		num_samples = "int" + SP + "num_samples" + SP + "=" + SP + num_samples_value;
-		/*base_address_value = _base_address_value;
+		base_address_value = _base_address_value;
 		base_address = _type + SP + POINTER + "base_address" + SP "=" + SP + base_address_value + SC
-		code = "struct" + SP + name + TAB + "{" + CR + num_samples + CR + base_address + CR + "}" + SC;*/
+		code = "struct" + SP + name + TAB + "{" + CR + num_samples + CR + base_address + CR + "}" + SC;
+	}*/
+
+	public MMBuffer( String _name, TMLTask _task )	{
+		type = "MM_BUFFER_TYPE";
+		name = _name;
+		task = _task;
 	}
 
-	public String getCode()	{
+	@Override public String getCode()	{
 		code = "struct" + SP + name + TAB + "{" + CR + num_samples + CR + base_address + CR + "}" + SC;
 		return code;
 	}
diff --git a/src/Ctranslator/Operation.java b/src/Ctranslator/Operation.java
index 1e9e02d0b276f72f16bcd670641e54e6bad3dbb3..4c0888c3711efd25fe57c3e74dec598f5eb0e584 100755
--- a/src/Ctranslator/Operation.java
+++ b/src/Ctranslator/Operation.java
@@ -89,7 +89,11 @@ public class Operation	{
 	}
 
 	public String getName()	{
-		return name;
+		return "F_" + name;
+	}
+
+	public String getContextName()	{
+		return "X_" + name;
 	}
 
 	public int getType()	{
diff --git a/src/Ctranslator/Signal.java b/src/Ctranslator/Signal.java
index e84a310f0cc31122c596415d3fd67f526a98d523..c30e3d8c0d865ae2a91c6e41ac1deab4306c252c 100755
--- a/src/Ctranslator/Signal.java
+++ b/src/Ctranslator/Signal.java
@@ -49,25 +49,51 @@ package Ctranslator;
 import java.util.*;
 import java.nio.*;
 import myutil.*;
+import tmltranslator.*;
 
 public class Signal	{
 
 	public String CR = "\n";
 	public String SC = ";";
-	private String status = "bool f" + SC + CR;
-	private String writeOffset = "int woff" + SC + CR;
-	private String readOffset = "int roff" + SC + CR;
-	private String buffPointer = "void *pBuff" + SC + CR;
 	
-	private String code = "";
+	private String status_s = "bool f" + SC + CR;
+	private boolean status = false;
+
+	private String writeOffset_s = "int woff" + SC + CR;
+	private int writeOffset;
+
+	private String readOffset_s = "int roff" + SC + CR;
+	private int readOffset;
+
+	private String buffPointer_s = "void *pBuff" + SC + CR;
+	private Buffer buffPointer = null;
 	
+	public static final String DECLARATION = "struct SIG_TYPE	{\n\tbool f;\n\tint woff;\n\tint roff;\n\tvoid *pBuff;\n};\ntypedef struct SIG_TYPE SIG_TYPE;";
+
+	private TMLPort port;
+	private String name;
+	private TMLCPLibArtifact artifact;
+	
+	public Signal( String _name, TMLPort _port, TMLCPLibArtifact _artifact )	{
+		port = _port;
+		name = _name;
+		artifact = _artifact;
+	}
+
 	public Signal()	{
-		code = 	"struct SIG_TYPE	{" + CR + status + writeOffset + readOffset + buffPointer + "};" + CR +
-						"typedef struct SIG_TYPE SIG_TYPE;";
+		port = null;
 	}
 
 	public String toString()	{
-		return code;
+		return DECLARATION;
+	}
+
+	public String getName()	{
+		return name;
+	}
+
+	public TMLCPLibArtifact getArtifact()	{
+		return artifact;
 	}
 
 }	//End of class
diff --git a/src/Ctranslator/TMLCCodeGeneration.java b/src/Ctranslator/TMLCCodeGeneration.java
index 96490d7bdbf63e4a5f3b6fcef786a5e854163abf..1b5e8785e28aca0e843fdebdc1a75a4567deee70 100755
--- a/src/Ctranslator/TMLCCodeGeneration.java
+++ b/src/Ctranslator/TMLCCodeGeneration.java
@@ -84,7 +84,11 @@ public class TMLCCodeGeneration	{
 	private int SDRoperationsCounter = 0;
 	private int signalsCounter = 0;
 	private ArrayList<String> signalsList = new ArrayList<String>();
+	private ArrayList<Signal> signalsList2 = new ArrayList<Signal>();
 	private ArrayList<TMLCPLib> mappedCPLibs;
+	private ArrayList<TMLPort> postexList = new ArrayList<TMLPort>();
+	private ArrayList<TMLPort> prexList = new ArrayList<TMLPort>();
+	private ArrayList<Buffer> buffersList = new ArrayList<Buffer>();
 
 	public JFrame frame; //Main Frame
 
@@ -110,31 +114,6 @@ public class TMLCCodeGeneration	{
 		tmla = _tmap.getTMLArchitecture();
 		mappedCPLibs = _tmap.getMappedTMLCPLibs();
 
-		for( TMLCPLib tmlcplib: mappedCPLibs )	{
-			TraceManager.addDev( "CPLIB " + tmlcplib.getName() );
-			for( TMLCPLibArtifact artifact: tmlcplib.getArtifacts() )	{
-				TraceManager.addDev( "Artifact: " + artifact.getName() );
-				TraceManager.addDev( "----------" + artifact.getTaskName() );
-				TraceManager.addDev( "----------" + artifact.getPortName() );
-				TraceManager.addDev( "----------" + artifact.getMemoryName() );
-				TraceManager.addDev( "----------" + artifact.getPriority() );
-			}
-		}
-		for( TMLChannel ch: tmlm.getChannels() )	{
-			TraceManager.addDev( "channel: " + ch.getName() );
-			if( ch.isBasicChannel() )	{
-				TraceManager.addDev( "Basic channel" );
-				//from the channel I get the ports and from above I get the port, the priority and the CP
-			}
-			else	{
-				TraceManager.addDev( ch.getOriginTasks().toString() );
-				TraceManager.addDev( ch.getDestinationTasks().toString() );
-				TraceManager.addDev( ch.getOriginPorts().toString() );
-				TraceManager.addDev( ch.getDestinationPorts().toString() );
-			}
-		}
-		System.exit(0);
-
 
 		ArrayList<TMLTask> mappedTasks = tmap.getMappedTasks();
 		ArrayList<TMLElement> commElts = tmap.getMappedCommunicationElement();
@@ -167,7 +146,7 @@ public class TMLCCodeGeneration	{
 								TAB2 + "fclose(source);" + CR +
  								TAB + "} else printf(\"ERROR input file does not exist!\\n\");" + CR +
 								TAB + applicationName + "_init( (char*)src_out_dat, (char*)dma1_out_dat, g_r_size, g_Ns , g_Fi, g_Li );" + CR +
-								TAB + "status = " + applicationName + "();" + CR +
+								TAB + "status = " + applicationName + "_final();" + CR +
 								TAB + "printf(\"score %d \", *(uint32_t*)dma1_out_dat );" + CR +
 								TAB + "free(src_out_dat);" + CR +
 								"}";
@@ -175,6 +154,19 @@ public class TMLCCodeGeneration	{
 
 	private void generateHeaderFile( ArrayList<TMLTask> mappedTasks )	{
 
+		//Fill the the prex and postex lists
+		for( TMLChannel ch: tmlm.getChannels() )	{
+			TMLPort originPort = ch.getOriginPort();
+			if( originPort.isPrex() )	{
+				prexList.add( originPort );
+			}
+		}
+		for( TMLChannel ch: tmlm.getChannels() )	{
+			TMLPort destinationPort = ch.getDestinationPort();
+			if( destinationPort.isPostex() )	{
+				postexList.add( destinationPort );
+			}
+		}
 		headerString += libraries();
 		headerString += prototypes();
 		headerString += variablesInMainFile();
@@ -190,8 +182,10 @@ public class TMLCCodeGeneration	{
 							"#include <stdio.h>" + CR +
 							"#include <stdint.h>" + CR +
 							"#include <embb/fep.h>" + CR +
-							"#include <embb/memory.h>" + CR +
-							"#include <embb/intl.h>" + CR2;
+							"#include <embb/intl.h>" + CR +
+							"#include <embb/mapper.h>" + CR +
+							"#include <embb/adaif.h>" + CR +
+							"#include <embb/memory.h>" + CR2;
 		return s;
 	}
 
@@ -210,7 +204,7 @@ public class TMLCCodeGeneration	{
 	}
 
 	private String variablesInMainFile()	{
-		String s = "extern int g_r_size;" + CR +
+		String s = 	"extern int g_r_size;" + CR +
 								"extern int g_Ns;" + CR +
 								"extern int g_Fi" + CR +
 								"extern int g_Li" + CR +
@@ -229,28 +223,44 @@ public class TMLCCodeGeneration	{
 				fTask = op.getSDRTasks().get( Operation.F_TASK );
 				String name = tmap.getHwNodeOf( xTask ).getName();
 				if( name.contains( "FEP" ) )	{
+					FEPBuffer fepBuff = new FEPBuffer( "buff_" + xTask.getName().split("__")[1], xTask );
 					if( declaration )	{
-						s += "extern FEP_BUFFER_TYPE " + "buff_" + xTask.getName().split("__")[1] + ";" + CR;
+						s += "extern" + SP + fepBuff.getType() + SP + fepBuff.getName() + ";" + CR;
 					}
 					else	{
-						s += "FEP_BUFFER_TYPE " + "buff_" + xTask.getName().split("__")[1] + ";" + CR;
+						s += fepBuff.getType() + SP + fepBuff.getName() + ";" + CR;
 					}
+					buffersList.add( fepBuff );
 				}
 				else if( name.contains( "MAPPER" ) )	{
+					MAPPERBuffer mappBuff = new MAPPERBuffer( "buff_" + xTask.getName().split("__")[1], xTask );
 					if( declaration )	{
-						s += "extern MAPPER_BUFFER_TYPE " + "buff_" + xTask.getName().split("__")[1] + ";" + CR;
+						s += "extern" + SP + mappBuff.getType() + SP + mappBuff.getName() + ";" + CR;
 					}
 					else	{
-						s += "MAPPER_BUFFER_TYPE " + "buff_" + xTask.getName().split("__")[1] + ";" + CR;
+						s += mappBuff.getType() + SP + mappBuff.getName() + ";" + CR;
 					}
+					buffersList.add( mappBuff );
 				}
 				else if( name.contains( "INTL" ) )	{
+					MMBuffer mmBuff = new MMBuffer( "buff_" + xTask.getName().split("__")[1], xTask );
+					if( declaration )	{
+						s += "extern" + SP + mmBuff.getType() + SP + mmBuff.getName() + ";" + CR;
+					}
+					else	{
+						s += mmBuff.getType() + SP + mmBuff.getName() + ";" + CR;
+					}
+					buffersList.add( mmBuff );
+				}
+				else if( name.contains( "ADAIF" ) )	{
+					MMBuffer mmBuff = new MMBuffer( "buff_" + xTask.getName().split("__")[1], xTask );
 					if( declaration )	{
-						s += "extern INTL_BUFFER_TYPE" + "buff_" + xTask.getName().split("__")[1] + ";" + CR;
+						s += "extern" + SP + mmBuff.getType() + SP + mmBuff.getName() + ";" + CR;
 					}
 					else	{
-						s += "INTL_BUFFER_TYPE" + "buff_" + xTask.getName().split("__")[1] + ";" + CR;
+						s += mmBuff.getType() + SP + mmBuff.getName() + ";" + CR;
 					}
+					buffersList.add( mmBuff );
 				}
 			}
 		}
@@ -270,6 +280,9 @@ public class TMLCCodeGeneration	{
 		for( String s1: getTaskNamePerMappedUnit( "INTL", mappedTasks ) )	{
 			s += "extern embb_intl_context " + s1 + ";" + CR;
 		}
+		for( String s1: getTaskNamePerMappedUnit( "ADAIF", mappedTasks ) )	{
+			s += "extern embb_adaif_context " + s1 + ";" + CR;
+		}
 		s += CR;
 		return s;
 	}
@@ -287,7 +300,7 @@ public class TMLCCodeGeneration	{
 		opsList = temp;
 
 		s =	"/********* SIGNAL TYPE ***************/" + CR +
-				sig.toString() + CR2 +							
+				Signal.DECLARATION + CR2 +							
 				"enum sigs_enu	{" + CR +
 				getListOfWriteChannelPorts() + CR + /* list of comma separated output ports*/
 				"NUM_SIGS };" + CR2 +
@@ -316,13 +329,19 @@ public class TMLCCodeGeneration	{
 				signalsCounter++;
 			}
 		}
+		for( TMLPort port: postexList )	{
+			s += port.getName() + ",\n";
+		}
 		return s.substring( 0, s.length()-1 );
 	}
 
 	private String variables()	{
 		String s = 	"/**** variables *****/" + CR +
-								"extern SIG_TYPE sig[];" + CR +
-								"#endif";
+								"extern SIG_TYPE sig[];" + CR2;
+		s += FEPBuffer.DECLARATION + CR2;
+		s += MAPPERBuffer.DECLARATION + CR2;
+		s += MMBuffer.DECLARATION + CR2;
+		s += "#endif";
 		return s;
 	}
 
@@ -360,13 +379,6 @@ public class TMLCCodeGeneration	{
 	private String initPrexOperations()	{
 		
 		String s = "";
-		ArrayList<TMLPort> prexList = new ArrayList<TMLPort>();
-		for( TMLChannel ch: tmlm.getChannels() )	{
-			TMLPort originPort = ch.getOriginPort();
-			if( originPort.isPrex() )	{
-				prexList.add( originPort );
-			}
-		}
 		for( TMLPort port: prexList )	{
 			s += "sig[ " + port.getName() +" ].f = true;" + CR;
 		}
@@ -419,20 +431,21 @@ public class TMLCCodeGeneration	{
 
 		TMLTask fTask, xTask;
 		for( Operation op: operationsList )	{
-			if( op.getType() == Operation.NONSDR )	{
-				fTask = op.getNONSDRTask();
-				xTask = fTask;
-				programString += generateNONSDROperation( op, xTask, fTask );
-			}
-			else	{
+			if( op.getType() == Operation.SDR )	{
 				xTask = op.getSDRTasks().get( Operation.X_TASK );
 				fTask = op.getSDRTasks().get( Operation.F_TASK );
 				programString += generateSDROperation( op, xTask, fTask );
 			}
+			/*else	{
+				fTask = op.getNONSDRTask();
+				xTask = fTask;
+				programString += generateNONSDROperation( op, xTask, fTask );
+			}*/
 		}
+		//System.exit(0);
 	}
 
-	private String generateNONSDROperation( Operation op, TMLTask xTask, TMLTask fTask )	{
+	/*private String generateNONSDROperation( Operation op, TMLTask xTask, TMLTask fTask )	{
 		
 		String XOD = op.getName();
 		String functionName = "int op_" + XOD + "()\t{" + CR +
@@ -445,7 +458,7 @@ public class TMLCCodeGeneration	{
 											"return status;" + CR +
 											"}" + CR2;
 		return functionName + exec_code + endCode;
-	}
+	}*/
 
 	private String makeBehavior( TMLTask task, TMLActivityElement elt ) {
 
@@ -653,51 +666,65 @@ public class TMLCCodeGeneration	{
 	private String generateSDROperation( Operation op, TMLTask xTask, TMLTask fTask )	{
 		
 		//For SDR operations the xTask is used to retrieve the mapped unit
-		String exec_code = "";
-		String XOD = op.getName();
-		String functionName = "int op_" + XOD + "()\t{" + CR +
+		String exec_code = "", endCode = "";
+		String XOD = op.getContextName();
+		String ID0 = getInSignalName( xTask );
+		String OD0 = getOutSignalName( xTask );
+
+		String functionName = "int op_" + op.getName() + "()\t{" + CR +
 													getTaskAttributes( fTask ) + CR +
-													"static int size;" + CR +
-													updateInSignals( xTask ) + CR2;
+													"static int size;" + CR;
+		if( !ID0.equals("") )	{	//the prex
+			functionName += "sig[" + ID0 + "].f = false;" + CR2;
+		}
 		
 		String mappedHwUnit = tmap.getHwNodeOf( xTask ).getName();
 		if( mappedHwUnit.contains( "FEP" ) )	{
 			if( XOD.contains( "CWP" ) || XOD.contains( "cwp" ) )	{
-				CwpMEC cwp = new CwpMEC( XOD, "", "", "" );
+				CwpMEC cwp = new CwpMEC( XOD, ID0, OD0, "" );
 				exec_code = cwp.getExecCode();
 			}
 			if( XOD.contains( "CWM" ) || XOD.contains( "cwm" ) )	{
-				CwmMEC cwm = new CwmMEC( XOD, "", "", "" );
+				CwmMEC cwm = new CwmMEC( XOD, ID0, OD0, "" );
 				exec_code = cwm.getExecCode();
 			}
 			if( XOD.contains( "CWA" ) || XOD.contains( "cwa" ) )	{
-				CwaMEC cwa = new CwaMEC( XOD, "", "", "" );
+				CwaMEC cwa = new CwaMEC( XOD, ID0, OD0, "" );
 				exec_code = cwa.getExecCode();
 			}
 			if( XOD.contains( "CWL" ) || XOD.contains( "cwl" ) )	{
-				CwlMEC cwl = new CwlMEC( XOD, "", "", "" );
+				CwlMEC cwl = new CwlMEC( XOD, ID0, OD0, "" );
 				exec_code = cwl.getExecCode();
 			}
 			if( XOD.contains( "SUM" ) || XOD.contains( "sum" ) )	{
-				SumMEC sum = new SumMEC( XOD, "", "", "" );
+				SumMEC sum = new SumMEC( XOD, ID0, OD0, "" );
 				exec_code = sum.getExecCode();
 			}
 			if( XOD.contains( "FFT" ) || XOD.contains( "fft" ) )	{
-				FftMEC fft = new FftMEC( XOD, "", "", "" );
+				FftMEC fft = new FftMEC( XOD, ID0, OD0, "" );
 				exec_code = fft.getExecCode();
 			}
 		}
 		else if( mappedHwUnit.contains( "MAPPER" ) )	{
-			MapperMEC mapp = new MapperMEC( XOD, "", "", "" );
+			MapperMEC mapp = new MapperMEC( XOD, ID0, OD0, "" );
 			exec_code = mapp.getExecCode();
 		}
 		else if( mappedHwUnit.contains( "INTL" ) )	{
-			InterleaverMEC intl = new InterleaverMEC( XOD, "", "", "" );
+			InterleaverMEC intl = new InterleaverMEC( XOD, ID0, OD0, "" );
 			exec_code = intl.getExecCode();
 		}
-		String endCode =	updateOutSignals( xTask ) + CR +
-											"return status;" + CR +
-											"}" + CR2;
+		else if( mappedHwUnit.contains( "ADAIF" ) )	{
+			AdaifMEC adaif = new AdaifMEC( XOD, ID0, OD0, "" );
+			exec_code = adaif.getExecCode();
+		}
+		if( OD0.equals("") )	{	//the postex
+			endCode = "sig[" + postexList.get(0).getName() + "].f = true;" + CR;
+		}
+		else	{
+			endCode = "sig[" + OD0 + "].f = true;" + CR;
+		}
+		endCode += "return status;" + CR + "}" + CR2;
+
 		return functionName + exec_code + endCode;
 	}
 
@@ -724,28 +751,49 @@ public class TMLCCodeGeneration	{
 		return attributesList.substring( 0, attributesList.length() - 1 );	//remove last CR
 	}
 
-	private String updateOutSignals( TMLTask task )	{
+	private String getOutSignalName( TMLTask task )	{
 		
 		String s = "";
-		for( TMLWriteChannel ch: task.getWriteChannels() )	{
-			s += "sig.[" + ch.toString().split("__")[1] + "].f = true;" + CR;
+		if( task.getWriteChannels().size() > 0 )	{
+			TMLWriteChannel ch = task.getWriteChannels().get(0);
+			String signalName = ch.toString().split("__")[1];
+			if( signalsList.contains( signalName + "_CPin" ) )	{
+				TraceManager.addDev( "Task " + task.getName() + ", OUT signal: " + signalName );
+				s = signalName;
+			}
+			else	{
+				s = signalName;
+			}
+			return s;
 		}
-		return s;
+		return "";
 	}
 
-	private String updateInSignals( TMLTask task )	{
+	private String getInSignalName( TMLTask task )	{
 		
 		String s = "";
-		for( TMLReadChannel ch: task.getReadChannels() )	{
-			s += "sig.[" + ch.toString().split("__")[1] + "].f = false;" + CR;
+		if( task.getReadChannels().size() > 0 )	{
+			TMLReadChannel ch = task.getReadChannels().get(0);
+			String signalName = ch.toString().split("__")[1];
+			if( signalsList.contains( signalName + "_CPin" ) )	{
+				TraceManager.addDev( "Task " + task.getName() + ", IN signal: " + signalName );
+				s = signalName;
+			}
+			else	{
+				s = signalName;
+			}
+			return s;
 		}
-		return s;
+		return "";
 	}
 
 	private void generateCommunicationPatterns()	{
 		
 		String functionName, exec_code = "", endCode, s;
 		for( TMLCPLib cplib: mappedCPLibs )	{
+			if( cplib.getArtifacts().size() == 1 )	{
+				TraceManager.addDev( "----------" + cplib.getArtifacts().get(0).getPortName() );
+			}
 			functionName = "int op_" + cplib.getName() + "()\t{" + CR +
 													//getTaskAttributes( fTask ) + CR +
 													"static int size;" + CR;
@@ -837,13 +885,6 @@ public class TMLCCodeGeneration	{
 	private void exitRule()	{
 		
 		String s = "";
-		ArrayList<TMLPort> postexList = new ArrayList<TMLPort>();
-		for( TMLChannel ch: tmlm.getChannels() )	{
-			TMLPort destinationPort = ch.getDestinationPort();
-			if( destinationPort.isPostex() )	{
-				postexList.add( destinationPort );
-			}
-		}
 		for( TMLPort port: postexList )	{
 			s += "( sig[ " + port.getName() +" ].f == true ) &&";
 		}
@@ -880,6 +921,9 @@ public class TMLCCodeGeneration	{
 		for( String s: getTaskNamePerMappedUnit( "INTL", mappedTasks ) )	{
 			initString += "embb_intl_context " + s + ";" + CR;
 		}
+		for( String s: getTaskNamePerMappedUnit( "ADAIF", mappedTasks ) )	{
+			initString += "embb_adaif_context " + s + ";" + CR;
+		}
 		initString += CR;
 
 		initString += initializeApplication() + CR2;
@@ -936,6 +980,11 @@ public class TMLCCodeGeneration	{
 			MapperMEC mapp = new MapperMEC( XOD, task.getID0(), task.getOD0(), "" );
 			initString += mapp.getInitCode() + CR;
 		}
+		for( TMLTask task: getTasksPerMappedUnit( "ADAIF", mappedTasks ) )	{
+			XOD = task.getName().split("__")[1];
+			AdaifMEC adaif = new AdaifMEC( XOD, task.getID0(), task.getOD0(), "" );
+			initString += adaif.getInitCode() + CR;
+		}
 
 		generateInitRoutinesForCPs();
 
@@ -950,6 +999,9 @@ public class TMLCCodeGeneration	{
 		for( String s: getTaskNamePerMappedUnit( "INTL", mappedTasks ) )	{
 			initString += TAB + "init_" + s + "();" + CR;
 		}
+		for( String s: getTaskNamePerMappedUnit( "ADAIF", mappedTasks ) )	{
+			initString += TAB + "init_" + s + "();" + CR;
+		}
 		initString += "}" + CR2;
 
 		//Init Communication Patterns. Only DMA transfers need init code
@@ -975,6 +1027,9 @@ public class TMLCCodeGeneration	{
 		for( String s: getTaskNamePerMappedUnit( "INTL", mappedTasks ) )	{
 			initString += TAB + "intl_ctx_cleanup( &" + s + " );" + CR;
 		}
+		for( String s: getTaskNamePerMappedUnit( "ADAIF", mappedTasks ) )	{
+			initString += TAB + "adaif_ctx_cleanup( &" + s + " );" + CR;
+		}
 		initString += "}";
 	}
 
@@ -993,6 +1048,20 @@ public class TMLCCodeGeneration	{
 	private String initializeApplication()	{
 
 		String s = "void " + applicationName + "_final_init()\t{" + CR;
+
+			for( Buffer buff: buffersList )	{
+				s += TAB + buff.getName() + SP + "=" + SP;
+				if( buff instanceof FEPBuffer )	{
+					s += "{/* USER TO DO*/, /* USER TO DO*/, /* USER TO DO*/};" + CR;
+				}
+				if( buff instanceof MAPPERBuffer )	{
+					s += "{/* USER TO DO*/, /* USER TO DO*/, /* USER TO DO*/};" + CR;
+				}
+				if( buff instanceof MMBuffer )	{
+					s += "{/* USER TO DO*/, /* USER TO DO*/, /* USER TO DO*/};" + CR;
+				}
+			}
+
 		s += "}" + CR2;
 		return s;
 	}
@@ -1000,10 +1069,10 @@ public class TMLCCodeGeneration	{
 	private String initializeSignals()	{
 		String s = "void signal_to_buffer_init()\t{" + CR;
 		for( int i = 0; i < signalsCounter; i++ )	{
-			s += TAB + "sig[" + String.valueOf(i) + "].f = false;" + CR;
-			s += TAB + "sig[" + String.valueOf(i) + "].roff = /*USER TO DO*/;" + CR;
-			s += TAB + "sig[" + String.valueOf(i) + "].woff = /*USER TO DO*/;" + CR;
-			s += TAB + "sig[" + String.valueOf(i) + "].pBuff = /*USER TO DO*/;" + CR2;
+			s += TAB + "sig[" + signalsList.get(i) + "].f = false;" + CR;
+			s += TAB + "sig[" + signalsList.get(i) + "].roff = /*USER TO DO*/;" + CR;
+			s += TAB + "sig[" + signalsList.get(i) + "].woff = /*USER TO DO*/;" + CR;
+			s += TAB + "sig[" + signalsList.get(i) + "].pBuff = /*USER TO DO*/;" + CR2;
 		}
 		return s + "}" + SC + CR;
 	}