diff --git a/cfg/CentOs6/comp.cfg b/cfg/CentOs6/comp.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..e11ce31210b9d928e669922616342cd8a14efaf7
--- /dev/null
+++ b/cfg/CentOs6/comp.cfg
@@ -0,0 +1,5 @@
+self.pars['CMAKELIST'].val='centos6.cmake'
+self.pars['NB_TASKS'].val='6'
+self.pars['NB_THREADS'].val='1'
+self.pars['RUNMETHOD'].vals=['interactive','at','batch']
+self.pars['RUNMETHOD'].val='batch'
diff --git a/cfg/CentOs6/launch.cfg b/cfg/CentOs6/launch.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..c920c191c7986eb3930491270c49cd0a6a3212b1
--- /dev/null
+++ b/cfg/CentOs6/launch.cfg
@@ -0,0 +1,9 @@
+self.pars['NB_THREADS'].val='4'
+self.pars['NB_TASKS'].val='1'
+self.pars['RUNMETHOD'].vals=['interactive','at','batch', 'sge']
+self.pars['RUNMETHOD'].val='sge'
+self.pars['QUEUE'].val='defq'
+self.pars['SGE_PE'].val='snode'
+self.pars['SGEARGS'].val=''
+self.pars['TIME'].val='0-1:00:00'
+self.pars['MEMORY'].val='1000'
diff --git a/cfg/blueberry/comp.cfg b/cfg/blueberry/comp.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..0d7cd49c3a857b85cc5cc876029ab78761433a0f
--- /dev/null
+++ b/cfg/blueberry/comp.cfg
@@ -0,0 +1,5 @@
+self.pars['CMAKELIST'].val='gaston.cmake'
+self.pars['NB_TASKS'].val='6'
+self.pars['NB_THREADS'].val='1'
+self.pars['RUNMETHOD'].vals=['interactive','at','batch',]
+self.pars['RUNMETHOD'].val='batch'
diff --git a/cfg/blueberry/launch.cfg b/cfg/blueberry/launch.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..12256a89f06c5501b848f3489ea602aed964e83d
--- /dev/null
+++ b/cfg/blueberry/launch.cfg
@@ -0,0 +1,4 @@
+self.pars['NB_THREADS'].val='6'
+self.pars['NB_TASKS'].val='1'
+self.pars['RUNMETHOD'].vals=['interactive','at','batch']
+self.pars['RUNMETHOD'].val='batch'
diff --git a/cfg/clifton/comp.cfg b/cfg/clifton/comp.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..0d7cd49c3a857b85cc5cc876029ab78761433a0f
--- /dev/null
+++ b/cfg/clifton/comp.cfg
@@ -0,0 +1,5 @@
+self.pars['CMAKELIST'].val='gaston.cmake'
+self.pars['NB_TASKS'].val='6'
+self.pars['NB_THREADS'].val='1'
+self.pars['RUNMETHOD'].vals=['interactive','at','batch',]
+self.pars['RUNMETHOD'].val='batch'
diff --git a/cfg/clifton/launch.cfg b/cfg/clifton/launch.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..12256a89f06c5501b848f3489ea602aed964e83d
--- /dev/null
+++ b/cfg/clifton/launch.cfg
@@ -0,0 +1,4 @@
+self.pars['NB_THREADS'].val='6'
+self.pars['NB_TASKS'].val='1'
+self.pars['RUNMETHOD'].vals=['interactive','at','batch']
+self.pars['RUNMETHOD'].val='batch'
diff --git a/cfg/fabulous/comp.cfg b/cfg/fabulous/comp.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..d21d1f25862bcd9ebd34d957764a7c71e00a0da8
--- /dev/null
+++ b/cfg/fabulous/comp.cfg
@@ -0,0 +1,5 @@
+self.pars['CMAKELIST'].val='fabulous.cmake'
+self.pars['NB_TASKS'].val='8'
+self.pars['NB_THREADS'].val='1'
+self.pars['RUNMETHOD'].vals=['interactive',]
+self.pars['RUNMETHOD'].val='interactive'
diff --git a/cfg/fabulous/launch.cfg b/cfg/fabulous/launch.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..1bb876b0fdf8c9d2d815cbd87dc999e1a2f5ba7f
--- /dev/null
+++ b/cfg/fabulous/launch.cfg
@@ -0,0 +1,8 @@
+self.pars['NB_THREADS'].val='12'
+self.pars['NB_TASKS'].val='1'
+self.pars['RUNMETHOD'].vals=['interactive','slurm']
+self.pars['RUNMETHOD'].val='slurm'
+self.pars['QUEUE'].val='defq'
+self.pars['MEMORY'].val='1000'
+self.pars['TIME'].val='0-1:00:00'
+self.pars['LOCALDISK'].val=True
diff --git a/cfg/frontal3/launch.cfg b/cfg/frontal3/launch.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..227f05a827e00b48baeaaa46f7ea9e3f78b032ac
--- /dev/null
+++ b/cfg/frontal3/launch.cfg
@@ -0,0 +1,14 @@
+self.pars['MAIL_ADDR'].val='CanonicalEmailAdress'
+self.pars['NB_TASKS'].val='1'
+self.pars['NB_THREADS'].val='24'
+self.pars['MULTITEST'].val=False
+self.pars['LOCALDISK'].val=False
+self.pars['TIME'].val='1:00:00'
+self.pars['MEMORY'].val='1000'
+self.pars['QUEUE'].val='main'
+self.pars['PROJECT'].val='hpcwe'
+self.pars['RUNMETHOD'].vals=['pbs',]
+self.pars['RUNMETHOD'].val='pbs'
+self.pars['MODEL'].vals=['auto','westemere','westmere_fat','westmere_xfat','ivyBridge','haswell_xfat',]
+self.pars['MODEL'].val='auto'
+self.pars['EXEC_NAME'].val='e:\\Dev64\\Offi\\linuxbin\\Metafor.exe'
diff --git a/cfg/frontal3/ls_colors.bashrc b/cfg/frontal3/ls_colors.bashrc
new file mode 100644
index 0000000000000000000000000000000000000000..8971679c7e7904e7f42e7f204b9afea405770590
--- /dev/null
+++ b/cfg/frontal3/ls_colors.bashrc
@@ -0,0 +1,2 @@
+LS_COLORS='di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36'
+export LS_COLORS
diff --git a/cfg/frontal3/modules.profile b/cfg/frontal3/modules.profile
new file mode 100644
index 0000000000000000000000000000000000000000..10c20b41899360435d620feea841005e3c6c97bb
--- /dev/null
+++ b/cfg/frontal3/modules.profile
@@ -0,0 +1,20 @@
+
+module load python/2.7
+module load swig/3.0.10/64/gcc/4.4.7
+module load compiler/gcc/6.4.0
+module load cmake/3.11.1/64/gcc/5.5.0
+
+. /softs/intel/compilers_and_libraries_2018.5.274/linux/mkl/bin/mklvars.sh intel64
+. /softs/intel/compilers_and_libraries_2018.5.274/linux/tbb/bin/tbbvars.sh intel64
+. /softs/intel/compilers_and_libraries_2018.5.274/linux/bin/compilervars.sh intel64
+export INTEL_LICENSE_FILE=/softs/intel/licenses
+
+# sinon cmake prend /usr/bin/cc meme si gcc est dans le PATH!
+export CC=gcc
+export CXX=g++
+export FC=gfortran
+
+#icc
+#export CC=$(which icc)
+#export CXX=$(which icpc)
+#export FC=$(which ifort)
diff --git a/cfg/frontal3/python.profile b/cfg/frontal3/python.profile
new file mode 100644
index 0000000000000000000000000000000000000000..f64a11d789efde2fb65bd46fe11e1959d2295789
--- /dev/null
+++ b/cfg/frontal3/python.profile
@@ -0,0 +1,4 @@
+# python recompile (probleme avec la version recompilee en module)
+add2env PATH "/projects/acad/hpcwe/softs/python/bin" front
+add2env LD_LIBRARY_PATH "/projects/acad/hpcwe/softs/python/lib" front
+add2env CMAKE_PREFIX_PATH "/projects/acad/hpcwe/softs/python" front
diff --git a/cfg/gaston/comp.cfg b/cfg/gaston/comp.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..0d7cd49c3a857b85cc5cc876029ab78761433a0f
--- /dev/null
+++ b/cfg/gaston/comp.cfg
@@ -0,0 +1,5 @@
+self.pars['CMAKELIST'].val='gaston.cmake'
+self.pars['NB_TASKS'].val='6'
+self.pars['NB_THREADS'].val='1'
+self.pars['RUNMETHOD'].vals=['interactive','at','batch',]
+self.pars['RUNMETHOD'].val='batch'
diff --git a/cfg/gaston/launch.cfg b/cfg/gaston/launch.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..12256a89f06c5501b848f3489ea602aed964e83d
--- /dev/null
+++ b/cfg/gaston/launch.cfg
@@ -0,0 +1,4 @@
+self.pars['NB_THREADS'].val='6'
+self.pars['NB_TASKS'].val='1'
+self.pars['RUNMETHOD'].vals=['interactive','at','batch']
+self.pars['RUNMETHOD'].val='batch'
diff --git a/cfg/spring/comp.cfg b/cfg/spring/comp.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..df67ee8efb9fe96cc55d205e06df8a682d3dcae9
--- /dev/null
+++ b/cfg/spring/comp.cfg
@@ -0,0 +1,5 @@
+self.pars['CMAKELIST'].val='spring.cmake'
+self.pars['NB_TASKS'].val='4'
+self.pars['NB_THREADS'].val='1'
+self.pars['RUNMETHOD'].vals=['interactive','at','batch',]
+self.pars['RUNMETHOD'].val='batch'
diff --git a/cfg/spring/launch.cfg b/cfg/spring/launch.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..d66afc51905cfa52f06df5c21904031fed7df37f
--- /dev/null
+++ b/cfg/spring/launch.cfg
@@ -0,0 +1,4 @@
+self.pars['NB_THREADS'].val='4'
+self.pars['NB_TASKS'].val='1'
+self.pars['RUNMETHOD'].vals=['interactive','at','batch']
+self.pars['RUNMETHOD'].val='batch'
diff --git a/cfg/thorgal/comp.cfg b/cfg/thorgal/comp.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..5d4a8199fa4479202de29572e4270e2964faaf20
--- /dev/null
+++ b/cfg/thorgal/comp.cfg
@@ -0,0 +1,5 @@
+self.pars['CMAKELIST'].val='thorgal.cmake'
+self.pars['NB_TASKS'].val='4'
+self.pars['NB_THREADS'].val='1'
+self.pars['RUNMETHOD'].vals=['interactive','at','batch',]
+self.pars['RUNMETHOD'].val='batch'
diff --git a/cfg/thorgal/launch.cfg b/cfg/thorgal/launch.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..d66afc51905cfa52f06df5c21904031fed7df37f
--- /dev/null
+++ b/cfg/thorgal/launch.cfg
@@ -0,0 +1,4 @@
+self.pars['NB_THREADS'].val='4'
+self.pars['NB_TASKS'].val='1'
+self.pars['RUNMETHOD'].vals=['interactive','at','batch']
+self.pars['RUNMETHOD'].val='batch'
diff --git a/cfg/windows/comp.cfg b/cfg/windows/comp.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..f5219520d9296a9bfa9b9882d7ecee226347b07c
--- /dev/null
+++ b/cfg/windows/comp.cfg
@@ -0,0 +1,2 @@
+self.pars['RUNMETHOD'].vals=['interactive',]
+self.pars['RUNMETHOD'].val='interactive'
diff --git a/cfg/windows/launch.cfg b/cfg/windows/launch.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..f5219520d9296a9bfa9b9882d7ecee226347b07c
--- /dev/null
+++ b/cfg/windows/launch.cfg
@@ -0,0 +1,2 @@
+self.pars['RUNMETHOD'].vals=['interactive',]
+self.pars['RUNMETHOD'].val='interactive'
diff --git a/comp.py b/comp.py
index e9b7d808e507b501cc393e31395200f192b016f4..c7414b572c80f06176bc3cee932d16363544fe00 100755
--- a/comp.py
+++ b/comp.py
@@ -46,8 +46,6 @@ class CompJob(ParametricJob):
         self.repos.append(GitRepo('linuxbin', 'https://github.com/ulgltas/linuxbin.git'))
         self.repos.append(GitRepo('parasolid', 'blueberry.ltas.ulg.ac.be:/home/metafor/GIT/parasolid.git'))
 
-        self.loadPars() # RB: semble inutile: deja fait dans classe de base PRMSet??
-
     def setDefaultPars(self):
         if len(self.pars)!=0:
             return
diff --git a/launch.py b/launch.py
index b4e3211d771f73c521ce8d1f91cce42fbf0cf870..f20d19960ec630ba8f745432129aec9a101b8a14 100755
--- a/launch.py
+++ b/launch.py
@@ -16,7 +16,6 @@ class LaunchJob(ParametricJob):
         self.jobId=_jobId
         cfgfile="launch%s.cfg"%self.jobId
         ParametricJob.__init__(self, cfgfile)
-        self.loadPars()
         # gestion des dépendances entre paramètres 
         self.applyDependencies()
         # liens vers launchGui (lorsque lancé par ce biais pour interaction)
@@ -51,21 +50,23 @@ class LaunchJob(ParametricJob):
         TextPRM(self.pars,  'AFFINITY',     'affinity (cores list)', "")
         TextPRM(self.pars,  'NB_TASKS',     'nb of task launched in parallel', "1")
         TextPRM(self.pars,  'NB_THREADS',   'nb of threads by task', "1")
-
-        if isUnix():
-            MultiPRM(self.pars, 'RUNMETHOD',    'Run Method', ["interactive", "at", "batch", "slurm", "sge"], "interactive")
-        else:
-            MultiPRM(self.pars, 'RUNMETHOD',    'Run Method', ["interactive"], "interactive")
+        # Run Method : 
+        MultiPRM(self.pars, 'RUNMETHOD',    'Run Method', ["interactive", "at", "batch", "slurm", "sge", "pbs"], "interactive")
         #AT
         TextPRM(self.pars,  'AT_TIME' ,     'Delay for at launch (no syntax check, use with care)', "now")
         # QUEUING SYSTEMS : SGE / SLURM
         TextPRM(self.pars,  'QUEUE',        'Queue name', "defq")
         YesNoPRM(self.pars, 'LOCALDISK',    'Metafor run on node local disk', True)
         TextPRM(self.pars,  'MEMORY',       'Total Memory (Mb)', "1000")
-        TextPRM(self.pars,  'TIME',         'Time (d-hh:mm:ss) ', "0-1:00:00")
+        TextPRM(self.pars,  'TIME',         'Time (slurm : d-hh:mm:ss / PBS : d:hh:mm:ss) ', "0-1:00:00")
         # SGE specific
         TextPRM(self.pars,  'SGE_PE',       'SGE parallel environment', "snode")
         TextPRM(self.pars,  'SGEARGS',      'additional SGE args', "")
+        # PBS Specific (zenobe)       
+        #TextPRM(self.pars,  'QUEUE',       'PBS Queue name', "main") # zenobe : main ou large
+        TextPRM(self.pars,  'PROJECT',      'Project Name (Acces group dirs)', "hpcwe")
+        MultiPRM(self.pars, 'MODEL',        'CPU Model', ["auto", "westemere", "westmere_fat", "westmere_xfat", "ivyBridge", "haswell_xfat"], "auto")
+        
         # FTP
         YesNoPRM(self.pars, 'ENABLE_FTP',   'ftp transfert', False)
         TextPRM(self.pars,  'FTP_HOST',     'ftp host', "")
@@ -92,7 +93,7 @@ class LaunchJob(ParametricJob):
         PRMAction(self.actions, 'm', self.pars['RUNMETHOD'])
         # At parameters
         PRMAction(self.actions, 'n', self.pars['AT_TIME'])
-        # SGE/SLURM PARAMETERS
+        # SGE/SLURM/PBS PARAMETERS
         PRMAction(self.actions, 'n', self.pars['QUEUE'])
         PRMAction(self.actions, 'o', self.pars['LOCALDISK'])
         PRMAction(self.actions, 'p', self.pars['MEMORY'])
@@ -101,6 +102,10 @@ class LaunchJob(ParametricJob):
         #PRMAction(self.actions, 'n', self.pars['SGEQUEUE'])
         PRMAction(self.actions, 'r', self.pars['SGE_PE'])
         PRMAction(self.actions, 's', self.pars['SGEARGS'])
+        # PBS (zenobe) specific PARAMETERS        
+        PRMAction(self.actions, 'r', self.pars['PROJECT'])
+        PRMAction(self.actions, 's', self.pars['MODEL'])
+        
         # FTP
         PRMAction(self.actions, 'u', self.pars['ENABLE_FTP'])
         PRMAction(self.actions, 'v', self.pars['FTP_HOST'])
@@ -130,7 +135,10 @@ class LaunchJob(ParametricJob):
         return ret
 
     def configActions(self):
-        self.pars['MAIL_ADDR'].enable(self.pars['SEND_MAIL'].val==True)
+        #self.pars['MAIL_ADDR'].enable(self.pars['SEND_MAIL'].val==True or 
+        #                              self.pars['RUNMETHOD'].val=='sge' or
+        #                              self.pars['RUNMETHOD'].val=='slurm' or
+        #                              self.pars['RUNMETHOD'].val=='pbs')
         self.pars['SMTP_SERV'].enable(self.pars['SEND_MAIL'].val==True)
 
         self.pars['TEST_NAME'].enable(self.pars['MULTITEST'].val==False)
@@ -153,20 +161,27 @@ class LaunchJob(ParametricJob):
                                      self.pars['MULTITEST'].val==False)
         # At
         self.pars['AT_TIME'].enable(self.pars['RUNMETHOD'].val=='at')
-        # SGE/SLURM
+        # SGE/SLURM/PBS
         self.pars['QUEUE'].enable(self.pars['RUNMETHOD'].val=='sge' or
-                                  self.pars['RUNMETHOD'].val=='slurm')
+                                  self.pars['RUNMETHOD'].val=='slurm' or
+                                  self.pars['RUNMETHOD'].val=='pbs')
         self.pars['LOCALDISK'].enable((self.pars['RUNMETHOD'].val=='sge' or
-                                       self.pars['RUNMETHOD'].val=='slurm') and
+                                       self.pars['RUNMETHOD'].val=='slurm') and # pas zenobe
                                       self.pars['ALGORITHM'].val!='restart' )
         self.pars['TIME'].enable(self.pars['RUNMETHOD'].val=='sge' or
-                                 self.pars['RUNMETHOD'].val=='slurm')
+                                 self.pars['RUNMETHOD'].val=='slurm' or
+                                  self.pars['RUNMETHOD'].val=='pbs')
         self.pars['MEMORY'].enable(self.pars['RUNMETHOD'].val=='sge' or
-                                   self.pars['RUNMETHOD'].val=='slurm')
+                                   self.pars['RUNMETHOD'].val=='slurm' or
+                                  self.pars['RUNMETHOD'].val=='pbs')
         # SGE specific
         self.pars['SGE_PE'].enable(self.pars['RUNMETHOD'].val=='sge')
         self.pars['SGEARGS'].enable(self.pars['RUNMETHOD'].val=='sge')
 
+        # PBS specific
+        self.pars['MODEL'].enable(self.pars['RUNMETHOD'].val=='pbs') # cpu model (to choose subqueue)
+        self.pars['PROJECT'].enable(self.pars['RUNMETHOD'].val=='pbs') # project (group access & facturation)
+
 
     def getJobName(self):
         if (self.pars['MULTITEST'].val==False):
@@ -196,7 +211,7 @@ class LaunchJob(ParametricJob):
         # write kill scripts
         if isUnix():
             if (self.pars['RUNMETHOD'].val == 'interactive' or self.pars['RUNMETHOD'].val == 'at' or
-               self.pars['RUNMETHOD'].val == 'batch'):
+                self.pars['RUNMETHOD'].val == 'batch'):
                 self.killScript(self.jobId, os.getpgrp())
             elif ((self.pars['RUNMETHOD'].val == 'sge' or self.pars['RUNMETHOD'].val == 'slurm') and
                   self.pars['LOCALDISK'].val == True):
diff --git a/launchGui.pyw b/launchGui.pyw
index 2908b2f09ae215c472751d8fc697588387aa57b3..56e2a41c7bcdecb4512c24212e4387c020eba7e2 100755
--- a/launchGui.pyw
+++ b/launchGui.pyw
@@ -149,18 +149,22 @@ class LaunchGui(QWidget):
         self.sf['AT_TIME']     = TextLine(self, grplay6, self.launch.pars['AT_TIME'], 0, 0, 1)
         
         # SGE OPTIONS
-        self.sgeOptGrpBox  = QGroupBox("Queue Options (SGE / SLURM)")
+        self.sgeOptGrpBox  = QGroupBox("Queue Options (SGE / SLURM / PBS)")
         vbox.addWidget(self.sgeOptGrpBox)
         grplay4 = QGridLayout()
         self.sgeOptGrpBox.setLayout(grplay4) 
         grplay4.setColumnStretch(2,1)
         
         self.sf['QUEUE']        = TextLine(self, grplay4, self.launch.pars['QUEUE'],     0, 0, 1)
-        self.sf['LOCALDISK']= CheckBoxLine(self, grplay4, self.launch.pars['LOCALDISK'], 0, 3)        
+        self.sf['LOCALDISK']    = CheckBoxLine(self, grplay4, self.launch.pars['LOCALDISK'], 0, 3)        
         self.sf['MEMORY']       = TextLine(self, grplay4, self.launch.pars['MEMORY'],    1, 0, 1)
         self.sf['TIME']         = TextLine(self, grplay4, self.launch.pars['TIME'],      1, 3, 1)        
         self.sf['SGE_PE']       = TextLine(self, grplay4, self.launch.pars['SGE_PE'],    2, 0, 1)
         self.sf['SGEARGS']      = TextLine(self, grplay4, self.launch.pars['SGEARGS'],   2, 3, 1)
+        self.sf['MODEL']        = MultiPMRLine(self, grplay4, self.launch.pars['MODEL'], 3, 0)
+        
+        
+        # SGE OPTIONS
         
         # FTP OPTIONS
         self.ftpOptGrpBox  = QGroupBox("FTP Options")
diff --git a/mtfLicense/metafor181231.lic b/mtfLicense/metafor181231.lic
new file mode 100644
index 0000000000000000000000000000000000000000..997a54d9d5d1eaec247af1f315c9f881deb9fb8c
--- /dev/null
+++ b/mtfLicense/metafor181231.lic
@@ -0,0 +1 @@
+646574612B0A060C031B13305B736D657473666F72390C19042A061F041111052A0611080B070406FE5831657461666A796D65
diff --git a/parametricJob.py b/parametricJob.py
index adf4d80aa0185a6ca4781d1fed0561a38e9b7da4..601d79de8c7dbb0c4fc1d38d49a4e9bf9d1ba14b 100644
--- a/parametricJob.py
+++ b/parametricJob.py
@@ -1,7 +1,7 @@
 # -*- coding: latin-1; -*-
 
 import sys, os, os.path, shutil, socket, platform, glob, fnmatch
-import datetime, tarfile, subprocess
+import datetime, tarfile, subprocess, string
 from prmClasses import *
 
 # -- Base Class ----------------------------------------------------------------
@@ -9,6 +9,11 @@ class ParametricJob(PRMSet):
     def __init__(self,cfgfile, _verb=False):
         PRMSet.__init__(self, cfgfile, _verb)
 
+    def loadPaths(self):
+        cfgRep = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'cfg', getHostCfgName())
+        local  = os.path.abspath('.')
+        return [local, cfgRep]
+        
     def getNiceCmd(self, niceValue):
         if isUnix():
             niceCmd = ['nice', '-%d'%niceValue]
@@ -439,7 +444,6 @@ class ParametricJob(PRMSet):
         file.write("#SBATCH --job-name=metafor\n")
         file.write("#SBATCH --mail-user=%s\n"%self.pars['MAIL_ADDR'].val)
         file.write("#SBATCH --mail-type=ALL\n")
-        #file.write("#SBATCH --output=%s\n"%self.getOutFileName())
         file.write("# Ressources needed...\n")
         file.write("#SBATCH --partition=%s\n"%self.pars['QUEUE'].val)
         nbCores = (int(self.pars['NB_TASKS'].val) * int(self.pars['NB_THREADS'].val))
@@ -519,6 +523,122 @@ class ParametricJob(PRMSet):
         file.close()
         os.chmod(filename,0700)
     # END OF SLURM SPECIFIC INTERFACE
+    #===========================================================================    
+    # PBS SPECIFIC INTERFACE (Zenobe)
+    def runPBS(self):
+        # get guess profile
+        cfgfile = self.guessProfile()
+        # build script
+        scriptname='runPBS.sh'
+        file = open(scriptname,'w')
+        file.write('#!/bin/bash\n')
+        file.write('# Metafor launch.py PBS script (Zenobe)...\n')
+        jobname = self.getJobName()
+        # Job Name
+        #file.write("#PBS -N %s\n" % jobname)
+        file.write("#PBS -N metafor\n")
+        # Mail
+        if ( self.pars['MAIL_ADDR'].val == os.getenv('USER') or
+             string.find(self.pars['MAIL_ADDR'].val, "@") < 0 ):
+            print "ERROR : PBSPro : Only external email allowed : correct it before launch"
+            raw_input("press enter to get back to configuration before launch")
+            return
+        file.write('#PBS -M %s\n'%self.pars['MAIL_ADDR'].val)
+        file.write('#PBS -m abe\n') # mail abort/begin/end
+        # config
+        file.write('#PBS -r y\n')   # defini le job comme rerunnable (en cas de plantage/timeOut,...) ceci proposal 
+        #file.write('#PBS -r n\n')   # mtf : non rerunnable : faudrait que le rerun soit un restart par defaut : ACTUELLEMENT REFUSE POUR LES LONG JOBS
+        file.write('#PBS -j oe\n')  # join error and output flux into 1 file (defaut)
+        file.write('#PBS -W group_list=%s\n'%self.pars['PROJECT'].val) # le grpName permet d'ecrire sur le disque du projet & d'acceder aux ressources du group        
+        
+        file.write('# Ressources needed...\n')
+        nbCores = (int(self.pars['NB_TASKS'].val) * int(self.pars['NB_THREADS'].val))
+        #file.write('#PBS -l select=1:ncpus=%d:ompthreads=%d:mem=%smb\n'%(nbCores,nbCores,self.pars['MEMORY'].val)) # omp pas utile        
+        file.write('#PBS -l select=1:ncpus=%d:mem=%smb\n'%(nbCores,self.pars['MEMORY'].val))
+        file.write('#PBS -l walltime=%s\n'%self.pars['TIME'].val)  
+        # Queue
+        file.write('# Queue...\n')
+        file.write('#PBS -q %s\n'%self.pars['QUEUE'].val) # queue == large or main
+        # faire une variable avec un select
+        if (self.pars['MODEL'].val != 'auto') :
+            file.write('#PBS -l model=%s\n'%self.pars['MODEL'].val) #allow choice for subqueues => chose CPU Type 
+                                                                 #allowed values : westemere / westmere_fat / westmere_xfat / ivyBridge             
+        # workdir : 
+        file.write('echo "------------------ Work dir --------------------"\n')
+        #pbs does not start in launchworkdir => get back to it
+        file.write('cd ${PBS_O_WORKDIR} && echo ${PBS_O_WORKDIR}\n')
+        #pbs output only written at the end of exec. This command allow having output during run
+        file.write('exec > ${PBS_O_WORKDIR}/${PBS_JOBNAME}_${PBS_JOBID}.log\n') 
+        file.write('echo "------------------ Job Info --------------------"\n')
+        # print info         
+        file.write('echo "jobid      : $PBS_JOBID"\n')
+        file.write('echo "jobname    : $PBS_JOBNAME"\n')
+        file.write('echo "job type   : $PBS_ENVIRONMENT"\n')
+        file.write('echo "submit dir : $PBS_O_WORKDIR"\n')
+        file.write('echo "queue      : $PBS_O_QUEUE"\n')
+        file.write('echo "user       : $PBS_O_LOGNAME"\n')
+        file.write('echo "threads    : $NCPUS"\n')
+        # Lanch the job        
+        import socket
+        file.write('. %s %s\n' % (cfgfile, socket.gethostname()))
+        file.write('%s -x -i $PBS_JOBID\n' % (sys.argv[0]))
+        file.write('qstat -f $PBS_JOBID\n')
+        file.close()
+        os.chmod(scriptname,0700)
+        # send to PBS
+        print 'sending job "%s" to PBS' % jobname
+        shcmd='qsub ./%s' % scriptname
+        import commands
+        status, result = commands.getstatusoutput(shcmd)
+        print 'command status = ', status
+        print 'command result = ', result
+        if status!=0:
+            print "Job submission FAILED!"
+        else:
+            print "Submission SUCCESSFUL!"
+            
+            # le pbsid est le retour de qsub : 3067709.frontal2
+            PbsId = result
+            cfgFileName, cfgFileExtension = os.path.splitext(self.cfgfile)
+            os.system("cp %s %s%s%s"%(self.cfgfile, cfgFileName, PbsId, cfgFileExtension))
+            self.PBSCancelScript(PbsId)
+            print "\tuse ' qstat -f %s ' to check the status of the PBS scheduling queue of your job" % PbsId
+            print "\tuse ' qdel %s ' to kill your job" % PbsId
+            '''
+            #import re
+            #m = re.compile('waiting for job ([0-9]+) to start').match(result)            
+            #result : 3067709.frontal2
+            #m = re.compile('([0-9]+)\.(.+)').match(result)
+            #print "m = ", m
+            #PbsId = m.group(1)
+            if m:
+                cfgFileName, cfgFileExtension = os.path.splitext(self.cfgfile)
+                os.system("cp %s %s%s%s"%(self.cfgfile, cfgFileName, PbsId, cfgFileExtension))
+                self.PBSCancelScript(PbsId)
+                print "\tuse ' qstat -f %s ' to check the status of the PBS scheduling queue of your job" % PbsId
+                #print "\tuse ' sprio -l -j %s ' to check the factor priority of your job" % PbsId
+                #print "\tuse ' sstat  -a --format=JobID,NTasks,MaxRSS,MaxVMSize -j %s ' to get information about your running job (adapt format to your needs)" % PbsId
+                print "\tuse ' qdel %s ' to kill your job" % PbsId
+                #print "\tuse ' sacct --format=JobID,NTasks,NCPUS,CPUTime,Elapsed,MaxRSS,MaxVMSize -j %s ' to get information about your finished job (adapt format to your needs)" % PbsId
+             '''
+        sys.exit()
+
+    def PBSCancelScriptName(self, jobId):
+        filename = "qdel%s.py"%jobId
+        return filename
+
+    def PBSCancelScript(self, jobId):
+        filename = self.PBSCancelScriptName(jobId)
+        file=open(filename,"w")
+        file.write("#!/usr/bin/env python\n")
+        file.write("import subprocess, os, sys\n")
+        file.write("subprocess.call('qdel %s',shell=True)\n"%jobId)        
+        # clean qDelScript
+        file.write("os.remove('./%s')\n"%(filename))
+        file.write("sys.exit(0)\n")
+        file.close()
+        os.chmod(filename,0700)
+    # END OF PBS SPECIFIC INTERFACE
     #===========================================================================
 
     # interface virtuelle...
@@ -541,6 +661,8 @@ class ParametricJob(PRMSet):
             self.runSGE()
         elif  self.pars['RUNMETHOD'].val == 'slurm':
             self.runSlurm()
+        elif  self.pars['RUNMETHOD'].val == 'pbs':
+            self.runPBS()
         else:
             self.run()
 
diff --git a/prmClasses.py b/prmClasses.py
index 9adb5b789bcb25f42c49ec36e2e31a4c688b2955..9b11789ff55e3ea474522aafc0fdd485715f7957 100644
--- a/prmClasses.py
+++ b/prmClasses.py
@@ -32,8 +32,8 @@ class PRMSet(object):
         self.debug = _verb
 
     def printPars(self):
-        for k,v in self.pars.items():
-            print ("pars['%s'].val=%s\n" % (k,repr(v.val)) )
+        for par in self.pars.itervalues():
+            par.writePRM(sys.stdout)
 
     def loadPaths(self):
         return [os.path.abspath('.')]
@@ -46,9 +46,9 @@ class PRMSet(object):
             pth  = self.savePath()
         fname = os.path.join(pth, self.cfgfile)
         file = open(fname,"w")
-        for k,v in self.pars.items():
-            file.write("self.pars['%s'].val=%s\n" % (k,repr(v.val)) )
-        file.close()
+        for par in self.pars.itervalues():
+            par.writePRM(file)
+        file.close()        
 
     def loadPars(self): # lecture dans les chemins par defaut
         for pth in self.loadPaths():
@@ -113,6 +113,9 @@ class PRM(object):
         set[key]     = self
         self.enabled = True
 
+    def writePRM(self, file):
+        file.write("self.pars['%s'].val=%s\n" % (self.key,repr(self.val)) )
+        
     def typecheck(self, val):
         pass
 
@@ -153,6 +156,13 @@ class MultiPRM(PRM):
         self.vals = vals
         PRM.__init__(self, set, key, desc, defval)
 
+    def writePRM(self, file):
+        file.write("self.pars['%s'].vals=["%(self.key))        
+        for v in self.vals:
+            file.write("'%s'," % (v))
+        file.write("]\n")   
+        PRM.writePRM(self,file)
+        
     def input(self):
         i = self.vals.index(self.val)
         i = i+1
@@ -267,6 +277,14 @@ def isUnix():
     uname = platform.uname()
     return not (uname[0] == 'Windows' or uname[2] == 'Windows')
 
+# getMachineName
+def getHostCfgName():
+    uname = platform.uname()
+    if (uname[0] == 'Windows' or uname[2] == 'Windows'):
+        return 'windows'
+    else:
+        return uname[1]
+
 # copied from linuxbin/parametricJob.py
 def cls():
     uname = platform.uname()