diff --git a/cfg/nic5-login1/gmsh.profile b/cfg/nic5-login1/gmsh.profile
new file mode 100644
index 0000000000000000000000000000000000000000..8d5005823937a3181a5f692953a4feef534efcea
--- /dev/null
+++ b/cfg/nic5-login1/gmsh.profile
@@ -0,0 +1,3 @@
+add2env PATH "$HOME/.local/gmsh/bin" front
+add2env LD_LIBRARY_PATH "$HOME/.local/gmsh/lib"
+add2env PYTHONPATH "$HOME/.local/gmsh/lib"
diff --git a/cfg/nic5-login1/lagamine.profile b/cfg/nic5-login1/lagamine.profile
new file mode 100644
index 0000000000000000000000000000000000000000..2cbe904836fd04d4b840050118dd274981595c23
--- /dev/null
+++ b/cfg/nic5-login1/lagamine.profile
@@ -0,0 +1,3 @@
+add2env LD_LIBRARY_PATH "$HOME/.local/lagamine/lib"
+add2env INCLUDE "$HOME/.local/lagamine/include"
+add2env LIB "$HOME/.local/lagamine/lib"
diff --git a/cfg/nic5-login1/modules.profile b/cfg/nic5-login1/modules.profile
new file mode 100644
index 0000000000000000000000000000000000000000..4e41ae91a7d06a7b4c163b5ecc310fd6bf16376b
--- /dev/null
+++ b/cfg/nic5-login1/modules.profile
@@ -0,0 +1,26 @@
+# change module release group rto 2020a (only one that has intel tbb & mkl)
+module load releases/2020a
+
+# load modules from release/2020a group 
+module load CMake GCC
+module load Bison
+#module load intel/2020a
+module load Python SWIG 
+#module load matplotlib
+#module load Qt5 
+
+# intel community (copied from warson)
+. $HOME/.local/intel/mkl/bin/mklvars.sh intel64
+. $HOME/.local/intel/tbb/bin/tbbvars.sh intel64
+
+#
+# new intel-cluster-studio
+#. /cm/shared/apps/ics/2013sp1/ics/2013.1.046/ictvars.sh intel64
+#. /cm/shared/apps/ics/2013sp1/mkl/bin/mklvars.sh intel64
+#. /cm/shared/apps/ics/2013sp1/tbb/bin/tbbvars.sh intel64
+#
+#not in module : 
+add2env PATH "$HOME/.local/bin" front
+# MKL_DEBUG_CPU_TYPE env variable allows good perfs of mkl (< 2020.1/2 ?) on amd procs
+export MKL_DEBUG_CPU_TYPE=5
+
diff --git a/cfg/nic5-login1/mumps.profile b/cfg/nic5-login1/mumps.profile
new file mode 100644
index 0000000000000000000000000000000000000000..565ebbb380631b5d2a2fa1fb7526b540bbcc9158
--- /dev/null
+++ b/cfg/nic5-login1/mumps.profile
@@ -0,0 +1,3 @@
+add2env LD_LIBRARY_PATH "$HOME/.local/mumps/lib"
+add2env LIB "$HOME/.local/mumps/lib"
+add2env INCLUDE "$HOME/.local/mumps/include"
diff --git a/cfg/nic5-login1/parasolid.profile b/cfg/nic5-login1/parasolid.profile
new file mode 100644
index 0000000000000000000000000000000000000000..8c211268618a6004c3c4e1bbc0b4c7ac23b8e8ff
--- /dev/null
+++ b/cfg/nic5-login1/parasolid.profile
@@ -0,0 +1,3 @@
+add2env PATH "$HOME/.local/parasolid/shared_object"
+add2env INCLUDE "$HOME/.local/parasolid"
+export P_SCHEMA=$HOME/.local/parasolid/schema
diff --git a/cfg/nic5-login1/python.profile b/cfg/nic5-login1/python.profile
new file mode 100644
index 0000000000000000000000000000000000000000..22db0c6fab235c7ada53dc1b58aa79307cc9fbb4
--- /dev/null
+++ b/cfg/nic5-login1/python.profile
@@ -0,0 +1,5 @@
+#  PYTHONSTARTUP allows to start metafor automatically from python (outside of launch or ...)
+#export  PYTHONSTARTUP=.pythonrc.py
+# PYTHONPATH for locally (user dependant) installed python packages
+add2env PYTHONPATH "$HOME/.local/lib/python3.8/site-packages" front
+
diff --git a/cfg/vaillant/gmsh.profile b/cfg/vaillant/gmsh.profile
new file mode 100644
index 0000000000000000000000000000000000000000..412f3fcb47cd01cfd224b34e5ac684e0516fecd4
--- /dev/null
+++ b/cfg/vaillant/gmsh.profile
@@ -0,0 +1,3 @@
+add2env PATH "/opt/gmsh/bin" front
+add2env LD_LIBRARY_PATH "/opt/gmsh/lib"
+add2env PYTHONPATH "/opt/gmsh/lib"
diff --git a/cfg/vaillant/intelCommunity.bashrc b/cfg/vaillant/intelCommunity.bashrc
new file mode 100644
index 0000000000000000000000000000000000000000..06b19829f74c80dfdd976ee5101827abd29d4a99
--- /dev/null
+++ b/cfg/vaillant/intelCommunity.bashrc
@@ -0,0 +1,9 @@
+# Intel compiler and/or TBB/MKL 
+#
+# EXPLANATIONS [RB]: (see "cfg/garfield/compilers.*")
+
+if [ -d /opt/intel ] ; then
+    . /opt/intel/mkl/bin/mklvars.sh intel64
+    . /opt/intel/tbb/bin/tbbvars.sh intel64
+fi
+export MKL_DEBUG_CPU_TYPE=5
diff --git a/cfg/vaillant/intelCommunity.profile b/cfg/vaillant/intelCommunity.profile
new file mode 100644
index 0000000000000000000000000000000000000000..3e1712b61b2a5ce6663f92f7e136e05e370bb2fe
--- /dev/null
+++ b/cfg/vaillant/intelCommunity.profile
@@ -0,0 +1,11 @@
+# Intel compiler and/or TBB/MKL 
+#
+# EXPLANATIONS [RB]: (see "cfg/garfield/compilers.*")
+
+if [ -n "$BASH_VERSION" ]; then
+    if [ -d /opt/intel ] ; then
+        . /opt/intel/mkl/bin/mklvars.sh intel64
+        . /opt/intel/tbb/bin/tbbvars.sh intel64
+    fi
+fi
+export MKL_DEBUG_CPU_TYPE=5
diff --git a/cfg/vaillant/lagamine.profile b/cfg/vaillant/lagamine.profile
new file mode 100644
index 0000000000000000000000000000000000000000..f8e4775f5d0074110bc831b07f445a947b427092
--- /dev/null
+++ b/cfg/vaillant/lagamine.profile
@@ -0,0 +1,3 @@
+add2env LD_LIBRARY_PATH "/opt/lagamine/lib"
+add2env INCLUDE "/opt/lagamine/include"
+add2env LIB "/opt/lagamine/lib"
diff --git a/cfg/vaillant/matlab.profile b/cfg/vaillant/matlab.profile
new file mode 100644
index 0000000000000000000000000000000000000000..0ff358894261fe6d720b2ad0368687cf5a7ce5f1
--- /dev/null
+++ b/cfg/vaillant/matlab.profile
@@ -0,0 +1 @@
+add2env PATH "/opt/matlab/bin"
diff --git a/cfg/vaillant/mumps.profile b/cfg/vaillant/mumps.profile
new file mode 100644
index 0000000000000000000000000000000000000000..57e0adabd33cd60503f6133f2c8fa4acd4e77105
--- /dev/null
+++ b/cfg/vaillant/mumps.profile
@@ -0,0 +1,3 @@
+add2env LD_LIBRARY_PATH "/opt/mumps/lib"
+add2env LIB "/opt/mumps/lib"
+add2env INCLUDE "/opt/mumps/include"
diff --git a/cfg/vaillant/parasolid.profile b/cfg/vaillant/parasolid.profile
new file mode 100644
index 0000000000000000000000000000000000000000..e24e2e80de8a8cf8b1f2a4f4ef7f632bb44dcb81
--- /dev/null
+++ b/cfg/vaillant/parasolid.profile
@@ -0,0 +1,3 @@
+add2env PATH "/opt/parasolid/shared_object"
+add2env INCLUDE "/opt/parasolid"
+export P_SCHEMA=/opt/parasolid/schema
diff --git a/cfg/vaillant/samcef.profile b/cfg/vaillant/samcef.profile
new file mode 100644
index 0000000000000000000000000000000000000000..834343ee4c4dcc979289fc859455636e016269dc
--- /dev/null
+++ b/cfg/vaillant/samcef.profile
@@ -0,0 +1,2 @@
+export SAM_ZONE=200000000
+add2env PATH "/opt/samcef"
diff --git a/externalProgramPath.py b/externalProgramPath.py
index d31dc0c3543bce5abf8490c51ff46f5ff6b5b36a..6b169e8dee301d0a7537919b7b667cd676b0788d 100755
--- a/externalProgramPath.py
+++ b/externalProgramPath.py
@@ -4,7 +4,7 @@
 # Define external program paths according to local configuration
 
 from prmClasses import *
-import os, os.path, distutils.spawn
+import os, os.path, shutil #, distutils.spawn
 
 class ExtProgs(PRMSet):
     def __init__(self, verb=False):
@@ -16,8 +16,13 @@ class ExtProgs(PRMSet):
 
     def loadPaths(self):
         home = os.path.expanduser("~")
-        loc  = os.path.abspath('.')
-        return  [home, loc]
+        #print("sys.path[0] = ", sys.path[0])
+        #loc  = os.path.abspath('.') non, '.' n'est pas le programDir (et pas évident de le trouver entre version Dev & installed)
+        #                            et  sys.path[0] est le baseDir (pas le programDir !!!)
+        #print("home Path = ", home)
+        #print("local Path = ", loc)
+        #return  [home, loc]
+        return  [home]
 
     def savePath(self):
         home = os.path.expanduser("~")
@@ -66,7 +71,9 @@ class ExtProgs(PRMSet):
             print("\t 3. If %s not in the Script last version, add it program in the Script..."%key)
             return False
 
-        if distutils.spawn.find_executable(os.path.splitext(self.pars[key].val)[0]) :
+ 
+        #if distutils.spawn.find_executable(os.path.splitext(self.pars[key].val)[0]) : # sous windows ne trouve que les .exe => ne marche pas avec .bat & .cmd
+        if shutil.which(self.pars[key].val):
             return True
         else:
             print("%s is not found in %s ..."%(key, self.pars[key].val))
diff --git a/externalProgramPathGui.pyw b/externalProgramPathGui.pyw
index 9f35f5633301f9e36c3096eb27e86e52f70fdee8..eb7beaf9a0aab098d944416e73ea26162db992d0 100755
--- a/externalProgramPathGui.pyw
+++ b/externalProgramPathGui.pyw
@@ -95,7 +95,10 @@ class ExtProgsConfGui(QWidget):
         grplay2.setColumnStretch(2,1)
         self.mesherGrpBox.setLayout(grplay2)
         self.sf['MATLAB']        = ExeFileLine(self, grplay2, self.extProgPath.pars['MATLAB'],     exeFileType, 0, 0, 4)
-        self.sf['SCILAB']        = ExeFileLine(self, grplay2, self.extProgPath.pars['SCILAB'],     exeFileType, 1, 0, 4)
+        if isUnix():
+            self.sf['SCILAB']        = ExeFileLine(self, grplay2, self.extProgPath.pars['SCILAB'],     exeFileType, 1, 0, 4)
+        else:
+            self.sf['SCILAB']        = ExeFileLine(self, grplay2, self.extProgPath.pars['SCILAB'],     "bat file (*.bat)", 1, 0, 4)
         self.sf['GNUPLOT']       = ExeFileLine(self, grplay2, self.extProgPath.pars['GNUPLOT'],    exeFileType, 2, 0, 4)
         
         #Text & image 
@@ -104,8 +107,8 @@ class ExtProgsConfGui(QWidget):
         grplay3 = QGridLayout()
         grplay3.setColumnStretch(2,1)
         self.mesherGrpBox.setLayout(grplay3)
-        self.sf['LATEX']             = ExeFileLine(self, grplay3, self.extProgPath.pars['LATEX'],     exeFileType, 0, 0, 4)
-        self.sf['GHOSTSCRIPT']       = ExeFileLine(self, grplay3, self.extProgPath.pars['GHOSTSCRIPT'],     exeFileType, 1, 0, 4)
+        self.sf['LATEX']             = ExeFileLine(self, grplay3, self.extProgPath.pars['LATEX'],          exeFileType, 0, 0, 4)
+        self.sf['GHOSTSCRIPT']       = ExeFileLine(self, grplay3, self.extProgPath.pars['GHOSTSCRIPT'],    exeFileType, 1, 0, 4)
         self.sf['IMAGEMAGICK']       = ExeFileLine(self, grplay3, self.extProgPath.pars['IMAGEMAGICK'],    exeFileType, 2, 0, 4)
         
     def buildButtonFrame(self, box):      
@@ -120,9 +123,9 @@ class ExtProgsConfGui(QWidget):
         butlayout.addWidget(self.saveButton1)
         self.saveButton1.pressed.connect(self.userSave)
         
-        self.saveButton2 = QPushButton(self.tr("All Users Save")) 
-        butlayout.addWidget(self.saveButton2)
-        self.saveButton2.pressed.connect(self.progSave)
+        #self.saveButton2 = QPushButton(self.tr("All Users Save")) 
+        #butlayout.addWidget(self.saveButton2)
+        #self.saveButton2.pressed.connect(self.progSave)
         
         self.quitButton = QPushButton(self.tr("Quit")) 
         butlayout.addWidget(self.quitButton)
@@ -154,12 +157,12 @@ class ExtProgsConfGui(QWidget):
         if self.extProgPath.debug :
             print("Save pressed")
         self.extProgPath.savePars()  
-         
+    '''     
     def progSave(self):   
         if self.extProgPath.debug :  
             print("Save pressed")
         self.extProgPath.savePars('.')
-
+    '''
     def quit(self):
         if self.extProgPath.debug :
             print("Quit pressed")   
diff --git a/mtfLicense/metafor181231.lic b/mtfLicense/metafor181231.lic
deleted file mode 100644
index 997a54d9d5d1eaec247af1f315c9f881deb9fb8c..0000000000000000000000000000000000000000
--- a/mtfLicense/metafor181231.lic
+++ /dev/null
@@ -1 +0,0 @@
-646574612B0A060C031B13305B736D657473666F72390C19042A061F041111052A0611080B070406FE5831657461666A796D65
diff --git a/mtfLicense/nic5.lic b/mtfLicense/nic5.lic
new file mode 100644
index 0000000000000000000000000000000000000000..d4fcaca158f001f6ac18df83a8b530b98ef24dfb
--- /dev/null
+++ b/mtfLicense/nic5.lic
@@ -0,0 +1 @@
+646574612B0A060C031B13305B736D657470666F722024372D0F021B1900102D0F0C170316112A666F72D9657461486F726DFC746166B3726D65AF61666F8B6D657481666F72B8657461386F726DFC746166CF726D653A61666F926D6574B4666F7233657461FF6F726DC574616655726D659461666FA76D65743F666F72F4657461F96F726D1774616677726D65B461666F3F6D65747D666F7253657461286F726D7D746166AF726D653961666F6E6D657456666F728B6574617E6F726DA574616622726D656861666F456D6574BF666F7275657461A66F726D2874616673726D654D61666F686D6574D5666F7243657461FF6F726DBA74616687726D65AB61666FC66D65744F666F72F4657461B96F726D96746166BC726D656C61666FB26D65742C666F72716574615C6F726D0B746166DB726D655A61666FEB6D6574BA666F727A6574615D6F726DD174616641726D65ED61666FA96D65746A666F72D2657461D26F726D4B746166F6726D65AF61666F796D65741A666F72D9657461486F726DFC746166B4726D656D61666F8D6D6574D5666F7243657461FF6F726DBE74616676726D657B61666F6A6D6574A1666F72206574617A6F726D5B74616625726D656C61666FB26D65742C666F72716574615F6F726DD774616677726D65B461666F3F6D65747D666F7256657461706F726D7D746166AF726D653961666F6E6D65745F666F721F657461D26F726D4B746166F6726D65AB61666F996D6574C2666F72D9657461486F726DFC746166B0726D659F61666F5D6D6574D5666F7243657461FF6F726DBE74616664726D650761666FC66D65744F666F72F4657461B96F726D82746166F8726D65C061666F5C6D6574F8666F72B66574616C6F726D867461668F726D65A161666F2C6D6574F7666F72F4657461A26F726DD174616641726D65ED61666FA96D65746E666F728E657461126F726DB17461665A726D65B461666F046D65742B666F72D9657461486F726DFC746166B0726D659D61666FAD6D6574D5666F7243657461FF6F726DBA74616686726D65D361666F926D6574B4666F7233657461FF6F726DC4746166F5726D65C061666F5C6D6574F8666F72B1657461BD6F726D3474616677726D65B461666F3F6D65747D666F7255657461C46F726D7D746166AF726D653961666F6E6D65745F666F72036574617E6F726DA574616622726D656861666F456D65748B666F7275657461A66F726D2874616673726D654361666F8C6D657479666F72AD6574612B6F726D797461665A726D65CA61666F6A6D6574A1666F72206574617A6F726D5B74616649726D659461666FA76D65743F666F72FB657461FE6F726D91746166DB726D655A61666FEB6D6574BE666F7287657461216F726D7D746166AF726D653961666F6E6D657459666F72136574617E6F726DA574616622726D656861666F4C6D65746F666F7275657461A66F726D2874616673726D654E61666F086D6574D5666F7243657461FF6F726DBA74616682726D659B61666FC66D65744F666F72F4657461BD6F726D6D74616670726D65C061666F5C6D6574F8666F72B66574616B6F726D1674616677726D65B461666F3F6D65747D666F7255657461006F726D85746166BA726D652A61666FE46D6574FD666F7223657461D26F726D4B746166F6726D65AF61666F636D6574D6666F72D9657461486F726DFC746166B4726D657961666F656D6574D5666F7243657461FF6F726DBE7461667D726D659361666F926D6574B4666F7233657461FF6F726DC174616631726D656C61666FB26D65742C666F72716574615E6F726D1F74616677726D65B461666F3F6D65741D666F7262657461646F726D7D746166AF726D653961666F6E6D657458666F72B3657461D26F726D4B746166F6726D65CB61666FBB6D6574EE666F7275657461A66F726D2874616673726D654361666F846D657479666F72AD6574612B6F726D7974616651726D65FE61666FC66D65744F666F72F4657461BD6F726D6F74616678726D65C061666F5C6D6574F8666F72B66574616A6F726D7674616677726D65B461666F3F6D65747D666F7254657461F86F726D7D746166AF726D653961666F6E6D657458666F729B6574617E6F726DA574616622726D656861666F456D6574FB666F7275657461A66F726D2874616673726D654161666FE86D6574D5666F7243657461FF6F726DBE74616666726D65D761666F6A6D6574A1666F72206574617A6F726D5D7461661D726D656C61666FB26D65742C666F7271657461586F726D5F746166DB726D655A61666FEB6D6574BA666F7278657461816F726D7D746166AF726D653961666F6E6D65745D666F72A5657461D26F726D4B746166F6726D65A861666FA66D6574C4666F7275657461A66F726D2874616673726D654361666FA46D6574D5666F7243657461FF6F726DDA746166A9726D656B61666F6A6D6574A1666F72206574617A6F726D5B74616631726D656C61666FB26D65742C666F7211657461996F726D4F746166DB726D655A61666FEB6D6574BB666F72576574615D6F726D1B766166
diff --git a/mtfLicense/vaillant.lic b/mtfLicense/vaillant.lic
new file mode 100644
index 0000000000000000000000000000000000000000..bcb745aa5296b760d70d5c3ad867ead896d9c614
--- /dev/null
+++ b/mtfLicense/vaillant.lic
@@ -0,0 +1 @@
+646574612B0A060C031B13305B736D657470666F722024372D0F021B1900102D0F0C1703161162666F7211657461766F726DAC74616652726D656C61666F076D65741D666F727D657461AF6F726D5874616677726D650261666F106D657463666F72EF6574611C6F726D3074616600726D65416C666F
diff --git a/postProLoop.py b/postProLoop.py
index ac7ec14193d1cadfa96c4112e655104d1285ad9d..d66fdfebe1b97d646e83b7b1d22259670d0e9e16 100755
--- a/postProLoop.py
+++ b/postProLoop.py
@@ -6,7 +6,7 @@
 # Define externals program path according to local configuration
 #
 from prmClasses import *
-import os, os.path, distutils.spawn, time, sys, re, glob
+import os, os.path, shutil, time, sys, re, glob #, distutils.spawn
 import imp
 #import importlib
 import externalProgramPath
@@ -143,7 +143,16 @@ class PostProLoop(PRMSet):
         self.pars['LATEXREQUEST'].enable(self.pars['LATEXRUN'].val==True)
 
 
-    def checkValidity(self, key):
+    def checkValidity(self, key):    
+        #if distutils.spawn.find_executable(os.path.splitext(self.pars[key].val)[0]):
+        if shutil.which(self.pars[key].val):
+            return True
+        else:
+            print "%s is not found (%s)...."%self.pars[key].val
+            print "\t Check installation and accessibility..."
+            print "\t Use 'externalProgramPathGui' to define the full program path (recommanded)"
+            print "\t or add %s in your user path (not recommanded)"%key
+            return False
         '''
         if distutils.spawn.find_executable(os.path.splitext(self.pars[key].val)[0]):
             return True
diff --git a/prmClassesGui.py b/prmClassesGui.py
index 3b20bd27509777a2e67127db1ece181439c78ebf..58b4d8d5c7a64b3c8c07226845ae112bc1d785cb 100644
--- a/prmClassesGui.py
+++ b/prmClassesGui.py
@@ -24,7 +24,7 @@ except:
 
 #print "PyQt%d (Qt %s) loaded!" % (foundQt, QT_VERSION_STR)
 
-import distutils.spawn
+import shutil #, distutils.spawn
 from prmClasses import *
 
 #========================================================================================
@@ -221,8 +221,9 @@ class ExeFileLine(FileLine):
         if os.path.isfile(f):  # White bg
             #print "isFile"
             bgCol  =   QColor(255, 255, 255)
-        elif distutils.spawn.find_executable(os.path.splitext(f)[0]):  # *.cmd pas reconnu comme exe !!!
-            #print "find_executable in path"
+        #elif distutils.spawn.find_executable(os.path.splitext(f)[0]):  # *.cmd/*.bat pas reconnu comme exe !!!
+        elif shutil.which(f): # green bg
+            print ("found executable in path")
             bgCol  =   QColor(0, 255, 0)
         else:  #redBg
             #print "not found"