diff --git a/src/main/java/avatartranslator/AvatarBlock.java b/src/main/java/avatartranslator/AvatarBlock.java
index 2f226d8aaefd9765c47332b9bc496c3be8d7ac75..61d46aefc37d8606a6cdecb6da66deaca8b788a8 100644
--- a/src/main/java/avatartranslator/AvatarBlock.java
+++ b/src/main/java/avatartranslator/AvatarBlock.java
@@ -119,6 +119,18 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne
         signals.add(_signal);
     }
 
+    public AvatarSignal addSignalIfApplicable(String name, int type, Object refObject) {
+        AvatarSignal sig = getSignalByName(name);
+        if (sig != null) {
+            return sig;
+        }
+        sig = new AvatarSignal(name, type, refObject);
+        addSignal(sig);
+        return sig;
+
+    }
+
+
     public List<AvatarAttribute> getAttributes() {
         return attributes;
     }
diff --git a/src/main/java/avatartranslator/AvatarBlockTemplate.java b/src/main/java/avatartranslator/AvatarBlockTemplate.java
index efc00cf934dec8ed842f8179fe96804b968d59f8..8941b57adcdfc04a293074d05f00cc6f04473d90 100644
--- a/src/main/java/avatartranslator/AvatarBlockTemplate.java
+++ b/src/main/java/avatartranslator/AvatarBlockTemplate.java
@@ -146,8 +146,8 @@ public class AvatarBlockTemplate {
     }
 
 
-    // WARNING: Does not handle the non blocking case
-    public static AvatarBlock getFifoBlock(String _name, AvatarSpecification _avspec, AvatarRelation _ar, Object _referenceRelation, AvatarSignal _sig1, AvatarSignal _sig2, int _sizeOfFifo, int FIFO_ID) {
+    public static AvatarBlock getFifoBlock(String _name, AvatarSpecification _avspec, AvatarRelation _ar, Object _referenceRelation,
+                                           AvatarSignal _sig1, AvatarSignal _sig2, int _sizeOfFifo, int FIFO_ID) {
         AvatarBlock ab = new AvatarBlock(_name, _avspec, _referenceRelation);
 
         // Create the read and write signals
@@ -308,6 +308,180 @@ public class AvatarBlockTemplate {
         return ab;
     }
 
+    // Creates a FIFO with notified
+    public static AvatarBlock getFifoBlockWithNotified(String _name, AvatarSpecification _avspec,
+                                                       AvatarRelation _ar, Object _referenceRelation,
+                                           AvatarSignal _sig1, AvatarSignal _sig2, AvatarSignal _sig3,
+                                                       int _sizeOfFifo, int FIFO_ID) {
+        AvatarBlock ab = new AvatarBlock(_name, _avspec, _referenceRelation);
+
+        // Create the read and write signals
+        AvatarSignal write = new AvatarSignal("write", AvatarSignal.IN, _referenceRelation);
+        AvatarSignal read = new AvatarSignal("read", AvatarSignal.OUT, _referenceRelation);
+        AvatarSignal notified = new AvatarSignal("notified", AvatarSignal.OUT, _referenceRelation);
+        AvatarAttribute aNotified = new AvatarAttribute("sizeN", AvatarType.INTEGER, null, null);
+        notified.addParameter(aNotified);
+
+        ab.addSignal(write); // corresponds to sig1
+        ab.addSignal(read);  // corresponds to sig2
+        ab.addSignal(notified); // corresponds to sig3
+
+        // Creating the attributes of the signals
+        // Same attributes for all signals
+        for (AvatarAttribute aa : _sig1.getListOfAttributes()) {
+            write.addParameter(aa.advancedClone(null));
+        }
+        for (AvatarAttribute aa : _sig2.getListOfAttributes()) {
+            read.addParameter(aa.advancedClone(null));
+        }
+
+
+        // Creating the attributes to support the FIFO
+        // For each parameter, we create an attribute that is similar to the one of e.g. sig1
+        // We duplicate this for the size of the fifo
+        for (AvatarAttribute aa : _sig1.getListOfAttributes()) {
+            for (int i = 0; i < _sizeOfFifo; i++) {
+                AvatarAttribute newA = aa.advancedClone(null);
+                newA.setName("arg__" + aa.getName() + "__" + i);
+                ab.addAttribute(newA);
+            }
+        }
+
+        // If lossy, add corresponding lossy attributes
+        if (_ar.isLossy()) {
+            for (AvatarAttribute aa : _sig1.getListOfAttributes()) {
+                AvatarAttribute newL = aa.advancedClone(null);
+                newL.setName("loss__" + aa.getName());
+                ab.addAttribute(newL);
+            }
+        }
+
+        // If non blocking, then, we need extra attributes
+        if (!(_ar.isBlocking())) {
+            for (AvatarAttribute aa : _sig1.getListOfAttributes()) {
+                AvatarAttribute newL = aa.advancedClone(null);
+                newL.setName("bucket__" + aa.getName());
+                ab.addAttribute(newL);
+            }
+        }
+
+        // We create the attribute to manage the FIFO
+        AvatarAttribute size = new AvatarAttribute("size", AvatarType.INTEGER, ab, _referenceRelation);
+        size.setInitialValue("0");
+        ab.addAttribute(size);
+
+        AvatarAttribute maxSize = new AvatarAttribute("maxSize", AvatarType.INTEGER, ab, _referenceRelation);
+        TraceManager.addDev("*********************************** Size of FIFO=" + _sizeOfFifo);
+        maxSize.setInitialValue("" + _sizeOfFifo);
+        ab.addAttribute(maxSize);
+
+        // Where we write: the head
+        AvatarAttribute head = new AvatarAttribute("head", AvatarType.INTEGER, ab, _referenceRelation);
+        head.setInitialValue("0");
+        ab.addAttribute(head);
+
+        // Where we read: the tail
+        AvatarAttribute tail = new AvatarAttribute("tail", AvatarType.INTEGER, ab, _referenceRelation);
+        tail.setInitialValue("0");
+        ab.addAttribute(tail);
+
+
+        // Creating the state machine
+        // Don't forget the isLossy
+
+        AvatarTransition at;
+        AvatarStateMachine asm = ab.getStateMachine();
+
+        // Start state
+        AvatarStartState ass = new AvatarStartState("start", _referenceRelation);
+        asm.setStartState(ass);
+        asm.addElement(ass);
+
+        // Main state: Wait4Request
+        AvatarState main = new AvatarState("Wait4Request", _referenceRelation);
+        asm.addElement(main);
+        at = makeAvatarEmptyTransitionBetween(ab, asm, ass, main, _referenceRelation);
+
+
+        // Can write only if fifo is not full only if transition
+        AvatarState testHead = new AvatarState("testHead", _referenceRelation);
+        asm.addElement(testHead);
+        at = makeAvatarEmptyTransitionBetween(ab, asm, testHead, main, _referenceRelation);
+        at.setGuard("[head<maxSize]");
+        at = makeAvatarEmptyTransitionBetween(ab, asm, testHead, main, _referenceRelation);
+        at.setGuard("[head==maxSize]");
+        at.addAction("head=0");
+
+        for (int i = 0; i < _sizeOfFifo; i++) {
+            AvatarActionOnSignal aaos_write = new AvatarActionOnSignal("write__" + i, write, _referenceRelation);
+            for (AvatarAttribute aa : _sig1.getListOfAttributes()) {
+                aaos_write.addValue("arg__" + aa.getName() + "__" + i);
+            }
+            asm.addElement(aaos_write);
+            at = makeAvatarEmptyTransitionBetween(ab, asm, main, aaos_write, _referenceRelation);
+            at.setGuard("[(size < maxSize) && (head==" + i + ")]");
+            at = makeAvatarEmptyTransitionBetween(ab, asm, aaos_write, testHead, _referenceRelation);
+            at.addAction("head = head + 1");
+            at.addAction("size = size + 1");
+
+        }
+        // if is lossy, can write, and does not store this nor increase the fifo size
+        if (_ar.isLossy()) {
+            AvatarActionOnSignal aaos_write_loss = new AvatarActionOnSignal("writeloss__", write, _referenceRelation);
+            for (AvatarAttribute aa : _sig1.getListOfAttributes()) {
+                aaos_write_loss.addValue("loss__" + aa.getName());
+            }
+            asm.addElement(aaos_write_loss);
+            at = makeAvatarEmptyTransitionBetween(ab, asm, main, aaos_write_loss, _referenceRelation);
+            at.setGuard("[(size < maxSize)]");
+            at = makeAvatarEmptyTransitionBetween(ab, asm, aaos_write_loss, main, _referenceRelation);
+        }
+
+        // If it is non blocking, then, the new message is written but not added
+        if (!(_ar.isBlocking())) {
+            AvatarActionOnSignal aaos_write_bucket = new AvatarActionOnSignal("writebucket__", write, _referenceRelation);
+            for (AvatarAttribute aa : _sig1.getListOfAttributes()) {
+                aaos_write_bucket.addValue("bucket__" + aa.getName());
+            }
+            asm.addElement(aaos_write_bucket);
+            at = makeAvatarEmptyTransitionBetween(ab, asm, main, aaos_write_bucket, _referenceRelation);
+            at.setGuard("[(size == maxSize)]");
+            at = makeAvatarEmptyTransitionBetween(ab, asm, aaos_write_bucket, main, _referenceRelation);
+        }
+
+        // Read
+        AvatarState testTail = new AvatarState("testTail", _referenceRelation);
+        asm.addElement(testTail);
+        at = makeAvatarEmptyTransitionBetween(ab, asm, testTail, main, _referenceRelation);
+        at.setGuard("[tail<maxSize]");
+        at = makeAvatarEmptyTransitionBetween(ab, asm, testTail, main, _referenceRelation);
+        at.setGuard("[tail==maxSize]");
+        at.addAction("tail=0");
+        for (int i = 0; i < _sizeOfFifo; i++) {
+            AvatarActionOnSignal aaos_read = new AvatarActionOnSignal("read__" + i, read, _referenceRelation);
+            for (AvatarAttribute aa : _sig1.getListOfAttributes()) {
+                aaos_read.addValue("arg__" + aa.getName() + "__" + i);
+            }
+            asm.addElement(aaos_read);
+            at = makeAvatarEmptyTransitionBetween(ab, asm, main, aaos_read, _referenceRelation);
+            at.setGuard("[(size > 0) && (tail==" + i + ")]");
+            at = makeAvatarEmptyTransitionBetween(ab, asm, aaos_read, testTail, _referenceRelation);
+            at.addAction("tail = tail + 1");
+            at.addAction("size = size - 1");
+        }
+
+        // Notified
+        AvatarActionOnSignal aaosNotified = new AvatarActionOnSignal("notified", notified, _referenceRelation);
+        aaosNotified.addValue("size");
+        asm.addElement(aaosNotified);
+        at = makeAvatarEmptyTransitionBetween(ab, asm, main, aaosNotified, _referenceRelation);
+        at = makeAvatarEmptyTransitionBetween(ab, asm, aaosNotified, main, _referenceRelation);
+
+        // Block is finished!
+
+        return ab;
+    }
+
 
     public static AvatarBlock getSWGraphBlock(String _name, AvatarSpecification _avspec, Object _refB,
                                               int duration, Vector<String> unblockedBy, Vector<String> unblockNext) {
diff --git a/src/main/java/tmltranslator/TMLEvent.java b/src/main/java/tmltranslator/TMLEvent.java
index 49ff30cb65abbc605e508c103511b87a816ea5b4..c8535c6cf79994ff7fd26d7d899bca091b017ac7 100755
--- a/src/main/java/tmltranslator/TMLEvent.java
+++ b/src/main/java/tmltranslator/TMLEvent.java
@@ -37,21 +37,21 @@
  */
 
 
-
-
 package tmltranslator;
 
 import ui.tmlcompd.TMLCPrimitivePort;
 
-import java.util.*;
-
-import myutil.*;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Vector;
 
 /**
  * Class TMLEvent
  * Creation: 22/11/2005
- * @version 1.0 22/11/2005
+ *
  * @author Ludovic APVRILLE
+ * @version 1.0 22/11/2005
  */
 public class TMLEvent extends TMLCommunicationElement {
     // Options
@@ -77,7 +77,6 @@ public class TMLEvent extends TMLCommunicationElement {
     public boolean checkConf;
 
 
-
     public TMLEvent(String name, Object reference, int _maxEvt, boolean _isBlocking) {
         super(name, reference);
         params = new Vector<TMLType>();
@@ -89,7 +88,7 @@ public class TMLEvent extends TMLCommunicationElement {
         originPorts = new ArrayList<TMLPort>();
         destinationPorts = new ArrayList<TMLPort>();
         ports = new ArrayList<TMLCPrimitivePort>();
-        checkConf=false;
+        checkConf = false;
         //TraceManager.addDev("New event: " + name + " max=" + _maxEvt + " blocking=" + isBlocking);
     }
 
@@ -97,6 +96,10 @@ public class TMLEvent extends TMLCommunicationElement {
         return params.size();
     }
 
+    public Vector <TMLType> getParams() {
+        return params;
+    }
+
     public void setSizeFIFO(int _max) {
         maxEvt = _max;
         checkMaxEvt();
@@ -115,7 +118,6 @@ public class TMLEvent extends TMLCommunicationElement {
     }
 
 
-
     public void setTasks(TMLTask _origin, TMLTask _destination) {
         origin = _origin;
         destination = _destination;
@@ -132,11 +134,26 @@ public class TMLEvent extends TMLCommunicationElement {
         return origin;
     }
 
+
+    public boolean hasOriginTask(TMLTask t) {
+        if (origin == t) {
+            return true;
+        }
+        for (TMLTask task : originTasks) {
+            //TraceManager.addDev("Comparing " + t.getTaskName() + " with " + task.getTaskName());
+            if (task == t) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
     public boolean hasDestinationTask(TMLTask t) {
         if (destination == t) {
             return true;
         }
-        for (TMLTask task: destinationTasks) {
+        for (TMLTask task : destinationTasks) {
             //TraceManager.addDev("Comparing " + t.getTaskName() + " with " + task.getTaskName());
             if (task == t) {
                 return true;
@@ -206,7 +223,7 @@ public class TMLEvent extends TMLCommunicationElement {
     }
 
     public TMLType getType(int i) {
-        if (i<getNbOfParams()) {
+        if (i < getNbOfParams()) {
             return params.elementAt(i);
         } else {
             return null;
@@ -233,8 +250,8 @@ public class TMLEvent extends TMLCommunicationElement {
         if (_list.length() == 0) {
             return true;
         }
-        String []split = _list.split(",");
-        for(int i=0; i<split.length; i++) {
+        String[] split = _list.split(",");
+        for (int i = 0; i < split.length; i++) {
             if (!TMLType.isAValidType(split[i])) {
                 return false;
             }
@@ -244,9 +261,9 @@ public class TMLEvent extends TMLCommunicationElement {
 
 
     public void addParam(String _list) {
-        String []split = _list.split(",");
+        String[] split = _list.split(",");
         TMLType type;
-        for(int i=0; i<split.length; i++) {
+        for (int i = 0; i < split.length; i++) {
             if (TMLType.isAValidType(split[i])) {
                 type = new TMLType(TMLType.getType(split[i]));
                 addParam(type);
@@ -316,26 +333,26 @@ public class TMLEvent extends TMLCommunicationElement {
     public String toXML() {
         String s = "<TMLEVENT ";
         s += "name=\"" + name + "\" ";
-        s += "origintask=\"" +  origin.getName() + "\" ";
-	if (originPort != null) {
-	    s += "originport=\"" +  originPort.getName() + "\" ";
-	}
+        s += "origintask=\"" + origin.getName() + "\" ";
+        if (originPort != null) {
+            s += "originport=\"" + originPort.getName() + "\" ";
+        }
         s += "destinationtask=\"" + destination.getName() + "\" ";
-	if (destinationPort != null) {
-	    s += "destinationport=\"" + destinationPort.getName() + "\" ";
-	}
-	s += "maxEvt=\"" + maxEvt + "\" ";
+        if (destinationPort != null) {
+            s += "destinationport=\"" + destinationPort.getName() + "\" ";
+        }
+        s += "maxEvt=\"" + maxEvt + "\" ";
         s += "isBlocking=\"" + isBlocking + "\" ";
-	s += "canBeNotified=\"" + canBeNotified + "\" ";
-	s += "isLossy=\"" + isLossy + "\" ";
+        s += "canBeNotified=\"" + canBeNotified + "\" ";
+        s += "isLossy=\"" + isLossy + "\" ";
         s += "lossPercentage=\"" + lossPercentage + "\" ";
-	s += "maxNbOfLoss=\"" + maxNbOfLoss + "\" ";
-	s += ">\n";
-	for (TMLType t: params) {
-	    s += "<PARAM type=\"" + t.toString() + "\" />";
-	}
+        s += "maxNbOfLoss=\"" + maxNbOfLoss + "\" ";
+        s += ">\n";
+        for (TMLType t : params) {
+            s += "<PARAM type=\"" + t.toString() + "\" />";
+        }
         s += "</TMLEVENT>\n";
-	return s;
+        return s;
     }
 
     public boolean equalSpec(Object o) {
@@ -362,7 +379,7 @@ public class TMLEvent extends TMLCommunicationElement {
         if (destination != null) {
             if (!destination.equalSpec(event.getDestinationTask())) return false;
         }
-        if(!(new HashSet<>(params).equals(new HashSet<>(event.params))))
+        if (!(new HashSet<>(params).equals(new HashSet<>(event.params))))
             return false;
         return maxEvt == event.maxEvt &&
                 isBlocking == event.isBlocking &&
diff --git a/src/main/java/tmltranslator/TMLType.java b/src/main/java/tmltranslator/TMLType.java
index 4374b0639ee5f65b2cc54855208378d3486a9db8..4aa47a269289291af6fb663f39e4f76b4ff600db 100755
--- a/src/main/java/tmltranslator/TMLType.java
+++ b/src/main/java/tmltranslator/TMLType.java
@@ -142,6 +142,7 @@ public class TMLType {
 
     }
 
+
     public static String getStringType(int type) {
         switch(type) {
         case NATURAL:
diff --git a/src/main/java/tmltranslator/toavatar/FullTML2Avatar.java b/src/main/java/tmltranslator/toavatar/FullTML2Avatar.java
index 8917beb4fdebbd5d5c7df40c0a0517364bef4cae..a6ed7ed783a67869815f1b4c75a85adc5a65f290 100644
--- a/src/main/java/tmltranslator/toavatar/FullTML2Avatar.java
+++ b/src/main/java/tmltranslator/toavatar/FullTML2Avatar.java
@@ -58,6 +58,10 @@ import java.util.regex.Pattern;
  * @version 2.0 19/06/2020
  */
 public class FullTML2Avatar {
+    private final static String NOTIFIED = "_NOTIFIED";
+
+
+
     //private TMLMapping<?> tmlmap;
     private TMLModeling<?> tmlmodel;
 
@@ -100,808 +104,713 @@ public class FullTML2Avatar {
     }
 
 
-    public List<AvatarStateMachineElement> translateState(TMLActivityElement ae, AvatarBlock block) {
+    public AvatarSpecification generateAvatarSpec(String _loopLimit) {
 
-        //		TMLActionState tmlaction;
-        //		TMLChoice tmlchoice;
-        //		TMLExecI tmlexeci;
-        //		TMLExecIInterval tmlexecii;
-        //	TMLExecC tmlexecc;
-        //	TMLExecCInterval tmlexecci;
-        //		TMLForLoop tmlforloop;
-        //		TMLReadChannel tmlreadchannel;
-        //		TMLSendEvent tmlsendevent;
-        //		TMLSendRequest tmlsendrequest;
-        //		TMLStopState tmlstopstate;
-        //		TMLWaitEvent tmlwaitevent;
-        //		TMLNotifiedEvent tmlnotifiedevent;
-        //		TMLWriteChannel tmlwritechannel;
-        //		TMLSequence tmlsequence;
-        //		TMLRandomSequence tmlrsequence;
-        //		TMLSelectEvt tmlselectevt;
-        //		TMLDelay tmldelay;
+        //TraceManager.addDev("security patterns " + tmlmodel.secPatterns);
+        //TraceManager.addDev("keys " + tmlmap.mappedSecurity);
 
-        AvatarTransition tran = new AvatarTransition(block, "", null);
-        List<AvatarStateMachineElement> elementList = new ArrayList<AvatarStateMachineElement>();
 
-        if (ae == null) {
-            return elementList;
+        //TODO: Make state names readable
+        //TODO: Put back numeric guards
+        //TODO: Calculate for temp variable
+        if (tmlmodel.getTGComponent() != null) {
+            this.avspec = new AvatarSpecification("spec", tmlmodel.getTGComponent().getTDiagramPanel().tp);
+        } else {
+            this.avspec = new AvatarSpecification("spec", null);
         }
+        attrsToCheck.clear();
+        tmlmodel.removeForksAndJoins();
 
-        if (ae instanceof TMLStopState) {
-            AvatarStopState stops = new AvatarStopState(ae.getName(), ae.getReferenceObject());
-            elementList.add(stops);
-            return elementList;
-        } else if (ae instanceof TMLStartState) {
-            AvatarStartState ss = new AvatarStartState(ae.getName(), ae.getReferenceObject());
-            tran = new AvatarTransition(block, "__after_" + ae.getName(), ss.getReferenceObject());
-            ss.addNext(tran);
-            elementList.add(ss);
-            elementList.add(tran);
-        } else if (ae instanceof TMLRandom) {
-            AvatarRandom ar = new AvatarRandom(ae.getName(), ae.getReferenceObject());
-            TMLRandom tmlr = (TMLRandom) ae;
-            ar.setVariable(tmlr.getVariable());
-            ar.setValues(tmlr.getMinValue(), tmlr.getMaxValue());
-            tran = new AvatarTransition(block, "__after_" + ae.getName(), ae.getReferenceObject());
-            ar.addNext(tran);
-            //Add to list
-            elementList.add(ar);
-            elementList.add(tran);
-        } else if (ae instanceof TMLSequence) {
-            //Get all list of sequences and paste together
-            List<AvatarStateMachineElement> seq = translateState(ae.getNextElement(0), block);
-            List<AvatarStateMachineElement> tmp;
-            // elementList.addAll(seq);
-            //get rid of any stops in the middle of the sequence and replace with the start of the next sequence
-            for (int i = 1; i < ae.getNbNext(); i++) {
-                tmp = translateState(ae.getNextElement(i), block);
-                for (AvatarStateMachineElement e : seq) {
-                    if (e instanceof AvatarStopState) {
-                        //ignore
-                    } else if (e.getNexts().size() == 0) {
-                        e.addNext(tmp.get(0));
-                        elementList.add(e);
-                    } else if (e.getNext(0) instanceof AvatarStopState) {
-                        //Remove the transition to AvatarStopState
-                        e.removeNext(0);
-                        e.addNext(tmp.get(0));
-                        elementList.add(e);
-                    } else {
-                        elementList.add(e);
-                    }
-                }
-                //elementList.addAll(tmp);
-                seq = tmp;
-            }
-            //Put stop states on the end of the last in sequence
+//        System.out.println("MODIFIED model " + tmlmodel);
 
-            for (AvatarStateMachineElement e : seq) {
-                if (e.getNexts().size() == 0 && !(e instanceof AvatarStopState)) {
-                    AvatarStopState stop = new AvatarStopState("stop", null);
-                    e.addNext(stop);
-                    elementList.add(stop);
-                }
-                elementList.add(e);
-            }
-            return elementList;
+        for (TMLChannel chan : tmlmodel.getChannels()) {
+            //System.out.println("chan " + chan);
+            TMLTask task = chan.getOriginTask();
+            TMLTask task2 = chan.getDestinationTask();
 
-        } else if (ae instanceof TMLSendRequest) {
-            TMLSendRequest sr = (TMLSendRequest) ae;
-            TMLRequest req = sr.getRequest();
-            AvatarSignal sig;
-            boolean checkAcc = false;
-            if (ae.getReferenceObject() != null) {
-                checkAcc = ((TGComponent) ae.getReferenceObject()).getCheckableAccessibility();
+            if (chan.getName().contains("fork__") || chan.getName().contains("FORKCHANNEL")) {
+                chan.setName(chan.getName().replaceAll("__", ""));
             }
-            boolean checked = false;
-            if (ae.getReferenceObject() != null) {
-                checked = ((TGComponent) ae.getReferenceObject()).hasCheckedAccessibility();
+        }
+
+        //Only set the loop limit if it's a number
+        String pattern = "^[0-9]{1,2}$";
+        Pattern r = Pattern.compile(pattern);
+        Matcher m = r.matcher(_loopLimit);
+        if (m.find()) {
+            loopLimit = Integer.valueOf(_loopLimit);
+        }
+
+        for (TMLChannel channel : tmlmodel.getChannels()) {
+            for (TMLCPrimitivePort p : channel.ports) {
+                channel.checkConf = channel.checkConf || p.checkConf;
+                channel.checkAuth = channel.checkAuth || p.checkAuth;
             }
-            AvatarState signalState = new AvatarState("signalstate_" + ae.getName().replaceAll(" ", "") + "_" + req.getName().replaceAll(" ", ""), ae.getReferenceObject(), checkAcc, checked);
-            AvatarTransition signalTran = new AvatarTransition(block, "__after_signalstate_" + ae.getName() + "_" + req.getName(), ae.getReferenceObject());
-            if (!signalOutMap.containsKey(req.getName())) {
-                sig = new AvatarSignal(getName(req.getName()), AvatarSignal.OUT, req.getReferenceObject());
-                signals.add(sig);
-                signalOutMap.put(req.getName(), sig);
-                block.addSignal(sig);
-            } else {
-                sig = signalOutMap.get(req.getName());
+        }
+
+        AvatarBlock top = new AvatarBlock("TOP__TOP", avspec, null);
+        if (mc) {
+            avspec.addBlock(top);
+            AvatarStateMachine topasm = top.getStateMachine();
+            AvatarStartState topss = new AvatarStartState("start", null);
+            topasm.setStartState(topss);
+            topasm.addElement(topss);
+        }
+
+        List<TMLTask> tasks = tmlmodel.getTasks();
+
+        for (TMLTask task : tasks) {
+            AvatarBlock block = new AvatarBlock(task.getName().split("__")[task.getName().split("__").length - 1], avspec, task.getReferenceObject());
+            if (mc) {
+                block.setFather(top);
             }
+            taskBlockMap.put(task, block);
+            avspec.addBlock(block);
+        }
+
+        // checkConnections();
+        //	checkChannels();
+
+        //distributeKeys();
+
+        //TraceManager.addDev("ALL KEYS " + accessKeys);
+			/*for (TMLTask t: accessKeys.keySet()){
+				TraceManager.addDev("TASK " +t.getName());
+				for (SecurityPattern sp: accessKeys.get(t)){
+					TraceManager.addDev(sp.name);
+				}
+			}*/
+
+        for (TMLTask task : tasks) {
+
+            AvatarBlock block = taskBlockMap.get(task);
+            //Add temp variable for unsendable signals
+
+            //Add all signals
+            for (TMLChannel chan : tmlmodel.getChannels(task)) {
+                if (chan.hasOriginTask(task)) {
+                    AvatarSignal sig = new AvatarSignal(chan.getOriginPort().getName(), AvatarSignal.OUT, chan.getReferenceObject());
+
+                    block.addSignal(sig);
+                    signals.add(sig);
+                    AvatarAttribute channelData = new AvatarAttribute(chan.getOriginPort().getName() + "_chData", AvatarType.INTEGER, block, null);
+                    if (block.getAvatarAttributeWithName(chan.getOriginPort().getName() + "_chData") == null) {
+                        block.addAttribute(channelData);
+                    }
+                    //sig.addParameter(channelData);
+                    signalOutMap.put(chan.getName(), sig);
 
-            AvatarActionOnSignal as = new AvatarActionOnSignal(ae.getName(), sig, ae.getReferenceObject());
-            for (int i = 0; i < sr.getNbOfParams(); i++) {
-                if (block.getAvatarAttributeWithName(sr.getParam(i)) == null) {
-                    //Throw Error
-                    TraceManager.addDev("Missing Attribute " + sr.getParam(i));
-                    as.addValue("tmp");
-                } else {
-                    //	Add parameter to signal and actiononsignal
-                    sig.addParameter(block.getAvatarAttributeWithName(sr.getParam(i)));
-                    as.addValue(sr.getParam(i));
                 }
-            }
-                /*
-				if (req.checkAuth){
-					AvatarAttributeState authOrig = new AvatarAttributeState(block.getName()+"."+signalState.getName()+"."+requestData.getName(),ae.getReferenceObject(),requestData, signalState);
-					signalAuthOriginMap.put(req.getName(), authOrig);
-				}*/
-            tran = new AvatarTransition(block, "__after_" + ae.getName(), ae.getReferenceObject());
-            elementList.add(signalState);
-            signalState.addNext(signalTran);
-            elementList.add(signalTran);
-            signalTran.addNext(as);
-            elementList.add(as);
-            as.addNext(tran);
-            elementList.add(tran);
 
-        } else if (ae instanceof TMLRandomSequence) {
-            //HashMap<Integer, List<AvatarStateMachineElement>> seqs = new HashMap<Integer, List<AvatarStateMachineElement>>();
-            AvatarState choiceState = new AvatarState("seqchoice__" + ae.getName().replaceAll(" ", ""), ae.getReferenceObject());
-            elementList.add(choiceState);
-            if (ae.getNbNext() == 2) {
-                List<AvatarStateMachineElement> set0 = translateState(ae.getNextElement(0), block);
-                List<AvatarStateMachineElement> set1 = translateState(ae.getNextElement(1), block);
-                //		elementList.addAll(set0);
+                if (chan.hasDestinationTask(task)) {
 
-                //Remove stop states of sets and route their transitions to the first element of the following sequence
-                for (AvatarStateMachineElement e : set0) {
-                    if (e instanceof AvatarStopState) {
-                        //ignore
-                    } else if (e.getNexts().size() == 0) {
-                        e.addNext(set1.get(0));
-                        elementList.add(e);
-                    } else if (e.getNext(0) instanceof AvatarStopState) {
-                        //Remove the transition to AvatarStopState
-                        e.removeNext(0);
-                        e.addNext(set1.get(0));
-                        elementList.add(e);
-                    } else {
-                        elementList.add(e);
+                    AvatarSignal sig = new AvatarSignal(chan.getDestinationPort().getName(), AvatarSignal.IN, chan.getReferenceObject());
+                    block.addSignal(sig);
+                    signals.add(sig);
+                    signalInMap.put(chan.getName(), sig);
+                    AvatarAttribute channelData = new AvatarAttribute(getName(chan.getName()) + "_chData", AvatarType.INTEGER, block, null);
+                    if (block.getAvatarAttributeWithName(getName(chan.getName()) + "_chData") == null) {
+                        block.addAttribute(channelData);
                     }
+                    //sig.addParameter(channelData);
                 }
+            }
 
+            // Add all events
+            for(TMLEvent evt: tmlmodel.getEvents(task)) {
+                TraceManager.addDev("Handling evt: " + evt.getName() + " in task " + task.getName());
+                if (evt.hasOriginTask(task)) {
+                    String name = getNameReworked(evt.getName(), 1);
+                    TraceManager.addDev("Adding OUT evt:" + name);
+                    AvatarSignal sig = block.addSignalIfApplicable(name, AvatarSignal.OUT, evt.getReferenceObject());
+                    signalOutMap.put(evt.getName(), sig);
 
-                //Build branch 0
-                tran = new AvatarTransition(block, "__after_" + ae.getName() + "_0", ae.getReferenceObject());
-                choiceState.addNext(tran);
-                elementList.add(tran);
-                tran.addNext(set0.get(0));
-                //Put stop states at the end of set1 if they don't already exist
-                AvatarStopState stop = new AvatarStopState("stop", null);
-                for (AvatarStateMachineElement e : set1) {
-                    if (e.getNexts().size() == 0 && (e instanceof AvatarTransition)) {
-                        e.addNext(stop);
+                    //Adding parameter
+                    int cpt = 0;
+                    for(TMLType tmlt: evt.getParams()) {
+                        AvatarAttribute aa = new AvatarAttribute("p" + cpt, getAvatarType(tmlt), null, null);
+                        sig.addParameter(aa);
+                        cpt ++;
                     }
-                    elementList.add(e);
+
                 }
-                elementList.add(stop);
 
-                //Build branch 1
-                List<AvatarStateMachineElement> set0_1 = translateState(ae.getNextElement(0), block);
-                List<AvatarStateMachineElement> set1_1 = translateState(ae.getNextElement(1), block);
-                for (AvatarStateMachineElement e : set1_1) {
-                    if (e instanceof AvatarStopState) {
-                        //ignore
-                    } else if (e.getNexts().size() == 0) {
-                        e.addNext(set0_1.get(0));
-                        elementList.add(e);
-                    } else if (e.getNext(0) instanceof AvatarStopState) {
-                        //Remove the transition to AvatarStopState
-                        e.removeNext(0);
-                        e.addNext(set0_1.get(0));
-                        elementList.add(e);
-                    } else {
-                        elementList.add(e);
+                if (evt.hasDestinationTask(task)) {
+                    String name = getNameReworked(evt.getName(), 3);
+                    TraceManager.addDev("Adding IN evt:" + name);
+                    AvatarSignal sig = block.addSignalIfApplicable(name, AvatarSignal.IN, evt.getReferenceObject());
+                    signalInMap.put(evt.getName(), sig);
+
+                    //Adding parameter
+                    int cpt = 0;
+                    for(TMLType tmlt: evt.getParams()) {
+                        AvatarAttribute aa = new AvatarAttribute("p" + cpt, getAvatarType(tmlt), null, null);
+                        sig.addParameter(aa);
+                        cpt ++;
                     }
+
+                    name = getNameReworked(evt.getName(), 3) + NOTIFIED;
+                    sig = block.addSignalIfApplicable(name, AvatarSignal.IN, evt.getReferenceObject());
+                    signalInMap.put(evt.getName() + NOTIFIED, sig);
+
+                    //Adding parameter
+                    AvatarAttribute aa = new AvatarAttribute("p" + cpt, AvatarType.INTEGER, null, null);
+                    sig.addParameter(aa);
+
                 }
-                tran = new AvatarTransition(block, "__after_" + ae.getName() + "_1", ae.getReferenceObject());
-                elementList.add(tran);
-                choiceState.addNext(tran);
-                tran.addNext(set1_1.get(0));
-                stop = new AvatarStopState("stop", null);
-                for (AvatarStateMachineElement e : set0_1) {
-                    if (e.getNexts().size() == 0 && (e instanceof AvatarTransition)) {
-                        e.addNext(stop);
-                    }
-                    elementList.add(e);
-                }
-                elementList.add(stop);
+            }
 
-            } else {
-                //This gets really complicated in Avatar...
-                for (int i = 0; i < ae.getNbNext(); i++) {
-                    //For each of the possible state blocks, translate 1 and recurse on the remaining random sequence
-                    tran = new AvatarTransition(block, "__after_" + ae.getName() + "_" + i, ae.getReferenceObject());
-                    choiceState.addNext(tran);
-                    elementList.add(tran);
-                    List<AvatarStateMachineElement> tmp = translateState(ae.getNextElement(i), block);
 
 
-                    AvatarState choiceStateEnd = new AvatarState("seqchoiceend__" + i + "_" + ae.getName().replaceAll(" ", ""), ae.getReferenceObject());
-                    elementList.add(choiceStateEnd);
 
 
-                    //Remove stop states from the first generated set
-                    for (AvatarStateMachineElement e : tmp) {
-                        if (e instanceof AvatarStopState) {
-                            //ignore
-                        } else if (e.getNexts().size() == 0) {
-                            //e.addNext(set1.get(0));
-                            e.addNext(choiceStateEnd);
-                            elementList.add(e);
-                        } else if (e.getNext(0) instanceof AvatarStopState) {
-                            //Remove the transition to AvatarStopState
-                            e.removeNext(0);
-                            e.addNext(choiceStateEnd);
-                            //e.addNext(set1.get(0));
-                            elementList.add(e);
-                        } else {
-                            elementList.add(e);
-                        }
-                    }
+            AvatarAttribute tmp = new AvatarAttribute("tmp", AvatarType.INTEGER, block, null);
+            block.addAttribute(tmp);
 
+				/*   tmp = new AvatarAttribute("aliceandbob", AvatarType.INTEGER, block, null);
+				     block.addAttribute(tmp);
+				     tmp = new AvatarAttribute("aliceandbob_encrypted", AvatarType.INTEGER, block, null);
+				     block.addAttribute(tmp);*/
 
-                    tran.addNext(tmp.get(0));
+            AvatarAttribute loop_index = new AvatarAttribute("loop_index", AvatarType.INTEGER, block, null);
+            block.addAttribute(loop_index);
 
-                    TMLRandomSequence newSeq = new TMLRandomSequence("seqchoice__" + i + "_" + ae.getNbNext() + "_" + ae.getName(), ae.getReferenceObject());
-                    for (int j = 0; j < ae.getNbNext(); j++) {
-                        if (j != i) {
-                            newSeq.addNext(ae.getNextElement(j));
-                        }
-                    }
+            for (TMLAttribute attr : task.getAttributes()) {
+                AvatarType type;
+                if (attr.getType().getType() == TMLType.NATURAL) {
+                    type = AvatarType.INTEGER;
+                } else if (attr.getType().getType() == TMLType.BOOLEAN) {
+                    type = AvatarType.BOOLEAN;
+                } else {
+                    type = AvatarType.UNDEFINED;
+                }
+                AvatarAttribute avattr = new AvatarAttribute(attr.getName(), type, block, null);
+                avattr.setInitialValue(attr.getInitialValue());
+                block.addAttribute(avattr);
+            }
+            //AvatarTransition last;
+            AvatarStateMachine asm = block.getStateMachine();
 
+            //TODO: Create a fork with many requests. This looks terrible
+            if (tmlmodel.getRequestToMe(task) != null) {
+                //Create iteration attribute
+                AvatarAttribute req_loop_index = new AvatarAttribute("req_loop_index", AvatarType.INTEGER, block, null);
+                block.addAttribute(req_loop_index);
 
-                    tran = new AvatarTransition(block, "__after_" + ae.getNextElement(i).getName(), ae.getReferenceObject());
-                    choiceStateEnd.addNext(tran);
-                    elementList.add(tran);
+                //TMLRequest request= tmlmodel.getRequestToMe(task);
+                //Oh this is fun...let's restructure the state machine
+                //Create own start state, and ignore the returned one
+                List<AvatarStateMachineElement> elementList = translateState(task.getActivityDiagram().get(0), block);
+                AvatarStartState ss = new AvatarStartState("start", task.getActivityDiagram().get(0).getReferenceObject());
+                asm.addElement(ss);
+                AvatarTransition at = new AvatarTransition(block, "__after_start", task.getActivityDiagram().get(0).getReferenceObject());
+                at.addAction(AvatarTerm.createActionFromString(block, "req_loop_index = 0"));
+                ss.addNext(at);
+                asm.addElement(at);
 
-                    List<AvatarStateMachineElement> nexts = translateState(newSeq, block);
-                    elementList.addAll(nexts);
-                    tran.addNext(nexts.get(0));
+                AvatarState loopstart = new AvatarState("loopstart", task.getActivityDiagram().get(0).getReferenceObject());
+                at.addNext(loopstart);
+                asm.addElement(loopstart);
 
-                }
+                //Find the original start state, transition, and next element
+                AvatarStateMachineElement start = elementList.get(0);
+                AvatarStateMachineElement startTran = start.getNext(0);
+                AvatarStateMachineElement newStart = startTran.getNext(0);
+                elementList.remove(start);
+                elementList.remove(startTran);
+                //Find every stop state, remove them, reroute transitions to them
+                //For now, route every transition to stop state to remove the loop on requests
 
-            }
-            return elementList;
+                for (AvatarStateMachineElement e : elementList) {
+                    e.setName(processName(e.getName(), e.getID()));
+                    stateObjectMap.put(task.getName().split("__")[1] + "__" + e.getName(), e.getReferenceObject());
 
-        } else if (ae instanceof TMLActivityElementEvent) {
-            TMLActivityElementEvent aee = (TMLActivityElementEvent) ae;
-            TMLEvent evt = aee.getEvent();
-            boolean checkAcc = false;
-            if (ae.getReferenceObject() != null) {
-                checkAcc = ((TGComponent) ae.getReferenceObject()).getCheckableAccessibility();
-            }
-            boolean checked = false;
-            if (ae.getReferenceObject() != null) {
-                checked = ((TGComponent) ae.getReferenceObject()).hasCheckedAccessibility();
-            }
-            AvatarState signalState = new AvatarState("signalstate_" + ae.getName().replaceAll(" ", "") + "_" + evt.getName(), ae.getReferenceObject(), checkAcc, checked);
-            AvatarTransition signalTran = new AvatarTransition(block, "__after_signalstate_" + ae.getName() + "_" + evt.getName(), ae.getReferenceObject());
-            if (ae instanceof TMLSendEvent) {
-                AvatarSignal sig;
-                if (!signalOutMap.containsKey(evt.getName())) {
-                    sig = new AvatarSignal(getName(evt.getName()), AvatarSignal.OUT, evt.getReferenceObject());
-                    signals.add(sig);
-                    block.addSignal(sig);
-                    signalOutMap.put(evt.getName(), sig);
-                } else {
-                    sig = signalOutMap.get(evt.getName());
-                }
-                AvatarActionOnSignal as = new AvatarActionOnSignal(ae.getName(), sig, ae.getReferenceObject());
-                for (int i = 0; i < aee.getNbOfParams(); i++) {
-                    if (block.getAvatarAttributeWithName(aee.getParam(i)) == null) {
-                        //Throw Error
-                        as.addValue("tmp");
-                        TraceManager.addDev("Missing Attribute " + aee.getParam(i));
+                    if (e instanceof AvatarStopState) {
+                        //ignore it
                     } else {
-                        //	Add parameter to signal and actiononsignal
-                        sig.addParameter(block.getAvatarAttributeWithName(aee.getParam(i)));
-                        as.addValue(aee.getParam(i));
+                        for (int i = 0; i < e.getNexts().size(); i++) {
+                            if (e.getNext(i) instanceof AvatarStopState) {
+                                e.removeNext(i);
+                                //Route it back to the loop start
+                                e.addNext(loopstart);
+                            }
+                        }
+                        asm.addElement(e);
                     }
                 }
 
-                tran = new AvatarTransition(block, "__after_" + ae.getName(), ae.getReferenceObject());
-                elementList.add(signalState);
-                signalState.addNext(signalTran);
-                elementList.add(signalTran);
-                signalTran.addNext(as);
-                elementList.add(as);
-                as.addNext(tran);
-                elementList.add(tran);
+                //Create exit after # of loop iterations is maxed out
+                /*AvatarStopState stop =*/
+                new AvatarStopState("stop", task.getActivityDiagram().get(0).getReferenceObject());
+                /*AvatarTransition exitTran = */
+                new AvatarTransition(block, "to_stop", task.getActivityDiagram().get(0).getReferenceObject());
 
 
-            } else if (ae instanceof TMLWaitEvent) {
-                AvatarSignal sig;
+                //Add Requests, direct transition to start of state machine
+                for (Object obj : tmlmodel.getRequestsToMe(task)) {
+                    TMLRequest req = (TMLRequest) obj;
+                    AvatarTransition incrTran = new AvatarTransition(block, "__after_loopstart__" + req.getName(), task.getActivityDiagram().get(0).getReferenceObject());
+                    incrTran.addAction(AvatarTerm.createActionFromString(block, "req_loop_index = req_loop_index + 1"));
+                    incrTran.setGuard(AvatarGuard.createFromString(block, "req_loop_index != " + loopLimit));
+                    asm.addElement(incrTran);
+                    loopstart.addNext(incrTran);
+                    AvatarSignal sig;
+                    if (!signalInMap.containsKey(req.getName())) {
+                        sig = new AvatarSignal(getName(req.getName()), AvatarSignal.IN, req.getReferenceObject());
+                        block.addSignal(sig);
+                        signals.add(sig);
+                        signalInMap.put(req.getName(), sig);
+                    } else {
+                        sig = signalInMap.get(req.getName());
+                    }
+                    AvatarActionOnSignal as = new AvatarActionOnSignal("getRequest__" + req.getName(), sig, req.getReferenceObject());
+                    incrTran.addNext(as);
+                    asm.addElement(as);
+						/*as.addValue(req.getName()+"__reqData");
+						AvatarAttribute requestData= new AvatarAttribute(req.getName()+"__reqData", AvatarType.INTEGER, block, null);
+						block.addAttribute(requestData);*/
+                    for (int i = 0; i < req.getNbOfParams(); i++) {
+                        if (block.getAvatarAttributeWithName(req.getParam(i)) == null) {
+                            //Throw Error
+                            as.addValue("tmp");
+                        } else {
+                            sig.addParameter(block.getAvatarAttributeWithName(req.getParam(i)));
+                            as.addValue(req.getParam(i));
+                        }
+                    }
+                    AvatarTransition tran = new AvatarTransition(block, "__after_" + req.getName(), task.getActivityDiagram().get(0).getReferenceObject());
+                    as.addNext(tran);
+                    asm.addElement(tran);
+                    tran.addNext(newStart);
+						/*if (req.checkAuth){
+							AvatarState afterSignalState = new AvatarState("aftersignalstate_"+req.getName().replaceAll(" ","")+"_"+req.getName().replaceAll(" ",""),req.getReferenceObject());
+							AvatarTransition afterSignalTran = new AvatarTransition(block, "__aftersignalstate_"+req.getName(), req.getReferenceObject());
+							tran.addNext(afterSignalState);
+							afterSignalState.addNext(afterSignalTran);
+							asm.addElement(afterSignalState);
+							asm.addElement(afterSignalTran);
+							afterSignalTran.addNext(newStart);
+							AvatarAttributeState authDest = new AvatarAttributeState(block.getName()+"."+afterSignalState.getName()+"."+requestData.getName(),obj,requestData, afterSignalState);
+							signalAuthDestMap.put(req.getName(), authDest);
+						}
+						else {
+							tran.addNext(newStart);
+						}*/
 
-                if (!signalInMap.containsKey(evt.getName())) {
-                    sig = new AvatarSignal(getName(evt.getName()), AvatarSignal.IN, evt.getReferenceObject());
-                    signals.add(sig);
-                    signalOutMap.put(evt.getName(), sig);
-                    block.addSignal(sig);
-                } else {
-                    sig = signalInMap.get(evt.getName());
                 }
 
-                if (sig == null) {
-                    TraceManager.addDev("NULL evt:" + evt.getName())
-;                }
 
-                AvatarActionOnSignal as = new AvatarActionOnSignal(ae.getName(), sig, ae.getReferenceObject());
-                for (int i = 0; i < aee.getNbOfParams(); i++) {
-
-                    if (block.getAvatarAttributeWithName(aee.getParam(i)) == null) {
-                        //Throw Error
-                        as.addValue("tmp");
-                        TraceManager.addDev("Missing Attribute " + aee.getParam(i));
-                    } else {
-                        //	Add parameter to signal and actiononsignal
-                        TraceManager.addDev("Param #" + i + ":" + aee.getParam(i));
-                        AvatarAttribute aa = block.getAvatarAttributeWithName(aee.getParam(i));
-                        if (aa == null) {
-                            TraceManager.addDev("NULL Att:");
-                        }
-                        sig.addParameter(block.getAvatarAttributeWithName(aee.getParam(i)));
+                asm.setStartState(ss);
 
+            } else {
+                //Not requested
+                List<AvatarStateMachineElement> elementList = translateState(task.getActivityDiagram().get(0), block);
+                for (AvatarStateMachineElement e : elementList) {
+                    e.setName(processName(e.getName(), e.getID()));
+                    asm.addElement(e);
+                    stateObjectMap.put(task.getName().split("__")[1] + "__" + e.getName(), e.getReferenceObject());
+                }
+                asm.setStartState((AvatarStartState) elementList.get(0));
+            }
+            for (SecurityPattern secPattern : secPatterns) {
+                AvatarAttribute sec = block.getAvatarAttributeWithName(secPattern.name);
+                if (sec != null) {
+                    //sec = new AvatarAttribute(secPattern.name, AvatarType.INTEGER, block, null);
+                    //AvatarAttribute enc = new AvatarAttribute(secPattern.name+"_encrypted", AvatarType.INTEGER, block, null);
+                    //	block.addAttribute(sec);
+                    //	block.addAttribute(enc);
+                    //}
+                    avspec.addPragma(new AvatarPragmaSecret("#Confidentiality " + block.getName() + "." + secPattern.name, null, sec));
+                }
+            }
 
+        }
 
-                        TraceManager.addDev("Param #" + i + " (1)");
-                        as.addValue(aee.getParam(i));
-                        TraceManager.addDev("Param #" + i + " (2)");
-                    }
-                }
 
-                tran = new AvatarTransition(block, "__after_" + ae.getName(), ae.getReferenceObject());
-                elementList.add(signalState);
-                signalState.addNext(signalTran);
-                elementList.add(signalTran);
-                signalTran.addNext(as);
-                elementList.add(as);
-                as.addNext(tran);
-                elementList.add(tran);
-            } else {
-                //Notify Event, I don't know how to translate this
-                AvatarRandom as = new AvatarRandom(ae.getName(), ae.getReferenceObject());
-                tran = new AvatarTransition(block, "__after_" + ae.getName(), ae.getReferenceObject());
-                as.setVariable(aee.getVariable());
-                as.setValues("0", "1");
-                as.addNext(tran);
-                elementList.add(as);
-                elementList.add(tran);
+        //Add authenticity pragmas
+        for (String s : signalAuthOriginMap.keySet()) {
+            if (signalAuthDestMap.containsKey(s)) {
+                AvatarPragmaAuthenticity pragma = new AvatarPragmaAuthenticity("#Authenticity " + signalAuthOriginMap.get(s).getName() + " " + signalAuthDestMap.get(s).getName(), signalAuthOriginMap.get(s).getReferenceObject(), signalAuthOriginMap.get(s), signalAuthDestMap.get(s));
+                if (secChannelMap.containsKey(s)) {
+                    for (String channel : secChannelMap.get(s)) {
+                        TMLChannel ch = tmlmodel.getChannelByShortName(channel);
+                        if (ch != null) {
+                            if (ch.checkAuth) {
+                                avspec.addPragma(pragma);
+                                break;
+                            }
+                        }
+                    }
+
+                } else {
+                    avspec.addPragma(pragma);
+                }
             }
+        }
 
-        } else if (ae instanceof TMLActivityElementWithAction) {
-            //Might be encrypt or decrypt
-            AvatarState as = new AvatarState(ae.getValue().replaceAll(" ", "").replaceAll("\\*", "").replaceAll("\\+", "").replaceAll("\\-", "") + "_" + ae.getName().replaceAll(" ", "").replaceAll("\\*", "").replaceAll("\\+", "").replaceAll("\\-", ""), ae.getReferenceObject());
-            tran = new AvatarTransition(block, "__after_" + ae.getName(), ae.getReferenceObject());
-            as.addNext(tran);
-            elementList.add(as);
-            elementList.add(tran);
+        //Create relations
+        //Channels are ?? to ??
+        //Requests are n to 1
+        //Events are ?? to ??
+        AvatarBlock fifo = new AvatarBlock("FIFO", avspec, null);
 
-            if (security && ae.securityPattern != null) {
-                //If encryption
-                if (ae.securityPattern != null && ae.getName().contains("encrypt")) {
-                    secPatterns.add(ae.securityPattern);
-                    if (ae.securityPattern.type.equals("Advanced")) {
-                        //Type Advanced
-                        tran.addAction(ae.securityPattern.formula);
-                    } else if (ae.securityPattern.type.equals("Symmetric Encryption")) {
-                        //Type Symmetric Encryption
-                        if (!ae.securityPattern.nonce.isEmpty()) {
-                            //Concatenate nonce to data
+        for (TMLChannel channel : tmlmodel.getChannels()) {
+            // We assume one to one because fork and join have been removed
 
-                            //Create concat2 method
-                            block.addAttribute(new AvatarAttribute(ae.securityPattern.nonce, AvatarType.INTEGER, block, null));
-                            block.addAttribute(new AvatarAttribute(ae.securityPattern.name, AvatarType.INTEGER, block, null));
+            if (channel.isBasicChannel()) {
+                TraceManager.addDev("checking channel " + channel.getName());
+                AvatarRelation ar = new AvatarRelation(channel.getName(), taskBlockMap.get(channel.getOriginTask()), taskBlockMap.get(channel.getDestinationTask()), channel.getReferenceObject());
 
-                            AvatarMethod concat2 = new AvatarMethod("concat2", ae);
-                            concat2.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
-                            concat2.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.nonce));
-                            concat2.addReturnParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
+                if (channel.getType() == TMLChannel.BRBW) {
+                    ar.setAsynchronous(true);
+                    ar.setSizeOfFIFO(channel.getSize());
+                    ar.setBlocking(true);
+                } else if (channel.getType() == TMLChannel.BRNBW) {
+                    ar.setAsynchronous(true);
+                    ar.setSizeOfFIFO(channel.getSize());
+                    ar.setBlocking(false);
+                } else {
+                    //Create new block, hope for best
+                    if (mc) {
+                        fifo = createFifo(channel.getName());
+                        ar.setAsynchronous(false);
+                    }
+                }
+                //Find in signal
 
-                            if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null && block.getAvatarAttributeWithName(ae.securityPattern.nonce) != null) {
-                                block.addMethod(concat2);
-                                tran.addAction(ae.securityPattern.name + "=concat2(" + ae.securityPattern.name + "," + ae.securityPattern.nonce + ")");
-                            }
+                List<AvatarSignal> sig1 = new ArrayList<AvatarSignal>();
+                //Sig1 contains IN Signals, Sig2 contains OUT signals
+                sig1.add(signalInMap.get(channel.getName()));
+                List<AvatarSignal> sig2 = new ArrayList<AvatarSignal>();
+                sig2.add(signalOutMap.get(channel.getName()));
+                for (AvatarSignal sig : signals) {
+                    if (sig.getInOut() == AvatarSignal.IN) {
+                        String name = sig.getName();
+                        if (name.equals(getName(channel.getName()))) {
+                            //			sig1.add(sig);
                         }
-                        if (!ae.securityPattern.key.isEmpty()) {
-                            //Securing a key
-
-                            //Create sencrypt method for key
-                            block.addAttribute(new AvatarAttribute(ae.securityPattern.key, AvatarType.INTEGER, block, null));
-                            block.addAttribute(new AvatarAttribute("encryptedKey_" + ae.securityPattern.key, AvatarType.INTEGER, block, null));
-                            block.addAttribute(new AvatarAttribute("key_" + ae.securityPattern.name, AvatarType.INTEGER, block, null));
-
-                            AvatarMethod sencrypt = new AvatarMethod("sencrypt", ae);
-                            sencrypt.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.key));
-                            sencrypt.addParameter(block.getAvatarAttributeWithName("key_" + ae.securityPattern.name));
-                            sencrypt.addReturnParameter(block.getAvatarAttributeWithName("encryptedKey_" + ae.securityPattern.key));
+                    }
+                }
+                //Find out signal
+                for (AvatarSignal sig : signals) {
+                    if (sig.getInOut() == AvatarSignal.OUT) {
+                        String name = sig.getName();
+                        if (name.equals(channel.getOriginPort().getName())) {
+                            //				sig2.add(sig);
+                        }
+                    }
+                }
+                TraceManager.addDev("size " + sig1.size() + " " + sig2.size());
 
-                            if (block.getAvatarAttributeWithName(ae.securityPattern.key) != null && block.getAvatarAttributeWithName("encryptedKey_" + ae.securityPattern.key) != null && block.getAvatarAttributeWithName("key_" + ae.securityPattern.name) != null) {
-                                block.addMethod(sencrypt);
-                                tran.addAction("encryptedKey_" + ae.securityPattern.key + " = sencrypt(key_" + ae.securityPattern.key + ", key_" + ae.securityPattern.name + ")");
-                            }
-                        } else {
-                            //Securing data
+                if (sig1.size() == 0) {
+                    sig1.add(new AvatarSignal(getName(channel.getName()), AvatarSignal.IN, null));
+                }
 
-                            //Create sencrypt method for data
-                            block.addAttribute(new AvatarAttribute(ae.securityPattern.name, AvatarType.INTEGER, block, null));
-                            block.addAttribute(new AvatarAttribute(ae.securityPattern.name + "_encrypted", AvatarType.INTEGER, block, null));
-                            block.addAttribute(new AvatarAttribute("key_" + ae.securityPattern.name, AvatarType.INTEGER, block, null));
+                if (sig2.size() == 0) {
+                    sig2.add(new AvatarSignal(getName(channel.getName()), AvatarSignal.OUT, null));
+                }
 
-                            AvatarMethod sencrypt = new AvatarMethod("sencrypt", ae);
-                            sencrypt.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
-                            sencrypt.addParameter(block.getAvatarAttributeWithName("key_" + ae.securityPattern.name));
-                            sencrypt.addReturnParameter(block.getAvatarAttributeWithName(ae.securityPattern.name + "_encrypted"));
+                if (sig1.size() == 1 && sig2.size() == 1) {
+                    if (channel.getType() == TMLChannel.NBRNBW && mc) {
+                        AvatarSignal read = fifo.getSignalByName("readSignal");
 
-                            if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null && block.getAvatarAttributeWithName("key_" + ae.securityPattern.name) != null && block.getAvatarAttributeWithName(ae.securityPattern.name + "_encrypted") != null) {
-                                block.addMethod(sencrypt);
+                        ar.block2 = fifo;
+                        //Set IN signal with read
+                        ar.addSignals(sig1.get(0), read);
+                        AvatarRelation ar2 = new AvatarRelation(channel.getName() + "2", fifo, taskBlockMap.get(channel.getDestinationTask()), channel.getReferenceObject());
+                        AvatarSignal write = fifo.getSignalByName("writeSignal");
+                        //set OUT signal with write
+                        ar2.addSignals(write, sig2.get(0));
+                        //		System.out.println("Set " + sig2.get(0) + " and write");
+                        ar2.setAsynchronous(false);
+                        avspec.addRelation(ar2);
+                    } else {
+                        ar.addSignals(sig2.get(0), sig1.get(0));
+                    }
+                } else {
+                    //Create relation if it does not exist
+                    if (top.getSignalByName(getName(channel.getName()) + "in") == null) {
+                        AvatarRelation relation = new AvatarRelation(channel.getName(), top, top, channel.getReferenceObject());
+                        AvatarSignal s1 = new AvatarSignal(getName(channel.getName()) + "in", AvatarSignal.IN, null);
+                        AvatarSignal s2 = new AvatarSignal(getName(channel.getName()) + "out", AvatarSignal.OUT, null);
+                        top.addSignal(s1);
+                        top.addSignal(s2);
+                        relation.addSignals(s2, s1);
+                        avspec.addRelation(relation);
+                        //	System.out.println("Failure to match signals for TMLChannel "+ channel.getName());
+                    }
+                }
+                avspec.addRelation(ar);
+            } else {
+                //System.out.println("WTF Found non-basic channel");
+                //If not a basic channel, create a relation between TOP block and itself
+                AvatarRelation relation = new AvatarRelation(channel.getName(), top, top, channel.getReferenceObject());
+                AvatarSignal s1 = new AvatarSignal(getName(channel.getName()) + "in", AvatarSignal.IN, null);
+                AvatarSignal s2 = new AvatarSignal(getName(channel.getName()) + "out", AvatarSignal.OUT, null);
+                top.addSignal(s1);
+                top.addSignal(s2);
+                relation.addSignals(s2, s1);
+                avspec.addRelation(relation);
+                for (TMLTask t1 : channel.getOriginTasks()) {
+                    for (TMLTask t2 : channel.getDestinationTasks()) {
+                        AvatarRelation ar = new AvatarRelation(channel.getName(), taskBlockMap.get(t1), taskBlockMap.get(t2), channel.getReferenceObject());
+                        ar.setPrivate(originDestMap.get(t1.getName() + "__" + t2.getName()) == 1);
+                        //Find in signal
+                        List<AvatarSignal> sig1 = new ArrayList<AvatarSignal>();
+                        List<AvatarSignal> sig2 = new ArrayList<AvatarSignal>();
+                        for (AvatarSignal sig : signals) {
+                            if (sig.getInOut() == AvatarSignal.IN) {
+                                String name = sig.getName();
+                                if (name.equals(getName(channel.getName()))) {
+                                    sig1.add(sig);
+                                }
                             }
-                            tran.addAction(ae.securityPattern.name + "_encrypted = sencrypt(" + ae.securityPattern.name + ", key_" + ae.securityPattern.name + ")");
                         }
-                        //Set as origin for authenticity
-                        ae.securityPattern.originTask = block.getName();
-                        ae.securityPattern.state1 = as;
-                    } else if (ae.securityPattern.type.equals("Asymmetric Encryption")) {
-                        if (!ae.securityPattern.nonce.isEmpty()) {
-                            //Concatenating a nonce
-                            //Add concat2 method
-                            block.addAttribute(new AvatarAttribute(ae.securityPattern.nonce, AvatarType.INTEGER, block, null));
-                            block.addAttribute(new AvatarAttribute(ae.securityPattern.name, AvatarType.INTEGER, block, null));
-                            AvatarMethod concat2 = new AvatarMethod("concat2", ae);
-                            concat2.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
-                            concat2.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.nonce));
-                            if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null && block.getAvatarAttributeWithName(ae.securityPattern.nonce) != null) {
-                                block.addMethod(concat2);
-                                tran.addAction(ae.securityPattern.name + "=concat2(" + ae.securityPattern.name + "," + ae.securityPattern.nonce + ")");
+                        //Find out signal
+                        for (AvatarSignal sig : signals) {
+                            if (sig.getInOut() == AvatarSignal.OUT) {
+                                String name = sig.getName();
+                                if (name.equals(getName(channel.getName()))) {
+                                    sig2.add(sig);
+                                }
                             }
                         }
-                        //Securing a key instead of data
-                        if (!ae.securityPattern.key.isEmpty()) {
-                            //Add aencrypt method
-                            AvatarMethod aencrypt = new AvatarMethod("aencrypt", ae);
-                            block.addAttribute(new AvatarAttribute("encryptedKey_" + ae.securityPattern.key, AvatarType.INTEGER, block, null));
-                            block.addAttribute(new AvatarAttribute("key_" + ae.securityPattern.key, AvatarType.INTEGER, block, null));
-                            block.addAttribute(new AvatarAttribute("pubKey_" + ae.securityPattern.name, AvatarType.INTEGER, block, null));
-                            aencrypt.addParameter(block.getAvatarAttributeWithName("key_" + ae.securityPattern.key));
-                            aencrypt.addParameter(block.getAvatarAttributeWithName("pubKey_" + ae.securityPattern.name));
-                            aencrypt.addReturnParameter(block.getAvatarAttributeWithName("encryptedKey_" + ae.securityPattern.key));
-                            if (block.getAvatarAttributeWithName("key_" + ae.securityPattern.key) != null && block.getAvatarAttributeWithName("pubKey_" + ae.securityPattern.name) != null && block.getAvatarAttributeWithName("encryptedKey_" + ae.securityPattern.key) != null) {
-                                block.addMethod(aencrypt);
-                                tran.addAction("encryptedKey_" + ae.securityPattern.key + " = aencrypt(key_" + ae.securityPattern.key + ", pubKey_" + ae.securityPattern.name + ")");
-                            }
+                        if (sig1.size() == 0) {
+                            sig1.add(new AvatarSignal(getName(channel.getName()), AvatarSignal.IN, null));
+                        }
+                        if (sig2.size() == 0) {
+                            sig2.add(new AvatarSignal(getName(channel.getName()), AvatarSignal.OUT, null));
+                        }
+                        if (sig1.size() == 1 && sig2.size() == 1) {
+                            ar.addSignals(sig2.get(0), sig1.get(0));
                         } else {
-                            //Securing data
-
-                            //Add aencrypt method
-                            AvatarMethod aencrypt = new AvatarMethod("aencrypt", ae);
-                            block.addAttribute(new AvatarAttribute(ae.securityPattern.name, AvatarType.INTEGER, block, null));
-                            block.addAttribute(new AvatarAttribute("pubKey_" + ae.securityPattern.name, AvatarType.INTEGER, block, null));
-                            block.addAttribute(new AvatarAttribute(ae.securityPattern.name + "_encrypted", AvatarType.INTEGER, block, null));
-                            aencrypt.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
-                            aencrypt.addParameter(block.getAvatarAttributeWithName("pubKey_" + ae.securityPattern.name));
-                            aencrypt.addReturnParameter(block.getAvatarAttributeWithName(ae.securityPattern.name + "_encrypted"));
-                            if (block.getAvatarAttributeWithName("pubKey_" + ae.securityPattern.name) != null && block.getAvatarAttributeWithName(ae.securityPattern.name) != null && block.getAvatarAttributeWithName(ae.securityPattern.name + "_encrypted") != null) {
-                                block.addMethod(aencrypt);
-                                tran.addAction(ae.securityPattern.name + "_encrypted = aencrypt(" + ae.securityPattern.name + ", pubKey_" + ae.securityPattern.name + ")");
-                            }
-                        }
-                        //Set as origin state for authenticity
-                        ae.securityPattern.originTask = block.getName();
-                        ae.securityPattern.state1 = as;
-                    } else if (ae.securityPattern.type.equals("Nonce")) {
-                        //Do nothing except occupy time to forge nonce
+                            System.out.println("Failure to match signals for TMLChannel " + channel.getName() + " between " + t1.getName() + " and " + t2.getName());
+                        }
+                        avspec.addRelation(ar);
+                    }
+                }
+            }
+        }
 
+        for (TMLRequest request : tmlmodel.getRequests()) {
+            for (TMLTask t1 : request.getOriginTasks()) {
+                AvatarRelation ar = new AvatarRelation(request.getName(), taskBlockMap.get(t1), taskBlockMap.get(request.getDestinationTask()), request.getReferenceObject());
+                ar.setPrivate(originDestMap.get(t1.getName() + "__" + request.getDestinationTask().getName()) == 1);
+                List<AvatarSignal> sig1 = new ArrayList<AvatarSignal>();
+                List<AvatarSignal> sig2 = new ArrayList<AvatarSignal>();
+                for (AvatarSignal sig : signals) {
+                    if (sig.getInOut() == AvatarSignal.IN) {
+                        String name = sig.getName();
 
-                        //Create a nonce by a random function
-							/*AvatarRandom arandom = new AvatarRandom("randomnonce",ae.getReferenceObject());
-							arandom.setVariable(ae.securityPattern.name);
-							arandom.setValues("0","10");
-							elementList.add(arandom);
-							tran.addNext(arandom);
-							tran = new AvatarTransition(block, "__afterrandom_"+ae.getName(), ae.getReferenceObject());
-							arandom.addNext(tran);
-							elementList.add(tran);
-							block.addAttribute(new AvatarAttribute(ae.securityPattern.name, AvatarType.INTEGER, block, null));*/
-                    } else if (ae.securityPattern.type.equals("Hash")) {
-                        AvatarMethod hash = new AvatarMethod("hash", ae);
-                        hash.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
-                        if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null) {
-                            block.addMethod(hash);
+                        if (name.equals(getName(request.getName()))) {
+                            sig1.add(sig);
                         }
-                        tran.addAction(ae.securityPattern.name + "_encrypted = hash(" + ae.securityPattern.name + ")");
-                    } else if (ae.securityPattern.type.equals("MAC")) {
-                        block.addAttribute(new AvatarAttribute(ae.securityPattern.name, AvatarType.INTEGER, block, null));
-                        block.addAttribute(new AvatarAttribute("key_" + ae.securityPattern.name, AvatarType.INTEGER, block, null));
-                        block.addAttribute(new AvatarAttribute(ae.securityPattern.name + "_encrypted", AvatarType.INTEGER, block, null)); //msg + mac(msg)
-                        if (!ae.securityPattern.nonce.isEmpty()) {
-                            //Add nonce
+                    }
+                }
+                //Find out signal
+                for (AvatarSignal sig : signals) {
+                    if (sig.getInOut() == AvatarSignal.OUT) {
+                        String name = sig.getName();
 
-                            //Add concat2 method
-                            AvatarMethod concat = new AvatarMethod("concat2", ae);
-                            concat.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
-                            concat.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.nonce));
-                            concat.addReturnParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
-                            if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null && block.getAvatarAttributeWithName(ae.securityPattern.nonce) != null) {
-                                block.addMethod(concat);
-                                tran.addAction(ae.securityPattern.name + "=concat2(" + ae.securityPattern.name + "," + ae.securityPattern.nonce + ")");
-                            }
+                        if (name.equals(getName(request.getName()))) {
+                            sig2.add(sig);
                         }
+                    }
+                }
+                if (sig1.size() == 0) {
+                    sig1.add(new AvatarSignal(getName(request.getName()), AvatarSignal.IN, null));
+                }
+                if (sig2.size() == 0) {
+                    sig2.add(new AvatarSignal(getName(request.getName()), AvatarSignal.OUT, null));
+                }
+                if (sig1.size() == 1 && sig2.size() == 1) {
+                    ar.addSignals(sig2.get(0), sig1.get(0));
+                } else {
+                    //Throw error
+                    TraceManager.addDev("Could not match for " + request.getName());
+                }
 
-                        //Create MAC method
-                        AvatarMethod mac = new AvatarMethod("MAC", ae);
-                        AvatarAttribute macattr = new AvatarAttribute(ae.securityPattern.name + "_mac", AvatarType.INTEGER, block, null);
-                        block.addAttribute(macattr);
+                ar.setAsynchronous(false);
+                avspec.addRelation(ar);
+            }
+        }
 
+        for (TMLEvent event : tmlmodel.getEvents()) {
 
-                        mac.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
-                        mac.addParameter(block.getAvatarAttributeWithName("key_" + ae.securityPattern.name));
-                        mac.addReturnParameter(macattr);
+            TraceManager.addDev("Handling Event:" + event.getName() + " 1:" +  taskBlockMap.get(event.getOriginTask()) + " 2:" +  taskBlockMap.get
+                    (event.getDestinationTask()));
 
-                        if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null && block.getAvatarAttributeWithName("key_" + ae.securityPattern.name) != null) {
-                            block.addMethod(mac);
-                            tran.addAction(ae.securityPattern.name + "_mac = MAC(" + ae.securityPattern.name + ",key_" + ae.securityPattern.name + ")");
-                        }
+            // For each event, we create a FIFO, and so a double relation
 
-                        //Concatenate msg and mac(msg)
 
-                        //Create concat2 method
-                        AvatarMethod concat = new AvatarMethod("concat2", ae);
-                        concat.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
-                        concat.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name + "_mac"));
-                        concat.addReturnParameter(block.getAvatarAttributeWithName(ae.securityPattern.name + "_encrypted"));
-                        //concat.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.));
-                        if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null && block.getAvatarAttributeWithName(ae.securityPattern.name + "_encrypted") != null) {
-                            block.addMethod(concat);
-                            tran.addAction(ae.securityPattern.name + "_encrypted = concat2(" + ae.securityPattern.name + "," + ae.securityPattern.name + "_mac)");
-                        }
-                        ae.securityPattern.originTask = block.getName();
-                        ae.securityPattern.state1 = as;
-                    }
-                    //Set attributestate for authenticity
-                    if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null) {
-                        AvatarAttributeState authOrigin = new AvatarAttributeState(block.getName() + "." + as.getName() + "." + ae.securityPattern.name, ae.getReferenceObject(), block.getAvatarAttributeWithName(ae.securityPattern.name), as);
-                        signalAuthOriginMap.put(ae.securityPattern.name, authOrigin);
-                    }
 
-                } else if (ae.securityPattern != null && ae.getName().contains("decrypt")) {
-                    //Decryption action
-                    //block.addAttribute(new AvatarAttribute(ae.securityPattern.name, AvatarType.INTEGER, block, null));
-                    //block.addAttribute(new AvatarAttribute(ae.securityPattern.name+"_encrypted", AvatarType.INTEGER, block, null));
-                    if (ae.securityPattern.type.equals("Symmetric Encryption")) {
-                        if (!ae.securityPattern.key.isEmpty()) {
-                            //Decrypting a key
-                            //Add sdecrypt method
-                            AvatarMethod sdecrypt = new AvatarMethod("sdecrypt", ae);
-                            block.addAttribute(new AvatarAttribute("key_" + ae.securityPattern.key, AvatarType.INTEGER, block, null));
-                            block.addAttribute(new AvatarAttribute("key_" + ae.securityPattern.name, AvatarType.INTEGER, block, null));
-                            block.addAttribute(new AvatarAttribute("encryptedKey_" + ae.securityPattern.key, AvatarType.INTEGER, block, null));
+            AvatarRelation ar = new AvatarRelation(event.getName(), taskBlockMap.get(event.getOriginTask()), taskBlockMap.get(event.getDestinationTask()),
+                    event.getReferenceObject());
+            AvatarSignal sigOut = signalOutMap.get(event.getName());
+            AvatarSignal sigIn = signalInMap.get(event.getName());
+            AvatarSignal sigNotified = signalInMap.get(event.getName() + NOTIFIED);
+            ar.addSignals(sigOut, sigIn);
 
-                            sdecrypt.addParameter(block.getAvatarAttributeWithName("encryptedKey_" + ae.securityPattern.key));
-                            sdecrypt.addParameter(block.getAvatarAttributeWithName("key_" + ae.securityPattern.name));
-                            sdecrypt.addReturnParameter(block.getAvatarAttributeWithName("key_" + ae.securityPattern.key));
-                            if (block.getAvatarAttributeWithName("key_" + ae.securityPattern.key) != null && block.getAvatarAttributeWithName("key_" + ae.securityPattern.name) != null && block.getAvatarAttributeWithName("encryptedKey_" + ae.securityPattern.key) != null) {
-                                block.addMethod(sdecrypt);
-                                tran.addAction("key_" + ae.securityPattern.key + " = sdecrypt(encryptedKey_" + ae.securityPattern.key + ", key_" + ae.securityPattern.name + ")");
-                            }
-                        } else {
-                            //Decrypting data
-                            AvatarMethod sdecrypt = new AvatarMethod("sdecrypt", ae);
-                            block.addAttribute(new AvatarAttribute(ae.securityPattern.name, AvatarType.INTEGER, block, null));
-                            block.addAttribute(new AvatarAttribute("key_" + ae.securityPattern.name, AvatarType.INTEGER, block, null));
-                            block.addAttribute(new AvatarAttribute(ae.securityPattern.name + "_encrypted", AvatarType.INTEGER, block, null));
+            AvatarBlock ab0 = taskBlockMap.get(event.getOriginTask());
+            AvatarBlock ab1 = taskBlockMap.get(event.getDestinationTask());
+            //ab0.addSignal(new AvatarSignal(event.getName(), AvatarSignal.OUT, null));
+            //ab1.addSignal(new AvatarSignal(event.getName(), AvatarSignal.IN, null));
 
-                            sdecrypt.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name + "_encrypted"));
-                            sdecrypt.addParameter(block.getAvatarAttributeWithName("key_" + ae.securityPattern.name));
-                            sdecrypt.addReturnParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
-                            if (block.getAvatarAttributeWithName(ae.securityPattern.name + "_encrypted") != null && block.getAvatarAttributeWithName("key_" + ae.securityPattern.name) != null && block.getAvatarAttributeWithName(ae.securityPattern.name) != null) {
-                                block.addMethod(sdecrypt);
-                                tran.addAction(ae.securityPattern.name + " = sdecrypt(" + ae.securityPattern.name + "_encrypted, key_" + ae.securityPattern.name + ")");
-                            }
-                        }
-                        if (!ae.securityPattern.nonce.isEmpty()) {
-                            //Separate out the nonce
-                            block.addAttribute(new AvatarAttribute("testnonce_" + ae.securityPattern.nonce, AvatarType.INTEGER, block, null));
-                            //Add get2 method
-                            AvatarMethod get2 = new AvatarMethod("get2", ae);
-                            get2.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
-                            get2.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
-                            get2.addParameter(block.getAvatarAttributeWithName("testnonce_" + ae.securityPattern.nonce));
-                            if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null && block.getAvatarAttributeWithName("testnonce_" + ae.securityPattern.nonce) != null) {
-                                block.addMethod(get2);
-                                tran.addAction("get2(" + ae.securityPattern.name + "," + ae.securityPattern.name + ",testnonce_" + ae.securityPattern.nonce + ")");
-                            }
+            if (event.isBlocking()) {
+                ar.setAsynchronous(true);
+                ar.setBlocking(true);
+                ar.setSizeOfFIFO(event.getMaxSize());
+            } else {
+                ar.setAsynchronous(true);
+                ar.setBlocking(false);
+                ar.setSizeOfFIFO(event.getMaxSize());
 
-                            //Add state after get2 statement
-                            AvatarState guardState = new AvatarState(ae.getName().replaceAll(" ", "") + "_guarded", ae.getReferenceObject());
-                            tran.addNext(guardState);
-                            tran = new AvatarTransition(block, "__guard_" + ae.getName(), ae.getReferenceObject());
-                            guardState.addNext(tran);
-                            elementList.add(guardState);
-                            elementList.add(tran);
+            }
+            //avspec.addRelation(ar);
 
-                            //Guard transition to determine if nonce matches
-                            tran.setGuard("testnonce_" + ae.securityPattern.nonce + "==" + ae.securityPattern.nonce);
-                        }
-                        //Add a dummy state afterwards for authenticity after decrypting the data
-                        AvatarState dummy = new AvatarState(ae.getName().replaceAll(" ", "") + "_dummy", ae.getReferenceObject());
-                        ae.securityPattern.state2 = dummy;
-                        tran.addNext(dummy);
-                        tran = new AvatarTransition(block, "__after_" + ae.getName(), ae.getReferenceObject());
-                        dummy.addNext(tran);
-                        elementList.add(dummy);
-                        elementList.add(tran);
-                        if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null) {
-                            AvatarAttributeState authDest = new AvatarAttributeState(block.getName() + "." + dummy.getName() + "." + ae.securityPattern.name, ae.getReferenceObject(), block.getAvatarAttributeWithName(ae.securityPattern.name), dummy);
-                            signalAuthDestMap.put(ae.securityPattern.name, authDest);
-                        }
-                    } else if (ae.securityPattern.type.equals("Asymmetric Encryption")) {
-                        AvatarMethod adecrypt = new AvatarMethod("adecrypt", ae);
+            AvatarBlock FifoEvt = AvatarBlockTemplate.getFifoBlockWithNotified("Block" + event.getName(),
+                    avspec, ar, event.getReferenceObject(), sigOut, sigIn, sigNotified, event.getMaxSize(), event.getID());
+            avspec.addBlock(FifoEvt);
 
-                        if (!ae.securityPattern.key.isEmpty()) {
-                            //Decrypting key
+            ar = new AvatarRelation(event.getName()+"_FIFOIN", taskBlockMap.get(event.getOriginTask()), FifoEvt,
+                    event.getReferenceObject());
+            ar.addSignals(sigOut, FifoEvt.getAvatarSignalWithName("write"));
+            avspec.addRelation(ar);
 
+            ar = new AvatarRelation(event.getName()+"_FIFOIN",  FifoEvt, taskBlockMap.get(event.getDestinationTask()),
+                    event.getReferenceObject());
+            ar.addSignals(FifoEvt.getAvatarSignalWithName("read"), sigIn);
+            ar.addSignals(FifoEvt.getAvatarSignalWithName("notified"), sigNotified);
+            avspec.addRelation(ar);
 
-                            //Add adecrypt method
-                            block.addAttribute(new AvatarAttribute("encryptedKey_" + ae.securityPattern.key, AvatarType.INTEGER, block, null));
-                            block.addAttribute(new AvatarAttribute("privKey_" + ae.securityPattern.name, AvatarType.INTEGER, block, null));
-                            block.addAttribute(new AvatarAttribute("key_" + ae.securityPattern.key, AvatarType.INTEGER, block, null));
 
-                            adecrypt.addParameter(block.getAvatarAttributeWithName("encryptedKey_" + ae.securityPattern.key));
-                            adecrypt.addParameter(block.getAvatarAttributeWithName("privKey_" + ae.securityPattern.name));
-                            adecrypt.addReturnParameter(block.getAvatarAttributeWithName("key_" + ae.securityPattern.key));
+        }
 
-                            if (block.getAvatarAttributeWithName("encryptedKey_" + ae.securityPattern.key) != null && block.getAvatarAttributeWithName("privKey_" + ae.securityPattern.name) != null && block.getAvatarAttributeWithName("key_" + ae.securityPattern.key) != null) {
-                                block.addMethod(adecrypt);
-                                tran.addAction("key_" + ae.securityPattern.key + " = adecrypt(encryptedKey_" + ae.securityPattern.key + ", privKey_" + ae.securityPattern.name + ")");
-                            }
-                        } else {
-                            //Decrypting data
+        //	System.out.println("Avatar relations " + avspec.getRelations());
 
-                            //Add adecrypt method
-                            block.addAttribute(new AvatarAttribute(ae.securityPattern.name + "_encrypted", AvatarType.INTEGER, block, null));
-                            block.addAttribute(new AvatarAttribute(ae.securityPattern.name, AvatarType.INTEGER, block, null));
-                            block.addAttribute(new AvatarAttribute("privKey_" + ae.securityPattern.name, AvatarType.INTEGER, block, null));
+        for (AvatarSignal sig : signals) {
+            //	System.out.println("signal " + sig.getName());
+            //check that all signals are put in relations
+            AvatarRelation ar = avspec.getAvatarRelationWithSignal(sig);
+            if (ar == null) {
+                TraceManager.addDev("missing relation for " + sig.getName());
+            }
+        }
+        //Check if we matched up all signals
+        for (SecurityPattern sp : symKeys.keySet()) {
+            if (symKeys.get(sp).size() > 1) {
+                String keys = "";
+                for (AvatarAttribute key : symKeys.get(sp)) {
+                    keys = keys + " " + key.getBlock().getName() + "." + key.getName();
+                }
+                avspec.addPragma(new AvatarPragmaInitialKnowledge("#InitialSessionKnowledge " + keys, null, symKeys.get(sp), true));
+            }
+        }
+        for (SecurityPattern sp : pubKeys.keySet()) {
+            if (pubKeys.get(sp).size() != 0) {
+                String keys = "";
+                List<String> pubKeyNames = new ArrayList<String>();
+                for (AvatarAttribute key : pubKeys.get(sp)) {
+                    if (!pubKeyNames.contains(key.getBlock().getName() + "." + key.getName())) {
+                        keys = keys + " " + key.getBlock().getName() + "." + key.getName();
+                        pubKeyNames.add(key.getBlock().getName() + "." + key.getName());
+                    }
+                }
+                //	avspec.addPragma(new AvatarPragmaInitialKnowledge("#InitialSessionKnowledge "+keys, null, pubKeys.get(sp),true));
+                //System.out.println("pragma " + keys);
+            }
+        }
 
-                            adecrypt.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name + "_encrypted"));
-                            adecrypt.addParameter(block.getAvatarAttributeWithName("privKey_" + ae.securityPattern.name));
-                            adecrypt.addReturnParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
-                            if (block.getAvatarAttributeWithName(ae.securityPattern.name + "_encrypted") != null && block.getAvatarAttributeWithName("privKey_" + ae.securityPattern.name) != null && block.getAvatarAttributeWithName(ae.securityPattern.name) != null) {
-                                block.addMethod(adecrypt);
-                                tran.addAction(ae.securityPattern.name + " = adecrypt(" + ae.securityPattern.name + "_encrypted, privKey_" + ae.securityPattern.name + ")");
-                            }
-                        }
-                        if (!ae.securityPattern.nonce.isEmpty()) {
-                            block.addAttribute(new AvatarAttribute("testnonce_" + ae.securityPattern.nonce, AvatarType.INTEGER, block, null));
-                            AvatarMethod get2 = new AvatarMethod("get2", ae);
-                            get2.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
-                            get2.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
-                            get2.addParameter(block.getAvatarAttributeWithName("testnonce_" + ae.securityPattern.nonce));
-                            if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null && block.getAvatarAttributeWithName(ae.securityPattern.name) != null) {
-                                block.addMethod(get2);
-                            }
+        tmlmodel.secChannelMap = secChannelMap;
 
-                            tran.addAction("get2(" + ae.securityPattern.name + "," + ae.securityPattern.name + ",testnonce_" + ae.securityPattern.nonce + ")");
-                            AvatarState guardState = new AvatarState(ae.getName().replaceAll(" ", "") + "_guarded", ae.getReferenceObject());
-                            tran.addNext(guardState);
-                            tran = new AvatarTransition(block, "__guard_" + ae.getName(), ae.getReferenceObject());
-                            elementList.add(guardState);
-                            elementList.add(tran);
-                            guardState.addNext(tran);
-                            tran.setGuard("testnonce_" + ae.securityPattern.nonce + "==" + ae.securityPattern.nonce);
-                        }
-                        AvatarState dummy = new AvatarState(ae.getName().replaceAll(" ", "") + "_dummy", ae.getReferenceObject());
-                        tran.addNext(dummy);
-                        tran = new AvatarTransition(block, "__after_" + ae.getName(), ae.getReferenceObject());
-                        dummy.addNext(tran);
-                        elementList.add(dummy);
-                        elementList.add(tran);
-                        ae.securityPattern.state2 = dummy;
-                        if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null) {
-                            AvatarAttributeState authDest = new AvatarAttributeState(block.getName() + "." + dummy.getName() + "." + ae.securityPattern.name, ae.getReferenceObject(), block.getAvatarAttributeWithName(ae.securityPattern.name), dummy);
-                            signalAuthDestMap.put(ae.securityPattern.name, authDest);
-                        }
-                    } else if (ae.securityPattern.type.equals("MAC")) {
-                        //Separate MAC from MSG
+//			System.out.println("avatar spec\n" +avspec);
+        return avspec;
+    }
 
-                        //Add get2 method
-                        AvatarMethod get2 = new AvatarMethod("get2", ae);
-                        AvatarAttribute mac = new AvatarAttribute(ae.securityPattern.name + "_mac", AvatarType.INTEGER, block, null);
-                        block.addAttribute(mac);
-                        block.addAttribute(new AvatarAttribute(ae.securityPattern.name + "_encrypted", AvatarType.INTEGER, block, null));
-                        block.addAttribute(new AvatarAttribute(ae.securityPattern.name, AvatarType.INTEGER, block, null));
 
-                        get2.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name + "_encrypted"));
-                        get2.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
-                        get2.addParameter(mac);
-                        if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null && block.getAvatarAttributeWithName(ae.securityPattern.name + "_encrypted") != null) {
-                            block.addMethod(get2);
-                            tran.addAction("get2(" + ae.securityPattern.name + "_encrypted," + ae.securityPattern.name + "," + ae.securityPattern.name + "_mac)");
-                        }
 
-                        //Add verifymac method
-                        AvatarMethod verifymac = new AvatarMethod("verifyMAC", ae);
-                        block.addAttribute(new AvatarAttribute("testnonce_" + ae.securityPattern.name, AvatarType.BOOLEAN, block, null));
 
-                        verifymac.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
-                        verifymac.addParameter(block.getAvatarAttributeWithName("key_" + ae.securityPattern.name));
-                        verifymac.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name + "_mac"));
-                        verifymac.addReturnParameter(block.getAvatarAttributeWithName("testnonce_" + ae.securityPattern.name));
 
-                        if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null && block.getAvatarAttributeWithName("key_" + ae.securityPattern.name) != null) {
-                            block.addMethod(verifymac);
-                            tran.addAction("testnonce_" + ae.securityPattern.name + "=verifyMAC(" + ae.securityPattern.name + ", key_" + ae.securityPattern.name + "," + ae.securityPattern.name + "_mac)");
 
-                        }
 
 
-                        if (!ae.securityPattern.nonce.isEmpty()) {
-                            block.addAttribute(new AvatarAttribute("testnonce_" + ae.securityPattern.nonce, AvatarType.INTEGER, block, null));
-                            tran.addAction("get2(" + ae.securityPattern.name + "," + ae.securityPattern.name + ",testnonce_" + ae.securityPattern.nonce + ")");
-                        }
 
-                        AvatarState guardState = new AvatarState(ae.getName().replaceAll(" ", "") + "_guarded", ae.getReferenceObject());
-                        tran.addNext(guardState);
-                        tran = new AvatarTransition(block, "__guard_" + ae.getName(), ae.getReferenceObject());
-                        elementList.add(guardState);
-                        elementList.add(tran);
-                        guardState.addNext(tran);
-                        tran.setGuard("testnonce_" + ae.securityPattern.name);
 
-                        if (!ae.securityPattern.nonce.isEmpty()) {
 
-                            //Add extra state and transition
 
-                            AvatarState guardState2 = new AvatarState(ae.getName().replaceAll(" ", "") + "_guarded2", ae.getReferenceObject());
-                            tran.addNext(guardState2);
-                            tran = new AvatarTransition(block, "__guard_" + ae.getName(), ae.getReferenceObject());
-                            tran.setGuard("testnonce_" + ae.securityPattern.nonce + "==" + ae.securityPattern.nonce);
-                            elementList.add(guardState2);
-                            elementList.add(tran);
+    public List<AvatarStateMachineElement> translateState(TMLActivityElement ae, AvatarBlock block) {
 
-                            guardState2.addNext(tran);
-                        }
-                        AvatarState dummy = new AvatarState(ae.getName().replaceAll(" ", "") + "_dummy", ae.getReferenceObject());
-                        ae.securityPattern.state2 = dummy;
-                        tran.addNext(dummy);
-                        elementList.add(tran);
-                        tran = new AvatarTransition(block, "__after_" + ae.getName(), ae.getReferenceObject());
-                        dummy.addNext(tran);
-                        elementList.add(dummy);
-                        elementList.add(tran);
 
-                        if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null) {
-                            AvatarAttributeState authDest = new AvatarAttributeState(block.getName() + "." + dummy.getName() + "." + ae.securityPattern.name, ae.getReferenceObject(), block.getAvatarAttributeWithName(ae.securityPattern.name), dummy);
-                            signalAuthDestMap.put(ae.securityPattern.name, authDest);
-                        }
-                    }
 
+        AvatarTransition tran = new AvatarTransition(block, "", null);
+        List<AvatarStateMachineElement> elementList = new ArrayList<AvatarStateMachineElement>();
 
-                    //Can't decrypt hash or nonce
-                }
-            } else {
-                // See if action.
-                if (ae instanceof TMLActionState) {
-                    String val = ((TMLActionState) ae).getAction();
-                    tran.addAction(val);
-                }
+        if (ae == null) {
+            return elementList;
+        }
 
-            }
-        } else if (ae instanceof TMLActivityElementWithIntervalAction) {
-            AvatarState as = new AvatarState(ae.getName().replaceAll(" ", ""), ae.getReferenceObject());
+        if (ae instanceof TMLStopState) {
+            AvatarStopState stops = new AvatarStopState(ae.getName(), ae.getReferenceObject());
+            elementList.add(stops);
+            return elementList;
+        } else if (ae instanceof TMLStartState) {
+            AvatarStartState ss = new AvatarStartState(ae.getName(), ae.getReferenceObject());
+            tran = new AvatarTransition(block, "__after_" + ae.getName(), ss.getReferenceObject());
+            ss.addNext(tran);
+            elementList.add(ss);
+            elementList.add(tran);
+        } else if (ae instanceof TMLRandom) {
+            AvatarRandom ar = new AvatarRandom(ae.getName(), ae.getReferenceObject());
+            TMLRandom tmlr = (TMLRandom) ae;
+            ar.setVariable(tmlr.getVariable());
+            ar.setValues(tmlr.getMinValue(), tmlr.getMaxValue());
             tran = new AvatarTransition(block, "__after_" + ae.getName(), ae.getReferenceObject());
-            as.addNext(tran);
-            elementList.add(as);
+            ar.addNext(tran);
+            //Add to list
+            elementList.add(ar);
             elementList.add(tran);
+        } else if (ae instanceof TMLSequence) {
+            //Get all list of sequences and paste together
+            List<AvatarStateMachineElement> seq = translateState(ae.getNextElement(0), block);
+            List<AvatarStateMachineElement> tmp;
+            // elementList.addAll(seq);
+            //get rid of any stops in the middle of the sequence and replace with the start of the next sequence
+            for (int i = 1; i < ae.getNbNext(); i++) {
+                tmp = translateState(ae.getNextElement(i), block);
+                for (AvatarStateMachineElement e : seq) {
+                    if (e instanceof AvatarStopState) {
+                        //ignore
+                    } else if (e.getNexts().size() == 0) {
+                        e.addNext(tmp.get(0));
+                        elementList.add(e);
+                    } else if (e.getNext(0) instanceof AvatarStopState) {
+                        //Remove the transition to AvatarStopState
+                        e.removeNext(0);
+                        e.addNext(tmp.get(0));
+                        elementList.add(e);
+                    } else {
+                        elementList.add(e);
+                    }
+                }
+                //elementList.addAll(tmp);
+                seq = tmp;
+            }
+            //Put stop states on the end of the last in sequence
 
-        } else if (ae instanceof TMLActivityElementChannel) {
-            TMLActivityElementChannel aec = (TMLActivityElementChannel) ae;
-            TMLChannel ch = aec.getChannel(0);
-            AvatarSignal sig;
-
-            String nv = getName(ch.getName()) + "_chData";
-            block.addIntAttributeIfApplicable(nv);
+            for (AvatarStateMachineElement e : seq) {
+                if (e.getNexts().size() == 0 && !(e instanceof AvatarStopState)) {
+                    AvatarStopState stop = new AvatarStopState("stop", null);
+                    e.addNext(stop);
+                    elementList.add(stop);
+                }
+                elementList.add(e);
+            }
+            return elementList;
 
+        } else if (ae instanceof TMLSendRequest) {
+            TMLSendRequest sr = (TMLSendRequest) ae;
+            TMLRequest req = sr.getRequest();
+            AvatarSignal sig;
             boolean checkAcc = false;
             if (ae.getReferenceObject() != null) {
                 checkAcc = ((TGComponent) ae.getReferenceObject()).getCheckableAccessibility();
@@ -910,819 +819,941 @@ public class FullTML2Avatar {
             if (ae.getReferenceObject() != null) {
                 checked = ((TGComponent) ae.getReferenceObject()).hasCheckedAccessibility();
             }
-            AvatarState signalState = new AvatarState("signalstate_" + ae.getName().replaceAll(" ", "") + "_" + ch.getName(), ae.getReferenceObject(), checkAcc, checked);
-            AvatarTransition signalTran = new AvatarTransition(block, "__after_signalstate_" + ae.getName() + "_" + ch.getName(), ae.getReferenceObject());
-            AvatarTransition signalTranBefore = new AvatarTransition(block, "__before_signalstateint_" + ae.getName() + "_" + ch.getName(), ae
-                    .getReferenceObject());
-            AvatarState signalStateIntermediate = new AvatarState("signalstateinter_" + ae.getName().replaceAll(" ", "") + "_" + ch.getName(), ae
-                    .getReferenceObject(), checkAcc, checked);
-            AvatarTransition signalTranInit = new AvatarTransition(block, "_init_signalstate_" + ae.getName() + "_" + ch.getName(), ae
-                    .getReferenceObject());
-
-            if (ae instanceof TMLReadChannel) {
-                //Create signal if it does not already exist
-                sig = signalInMap.get(ch.getName());
+            AvatarState signalState = new AvatarState("signalstate_" + ae.getName().replaceAll(" ", "") + "_" + req.getName().replaceAll(" ", ""), ae.getReferenceObject(), checkAcc, checked);
+            AvatarTransition signalTran = new AvatarTransition(block, "__after_signalstate_" + ae.getName() + "_" + req.getName(), ae.getReferenceObject());
+            if (!signalOutMap.containsKey(req.getName())) {
+                sig = new AvatarSignal(getName(req.getName()), AvatarSignal.OUT, req.getReferenceObject());
+                signals.add(sig);
+                signalOutMap.put(req.getName(), sig);
+                block.addSignal(sig);
             } else {
-                sig = signalOutMap.get(ch.getName());
+                sig = signalOutMap.get(req.getName());
             }
 
             AvatarActionOnSignal as = new AvatarActionOnSignal(ae.getName(), sig, ae.getReferenceObject());
+            for (int i = 0; i < sr.getNbOfParams(); i++) {
+                if (block.getAvatarAttributeWithName(sr.getParam(i)) == null) {
+                    //Throw Error
+                    TraceManager.addDev("Missing Attribute " + sr.getParam(i));
+                    as.addValue("tmp");
+                } else {
+                    //	Add parameter to signal and actiononsignal
+                    sig.addParameter(block.getAvatarAttributeWithName(sr.getParam(i)));
+                    as.addValue(sr.getParam(i));
+                }
+            }
+                /*
+				if (req.checkAuth){
+					AvatarAttributeState authOrig = new AvatarAttributeState(block.getName()+"."+signalState.getName()+"."+requestData.getName(),ae.getReferenceObject(),requestData, signalState);
+					signalAuthOriginMap.put(req.getName(), authOrig);
+				}*/
             tran = new AvatarTransition(block, "__after_" + ae.getName(), ae.getReferenceObject());
-
             elementList.add(signalState);
-            elementList.add(signalStateIntermediate);
+            signalState.addNext(signalTran);
+            elementList.add(signalTran);
+            signalTran.addNext(as);
             elementList.add(as);
+            as.addNext(tran);
             elementList.add(tran);
-            elementList.add(signalTranInit);
-            elementList.add(signalTranBefore);
-            elementList.add(signalTran);
 
-            signalState.addNext(signalTranInit);
-            signalTranInit.addAction(ch.getName() + "_chData = 0");
-            signalTranInit.addNext(signalStateIntermediate);
-            signalStateIntermediate.addNext(signalTran);
-            signalTran.setGuard(ch.getName() + "_chData < (" + aec.getNbOfSamples() + ")");
-            signalTran.addNext(as);
-            as.addNext(signalTranBefore);
-            signalTranBefore.addAction(ch.getName() + "_chData = " + ch.getName() + "_chData + 1 ");
-            signalTranBefore.addNext(signalStateIntermediate);
+        } else if (ae instanceof TMLRandomSequence) {
+            //HashMap<Integer, List<AvatarStateMachineElement>> seqs = new HashMap<Integer, List<AvatarStateMachineElement>>();
+            AvatarState choiceState = new AvatarState("seqchoice__" + ae.getName().replaceAll(" ", ""), ae.getReferenceObject());
+            elementList.add(choiceState);
+            if (ae.getNbNext() == 2) {
+                List<AvatarStateMachineElement> set0 = translateState(ae.getNextElement(0), block);
+                List<AvatarStateMachineElement> set1 = translateState(ae.getNextElement(1), block);
+                //		elementList.addAll(set0);
 
-            signalStateIntermediate.addNext(tran);
-            tran.setGuard("else");
+                //Remove stop states of sets and route their transitions to the first element of the following sequence
+                for (AvatarStateMachineElement e : set0) {
+                    if (e instanceof AvatarStopState) {
+                        //ignore
+                    } else if (e.getNexts().size() == 0) {
+                        e.addNext(set1.get(0));
+                        elementList.add(e);
+                    } else if (e.getNext(0) instanceof AvatarStopState) {
+                        //Remove the transition to AvatarStopState
+                        e.removeNext(0);
+                        e.addNext(set1.get(0));
+                        elementList.add(e);
+                    } else {
+                        elementList.add(e);
+                    }
+                }
 
 
-
-        } else if (ae instanceof TMLForLoop) {
-            TMLForLoop loop = (TMLForLoop) ae;
-            if (loop.isInfinite()) {
-                //Make initializaton, then choice state with transitions
-                List<AvatarStateMachineElement> elements = translateState(ae.getNextElement(0), block);
-                /*List<AvatarStateMachineElement> afterloop =*/
-                translateState(ae.getNextElement(1), block);
-                AvatarState initState = new AvatarState(ae.getName().replaceAll(" ", "") + "__init", ae.getReferenceObject());
-                elementList.add(initState);
-                //Build transition to choice
-                tran = new AvatarTransition(block, "loop_init__" + ae.getName(), ae.getReferenceObject());
-                tran.addAction("loop_index=0");
-                elementList.add(tran);
-                initState.addNext(tran);
-                //Choice state
-                AvatarState as = new AvatarState(ae.getName().replaceAll(" ", "") + "__choice", ae.getReferenceObject());
-                elementList.add(as);
-                tran.addNext(as);
-                //transition to first element of loop
-                tran = new AvatarTransition(block, "loop_increment__" + ae.getName(), ae.getReferenceObject());
-                //Set default loop limit guard
-                tran.setGuard(AvatarGuard.createFromString(block, "loop_index != " + loopLimit));
-                //tran.addAction(AvatarTerm.createActionFromString(block, "loop_index = loop_index + 1"));
-                tran.addNext(elements.get(0));
-                as.addNext(tran);
+                //Build branch 0
+                tran = new AvatarTransition(block, "__after_" + ae.getName() + "_0", ae.getReferenceObject());
+                choiceState.addNext(tran);
                 elementList.add(tran);
-                //Process elements in loop to remove stop states and empty transitions, and loop back to choice
-                for (AvatarStateMachineElement e : elements) {
+                tran.addNext(set0.get(0));
+                //Put stop states at the end of set1 if they don't already exist
+                AvatarStopState stop = new AvatarStopState("stop", null);
+                for (AvatarStateMachineElement e : set1) {
+                    if (e.getNexts().size() == 0 && (e instanceof AvatarTransition)) {
+                        e.addNext(stop);
+                    }
+                    elementList.add(e);
+                }
+                elementList.add(stop);
+
+                //Build branch 1
+                List<AvatarStateMachineElement> set0_1 = translateState(ae.getNextElement(0), block);
+                List<AvatarStateMachineElement> set1_1 = translateState(ae.getNextElement(1), block);
+                for (AvatarStateMachineElement e : set1_1) {
                     if (e instanceof AvatarStopState) {
+                        //ignore
                     } else if (e.getNexts().size() == 0) {
-                        if (e instanceof AvatarTransition) {
-                            e.addNext(as);
-                            elementList.add(e);
-                        }
+                        e.addNext(set0_1.get(0));
+                        elementList.add(e);
                     } else if (e.getNext(0) instanceof AvatarStopState) {
                         //Remove the transition to AvatarStopState
                         e.removeNext(0);
-                        e.addNext(as);
+                        e.addNext(set0_1.get(0));
                         elementList.add(e);
                     } else {
                         elementList.add(e);
                     }
                 }
-
-                //Transition if exiting loop
-                tran = new AvatarTransition(block, "end_loop__" + ae.getName(), ae.getReferenceObject());
-                tran.setGuard(new AvatarGuardElse());
-                as.addNext(tran);
-                AvatarStopState stop = new AvatarStopState("stop", null);
-                tran.addNext(stop);
+                tran = new AvatarTransition(block, "__after_" + ae.getName() + "_1", ae.getReferenceObject());
                 elementList.add(tran);
+                choiceState.addNext(tran);
+                tran.addNext(set1_1.get(0));
+                stop = new AvatarStopState("stop", null);
+                for (AvatarStateMachineElement e : set0_1) {
+                    if (e.getNexts().size() == 0 && (e instanceof AvatarTransition)) {
+                        e.addNext(stop);
+                    }
+                    elementList.add(e);
+                }
                 elementList.add(stop);
-                return elementList;
+
             } else {
-                //Make initializaton, then choice state with transitions
-                List<AvatarStateMachineElement> elements = translateState(ae.getNextElement(0), block);
-                List<AvatarStateMachineElement> afterloop = translateState(ae.getNextElement(1), block);
-                AvatarState initState = new AvatarState(ae.getName().replaceAll(" ", "") + "__init", ae.getReferenceObject());
-                elementList.add(initState);
-                //Build transition to choice
-                tran = new AvatarTransition(block, "loop_init__" + ae.getName(), ae.getReferenceObject());
-                tran.addAction(AvatarTerm.createActionFromString(block, loop.getInit()));
-                //tran.addAction(AvatarTerm.createActionFromString(block, "loop_index=0"));
-                elementList.add(tran);
-                initState.addNext(tran);
-                //Choice state
-                AvatarState as = new AvatarState(ae.getName().replaceAll(" ", "") + "__choice", ae.getReferenceObject());
-                elementList.add(as);
-                tran.addNext(as);
-                //transition to first element of loop
-                tran = new AvatarTransition(block, "loop_increment__" + ae.getName(), ae.getReferenceObject());
-                //Set default loop limit guard
-                tran.setGuard(AvatarGuard.createFromString(block, loop.getCondition()));
-                /*AvatarGuard guard = */
-                //AvatarGuard.createFromString(block, loop.getCondition());
-                tran.addAction(AvatarTerm.createActionFromString(block, loop.getIncrement()));
-                //tran.addAction(AvatarTerm.createActionFromString(block, "loop_index = loop_index + 1"));
-                if (elements.size() > 0) {
-                    tran.addNext(elements.get(0));
-                    as.addNext(tran);
+                //This gets really complicated in Avatar...
+                for (int i = 0; i < ae.getNbNext(); i++) {
+                    //For each of the possible state blocks, translate 1 and recurse on the remaining random sequence
+                    tran = new AvatarTransition(block, "__after_" + ae.getName() + "_" + i, ae.getReferenceObject());
+                    choiceState.addNext(tran);
                     elementList.add(tran);
-                }
-                //Process elements in loop to remove stop states and empty transitions, and loop back to choice
-                for (AvatarStateMachineElement e : elements) {
-                    if (e instanceof AvatarStopState) {
-                    } else if (e.getNexts().size() == 0) {
-                        e.addNext(as);
-                        elementList.add(e);
-                    } else if (e.getNext(0) instanceof AvatarStopState) {
-                        //Remove the transition to AvatarStopState
-                        e.removeNext(0);
-                        e.addNext(as);
-                        elementList.add(e);
-                    } else {
-                        elementList.add(e);
+                    List<AvatarStateMachineElement> tmp = translateState(ae.getNextElement(i), block);
+
+
+                    AvatarState choiceStateEnd = new AvatarState("seqchoiceend__" + i + "_" + ae.getName().replaceAll(" ", ""), ae.getReferenceObject());
+                    elementList.add(choiceStateEnd);
+
+
+                    //Remove stop states from the first generated set
+                    for (AvatarStateMachineElement e : tmp) {
+                        if (e instanceof AvatarStopState) {
+                            //ignore
+                        } else if (e.getNexts().size() == 0) {
+                            //e.addNext(set1.get(0));
+                            e.addNext(choiceStateEnd);
+                            elementList.add(e);
+                        } else if (e.getNext(0) instanceof AvatarStopState) {
+                            //Remove the transition to AvatarStopState
+                            e.removeNext(0);
+                            e.addNext(choiceStateEnd);
+                            //e.addNext(set1.get(0));
+                            elementList.add(e);
+                        } else {
+                            elementList.add(e);
+                        }
                     }
-                }
 
-                //Transition if exiting loop
-                tran = new AvatarTransition(block, "end_loop__" + ae.getName(), ae.getReferenceObject());
-                tran.setGuard(new AvatarGuardElse());
-                as.addNext(tran);
-                if (afterloop.size() == 0) {
-                    afterloop.add(new AvatarStopState("stop", null));
-                }
-                tran.addNext(afterloop.get(0));
-                elementList.add(tran);
-                elementList.addAll(afterloop);
-                return elementList;
-            }
 
-        } else if (ae instanceof TMLChoice) {
-            AvatarState as = new AvatarState(ae.getName().replaceAll(" ", ""), ae.getReferenceObject());
-            //Make many choices
-            elementList.add(as);
-            TMLChoice c = (TMLChoice) ae;
-            for (int i = 0; i < c.getNbGuard(); i++) {
-                tran = new AvatarTransition(block, "__after_" + ae.getName() + "_" + i, ae.getReferenceObject());
-                //tran.setGuard(c.getGuard(i));
-                as.addNext(tran);
-                List<AvatarStateMachineElement> nexts = translateState(ae.getNextElement(i), block);
-                if (nexts.size() > 0) {
-                    tran.addNext(nexts.get(0));
+                    tran.addNext(tmp.get(0));
+
+                    TMLRandomSequence newSeq = new TMLRandomSequence("seqchoice__" + i + "_" + ae.getNbNext() + "_" + ae.getName(), ae.getReferenceObject());
+                    for (int j = 0; j < ae.getNbNext(); j++) {
+                        if (j != i) {
+                            newSeq.addNext(ae.getNextElement(j));
+                        }
+                    }
+
+
+                    tran = new AvatarTransition(block, "__after_" + ae.getNextElement(i).getName(), ae.getReferenceObject());
+                    choiceStateEnd.addNext(tran);
                     elementList.add(tran);
+
+                    List<AvatarStateMachineElement> nexts = translateState(newSeq, block);
                     elementList.addAll(nexts);
+                    tran.addNext(nexts.get(0));
+
                 }
+
             }
             return elementList;
 
-        } else if (ae instanceof TMLSelectEvt) {
-            AvatarState as = new AvatarState(ae.getName().replaceAll(" ", ""), ae.getReferenceObject());
-            elementList.add(as);
-            //Make many choices
-            //TMLSelectEvt c = (TMLSelectEvt) ae;
-            for (int i = 0; i < ae.getNbNext(); i++) {
-                tran = new AvatarTransition(block, "__after_" + ae.getName() + "_" + i, ae.getReferenceObject());
+        } else if (ae instanceof TMLActivityElementEvent) {
+            TMLActivityElementEvent aee = (TMLActivityElementEvent) ae;
+            TMLEvent evt = aee.getEvent();
+            boolean checkAcc = false;
+            if (ae.getReferenceObject() != null) {
+                checkAcc = ((TGComponent) ae.getReferenceObject()).getCheckableAccessibility();
+            }
+            boolean checked = false;
+            if (ae.getReferenceObject() != null) {
+                checked = ((TGComponent) ae.getReferenceObject()).hasCheckedAccessibility();
+            }
+            AvatarState signalState = new AvatarState("signalstate_" + ae.getName().replaceAll(" ", "") + "_" + evt.getName(), ae.getReferenceObject(), checkAcc, checked);
+            AvatarTransition signalTran = new AvatarTransition(block, "__after_signalstate_" + ae.getName() + "_" + evt.getName(), ae.getReferenceObject());
+
+            if (ae instanceof TMLSendEvent) {
+
+                AvatarSignal sig = signalOutMap.get(evt.getName());
+                TraceManager.addDev("sig="  + sig);
+
+                AvatarActionOnSignal as = new AvatarActionOnSignal(ae.getName(), sig, ae.getReferenceObject());
+                for (int i = 0; i < aee.getNbOfParams(); i++) {
+                    as.addValue(aee.getParam(i));
+                }
+
+                tran = new AvatarTransition(block, "__after_" + ae.getName(), ae.getReferenceObject());
+                elementList.add(signalState);
+                signalState.addNext(signalTran);
+                elementList.add(signalTran);
+                signalTran.addNext(as);
+                elementList.add(as);
                 as.addNext(tran);
-                List<AvatarStateMachineElement> nexts = translateState(ae.getNextElement(i), block);
-                tran.addNext(nexts.get(0));
                 elementList.add(tran);
-                elementList.addAll(nexts);
-            }
-            return elementList;
-        } else {
-            TraceManager.addDev("undefined tml element " + ae);
-        }
-        List<AvatarStateMachineElement> nexts = translateState(ae.getNextElement(0), block);
-        if (nexts.size() == 0) {
-            //in an infinite loop i hope
-            return elementList;
-        }
-        tran.addNext(nexts.get(0));
-        elementList.addAll(nexts);
-        return elementList;
-    }
 
-    public String processName(String name, int id) {
-        name = name.replaceAll("-", "_").replaceAll(" ", "");
-        if (allStates.contains(name)) {
-            return name + id;
 
-        } else {
-            allStates.add(name);
-            return name;
-        }
-    }
-		/*	public AvatarPragma generatePragma(String[] s){
+            } else if (ae instanceof TMLWaitEvent) {
+                TraceManager.addDev("Looking for IN evt: " + evt.getName());
+                AvatarSignal sig = signalInMap.get(evt.getName());
+                TraceManager.addDev("sig="  + sig);
 
-			}*/
+                AvatarActionOnSignal as = new AvatarActionOnSignal(ae.getName(), sig, ae.getReferenceObject());
+                for (int i = 0; i < aee.getNbOfParams(); i++) {
+                    as.addValue(aee.getParam(i));
 
-    public String getName(String s) {
-        //	System.out.println("String " + s);
-        if (nameMap.containsKey(s)) {
-            return nameMap.get(s);
-        } else {
-            if (!s.contains("__")) {
-                nameMap.put(s, s);
-                return s;
-            } else if (s.split("__").length == 1) {
-                nameMap.put(s, s.split("__")[s.split("__").length - 1]);
-                return s.split("__")[s.split("__").length - 1];
-            } else if (s.contains("JOIN") || s.contains("FORK")) {
-                String t = "";
-                t += s.split("__")[0];
-                for (int i = 2; i < s.split("__").length; i++) {
-                    t += "JOIN" + s.split("__")[i];
+                    /*if (block.getAvatarAttributeWithName(aee.getParam(i)) == null) {
+                        //Throw Error
+                        as.addValue("tmp");
+                        TraceManager.addDev("Missing Attribute " + aee.getParam(i));
+                    } else {
+                        //	Add parameter to signal and actiononsignal
+                        TraceManager.addDev("Param #" + i + ":" + aee.getParam(i));
+                        AvatarAttribute aa = block.getAvatarAttributeWithName(aee.getParam(i));
+                        if (aa == null) {
+                            TraceManager.addDev("NULL Att:");
+                        }
+                        sig.addParameter(block.getAvatarAttributeWithName(aee.getParam(i)));
+
+
+
+                        TraceManager.addDev("Param #" + i + " (1)");
+                        as.addValue(aee.getParam(i));
+                        TraceManager.addDev("Param #" + i + " (2)");
+                    }*/
                 }
-                nameMap.put(s, t);
-                return t;
+
+                tran = new AvatarTransition(block, "__after_" + ae.getName(), ae.getReferenceObject());
+                elementList.add(signalState);
+                signalState.addNext(signalTran);
+                elementList.add(signalTran);
+                signalTran.addNext(as);
+                elementList.add(as);
+                as.addNext(tran);
+                elementList.add(tran);
             } else {
-	       /*     String t = "";
-                for (int i = 0; i < s.split("__").length; i++) {
-                    t += s.split("__")[i];
-                }*/
-                nameMap.put(s, s);
-                return s;
-                // nameMap.put(s, s.split("__")[s.split("__").length - 1]);
-                // return s.split("__")[s.split("__").length - 1];
+                //Notify Event, I don't know how to translate this
+                AvatarRandom as = new AvatarRandom(ae.getName(), ae.getReferenceObject());
+                tran = new AvatarTransition(block, "__after_" + ae.getName(), ae.getReferenceObject());
+                as.setVariable(aee.getVariable());
+                as.setValues("0", "1");
+                as.addNext(tran);
+                elementList.add(as);
+                elementList.add(tran);
             }
-        }
-    }
 
-    public AvatarSpecification generateAvatarSpec(String _loopLimit) {
+        } else if (ae instanceof TMLActivityElementWithAction) {
+            //Might be encrypt or decrypt
+            AvatarState as = new AvatarState(ae.getValue().replaceAll(" ", "").replaceAll("\\*", "").replaceAll("\\+", "").replaceAll("\\-", "") + "_" + ae.getName().replaceAll(" ", "").replaceAll("\\*", "").replaceAll("\\+", "").replaceAll("\\-", ""), ae.getReferenceObject());
+            tran = new AvatarTransition(block, "__after_" + ae.getName(), ae.getReferenceObject());
+            as.addNext(tran);
+            elementList.add(as);
+            elementList.add(tran);
 
-        //TraceManager.addDev("security patterns " + tmlmodel.secPatterns);
-        //TraceManager.addDev("keys " + tmlmap.mappedSecurity);
+            if (security && ae.securityPattern != null) {
+                //If encryption
+                if (ae.securityPattern != null && ae.getName().contains("encrypt")) {
+                    secPatterns.add(ae.securityPattern);
+                    if (ae.securityPattern.type.equals("Advanced")) {
+                        //Type Advanced
+                        tran.addAction(ae.securityPattern.formula);
+                    } else if (ae.securityPattern.type.equals("Symmetric Encryption")) {
+                        //Type Symmetric Encryption
+                        if (!ae.securityPattern.nonce.isEmpty()) {
+                            //Concatenate nonce to data
 
+                            //Create concat2 method
+                            block.addAttribute(new AvatarAttribute(ae.securityPattern.nonce, AvatarType.INTEGER, block, null));
+                            block.addAttribute(new AvatarAttribute(ae.securityPattern.name, AvatarType.INTEGER, block, null));
 
-        //TODO: Make state names readable
-        //TODO: Put back numeric guards
-        //TODO: Calculate for temp variable
-        if (tmlmodel.getTGComponent() != null) {
-            this.avspec = new AvatarSpecification("spec", tmlmodel.getTGComponent().getTDiagramPanel().tp);
-        } else {
-            this.avspec = new AvatarSpecification("spec", null);
-        }
-        attrsToCheck.clear();
-        tmlmodel.removeForksAndJoins();
+                            AvatarMethod concat2 = new AvatarMethod("concat2", ae);
+                            concat2.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
+                            concat2.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.nonce));
+                            concat2.addReturnParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
 
-//        System.out.println("MODIFIED model " + tmlmodel);
+                            if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null && block.getAvatarAttributeWithName(ae.securityPattern.nonce) != null) {
+                                block.addMethod(concat2);
+                                tran.addAction(ae.securityPattern.name + "=concat2(" + ae.securityPattern.name + "," + ae.securityPattern.nonce + ")");
+                            }
+                        }
+                        if (!ae.securityPattern.key.isEmpty()) {
+                            //Securing a key
 
-        for (TMLChannel chan : tmlmodel.getChannels()) {
-            //System.out.println("chan " + chan);
-            TMLTask task = chan.getOriginTask();
-            TMLTask task2 = chan.getDestinationTask();
+                            //Create sencrypt method for key
+                            block.addAttribute(new AvatarAttribute(ae.securityPattern.key, AvatarType.INTEGER, block, null));
+                            block.addAttribute(new AvatarAttribute("encryptedKey_" + ae.securityPattern.key, AvatarType.INTEGER, block, null));
+                            block.addAttribute(new AvatarAttribute("key_" + ae.securityPattern.name, AvatarType.INTEGER, block, null));
 
-            if (chan.getName().contains("fork__") || chan.getName().contains("FORKCHANNEL")) {
-                chan.setName(chan.getName().replaceAll("__", ""));
-            }
-        }
+                            AvatarMethod sencrypt = new AvatarMethod("sencrypt", ae);
+                            sencrypt.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.key));
+                            sencrypt.addParameter(block.getAvatarAttributeWithName("key_" + ae.securityPattern.name));
+                            sencrypt.addReturnParameter(block.getAvatarAttributeWithName("encryptedKey_" + ae.securityPattern.key));
 
-        //Only set the loop limit if it's a number
-        String pattern = "^[0-9]{1,2}$";
-        Pattern r = Pattern.compile(pattern);
-        Matcher m = r.matcher(_loopLimit);
-        if (m.find()) {
-            loopLimit = Integer.valueOf(_loopLimit);
-        }
+                            if (block.getAvatarAttributeWithName(ae.securityPattern.key) != null && block.getAvatarAttributeWithName("encryptedKey_" + ae.securityPattern.key) != null && block.getAvatarAttributeWithName("key_" + ae.securityPattern.name) != null) {
+                                block.addMethod(sencrypt);
+                                tran.addAction("encryptedKey_" + ae.securityPattern.key + " = sencrypt(key_" + ae.securityPattern.key + ", key_" + ae.securityPattern.name + ")");
+                            }
+                        } else {
+                            //Securing data
 
-        for (TMLChannel channel : tmlmodel.getChannels()) {
-            for (TMLCPrimitivePort p : channel.ports) {
-                channel.checkConf = channel.checkConf || p.checkConf;
-                channel.checkAuth = channel.checkAuth || p.checkAuth;
-            }
-        }
+                            //Create sencrypt method for data
+                            block.addAttribute(new AvatarAttribute(ae.securityPattern.name, AvatarType.INTEGER, block, null));
+                            block.addAttribute(new AvatarAttribute(ae.securityPattern.name + "_encrypted", AvatarType.INTEGER, block, null));
+                            block.addAttribute(new AvatarAttribute("key_" + ae.securityPattern.name, AvatarType.INTEGER, block, null));
 
-        AvatarBlock top = new AvatarBlock("TOP__TOP", avspec, null);
-        if (mc) {
-            avspec.addBlock(top);
-            AvatarStateMachine topasm = top.getStateMachine();
-            AvatarStartState topss = new AvatarStartState("start", null);
-            topasm.setStartState(topss);
-            topasm.addElement(topss);
-        }
+                            AvatarMethod sencrypt = new AvatarMethod("sencrypt", ae);
+                            sencrypt.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
+                            sencrypt.addParameter(block.getAvatarAttributeWithName("key_" + ae.securityPattern.name));
+                            sencrypt.addReturnParameter(block.getAvatarAttributeWithName(ae.securityPattern.name + "_encrypted"));
 
-        List<TMLTask> tasks = tmlmodel.getTasks();
+                            if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null && block.getAvatarAttributeWithName("key_" + ae.securityPattern.name) != null && block.getAvatarAttributeWithName(ae.securityPattern.name + "_encrypted") != null) {
+                                block.addMethod(sencrypt);
+                            }
+                            tran.addAction(ae.securityPattern.name + "_encrypted = sencrypt(" + ae.securityPattern.name + ", key_" + ae.securityPattern.name + ")");
+                        }
+                        //Set as origin for authenticity
+                        ae.securityPattern.originTask = block.getName();
+                        ae.securityPattern.state1 = as;
+                    } else if (ae.securityPattern.type.equals("Asymmetric Encryption")) {
+                        if (!ae.securityPattern.nonce.isEmpty()) {
+                            //Concatenating a nonce
+                            //Add concat2 method
+                            block.addAttribute(new AvatarAttribute(ae.securityPattern.nonce, AvatarType.INTEGER, block, null));
+                            block.addAttribute(new AvatarAttribute(ae.securityPattern.name, AvatarType.INTEGER, block, null));
+                            AvatarMethod concat2 = new AvatarMethod("concat2", ae);
+                            concat2.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
+                            concat2.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.nonce));
+                            if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null && block.getAvatarAttributeWithName(ae.securityPattern.nonce) != null) {
+                                block.addMethod(concat2);
+                                tran.addAction(ae.securityPattern.name + "=concat2(" + ae.securityPattern.name + "," + ae.securityPattern.nonce + ")");
+                            }
+                        }
+                        //Securing a key instead of data
+                        if (!ae.securityPattern.key.isEmpty()) {
+                            //Add aencrypt method
+                            AvatarMethod aencrypt = new AvatarMethod("aencrypt", ae);
+                            block.addAttribute(new AvatarAttribute("encryptedKey_" + ae.securityPattern.key, AvatarType.INTEGER, block, null));
+                            block.addAttribute(new AvatarAttribute("key_" + ae.securityPattern.key, AvatarType.INTEGER, block, null));
+                            block.addAttribute(new AvatarAttribute("pubKey_" + ae.securityPattern.name, AvatarType.INTEGER, block, null));
+                            aencrypt.addParameter(block.getAvatarAttributeWithName("key_" + ae.securityPattern.key));
+                            aencrypt.addParameter(block.getAvatarAttributeWithName("pubKey_" + ae.securityPattern.name));
+                            aencrypt.addReturnParameter(block.getAvatarAttributeWithName("encryptedKey_" + ae.securityPattern.key));
+                            if (block.getAvatarAttributeWithName("key_" + ae.securityPattern.key) != null && block.getAvatarAttributeWithName("pubKey_" + ae.securityPattern.name) != null && block.getAvatarAttributeWithName("encryptedKey_" + ae.securityPattern.key) != null) {
+                                block.addMethod(aencrypt);
+                                tran.addAction("encryptedKey_" + ae.securityPattern.key + " = aencrypt(key_" + ae.securityPattern.key + ", pubKey_" + ae.securityPattern.name + ")");
+                            }
+                        } else {
+                            //Securing data
 
-        for (TMLTask task : tasks) {
-            AvatarBlock block = new AvatarBlock(task.getName().split("__")[task.getName().split("__").length - 1], avspec, task.getReferenceObject());
-            if (mc) {
-                block.setFather(top);
-            }
-            taskBlockMap.put(task, block);
-            avspec.addBlock(block);
-        }
+                            //Add aencrypt method
+                            AvatarMethod aencrypt = new AvatarMethod("aencrypt", ae);
+                            block.addAttribute(new AvatarAttribute(ae.securityPattern.name, AvatarType.INTEGER, block, null));
+                            block.addAttribute(new AvatarAttribute("pubKey_" + ae.securityPattern.name, AvatarType.INTEGER, block, null));
+                            block.addAttribute(new AvatarAttribute(ae.securityPattern.name + "_encrypted", AvatarType.INTEGER, block, null));
+                            aencrypt.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
+                            aencrypt.addParameter(block.getAvatarAttributeWithName("pubKey_" + ae.securityPattern.name));
+                            aencrypt.addReturnParameter(block.getAvatarAttributeWithName(ae.securityPattern.name + "_encrypted"));
+                            if (block.getAvatarAttributeWithName("pubKey_" + ae.securityPattern.name) != null && block.getAvatarAttributeWithName(ae.securityPattern.name) != null && block.getAvatarAttributeWithName(ae.securityPattern.name + "_encrypted") != null) {
+                                block.addMethod(aencrypt);
+                                tran.addAction(ae.securityPattern.name + "_encrypted = aencrypt(" + ae.securityPattern.name + ", pubKey_" + ae.securityPattern.name + ")");
+                            }
+                        }
+                        //Set as origin state for authenticity
+                        ae.securityPattern.originTask = block.getName();
+                        ae.securityPattern.state1 = as;
+                    } else if (ae.securityPattern.type.equals("Nonce")) {
+                        //Do nothing except occupy time to forge nonce
 
-        // checkConnections();
-        //	checkChannels();
 
-        //distributeKeys();
+                        //Create a nonce by a random function
+							/*AvatarRandom arandom = new AvatarRandom("randomnonce",ae.getReferenceObject());
+							arandom.setVariable(ae.securityPattern.name);
+							arandom.setValues("0","10");
+							elementList.add(arandom);
+							tran.addNext(arandom);
+							tran = new AvatarTransition(block, "__afterrandom_"+ae.getName(), ae.getReferenceObject());
+							arandom.addNext(tran);
+							elementList.add(tran);
+							block.addAttribute(new AvatarAttribute(ae.securityPattern.name, AvatarType.INTEGER, block, null));*/
+                    } else if (ae.securityPattern.type.equals("Hash")) {
+                        AvatarMethod hash = new AvatarMethod("hash", ae);
+                        hash.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
+                        if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null) {
+                            block.addMethod(hash);
+                        }
+                        tran.addAction(ae.securityPattern.name + "_encrypted = hash(" + ae.securityPattern.name + ")");
+                    } else if (ae.securityPattern.type.equals("MAC")) {
+                        block.addAttribute(new AvatarAttribute(ae.securityPattern.name, AvatarType.INTEGER, block, null));
+                        block.addAttribute(new AvatarAttribute("key_" + ae.securityPattern.name, AvatarType.INTEGER, block, null));
+                        block.addAttribute(new AvatarAttribute(ae.securityPattern.name + "_encrypted", AvatarType.INTEGER, block, null)); //msg + mac(msg)
+                        if (!ae.securityPattern.nonce.isEmpty()) {
+                            //Add nonce
 
-        //TraceManager.addDev("ALL KEYS " + accessKeys);
-			/*for (TMLTask t: accessKeys.keySet()){
-				TraceManager.addDev("TASK " +t.getName());
-				for (SecurityPattern sp: accessKeys.get(t)){
-					TraceManager.addDev(sp.name);
-				}
-			}*/
+                            //Add concat2 method
+                            AvatarMethod concat = new AvatarMethod("concat2", ae);
+                            concat.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
+                            concat.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.nonce));
+                            concat.addReturnParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
+                            if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null && block.getAvatarAttributeWithName(ae.securityPattern.nonce) != null) {
+                                block.addMethod(concat);
+                                tran.addAction(ae.securityPattern.name + "=concat2(" + ae.securityPattern.name + "," + ae.securityPattern.nonce + ")");
+                            }
+                        }
+
+                        //Create MAC method
+                        AvatarMethod mac = new AvatarMethod("MAC", ae);
+                        AvatarAttribute macattr = new AvatarAttribute(ae.securityPattern.name + "_mac", AvatarType.INTEGER, block, null);
+                        block.addAttribute(macattr);
+
+
+                        mac.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
+                        mac.addParameter(block.getAvatarAttributeWithName("key_" + ae.securityPattern.name));
+                        mac.addReturnParameter(macattr);
+
+                        if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null && block.getAvatarAttributeWithName("key_" + ae.securityPattern.name) != null) {
+                            block.addMethod(mac);
+                            tran.addAction(ae.securityPattern.name + "_mac = MAC(" + ae.securityPattern.name + ",key_" + ae.securityPattern.name + ")");
+                        }
+
+                        //Concatenate msg and mac(msg)
+
+                        //Create concat2 method
+                        AvatarMethod concat = new AvatarMethod("concat2", ae);
+                        concat.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
+                        concat.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name + "_mac"));
+                        concat.addReturnParameter(block.getAvatarAttributeWithName(ae.securityPattern.name + "_encrypted"));
+                        //concat.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.));
+                        if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null && block.getAvatarAttributeWithName(ae.securityPattern.name + "_encrypted") != null) {
+                            block.addMethod(concat);
+                            tran.addAction(ae.securityPattern.name + "_encrypted = concat2(" + ae.securityPattern.name + "," + ae.securityPattern.name + "_mac)");
+                        }
+                        ae.securityPattern.originTask = block.getName();
+                        ae.securityPattern.state1 = as;
+                    }
+                    //Set attributestate for authenticity
+                    if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null) {
+                        AvatarAttributeState authOrigin = new AvatarAttributeState(block.getName() + "." + as.getName() + "." + ae.securityPattern.name, ae.getReferenceObject(), block.getAvatarAttributeWithName(ae.securityPattern.name), as);
+                        signalAuthOriginMap.put(ae.securityPattern.name, authOrigin);
+                    }
+
+                } else if (ae.securityPattern != null && ae.getName().contains("decrypt")) {
+                    //Decryption action
+                    //block.addAttribute(new AvatarAttribute(ae.securityPattern.name, AvatarType.INTEGER, block, null));
+                    //block.addAttribute(new AvatarAttribute(ae.securityPattern.name+"_encrypted", AvatarType.INTEGER, block, null));
+                    if (ae.securityPattern.type.equals("Symmetric Encryption")) {
+                        if (!ae.securityPattern.key.isEmpty()) {
+                            //Decrypting a key
+                            //Add sdecrypt method
+                            AvatarMethod sdecrypt = new AvatarMethod("sdecrypt", ae);
+                            block.addAttribute(new AvatarAttribute("key_" + ae.securityPattern.key, AvatarType.INTEGER, block, null));
+                            block.addAttribute(new AvatarAttribute("key_" + ae.securityPattern.name, AvatarType.INTEGER, block, null));
+                            block.addAttribute(new AvatarAttribute("encryptedKey_" + ae.securityPattern.key, AvatarType.INTEGER, block, null));
+
+                            sdecrypt.addParameter(block.getAvatarAttributeWithName("encryptedKey_" + ae.securityPattern.key));
+                            sdecrypt.addParameter(block.getAvatarAttributeWithName("key_" + ae.securityPattern.name));
+                            sdecrypt.addReturnParameter(block.getAvatarAttributeWithName("key_" + ae.securityPattern.key));
+                            if (block.getAvatarAttributeWithName("key_" + ae.securityPattern.key) != null && block.getAvatarAttributeWithName("key_" + ae.securityPattern.name) != null && block.getAvatarAttributeWithName("encryptedKey_" + ae.securityPattern.key) != null) {
+                                block.addMethod(sdecrypt);
+                                tran.addAction("key_" + ae.securityPattern.key + " = sdecrypt(encryptedKey_" + ae.securityPattern.key + ", key_" + ae.securityPattern.name + ")");
+                            }
+                        } else {
+                            //Decrypting data
+                            AvatarMethod sdecrypt = new AvatarMethod("sdecrypt", ae);
+                            block.addAttribute(new AvatarAttribute(ae.securityPattern.name, AvatarType.INTEGER, block, null));
+                            block.addAttribute(new AvatarAttribute("key_" + ae.securityPattern.name, AvatarType.INTEGER, block, null));
+                            block.addAttribute(new AvatarAttribute(ae.securityPattern.name + "_encrypted", AvatarType.INTEGER, block, null));
+
+                            sdecrypt.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name + "_encrypted"));
+                            sdecrypt.addParameter(block.getAvatarAttributeWithName("key_" + ae.securityPattern.name));
+                            sdecrypt.addReturnParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
+                            if (block.getAvatarAttributeWithName(ae.securityPattern.name + "_encrypted") != null && block.getAvatarAttributeWithName("key_" + ae.securityPattern.name) != null && block.getAvatarAttributeWithName(ae.securityPattern.name) != null) {
+                                block.addMethod(sdecrypt);
+                                tran.addAction(ae.securityPattern.name + " = sdecrypt(" + ae.securityPattern.name + "_encrypted, key_" + ae.securityPattern.name + ")");
+                            }
+                        }
+                        if (!ae.securityPattern.nonce.isEmpty()) {
+                            //Separate out the nonce
+                            block.addAttribute(new AvatarAttribute("testnonce_" + ae.securityPattern.nonce, AvatarType.INTEGER, block, null));
+                            //Add get2 method
+                            AvatarMethod get2 = new AvatarMethod("get2", ae);
+                            get2.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
+                            get2.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
+                            get2.addParameter(block.getAvatarAttributeWithName("testnonce_" + ae.securityPattern.nonce));
+                            if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null && block.getAvatarAttributeWithName("testnonce_" + ae.securityPattern.nonce) != null) {
+                                block.addMethod(get2);
+                                tran.addAction("get2(" + ae.securityPattern.name + "," + ae.securityPattern.name + ",testnonce_" + ae.securityPattern.nonce + ")");
+                            }
+
+                            //Add state after get2 statement
+                            AvatarState guardState = new AvatarState(ae.getName().replaceAll(" ", "") + "_guarded", ae.getReferenceObject());
+                            tran.addNext(guardState);
+                            tran = new AvatarTransition(block, "__guard_" + ae.getName(), ae.getReferenceObject());
+                            guardState.addNext(tran);
+                            elementList.add(guardState);
+                            elementList.add(tran);
+
+                            //Guard transition to determine if nonce matches
+                            tran.setGuard("testnonce_" + ae.securityPattern.nonce + "==" + ae.securityPattern.nonce);
+                        }
+                        //Add a dummy state afterwards for authenticity after decrypting the data
+                        AvatarState dummy = new AvatarState(ae.getName().replaceAll(" ", "") + "_dummy", ae.getReferenceObject());
+                        ae.securityPattern.state2 = dummy;
+                        tran.addNext(dummy);
+                        tran = new AvatarTransition(block, "__after_" + ae.getName(), ae.getReferenceObject());
+                        dummy.addNext(tran);
+                        elementList.add(dummy);
+                        elementList.add(tran);
+                        if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null) {
+                            AvatarAttributeState authDest = new AvatarAttributeState(block.getName() + "." + dummy.getName() + "." + ae.securityPattern.name, ae.getReferenceObject(), block.getAvatarAttributeWithName(ae.securityPattern.name), dummy);
+                            signalAuthDestMap.put(ae.securityPattern.name, authDest);
+                        }
+                    } else if (ae.securityPattern.type.equals("Asymmetric Encryption")) {
+                        AvatarMethod adecrypt = new AvatarMethod("adecrypt", ae);
 
-        for (TMLTask task : tasks) {
+                        if (!ae.securityPattern.key.isEmpty()) {
+                            //Decrypting key
 
-            AvatarBlock block = taskBlockMap.get(task);
-            //Add temp variable for unsendable signals
 
-            //Add all signals
-            for (TMLChannel chan : tmlmodel.getChannels(task)) {
-                if (chan.hasOriginTask(task)) {
-                    AvatarSignal sig = new AvatarSignal(chan.getOriginPort().getName(), AvatarSignal.OUT, chan.getReferenceObject());
+                            //Add adecrypt method
+                            block.addAttribute(new AvatarAttribute("encryptedKey_" + ae.securityPattern.key, AvatarType.INTEGER, block, null));
+                            block.addAttribute(new AvatarAttribute("privKey_" + ae.securityPattern.name, AvatarType.INTEGER, block, null));
+                            block.addAttribute(new AvatarAttribute("key_" + ae.securityPattern.key, AvatarType.INTEGER, block, null));
 
-                    block.addSignal(sig);
-                    signals.add(sig);
-                    AvatarAttribute channelData = new AvatarAttribute(chan.getOriginPort().getName() + "_chData", AvatarType.INTEGER, block, null);
-                    if (block.getAvatarAttributeWithName(chan.getOriginPort().getName() + "_chData") == null) {
-                        block.addAttribute(channelData);
-                    }
-                    //sig.addParameter(channelData);
-                    signalOutMap.put(chan.getName(), sig);
+                            adecrypt.addParameter(block.getAvatarAttributeWithName("encryptedKey_" + ae.securityPattern.key));
+                            adecrypt.addParameter(block.getAvatarAttributeWithName("privKey_" + ae.securityPattern.name));
+                            adecrypt.addReturnParameter(block.getAvatarAttributeWithName("key_" + ae.securityPattern.key));
 
-                } else if (chan.hasDestinationTask(task)) {
+                            if (block.getAvatarAttributeWithName("encryptedKey_" + ae.securityPattern.key) != null && block.getAvatarAttributeWithName("privKey_" + ae.securityPattern.name) != null && block.getAvatarAttributeWithName("key_" + ae.securityPattern.key) != null) {
+                                block.addMethod(adecrypt);
+                                tran.addAction("key_" + ae.securityPattern.key + " = adecrypt(encryptedKey_" + ae.securityPattern.key + ", privKey_" + ae.securityPattern.name + ")");
+                            }
+                        } else {
+                            //Decrypting data
 
-                    AvatarSignal sig = new AvatarSignal(chan.getDestinationPort().getName(), AvatarSignal.IN, chan.getReferenceObject());
-                    block.addSignal(sig);
-                    signals.add(sig);
-                    signalInMap.put(chan.getName(), sig);
-                    AvatarAttribute channelData = new AvatarAttribute(getName(chan.getName()) + "_chData", AvatarType.INTEGER, block, null);
-                    if (block.getAvatarAttributeWithName(getName(chan.getName()) + "_chData") == null) {
-                        block.addAttribute(channelData);
-                    }
-                    //sig.addParameter(channelData);
-                }
-            }
-            AvatarAttribute tmp = new AvatarAttribute("tmp", AvatarType.INTEGER, block, null);
-            block.addAttribute(tmp);
+                            //Add adecrypt method
+                            block.addAttribute(new AvatarAttribute(ae.securityPattern.name + "_encrypted", AvatarType.INTEGER, block, null));
+                            block.addAttribute(new AvatarAttribute(ae.securityPattern.name, AvatarType.INTEGER, block, null));
+                            block.addAttribute(new AvatarAttribute("privKey_" + ae.securityPattern.name, AvatarType.INTEGER, block, null));
 
-				/*   tmp = new AvatarAttribute("aliceandbob", AvatarType.INTEGER, block, null);
-				     block.addAttribute(tmp);
-				     tmp = new AvatarAttribute("aliceandbob_encrypted", AvatarType.INTEGER, block, null);
-				     block.addAttribute(tmp);*/
+                            adecrypt.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name + "_encrypted"));
+                            adecrypt.addParameter(block.getAvatarAttributeWithName("privKey_" + ae.securityPattern.name));
+                            adecrypt.addReturnParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
+                            if (block.getAvatarAttributeWithName(ae.securityPattern.name + "_encrypted") != null && block.getAvatarAttributeWithName("privKey_" + ae.securityPattern.name) != null && block.getAvatarAttributeWithName(ae.securityPattern.name) != null) {
+                                block.addMethod(adecrypt);
+                                tran.addAction(ae.securityPattern.name + " = adecrypt(" + ae.securityPattern.name + "_encrypted, privKey_" + ae.securityPattern.name + ")");
+                            }
+                        }
+                        if (!ae.securityPattern.nonce.isEmpty()) {
+                            block.addAttribute(new AvatarAttribute("testnonce_" + ae.securityPattern.nonce, AvatarType.INTEGER, block, null));
+                            AvatarMethod get2 = new AvatarMethod("get2", ae);
+                            get2.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
+                            get2.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
+                            get2.addParameter(block.getAvatarAttributeWithName("testnonce_" + ae.securityPattern.nonce));
+                            if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null && block.getAvatarAttributeWithName(ae.securityPattern.name) != null) {
+                                block.addMethod(get2);
+                            }
 
-            AvatarAttribute loop_index = new AvatarAttribute("loop_index", AvatarType.INTEGER, block, null);
-            block.addAttribute(loop_index);
+                            tran.addAction("get2(" + ae.securityPattern.name + "," + ae.securityPattern.name + ",testnonce_" + ae.securityPattern.nonce + ")");
+                            AvatarState guardState = new AvatarState(ae.getName().replaceAll(" ", "") + "_guarded", ae.getReferenceObject());
+                            tran.addNext(guardState);
+                            tran = new AvatarTransition(block, "__guard_" + ae.getName(), ae.getReferenceObject());
+                            elementList.add(guardState);
+                            elementList.add(tran);
+                            guardState.addNext(tran);
+                            tran.setGuard("testnonce_" + ae.securityPattern.nonce + "==" + ae.securityPattern.nonce);
+                        }
+                        AvatarState dummy = new AvatarState(ae.getName().replaceAll(" ", "") + "_dummy", ae.getReferenceObject());
+                        tran.addNext(dummy);
+                        tran = new AvatarTransition(block, "__after_" + ae.getName(), ae.getReferenceObject());
+                        dummy.addNext(tran);
+                        elementList.add(dummy);
+                        elementList.add(tran);
+                        ae.securityPattern.state2 = dummy;
+                        if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null) {
+                            AvatarAttributeState authDest = new AvatarAttributeState(block.getName() + "." + dummy.getName() + "." + ae.securityPattern.name, ae.getReferenceObject(), block.getAvatarAttributeWithName(ae.securityPattern.name), dummy);
+                            signalAuthDestMap.put(ae.securityPattern.name, authDest);
+                        }
+                    } else if (ae.securityPattern.type.equals("MAC")) {
+                        //Separate MAC from MSG
 
-            for (TMLAttribute attr : task.getAttributes()) {
-                AvatarType type;
-                if (attr.getType().getType() == TMLType.NATURAL) {
-                    type = AvatarType.INTEGER;
-                } else if (attr.getType().getType() == TMLType.BOOLEAN) {
-                    type = AvatarType.BOOLEAN;
-                } else {
-                    type = AvatarType.UNDEFINED;
-                }
-                AvatarAttribute avattr = new AvatarAttribute(attr.getName(), type, block, null);
-                avattr.setInitialValue(attr.getInitialValue());
-                block.addAttribute(avattr);
-            }
-            //AvatarTransition last;
-            AvatarStateMachine asm = block.getStateMachine();
+                        //Add get2 method
+                        AvatarMethod get2 = new AvatarMethod("get2", ae);
+                        AvatarAttribute mac = new AvatarAttribute(ae.securityPattern.name + "_mac", AvatarType.INTEGER, block, null);
+                        block.addAttribute(mac);
+                        block.addAttribute(new AvatarAttribute(ae.securityPattern.name + "_encrypted", AvatarType.INTEGER, block, null));
+                        block.addAttribute(new AvatarAttribute(ae.securityPattern.name, AvatarType.INTEGER, block, null));
 
-            //TODO: Create a fork with many requests. This looks terrible
-            if (tmlmodel.getRequestToMe(task) != null) {
-                //Create iteration attribute
-                AvatarAttribute req_loop_index = new AvatarAttribute("req_loop_index", AvatarType.INTEGER, block, null);
-                block.addAttribute(req_loop_index);
+                        get2.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name + "_encrypted"));
+                        get2.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
+                        get2.addParameter(mac);
+                        if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null && block.getAvatarAttributeWithName(ae.securityPattern.name + "_encrypted") != null) {
+                            block.addMethod(get2);
+                            tran.addAction("get2(" + ae.securityPattern.name + "_encrypted," + ae.securityPattern.name + "," + ae.securityPattern.name + "_mac)");
+                        }
 
-                //TMLRequest request= tmlmodel.getRequestToMe(task);
-                //Oh this is fun...let's restructure the state machine
-                //Create own start state, and ignore the returned one
-                List<AvatarStateMachineElement> elementList = translateState(task.getActivityDiagram().get(0), block);
-                AvatarStartState ss = new AvatarStartState("start", task.getActivityDiagram().get(0).getReferenceObject());
-                asm.addElement(ss);
-                AvatarTransition at = new AvatarTransition(block, "__after_start", task.getActivityDiagram().get(0).getReferenceObject());
-                at.addAction(AvatarTerm.createActionFromString(block, "req_loop_index = 0"));
-                ss.addNext(at);
-                asm.addElement(at);
+                        //Add verifymac method
+                        AvatarMethod verifymac = new AvatarMethod("verifyMAC", ae);
+                        block.addAttribute(new AvatarAttribute("testnonce_" + ae.securityPattern.name, AvatarType.BOOLEAN, block, null));
 
-                AvatarState loopstart = new AvatarState("loopstart", task.getActivityDiagram().get(0).getReferenceObject());
-                at.addNext(loopstart);
-                asm.addElement(loopstart);
+                        verifymac.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name));
+                        verifymac.addParameter(block.getAvatarAttributeWithName("key_" + ae.securityPattern.name));
+                        verifymac.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name + "_mac"));
+                        verifymac.addReturnParameter(block.getAvatarAttributeWithName("testnonce_" + ae.securityPattern.name));
 
-                //Find the original start state, transition, and next element
-                AvatarStateMachineElement start = elementList.get(0);
-                AvatarStateMachineElement startTran = start.getNext(0);
-                AvatarStateMachineElement newStart = startTran.getNext(0);
-                elementList.remove(start);
-                elementList.remove(startTran);
-                //Find every stop state, remove them, reroute transitions to them
-                //For now, route every transition to stop state to remove the loop on requests 
+                        if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null && block.getAvatarAttributeWithName("key_" + ae.securityPattern.name) != null) {
+                            block.addMethod(verifymac);
+                            tran.addAction("testnonce_" + ae.securityPattern.name + "=verifyMAC(" + ae.securityPattern.name + ", key_" + ae.securityPattern.name + "," + ae.securityPattern.name + "_mac)");
 
-                for (AvatarStateMachineElement e : elementList) {
-                    e.setName(processName(e.getName(), e.getID()));
-                    stateObjectMap.put(task.getName().split("__")[1] + "__" + e.getName(), e.getReferenceObject());
+                        }
 
-                    if (e instanceof AvatarStopState) {
-                        //ignore it
-                    } else {
-                        for (int i = 0; i < e.getNexts().size(); i++) {
-                            if (e.getNext(i) instanceof AvatarStopState) {
-                                e.removeNext(i);
-                                //Route it back to the loop start
-                                e.addNext(loopstart);
-                            }
+
+                        if (!ae.securityPattern.nonce.isEmpty()) {
+                            block.addAttribute(new AvatarAttribute("testnonce_" + ae.securityPattern.nonce, AvatarType.INTEGER, block, null));
+                            tran.addAction("get2(" + ae.securityPattern.name + "," + ae.securityPattern.name + ",testnonce_" + ae.securityPattern.nonce + ")");
                         }
-                        asm.addElement(e);
-                    }
-                }
 
-                //Create exit after # of loop iterations is maxed out
-                /*AvatarStopState stop =*/
-                new AvatarStopState("stop", task.getActivityDiagram().get(0).getReferenceObject());
-                /*AvatarTransition exitTran = */
-                new AvatarTransition(block, "to_stop", task.getActivityDiagram().get(0).getReferenceObject());
+                        AvatarState guardState = new AvatarState(ae.getName().replaceAll(" ", "") + "_guarded", ae.getReferenceObject());
+                        tran.addNext(guardState);
+                        tran = new AvatarTransition(block, "__guard_" + ae.getName(), ae.getReferenceObject());
+                        elementList.add(guardState);
+                        elementList.add(tran);
+                        guardState.addNext(tran);
+                        tran.setGuard("testnonce_" + ae.securityPattern.name);
 
+                        if (!ae.securityPattern.nonce.isEmpty()) {
 
-                //Add Requests, direct transition to start of state machine
-                for (Object obj : tmlmodel.getRequestsToMe(task)) {
-                    TMLRequest req = (TMLRequest) obj;
-                    AvatarTransition incrTran = new AvatarTransition(block, "__after_loopstart__" + req.getName(), task.getActivityDiagram().get(0).getReferenceObject());
-                    incrTran.addAction(AvatarTerm.createActionFromString(block, "req_loop_index = req_loop_index + 1"));
-                    incrTran.setGuard(AvatarGuard.createFromString(block, "req_loop_index != " + loopLimit));
-                    asm.addElement(incrTran);
-                    loopstart.addNext(incrTran);
-                    AvatarSignal sig;
-                    if (!signalInMap.containsKey(req.getName())) {
-                        sig = new AvatarSignal(getName(req.getName()), AvatarSignal.IN, req.getReferenceObject());
-                        block.addSignal(sig);
-                        signals.add(sig);
-                        signalInMap.put(req.getName(), sig);
-                    } else {
-                        sig = signalInMap.get(req.getName());
-                    }
-                    AvatarActionOnSignal as = new AvatarActionOnSignal("getRequest__" + req.getName(), sig, req.getReferenceObject());
-                    incrTran.addNext(as);
-                    asm.addElement(as);
-						/*as.addValue(req.getName()+"__reqData");
-						AvatarAttribute requestData= new AvatarAttribute(req.getName()+"__reqData", AvatarType.INTEGER, block, null);
-						block.addAttribute(requestData);*/
-                    for (int i = 0; i < req.getNbOfParams(); i++) {
-                        if (block.getAvatarAttributeWithName(req.getParam(i)) == null) {
-                            //Throw Error
-                            as.addValue("tmp");
-                        } else {
-                            sig.addParameter(block.getAvatarAttributeWithName(req.getParam(i)));
-                            as.addValue(req.getParam(i));
-                        }
-                    }
-                    AvatarTransition tran = new AvatarTransition(block, "__after_" + req.getName(), task.getActivityDiagram().get(0).getReferenceObject());
-                    as.addNext(tran);
-                    asm.addElement(tran);
-                    tran.addNext(newStart);
-						/*if (req.checkAuth){
-							AvatarState afterSignalState = new AvatarState("aftersignalstate_"+req.getName().replaceAll(" ","")+"_"+req.getName().replaceAll(" ",""),req.getReferenceObject());
-							AvatarTransition afterSignalTran = new AvatarTransition(block, "__aftersignalstate_"+req.getName(), req.getReferenceObject());
-							tran.addNext(afterSignalState);
-							afterSignalState.addNext(afterSignalTran);
-							asm.addElement(afterSignalState);
-							asm.addElement(afterSignalTran);
-							afterSignalTran.addNext(newStart);
-							AvatarAttributeState authDest = new AvatarAttributeState(block.getName()+"."+afterSignalState.getName()+"."+requestData.getName(),obj,requestData, afterSignalState);
-							signalAuthDestMap.put(req.getName(), authDest);
-						}  
-						else {
-							tran.addNext(newStart);
-						}*/
+                            //Add extra state and transition
 
-                }
+                            AvatarState guardState2 = new AvatarState(ae.getName().replaceAll(" ", "") + "_guarded2", ae.getReferenceObject());
+                            tran.addNext(guardState2);
+                            tran = new AvatarTransition(block, "__guard_" + ae.getName(), ae.getReferenceObject());
+                            tran.setGuard("testnonce_" + ae.securityPattern.nonce + "==" + ae.securityPattern.nonce);
+                            elementList.add(guardState2);
+                            elementList.add(tran);
+
+                            guardState2.addNext(tran);
+                        }
+                        AvatarState dummy = new AvatarState(ae.getName().replaceAll(" ", "") + "_dummy", ae.getReferenceObject());
+                        ae.securityPattern.state2 = dummy;
+                        tran.addNext(dummy);
+                        elementList.add(tran);
+                        tran = new AvatarTransition(block, "__after_" + ae.getName(), ae.getReferenceObject());
+                        dummy.addNext(tran);
+                        elementList.add(dummy);
+                        elementList.add(tran);
 
+                        if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null) {
+                            AvatarAttributeState authDest = new AvatarAttributeState(block.getName() + "." + dummy.getName() + "." + ae.securityPattern.name, ae.getReferenceObject(), block.getAvatarAttributeWithName(ae.securityPattern.name), dummy);
+                            signalAuthDestMap.put(ae.securityPattern.name, authDest);
+                        }
+                    }
 
-                asm.setStartState(ss);
 
-            } else {
-                //Not requested
-                List<AvatarStateMachineElement> elementList = translateState(task.getActivityDiagram().get(0), block);
-                for (AvatarStateMachineElement e : elementList) {
-                    e.setName(processName(e.getName(), e.getID()));
-                    asm.addElement(e);
-                    stateObjectMap.put(task.getName().split("__")[1] + "__" + e.getName(), e.getReferenceObject());
+                    //Can't decrypt hash or nonce
                 }
-                asm.setStartState((AvatarStartState) elementList.get(0));
-            }
-            for (SecurityPattern secPattern : secPatterns) {
-                AvatarAttribute sec = block.getAvatarAttributeWithName(secPattern.name);
-                if (sec != null) {
-                    //sec = new AvatarAttribute(secPattern.name, AvatarType.INTEGER, block, null);
-                    //AvatarAttribute enc = new AvatarAttribute(secPattern.name+"_encrypted", AvatarType.INTEGER, block, null);
-                    //	block.addAttribute(sec);
-                    //	block.addAttribute(enc);
-                    //}
-                    avspec.addPragma(new AvatarPragmaSecret("#Confidentiality " + block.getName() + "." + secPattern.name, null, sec));
+            } else {
+                // See if action.
+                if (ae instanceof TMLActionState) {
+                    String val = ((TMLActionState) ae).getAction();
+                    tran.addAction(val);
                 }
-            }
 
-        }
+            }
+        } else if (ae instanceof TMLActivityElementWithIntervalAction) {
+            AvatarState as = new AvatarState(ae.getName().replaceAll(" ", ""), ae.getReferenceObject());
+            tran = new AvatarTransition(block, "__after_" + ae.getName(), ae.getReferenceObject());
+            as.addNext(tran);
+            elementList.add(as);
+            elementList.add(tran);
 
+        } else if (ae instanceof TMLActivityElementChannel) {
+            TMLActivityElementChannel aec = (TMLActivityElementChannel) ae;
+            TMLChannel ch = aec.getChannel(0);
+            AvatarSignal sig;
 
-        //Add authenticity pragmas
-        for (String s : signalAuthOriginMap.keySet()) {
-            if (signalAuthDestMap.containsKey(s)) {
-                AvatarPragmaAuthenticity pragma = new AvatarPragmaAuthenticity("#Authenticity " + signalAuthOriginMap.get(s).getName() + " " + signalAuthDestMap.get(s).getName(), signalAuthOriginMap.get(s).getReferenceObject(), signalAuthOriginMap.get(s), signalAuthDestMap.get(s));
-                if (secChannelMap.containsKey(s)) {
-                    for (String channel : secChannelMap.get(s)) {
-                        TMLChannel ch = tmlmodel.getChannelByShortName(channel);
-                        if (ch != null) {
-                            if (ch.checkAuth) {
-                                avspec.addPragma(pragma);
-                                break;
-                            }
-                        }
-                    }
+            String nv = getName(ch.getName()) + "_chData";
+            block.addIntAttributeIfApplicable(nv);
 
-                } else {
-                    avspec.addPragma(pragma);
-                }
+            boolean checkAcc = false;
+            if (ae.getReferenceObject() != null) {
+                checkAcc = ((TGComponent) ae.getReferenceObject()).getCheckableAccessibility();
             }
-        }
+            boolean checked = false;
+            if (ae.getReferenceObject() != null) {
+                checked = ((TGComponent) ae.getReferenceObject()).hasCheckedAccessibility();
+            }
+            AvatarState signalState = new AvatarState("signalstate_" + ae.getName().replaceAll(" ", "") + "_" + ch.getName(), ae.getReferenceObject(), checkAcc, checked);
+            AvatarTransition signalTran = new AvatarTransition(block, "__after_signalstate_" + ae.getName() + "_" + ch.getName(), ae.getReferenceObject());
+            AvatarTransition signalTranBefore = new AvatarTransition(block, "__before_signalstateint_" + ae.getName() + "_" + ch.getName(), ae
+                    .getReferenceObject());
+            AvatarState signalStateIntermediate = new AvatarState("signalstateinter_" + ae.getName().replaceAll(" ", "") + "_" + ch.getName(), ae
+                    .getReferenceObject(), checkAcc, checked);
+            AvatarTransition signalTranInit = new AvatarTransition(block, "_init_signalstate_" + ae.getName() + "_" + ch.getName(), ae
+                    .getReferenceObject());
 
-        //Create relations
-        //Channels are ?? to ??
-        //Requests are n to 1
-        //Events are ?? to ??
-        AvatarBlock fifo = new AvatarBlock("FIFO", avspec, null);
-        for (TMLChannel channel : tmlmodel.getChannels()) {
-            // We assume one to one because fork and join have been removed
+            if (ae instanceof TMLReadChannel) {
+                //Create signal if it does not already exist
+                sig = signalInMap.get(ch.getName());
+            } else {
+                sig = signalOutMap.get(ch.getName());
+            }
 
-            if (channel.isBasicChannel()) {
-                TraceManager.addDev("checking channel " + channel.getName());
-                AvatarRelation ar = new AvatarRelation(channel.getName(), taskBlockMap.get(channel.getOriginTask()), taskBlockMap.get(channel.getDestinationTask()), channel.getReferenceObject());
+            AvatarActionOnSignal as = new AvatarActionOnSignal(ae.getName(), sig, ae.getReferenceObject());
+            tran = new AvatarTransition(block, "__after_" + ae.getName(), ae.getReferenceObject());
 
-                if (channel.getType() == TMLChannel.BRBW) {
-                    ar.setAsynchronous(true);
-                    ar.setSizeOfFIFO(channel.getSize());
-                    ar.setBlocking(true);
-                } else if (channel.getType() == TMLChannel.BRNBW) {
-                    ar.setAsynchronous(true);
-                    ar.setSizeOfFIFO(channel.getSize());
-                    ar.setBlocking(false);
-                } else {
-                    //Create new block, hope for best
-                    if (mc) {
-                        fifo = createFifo(channel.getName());
-                        ar.setAsynchronous(false);
-                    }
-                }
-                //Find in signal
+            elementList.add(signalState);
+            elementList.add(signalStateIntermediate);
+            elementList.add(as);
+            elementList.add(tran);
+            elementList.add(signalTranInit);
+            elementList.add(signalTranBefore);
+            elementList.add(signalTran);
 
-                List<AvatarSignal> sig1 = new ArrayList<AvatarSignal>();
-                //Sig1 contains IN Signals, Sig2 contains OUT signals
-                sig1.add(signalInMap.get(channel.getName()));
-                List<AvatarSignal> sig2 = new ArrayList<AvatarSignal>();
-                sig2.add(signalOutMap.get(channel.getName()));
-                for (AvatarSignal sig : signals) {
-                    if (sig.getInOut() == AvatarSignal.IN) {
-                        String name = sig.getName();
-                        if (name.equals(getName(channel.getName()))) {
-                            //			sig1.add(sig);
-                        }
-                    }
-                }
-                //Find out signal
-                for (AvatarSignal sig : signals) {
-                    if (sig.getInOut() == AvatarSignal.OUT) {
-                        String name = sig.getName();
-                        if (name.equals(channel.getOriginPort().getName())) {
-                            //				sig2.add(sig);
-                        }
-                    }
-                }
-                TraceManager.addDev("size " + sig1.size() + " " + sig2.size());
+            signalState.addNext(signalTranInit);
+            signalTranInit.addAction(ch.getName() + "_chData = 0");
+            signalTranInit.addNext(signalStateIntermediate);
+            signalStateIntermediate.addNext(signalTran);
+            signalTran.setGuard(ch.getName() + "_chData < (" + aec.getNbOfSamples() + ")");
+            signalTran.addNext(as);
+            as.addNext(signalTranBefore);
+            signalTranBefore.addAction(ch.getName() + "_chData = " + ch.getName() + "_chData + 1 ");
+            signalTranBefore.addNext(signalStateIntermediate);
 
-                if (sig1.size() == 0) {
-                    sig1.add(new AvatarSignal(getName(channel.getName()), AvatarSignal.IN, null));
-                }
+            signalStateIntermediate.addNext(tran);
+            tran.setGuard("else");
 
-                if (sig2.size() == 0) {
-                    sig2.add(new AvatarSignal(getName(channel.getName()), AvatarSignal.OUT, null));
-                }
 
-                if (sig1.size() == 1 && sig2.size() == 1) {
-                    if (channel.getType() == TMLChannel.NBRNBW && mc) {
-                        AvatarSignal read = fifo.getSignalByName("readSignal");
 
-                        ar.block2 = fifo;
-                        //Set IN signal with read
-                        ar.addSignals(sig1.get(0), read);
-                        AvatarRelation ar2 = new AvatarRelation(channel.getName() + "2", fifo, taskBlockMap.get(channel.getDestinationTask()), channel.getReferenceObject());
-                        AvatarSignal write = fifo.getSignalByName("writeSignal");
-                        //set OUT signal with write
-                        ar2.addSignals(write, sig2.get(0));
-                        //		System.out.println("Set " + sig2.get(0) + " and write");
-                        ar2.setAsynchronous(false);
-                        avspec.addRelation(ar2);
-                    } else {
-                        ar.addSignals(sig2.get(0), sig1.get(0));
-                    }
-                } else {
-                    //Create relation if it does not exist
-                    if (top.getSignalByName(getName(channel.getName()) + "in") == null) {
-                        AvatarRelation relation = new AvatarRelation(channel.getName(), top, top, channel.getReferenceObject());
-                        AvatarSignal s1 = new AvatarSignal(getName(channel.getName()) + "in", AvatarSignal.IN, null);
-                        AvatarSignal s2 = new AvatarSignal(getName(channel.getName()) + "out", AvatarSignal.OUT, null);
-                        top.addSignal(s1);
-                        top.addSignal(s2);
-                        relation.addSignals(s2, s1);
-                        avspec.addRelation(relation);
-                        //	System.out.println("Failure to match signals for TMLChannel "+ channel.getName());
-                    }
-                }
-                avspec.addRelation(ar);
-            } else {
-                //System.out.println("WTF Found non-basic channel");
-                //If not a basic channel, create a relation between TOP block and itself
-                AvatarRelation relation = new AvatarRelation(channel.getName(), top, top, channel.getReferenceObject());
-                AvatarSignal s1 = new AvatarSignal(getName(channel.getName()) + "in", AvatarSignal.IN, null);
-                AvatarSignal s2 = new AvatarSignal(getName(channel.getName()) + "out", AvatarSignal.OUT, null);
-                top.addSignal(s1);
-                top.addSignal(s2);
-                relation.addSignals(s2, s1);
-                avspec.addRelation(relation);
-                for (TMLTask t1 : channel.getOriginTasks()) {
-                    for (TMLTask t2 : channel.getDestinationTasks()) {
-                        AvatarRelation ar = new AvatarRelation(channel.getName(), taskBlockMap.get(t1), taskBlockMap.get(t2), channel.getReferenceObject());
-                        ar.setPrivate(originDestMap.get(t1.getName() + "__" + t2.getName()) == 1);
-                        //Find in signal
-                        List<AvatarSignal> sig1 = new ArrayList<AvatarSignal>();
-                        List<AvatarSignal> sig2 = new ArrayList<AvatarSignal>();
-                        for (AvatarSignal sig : signals) {
-                            if (sig.getInOut() == AvatarSignal.IN) {
-                                String name = sig.getName();
-                                if (name.equals(getName(channel.getName()))) {
-                                    sig1.add(sig);
-                                }
-                            }
-                        }
-                        //Find out signal
-                        for (AvatarSignal sig : signals) {
-                            if (sig.getInOut() == AvatarSignal.OUT) {
-                                String name = sig.getName();
-                                if (name.equals(getName(channel.getName()))) {
-                                    sig2.add(sig);
-                                }
-                            }
-                        }
-                        if (sig1.size() == 0) {
-                            sig1.add(new AvatarSignal(getName(channel.getName()), AvatarSignal.IN, null));
-                        }
-                        if (sig2.size() == 0) {
-                            sig2.add(new AvatarSignal(getName(channel.getName()), AvatarSignal.OUT, null));
-                        }
-                        if (sig1.size() == 1 && sig2.size() == 1) {
-                            ar.addSignals(sig2.get(0), sig1.get(0));
-                        } else {
-                            System.out.println("Failure to match signals for TMLChannel " + channel.getName() + " between " + t1.getName() + " and " + t2.getName());
+        } else if (ae instanceof TMLForLoop) {
+            TMLForLoop loop = (TMLForLoop) ae;
+            if (loop.isInfinite()) {
+                //Make initializaton, then choice state with transitions
+                List<AvatarStateMachineElement> elements = translateState(ae.getNextElement(0), block);
+                /*List<AvatarStateMachineElement> afterloop =*/
+                translateState(ae.getNextElement(1), block);
+                AvatarState initState = new AvatarState(ae.getName().replaceAll(" ", "") + "__init", ae.getReferenceObject());
+                elementList.add(initState);
+                //Build transition to choice
+                tran = new AvatarTransition(block, "loop_init__" + ae.getName(), ae.getReferenceObject());
+                tran.addAction("loop_index=0");
+                elementList.add(tran);
+                initState.addNext(tran);
+                //Choice state
+                AvatarState as = new AvatarState(ae.getName().replaceAll(" ", "") + "__choice", ae.getReferenceObject());
+                elementList.add(as);
+                tran.addNext(as);
+                //transition to first element of loop
+                tran = new AvatarTransition(block, "loop_increment__" + ae.getName(), ae.getReferenceObject());
+                //Set default loop limit guard
+                tran.setGuard(AvatarGuard.createFromString(block, "loop_index != " + loopLimit));
+                //tran.addAction(AvatarTerm.createActionFromString(block, "loop_index = loop_index + 1"));
+                tran.addNext(elements.get(0));
+                as.addNext(tran);
+                elementList.add(tran);
+                //Process elements in loop to remove stop states and empty transitions, and loop back to choice
+                for (AvatarStateMachineElement e : elements) {
+                    if (e instanceof AvatarStopState) {
+                    } else if (e.getNexts().size() == 0) {
+                        if (e instanceof AvatarTransition) {
+                            e.addNext(as);
+                            elementList.add(e);
                         }
-                        avspec.addRelation(ar);
+                    } else if (e.getNext(0) instanceof AvatarStopState) {
+                        //Remove the transition to AvatarStopState
+                        e.removeNext(0);
+                        e.addNext(as);
+                        elementList.add(e);
+                    } else {
+                        elementList.add(e);
                     }
                 }
-            }
-        }
-        for (TMLRequest request : tmlmodel.getRequests()) {
-            for (TMLTask t1 : request.getOriginTasks()) {
-                AvatarRelation ar = new AvatarRelation(request.getName(), taskBlockMap.get(t1), taskBlockMap.get(request.getDestinationTask()), request.getReferenceObject());
-                ar.setPrivate(originDestMap.get(t1.getName() + "__" + request.getDestinationTask().getName()) == 1);
-                List<AvatarSignal> sig1 = new ArrayList<AvatarSignal>();
-                List<AvatarSignal> sig2 = new ArrayList<AvatarSignal>();
-                for (AvatarSignal sig : signals) {
-                    if (sig.getInOut() == AvatarSignal.IN) {
-                        String name = sig.getName();
 
-                        if (name.equals(getName(request.getName()))) {
-                            sig1.add(sig);
-                        }
-                    }
+                //Transition if exiting loop
+                tran = new AvatarTransition(block, "end_loop__" + ae.getName(), ae.getReferenceObject());
+                tran.setGuard(new AvatarGuardElse());
+                as.addNext(tran);
+                AvatarStopState stop = new AvatarStopState("stop", null);
+                tran.addNext(stop);
+                elementList.add(tran);
+                elementList.add(stop);
+                return elementList;
+            } else {
+                //Make initializaton, then choice state with transitions
+                List<AvatarStateMachineElement> elements = translateState(ae.getNextElement(0), block);
+                List<AvatarStateMachineElement> afterloop = translateState(ae.getNextElement(1), block);
+                AvatarState initState = new AvatarState(ae.getName().replaceAll(" ", "") + "__init", ae.getReferenceObject());
+                elementList.add(initState);
+                //Build transition to choice
+                tran = new AvatarTransition(block, "loop_init__" + ae.getName(), ae.getReferenceObject());
+                tran.addAction(AvatarTerm.createActionFromString(block, loop.getInit()));
+                //tran.addAction(AvatarTerm.createActionFromString(block, "loop_index=0"));
+                elementList.add(tran);
+                initState.addNext(tran);
+                //Choice state
+                AvatarState as = new AvatarState(ae.getName().replaceAll(" ", "") + "__choice", ae.getReferenceObject());
+                elementList.add(as);
+                tran.addNext(as);
+                //transition to first element of loop
+                tran = new AvatarTransition(block, "loop_increment__" + ae.getName(), ae.getReferenceObject());
+                //Set default loop limit guard
+                tran.setGuard(AvatarGuard.createFromString(block, loop.getCondition()));
+                /*AvatarGuard guard = */
+                //AvatarGuard.createFromString(block, loop.getCondition());
+                tran.addAction(AvatarTerm.createActionFromString(block, loop.getIncrement()));
+                //tran.addAction(AvatarTerm.createActionFromString(block, "loop_index = loop_index + 1"));
+                if (elements.size() > 0) {
+                    tran.addNext(elements.get(0));
+                    as.addNext(tran);
+                    elementList.add(tran);
                 }
-                //Find out signal
-                for (AvatarSignal sig : signals) {
-                    if (sig.getInOut() == AvatarSignal.OUT) {
-                        String name = sig.getName();
-
-                        if (name.equals(getName(request.getName()))) {
-                            sig2.add(sig);
-                        }
+                //Process elements in loop to remove stop states and empty transitions, and loop back to choice
+                for (AvatarStateMachineElement e : elements) {
+                    if (e instanceof AvatarStopState) {
+                    } else if (e.getNexts().size() == 0) {
+                        e.addNext(as);
+                        elementList.add(e);
+                    } else if (e.getNext(0) instanceof AvatarStopState) {
+                        //Remove the transition to AvatarStopState
+                        e.removeNext(0);
+                        e.addNext(as);
+                        elementList.add(e);
+                    } else {
+                        elementList.add(e);
                     }
                 }
-                if (sig1.size() == 0) {
-                    sig1.add(new AvatarSignal(getName(request.getName()), AvatarSignal.IN, null));
-                }
-                if (sig2.size() == 0) {
-                    sig2.add(new AvatarSignal(getName(request.getName()), AvatarSignal.OUT, null));
-                }
-                if (sig1.size() == 1 && sig2.size() == 1) {
-                    ar.addSignals(sig2.get(0), sig1.get(0));
-                } else {
-                    //Throw error
-                    System.out.println("Could not match for " + request.getName());
-                }
-
-                ar.setAsynchronous(false);
-                avspec.addRelation(ar);
-            }
-        }
-
-        for (TMLEvent event : tmlmodel.getEvents()) {
-
-            TraceManager.addDev("Handling Event:" + event.getName() + " 1:" +  taskBlockMap.get(event.getOriginTask()) + " 2:" +  taskBlockMap.get
-                    (event.getDestinationTask()));
 
-            AvatarRelation ar = new AvatarRelation(event.getName(), taskBlockMap.get(event.getOriginTask()), taskBlockMap.get(event.getDestinationTask()), event.getReferenceObject());
-            //ar.setPrivate(originDestMap.get(event.getOriginTask().getName() + "__" + event.getDestinationTask().getName()) == 1);
-            List<AvatarSignal> sig1 = new ArrayList<AvatarSignal>();
-            List<AvatarSignal> sig2 = new ArrayList<AvatarSignal>();
-            for (AvatarSignal sig : signals) {
-                if (sig.getInOut() == AvatarSignal.IN) {
-                    String name = sig.getName();
-                    if (name.equals(getName(event.getName()))) {
-                        sig1.add(sig);
-                    }
+                //Transition if exiting loop
+                tran = new AvatarTransition(block, "end_loop__" + ae.getName(), ae.getReferenceObject());
+                tran.setGuard(new AvatarGuardElse());
+                as.addNext(tran);
+                if (afterloop.size() == 0) {
+                    afterloop.add(new AvatarStopState("stop", null));
                 }
+                tran.addNext(afterloop.get(0));
+                elementList.add(tran);
+                elementList.addAll(afterloop);
+                return elementList;
             }
-            //Find out signal
-            for (AvatarSignal sig : signals) {
-                if (sig.getInOut() == AvatarSignal.OUT) {
-                    String name = sig.getName();
-                    if (name.equals(getName(event.getName()))) {
-                        sig2.add(sig);
-                    }
+
+        } else if (ae instanceof TMLChoice) {
+            AvatarState as = new AvatarState(ae.getName().replaceAll(" ", ""), ae.getReferenceObject());
+            //Make many choices
+            elementList.add(as);
+            TMLChoice c = (TMLChoice) ae;
+            for (int i = 0; i < c.getNbGuard(); i++) {
+                tran = new AvatarTransition(block, "__after_" + ae.getName() + "_" + i, ae.getReferenceObject());
+                //tran.setGuard(c.getGuard(i));
+                as.addNext(tran);
+                List<AvatarStateMachineElement> nexts = translateState(ae.getNextElement(i), block);
+                if (nexts.size() > 0) {
+                    tran.addNext(nexts.get(0));
+                    elementList.add(tran);
+                    elementList.addAll(nexts);
                 }
             }
-            if (sig1.size() == 0) {
-                sig1.add(new AvatarSignal(getName(event.getName()), AvatarSignal.IN, null));
-            }
-            if (sig2.size() == 0) {
-                sig2.add(new AvatarSignal(getName(event.getName()), AvatarSignal.OUT, null));
-            }
-            if (sig1.size() == 1 && sig2.size() == 1) {
-                ar.addSignals(sig2.get(0), sig1.get(0));
-            } else {
-                //Throw error
-                System.out.println("Could not match for " + event.getName());
-            }
-            if (event.isBlocking()) {
-                ar.setAsynchronous(true);
-                ar.setBlocking(true);
-                ar.setSizeOfFIFO(event.getMaxSize());
-            } else {
-                ar.setAsynchronous(true);
-                ar.setBlocking(false);
-                ar.setSizeOfFIFO(event.getMaxSize());
+            return elementList;
 
+        } else if (ae instanceof TMLSelectEvt) {
+            AvatarState as = new AvatarState(ae.getName().replaceAll(" ", ""), ae.getReferenceObject());
+            elementList.add(as);
+            //Make many choices
+            //TMLSelectEvt c = (TMLSelectEvt) ae;
+            for (int i = 0; i < ae.getNbNext(); i++) {
+                tran = new AvatarTransition(block, "__after_" + ae.getName() + "_" + i, ae.getReferenceObject());
+                as.addNext(tran);
+                List<AvatarStateMachineElement> nexts = translateState(ae.getNextElement(i), block);
+                tran.addNext(nexts.get(0));
+                elementList.add(tran);
+                elementList.addAll(nexts);
             }
-            avspec.addRelation(ar);
+            return elementList;
+        } else {
+            TraceManager.addDev("undefined tml element " + ae);
+        }
+        List<AvatarStateMachineElement> nexts = translateState(ae.getNextElement(0), block);
+        if (nexts.size() == 0) {
+            //in an infinite loop i hope
+            return elementList;
         }
+        tran.addNext(nexts.get(0));
+        elementList.addAll(nexts);
+        return elementList;
+    }
 
-        //	System.out.println("Avatar relations " + avspec.getRelations());
+    public String processName(String name, int id) {
+        name = name.replaceAll("-", "_").replaceAll(" ", "");
+        if (allStates.contains(name)) {
+            return name + id;
 
-        for (AvatarSignal sig : signals) {
-            //	System.out.println("signal " + sig.getName());
-            //check that all signals are put in relations
-            AvatarRelation ar = avspec.getAvatarRelationWithSignal(sig);
-            if (ar == null) {
-                System.out.println("missing relation for " + sig.getName());
-            }
-        }
-        //Check if we matched up all signals
-        for (SecurityPattern sp : symKeys.keySet()) {
-            if (symKeys.get(sp).size() > 1) {
-                String keys = "";
-                for (AvatarAttribute key : symKeys.get(sp)) {
-                    keys = keys + " " + key.getBlock().getName() + "." + key.getName();
-                }
-                avspec.addPragma(new AvatarPragmaInitialKnowledge("#InitialSessionKnowledge " + keys, null, symKeys.get(sp), true));
-            }
+        } else {
+            allStates.add(name);
+            return name;
         }
-        for (SecurityPattern sp : pubKeys.keySet()) {
-            if (pubKeys.get(sp).size() != 0) {
-                String keys = "";
-                List<String> pubKeyNames = new ArrayList<String>();
-                for (AvatarAttribute key : pubKeys.get(sp)) {
-                    if (!pubKeyNames.contains(key.getBlock().getName() + "." + key.getName())) {
-                        keys = keys + " " + key.getBlock().getName() + "." + key.getName();
-                        pubKeyNames.add(key.getBlock().getName() + "." + key.getName());
-                    }
+    }
+		/*	public AvatarPragma generatePragma(String[] s){
+
+			}*/
+
+    public String getName(String s) {
+        //	System.out.println("String " + s);
+        if (nameMap.containsKey(s)) {
+            return nameMap.get(s);
+        } else {
+            if (!s.contains("__")) {
+                nameMap.put(s, s);
+                return s;
+            } else if (s.split("__").length == 1) {
+                nameMap.put(s, s.split("__")[s.split("__").length - 1]);
+                return s.split("__")[s.split("__").length - 1];
+            } else if (s.contains("JOIN") || s.contains("FORK")) {
+                String t = "";
+                t += s.split("__")[0];
+                for (int i = 2; i < s.split("__").length; i++) {
+                    t += "JOIN" + s.split("__")[i];
                 }
-                //	avspec.addPragma(new AvatarPragmaInitialKnowledge("#InitialSessionKnowledge "+keys, null, pubKeys.get(sp),true));
-                //System.out.println("pragma " + keys);
+                nameMap.put(s, t);
+                return t;
+            } else {
+	       /*     String t = "";
+                for (int i = 0; i < s.split("__").length; i++) {
+                    t += s.split("__")[i];
+                }*/
+                nameMap.put(s, s);
+                return s;
+                // nameMap.put(s, s.split("__")[s.split("__").length - 1]);
+                // return s.split("__")[s.split("__").length - 1];
             }
         }
+    }
 
-        tmlmodel.secChannelMap = secChannelMap;
 
-//			System.out.println("avatar spec\n" +avspec);
-        return avspec;
-    }
 
 		/*public void backtraceReachability( Map<AvatarPragmaReachability, ProVerifQueryResult> reachabilityResults) {
 			for (AvatarPragmaReachability pragma: reachabilityResults.keySet())
@@ -1811,11 +1842,26 @@ public class FullTML2Avatar {
         return fifo;
     }
 
+    public String getNameReworked(String name, int index) {
+        String[] split = name.split("__");
+        if (split.length > index) {
+            return split[index];
+        }
+        return name;
+    }
 
-    public AvatarSpecification convertToSecurityType(AvatarSpecification spec) {
-        return spec;
+    public AvatarType getAvatarType(TMLType p) {
+        switch(p.getType()){
+            case TMLType.NATURAL:
+                return AvatarType.INTEGER;
+            case TMLType.BOOLEAN:
+                return AvatarType.BOOLEAN;
+        }
+        return AvatarType.UNDEFINED;
     }
 
+
+
 }
 
 
diff --git a/src/main/java/ui/GTURTLEModeling.java b/src/main/java/ui/GTURTLEModeling.java
index 32813f34dace90f1b005a9bbf63f36dc40a6eb04..82f441c09dd3e211f2db8ef33af8edd1200041a5 100644
--- a/src/main/java/ui/GTURTLEModeling.java
+++ b/src/main/java/ui/GTURTLEModeling.java
@@ -1906,7 +1906,7 @@ public class GTURTLEModeling {
         if (mgui.isExperimentalOn()) {
 
             TraceManager.addDev("Avatar spec:" + avatarspec.toString());
-            mgui.drawAvatarSpecification(avatarspec);
+            //mgui.drawAvatarSpecification(avatarspec);
             //TraceManager.addDev("Avatar spec:" + avatarspec.toString());
             //AvatarSpecification av2 = avatarspec.advancedClone();
             //mgui.drawAvatarSpecification(av2);
@@ -9222,9 +9222,9 @@ public class GTURTLEModeling {
                         for (int i = 0; i < ar.nbOfSignals(); i++) {
                             //TraceManager.addDev("Adding signal relations to connector");
                             //
-                            //TraceManager.addDev("Adding signal 1: " + ar.getSignal1(i).toString() + " of block " + ar.block1.getName());
+                            TraceManager.addDev("Adding signal 1: " + ar.getSignal1(i).toString() + " of block " + ar.block1.getName());
                             conn.addSignal(ar.getSignal1(i).toString(), ar.getSignal1(i).getInOut() == 0, ar.block1.getName().contains(bl1));
-                            //TraceManager.addDev("Adding signal 2:" + ar.getSignal2(i).toString() + " of block " + ar.block2.getName());
+                            TraceManager.addDev("Adding signal 2:" + ar.getSignal2(i).toString() + " of block " + ar.block2.getName());
                             conn.addSignal(ar.getSignal2(i).toString(), ar.getSignal2(i).getInOut() == 0, !ar.block2.getName().contains(bl2));
                             //
                         }