diff --git a/build/with_fcm/make_fcm.sh b/build/with_fcm/make_fcm.sh
index 20d1f0c29132627c95751e229619fa32cb548d4e..f89e38d49f93b0db76668d29df202392c605639e 100755
--- a/build/with_fcm/make_fcm.sh
+++ b/build/with_fcm/make_fcm.sh
@@ -14,6 +14,8 @@ function parse_args() {
   MESONHPROFILE=
   useexpand=1
   commit=""
+  packcreation=0
+  compilation=0
   # pass unrecognized arguments to fcm
   FCM_ARGS=""
   
@@ -30,6 +32,8 @@ $0 [options]
 --mesonhprofile FILE  build using Méso-NH profile and rules (--arch must be used to give a name to the build dir)
 --noexpand            do not use mnh_expand (code will be in array-syntax)"
 --commit              commit hash (or a directory) to test; do not use this option from within a repository
+-p                    creates 'pack' (compilation directory)
+-c                    performs compilation
 
 Unrecognized options are passed to the fcm build command. Useful options include :
 --new                   clean build tree before building
@@ -39,6 +43,8 @@ Unrecognized options are passed to the fcm build command. Useful options include
 For details on FCM, see 
     http://metomi.github.io/fcm/doc/user_guide/build.html
     http://metomi.github.io/fcm/doc/user_guide/command_ref.html#fcm-build
+
+If neither creation nor execution is requested, both steps are performed.
 EOF
         exit;;
       "--arch")
@@ -51,6 +57,8 @@ EOF
         MESONHPROFILE=$1 ; shift ;;
       '--noexpand') useexpand=0;;
       '--commit') commit=$1; shift;;
+      '-p') packcreation=1;;
+      '-c') compilation=1;;
       *)
         FCM_ARGS="$FCM_ARGS $OPTION" ;;
     esac
@@ -64,6 +72,11 @@ EOF
     echo "--arch option is mandatory if --mesonhprofile option is used"
     exit 3
   fi
+  if [ $packcreation -eq 0 -a \
+       $compilation -eq 0 ]; then
+    packcreation=1
+    compilation=1
+  fi
 }
 
 function check_install_fcm() {
@@ -248,85 +261,89 @@ chmod +x compilation.sh
 # Parse command line arguments
 parse_args $*
 
-# Change current working dir
-cd -P $(dirname $0)
-
-# Check the fcm installation
-check_install_fcm
-
-# Check the fiat installation
-check_install_fiat
-
-# Create the build directory and set up the build system
-builddir=arch_$ARCH
-if [ -d $builddir ]; then
-  echo "$builddir already exists. To rerun compilation, please enter this directory and use the compilation.sh script."
-  echo "Otherwise, you can remove the $builddir directory and execute again this script."
-  exit 1
-fi
-mkdir $builddir
-if [ "$GMKFILE" != "" ]; then
-  touch $builddir/arch.env
-  gmkfile2arch $GMKFILE $builddir/arch.fcm
-elif [ "$MESONHPROFILE" != "" ]; then
-  touch $builddir/arch.env
-  mesonhprofile2archenv $MESONHPROFILE $builddir/arch.fcm $builddir/arch.env
-else
-  cp ${ARCH_PATH}/arch-${ARCH}.env $builddir/arch.env
-  cp ${ARCH_PATH}/arch-${ARCH}.fcm $builddir/arch.fcm 
-fi
-cp fcm-make.cfg $builddir
-cd $builddir
-
-# Populate the source directory with (modified) PHYEX source code
-[ "$commit" == "" ] && commit=$PWD/../../.. #Current script run from within a PHYEX repository
-if echo $commit | grep '/' | grep -v '^tags/' > /dev/null; then
-  # We get the source code directly from a directory
-  fromdir=$commit
-else
-  # We use a commit to checkout
-  fromdir=''
-fi
-#Expand options
-if [ $useexpand == 1 ]; then
-  expand_options="-D MNH_EXPAND -D MNH_EXPAND_LOOP"
-else
-  expand_options=""
-fi
-PHYEXTOOLSDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"/../../../tools #if run from within a PHYEX repository
-UPDATEDPATH=$PATH
-which prep_code.sh > /dev/null || export UPDATEDPATH=$PHYEXTOOLSDIR:$PATH
-subs="$subs -s turb -s shallow -s turb_mnh -s micro -s aux -s ice_adjust -s rain_ice -s rain_ice_old -s support"
-if [ "$fromdir" == '' ]; then
-  echo "Clone repository, and checkout commit $commit (using prep_code.sh)"
-  if [[ $commit == testprogs${separator}* ]]; then
-    PATH=$UPDATEDPATH prep_code.sh -c $commit src #This commit is ready for inclusion
+if [ $packcreation -eq 1 ]; then
+  # Change current working dir
+  cd -P $(dirname $0)
+  
+  # Check the fcm installation
+  check_install_fcm
+  
+  # Check the fiat installation
+  check_install_fiat
+  
+  # Create the build directory and set up the build system
+  builddir=arch_$ARCH
+  if [ -d $builddir ]; then
+    echo "$builddir already exists. To rerun compilation, please enter this directory and use the compilation.sh script."
+    echo "Otherwise, you can remove the $builddir directory and execute again this script."
+    exit 1
+  fi
+  mkdir $builddir
+  if [ "$GMKFILE" != "" ]; then
+    touch $builddir/arch.env
+    gmkfile2arch $GMKFILE $builddir/arch.fcm
+  elif [ "$MESONHPROFILE" != "" ]; then
+    touch $builddir/arch.env
+    mesonhprofile2archenv $MESONHPROFILE $builddir/arch.fcm $builddir/arch.env
+  else
+    cp ${ARCH_PATH}/arch-${ARCH}.env $builddir/arch.env
+    cp ${ARCH_PATH}/arch-${ARCH}.fcm $builddir/arch.fcm 
+  fi
+  cp fcm-make.cfg $builddir
+  cd $builddir
+  
+  # Populate the source directory with (modified) PHYEX source code
+  [ "$commit" == "" ] && commit=$PWD/../../.. #Current script run from within a PHYEX repository
+  if echo $commit | grep '/' | grep -v '^tags/' > /dev/null; then
+    # We get the source code directly from a directory
+    fromdir=$commit
+  else
+    # We use a commit to checkout
+    fromdir=''
+  fi
+  #Expand options
+  if [ $useexpand == 1 ]; then
+    expand_options="-D MNH_EXPAND -D MNH_EXPAND_LOOP"
   else
-    PATH=$UPDATEDPATH prep_code.sh -c $commit $expand_options $subs -m testprogs src
+    expand_options=""
   fi
-else
-  echo "Copy $fromdir"
-  mkdir src
-  scp -q -r $fromdir/src src/
-  PATH=$UPDATEDPATH prep_code.sh $expand_options $subs -m testprogs src
+  PHYEXTOOLSDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"/../../../tools #if run from within a PHYEX repository
+  UPDATEDPATH=$PATH
+  which prep_code.sh > /dev/null || export UPDATEDPATH=$PHYEXTOOLSDIR:$PATH
+  subs="$subs -s turb -s shallow -s turb_mnh -s micro -s aux -s ice_adjust -s rain_ice -s rain_ice_old -s support"
+  if [ "$fromdir" == '' ]; then
+    echo "Clone repository, and checkout commit $commit (using prep_code.sh)"
+    if [[ $commit == testprogs${separator}* ]]; then
+      PATH=$UPDATEDPATH prep_code.sh -c $commit src #This commit is ready for inclusion
+    else
+      PATH=$UPDATEDPATH prep_code.sh -c $commit $expand_options $subs -m testprogs src
+    fi
+  else
+    echo "Copy $fromdir"
+    mkdir src
+    scp -q -r $fromdir/src src/
+    PATH=$UPDATEDPATH prep_code.sh $expand_options $subs -m testprogs src
+  fi
+  
+  # Add some code
+  cd src
+  ln -s ../../fiat/src fiat
+  cat <<..EOF > dummyprog.F90
+  PROGRAM DUMMYPROG
+    PRINT*, "CREATED TO FORCE FCM TO LINK SOMETHING"
+  END PROGRAM DUMMYPROG
+..EOF
 fi
 
-# Add some code
-cd src
-ln -s ../../fiat/src fiat
-cat <<EOF > dummyprog.F90
-PROGRAM DUMMYPROG
-  PRINT*, "CREATED TO FORCE FCM TO LINK SOMETHING"
-END PROGRAM DUMMYPROG
-EOF
-
 # Build the compilation script and run it
-cd ..
-build_compilation_script src
-./compilation.sh
-ln -s build/bin/libphyex.so .
-
-# Check if python can open the resulting shared lib
-python3 -c "from ctypes import cdll; cdll.LoadLibrary('./libphyex.so')"
-
-# ldd -r ./libphyex.so should also give interesting results
+if [ $compilation -eq 1 ]; then
+  cd -P $(dirname $0)/arch_$ARCH
+  build_compilation_script src
+  ./compilation.sh
+  ln -s build/bin/libphyex.so .
+  
+  # Check if python can open the resulting shared lib
+  python3 -c "from ctypes import cdll; cdll.LoadLibrary('./libphyex.so')"
+  
+  # ldd -r ./libphyex.so should also give interesting results
+fi
diff --git a/src/testprogs/testprogs_version.json b/src/testprogs/testprogs_version.json
index 528914ce657e44610fe13f3e2a9eb15a9837ba2b..95dc1e732e72ca45ac96d382e7e7d398a2721141 100644
--- a/src/testprogs/testprogs_version.json
+++ b/src/testprogs/testprogs_version.json
@@ -1,5 +1,9 @@
 {
 "testing": {
-            "ALL":"41c6be7"
+            "ice_adjust":"41c6be7",
+            "rain_ice":"41c6be7",
+            "rain_ice_old":"41c6be7",
+            "turb":"41c6be7",
+            "shallow":"41c6be7"
            }
 }
diff --git a/tools/check_commit_ial.sh b/tools/check_commit_ial.sh
index ede8c099e988d26cd28b50a96c93b36f8104bb84..3f5e489cef849a195878fe952613953b50412e08 100755
--- a/tools/check_commit_ial.sh
+++ b/tools/check_commit_ial.sh
@@ -115,7 +115,7 @@ mainPackVersion=${mainPackVersion:-${defaultMainPackVersion}}
 ################################
 
 function usage {
-  echo "Usage: $0 [-h] [-p] [-c] [-r] [-C] [-s] [-f] [--noexpand] [-t test] [--cycle CYCLE] [--scripttag TAG] [--repo-user USER] [--repo-protocol PROTOCOL] [--remove] [--onlyIfNeeded] [--computeRefIfNeeded] commit [reference]"
+  echo "Usage: $0 [-h] [-p] [-c] [-r] [-C] [-s] [-f] [--noexpand] [-t TEST] [--cycle CYCLE] [--scripttag TAG] [--repo-user USER] [--repo-protocol PROTOCOL] [--remove] [--onlyIfNeeded] [--computeRefIfNeeded] commit [reference]"
   echo "commit          commit hash (or a directory, or among $specialPack) to test"
   echo "reference       commit hash (or a directory, or among $specialPack) REF to use as a reference"
   echo "-s              suppress compilation pack"
@@ -123,7 +123,7 @@ function usage {
   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 "-t TEST         comma separated list of tests to execute"
   echo "                or ALL to execute all tests"
   echo "--noexpand      do not use mnh_expand (code will be in array-syntax)"
   echo "-f              full compilation (do not use pre-compiled pack)"
diff --git a/tools/check_commit_mesonh.sh b/tools/check_commit_mesonh.sh
index de8e01b119faac78f715921eafee638c31846901..aff97bf6575b8140b8b363006be36fe1d5e0a74d 100755
--- a/tools/check_commit_mesonh.sh
+++ b/tools/check_commit_mesonh.sh
@@ -42,7 +42,7 @@ TARGZDIR=${TARGZDIR:=$PHYEXTOOLSDIR/pack/}
 ################################
 
 function usage {
-  echo "Usage: $0 [-h] [-p] [-c] [-r] [-C] [-s] [--expand] [-t test] [--repo-user USER] [--repo-protocol PROTOCOL] [--remove] [--onlyIfNeeded] [--computeRefIfNeeded] commit [reference]"
+  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"
@@ -50,7 +50,7 @@ function usage {
   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 "-t TEST         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"
@@ -65,7 +65,7 @@ function usage {
   echo "--computeRefIfNeeded"
   echo "                computes the missing references"
   echo ""
-  echo "If nothing is asked (compilation, running, check, removing) everything"
+  echo "If nothing is asked (pack creation, compilation, running, check, removing) everything"
   echo "except the removing is done"
   echo
   echo "If no test is aked for, the default one ($defaultTest) is executed"
diff --git a/tools/check_commit_testprogs.sh b/tools/check_commit_testprogs.sh
index 3314f89eccc4b2f75912b8982cd102c364ca19bb..67e71fa0888df29dc7823250d750673b73856e9d 100755
--- a/tools/check_commit_testprogs.sh
+++ b/tools/check_commit_testprogs.sh
@@ -28,13 +28,32 @@ set -o pipefail #abort if left command on a pipe fails
 # - The last commit of the testprogs_data2 branch (based on 48t3) is able to produce the data
 #   for the rain_ice_old testprog.
 
+#######################
+#### CONFIGURATION ####
+#######################
+
+#Special pack names:
+# - ref: symbolic name to the commit to use as a reference
+#        useless for the commits containing a json file
 specialName="ref"
-availTests="ice_adjust,rain_ice,rain_ice_old,turb,shallow"
-defaultTest='ALL'
+
+#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 ial_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="ice_adjust,rain_ice,rain_ice_old,turb,shallow"
+defaultTest=${ALLTests}
+allowedTests=${ALLTests}
+
 separator='_' #- seprator must be in sync with prep_code.sh separator
 
 PHYEXTOOLSDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
 
+TESTDIR=${TESTPROGSDIR:=$HOME/TESTPROGS}
+
 dirdata=$PHYEXTOOLSDIR/testprogs_data
 if [ $(hostname | cut -c 1-7) == 'belenos' -o $(hostname | cut -c 1-7) == 'taranis' ]; then
   HPC=1
@@ -45,26 +64,33 @@ else
 fi
 defaultRef=ref
 
+################################
+#### COMMAND LINE ARGUMENTS ####
+################################
+
 function usage {
-  echo "Usage: $0 [-h] [-c] [-r] [-C] [-s] [-f] [--noexpand] [-t test] [--repo-user user] [--repo-protocol protocol] [-a arch] [-A arch] [--remove] commit [reference]"
+  echo "Usage: $0 [-h] [-p] [-c] [-r] [-C] [-s] [--noexpand] [-t TEST] [--repo-user USER] [--repo-protocol PROTOCOL] [-a ARCH] [-A ARCH] [--remove] [--onlyIfNeeded] [--computeRefIfNeeded] commit [reference]"
   echo "commit          commit hash (or a directory, or among $specialName) to test"
   echo "reference       commit hash (or a directory, or among $specialName) REF to use as a reference"
   echo "-s              suppress compilation directory"
+  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 "-t TEST         comma separated list of tests to execute"
   echo "                or ALL to execute all tests"
   echo "--noexpand      do not use mnh_expand (code will be in array-syntax)"
-  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 "-a arch         architecture name to use to build and run the commit (=$defaultarchfile)"
-  echo "-A arch         architecture name to use for the reference simulation (=$defaultarchfile)"
+  echo "-a arch ARCH    architecture name to use to build and run the commit (=$defaultarchfile)"
+  echo "-A arch ARCH    architecture name to use for the reference simulation (=$defaultarchfile)"
   echo ""
-  echo "If nothing is asked (compilation, running, check, removing) everything"
+  echo "If nothing is asked (pack creation compilation, running, check, removing) everything"
   echo "except the removing is done"
   echo
   echo "If no test is aked for, the default one ($defaultTest) is executed"
@@ -77,6 +103,7 @@ function usage {
   echo "The commit can be a tag, written with syntagx tags/<TAG>"
 }
 
+packcreation=0
 compilation=0
 run=0
 check=0
@@ -88,11 +115,14 @@ useexpand=""
 archfile=$defaultarchfile
 refarchfile=$defaultarchfile
 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;;
@@ -103,6 +133,9 @@ while [ -n "$1" ]; do
     '--remove') remove=1;;
     '-a') archfile="$2"; shift;;
     '-A') refarchfile="$2"; shift;;
+    '--onlyIfNeeded') onlyIfNeeded=1;;
+    '--computeRefIfNeeded') computeRefIfNeeded=1;;
+
     #--) shift; break ;;
      *) if [ -z "${commit-}" ]; then
           commit=$1
@@ -118,31 +151,12 @@ while [ -n "$1" ]; do
   shift
 done
 
-TESTDIR=${TESTPROGSDIR:=$HOME/TESTPROGS}
-
-function exescript () {
-  #usage: exescript <output file> <script> [arg [arg ...]]
-  output=$1
-  shift
-  if [ $HPC -eq 1 ]; then
-    sbatch --wait -o $output $@
-    cat $output
-  else
-    $@ 2>&1 | tee $output
-  fi
-}
-
-if [ -z "${tests-}" ]; then
-  tests=$defaultTest
-fi
-if [ $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
@@ -158,115 +172,233 @@ if [ $check -eq 1 -a -z "${reference-}" ]; then
   exit 3
 fi
 
+##############################
+#### 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)"
+}
+
+###########################
+#### COMMIT ADAPTATION ####
+###########################
+
+#Name and directory for compiling and executing user pack
+declare -A refByTest
 if echo $commit | grep '/' | grep -v '^tags/' > /dev/null; then
+  #The git repository is a directory
   name=$(echo $commit | sed 's/\//'${separator}'/g' | sed 's/:/'${separator}'/g' | sed 's/\./'${separator}'/g')
+  content_testprogs_version=$(scp $commit/src/testprogs/testprogs_version.json /dev/stdout 2>/dev/null || echo "")
   [ $suppress -eq 1 -a -d $TESTDIR/$name ] && rm -rf $TESTDIR/$name
 elif echo $specialName | grep -w $commit > /dev/null; then
   name="$commit"
 else
+  #The git repository is on github
+  if [[ $commit == testprogs${separator}* ]]; then
+    testprogs_version_file="testprogs_version.json"
+  else
+    testprogs_version_file="src/testprogs/testprogs_version.json"
+  fi
+  if echo $commit | grep '^tags/' > /dev/null; then
+    urlcommit=$(echo $commit | cut -d / -f 2-)
+  else
+    urlcommit=$commit
+  fi
+  content_testprogs_version=$(wget --no-check-certificate https://raw.githubusercontent.com/$PHYEXREPOuser/PHYEX/${urlcommit}/$testprogs_version_file -O - 2>/dev/null || echo "")
   name="COMMIT$(echo $commit | sed 's/\//'${separator}'/g' | sed 's/:/'${separator}'/g' | sed 's/\./'${separator}'/g')"
   [ $suppress -eq 1 -a -d $TESTDIR/$name ] && rm -rf $TESTDIR/$name
 fi
-if [ ! -z "${reference-}" ]; then
-  [ $reference == 'REF' ] && reference=$defaultRef
-  reffromdir=''
-  if echo $reference | grep '/' > /dev/null; then
-    reffromdir=$reference
-    refname=$(echo $reference | sed 's/\//'${separator}'/g' | sed 's/:/'${separator}'/g' | sed 's/\./'${separator}'/g')
-  elif echo $specialName | grep -w $reference > /dev/null; then
-    refname="$reference"
-  else
-    refname="COMMIT${reference}"
+if [ ! "${content_testprogs_version}" == "" ]; then
+  testing=$(json_dictkey2value "$content_testprogs_version" 'testing' '')
+  refALL=$(json_dictkey2value "$testing" "ALL" '')
+  if [ ! "$testing" == "" ]; then
+    ALLTests='' #We reset the list of tests
+    for t in $(echo $allowedTests | sed 's/,/ /g'); do
+      ref=$(json_dictkey2value "$testing" "$t" "$refALL")
+      if [ ! "$ref" == "" ]; then
+        ALLTests="${ALLTests},$t"
+        refByTest[$t]=$ref
+      fi
+    done
+    ALLTests="${ALLTests:1}" #Remove first character (',')
   fi
 fi
 
-if [ $compilation -eq 1 ]; then
-  echo "### Compilation of commit $commit"
+#Name and directory for the reference version
+if [ ! -z "${reference-}" ]; then
+  declare -A refnameByTest
+  #Reference to use for each test
+  for t in $(echo $ALLTests | sed 's/,/ /g'); do
+    #Name of the reference
+    if [ "$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
+        caseref=${refByTest[$t]}
+      else
+        caseref=$defaultRef
+      fi
+      refByTest[$t]=$caseref
+    else
+      #The exact reference to use was given on the command line
+      caseref=$reference
+    fi
+    refByTest[$t]=$caseref
+  
+    #Conversion into directory name
+    if echo $caseref | grep '/' > /dev/null; then
+      refname=$(echo $reference | sed 's/\//'${separator}'/g' | sed 's/:/'${separator}'/g' | sed 's/\./'${separator}'/g')
+    elif echo $specialName | grep -w $caseref > /dev/null; then
+      refname="$caseref"
+    else
+      refname="COMMIT${caseref}"
+    fi
+    refnameByTest[$t]=$refname
+  done
+fi
 
-  if echo $specialName | grep -w $commit > /dev/null; then
-    echo "Special commit '$commit' cannot be compiled with this script"
-    exit 4
-  fi
+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
+
+#######################
+#### PACK CREATION ####
+#######################
 
+if [ $packcreation -eq 1 ]; then
   if [ -d $TESTDIR/$name ]; then
-    echo "Directory already exists ($TESTDIR/$name), suppress it to be able to compile it again (or use the -s option to automatically suppress it)"
-    exit 5
+    if [ $onlyIfNeeded -eq 0 ]; then
+      echo "Directory already exists ($TESTDIR/$name), suppress it to be able to compile it again (or use the -s option to automatically suppress it)"
+      exit 5
+    fi
+  else
+    echo "### Pack creation for commit $commit"
+
+    if echo $specialName | grep -w $commit > /dev/null; then
+      echo "Special commit '$commit' cannot be compiled with this script"
+      exit 4
+    fi
+
+    mkdir $TESTDIR/$name
+    cd $TESTDIR/$name/
+    cp -r $PHYEXTOOLSDIR/../build . #We use the compilation system from the same commit as the current script
+
+    MNH_EXPAND_DIR=$PHYEXTOOLSDIR/mnh_expand
+    export PATH=$PHYEXTOOLSDIR:$MNH_EXPAND_DIR/filepp:$MNH_EXPAND_DIR/MNH_Expand_Array:$PATH
+
+    cd $TESTDIR/$name/build/with_fcm/
+    rm -rf arch_*
+    ./make_fcm.sh -p $useexpand --commit $commit --arch $archfile 2>&1 | tee Output_compilation_step1
   fi
-  mkdir $TESTDIR/$name
-  cd $TESTDIR/$name/
-  cp -r $PHYEXTOOLSDIR/../build . #We use the compilation system from the same commit as the current script
+fi
 
-  MNH_EXPAND_DIR=$PHYEXTOOLSDIR/mnh_expand
-  export PATH=$PHYEXTOOLSDIR:$MNH_EXPAND_DIR/filepp:$MNH_EXPAND_DIR/MNH_Expand_Array:$PATH
+#####################
+#### COMPILATION ####
+#####################
+
+if [ $compilation -eq 1 ]; then
+  if [ $onlyIfNeeded -eq 0 -o ! -f $TESTDIR/$name/build/with_fcm/arch_${archfile}/build/bin/libphyex.so ]; then
+    echo "### Compilation of commit $commit"
 
-  cd $TESTDIR/$name/build/with_fcm/
-  rm -rf arch_*
-  ./make_fcm.sh $useexpand --commit $commit --arch $archfile 2>&1 | tee Output_compilation
+    cd $TESTDIR/$name/build/with_fcm/
+    ./make_fcm.sh -c $useexpand --commit $commit --arch $archfile 2>&1 | tee Output_compilation_step2
+  fi
 fi
 
-if [ $run -ge 1 ]; then
-  echo "### Running of commit $commit"
+###################
+#### EXECUTION ####
+###################
 
-  for t in $(echo $tests | sed 's/,/ /g'); do
-    if [ ! -f $TESTDIR/$name/build/with_fcm/arch_${archfile}/build/bin/main_${t}.exe ]; then
-      echo "Directory does not exist ($TESTDIR/$name) or compilation has failed, please check"
-      exit 6
-    fi
-  done
+if [ $run -ge 1 ]; then
+  cd $TESTDIR/$name
 
   #Cleaning to suppress old results that may be confusing in case of a crash during the run
-  for t in $(echo $tests | sed 's/,/ /g'); do
-    cd $TESTDIR/$name
-    if [ -d tests/with_fcm/arch_${archfile}/$t ]; then
-      rm -rf tests/with_fcm/arch_${archfile}/$t
-    fi
-  done
+  if [ $onlyIfNeeded -eq 0 ]; then
+    for t in $(echo $tests | sed 's/,/ /g'); do
+      if [ -d tests/with_fcm/arch_${archfile}/$t ]; then
+        rm -rf tests/with_fcm/arch_${archfile}/$t
+      fi
+    done
+  fi
 
   #Run the tests one after the other
+  firstrun=1
   for t in $(echo $tests | sed 's/,/ /g'); do
-    cd $TESTDIR/$name
-    mkdir -p tests/with_fcm/arch_${archfile}/$t
-    cd tests/with_fcm/arch_${archfile}/$t
-    ln -s $dirdata/$t data
-    $TESTDIR/$name/build/with_fcm/arch_${archfile}/build/bin/main_${t}.exe --check 2>&1 > Output_run
+    if echo $allowedTests | grep -w $t > /dev/null; then #test is allowed on this plateform
+      if  [ ! -d tests/with_fcm/arch_${archfile}/$t ]; 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 $TESTDIR/$name/build/with_fcm/arch_${archfile}/build/bin/main_${t}.exe ]; then
+          echo "Directory does not exist ($TESTDIR/$name) or compilation has failed, please check"
+          exit 6
+        fi
+
+        #execution
+        cd $TESTDIR/$name
+        mkdir -p tests/with_fcm/arch_${archfile}/$t
+        cd tests/with_fcm/arch_${archfile}/$t
+        ln -s $dirdata/$t data
+        $TESTDIR/$name/build/with_fcm/arch_${archfile}/build/bin/main_${t}.exe --check 2>&1 > Output_run
+      fi
+    fi
   done
 fi
 
+####################
+#### COMPARISON ####
+####################
+
 if [ $check -eq 1 ]; then
   echo "### Check commit $commit against commit $reference"
 
   alltests=0
   message=""
   for t in $(echo $tests | sed 's/,/ /g'); do
-    file1=$TESTDIR/$name/tests/with_fcm/arch_${archfile}/$t/Output_run
-    file2=$TESTDIR/$refname/tests/with_fcm/arch_${refarchfile}/$t/Output_run
-    mess=""
-    te=0
-    if [ ! -f "$file1" ]; then
-      mess="Result ($file1) for commit $commit does not exist, please run the simulation"
-      te=1
-    fi
-    if [ ! -f "$file2" ]; then
-      mess2="Result ($file2) for commit $reference does not exist, please run the simulation"
-      te=1
-      if [ "$mess" = "" ]; then
-        mess=$mess2
-      else
-        mess="$mess and $mess2"
+    if echo $allowedTests | grep -w $t > /dev/null; then
+      #Run the reference if needed
+      if [ $computeRefIfNeeded -eq 1 ]; then
+        $0 -p -c -r -t $t -a ${archfile} --onlyIfNeeded ${refByTest[$t]}
       fi
+
+      #File comparison
+      file1=$TESTDIR/$name/tests/with_fcm/arch_${archfile}/$t/Output_run
+      file2=$TESTDIR/${refnameByTest[$t]}/tests/with_fcm/arch_${refarchfile}/$t/Output_run
+      mess=""
+      te=0
+      if [ ! -f "$file1" ]; then
+        mess="Result ($file1) for commit $commit does not exist, please run the simulation"
+        te=1
+      fi
+      if [ ! -f "$file2" ]; then
+        mess2="Result ($file2) for commit ${refByTest[$t]} does not exist, please run the simulation"
+        te=1
+        if [ "$mess" = "" ]; then
+          mess=$mess2
+        else
+          mess="$mess and $mess2"
+        fi
+      fi
+      if [ $te -eq 0 ]; then
+        set +e
+        mess=$(cmp <(cat $file1 | sed 's/\.\.//g' | sed 's/~=//g' | sed 's/!=//g' | grep -v 'Total time: ' | sed 's/-0.00000E+00|/ 0.00000E+00|/g' | sed 's/-0.00000E+00 / 0.00000E+00 /g' | sed 's/-0.00000E+00-/ 0.00000E+00-/g') \
+                   <(cat $file2 | sed 's/\.\.//g' | sed 's/~=//g' | sed 's/!=//g' | grep -v 'Total time: ' | sed 's/-0.00000E+00|/ 0.00000E+00|/g' | sed 's/-0.00000E+00 / 0.00000E+00 /g' | sed 's/-0.00000E+00-/ 0.00000E+00-/g') 246 246 2>&1)
+        te=$?
+        set -e
+        #The use of "<()" bash syntax replaces the actual file name seen by cmp
+        #We modify the cmp output to display the actual file names
+        mess=$(echo $mess | sed "s#^.*differ# $file1 $file2 differ#")
+      fi
+      [ $te -ne 0 ] && message="$message $mess \n"
+      alltests=$(($alltests+$te))
     fi
-    if [ $te -eq 0 ]; then
-      set +e
-      mess=$(cmp <(cat $file1 | sed 's/\.\.//g' | sed 's/~=//g' | sed 's/!=//g' | grep -v 'Total time: ' | sed 's/-0.00000E+00|/ 0.00000E+00|/g' | sed 's/-0.00000E+00 / 0.00000E+00 /g' | sed 's/-0.00000E+00-/ 0.00000E+00-/g') \
-                 <(cat $file2 | sed 's/\.\.//g' | sed 's/~=//g' | sed 's/!=//g' | grep -v 'Total time: ' | sed 's/-0.00000E+00|/ 0.00000E+00|/g' | sed 's/-0.00000E+00 / 0.00000E+00 /g' | sed 's/-0.00000E+00-/ 0.00000E+00-/g') 246 246 2>&1)
-      te=$?
-      set -e
-      #The use of "<()" bash syntax replaces the actual file name seen by cmp
-      #We modify the cmp output to display the actual file names
-      mess=$(echo $mess | sed "s#^.*differ# $file1 $file2 differ#")
-    fi
-    [ $te -ne 0 ] && message="$message $mess \n"
-    alltests=$(($alltests+$te))
   done
   if [ $alltests -eq 0 ]; then
     echo "SUCCESS, files are identical"
@@ -277,6 +409,10 @@ if [ $check -eq 1 ]; then
   fi
 fi
 
+##################
+#### CLEANING ####
+##################
+
 if [ $remove -eq 1 ]; then
   echo "### Remove model directory for commit $commit"
   [ -d $TESTDIR/$name ] && rm -rf $TESTDIR/$name