diff --git a/gen_seq_launcher.m b/gen_seq_launcher.m
new file mode 100644
index 0000000000000000000000000000000000000000..e784a76b7d377855f6605a99f716ad8349c4460e
--- /dev/null
+++ b/gen_seq_launcher.m
@@ -0,0 +1,182 @@
+clear all;
+
+for num_sequences=1:64
+
+seq_name = sprintf('seq_launcher_%d.txt',num_sequences);
+
+header{1} = '#';
+header{2} = '# Description: $description';
+header{3} = '# Author: Giulio Gaio';
+header{4} = '# Date: 22/01/2020';
+header{5} = '#';
+header{6} = sprintf('# This launching sequence starts %d sub-sequences',num_sequences);
+header{7} = '#';
+
+error_step = 1+1+num_sequences+num_sequences*7+1+num_sequences*7+3;
+rollback_step = error_step + 3;
+abort_step = rollback_step + 2;
+exit_step = abort_step + 2*num_sequences;
+
+
+cnt = 0;
+cnt = cnt + 1;
+blk{cnt}=sprintf('step%d;(write(this/RetryCounter) = 0) && (write(this/TimeoutMask) = 0) && goto(%d);Resetting internal variables;Error resetting internal variables;-1',cnt,cnt+1);
+
+cnt = cnt + 1;
+blk{cnt} = sprintf('step%d;(read(this/TimeoutMask) > 0) ? goto(-1) : goto(%d);Checking sequences timeout;Sequence timeout error;-1',cnt,cnt+1);
+
+cnt = cnt + 1;
+blk{cnt} = sprintf('step%d;(read(this/RetryCounter) > read(this/MaxRetryCounter)) ? goto(%d) : goto(%d);Checking retry counter;Max number of retries reached;-1',cnt,rollback_step,cnt+1);
+
+% reset executed flag
+for seq=1:num_sequences
+    cnt = cnt + 1;
+    blk{cnt} = sprintf('step%d;(write(this/ExecutedSeq%d) = 0) && goto(%d);Resetting $devseq%d$ executed flag;Error resetting $devseq%d executed flag;-1',cnt,seq,cnt+1,seq,seq);
+end    
+
+% start sequences
+for seq=1:num_sequences
+    cnt = cnt + 1;
+    blk{cnt} = sprintf('step%d;((read($devseq%d$/State) == RUNNING) || (read(this/EnableSeq%d) == 0)) ? goto(%d) : goto(%d);Checking $devseq%d$ already running;Error checking $devseq%d$ already running;-1',cnt,seq,seq,cnt+7,cnt+1,seq,seq);
+    cnt = cnt + 1;
+    blk{cnt} = sprintf('step%d;((read(this/RetryCounter) == 0) || (read(this/RetryMask) & 0x%x)) ? command($devseq%d$/Start) && sleep($sleep_after_start_cmd) && goto(%d) : goto(%d);Starting $devseq%d$ sequence;Error starting $devseq%d$ sequence;-1;tangoerror=goto(%d)',cnt,2^(seq-1),seq,cnt+1,cnt+6,seq,seq,error_step);
+    cnt = cnt + 1;
+    blk{cnt} = sprintf('step%d;(read(this/BlockMask)  & 0x%x) ? goto(%d) : goto(%d);Check $devseq%d$ blocking state;Error checking $devseq%d$ blocking;-1',cnt,2^(seq-1),cnt+1,cnt+5,seq,seq);
+    cnt = cnt + 1;
+    blk{cnt} = sprintf('step%d;(read($devseq%d$/State) == RUNNING) ? sleep($sleep_wait_refresh_state) && goto(%d) : goto(%d);Waiting $devseq%d$ (blocking);Error waiting $devseq%d$ (blocking);$sequence_timeout000;tangoerror=goto(%d)',cnt,seq,cnt,cnt+1,seq,seq,error_step);
+    cnt = cnt + 1;
+    blk{cnt} = sprintf('step%d;read($devseq%d$/State) == FAULT ? goto(%d) : (write(this/ExecutedSeq%d) = 1) && goto(%d);Checking $devseq%d$ state;$devseq%d$ in FAULT state;-1;tangoerror=goto(%d)',cnt,seq,cnt+1,seq,cnt+3,seq,seq,error_step);
+    cnt = cnt + 1;
+    blk{cnt} = sprintf('step%d;(read(this/CatchErrorExitMask) & 0x%x) == 0 ? goto(%d) : goto(%d);Checking $devseq%d$ abort;Error checking $devseq%d$ abort;-1;tangoerror=goto(%d)',cnt,2^(seq-1),cnt+1,abort_step,seq,seq,error_step);
+    cnt = cnt + 1;
+    blk{cnt} = sprintf('step%d;(read(this/CatchErrorContinueMask) & 0x%x) == 0 ? goto(%d) : goto(%d);Checking $devseq%d$ abort;Error checking $devseq%d$ abort;-1;tangoerror=goto(%d)',cnt,2^(seq-1),error_step,cnt+1,seq,seq,error_step);    
+end
+
+cnt = cnt + 1;
+blk{cnt} = sprintf('step%d;sleep($sleep_wait_refresh_state) && (write(this/RunningCounter) = 0) && (write(this/ErrorCounter) = 0) && goto(%d);Waiting sequence state update;Error waiting sequence state update;-1',cnt,cnt+1);
+
+% check RUNNING
+for seq=1:num_sequences
+    cnt = cnt + 1;
+    blk{cnt} = sprintf('step%d;(read(this/EnableSeq%d) == 0) ? goto(%d) : goto(%d);Checking $devseq%d$ enabled;Error checking $devseq%d$ enabled;-1',cnt,seq,cnt+7,cnt+1,seq,seq);
+    cnt = cnt + 1;
+    blk{cnt} = sprintf('step%d;(read($devseq%d$/State) == OFF) ? (write(this/ExecutedSeq%d) = 1) && goto(%d) : goto(%d);Checking $devseq%d$ OFF state;Error checking $devseq%d$ OFF state;-1;tangoerror=goto(%d)',cnt,seq,seq,cnt+6,cnt+1,seq,seq,error_step);
+    cnt = cnt + 1;
+    blk{cnt} = sprintf('step%d;read($devseq%d$/State) == FAULT ? goto(%d) : goto(%d);Checking $devseq%d$ FAULT state;Error checking $devseq%d$ FAULT state;-1;tangoerror=goto(%d)',cnt,seq,cnt+1,cnt+3,seq,seq,error_step);
+    cnt = cnt + 1;
+    blk{cnt} = sprintf('step%d;(read(this/CatchErrorExitMask) & 0x%x) == 0 ? goto(%d) : goto(%d);Checking $devseq%d$ abort;Error checking $devseq%d$ abort;-1;tangoerror=goto(%d)',cnt,2^(seq-1),cnt+1,abort_step,seq,seq,error_step);
+    cnt = cnt + 1;
+    blk{cnt} = sprintf('step%d;(read(this/CatchErrorContinueMask) & 0x%x) == 0 ? (write(this/ErrorCounter) = (read(this/ErrorCounter) + 1)) && goto(%d) : goto(%d);Checking $devseq%d$ abort;Error checking $devseq%d$ abort;-1;tangoerror=goto(%d)',cnt,2^(seq-1),cnt+1,cnt+1,seq,seq,error_step);    
+    cnt = cnt + 1;
+    blk{cnt} = sprintf('step%d;read($devseq%d$/State) == RUNNING ? (write(this/RunningCounter) = (read(this/RunningCounter) + 1)) && sleep($sleep_wait_refresh_state) && goto(%d) : goto(%d);$devseq%d$ RUNNING;Error RUNNING $devseq%d$;$sequence_timeout000;timeouterror=goto(%d)',cnt,seq,cnt+2,cnt+2,seq,seq,cnt+1);
+    cnt = cnt + 1;
+    blk{cnt} = sprintf('step%d;(write(this/TimeoutMask) = (read(this/TimeoutMask) | 0x%x)) && goto(%d);Setting $devseq%d$ timeout mask;Error setting $devseq%d$ timeout mask;-1',cnt,2^(seq-1),cnt+1,seq,seq);
+end
+
+cnt = cnt + 1;
+blk{cnt} = sprintf('step%d;(read(this/RunningCounter) == 0) ? goto(%d) : goto(%d);Checking running sequences;Error checking running sequences;-1',cnt, cnt+2, cnt - 7*num_sequences-1);
+
+cnt = cnt + 1;
+blk{cnt} = sprintf('step%d;(write(this/ErrorCounter) = read(this/ErrorCounter) + 1) && goto(%d);Increasing error counter;Error increasing error counter;-1',cnt,cnt+1);
+
+cnt = cnt + 1;
+blk{cnt} = sprintf('step%d;(write(this/RetryCounter) = read(this/RetryCounter) + 1) && goto(%d);Increasing retry counter;Error increasing retry counter;-1',cnt,cnt+1);
+
+cnt = cnt + 1;
+blk{cnt} = sprintf('step%d;read(this/ErrorCounter) == 0 ? goto(%d) : goto(%d);Increasing retry counter;Error increasing retry counter;-1',cnt,exit_step,2);
+
+cnt = cnt + 1;
+blk{cnt} = sprintf('step%d;((read(this/EnableRollback) == 1) && (read(this/EnableSeq%d) == 0)) ? command($devseq%d$/Start) && sleep($sleep_after_start_cmd) && goto(%d) : goto(-1);Executing rollback sequence $devseq%d$;Error executing rollback sequence $devseq%d;-1',cnt,num_sequences,num_sequences,cnt+1,num_sequences,num_sequences);
+
+cnt = cnt + 1;
+blk{cnt} = sprintf('step%d;sleep($sleep_wait_refresh_state) && (read($devseq%d$/State) == RUNNING) ? goto(%d) : goto(-1);Rolling back $devseq%d$ RUNNING;Error rolling back $devseq%d$;$sequence_timeout000;-1',cnt,num_sequences,cnt,num_sequences,num_sequences);
+
+% abort step
+for seq=1:num_sequences
+    cnt = cnt + 1;
+    blk{cnt} = sprintf('step%d;sleep($sleep_wait_refresh_state) && ((read($devseq%d$/State) == FAULT) && (read(this/EnableSeq%d) == 1)) ? command($devseq%d$/Acknowledge) && goto(%d) : goto(%d);Acknowleding $devseq%d$;Error acknowledging  $devseq%d$;$sequence_timeout000;tangoerror=goto(%d)',cnt,seq,seq,seq,cnt+1,cnt+1,seq,seq,cnt+1);
+    cnt = cnt + 1;
+    blk{cnt} = sprintf('step%d;((read($devseq%d$/State) == RUNNING) && (read(this/EnableSeq%d) == 1)) ? command($devseq%d$/Stop) && goto(%d) : goto(%d);Stopping $devseq%d$;Error stopping$devseq%d$;$sequence_timeout000;tangoerror=goto(%d)',cnt,seq,seq,seq,cnt-1,cnt+1,seq,seq,cnt+1);
+end
+
+
+
+% dynamic attributes
+cnt = 0;
+cnt = cnt + 1;
+footer{cnt} = 'attr;BlockMask;long64;0';
+cnt = cnt + 1;
+footer{cnt} = 'attr;RetryMask;long64;0';
+cnt = cnt + 1;
+footer{cnt} = 'attr;CatchErrorExitMask;long64;0';
+cnt = cnt + 1;
+footer{cnt} = 'attr;CatchErrorContinueMask;long64;0';
+cnt = cnt + 1;
+footer{cnt} = 'attr;EnableRollback;bool;0';
+cnt = cnt + 1;
+footer{cnt} = 'attr;TimeoutMask;long64;0';
+cnt = cnt + 1;
+footer{cnt} = 'attr;ErrorCounter;long;0';
+cnt = cnt + 1;
+footer{cnt} = 'attr;RunningCounter;long;0';
+cnt = cnt + 1;
+footer{cnt} = 'attr;MaxRetryCounter;long;1';
+
+
+% check Enable
+for seq=1:num_sequences
+    cnt = cnt + 1;
+    footer{cnt} = sprintf('attr;EnableSeq%d;bool;1',seq);
+end
+
+% check Executed
+for seq=1:num_sequences
+    cnt = cnt + 1;
+    footer{cnt} = sprintf('attr;ExecutedSeq%d;bool;0',seq);
+end
+
+cnt = cnt + 1;
+footer{cnt} = 'attr;RetryCounter;long;0';
+
+
+fileID = fopen(seq_name,'w');
+for i=1:size(header,2)
+    fprintf(fileID,'%s\n',header{i});
+end
+for i=1:size(blk,2)
+    fprintf(fileID,'%s\n',blk{i});
+end
+for i=1:size(footer,2)
+    fprintf(fileID,'%s\n',footer{i});
+end
+
+fclose(fileID);
+
+end
+
+% Dynamic R/W attributes
+%
+% User
+% attr;Block;long;0
+% attr;Retry;long;0
+% attr;EnableRollback;bool;0
+% attr;MaxRetryCounter;long;0
+% attr;EnableSeq1;bool;0
+% attr;EnableSeq2;bool;0
+% .........
+% Internal
+% attr;Executed;long;0
+% attr;RetryCounter;long;0
+
+% Wildcards
+% $description=
+% sleep_after_start_cmd=1
+% $sleep_wait_refresh_state=4
+% $sequence_timeout=240
+% $devseq1=
+% $devseq2=
+% $devseq3=
+% .........
+
+
+