diff --git a/slapos/recipe/pulse2/__init__.py b/slapos/recipe/pulse2/__init__.py
index b7f12028c92176fe06dc1ba9ac37b029828b4b43..62e05a4ba85d042692d42082d32188b93d1c9d36 100644
--- a/slapos/recipe/pulse2/__init__.py
+++ b/slapos/recipe/pulse2/__init__.py
@@ -38,27 +38,37 @@ class Recipe(BaseSlapRecipe):
         'template/%s' % template_name)
 
   def _install(self):
-    # LDAP
-    # MYSQL
     # Apache
-    # mmc (+pulse)
+    # TODO add in apache conf location of mmc.ini
+    document_root = self.createDataDirectory('htdocs')
+    self.createHtdocs(self.options['source'].strip(), document_root)
+    url = self.installApache(document_root)
+    
+    # MySQL
+    mysql_conf = self.installMysqlServer(self.getLocalIPv4Address(), 45678)
+    
+    # LDAP
+    ldap_port = dict()
+    
+    # Pulse
+    mmc_core_conf = self.installPulse2(ip=self.getLocalIPv4Address(),
+        port=11000, ldap_host=ldap_conf['host'], ldap_port=ldap_conf['port'])
+        
+    ca_conf = self.installCertificateAuthority()
+    key, certificate = self.requestCertificate('Pulse')
+
+    stunnel_conf = self.installStunnel(self.getGlobalIPv6Address(),
+        self.getLocalIPv4Address(), 12345, pulse_conf['inventory_port'],
+        certificate, key, ca_conf['ca_crl'],
+        ca_conf['certificate_authority_path'])
     
-    #pulse2_conf = self.installPulse2(ip=self.getLocalIPv4Address(),
-    #    port=11000)
-    #    
-    #ca_conf = self.installCertificateAuthority()
-    #key, certificate = self.requestCertificate('Memcached')
-    #
-    #stunnel_conf = self.installStunnel(self.getGlobalIPv6Address(),
-    #    self.getLocalIPv4Address(), 12345, memcached_conf['memcached_port'],
-    #    certificate, key, ca_conf['ca_crl'],
-    #    ca_conf['certificate_authority_path'])
-    #
-    #self.linkBinary()
-    #self.setConnectionDict(dict(
-    #  stunnel_ip = stunnel_conf['public_ip'],
-    #  stunnel_port = stunnel_conf['public_port'],
-    #))
+    self.linkBinary()
+    self.setConnectionDict(dict(
+      stunnel_inventory_ip = stunnel_conf['public_ip'],
+      stunnel_inventory_port = stunnel_conf['public_port'],
+      url=url,
+      **mysql_conf
+    ))
     return self.path_list
 
   def linkBinary(self):
@@ -228,16 +238,194 @@ class Recipe(BaseSlapRecipe):
     self.path_list.append(wrapper)
     return stunnel_conf
 
-  def installMemcached(self, ip, port):
+  def installPulse2(self, ip, port, ldap_host, ldap_port):
+    """Installs both mmc_core and pulse2"""
     config = dict(
-        memcached_binary=self.options['memcached_binary'],
-        memcached_ip=ip,
+        ldap_host=ldap_host,
+        ldap_port=ldap_port,
         memcached_port=port,
+        ldap_logfile_path= os.path.join(self.log_directory, 'ldap.log'),
+        mmc_core_binary=self.options['mmc_core_binary']
     )
-    self.path_list.append(self.createRunningWrapper('memcached',
-      self.substituteTemplate(self.getTemplateFilename('memcached.in'),
+    
+    #TODO write function that takes all templates in subdir and creates conf 
+    # files, keeping same dir structure.
+    mmc_conf_path = self.createConfigurationFile(os.path.join("mmc",
+        "agent", "config.ini"), self.substituteTemplate(
+        self.getTemplateFilename(os.path.join("mmc_conf",
+        "agent", "config.ini.in")), config))
+    config['mmc_core_config_file'] = mysql_conf_path
+    
+    self.path_list.append(self.createRunningWrapper('mmc-core',
+      self.substituteTemplate(self.getTemplateFilename('mmc-core.in'),
         config)))
+
+
+    
     return dict(memcached_url='%s:%s' %
         (config['memcached_ip'], config['memcached_port']),
         memcached_ip=config['memcached_ip'],
         memcached_port=config['memcached_port'])
+  
+    def createHtdocs(self, source, document_root):
+    source = self.options['source'].strip()
+    document_root = self.createDataDirectory('htdocs')
+    for p in os.listdir(document_root):
+      path = os.path.join(document_root, p)
+      if os.path.isdir(path):
+        shutil.rmtree(path)
+      else:
+        os.unlink(path)
+    for p in os.listdir(source):
+      path = os.path.join(source, p)
+      if os.path.isdir(path):
+        shutil.copytree(path, os.path.join(document_root, p))
+      else:
+        shutil.copy2(path, os.path.join(document_root, p))
+  
+  def installApache(self, document_root, ip=None, port=None):
+    if ip is None:
+      ip=self.getGlobalIPv6Address()
+    if port is None:
+      port = '9080'
+    apache_config = dict(
+        pid_file=os.path.join(self.run_directory, 'httpd.pid'),
+        lock_file=os.path.join(self.run_directory, 'httpd.lock'),
+        ip=ip,
+        port=port,
+        error_log=os.path.join(self.log_directory, 'httpd-error.log'),
+        access_log=os.path.join(self.log_directory, 'httpd-access.log'),
+        document_root=document_root,
+        php_ini_dir=self.etc_directory
+    )
+    config_file = self.createConfigurationFile('httpd.conf',
+        self.substituteTemplate(pkg_resources.resource_filename(__name__,
+          'template/apache.in'), apache_config))
+    self.path_list.append(config_file)
+    self.path_list.append(self.createConfigurationFile('php.ini',
+        self.substituteTemplate(pkg_resources.resource_filename(__name__,
+          'template/php.ini.in'), {})))
+    self.path_list.extend(zc.buildout.easy_install.scripts([(
+      'httpd',
+        __name__ + '.apache', 'runApache')], self.ws,
+          sys.executable, self.wrapper_directory, arguments=[
+            dict(
+              required_path_list=[],
+              binary=self.options['httpd_binary'],
+              config=config_file
+            )
+          ]))
+    return 'http://[%s]:%s' % (ip, port)
+
+  def installMysqlServer(self, ip, port, database='erp5', user='user',
+      test_database='test_erp5', test_user='test_user', template_filename=None,
+      parallel_test_database_amount=100, mysql_conf=None):
+    if mysql_conf is None:
+      mysql_conf = {}
+    backup_directory = self.createBackupDirectory('mysql')
+    if template_filename is None:
+      template_filename = self.getTemplateFilename('my.cnf.in')
+    error_log = os.path.join(self.log_directory, 'mysqld.log')
+    slow_query_log = os.path.join(self.log_directory, 'mysql-slow.log')
+    mysql_conf.update(
+        ip=ip,
+        data_directory=os.path.join(self.data_root_directory,
+          'mysql'),
+        tcp_port=port,
+        pid_file=os.path.join(self.run_directory, 'mysqld.pid'),
+        socket=os.path.join(self.run_directory, 'mysqld.sock'),
+        error_log=error_log,
+        slow_query_log=slow_query_log,
+        mysql_database=database,
+        mysql_user=user,
+        mysql_password=self.generatePassword(),
+        mysql_test_password=self.generatePassword(),
+        mysql_test_database=test_database,
+        mysql_test_user=test_user,
+        mysql_parallel_test_dict=[
+            ('test_%i' % x,)*2 + (self.generatePassword(),) \
+                 for x in xrange(0,parallel_test_database_amount)],
+    )
+    self.registerLogRotation('mysql', [error_log, slow_query_log],
+        '%(mysql_binary)s --no-defaults -B --user=root '
+        '--socket=%(mysql_socket)s -e "FLUSH LOGS"' % dict(
+          mysql_binary=self.options['mysql_binary'],
+          mysql_socket=mysql_conf['socket']))
+    self._createDirectory(mysql_conf['data_directory'])
+
+    mysql_conf_path = self.createConfigurationFile("my.cnf",
+        self.substituteTemplate(template_filename,
+          mysql_conf))
+
+    mysql_script_list = []
+    for x_database, x_user, x_password in \
+          [(mysql_conf['mysql_database'],
+            mysql_conf['mysql_user'],
+            mysql_conf['mysql_password']),
+           (mysql_conf['mysql_test_database'],
+            mysql_conf['mysql_test_user'],
+            mysql_conf['mysql_test_password']),
+          ] + mysql_conf['mysql_parallel_test_dict']:
+      mysql_script_list.append(pkg_resources.resource_string(__name__,
+                     'template/initmysql.sql.in') % {
+                        'mysql_database': x_database,
+                        'mysql_user': x_user,
+                        'mysql_password': x_password})
+    mysql_script_list.append('EXIT')
+    mysql_script = '\n'.join(mysql_script_list)
+    self.path_list.extend(zc.buildout.easy_install.scripts([('mysql_update',
+      __name__ + '.mysql', 'updateMysql')], self.ws,
+      sys.executable, self.wrapper_directory, arguments=[dict(
+        mysql_script=mysql_script,
+        mysql_binary=self.options['mysql_binary'].strip(),
+        mysql_upgrade_binary=self.options['mysql_upgrade_binary'].strip(),
+        socket=mysql_conf['socket'],
+        )]))
+    self.path_list.extend(zc.buildout.easy_install.scripts([('mysqld',
+      __name__ + '.mysql', 'runMysql')], self.ws,
+        sys.executable, self.wrapper_directory, arguments=[dict(
+        mysql_install_binary=self.options['mysql_install_binary'].strip(),
+        mysqld_binary=self.options['mysqld_binary'].strip(),
+        data_directory=mysql_conf['data_directory'].strip(),
+        mysql_binary=self.options['mysql_binary'].strip(),
+        socket=mysql_conf['socket'].strip(),
+        configuration_file=mysql_conf_path,
+       )]))
+    self.path_list.extend([mysql_conf_path])
+
+    # backup configuration
+    backup_directory = self.createBackupDirectory('mysql')
+    full_backup = os.path.join(backup_directory, 'full')
+    incremental_backup = os.path.join(backup_directory, 'incremental')
+    self._createDirectory(full_backup)
+    self._createDirectory(incremental_backup)
+    innobackupex_argument_list = [self.options['perl_binary'],
+        self.options['innobackupex_binary'],
+        '--defaults-file=%s' % mysql_conf_path,
+        '--socket=%s' %mysql_conf['socket'].strip(), '--user=root',
+        '--ibbackup=%s'% self.options['xtrabackup_binary']]
+    environment = dict(PATH='%s' % self.bin_directory)
+    innobackupex_incremental = zc.buildout.easy_install.scripts([(
+      'innobackupex_incremental','slapos.recipe.librecipe.execute', 'executee')],
+      self.ws, sys.executable, self.bin_directory, arguments=[
+        innobackupex_argument_list + ['--incremental'],
+        environment])[0]
+    self.path_list.append(innobackupex_incremental)
+    innobackupex_full = zc.buildout.easy_install.scripts([('innobackupex_full',
+     'slapos.recipe.librecipe.execute', 'executee')], self.ws,
+      sys.executable, self.bin_directory, arguments=[
+        innobackupex_argument_list,
+        environment])[0]
+    self.path_list.append(innobackupex_full)
+    backup_controller = zc.buildout.easy_install.scripts([
+      ('innobackupex_controller', __name__ + '.innobackupex', 'controller')],
+      self.ws, sys.executable, self.bin_directory,
+      arguments=[innobackupex_incremental, innobackupex_full, full_backup,
+        incremental_backup])[0]
+    self.path_list.append(backup_controller)
+    mysql_backup_cron = os.path.join(self.cron_d, 'mysql_backup')
+    open(mysql_backup_cron, 'w').write('0 0 * * * ' + backup_controller)
+    self.path_list.append(mysql_backup_cron)
+    # The return could be more explicit database, user ...
+    return mysql_conf
+
diff --git a/slapos/recipe/pulse2/apache.py b/slapos/recipe/pulse2/apache.py
new file mode 100644
index 0000000000000000000000000000000000000000..861f787d09fed9c80b38f561528fbd86b5c7ad44
--- /dev/null
+++ b/slapos/recipe/pulse2/apache.py
@@ -0,0 +1,22 @@
+import os
+import sys
+import time
+
+
+def runApache(args):
+  sleep = 60
+  conf = args[0]
+  while True:
+    ready = True
+    for f in conf.get('required_path_list', []):
+      if not os.path.exists(f):
+        print 'File %r does not exists, sleeping for %s' % (f, sleep)
+        ready = False
+    if ready:
+      break
+    time.sleep(sleep)
+  apache_wrapper_list = [conf['binary'], '-f', conf['config'], '-DFOREGROUND']
+  apache_wrapper_list.extend(sys.argv[1:])
+  sys.stdout.flush()
+  sys.stderr.flush()
+  os.execl(apache_wrapper_list[0], *apache_wrapper_list)
diff --git a/slapos/recipe/pulse2/innobackupex.py b/slapos/recipe/pulse2/innobackupex.py
new file mode 100644
index 0000000000000000000000000000000000000000..246f4174b35fe7ab4451b35052841ebdd67e4019
--- /dev/null
+++ b/slapos/recipe/pulse2/innobackupex.py
@@ -0,0 +1,25 @@
+import os
+import glob
+def controller(args):
+  """Creates full or incremental backup
+
+  If no full backup is done, it is created
+
+  If full backup exists incremental backup is done starting with base
+
+  base is the newest (according to date) full or incremental backup
+  """
+  innobackupex_incremental, innobackupex_full, full_backup, incremental_backup \
+      = args
+  if len(os.listdir(full_backup)) == 0:
+    print 'Doing full backup in %r' % full_backup
+    os.execv(innobackupex_full, [innobackupex_full, full_backup])
+  else:
+    backup_list = filter(os.path.isdir, glob.glob(full_backup + "/*") +
+      glob.glob(incremental_backup + "/*"))
+    backup_list.sort(key=lambda x: os.path.getmtime(x), reverse=True)
+    base = backup_list[0]
+    print 'Doing incremental backup in %r using %r as a base' % (
+        incremental_backup, base)
+    os.execv(innobackupex_incremental, [innobackupex_incremental,
+      '--incremental-basedir=%s'%base, incremental_backup])
diff --git a/slapos/recipe/pulse2/mysql.py b/slapos/recipe/pulse2/mysql.py
new file mode 100644
index 0000000000000000000000000000000000000000..e2036076a611cd308755a93f77c763ba91e3fb73
--- /dev/null
+++ b/slapos/recipe/pulse2/mysql.py
@@ -0,0 +1,71 @@
+import os
+import subprocess
+import time
+import sys
+
+
+def runMysql(args):
+  sleep = 60
+  conf = args[0]
+  mysqld_wrapper_list = [conf['mysqld_binary'], '--defaults-file=%s' %
+      conf['configuration_file']]
+  # we trust mysql_install that if mysql directory is available mysql was
+  # correctly initalised
+  if not os.path.isdir(os.path.join(conf['data_directory'], 'mysql')):
+    while True:
+      # XXX: Protect with proper root password
+      # XXX: Follow http://dev.mysql.com/doc/refman/5.0/en/default-privileges.html
+      popen = subprocess.Popen([conf['mysql_install_binary'],
+        '--skip-name-resolve', '--no-defaults', '--datadir=%s' %
+        conf['data_directory']],
+        stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+      result = popen.communicate()[0]
+      if popen.returncode is None or popen.returncode != 0:
+        print "Failed to initialise server.\nThe error was: %s" % result
+        print "Waiting for %ss and retrying" % sleep
+        time.sleep(sleep)
+      else:
+        print "Mysql properly initialised"
+        break
+  else:
+    print "MySQL already initialised"
+  print "Starting %r" % mysqld_wrapper_list[0]
+  sys.stdout.flush()
+  sys.stderr.flush()
+  os.execl(mysqld_wrapper_list[0], *mysqld_wrapper_list)
+
+
+def updateMysql(args):
+  conf = args[0]
+  sleep = 30
+  is_succeed = False
+  while True:
+    if not is_succeed:
+      mysql_upgrade_list = [conf['mysql_upgrade_binary'], '--no-defaults', '--user=root', '--socket=%s' % conf['socket']]
+      mysql_upgrade = subprocess.Popen(mysql_upgrade_list, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+      result = mysql_upgrade.communicate()[0]
+      if mysql_upgrade.returncode is None:
+        mysql_upgrade.kill()
+      if mysql_upgrade.returncode != 0 and not 'is already upgraded' in result:
+        print "Command %r failed with result:\n%s" % (mysql_upgrade_list, result)
+        print 'Sleeping for %ss and retrying' % sleep
+      else:
+        if mysql_upgrade.returncode == 0:
+          print "MySQL database upgraded with result:\n%s" % result
+        else:
+          print "No need to upgrade MySQL database"
+        mysql_list = [conf['mysql_binary'].strip(), '--no-defaults', '-B', '--user=root', '--socket=%s' % conf['socket']]
+        mysql = subprocess.Popen(mysql_list, stdin=subprocess.PIPE,
+            stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+        result = mysql.communicate(conf['mysql_script'])[0]
+        if mysql.returncode is None:
+          mysql.kill()
+        if mysql.returncode != 0:
+          print 'Command %r failed with:\n%s' % (mysql_list, result)
+          print 'Sleeping for %ss and retrying' % sleep
+        else:
+          is_succeed = True
+          print 'SlapOS initialisation script succesfully applied on database.'
+    sys.stdout.flush()
+    sys.stderr.flush()
+    time.sleep(sleep)
diff --git a/slapos/recipe/pulse2/template/apache.in.in b/slapos/recipe/pulse2/template/apache.in.in
new file mode 100644
index 0000000000000000000000000000000000000000..3a8a8c7f6b1dfbef5f6617ffaed3305351db6585
--- /dev/null
+++ b/slapos/recipe/pulse2/template/apache.in.in
@@ -0,0 +1,58 @@
+# Apache static configuration
+# Automatically generated
+
+# Basic server configuration
+PidFile "%(pid_file)s"
+LockFile "%(lock_file)s"
+Listen %(ip)s:%(port)s
+PHPINIDir %(php_ini_dir)s
+ServerAdmin someone@email
+DefaultType text/plain
+TypesConfig conf/mime.types
+AddType application/x-compress .Z
+AddType application/x-gzip .gz .tgz
+AddType application/x-httpd-php .php .phtml .php5 .php4
+AddType application/x-httpd-php-source .phps
+
+# Log configuration
+ErrorLog "%(error_log)s"
+LogLevel warn
+LogFormat "%%h %%{REMOTE_USER}i %%l %%u %%t \"%%r\" %%>s %%b \"%%{Referer}i\" \"%%{User-Agent}i\"" combined
+LogFormat "%%h %%{REMOTE_USER}i %%l %%u %%t \"%%r\" %%>s %%b" common
+CustomLog "%(access_log)s" common
+
+# Directory protection
+<Directory />
+    Options FollowSymLinks
+    AllowOverride None
+    Order deny,allow
+    Deny from all
+</Directory>
+
+Alias /mmc %(document_root)s
+### Allow access to lmc web directory to everyone 
+<Directory %(document_root)s>
+  AllowOverride None
+  Order allow,deny
+  allow from all
+  php_flag short_open_tag on
+  php_flag magic_quotes_gpc on
+</Directory>
+DocumentRoot %(document_root)s
+DirectoryIndex index.html index.php
+
+# List of modules
+LoadModule authz_host_module modules/mod_authz_host.so
+LoadModule log_config_module modules/mod_log_config.so
+LoadModule setenvif_module modules/mod_setenvif.so
+LoadModule version_module modules/mod_version.so
+LoadModule proxy_module modules/mod_proxy.so
+LoadModule proxy_http_module modules/mod_proxy_http.so
+LoadModule mime_module modules/mod_mime.so
+LoadModule dav_module modules/mod_dav.so
+LoadModule dav_fs_module modules/mod_dav_fs.so
+LoadModule negotiation_module modules/mod_negotiation.so
+LoadModule rewrite_module modules/mod_rewrite.so
+LoadModule headers_module modules/mod_headers.so
+LoadModule dir_module modules/mod_dir.so
+LoadModule php5_module modules/libphp5.so
diff --git a/slapos/recipe/pulse2/template/logrotate_entry.in b/slapos/recipe/pulse2/template/logrotate_entry.in
new file mode 100644
index 0000000000000000000000000000000000000000..bfa2abf0970af28f8cab98793db9b09db85d1847
--- /dev/null
+++ b/slapos/recipe/pulse2/template/logrotate_entry.in
@@ -0,0 +1,13 @@
+%(file_list)s {
+  daily
+  dateext
+  rotate 30
+  compress
+  notifempty
+  sharedscripts
+  create
+  postrotate
+    %(postrotate)s
+  endscript
+  olddir %(olddir)s
+}
diff --git a/slapos/recipe/pulse2/template/mmc-core.in b/slapos/recipe/pulse2/template/mmc-core.in
new file mode 100644
index 0000000000000000000000000000000000000000..2d29b6a828f75bf792c99e2ac89678241d1e472f
--- /dev/null
+++ b/slapos/recipe/pulse2/template/mmc-core.in
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec %(mmc_core_binary)s -f %(mmc_core_config_file)s
diff --git a/slapos/recipe/pulse2/template/mmc_conf/agent/config.ini b/slapos/recipe/pulse2/template/mmc_conf/agent/config.ini
new file mode 100644
index 0000000000000000000000000000000000000000..65d4535d886c26e984f6f7eebcd4773db77f18c9
--- /dev/null
+++ b/slapos/recipe/pulse2/template/mmc_conf/agent/config.ini
@@ -0,0 +1,59 @@
+[main]
+host = %(mmc_host)s
+port = %(mmc_port)s
+# Credentials for HTTP basic authentication
+login = mmc
+password = s3cr3t
+# RPC Session timeout in seconds.
+# If unset default to Twisted hardcoded 900 seconds.
+#sessiontimeout = 900
+# Multi-threading support (enabled by default)
+#multithreading = 1
+#maxthreads = 20
+# SSL support
+enablessl = 1
+localcert = %(ssl_localcert)s
+cacert = %(ssl_cacert)s
+# Certificate check
+# verifypeer = 0
+# Path to the file containing the Certificate Authority (PEM format)
+# cacert =
+# Path to the file containing the local key and certificate (PEM format)
+# localcert =
+
+[daemon]
+user = %(daemon_user)s
+group = %(daemon_user)s
+umask = 0077
+pidfile= %(daemon_pidfile)s
+# user = mmc
+# group = mmc
+# umask = 0007
+# pidfile= /var/run/mmc-agent.pid
+
+[loggers]
+keys=root
+
+[handlers]
+keys=hand01,hand02
+
+[formatters]
+keys=form01
+
+[logger_root]
+level=NOTSET
+handlers=hand01
+
+[handler_hand01]
+class=FileHandler
+level=INFO
+formatter=form01
+args=("%s" % %(mmc_log)s,)
+
+[handler_hand02]
+class=StreamHandler
+level=DEBUG
+args=(sys.stderr,)
+
+[formatter_form01]
+format=%(asctime)s #%(thread)d %(levelname)s %(message)s
diff --git a/slapos/recipe/pulse2/template/mmc_conf/agent/config.ini.in b/slapos/recipe/pulse2/template/mmc_conf/agent/config.ini.in
new file mode 100644
index 0000000000000000000000000000000000000000..65d4535d886c26e984f6f7eebcd4773db77f18c9
--- /dev/null
+++ b/slapos/recipe/pulse2/template/mmc_conf/agent/config.ini.in
@@ -0,0 +1,59 @@
+[main]
+host = %(mmc_host)s
+port = %(mmc_port)s
+# Credentials for HTTP basic authentication
+login = mmc
+password = s3cr3t
+# RPC Session timeout in seconds.
+# If unset default to Twisted hardcoded 900 seconds.
+#sessiontimeout = 900
+# Multi-threading support (enabled by default)
+#multithreading = 1
+#maxthreads = 20
+# SSL support
+enablessl = 1
+localcert = %(ssl_localcert)s
+cacert = %(ssl_cacert)s
+# Certificate check
+# verifypeer = 0
+# Path to the file containing the Certificate Authority (PEM format)
+# cacert =
+# Path to the file containing the local key and certificate (PEM format)
+# localcert =
+
+[daemon]
+user = %(daemon_user)s
+group = %(daemon_user)s
+umask = 0077
+pidfile= %(daemon_pidfile)s
+# user = mmc
+# group = mmc
+# umask = 0007
+# pidfile= /var/run/mmc-agent.pid
+
+[loggers]
+keys=root
+
+[handlers]
+keys=hand01,hand02
+
+[formatters]
+keys=form01
+
+[logger_root]
+level=NOTSET
+handlers=hand01
+
+[handler_hand01]
+class=FileHandler
+level=INFO
+formatter=form01
+args=("%s" % %(mmc_log)s,)
+
+[handler_hand02]
+class=StreamHandler
+level=DEBUG
+args=(sys.stderr,)
+
+[formatter_form01]
+format=%(asctime)s #%(thread)d %(levelname)s %(message)s
diff --git a/slapos/recipe/pulse2/template/mmc_conf/agent/keys/cacert.pem b/slapos/recipe/pulse2/template/mmc_conf/agent/keys/cacert.pem
new file mode 100644
index 0000000000000000000000000000000000000000..11791e682caeaccdabc55812d2cf220e72928b69
--- /dev/null
+++ b/slapos/recipe/pulse2/template/mmc_conf/agent/keys/cacert.pem
@@ -0,0 +1,16 @@
+-----BEGIN CERTIFICATE-----
+MIICmjCCAkSgAwIBAgIJALq48auj/cmmMA0GCSqGSIb3DQEBBAUAMGkxCzAJBgNV
+BAYTAkZSMQswCQYDVQQIEwJOQTENMAsGA1UEBxMETWV0ejEPMA0GA1UEChMGTGlu
+Ym94MQ0wCwYDVQQDEwRjZXJ0MR4wHAYJKoZIhvcNAQkBFg9pbmZvQGxpbmJveC5j
+b20wHhcNMDUwODAyMTI1NjA1WhcNMDgwNDI4MTI1NjA1WjBpMQswCQYDVQQGEwJG
+UjELMAkGA1UECBMCTkExDTALBgNVBAcTBE1ldHoxDzANBgNVBAoTBkxpbmJveDEN
+MAsGA1UEAxMEY2VydDEeMBwGCSqGSIb3DQEJARYPaW5mb0BsaW5ib3guY29tMFww
+DQYJKoZIhvcNAQEBBQADSwAwSAJBALsvk/6SKwimAloa2gitTn2AsUIZs0FT1XvM
+LYWiaqQe5XK5n08F9C3ClLU79UxEuh47su3mxKjakwZSDvptNU8CAwEAAaOBzjCB
+yzAdBgNVHQ4EFgQUJ8QwuXYP+uu6tWjtl4y6j/6CiR0wgZsGA1UdIwSBkzCBkIAU
+J8QwuXYP+uu6tWjtl4y6j/6CiR2hbaRrMGkxCzAJBgNVBAYTAkZSMQswCQYDVQQI
+EwJOQTENMAsGA1UEBxMETWV0ejEPMA0GA1UEChMGTGluYm94MQ0wCwYDVQQDEwRj
+ZXJ0MR4wHAYJKoZIhvcNAQkBFg9pbmZvQGxpbmJveC5jb22CCQC6uPGro/3JpjAM
+BgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA0EAfKZ53wZqWetaf6XN06PdUUyb
+orjbJtFQJQYBoXpqfrTH78Sna+uaCRlC+4BBAPx6Tz7ZoWqHt84GBf1WIXOscA==
+-----END CERTIFICATE-----
diff --git a/slapos/recipe/pulse2/template/mmc_conf/agent/keys/localcert.pem b/slapos/recipe/pulse2/template/mmc_conf/agent/keys/localcert.pem
new file mode 100644
index 0000000000000000000000000000000000000000..aaa698fa09d901d5b914454d1c004f04dd5ac7a1
--- /dev/null
+++ b/slapos/recipe/pulse2/template/mmc_conf/agent/keys/localcert.pem
@@ -0,0 +1,9 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIBOwIBAAJBALsvk/6SKwimAloa2gitTn2AsUIZs0FT1XvMLYWiaqQe5XK5n08F
+9C3ClLU79UxEuh47su3mxKjakwZSDvptNU8CAwEAAQJAC+eSufYB1qL4M1LR2wtq
+moC8xT9tLxJt2Vm662zQ628PhbzdaJBFGlHpC5jdsw/J1r56D+eVTOiVrMKKd3Lk
+gQIhAPjir/qwx0ssVfiW1xioj33tR3Dxpd8pYPTKZBWuknXZAiEAwIlhZ1sSFulo
+eOTJgvhga3PClKI7qcRlUEVAkfzoQ2cCIGKWKO88pzT30vYtifaSjoRrQSlUD0he
+s7FDmnGcPRfBAiEAp39co4PQ6unHn1S6EhxuFUyxvIieiwR2dyyoDdkNXoUCIQCD
+KeWLYFVEXcNqdgC2tjIzbBR03UQXt3eFrovjeox1pA==
+-----END RSA PRIVATE KEY-----
diff --git a/slapos/recipe/pulse2/template/mmc_conf/mmc.ini.in b/slapos/recipe/pulse2/template/mmc_conf/mmc.ini.in
new file mode 100644
index 0000000000000000000000000000000000000000..31fb453381171248087a02165da8bbafe22bf047
--- /dev/null
+++ b/slapos/recipe/pulse2/template/mmc_conf/mmc.ini.in
@@ -0,0 +1,53 @@
+[global]
+; RPC backend to use
+backend = xmlrpc
+
+; HTTP basic authentication credentials to use for XMLRPC communication
+login = mmc
+password = s3cr3t
+
+; Root URL where the MMC web pages are installed
+; root= /mmc/ for http://127.0.0.1/mmc/
+root = /mmc/
+
+; Filesystem path where the MMC web modules are installed
+rootfsmodules = %(mmc_location)s/modules/
+
+; Available pagination steps
+pagination = 10 20 50 100
+
+; Number of items to display in lists
+maxperpage = 10
+
+; Declare if this installation is a community version or not
+; community can be yes or no
+community = yes
+
+; Debug section
+[debug]
+; 0 : no information
+; 1 : XMLRPC calls and results are displayed by the web interface
+level = 0
+
+; Login page title
+; UTF-8 strings must be used
+[logintitle]
+; Default page title for English and non-translated languages
+C =
+; French title
+fr_FR =
+; Spanish title
+es_ES =
+
+[server_01]
+description = localhost
+url = https://127.0.0.1:7080
+; Timeout in seconds for all socket I/O operations
+; Beware that timeout on a SSL socket only works with PHP >= 5.2.1
+; timeout = 300
+; SSL certificate check support
+; verifypeer = 0
+; Path to the file containing the Certificate Authority (PEM format)
+; cacert =
+; Path to the file containing the local key and certificate (PEM format)
+; localcert =
diff --git a/slapos/recipe/pulse2/template/mmc_conf/plugins/base.ini b/slapos/recipe/pulse2/template/mmc_conf/plugins/base.ini
new file mode 100644
index 0000000000000000000000000000000000000000..ef41ad69049d1b07f56ea75723f072223a70dec5
--- /dev/null
+++ b/slapos/recipe/pulse2/template/mmc_conf/plugins/base.ini
@@ -0,0 +1,190 @@
+[ldap]
+# LDAP we are connected to
+# If ldapurl starts with "ldaps://", use LDAP over SSL on the LDAPS port.
+# LDAPS is deprecated, and you should use StartTLS.
+# If ldapverifypeer = demand, always use the server hostname instead of its IP
+# address in the LDAP URL. This hostname must match the CN field of the server
+# certificate.
+ldapurl = ldap://%(ldap_host)s:%(ldap_port)s
+# Network timeout in seconds for LDAP operations. No default timeout set.
+#network_timeout =
+# TLS connection parameters when LDAPS is not used:
+#  off - never use TLS (default value)
+#  start_tls - Use the LDAPv3 StartTLS extended operation (better)
+#start_tls = off
+# If start_tls != off or LDAPS, specify check to perform on server certificate:
+#  never - don't ask certificate
+#  demand - request certificate. If none or bad certificate provided, stop the
+#           connection (recommended)
+#ldapverifypeer = demand
+# Client certicates to use (default are empty) for LDAPS or TLS connections:
+# For example: /etc/ssl/certs
+#cacertdir =
+# For example: /etc/mmc/certs/demoCA/cacert.pem
+#cacert =
+# For example: /etc/mmc/certs/client.cert
+#localcert =
+# For example: /etc/mmc/certs/client.key
+#localkey =
+# Accepted ciphers
+# Use this for more security: TLSv1+SHA1+AES+DH:CAMELLIA:!NULL:!ADH
+#ciphersuites = TLSv1:!NULL
+# LDAP debug level - set this to 255 to debug LDAP connection problems
+#ldapdebuglevel = 0
+# LDAP base DN
+baseDN = dc=mandriva, dc=com
+# Users location in the LDAP
+baseUsersDN = ou=Users, %%(basedn)s
+# Groups location in the LDAP
+baseGroupsDN = ou=Groups, %%(basedn)s
+# LDAP manager
+rootName = cn=admin, %%(basedn)s
+password = secret
+# If enabled, the MMC will create/move/delete the home of the users
+# Else will do nothing, but only write user informations into LDAP
+userHomeAction = 1
+# Skeleton directory to populate a new home directory
+skelDir = /etc/skel
+# If set, all new users will belong to this group when created
+defaultUserGroup = Domain Users
+# Default home directory for users
+defaultHomeDir = /home
+# user uid number start
+uidStart = 10000
+# group gid number start
+gidStart = 10000
+# LDAP log file path
+logfile = %(ldap_logfile_path)s
+# FDS log file path
+# logfile = /opt/fedora-ds/slapd-hostname/logs/access
+
+# you can specify here where you can authorized creation of your homedir
+# default is your defaultHomeDir
+# example:
+# authorizedHomeDir = /home, /home2, /mnt/depot/newhome
+
+# LDAP user password scheme to use
+# Possible values are "ssha", "crypt" and "passmod"
+# "passmod" uses the LDAP Password Modify Extended Operations to change
+# password. The password encryption is done by the LDAP server.
+passwordscheme = passmod
+
+#[backup-tools]
+## Path of the backup tools
+#path = /usr/lib/mmc/backup-tools
+## Where are put the archives
+#destpath = /home/archives
+
+# Computer inventory plugin to use (Pulse 2 related option)
+# [computers]
+# method = glpi
+# method = inventory
+
+# Audit system configuration
+# If commented, the audit module will be disabled
+# [audit]
+# method = database
+# dbhost = localhost
+# MySQL and PostgreSQL backends are available
+# dbdriver = postgres
+# dbport = 5432
+# dbdriver = mysql
+# dbport = 3306
+# dbuser = audit
+# dbpassword = audit
+# dbname = audit
+
+# User authentication configuration
+#[authentication]
+# Authenticators chain
+#method = baseldap externalldap
+
+# baseldap authenticator configuration
+#[authentication_baseldap]
+# Set a list of login that will only be authentified using this authenticator
+#authonly = root
+
+# Externalldap authenticator configuration
+#[authentication_externalldap]
+# Login list that won't be authenticated with this authenticator.
+#exclude =
+# If set, only the speficied logins will be authenticated with this
+# authenticator.
+#authonly =
+# Set whether this authenticator is mandatory. If it is mandatory and can't be
+# validated during the mmc-agent activation phase, the mmc-agent exits with an
+# error.
+#mandatory = True
+# LDAP server URLs. The LDAP server are selected in the given order when
+# authenticating a user.
+#ldapurl = ldap://192.168.0.1:389 ldap://192.168.0.2:389
+# LDAP connection timeout in seconds. If the LDAP connection failed after this
+# timeout, we try the next LDAP server in the list or give up if it the last.
+#network_timeout =
+# LDAP suffix where to search for user
+#suffix = cn=Users,dc=mandriva,dc=com
+# How to bind to the LDAP. Empty if anonymous
+#bindname = cn=account, cn=Users, dc=linboxad, dc=com
+#bindpasswd = s3cr3t
+#bindname =
+#bindpasswd =
+# User filter
+#filter = objectClass=*
+# User attribute containing her/his login
+#attr = cn
+
+# User provisioning configuration
+#[provisioning]
+#method = externalldap
+
+# externalldap provisioner configuration
+#[provisioning_externalldap]
+# Login list that won't be provisioned with this provisioner
+#exclude = root
+# These attributes are mandatory to create a user
+#ldap_uid = cn
+#ldap_givenName = sn
+#ldap_sn = sn
+# Other attributes to fill in
+#ldap_mail = mail
+#...
+# We are able to fill the ACL fields the user logs in according to the value of
+# an attribute from the external LDAP.
+# What is the field name ?
+#profile_attr =
+# Here we define two profiles: profile1 and profile2
+# profile1 allows the user to log in and change her/his password in the web
+# interface
+#profile_acl_profile1= :base#users#passwd/
+# profile2 disallows the user to do anything (no ACL defined)
+#profile_acl_profile2 =
+# ... You can define as much profile_acl_* options as you need
+# For each profile, we can create a group of user, and put users with a given
+# profile in the corresponding group automatically when they log in.
+# Set the next line to True to activate profile to group mapping
+#profile_group_mapping = False
+# A prefix for the created group can be set
+#profile_group_prefix =
+
+# Example userdefault settings to support Kerberos
+# [userdefault]
+# objectClass = +krb5KDCEntry,krb5Principal
+# krb5KeyVersionNumber = 1
+# krb5KDCFlags = 126
+# krb5PrincipalName = %uid%@DOMAIN
+
+# Subscription informations
+# [subscription]
+# product_name = MDS
+# vendor_name = Mandriva
+# vendor_mail = sales@mandriva.com
+# customer_name =
+# customer_mail =
+# comment =
+# users = 0
+# computers = 0
+# # Support informations
+# support_mail = customer@customercare.mandriva.com
+# support_phone = 0810 LINBOX
+# support_comment =
+
diff --git a/slapos/recipe/pulse2/template/mmc_conf/plugins/base.ini.in b/slapos/recipe/pulse2/template/mmc_conf/plugins/base.ini.in
new file mode 100644
index 0000000000000000000000000000000000000000..ef41ad69049d1b07f56ea75723f072223a70dec5
--- /dev/null
+++ b/slapos/recipe/pulse2/template/mmc_conf/plugins/base.ini.in
@@ -0,0 +1,190 @@
+[ldap]
+# LDAP we are connected to
+# If ldapurl starts with "ldaps://", use LDAP over SSL on the LDAPS port.
+# LDAPS is deprecated, and you should use StartTLS.
+# If ldapverifypeer = demand, always use the server hostname instead of its IP
+# address in the LDAP URL. This hostname must match the CN field of the server
+# certificate.
+ldapurl = ldap://%(ldap_host)s:%(ldap_port)s
+# Network timeout in seconds for LDAP operations. No default timeout set.
+#network_timeout =
+# TLS connection parameters when LDAPS is not used:
+#  off - never use TLS (default value)
+#  start_tls - Use the LDAPv3 StartTLS extended operation (better)
+#start_tls = off
+# If start_tls != off or LDAPS, specify check to perform on server certificate:
+#  never - don't ask certificate
+#  demand - request certificate. If none or bad certificate provided, stop the
+#           connection (recommended)
+#ldapverifypeer = demand
+# Client certicates to use (default are empty) for LDAPS or TLS connections:
+# For example: /etc/ssl/certs
+#cacertdir =
+# For example: /etc/mmc/certs/demoCA/cacert.pem
+#cacert =
+# For example: /etc/mmc/certs/client.cert
+#localcert =
+# For example: /etc/mmc/certs/client.key
+#localkey =
+# Accepted ciphers
+# Use this for more security: TLSv1+SHA1+AES+DH:CAMELLIA:!NULL:!ADH
+#ciphersuites = TLSv1:!NULL
+# LDAP debug level - set this to 255 to debug LDAP connection problems
+#ldapdebuglevel = 0
+# LDAP base DN
+baseDN = dc=mandriva, dc=com
+# Users location in the LDAP
+baseUsersDN = ou=Users, %%(basedn)s
+# Groups location in the LDAP
+baseGroupsDN = ou=Groups, %%(basedn)s
+# LDAP manager
+rootName = cn=admin, %%(basedn)s
+password = secret
+# If enabled, the MMC will create/move/delete the home of the users
+# Else will do nothing, but only write user informations into LDAP
+userHomeAction = 1
+# Skeleton directory to populate a new home directory
+skelDir = /etc/skel
+# If set, all new users will belong to this group when created
+defaultUserGroup = Domain Users
+# Default home directory for users
+defaultHomeDir = /home
+# user uid number start
+uidStart = 10000
+# group gid number start
+gidStart = 10000
+# LDAP log file path
+logfile = %(ldap_logfile_path)s
+# FDS log file path
+# logfile = /opt/fedora-ds/slapd-hostname/logs/access
+
+# you can specify here where you can authorized creation of your homedir
+# default is your defaultHomeDir
+# example:
+# authorizedHomeDir = /home, /home2, /mnt/depot/newhome
+
+# LDAP user password scheme to use
+# Possible values are "ssha", "crypt" and "passmod"
+# "passmod" uses the LDAP Password Modify Extended Operations to change
+# password. The password encryption is done by the LDAP server.
+passwordscheme = passmod
+
+#[backup-tools]
+## Path of the backup tools
+#path = /usr/lib/mmc/backup-tools
+## Where are put the archives
+#destpath = /home/archives
+
+# Computer inventory plugin to use (Pulse 2 related option)
+# [computers]
+# method = glpi
+# method = inventory
+
+# Audit system configuration
+# If commented, the audit module will be disabled
+# [audit]
+# method = database
+# dbhost = localhost
+# MySQL and PostgreSQL backends are available
+# dbdriver = postgres
+# dbport = 5432
+# dbdriver = mysql
+# dbport = 3306
+# dbuser = audit
+# dbpassword = audit
+# dbname = audit
+
+# User authentication configuration
+#[authentication]
+# Authenticators chain
+#method = baseldap externalldap
+
+# baseldap authenticator configuration
+#[authentication_baseldap]
+# Set a list of login that will only be authentified using this authenticator
+#authonly = root
+
+# Externalldap authenticator configuration
+#[authentication_externalldap]
+# Login list that won't be authenticated with this authenticator.
+#exclude =
+# If set, only the speficied logins will be authenticated with this
+# authenticator.
+#authonly =
+# Set whether this authenticator is mandatory. If it is mandatory and can't be
+# validated during the mmc-agent activation phase, the mmc-agent exits with an
+# error.
+#mandatory = True
+# LDAP server URLs. The LDAP server are selected in the given order when
+# authenticating a user.
+#ldapurl = ldap://192.168.0.1:389 ldap://192.168.0.2:389
+# LDAP connection timeout in seconds. If the LDAP connection failed after this
+# timeout, we try the next LDAP server in the list or give up if it the last.
+#network_timeout =
+# LDAP suffix where to search for user
+#suffix = cn=Users,dc=mandriva,dc=com
+# How to bind to the LDAP. Empty if anonymous
+#bindname = cn=account, cn=Users, dc=linboxad, dc=com
+#bindpasswd = s3cr3t
+#bindname =
+#bindpasswd =
+# User filter
+#filter = objectClass=*
+# User attribute containing her/his login
+#attr = cn
+
+# User provisioning configuration
+#[provisioning]
+#method = externalldap
+
+# externalldap provisioner configuration
+#[provisioning_externalldap]
+# Login list that won't be provisioned with this provisioner
+#exclude = root
+# These attributes are mandatory to create a user
+#ldap_uid = cn
+#ldap_givenName = sn
+#ldap_sn = sn
+# Other attributes to fill in
+#ldap_mail = mail
+#...
+# We are able to fill the ACL fields the user logs in according to the value of
+# an attribute from the external LDAP.
+# What is the field name ?
+#profile_attr =
+# Here we define two profiles: profile1 and profile2
+# profile1 allows the user to log in and change her/his password in the web
+# interface
+#profile_acl_profile1= :base#users#passwd/
+# profile2 disallows the user to do anything (no ACL defined)
+#profile_acl_profile2 =
+# ... You can define as much profile_acl_* options as you need
+# For each profile, we can create a group of user, and put users with a given
+# profile in the corresponding group automatically when they log in.
+# Set the next line to True to activate profile to group mapping
+#profile_group_mapping = False
+# A prefix for the created group can be set
+#profile_group_prefix =
+
+# Example userdefault settings to support Kerberos
+# [userdefault]
+# objectClass = +krb5KDCEntry,krb5Principal
+# krb5KeyVersionNumber = 1
+# krb5KDCFlags = 126
+# krb5PrincipalName = %uid%@DOMAIN
+
+# Subscription informations
+# [subscription]
+# product_name = MDS
+# vendor_name = Mandriva
+# vendor_mail = sales@mandriva.com
+# customer_name =
+# customer_mail =
+# comment =
+# users = 0
+# computers = 0
+# # Support informations
+# support_mail = customer@customercare.mandriva.com
+# support_phone = 0810 LINBOX
+# support_comment =
+
diff --git a/slapos/recipe/pulse2/template/mmc_conf/plugins/ppolicy.ini.in b/slapos/recipe/pulse2/template/mmc_conf/plugins/ppolicy.ini.in
new file mode 100644
index 0000000000000000000000000000000000000000..ea4a9f8f6900d4876bdbe579af72286b963de62d
--- /dev/null
+++ b/slapos/recipe/pulse2/template/mmc_conf/plugins/ppolicy.ini.in
@@ -0,0 +1,26 @@
+[main]
+disable = 1
+
+[ppolicy]
+# Branch where the password policies are stored
+ppolicyDN = ou=Password Policies, %(baseDN)s
+# Name of the default password policy
+ppolicyDefault = default
+
+# This options are used only once to create the default password policy entry
+# into the LDAP
+[ppolicyattributes]
+pwdAttribute = userPassword
+pwdLockout = True
+pwdMaxFailure = 5
+pwdLockoutDuration = 900
+# Password can't be change if it not 7 days old
+pwdMinAge = 25200
+# Password expiration is 42 days
+pwdMaxAge = 3628800
+pwdMinLength = 8
+pwdInHistory = 5
+pwdMustChange = True
+# To check password quality
+pwdCheckModule = mmc-check-password.so
+pwdCheckQuality = 2
diff --git a/slapos/recipe/pulse2/template/my.cnf.in b/slapos/recipe/pulse2/template/my.cnf.in
new file mode 100644
index 0000000000000000000000000000000000000000..043fb3ad56bbea3b3e35766a9b019cd8dbf7cc77
--- /dev/null
+++ b/slapos/recipe/pulse2/template/my.cnf.in
@@ -0,0 +1,52 @@
+# ERP5 buildout my.cnf template based on my-huge.cnf shipped with mysql
+# The MySQL server
+[mysqld]
+# ERP5 by default requires InnoDB storage. MySQL by default fallbacks to using
+# different engine, like MyISAM. Such behaviour generates problems only, when
+# tables requested as InnoDB are silently created with MyISAM engine.
+#
+# Loud fail is really required in such case.
+sql-mode="NO_ENGINE_SUBSTITUTION"
+
+skip-show-database
+port = %(tcp_port)s
+bind-address = %(ip)s
+socket = %(socket)s
+datadir = %(data_directory)s
+pid-file = %(pid_file)s
+log-error = %(error_log)s
+log-slow-file = %(slow_query_log)s
+long_query_time = 5
+max_allowed_packet = 128M
+query_cache_size = 32M
+
+plugin-load = ha_innodb_plugin.so
+
+# The following are important to configure and depend a lot on to the size of
+# your database and the available resources.
+#innodb_buffer_pool_size = 4G
+#innodb_log_file_size = 256M
+#innodb_log_buffer_size = 8M
+
+# Some dangerous settings you may want to uncomment if you only want
+# performance or less disk access. Useful for unit tests.
+#innodb_flush_log_at_trx_commit = 0
+#innodb_flush_method = nosync
+#innodb_doublewrite = 0
+#sync_frm = 0
+
+# Uncomment the following if you need binary logging, which is recommended
+# on production instances (either for replication or incremental backups).
+#log-bin=mysql-bin
+
+# Force utf8 usage
+collation_server = utf8_unicode_ci
+character_set_server = utf8
+skip-character-set-client-handshake
+
+[mysql]
+no-auto-rehash
+socket = %(socket)s
+
+[mysqlhotcopy]
+interactive-timeout
diff --git a/slapos/recipe/pulse2/template/mysqlinit.sql.in b/slapos/recipe/pulse2/template/mysqlinit.sql.in
new file mode 100644
index 0000000000000000000000000000000000000000..9189d8d13005b57f36817409f9f873eaec5ef189
--- /dev/null
+++ b/slapos/recipe/pulse2/template/mysqlinit.sql.in
@@ -0,0 +1,7 @@
+CREATE DATABASE IF NOT EXISTS %(database)s;
+GRANT ALL PRIVILEGES ON %(database)s.* TO %(user)s@localhost IDENTIFIED BY %(password)r;
+GRANT ALL PRIVILEGES ON %(database)s.* TO %(user)s@'%%' IDENTIFIED BY %(password)r;
+GRANT SHOW DATABASES ON *.* TO %(user)s@localhost IDENTIFIED BY %(password)r;
+GRANT SHOW DATABASES ON *.* TO %(user)s@'%%' IDENTIFIED BY %(password)r;
+FLUSH PRIVILEGES;
+EXIT
diff --git a/slapos/recipe/pulse2/template/php.ini.in b/slapos/recipe/pulse2/template/php.ini.in
new file mode 100644
index 0000000000000000000000000000000000000000..926ae32262a030d73a9883e8b91b1b41f49d6de6
--- /dev/null
+++ b/slapos/recipe/pulse2/template/php.ini.in
@@ -0,0 +1,11 @@
+[PHP]
+engine = On
+safe_mode = Off
+expose_php = On
+error_reporting = E_ALL | E_STRICT
+display_errors = On
+display_startup_errors = On
+log_errors = On
+log_errors_max_len = 1024
+ignore_repeated_errors = Off
+ignore_repeated_source = Off
diff --git a/slapos/recipe/pulse2/template/pulse2_conf/plugins/dyngroup.ini.in b/slapos/recipe/pulse2/template/pulse2_conf/plugins/dyngroup.ini.in
new file mode 100644
index 0000000000000000000000000000000000000000..2d962546a164d05abd6da5f9817ba61079c872cc
--- /dev/null
+++ b/slapos/recipe/pulse2/template/pulse2_conf/plugins/dyngroup.ini.in
@@ -0,0 +1,34 @@
+[main]
+# Is the plugin disable ?
+disable = 0
+# Are dynamic group enable ?
+dynamic_enable = 1
+# Are profiles enable ?
+# profiles_enable = 0
+
+# Preselected module in the dynamic group creation page
+# default_module = 
+
+# Maximum number of elements in the static group creation list
+# max_elements_for_static_list = 2000
+
+[database]
+dbdriver = mysql
+dbhost = %(mysql_host)s
+dbport = %(mysql_port)s
+dbuser = %(mysql_user)s
+dbpasswd = %(mysql_password)s
+dbname = dyngroup
+# dbsslenable = 0
+# dbsslca =
+# dbsslcert =
+# dbsslkey =
+# Database connection lifetime
+# dbpoolrecycle = 60
+# Database connection pool size
+# dbpoolsize = 5
+
+[querymanager]
+# can we query on group names ?
+activate = 0
+                                                
diff --git a/slapos/recipe/pulse2/template/pulse2_conf/plugins/glpi.ini.in b/slapos/recipe/pulse2/template/pulse2_conf/plugins/glpi.ini.in
new file mode 100644
index 0000000000000000000000000000000000000000..0e05605608bf1aaa80728bdb6dcd1ec801b4b9c1
--- /dev/null
+++ b/slapos/recipe/pulse2/template/pulse2_conf/plugins/glpi.ini.in
@@ -0,0 +1,53 @@
+[main]
+disable = 0
+dbdriver = mysql
+dbhost = %(mysql_host)s
+dbport = %(mysql_port)s
+dbuser = %(mysql_user)s
+dbpasswd = %(mysql_password)s
+dbname = glpi
+# dbsslenable = 0
+# dbsslca =
+# dbsslcert =
+# dbsslkey =
+# Database connection lifetime
+# dbpoolrecycle = 60
+# Database connection pool size
+# dbpoolsize = 5
+
+# Allow users to filter computers list using an entity selector
+localisation = True
+# Accepted GLPI profiles. A user must have her/his GLPI profile in this list
+# else she/he can't display any computers from the GLPI inventory
+# active_profiles = profile1 profile2 profile3
+# Only display computers with the specified state
+# filter_on = state=3
+
+# Give the uri to link to for a computer inventory
+# glpi_computer_uri =
+# should be something like that :
+# glpi_computer_uri = http://localhost/glpi/front/computer.form.php?ID=
+
+# Tell whether the query manager of the dyngroup plugin can use this module
+[querymanager]
+activate = True
+
+# GLPI authentication configuration
+#[authentication_glpi]
+# URL to connect to the GLPI HTTP interface ?
+#baseurl = http://glpi-server/glpi/
+
+# GLPI provisioning configuration
+#[provisioning_glpi]
+# Users that will never be provisioned
+#exclude = root
+# Before provisioning, should we perform a GLPI authentication to create or
+# update the user informations in the GLPI database ?
+#doauth = 1
+# MMC web interface ACLs definition according to the user GLPI profile
+#profile_acl_profile1 = :##:base#main#default
+#profile_acl_profile2 =
+#profile_acl_profile3 =
+# If the user belong to more than one profile, the first profile of this list
+# will be used
+#profiles_order = profile1 profile2 profile3
diff --git a/slapos/recipe/pulse2/template/pulse2_conf/plugins/imaging.ini.in b/slapos/recipe/pulse2/template/pulse2_conf/plugins/imaging.ini.in
new file mode 100644
index 0000000000000000000000000000000000000000..bd48e36e4a98369e15fc9a20c2d26d29fb6ec1d1
--- /dev/null
+++ b/slapos/recipe/pulse2/template/pulse2_conf/plugins/imaging.ini.in
@@ -0,0 +1,35 @@
+[main]
+disable = 0
+
+[database]
+# dbdriver = mysql
+# dbhost = localhost
+# dbport = 3306
+# dbname = imaging
+# dbuser = mmc
+# dbpasswd = mmc
+# dbsslenable = 0
+# dbsslca = /etc/mmc/pulse2/imaging/cacert.pem
+# dbsslcert = /etc/mmc/pulse2/imaging/cert.pem
+# dbsslkey = /etc/mmc/pulse2/imaging/key.pem
+# Database connection lifetime
+# dbpoolrecycle = 60
+# Database connection pool size
+# dbpoolsize = 5
+
+# [web]
+# ##### Interface customization #####
+# user may want to override the way dates are displayed (see http://www.php.net/date for more informations)
+# web_def_date_fmt = "%Y-%m-%d %H:%M:%S"
+# web_def_default_protocol = nfs
+# Menu settings
+# web_def_default_menu_name = Menu
+# web_def_default_timeout = 60
+# web_def_default_background_uri =
+# web_def_default_message = Warning ! Your PC is being backed up or restored. Do not reboot !
+# start options
+# web_def_kernel_parameters = quiet
+# backup/restore options
+# web_def_image_parameters =
+
+
diff --git a/slapos/recipe/pulse2/template/pulse2_conf/plugins/inventory.ini.in b/slapos/recipe/pulse2/template/pulse2_conf/plugins/inventory.ini.in
new file mode 100644
index 0000000000000000000000000000000000000000..0e90816de565095e6b8471920019f8afe4dc7977
--- /dev/null
+++ b/slapos/recipe/pulse2/template/pulse2_conf/plugins/inventory.ini.in
@@ -0,0 +1,73 @@
+[main]
+disable = 0
+displayLocalisationBar = 0
+# Example of software filter when querying a computer inventory.
+# All softwares containing the KB string will be excluded
+# software_filter = %KB%
+
+[inventory]
+dbdriver = mysql
+dbhost = %(mysql_host)s
+dbport = %(mysql_port)s
+dbuser = %(mysql_user)s
+dbpasswd = %(mysql_password)s
+dbname = inventory
+dbsslenable = 0
+dbsslca = %(inventory_ssl_cacert)s
+dbsslcert = %(inventory_ssl_cert)s
+dbsslkey = %(inventory_ssl_key)s
+# Database connection lifetime
+# dbpoolrecycle = 60
+# Database connection pool size
+# dbpoolsize = 5
+
+[computers]
+# display = cn::Computer Name||displayName::Description
+# content = 
+
+[expert_mode]
+Bios = BiosVersion|ChipSerial|BiosVendor|SmbManufacturer|SmbProduct|SmbVersion|SmbSerial|SmbUUID|SmbType|DateFirstSwitchOn
+Network = CardType|MIB|Bandwidth|NetworkType|SubnetMask|State
+Hardware = Build|Version|ProcessorCount|SwapSpace|User|Date|Workgroup|RegisteredName|RegisteredCompany|OSSerialNumber|Type|OsSerialKey|ProcessorFrequency|Host
+Software = ProductPath|Type|Icon|UninstallPath|ExecutableSize|Application
+Controller = ExpandedType|HardwareVersion|StandardType
+Drive = DriveType|FileCount|FileSystem
+Input = StandardDescription|ExpandedDescription|Connector
+Memory = ExtendedDescription|SlotCount
+Monitor = Stamp|Type|Serial|Manuf
+Pci =
+Port = Stamp
+Printer =
+Slot =
+Sound = Description
+Storage = ExtendedType|VolumeName|Media
+VideoCard =
+
+[graph]
+Network = Gateway
+Hardware = OperatingSystem|ProcessorType
+Memory = Size
+
+# [querymanager]
+# list = Entity/Label||Software/ProductName||Hardware/ProcessorType||Hardware/OperatingSystem||Drive/TotalSpace||Inventory/Date
+# double = Software/Products::Software/ProductName##Software/ProductVersion
+# halfstatic = Registry/Value/display name::Path##DisplayName
+# extended = Inventory/Date||Drive/TotalSpace
+
+# [provisioning_inventory]
+# Users that will never be provisioned
+# exclude = root
+# A user can be automatically linked to a list of entities according to his
+# profile.
+# What is the LDAP field name that defines its profile name ?
+# profile_attr = 
+# Here are the possible notations for profile to entities mapping:
+# A simple list of the entities names
+# profile_entity_profile1 = entityA entityB
+# The dot char is the root entity
+# profile_entity_profile2 = .
+# In this example the content of the multi-valued 'pulse2entity' LDAP attribute
+# will be used
+# profile_entity_profile3 = %pulse2entity%
+# Here the provisioning plugin 'network_to_entity' will be used
+# profile_entity_profile4 = plugin:network_to_entity
diff --git a/slapos/recipe/pulse2/template/pulse2_conf/plugins/msc.ini.in b/slapos/recipe/pulse2/template/pulse2_conf/plugins/msc.ini.in
new file mode 100644
index 0000000000000000000000000000000000000000..cdb2ed9a257f31ccbc2c9cf08ecc77d4e3621520
--- /dev/null
+++ b/slapos/recipe/pulse2/template/pulse2_conf/plugins/msc.ini.in
@@ -0,0 +1,143 @@
+[main]
+disable = 0
+
+[msc]
+# repopath = /var/lib/pulse2/packages
+# qactionspath = /var/lib/pulse2/qactions
+# download_directory_path = /var/lib/pulse2/downloads
+# dbdriver = mysql
+# dbhost = localhost
+# dbport = 3306
+# dbname = msc
+# dbuser = mmc
+# dbpasswd = mmc
+# dbdebug = ERROR
+# Database connection lifetime
+# dbpoolrecycle = 60
+# Database connection pool size
+# dbpoolsize = 5
+# SSL support
+# dbsslenable = 0
+# dbsslca =
+# dbsslcert =
+# dbsslkey =
+# Computer's IP addresses filtering
+# ignore_non_rfc2780 = 1
+# ignore_non_rfc1918 = 0
+# Comma separated values of excluded or included IP addresses or ranges
+# For example: exclude_ipaddr = 192.168.0.1,10.0.0.0/10.255.255.255
+# Included addresses are never filtered.
+# exclude_ipaddr =
+# include_ipaddr =
+# Computer's host name filtering
+# ignore_non_fqdn = 0
+# ignore_invalid_hostname = 0
+# Space separated list regexp for rejected or accepted host name
+# Host name matching the regexp in include_hostname are always accepted
+# For example: exclude_hostname = ^computer[0-9]*$ ^server[0-9]*$
+# exclude_hostname =
+# include_hostname =
+# Computer's MAC addresses filtering
+# wol_macaddr_blacklist =
+# default scheduler used by the msc
+default_scheduler = scheduler_01
+
+[scheduler_api]
+host = %(ipv4)s
+port = 9990
+username =
+password =
+enablessl = 1
+# verifypeer = 0
+# cacert =
+# localcert =
+
+[scheduler_01]
+host = %(ipv4)s
+port = 8000
+username = username
+password = password
+enablessl = 1
+# verifypeer = 0
+# cacert =
+# localcert =
+
+[web]
+# ##### Interface customization #####
+# user may want to override the way dates are displayed (see http://www.php.net/date for more informations)
+# web_def_date_fmt = "%Y-%m-%d %H:%M:%S"
+#
+# ##### Deployment default settings #####
+# pre-check the "awake" checkbox in 'standard' deploy mode
+# web_def_awake = 1
+# pre-check the "do inventory" checkbox in 'standard' deploy mode
+# web_def_inventory = 1
+# hidden option
+# web_show_reboot = 0
+# pre-select the following mode in 'advanced' deploy mode
+
+# the two available modes are push and push_pull
+# web_def_mode = push
+# if set to False, the following setting allow the user to toggle between push and push/pull mode in advanced mode
+# web_force_mode = True
+# web_def_maxbw = 0
+# web_def_delay = 60
+# web_def_attempts = 3
+# web_def_deployment_intervals =
+# web_dlpath =
+# Max bandwidth for file download in Kbit/s
+# web_def_dlmaxbw = 0
+#
+# ##### Proxy default settings ####
+# May the local proxy system be used ?
+# web_allow_local_proxy = False
+# default proxy mode, defaut "multiple", other possible value "single"
+# web_def_local_proxy_mode = multiple
+# Max number of clients per proxy in proxy mode
+# web_def_max_clients_per_proxy = 10
+# Number of auto-selected proxy in semi-auto mode
+# web_def_proxy_number = 2
+# default mode (semi_auto / manual)
+# web_def_proxy_selection_mode = semi_auto
+#
+# ##### VNC Applet default settings ####
+# Here we may define the VNC applet behavior (in some way)
+# may the VNC applet used ? (this setting simply (en/dis)able the display of the VNC action button)
+# vnc_show_icon = True
+# allow user to interact with remote desktop ?
+# vnc_view_only = True
+# use the following VNC client pre-defined rules,
+# currently available profiles:
+# fiber: for high speed local networks (low latency, 10 Mb/s per connection)
+# lan: for 100 Mb local networks (low latency, 3 Mb/s per connection)
+# cable: for high-end broadband links (high latency, 400 kb/s per connection)
+# dsl: for low-end broadband links (high latency, 120 kb/s per connection)
+# isdn: (high latency, 75 kb/s)
+# vnc_network_connectivity = lan
+# display applet control to user
+# vnc_allow_user_control = False
+# the port to use to connect to a VNC
+# vnc_port = 5900
+
+#
+# ##### Client probing behavior ####
+# the LED which represents the client status can take four colors:
+# black => no probe done
+# red => all probe failed
+# orange => minimal probe succedeed (ping), maximal probe failed (ssh)
+# green => all probe succedeed
+# available probes are: none (field is empty), ping, ssh, ping_ssh (ie. both)
+# for networks where icmp is not allowed, ping may be disabled: probe_order=ssh
+# to speed-up display, ssh may be disabled: probe_order=ping
+# to fully disable probe: probe_order=
+# default conf: ping_ssh, in other terms: ping = orange, ssh = green
+# probe_order=ping_ssh
+
+[package_api]
+# mserver = 127.0.0.1
+# mport = 9990
+# mmountpoint = /rpc
+# enablessl = 1
+# verifypeer = 0
+# localcert =
+# cacert =
diff --git a/slapos/recipe/pulse2/template/pulse2_conf/plugins/pkgs.ini.in b/slapos/recipe/pulse2/template/pulse2_conf/plugins/pkgs.ini.in
new file mode 100644
index 0000000000000000000000000000000000000000..70f2f44d9b18bb5a3c979ca2bbd607044e769691
--- /dev/null
+++ b/slapos/recipe/pulse2/template/pulse2_conf/plugins/pkgs.ini.in
@@ -0,0 +1,15 @@
+[main]
+disable = 0
+
+[user_package_api]
+server = localhost
+port = 9990
+mountpoint = /upaa
+username =
+password =
+enablessl = 1
+# verifypeer = 0
+# cacert =
+# localcert =
+
+
diff --git a/slapos/recipe/pulse2/template/pulse2_conf/plugins/pulse2.ini.in b/slapos/recipe/pulse2/template/pulse2_conf/plugins/pulse2.ini.in
new file mode 100644
index 0000000000000000000000000000000000000000..8be42c1a96ff6625cab287c500bd1349d5dbecc3
--- /dev/null
+++ b/slapos/recipe/pulse2/template/pulse2_conf/plugins/pulse2.ini.in
@@ -0,0 +1,16 @@
+[main]
+disable = 0
+
+# [database]
+# dbdriver = mysql
+# dbhost = localhost
+# dbport = 3306
+# dbname = pulse2
+# dbuser = mmc
+# dbpasswd = mmc
+# dbsslenable = 0
+# dbsslca =
+# dbsslcert =
+# dbsslkey =
+
+
diff --git a/slapos/recipe/pulse2/template/pulse2_conf/pulse2/atftpd/pcre.conf.in b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/atftpd/pcre.conf.in
new file mode 100644
index 0000000000000000000000000000000000000000..8065552c848c79b31139b660a0c1c444159b9f7e
--- /dev/null
+++ b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/atftpd/pcre.conf.in
@@ -0,0 +1,14 @@
+^/tftpboot/revoboot/bin/revoboot.pxe$   bootloader/pxe_boot
+^/bootloader/pxe_boot$                  bootloader/pxe_boot
+^/bootloader/bootsplash.xpm$            bootloader/bootsplash.xpm
+^/bootmenus/default                     bootmenus/default
+^/bootmenus/([0-9A-F]{12})              bootmenus/$1
+^/bootmenus/([0-9A-F]{8})               bootmenus/$1
+^/custom/(.+)                           custom/$1
+^/diskless/kernel$                      diskless/kernel
+^/diskless/initrd$                      diskless/initrd
+^/diskless/memtest$                     diskless/memtest
+^/tools/memtest$                        diskless/memtest
+^/masters/(.+)                          masters/$1
+^/(.*)$                                 ?
+.*                                      ?
diff --git a/slapos/recipe/pulse2/template/pulse2_conf/pulse2/imaging-server/imaging-server.ini.in b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/imaging-server/imaging-server.ini.in
new file mode 100644
index 0000000000000000000000000000000000000000..e4b2c379b6f3e6d6dbc866064e511a883ea2bbc5
--- /dev/null
+++ b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/imaging-server/imaging-server.ini.in
@@ -0,0 +1,116 @@
+[main]
+# We will bind on this address ...
+# host = 0.0.0.0
+# ... and this UDP port
+# port = 1001
+# required password to record a client, not checked if empty
+# adminpass =
+
+[daemon]
+# as we are a service, we need some info to be run, such as:
+# - the identity we will run into
+# user = root
+# group = root
+# - our umask
+# umask = 0077
+# and where to record our PID
+# pidfile= /var/run/pulse2-imaging-server.pid
+
+[package-server]
+# here are described how to talk to our referent package server
+#
+# host = 127.0.0.1
+# port = 9990
+# mount_point = /imaging_api
+# enablessl = True
+# username = username
+# password = password
+# cacert = /etc/mmc/pulse2/imaging-server/keys/cacert.pem
+# localcert = /etc/mmc/pulse2/imaging-server/keys/privkey.pem
+# verifypeer = False
+
+[hooks]
+# hooks_dir = /usr/lib/pulse2/imaging-server/hooks
+#
+# 0xAD => "I'm new" action : menu creation request, triggered by the bootloader
+# arg[1] = source MAC (short)
+# arg[2] = given ID (short)
+# arg[3] = given PASSWORD (optionnal)
+# exit 0 on success
+# create_client_path = create_client
+#
+# 0xAA => "I just booted" action : menu update request + inventory processing request, triggered by the bootloader
+# arg[1] = source MAC (short)
+# boot_client_path = boot_client
+# arg[1] = source MAC (short)
+# arg[2] = where the inventory is temporaly stored
+# process_inventory_path = process_inventory
+#
+# 0xEC => "I just started a backup" : start a backup request, triggered by revoinc
+# arg[1] = source MAC (short)
+# arg[2] = kind of backup (L = image, B = Master)
+# exit 0 on success
+# start_image_path = start_image
+#
+# 0xED => "I just finished a backup" : end a backup request, triggered by revodoneimage
+# end_image_path = end_image
+#
+# 0xCD => "Change my default menu" => change default menu request, triggered by revodefault
+# arg[1] = source MAC (short)
+# arg[2] = item to use
+# exit 0 on success
+# change_default_path = change_default
+#
+# 0x4C => log stuff
+# arg[1] = source MAC (short)
+# arg[2] = action :
+#          0 => booted
+#          1 => took item arg[3]
+#          2 => starting restoration (more info in arg[3])
+#          3 => finished restoration (more info in arg[3])
+#          4 => starting backup (more info in arg[3])
+#          5 => finished backup (more info in arg[3])
+#          6 => started postinst
+#          7 => finished postinst
+#          8 => critical error
+# arg[3] = optional, see upper
+# exit 0 on success
+# log_action_path = log_action
+#
+# 0x1A => asks for its UUID
+# arg[1] = source MAC (short)
+# exit 0 on success, UUID is the last line on stdout
+# get_uuid_path = get_uuid
+#
+# 0x1B => asks for its Hostname
+# arg[1] = source MAC (short)
+# exit 0 on success, hostname is the last line on stdout
+# get_hostname_path = get_hostname
+#
+# 0x54 => ask for time sync (for mtftp)
+# arg[1] = source MAC (short)
+# arg[2] = computed sync
+# exit 0 on success
+# mtftp_sync_path = mtftp_sync
+
+[loggers]
+keys = root
+
+[handlers]
+keys = hand01
+
+[formatters]
+keys = form01
+
+[logger_root]
+level = NOTSET
+handlers = hand01
+
+[handler_hand01]
+class = FileHandler
+level = INFO
+formatter = form01
+args = ("/var/log/mmc/pulse2-imaging-server.log",)
+
+[formatter_form01]
+format = %(asctime)s %(levelname)s %(message)s
diff --git a/slapos/recipe/pulse2/template/pulse2_conf/pulse2/inventory-server/inventory-server.ini.in b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/inventory-server/inventory-server.ini.in
new file mode 100644
index 0000000000000000000000000000000000000000..0f36a78fb00df93c2f5e07b4d7bdff35e0d16046
--- /dev/null
+++ b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/inventory-server/inventory-server.ini.in
@@ -0,0 +1,68 @@
+[main]
+# host =
+# port = 9999
+# ocsmapping = /etc/mmc/pulse2/inventory-server/OcsNGMap.xml
+# enablessl = False
+# verifypeer = False
+# cacert = /etc/mmc/pulse2/inventory-server/keys/cacert.pem
+# localcert = /etc/mmc/pulse2/inventory-server/keys/privkey.pem
+# to put the data from the registry as hostname
+# hostname = Hardware/Host # by default
+# default_entity = .
+# entities_rules_file =
+
+[database]
+# dbdriver = mysql
+# dbhost = localhost
+# dbport = 3306
+# dbname = inventory
+# dbuser = mmc
+# dbpasswd = mmc
+# dbpoolrecycle = 60
+# dbsslenable = 0
+# dbsslca = /etc/mmc/pulse2/inventory/cacert.pem
+# dbsslcert = /etc/mmc/pulse2/inventory/cert.pem
+# dbsslkey = /etc/mmc/pulse2/inventory/key.pem
+
+[daemon]
+# pidfile = /var/run/pulse2-inventory-server.pid
+# user = root
+# group = root
+# umask = 0077
+# Example of non-root execution settings:
+# user = mmc
+# group = mmc
+# umask = 0007
+
+# [option_01]
+# NAME = REGISTRY
+# PARAM_01 = NAME::srvcomment||REGKEY::SYSTEM\CurrentControlSet\Services\lanmanserver\parameters||REGTREE::2##srvcomment
+# PARAM_02 = NAME::DisplayName||REGKEY::SYSTEM\CurrentControlSet\Services\lanmanserver||REGTREE::2##DisplayName
+
+[loggers]
+keys=root
+
+[handlers]
+keys=hand01,hand02
+
+[formatters]
+keys=form01
+
+[logger_root]
+level=NOTSET
+handlers=hand01
+
+[handler_hand01]
+class=FileHandler
+level=INFO
+formatter=form01
+args=("/var/log/mmc/pulse2-inventory-server.log",)
+
+[handler_hand02]
+class=StreamHandler
+level=DEBUG
+args=(sys.stderr,)
+
+[formatter_form01]
+format=%(asctime)s %(levelname)s %(message)s
+
diff --git a/slapos/recipe/pulse2/template/pulse2_conf/pulse2/inventory-server/keys/cacert.pem b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/inventory-server/keys/cacert.pem
new file mode 100644
index 0000000000000000000000000000000000000000..11791e682caeaccdabc55812d2cf220e72928b69
--- /dev/null
+++ b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/inventory-server/keys/cacert.pem
@@ -0,0 +1,16 @@
+-----BEGIN CERTIFICATE-----
+MIICmjCCAkSgAwIBAgIJALq48auj/cmmMA0GCSqGSIb3DQEBBAUAMGkxCzAJBgNV
+BAYTAkZSMQswCQYDVQQIEwJOQTENMAsGA1UEBxMETWV0ejEPMA0GA1UEChMGTGlu
+Ym94MQ0wCwYDVQQDEwRjZXJ0MR4wHAYJKoZIhvcNAQkBFg9pbmZvQGxpbmJveC5j
+b20wHhcNMDUwODAyMTI1NjA1WhcNMDgwNDI4MTI1NjA1WjBpMQswCQYDVQQGEwJG
+UjELMAkGA1UECBMCTkExDTALBgNVBAcTBE1ldHoxDzANBgNVBAoTBkxpbmJveDEN
+MAsGA1UEAxMEY2VydDEeMBwGCSqGSIb3DQEJARYPaW5mb0BsaW5ib3guY29tMFww
+DQYJKoZIhvcNAQEBBQADSwAwSAJBALsvk/6SKwimAloa2gitTn2AsUIZs0FT1XvM
+LYWiaqQe5XK5n08F9C3ClLU79UxEuh47su3mxKjakwZSDvptNU8CAwEAAaOBzjCB
+yzAdBgNVHQ4EFgQUJ8QwuXYP+uu6tWjtl4y6j/6CiR0wgZsGA1UdIwSBkzCBkIAU
+J8QwuXYP+uu6tWjtl4y6j/6CiR2hbaRrMGkxCzAJBgNVBAYTAkZSMQswCQYDVQQI
+EwJOQTENMAsGA1UEBxMETWV0ejEPMA0GA1UEChMGTGluYm94MQ0wCwYDVQQDEwRj
+ZXJ0MR4wHAYJKoZIhvcNAQkBFg9pbmZvQGxpbmJveC5jb22CCQC6uPGro/3JpjAM
+BgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA0EAfKZ53wZqWetaf6XN06PdUUyb
+orjbJtFQJQYBoXpqfrTH78Sna+uaCRlC+4BBAPx6Tz7ZoWqHt84GBf1WIXOscA==
+-----END CERTIFICATE-----
diff --git a/slapos/recipe/pulse2/template/pulse2_conf/pulse2/inventory-server/keys/privkey.pem b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/inventory-server/keys/privkey.pem
new file mode 100644
index 0000000000000000000000000000000000000000..aaa698fa09d901d5b914454d1c004f04dd5ac7a1
--- /dev/null
+++ b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/inventory-server/keys/privkey.pem
@@ -0,0 +1,9 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIBOwIBAAJBALsvk/6SKwimAloa2gitTn2AsUIZs0FT1XvMLYWiaqQe5XK5n08F
+9C3ClLU79UxEuh47su3mxKjakwZSDvptNU8CAwEAAQJAC+eSufYB1qL4M1LR2wtq
+moC8xT9tLxJt2Vm662zQ628PhbzdaJBFGlHpC5jdsw/J1r56D+eVTOiVrMKKd3Lk
+gQIhAPjir/qwx0ssVfiW1xioj33tR3Dxpd8pYPTKZBWuknXZAiEAwIlhZ1sSFulo
+eOTJgvhga3PClKI7qcRlUEVAkfzoQ2cCIGKWKO88pzT30vYtifaSjoRrQSlUD0he
+s7FDmnGcPRfBAiEAp39co4PQ6unHn1S6EhxuFUyxvIieiwR2dyyoDdkNXoUCIQCD
+KeWLYFVEXcNqdgC2tjIzbBR03UQXt3eFrovjeox1pA==
+-----END RSA PRIVATE KEY-----
diff --git a/slapos/recipe/pulse2/template/pulse2_conf/pulse2/launchers/keys/cacert.pem b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/launchers/keys/cacert.pem
new file mode 100644
index 0000000000000000000000000000000000000000..11791e682caeaccdabc55812d2cf220e72928b69
--- /dev/null
+++ b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/launchers/keys/cacert.pem
@@ -0,0 +1,16 @@
+-----BEGIN CERTIFICATE-----
+MIICmjCCAkSgAwIBAgIJALq48auj/cmmMA0GCSqGSIb3DQEBBAUAMGkxCzAJBgNV
+BAYTAkZSMQswCQYDVQQIEwJOQTENMAsGA1UEBxMETWV0ejEPMA0GA1UEChMGTGlu
+Ym94MQ0wCwYDVQQDEwRjZXJ0MR4wHAYJKoZIhvcNAQkBFg9pbmZvQGxpbmJveC5j
+b20wHhcNMDUwODAyMTI1NjA1WhcNMDgwNDI4MTI1NjA1WjBpMQswCQYDVQQGEwJG
+UjELMAkGA1UECBMCTkExDTALBgNVBAcTBE1ldHoxDzANBgNVBAoTBkxpbmJveDEN
+MAsGA1UEAxMEY2VydDEeMBwGCSqGSIb3DQEJARYPaW5mb0BsaW5ib3guY29tMFww
+DQYJKoZIhvcNAQEBBQADSwAwSAJBALsvk/6SKwimAloa2gitTn2AsUIZs0FT1XvM
+LYWiaqQe5XK5n08F9C3ClLU79UxEuh47su3mxKjakwZSDvptNU8CAwEAAaOBzjCB
+yzAdBgNVHQ4EFgQUJ8QwuXYP+uu6tWjtl4y6j/6CiR0wgZsGA1UdIwSBkzCBkIAU
+J8QwuXYP+uu6tWjtl4y6j/6CiR2hbaRrMGkxCzAJBgNVBAYTAkZSMQswCQYDVQQI
+EwJOQTENMAsGA1UEBxMETWV0ejEPMA0GA1UEChMGTGluYm94MQ0wCwYDVQQDEwRj
+ZXJ0MR4wHAYJKoZIhvcNAQkBFg9pbmZvQGxpbmJveC5jb22CCQC6uPGro/3JpjAM
+BgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA0EAfKZ53wZqWetaf6XN06PdUUyb
+orjbJtFQJQYBoXpqfrTH78Sna+uaCRlC+4BBAPx6Tz7ZoWqHt84GBf1WIXOscA==
+-----END CERTIFICATE-----
diff --git a/slapos/recipe/pulse2/template/pulse2_conf/pulse2/launchers/keys/privkey.pem b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/launchers/keys/privkey.pem
new file mode 100644
index 0000000000000000000000000000000000000000..aaa698fa09d901d5b914454d1c004f04dd5ac7a1
--- /dev/null
+++ b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/launchers/keys/privkey.pem
@@ -0,0 +1,9 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIBOwIBAAJBALsvk/6SKwimAloa2gitTn2AsUIZs0FT1XvMLYWiaqQe5XK5n08F
+9C3ClLU79UxEuh47su3mxKjakwZSDvptNU8CAwEAAQJAC+eSufYB1qL4M1LR2wtq
+moC8xT9tLxJt2Vm662zQ628PhbzdaJBFGlHpC5jdsw/J1r56D+eVTOiVrMKKd3Lk
+gQIhAPjir/qwx0ssVfiW1xioj33tR3Dxpd8pYPTKZBWuknXZAiEAwIlhZ1sSFulo
+eOTJgvhga3PClKI7qcRlUEVAkfzoQ2cCIGKWKO88pzT30vYtifaSjoRrQSlUD0he
+s7FDmnGcPRfBAiEAp39co4PQ6unHn1S6EhxuFUyxvIieiwR2dyyoDdkNXoUCIQCD
+KeWLYFVEXcNqdgC2tjIzbBR03UQXt3eFrovjeox1pA==
+-----END RSA PRIVATE KEY-----
diff --git a/slapos/recipe/pulse2/template/pulse2_conf/pulse2/launchers/launchers.ini.in b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/launchers/launchers.ini.in
new file mode 100644
index 0000000000000000000000000000000000000000..71590fec4155a365f4bce793553a7e1a15061b97
--- /dev/null
+++ b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/launchers/launchers.ini.in
@@ -0,0 +1,160 @@
+[launchers]
+# Pulse2 Launcher path
+# launcher_path = /usr/sbin/pulse2-launcher
+
+## Misc locations ##
+# Source directory for push mode
+# source_path = /var/lib/pulse2/packages
+
+## Workflow-related commands ##
+# global ping command
+# ping_path = /usr/sbin/pulse2-ping
+# global inventory command
+# inventory_command = export P2SRV=`echo $SSH_CONNECTION | cut -f1 -d\ `; export P2PORT=9999; export http_proxy=""; export ftp_proxy=""; ( [ -x /cygdrive/c/Program\ Files/OCS\ Inventory\ Agent/OCSInventory.exe ] && /cygdrive/c/Program\ Files/OCS\ Inventory\ Agent/OCSInventory.exe /np /server:$P2SRV /pnum:$P2PORT ) || ( [ -x /usr/bin/ocsinventory-agent ] && /usr/bin/ocsinventory-agent --server=http://$P2SRV:$P2PORT ) || ( [ -x /usr/sbin/ocsinventory-agent ] && /usr/sbin/ocsinventory-agent --server=http://$P2SRV:$P2PORT ) || ( [ -x /usr/local/sbin/ocs_mac_agent.php ] && /usr/local/sbin/ocs_mac_agent.php )
+# global reboot command
+# reboot_command = /bin/shutdown.exe -f -r 1 || shutdown -r now
+# global halt command
+# halt_command = /bin/shutdown.exe -f -s 1 || shutdown -h now
+
+## Target on client ##
+# target directory on client
+# target_path = /tmp
+# temp folder name prefix on client
+# temp_folder_prefix = MDVPLS
+
+## Foll-proofing ##
+# Above this amount of seconds the command will automatically be killed.
+# max_command_age = 86400
+# Above this amount of seconds a computer will be considered as
+# unreachable.
+# max_ping_time = 4
+# Above this amount of seconds a computer will be considered as without
+# ssh installed
+# max_probe_time = 20
+
+[daemon]
+# the place were we put the daemons's PID files
+# pidfile = /var/run/pulse2
+# user = root
+# group = root
+# umask = 0077
+# Example of non-root execution settings:
+# user = mmc
+# group = mmc
+# umask = 0007
+
+[wrapper]
+# wrapper path
+# path = /usr/sbin/pulse2-output-wrapper
+# cap the amount of logs a wrapper can generate (in bytes)
+# max_log_size = 512000
+# wrapper will quit it process takes longer to complete (in seconds)
+# max_exec_time = 21600
+
+[ssh]
+# defaultkey is the name of the default SSH key
+# default_key = default
+# openssl binaries path
+# scp_path = /usr/bin/scp
+# ssh_path = /usr/bin/ssh
+# ssh_agent_path = /usr/bin/ssh-agent
+# sshkey_default = /root/.ssh/id_dsa
+# sshkey_mysecondkey = /somewhere/my_second_key
+# options passed to SSH via "-o"
+# ssh_options = LogLevel=ERROR UserKnownHostsFile=/dev/null StrictHostKeyChecking=no Batchmode=yes PasswordAuthentication=no ServerAliveInterval=10 CheckHostIP=no ConnectTimeout=10
+# ssh's keyforwarding control: never, always, or let (aka 'let the scheduler decide')
+# forward_key = let
+
+[wget]
+# wget binary path (on client)
+# wget_path = /usr/bin/wget
+# wget_options =
+# check_certs = False
+# resume = True
+
+[rsync]
+# rsync_path = /usr/bin/rsync
+# resume = True
+# set_executable can be yes, no or keep
+# set_executable = yes
+# set_access can be private, restricted or public
+# set_access = private
+
+[wol]
+# Pulse2 WOL Path
+# wol_path = /usr/sbin/pulse2-wol
+# wol_port = 40000
+# wol_bcast = 255.255.255.255
+
+[tcp_sproxy]
+# Pulse2 SSH Proxy path
+# tcp_sproxy_path = /usr/sbin/pulse2-tcp-sproxy
+# The "external" VNC IP adress
+# tcp_sproxy_host =
+# The TCP range to attribue to the proxy
+# tcp_sproxy_port_range = 8100-8200
+# the initial ssh connection to the client timeout
+# tcp_sproxy_establish_delay = 20
+# the initial VNC connection to the proxy timeout
+# tcp_sproxy_connect_delay = 60
+# the number of seconds a connection will stay open after the initial handshake
+# tcp_sproxy_session_lenght = 3600
+
+[smart_cleaner]
+# Pulse2 Smart Cleaner path (on the target); if empty we do not use it
+# smart_cleaner_path = /usr/bin/pulse2-smart-cleaner.sh
+# cleaner options, space separated, see doc
+# smart_cleaner_options =
+
+[scheduler_01]
+# host = 127.0.0.1
+# port = 8000
+# enablessl = True
+# username = username
+# password = password
+# periodicaly talk to our referent scheduler
+# awake_time = 600
+# add some randomness in our wake-ups
+# awake_incertitude_factor = .2
+# if set to yes, do no send results directly after a command completion
+# defer_results = no
+
+# Launchers sections, one per launcher
+[launcher_01]
+# bind = 127.0.0.1
+port = 8001
+# slots = 300
+# username = username
+# password = password
+# scheduler = scheduler_01
+enablessl = True
+cacert = /etc/mmc/pulse2/launchers/keys/cacert.pem
+localcert = /etc/mmc/pulse2/launchers/keys/privkey.pem
+verifypeer = False
+# You can override the logger configuration of this launcher with the
+# loggconffile option, else the logger configuration from the current file will
+# be used.
+# logconffile = /etc/mmc/pulse2/launchers/log_launcher_01.ini
+
+[loggers]
+keys = root
+
+[handlers]
+keys = hand01
+
+[formatters]
+keys = form01
+
+[logger_root]
+level = NOTSET
+handlers = hand01
+
+[handler_hand01]
+class = FileHandler
+level = INFO
+formatter = form01
+args = ("/var/log/mmc/pulse2-launchers.log",)
+
+[formatter_form01]
+format = %(asctime)s %(levelname)s %(message)s
+
diff --git a/slapos/recipe/pulse2/template/pulse2_conf/pulse2/launchers/log_launcher_01.ini.in b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/launchers/log_launcher_01.ini.in
new file mode 100644
index 0000000000000000000000000000000000000000..032f43c21f53c7708d6b82d10906cf0dab52ca4b
--- /dev/null
+++ b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/launchers/log_launcher_01.ini.in
@@ -0,0 +1,21 @@
+[loggers]
+keys = root
+
+[handlers]
+keys = hand01
+
+[formatters]
+keys = form01
+
+[logger_root]
+level = NOTSET
+handlers = hand01
+
+[handler_hand01]
+class = FileHandler
+level = INFO
+formatter = form01
+args = ("/var/log/mmc/pulse2-launcher-01.log",)
+
+[formatter_form01]
+format = %(asctime)s %(levelname)s %(message)s
diff --git a/slapos/recipe/pulse2/template/pulse2_conf/pulse2/p2ipc-windows.ini.in b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/p2ipc-windows.ini.in
new file mode 100644
index 0000000000000000000000000000000000000000..f8affcdef01526f89d3ae1f9fd6680e5adb096a0
--- /dev/null
+++ b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/p2ipc-windows.ini.in
@@ -0,0 +1,58 @@
+[main]
+server =
+port = 9999
+command_name = C:\Program Files\OCS Inventory Agent\OCSInventory.exe
+command_attr = /SERVER:127.0.0.1 /PNUM:9999
+enablessl = True
+verifypeer = False
+cacert = cacert.pem
+localcert = privkey.pem
+
+# [polling]
+# activate = 0
+# type = reg
+# time = 600
+# path = HKEY_LOCAL_MACHINE\Software\Mandriva\Inventory\Client\do_inventory
+
+[loggers]
+keys = root
+
+[handlers]
+keys = hand01
+
+[formatters]
+keys = form01
+
+[logger_root]
+level = NOTSET
+handlers = hand01
+
+[handler_hand01]
+class = handlers.NTEventLogHandler
+level = INFO
+formatter = form01
+args = ("Pulse 2 Proxy SSL",)
+
+# [handler_hand01]
+# class = handlers.RotatingFileHandler
+# level = DEBUG
+# formatter = form01
+# args = ("C:\\Program Files\\Mandriva\\Pulse2 Inventory SSL Proxy\\log.txt", "a", 100*1024, 5)
+
+[formatter_form01]
+format = %(asctime)s %(levelname)s %(message)s
+
+# Xml update add extra information to OCS XML output
+[xmlupdate]
+# execute the update
+enable = False
+# keep a local copy of the updated XML
+keepxmlupdate = False
+# notify software updates
+updatedetection = False
+# add software icons to XML output
+addicon = False
+
+# add OCS execution debug to OCS XML output
+[ocsdebug]
+enable = False
\ No newline at end of file
diff --git a/slapos/recipe/pulse2/template/pulse2_conf/pulse2/p2ipc.ini.in b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/p2ipc.ini.in
new file mode 100644
index 0000000000000000000000000000000000000000..fbc3139e84210f2e39acf71a8aa5cb0b72f260af
--- /dev/null
+++ b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/p2ipc.ini.in
@@ -0,0 +1,11 @@
+[main]
+# server = 
+# port = 9999
+# path = /
+# tmpdirname = /tmp/Pulse2InventoryProxy
+# command_name = /usr/local/bin/ocsinventory-agent
+# command_attr = -l /tmp/Pulse2InventoryProxy
+# enablessl = True
+# key_file = conf/key/privkey.pem
+# cert_file = conf/key/cacert.pem
+                                
diff --git a/slapos/recipe/pulse2/template/pulse2_conf/pulse2/package-server/keys/cacert.pem b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/package-server/keys/cacert.pem
new file mode 100644
index 0000000000000000000000000000000000000000..11791e682caeaccdabc55812d2cf220e72928b69
--- /dev/null
+++ b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/package-server/keys/cacert.pem
@@ -0,0 +1,16 @@
+-----BEGIN CERTIFICATE-----
+MIICmjCCAkSgAwIBAgIJALq48auj/cmmMA0GCSqGSIb3DQEBBAUAMGkxCzAJBgNV
+BAYTAkZSMQswCQYDVQQIEwJOQTENMAsGA1UEBxMETWV0ejEPMA0GA1UEChMGTGlu
+Ym94MQ0wCwYDVQQDEwRjZXJ0MR4wHAYJKoZIhvcNAQkBFg9pbmZvQGxpbmJveC5j
+b20wHhcNMDUwODAyMTI1NjA1WhcNMDgwNDI4MTI1NjA1WjBpMQswCQYDVQQGEwJG
+UjELMAkGA1UECBMCTkExDTALBgNVBAcTBE1ldHoxDzANBgNVBAoTBkxpbmJveDEN
+MAsGA1UEAxMEY2VydDEeMBwGCSqGSIb3DQEJARYPaW5mb0BsaW5ib3guY29tMFww
+DQYJKoZIhvcNAQEBBQADSwAwSAJBALsvk/6SKwimAloa2gitTn2AsUIZs0FT1XvM
+LYWiaqQe5XK5n08F9C3ClLU79UxEuh47su3mxKjakwZSDvptNU8CAwEAAaOBzjCB
+yzAdBgNVHQ4EFgQUJ8QwuXYP+uu6tWjtl4y6j/6CiR0wgZsGA1UdIwSBkzCBkIAU
+J8QwuXYP+uu6tWjtl4y6j/6CiR2hbaRrMGkxCzAJBgNVBAYTAkZSMQswCQYDVQQI
+EwJOQTENMAsGA1UEBxMETWV0ejEPMA0GA1UEChMGTGluYm94MQ0wCwYDVQQDEwRj
+ZXJ0MR4wHAYJKoZIhvcNAQkBFg9pbmZvQGxpbmJveC5jb22CCQC6uPGro/3JpjAM
+BgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA0EAfKZ53wZqWetaf6XN06PdUUyb
+orjbJtFQJQYBoXpqfrTH78Sna+uaCRlC+4BBAPx6Tz7ZoWqHt84GBf1WIXOscA==
+-----END CERTIFICATE-----
diff --git a/slapos/recipe/pulse2/template/pulse2_conf/pulse2/package-server/keys/privkey.pem b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/package-server/keys/privkey.pem
new file mode 100644
index 0000000000000000000000000000000000000000..aaa698fa09d901d5b914454d1c004f04dd5ac7a1
--- /dev/null
+++ b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/package-server/keys/privkey.pem
@@ -0,0 +1,9 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIBOwIBAAJBALsvk/6SKwimAloa2gitTn2AsUIZs0FT1XvMLYWiaqQe5XK5n08F
+9C3ClLU79UxEuh47su3mxKjakwZSDvptNU8CAwEAAQJAC+eSufYB1qL4M1LR2wtq
+moC8xT9tLxJt2Vm662zQ628PhbzdaJBFGlHpC5jdsw/J1r56D+eVTOiVrMKKd3Lk
+gQIhAPjir/qwx0ssVfiW1xioj33tR3Dxpd8pYPTKZBWuknXZAiEAwIlhZ1sSFulo
+eOTJgvhga3PClKI7qcRlUEVAkfzoQ2cCIGKWKO88pzT30vYtifaSjoRrQSlUD0he
+s7FDmnGcPRfBAiEAp39co4PQ6unHn1S6EhxuFUyxvIieiwR2dyyoDdkNXoUCIQCD
+KeWLYFVEXcNqdgC2tjIzbBR03UQXt3eFrovjeox1pA==
+-----END RSA PRIVATE KEY-----
diff --git a/slapos/recipe/pulse2/template/pulse2_conf/pulse2/package-server/package-server.ini.in b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/package-server/package-server.ini.in
new file mode 100644
index 0000000000000000000000000000000000000000..39e6a109eeb42f884e9e7092593670ed3dab0c21
--- /dev/null
+++ b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/package-server/package-server.ini.in
@@ -0,0 +1,200 @@
+[main]
+# ----------
+# NETWORKING
+# ----------
+# port = 9990
+# host =
+# The public IP send when a client agent is wondering how to reach this package server, set to the "host" parameter value if not defined
+# public_ip =
+#
+# --------
+# PACKAGES
+# --------
+# Is package autodetection activated ?
+# package_detect_activate = 0
+# Time between two loops of detection
+# package_detect_loop = 60
+# methods in none, last_time_modification, check_size
+# for more than 1 method, separate with ","
+# package_detect_smart_method = none
+# package_detect_smart_time = 60
+# Package api can synhronise package data to others servers
+# package_mirror_loop = 5
+# package synchronisation targets
+# package_mirror_target =
+# package synchronisation state file. used only if package_mirror_target is defined
+# File where pending sync are written so that they can be finished on package server restart.
+# package_mirror_status_file = /var/data/mmc/status
+# package synchronisation command to use
+# package_mirror_command = /usr/bin/rsync
+# package synchronisation command options
+# package_mirror_command_options = -ar --delete
+# package synchronisation command on only one level options
+# package_mirror_level0_command_options = -d --delete
+# options passed to SSH via "-o" if specified --rsh is automatically added to package_mirror_command_options
+# package_mirror_command_options_ssh_options =
+# for example
+# package_mirror_command_options_ssh_options = IdentityFile=/root/.ssh/id_dsa StrictHostKeyChecking=no Batchmode=yes PasswordAuthentication=no ServerAliveInterval=10 CheckHostIP=no ConnectTimeout=10
+# loop for the sync of the whole package directory
+# can only be activated when package_mirror_target is given
+# package_global_mirror_activate = 1
+# package_global_mirror_loop = 3600
+# package_global_mirror_command_options = -ar --delete
+# real package deletion
+# real_package_deletion = 0
+#
+# ----------
+# MISC STUFF
+# ----------
+# machine/mirror assign algo
+# mm_assign_algo = default
+# user/packageput assign algo
+# up_assign_algo = default
+# tmp_input_dir = /tmp/packages/default
+
+[daemon]
+# the place were we put the daemons's PID files
+# pidfile = /var/run/pulse2-package-server.pid
+# user = root
+# group = root
+# umask = 0022
+# Example of non-root execution settings:
+# user = mmc
+# group = mmc
+# umask = 0002
+
+[ssl]
+# enablessl = 1
+# username =
+# password =
+# certfile = /etc/mmc/pulse2/package-server/keys/cacert.pem
+# privkey = /etc/mmc/pulse2/package-server/keys/privkey.pem
+# verifypeer = 0
+
+[mmc_agent]
+# We sometimes need to talk to our referent agent
+# here are some key to speak with it
+# host = 127.0.0.1
+# port = 7080
+# username = mmc
+# password = s3cr3t
+# enablessl = True
+# verifypeer = False
+# cacert = /etc/mmc/pulse2/package-server/keys/cacert.pem
+# localcert = /etc/mmc/pulse2/package-server/keys/privkey.pem
+
+[mirror_api]
+# mount_point = /rpc
+
+[user_packageapi_api]
+# mount_point = /upaa
+
+[scheduler_api]
+# mount_point = /scheduler_api
+# schedulers = scheduler_01
+
+# [imaging_api]
+# mount_point = /imaging_api
+# uuid = PLEASE_PUT_A_UUID_FOR_THAT_SERVER
+##################
+# Some locations #
+##################
+### main tree
+# base_folder = /var/lib/pulse2/imaging
+### Bootloaders
+# Where bootloader (and bootsplash) is stored, relative to "base_folder"
+# bootloader_folder = bootloader   # Where bootloader (and bootsplash) is stored, relative to "base_folder"
+# pxe_bootloader = pxe_boot        # the network bootloader
+# cd_bootloader = cd_boot          # the cdrom bootloader
+# bootsplash_file = bootsplash.xpm # the bootloader splashscreen
+### Bootmenus
+# Where boot menus are generated / being served, relative to "base_folder"
+# bootmenus_folder = bootmenus
+### Diskless
+# Where kernel, initrd and other official diskless tools are stored, relative to "base_folder"
+# diskless_folder = diskless # Where kernel, initrd and other official diskless tools are stored, relative to "base_folder"
+# diskless_kernel = kernel     # Name of the diskless kernel to run
+# diskless_initrd = initrd     # Name of the diskless initrd to boot (core)
+# diskless_initrdcd = initrdcd # Name of the diskless initrd to boot (addon to boot on CD)
+# diskless_memtest = memtest   # diskless memtest tool
+### Inventories
+# Where inventories are stored / retrieved, relative to "base_folder"
+# inventories_folder = inventories
+### NFS
+# Where additionnal material (hdmap, exclude) are stored / retrieved, relative to "base_folder"
+# (a.k.a. /revoinfo client side)
+# computers_folder = computers
+# Where images are stored, relative to "base_folder"
+# (a.k.a. /revoinfo client side)
+# masters_folder = masters
+# Where postinst tools are stored, relative to "base_folder"
+# (a.k.a. /opt client side)
+# postinst_folder = postinst
+# will contain archived computer imaging data
+# archives_folder = archives
+### ISO images generation
+# isos_folder = /var/lib/pulse2/imaging/isos # will contain generated ISO images
+# isogen_tool = /usr/bin/mkisofs             # tool used to generate ISO file
+### RPC offline mode
+# RPC replay file name, relative to "base_folder"
+# rpc_replay_file = rpc-replay.pck
+# RPC replay loop timer in seconds
+# rpc_loop_timer = 60
+# RPC to replay at each loop
+# rpc_count = 10
+# Interval in seconds between two RPCs
+# rpc_interval = 2
+# Our UUID cache *inside* base_folder
+# uuid_cache_file = uuid-cache.txt
+# Our UUID cache lifetime
+# uuid_cache_lifetime = 300
+
+[mirror:01]
+mount_point = /mirror1
+src = /var/lib/pulse2/packages
+
+[package_api_put:01]
+mount_point = /package_api_get1
+src = /var/lib/pulse2/packages
+tmp_input_dir = /tmp/package_tmp/put1
+
+# Logger configuration
+
+[loggers]
+keys = root,imaging
+
+[handlers]
+keys = hand01,hand_imaging
+
+[formatters]
+keys = form01,form_imaging
+
+[logger_root]
+level = NOTSET
+handlers = hand01
+
+[handler_hand01]
+class = FileHandler
+level = INFO
+formatter = form01
+args = ("%s" % %(pulse2_log_file_package_server)s,)
+
+[formatter_form01]
+format = %%(asctime)s %%(levelname)s %%(message)s
+
+# Imaging API logger configuration
+
+[logger_imaging]
+level = NOTSET
+handlers = hand_imaging
+propagate = 0
+qualname = imaging
+
+[handler_hand_imaging]
+class = FileHandler
+level = INFO
+formatter = form_imaging
+args = ("%s" % %(pulse2_log_file_package_server)s,)
+
+[formatter_form_imaging]
+format = %%(asctime)s %%(levelname)s Imaging: %%(message)s
diff --git a/slapos/recipe/pulse2/template/pulse2_conf/pulse2/package-server/plugin_terminal_type.ini.in b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/package-server/plugin_terminal_type.ini.in
new file mode 100644
index 0000000000000000000000000000000000000000..bb3d957cb57823697bda509ef03d7ef6ee8619cb
--- /dev/null
+++ b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/package-server/plugin_terminal_type.ini.in
@@ -0,0 +1,21 @@
+#[main]
+#dbdriver = mysql 
+#dbhost = localhost
+#dbname = inventory
+#dbuser = mmc
+#dbpasswd = mmc
+#dbpoolrecycle = 
+#dbport = 
+#dbsslenable = 0
+#dbsslca = 
+#dbsslcert =
+#dbsslkey =
+
+#[associations:XX]
+# the mirror url you want to declare
+#mirror = MIRROR_URL
+# the type of terminal (SAGEM or )
+#terminal_types = TERMINAL_TYPE
+# the type of api it is (package_api or mirror)
+#kind = KIND
+
diff --git a/slapos/recipe/pulse2/template/pulse2_conf/pulse2/scheduler/keys/cacert.pem b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/scheduler/keys/cacert.pem
new file mode 100644
index 0000000000000000000000000000000000000000..11791e682caeaccdabc55812d2cf220e72928b69
--- /dev/null
+++ b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/scheduler/keys/cacert.pem
@@ -0,0 +1,16 @@
+-----BEGIN CERTIFICATE-----
+MIICmjCCAkSgAwIBAgIJALq48auj/cmmMA0GCSqGSIb3DQEBBAUAMGkxCzAJBgNV
+BAYTAkZSMQswCQYDVQQIEwJOQTENMAsGA1UEBxMETWV0ejEPMA0GA1UEChMGTGlu
+Ym94MQ0wCwYDVQQDEwRjZXJ0MR4wHAYJKoZIhvcNAQkBFg9pbmZvQGxpbmJveC5j
+b20wHhcNMDUwODAyMTI1NjA1WhcNMDgwNDI4MTI1NjA1WjBpMQswCQYDVQQGEwJG
+UjELMAkGA1UECBMCTkExDTALBgNVBAcTBE1ldHoxDzANBgNVBAoTBkxpbmJveDEN
+MAsGA1UEAxMEY2VydDEeMBwGCSqGSIb3DQEJARYPaW5mb0BsaW5ib3guY29tMFww
+DQYJKoZIhvcNAQEBBQADSwAwSAJBALsvk/6SKwimAloa2gitTn2AsUIZs0FT1XvM
+LYWiaqQe5XK5n08F9C3ClLU79UxEuh47su3mxKjakwZSDvptNU8CAwEAAaOBzjCB
+yzAdBgNVHQ4EFgQUJ8QwuXYP+uu6tWjtl4y6j/6CiR0wgZsGA1UdIwSBkzCBkIAU
+J8QwuXYP+uu6tWjtl4y6j/6CiR2hbaRrMGkxCzAJBgNVBAYTAkZSMQswCQYDVQQI
+EwJOQTENMAsGA1UEBxMETWV0ejEPMA0GA1UEChMGTGluYm94MQ0wCwYDVQQDEwRj
+ZXJ0MR4wHAYJKoZIhvcNAQkBFg9pbmZvQGxpbmJveC5jb22CCQC6uPGro/3JpjAM
+BgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA0EAfKZ53wZqWetaf6XN06PdUUyb
+orjbJtFQJQYBoXpqfrTH78Sna+uaCRlC+4BBAPx6Tz7ZoWqHt84GBf1WIXOscA==
+-----END CERTIFICATE-----
diff --git a/slapos/recipe/pulse2/template/pulse2_conf/pulse2/scheduler/keys/privkey.pem b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/scheduler/keys/privkey.pem
new file mode 100644
index 0000000000000000000000000000000000000000..aaa698fa09d901d5b914454d1c004f04dd5ac7a1
--- /dev/null
+++ b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/scheduler/keys/privkey.pem
@@ -0,0 +1,9 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIBOwIBAAJBALsvk/6SKwimAloa2gitTn2AsUIZs0FT1XvMLYWiaqQe5XK5n08F
+9C3ClLU79UxEuh47su3mxKjakwZSDvptNU8CAwEAAQJAC+eSufYB1qL4M1LR2wtq
+moC8xT9tLxJt2Vm662zQ628PhbzdaJBFGlHpC5jdsw/J1r56D+eVTOiVrMKKd3Lk
+gQIhAPjir/qwx0ssVfiW1xioj33tR3Dxpd8pYPTKZBWuknXZAiEAwIlhZ1sSFulo
+eOTJgvhga3PClKI7qcRlUEVAkfzoQ2cCIGKWKO88pzT30vYtifaSjoRrQSlUD0he
+s7FDmnGcPRfBAiEAp39co4PQ6unHn1S6EhxuFUyxvIieiwR2dyyoDdkNXoUCIQCD
+KeWLYFVEXcNqdgC2tjIzbBR03UQXt3eFrovjeox1pA==
+-----END RSA PRIVATE KEY-----
diff --git a/slapos/recipe/pulse2/template/pulse2_conf/pulse2/scheduler/scheduler.ini.in b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/scheduler/scheduler.ini.in
new file mode 100644
index 0000000000000000000000000000000000000000..f3dfb65a0107a1f1535821fa71ae643fbc32a608
--- /dev/null
+++ b/slapos/recipe/pulse2/template/pulse2_conf/pulse2/scheduler/scheduler.ini.in
@@ -0,0 +1,178 @@
+[scheduler]
+# This scheduler name
+id = scheduler_01
+
+## MANAGING ##
+# scheduler_path = /usr/sbin/pulse2-scheduler
+
+## NETWORK ##
+# port = 8000
+# host = 127.0.0.1
+# username = username
+# password = password
+# enablessl = True
+# If verifypeer is set, the scheduler will also connect to all the launchers
+# using the following certificates.
+# verifypeer = False
+# cacert = /etc/mmc/pulse2/scheduler/keys/cacert.pem
+# localcert = /etc/mmc/pulse2/scheduler/keys/privkey.pem
+
+## SCHEDULING ##
+# for some functions below, we add this factor, to prevent load peaks
+# incertitude_factor = .2
+#
+# initial wait time, in seconds, to make stuff stabilize
+# initial_wait = 2
+#
+# attempt to start (and stop) commands every n seconds
+# awake_time = 600
+#
+# preemption settings : preempting every N second, run M commands
+# preempt_amount = 50
+# preempt_period = 1
+#
+# status settings : check every N second, +/- incertitude_factor %
+# checkstatus_period = 900
+#
+# health logging : log some stats every N seconds, +/- incertitude_factor %
+# loghealth_period = 60
+#
+# once per day, hour specified below (HH:MM:SS), the scheduler will
+# analyse the database, looking to weird / broken commands;
+# you should enable this if you see stalled commands in logs
+# in this case, please specify an hour when the scheduler is
+# not very used (8 pm can be a good choice: analyse_hour = 20:00:00)
+# set to empty by default to disable analysis
+# analyse_hour =
+#
+# attempt to clean states in commands every n seconds
+# clean_states_time = 3600
+# clean state that are going to be clean
+# (from the launcher point of view, ie :
+#  * stop -> the command is not running on the launcher but it's state in the db say it is)
+#  * run -> the command
+# possible states : run, stop
+# active_clean_states =
+#
+# default database encoding (used to inject log files)
+# dbencoding = utf-8
+#
+# scheduler mode, see doc !
+# mode = async
+#
+# max number of slots to uses, for all launchers
+# max_slots = 300
+#
+# locking system
+# please use with caution: the only reason to activate this feature
+# is for systems under heavy load; risk of double-preemption is
+# drastically reduce using this, but your system will be even more slow
+# lock_processed_commands = False
+
+## Commands life ##
+# Command max default authorized time (for each stage)
+# max_command_time = 3600
+#
+# Command max upload time (aka 'upload' stage), override the previous one for looooong uploads
+# max_upload_time = 21600
+#
+# Command max WOL wait-for-completion time: wait this ammount of second before going futher
+# max_wol_time = 300
+
+## NETWORKING ##
+# prefered method to reach a client
+# available:
+# - fqdn: attempt to perform a DNS query on FQDN
+# - hosts: same, no DNS query
+# - ip: just try IP address
+# - netbios: attempt to do a nmblookup on IP adress
+# tests are performed using ping
+# resolv_order = fqdn hosts netbios ip
+
+## CHECKING ##
+# in some situations itn may be useful to do some pre-checks on clients
+# checks can be done against every information recorded into the "target" table
+# the following informations are available:
+# target_name => contain the target Hostname
+# target_uuid => contain the target UUID
+# target_ipaddr => contain the target IP addresses, only the first one is used
+# target_macaddr => contain the target MAC adresses, only the first one is used
+# The two following options are formated as follow:
+# *_check = <data-to-ask>=<expected-value>,...
+# for exemple:
+# server_check = IP=ipaddr
+# client_check = UUID=uuid,HOSTNAME=name
+# => will ask to client if its UUID is 'target_uuid', HOSTNAME is 'target_name',
+# and tell it to give us it's IP and check the IP's value is 'target_ipaddr'
+# While checking things, we may also want to announce what we are currently try to
+# do on client, for each stage, for example TRANFERT while transfering something:
+# announce_check = transfert=TRANFERT (comma-separated list as for previous options)
+# currently available keywords: transfert, execute, delete, inventory
+# announce_check =
+# server_check =
+# client_check =
+
+## Computer / Group assignment ##
+# mg_assign_algo = default
+
+
+[database]
+# dbdriver = mysql
+# dbhost = localhost
+# dbport = 3306
+# dbname = msc
+# dbuser = mmc
+# dbpasswd = mmc
+# dbdebug = ERROR
+# dbpoolrecycle = 60
+# dbpooltimeout = 30
+# SSL support
+# dbsslenable = 0
+# dbsslca =
+# dbsslcert =
+# dbsslkey =
+
+[daemon]
+# pidfile = /var/run/pulse2
+# user = root
+# group = root
+# umask = 0077
+# Example of non-root execution settings:
+# user = mmc
+# group = mmc
+# umask = 0007
+# setrlimit option allows to set process system resources usage. Syntax is:
+# setrlimit = limit1 soft1 hard1 limit2 soft2 hard2 ...
+# For example:
+# setrlimit = RLIMIT_NOFILE 2048 2048 RLIMIT_CORE 0 0
+# setrlimit =
+
+# Our launchers
+[launcher_01]
+host=%(ipv4)s
+port=8001
+username = username
+password = password
+enablessl = True
+
+[loggers]
+keys=root
+
+[handlers]
+keys=hand01
+
+[formatters]
+keys=form01
+
+[logger_root]
+level=NOTSET
+handlers=hand01
+
+[handler_hand01]
+class=FileHandler
+level=INFO
+formatter=form01
+args=("%s" % %(pulse2_log_file_scheduler)s,)
+
+[formatter_form01]
+format=%%(asctime)s %%(levelname)s %%(message)s