diff --git a/src/main/java/ui/GTURTLEModeling.java b/src/main/java/ui/GTURTLEModeling.java
index 55786a00d62cf63abb85b48695315fd1459b2942..8691671805da6d6457af4d4620ac1382cd9ea126 100644
--- a/src/main/java/ui/GTURTLEModeling.java
+++ b/src/main/java/ui/GTURTLEModeling.java
@@ -1812,7 +1812,175 @@ public class GTURTLEModeling {
         if (tmlm.securityTaskMap == null) {
             return;
         }
+        for (SecurityPattern sp : tmlm.securityTaskMap.keySet()) {
+            if (sp.type.contains("Symmetric Encryption") || sp.type.equals("MAC") || sp.type.equals("Asymmetric Encryption")) {
+                for (TMLTask t : tmlm.securityTaskMap.get(sp)) {
+                    HwExecutionNode node1 = tmap.getHwNodeOf(t);
+                    boolean taskMappedToCPU = false;
+                    if (node1!=null){
+                        if (node1 instanceof HwCPU){
+                            HwCPU cpuNode = (HwCPU) node1;
+                            taskMappedToCPU = true;
+                            boolean keyMappedtoMem = false;
+                            HwLink lastLink = null;
+                            for (HwLink link : links) {
+                                if (!keyMappedtoMem && link.hwnode == node1) {
+                                    lastLink = link;
+                                    if (link.bus.privacy == 1) {
+                                        HwBus curBus = link.bus;
+                                        boolean keyFound = false;
+                                        TMLArchiMemoryNode memNodeToMap = null;
+                                        outer:
+                                        for (HwLink linkBus : links) {
+                                            if (linkBus.bus == curBus) {
+                                                if (linkBus.hwnode instanceof HwMemory) {
+                                                    memNodeToMap = (TMLArchiMemoryNode) listE.getTG(linkBus.hwnode);
+                                                    List<TMLArchiKey> keys = memNodeToMap.getKeyList();
+                                                    for (TMLArchiKey key : keys) {
+                                                        if (key.getValue().equals(sp.name)) {
+                                                            keyFound = true;
+                                                            keyMappedtoMem = true;
+                                                            break outer;
+                                                        }
+                                                    }
+                                                }
+                                            }
+                                        }
+                                        if (!keyFound) {
+                                            if (memNodeToMap != null) {
+                                                TMLArchiKey key = new TMLArchiKey(memNodeToMap.x, (int)(memNodeToMap.y+memNodeToMap.getHeight()*(0.3+Math.random()/2)), memNodeToMap.tdp.getMinX(), memNodeToMap.tdp.getMaxX(), memNodeToMap.tdp.getMinY(), memNodeToMap.tdp.getMaxY(), false, memNodeToMap, memNodeToMap.tdp);
+                                                key.setReferenceKey(sp.name);
+                                                key.makeFullValue();
+                                                TraceManager.addDev("Adding " + sp.name + " key to " + memNodeToMap.getName());
+                                                memNodeToMap.tdp.addComponent(key, memNodeToMap.x, memNodeToMap.y, true, true);
+                                                memNodeToMap.tdp.repaint();
+                                                keyMappedtoMem = true;
+                                            } else {
+                                                TMLArchiBUSNode busNode = (TMLArchiBUSNode) listE.getTG(curBus);
+                                                memNodeToMap = new TMLArchiMemoryNode(busNode.getX(), (int) (busNode.getY() + busNode.getHeight()*(1+Math.random())), busNode.tdp.getMinX(), busNode.tdp.getMaxX(), busNode.tdp.getMinY(), busNode.tdp.getMaxY(), false, busNode.getFather(), busNode.tdp);
+                                                memNodeToMap.setName(t.getTaskName() + "KeysMemory");
+                                                busNode.tdp.addComponent(memNodeToMap);
+
+                                                /*HwLink newLink = new HwLink("Link_"+curBus.getName() + "_" + memNodeToMap.getName());
+                                                HwMemory newHwMemory = new HwMemory("HwMemory_" + memNodeToMap.getName());
+                                                listE.addCor(newHwMemory, memNodeToMap);
+                                                newLink.setNodes(curBus, listE.getHwNode(memNodeToMap));
+                                                links.add(newLink);*/
+
+                                                //Connect Bus and Memory
+                                                TDiagramPanel archPanel =  busNode.tdp;
+                                                TMLArchiConnectorNode connect = new TMLArchiConnectorNode(memNodeToMap.getX() + 100, archPanel.getMaxY() - 300, archPanel.getMinX(), archPanel.getMaxX(), archPanel.getMinY(), archPanel.getMaxY(), true, null, archPanel, null, null, new Vector<Point>());
+                                                TGConnectingPoint p1 = busNode.findFirstFreeTGConnectingPoint(true, true);
+                                                p1.setFree(false);
+                                                connect.setP2(p1);
+
+                                                TGConnectingPoint p2 = memNodeToMap.findFirstFreeTGConnectingPoint(true, true);
+                                                p2.setFree(false);
+                                                connect.setP1(p2);
+                                                archPanel.addComponent(connect, memNodeToMap.getX() + 100, memNodeToMap.getY() + 100, false, true);
+                                                
+                                                TMLArchiKey key = new TMLArchiKey(memNodeToMap.x, (int)(memNodeToMap.y+memNodeToMap.getHeight()*(0.3+Math.random()/2)), memNodeToMap.tdp.getMinX(), memNodeToMap.tdp.getMaxX(), memNodeToMap.tdp.getMinY(), memNodeToMap.tdp.getMaxY(), false, memNodeToMap, memNodeToMap.tdp);
+                                                key.setReferenceKey(sp.name);
+                                                key.makeFullValue();
+                                                TraceManager.addDev("Adding " + sp.name + " key to " + memNodeToMap.getName());
+                                                memNodeToMap.tdp.addComponent(key, memNodeToMap.x, memNodeToMap.y, true, true);
+                                                memNodeToMap.tdp.repaint();
+                                                keyMappedtoMem = true;
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                            if (!keyMappedtoMem) {
+                                if (lastLink!=null){
+                                    TMLArchiBUSNode lastBusNode = (TMLArchiBUSNode) listE.getTG(lastLink.bus);
+                                    TMLArchiCPUNode cpuArchiNode = (TMLArchiCPUNode) listE.getTG(cpuNode);
+
+                                    TMLArchiBridgeNode newBrigde = new TMLArchiBridgeNode(lastBusNode.getX(), (int) (lastBusNode.getY() + lastBusNode.getHeight()*(1+Math.random())), lastBusNode.tdp.getMinX(), lastBusNode.tdp.getMaxX(), lastBusNode.tdp.getMinY(), lastBusNode.tdp.getMaxY(), false, lastBusNode.getFather(), lastBusNode.tdp);
+                                    newBrigde.setName(t.getTaskName() + "KeysBrigde");
+                                    lastBusNode.tdp.addComponent(newBrigde);
+
+                                    TMLArchiBUSNode newPrivateBus = new TMLArchiBUSNode(newBrigde.getX(), (int) (newBrigde.getY() + newBrigde.getHeight()*(1+Math.random())), newBrigde.tdp.getMinX(), newBrigde.tdp.getMaxX(), newBrigde.tdp.getMinY(), newBrigde.tdp.getMaxY(), false, lastBusNode.getFather(), lastBusNode.tdp);
+                                    newPrivateBus.setPrivacy(1);
+                                    newPrivateBus.setName(t.getTaskName() + "KeysPrivateBus");
+                                    lastBusNode.tdp.addComponent(newPrivateBus);
+
+                                    TMLArchiMemoryNode memNodeToMap = new TMLArchiMemoryNode(newPrivateBus.getX(), (int) (newPrivateBus.getY() + newPrivateBus.getHeight()*(1+Math.random())), newPrivateBus.tdp.getMinX(), newPrivateBus.tdp.getMaxX(), newPrivateBus.tdp.getMinY(), newPrivateBus.tdp.getMaxY(), false, lastBusNode.getFather(), lastBusNode.tdp);
+                                    memNodeToMap.setName(t.getTaskName() + "KeysMemory");
+                                    lastBusNode.tdp.addComponent(memNodeToMap);
+
+                                    TMLArchiKey key = new TMLArchiKey(memNodeToMap.x, (int)(memNodeToMap.y+memNodeToMap.getHeight()*(0.3+Math.random()/2)), memNodeToMap.tdp.getMinX(), memNodeToMap.tdp.getMaxX(), memNodeToMap.tdp.getMinY(), memNodeToMap.tdp.getMaxY(), false, memNodeToMap, memNodeToMap.tdp);
+                                    key.setReferenceKey(sp.name);
+                                    key.makeFullValue();
+                                    TraceManager.addDev("Adding " + sp.name + " key to " + memNodeToMap.getName());
+                                    memNodeToMap.tdp.addComponent(key, memNodeToMap.x, memNodeToMap.y, true, true);
+                                    memNodeToMap.tdp.repaint();
+                                    keyMappedtoMem = true;
+
+                                    //Connect Bus and Memory
+                                    TMLArchiConnectorNode connectbusMem = new TMLArchiConnectorNode(memNodeToMap.getX() + 100, lastBusNode.tdp.getMaxY() - 300, lastBusNode.tdp.getMinX(), lastBusNode.tdp.getMaxX(), lastBusNode.tdp.getMinY(), lastBusNode.tdp.getMaxY(), true, null, lastBusNode.tdp, null, null, new Vector<Point>());
+                                    TGConnectingPoint p1 = newPrivateBus.findFirstFreeTGConnectingPoint(true, true);
+                                    p1.setFree(false);
+                                    connectbusMem.setP2(p1);
+
+                                    TGConnectingPoint p2 = memNodeToMap.findFirstFreeTGConnectingPoint(true, true);
+                                    p2.setFree(false);
+                                    connectbusMem.setP1(p2);
+                                    lastBusNode.tdp.addComponent(connectbusMem, memNodeToMap.getX() + 100, memNodeToMap.getY() + 100, false, true);
+
+                                    //Connect new Private Bus and Bridge
+                                    TMLArchiConnectorNode connectPrivatebusBridge = new TMLArchiConnectorNode(newBrigde.getX() + 100, lastBusNode.tdp.getMaxY() - 300, lastBusNode.tdp.getMinX(), lastBusNode.tdp.getMaxX(), lastBusNode.tdp.getMinY(), lastBusNode.tdp.getMaxY(), true, null, lastBusNode.tdp, null, null, new Vector<Point>());
+                                    p1 = newPrivateBus.findFirstFreeTGConnectingPoint(true, true);
+                                    p1.setFree(false);
+                                    connectPrivatebusBridge.setP2(p1);
+
+                                    p2 = newBrigde.findFirstFreeTGConnectingPoint(true, true);
+                                    p2.setFree(false);
+                                    connectPrivatebusBridge.setP1(p2);
+                                    lastBusNode.tdp.addComponent(connectPrivatebusBridge, newBrigde.getX() + 100, newBrigde.getY() + 100, false, true);
+
+                                    //Connect Public Bus and Bridge
+                                    TMLArchiConnectorNode connectPublicbusBridge = new TMLArchiConnectorNode(newBrigde.getX() + 100, lastBusNode.tdp.getMaxY() - 300, lastBusNode.tdp.getMinX(), lastBusNode.tdp.getMaxX(), lastBusNode.tdp.getMinY(), lastBusNode.tdp.getMaxY(), true, null, lastBusNode.tdp, null, null, new Vector<Point>());
+                                    p1 = lastBusNode.findFirstFreeTGConnectingPoint(true, true);
+                                    p1.setFree(false);
+                                    connectPublicbusBridge.setP2(p1);
+
+                                    p2 = newBrigde.findFirstFreeTGConnectingPoint(true, true);
+                                    p2.setFree(false);
+                                    connectPublicbusBridge.setP1(p2);
+                                    lastBusNode.tdp.addComponent(connectPublicbusBridge, newBrigde.getX() + 100, newBrigde.getY() + 100, false, true);
+
+                                    //Connect new Private Bus and CPU
+                                    TMLArchiConnectorNode connectPrivatebusCPU = new TMLArchiConnectorNode(cpuArchiNode.getX() + 100, lastBusNode.tdp.getMaxY() - 300, lastBusNode.tdp.getMinX(), lastBusNode.tdp.getMaxX(), lastBusNode.tdp.getMinY(), lastBusNode.tdp.getMaxY(), true, null, lastBusNode.tdp, null, null, new Vector<Point>());
+                                    p1 = newPrivateBus.findFirstFreeTGConnectingPoint(true, true);
+                                    p1.setFree(false);
+                                    connectPrivatebusCPU.setP2(p1);
+
+                                    p2 = cpuArchiNode.findFirstFreeTGConnectingPoint(true, true);
+                                    p2.setFree(false);
+                                    connectPrivatebusCPU.setP1(p2);
+                                    lastBusNode.tdp.addComponent(connectPrivatebusCPU, cpuArchiNode.getX() + 100, cpuArchiNode.getY() + 100, false, true);
+
+                                    //Disconnect Public Bus and CPU
+                                    lastBusNode.tdp.getConnectorConnectedTo(p2);
+                                    for (TGConnector connector: lastBusNode.tdp.getConnectors()){
+                                        if ((connector.getTGComponent1() == cpuArchiNode && connector.getTGComponent2() == lastBusNode) || (connector.getTGComponent1() == lastBusNode && connector.getTGComponent2() == cpuArchiNode)){
+                                            TraceManager.addDev("Disconnect :" + connector.getTGComponent1().getName() + " and " + connector.getTGComponent2().getName());
+                                            lastBusNode.tdp.removeComponent(connector);
+                                        }       
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    if (!taskMappedToCPU){
+                        TraceManager.addDev(t.getTaskName() + " has to be mapped to a CPU!");
+                    }
+                }
+            }
+        }
         //
+        /*
         for (SecurityPattern sp : tmlm.securityTaskMap.keySet()) {
             if (sp.type.contains("Symmetric Encryption") || sp.type.equals("MAC")) {
 
@@ -1952,7 +2120,7 @@ public class GTURTLEModeling {
                     }
                 }
             }
-        }
+        }*/
         TraceManager.addDev("Mapping finished");
     }