diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLParserState.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLParserState.java
index 87ce814811925d5c912bf608cc3995698964368c..baf065d15b8bb795d3f0feb493317a74217fb7d4 100644
--- a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLParserState.java
+++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLParserState.java
@@ -101,4 +101,7 @@ public class AvatarFromSysMLParserState {
     public void getTransition(int _index) {
         theTransition = theState.getTransition(_index);
     }
+
+    public ArrayList<String> argList;
+
 }
diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java
index 09903a53623ee7a219f3920c3e3dfb2374100910..31b9de2fdb590a221b1863d072573b7dd32ddfcb 100644
--- a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java
+++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java
@@ -430,6 +430,7 @@ public class AvatarFromSysMLSyntax {
         private final int index;
         private String guard;
         private StxSignal signal;
+        private String timer;
         private ArrayList<String> sendPayload;
         private HashMap<String,String> receivePayload;
         private String minDelay;
@@ -463,8 +464,9 @@ public class AvatarFromSysMLSyntax {
         public void setSignal(StxSignal _s) { signal = _s; }
         public void setSendPayload(ArrayList<String> _p) { sendPayload = _p; }
         public void setReceivePayload(HashMap<String,String> _p) { receivePayload = _p; }
-        public void setMinDelay(String _s) { minDelay = _s; }
-        public void setMaxDelay(String _s) { maxDelay = _s; }
+        public void setTimer(String _s) { timer = _s; }
+         public void setMinDelay(String _s) { minDelay = _s; }
+       public void setMaxDelay(String _s) { maxDelay = _s; }
         public void setDelayDistributionLaw(String _s) { delayDistributionLaw = _s; }
         public void setDelayExtraNameA(String _s) { delayExtraNameA = _s; }
         public void setDelayExtraNameB(String _s) { delayExtraNameB = _s; }
@@ -475,6 +477,7 @@ public class AvatarFromSysMLSyntax {
         public byte getType() { return type; }
         public int getIndex() { return index; }
         public String getGuard() { return guard; }
+        public String getTimer() { return timer; }
         public StxSignal getSignal() { return signal; }
         public ArrayList<String> getSendPayload() { return sendPayload; }
         public HashMap<String, String> getReceivePayload() { return receivePayload; }
diff --git a/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup b/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup
index 7a4dae9af5b8d9e7d59963dcb9bd29fd5df3e5e6..045f65aa43a6f047b9922a71173ea90700336597 100644
--- a/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup
+++ b/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup
@@ -1,6 +1,8 @@
  
-package avatartranslator.fromsml;
+package avatartranslator.tosysmlV2;
 import java_cup.runtime.*;
+import avatartranslator.tosysmlV2.AvatarFromSysMLParserState.*;
+
 parser code {:
   void setStringExpr(boolean _b) { ((SCANNERCLASS) getScanner()).setStringExpr(_b); }
 :}
@@ -71,11 +73,11 @@ non terminal blockDecl, blockDeclBegin, blockDeclBODY, blockItem, attributeDecl,
 non terminal state, startState, standardState, stopState, sendState, receiveState, randomState, countState, presendState,
     prereceiveState, setTimerState, resetTimerState, expireTimerState, poolParam, requestParam, requestList, request,
     simpleRequest, trivialRequest, requestArgs, requestArg, sendRequest, receiveRequest, setTimerRequest, resetTimerRequest,
-    expireTimerRequest, indexParam, delayParam, delayExpr, randomExpr, payloadParam, channelParam, settimerParam,
+    expireTimerRequest, indexParam, delayParam, delayExpr, actionRandomExpr, delayRandomExpr, payloadParam, channelParam, settimerParam,
     resettimerParam, expiretimerParam, trivialRequestBegin, sendRequestBegin, receiveRequestBegin, setTimerRequestBegin,
     resetTimerRequestBegin, expireTimerRequestBegin, startStateBegin, standardStateBegin, stopStateBegin, sendStateBegin,
     receiveStateBegin, randomStateBegin, countStateBegin, presendStateBegin, prereceiveStateBegin, setTimerStateBegin,
-    resetTimerStateBegin, expireTimerStateBegin, stateMachineBegin;
+    resetTimerStateBegin, expireTimerStateBegin, stateMachineBegin, payloadParamBegin;
 
 non terminal randomAction, targetParam, randomParam, countAction, countParam, transition, transOptions, doActions, actions,
     actionSeq, act, leftHand, stringExprList;
@@ -578,9 +580,10 @@ requestParam ::= REQUEST_F EQUAL request;
 requestList ::= request | request COMMA requestList;
 request ::=
       IF STRINGEXPR:e simpleRequest ELSE NOKREQUEST_U LPAR INT RPAR {:
-        theRequest.setGuard(e);
+        theTransition.setGuard(e);
+        requestIndex++;
       :}
-    | simpleRequest
+    | simpleRequest {: requestIndex++; :}
 ;
 simpleRequest ::= trivialRequest | sendRequest | receiveRequest
     | setTimerRequest | resetTimerRequest | expireTimerRequest;
@@ -588,45 +591,38 @@ simpleRequest ::= trivialRequest | sendRequest | receiveRequest
 trivialRequest ::=
       IMMEDIATEREQUEST_U {:
         getRequest(requestIndex);
-        theRequest.setType(STXTRIVIALREQUEST);
-        requestIndex++;
+        theTransition.setType(STXTRIVIALREQUEST);
       :}
     | trivialRequestBegin requestArgs RPAR
 ;
 trivialRequestBegin ::= TRIVIALREQUEST_T LPAR {:
     getRequest(requestIndex);
-    theRequest.setType(STXTRIVIALREQUEST);
-    requestIndex++;
-:}
+    theTransition.setType(STXTRIVIALREQUEST);
+:};
 sendRequest ::= sendRequestBegin requestArgs RPAR;
 sendRequestBegin ::=  SENDREQUEST_T LPAR {:
     getRequest(requestIndex);
-    theRequest.setType(STXSENDREQUEST);
-    requestIndex++;
+    theTransition.setType(STXSENDREQUEST);
 :};
 receiveRequest ::= receiveRequestBegin requestArgs RPAR;
 receiveRequestBegin ::= RECEIVEREQUEST_T LPAR {:
     getRequest(requestIndex);
-    theRequest.setType(STXRECEIVEREQUEST);
-    requestIndex++;
+    theTransition.setType(STXRECEIVEREQUEST);
 :};
 setTimerRequest ::= setTimerRequestBegin requestArgs RPAR;
 setTimerRequestBegin ::= SETTIMERREQUEST_T LPAR {:
     getRequest(requestIndex);
-    theRequest.setType(STXSETTIMERREQUEST);
-    requestIndex++;
+    theTransition.setType(STXSETTIMERREQUEST);
 :};
 resetTimerRequest ::= resetTimerRequestBegin requestArgs RPAR;
 resetTimerRequestBegin ::= RESETTIMERREQUEST_T LPAR {:
     getRequest(requestIndex);
-    theRequest.setType(STXRESETTIMERREQUEST);
-    requestIndex++;
+    theTransition.setType(STXRESETTIMERREQUEST);
 :};
 expireTimerRequest ::= expireTimerRequestBegin requestArgs RPAR;
 expireTimerRequestBegin ::= EXPIRETIMERREQUEST_T LPAR {:
     getRequest(requestIndex);
-    theRequest.setType(STXEXPIRETIMERREQUEST);
-    requestIndex++;
+    theTransition.setType(STXEXPIRETIMERREQUEST);
 :};
 
 requestArgs ::= requestArg | requestArg requestArgs;
@@ -635,22 +631,44 @@ requestArg ::= indexParam | delayParam | channelParam | payloadParam | settimerP
 indexParam ::= INDEX_F EQUAL INT;
 delayParam ::= DELAY_F EQUAL delayExpr;
 delayExpr ::=
-      STRINGEXPR
-    | randomExpr
+      STRINGEXPR:e {: theTransition.setMinDelay(e); :}
+    | delayRandomExpr
+;
+delayRandomExpr ::=
+      BOUNDRANDOM_U LPAR STRINGEXPR:i COMMA STRINGEXPR:a RPAR {:
+        theTransition.setMinDelay(i);
+        theTransition.setMaxDelay(a);
+      :}
 ;
-randomExpr ::=
-      BOUNDRANDOM_U LPAR STRINGEXPR COMMA STRINGEXPR RPAR
+payloadParam ::=
+      payloadParamBegin IDENT LPAR stringExprList RPAR {:
+        setPayloadParam(false);
+        theTransaction.setSendPayload(argList);
+        argList = null;
+      :}
+    | payloadParamBegin IDENT LPAR RPAR {: setPayloadParam(false); :}
+    | payloadParamBegin IDENT {: setPayloadParam(false); :}
 ;
+payloadParamBegin ::= PAYLOAD_F EQUAL {: setPayloadParam(true); argList= new ArrayList<String>(); :};
 
-payloadParam ::= PAYLOAD_F EQUAL IDENT LPAR stringExprList RPAR;
-channelParam ::= CHANNEL_F EQUAL IDENT;
-settimerParam ::= CHANNEL_F EQUAL IDENT POINT SET_TM;
-resettimerParam ::= CHANNEL_F EQUAL IDENT POINT RESET_TM;
-expiretimerParam ::= CHANNEL_F EQUAL IDENT POINT EXPIRE_TM;
+channelParam ::= CHANNEL_F EQUAL IDENT:id {:
+    getSignal(theBlock.name,id.getAvatarName());
+    theTransaction.setSignal(theSignal);
+:};
+
+settimerParam ::= CHANNEL_F EQUAL IDENT:id POINT SET_TM {:
+    theTransaction.setTimer(id.getAvatarName());
+:};
+resettimerParam ::= CHANNEL_F EQUAL IDENT POINT RESET_TM {:
+    theTransaction.setTimer(id.getAvatarName());
+:};
+expiretimerParam ::= CHANNEL_F EQUAL IDENT POINT EXPIRE_TM {:
+    theTransaction.setTimer(id.getAvatarName());
+:};
 
 stringExprList ::=
-    STRINGEXPR
-    | stringExprList COMMA STRINGEXPR
+    STRINGEXPR:e {: argList.add(e); :}
+    | STRINGEXPR COMMA stringExprList  {: argList.add(e); :}
 ;
 // STATE ACTIONS ++++++++++++++++++++++++++++++++++++
 randomAction ::=
@@ -658,7 +676,13 @@ randomAction ::=
     | STATEACTION_F EQUAL ASSIGNMENT_T LPAR randomParam COMMA targetParam RPAR
 ;
 targetParam ::= TARGET_F EQUAL IDENT;
-randomParam ::= VALUE_F EQUAL randomExpr;
+randomParam ::= VALUE_F EQUAL actionRandomExpr;
+delayRandomExpr ::=
+      BOUNDRANDOM_U LPAR STRINGEXPR:i COMMA STRINGEXPR:a RPAR {:
+        theTransition.setMinDelay(i);
+        theTransition.setMaxDelay(a);
+      :}
+;
 
 countAction ::=
       STATEACTION_F EQUAL ASSIGNMENT_T LPAR targetParam COMMA countParam RPAR
diff --git a/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jflex b/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jflex
index 152260dfe9b8c200a7219a0031c5129c5a776780..103abd32b09157a1601061b223e688ef9a357154 100644
--- a/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jflex
+++ b/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jflex
@@ -36,6 +36,8 @@ import java.util.HashSet;
     public void setStringValue(boolean _b)  { getStringValue = _b; }
     private StringBuffer stringAcc = new StringBuffer();
     private boolean delayParam = false;
+    private boolean payloadParam = false;
+    public void setPayloadParam(boolean _b){ payloadParam = _b; }
     private boolean tupleParam = false;
     private int nbLpar = 0;
 
@@ -167,7 +169,10 @@ timerBlockName = "'@tmr:" AvIdent "'"
  "=="            { return new Symbol(XX#Symb.EQ, yyline, yycolumn); }
  "true"          { return new Symbol(XX#Symb.BOOL, yyline, yycolumn, TRUE); }
  "false"         { return new Symbol(XX#Symb.BOOL, yyline, yycolumn, FALSE); }
-  "("            { return new Symbol(XX#Symb.LPAR, yyline, yycolumn); }
+  "("            { if (payloadParam) {
+                       stringExprAnchor(); oneShotArg = false; stringAcc.clear(); yyBegin(GETARG);
+                   }
+                   return new Symbol(XX#Symb.LPAR, yyline, yycolumn); }
   ")"            { return new Symbol(XX#Symb.RPAR, yyline, yycolumn); }
   "{"            { return new Symbol(XX#Symb.LBRAC, yyline, yycolumn); }
   "}"            { return new Symbol(XX#Symb.RBRAC, yyline, yycolumn); }