diff --git a/tools/check_commit_ial.sh b/tools/check_commit_ial.sh
index da9ef89114d2de2e42316792a169eb932a0cf260..ede8c099e988d26cd28b50a96c93b36f8104bb84 100755
--- a/tools/check_commit_ial.sh
+++ b/tools/check_commit_ial.sh
@@ -631,6 +631,10 @@ if [ $compilation -eq 1 ]; then
   fi
 fi
 
+###################
+#### EXECUTION ####
+###################
+
 if [ $run -ge 1 ]; then
   #Cleaning to suppress old results that may be confusing in case of a crash during the run
   if [ $onlyIfNeeded -eq 0 ]; then
diff --git a/tools/check_commit_mesonh.sh b/tools/check_commit_mesonh.sh
index b3d2835f5b4f05baa97d2207ef2110feadf57daa..de8e01b119faac78f715921eafee638c31846901 100755
--- a/tools/check_commit_mesonh.sh
+++ b/tools/check_commit_mesonh.sh
@@ -4,39 +4,66 @@
 set -e
 set -o pipefail #abort if left command on a pipe fails
 
+#Notes for v5.5.0
+#For the OCEAN_LES/004_run2 case, results obtained are different from those obtained with the original version
+#of Meso-NH because of new developments and bug correction. The reference version is given by commit e053c59.
+#In this commit two modifications must be done in turb/mode_tke_eps_sources.f90 to change twice LOCEAN into OOCEAN.
+
+#######################
+#### CONFIGURATION ####
+#######################
+
 #The folowing environment variables can be defined:
-# REFDIR: directory in which the reference compilation directory can be found
 # TARGZDIR: directory where tar.gz files are searched for
 # MNHPACK: directory where tests are build
 
-availTests="007_16janvier/008_run2, 007_16janvier/008_run2_turb3D, 007_16janvier/008_run2_lredf, COLD_BUBBLE/002_mesonh, 
-            ARMLES/RUN, COLD_BUBBLE_3D/002_mesonh,OCEAN_LES/004_run2,014_LIMA/002_mesonh"
+#About the tests:
+# - ALLTests is a list of tests to be done when '-t ALL' is used. This list is filled here
+#   in case there is no mesonh_version.json file containig a 'testing' section. If this 'testing'
+#   section exists, this list is overridden.
+# - allowedTests is the list of allowed tests which can depend on platform, if we ask to perform an action
+#   with a test not in the allowedTests list, the action is ignored
+# - defaultTest is the list of tests to perform when no '-t' option is provided on the command line.
+ALLTests="007_16janvier/008_run2, 007_16janvier/008_run2_turb3D, 007_16janvier/008_run2_lredf, 
+          COLD_BUBBLE/002_mesonh, ARMLES/RUN, COLD_BUBBLE_3D/002_mesonh,OCEAN_LES/004_run2,014_LIMA/002_mesonh"
 defaultTest="007_16janvier/008_run2"
+allowedTests=$ALLTests
+
 separator='_' #- be carrefull, gmkpack (at least on belenos) has multiple allergies (':', '.', '@')
               #- seprator must be in sync with prep_code.sh separator
 
-#Notes for v5.5.0
-#For the OCEAN_LES/004_run2 case, results obtained are different from those obtained with the original version
-#of Meso-NH because of new developments and bug correction. The reference version is given by commit e053c59.
-#In this commit two modifications must be done in turb/mode_tke_eps_sources.f90 to change twice LOCEAN into OOCEAN.
-
 PHYEXTOOLSDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+
+MNHPACK=${MNHPACK:=$HOME/MesoNH/PHYEX}
+TARGZDIR=${TARGZDIR:=$PHYEXTOOLSDIR/pack/}
+
+################################
+#### COMMAND LINE ARGUMENTS ####
+################################
+
 function usage {
-  echo "Usage: $0 [-h] [-c] [-r] [-C] [-s] [--expand] [-t test] [--remove] commit [reference]"
-  echo "commit          commit hash (or a directory)"
+  echo "Usage: $0 [-h] [-p] [-c] [-r] [-C] [-s] [--expand] [-t test] [--repo-user USER] [--repo-protocol PROTOCOL] [--remove] [--onlyIfNeeded] [--computeRefIfNeeded] commit [reference]"
+  echo "commit          commit hash (or a directory) to test"
   echo "reference       commit hash or a directory or nothing for ref"
   echo "-s              suppress compilation pack"
+  echo "-p              creates pack"
   echo "-c              performs compilation"
   echo "-r              runs the tests"
   echo "-C              checks the result against the reference"
   echo "-t              comma separated list of tests to execute"
   echo "                or ALL to execute all tests"
   echo "--expand        use mnh_expand (code will use do loops)"
-  echo "--repo-user     user hosting the PHYEX repository on github,"
+  echo "--repo-user USER"
+  echo "                user hosting the PHYEX repository on github,"
   echo "                defaults to the env variable PHYEXREOuser (=$PHYEXREOuser)"
-  echo "--repo-protocol protocol (https or ssh) to reach the PHYEX repository on github,"
+  echo "--repo-protocol PROTOCOL"
+  echo "                protocol (https or ssh) to reach the PHYEX repository on github,"
   echo "                defaults to the env variable PHYEXREOprotocol (=$PHYEXREOprotocol)"
   echo "--remove        removes the pack"
+  echo "--onlyIfNeeded  performs the pack creation and/or the compilation and/or the execution"
+  echo "                only if the step has not already been done"
+  echo "--computeRefIfNeeded"
+  echo "                computes the missing references"
   echo ""
   echo "If nothing is asked (compilation, running, check, removing) everything"
   echo "except the removing is done"
@@ -51,6 +78,7 @@ function usage {
   echo "The commit can be a tag, written with syntagx tags/<TAG>"
 }
 
+packcreation=0
 compilation=0
 run=0
 check=0
@@ -60,11 +88,14 @@ tests=""
 suppress=0
 useexpand=0
 remove=0
+onlyIfNeeded=0
+computeRefIfNeeded=0
 
 while [ -n "$1" ]; do
   case "$1" in
     '-h') usage;;
     '-s') suppress=1;;
+    '-p') packcreation=1;;
     '-c') compilation=1;;
     '-r') run=$(($run+1));;
     '-C') check=1;;
@@ -73,6 +104,9 @@ while [ -n "$1" ]; do
     '--repo-user') export PHYEXREPOuser=$2; shift;;
     '--repo-protocol') export PHYEXREPOprotocol=$2; shift;;
     '--remove') remove=1;;
+    '--onlyIfNeeded') onlyIfNeeded=1;;
+    '--computeRefIfNeeded') computeRefIfNeeded=1;;
+
     #--) shift; break ;;
      *) if [ -z "${commit-}" ]; then
           commit=$1
@@ -88,21 +122,12 @@ while [ -n "$1" ]; do
   shift
 done
 
-[ "$reference" == 'REF' ] && reference="" #Compatibility with check_commit_arome.sh
-
-MNHPACK=${MNHPACK:=$HOME/MesoNH/PHYEX}
-REFDIR=${REFDIR:=$PHYEXTOOLSDIR/pack/}
-TARGZDIR=${TARGZDIR:=$PHYEXTOOLSDIR/pack/}
-if [ -z "${tests-}" ]; then
-  tests=$defaultTest
-elif [ $tests == 'ALL' ]; then
-  tests=$availTests
-fi
-
-if [ $compilation -eq 0 -a \
+if [ $packcreation -eq 0 -a \
+     $compilation -eq 0 -a \
      $run -eq 0 -a \
      $check -eq 0 -a \
      $remove -eq 0 ]; then
+  packcreation=1
   compilation=1
   run=1
   check=1
@@ -113,7 +138,23 @@ if [ -z "${commit-}" ]; then
   exit 2
 fi
 
-#Name, directory and reference for compiling and executing user pack
+##############################
+#### FUNCTION DEFINITIONS ####
+##############################
+
+function json_dictkey2value {
+  # $1 must contain the json string
+  # $2 must be the key name
+  # $3 is the default value
+  json_content="$1" python3 -c "import json; import os; result=json.loads(os.environ['json_content']).get('$2', '$3'); print(json.dumps(result) if isinstance(result, dict) else result)"
+}
+
+###################################
+#### VERSION/COMMIT ADAPTATION ####
+###################################
+
+#Name and directory for compiling and executing user pack
+declare -A refByTest
 if echo $commit | grep '/' | grep -v '^tags/' > /dev/null; then
   fromdir=$commit
   content_mesonh_version=$(scp $commit/src/mesonh/mesonh_version.json /dev/stdout 2>/dev/null || echo "")
@@ -131,7 +172,22 @@ else
   fi
   content_mesonh_version=$(wget --no-check-certificate https://raw.githubusercontent.com/$PHYEXREPOuser/PHYEX/${urlcommit}/$mesonh_version_file -O - 2>/dev/null || echo "")
 fi
-refversion=$(content_mesonh_version=$content_mesonh_version python3 -c "import json, os; v=os.environ['content_mesonh_version']; print(json.loads(v if len(v)!=0 else '{}').get('refversion', 'MNH-V5-5-0'))")
+if [ ! "${content_mesonh_version}" == "" ]; then
+  testing=$(json_dictkey2value "$content_mesonh_version" 'testing' '')
+  if [ ! "$testing" == "" ]; then
+    ALLTests='' #We reset the list of tests
+    for t in $(echo $allowedTests | sed 's/,/ /g'); do
+      ref=$(json_dictkey2value "$testing" "$t" '')
+      if [ ! "$ref" == "" ]; then
+        ALLTests="${ALLTests},$t"
+        refByTest[$t]=$ref
+      fi
+    done
+    ALLTests="${ALLTests:1}" #Remove first character (',')
+  fi
+fi
+[ "${content_mesonh_version}" == "" ] && content_mesonh_version='{}'
+refversion=$(json_dictkey2value "$content_mesonh_version" 'refversion' 'MNH-V5-5-0')
 if [ $refversion == "MNH-V5-5-0" ]; then
   targzsuffix="_PHYEX"
 else
@@ -141,403 +197,341 @@ tag=$(echo $commit | sed 's/\//'${separator}'/g' | sed 's/:/'${separator}'/g' |
 name=${refversion}-$tag
 [ $suppress -eq 1 -a -d $MNHPACK/$name ] && rm -rf $MNHPACK/$name
 
-#Two possibilities are supported for the simulations
-# - they can be done in the the pack we are currently checking
-# - they can be done in the reference pack
-#They are done in the current pack except if the reference pack
-#already contains a tested simulation
-#To check this, we use the case 007_16janvier/008_run2_turb3D
-if [ $(ls -d $REFDIR/${refversion}/MY_RUN/KTEST/007_16janvier/008_run2_turb3D_* 2> /dev/null | wc -l) -gt 0 ]; then
-  run_in_ref=1
-else
-  run_in_ref=0
-fi
-if [ $run_in_ref -eq 1 ]; then
-  path_user_beg=$REFDIR/${refversion} #pack directory containing the simulation
-  path_user_end=_$tag #to be appended to the 'run' simulation directory
-else
-  path_user_beg=$MNHPACK/$name #pack directory containing the simulation
-  path_user_end= #to be appended to the 'run' simulation directory
-fi
-
-#Name and directory for the reference
-reffromdir=''
-if echo $reference | grep '/' > /dev/null; then
-  reffromdir=$reference
-  reftag=$(echo $reference | sed 's/\//'${separator}'/g' | sed 's/:/'${separator}'/g' | sed 's/\./'${separator}'/g')
-else
-  reftag=$reference
-fi
-refname=${refversion}-$reftag
-if [ $run_in_ref -eq 1 ]; then
-  path_ref_beg=$REFDIR/${refversion}
-  if [ "$reference" == "" ]; then
-    path_ref_end=
+#Name and directory for the reference version
+declare -A refnameByTest
+#Reference to use for each test
+for t in $(echo $ALLTests | sed 's/,/ /g'); do
+  #Name of the reference
+  if [ "$reference" == "" -o "$reference" == "REF" ]; then
+    if [[ ! -z "${refByTest[$t]+unset}" ]]; then #the -v test is valid only with bash > 4.3
+      #The json file contained the references to use on a per test case basis
+      reftag=${refByTest[$t]}
+    else
+      reftag=""
+    fi
+    refByTest[$t]=$reftag
   else
-    path_ref_end=_$reftag
+    if echo $reference | grep '/' > /dev/null; then
+      reftag=$(echo $reference | sed 's/\//'${separator}'/g' | sed 's/:/'${separator}'/g' | sed 's/\./'${separator}'/g')
+    else
+      reftag=$reference
+    fi
+    refByTest[$t]=$reference
   fi
-else
-  path_ref_end=
-  if [ "$reference" == "" ]; then
-    path_ref_beg=$REFDIR/${refversion}
+  #Conversion into directory name
+  if [ "$reftag" == "" ]; then
+    refname=${refversion}
   else
-    path_ref_beg=$MNHPACK/${refversion}-$reftag
+    refname=${refversion}-$reftag
   fi
+  refnameByTest[$t]=$refname
+done
+
+if [ -z "${tests-}" ]; then
+  tests=$defaultTest
+elif echo "$tests" | grep -w 'ALL' > /dev/null; then
+  tests=$(echo "$tests" | sed "s:\bALL\b:$ALLTests:g")
 fi
 
-if [ $compilation -eq 1 ]; then
-  echo "### Compilation of commit $commit"
+#######################
+#### PACK CREATION ####
+#######################
 
+if [ $packcreation -eq 1 ]; then
   if [ -d $MNHPACK/$name ]; then
-    echo "Pack already exists ($MNHPACK/$name), suppress it to be able to compile it again (or use the -s option to automatically suppress it)"
-    exit 5
-  fi
-
-  # Prepare the pack
-  cd $MNHPACK
-  cp $TARGZDIR/${refversion}${targzsuffix}.tar.gz .
-  tar xfz ${refversion}${targzsuffix}.tar.gz 
-  rm ${refversion}${targzsuffix}.tar.gz
-  mv ${refversion} $name
-  cd $name/src
-  # Routine that changed names
-  
-  [ -f PHYEX/turb/modd_diag_in_run.f90 ] && mv -f PHYEX/turb/modd_diag_in_run.f90 MNH/. #To be removed once, this is done in MNH-git-lfs repo before inclusion of last version of PHYEX
-
-  rm -rf PHYEX
-
-  MNH_EXPAND_DIR=$PHYEXTOOLSDIR/mnh_expand
-  export PATH=$MNH_EXPAND_DIR/filepp:$MNH_EXPAND_DIR/MNH_Expand_Array:$PATH
-
-  if [ $useexpand == 1 ]; then
-    expand_options="-D MNH_EXPAND -D MNH_EXPAND_LOOP"
+    if [ $onlyIfNeeded -eq 0 ]; then
+      echo "Pack already exists ($MNHPACK/$name), suppress it to be able to compile it again (or use the -s option to automatically suppress it)"
+      exit 5
+    fi
   else
-    expand_options=""
-  fi
-  subs="-s turb -s micro -s aux -s ext -s conv"
-  prep_code=$PHYEXTOOLSDIR/prep_code.sh
-  if [ "$fromdir" == '' ]; then
-    echo "Clone repository, and checkout commit $commit (using prep_code.sh)"
-    if [[ $commit == mesonh${separator}* ]]; then
-      $prep_code --renameFf --ilooprm -c $commit PHYEX #This commit is ready for inclusion
+    echo "### Pack creation for commit $commit"
+
+    # Prepare the pack
+    cd $MNHPACK
+    mkdir ${name}_$$
+    cd ${name}_$$
+    cp $TARGZDIR/${refversion}${targzsuffix}.tar.gz .
+    tar xfz ${refversion}${targzsuffix}.tar.gz 
+    rm ${refversion}${targzsuffix}.tar.gz
+    mv ${refversion} ../$name
+    cd ..
+    rmdir ${name}_$$
+    cd $name/src
+
+    # Routine that changed names
+    [ -f PHYEX/turb/modd_diag_in_run.f90 ] && mv -f PHYEX/turb/modd_diag_in_run.f90 MNH/. #To be removed once, this is done in MNH-git-lfs repo before inclusion of last version of PHYEX
+
+    rm -rf PHYEX
+
+    MNH_EXPAND_DIR=$PHYEXTOOLSDIR/mnh_expand
+    export PATH=$MNH_EXPAND_DIR/filepp:$MNH_EXPAND_DIR/MNH_Expand_Array:$PATH
+
+    if [ $useexpand == 1 ]; then
+      expand_options="-D MNH_EXPAND -D MNH_EXPAND_LOOP"
     else
-      $prep_code --renameFf --ilooprm -c $commit $expand_options $subs -m mesonh PHYEX
+      expand_options=""
+    fi
+    subs="-s turb -s micro -s aux -s ext -s conv"
+    prep_code=$PHYEXTOOLSDIR/prep_code.sh
+    if [ "$fromdir" == '' ]; then
+      echo "Clone repository, and checkout commit $commit (using prep_code.sh)"
+      if [[ $commit == mesonh${separator}* ]]; then
+        $prep_code --renameFf --ilooprm -c $commit PHYEX #This commit is ready for inclusion
+      else
+        $prep_code --renameFf --ilooprm -c $commit $expand_options $subs -m mesonh PHYEX
+      fi
+    else
+      echo "Copy $fromdir"
+      mkdir PHYEX
+      scp -q -r $fromdir/src PHYEX/
+      $prep_code --renameFf --ilooprm $expand_options $subs -m mesonh PHYEX
+    fi
+    rm -rf PHYEX/.git
+    find PHYEX -type f -exec touch {} \; #to be sure a recompilation occurs
+
+    # Move manually ext/ files in src/MNH
+    [ -f PHYEX/ext/yomhook.f90 ] && mv PHYEX/ext/yomhook.f90 PHYEX/ext/yomhook.F90
+    if [ -d PHYEX/ext ]; then
+      mv -f PHYEX/ext/* MNH/
+      rmdir PHYEX/ext
     fi
-  else
-    echo "Copy $fromdir"
-    mkdir PHYEX
-    scp -q -r $fromdir/src PHYEX/
-    $prep_code --renameFf --ilooprm $expand_options $subs -m mesonh PHYEX
-  fi
-  rm -rf PHYEX/.git
-  find PHYEX -type f -exec touch {} \; #to be sure a recompilation occurs
-
-  # Move manually ext/ files in src/MNH
-  [ -f PHYEX/ext/yomhook.f90 ] && mv PHYEX/ext/yomhook.f90 PHYEX/ext/yomhook.F90
-  if [ -d PHYEX/ext ]; then
-    mv -f PHYEX/ext/* MNH/
-    rmdir PHYEX/ext
-  fi
 
-  cd $MNHPACK/$name/src/PHYEX/turb
-  # Delete files of ${refversion}/src/MNH and MNH/src/LIB/SURCOUCHE/src with same name
-  for rep in turb micro conv aux ; do
-    cd ../$rep
-    for f in *.f90; do
-      echo $f
-      rm -f ../../MNH/$f
-      rm -f ../../LIB/SURCOUCHE/src/$f
+    cd $MNHPACK/$name/src/PHYEX/turb
+    # Delete files of ${refversion}/src/MNH and MNH/src/LIB/SURCOUCHE/src with same name
+    for rep in turb micro conv aux ; do
+      cd ../$rep
+      for f in *.f90; do
+        echo $f
+        rm -f ../../MNH/$f
+        rm -f ../../LIB/SURCOUCHE/src/$f
+      done
     done
-  done
-  cd ..
-  
-  # Delete old files of ${refversion}/src/MNH that is now called by mode_... NO /aux NEEDED!
-  find turb micro conv -name 'mode_*' > remove_non_mode.sh
-  sed -i 's/turb\/mode_/rm -f MNH\//g' remove_non_mode.sh
-  sed -i 's/micro\/mode_/rm -f MNH\//g' remove_non_mode.sh
-  sed -i 's/conv\/mode_/rm -f MNH\//g' remove_non_mode.sh
-  chmod +x remove_non_mode.sh
-  mv remove_non_mode.sh ../.
-  cd ../
-  ./remove_non_mode.sh
-  # Supress some files if they are not used anymore
-  ! grep -i MODI_COMPUTE_ENTR_DETR $(ls MNH/*compute_updraft* PHYEX/turb/*compute_updraft* 2>/dev/null) && rm -f MNH/compute_entr_detr.f90
-  ! grep -i MODI_TH_R_FROM_THL_RT_ $(ls MNH/compute_entr_detr.f90 MNH/compute_entr_detr.f90 PHYEX/turb/mode_compute_updraft*.f90 MNH/ice_adjust_bis.f90 MNH/prep_ideal_case.f90 MNH/set_rsou.f90 2>/dev/null)  > /dev/null && rm -f MNH/th_r_from_thl_rt_1d.f90 MNH/th_r_from_thl_rt_2d.f90 MNH/th_r_from_thl_rt_3d.f90
- 
-  # Routine that changed names
-  #To be removed once, this is done in MNH-git-lfs repo before inclusion of last version of PHYEX
-  rm -f PHYEX/micro/ini_rain_ice.f90
-  rm -f PHYEX/micro/lima_nucleation_procs.f90
-  
+    cd ..
+    
+    # Delete old files of ${refversion}/src/MNH that is now called by mode_... NO /aux NEEDED!
+    find turb micro conv -name 'mode_*' > remove_non_mode.sh
+    sed -i 's/turb\/mode_/rm -f MNH\//g' remove_non_mode.sh
+    sed -i 's/micro\/mode_/rm -f MNH\//g' remove_non_mode.sh
+    sed -i 's/conv\/mode_/rm -f MNH\//g' remove_non_mode.sh
+    chmod +x remove_non_mode.sh
+    mv remove_non_mode.sh ../.
+    cd ../
+    ./remove_non_mode.sh
+    # Supress some files if they are not used anymore
+    ! grep -i MODI_COMPUTE_ENTR_DETR $(ls MNH/*compute_updraft* PHYEX/turb/*compute_updraft* 2>/dev/null) && rm -f MNH/compute_entr_detr.f90
+    ! grep -i MODI_TH_R_FROM_THL_RT_ $(ls MNH/compute_entr_detr.f90 MNH/compute_entr_detr.f90 PHYEX/turb/mode_compute_updraft*.f90 MNH/ice_adjust_bis.f90 MNH/prep_ideal_case.f90 MNH/set_rsou.f90 2>/dev/null)  > /dev/null && rm -f MNH/th_r_from_thl_rt_1d.f90 MNH/th_r_from_thl_rt_2d.f90 MNH/th_r_from_thl_rt_3d.f90
  
-  #Configure and compilation
-  command -v module && modulelist=$(module -t list 2>&1 | tail -n +2) #save loaded modules
-  ./configure
-  set +e #file ends with a test that can return false
-  . ../conf/profile_mesonh-* #This lines modifies the list of loaded modules
-  set -e
-  rm -f ../exe/* #Suppress old executables, if any
-  make -j 8 2>&1 | tee ../Output_compilation
-  make installmaster 2>&1 | tee -a ../Output_compilation
-  command -v module && module load $modulelist #restore loaded modules
+    # Routine that changed names
+    #To be removed once, this is done in MNH-git-lfs repo before inclusion of last version of PHYEX
+    rm -f PHYEX/micro/ini_rain_ice.f90
+    rm -f PHYEX/micro/lima_nucleation_procs.f90
+
+    # Remove binaries
+    rm -f $MNHPACK/$name/exe/*
+
+    # Remove execution results
+    for t in $(echo $ALLTests | sed 's/,/ /g'); do
+      case1=$(echo $t | cut -d / -f 1)
+      case2=$(echo $t | cut -d / -f 2)
+      casedir=$MNHPACK/$name/MY_RUN/KTEST/$case1
+      [ -d $casedir/$case2 ] && rm -rf $casedir/$case2
+    done
+  fi
 fi
 
-if [ $run -ge 1 ]; then
-  echo "### Running of commit $commit"
+#####################
+#### COMPILATION ####
+#####################
 
-  if [ ! -f $MNHPACK/$name/exe/MESONH* ]; then
-    echo "Pack does not exist ($MNHPACK/$name) or compilation has failed, please check"
-    exit 6
+if [ $compilation -eq 1 ]; then
+  if [ $onlyIfNeeded -eq 0 -o ! -f $MNHPACK/$name/exe/MESONH* ]; then
+    echo "### Compilation of commit $commit"
+    cd $MNHPACK/$name/src
+    #Configure and compilation
+    command -v module && modulelist=$(module -t list 2>&1 | tail -n +2) #save loaded modules
+    ./configure
+    set +e #file ends with a test that can return false
+    . ../conf/profile_mesonh-* #This lines modifies the list of loaded modules
+    set -e
+    rm -f ../exe/* #Suppress old executables, if any
+    make -j 8 2>&1 | tee ../Output_compilation
+    make installmaster 2>&1 | tee -a ../Output_compilation
+    command -v module && module load $modulelist #restore loaded modules
   fi
+fi
 
+###################
+#### EXECUTION ####
+###################
+
+if [ $run -ge 1 ]; then
+  #Cleaning to suppress old results that may be confusing in case of a crash during the run
+  if [ $onlyIfNeeded -eq 0 ]; then
+    for t in $(echo $tests | sed 's/,/ /g'); do
+      case1=$(echo $t | cut -d / -f 1)
+      case2=$(echo $t | cut -d / -f 2)
+      casedir=$MNHPACK/$name/MY_RUN/KTEST/$case1
+      [ -d $casedir/$case2 ] && rm -rf $casedir/$case2
+    done
+  fi
+
+  #Run the tests one after the other
+  firstrun=1
   for t in $(echo $tests | sed 's/,/ /g'); do
-    case=$(echo $t | cut -d / -f 1)
-    exedir=$(echo $t | cut -d / -f 2)
-    if [ $run_in_ref -eq 1 ]; then
-      cd $REFDIR/${refversion}/MY_RUN/KTEST/$case/
-      [ ! -d ${exedir}_$commit ] && cp -R ${exedir} ${exedir}_$commit
-      cd $REFDIR/${refversion}/MY_RUN/KTEST/$case/${exedir}_$commit
-    else
-      #If the test case didn't exist in the tar.gz, we copy it from from the reference version
-      rep=$MNHPACK/$name/MY_RUN/KTEST/$case
-      [ ! -d $rep ] && cp -r $REFDIR/${refversion}/MY_RUN/KTEST/$case $rep
-      cd $rep
-
-      #Loop on the directories
-      for rep in *; do
-        if [[ -d "$rep" || ( -L "$rep" && ! -e "$rep" ) ]]; then #directory (or a link to a directory) or a broken link
-          if echo $availTests | grep ${case}/$rep > /dev/null; then
-            #This directory is a test case
-            if [ $rep == ${exedir} ]; then
-              #this is the case we want to run
-              rm -rf $rep
-              cp -r $REFDIR/${refversion}/MY_RUN/KTEST/$case/$rep .
+    if echo $allowedTests | grep -w $t > /dev/null; then #test is allowed on this plateform
+      case1=$(echo $t | cut -d / -f 1)
+      case2=$(echo $t | cut -d / -f 2)
+      casedir=$MNHPACK/$name/MY_RUN/KTEST/$case1
+      if [ ! -d $casedir/$case2 ]; then #We do not enter systematically this part if onlyIfNeeded=1
+        if [ $firstrun -eq 1 ]; then
+          echo "### Running of commit $commit"
+          firstrun=0
+        fi
+
+        if [ ! -f $MNHPACK/$name/exe/MESONH* ]; then
+          echo "Pack does not exist ($MNHPACK/$name) or compilation has failed, please check"
+          exit 6
+        fi
+
+        #If the test case didn't exist in the tar.gz, we copy it from from the reference version
+        #and we suppress all the test directories for this case
+        if [ ! -d $casedir ]; then
+          cp -r $MNHPACK/${refversion}/MY_RUN/KTEST/$case1 $casedir/
+          for newt in $(echo $ALLTests | sed 's/,/ /g'); do
+            newcase1=$(echo $newt | cut -d / -f 1)
+            newcase2=$(echo $newt | cut -d / -f 2)
+            if [ $case1 == $newcase1 ]; then
+              [ -d $casedir/$newcase2 ] rm -rf $casedir/$newcase2
             fi
-          else
-            #This directory might be neede to run the test case, we take the reference version
-            rm -rf $rep
-            ln -s $REFDIR/${refversion}/MY_RUN/KTEST/$case/$rep 
-          fi
+          done
         fi
-      done
 
-      #In case subcase does not exist we create it
-      [ ! -d ${exedir} ] && cp -r $REFDIR/${refversion}/MY_RUN/KTEST/$case/${exedir} .
-      cd ${exedir}
-    fi
+        #Loop on the subdirectories to replace them by links to their reference version
+        cd $casedir
+        for d in *; do
+          if [[ -d "$d" || ( -L "$d" && ! -e "$d" ) ]]; then #directory (or a link to a directory) or a broken link
+            if ! echo $ALLTests | grep ${case1}/$d > /dev/null; then
+              #This directory is not a test case but might be needed to run the test case,
+              #we take the reference version
+              rm -rf $d
+              ln -s $MNHPACK/${refversion}/MY_RUN/KTEST/$case1/$d 
+            fi
+          fi
+        done
 
-    set +e #file ends with a test that can return false
-    [ $compilation -eq 0 ] && . $MNHPACK/$name/conf/profile_mesonh-*
-    set -e
-    ./clean_mesonh_xyz
-    set +o pipefail #We want to go through all tests
-    ./run_mesonh_xyz | tee Output_run
-    set -o pipefail
+        #We create the test case directory
+        cp -r $MNHPACK/${refversion}/MY_RUN/KTEST/$case1/${case2} .
+
+        #execution
+        cd ${case2}
+        set +e #file ends with a test that can return false
+        [ $compilation -eq 0 ] && . $MNHPACK/$name/conf/profile_mesonh-*
+        set -e
+        ./clean_mesonh_xyz
+        set +o pipefail #We want to go through all tests
+        ./run_mesonh_xyz | tee Output_run
+        set -o pipefail
+      fi
+    fi
   done
 fi
 
+####################
+#### COMPARISON ####
+####################
+
 if [ $check -eq 1 ]; then
   echo "### Check commit $commit against commit $reference"
 
   allt=0
   for t in $(echo $tests | sed 's/,/ /g'); do
-    case=$(echo $t | cut -d / -f 1)
-    exedir=$(echo $t | cut -d / -f 2)
-    if [ $t == 007_16janvier/008_run2 ]; then
-      path_user=$path_user_beg/MY_RUN/KTEST/007_16janvier/008_run2$path_user_end
-      path_ref=$path_ref_beg/MY_RUN/KTEST/007_16janvier/008_run2$path_ref_end
-    elif  [ $t == 007_16janvier/008_run2_turb3D ]; then
-      path_user=$path_user_beg/MY_RUN/KTEST/007_16janvier/008_run2_turb3D$path_user_end
-      path_ref=$path_ref_beg/MY_RUN/KTEST/007_16janvier/008_run2_turb3D$path_ref_end
-    elif  [ $t == 007_16janvier/008_run2_lredf ]; then
-      path_user=$path_user_beg/MY_RUN/KTEST/007_16janvier/008_run2_lredf$path_user_end
-      path_ref=$path_ref_beg/MY_RUN/KTEST/007_16janvier/008_run2_lredf$path_ref_end
-    elif   [ $t == COLD_BUBBLE/002_mesonh ]; then
-      path_user=$path_user_beg/MY_RUN/KTEST/COLD_BUBBLE/002_mesonh$path_user_end
-      path_ref=$path_ref_beg/MY_RUN/KTEST/COLD_BUBBLE/002_mesonh$path_ref_end
-    elif   [ $t == COLD_BUBBLE_3D/002_mesonh ]; then
-      path_user=$path_user_beg/MY_RUN/KTEST/COLD_BUBBLE_3D/002_mesonh$path_user_end
-      path_ref=$path_ref_beg/MY_RUN/KTEST/COLD_BUBBLE_3D/002_mesonh$path_ref_end
-    elif   [ $t == ARMLES/RUN ]; then
-      path_user=$path_user_beg/MY_RUN/KTEST/ARMLES/RUN$path_user_end
-      path_ref=$path_ref_beg/MY_RUN/KTEST/ARMLES/RUN$path_ref_end
-    elif   [ $t == OCEAN_LES/004_run2 ]; then
-      path_user=$path_user_beg/MY_RUN/KTEST/OCEAN_LES/004_run2$path_user_end
-      path_ref=$path_ref_beg/MY_RUN/KTEST/OCEAN_LES/004_run2$path_ref_end
-    elif   [ $t == 014_LIMA/002_mesonh ]; then
-      path_user=$path_user_beg/MY_RUN/KTEST/014_LIMA/002_mesonh$path_user_end
-      path_ref=$path_ref_beg/MY_RUN/KTEST/014_LIMA/002_mesonh$path_ref_end
-    else
-      echo "cas $t non reconnu"
-    fi
-
-    if [ ! -d $path_user ]; then
-      echo "$path_user is missing, please run the simulation"
-      exit 7
-    fi
-    if [ ! -d $path_ref ]; then
-      echo "$path_ref is missing, please run the reference simulation"
-      exit 8
-    fi
-
-    if [ $case == 007_16janvier ]; then
-      # Compare variable of both Synchronous and Diachronic files with printing difference
-      file1=$path_user/16JAN.1.12B18.001.nc 
-      file2=$path_ref/16JAN.1.12B18.001.nc
-      file3=$path_user/16JAN.1.12B18.000.nc 
-      file4=$path_ref/16JAN.1.12B18.000.nc
-      if [ -f $file1 -a -f $file2 ]; then
-        echo "Compare with python..."
-        set +e
-        $PHYEXTOOLSDIR/compare.py --f1 $file1 --f2 $file2 --f3 $file3 --f4 $file4
-        t=$?
-        set -e
-        allt=$(($allt+$t))
-        
-        #Check bit-repro before date of creation of Synchronous file from ncdump of all values (pb with direct .nc file checks)
-        echo "Compare with ncdump..."
-        set +e
-        bit_diff=57100
-        diff <(ncdump $file1 | head -c $bit_diff) <(ncdump $file2 | head -c $bit_diff)
-        t=$?
-        set -e
-        allt=$(($allt+$t))
-      else
-        [ ! -f $file1 ] && echo "  $file1 is missing"
-        [ ! -f $file2 ] && echo "  $file2 is missing"
-        allt=$(($allt+1))
+    if echo $allowedTests | grep -w $t > /dev/null; then
+      #Run the reference if needed
+      if [ $computeRefIfNeeded -eq 1 ]; then
+        if [ "${refByTest[$t]}" == "" ]; then
+          echo "Don't know how to compile/run $refversion"
+          exit 3
+        else
+          #We must call it in another shell because of the potentially loaded MesoNH profile
+          #because we cannot load two MesoNH profiles in the same shell
+          env -i $SHELL -l -c "MNHPACK=${MNHPACK} TARGZDIR=${TARGZDIR} \
+                               PHYEXREPOuser=${PHYEXREPOuser} PHYEXREPOprotocol=${PHYEXREPOprotocol} \
+                               $0 -p -c -r -t $t --onlyIfNeeded ${refByTest[$t]}"
+        fi
       fi
-    fi
 
-    if [ $case == COLD_BUBBLE ]; then
-      # Compare variable of both Synchronous files with printing difference
-      file1=$path_user/BUBBL.1.CEN4T.001.nc
-      file2=$path_ref/BUBBL.1.CEN4T.001.nc
-      if [ -f $file1 -a -f $file2 ]; then
-        echo "Compare with python..."
-        set +e
-        $PHYEXTOOLSDIR/compare.py --f1 $file1 --f2 $file2
-        t=$?
-        set -e
-        allt=$(($allt+$t))
-        
-        #Check bit-repro before date of creation of Synchronous file from ncdump of all values (pb with direct .nc file checks)
-        echo "Compare with ncdump..."
-        set +e
+      #Files to compare
+      refname=${refnameByTest[$t]}
+      case1=$(echo $t | cut -d / -f 1)
+      case2=$(echo $t | cut -d / -f 2)
+      path_user=$MNHPACK/$name/MY_RUN/KTEST/$case1/$case2
+      path_ref=$MNHPACK/$refname/MY_RUN/KTEST/$case1/$case2
+      file3=""
+      file4=""
+      if [ $case1 == 007_16janvier ]; then
+        file1=$path_user/16JAN.1.12B18.001.nc 
+        file2=$path_ref/16JAN.1.12B18.001.nc
+        file3=$path_user/16JAN.1.12B18.000.nc 
+        file4=$path_ref/16JAN.1.12B18.000.nc
+        bit_diff=57100
+      elif [ $case1 == COLD_BUBBLE ]; then
+        file1=$path_user/BUBBL.1.CEN4T.001.nc
+        file2=$path_ref/BUBBL.1.CEN4T.001.nc
         bit_diff=27300
-        diff <(ncdump $file1 | head -c $bit_diff) <(ncdump $file2 | head -c $bit_diff)
-        t=$?
-        set -e
-        allt=$(($allt+$t))
-      else
-        [ ! -f $file1 ] && echo "  $file1 is missing"
-        [ ! -f $file2 ] && echo "  $file2 is missing"
-        allt=$(($allt+1))
-      fi
-    fi
-
-   if [ $case == OCEAN_LES ]; then
-        # Compare variable of both Synchronous files with printing difference
+      elif [ $case1 == OCEAN_LES ]; then
         file1=$path_user/SPWAN.2.25m00.001.nc
         file2=$path_ref/SPWAN.2.25m00.001.nc
-        if [ -f $file1 -a -f $file2 ]; then
-          echo "Compare with python..."
-          set +e
-          $PHYEXTOOLSDIR/compare.py --f1 $file1 --f2 $file2
-          t=$?
-          set -e
-          allt=$(($allt+$t))
-  
-          #Check bit-repro before date of creation of Synchronous file from ncdump of all values (pb with direct .nc file checks)
-          echo "Compare with ncdump..."
-          set +e
-          bit_diff=18400
-          diff <(ncdump $file1 | head -c $bit_diff) <(ncdump $file2 | head -c $bit_diff)
-          t=$?
-          set -e
-          allt=$(($allt+$t))
-        else
-          [ ! -f $file1 ] && echo "  $file1 is missing"
-          [ ! -f $file2 ] && echo "  $file2 is missing"
-          allt=$(($allt+1))
-        fi
-      fi
-
-    if [ $case == COLD_BUBBLE_3D ]; then
-      # Compare variable of both Synchronous and Diachronic files with printing difference
-      file1=$path_user/BUBBL.1.CEN4T.001.nc
-      file2=$path_ref/BUBBL.1.CEN4T.001.nc
-      file3=$path_user/BUBBL.1.CEN4T.000.nc
-      file4=$path_ref/BUBBL.1.CEN4T.000.nc
-      if [ -f $file1 -a -f $file2 ]; then
-        echo "Compare with python..."
-        set +e
-        $PHYEXTOOLSDIR/compare.py --f1 $file1 --f2 $file2 --f3 $file3 --f4 $file4
-        t=$?
-        set -e
-        allt=$(($allt+$t))
-
-        #Check bit-repro before date of creation of Synchronous file from ncdump of all values (pb with direct .nc file checks)
-        echo "Compare with ncdump..."
-        set +e
-        diff <(ncdump $file1 | head -c 27300) <(ncdump $file2 | head -c 27300)
-        t=$?
-        set -e
-        allt=$(($allt+$t))
+        bit_diff=18400
+      elif [ $case1 == COLD_BUBBLE_3D ]; then
+        file1=$path_user/BUBBL.1.CEN4T.001.nc
+        file2=$path_ref/BUBBL.1.CEN4T.001.nc
+        file3=$path_user/BUBBL.1.CEN4T.000.nc
+        file4=$path_ref/BUBBL.1.CEN4T.000.nc
+        bit_diff=27300
+      elif [ $case1 == ARMLES ]; then
+        file1=$path_user/ARM__.1.CEN4T.001.nc
+        file2=$path_ref/ARM__.1.CEN4T.001.nc
+        file3=$path_user/ARM__.1.CEN4T.000.nc
+        file4=$path_ref/ARM__.1.CEN4T.000.nc
+        bit_diff=76300
+      elif [ $case1 == 014_LIMA ]; then
+        file1=$path_user/XPREF.1.SEG01.002.nc
+        file2=$path_ref/XPREF.1.SEG01.002.nc
+        file3=$path_user/XPREF.1.SEG01.000.nc
+        file4=$path_ref/XPREF.1.SEG01.000.nc
+        bit_diff=32200
       else
-        [ ! -f $file1 ] && echo "  $file1 is missing"
-        [ ! -f $file2 ] && echo "  $file2 is missing"
-        allt=$(($allt+1))
+        echo "cas $t non reconnu"
       fi
-    fi
 
-    if [ $case == ARMLES ]; then
-      # Compare variable of both Synchronous and Diachronic files with printing difference
-      file1=$path_user/ARM__.1.CEN4T.001.nc
-      file2=$path_ref/ARM__.1.CEN4T.001.nc
-      file3=$path_user/ARM__.1.CEN4T.000.nc
-      file4=$path_ref/ARM__.1.CEN4T.000.nc
-      if [ -f $file1 -a -f $file2 ]; then
-        echo "Compare with python..."
-        set +e
-        $PHYEXTOOLSDIR/compare.py --f1 $file1 --f2 $file2 --f3 $file3 --f4 $file4
-        t=$?
-        set -e
-        allt=$(($allt+$t))
-
-        #Check bit-repro before date of creation of Synchronous file from ncdump of all values (pb with direct .nc file checks)
-        echo "Compare with ncdump..."
-        set +e
-        bit_diff=76300
-        diff <(ncdump $file1 | head -c $bit_diff) <(ncdump $file2 | head -c $bit_diff)
-        t=$?
-        set -e
-        allt=$(($allt+$t))
-      else
-        [ ! -f $file1 ] && echo "  $file1 is missing"
-        [ ! -f $file2 ] && echo "  $file2 is missing"
-        allt=$(($allt+1))
+      if [ ! -d $path_user ]; then
+        echo "$path_user is missing, please run the simulation"
+        exit 7
+      fi
+      if [ ! -d $path_ref ]; then
+        echo "$path_ref is missing, please run the reference simulation"
+        exit 8
       fi
-    fi
 
-    if [ $case == 014_LIMA ]; then
-      # Compare variable of both Synchronous and Diachronic files with printing difference
-      file1=$path_user/XPREF.1.SEG01.002.nc
-      file2=$path_ref/XPREF.1.SEG01.002.nc
-      file3=$path_user/XPREF.1.SEG01.000.nc
-      file4=$path_ref/XPREF.1.SEG01.000.nc
+      #Comparison
       if [ -f $file1 -a -f $file2 ]; then
+        # Compare variable of both Synchronous and Diachronic files with printing difference
         echo "Compare with python..."
         set +e
-        $PHYEXTOOLSDIR/compare.py --f1 $file1 --f2 $file2 --f3 $file3 --f4 $file4
-        t=$?
+        if [ "$file3" == "" ]; then
+          $PHYEXTOOLSDIR/compare.py --f1 $file1 --f2 $file2
+          t=$?
+        else
+          $PHYEXTOOLSDIR/compare.py --f1 $file1 --f2 $file2 --f3 $file3 --f4 $file4
+          t=$?
+        fi
         set -e
         allt=$(($allt+$t))
 
-        #Check bit-repro before date of creation of Synchronous file from ncdump of all values (pb with direct .nc file checks)
+        #Check bit-repro before date of creation of Synchronous file from ncdump of all values
+        #(pb with direct .nc file checks)
         echo "Compare with ncdump..."
         set +e
-        bit_diff=32200
         diff <(ncdump $file1 | head -c $bit_diff) <(ncdump $file2 | head -c $bit_diff)
         t=$?
         set -e
@@ -559,6 +553,10 @@ if [ $check -eq 1 ]; then
   echo "...comparison done: $status"
 fi
 
+##################
+#### CLEANING ####
+##################
+
 if [ $remove -eq 1 ]; then
   echo "### Remove model directory for commit $commit"
   [ -d $MNHPACK/$name ] && rm -rf $MNHPACK/$name
diff --git a/tools/testing.sh b/tools/testing.sh
index a413671d62cd507f127df9e078b8e92477a2c816..aec67ad892c6da243ea3ffe4599c721c99b0beb6 100755
--- a/tools/testing.sh
+++ b/tools/testing.sh
@@ -299,9 +299,9 @@ if [ ${force} -eq 1 -o $(get_statuses "${SHA}" | grep "${context}" | wc -l) -eq
       jsonfile="src/${model}/${model}_version.json"
       docmp=0
     else
-      compilation='-c'
+      compilation='-p -c'
       execution='-r'
-      comparison='-C'
+      comparison='-C --computeRefIfNeeded'
       jsonfile="src/${model}/${model}_version.json"
       docmp=1
     fi