diff --git a/setup.py b/setup.py
index f8292c78f116f2c93f5336175870b4c770422ead..30ff9f6860f8a36a2205242a201f22d42b300901 100755
--- a/setup.py
+++ b/setup.py
@@ -99,7 +99,6 @@ setup(name=name,
           'dropbear.add_authorized_key = slapos.recipe.dropbear:AddAuthorizedKey',
           'dropbear.client = slapos.recipe.dropbear:Client',
           'duplicity = slapos.recipe.duplicity:Recipe',
-          'egg_test = slapos.recipe.erp5_test:EggTestRecipe',
           'equeue = slapos.recipe.equeue:Recipe',
           'erp5.promise = slapos.recipe.erp5_promise:Recipe',
           'erp5.test = slapos.recipe.erp5_test:Recipe',
diff --git a/slapos/recipe/erp5_test/__init__.py b/slapos/recipe/erp5_test/__init__.py
index 76cf4b0e647a562938acfe993f1eae28df3a5c95..a965ca774dbc6d2914e556a0f0854dd8b827c91c 100644
--- a/slapos/recipe/erp5_test/__init__.py
+++ b/slapos/recipe/erp5_test/__init__.py
@@ -113,26 +113,3 @@ class CloudoooRecipe(GenericBaseRecipe):
 
     return path_list
 
-class EggTestRecipe(GenericBaseRecipe):
-  """
-  Recipe used to create wrapper used to run test suite (python setup.py test)
-  off a list of Python eggs.
-  """
-  def install(self):
-    test_list = self.options['test-list'].strip().replace('\n', ',')
-
-    common_dict = {}
-    if self.options.get('environment'):
-      environment_part = self.buildout.get(self.options['environment'])
-      if environment_part:
-        common_dict['environment'] = dict(environment_part)
-
-    if 'prepend-path' in self.options:
-      common_dict['prepend_path'] = self.options['prepend-path']
-
-    return self.createPythonScript(
-        self.options['run-test-suite'], __name__ + '.test.runTestSuite',
-        ((self.options['run-test-suite-binary'],
-          "--source_code_path_list", test_list),
-         common_dict)
-    )
diff --git a/slapos/test/recipe/test_free_port.py b/slapos/test/recipe/test_free_port.py
index 7693d9e02cd3bbe10d4a20e6fd7e4c7b42979971..e2cea348bf548c5032c5c42cd6960279b9ff3703 100644
--- a/slapos/test/recipe/test_free_port.py
+++ b/slapos/test/recipe/test_free_port.py
@@ -4,8 +4,6 @@ import unittest
 
 from mock import patch
 
-from slapos.recipe import free_port
-
 class SocketMock():
   def __init__(self, *args, **kw):
     self.args = args
@@ -28,31 +26,16 @@ class FreePortTest(unittest.TestCase):
     SocketMock.bind = SocketMock.close = SocketMock.nothing_happen
 
   def new_recipe(self, **kw):
-    buildout = {
-      'buildout': {
-        'bin-directory': '',
-        'find-links': '',
-        'allow-hosts': '',
-        'develop-eggs-directory': '',
-        'eggs-directory': '',
-        'python': 'testpython',
-        'installed': '.installed.cfg',
-        },
-       'testpython': {
-         'executable': sys.executable,
-       },
-       'slap-connection': {
-         'computer-id': '',
-         'partition-id': '',
-         'server-url': '',
-         'software-release-url': '',
-       }
-    }
+    from slapos.recipe import free_port
+    from slapos.test.utils import makeRecipe
     options = {
       'ip': '127.0.0.1',
     }
     options.update(kw)
-    return free_port.Recipe(buildout=buildout, name='free_port', options=options)
+    return makeRecipe(
+        free_port.Recipe,
+        options=options,
+        name='free_port')
 
   @useMock
   def test_ifNoBusyPortThenMinPortIsAlwaysReturned(self):
diff --git a/slapos/test/recipe/test_generic_cloudooo.py b/slapos/test/recipe/test_generic_cloudooo.py
index d171efcb2d9b4493323b5825591758977a0239ae..29ddf64fdf3a8ff030df3a6e452bc3cc49b33072 100644
--- a/slapos/test/recipe/test_generic_cloudooo.py
+++ b/slapos/test/recipe/test_generic_cloudooo.py
@@ -4,30 +4,15 @@ import unittest
 
 from tempfile import mkdtemp
 from shutil import rmtree
-from slapos.recipe import generic_cloudooo
 
 class TestGenericCloudooo(unittest.TestCase):
   def new_recipe(self, options):
-    buildout = {
-      'buildout': {
-        'bin-directory': '',
-        'find-links': '',
-        'allow-hosts': '',
-        'develop-eggs-directory': '',
-        'eggs-directory': '',
-        'python': 'testpython',
-      },
-      'testpython': {
-        'executable': sys.executable,
-      },
-      'slap-connection': {
-         'computer-id': '',
-         'partition-id': '',
-         'server-url': '',
-         'software-release-url': '',
-      }
-    }
-    return generic_cloudooo.Recipe(buildout=buildout, name='generic_cloudooo', options=options)
+    from slapos.recipe import generic_cloudooo
+    from slapos.test.utils import makeRecipe
+    return makeRecipe(
+        generic_cloudooo.Recipe,
+        options=options,
+        name='generic_cloudooo')
 
   def setUp(self):
     self.test_dir = mkdtemp()
diff --git a/slapos/test/recipe/test_pbs.py b/slapos/test/recipe/test_pbs.py
index ff7c04f28d97240912d21b3202b9f673967aac8c..08327f8272b7726231c2fcead1dbf8adbecc042e 100644
--- a/slapos/test/recipe/test_pbs.py
+++ b/slapos/test/recipe/test_pbs.py
@@ -5,37 +5,19 @@ import sys
 import tempfile
 import unittest
 
-from slapos.recipe import pbs
-
 
 class PBSTest(unittest.TestCase):
 
     def new_recipe(self):
-        buildout = {
-                'buildout': {
-                    'bin-directory': '',
-                    'find-links': '',
-                    'allow-hosts': '',
-                    'develop-eggs-directory': '',
-                    'eggs-directory': '',
-                    'python': 'testpython',
-                    },
-                 'testpython': {
-                     'executable': sys.executable,
-                     },
-                 'slap-connection': {
-                     'computer-id': '',
-                     'partition-id': '',
-                     'server-url': '',
-                     'software-release-url': '',
-                     }
-                }
-
+        from slapos.recipe import pbs
+        from slapos.test.utils import makeRecipe
         options = {
-                'rdiffbackup-binary': ''
-                }
-
-        return pbs.Recipe(buildout=buildout, name='pbs', options=options)
+            'rdiffbackup-binary': ''
+        }
+        return makeRecipe(
+            pbs.Recipe,
+            options=options,
+            name='pbs')
 
     def test_push(self):
         recipe = self.new_recipe()
diff --git a/slapos/test/recipe/test_re6stnet.py b/slapos/test/recipe/test_re6stnet.py
index ca2b5e635f0352742236242244db59284e618af7..0c3ac919b4f486f407b12ac033d5c53f0cff3be0 100644
--- a/slapos/test/recipe/test_re6stnet.py
+++ b/slapos/test/recipe/test_re6stnet.py
@@ -6,8 +6,6 @@ import tempfile
 import unittest
 from slapos.slap.slap import NotFoundError, ConnectionError
 
-from slapos.recipe import re6stnet
-
 
 class Re6stnetTest(unittest.TestCase):
 
@@ -47,31 +45,21 @@ class Re6stnetTest(unittest.TestCase):
         shutil.rmtree(path)
     
   def new_recipe(self):
-      buildout = {
-              'buildout': {
-                  'bin-directory': '',
-                  'find-links': '',
-                  'allow-hosts': '',
-                  'develop-eggs-directory': '',
-                  'eggs-directory': '',
-                  'python': 'testpython',
-                  },
-               'testpython': {
-                   'executable': sys.executable,
-                   },
-               'slap-connection': {
+      from slapos.recipe import re6stnet
+      from slapos.test.utils import makeRecipe
+      return makeRecipe(
+            re6stnet.Recipe,
+            options=self.options,
+            slap_connection={
                    'computer-id': 'comp-test',
                    'partition-id': 'slappart0',
                    'server-url': 'http://server.com',
                    'software-release-url': 'http://software.com',
                    'key-file': '/path/to/key',
                    'cert-file': '/path/to/cert'
-                   }
-              }
-
-      options = self.options
+            },
+            name='re6stnet')
 
-      return re6stnet.Recipe(buildout=buildout, name='re6stnet', options=options)
 
   def checkWrapper(self, path):
     self.assertTrue(os.path.exists(path))
diff --git a/slapos/test/utils.py b/slapos/test/utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..d605bab9d326748881ef3858b81b1ed47c743b41
--- /dev/null
+++ b/slapos/test/utils.py
@@ -0,0 +1,62 @@
+"""Test helpers
+"""
+import sys
+import os.path
+from ConfigParser import ConfigParser
+
+import logging
+
+def makeRecipe(recipe_class, options, name='test', slap_connection=None):
+  """Instanciate a recipe of `recipe_class` with `options` with a buildout
+  mapping containing a python and an empty `slapos-connection` mapping, unless
+  provided as `slap_connection`.
+
+  If running tests in a buildout folder, the test recipe will reuse the
+  `eggs-directory` and `develop-eggs-directory` from this buildout so that the
+  test recipe does not need to install eggs again when using working set.
+  To prevent test accidentally writing to the buildout's eggs repositories, we
+  set `newest` to false and `offline` to true in this case.
+  """
+  buildout = {
+    'buildout': {
+      'bin-directory': '',
+      'find-links': '',
+      'allow-hosts': '',
+      'develop-eggs-directory': '',
+      'eggs-directory': '',
+      'python': 'testpython',
+    },
+    'testpython': {
+      'executable': sys.executable,
+    },
+    'slap-connection': {
+       'computer-id': '',
+       'partition-id': '',
+       'server-url': '',
+       'software-release-url': '',
+     }
+  }
+  if slap_connection is not None:
+    buildout['slap-connection'] = slap_connection
+
+  # are we in buildout folder ?
+  # the usual layout is
+  # ${buildout:directory}/parts/slapos-repository/slapos/test/utils.py , so try
+  # to find a buildout relative to this file.
+  buildout_cfg = os.path.join(os.path.dirname(__file__), '..', '..', '..', '..', 'buildout.cfg')
+  if os.path.exists(buildout_cfg):
+    parser = ConfigParser()
+    parser.readfp(open(buildout_cfg))
+    eggs_directory = parser.get('buildout', 'eggs-directory')
+    develop_eggs_directory = parser.get('buildout', 'develop-eggs-directory')
+    logging.getLogger(__name__).info(
+        'Using eggs-directory (%s) and develop-eggs-directory (%s) from buildout at %s',
+        eggs_directory,
+        develop_eggs_directory,
+        buildout_cfg)
+    buildout['buildout']['eggs-directory'] = eggs_directory
+    buildout['buildout']['develop-eggs-directory'] = develop_eggs_directory
+    buildout['buildout']['newest'] = False
+    buildout['buildout']['offline'] = True
+  return recipe_class(buildout=buildout, name=name, options=options)
+
diff --git a/software/slapos-testing/README.md b/software/slapos-testing/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..07216cff74692c4c740f854c2583b21f78f95219
--- /dev/null
+++ b/software/slapos-testing/README.md
@@ -0,0 +1,48 @@
+# Slapos egg tests
+
+This software release is used to run unit test of slapos eggs.
+
+The approach is to use setuptools' integrated test runner, `python setup.py test`, to run tests.
+
+The `python` used in this command will be a `zc.recipe.egg` interpreter with
+all eggs pre-installed by this software release.
+
+Nexedi staff can see the results of this test from the test suite
+`SLAPOS-EGG-TEST` in test result module.
+
+
+Here's an example session of how a developer could use this software release in
+slaprunner to develop a slapos egg, in the example `slapos.core`, to make
+changes to the code, run tests and publish changes.
+
+```bash
+# install this software release
+SR=https://lab.nexedi.com/nexedi/slapos/raw/master/software/slapos-testing/software.cfg 
+COMP=slaprunner
+INSTANCE_NAME=$COMP
+
+slapos supply $SR $COMP
+slapos node software
+slapos request --node=node=$COMP $INSTANCE_NAME $SR
+slapos node instance
+
+# The source code is a git clone working copy on the instance
+cd ~/srv/runner/instance/slappart0/parts/slapos.core/
+
+# make some changes to the code
+vim slapos/tests/client.py
+
+# run tests, using bundled python intepreter with pre-installed eggs dependencies
+~/srv/runner/instance/slappart0/software_release/bin/python_for_test setup.py build
+
+# when satified, commit changes
+git add -p && git commit
+
+# add developer's fork remote (this is only needed the first time)
+git remote add my_remote https://lab.nexedi.com/your_username/slapos.core.git/
+
+# push the changes
+git push my_remote HEAD:feature_branch_name
+
+# then submit merge request
+```
diff --git a/software/slapos-testing/buildout.hash.cfg b/software/slapos-testing/buildout.hash.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..95c5eb6dd28bcdd520d68086308bc59d3567704d
--- /dev/null
+++ b/software/slapos-testing/buildout.hash.cfg
@@ -0,0 +1,20 @@
+# THIS IS NOT A BUILDOUT FILE, despite purposedly using a compatible syntax.
+# The only allowed lines here are (regexes):
+# - "^#" comments, copied verbatim
+# - "^[" section beginings, copied verbatim
+# - lines containing an "=" sign which must fit in the following categorie.
+#   - "^\s*filename\s*=\s*path\s*$" where "path" is relative to this file
+#     But avoid directories, they are not portable.
+#     Copied verbatim.
+#   - "^\s*hashtype\s*=.*" where "hashtype" is one of the values supported
+#     by the re-generation script.
+#     Re-generated.
+# - other lines are copied verbatim
+# Substitution (${...:...}), extension ([buildout] extends = ...) and
+# section inheritance (< = ...) are NOT supported (but you should really
+# not need these here).
+
+[template]
+filename = instance.cfg
+md5sum = 9dece9d12dc94bf5c35d307cc8aa4d6b
+
diff --git a/software/slapos-testing/instance.cfg b/software/slapos-testing/instance.cfg
index 0a067e729e09c42b9548b76308ac913194b03327..5e50aff78e6a14af73dc93c0e12169969c25a8c4 100644
--- a/software/slapos-testing/instance.cfg
+++ b/software/slapos-testing/instance.cfg
@@ -1,10 +1,7 @@
 [buildout]
 parts =
-  slapos.core-setup
-  erp5.util-setup
   phantomjs-wrapper
   slapos-test-runner
-  sh-environment
 
 eggs-directory = ${buildout:eggs-directory}
 develop-eggs-directory = ${buildout:develop-eggs-directory}
@@ -24,33 +21,26 @@ bin = $${buildout:directory}/bin
 etc = $${buildout:directory}/etc
 services = $${:etc}/run
 srv = $${buildout:directory}/srv
-source-code = $${:srv}/eggs-source-code
 
 [download-source]
 recipe = slapos.recipe.build:gitclone
 git-executable = ${git:location}/bin/git
 
-# Local development
-[slapos.core]
-<= download-source
-repository = ${slapos.core-repository:location}
-
-[slapos.core-setup]
-recipe = plone.recipe.command
-command = echo "Updating setup...";cd $${slapos.core:location}; export PATH="$${slapos-test-runner:prepend-path}:$PATH"; export CPPFLAGS="$${environment:CPPFLAGS}"; export LDFLAGS="$${environment:LDFLAGS}"; export PYTHONPATH="$${environment:PYTHONPATH}"; export LOCAL_IPV4="$${environment:LOCAL_IPV4}"; ${python2.7:location}/bin/python setup.py test -n; ${python2.7:location}/bin/python setup.py test -n; ${python2.7:location}/bin/python setup.py test -n; ${python2.7:location}/bin/python setup.py test -n
-update-command = $${:command}
-
 [caucase]
 <= download-source
 repository = ${caucase-repository:location}
 
+[erp5.util]
+<= download-source
+repository = ${erp5.util-repository:location}
+
 [slapos.cookbook]
 <= download-source
 repository = ${slapos.cookbook-repository:location}
 
-[slapos.recipe.template]
+[slapos.core]
 <= download-source
-repository = ${slapos.recipe.template-repository:location}
+repository = ${slapos.core-repository:location}
 
 [slapos.recipe.build]
 <= download-source
@@ -60,57 +50,33 @@ repository = ${slapos.recipe.build-repository:location}
 <= download-source
 repository = ${slapos.recipe.cmmi-repository:location}
 
-[slapos.toolbox]
+[slapos.recipe.template]
 <= download-source
-repository = ${slapos.toolbox-repository:location}
+repository = ${slapos.recipe.template-repository:location}
 
-[erp5-util]
+[slapos.toolbox]
 <= download-source
-repository = ${erp5-util-repository:location}
+repository = ${slapos.toolbox-repository:location}
 
-[erp5.util-setup]
-recipe = plone.recipe.command
-command = echo "Updating setup...";cd $${erp5-util:location}; export PATH="$${slapos-test-runner:prepend-path}:$PATH"; export CPPFLAGS="$${environment:CPPFLAGS}"; export LDFLAGS="$${environment:LDFLAGS}"; export PYTHONPATH="$${environment:PYTHONPATH}"; ${python2.7:location}/bin/python setup.py test -n; ${python2.7:location}/bin/python setup.py test -n; ${python2.7:location}/bin/python setup.py test -n; ${python2.7:location}/bin/python setup.py test -n; ${python2.7:location}/bin/python setup.py test -n
-update-command = $${:command}
 
 [slapos-test-runner]
-recipe = slapos.cookbook:egg_test
-run-test-suite = $${create-directory:bin}/runTestSuite
-run-test-suite-binary = ${buildout:bin-directory}/runTestSuite
-# The list of executables should be defined here and a combination
-# of tests should dynamically generated.
-#python-list = $${}
-test-list =
-  $${slapos.cookbook:location}
-  $${slapos.core:location}
-  $${slapos.recipe.template:location}
-  $${slapos.recipe.build:location}
-  $${slapos.recipe.cmmi:location}
-  $${slapos.toolbox:location}
-  $${erp5-util:location}
-  $${caucase:location}
-prepend-path = ${curl:location}/bin:${openssl:location}/bin:${git:location}/bin:${libxslt:location}/bin:${python2.7:location}/bin
-environment = environment
-
-[environment]
-CPPFLAGS = -I${python2.7:location}/include/python2.7 -I${libxml2:location}/include -I${libxslt:location}/include
-LDFLAGS = -L${python2.7:location}/lib -L${libxml2:location}/lib -L${libxslt:location}/lib -L${libxslt:location}/lib -L${zlib:location}/lib -Wl,-rpath=${zlib:location}/lib -Wl,-rpath=${python2.7:location}/lib -Wl,-rpath=${libxml2:location}/lib -Wl,-rpath=${libxslt:location}/lib -Wl,-rpath=${zlib:location}/lib
-LD_LIBRARY_PATH = ${python2.7:location}/lib:${libxml2:location}/lib:${libxslt:location}/lib:${libxslt:location}/lib:${zlib:location}/lib
-PYTHONPATH = ${python-setuptools:pythonpath}:${buildout:eggs-directory}:${buildout:develop-eggs-directory}
-LOCAL_IPV4 = $${slap-configuration:ipv4-random}
-
-[sh-environment]
-# Section exposes testing default environment as sh file. It is thus easy
-# to directly develop and test the egg inside of this instance.
-recipe = collective.recipe.template
-input = inline:
-  export PATH="$${slapos-test-runner:prepend-path}:$PATH"
-  export CPPFLAGS="$${environment:CPPFLAGS}"
-  export LDFLAGS="$${environment:LDFLAGS}"
-  export PYTHONPATH="$${environment:PYTHONPATH}"
-  export PS1="[slapos-testing env Active] $PS1"
-output = $${create-directory:bin}/environment.sh
-mode = 755
+recipe = slapos.cookbook:wrapper
+wrapper-path = $${create-directory:bin}/runTestSuite
+command-line =
+  ${buildout:bin-directory}/runTestSuite
+  --python_interpreter=${buildout:bin-directory}/${eggs:interpreter}
+  --source_code_path_list=$${caucase:location},$${erp5.util:location},$${slapos.cookbook:location},$${slapos.core:location},$${slapos.recipe.build:location},$${slapos.recipe.cmmi:location},$${slapos.recipe.template:location},$${slapos.toolbox:location}
+
+# Notes about environment:
+# * slapos.cookbook:wrapper does not seem to allow "extending" PATH. Tests
+#   needs ping, which is a setuid binary that cannot be installed via slapos
+#   way of building software without root access, so we keep "standard"
+#   /usr/bin and /bin in $PATH
+# * LOCAL_IPV4 is needed for some slapos.core tests
+environment =
+  PATH=${coreutils:location}/bin:${curl:location}/bin:${openssl:location}/bin:${git:location}/bin:${libxslt:location}/bin:/usr/bin/:/bin/
+  LOCAL_IPV4=$${slap-configuration:ipv4-random}
+
 
 [phantomjs-wrapper]
 recipe = slapos.cookbook:wrapper
diff --git a/software/slapos-testing/software.cfg b/software/slapos-testing/software.cfg
index a1d503a392d6653401ff49c9402fa089b90858b0..beb80b33e696d538f3f710c9c77426bc8b12075b 100644
--- a/software/slapos-testing/software.cfg
+++ b/software/slapos-testing/software.cfg
@@ -6,26 +6,78 @@ extends =
   ../../component/libxml2/buildout.cfg
   ../../component/libxslt/buildout.cfg
   ../../component/bcrypt/buildout.cfg
-  ../../component/python-2.7/buildout.cfg
-  ../../component/python-setuptools/buildout.cfg
   ../../component/zlib/buildout.cfg
   ../../component/phantomjs/buildout.cfg
   ../../component/pycurl/buildout.cfg
+  ../../component/coreutils/buildout.cfg
   ../../stack/slapos.cfg
+  ./buildout.hash.cfg
 
 parts =
-  caucase-repository
-  slapos.cookbook-repository
-  slapos.core-repository
-  slapos.recipe.template-repository
-  slapos.recipe.build-repository
-  slapos.recipe.cmmi-repository
-  slapos.toolbox-repository
-  erp5-util-repository
+  bootstrap-slapos.recipe.cmmi
   eggs
   phantomjs
   template
 
+[bootstrap-slapos.recipe.cmmi]
+# install our develop version of slapos.recipe.cmmi before anything else,
+# otherwise it will be installed from pypi by dependencies.
+recipe = zc.recipe.egg
+eggs = ${slapos.recipe.cmmi-setup:egg}
+
+[setup-develop-egg]
+recipe = zc.recipe.egg:develop
+
+[caucase-setup]
+<= setup-develop-egg
+egg = caucase
+setup = ${caucase-repository:location}
+
+[erp5.util-setup]
+<= setup-develop-egg
+# XXX erp5.util does not have `test` extra require, but has a `testnode` extra require with same dependencies
+egg = erp5.util[testnode]
+setup = ${erp5.util-repository:location}
+depends = ${slapos.core-setup:egg}
+
+[slapos.cookbook-setup]
+<= setup-develop-egg
+# XXX slapos.cookbook does not have `test` extra require, `mock` is only listed in `tests_require` and is listed explicitly
+egg = slapos.cookbook
+setup = ${slapos.cookbook-repository:location}
+depends = ${slapos.core-setup:egg}
+
+[slapos.core-setup]
+<= setup-develop-egg
+# XXX slapos.cookbook does not have `test` extra require, `mock`, `pyflakes` and `httmock` are only listed in `tests_require` and are listed explicitly
+egg = slapos.core
+setup = ${slapos.core-repository:location}
+
+[slapos.recipe.build-setup]
+<= setup-develop-egg
+egg = slapos.recipe.build[test]
+setup = ${slapos.recipe.build-repository:location}
+
+[slapos.recipe.cmmi-setup]
+<= setup-develop-egg
+egg = slapos.recipe.cmmi[test]
+setup = ${slapos.recipe.cmmi-repository:location}
+depends = ${slapos.recipe.build-setup:egg}
+
+[slapos.recipe.template-setup]
+<= setup-develop-egg
+# XXX slapos.recipe.template does not have `test` extra require, `zope.testing` is only listed in `tests_require` and is listed explicitly
+egg = slapos.recipe.template
+setup = ${slapos.recipe.template-repository:location}
+
+[slapos.toolbox-setup]
+<= setup-develop-egg
+# XXX slapos.toolbox does not have `test` extra require, `mock` and `pycurl` are only listed in `tests_require` and are listed explicitly
+egg = slapos.toolbox
+setup = ${slapos.toolbox-repository:location}
+depends = ${slapos.core-setup:egg}
+
+
 [eggs]
 recipe = zc.recipe.egg
 eggs =
@@ -35,18 +87,24 @@ eggs =
   ${bcrypt:egg}
   dnspython
   Jinja2
-  caucase
-  erp5.util
-  slapos.cookbook
-  collective.recipe.template
-  plone.recipe.command
-  slapos.recipe.template
-  slapos.recipe.cmmi
-  slapos.toolbox
+  ${caucase-setup:egg}
+  ${erp5.util-setup:egg}
+  ${slapos.cookbook-setup:egg}
+  ${slapos.core-setup:egg}
+  ${slapos.recipe.build-setup:egg}
+  ${slapos.recipe.cmmi-setup:egg}
+  ${slapos.recipe.template-setup:egg}
+  ${slapos.toolbox-setup:egg}
+  mock
+  zope.testing
+  httmock
+  pyflakes
 entry-points =
   runTestSuite=erp5.util.testsuite:runTestSuite
 scripts =
   runTestSuite
+interpreter=
+  python_for_test
 
 [git-clone-repository]
 recipe = slapos.recipe.build:gitclone
@@ -58,6 +116,10 @@ branch = master
 <= git-clone-repository
 repository = https://lab.nexedi.com/nexedi/caucase.git
 
+[erp5.util-repository]
+<= git-clone-repository
+repository = https://lab.nexedi.com/nexedi/erp5.git
+
 [slapos.cookbook-repository]
 <= git-clone-repository
 repository = https://lab.nexedi.com/nexedi/slapos.git
@@ -73,28 +135,38 @@ repository = https://lab.nexedi.com/nexedi/slapos.recipe.template.git
 [slapos.recipe.build-repository]
 <= git-clone-repository
 repository = https://lab.nexedi.com/nexedi/slapos.recipe.build.git
+# We use the system git and not slapos provided one, because
+# slapos.recipe.build is a dependency of slapos.recipe.cmmi
+#git-executable = git
 
 [slapos.recipe.cmmi-repository]
 <= git-clone-repository
 repository = https://lab.nexedi.com/nexedi/slapos.recipe.cmmi.git
+# We use the system git and not slapos provided one, because slapos git needs
+# slapos.recipe.cmmi to be installed. This circular dependency cause parts to
+# be reinstalled everytime buildout is run because signatures are not stable.
+#git-executable = git
 
 [slapos.toolbox-repository]
 <= git-clone-repository
 repository = https://lab.nexedi.com/nexedi/slapos.toolbox.git
 
-[erp5-util-repository]
-<= git-clone-repository
-repository = https://lab.nexedi.com/nexedi/erp5.git
 
 [template]
 recipe = slapos.recipe.template
-url = ${:_profile_base_location_}/instance.cfg
-md5sum = 6626794c9dbb2530bb8ba3d331e27542
-output =  ${buildout:directory}/template.cfg
+url = ${:_profile_base_location_}/${:filename}
+output = ${buildout:directory}/template.cfg
 mode = 640
 
 [versions]
 Pygments = 2.1.3
-collective.recipe.template = 1.10
-plone.recipe.command = 1.1
-slapos.recipe.template = 4.3
+
+# clear the version of tested eggs, to make sure we installed the developped ones
+caucase =
+erp5.util =
+slapos.cookbook =
+slapos.core =
+slapos.recipe.build =
+slapos.recipe.cmmi =
+slapos.recipe.template =
+slapos.toolbox =