diff --git a/shark_simulation.pro b/shark_simulation.pro
new file mode 100644
index 0000000000000000000000000000000000000000..42126868fe066abb158b4a512b2ac299eb5890f1
--- /dev/null
+++ b/shark_simulation.pro
@@ -0,0 +1,337 @@
+;+
+; SHARH@LBT simulation tool 
+; 
+; This code simulates the coronographic psf of LBT/SHARK in real seeing conditions.
+; A param file in the same working directory is used to configure the code.
+; The code works with either simulated or measured AO phase residuals
+; See param file for more information on the setup of the code and a complete list of input parameters
+; 
+; HISTORY:
+; Sept 2013 added configuration file easy setup (param)
+; Sept 2013 telescope jitter simulation added 
+; Oct 2013 FLAO mode: measured AO residuals (good up to the R=200 mas)
+; Nov 2013 LBT interferometric mode
+; Nov 2013 
+;          -- LBTI Code by F. Pedichini implemented and integrated 
+;          -- New configuration file added
+;          -- Sim report file added 
+;          -- Bugs fixed 
+; Dec 2013 
+;          -- A nasty bug affecting the pixel scale in LBTI mode fixed
+;          -- pix variable introduced. It contains the pixel scale in mas as obtained from the prop lib
+;             after the propagation of the beam using the function prop_get_sampling()   
+;          -- brief and incomplete description in the save file added
+;          -- LBT Focal plane PSF estimation added 
+;           
+; Feb 2014
+;          -- Added possibility to assess occulter off axis displacement. This is done in both single and interferometric mode. 
+;          -- Report filename fixed 
+;          -- 
+;          
+; Sept 2017
+;          -- SOUL LBT AO Upgrade added
+;          
+; Jul 2018
+;         -- Long time series phase screens capabilities added 
+; 
+; Author: Marco Stangalini marco.stangalini@inaf.it
+;First release August 2013
+; May 2017 Bug fixed - Working version
+;-
+
+
+@param
+
+label='SHARK_'
+HWRS=0
+
+PRINT, '--------------------------------'
+PRINT, 'SHARK SIMULATION RUN...
+PRINT, '--------------------------------'
+PRINT, SYSTIME()
+IF FLAO eq 1 THEN begin
+  PRINT, 'FLAO ON SKY MODE '
+  label=label+'FLAO_'
+
+ENDIF
+PRINT, 'LAMBDA [MU]', LAMBDA0
+PRINT, 'LYOT STOP [%]', RAGGIO_LYOT
+PRINT, 'OCCULTER [MU]', RAGGIO_OCCULTER
+PRINT, 'OCC. OFF AXIS DISPLACEMENT [mm]', XOFF, YOFF 
+IF SWING EQ 1 THEN begin
+  PRINT, 'TELESCOPE SWING YES'
+ENDIF
+PRINT, '# STEP', NSTEP
+PRINT, 'PHASE RESIDUALS', PATH0
+print, 'PUPIL SAMPLING [m/pixel]', 8.4/(beam_ratio*lsize)
+PRINT, 'BEAM RATIO ', BEAM_RATIO
+
+IF interfmode eq 1 then begin 
+label=label+'LBTI_'
+print, 'LBT INTERFEROMETRIC MODE ACTIVE'
+print, 'PUPIL SAMPLING [m/pixel]', Dtot/(beam_ratio*lsize)
+print, 'Effective beam ratio = ', (8.4/Dtot)*beam_ratio
+s_sampling=Dtot/(beam_ratio*lsize)
+npix_pupil=round(8.4d/s_sampling)
+if (2*(npix_pupil/2) ne npix_pupil) then begin 
+  npix_pupil=npix_pupil+1
+endif
+print, 'NPIX PUPIL', NPIX_PUPIL, '(it must be close to 150)'
+print, 'WIND SPEED ', WIND_SPEED
+PRINT, 'AO LOOP TIME ', phase_sampling, '[ms]
+delta_step=round((Cent2Cent_SEP/wind_speed)/(PHASE_SAMPLING))
+PRINT, 'WFs step difference ', delta_Step
+IF tot_screens lt (step0+nstep+delta_step) then begin
+  print, '-- WARNING -- number of steps exceeds the number of phase screens available'
+  print, 'Increase the number of phase screens or reduce the wind speed'
+  stop
+ENDIF
+endif
+PRINT, '--------------------------------'
+PRINT, '--------------------------------'
+
+
+openw, 33, path+'Report.dat' 
+PRINTf,33, '--------------------------------'
+PRINTf,33, 'SHARK SIMULATION RUN...
+PRINTf,33, '--------------------------------'
+PRINTf,33, SYSTIME()
+PRINTF,33,'FLAO', flao
+PRINTf,33, 'LAMBDA [MU]', LAMBDA0
+PRINTf,33,'LYOT STOP [%]', RAGGIO_LYOT
+PRINTf,33, 'OCCULTER [MU]', RAGGIO_OCCULTER
+PRINTF,33, 'OCC. OFF AXIS DISPLACEMENT [mm]', XOFF, YOFF
+PRINTF,33, 'LYOT OFF AXIS DISPLACEMENT [mm]', LYOT_XOFF, LYOT_YOFF
+printf,33, 'SWING', swing
+PRINTf,33, '# STEP', NSTEP
+PRINTf,33, 'PHASE RESIDUALS', PATH0
+printf,33, 'PUPIL SAMPLING [m/pixel]', 8.4/(beam_ratio*lsize)
+PRINTf,33, 'BEAM RATIO ', BEAM_RATIO
+  printf, 33,'LBT INTERFEROMETRIC MODE', interfmode
+  printf,33, 'PUPIL SAMPLING [m/pixel]', Dtot/(beam_ratio*lsize)
+  printf,33, 'Effective beam ratio = ', (8.4/Dtot)*beam_ratio
+  s_sampling=Dtot/(beam_ratio*lsize)
+  printf, 33,'WIND SPEED ', WIND_SPEED
+  PRINTf, 33,'AO LOOP TIME ', phase_sampling, '[ms]
+  delta_step=round((Cent2Cent_SEP/wind_speed)/(PHASE_SAMPLING))
+  PRINTf,33, 'WFs step difference ', delta_Step
+PRINTf, 33,'--------------------------------'
+PRINTf,33, '--------------------------------'
+close, 33
+
+
+
+;SWING FREQUENCY
+AMPLITUDE_TILT_CALIBRATION=0.045e-6
+t=FINDGEN(TOT_SCREENS)*PHASE_SAMPLING
+MODULATION=AMPLITUDE_TILT_CALIBRATION*(SWING_AMPL/4.12)*SIN(2.*!PI*SWING_FREQ*T)
+pupil_distance=Cent2Cent_SEP/2.
+pix=0.
+XOFF=XOFF/1000.   ;CONVERSIONE IN METRI
+YOFF=YOFF/1000.   ;CONVERSIONE IN METRI
+LYOT_XOFF=LYOT_XOFF/1000.   ;CONVERSIONE IN METRI
+LYOT_YOFF=LYOT_YOFF/1000.   ;CONVERSIONE IN METRI
+
+
+shortcount=0
+
+nframes=fix(inttime/(PHASE_SAMPLING*1000))
+nframe_count=0
+psf_short=fltarr(lsize,lsize)
+psfao_short=fltarr(lsize,lsize)
+
+;prop_run, 'psd_error_map', psf0, lambda0(0), lsize, dx, passvalue=passval_speckle
+;print, 'Error map created'
+if SOUL eq 1 then begin
+  WFS_DATA=readfits(path0)
+  maschera=shift(dist(220,220), 110,110)
+  maschera=maschera lt 107
+endif
+
+if FLAO eq 1 then begin
+  restore, path0, /v
+endif
+
+if SYNTH_FFT eq 1 then begin
+  paths=file_search(path0+'*.fits')
+  WFS_DATA=readfits(paths(0))
+  maschera=shift(dist(220,220), 110,110)
+  maschera=maschera lt 107
+endif
+
+  
+
+FOR OFF=0,N_ELEMENTS(XOFF)-1 DO BEGIN
+      for j=0,n_elements(raggio_lyot)-1 do begin
+          for k=0,N_elements(raggio_occulter)-1 do begin
+            FOR LAM=0,N_ELEMENTS(LAMBDA0)-1 DO BEGIN   
+              lyot_r=raggio_lyot(j)
+              occrad=raggio_occulter(k)
+              print, lyot_r, ' %', occrad, ' lambda/D', lambda0, ' nm'
+              WFLambda=750. ;nm
+              WFLambda=wflambda *1e-9 ; in meters
+              occrad=occrad*1.e-6
+              
+                WF_res=fltarr(220,200)
+                WF_turb=fltarr(220,200)
+
+              psf_shark=fltarr(lsize,lsize)
+              psf_AO=fltarr(lsize,lsize)
+              psf_fp=fltarr(lsize,lsize)
+              
+              
+              count=0
+              counter=0
+              device, decomposed=0
+              loadct, 5
+              psf_shark_8th=fltarr(lsize,lsize)
+              psf_shark_gauss=fltarr(lsize,lsize)
+              
+              
+              cnt_synth_blocknum=0
+              cnt_synth=0
+              
+              
+              ;Time LOOP =======================================================
+              for index = step0, step0+nstep-1 do begin
+                  
+                    lambda=lambda0(LAM)*1000*1e-9 ;in meters
+
+                    if SOUL eq 1 then begin
+                      wf_res = maschera*WFS_data[index,*,*]*1e-9  ;in Dlambda [nm]
+                    endif else begin
+                      
+                      cnt_synth_blocknum++
+                      if cnt_synth_blocknum eq 5000 then begin
+                        cnt_synth++
+                        WFS_DATA=readfits(paths(cnt_synth))
+                        cnt_synth_blocknum=1
+                      endif
+                      
+                      wf_res = maschera*WFS_data[*,*,cnt_synth_blocknum-1]*1e-9  ;in Dlambda [nm]
+                      
+                    endelse
+                    
+                    
+
+                    phase_error_res=reform(wf_Res);/(2.*!pi)
+                    temp=dblarr(lsize, lsize)
+                    phase_error_res=congrid(phase_error_res, lsize*beam_ratio, lsize*beam_ratio, cubic=-0.5)
+                    size_temp=lsize*beam_ratio
+                    temp[lsize/2-size_temp/2:lsize/2+size_temp/2-1, lsize/2-size_temp/2:lsize/2+size_temp/2-1]=phase_error_res
+                    phase_error_res=temp  
+                  
+
+                  	print,index-step0,  lyot_r, ' %', occrad, ' lambda/D', lambda0(LAM), ' nm'
+                  	passval={beam_ratio:beam_ratio, fase:phase_error_res,   occulter:occrad, lyotstop:lyot_R, OSCILLATION:SWING, SWING_a:MODULATION(INDEX),$
+                  	  pupil_sep:pupil_distance, D0:Dtot, sampl:pix, sampl_fp:pix, SUPPRESSOR:raggio_suppressor, xoff:xoff(OFF), yoff:yoff(OFF),$
+                  	   LYOT_XOFF:LYOT_XOFF, LYOT_YOFF:LYOT_YOFF, Zer_val:Zer_val, occtype:occtype,$
+                  	   HWRS:HWRS, zer_num:zer_num}
+              
+                    ;prop_run,'psf_lbt_single', psffp, lambda0(LAM), lsize, dx_fp, passvalue=passval,/quiet
+                  	prop_run,'pisces_on_axe_phased', psf0, lambda0(LAM), lsize, dx, passvalue=passval,/quiet
+                    prop_run,'pisces_on_axe_mask_2', psf_cor, lambda0(LAM), lsize, dx, passvalue=passval,/quiet
+                    
+                    
+                    tvframe, psf0^0.3, /asp                    
+ 
+
+              
+                  	M=MAX(PSF0, MA)
+                  	psf_shark=psf_shark+psf_cor
+                  	psf_AO=psf_AO+psf0
+                  	count=count+1
+                  	counter=counter+1.
+                
+                
+                  	mas=indgen(lsize)*passval.sampl
+                  	nframe_count=1+nframe_count
+                  	psf_short=psf_short+psf_cor
+                  	psfao_short=psfao_short+psf0
+
+                  	
+                  	if nframe_count eq nframes then begin
+                  	  IF SHORT_EXP EQ 1 THEN BEGIN
+
+                  	    ;tvframe, psfao_short^0.5
+                  	    
+
+                  	    if occtype eq 'gauss' or occtype eq 'Gauss' then begin
+                  	      save, filename=path+SUBDIR+label+strtrim(fix(lambda0(0)*1000),1)+'nm_'+'_NSTEP_'+strtrim(shortcount,1)+$
+                  	        '_Gauss_Occulter_'+strtrim(occrad,1)+'_OFF_AXIS_DISPL_'+strtrim(XOFF(OFF),1)+'_STOP_'+strtrim(lyot_r,1)+'_STOP_DISPL_'+strtrim(lyot_XOFF,1)+'.sav', $
+                  	        psf_short, psfAO_short, LSIZE, DX, mas,$
+                  	        description='mas = array [marcsec] -- dx=pixel scal in m -- pix=pixel scale in mas, occrad=occulter R in mu'
+                  	    endif else begin
+                  	      save, filename=path+SUBDIR+label+strtrim(fix(lambda0(0)*1000),1)+'nm_'+'_NSTEP_'+strtrim(shortcount,1)+$
+                  	        '_Lyot_Occulter_'+strtrim(occrad,1)+'_OFF_AXIS_DISPL_'+strtrim(XOFF(OFF),1)+'_STOP_'+strtrim(lyot_r,1)+'_STOP_DISPL_'+strtrim(lyot_XOFF,1)+'.sav', $
+                  	        psf_short, psfAO_short, LSIZE, DX, mas,$
+                  	        description='mas = array [marcsec] -- dx=pixel scal in m -- pix=pixel scale in mas, occrad=occulter R in mu'
+                  	    endelse
+                        shortcount++
+                        psf_short=psf_short*0.
+                        psfao_short=psfao_short*0.
+
+
+                  	    nframe_count=0
+                  	  ENDIF
+                  	endif                
+                
+                
+                endfor
+                
+
+
+                print,'pixel=',passval.sampl,' marcsec'
+                mas=indgen(lsize)*passval.sampl
+                mas_fp=indgen(lsize)*passval.sampl_fp
+                
+              device, decomposed=0
+              psf_AO=psf_AO/(counter)
+              psf_shark_lyot=psf_shark/counter
+              
+              cartop, psf_AO, lsize/2, lsize/2,lsize/2,findgen(lsize/2), 2.*!pi*findgen(360)/360,frt
+              siz=size(frt)    
+              psf_AO_prof=total(frt,2)/siz(2)
+              
+              cartop, psf_SHARK_lyot, lsize/2, lsize/2,lsize/2,findgen(lsize/2), 2.*!pi*findgen(360)/360,frt
+              siz=size(frt)
+              psf_SHARK_LYOT_prof=total(frt,2)/siz(2)
+          
+           pix=passval.sampl
+           pix_fp=passval.sampl_fp
+           
+           
+          PSF_AO=psf_AO
+          PSF_CORO=psf_SHARK_LYOT
+          PSF_CORO_PROF=PSF_SHARK_LYOT_prof
+          PSF_AO_PROF=psf_ao_prof
+          
+          plot, psf_ao_prof/max(psf_ao_prof), /ylog, yr=[1e-7,1]
+          oplot, psf_coro_prof/max(psf_ao_prof), thick=4
+          
+          
+         
+          
+          if occtype eq 'gauss' or occtype eq 'Gauss' then begin
+            save, filename=path+label+strtrim(fix(lambda0(LAM)*1000),1)+'nm_'+'_NSTEP_'+strtrim(nstep,1)+$
+              '_Gauss_Occulter_'+strtrim(occrad,1)+'_OFF_AXIS_DISPL_'+strtrim(XOFF(OFF),1)+'_STOP_'+strtrim(lyot_r,1)+'_STOP_DISPL_'+strtrim(lyot_XOFF,1)+'.sav', $
+              PSF_AO, nstep, mas, PSF_CORO, dx, PIX,  lambda0,  PSF_CORO_PROF, occrad, LYOT_R, PSF_AO_PROF,$
+            description='mas = array [marcsec] -- dx=pixel scal in m -- pix=pixel scale in mas, occrad=occulter R in mu'
+          endif else begin
+            save, filename=path+label+strtrim(fix(lambda0(LAM)*1000),1)+'nm_'+'_NSTEP_'+strtrim(nstep,1)+$
+              '_Lyot_Occulter_'+strtrim(occrad,1)+'_OFF_AXIS_DISPL_'+strtrim(XOFF(OFF),1)+'_STOP_'+strtrim(lyot_r,1)+'_STOP_DISPL_'+strtrim(lyot_XOFF,1)+'.sav', $
+              PSF_AO, nstep, mas, PSF_CORO, dx, PIX,  lambda0,  PSF_CORO_PROF, occrad, LYOT_R, PSF_AO_PROF,$
+            description='mas = array [marcsec] -- dx=pixel scal in m -- pix=pixel scale in mas, occrad=occulter R in mu'
+          endelse
+          
+          print, occrad, Lyot_r, lambda
+          
+          
+           
+           
+            ENDFOR
+          endfor
+      endfor
+ENDFOR
+
+end