diff --git a/.gitignore b/.gitignore
index d0f4a919cdefb405904adce7b3520b24f9cc5a03..9b639ce64a61826f7a3519c2499cab62d29e54c8 100755
--- a/.gitignore
+++ b/.gitignore
@@ -17,7 +17,4 @@ doxygen_warnings.log
 *.iml
 Thumbs.db
 # Vagrant generated files
-.vagrant
-/index.html
-/phpmyadmin
-/xhprof
+.vagrant
\ No newline at end of file
diff --git a/dev/vagrant/README.md b/dev/vagrant/README.md
index 8056643520ec77ffdd2d898f0e31d1ebbd287d5f..dc0bc4234e2b4151585ac0abe34ac3dd68c8fc5d 100644
--- a/dev/vagrant/README.md
+++ b/dev/vagrant/README.md
@@ -23,7 +23,7 @@ Usage
 
 `cd` into the vagrant box directory and simply type `vagrant up`.
 
-That's all you need to do. It will build a brand new VirtalBox machine for you with everything you need to develop on Dolibarr.
+That's all you need to do. It will build a brand new VirtualBox machine for you with everything you need to develop on Dolibarr.
 
 ### Name resolution
 For easy access to the VM you need to setup name resolution to the machines IP.
@@ -45,9 +45,16 @@ Somewhat bleeding edge vagrant box for develop branch related work.
 
 - IP: 192.168.42.101
 - Vhost: dev.dolibarr.org
-- OS: Debian Wheezy 7.5
+- OS: Debian Wheezy 7.5 x64
 - Webserver: Apache 2.2.22
-- PHP: mod_php 5.5.13-1~dotdeb.1
+- PHP: mod_php 5.5.14-1~dotdeb.1
+  Installed modules:
+    - cli
+    - curl
+    - gd
+    - imagick
+    - intl
+    - mcrypt
 - Database: MySQL 5.5
     - Root user: root
     - Root password: root
@@ -55,7 +62,13 @@ Somewhat bleeding edge vagrant box for develop branch related work.
     - Database user: user
     - Database password: user
     - Initial data: dev/initdata/mysqldump_dolibarr-3.5.0.sql
+- Database: PostgreSQL 9.3
+- Adminer: lightweight database management. Access through http://192.168.42.101/adminer
 - Debugger: XDebug
-- Profiler: Xhprof
+- Profiler: Xhprof. Access through http://192.168.42.101/xhprof/xhprof_html
 
 You can access MailCatcher to read all outgoing emails at http://192.168.42.101:1080
+
+To access the machine you must use the following private keys:
+- User root: located at puphpet/files/dot/ssh/root_rsa
+- User vagrant: located at puphpet/files/dot/ssh/id_rsa
diff --git a/dev/vagrant/dolibarrdev/Vagrantfile b/dev/vagrant/dolibarrdev/Vagrantfile
index f73476207d0ee61db828a4dc6722d66ce5151bc7..89c2c75a5b726e45d4a944e4af6343aa761a64fb 100644
--- a/dev/vagrant/dolibarrdev/Vagrantfile
+++ b/dev/vagrant/dolibarrdev/Vagrantfile
@@ -25,11 +25,19 @@ Vagrant.configure("2") do |config|
 
   data['vm']['synced_folder'].each do |i, folder|
     if folder['source'] != '' && folder['target'] != ''
-      nfs = (folder['nfs'] == "true") ? "nfs" : nil
-      if nfs == "nfs"
-        config.vm.synced_folder "#{folder['source']}", "#{folder['target']}", id: "#{i}", type: nfs
+      if folder['sync_type'] == 'nfs'
+        config.vm.synced_folder "#{folder['source']}", "#{folder['target']}", id: "#{i}", type: "nfs"
+      elsif folder['sync_type'] == 'smb'
+        config.vm.synced_folder "#{folder['source']}", "#{folder['target']}", id: "#{i}", type: "smb"
+      elsif folder['sync_type'] == 'rsync'
+        rsync_args = !folder['rsync']['args'].nil? ? folder['rsync']['args'] : ["--verbose", "--archive", "--delete", "-z"]
+        rsync_auto = !folder['rsync']['auto'].nil? ? folder['rsync']['auto'] : true
+        rsync_exclude = !folder['rsync']['exclude'].nil? ? folder['rsync']['exclude'] : [".vagrant/"]
+
+        config.vm.synced_folder "#{folder['source']}", "#{folder['target']}", id: "#{i}",
+            rsync__args: rsync_args, rsync__exclude: rsync_exclude, rsync__auto: rsync_auto, type: "rsync"
       else
-        config.vm.synced_folder "#{folder['source']}", "#{folder['target']}", id: "#{i}", type: nfs,
+        config.vm.synced_folder "#{folder['source']}", "#{folder['target']}", id: "#{i}",
           group: 'www-data', owner: 'www-data', mount_options: ["dmode=775", "fmode=764"]
       end
     end
@@ -128,7 +136,14 @@ Vagrant.configure("2") do |config|
     end
   end
 
-  config.vm.provision :shell, :path => "puphpet/shell/execute-files.sh"
+  config.vm.provision :shell do |s|
+    s.path = "puphpet/shell/execute-files.sh"
+    s.args = ["exec-once", "exec-always"]
+  end
+  config.vm.provision :shell, run: "always" do |s|
+    s.path = "puphpet/shell/execute-files.sh"
+    s.args = ["startup-once", "startup-always"]
+  end
   config.vm.provision :shell, :path => "puphpet/shell/important-notices.sh"
 
   if File.file?("#{dir}/puphpet/files/dot/ssh/id_rsa")
diff --git a/dev/vagrant/dolibarrdev/puphpet/config.yaml b/dev/vagrant/dolibarrdev/puphpet/config.yaml
index 5cfb2601f21d6e864891796be30efc67bced796d..c9c8440c87df7e32e3f4610dd974718efb707145 100644
--- a/dev/vagrant/dolibarrdev/puphpet/config.yaml
+++ b/dev/vagrant/dolibarrdev/puphpet/config.yaml
@@ -29,10 +29,12 @@ vagrantfile-local:
                     - '--hiera_config /vagrant/puphpet/puppet/hiera.yaml'
                     - '--parser future'
         synced_folder:
-            PL1BkioqqvGY:
+            jopH6005bn96:
                 source: ../../../
-                target: /var/www
-                nfs: 'false'
+                target: /var/www/dolibarr
+                sync_type: default
+                rsync:
+                    auto: 'false'
         usable_port_range: 2200..2250
     ssh:
         host: null
@@ -71,7 +73,7 @@ apache:
     settings:
         user: www-data
         group: www-data
-        default_vhost: false
+        default_vhost: true
         manage_user: false
         manage_group: false
         sendfile: 0
@@ -79,9 +81,9 @@ apache:
         - php
         - rewrite
     vhosts:
-        CGyWQB0fx4x0:
+        b2tOrs1TMtoF:
             servername: dev.dolibarr.org
-            docroot: /var/www/htdocs
+            docroot: /var/www/dolibarr/htdocs
             port: '80'
             setenv:
                 - 'APP_ENV dev'
@@ -97,7 +99,7 @@ apache:
 nginx:
     install: 0
     vhosts:
-        jeF1sybIJ3V2:
+        0dU5luf5AnIe:
             server_name: awesome.dev
             server_aliases:
                 - www.awesome.dev
@@ -152,7 +154,7 @@ mysql:
     root_password: root
     adminer: 0
     databases:
-        2OfuuapoIqsl:
+        V6H3W2FVB7Yq:
             grant:
                 - ALTER
                 - CREATE
@@ -166,16 +168,16 @@ mysql:
             host: localhost
             user: user
             password: user
-            sql_file: /var/www/dev/initdata/mysqldump_dolibarr_3.5.0.sql
+            sql_file: /var/www/dolibarr/dev/initdata/mysqldump_dolibarr_3.5.0.sql
 postgresql:
-    install: 0
+    install: '1'
     settings:
-        root_password: '123'
+        root_password: root
         user_group: postgres
         encoding: UTF8
         version: '9.3'
     databases: {  }
-    adminer: 0
+    adminer: '1'
 mariadb:
     install: 0
     root_password: '123'
diff --git a/dev/vagrant/dolibarrdev/puphpet/files/dot/.gitignore b/dev/vagrant/dolibarrdev/puphpet/files/dot/.gitignore
index dcf60545594365a2c0d5c15de55e61dc5f7b9f73..e9b023ea6a627525281203c45cae5050959b19e1 100644
--- a/dev/vagrant/dolibarrdev/puphpet/files/dot/.gitignore
+++ b/dev/vagrant/dolibarrdev/puphpet/files/dot/.gitignore
@@ -1,4 +1 @@
-ssh/id_rsa
-ssh/id_rsa.pub
-ssh/insecure_private_key
-ssh/id_rsa.ppk
\ No newline at end of file
+ssh/*
\ No newline at end of file
diff --git a/dev/vagrant/dolibarrdev/puphpet/files/startup-always/empty b/dev/vagrant/dolibarrdev/puphpet/files/startup-always/empty
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/dev/vagrant/dolibarrdev/puphpet/files/startup-once/empty b/dev/vagrant/dolibarrdev/puphpet/files/startup-once/empty
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/manifest.pp b/dev/vagrant/dolibarrdev/puphpet/puppet/manifest.pp
index 57f759e5531b3c7a140fd055177692fd81b5a821..6f560f8735f22ab77cb29b4d62e73a6af143642b 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/manifest.pp
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/manifest.pp
@@ -279,8 +279,14 @@ if hash_key_equals($mailcatcher_values, 'install', 1) {
   }
 
   if ! defined(Class['supervisord']) {
+    class{ 'puphpet::python::pip': }
+
     class { 'supervisord':
-      install_pip => true,
+      install_pip => false,
+      require     => [
+        Class['my_fw::post'],
+        Class['Puphpet::Python::Pip'],
+      ],
     }
   }
 
@@ -467,15 +473,16 @@ if hash_key_equals($apache_values, 'install', 1) {
     $apache_vhosts = merge($apache_values['vhosts'], {
       'default_vhost_80'  => {
         'servername'    => 'default',
-        'serveraliases' => ['*'],
         'docroot'       => '/var/www/default',
         'port'          => 80,
+        'default_vhost' => true,
       },
       'default_vhost_443' => {
         'servername'    => 'default',
-        'serveraliases' => ['*'],
         'docroot'       => '/var/www/default',
         'port'          => 443,
+        'default_vhost' => true,
+        'ssl'           => 1,
       },
     })
   } else {
@@ -515,11 +522,11 @@ if hash_key_equals($apache_values, 'install', 1) {
 
       create_resources(apache::vhost, { "${key}" => merge($vhost, {
           'custom_fragment' => template('puphpet/apache/custom_fragment.erb'),
-          'ssl'             => 'ssl'           in $vhost and str2bool($vhost['ssl']) ? { true => true, default => false },
-          'ssl_cert'        => 'ssl_cert'      in $vhost and $vhost['ssl_cert']      ? { undef => undef, '' => undef, default => $vhost['ssl_cert'] },
-          'ssl_key'         => 'ssl_key'       in $vhost and $vhost['ssl_key']       ? { undef => undef, '' => undef, default => $vhost['ssl_key'] },
-          'ssl_chain'       => 'ssl_chain'     in $vhost and $vhost['ssl_chain']     ? { undef => undef, '' => undef, default => $vhost['ssl_chain'] },
-          'ssl_certs_dir'   => 'ssl_certs_dir' in $vhost and $vhost['ssl_certs_dir'] ? { undef => undef, '' => undef, default => $vhost['ssl_certs_dir'] }
+          'ssl'             => 'ssl' in $vhost and str2bool($vhost['ssl']) ? { true => true, default => false },
+          'ssl_cert'        => hash_key_true($vhost, 'ssl_cert') ? { true => $vhost['ssl_cert'],      default => undef },
+          'ssl_key'         => hash_key_true($vhost, 'ssl_cert') ? { true => $vhost['ssl_key'],       default => undef },
+          'ssl_chain'       => hash_key_true($vhost, 'ssl_cert') ? { true => $vhost['ssl_chain'],     default => undef },
+          'ssl_certs_dir'   => hash_key_true($vhost, 'ssl_cert') ? { true => $vhost['ssl_certs_dir'], default => undef }
         })
       })
 
@@ -662,10 +669,6 @@ if hash_key_equals($nginx_values, 'install', 1) {
     }
   } elsif hash_key_equals($hhvm_values, 'install', 1) {
     $fastcgi_pass        = '127.0.0.1:9000'
-
-    set_php5_fpm_sock_group_and_user { 'hhvm':
-      require => Package['nginx'],
-    }
   } else {
     $fastcgi_pass        = ''
   }
@@ -1096,7 +1099,7 @@ if hash_key_equals($xhprof_values, 'install', 1)
   }
 
   if hash_key_equals($apache_values, 'install', 1) {
-    $xhprof_webroot_location = $puphpet::params::apache_webroot_location
+    $xhprof_webroot_location = '/var/www/default'
     $xhprof_webserver_service = 'httpd'
   } elsif hash_key_equals($nginx_values, 'install', 1) {
     $xhprof_webroot_location = $puphpet::params::nginx_webroot_location
@@ -1216,11 +1219,11 @@ if hash_key_equals($mysql_values, 'install', 1) {
 
   if hash_key_equals($mysql_values, 'adminer', 1) and $mysql_php_installed {
     if hash_key_equals($apache_values, 'install', 1) {
-      $mysql_adminer_webroot_location = $puphpet::params::apache_webroot_location
+      $mysql_adminer_webroot_location = '/var/www/default'
     } elsif hash_key_equals($nginx_values, 'install', 1) {
       $mysql_adminer_webroot_location = $puphpet::params::nginx_webroot_location
     } else {
-      $mysql_adminer_webroot_location = $puphpet::params::apache_webroot_location
+      $mysql_adminer_webroot_location = '/var/www/default'
     }
 
     class { 'puphpet::adminer':
@@ -1329,11 +1332,11 @@ if hash_key_equals($postgresql_values, 'install', 1) {
 
   if hash_key_equals($postgresql_values, 'adminer', 1) and $postgresql_php_installed {
     if hash_key_equals($apache_values, 'install', 1) {
-      $postgresql_adminer_webroot_location = $puphpet::params::apache_webroot_location
+      $postgresql_adminer_webroot_location = '/var/www/default'
     } elsif hash_key_equals($nginx_values, 'install', 1) {
       $postgresql_adminer_webroot_location = $puphpet::params::nginx_webroot_location
     } else {
-      $postgresql_adminer_webroot_location = $puphpet::params::apache_webroot_location
+      $postgresql_adminer_webroot_location = '/var/www/default'
     }
 
     class { 'puphpet::adminer':
@@ -1364,7 +1367,7 @@ define postgresql_db (
     $table = "${name}.*"
 
     exec{ "${name}-import":
-      command     => "psql ${name} < ${sql_file}",
+      command     => "sudo -u postgres psql ${name} < ${sql_file}",
       logoutput   => true,
       refreshonly => $refresh,
       require     => Postgresql::Server::Db[$name],
@@ -1491,11 +1494,11 @@ if hash_key_equals($mariadb_values, 'install', 1) {
 
   if hash_key_equals($mariadb_values, 'adminer', 1) and $mariadb_php_installed {
     if hash_key_equals($apache_values, 'install', 1) {
-      $mariadb_adminer_webroot_location = $puphpet::params::apache_webroot_location
+      $mariadb_adminer_webroot_location = '/var/www/default'
     } elsif hash_key_equals($nginx_values, 'install', 1) {
       $mariadb_adminer_webroot_location = $puphpet::params::nginx_webroot_location
     } else {
-      $mariadb_adminer_webroot_location = $puphpet::params::apache_webroot_location
+      $mariadb_adminer_webroot_location = '/var/www/default'
     }
 
     class { 'puphpet::adminer':
@@ -1662,7 +1665,7 @@ if $beanstalkd_values == undef {
 }
 
 if hash_key_equals($apache_values, 'install', 1) {
-  $beanstalk_console_webroot_location = "${puphpet::params::apache_webroot_location}/beanstalk_console"
+  $beanstalk_console_webroot_location = '/var/www/default/beanstalk_console'
 } elsif hash_key_equals($nginx_values, 'install', 1) {
   $beanstalk_console_webroot_location = "${puphpet::params::nginx_webroot_location}/beanstalk_console"
 } else {
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/puphpet/lib/puppet/parser/functions/hash_key_true.rb b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/puphpet/lib/puppet/parser/functions/hash_key_true.rb
new file mode 100644
index 0000000000000000000000000000000000000000..fd495f8f1430655fc823bd3159594adafb7bf6ab
--- /dev/null
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/puphpet/lib/puppet/parser/functions/hash_key_true.rb
@@ -0,0 +1,42 @@
+#
+# hash_key_true.rb
+#
+
+module Puppet::Parser::Functions
+
+  newfunction(:hash_key_true, :type => :rvalue, :doc => <<-'ENDHEREDOC') do |args|
+
+    Returns true if the key within hash is truthy
+    ENDHEREDOC
+
+    unless args.length == 2
+      raise Puppet::ParseError, ("hash_key_true(): wrong number of arguments (#{args.length}; must be 2)")
+    end
+
+    arr = args[0]
+    key = args[1]
+
+    unless arr.is_a?(Hash)
+      return false
+    end
+
+    unless arr.has_key?(key)
+      return false
+    end
+
+    if arr[key].nil?
+      return false
+    end
+
+    if arr[key].empty?
+      return false
+    end
+
+    if arr[key] == 'false'
+      return false
+    end
+
+    return true
+
+  end
+end
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/puphpet/manifests/hhvm.pp b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/puphpet/manifests/hhvm.pp
index 90083232cdc7c8402a859823e82981f75948fa5e..3b27ab90af63d727b7580b5e8e6436b4f4a492a6 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/puphpet/manifests/hhvm.pp
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/puphpet/manifests/hhvm.pp
@@ -69,17 +69,39 @@ class puphpet::hhvm(
       }
     }
     'centos': {
+      $jemalloc_url = 'http://files.puphpet.com/centos6/jemalloc-3.6.0-1.el6.x86_64.rpm'
+      $jemalloc_download_location = '/.puphpet-stuff/jemalloc-3.6.0-1.el6.x86_64.rpm'
+
+      $require = defined(Class['my_fw::post']) ? {
+        true    => Class['my_fw::post'],
+        default => [],
+      }
+
+      exec { "download jemalloc to ${download_location}":
+        creates => $download_location,
+        command => "wget --quiet --tries=5 --connect-timeout=10 -O '${jemalloc_download_location}' '${jemalloc_url}'",
+        timeout => 30,
+        path    => '/usr/bin',
+        require => $require
+      }
+
+      package { 'jemalloc':
+        ensure   => latest,
+        provider => yum,
+        source   => $download_location,
+        require  => Exec["download jemalloc to ${download_location}"],
+      }
+
       yum::managed_yumrepo { 'hop5':
         descr    => 'hop5 repository',
         baseurl  => 'http://www.hop5.in/yum/el6/',
         gpgkey   => 'file:///etc/pki/rpm-gpg/RPM-GPG-KEY-HOP5',
         enabled  => 1,
         gpgcheck => 0,
-        priority => 1
+        priority => 1,
       }
     }
   }
-
   if $real_webserver == 'apache2' {
     if ! defined(Class['apache::mod::mime']) {
       class { 'apache::mod::mime': }
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/puphpet/manifests/python/pip.pp b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/puphpet/manifests/python/pip.pp
new file mode 100644
index 0000000000000000000000000000000000000000..14b13fe08c6352ab2b6f42a4b5002cefedc992f6
--- /dev/null
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/puphpet/manifests/python/pip.pp
@@ -0,0 +1,22 @@
+class puphpet::python::pip {
+
+  Exec { path => [ '/usr/bin/', '/usr/local/bin', '/bin', '/usr/local/sbin', '/usr/sbin', '/sbin' ] }
+
+  if ! defined(Package['python-setuptools']) {
+    package { 'python-setuptools': }
+  }
+
+  exec { 'easy_install pip':
+    unless  => 'which pip',
+    require => Package['python-setuptools'],
+  }
+
+  if $::osfamily == 'RedHat' {
+    exec { 'rhel pip_provider_name_fix':
+      command     => 'alternatives --install /usr/bin/pip-python pip-python /usr/bin/pip 1',
+      subscribe   => Exec['easy_install pip'],
+      unless      => 'which pip-python',
+    }
+  }
+
+}
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/.fixtures.yml b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/.fixtures.yml
index 15f96922e017ae4ca430923922ab8f4335997caf..3f18ef2fca235831f4d6d0f53783226c383c3f02 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/.fixtures.yml
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/.fixtures.yml
@@ -1,6 +1,10 @@
 fixtures:
   repositories:
-    stdlib: "git://github.com/puppetlabs/puppetlabs-stdlib"
-    concat: "git://github.com/puppetlabs/puppetlabs-concat"
+    'stdlib':
+      repo: 'git://github.com/puppetlabs/puppetlabs-stdlib'
+      ref: '4.1.0'
+    'concat':
+      repo: 'git://github.com/puppetlabs/puppetlabs-concat'
+      ref: '1.0.1'
   symlinks:
     supervisord: "#{source_dir}"
\ No newline at end of file
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/.travis.yml b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/.travis.yml
index 6e544518c19fefc158b037f0d222cd90801fb403..bc96a165e59afefc0ec1f792b51724aa3907cadb 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/.travis.yml
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/.travis.yml
@@ -1,21 +1,28 @@
 language: ruby
 bundler_args: --without development
-script: "bundle exec rake spec lint"
+script: "bundle exec rake test"
 rvm:
 - 1.8.7
 - 1.9.3
 - 2.0.0
 env:
-  matrix:
-  - PUPPET_GEM_VERSION="~> 2.7.0"
-  - PUPPET_GEM_VERSION="~> 3.3.0"
-  - PUPPET_GEM_VERSION="~> 3.4.0"
+  - PUPPET_VERSION="~> 2.7.0"
+  - PUPPET_VERSION="~> 3.1.0"
+  - PUPPET_VERSION="~> 3.2.0"
+  - PUPPET_VERSION="~> 3.3.0"
+  - PUPPET_VERSION="~> 3.4.0"
+  - PUPPET_VERSION="~> 3.5.0"
+  - PUPPET_VERSION="~> 3.6.0"
 matrix:
   exclude:
+  - rvm: 2.0.0
+    env: PUPPET_VERSION="~> 2.7.0"
   - rvm: 1.9.3
-    env: PUPPET_GEM_VERSION="~> 2.7.0"
+    env: PUPPET_VERSION="~> 2.7.0"
   - rvm: 2.0.0
-    env: PUPPET_GEM_VERSION="~> 2.7.0"
+    env: PUPPET_VERSION="~> 3.1.0"
+  - rvm: 1.8.7
+    env: PUPPET_VERSION="~> 3.2.0"
 notifications:
   email: false
 
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/Changelog b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/Changelog
index ab4faa445ffda9ceae49460a44dce7ef6e69f187..b1e3228ff02d94bab0616db67626afd95d40fab3 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/Changelog
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/Changelog
@@ -1,3 +1,66 @@
+2014-06-20 - v0.4.0
+
+Fixes:
+
+- Removed root as group and replaced with uid 0 to enhance system
+compatibility
+
+Enhancements:
+
+- Made package provider a user definable param see supervisord::package_provider and README for details of how to change this.
+- All define types can now be automatically pulled in from hiera see example https://github.com/ajcrowe/puppet-supervisord#configure-a-program
+- You can now override the default include path of $config_include/*.conf with your own array using $config_dirs. Bear in mind this would need to include whatever you set $config_include to be, with *.conf on the end.
+
+Many thanks for the PRs from @jasperla, @mvantellingen for the bug report on the service name and @hasc for the enhancement ideas.
+
+2014-06-06 - v0.3.3
+
+Fixes:
+
+- Fixed typo in stopwaitsec param, should have been stopwaitsecs, thanks to @rchrd2
+
+2014-05-03 - v0.3.2
+
+Changes:
+
+- Added supervisord::executable_ctl variable for supervisorctl binary path, thanks to @bpgoldsb
+
+2014-04-22 - v0.3.1
+
+Fixes:
+
+- Fixed typo in unix_socket_group param, thanks to @dig412
+
+2014-03-11 - v0.3.0
+
+Fixes:
+
+- Fixed typo in fcgi config
+- Fixed typo in supervisord config with minfds and minprocs, thanks to @peefourtee
+- Typo in README fixed thanks to @hopkinsth
+- Removed refreshonly from pip_install exec resource
+- Number of syntax fixes thanks to `puppet lint`
+
+Important Changes:
+
+- Lots of input validation has been added **PLEASE** check your config works before upgrading!
+- Changed init_extras naming to defaults and cleaned things up.
+- Starting and stopping apps is now done with supervisorctl commands to avoid service restarts
+
+Other Changes:
+
+- CSV functions now order things consistently
+- Included description for classes and functions
+- Expanded spec testing built with Travis CI
+- Added beaker acceptance tests
+- Added greater validation of various parameters
+- Added coverage reporting for resources
+
+To-Do:
+
+- Add support for additional OS families such as Solaris.
+
+
 2013-10-31 - v0.2.3
 
 Fixes:
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/Gemfile b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/Gemfile
index 8612255f5b8828898564db4ea415d9ef580205a7..ba9a19d533ae57395e4997ba1a51c41dc831687c 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/Gemfile
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/Gemfile
@@ -1,14 +1,26 @@
 source 'https://rubygems.org'
 
-group :development, :test do
+group :test do
   gem 'rake'
-  gem 'puppetlabs_spec_helper', :require => false
-  gem 'rspec-system-puppet', '~> 2.0'
-  gem 'puppet-lint', '~> 0.3.2'
+  gem 'puppet-lint'
+  gem 'puppet-syntax'
+  gem 'puppetlabs_spec_helper'
+  gem 'rspec-puppet', :git => 'https://github.com/rodjek/rspec-puppet.git' , :ref => 'c44381a240ec420d4ffda7bffc55ee4d9c08d682'
+  gem 'rspec', '2.14.1'
 end
 
-if puppetversion = ENV['PUPPET_GEM_VERSION']
-  gem 'puppet', puppetversion, :require => false
+group :development do
+  gem 'travis'
+  gem 'travis-lint'
+  gem 'beaker'
+  gem 'beaker-rspec'
+  gem 'pry'
+  gem 'guard-rake'
+end
+
+
+if puppetversion = ENV['PUPPET_VERSION']
+  gem 'puppet', puppetversion
 else
-  gem 'puppet', :require => false
+  gem 'puppet', '~> 3.4.0'
 end
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/Modulefile b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/Modulefile
index 4a0552115dab25111aa8986c960c7adb7c8134bf..0c99b04baf2c23e8fde245fee3963ebd02c06f71 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/Modulefile
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/Modulefile
@@ -1,5 +1,5 @@
 name    'ajcrowe-supervisord'
-version '0.2.3'
+version '0.4.0'
 source 'git@github.com/ajcrowe/puppet-supervisord.git'
 author 'Alex Crowe'
 license 'Apache License, Version 2.0'
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/README.md b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/README.md
index a8419a09082a7d66d2d5d534e54d1b239d12ac2f..b454cd9307a6dd620724323889858dbc2231cafe 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/README.md
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/README.md
@@ -4,7 +4,7 @@
 
 Puppet module to manage the [supervisord](http://supervisord.org/) process control system.
 
-Functions available to configure 
+Functions available to configure
 
 * [programs](http://supervisord.org/configuration.html#program-x-section-settings)
 * [groups](http://supervisord.org/configuration.html#group-x-section-settings)
@@ -31,10 +31,16 @@ class supervisord {
 }
 ```
 
-This will download [setuptool](https://bitbucket.org/pypa/setuptools) and install pip with easy_install. 
+This will download [setuptool](https://bitbucket.org/pypa/setuptools) and install pip with easy_install.
 
 You can pass a specific url with `$setuptools_url = 'url'`
 
+### Install without pip
+
+If you want to use your system package manager you can specify that with `supervisord::package_provider`.
+
+You'll also likely need to adjust the `supervisord::service_name` to match that installed by the system package. If you're using Debian or Redhat OS families you'll also want to disable the init scripts with `supervisord::install_init = false`.
+
 Note: Only Debian and RedHat families have an init script currently.
 
 ### Configure a program
@@ -61,23 +67,61 @@ supervisord::program { 'myprogram':
 }
 ```
 
+Or you can fully define your programs in hiera:
+
+```yaml
+supervisord::programs:
+  'myprogram':
+    command: 'command --args'
+    autostart: yes
+    autorestart: 'true'
+    environment:
+      HOME: '/home/myuser'
+      PATH: '/bin:/sbin:/usr/bin:/usr/sbin'
+      SECRET: 'mysecret'
+```
+
 ### Configure a group
 
 ```ruby
 supervisord::group { 'mygroup':
   priority => 100,
-  program  => ['program1', 'program2', 'program3']
+  programs  => ['program1', 'program2', 'program3']
+}
+```
+
+### Configure an eventlistener
+
+```ruby
+supervisord::eventlistener { 'mylistener':
+  command  => 'command --args',
+  events   => ['PROCESS_STATE', 'PROCESS_STATE_START']
+  priority => '100',
+  env_var  => 'my_common_envs'
+}
+```
+
+### Run supervisorctl Commands
+
+Should you need to run a sequence of command with `supervisorctl` you can use the define type `supervisord::supervisorctl`
+
+```ruby
+supervisord::supervisorctl { 'restart_myapp':
+  command => 'restart',
+  process => 'myapp'
 }
 ```
 
+You can also issue a command without specifying a process.
+
 ### Development
 
 If you have suggestions or improvements please file an issue or pull request, i'll try and sort them as quickly as possble.
 
-If you submit a pull please try and include tests for the new functionality. The module is tested with [Travis-CI](https://travis-ci.org/ajcrowe/puppet-supervisord).
+If you submit a pull please try and include tests for the new functionality/fix. The module is tested with [Travis-CI](https://travis-ci.org/ajcrowe/puppet-supervisord).
 
 
 ### Credits
 
 * Debian init script sourced from the system package.
-* RedHat/Centos init script sourced from https://github.com/Supervisor/initscripts 
+* RedHat/Centos init script sourced from https://github.com/Supervisor/initscripts
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/Rakefile b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/Rakefile
index e00f7d11877dbd4ea875de657788f846f255ae6f..cd592af48f4132703ada25389cf9c6f2ae446267 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/Rakefile
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/Rakefile
@@ -1,7 +1,28 @@
 require 'puppetlabs_spec_helper/rake_tasks'
 require 'puppet-lint/tasks/puppet-lint'
-require 'rspec-system/rake_task'
+require 'puppet-syntax/tasks/puppet-syntax'
 
 PuppetLint.configuration.send('disable_80chars')
 PuppetLint.configuration.send('disable_class_inherits_from_params_class')
-PuppetLint.configuration.send('disable_documentation')
+PuppetLint.configuration.send('disable_quoted_booleans')
+PuppetLint.configuration.send('disable_autoloader_layout')
+
+exclude_paths = [
+  "pkg/**/*",
+  "vendor/**/*",
+  "spec/**/*",
+]
+PuppetLint.configuration.ignore_paths = exclude_paths
+PuppetSyntax.exclude_paths = exclude_paths
+
+desc "Acceptance Tests"
+RSpec::Core::RakeTask.new(:acceptance) do |t|
+  t.pattern = 'spec/acceptance'
+end
+
+desc "Test Suite"
+task :test => [
+  :lint,
+  :syntax,
+  :spec
+]
\ No newline at end of file
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/lib/puppet/parser/functions/array2csv.rb b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/lib/puppet/parser/functions/array2csv.rb
index cfa52b2bbf2f67050e0b5ede74535531cf47f88c..6d34d5d54744181e27447ed0a878d16cd9041b80 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/lib/puppet/parser/functions/array2csv.rb
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/lib/puppet/parser/functions/array2csv.rb
@@ -1,14 +1,12 @@
 #
 # Converts the array to a csv string
 #
-#
 # $array = [ 'string1', 'string2', 'string3' ]
 #
 # becomes:
 #
 # $string = "string1,string2,string3"
 #
-
 module Puppet::Parser::Functions
   newfunction(:array2csv, :type => :rvalue, :doc => <<-'EOS'
     Returns a sorted csv formatted string from an array in the form
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/lib/puppet/parser/functions/hash2csv.rb b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/lib/puppet/parser/functions/hash2csv.rb
index 6098b67367d1230c7ba6470722c8b35e6de6c236..5371328f2ff980627e55520cc3b87879d93dfb30 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/lib/puppet/parser/functions/hash2csv.rb
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/lib/puppet/parser/functions/hash2csv.rb
@@ -1,7 +1,6 @@
 #
 # Converts the hash to a csv string
 #
-#
 # $hash = {
 #   HOME   => '/home/user',
 #   ENV1   => 'env1',
@@ -12,7 +11,6 @@
 #
 # $string = "HOME='/home/user',ENV1='env1',SECRET='secret'"
 #
-
 module Puppet::Parser::Functions
   newfunction(:hash2csv, :type => :rvalue, :doc => <<-'EOS'
     Returns a csv formatted string from an hash in the form
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/config.pp b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/config.pp
index cc8b1ee49d00b05fcef609cb5f4de75e9c9bdd89..93713729e8b5e4a546c7a934465364edc75a17d7 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/config.pp
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/config.pp
@@ -1,6 +1,16 @@
+# Class: supervisord::config
+#
+# Configuration class for supervisor init and conf directories
+#
 class supervisord::config inherits supervisord {
 
-  file { [ "${supervisord::config_include}", "${supervisord::log_path}"]:
+  file { $supervisord::config_include:
+    ensure => directory,
+    owner  => 'root',
+    mode   => '0755'
+  }
+
+  file { $supervisord::log_path:
     ensure => directory,
     owner  => 'root',
     mode   => '0755'
@@ -15,30 +25,26 @@ class supervisord::config inherits supervisord {
   }
 
   if $supervisord::install_init {
-
-    $osname = downcase($::osfamily)
-
     file { '/etc/init.d/supervisord':
       ensure  => present,
       owner   => 'root',
       mode    => '0755',
-      content => template("supervisord/init/${osname}_init.erb")
+      content => template("supervisord/init/${::osfamily}/init.erb")
     }
 
-    if $supervisord::init_extras {
-      file { $supervisord::init_extras:
+    if $supervisord::init_defaults {
+      file { $supervisord::init_defaults:
         ensure  => present,
         owner   => 'root',
         mode    => '0755',
-        content => template("supervisord/init/${osname}_extra.erb")
+        content => template("supervisord/init/${::osfamily}/defaults.erb")
       }
     }
-
   }
 
   concat { $supervisord::config_file:
     owner => 'root',
-    group => 'root',
+    group => '0',
     mode  => '0755'
   }
 
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/eventlistener.pp b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/eventlistener.pp
index 41b7cf6c7309c9d6a581df12db2038a752e18915..fd52d6e4da400c03fa348c5610bd709e04d37e47 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/eventlistener.pp
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/eventlistener.pp
@@ -1,8 +1,16 @@
+# Define: supervisord::eventlistener
+#
+# This define creates an eventlistener configuration file
+#
+# Documentation on parameters available at:
+# http://supervisord.org/configuration.html#eventlistener-x-section-settings
+#
 define supervisord::eventlistener(
   $command,
   $ensure                  = present,
+  $ensure_process          = 'running',
+  $buffer_size             = 10,
   $events                  = undef,
-  $buffer_size             = undef,
   $result_handler          = undef,
   $env_var                 = undef,
   $process_name            = undef,
@@ -15,16 +23,16 @@ define supervisord::eventlistener(
   $startretries            = undef,
   $exitcodes               = undef,
   $stopsignal              = undef,
-  $stopwaitsec             = undef,
+  $stopwaitsecs            = undef,
   $stopasgroup             = undef,
   $killasgroup             = undef,
   $user                    = undef,
   $redirect_stderr         = undef,
-  $stdout_logfile          = "${supervisord::log_path}/eventlistener_${name}.log",
+  $stdout_logfile          = "eventlistener_${name}.log",
   $stdout_logfile_maxbytes = undef,
   $stdout_logfile_backups  = undef,
   $stdout_events_enabled   = undef,
-  $stderr_logfile          = "${supervisord::log_path}/eventlistener_${name}.error",
+  $stderr_logfile          = "eventlistener_${name}.error",
   $stderr_logfile_maxbytes = undef,
   $stderr_logfile_backups  = undef,
   $stderr_events_enabled   = undef,
@@ -36,11 +44,45 @@ define supervisord::eventlistener(
 
   include supervisord
 
+  # parameter validation
+  validate_string($command)
+  validate_re($ensure_process, ['running', 'stopped', 'removed'])
+  validate_re($buffer_size, '^\d+')
+  if $events { validate_array($events) }
+  if $result_handler { validate_string($result_handler) }
+  if $numprocs { validate_re($numprocs, '^\d+')}
+  if $numprocs_start { validate_re($numprocs_start, '^\d+')}
+  if $priority { validate_re($priority, '^\d+') }
+  if $autostart { validate_bool($autostart) }
+  if $autorestart { validate_re($autorestart, ['true', 'false', 'unexpected']) }
+  if $startsecs { validate_re($startsecs, '^\d+')}
+  if $startretries { validate_re($startretries, '^\d+')}
+  if $exitcodes { validate_string($exitcodes)}
+  if $stopsignal { validate_re($stopsignal, ['TERM', 'HUP', 'INT', 'QUIT', 'KILL', 'USR1', 'USR2']) }
+  if $stopwaitsecs { validate_re($stopwaitsecs, '^\d+')}
+  if $stopasgroup { validate_bool($stopasgroup) }
+  if $killasgroup { validate_bool($killasgroup) }
+  if $user { validate_string($user) }
+  if $redirect_stderr { validate_bool($redirect_stderr) }
+  validate_string($stdout_logfile)
+  if $stdout_logfile_maxbytes { validate_string($stdout_logfile_maxbytes) }
+  if $stdout_logfile_backups { validate_re($stdout_logfile_backups, '^\d+')}
+  if $stdout_events_enabled { validate_bool($stdout_events_enabled) }
+  validate_string($stderr_logfile)
+  if $stderr_logfile_maxbytes { validate_string($stderr_logfile_maxbytes) }
+  if $stderr_logfile_backups { validate_re($stderr_logfile_backups, '^\d+')}
+  if $stderr_events_enabled { validate_bool($stderr_events_enabled) }
+  if $directory { validate_absolute_path($directory) }
+  if $umask { validate_re($umask, '^[0-7][0-7][0-7]$') }
+
+  # convert environment data into a csv
   if $env_var {
-    $env_hash = hiera($env_var)
+    $env_hash = hiera_hash($env_var)
+    validate_hash($env_hash)
     $env_string = hash2csv($env_hash)
   }
   elsif $environment {
+    validate_hash($environment)
     $env_string = hash2csv($environment)
   }
 
@@ -55,6 +97,22 @@ define supervisord::eventlistener(
     owner   => 'root',
     mode    => '0755',
     content => template('supervisord/conf/eventlistener.erb'),
-    notify  => Class['supervisord::service']
+    notify  => Class['supervisord::reload']
+  }
+
+  case $ensure_process {
+    'stopped': {
+      supervisord::supervisorctl { "stop_${name}":
+        command => 'stop',
+        process => $name
+      }
+    }
+    'removed': {
+      supervisord::supervisorctl { "remove_${name}":
+        command => 'remove',
+        process => $name
+      }
+    }
+    default: { }
   }
 }
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/fcgi_program.pp b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/fcgi_program.pp
index 923b1798bffcc23d65b5d0d2258fc38b226297f1..633b024917ecb6ae2d5eb132ba8cdc6b5e8a5be6 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/fcgi_program.pp
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/fcgi_program.pp
@@ -1,7 +1,15 @@
+# Define: supervisord::fcgi_program
+#
+# This define creates an eventlistener configuration file
+#
+# Documentation on parameters available at:
+# http://supervisord.org/configuration.html#fcgi-program-x-section-settings
+#
 define supervisord::fcgi_program(
   $command,
   $socket,
   $ensure                  = present,
+  $ensure_process          = 'running',
   $socket_owner            = undef,
   $socket_mode             = undef,
   $env_var                 = undef,
@@ -15,17 +23,17 @@ define supervisord::fcgi_program(
   $startretries            = undef,
   $exitcodes               = undef,
   $stopsignal              = undef,
-  $stopwaitsec             = undef,
+  $stopwaitsecs            = undef,
   $stopasgroup             = undef,
   $killasgroup             = undef,
   $user                    = undef,
   $redirect_stderr         = undef,
-  $stdout_logfile          = "${supervisord::log_path}/fcgi-program_${name}.log",
+  $stdout_logfile          = "fcgi-program_${name}.log",
   $stdout_logfile_maxbytes = undef,
   $stdout_logfile_backups  = undef,
   $stdout_capture_maxbytes = undef,
   $stdout_events_enabled   = undef,
-  $stderr_logfile          = "${supervisord::log_path}/fcgi-program_${name}.error",
+  $stderr_logfile          = "fcgi-program_${name}.error",
   $stderr_logfile_maxbytes = undef,
   $stderr_logfile_backups  = undef,
   $stderr_capture_maxbytes = undef,
@@ -38,11 +46,46 @@ define supervisord::fcgi_program(
 
   include supervisord
 
+  # parameter validation
+  validate_string($command)
+  validate_re($ensure_process, ['running', 'stopped', 'removed'])
+  validate_re($socket, ['^tcp:\/\/.*:\d+$', '^unix:\/\/\/'])
+  if $process_name { validate_string($process_name) }
+  if $numprocs { validate_re($numprocs, '^\d+')}
+  if $numprocs_start { validate_re($numprocs_start, '^\d+')}
+  if $priority { validate_re($priority, '^\d+') }
+  if $autostart { validate_bool($autostart) }
+  if $autorestart { validate_re($autorestart, ['true', 'false', 'unexpected']) }
+  if $startsecs { validate_re($startsecs, '^\d+')}
+  if $startretries { validate_re($startretries, '^\d+')}
+  if $exitcodes { validate_string($exitcodes)}
+  if $stopsignal { validate_re($stopsignal, ['TERM', 'HUP', 'INT', 'QUIT', 'KILL', 'USR1', 'USR2']) }
+  if $stopwaitsecs { validate_re($stopwaitsecs, '^\d+')}
+  if $stopasgroup { validate_bool($stopasgroup) }
+  if $killasgroup { validate_bool($killasgroup) }
+  if $user { validate_string($user) }
+  if $redirect_stderr { validate_bool($redirect_stderr) }
+  validate_string($stdout_logfile)
+  if $stdout_logfile_maxbytes { validate_string($stdout_logfile_maxbytes) }
+  if $stdout_logfile_backups { validate_re($stdout_logfile_backups, '^\d+')}
+  if $stdout_capture_maxbytes { validate_string($stdout_capture_maxbytes) }
+  if $stdout_events_enabled { validate_bool($stdout_events_enabled) }
+  validate_string($stderr_logfile)
+  if $stderr_logfile_maxbytes { validate_string($stderr_logfile_maxbytes) }
+  if $stderr_logfile_backups { validate_re($stderr_logfile_backups, '^\d+')}
+  if $stderr_capture_maxbytes { validate_string($stderr_capture_maxbytes) }
+  if $stderr_events_enabled { validate_bool($stderr_events_enabled) }
+  if $directory { validate_absolute_path($directory) }
+  if $umask { validate_re($umask, '^[0-7][0-7][0-7]$') }
+
+  # convert environment data into a csv
   if $env_var {
-    $env_hash = hiera($env_var)
+    $env_hash = hiera_hash($env_var)
+    validate_hash($env_hash)
     $env_string = hash2csv($env_hash)
   }
   elsif $environment {
+    validate_hash($environment)
     $env_string = hash2csv($environment)
   }
 
@@ -53,6 +96,22 @@ define supervisord::fcgi_program(
     owner   => 'root',
     mode    => '0755',
     content => template('supervisord/conf/fcgi_program.erb'),
-    notify  => Class['supervisord::service']
+    notify  => Class['supervisord::reload']
+  }
+
+  case $ensure_process {
+    'stopped': {
+      supervisord::supervisorctl { "stop_${name}":
+        command => 'stop',
+        process => $name
+      }
+    }
+    'removed': {
+      supervisord::supervisorctl { "remove_${name}":
+        command => 'remove',
+        process => $name
+      }
+    }
+    default: { }
   }
 }
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/group.pp b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/group.pp
index 0f6b1ca2adc7618efc3c2fe33aeddf55efb06b7b..45cb29cf29000c7d4f67d55b85c989b21955351a 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/group.pp
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/group.pp
@@ -1,3 +1,10 @@
+# Define: supervisord::group
+#
+# This define creates an group configuration file
+#
+# Documentation on parameters available at:
+# http://supervisord.org/configuration.html#group-x-section-settings
+#
 define supervisord::group (
   $programs,
   $ensure   = present,
@@ -6,6 +13,10 @@ define supervisord::group (
 
   include supervisord
 
+  # parameter validation
+  validate_array($programs)
+  if $priority { validate_re($priority, '^\d+', "invalid priority value of: ${priority}") }
+
   $progstring = array2csv($programs)
   $conf = "${supervisord::config_include}/group_${name}.conf"
 
@@ -13,6 +24,7 @@ define supervisord::group (
     ensure  => $ensure,
     owner   => 'root',
     mode    => '0755',
-    content => template('supervisord/conf/group.erb')
+    content => template('supervisord/conf/group.erb'),
+    notify  => Class['supervisord::reload']
   }
 }
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/init.pp b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/init.pp
index 801c46b3b368542da671454dfed9bc8bc33cf73f..1d2d55148d9ec11d30bf6e1e9d4ef9747bf8690f 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/init.pp
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/init.pp
@@ -1,12 +1,18 @@
-# This class installs supervisord and configured it to run on boot
+# Class: supervisord
+#
+# This class installs supervisord via pip
+#
 class supervisord(
   $package_ensure       = $supervisord::params::package_ensure,
+  $package_provider     = $supervisord::params::package_provider,
   $service_ensure       = $supervisord::params::service_ensure,
+  $service_name         = $supervisord::params::service_name,
   $install_init         = $supervisord::params::install_init,
   $install_pip          = false,
-  $init_extras          = $supervisord::params::init_extras,
+  $init_defaults        = $supervisord::params::init_defaults,
   $setuptools_url       = $supervisord::params::setuptools_url,
   $executable           = $supervisord::params::executable,
+  $executable_ctl       = $supervisord::params::executable_ctl,
 
   $log_path             = $supervisord::params::log_path,
   $log_file             = $supervisord::params::log_file,
@@ -19,20 +25,20 @@ class supervisord(
   $nodaemon             = $supervisord::params::nodaemon,
   $minfds               = $supervisord::params::minfds,
   $minprocs             = $supervisord::params::minprocs,
-  $config_path          = $supervisord::params::config_path,
   $config_include       = $supervisord::params::config_include,
   $config_file          = $supervisord::params::config_file,
+  $config_dirs          = undef,
   $umask                = $supervisord::params::umask,
 
   $unix_socket          = $supervisord::params::unix_socket,
   $unix_socket_file     = $supervisord::params::unix_socket_file,
   $unix_socket_mode     = $supervisord::params::unix_socket_mode,
   $unix_socket_owner    = $supervisord::params::unix_socket_owner,
-  $unix_scoket_group    = $supervisord::params::unix_socket_group,
+  $unix_socket_group    = $supervisord::params::unix_socket_group,
 
   $inet_server          = $supervisord::params::inet_server,
-  $inet_server_hostname = $supervisord::params::inet_hostname,
-  $inet_server_port     = $supervisord::params::inet_port,
+  $inet_server_hostname = $supervisord::params::inet_server_hostname,
+  $inet_server_port     = $supervisord::params::inet_server_port,
 
   $unix_auth            = false,
   $unix_username        = undef,
@@ -47,26 +53,76 @@ class supervisord(
   $childlogdir          = undef,
   $environment          = undef,
   $env_var              = undef,
+  $directory            = undef,
   $strip_ansi           = false,
-  $nocleanup            = false
+  $nocleanup            = false,
+
+  $eventlisteners       = {},
+  $fcgi_programs        = {},
+  $groups               = {},
+  $programs             = {}
 
 ) inherits supervisord::params {
 
+  validate_bool($install_pip)
+  validate_bool($install_init)
+  validate_bool($nodaemon)
+  validate_bool($unix_auth)
+  validate_bool($inet_auth)
+  validate_bool($strip_ansi)
+  validate_bool($nocleanup)
+
+  validate_hash($eventlisteners)
+  validate_hash($fcgi_programs)
+  validate_hash($groups)
+  validate_hash($programs)
+
+  validate_absolute_path($config_include)
+  validate_absolute_path($log_path)
+  validate_absolute_path($run_path)
+  if $childlogdir { validate_absolute_path($childlogdir) }
+  if $directory { validate_absolute_path($directory) }
+
+  $log_levels = ['^critical$', '^error$', '^warn$', '^info$', '^debug$', '^trace$', '^blather$']
+  validate_re($log_level, $log_levels, "invalid log_level: ${log_level}")
+  validate_re($umask, '^0[0-7][0-7]$', "invalid umask: ${umask}.")
+  validate_re($unix_socket_mode, '^[0-7][0-7][0-7][0-7]$', "invalid unix_socket_mode: ${unix_socket_mode}")
+
+  if ! is_integer($logfile_backups) { fail("invalid logfile_backups: ${logfile_backups}.")}
+  if ! is_integer($minfds) { fail("invalid minfds: ${minfds}.")}
+  if ! is_integer($minprocs) { fail("invalid minprocs: ${minprocs}.")}
+  if ! is_integer($inet_server_port) { fail("invalid inet_server_port: ${inet_server_port}.")}
+
   if $env_var {
+    validate_hash($env_var)
     $env_hash = hiera($env_var)
     $env_string = hash2csv($env_hash)
   }
   elsif $environment {
+    validate_hash($environment)
     $env_string = hash2csv($environment)
   }
 
+  if $config_dirs {
+    validate_array($config_dirs)
+    $config_include_string = join($config_dirs, " ")
+  }
+  else {
+    $config_include_string = "${config_include}/*.conf"
+  }
+
+  create_resources('supervisord::eventlistener', $eventlisteners)
+  create_resources('supervisord::fcgi_program', $fcgi_programs)
+  create_resources('supervisord::group', $groups)
+  create_resources('supervisord::program', $programs)
+
   if $install_pip {
     include supervisord::pip
     Class['supervisord::pip'] -> Class['supervisord::install']
   }
 
-  include supervisord::install, supervisord::config, supervisord::service
+  include supervisord::install, supervisord::config, supervisord::service, supervisord::reload
 
   Class['supervisord::install'] -> Class['supervisord::config'] ~> Class['supervisord::service']
-
+  Class['supervisord::reload'] -> Supervisord::Supervisorctl <| |>
 }
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/install.pp b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/install.pp
index 1d36ec68334453389ce403f9efc8be723f6a1629..31a63f3b59ea2aaf9734f90da97ed1e018f91954 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/install.pp
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/install.pp
@@ -1,6 +1,10 @@
+# Class supervisord::install
+#
+# Installs supervisor package (defaults to using pip)
+#
 class supervisord::install inherits supervisord {
   package { 'supervisor':
     ensure   => $supervisord::package_ensure,
-    provider => 'pip'
+    provider => $supervisord::package_provider
   }
 }
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/params.pp b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/params.pp
index 87d17d16179d77661326a958df3f31d25ba32414..f9d82e5804b0e0fbc5ab46b0d320eb1f5f36edea 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/params.pp
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/params.pp
@@ -1,13 +1,21 @@
+# Class: supervisord::params
+#
+# Default parameters for supervisord
+#
 class supervisord::params {
+  # default supervisord params
   $package_ensure       = 'installed'
+  $package_provider     = 'pip'
   $service_ensure       = 'running'
+  $service_name         = 'supervisord'
   $package_name         = 'supervisor'
-  $executable           = '/usr/local/bin/supervisord'
+  $executable           = 'supervisord'
+  $executable_ctl       = 'supervisorctl'
 
   $run_path             = '/var/run'
-  $pid_file             = "${run_path}/supervisord.pid"
+  $pid_file             = 'supervisord.pid'
   $log_path             = '/var/log/supervisor'
-  $log_file             = "${log_path}/supervisord.log"
+  $log_file             = 'supervisord.log'
   $logfile_maxbytes     = '50MB'
   $logfile_backups      = '10'
   $log_level            = 'info'
@@ -20,7 +28,7 @@ class supervisord::params {
   $setuptools_url       = 'https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py'
 
   $unix_socket          = true
-  $unix_socket_file     = "${run_path}/supervisor.sock"
+  $unix_socket_file     = 'supervisor.sock'
   $unix_socket_mode     = '0700'
   $unix_socket_owner    = 'nobody'
 
@@ -31,17 +39,17 @@ class supervisord::params {
 
   case $::osfamily {
     'RedHat': {
-      $init_extras       = '/etc/sysconfig/supervisord'
+      $init_defaults     = '/etc/sysconfig/supervisord'
       $unix_socket_group = 'nobody'
       $install_init      = true
     }
     'Debian': {
-      $init_extras       = '/etc/default/supervisor'
+      $init_defaults     = '/etc/default/supervisor'
       $unix_socket_group = 'nogroup'
       $install_init      = true
     }
     default:  {
-      $init_extras       = false
+      $init_defaults     = false
       $unix_socket_group = 'nogroup'
       $install_init      = false
     }
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/pip.pp b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/pip.pp
index c05f2d7f64bee111bfeb28fc68b558d1e3d73bf1..71dd3653da3ccc6f87c51429b7ae28aae2afd355 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/pip.pp
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/pip.pp
@@ -1,8 +1,10 @@
+# Class: supervisord::pip
+#
+# Optional class to install setuptool and pip
+#
 class supervisord::pip inherits supervisord {
 
-  Exec {
-    path => '/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin'
-  }
+  Exec { path => [ '/usr/bin/', '/usr/local/bin', '/bin', '/usr/local/sbin', '/usr/sbin', '/sbin' ] }
 
   exec { 'install_setuptools':
     command => "curl ${supervisord::setuptools_url} | python",
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/program.pp b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/program.pp
index 8a00d41c77cae0bd8e1b499f3c6a5cec9ccf78a9..617a68ab208dc38ad3612566bc5d8a062168e510 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/program.pp
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/program.pp
@@ -1,6 +1,14 @@
+# Define: supervisord::program
+#
+# This define creates an program configuration file
+#
+# Documentation on parameters available at:
+# http://supervisord.org/configuration.html#program-x-section-settings
+#
 define supervisord::program(
   $command,
   $ensure                  = present,
+  $ensure_process          = 'running',
   $env_var                 = undef,
   $process_name            = undef,
   $numprocs                = undef,
@@ -12,17 +20,17 @@ define supervisord::program(
   $startretries            = undef,
   $exitcodes               = undef,
   $stopsignal              = undef,
-  $stopwaitsec             = undef,
+  $stopwaitsecs            = undef,
   $stopasgroup             = undef,
   $killasgroup             = undef,
   $user                    = undef,
   $redirect_stderr         = undef,
-  $stdout_logfile          = "${supervisord::log_path}/program_${name}.log",
+  $stdout_logfile          = "program_${name}.log",
   $stdout_logfile_maxbytes = undef,
   $stdout_logfile_backups  = undef,
   $stdout_capture_maxbytes = undef,
   $stdout_events_enabled   = undef,
-  $stderr_logfile          = "${supervisord::log_path}/program_${name}.error",
+  $stderr_logfile          = "program_${name}.error",
   $stderr_logfile_maxbytes = undef,
   $stderr_logfile_backups  = undef,
   $stderr_capture_maxbytes = undef,
@@ -35,11 +43,45 @@ define supervisord::program(
 
   include supervisord
 
+  # parameter validation
+  validate_string($command)
+  validate_re($ensure_process, ['running', 'stopped', 'removed'])
+  if $process_name { validate_string($process_name) }
+  if $numprocs { validate_re($numprocs, '^\d+')}
+  if $numprocs_start { validate_re($numprocs_start, '^\d+')}
+  if $priority { validate_re($priority, '^\d+') }
+  if $autostart { validate_bool($autostart) }
+  if $autorestart { validate_re($autorestart, ['true', 'false', 'unexpected']) }
+  if $startsecs { validate_re($startsecs, '^\d+')}
+  if $startretries { validate_re($startretries, '^\d+')}
+  if $exitcodes { validate_string($exitcodes)}
+  if $stopsignal { validate_re($stopsignal, ['TERM', 'HUP', 'INT', 'QUIT', 'KILL', 'USR1', 'USR2']) }
+  if $stopwaitsecs { validate_re($stopwaitsecs, '^\d+')}
+  if $stopasgroup { validate_bool($stopasgroup) }
+  if $killasgroup { validate_bool($killasgroup) }
+  if $user { validate_string($user) }
+  if $redirect_stderr { validate_bool($redirect_stderr) }
+  validate_string($stdout_logfile)
+  if $stdout_logfile_maxbytes { validate_string($stdout_logfile_maxbytes) }
+  if $stdout_logfile_backups { validate_re($stdout_logfile_backups, '^\d+')}
+  if $stdout_capture_maxbytes { validate_string($stdout_capture_maxbytes) }
+  if $stdout_events_enabled { validate_bool($stdout_events_enabled) }
+  validate_string($stderr_logfile)
+  if $stderr_logfile_maxbytes { validate_string($stderr_logfile_maxbytes) }
+  if $stderr_logfile_backups { validate_re($stderr_logfile_backups, '^\d+')}
+  if $stderr_capture_maxbytes { validate_string($stderr_capture_maxbytes) }
+  if $stderr_events_enabled { validate_bool($stderr_events_enabled) }
+  if $directory { validate_absolute_path($directory) }
+  if $umask { validate_re($umask, '^[0-7][0-7][0-7]$') }
+
+  # convert environment data into a csv
   if $env_var {
-    $env_hash = hiera($env_var)
+    $env_hash = hiera_hash($env_var)
+    validate_hash($env_hash)
     $env_string = hash2csv($env_hash)
   }
   elsif $environment {
+    validate_hash($environment)
     $env_string = hash2csv($environment)
   }
 
@@ -50,6 +92,22 @@ define supervisord::program(
     owner   => 'root',
     mode    => '0755',
     content => template('supervisord/conf/program.erb'),
-    notify  => Class['supervisord::service']
+    notify  => Class['supervisord::reload']
+  }
+
+  case $ensure_process {
+    'stopped': {
+      supervisord::supervisorctl { "stop_${name}":
+        command => 'stop',
+        process => $name
+      }
+    }
+    'removed': {
+      supervisord::supervisorctl { "remove_${name}":
+        command => 'remove',
+        process => $name
+      }
+    }
+    default: { }
   }
 }
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/reload.pp b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/reload.pp
new file mode 100644
index 0000000000000000000000000000000000000000..e5a4637e43080bee7bb6abc04f9a25b92555337e
--- /dev/null
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/reload.pp
@@ -0,0 +1,21 @@
+# Class: supervisord::reload
+#
+# Class to reread and update supervisord with supervisorctl
+#
+class supervisord::reload {
+
+  Exec { path => [ '/usr/bin/', '/usr/local/bin' ] }
+
+  $supervisorctl = $::supervisord::executable_ctl
+
+  exec { 'supervisorctl_reread':
+    command     => "${supervisorctl} reread",
+    refreshonly => true,
+    returns     => [0, 2],
+  }
+  exec { 'supervisorctl_update':
+    command     => "${supervisorctl} update",
+    refreshonly => true,
+    returns     => [0, 2],
+  }
+}
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/service.pp b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/service.pp
index 6e17976165de991d0ac8e2e63e3278aa3bfce9fc..f02a0d0a081000fd78bc70df2c0d4390df6cbf7f 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/service.pp
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/service.pp
@@ -1,5 +1,9 @@
+# Class: supervisord::service
+#
+# Class for the supervisord service
+#
 class supervisord::service inherits supervisord  {
-  service { 'supervisord':
+  service { $supervisord::service_name:
     ensure     => $supervisord::service_ensure,
     enable     => true,
     hasrestart => true,
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/supervisorctl.pp b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/supervisorctl.pp
new file mode 100644
index 0000000000000000000000000000000000000000..ec4dbed93379a12da93fb33e65e0dd3d20f1bca4
--- /dev/null
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/manifests/supervisorctl.pp
@@ -0,0 +1,29 @@
+# Define: supervisord:supervisorctl
+#
+# This define executes command with the supervisorctl tool
+#
+define supervisord::supervisorctl(
+  $command,
+  $process       = undef,
+  $refreshonly   = false
+) {
+
+  Exec { path => [ '/usr/bin/', '/usr/local/bin' ] }
+
+  validate_string($command)
+  validate_string($process)
+
+  $supervisorctl = $::supervisord::executable_ctl
+
+  if $process {
+    $cmd = join([$supervisorctl, $command, $process], ' ')
+  }
+  else {
+    $cmd = join([$supervisorctl, $command])
+  }
+
+  exec { "supervisorctl_command_${name}":
+    command     => $cmd,
+    refreshonly => $refreshonly
+  }
+}
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/acceptance/nodesets/centos-65-i386.yml b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/acceptance/nodesets/centos-65-i386.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f8d4013a31bc2d413df8502f54c0128518894c6c
--- /dev/null
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/acceptance/nodesets/centos-65-i386.yml
@@ -0,0 +1,10 @@
+HOSTS:
+  centos-65-i386:
+    roles:
+      - master
+    platform: el-6-i386
+    box : centos-65-i386-virtualbox-nocm
+    box_url : http://puppet-vagrant-boxes.puppetlabs.com/centos-65-i386-virtualbox-nocm.box
+    hypervisor : vagrant
+CONFIG:
+  type: foss
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/acceptance/nodesets/centos-65-x64.yml b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/acceptance/nodesets/centos-65-x64.yml
new file mode 100644
index 0000000000000000000000000000000000000000..7535c104afb301fcb0b247e3e04fe1fcf7fc1682
--- /dev/null
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/acceptance/nodesets/centos-65-x64.yml
@@ -0,0 +1,10 @@
+HOSTS:
+  centos-65-x64:
+    roles:
+      - master
+    platform: el-6-x86_64
+    box : centos-65-x64-virtualbox-nocm
+    box_url : http://puppet-vagrant-boxes.puppetlabs.com/centos-65-x64-virtualbox-nocm.box
+    hypervisor : vagrant
+CONFIG:
+  type: foss
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/acceptance/nodesets/debian-73-i386.yml b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/acceptance/nodesets/debian-73-i386.yml
new file mode 100644
index 0000000000000000000000000000000000000000..d1233aa83d1b8ff5e0e1951307db96ca23e7762e
--- /dev/null
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/acceptance/nodesets/debian-73-i386.yml
@@ -0,0 +1,10 @@
+HOSTS:
+  debian-73-i386:
+    roles:
+      - master
+    platform: debian-7-i386
+    box : debian-73-i386-virtualbox-nocm
+    box_url : http://puppet-vagrant-boxes.puppetlabs.com/debian-73-i386-virtualbox-nocm.box
+    hypervisor : vagrant
+CONFIG:
+  type: foss
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/acceptance/nodesets/debian-73-x64.yml b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/acceptance/nodesets/debian-73-x64.yml
new file mode 100644
index 0000000000000000000000000000000000000000..5b87870a9093a3c7f5abdabe39ff740ef621d45d
--- /dev/null
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/acceptance/nodesets/debian-73-x64.yml
@@ -0,0 +1,10 @@
+HOSTS:
+  debian-73-x64:
+    roles:
+      - master
+    platform: debian-7-amd64
+    box : debian-73-x64-virtualbox-nocm
+    box_url : http://puppet-vagrant-boxes.puppetlabs.com/debian-73-x64-virtualbox-nocm.box
+    hypervisor : vagrant
+CONFIG:
+  type: foss
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/acceptance/nodesets/default.yml b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/acceptance/nodesets/default.yml
new file mode 100644
index 0000000000000000000000000000000000000000..5b87870a9093a3c7f5abdabe39ff740ef621d45d
--- /dev/null
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/acceptance/nodesets/default.yml
@@ -0,0 +1,10 @@
+HOSTS:
+  debian-73-x64:
+    roles:
+      - master
+    platform: debian-7-amd64
+    box : debian-73-x64-virtualbox-nocm
+    box_url : http://puppet-vagrant-boxes.puppetlabs.com/debian-73-x64-virtualbox-nocm.box
+    hypervisor : vagrant
+CONFIG:
+  type: foss
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/acceptance/supervisord_spec.rb b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/acceptance/supervisord_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..47d052a4eecb14718b7e79d510b06a98c9275f78
--- /dev/null
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/acceptance/supervisord_spec.rb
@@ -0,0 +1,114 @@
+require 'spec_helper_acceptance'
+
+describe 'supervisord install' do
+
+  context 'default parameters with pip and init install' do
+    it 'should work with no errors' do
+      pp = <<-EOS
+        class { 'supervisord': install_pip  => true, install_init => true}
+      EOS
+
+      expect(apply_manifest(pp).exit_code).to_not eq(1)
+      expect(apply_manifest(pp).exit_code).to eq(0)
+    end
+
+    describe service('supervisord') do
+      it { should be_enabled }
+      it { should be_running }
+      it 'should restart successfully' do
+        cmd="service supervisord restart"
+        expect(shell(cmd).exit_code).to_not eq(1)
+      end
+    end
+  end
+end
+
+describe 'supervisord::program' do
+  context 'create a program config' do
+    it 'should install a program file' do
+
+      pp = <<-EOS
+        include supervisord
+        supervisord::program { 'test': 
+          command => 'echo', 
+          priority => '100', 
+          environment => { 
+            'HOME' => '/root',
+            'PATH' => '/bin',
+          }
+        }
+      EOS
+
+      expect(apply_manifest(pp).exit_code).to_not eq(1)
+      expect(apply_manifest(pp).exit_code).to eq(0)
+    end
+
+    it 'should contain the correct values' do
+      cmd='grep command=echo /etc/supervisor.d/program_test.conf'
+      expect(shell(cmd).exit_code).to eq(0)
+      cmd='grep priority=100 /etc/supervisor.d/program_test.conf'
+      expect(shell(cmd).exit_code).to eq(0)
+      cmd='grep "environment=" /etc/supervisor.d/program_test.conf'
+      expect(shell(cmd).exit_code).to eq(0)
+    end
+  end
+end 
+
+describe 'supervisord::fcgi-program' do
+  context 'create fcgi-program config' do
+    it 'should install a fcgi-program file' do
+
+      pp = <<-EOS
+        include supervisord
+        supervisord::fcgi_program { 'test':
+          socket  => 'tcp://localhost:1000',
+          command => 'echo',
+          priority => '100',
+          environment => {
+            'HOME' => '/root',
+            'PATH' => '/bin',
+          }
+        }
+      EOS
+
+      expect(apply_manifest(pp).exit_code).to_not eq(1)
+      expect(apply_manifest(pp).exit_code).to eq(0)
+    end
+
+    it 'should contain the correct values' do
+      cmd='grep socket=tcp://localhost:1000 /etc/supervisor.d/fcgi-program_test.conf'
+      expect(shell(cmd).exit_code).to eq(0)
+      cmd="grep command=echo /etc/supervisor.d/fcgi-program_test.conf"
+      expect(shell(cmd).exit_code).to eq(0)
+      cmd="grep priority=100 /etc/supervisor.d/fcgi-program_test.conf"
+      expect(shell(cmd).exit_code).to eq(0)
+      cmd='grep "environment=" /etc/supervisor.d/fcgi-program_test.conf'
+      expect(shell(cmd).exit_code).to eq(0)
+    end
+  end
+end
+
+describe 'supervisord::group' do
+  context 'create group config' do
+    it 'should install a group config' do
+
+      pp = <<-EOS
+        include supervisord
+        supervisord::group { 'test':
+          programs => ['test'],
+          priority => '100',
+        }
+      EOS
+
+      expect(apply_manifest(pp).exit_code).to_not eq(1)
+      expect(apply_manifest(pp).exit_code).to eq(0)
+    end
+
+    it 'should contain the correct values' do
+      cmd='grep "programs=test" /etc/supervisor.d/group_test.conf'
+      expect(shell(cmd).exit_code).to eq(0)
+      cmd="grep priority=100 /etc/supervisor.d/group_test.conf"
+      expect(shell(cmd).exit_code).to eq(0)
+    end
+  end
+end
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/classes/supervisord_spec.rb b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/classes/supervisord_spec.rb
index 238876c7dcd5f806cfd46a063febc338f2daa892..b845920f6feba25804d1d4736ae13021ef9aba77 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/classes/supervisord_spec.rb
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/classes/supervisord_spec.rb
@@ -3,14 +3,26 @@ require 'spec_helper'
 describe 'supervisord' do
 
   concatdir = '/var/lib/puppet/concat'
-  configfile = '/etc/supervisord.conf'
   let(:facts) {{ :concat_basedir => concatdir }}
 
   it { should contain_class('supervisord') }
   it { should contain_class('supervisord::install') }
   it { should contain_class('supervisord::config') }
   it { should contain_class('supervisord::service') }
-  it { should contain_concat__fragment('supervisord_main').with_content(/logfile/) }
+  it { should contain_class('supervisord::params') }
+  it { should contain_class('supervisord::reload') }
+  it { should contain_package('supervisor') }
+
+  describe '#service_name' do
+    context 'default' do
+      it { should contain_service('supervisord') }
+    end
+
+    context 'specified' do
+      let(:params) {{ :service_name => 'myservicename' }}
+      it { should contain_service('myservicename') }
+    end
+  end
 
   describe '#install_pip' do
     context 'default' do
@@ -18,8 +30,16 @@ describe 'supervisord' do
     end
 
     context 'true' do
-      let (:params) {{ :install_pip => true }}
+      let(:params) {{ :install_pip => true }}
       it { should contain_class('supervisord::pip') }
+      it { should contain_exec('install_setuptools') }
+      it { should contain_exec('install_pip') }
+    end
+
+    context 'true and RedHat' do
+      let(:params) {{ :install_pip => true }}
+      let(:facts) {{ :osfamily => 'RedHat', :concat_basedir => concatdir }}
+      it { should contain_exec('pip_provider_name_fix') }
     end
   end
 
@@ -28,11 +48,6 @@ describe 'supervisord' do
       it { should contain_class('supervisord').without_env_hash }
       it { should contain_class('supervisord').without_env_string }
     end
-    #context 'is specified' do
-    #  let(:params) {{ :env_var => 'foovars' }}
-    #  let(:hiera_data) {{ :foovars => { 'key1' => 'value1', 'key2' => 'value2' } }}
-    #  it { should contain_concat__fragment('supervisord_main').with_content(/environment=key1='value1',key2='value2'/) }
-    #end
   end
 
   describe '#environment' do
@@ -41,7 +56,8 @@ describe 'supervisord' do
     end
     context 'is specified' do
       let(:params) {{ :environment => { 'key1' => 'value1', 'key2' => 'value2' } }}
-      it { should contain_concat__fragment('supervisord_main').with_content(/environment=key1='value1',key2='value2'/) }
+      it { should contain_concat__fragment('supervisord_main')\
+        .with_content(/environment=key1='value1',key2='value2'/) }
     end
   end
 
@@ -54,17 +70,20 @@ describe 'supervisord' do
       it { should_not contain_file('/etc/init.d/supervisord') }
     end
 
-    describe 'on supported OS'
+    describe 'on supported OS' do
       context 'with Debian' do
         let(:facts) {{ :osfamily => 'Debian', :concat_basedir => concatdir }}
         it { should contain_file('/etc/init.d/supervisord') }
+        it { should contain_file('/etc/default/supervisor') }
       end
 
       context 'with RedHat' do
         let(:facts) {{ :osfamily => 'RedHat', :concat_basedir => concatdir }}
         it { should contain_file('/etc/init.d/supervisord') }
+        it { should contain_file('/etc/sysconfig/supervisord') }
       end
     end
+  end
       
   describe '#unix_socket' do
     context 'default' do
@@ -89,10 +108,192 @@ describe 'supervisord' do
   describe '#run_path' do
     context 'default' do
       it { should_not contain_file('/var/run') }
+      it { should contain_concat__fragment('supervisord_main') \
+        .with_content(/pidfile=\/var\/run\/supervisord.pid$/) }
+    end
+    context 'is specified' do
+      let(:params) {{ :run_path => '/opt/supervisord/run' }}
+      it { should contain_file('/opt/supervisord/run') }
+      it { should contain_concat__fragment('supervisord_main') \
+        .with_content(/pidfile=\/opt\/supervisord\/run\/supervisord.pid$/) }
+    end
+  end
+
+  describe '#log_path' do
+    context 'default' do
+      it { should contain_file('/var/log/supervisor') }
+      it { should contain_concat__fragment('supervisord_main') \
+        .with_content(/logfile=\/var\/log\/supervisor\/supervisord.log$/) }
+    end
+    context 'is specified' do
+      let(:params) {{ :log_path => '/opt/supervisord/logs' }}
+      it { should contain_file('/opt/supervisord/logs')}
+      it { should contain_concat__fragment('supervisord_main') \
+        .with_content(/logfile=\/opt\/supervisord\/logs\/supervisord.log$/) }
+    end
+  end
+
+  describe '#config_include' do
+    context 'default' do
+      it { should contain_file('/etc/supervisor.d') }
+      it { should contain_concat__fragment('supervisord_main') \
+        .with_content(/files=\/etc\/supervisor.d\/\*.conf$/) }
+    end
+    context 'is specified' do
+      let(:params) {{ :config_include => '/opt/supervisord/conf.d' }}
+      it { should contain_file('/opt/supervisord/conf.d') }
+      it { should contain_concat__fragment('supervisord_main') \
+        .with_content(/files=\/opt\/supervisord\/conf.d\/\*.conf$/) }
+    end
+  end
+
+  describe '#config_dirs' do
+    context 'is specified' do
+      let(:params) {{ :config_dirs => ['/etc/supervisor.d/*.conf', '/opt/supervisor.d/*', '/usr/share/supervisor.d/*.config'] }}
+      it { should contain_concat__fragment('supervisord_main') \
+        .with_content(/files=\/etc\/supervisor.d\/\*.conf \/opt\/supervisor.d\/\* \/usr\/share\/supervisor.d\/\*.config$/) }
+    end
+  end
+
+  describe '#config_file' do
+    context 'default' do
+      it { should contain_file('/etc/supervisord.conf') }
+    end
+    context 'is specified' do
+      let(:params) {{ :config_file => '/opt/supervisord/supervisor.conf' }}
+      it { should contain_file('/opt/supervisord/supervisor.conf') }
+    end
+  end
+
+  describe '#nodaemon' do
+    context 'default' do
+      it { should contain_concat__fragment('supervisord_main') \
+        .with_content(/nodaemon=false$/) }
+    end
+    context 'true' do
+      let(:params) {{ :nodaemon => true }}
+      it { should contain_concat__fragment('supervisord_main') \
+        .with_content(/nodaemon=true$/) }
+    end
+    context 'invalid' do
+      let(:params) {{ :nodaemon => 'invalid' }}
+      it { expect { raise_error(Puppet::Error, /is not a boolean/) }}
+    end
+  end
+
+  describe '#minfds' do
+    context 'default' do
+      it { should contain_concat__fragment('supervisord_main') \
+        .with_content(/minfds=1024$/) }
+    end
+    context 'specified' do
+      let(:params) {{ :minfds => 2048 }}
+      it { should contain_concat__fragment('supervisord_main') \
+        .with_content(/minfds=2048$/) }
+    end
+    context 'invalid' do
+      let(:params) {{ :minfds => 'string' }}
+      it { expect { raise_error(Puppet::Error, /invalid minfds/) }}
+    end
+  end
+
+  describe '#minprocs' do
+    context 'default' do
+      it { should contain_concat__fragment('supervisord_main') \
+        .with_content(/minprocs=200$/) }
+    end
+    context 'specified' do
+      let(:params) {{ :minprocs => 300 }}
+      it { should contain_concat__fragment('supervisord_main') \
+        .with_content(/minprocs=300$/) }
+    end
+    context 'invalid' do
+      let(:params) {{ :minfds => 'string' }}
+      it { expect { raise_error(Puppet::Error, /invalid minprocs/) }}
+    end
+  end
+
+  describe '#strip_ansi' do
+    context 'default' do
+      it { should_not contain_concat__fragment('supervisord_main') \
+        .with_content(/strip_ansi$/) }
+    end
+    context 'true' do
+      let(:params) {{ :strip_ansi => true }}
+      it { should contain_concat__fragment('supervisord_main') \
+        .with_content(/strip_ansi=true$/) }
+    end
+    context 'invalid' do
+      let(:params) {{ :strip_ansi => 'string' }}
+      it { expect { raise_error(Puppet::Error, /is not a boolean/) }}
+    end
+  end
+
+  describe '#user' do
+    context 'default' do
+      it { should_not contain_concat__fragment('supervisord_main') \
+        .with_content(/user$/) }
+    end
+    context 'specified' do
+      let(:params) {{ :user => 'myuser' }}
+      it { should contain_concat__fragment('supervisord_main') \
+        .with_content(/user=myuser$/) }
+    end
+  end
+
+  describe '#identifier' do
+    context 'default' do
+      it { should_not contain_concat__fragment('supervisord_main') \
+        .with_content(/identifier$/) }
+    end
+    context 'specified' do
+      let(:params) {{ :identifier => 'myidentifier' }}
+      it { should contain_concat__fragment('supervisord_main') \
+        .with_content(/identifier=myidentifier$/) }
+    end
+  end
+
+  describe '#directory' do
+    context 'default' do
+      it { should_not contain_concat__fragment('supervisord_main') \
+        .with_content(/directory$/) }
+    end
+    context 'specified' do
+      let(:params) {{ :directory => '/opt/supervisord' }}
+      it { should contain_concat__fragment('supervisord_main') \
+        .with_content(/directory=\/opt\/supervisord$/) }
+    end
+  end
+
+  describe '#nocleanup' do
+    context 'default' do
+      it { should_not contain_concat__fragment('supervisord_main') \
+        .with_content(/nocleanup$/) }
+    end
+    context 'true' do
+      let(:params) {{ :nocleanup => true }}
+      it { should contain_concat__fragment('supervisord_main') \
+        .with_content(/nocleanup=true$/) }
+    end
+    context 'invalid' do
+      let(:params) {{ :nocleanup => 'string' }}
+      it { expect { raise_error(Puppet::Error, /is not a boolean/) }}
+    end
+  end
+
+  describe '#childlogdir' do
+    context 'default' do
+      it { should_not contain_concat__fragment('supervisord_main') \
+        .with_content(/childlogdir$/) }
+    end
+    context 'specified' do
+      let(:params) {{ :childlogdir => '/opt/supervisord/logdir' }}
+      it { should contain_concat__fragment('supervisord_main') \
+        .with_content(/childlogdir=\/opt\/supervisord\/logdir$/) }
     end
-    context 'custom setting' do
-      let(:params) {{ :run_path => '/var/run/supervisord'}}
-      it { should contain_file('/var/run/supervisord') }
+    context 'invalid' do
+      let(:params) {{ :childlogdir => 'not_a_path' }}
+      it { expect { raise_error(Puppet::Error, /is not an absolute path/) }}
     end
   end
 end
\ No newline at end of file
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/defines/eventlistener_spec.rb b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/defines/eventlistener_spec.rb
index 6e04f44f97bc0436ceed164f25bd6add590df532..1083b8a32305ba9c1ba53319eb3d1f6d89833fb6 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/defines/eventlistener_spec.rb
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/defines/eventlistener_spec.rb
@@ -2,14 +2,85 @@ require 'spec_helper'
 
 describe 'supervisord::eventlistener', :type => :define do
   let(:title) {'foo'}
-  let(:default_params) {{ :command => 'bar',
-                  :stdout_logfile => '/var/log/supervisor/eventlistener_foo.log',
-                  :stderr_logfile => '/var/log/supervisor/eventlistener_foo.error',
-  }}
-  let(:params) { default_params }
   let(:facts) {{ :concat_basedir => '/var/lib/puppet/concat' }}
+  let(:default_params) do 
+    {
+      :command                 => 'bar',
+      :process_name            => '%(process_num)s',
+      :events                  => ['PROCESS_STATE', 'PROCESS_STATE_STARTING'],
+      :buffer_size             => 10,
+      :numprocs                => '1',
+      :numprocs_start          => '0',
+      :priority                => '999',
+      :autostart               => true,
+      :autorestart             => 'unexpected',
+      :startsecs               => '1',
+      :startretries            => '3',
+      :exitcodes               => '0,2',
+      :stopsignal              => 'TERM',
+      :stopwaitsecs            => '10',
+      :stopasgroup             => true,
+      :killasgroup             => true,
+      :user                    => 'baz',
+      :redirect_stderr         => true,
+      :stdout_logfile          => 'eventlistener_foo.log',
+      :stdout_logfile_maxbytes => '50MB',
+      :stdout_logfile_backups  => '10',
+      :stdout_events_enabled   => true,
+      :stderr_logfile          => 'eventlistener_foo.error',
+      :stderr_logfile_maxbytes => '50MB',
+      :stderr_logfile_backups  => '10',
+      :stderr_events_enabled   => true,
+      :environment             => { 'env1' => 'value1', 'env2' => 'value2' },
+      :directory               => '/opt/supervisord/chroot',
+      :umask                   => '022',
+      :serverurl               => 'AUTO'
+    }
+  end
 
-  it { should contain_supervisord__eventlistener('foo') }
-  it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/command=bar/) }
+  context 'default' do
+    let(:params) { default_params }
 
+    it { should contain_supervisord__eventlistener('foo') }
+    it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/\[eventlistener:foo\]/) }
+    it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/command=bar/) }
+    it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/process_name=\%\(process_num\)s/) }
+    it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/events=PROCESS_STATE,PROCESS_STATE_STARTING/) }
+    it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/buffer_size=10/) }
+    it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/numprocs=1/) }
+    it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/numprocs_start=0/) }
+    it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/priority=999/) }
+    it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/autostart=true/) }
+    it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/startsecs=1/) }
+    it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/startretries=3/) }
+    it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/exitcodes=0,2/) }
+    it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/stopsignal=TERM/) }
+    it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/stopwaitsecs=10/) }
+    it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/stopasgroup=true/) }
+    it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/killasgroup=true/) }
+    it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/user=baz/) }
+    it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/redirect_stderr=true/) }
+    it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/stdout_logfile=\/var\/log\/supervisor\/eventlistener_foo.log/) }
+    it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/stdout_logfile_maxbytes=50MB/) }
+    it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/stdout_logfile_backups=10/) }
+    it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/stdout_events_enabled=true/) }
+    it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/stderr_logfile=\/var\/log\/supervisor\/eventlistener_foo.error/) }
+    it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/stderr_logfile_maxbytes=50MB/) }
+    it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/stderr_logfile_backups=10/) }
+    it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/stderr_events_enabled=true/) }
+    it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/environment=env1='value1',env2='value2'/) }
+    it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/directory=\/opt\/supervisord\/chroot/) }
+    it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/umask=022/) }
+    it { should contain_file('/etc/supervisor.d/eventlistener_foo.conf').with_content(/serverurl=AUTO/) }
+  end
+
+  context 'ensure_process_stopped' do
+    let(:params) { default_params.merge({ :ensure_process => 'stopped' }) }
+    it { should contain_supervisord__supervisorctl('stop_foo') }
+  end
+
+  context 'ensure_process_removed' do
+    let(:params) { default_params.merge({ :ensure_process => 'removed' }) }
+    it { should contain_supervisord__supervisorctl('remove_foo') }
+  end
 end
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/defines/fcgi_program_spec.rb b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/defines/fcgi_program_spec.rb
index 7fd8ab07b86124a006a1cbdfe06c17a1465caf6c..e01311be70d414dbc77748db7586360a63ed82f5 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/defines/fcgi_program_spec.rb
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/defines/fcgi_program_spec.rb
@@ -2,21 +2,87 @@ require 'spec_helper'
 
 describe 'supervisord::fcgi_program', :type => :define do
   let(:title) {'foo'}
-  let(:default_params) {{ :command => 'bar',
-                  :socket          => 'tcp://localhost:1000',
-                  :stdout_logfile  => '/var/log/supervisor/fcgi-program_foo.log',
-                  :stderr_logfile  => '/var/log/supervisor/fcgi-program_foo.error',
-                  :user            => 'baz'
-  }}
-  let(:params) { default_params }
   let(:facts) {{ :concat_basedir => '/var/lib/puppet/concat' }}
+  let(:default_params) do
+    {
+      :command                 => 'bar',
+      :socket                  => 'tcp://localhost:1000',
+      :process_name            => '%(process_num)s',
+      :numprocs                => '1',
+      :numprocs_start          => '0',
+      :priority                => '999',
+      :autostart               => true,
+      :autorestart             => 'unexpected',
+      :startsecs               => '1',
+      :startretries            => '3',
+      :exitcodes               => '0,2',
+      :stopsignal              => 'TERM',
+      :stopwaitsecs            => '10',
+      :stopasgroup             => true,
+      :killasgroup             => true,
+      :user                    => 'baz',
+      :redirect_stderr         => true,
+      :stdout_logfile          => 'fcgi-program_foo.log',
+      :stdout_logfile_maxbytes => '50MB',
+      :stdout_logfile_backups  => '10',
+      :stdout_capture_maxbytes => '0',
+      :stdout_events_enabled   => true,
+      :stderr_logfile          => 'fcgi-program_foo.error',
+      :stderr_logfile_maxbytes => '50MB',
+      :stderr_logfile_backups  => '10',
+      :stderr_capture_maxbytes => '0',
+      :stderr_events_enabled   => true,
+      :environment             => { 'env1' => 'value1', 'env2' => 'value2' },
+      :directory               => '/opt/supervisord/chroot',
+      :umask                   => '022',
+      :serverurl               => 'AUTO'
+    }
+  end
 
-  it { should contain_supervisord__fcgi_program('foo') }
-  it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/\[fcgi-program:foo\]/) }
-  it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/socket=tcp:\/\/localhost:1000/) }
-  it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/command=bar/) }
-  it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/user=baz/) }
-  it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/stdout_logfile=\/var\/log\/supervisor\/fcgi-program_foo.log/) }
-  it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/stderr_logfile=\/var\/log\/supervisor\/fcgi-program_foo.error/) }
+  context 'default' do
+    let(:params) { default_params }
 
+    it { should contain_supervisord__fcgi_program('foo') }
+    it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/\[fcgi-program:foo\]/) }
+    it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/socket=tcp:\/\/localhost:1000/) }
+    it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/command=bar/) }
+    it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/process_name=\%\(process_num\)s/) }
+    it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/numprocs=1/) }
+    it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/numprocs_start=0/) }
+    it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/priority=999/) }
+    it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/autostart=true/) }
+    it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/startsecs=1/) }
+    it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/startretries=3/) }
+    it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/exitcodes=0,2/) }
+    it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/stopsignal=TERM/) }
+    it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/stopwaitsecs=10/) }
+    it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/stopasgroup=true/) }
+    it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/killasgroup=true/) }
+    it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/user=baz/) }
+    it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/redirect_stderr=true/) }
+    it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/stdout_logfile=\/var\/log\/supervisor\/fcgi-program_foo.log/) }
+    it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/stdout_logfile_maxbytes=50MB/) }
+    it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/stdout_logfile_backups=10/) }
+    it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/stdout_capture_maxbytes=0/) }
+    it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/stdout_events_enabled=true/) }
+    it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/stderr_logfile=\/var\/log\/supervisor\/fcgi-program_foo.error/) }
+    it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/stderr_logfile_maxbytes=50MB/) }
+    it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/stderr_logfile_backups=10/) }
+    it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/stderr_capture_maxbytes=0/) }
+    it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/stderr_events_enabled=true/) }
+    it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/environment=env1='value1',env2='value2'/) }
+    it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/directory=\/opt\/supervisord\/chroot/) }
+    it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/umask=022/) }
+    it { should contain_file('/etc/supervisor.d/fcgi-program_foo.conf').with_content(/serverurl=AUTO/) }
+  end
+
+  context 'ensure_process_stopped' do
+    let(:params) { default_params.merge({ :ensure_process => 'stopped' }) }
+    it { should contain_supervisord__supervisorctl('stop_foo') }
+  end
+
+  context 'ensure_process_removed' do
+    let(:params) { default_params.merge({ :ensure_process => 'removed' }) }
+    it { should contain_supervisord__supervisorctl('remove_foo') }
+  end
 end
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/defines/program_spec.rb b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/defines/program_spec.rb
index 077828bdfcfbe3424956887a25a8827b9aaab506..e32c24ab2d513320086767b2d1401a577041b298 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/defines/program_spec.rb
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/defines/program_spec.rb
@@ -2,19 +2,85 @@ require 'spec_helper'
 
 describe 'supervisord::program', :type => :define do
   let(:title) {'foo'}
-  let(:default_params) {{ :command => 'bar',
-                  :stdout_logfile  => '/var/log/supervisor/program_foo.log',
-                  :stderr_logfile  => '/var/log/supervisor/program_foo.error',
-                  :user            => 'baz'
-  }}
-  let(:params) { default_params }
   let(:facts) {{ :concat_basedir => '/var/lib/puppet/concat' }}
+  let(:default_params) do 
+    {
+      :command                 => 'bar',
+      :process_name            => '%(process_num)s',
+      :numprocs                => '1',
+      :numprocs_start          => '0',
+      :priority                => '999',
+      :autostart               => true,
+      :autorestart             => 'unexpected',
+      :startsecs               => '1',
+      :startretries            => '3',
+      :exitcodes               => '0,2',
+      :stopsignal              => 'TERM',
+      :stopwaitsecs            => '10',
+      :stopasgroup             => true,
+      :killasgroup             => true,
+      :user                    => 'baz',
+      :redirect_stderr         => true,
+      :stdout_logfile          => 'program_foo.log',
+      :stdout_logfile_maxbytes => '50MB',
+      :stdout_logfile_backups  => '10',
+      :stdout_capture_maxbytes => '0',
+      :stdout_events_enabled   => true,
+      :stderr_logfile          => 'program_foo.error',
+      :stderr_logfile_maxbytes => '50MB',
+      :stderr_logfile_backups  => '10',
+      :stderr_capture_maxbytes => '0',
+      :stderr_events_enabled   => true,
+      :environment             => { 'env1' => 'value1', 'env2' => 'value2' },
+      :directory               => '/opt/supervisord/chroot',
+      :umask                   => '022',
+      :serverurl               => 'AUTO'
+    }
+  end
 
-  it { should contain_supervisord__program('foo') }
-  it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/\[program:foo\]/) }
-  it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/command=bar/) }
-  it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/user=baz/) }
-  it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/stdout_logfile=\/var\/log\/supervisor\/program_foo.log/) }
-  it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/stderr_logfile=\/var\/log\/supervisor\/program_foo.error/) }
+  context 'default' do
+    let(:params) { default_params }
 
+    it { should contain_supervisord__program('foo') }
+    it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/\[program:foo\]/) }
+    it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/command=bar/) }
+    it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/process_name=\%\(process_num\)s/) }
+    it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/numprocs=1/) }
+    it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/numprocs_start=0/) }
+    it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/priority=999/) }
+    it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/autostart=true/) }
+    it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/startsecs=1/) }
+    it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/startretries=3/) }
+    it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/exitcodes=0,2/) }
+    it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/stopsignal=TERM/) }
+    it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/stopwaitsecs=10/) }
+    it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/stopasgroup=true/) }
+    it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/killasgroup=true/) }
+    it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/user=baz/) }
+    it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/redirect_stderr=true/) }
+    it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/stdout_logfile=\/var\/log\/supervisor\/program_foo.log/) }
+    it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/stdout_logfile_maxbytes=50MB/) }
+    it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/stdout_logfile_backups=10/) }
+    it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/stdout_capture_maxbytes=0/) }
+    it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/stdout_events_enabled=true/) }
+    it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/stderr_logfile=\/var\/log\/supervisor\/program_foo.error/) }
+    it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/stderr_logfile_maxbytes=50MB/) }
+    it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/stderr_logfile_backups=10/) }
+    it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/stderr_capture_maxbytes=0/) }
+    it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/stderr_events_enabled=true/) }
+    it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/environment=env1='value1',env2='value2'/) }
+    it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/directory=\/opt\/supervisord\/chroot/) }
+    it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/umask=022/) }
+    it { should contain_file('/etc/supervisor.d/program_foo.conf').with_content(/serverurl=AUTO/) }
+  end
+
+  context 'ensure_process_stopped' do
+    let(:params) { default_params.merge({ :ensure_process => 'stopped' }) }
+    it { should contain_supervisord__supervisorctl('stop_foo') }
+  end
+
+  context 'ensure_process_removed' do
+    let(:params) { default_params.merge({ :ensure_process => 'removed' }) }
+    it { should contain_supervisord__supervisorctl('remove_foo') }
+  end
 end
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/defines/supervisorctl.rb b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/defines/supervisorctl.rb
new file mode 100644
index 0000000000000000000000000000000000000000..33cfd75efe941bd55c1110200d94c2bf439c4aef
--- /dev/null
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/defines/supervisorctl.rb
@@ -0,0 +1,13 @@
+require 'spec_helper'
+
+describe 'supervisord::supervisorctl', :type => :define do
+  let(:title) {'command_foo'}
+  let(:default_params) {{ 
+    :command => 'command',
+    :process => 'foo'
+  }}
+  let(:params) { default_params }
+  let(:facts) {{ :concat_basedir => '/var/lib/puppet/concat' }}
+
+  it { should contain_supervisord__supervisorctl('command_foo') }
+end
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/spec_helper.rb b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/spec_helper.rb
index 644f7c33ac09f10cad2df6f5da41c1c45b14c355..745ad4a5493fa3d533ceca7e628d0de2d27469c0 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/spec_helper.rb
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/spec_helper.rb
@@ -7,3 +7,4 @@ RSpec.configure do |c|
   c.manifest_dir = File.join(fixture_path, 'manifests')
 end
 
+at_exit { RSpec::Puppet::Coverage.report! }
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/spec_helper_acceptance.rb b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/spec_helper_acceptance.rb
new file mode 100644
index 0000000000000000000000000000000000000000..dcae2850d270ad55c213de5cd10eb720bf4b9dea
--- /dev/null
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/spec_helper_acceptance.rb
@@ -0,0 +1,24 @@
+require 'beaker-rspec'
+
+hosts.each do |host|
+  # Install Puppet
+  install_puppet
+end
+
+RSpec.configure do |c|
+  # Project root
+  proj_root = File.expand_path(File.join(File.dirname(__FILE__), '..'))
+
+  # Readable test descriptions
+  c.formatter = :documentation
+
+  # Configure all nodes in nodeset
+  c.before :suite do
+    # Install module
+    puppet_module_install(:source => proj_root, :module_name => 'supervisord')
+    hosts.each do |host|
+      on host, puppet('module','install','puppetlabs-stdlib'), { :acceptable_exit_codes => [0,1] }
+      on host, puppet('module','install','puppetlabs-concat'), { :acceptable_exit_codes => [0,1] }
+    end
+  end
+end
\ No newline at end of file
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/spec_helper_system.rb b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/spec_helper_system.rb
deleted file mode 100644
index a790d7d526c0c6a818daaf587f6f4693620e78f4..0000000000000000000000000000000000000000
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/spec_helper_system.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-require 'rspec-system/spec_helper'
-require 'rspec-system-puppet/helpers'
-
-include RSpecSystemPuppet::Helpers
-
-RSpec.configure do |c|
-  # Project root
-  proj_root = File.expand_path(File.join(File.dirname(__FILE__), '..'))
-
-  # Enable colour
-  c.tty = true
-
-  # This is where we 'setup' the nodes before running our tests
-  c.before :suite do
-    # Install puppet
-    puppet_install
-    puppet_master_install
-
-    # Replace mymodule with your module name
-    puppet_module_install(:source => proj_root, :module_name => 'supervisord')
-    shell('puppet module install puppetlabs/stdlib')
-    shell('puppet module install puppetlabs/concat')
-
-  end
-end
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/system/basic_spec.rb b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/system/basic_spec.rb
deleted file mode 100644
index 62cf7dd8c2e7c083b0ac45f99fd061e480f3463c..0000000000000000000000000000000000000000
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/spec/system/basic_spec.rb
+++ /dev/null
@@ -1,120 +0,0 @@
-require 'spec_helper_system'
-
-describe 'basic install' do
-
-  it 'class should work with no errors' do
-    pp = <<-EOS
-      class { 'supervisord': install_pip  => true, install_init => true}
-    EOS
-
-    puppet_apply(pp) do |r|
-      r.exit_code.should_not == 1
-      r.refresh
-      r.exit_code.should be_zero
-    end
-
-    shell("pgrep supervisord") do |r|
-      r.exit_code.should be_zero
-    end
-
-  end
-end
-
-describe 'add a program config' do
-
-  it 'supervisord::program should install a program config' do
-
-    pp = <<-EOS
-      include supervisord
-      supervisord::program { 'test': 
-        command => 'echo', 
-        priority => '100', 
-        environment => { 
-          'HOME' => '/root',
-          'PATH' => '/bin',
-        }
-      }
-    EOS
-
-    puppet_apply(pp) do |r|
-      r.exit_code.should_not == 1
-      r.refresh
-      r.exit_code.should be_zero
-    end
-
-    shell("grep command=echo /etc/supervisor.d/program_test.conf") do |r|
-      r.exit_code.should be_zero
-    end
-    shell("grep priority=100 /etc/supervisor.d/program_test.conf") do |r|
-      r.exit_code.should be_zero
-    end
-    shell('grep "environment=" /etc/supervisor.d/program_test.conf') do |r|
-      r.exit_code.should be_zero
-    end
-  end
-end 
-
-describe 'add a fcgi-program config' do
-
-  it 'supervisord::fcgi_program should install a program config' do
-
-    pp = <<-EOS
-      include supervisord
-      supervisord::fcgi_program { 'test':
-        socket  => 'tcp://localhost:1000',
-        command => 'echo',
-        priority => '100',
-        environment => {
-          'HOME' => '/root',
-          'PATH' => '/bin',
-        }
-      }
-    EOS
-
-    puppet_apply(pp) do |r|
-      r.exit_code.should_not == 1
-      r.refresh
-      r.exit_code.should be_zero
-    end
-
-    shell("grep socket=tcp://localhost:1000 /etc/supervisor.d/fcgi-program_test.conf") do |r|
-      r.exit_code.should be_zero
-    end
-    shell("grep command=echo /etc/supervisor.d/fcgi-program_test.conf") do |r|
-      r.exit_code.should be_zero
-    end
-    shell("grep priority=100 /etc/supervisor.d/fcgi-program_test.conf") do |r|
-      r.exit_code.should be_zero
-    end
-    shell('grep "environment=" /etc/supervisor.d/fcgi-program_test.conf') do |r|
-      r.exit_code.should be_zero
-    end
-  end
-end
-
-describe 'add a group config' do
-
-  it 'supervisord::group should install a program config' do
-
-    pp = <<-EOS
-      include supervisord
-      supervisord::group { 'test':
-        programs => ['program1', 'program2'],
-        priority => '100',
-      }
-    EOS
-
-    puppet_apply(pp) do |r|
-      r.exit_code.should_not == 1
-      r.refresh
-      r.exit_code.should be_zero
-    end
-
-    shell('grep "programs=program1,program2" /etc/supervisor.d/group_test.conf') do |r|
-      r.exit_code.should be_zero
-    end
-    shell("grep priority=100 /etc/supervisor.d/fcgi-program_test.conf") do |r|
-      r.exit_code.should be_zero
-    end
-  end
-end
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/conf/eventlistener.erb b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/conf/eventlistener.erb
index 4ee2b893419b26ab5b33d39f953d8d07b89e7ac8..9875c8ef5b23022312656fb159093ace9bc83349 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/conf/eventlistener.erb
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/conf/eventlistener.erb
@@ -39,8 +39,8 @@ exitcodes=<%= @exitcodes %>
 <% if @stopsignal -%>
 stopsignal=<%= @stopsignal %>
 <% end -%>
-<% if @stopwaitsec -%>
-stopwaitsec=<%= @stopwaitsec %>
+<% if @stopwaitsecs -%>
+stopwaitsecs=<%= @stopwaitsecs %>
 <% end -%>
 <% if @stopasgroup -%>
 stopasgroup=<%= @stopasgroup %>
@@ -54,7 +54,7 @@ user=<%= @user %>
 <% if @redirect_stderr -%>
 redirect_stderr=<%= @redirect_stderr %>
 <% end -%>
-stdout_logfile=<%= @stdout_logfile %>
+stdout_logfile=<%= scope.lookupvar('supervisord::log_path') %>/<%= @stdout_logfile %>
 <% if @stdout_logfile_maxbytes -%>
 stdout_logfile_maxbytes=<%= @stdout_logfile_maxbytes %>
 <% end -%>
@@ -64,7 +64,7 @@ stdout_logfile_backups=<%= @stdout_logfile_backups %>
 <% if @stdout_events_enabled -%>
 stdout_events_enabled=<%= @stdout_events_enabled %>
 <% end -%>
-stderr_logfile=<%= @stderr_logfile %>
+stderr_logfile=<%= scope.lookupvar('supervisord::log_path') %>/<%= @stderr_logfile %>
 <% if @stderr_logfile_maxbytes -%>
 stderr_logfile_maxbytes=<%= @stderr_logfile_maxbytes %>
 <% end -%>
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/conf/fcgi_program.erb b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/conf/fcgi_program.erb
index a1478bce5360de78aa35abe462acb8b577658fbd..98a7fb1cb3285ed4bf8438ec4e52abf559636ab2 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/conf/fcgi_program.erb
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/conf/fcgi_program.erb
@@ -37,8 +37,8 @@ exitcodes=<%= @exitcodes %>
 <% if @stopsignal -%>
 stopsignal=<%= @stopsignal %>
 <% end -%>
-<% if @stopwaitsec -%>
-stopwaitsec=<%= @stopwaitsec %>
+<% if @stopwaitsecs -%>
+stopwaitsecs=<%= @stopwaitsecs %>
 <% end -%>
 <% if @stopasgroup -%>
 stopasgroup=<%= @stopasgroup %>
@@ -53,7 +53,7 @@ user=<%= @user %>
 redirect_stderr=<%= @redirect_stderr %>
 <% end -%>
 <% if @stdout_logfile -%>
-stdout_logfile=<%= @stdout_logfile %>
+stdout_logfile=<%= scope.lookupvar('supervisord::log_path') %>/<%= @stdout_logfile %>
 <% end -%>
 <% if @stdout_logfile_maxbytes -%>
 stdout_logfile_maxbytes=<%= @stdout_logfile_maxbytes %>
@@ -68,7 +68,7 @@ stdout_capture_maxbytes=<%= @stdout_capture_maxbytes %>
 stdout_events_enabled=<%= @stdout_events_enabled %>
 <% end -%>
 <% if @stderr_logfile -%>
-stderr_logfile=<%= @stderr_logfile %>
+stderr_logfile=<%= scope.lookupvar('supervisord::log_path') %>/<%= @stderr_logfile %>
 <% end -%>
 <% if @stderr_logfile_maxbytes -%>
 stderr_logfile_maxbytes=<%= @stderr_logfile_maxbytes %>
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/conf/program.erb b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/conf/program.erb
index ca96d34d6adcb696be761ce182112420715ca692..78002c87ca6d276d4a8c9f9a67ee413b9df56d4a 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/conf/program.erb
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/conf/program.erb
@@ -30,8 +30,8 @@ exitcodes=<%= @exitcodes %>
 <% if @stopsignal -%>
 stopsignal=<%= @stopsignal %>
 <% end -%>
-<% if @stopwaitsec -%>
-stopwaitsec=<%= @stopwaitsec %>
+<% if @stopwaitsecs -%>
+stopwaitsecs=<%= @stopwaitsecs %>
 <% end -%>
 <% if @stopasgroup -%>
 stopasgroup=<%= @stopasgroup %>
@@ -46,7 +46,7 @@ user=<%= @user %>
 redirect_stderr=<%= @redirect_stderr %>
 <% end -%>
 <% if @stdout_logfile -%>
-stdout_logfile=<%= @stdout_logfile %>
+stdout_logfile=<%= scope.lookupvar('supervisord::log_path') %>/<%= @stdout_logfile %>
 <% end -%>
 <% if @stdout_logfile_maxbytes -%>
 stdout_logfile_maxbytes=<%= @stdout_logfile_maxbytes %>
@@ -61,7 +61,7 @@ stdout_capture_maxbytes=<%= @stdout_capture_maxbytes %>
 stdout_events_enabled=<%= @stdout_events_enabled %>
 <% end -%>
 <% if @stderr_logfile -%>
-stderr_logfile=<%= @stderr_logfile %>
+stderr_logfile=<%= scope.lookupvar('supervisord::log_path') %>/<%= @stderr_logfile %>
 <% end -%>
 <% if @stderr_logfile_maxbytes -%>
 stderr_logfile_maxbytes=<%= @stderr_logfile_maxbytes %>
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/init/debian_extra.erb b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/init/Debian/defaults.erb
similarity index 100%
rename from dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/init/debian_extra.erb
rename to dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/init/Debian/defaults.erb
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/init/debian_init.erb b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/init/Debian/init.erb
similarity index 96%
rename from dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/init/debian_init.erb
rename to dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/init/Debian/init.erb
index b94f9337f5919fe4a0b572c27d198ffaa2c3b21c..bff9857257ae916d68de34bb1c72629e89b8924f 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/init/debian_init.erb
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/init/Debian/init.erb
@@ -19,15 +19,15 @@ DESC=supervisor
 test -x $DAEMON || exit 0
 
 LOGDIR=<%= @log_path %>
-PIDFILE=<%= @pid_file %>
+PIDFILE=<%= @run_path %>/<%= @pid_file %>
 DODTIME=5                   # Time to wait for the server to die, in seconds
                             # If this value is set too low you might not
                             # let some servers to die gracefully and
                             # 'restart' will not work
 
 # Include supervisor defaults if available
-if [ -f /etc/default/supervisor ] ; then
-        . /etc/default/supervisor
+if [ -f <%= @init_defaults %> ] ; then
+        . <%= @init_defaults %>
 fi
 
 set -e
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/init/redhat_extra.erb b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/init/RedHat/defaults.erb
similarity index 81%
rename from dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/init/redhat_extra.erb
rename to dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/init/RedHat/defaults.erb
index b892c2d62038b4e8a5de38f1728264ed1ca653b3..0d7862d0233b4b924059faa2223218bae2f6bd5d 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/init/redhat_extra.erb
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/init/RedHat/defaults.erb
@@ -5,4 +5,4 @@ set -a
 
 # should probably put both of these options as runtime arguments 
 OPTIONS="-c <%= @config_file %>"
-PIDFILE=<%= @pid_file %>
+PIDFILE=<%= @run_path %><%= @pid_file %>
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/init/redhat_init.erb b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/init/RedHat/init.erb
similarity index 94%
rename from dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/init/redhat_init.erb
rename to dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/init/RedHat/init.erb
index 1dc2da2aff11baed096e97312856a77d2a7c45d0..dabb27845104e2a1b27f7fec0dff5212df6c7866 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/init/redhat_init.erb
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/init/RedHat/init.erb
@@ -13,18 +13,19 @@
 #               xmlrpc interface as well as a few other nifty features.
 # processname:  supervisord
 # config: <%= @config_file %>
-# pidfile: <%= @pid_file %>
+# pidfile: <%= @run_path %>/<%= @pid_file %>
 #
 
 # source function library
 . /etc/rc.d/init.d/functions
 
 # source system settings
-[ -e <%= @init_extras %> ] && . <%= @init_extras %>
+[ -e <%= @init_defaults %> ] && . <%= @init_defaults %>
 
 RETVAL=0
 DAEMON=/usr/bin/supervisord
 DESC=supervisord
+PIDFILE=<%= @run_path %>/<%= @pid_file %>
 
 running_pid()
 {
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/supervisord_main.erb b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/supervisord_main.erb
index 1baf5607a2f4fe8c059595f2b117a0b40dc35578..8ab8fee51dfc1ffb1a4f5a9d7b119948b6c24502 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/supervisord_main.erb
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/supervisord_main.erb
@@ -1,9 +1,9 @@
 [supervisord]
-logfile=<%= @log_file %>
-pidfile=<%= @pid_file %>
+logfile=<%= @log_path %>/<%= @log_file %>
+pidfile=<%= @run_path %>/<%= @pid_file %>
 nodaemon=<%= @nodaemon %>
 minfds=<%= @minfds %>
-minfds=<%= @minprocs %>
+minprocs=<%= @minprocs %>
 umask=<%= @umask %>
 <% if @strip_ansi -%>
 strip_ansi=<%= @strip_ansi %>
@@ -12,7 +12,7 @@ strip_ansi=<%= @strip_ansi %>
 user=<%= @user %>
 <% end -%>
 <% if @identifier -%>
-indentifier=<%= @identifier %>
+identifier=<%= @identifier %>
 <% end -%>
 <% if @directory -%>
 directory=<%= @directory %>
@@ -31,4 +31,4 @@ environment=<%= @env_string %>
 supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
 
 [include]
-files=<%= @config_include %>/*.conf
+files=<%= @config_include_string %>
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/supervisord_unix.erb b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/supervisord_unix.erb
index 414e75198ba5863dceb94eea7c000a7b198a19ee..39e85199916d35614f005b8dfff9e147af10e1e5 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/supervisord_unix.erb
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/templates/supervisord_unix.erb
@@ -1,5 +1,5 @@
 [unix_http_server]
-file=<%= @unix_socket_file %>
+file=<%= @run_path %>/<%= @unix_socket_file %>
 chmod=<%= @unix_socket_mode %>
 chown=<%= @unix_socket_owner %>:<%= @unix_socket_group %>
 <% if @unix_auth -%>
@@ -8,7 +8,7 @@ password=<%= @unix_socket_password %>
 <% end -%>
 
 [supervisorctl]
-serverurl=unix://<%= @unix_socket_file %>
+serverurl=unix://<%= @run_path %>/<%= @unix_socket_file %>
 <% if @unix_auth -%>
 username=<%= @unix_username %>
 password=<%= @unix_password %>
diff --git a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/tests/program.pp b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/tests/program.pp
index 6c789c96dc15d7bfc583283b1164b7f82f2a5542..0d45ebe1b3dec0235a859f29d7a1ea6584c86ebd 100644
--- a/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/tests/program.pp
+++ b/dev/vagrant/dolibarrdev/puphpet/puppet/modules/supervisord/tests/program.pp
@@ -1,9 +1,35 @@
 supervisord::program { 'myprogram':
-  command     => 'command --args',
-  priority    => '100',
-  environment => {
+  command                 => 'command --args',
+  process_name            => '%(process_num)s',
+  numprocs                => '1',
+  numprocs_start          => '0',
+  priority                => '999',
+  autostart               => true,
+  autorestart             => 'unexpected',
+  startsecs               => '1',
+  startretries            => '3',
+  exitcodes               => '0,2',
+  stopsignal              => 'TERM',
+  stopwaitsecs            => '10',
+  stopasgroup             => false,
+  killasgroup             => false,
+  redirect_stderr         => false,
+  stdout_logfile          => 'program_foo.log',
+  stdout_logfile_maxbytes => '50MB',
+  stdout_logfile_backups  => '10',
+  stdout_capture_maxbytes => '0',
+  stdout_events_enabled   => false,
+  stderr_logfile          => 'program_foo.error',
+  stderr_logfile_maxbytes => '50MB',
+  stderr_logfile_backups  => '10',
+  stderr_capture_maxbytes => '0',
+  stderr_events_enabled   => false,
+  environment             => {
     'HOME'   => '/home/myuser',
     'PATH'   => '/bin:/sbin:/usr/bin:/usr/sbin',
     'SECRET' => 'mysecret'
-  }
+  },
+  directory               => undef,
+  umask                   => '022',
+  serverurl               => 'AUTO'
 }
\ No newline at end of file
diff --git a/dev/vagrant/dolibarrdev/puphpet/shell/execute-files.sh b/dev/vagrant/dolibarrdev/puphpet/shell/execute-files.sh
index 06713c2ee99293ba5bf095300f83ce112b495a0f..c6c08a7b04cf82fb499f4772622a74197198ca7c 100644
--- a/dev/vagrant/dolibarrdev/puphpet/shell/execute-files.sh
+++ b/dev/vagrant/dolibarrdev/puphpet/shell/execute-files.sh
@@ -4,17 +4,26 @@ export DEBIAN_FRONTEND=noninteractive
 
 VAGRANT_CORE_FOLDER=$(cat '/.puphpet-stuff/vagrant-core-folder.txt')
 
+EXEC_ONCE_DIR="$1"
+EXEC_ALWAYS_DIR="$2"
+
 shopt -s nullglob
-files=("${VAGRANT_CORE_FOLDER}"/files/exec-once/*)
-
-if [[ ! -f '/.puphpet-stuff/exec-once-ran' && (${#files[@]} -gt 0) ]]; then
-    echo 'Running files in files/exec-once'
-    find "${VAGRANT_CORE_FOLDER}/files/exec-once" -maxdepth 1 -not -path '*/\.*' -type f \( ! -iname "empty" \) -exec chmod +x '{}' \; -exec {} \;
-    echo 'Finished running files in files/exec-once'
-    echo 'To run again, delete file /.puphpet-stuff/exec-once-ran'
-    touch /.puphpet-stuff/exec-once-ran
+files=("${VAGRANT_CORE_FOLDER}"/files/"${EXEC_ONCE_DIR}"/*)
+
+if [[ (${#files[@]} -gt 0) ]]; then
+    echo "Running files in files/${EXEC_ONCE_DIR}"
+
+    if [ ! -d "/.puphpet-stuff/${EXEC_ONCE_DIR}-ran" ]; then
+       mkdir "/.puphpet-stuff/${EXEC_ONCE_DIR}-ran"
+       echo "Created directory /.puphpet-stuff/${EXEC_ONCE_DIR}-ran"
+    fi
+
+    find "${VAGRANT_CORE_FOLDER}/files/${EXEC_ONCE_DIR}" -maxdepth 1 -not -path '*/\.*' -type f \( ! -iname "empty" \) -exec cp -n '{}' "/.puphpet-stuff/${EXEC_ONCE_DIR}-ran" \;
+    find "/.puphpet-stuff/${EXEC_ONCE_DIR}-ran" -maxdepth 1 -type f -exec chmod +x '{}' \; -exec {} \; -exec sh -c '>{}' \;
+    echo "Finished running files in files/${EXEC_ONCE_DIR}"
+    echo "To run again, delete file(s) you want rerun in /.puphpet-stuff/${EXEC_ONCE_DIR}-ran or the whole folder to rerun all"
 fi
 
-echo 'Running files in files/exec-always'
-find "${VAGRANT_CORE_FOLDER}/files/exec-always" -maxdepth 1 -not -path '*/\.*' -type f \( ! -iname "empty" \) -exec chmod +x '{}' \; -exec {} \;
-echo 'Finished running files in files/exec-always'
+echo "Running files in files/${EXEC_ALWAYS_DIR}"
+find "${VAGRANT_CORE_FOLDER}/files/${EXEC_ALWAYS_DIR}" -maxdepth 1 -not -path '*/\.*' -type f \( ! -iname "empty" \) -exec chmod +x '{}' \; -exec {} \;
+echo "Finished running files in files/${EXEC_ALWAYS_DIR}"
diff --git a/dev/vagrant/dolibarrdev/puphpet/shell/ssh-keygen.sh b/dev/vagrant/dolibarrdev/puphpet/shell/ssh-keygen.sh
index 6bb7614f9c6ee5022eccdac1d48d121b19ea1d8d..ef00495b2b6608bf38932145dbccdc7f40f3bd05 100644
--- a/dev/vagrant/dolibarrdev/puphpet/shell/ssh-keygen.sh
+++ b/dev/vagrant/dolibarrdev/puphpet/shell/ssh-keygen.sh
@@ -5,37 +5,76 @@ VAGRANT_CORE_FOLDER=$(cat '/.puphpet-stuff/vagrant-core-folder.txt')
 OS=$(/bin/bash "${VAGRANT_CORE_FOLDER}/shell/os-detect.sh" ID)
 VAGRANT_SSH_USERNAME=$(echo "$1")
 
-if [[ ! -f "${VAGRANT_CORE_FOLDER}/files/dot/ssh/id_rsa" ]]; then
-    ssh-keygen -f "${VAGRANT_CORE_FOLDER}/files/dot/ssh/id_rsa" -P ""
-
-    if [[ ! -f "${VAGRANT_CORE_FOLDER}/files/dot/ssh/id_rsa.ppk" ]]; then
-        if [ "${OS}" == 'debian' ] || [ "${OS}" == 'ubuntu' ]; then
-            apt-get install -y putty-tools >/dev/null
-        elif [ "${OS}" == 'centos' ]; then
-            yum -y install putty >/dev/null
+function create_key()
+{
+    BASE_KEY_NAME=$(echo "$1")
+
+    if [[ ! -f "${VAGRANT_CORE_FOLDER}/files/dot/ssh/${BASE_KEY_NAME}" ]]; then
+        ssh-keygen -f "${VAGRANT_CORE_FOLDER}/files/dot/ssh/${BASE_KEY_NAME}" -P ""
+
+        if [[ ! -f "${VAGRANT_CORE_FOLDER}/files/dot/ssh/${BASE_KEY_NAME}.ppk" ]]; then
+            if [ "${OS}" == 'debian' ] || [ "${OS}" == 'ubuntu' ]; then
+                apt-get install -y putty-tools >/dev/null
+            elif [ "${OS}" == 'centos' ]; then
+                yum -y install putty >/dev/null
+            fi
+
+            puttygen "${VAGRANT_CORE_FOLDER}/files/dot/ssh/${BASE_KEY_NAME}" -O private -o "${VAGRANT_CORE_FOLDER}/files/dot/ssh/${BASE_KEY_NAME}.ppk"
         fi
 
-        puttygen "${VAGRANT_CORE_FOLDER}/files/dot/ssh/id_rsa" -O private -o "${VAGRANT_CORE_FOLDER}/files/dot/ssh/id_rsa.ppk"
+        echo "Your private key for SSH-based authentication has been saved to 'puphpet/files/dot/ssh/${BASE_KEY_NAME}'!"
+    else
+        echo "Pre-existing private key found at 'puphpet/files/dot/ssh/${BASE_KEY_NAME}'"
     fi
+}
 
-    echo 'Your private key for SSH-based authentication have been saved to "puphpet/files/dot/ssh/"!'
-else
-    echo 'Using pre-existing private key at "puphpet/files/dot/ssh/id_rsa"'
-fi
+create_key 'root_id_rsa'
+create_key 'id_rsa'
+
+PUBLIC_SSH_KEY=$(cat "${VAGRANT_CORE_FOLDER}/files/dot/ssh/id_rsa.pub")
 
+echo 'Adding generated key to /root/.ssh/id_rsa'
+echo 'Adding generated key to /root/.ssh/id_rsa.pub'
 echo 'Adding generated key to /root/.ssh/authorized_keys'
+
 mkdir -p /root/.ssh
-cat "${VAGRANT_CORE_FOLDER}/files/dot/ssh/id_rsa.pub" > '/root/.ssh/authorized_keys'
+
+cp "${VAGRANT_CORE_FOLDER}/files/dot/ssh/id_rsa" '/root/.ssh/'
+cp "${VAGRANT_CORE_FOLDER}/files/dot/ssh/id_rsa.pub" '/root/.ssh/'
+
+if [[ ! -f '/root/.ssh/authorized_keys' ]] || ! grep -q "${PUBLIC_SSH_KEY}" '/root/.ssh/authorized_keys'; then
+    cat "${VAGRANT_CORE_FOLDER}/files/dot/ssh/id_rsa.pub" >> '/root/.ssh/authorized_keys'
+fi
+
+chown -R root '/root/.ssh'
+chgrp -R root '/root/.ssh'
+chmod 700 '/root/.ssh'
+chmod 644 '/root/.ssh/id_rsa.pub'
+chmod 600 '/root/.ssh/id_rsa'
 chmod 600 '/root/.ssh/authorized_keys'
 
 if [ "${VAGRANT_SSH_USERNAME}" != 'root' ]; then
     VAGRANT_SSH_FOLDER="/home/${VAGRANT_SSH_USERNAME}/.ssh";
 
+    mkdir -p "${VAGRANT_SSH_FOLDER}"
+
+    echo "Adding generated key to ${VAGRANT_SSH_FOLDER}/id_rsa"
+    echo "Adding generated key to ${VAGRANT_SSH_FOLDER}/id_rsa.pub"
     echo "Adding generated key to ${VAGRANT_SSH_FOLDER}/authorized_keys"
-    cat "${VAGRANT_CORE_FOLDER}/files/dot/ssh/id_rsa.pub" > "${VAGRANT_SSH_FOLDER}/authorized_keys"
-    chown "${VAGRANT_SSH_USERNAME}" "${VAGRANT_SSH_FOLDER}/authorized_keys"
-    chgrp "${VAGRANT_SSH_USERNAME}" "${VAGRANT_SSH_FOLDER}/authorized_keys"
+
+    cp "${VAGRANT_CORE_FOLDER}/files/dot/ssh/id_rsa" "${VAGRANT_SSH_FOLDER}/id_rsa"
+    cp "${VAGRANT_CORE_FOLDER}/files/dot/ssh/id_rsa.pub" "${VAGRANT_SSH_FOLDER}/id_rsa.pub"
+
+    if [[ ! -f "${VAGRANT_SSH_FOLDER}/authorized_keys" ]] || ! grep -q "${PUBLIC_SSH_KEY}" "${VAGRANT_SSH_FOLDER}/authorized_keys"; then
+        cat "${VAGRANT_CORE_FOLDER}/files/dot/ssh/id_rsa.pub" >> "${VAGRANT_SSH_FOLDER}/authorized_keys"
+    fi
+
+    chown -R "${VAGRANT_SSH_USERNAME}" "${VAGRANT_SSH_FOLDER}"
+    chgrp -R "${VAGRANT_SSH_USERNAME}" "${VAGRANT_SSH_FOLDER}"
+    chmod 700 "${VAGRANT_SSH_FOLDER}"
+    chmod 644 "${VAGRANT_SSH_FOLDER}/id_rsa.pub"
+    chmod 600 "${VAGRANT_SSH_FOLDER}/id_rsa"
     chmod 600 "${VAGRANT_SSH_FOLDER}/authorized_keys"
-fi
 
-passwd -d vagrant >/dev/null
+    passwd -d "${VAGRANT_SSH_USERNAME}" >/dev/null
+fi