diff --git a/src/main/java/tmltranslator/tonetwork/TMAP2Network.java b/src/main/java/tmltranslator/tonetwork/TMAP2Network.java
index a040689b5c06f6aa02645701e87cfa7ba6d92595..d5e3fec91039e0ceee052d2d42c8719fcc0b145d 100644
--- a/src/main/java/tmltranslator/tonetwork/TMAP2Network.java
+++ b/src/main/java/tmltranslator/tonetwork/TMAP2Network.java
@@ -177,6 +177,7 @@ public class TMAP2Network<E>  {
 
     }
 
+
     /* List of assumptions:
             - Only one router set (i.e. no router, then bus, then router) between two tasks
             - Channels must be mapped on at least one route to be taken into account
diff --git a/src/main/java/tmltranslator/tonetwork/TranslatedRouter.java b/src/main/java/tmltranslator/tonetwork/TranslatedRouter.java
index 7fc40c070959ff63fe6e07bbda52ecace7f33cd2..abdb06da2c39a38bfc3b5b31f026f56e801927d1 100644
--- a/src/main/java/tmltranslator/tonetwork/TranslatedRouter.java
+++ b/src/main/java/tmltranslator/tonetwork/TranslatedRouter.java
@@ -242,21 +242,6 @@ public class TranslatedRouter<E> {
             if (routerToConnectWith != null) {
                 if (TMAP2Network.hasRouterAt(xPos, yPos, portNb, noc.size)) {
 
-                    /*Vector<TMLEvent> evtFromINtoINVCs = new Vector<>();
-                    Vector<TMLChannel> chFromINtoINVCs = new Vector<>();
-                    for (i = 0; i < nbOfVCs; i++) {
-                        TMLEvent evtFromINtoINVC = new TMLEvent("EventBetweenIN_IN_forVC_" + i + "_" + nameOfExecNode,
-                                null, 8, true);
-                        tmlm.addEvent(evtFromINtoINVC);
-                        evtFromINtoINVCs.add(evtFromINtoINVC);
-
-                        TMLChannel chFromINtoINVC = new TMLChannel("channelBetweenIN_IN_for_VC" + i + "_" +
-                                nameOfExecNode, null);
-                        chFromINtoINVC.setSize(4);
-                        chFromINtoINVC.setMax(8);
-                        tmlm.addChannel(chFromINtoINVC);
-                        chFromINtoINVCs.add(chFromINtoINVC);
-                    }*/
 
                     TaskINForDispatch inDispatch = new TaskINForDispatch("IN_" + execNode, null,
                             null);
@@ -296,18 +281,17 @@ public class TranslatedRouter<E> {
         }
 
         // IN VC
-        Vector<TaskINForVC> dispatchInVCs = new Vector<>();
+        TaskINForVC[][] dispatchInVCs = new TaskINForVC[NB_OF_PORTS][nbOfVCs];
         for (int portNb = 0; portNb < NB_OF_PORTS; portNb++) {
             for (int vcNb = 0; vcNb < nbOfVCs; vcNb++) {
                 TranslatedRouter routerToConnectWith = main.getRouterFrom(xPos, yPos, portNb);
                 if (routerToConnectWith != null) {
                     if (TMAP2Network.hasRouterAt(xPos, yPos, portNb, noc.size)) {
 
-
                         TaskINForVC taskINForVC = new TaskINForVC("IN_" + execNode + "_" + vcNb, null,
                                 null);
                         tmlm.addTask(taskINForVC);
-                        dispatchInVCs.add(taskINForVC);
+                        dispatchInVCs[portNb][vcNb] = taskINForVC;
 
                         pktInEvtsVCs[portNb][vcNb].setDestinationTask(taskINForVC);
 
@@ -334,6 +318,87 @@ public class TranslatedRouter<E> {
                 }
             }
         }
+
+        // OUT VC
+        TaskOUTForVC[][] dispatchOutVCs = new TaskOUTForVC[NB_OF_PORTS][nbOfVCs];
+        for (int portNb = 0; portNb < NB_OF_PORTS; portNb++) {
+            for (int vcNb = 0; vcNb < nbOfVCs; vcNb++) {
+                TranslatedRouter routerToConnectWith = main.getRouterFrom(xPos, yPos, portNb);
+                if (routerToConnectWith != null) {
+                    if (TMAP2Network.hasRouterAt(xPos, yPos, portNb, noc.size)) {
+                        TaskOUTForVC taskOUTForVC = new TaskOUTForVC("OUTVC_" + execNode + "_" + vcNb, null,
+                                null);
+                        tmlm.addTask(taskOUTForVC);
+                        dispatchOutVCs[portNb][vcNb] = taskOUTForVC;
+
+                        Vector<TMLEvent> inPackets = new Vector<>();
+                        Vector<TMLEvent> outFeedbacks = new Vector<>();
+                        for(int k=0; k<TMAP2Network.DOMAIN+1; k++) {
+                            inPackets.add(routeEvtVCs[portNb][vcNb][k]);
+                            routeEvtVCs[portNb][vcNb][k].setDestinationTask(taskOUTForVC);
+
+                            outFeedbacks.add(routeEvtVCsFeedback[portNb][vcNb][k]);
+                            routeEvtVCsFeedback[portNb][vcNb][k].setOriginTask(taskOUTForVC);
+
+                        }
+
+                        TMLEvent vcSelect = evtSelectVC[portNb][nbOfVCs];
+                        vcSelect.setDestinationTask(taskOUTForVC);
+
+                        TMLEvent outVCEvt = evtOutVCs[portNb][nbOfVCs];
+                        outVCEvt.setDestinationTask(taskOUTForVC);
+
+                        taskOUTForVC.generate(inPackets, vcSelect, outFeedbacks, outVCEvt);
+                    }
+                }
+            }
+        }
+
+        // OUT NOC - One for each output of the considered router
+        // We need one output channel for each exit and one output event per VC
+
+        HashMap<Integer, TaskOUTForDispatch> dispatchOuts = new HashMap<>();
+        for (int portNb = 0; portNb < NB_OF_PORTS; portNb++) {
+            TranslatedRouter routerToConnectWith = main.getRouterFrom(xPos, yPos, portNb);
+            if (routerToConnectWith != null) {
+                if (TMAP2Network.hasRouterAt(xPos, yPos, portNb, noc.size)) {
+
+
+                    TaskOUTForDispatch outDispatch = new TaskOUTForDispatch("OUT_" + execNode, null,
+                            null);
+                    tmlm.addTask(outDispatch);
+
+
+                    Vector<TMLEvent> inPacketEvents = new Vector<TMLEvent>();
+                    Vector<TMLEvent> inFeedbackEvents = new Vector<TMLEvent>();
+                    Vector<TMLEvent> outSelectEvents = new Vector<TMLEvent>();
+                    TMLEvent outPktEvent;
+                    TMLChannel outPkt;
+
+                    for(int nvc=0; nvc<nbOfVCs; nvc++) {
+                        inPacketEvents.add(evtOutVCs[portNb][nvc]);
+                        evtOutVCs[portNb][nvc].setDestinationTask(outDispatch);
+                        outSelectEvents.add(evtSelectVC[portNb][nvc]);
+                        evtSelectVC[portNb][nvc].setOriginTask(outDispatch);
+                        inFeedbackEvents.add(feedbackINVCtoOUTs[portNb][nvc]);
+                        feedbackINVCtoOUTs[portNb][nvc].setDestinationTask(outDispatch);
+                    }
+
+                    outPktEvent = evtOutVCstoINs[portNb];
+                    evtOutVCstoINs[portNb].setOriginTask(outDispatch);
+                    outPkt = chOutVCstoINs[portNb];
+                    chOutVCstoINs[portNb].setOriginTask(outDispatch);
+
+
+                    outDispatch.generate(inPacketEvents, inFeedbackEvents, outSelectEvents, outPktEvent, outPkt);
+
+                    dispatchOuts.put(new Integer(portNb), outDispatch);
+                }
+            }
+        }
+
+
+
     }