diff --git a/src/main/java/tmltranslator/tonetwork/TMAP2Network.java b/src/main/java/tmltranslator/tonetwork/TMAP2Network.java
index 3a9ef39beb2ec54975ecbfa9683131ec19baf902..6d3e3f0c77e4a8895d5f3d72506d4753069ef1a6 100644
--- a/src/main/java/tmltranslator/tonetwork/TMAP2Network.java
+++ b/src/main/java/tmltranslator/tonetwork/TMAP2Network.java
@@ -69,16 +69,99 @@ public class TMAP2Network<E>  {
     private int nocSize = 2;
     private TranslatedRouter[][] routers;
 
+    public final static int NORTH = 0;
+    public final static int SOUTH = 1;
+    public final static int WEST = 2;
+    public final static int EAST = 3;
+    public final static int DOMAIN = 4;
+
+
     public TMAP2Network(TMLMapping<?> _tmlmapping, int nocSize) {
         tmlmapping = _tmlmapping;
         routers = new TranslatedRouter[nbOfVCs][nbOfVCs];
         this.nocSize = nocSize;
     }
 
+    public static boolean hasRouterAt(int myX, int myY, int routerPosition, int nocSize) {
+        if (routerPosition == DOMAIN) {
+            return true;
+        }
+
+        int decX = 0;
+        int decY = 0;
+
+        switch(routerPosition) {
+            case NORTH:
+                decY = -1;
+                break;
+            case SOUTH:
+                decY = 1;
+                break;
+            case WEST:
+                decX = -1;
+                break;
+            case EAST:
+                decX = 1;
+
+        }
+
+        myX = myX + decX;
+        myY = myY + decY;
+
+        if ((myX < 0) || (myY < 0)) {
+            return false;
+        }
+
+        if ((myX >= nocSize) || (myY >= nocSize)) {
+            return false;
+        }
+
+        return true;
+    }
+
+    public TranslatedRouter getRouterAt(int xPos, int yPos) {
+        if (routers == null) {
+            return null;
+        }
+
+        if ((xPos < 0) || (xPos >= nocSize) || (yPos < 0) || (yPos >= nocSize)) {
+            return null;
+        }
+
+        return routers[xPos][yPos];
+    }
+
+
+    public TranslatedRouter getRouterFrom(int xPos, int yPos, int routerPosition) {
+        int decX = 0;
+        int decY = 0;
+
+        switch(routerPosition) {
+            case NORTH:
+                decY = -1;
+                break;
+            case SOUTH:
+                decY = 1;
+                break;
+            case WEST:
+                decX = -1;
+                break;
+            case EAST:
+                decX = 1;
+
+        }
+
+        xPos = xPos + decX;
+        yPos = yPos + decY;
+
+        return getRouterAt(xPos, yPos);
+
+    }
+
     /* 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
-     */
+            - 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
+         */
     public String removeAllRouterNodes() {
         //TMLModeling<E> tmlm = new TMLModeling<>();
         //TMLArchitecture tmla = new TMLArchitecture();
@@ -179,16 +262,21 @@ public class TMAP2Network<E>  {
             }
         }
 
+        //Create routers
+        for(int i=0; i<nocSize; i++) {
+            for(int j=0; j<nocSize; j++) {
+                // We must find the number of apps connected on this router
+                TranslatedRouter tr = new TranslatedRouter<>(this, tmlmapping, noc, channelsCommunicatingViaNoc,
+                        nbOfVCs, i, j);
+                routers[i][j] = tr;
+            }
+        }
 
         // Make all routers
         for(int i=0; i<nocSize; i++) {
             for(int j=0; j<nocSize; j++) {
                 // We must find the number of apps connected on this router
-                int nbOfApps = 2;
-
-                TranslatedRouter tr = new TranslatedRouter<>(tmlmapping, noc, channelsCommunicatingViaNoc, nbOfVCs, i, j);
-                routers[i][j] = tr;
-                tr.makeRouter();
+                routers[i][j].makeRouter();
             }
         }
 
diff --git a/src/main/java/tmltranslator/tonetwork/TranslatedRouter.java b/src/main/java/tmltranslator/tonetwork/TranslatedRouter.java
index c4d76fa7f8aa47e12a7aa75ec34b439e4c57b083..895bb0bb58eeed95b4e79829e8c44da226f99c8b 100644
--- a/src/main/java/tmltranslator/tonetwork/TranslatedRouter.java
+++ b/src/main/java/tmltranslator/tonetwork/TranslatedRouter.java
@@ -41,7 +41,6 @@ package tmltranslator.tonetwork;
 
 import myutil.TraceManager;
 import tmltranslator.*;
-import ui.TGComponent;
 
 import java.util.HashMap;
 import java.util.List;
@@ -55,13 +54,17 @@ import java.util.Vector;
  * @author Ludovic Apvrille
  * @version 1.0 17/01/2019
  */
-public class TranslatedRouter<E>  {
+public class TranslatedRouter<E> {
+
+
     private final int NB_OF_PORTS = 5;
     private final int CHANNEL_SIZE = 4;
     private final int CHANNEL_MAX = 8;
 
     private int nbOfVCs, xPos, yPos, nbOfApps;
 
+    private TMAP2Network<?> main;
+
     private HwNoC noc;
     private List<TMLChannel> channelsViaNoc;
 
@@ -71,14 +74,17 @@ public class TranslatedRouter<E>  {
     private TMLMapping<?> tmlmap;
 
 
-
-    public TranslatedRouter(TMLMapping<E> tmlmap, HwNoC noc, List<TMLChannel> channelsViaNoc, int nbOfVCs, int xPos, int yPos) {
+    public TranslatedRouter(TMAP2Network<?> main, TMLMapping<?> tmlmap, HwNoC noc, List<TMLChannel> channelsViaNoc, int nbOfVCs, int xPos, int yPos) {
+        this.main = main;
         this.nbOfVCs = nbOfVCs;
         this.noc = noc;
         this.channelsViaNoc = channelsViaNoc;
         this.xPos = xPos;
         this.yPos = yPos;
         this.tmlmap = tmlmap;
+
+        //A router creates all its output events and channels, depending on its position in the NoC
+
     }
 
 
@@ -113,7 +119,7 @@ public class TranslatedRouter<E>  {
         Vector<TMLChannel> inputChannels = new Vector<>();
         Vector<TMLChannel> outputChannels = new Vector<>();
         if (execNode != null) {
-            for(TMLChannel ch: channelsViaNoc) {
+            for (TMLChannel ch : channelsViaNoc) {
                 TMLTask origin = ch.getOriginTask();
                 TMLTask destination = ch.getDestinationTask();
 
@@ -140,12 +146,12 @@ public class TranslatedRouter<E>  {
 
         // We can create the MUX task: one mux task for each VC
         Vector<TaskMUXAppDispatch> muxTasks = new Vector<>();
-        for(i=0; i<nbOfVCs; i++) {
+        for (i = 0; i < nbOfVCs; i++) {
             // Now that we know all channels, we can generate the MUX tasks
             // We need one event par outputChannel
             HashMap<TMLChannel, TMLEvent> mapOfOutputChannels = new HashMap<>();
             Vector<TMLEvent> inputEventsOfMUX = new Vector<>();
-            for(TMLChannel chan: outputChannels) {
+            for (TMLChannel chan : outputChannels) {
                 if (chan.getVC() == i) {
                     TMLEvent outputEventOfMux = new TMLEvent("EventMUXof" + chan.getName(), null, 8,
                             true);
@@ -160,7 +166,7 @@ public class TranslatedRouter<E>  {
                     null, 8, true);
             tmlm.addEvent(eventForMUX_and_NI_IN);
 
-            TaskMUXAppDispatch muxTask = new TaskMUXAppDispatch("MUXof" + nameOfExecNode +"_VC" + i, null, null);
+            TaskMUXAppDispatch muxTask = new TaskMUXAppDispatch("MUXof" + nameOfExecNode + "_VC" + i, null, null);
             tmlm.addTask(muxTask);
             muxTask.generate(inputEventsOfMUX, eventForMUX_and_NI_IN);
             muxTasks.add(muxTask);
@@ -174,7 +180,7 @@ public class TranslatedRouter<E>  {
         // NETWORK INTERFACE IN
         // We must first gathers events from must task
         Vector<TMLEvent> inputEventsFromMUX = new Vector<>();
-        for(TaskMUXAppDispatch tmux: muxTasks) {
+        for (TaskMUXAppDispatch tmux : muxTasks) {
             inputEventsFromMUX.add(tmux.getOutputEvent());
         }
 
@@ -185,7 +191,7 @@ public class TranslatedRouter<E>  {
 
         // One TMLEvent for feedback for each VC
         Vector<TMLEvent> feedbackEventsNIINs = new Vector<>();
-        for(i=0; i<nbOfVCs; i++) {
+        for (i = 0; i < nbOfVCs; i++) {
             TMLEvent eventFeedback = new TMLEvent("EventBetweenNI_IN_ANd_IN_for_" + nameOfExecNode,
                     null, 8, true);
             feedbackEventsNIINs.add(eventFeedback);
@@ -204,36 +210,52 @@ public class TranslatedRouter<E>  {
         tniIn.generate(nbOfVCs, feedbackEventsNIINs, inputEventsFromMUX, outputFromNIINtoIN, outputChannelFromNIINtoIN);
 
 
-        // IN NOC
-        // We need one ouput channel per VC and one output event per VC
-        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);
-        }
+        // IN NOC - One for each input
+        // We need one output channel per VC and one output event per VC
+        // A task only create the output, never the input
+
+        HashMap<Integer, TaskINForDispatch> dispatchIns = 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)) {
+
+                    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);
+                    tmlm.addTask(inDispatch);
+                    if (portNb == NB_OF_PORTS) {
+                        inDispatch.generate(nbOfVCs, outputFromNIINtoIN, outputChannelFromNIINtoIN, evtFromINtoINVCs, chFromINtoINVCs);
+                    } else {
 
-        TaskINForDispatch inDispatch = new TaskINForDispatch("IN_" + execNode, null, null);
-        tmlm.addTask(inDispatch);
-        inDispatch.generate(nbOfVCs, outputFromNIINtoIN, outputChannelFromNIINtoIN, evtFromINtoINVCs, chFromINtoINVCs);
+
+                    }
+                    dispatchIns.put(new Integer(portNb), inDispatch);
+                }
+            }
+        }
 
 
         // IN specific to an input of the NoC apart from internal CPU
         // inputs 0 to 3
-        
+        // We create all connection events
 
 
     }
 
 
-
 }