diff --git a/CHANGES.txt b/CHANGES.txt
index 7c7a38458e224a4f4c423db31c427649ee1cfc25..24aa9f7da384819c5e306962ccac970b37d0ca34 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,11 +1,21 @@
 Changes
 =======
 
-0.46 (Unreleased)
+0.48 (Unreleased)
 -----------------
 
   * No change yet.
 
+0.47 (2012-04-19)
+-----------------
+
+  * Slap Test Agent [Yingjie Xu]
+
+0.46 (2012/04/12)
+-----------------
+
+  * xvfb and firefox initial release [Romain Courteaud]
+
 0.45 (2012-03-29)
 -----------------
 
diff --git a/component/firefox/buildout.cfg b/component/firefox/buildout.cfg
index b55f70653aa8868102cf284871f62e3dfeabd41b..dc1160d3cb8468e10b6ce7b52bf8279eab79da57 100644
--- a/component/firefox/buildout.cfg
+++ b/component/firefox/buildout.cfg
@@ -6,6 +6,8 @@ extends =
   ../dbus/buildout.cfg
   ../gtk-2/buildout.cfg
   ../libpng/buildout.cfg
+  ../dash/buildout.cfg
+  ../openssl/buildout.cfg
 
 parts =
   firefox
@@ -30,11 +32,11 @@ script =
   self.copyTree(workdir, "%(location)s")
   wrapper_location = os.path.join("%(location)s", "firefox-slapos")
   wrapper = open(wrapper_location, 'w')
-  wrapper.write("""#!/bin/sh
+  wrapper.write("""#!${dash:location}/bin/dash
   cd %(location)s
-  export LD_LIBRARY_PATH=${libXrender:location}/lib/:${fontconfig:location}/lib/:${dbus:location}/lib/:${dbus-glib:location}/lib/:${pango:location}/lib:${cairo:location}/lib:${glib:location}/lib:${gtk-2:location}/lib:${atk:location}/lib:${gdk-pixbuf:location}/lib:${libXt:location}/lib:${libpng:location}/lib:${libSM:location}/lib:${libICE:location}/lib:${alsa:location}/lib:%(location)s
+  export LD_LIBRARY_PATH=%(location)s:${libXrender:location}/lib/:${freetype:location}/lib/:${fontconfig:location}/lib/:${libX11:location}/lib/:${bzip2:location}/lib/:${libXext:location}/lib/:${libXt:location}/lib/:${zlib:location}/lib/:${libXcursor:location}/lib/:${gtk-2:location}/lib/:${cairo:location}/lib/:${pango:location}/lib/:${glib:location}/lib/:${atk:location}/lib/:${gdk-pixbuf:location}/lib/:${alsa:location}/lib/:${libpng:location}/lib/:${libSM:location}/lib/:${libICE:location}/lib:${libxml2:location}/lib:${openssl:location}/lib
   export PATH=${fontconfig:location}/bin:$PATH
-  %(location)s/firefox $*""")
+  exec %(location)s/firefox $*""")
   wrapper.close()
   os.chmod(wrapper_location, 0777)
 
diff --git a/component/fontconfig/buildout.cfg b/component/fontconfig/buildout.cfg
index 37eb1d0bae94764c5701fcd10445d6ec62ce216c..228953fa4da14a3782e212448956e46e11eb3475 100644
--- a/component/fontconfig/buildout.cfg
+++ b/component/fontconfig/buildout.cfg
@@ -6,6 +6,7 @@ extends =
   ../pkgconfig/buildout.cfg
   ../bzip2/buildout.cfg
   ../zlib/buildout.cfg
+  ../bzip2/buildout.cfg
 
 parts =
   fontconfig
diff --git a/component/gnutls/buildout.cfg b/component/gnutls/buildout.cfg
index 4bb35dd949bbca6932c0385928880cca3f4998e3..8e92bfc932f8bd7c8b39380e7dc7f1ec4ae34162 100644
--- a/component/gnutls/buildout.cfg
+++ b/component/gnutls/buildout.cfg
@@ -13,13 +13,13 @@ md5sum = 7c2710ef439f82ac429b88fec88e9a4c
 
 [gcrypt]
 recipe = hexagonit.recipe.cmmi
-url = ftp://ftp.gnupg.org/gcrypt/libgcrypt/libgcrypt-1.4.6.tar.gz
-md5sum = bfd45922eefb8a24d598af77366220d4
+url = ftp://ftp.gnupg.org/gcrypt/libgcrypt/libgcrypt-1.5.0.tar.gz
+md5sum = 78f8f8bec4580f75b25816f7896d0389
 configure-options =
   --with-gpg-error-prefix=${gpg-error:location}
 environment =
   CPPFLAGS=-I${gpg-error:location}/include
-  LDFLAGS=-Wl,-rpath -Wl,${gpg-error:location}/lib -Wl,${gpg-error:location}/lib/libgpg-error.so.0
+  LDFLAGS=-lgpg-error -L${gpg-error:location}/lib -Wl,-rpath=${gpg-error:location}/lib
 
 [gnutls]
 # XXX-Cedric : update to latest gnutls
@@ -28,7 +28,8 @@ url = ftp://ftp.gnupg.org/gcrypt/gnutls/gnutls-2.8.6.tar.bz2
 md5sum = eb0a6d7d3cb9ac684d971c14f9f6d3ba
 configure-options =
   --with-libgcrypt-prefix=${gcrypt:location}
+  --disable-static
 environment =
   CPPFLAGS=-I${zlib:location}/include -I${readline:location}/include -I${ncurses:location}/include -I${ncurses:location}/include/ncursesw -I${gcrypt:location}/include -I${gpg-error:location}/include
-  LDFLAGS=-L${readline:location}/lib -L${ncurses:location}/lib -L${gcrypt:location}/lib -Wl,-rpath -Wl,${zlib:location}/lib -Wl,-rpath -Wl,${readline:location}/lib -Wl,-rpath -Wl,${ncurses:location}/lib -Wl,-rpath -Wl,${gcrypt:location}/lib -Wl,-rpath -Wl,${gpg-error:location}/lib -Wl,${gcrypt:location}/lib/libgcrypt.so.11
+  LDFLAGS=-lgcrypt -L${readline:location}/lib -Wl,-rpath=${readline:location}/lib -L${ncurses:location}/lib -Wl,-rpath=${ncurses:location}/lib -L${gcrypt:location}/lib -Wl,-rpath=${gcrypt:location}/lib -L${zlib:location}/lib -Wl,-rpath=${zlib:location}/lib -L${gpg-error:location}/lib -Wl,-rpath=${gpg-error:location}/lib
   PKG_CONFIG=${zlib:location}/lib/pkgconfig
diff --git a/component/gtk-2/buildout.cfg b/component/gtk-2/buildout.cfg
index 611f34efb7ce7f7283da2d9b8f9e2d9bb4172d27..57314273d8cacc31a91951d207c27bd8b2da77a7 100644
--- a/component/gtk-2/buildout.cfg
+++ b/component/gtk-2/buildout.cfg
@@ -37,8 +37,8 @@ configure-options =
 environment = 
   PATH=${glib:location}/bin:${freetype:location}/bin:${pkgconfig:location}/bin:%(PATH)s
   PKG_CONFIG_PATH=${glib:location}/lib/pkgconfig:${fontconfig:location}/lib/pkgconfig:${freetype:location}/lib/pkgconfig:${cairo:location}/lib/pkgconfig::${libXrender:location}/lib/pkgconfig
-  CPPFLAGS=-I${cairo:location}/include/cairo
-  LDFLAGS=-L${zlib:location}/lib -Wl,-rpath=${zlib:location}/lib -L${libXrender:location}/lib -Wl,-rpath=${libXrender:location}/lib -lXrender
+  CPPFLAGS=-I${cairo:location}/include/cairo -I${libX11:location}/include/X11 -I${libxcb:location}/include/xcb -I${libXau:location}/include/X11 -I${bzip2:location}/include -L${libXrender:location}/include -I${zlib:location}/include
+  LDFLAGS=-L${cairo:location}/lib -Wl,-rpath=${cairo:location}/lib -L${libX11:location}/lib -Wl,-rpath=${libX11:location}/lib -L${libxcb:location}/lib -Wl,-rpath=${libxcb:location}/lib -L${libXau:location}/lib -Wl,-rpath=${libXau:location}/lib -L${bzip2:location}/lib -Wl,-rpath=${bzip2:location}/lib -L${libXrender:location}/lib -Wl,-rpath=${libXrender:location}/lib -lXrender -L${zlib:location}/lib -Wl,-rpath=${zlib:location}/lib
   LD_LIBRARY_PATH=${render:location}/lib:${libX11:location}/lib:${libXrender:location}/lib
 
 [gdk-pixbuf]
@@ -74,9 +74,10 @@ configure-options =
   --disable-cups
   --disable-papi
   --enable-explicit-deps
+  --disable-xinerama
 environment = 
   PATH=${gdk-pixbuf:location}/bin:${glib:location}/bin:${pkgconfig:location}/bin:%(PATH)s
-  PKG_CONFIG_PATH=${glib:location}/lib/pkgconfig:${gettext:location}/lib/pkgconfig:${fontconfig:location}/lib/pkgconfig:${freetype:location}/lib/pkgconfig:${libXau:location}/lib/pkgconfig:${xproto:location}/lib/pkgconfig:${cairo:location}/lib/pkgconfig:${atk:location}/lib/pkgconfig:${gdk-pixbuf:location}/lib/pkgconfig:${pango:location}/lib/pkgconfig:${libX11:location}/lib/pkgconfig:${libXext:location}/lib/pkgconfig:${pixman:location}/lib/pkgconfig:${libpng:location}/lib/pkgconfig:${kbproto:location}/lib/pkgconfig:${libXrender:location}/lib/pkgconfig:${xextproto:location}/lib/pkgconfig:${libxcb:location}/lib/pkgconfig:${xcbproto:location}/lib/pkgconfig:${xorg-libpthread-stubs:location}/lib/pkgconfig
-  CPPFLAGS=-I${libtiff:location}/include -I${libjpeg:location}/include -I${libpng:location}/include -I${libX11:location}/include/ -I${xproto:location}/include -I${kbproto:location}/include -I${libXrender:location}/include -I${render:location}/include -I${libXext:location}/include -I${cairo:location}/include/cairo
-  LDFLAGS=-L${gettext:location}/lib -L${glib:location}/lib -L${libtiff:location}/lib -L${libjpeg:location}/lib -L${libpng:location}/lib -L${zlib:location}/lib -L${libXrender:location}/lib -L${libX11:location}/lib -L${libXext:location}/lib -L${pango:location}/lib
+  PKG_CONFIG_PATH=${glib:location}/lib/pkgconfig:${fontconfig:location}/lib/pkgconfig:${freetype:location}/lib/pkgconfig:${libXau:location}/lib/pkgconfig:${xproto:location}/lib/pkgconfig:${cairo:location}/lib/pkgconfig:${atk:location}/lib/pkgconfig:${gdk-pixbuf:location}/lib/pkgconfig:${pango:location}/lib/pkgconfig:${libX11:location}/lib/pkgconfig:${libXext:location}/lib/pkgconfig:${pixman:location}/lib/pkgconfig:${libpng:location}/lib/pkgconfig:${kbproto:location}/lib/pkgconfig:${libXrender:location}/lib/pkgconfig:${xextproto:location}/lib/pkgconfig:${libxcb:location}/lib/pkgconfig:${xcbproto:location}/lib/pkgconfig:${xorg-libpthread-stubs:location}/lib/pkgconfig
+  CPPFLAGS=-I${libtiff:location}/include -I${libjpeg:location}/include -I${libpng:location}/include -I${libX11:location}/include/ -I${xproto:location}/include -I${kbproto:location}/include -I${libXrender:location}/include -I${render:location}/include -I${libXext:location}/include -I${cairo:location}/include/cairo -I${zlib:location}/include -I${bzip2:location}/include -I${libXdmcp:location}/include -I${glib:location}/include/gio-unix-2.0 -I${glib:location}/include/glib-2.0 -I${glib:location}/include -I${atk:location}/include/atk-1.0
+  LDFLAGS=-L${libtiff:location}/lib -Wl,-rpath=${libtiff:location}/lib -L${libjpeg:location}/lib -Wl,-rpath=${libjpeg:location}/lib -L${libpng:location}/lib -Wl,-rpath=${libpng:location}/lib -L${libX11:location}/lib -Wl,-rpath=${libX11:location}/lib -L${xproto:location}/lib -Wl,-rpath=${xproto:location}/lib -L${kbproto:location}/lib -Wl,-rpath=${kbproto:location}/lib -L${libXrender:location}/lib -Wl,-rpath=${libXrender:location}/lib -L${render:location}/lib -Wl,-rpath=${render:location}/lib -L${libXext:location}/lib -Wl,-rpath=${libXext:location}/lib -L${cairo:location}/lib -Wl,-rpath=${cairo:location}/lib -L${zlib:location}/lib -Wl,-rpath=${zlib:location}/lib -L${bzip2:location}/lib -Wl,-rpath=${bzip2:location}/lib -L${libXdmcp:location}/lib -Wl,-rpath=${libXdmcp:location}/lib -L${glib:location}/lib -Wl,-rpath=${glib:location}/lib  -L${atk:location}/lib -Wl,-rpath=${atk:location}/lib -L${gettext:location}/lib -Wl,-rpath=${gettext:location}/lib
   LD_LIBRARY_PATH=${glib:location}/lib:${gettext:location}/lib:${libX11:location}/lib
diff --git a/component/xorg/buildout.cfg b/component/xorg/buildout.cfg
index edc919ff94c7b4030ce8f66c67fb5d3eeb32dfa5..a0f01585a59a1197d9197c5c878acb2d9119d2e8 100644
--- a/component/xorg/buildout.cfg
+++ b/component/xorg/buildout.cfg
@@ -7,12 +7,19 @@ extends =
   ../libxslt/buildout.cfg
   ../pkgconfig/buildout.cfg
   ../zlib/buildout.cfg
+  ../bzip2/buildout.cfg
   ../openssl/buildout.cfg
+  ../gnutls/buildout.cfg
+  ../autoconf/buildout.cfg
+  ../automake/buildout.cfg
+  ../libtool/buildout.cfg
+  ../dash/buildout.cfg
 
 parts =
   libXdmcp
   libXext
   libXau
+  libXinerama
   libSM
   libXrender
 
@@ -48,10 +55,21 @@ environment =
   PKG_CONFIG_PATH=${xorg-util-macros:location}/share/pkgconfig
   PATH=${pkgconfig:location}/bin:%(PATH)s
 
+[xtrans-tmp-env-patch]
+recipe = hexagonit.recipe.download
+url = ${:_profile_base_location_}/${:filename}
+download-only = true
+filename = xtrans_tmp_env.patch
+md5sum = 37d82a3b6009113023599632117a6855
+
 [xtrans]
 recipe = hexagonit.recipe.cmmi
 url = http://www.x.org/releases/X11R7.6/src/lib/xtrans-1.2.6.tar.bz2
 md5sum = c66f9ffd2da4fb012220c6c40ebc7609
+patches =
+  ${xtrans-tmp-env-patch:location}/${xtrans-tmp-env-patch:filename}
+patches_md5sum = ${xtrans-tmp-env-patch:md5sum}
+patch-options = -p1
 configure-options =
   --disable-docs
   --without-xmlto
@@ -83,10 +101,21 @@ recipe = hexagonit.recipe.cmmi
 url = http://www.x.org/releases/X11R7.6/src/xcb/libpthread-stubs-0.3.tar.bz2
 md5sum = e8fa31b42e13f87e8f5a7a2b731db7ee
 
+[libxcb-tmp-env-patch]
+recipe = hexagonit.recipe.download
+url = ${:_profile_base_location_}/${:filename}
+download-only = true
+filename = xcb_tmp_env.patch
+md5sum = 61f39878120ba434a169e24cae2af862
+
 [libxcb]
 recipe = hexagonit.recipe.cmmi
 url = http://www.x.org/releases/X11R7.6/src/xcb/libxcb-1.7.tar.bz2
 md5sum = 925699df361b99491165ebc12068056b
+patches =
+  ${libxcb-tmp-env-patch:location}/${libxcb-tmp-env-patch:filename}
+patches_md5sum = ${libxcb-tmp-env-patch:md5sum}
+patch-options = -p1
 configure-options =
   --disable-static
   --disable-build-docs
@@ -153,7 +182,7 @@ configure-options =
   --without-xmlto
   --without-fop
 environment =
-  PKG_CONFIG_PATH=${xorg-util-macros:location}/share/pkgconfig:${xproto:location}/lib/pkgconfig:${xextproto:location}/lib/pkgconfig:${xtrans:location}/share/pkgconfig:${libxcb:location}/lib/pkgconfig:${xorg-libpthread-stubs:location}/lib/pkgconfig:${libXau:location}/lib/pkgconfig:${inputproto:location}/lib/pkgconfig:${kbproto:location}/lib/pkgconfig
+  PKG_CONFIG_PATH=${xproto:location}/lib/pkgconfig:${xextproto:location}/lib/pkgconfig:${xtrans:location}/share/pkgconfig:${libxcb:location}/lib/pkgconfig:${xorg-libpthread-stubs:location}/lib/pkgconfig:${libXau:location}/lib/pkgconfig:${inputproto:location}/lib/pkgconfig:${kbproto:location}/lib/pkgconfig
   LD_LIBRARY_PATH=${xproto:location}/lib:${xextproto:location}/lib:${libxcb:location}/lib
   LD_RUN_PATH=${xproto:location}/lib:${xextproto:location}/lib:${libxcb:location}/lib
   PATH=${pkgconfig:location}/bin:%(PATH)s
@@ -243,6 +272,7 @@ environment =
   LD_LIBRARY_PATH=${xproto:location}/lib/
   LD_RUN_PATH=${xproto:location}/lib/
   CPPFLAGS=-I${xproto:location}/include/ -I${zlib:location}/include
+  LDFLAGS=-L${xproto:location}/lib -Wl,-rpath=${xproto:location}/lib -L${zlib:location}/lib -Wl,-rpath=${zlib:location}/lib 
   PATH=${pkgconfig:location}/bin:%(PATH)s
 
 [libXfont]
@@ -253,8 +283,8 @@ environment =
   PKG_CONFIG_PATH=${fontsproto:location}/lib/pkgconfig:${libfontenc:location}/lib/pkgconfig:${xproto:location}/lib/pkgconfig:${xtrans:location}/share/pkgconfig:${freetype:location}/lib/pkgconfig
   LD_LIBRARY_PATH=${fontsproto:location}/lib:${libfontenc:location}/lib:${xtrans:location}/include/:${xproto:location}/lib/:${freetype:location}/lib
   LD_RUN_PATH=${fontsproto:location}/lib:${libfontenc:location}/lib:${xproto:location}/lib/:${xtrans:location}/include/:${freetype:location}/lib
-  LDFLAGS=-L${zlib:location}/lib
-  CPPFLAGS=-I${zlib:location}/include
+  LDFLAGS=-L${zlib:location}/lib -Wl,-rpath=${zlib:location}/lib -L${bzip2:location}/lib -Wl,-rpath=${bzip2:location}/lib -L${libfontenc:location}/lib -Wl,-rpath=${libfontenc:location}/lib 
+  CPPFLAGS=-I${zlib:location}/include -I${bzip2:location}/include -I${libfontenc:location}/include
   PATH=${pkgconfig:location}/bin:%(PATH)s
 
 [libxkbfile]
@@ -308,11 +338,14 @@ md5sum = d43c2afc69937655d13c02588c9ff974
 recipe = hexagonit.recipe.cmmi
 url = http://xlibs.freedesktop.org/release/libXrender-0.9.0.tar.bz2
 md5sum = ce7cda009aa0b10a73637941d44ae789
+configure-options =
+  --disable-static
 environment =
-  PKG_CONFIG_PATH=${render:location}/lib/pkgconfig:${libX11:location}/lib/pkgconfig
-  CPPFLAGS=-I${libX11:location}/include/ -I${xproto:location}/include -I${kbproto:location}/include
+  PKG_CONFIG_PATH=${renderproto:location}/lib/pkgconfig:${xorg-util-macros:location}/share/pkgconfig:${render:location}/lib/pkgconfig:${libX11:location}/lib/pkgconfig
+  CPPFLAGS=-I${renderproto:location}/include/ -I${libX11:location}/include/ -I${libxcb:location}/include -I${libXau:location}/include -I${libXdmcp:location}/include -I${xproto:location}/include -I${kbproto:location}/include
   LD_LIBRARY_PATH=${render:location}/lib:${libX11:location}/lib
   LD_RUN_PATH=${render:location}/lib
+  LDFLAGS=-L${libX11:location}/lib -Wl,-rpath=${libX11:location}/lib -L${libxcb:location}/lib -Wl,-rpath=${libxcb:location}/lib -L${libXau:location}/lib -Wl,-rpath=${libXau:location}/lib -L${libXdmcp:location}/lib -Wl,-rpath=${libXdmcp:location}/lib 
   PATH=${pkgconfig:location}/bin:%(PATH)s
 
 [libXinerama]
@@ -350,33 +383,14 @@ environment =
   PATH=${pkgconfig:location}/bin:%(PATH)s
   LIBUUID_CFLAGS=-I${libuuid:location}/include
 
-[renderproto]
-recipe = hexagonit.recipe.cmmi
-url = http://www.x.org/releases/X11R7.6/src/proto/renderproto-0.11.1.tar.bz2
-md5sum = a914ccc1de66ddeb4b611c6b0686e274
-
-[libXrender]
-recipe = hexagonit.recipe.cmmi
-url = http://www.x.org/releases/X11R7.6/src/lib/libXrender-0.9.6.tar.bz2
-md5sum = 3b3b7d076c2384b6c600c0b5f4ba971f
-configure-options =
-  --disable-static
-environment =
-  PKG_CONFIG_PATH=${libX11:location}/lib/pkgconfig:${renderproto:location}/lib/pkgconfig:${xorg-util-macros:location}/share/pkgconfig
-  PATH=${pkgconfig:location}/bin:%(PATH)s
-  CPPFLAGS=-I${libX11:location}/include -I${renderproto:location}/include -I${xproto:location}/include
-
 [libXt]
 recipe = hexagonit.recipe.cmmi
 url = http://www.x.org/releases/X11R7.6/src/lib/libXt-1.0.9.tar.bz2
 md5sum = 8a414f8f2327aaa616ca2dcac1f5d8c3
-configure-options = 
-  --disable-static
 environment =
   PATH=${pkgconfig:location}/bin:%(PATH)s
-    PKG_CONFIG_PATH=${render:location}/lib/pkgconfig:${libX11:location}/lib/pkgconfig:${xproto:location}/lib/pkgconfig:${kbproto:location}/lib/pkgconfig:${libSM:location}/lib/pkgconfig:${libICE:location}/lib/pkgconfig
-    CPPFLAGS=-I${xproto:location}/include -I${libX11:location}/include -I${libSM:location}/include -I${libICE:location}/include -I${kbproto:location}/include
-
+  PKG_CONFIG_PATH=${libSM:location}/lib/pkgconfig:${kbproto:location}/lib/pkgconfig:${libICE:location}/lib/pkgconfig:${xproto:location}/lib/pkgconfig:${libX11:location}/lib/pkgconfig
+  CPPFLAGS=-I${libSM:location}/include -I${kbproto:location}/include -I${libICE:location}/include -I${xproto:location}/include -I${libX11:location}/include
 
 [dri2proto]
 recipe = hexagonit.recipe.cmmi
@@ -440,11 +454,50 @@ environment =
   PKG_CONFIG_PATH=${damageproto:location}/lib/pkgconfig:${xfixes:location}/lib/pkgconfig:${fixesproto:location}/lib/pkgconfig:${xextproto:location}/lib/pkgconfig:${libX11:location}/lib/pkgconfig
   CPPFLAGS=-I${libX11:location}/include -I${xproto:location}/include -I${fixesproto:location}/include -I${xextproto:location}/include -I${damageproto:location}/include -I${xfixes:location}/include 
 
+[xorg-tmp-env-patch]
+recipe = hexagonit.recipe.download
+url = ${:_profile_base_location_}/${:filename}
+download-only = true
+filename = tmp_env.patch
+md5sum = 8b60ab8121f0564a681fc00d03101696
+
+[libxmu]
+recipe = hexagonit.recipe.cmmi
+url = http://www.x.org/releases/X11R7.6/src/lib/libXmu-1.1.0.tar.gz
+md5sum = 15e1cb9aaf97eae169bfe6944e0a541e
+environment =
+  PATH=${pkgconfig:location}/bin:%(PATH)s
+  PKG_CONFIG_PATH=${xextproto:location}/lib/pkgconfig:${libX11:location}/lib/pkgconfig:${libXext:location}/lib/pkgconfig:${libXt:location}/lib/pkgconfig
+  CPPFLAGS=-I${libX11:location}/include -I${xextproto:location}/include
+
+[libXcursor]
+recipe = hexagonit.recipe.cmmi
+url = http://www.x.org/releases/X11R7.6/src/lib/libXcursor-1.1.11.tar.gz
+md5sum = 55558a41d0bcf9210636858844fa4d2f
+environment =
+  PATH=${pkgconfig:location}/bin:%(PATH)s
+  PKG_CONFIG_PATH=${render:location}/lib/pkgconfig:${xproto:location}/lib/pkgconfig:${fixesproto:location}/lib/pkgconfig:${libX11:location}/lib/pkgconfig:${xfixes:location}/lib/pkgconfig:${libXrender:location}/lib/pkgconfig
+  CPPFLAGS=-I${render:location}/include -I${xproto:location}/include -I${fixesproto:location}/include -I${libX11:location}/include -I${xfixes:location}/include -I${libXrender:location}/include
+
+[xwd]
+recipe = hexagonit.recipe.cmmi
+url = http://www.x.org/releases/X11R7.6/src/app/xwd-1.0.4.tar.gz
+md5sum = f8da771069756210833524b5afa1832c
+environment =
+  PATH=${pkgconfig:location}/bin:%(PATH)s
+  PKG_CONFIG_PATH=${xorg-util-macros:location}/share/pkgconfig:${xproto:location}/lib/pkgconfig:${libX11:location}/lib/pkgconfig:${libxkbfile:location}/lib/pkgconfig
+  CPPFLAGS=-I${xproto:location}/include -I${libX11:location}/include -I${libxkbfile:location}/include# -I${xfixes:location}/include -I${libXrender:location}/include
+  LDFLAGS=-L${xproto:location}/lib -Wl,-rpath=${xproto:location}/lib -L${libX11:location}/lib -Wl,-rpath=${libX11:location}/lib -L${libxkbfile:location}/lib -Wl,-rpath=${libxkbfile:location}/lib -lX11
+
 [xserver]
 # Adds Xvfb functionnality
 recipe = hexagonit.recipe.cmmi
 url = http://www.x.org/releases/X11R7.6/src/xserver/xorg-server-1.9.3.tar.bz2
 md5sum = 5bef6839a76d029204ab31aa2fcb5201
+patches =
+  ${xorg-tmp-env-patch:location}/${xorg-tmp-env-patch:filename}
+patches_md5sum = ${xorg-tmp-env-patch:md5sum}
+patch-options = -p1
 configure-options =
   --enable-xvfb
   --disable-aiglx
@@ -454,15 +507,13 @@ configure-options =
   --disable-dri
   --disable-dri2
   --disable-xorg
-  --disable-xprint
   --disable-config-hal
+  --disable-tcp-transport
   --with-xkb-bin-directory=${xkbcomp:location}/bin
   --with-xkb-path=${xkeyboard-config:location}/share/X11/xkb
-#XXX-Cedric : The following can be safely removed as soon as Xvfb is known as working
-#  --with-default-font-path="${xfree86-fonts:location}/share/fonts/X11/Type1,${fontutil:location}/share/fonts/X11/75dpi,${cursor-fonts:location}/share/fonts/X11/misc"
-#depends = ${adobe-75dpi-fonts:location}
+  --with-sha1=libgcrypt
 environment =
-  PKG_CONFIG_PATH=${pixman:location}/lib/pkgconfig:${openssl:location}/lib/pkgconfig:${xorg-util-macros:location}/share/pkgconfig:${fixesproto:location}/lib/pkgconfig:${damageproto:location}/lib/pkgconfig:${xcmiscproto:location}/lib/pkgconfig:${xtrans:location}/share/pkgconfig:${bigreqsproto:location}/lib/pkgconfig:${xproto:location}/lib/pkgconfig:${randrproto:location}/lib/pkgconfig:${renderproto:location}/lib/pkgconfig:${xextproto:location}/lib/pkgconfig:${inputproto:location}/lib/pkgconfig:${kbproto:location}/lib/pkgconfig:${fontsproto:location}/lib/pkgconfig:${videoproto:location}/lib/pkgconfig:${recordproto:location}/lib/pkgconfig:${resourceproto:location}/lib/pkgconfig:${xineramaproto:location}/lib/pkgconfig:${libXau:location}/lib/pkgconfig:${libxkbfile:location}/lib/pkgconfig:${libXfont:location}/lib/pkgconfig
-  CPPFLAGS=-I${xproto:location}/include -I${pixman:location}/include/pixman-1 -I${xextproto:location}/include -I${inputproto:location}/include -I${fontsproto:location}/include -I${kbproto:location}/include -I${xineramaproto:location}/include -I${renderproto:location}/include -I${bigreqsproto:location}/include -I${videoproto:location}/include -I${resourceproto:location}/include -I${xcmiscproto:location}/include -I${xtrans:location}/include -I${libXau:location}/include -I${randrproto:location}/include -I${libxkbfile:location}/include -I${recordproto:location}/include -I${fixesproto:location}/include -I${damageproto:location}/include
+  PKG_CONFIG_PATH=${pixman:location}/lib/pkgconfig:${openssl:location}/lib/pkgconfig:${xorg-util-macros:location}/share/pkgconfig:${fixesproto:location}/lib/pkgconfig:${damageproto:location}/lib/pkgconfig:${xcmiscproto:location}/lib/pkgconfig:${xtrans:location}/share/pkgconfig:${bigreqsproto:location}/lib/pkgconfig:${xproto:location}/lib/pkgconfig:${randrproto:location}/lib/pkgconfig:${renderproto:location}/lib/pkgconfig:${xextproto:location}/lib/pkgconfig:${inputproto:location}/lib/pkgconfig:${kbproto:location}/lib/pkgconfig:${fontsproto:location}/lib/pkgconfig:${videoproto:location}/lib/pkgconfig:${recordproto:location}/lib/pkgconfig:${resourceproto:location}/lib/pkgconfig:${xineramaproto:location}/lib/pkgconfig:${libXau:location}/lib/pkgconfig:${libxkbfile:location}/lib/pkgconfig:${libXfont:location}/lib/pkgconfig:${gpg-error:location}/lib/pkgconfig
+  CPPFLAGS=-I${xproto:location}/include -I${pixman:location}/include/pixman-1 -I${xextproto:location}/include -I${inputproto:location}/include -I${fontsproto:location}/include -I${kbproto:location}/include -I${xineramaproto:location}/include -I${renderproto:location}/include -I${bigreqsproto:location}/include -I${videoproto:location}/include -I${resourceproto:location}/include -I${xcmiscproto:location}/include -I${xtrans:location}/include -I${libXau:location}/include -I${randrproto:location}/include -I${libxkbfile:location}/include -I${recordproto:location}/include -I${fixesproto:location}/include -I${damageproto:location}/include -I${bzip2:location}/include -I${gcrypt:location}/include -I${zlib:location}/include -I${libfontenc:location}/include -I${gpg-error:location}/include
   PATH=${pkgconfig:location}/bin:%(PATH)s
-  LDFLAGS=-Wl,-rpath,${openssl:location}/lib
+  LDFLAGS=-L${gcrypt:location}/lib -L${bzip2:location}/lib -Wl,-rpath=${gcrypt:location}/lib -Wl,-rpath=${openssl:location}/lib -Wl,-rpath=${bzip2:location}/lib -L${zlib:location}/lib -Wl,-rpath=${zlib:location}/lib -L${libfontenc:location}/lib -Wl,-rpath=${libfontenc:location}/lib -L${libXau:location}/lib -Wl,-rpath=${libXau:location}/lib -L${gpg-error:location}/lib -Wl,-rpath=${gpg-error:location}/lib
diff --git a/component/xorg/tmp_env.patch b/component/xorg/tmp_env.patch
new file mode 100644
index 0000000000000000000000000000000000000000..03cd55ff6b4ef0dac85a9ea174fee057804f08e3
--- /dev/null
+++ b/component/xorg/tmp_env.patch
@@ -0,0 +1,30 @@
+--- xorg-server-1.9.3/os/utils.c.old	2012-03-29 18:20:02.000000000 +0200
++++ xorg-server-1.9.3/os/utils.c	2012-03-29 18:39:33.000000000 +0200
+@@ -226,7 +226,26 @@ OsSignal(int sig, OsSigHandlerPtr handle
+  * server at a time.  This keeps the servers from stomping on each other
+  * if the user forgets to give them different display numbers.
+  */
+-#define LOCK_DIR "/tmp"
++char *
++getcompatibleenv(const char *name, const char *compatible)
++{
++  static char path_list[1][PATH_MAX];
++  char *dir;
++
++  if (path_list[0][0]) {
++    return path_list[0];
++  }
++
++  dir = getenv(name);
++  if (dir == NULL) {
++    return strncpy(path_list[0], compatible, PATH_MAX);
++  } else {
++    return strncpy(path_list[0], dir, PATH_MAX);
++  }
++
++}
++
++#define LOCK_DIR getcompatibleenv("TMPDIR", "/tmp")
+ #define LOCK_TMP_PREFIX "/.tX"
+ #define LOCK_PREFIX "/.X"
+ #define LOCK_SUFFIX "-lock"
diff --git a/component/xorg/xcb_tmp_env.patch b/component/xorg/xcb_tmp_env.patch
new file mode 100644
index 0000000000000000000000000000000000000000..cefa556c8210a13d4916529854d8aa37971a7f58
--- /dev/null
+++ b/component/xorg/xcb_tmp_env.patch
@@ -0,0 +1,36 @@
+--- libxcb-1.7/src/xcb_util.c.back	2012-04-03 13:30:36.000000000 +0200
++++ libxcb-1.7/src/xcb_util.c	2012-04-03 14:47:00.000000000 +0200
+@@ -147,11 +147,31 @@
+ static int _xcb_open_abstract(char *protocol, const char *file, size_t filelen);
+ #endif
+ 
++char *
++_xcb_getandappendcompatibleenv(const char *name, const char *compatible, const char *suffix)
++{
++  static char path_list[1][PATH_MAX];
++  char *dir;
++
++  if (path_list[0][0])
++  {
++    return path_list[0];
++  }
++
++  dir = getenv(name);
++  if (dir == NULL) {
++    strncpy(path_list[0], compatible, PATH_MAX);
++  } else {
++    strncpy(path_list[0], dir, PATH_MAX);
++  }
++  return strncat(path_list[0], suffix, PATH_MAX);
++}
++
+ static int _xcb_open(const char *host, char *protocol, const int display)
+ {
+     int fd;
+-    static const char unix_base[] = "/tmp/.X11-unix/X";
+-    const char *base = unix_base;
++    char *base;
++    base = _xcb_getandappendcompatibleenv("TMPDIR", "/tmp", "/.X11-unix/X");
+     size_t filelen;
+     char *file = NULL;
+     int actual_filelen;
diff --git a/component/xorg/xtrans_tmp_env.patch b/component/xorg/xtrans_tmp_env.patch
new file mode 100644
index 0000000000000000000000000000000000000000..24d3672b6872febb253bd9038e5c86574a5b654b
--- /dev/null
+++ b/component/xorg/xtrans_tmp_env.patch
@@ -0,0 +1,64 @@
+--- xtrans-1.2.6/Xtranssock.c.old	2012-03-29 14:25:45.000000000 +0200
++++ xtrans-1.2.6/Xtranssock.c	2012-03-29 18:40:54.000000000 +0200
+@@ -207,29 +207,49 @@ static int TRANS(SocketINETClose) (Xtran
+ #ifdef UNIXCONN
+ 
+ 
++char *
++getandappendcompatibleenv(const int index, const char *name, const char *compatible, const char *suffix)
++{
++  static char path_list[2][PATH_MAX];
++  char *dir;
++
++  if (path_list[index][0])
++  {
++    return path_list[index];
++  }
++
++  dir = getenv(name);
++  if (dir == NULL) {
++    strncpy(path_list[index], compatible, PATH_MAX);
++  } else {
++    strncpy(path_list[index], dir, PATH_MAX);
++  }
++  return strncat(path_list[index], suffix, PATH_MAX);
++}
++
+ #if defined(X11_t)
+-#define UNIX_PATH "/tmp/.X11-unix/X"
+-#define UNIX_DIR "/tmp/.X11-unix"
++#define UNIX_PATH getandappendcompatibleenv(0, "TMPDIR", "/tmp", "/.X11-unix/X")
++#define UNIX_DIR getandappendcompatibleenv(1, "TMPDIR", "/tmp", "/.X11-unix")
+ #endif /* X11_t */
+ #if defined(XIM_t)
+-#define UNIX_PATH "/tmp/.XIM-unix/XIM"
+-#define UNIX_DIR "/tmp/.XIM-unix"
++#define UNIX_PATH getandappendcompatibleenv(0, "TMPDIR", "/tmp", "/.XIM-unix/XIM")
++#define UNIX_DIR getandappendcompatibleenv(1, "TMPDIR", "/tmp", "/.XIM-unix")
+ #endif /* XIM_t */
+ #if defined(FS_t) || defined(FONT_t)
+-#define UNIX_PATH "/tmp/.font-unix/fs"
+-#define UNIX_DIR "/tmp/.font-unix"
++#define UNIX_PATH getandappendcompatibleenv(0, "TMPDIR", "/tmp", "/.font-unix/fs")
++#define UNIX_DIR getandappendcompatibleenv(1, "TMPDIR", "/tmp", "/.font-unix")
+ #endif /* FS_t || FONT_t */
+ #if defined(ICE_t)
+-#define UNIX_PATH "/tmp/.ICE-unix/"
+-#define UNIX_DIR "/tmp/.ICE-unix"
++#define UNIX_PATH getandappendcompatibleenv(0, "TMPDIR", "/tmp", "/.ICE-unix/")
++#define UNIX_DIR getandappendcompatibleenv(1, "TMPDIR", "/tmp", "/.ICE-unix")
+ #endif /* ICE_t */
+ #if defined(TEST_t)
+-#define UNIX_PATH "/tmp/.Test-unix/test"
+-#define UNIX_DIR "/tmp/.Test-unix"
++#define UNIX_PATH getandappendcompatibleenv(0, "TMPDIR", "/tmp", "/.Test-unix/test")
++#define UNIX_DIR getandappendcompatibleenv(1, "TMPDIR", "/tmp", "/.Test-unix")
+ #endif
+ #if defined(LBXPROXY_t)
+-#define UNIX_PATH "/tmp/.X11-unix/X"
+-#define UNIX_DIR  "/tmp/.X11-unix"
++#define UNIX_PATH getandappendcompatibleenv(0, "TMPDIR", "/tmp", "/.X11-unix/X")
++#define UNIX_DIR getandappendcompatibleenv(1, "TMPDIR", "/tmp", "/.X11-unix")
+ #endif
+ 
+ 
diff --git a/setup.py b/setup.py
index df1c96664d114a1dfd656c1d6ec28cb41f5dfb1e..6d57bec1248df2f4ad997e523ee26c54dc079444 100644
--- a/setup.py
+++ b/setup.py
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
 import glob
 import os
 
-version = '0.46-dev'
+version = '0.48-dev'
 name = 'slapos.cookbook'
 long_description = open("README.txt").read() + "\n" + \
     open("CHANGES.txt").read() + "\n"
@@ -40,6 +40,7 @@ setup(name=name,
       zip_safe=True,
       entry_points={
         'zc.buildout': [
+          'agent = slapos.recipe.agent:Recipe',
           'apache.frontend = slapos.recipe.apache_frontend:Recipe',
           'apachephp = slapos.recipe.apachephp:Recipe',
           'apacheproxy = slapos.recipe.apacheproxy:Recipe',
@@ -62,6 +63,7 @@ setup(name=name,
           'generic.onetimeupload = slapos.recipe.generic_onetimeupload:Recipe',
           'helloworld = slapos.recipe.helloworld:Recipe',
           'generic.cloudooo = slapos.recipe.generic_cloudooo:Recipe',
+          'firefox = slapos.recipe.firefox:Recipe',
           'fontconfig = slapos.recipe.fontconfig:Recipe',
           'java = slapos.recipe.java:Recipe',
           'kumofs = slapos.recipe.kumofs:Recipe',
@@ -113,6 +115,7 @@ setup(name=name,
           'urlparse = slapos.recipe._urlparse:Recipe',
           'vifib = slapos.recipe.vifib:Recipe',
           'waitfor = slapos.recipe.waitfor:Recipe',
+          'xvfb = slapos.recipe.xvfb:Recipe',
           'xwiki = slapos.recipe.xwiki:Recipe',
           'zabbixagent = slapos.recipe.zabbixagent:Recipe',
           'generic.zope = slapos.recipe.generic_zope:Recipe',
diff --git a/slapos/recipe/agent/__init__.py b/slapos/recipe/agent/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..0ea8a163be9fbbf56113af7cf4104a961b40e1ea
--- /dev/null
+++ b/slapos/recipe/agent/__init__.py
@@ -0,0 +1,119 @@
+##############################################################################
+#
+# Copyright (c) 2012 Vifib SARL and Contributors. All Rights Reserved.
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsibility of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# guarantees and support are strongly adviced to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 3
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#
+#############################################################################
+
+import os
+import sys
+import zc.buildout
+import slapos.slap
+from slapos.recipe.librecipe import BaseSlapRecipe
+from slapos.recipe.librecipe import GenericSlapRecipe
+import json
+import ConfigParser
+
+class Recipe(BaseSlapRecipe, GenericSlapRecipe):
+  def install(self):
+    self.path_list = []
+    self.crond = self.installCrond()
+
+    slap = slapos.slap.slap()
+    computer_id = self.computer_id
+    computer_partition_id = self.computer_partition_id
+    server_url = self.server_url
+    key_file = self.key_file
+    cert_file = self.cert_file
+    slap.initializeConnection(server_url, key_file, cert_file)
+    self.computer_partition = slap.registerComputerPartition(
+        computer_id, computer_partition_id)
+    self.parameter_dict = self.computer_partition.getInstanceParameterDict()
+
+    configuration_path = os.path.join(self.work_directory, "agent.cfg")
+    configuration = ConfigParser.SafeConfigParser()
+    configuration.add_section("agent")
+    configuration.set("agent", "portal_url", self.parameter_dict["portal_url"])
+    configuration.set("agent", "master_url", self.parameter_dict["master_url"])
+    key_filepath = os.path.join(self.work_directory, "key")
+    key_file = open(key_filepath, "w")
+    key_file.write(self.parameter_dict["key"])
+    key_file.close()
+    configuration.set("agent", "key_file", key_filepath)
+    cert_filepath = os.path.join(self.work_directory, "cert")
+    cert_file = open(cert_filepath, "w")
+    cert_file.write(self.parameter_dict["cert"])
+    cert_file.close()
+    configuration.set("agent", "cert_file", cert_filepath)
+    configuration.set("agent", "maximum_software_installation_duration",
+        self.parameter_dict["maximum_software_installation_duration"])
+    configuration.set("agent", "software_live_duration",
+        self.parameter_dict["software_live_duration"])
+    configuration.set("agent", "computer_list",
+        self.parameter_dict["computer_list"])
+    configuration.set("agent", "software_list",
+        self.parameter_dict["software_list"])
+    configuration.set("agent", "log_directory", self.options["log_directory"])
+    configuration.set("agent", "state_file", self.options["state_file"])
+    state = open(self.options["state_file"], "w")
+    state.write('')
+    state.close()
+    configuration.add_section("software_uri")
+    software_list = json.loads(self.parameter_dict["software_list"])
+    for software in software_list:
+      configuration.set("software_uri", software, self.parameter_dict[software])
+
+    configuration.write(open(configuration_path, "w"))
+
+    agent_crond_path = os.path.join(self.crond, "agent")
+    agent_crond = open(agent_crond_path, "w")
+    agent_crond.write("*/1 * * * * %s -S %s" % \
+      (self.options["python_binary"],
+        "%s --pidfile=%s %s" % \
+          (self.options["agent_binary"], self.options["pidfile"],
+            configuration_path)))
+    agent_crond.close()
+
+    return self.path_list + [configuration_path, key_filepath, cert_filepath, agent_crond_path]
+
+  def installCrond(self):
+    _, self.ws = self.egg.working_set()
+    timestamps = self.createDataDirectory('cronstamps')
+    cron_output = os.path.join(self.log_directory, 'cron-output')
+    self._createDirectory(cron_output)
+    catcher = zc.buildout.easy_install.scripts([('catchcron',
+      __name__ + '.catdatefile', 'catdatefile')], self.ws, sys.executable,
+      self.bin_directory, arguments=[cron_output])[0]
+    self.path_list.append(catcher)
+    cron_d = os.path.join(self.etc_directory, 'cron.d')
+    crontabs = os.path.join(self.etc_directory, 'crontabs')
+    self._createDirectory(cron_d)
+    self._createDirectory(crontabs)
+    wrapper = zc.buildout.easy_install.scripts([('crond',
+      'slapos.recipe.librecipe.execute', 'execute')], self.ws, sys.executable,
+      self.wrapper_directory, arguments=[
+        self.options['dcrond_binary'].strip(), '-s', cron_d, '-c', crontabs,
+        '-t', timestamps, '-f', '-l', '5', '-M', catcher]
+      )[0]
+    self.path_list.append(wrapper)
+    return cron_d
diff --git a/slapos/recipe/agent/catdatefile.py b/slapos/recipe/agent/catdatefile.py
new file mode 100644
index 0000000000000000000000000000000000000000..d3de298b272cce0eba88570aa6734ee74115e58e
--- /dev/null
+++ b/slapos/recipe/agent/catdatefile.py
@@ -0,0 +1,14 @@
+import os
+import sys
+import time
+def catdatefile(args):
+  directory = args[0]
+  try:
+    suffix = args[1]
+  except IndexError:
+    suffix = '.log'
+  f = open(os.path.join(directory,
+    time.strftime('%Y-%m-%d.%H:%M.%s') + suffix), 'aw')
+  for line in sys.stdin.read():
+    f.write(line)
+  f.close()
diff --git a/slapos/recipe/firefox/__init__.py b/slapos/recipe/firefox/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e79377d00354b2a892e9fa86696339382614270d
--- /dev/null
+++ b/slapos/recipe/firefox/__init__.py
@@ -0,0 +1,51 @@
+##############################################################################
+#
+# Copyright (c) 2012 Vifib SARL and Contributors. All Rights Reserved.
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsibility of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# guarantees and support are strongly adviced to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 3
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#
+#############################################################################
+
+from slapos.recipe.librecipe import GenericBaseRecipe
+import sys
+
+class Recipe(GenericBaseRecipe):
+  def install(self):
+
+    prefjs = self.createFile(
+      self.options['prefsjs-path'],
+      self.substituteTemplate(self.getTemplateFilename('prefs.js'), {}))
+
+    config = {
+      'firefox_binary': self.options['firefox-path'],
+      'python_path': sys.executable,
+      'tmp_path': self.options['tmp-path'],
+      'pref_path': prefjs,
+      }
+
+    runner = self.createExecutable(
+      self.options['runner-path'],
+      self.substituteTemplate(self.getTemplateFilename('firefox_run.in'),
+                              config))
+
+    return [runner, prefjs]
+
diff --git a/slapos/recipe/firefox/template/firefox_run.in b/slapos/recipe/firefox/template/firefox_run.in
new file mode 100644
index 0000000000000000000000000000000000000000..fab4ce0eb484aba9bc0e6a3f1847387b2b464df9
--- /dev/null
+++ b/slapos/recipe/firefox/template/firefox_run.in
@@ -0,0 +1,55 @@
+#!%(python_path)s
+# BEWARE: This file is operated by slapgrid
+# BEWARE: It will be overwritten automatically
+#
+
+import os
+from subprocess import Popen, PIPE
+import tempfile
+import shutil
+import sys
+import signal
+import subprocess
+import time
+
+os.environ['MOZ_NO_REMOTE'] = '1'
+os.environ['LC_ALL'] = 'C'
+os.environ['MOZ_CRASHREPORTER_DISABLE'] = '1'
+os.environ['NO_EM_RESTART'] = '1'
+os.environ['TMPDIR'] = "%(tmp_path)s"
+os.environ['DISPLAY'] = ':0'
+# XXX .Xauthority
+
+profile_path = tempfile.mkdtemp()
+shutil.copyfile('%(pref_path)s', os.path.join(profile_path, 'pref.js'))
+# os.environ['HOME'] = profile_path
+child_pg = None
+
+def sig_handler(signal, frame):
+  if child_pg is not None:
+    os.killpg(child_pg, signal.SIGHUP)
+    os.killpg(child_pg, signal.SIGTERM)
+  sys.exit(0)
+
+signal.signal(signal.SIGINT, sig_handler)
+signal.signal(signal.SIGQUIT, sig_handler)
+signal.signal(signal.SIGTERM, sig_handler)
+
+def execute_with_signal_translation(args):
+  """Run process as children and translate from SIGTERM to another signal"""
+  child = subprocess.Popen(args, close_fds=True, preexec_fn=os.setsid)
+  child_pg = child.pid
+  try:
+    while True:
+      time.sleep(2)
+  finally:
+    os.killpg(child_pg, signal.SIGHUP)
+    os.killpg(child_pg, signal.SIGTERM)
+
+try:
+  execute_with_signal_translation(
+    ["%(firefox_binary)s", "-no-remote", "-profile", profile_path] + sys.argv[1:])
+
+finally:
+  shutil.rmtree(profile_path)
+  
diff --git a/slapos/recipe/firefox/template/prefs.js b/slapos/recipe/firefox/template/prefs.js
new file mode 100644
index 0000000000000000000000000000000000000000..3004648f0c1c7c22b7b620aa55ac5465219ee66f
--- /dev/null
+++ b/slapos/recipe/firefox/template/prefs.js
@@ -0,0 +1,55 @@
+// Don't ask if we want to switch default browsers
+user_pref("browser.shell.checkDefaultBrowser", false);
+user_pref("browser.startup.homepage_override.mstone", "ignore");
+
+// disable application updates
+user_pref("app.update.enabled", false)
+
+// disables the 'know your rights' button from displaying on first run
+user_pref("browser.rights.3.shown", true);
+
+// Disable pop-up blocking
+user_pref("browser.allowpopups", true);
+user_pref("dom.disable_open_during_load", false);
+user_pref("browser.tabs.warnOnClose", false);
+
+// Configure us as the local proxy
+//user_pref("network.proxy.type", 2);
+
+// Disable security warnings
+user_pref("security.warn_submit_insecure", false);
+user_pref("security.warn_submit_insecure.show_once", false);
+user_pref("security.warn_entering_secure", false);
+user_pref("security.warn_entering_secure.show_once", false);
+user_pref("security.warn_entering_weak", false);
+user_pref("security.warn_entering_weak.show_once", false);
+user_pref("security.warn_leaving_secure", false);
+user_pref("security.warn_leaving_secure.show_once", false);
+user_pref("security.warn_viewing_mixed", false);
+user_pref("security.warn_viewing_mixed.show_once", false);
+
+// Disable "do you want to remember this password?"
+user_pref("signon.rememberSignons", false);
+
+// increase the timeout before warning of unresponsive script
+user_pref("dom.max_script_run_time", 120);
+
+// this is required to upload files
+// user_pref("capability.principal.codebase.p1.granted", "UniversalFileRead");
+// user_pref("signed.applets.codebase_principal_support", true);
+// user_pref("capability.principal.codebase.p1.id", "http://");
+// user_pref("capability.principal.codebase.p1.subjectName", "");
+
+user_pref("browser.link.open_external", 3);
+user_pref("browser.link.open_newwindow", 3);
+
+// disables the request to send performance data from displaying
+user_pref("toolkit.telemetry.prompted", 2);
+user_pref("toolkit.telemetry.rejected", true);
+
+user_pref("browser.migration.version", 5);
+user_pref("extensions.SelectionUI", true);
+user_pref("network.cookie.prefsMigrated", true);
+user_pref("browser.bookmarks.restore_default_bookmarks", false);
+user_pref("browser.places.smartBookmarksVersion", 2);
+user_pref("privacy.sanitize.migrateFx3Prefs", true);
diff --git a/slapos/recipe/seleniumrunner/__init__.py b/slapos/recipe/seleniumrunner/__init__.py
index 813fb0d4709a3e798cb07bd7f9a34842e88e1643..b6207750290a4716662bbaee787014e1bd0a87bb 100644
--- a/slapos/recipe/seleniumrunner/__init__.py
+++ b/slapos/recipe/seleniumrunner/__init__.py
@@ -29,79 +29,19 @@ import os
 import sys
 import zc.buildout
 from slapos.recipe.librecipe import BaseSlapRecipe
+from slapos.recipe.librecipe import GenericBaseRecipe
 
-class Recipe(BaseSlapRecipe):
-  def _install(self):
-    """Set the connection dictionnary for the computer partition and create a list
-    of paths to the different wrappers."""
-    self.path_list = []
-    self.requirements, self.ws = self.egg.working_set()
+class Recipe(GenericBaseRecipe):
+  def install(self):
 
-    self.installTestrunner(self.getDisplay())
-    self.linkBinary()
+    runner = self.createPythonScript(
+      self.options['runner-path'],
+      __name__+'.testrunner.run',
+      arguments=[self.options['suite-url'], 
+                 self.options['report-url'],
+                 self.options['report-project'],
+                 self.options['browser'],
+                 ])
 
-    return self.path_list
+    return [runner]
 
-  def getDisplay(self):
-    """Generate display id for the instance."""
-    display_list = [":%s" % i for i in range(123,144)]
-    for display_try in display_list:
-      lock_filepath = '/tmp/.X%s-lock' % display_try.replace(":", "")
-      if not os.path.exists(lock_filepath):
-        display = display_try
-        break
-    return display
-
-  def installTestrunner(self, display):
-    """Instanciate a wrapper for the browser and the test reports."""
-    arguments = dict(
-        xvfb_binary    = self.options['xvfb_binary'],
-        display        = display,
-        suite_name     = self.parameter_dict['suite_name'],
-        base_url       = self.parameter_dict['url'],
-        browser_argument_list = [],
-        user           = self.parameter_dict['user'],
-        password       = self.parameter_dict['password'],
-        project       = self.parameter_dict['project'],
-        test_report_instance_url = \
-            self.parameter_dict['test_report_instance_url'],
-        etc_directory  = self.etc_directory)
-
-    # Check wanted browser XXX-Cedric not yet used but can be useful
-    #if self.parameter_dict.get('browser', None) is None:
-    arguments['browser_binary'] = self.options['firefox_binary']
-    #elif self.parameter_dict['browser'].strip().lowercase() == 'chrome' or
-    #    self.parameter_dict['browser'].strip().lowercase() == 'chromium':
-    #  arguments['browser_binary'] = self.options['chromium_binary']
-    #  arguments['browser_argument_list'].extend['--ignore-certificate-errors',
-    #      option_translate = '--disable-translate',
-    #      option_security = '--disable-web-security']
-    #elif self.parameter_dict['browser'].strip().lowercase() == 'firefox':
-    #  arguments['browser_binary'] = self.options['firefox_binary']
-
-    self.path_list.extend(zc.buildout.easy_install.scripts([(
-        'testrunner',__name__+'.testrunner', 'run')], self.ws,
-        sys.executable, self.wrapper_directory,
-        arguments=[arguments]))
-
-  def linkBinary(self):
-    """Links binaries to instance's bin directory for easier exposal"""
-    for linkline in self.options.get('link_binary_list', '').splitlines():
-      if not linkline:
-        continue
-      target = linkline.split()
-      if len(target) == 1:
-        target = target[0]
-        path, linkname = os.path.split(target)
-      else:
-        linkname = target[1]
-        target = target[0]
-      link = os.path.join(self.bin_directory, linkname)
-      if os.path.lexists(link):
-        if not os.path.islink(link):
-          raise zc.buildout.UserError(
-            'Target link already %r exists but it is not link' % link)
-        os.unlink(link)
-      os.symlink(target, link)
-      self.logger.debug('Created link %r -> %r' % (link, target))
-      self.path_list.append(link)
diff --git a/slapos/recipe/seleniumrunner/testrunner.py b/slapos/recipe/seleniumrunner/testrunner.py
index 99b95e8d9350e9c6654834c4d38c76d807141a5b..91d0bc28cc70e569c3e40e58ffd8225b10d8f192 100644
--- a/slapos/recipe/seleniumrunner/testrunner.py
+++ b/slapos/recipe/seleniumrunner/testrunner.py
@@ -27,14 +27,30 @@
 
 from datetime import datetime
 from erp5functionaltestreporthandler import ERP5TestReportHandler
-from ERP5TypeFunctionalTestCase import Xvfb, Firefox, TimeoutError
+from ERP5TypeFunctionalTestCase import TimeoutError
 from time import sleep
 import time
 import os
 import urllib2
+import urlparse
+from subprocess import Popen, PIPE
+import signal
 
 def run(args):
-  config = args[0]
+  suite_url = args[0]
+  report_url = args[1]
+  project = args[2]
+  browser_binary = args[3]
+
+  suite_parsed = urlparse.urlparse(suite_url)
+
+  config = {
+    'suite_name': suite_parsed.path.split('/')[-1],
+    'base_url': "%s://%s%s" % (suite_parsed.scheme, suite_parsed.hostname,
+                               '/'.join(suite_parsed.path.split('/')[:-1])),
+    'user': suite_parsed.username,
+    'password': suite_parsed.password,
+    }
 
   test_url = assembleTestUrl(config['base_url'], config['suite_name'],
       config['user'], config['password'])
@@ -43,20 +59,17 @@ def run(args):
   timeout = 2.0 * 60 * 60
   
   while True:
-    erp5_report = ERP5TestReportHandler(config['test_report_instance_url'],
-        config['project'] + '@' + config['suite_name'])
+    erp5_report = ERP5TestReportHandler(report_url,
+        project + '@' + config['suite_name'])
     try:
-      os.environ['DISPLAY'] = config['display']
-      xvfb = Xvfb(config['etc_directory'], config['xvfb_binary'])
-      profile_dir = os.path.join(config['etc_directory'], 'profile')
-      # XXX-Cedric : change Firefox prefs.js generation so that it can take a
-      #              list of websites supposed to be reached instead of config['base_url']
-      browser = Firefox(profile_dir, config['base_url'], config['browser_binary'])
       try:
         start = time.time()
-        xvfb.run()
-        profile_dir = os.path.join(config['etc_directory'], 'profile')
-        browser.run(test_url , xvfb.display)
+        print("Running test on: %s" % test_url)
+        process = Popen('%s "%s"' % (browser_binary, test_url),
+                        stdout=PIPE,
+                        stderr=PIPE,
+                        shell=True,
+                        close_fds=True)
         erp5_report.reportStart()
         while not isTestFinished(config['base_url']):
           time.sleep(10)
@@ -66,8 +79,8 @@ def run(args):
       except TimeoutError:
         continue
       finally:
-        browser.quit()
-        xvfb.quit()
+        if process.pid:
+          os.kill(process.pid, signal.SIGTERM)
       print("Test has finished and Firefox has been killed.")
       
       erp5_report.reportFinished(getStatus(config['base_url']).encode("utf-8",
@@ -135,4 +148,4 @@ def assembleTestUrl(base_url, suite_name, user, password):
       test_url = "%s/%s/core/TestRunner.html?test=../test_suite_html&"\
           "resultsUrl=%s/postResults&auto=on&__ac_name=%s&__ac_password=%s" % (
           base_url, suite_name, base_url, user, password)
-      return test_url
\ No newline at end of file
+      return test_url
diff --git a/slapos/recipe/xvfb/__init__.py b/slapos/recipe/xvfb/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..1272a627622be4b4b87c5ff5d86b36c26de2a3a2
--- /dev/null
+++ b/slapos/recipe/xvfb/__init__.py
@@ -0,0 +1,56 @@
+##############################################################################
+#
+# Copyright (c) 2012 Vifib SARL and Contributors. All Rights Reserved.
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsibility of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# guarantees and support are strongly adviced to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 3
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#
+#############################################################################
+
+from slapos.recipe.librecipe import GenericBaseRecipe
+
+class Recipe(GenericBaseRecipe):
+  def install(self):
+
+    config = {
+      'xvfb_binary': self.options['xvfb-path'],
+      'shell_path': self.options['shell-path'],
+      'fbdir_path': self.options['fbdir-path'],
+      'tmp_path': self.options['tmp-path'],
+      }
+
+    xvfb_path = self.createExecutable(
+      self.options['runner-path'],
+      self.substituteTemplate(self.getTemplateFilename('xvfb_run.in'),
+                              config))
+    result = [xvfb_path]
+
+    # Allow to take screenshot if needed
+    if ('xwd-path' in self.options) and ('xwd-hook-path' in self.options):
+
+      config['xwd_binary'] = self.options['xwd-path']
+      result.append(self.createExecutable(
+        self.options['xwd-hook-path'],
+        self.substituteTemplate(self.getTemplateFilename('xwd_run.in'),
+                                config)))
+
+    return result
+
diff --git a/slapos/recipe/xvfb/template/xvfb_run.in b/slapos/recipe/xvfb/template/xvfb_run.in
new file mode 100644
index 0000000000000000000000000000000000000000..ab6681768856cf72b5efc370b5e94af1fe3fc709
--- /dev/null
+++ b/slapos/recipe/xvfb/template/xvfb_run.in
@@ -0,0 +1,6 @@
+#!%(shell_path)s
+# BEWARE: This file is operated by slapgrid
+# BEWARE: It will be overwritten automatically
+
+export TMPDIR=%(tmp_path)s 
+exec %(xvfb_binary)s -screen 0 1024x768x24 -fbdir %(fbdir_path)s
diff --git a/slapos/recipe/xvfb/template/xwd_run.in b/slapos/recipe/xvfb/template/xwd_run.in
new file mode 100644
index 0000000000000000000000000000000000000000..5c64f9e7c4c8a1815c9b4c41dcf5d2e1f37b5ab7
--- /dev/null
+++ b/slapos/recipe/xvfb/template/xwd_run.in
@@ -0,0 +1,7 @@
+#!%(shell_path)s
+# BEWARE: This file is operated by slapgrid
+# BEWARE: It will be overwritten automatically
+
+export DISPLAY=:0
+export TMPDIR=%(tmp_path)s 
+exec %(xwd_binary)s -root -out $1
diff --git a/software/agent/instance.cfg b/software/agent/instance.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..15ef5a0e46746f2dab8b5dce4aadf934555211f5
--- /dev/null
+++ b/software/agent/instance.cfg
@@ -0,0 +1,25 @@
+[buildout]
+parts =
+  rootdirectory
+  instance
+
+eggs-directory = ${buildout:eggs-directory}
+develop-eggs-directory = ${buildout:develop-eggs-directory}
+
+[instance]
+recipe = ${instance-recipe:egg}:${instance-recipe:module}
+agent_binary = ${buildout:directory}/bin/agent
+dcrond_binary = ${dcron:location}/sbin/crond
+python_binary = ${python2.7:location}/bin/python
+pidfile = $${buildout:directory}/agent.pid
+log_directory = $${buildout:directory}/var/log
+state_file = $${buildout:directory}/state.cfg
+
+[rootdirectory]
+recipe = slapos.cookbook:mkdirectory
+etc = $${buildout:directory}/etc/
+run = $${rootdirectory:etc}/run/
+var = $${buildout:directory}/var/
+log = $${rootdirectory:var}/log/
+srv = $${buildout:directory}/srv/
+bin = $${buildout:directory}/bin/
diff --git a/software/agent/software.cfg b/software/agent/software.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..68f699448a74f8bd5718192235a4ba48e4d1ddfb
--- /dev/null
+++ b/software/agent/software.cfg
@@ -0,0 +1,74 @@
+[buildout]
+
+# develop =
+#   /opt/slapdev
+#   /opt/slapos.toolbox
+
+extends =
+  ../../component/dcron/buildout.cfg
+  ../../component/python-2.7/buildout.cfg
+  ../../component/lxml-python/buildout.cfg
+  ../../stack/slapos.cfg
+
+parts =
+  template
+  eggs
+  instance-recipe-egg
+  dcron
+  python2.7
+  script
+
+[instance-recipe]
+egg = slapos.cookbook
+module = agent
+
+[instance-recipe-egg]
+recipe = zc.recipe.egg
+python = python2.7
+eggs = ${instance-recipe:egg}
+
+[template]
+recipe = slapos.recipe.template
+url = ${:_profile_base_location_}/instance.cfg
+output = ${buildout:directory}/template.cfg
+md5sum = 2e1a7a68b18de68b163e98a5f92cc776
+mode = 0644
+
+[eggs]
+python = python2.7
+recipe = zc.recipe.egg
+eggs =
+  ${lxml-python:egg}
+  slapos.cookbook
+  slapos.toolbox
+
+[lxml-python]
+python = python2.7
+
+[script]
+recipe = z3c.recipe.scripts
+python = python2.7
+eggs =
+  zc.buildout
+  ${lxml-python:egg}
+  slapos.core
+  slapos.cookbook
+  slapos.toolbox
+
+[networkcache]
+# signature certificates of the following uploaders.
+#   Romain Courteaud
+signature-certificate-list =
+  -----BEGIN CERTIFICATE-----
+  MIIB4DCCAUkCADANBgkqhkiG9w0BAQsFADA5MQswCQYDVQQGEwJGUjEZMBcGA1UE
+  CBMQRGVmYXVsdCBQcm92aW5jZTEPMA0GA1UEChMGTmV4ZWRpMB4XDTExMDkxNTA5
+  MDAwMloXDTEyMDkxNTA5MDAwMlowOTELMAkGA1UEBhMCRlIxGTAXBgNVBAgTEERl
+  ZmF1bHQgUHJvdmluY2UxDzANBgNVBAoTBk5leGVkaTCBnzANBgkqhkiG9w0BAQEF
+  AAOBjQAwgYkCgYEApYZv6OstoqNzxG1KI6iE5U4Ts2Xx9lgLeUGAMyfJLyMmRLhw
+  boKOyJ9Xke4dncoBAyNPokUR6iWOcnPHtMvNOsBFZ2f7VA28em3+E1JRYdeNUEtX
+  Z0s3HjcouaNAnPfjFTXHYj4um1wOw2cURSPuU5dpzKBbV+/QCb5DLheynisCAwEA
+  ATANBgkqhkiG9w0BAQsFAAOBgQBCZLbTVdrw3RZlVVMFezSHrhBYKAukTwZrNmJX
+  mHqi2tN8tNo6FX+wmxUUAf3e8R2Ymbdbn2bfbPpcKQ2fG7PuKGvhwMG3BlF9paEC
+  q7jdfWO18Zp/BG7tagz0jmmC4y/8akzHsVlruo2+2du2freE8dK746uoMlXlP93g
+  QUUGLQ==
+  -----END CERTIFICATE-----
diff --git a/software/seleniumrunner/instance-selenium.cfg b/software/seleniumrunner/instance-selenium.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..481dc11a0d44ede907bb7fda2d06247f12738e7c
--- /dev/null
+++ b/software/seleniumrunner/instance-selenium.cfg
@@ -0,0 +1,47 @@
+[buildout]
+parts =
+  selenium-instance
+
+eggs-directory = ${buildout:eggs-directory}
+develop-eggs-directory = ${buildout:develop-eggs-directory} 
+offline = true
+
+[selenium-instance]
+recipe = slapos.cookbook:seleniumrunner
+runner-path = $${basedirectory:services}/selenium-runner
+browser = $${firefox-instance:runner-path}
+suite-url = $${slap-parameter:suite-url}
+report-url = $${slap-parameter:report-url}
+report-project = $${slap-parameter:report-project}
+
+[firefox-instance]
+recipe = slapos.cookbook:firefox
+runner-path = $${rootdirectory:bin}/firefox-sandboxed
+firefox-path = ${firefox:location}/firefox-slapos
+prefsjs-path = $${rootdirectory:etc}/prefs.js
+shell-path = ${dash:location}/bin/dash
+tmp-path = $${xvfb-instance:tmp-path}
+
+[xvfb-instance]
+recipe = slapos.cookbook:xvfb
+runner-path = $${basedirectory:services}/xvfb
+xvfb-path = ${xserver:location}/bin/Xvfb
+fbdir-path = $${basedirectory:framebuffer}
+tmp-path = $${basedirectory:run}
+shell-path = ${dash:location}/bin/dash
+
+xwd-path = ${xwd:location}/bin/xwd
+xwd-hook-path = $${rootdirectory:bin}/xwd
+
+[rootdirectory]
+recipe = slapos.cookbook:mkdirectory
+etc = $${buildout:directory}/etc
+var = $${buildout:directory}/var
+srv = $${buildout:directory}/srv
+bin = $${buildout:directory}/bin
+
+[basedirectory]
+recipe = slapos.cookbook:mkdirectory
+services = $${rootdirectory:etc}/run
+run = $${rootdirectory:var}/run
+framebuffer = $${rootdirectory:srv}/framebuffer
diff --git a/software/seleniumrunner/instance.cfg b/software/seleniumrunner/instance.cfg
index 23d6d4683b891db94e1bbbfbabfababb4d37b6f7..a672b5b982ddfa45925fd27818b688c1d67086f1 100644
--- a/software/seleniumrunner/instance.cfg
+++ b/software/seleniumrunner/instance.cfg
@@ -1,11 +1,20 @@
 [buildout]
 parts =
-  seleniuminstance
+  switch-softwaretype
 
 eggs-directory = ${buildout:eggs-directory}
-develop-eggs-directory = ${buildout:develop-eggs-directory} 
+develop-eggs-directory = ${buildout:develop-eggs-directory}
+offline = true
 
-[seleniuminstance]
-recipe = ${instance-recipe:egg}:${instance-recipe:module}
-xvfb_binary = ${xserver:location}/bin/Xvfb
-firefox_binary = ${firefox:location}/firefox-slapos
\ No newline at end of file
+[switch-softwaretype]
+recipe = slapos.cookbook:softwaretype
+default = ${template-selenium:output}
+
+[slap-connection]
+# part to migrate to new - separated words
+computer-id = $${slap_connection:computer_id}
+partition-id = $${slap_connection:partition_id}
+server-url = $${slap_connection:server_url}
+software-release-url = $${slap_connection:software_release_url}
+key-file = $${slap_connection:key_file}
+cert-file = $${slap_connection:cert_file}
diff --git a/software/seleniumrunner/software.cfg b/software/seleniumrunner/software.cfg
index c2333a1a197ed9c6cfc1e5496e65bbe4e1b5d586..cf6baf97f67293b36daed0a664f3a0b9314f3af7 100644
--- a/software/seleniumrunner/software.cfg
+++ b/software/seleniumrunner/software.cfg
@@ -6,8 +6,11 @@ extends =
    ../../component/lxml-python/buildout.cfg
    ../../component/python-2.7/buildout.cfg
    ../../component/firefox/buildout.cfg
+   ../../component/dash/buildout.cfg
    ../../stack/shacache-client.cfg
 
+# develop += /opt/slapdev
+
 versions = versions
 
 find-links +=
@@ -19,6 +22,7 @@ parts =
    instance-recipe-egg
    xserver
    firefox
+   xwd
 
 versions = versions
 
@@ -43,10 +47,101 @@ eggs =
 # Default template for the instance.
 recipe = slapos.recipe.template
 url = ${:_profile_base_location_}/instance.cfg
-md5sum = 5fc198144831525a196d7394e4b15f80
+md5sum = c4ac5de141ae6a64848309af03e51d88
 output = ${buildout:directory}/template.cfg
 mode = 0644
 
+[template-selenium]
+recipe = slapos.recipe.template
+url = ${:_profile_base_location_}/instance-selenium.cfg
+md5sum = 8be91f4515decef0f8af5910e43e0e52
+output = ${buildout:directory}/template-selenium.cfg
+mode = 0644
+
 [versions]
 # Use SlapOS patched zc.buildout
-zc.buildout = 1.5.3-dev-SlapOS-010
+zc.buildout = 1.6.0-dev-SlapOS-004
+
+Jinja2 = 2.6
+Werkzeug = 0.8.3
+buildout-versions = 1.7
+hexagonit.recipe.cmmi = 1.5.0
+meld3 = 0.6.8
+slapos.cookbook = 0.46
+slapos.recipe.build = 0.7
+slapos.recipe.template = 2.2
+
+# Required by:
+# slapos.core==0.23
+Flask = 0.8
+
+# Required by:
+# slapos.cookbook==0.42
+PyXML = 0.8.4
+
+# Required by:
+# hexagonit.recipe.cmmi==1.5.0
+hexagonit.recipe.download = 1.5.0
+
+# Required by:
+# slapos.cookbook==0.42
+inotifyx = 0.2.0
+
+# Required by:
+# slapos.cookbook==0.42
+# slapos.core==0.23
+# xml-marshaller==0.9.7
+lxml = 2.3.4
+
+# Required by:
+# slapos.cookbook==0.42
+netaddr = 0.7.6
+
+# Required by:
+# slapos.core==0.23
+netifaces = 0.8
+
+# Required by:
+# slapos.cookbook==0.42
+# slapos.core==0.23
+# zc.buildout==1.5.3-dev-SlapOS-010
+# zc.recipe.egg==1.3.2
+setuptools = 0.6c12dev-r88846
+
+# Required by:
+# slapos.cookbook==0.42
+slapos.core = 0.23
+
+# Required by:
+# slapos.core==0.23
+supervisor = 3.0a12
+
+# Required by:
+# slapos.cookbook==0.42
+xml-marshaller = 0.9.7
+
+# Required by:
+# slapos.cookbook==0.42
+zc.recipe.egg = 1.3.2
+
+# Required by:
+# slapos.core==0.23
+zope.interface = 3.8.0
+
+[networkcache]
+# signature certificates of the following uploaders.
+#   Romain Courteaud
+signature-certificate-list =
+  -----BEGIN CERTIFICATE-----
+  MIIB4DCCAUkCADANBgkqhkiG9w0BAQsFADA5MQswCQYDVQQGEwJGUjEZMBcGA1UE
+  CBMQRGVmYXVsdCBQcm92aW5jZTEPMA0GA1UEChMGTmV4ZWRpMB4XDTExMDkxNTA5
+  MDAwMloXDTEyMDkxNTA5MDAwMlowOTELMAkGA1UEBhMCRlIxGTAXBgNVBAgTEERl
+  ZmF1bHQgUHJvdmluY2UxDzANBgNVBAoTBk5leGVkaTCBnzANBgkqhkiG9w0BAQEF
+  AAOBjQAwgYkCgYEApYZv6OstoqNzxG1KI6iE5U4Ts2Xx9lgLeUGAMyfJLyMmRLhw
+  boKOyJ9Xke4dncoBAyNPokUR6iWOcnPHtMvNOsBFZ2f7VA28em3+E1JRYdeNUEtX
+  Z0s3HjcouaNAnPfjFTXHYj4um1wOw2cURSPuU5dpzKBbV+/QCb5DLheynisCAwEA
+  ATANBgkqhkiG9w0BAQsFAAOBgQBCZLbTVdrw3RZlVVMFezSHrhBYKAukTwZrNmJX
+  mHqi2tN8tNo6FX+wmxUUAf3e8R2Ymbdbn2bfbPpcKQ2fG7PuKGvhwMG3BlF9paEC
+  q7jdfWO18Zp/BG7tagz0jmmC4y/8akzHsVlruo2+2du2freE8dK746uoMlXlP93g
+  QUUGLQ==
+  -----END CERTIFICATE-----
diff --git a/stack/lamp.cfg b/stack/lamp.cfg
index 54d421ce34fe008586729e03e4407c63fbf40a70..dca29810762ef61ce623056f9160774144732a97 100644
--- a/stack/lamp.cfg
+++ b/stack/lamp.cfg
@@ -34,7 +34,8 @@ eggs =
 keep-compile-dir = false
 
 [networkcache]
-# Romain Courteaud + Sebastien Robin + Alain Takoudjou signature certificate
+# Romain Courteaud + Sebastien Robin + Alain Takoudjou
+# + Cedric de Saint Martin signature certificate
 signature-certificate-list =
   -----BEGIN CERTIFICATE-----
   MIIB4DCCAUkCADANBgkqhkiG9w0BAQsFADA5MQswCQYDVQQGEwJGUjEZMBcGA1UE
@@ -75,3 +76,111 @@ signature-certificate-list =
   dOSJ86sf/PQHW3/1fhTTE+Vck1MiiAq0aIx6WnKnz4+ZcQctB7b0DCsTcQnmbpi2
   n9MuhWaT21VOYhIGzJFPw5XW47/RrwhR
   -----END CERTIFICATE-----
+  -----BEGIN CERTIFICATE-----
+  MIIB9jCCAV+gAwIBAgIJAO4V/jiMoICoMA0GCSqGSIb3DQEBBQUAMBMxETAPBgNV
+  BAMMCENPTVAtMjMyMCAXDTEyMDIxNjExMTAyM1oYDzIxMTIwMTIzMTExMDIzWjAT
+  MREwDwYDVQQDDAhDT01QLTIzMjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA
+  wi/3Z8W9pUiegUXIk/AiFDQ0UJ4JFAwjqr+HSRUirlUsHHT+8DzH/hfcTDX1I5BB
+  D1ADk+ydXjMm3OZrQcXjn29OUfM5C+g+oqeMnYQImN0DDQIOcUyr7AJc4xhvuXQ1
+  P2pJ5NOd3tbd0kexETa1LVhR6EgBC25LyRBRae76qosCAwEAAaNQME4wHQYDVR0O
+  BBYEFMDmW9aFy1sKTfCpcRkYnP6zUd1cMB8GA1UdIwQYMBaAFMDmW9aFy1sKTfCp
+  cRkYnP6zUd1cMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAskbFizHr
+  b6d3iIyN+wffxz/V9epbKIZVEGJd/6LrTdLiUfJPec7FaxVCWNyKBlCpINBM7cEV
+  Gn9t8mdVQflNqOlAMkOlUv1ZugCt9rXYQOV7rrEYJBWirn43BOMn9Flp2nibblby
+  If1a2ZoqHRxoNo2yTmm7TSYRORWVS+vvfjY=
+  -----END CERTIFICATE-----
+
+[versions]
+# Generated automatically by buildout-versions
+Jinja2 = 2.6
+MySQL-python = 1.2.3
+Werkzeug = 0.8.3
+apache-libcloud = 0.9.1
+async = 0.6.1
+buildout-versions = 1.7
+gitdb = 0.5.4
+hexagonit.recipe.cmmi = 1.5.0
+meld3 = 0.6.8
+plone.recipe.command = 1.1
+slapos.cookbook = 0.45
+slapos.recipe.build = 0.7
+slapos.recipe.download = 1.0.dev-r4053
+slapos.recipe.template = 2.3
+slapos.toolbox = 0.23
+smmap = 0.8.2
+
+# Required by:
+# slapos.core==0.24
+# slapos.toolbox==0.23
+Flask = 0.8
+
+# Required by:
+# slapos.toolbox==0.23
+GitPython = 0.3.2.RC1
+
+# Required by:
+# slapos.cookbook==0.45
+PyXML = 0.8.4
+
+# Required by:
+# slapos.toolbox==0.23
+atomize = 0.1.1
+
+# Required by:
+# slapos.toolbox==0.23
+feedparser = 5.1.1
+
+# Required by:
+# slapos.cookbook==0.45
+inotifyx = 0.2.0
+
+# Required by:
+# slapos.cookbook==0.45
+# slapos.core==0.24
+# slapos.toolbox==0.23
+# xml-marshaller==0.9.7
+lxml = 2.3.4
+
+# Required by:
+# slapos.cookbook==0.45
+netaddr = 0.7.6
+
+# Required by:
+# slapos.core==0.24
+netifaces = 0.8
+
+# Required by:
+# slapos.toolbox==0.23
+paramiko = 1.7.7.1
+
+# Required by:
+# slapos.toolbox==0.23
+psutil = 0.4.1
+
+# Required by:
+# slapos.cookbook==0.45
+# slapos.core==0.24
+# slapos.toolbox==0.23
+setuptools = 0.6c12dev-r88846
+
+# Required by:
+# slapos.cookbook==0.45
+# slapos.toolbox==0.23
+slapos.core = 0.24
+
+# Required by:
+# slapos.core==0.24
+supervisor = 3.0a12
+
+# Required by:
+# slapos.cookbook==0.45
+# slapos.toolbox==0.23
+xml-marshaller = 0.9.7
+
+# Required by:
+# slapos.cookbook==0.45
+zc.recipe.egg = 1.3.2
+
+# Required by:
+# slapos.core==0.24
+zope.interface = 3.8.0
\ No newline at end of file
diff --git a/stack/lamp/buildout.cfg b/stack/lamp/buildout.cfg
index 6baf055a020d8e46bb154d23ad42c30d1dca48ae..df1736a91fdd51b5d15943a39e0625dbe46c7e50 100644
--- a/stack/lamp/buildout.cfg
+++ b/stack/lamp/buildout.cfg
@@ -125,3 +125,60 @@ recipe = zc.recipe.egg
 eggs =
   ${lxml-python:egg}
   slapos.toolbox
+
+[networkcache]
+# Romain Courteaud + Sebastien Robin + Alain Takoudjou
+# + Cedric de Saint Martin signature certificate
+signature-certificate-list =
+  -----BEGIN CERTIFICATE-----
+  MIIB4DCCAUkCADANBgkqhkiG9w0BAQsFADA5MQswCQYDVQQGEwJGUjEZMBcGA1UE
+  CBMQRGVmYXVsdCBQcm92aW5jZTEPMA0GA1UEChMGTmV4ZWRpMB4XDTExMDkxNTA5
+  MDAwMloXDTEyMDkxNTA5MDAwMlowOTELMAkGA1UEBhMCRlIxGTAXBgNVBAgTEERl
+  ZmF1bHQgUHJvdmluY2UxDzANBgNVBAoTBk5leGVkaTCBnzANBgkqhkiG9w0BAQEF
+  AAOBjQAwgYkCgYEApYZv6OstoqNzxG1KI6iE5U4Ts2Xx9lgLeUGAMyfJLyMmRLhw
+  boKOyJ9Xke4dncoBAyNPokUR6iWOcnPHtMvNOsBFZ2f7VA28em3+E1JRYdeNUEtX
+  Z0s3HjcouaNAnPfjFTXHYj4um1wOw2cURSPuU5dpzKBbV+/QCb5DLheynisCAwEA
+  ATANBgkqhkiG9w0BAQsFAAOBgQBCZLbTVdrw3RZlVVMFezSHrhBYKAukTwZrNmJX
+  mHqi2tN8tNo6FX+wmxUUAf3e8R2Ymbdbn2bfbPpcKQ2fG7PuKGvhwMG3BlF9paEC
+  q7jdfWO18Zp/BG7tagz0jmmC4y/8akzHsVlruo2+2du2freE8dK746uoMlXlP93g
+  QUUGLQ==
+  -----END CERTIFICATE-----
+  -----BEGIN CERTIFICATE-----
+  MIIB8jCCAVugAwIBAgIJAPu2zchZ2BxoMA0GCSqGSIb3DQEBBQUAMBIxEDAOBgNV
+  BAMMB3RzeGRldjMwHhcNMTExMDE0MTIxNjIzWhcNMTIxMDEzMTIxNjIzWjASMRAw
+  DgYDVQQDDAd0c3hkZXYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrPbh+
+  YGmo6mWmhVb1vTqX0BbeU0jCTB8TK3i6ep3tzSw2rkUGSx3niXn9LNTFNcIn3MZN
+  XHqbb4AS2Zxyk/2tr3939qqOrS4YRCtXBwTCuFY6r+a7pZsjiTNddPsEhuj4lEnR
+  L8Ax5mmzoi9nE+hiPSwqjRwWRU1+182rzXmN4QIDAQABo1AwTjAdBgNVHQ4EFgQU
+  /4XXREzqBbBNJvX5gU8tLWxZaeQwHwYDVR0jBBgwFoAU/4XXREzqBbBNJvX5gU8t
+  LWxZaeQwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQA07q/rKoE7fAda
+  FED57/SR00OvY9wLlFEF2QJ5OLu+O33YUXDDbGpfUSF9R8l0g9dix1JbWK9nQ6Yd
+  R/KCo6D0sw0ZgeQv1aUXbl/xJ9k4jlTxmWbPeiiPZEqU1W9wN5lkGuLxV4CEGTKU
+  hJA/yXa1wbwIPGvX3tVKdOEWPRXZLg==
+  -----END CERTIFICATE-----
+  -----BEGIN CERTIFICATE-----
+  MIIB9DCCAV2gAwIBAgIJAL392bEdqpFQMA0GCSqGSIb3DQEBBQUAMBMxETAPBgNV
+  BAMMCENPTVAtMjM0MB4XDTExMTEwOTE1MzA0M1oXDTEyMTEwODE1MzA0M1owEzER
+  MA8GA1UEAwwIQ09NUC0yMzQwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMRR
+  T0cacZKztie/DaRRjq3mgcqfPKoGXu6zXmeRQI+6Y4bnzjf8h/jAuPzR552P0xK5
+  psxhavXA8hOGRLFDtvDMQLepVHWfwqtFtcp5vNf2+KWqOYy0OxHfVIlnatvCqTZN
+  NG1vRsSOAQ+v7QNFHh6NBbiSrjBBfg4vkfzqnsUvAgMBAAGjUDBOMB0GA1UdDgQW
+  BBTGGw+ASoDi9kqPElDkC0Q5RtAfRjAfBgNVHSMEGDAWgBTGGw+ASoDi9kqPElDk
+  C0Q5RtAfRjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4GBAIOuR1OqXLke
+  LLzH0kRnlIOe60dYJvRya53wDx5x2g4/qkXZPLx2RcbaUrX/SCbL70vfr+apUPss
+  dOSJ86sf/PQHW3/1fhTTE+Vck1MiiAq0aIx6WnKnz4+ZcQctB7b0DCsTcQnmbpi2
+  n9MuhWaT21VOYhIGzJFPw5XW47/RrwhR
+  -----END CERTIFICATE-----
+  -----BEGIN CERTIFICATE-----
+  MIIB9jCCAV+gAwIBAgIJAO4V/jiMoICoMA0GCSqGSIb3DQEBBQUAMBMxETAPBgNV
+  BAMMCENPTVAtMjMyMCAXDTEyMDIxNjExMTAyM1oYDzIxMTIwMTIzMTExMDIzWjAT
+  MREwDwYDVQQDDAhDT01QLTIzMjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA
+  wi/3Z8W9pUiegUXIk/AiFDQ0UJ4JFAwjqr+HSRUirlUsHHT+8DzH/hfcTDX1I5BB
+  D1ADk+ydXjMm3OZrQcXjn29OUfM5C+g+oqeMnYQImN0DDQIOcUyr7AJc4xhvuXQ1
+  P2pJ5NOd3tbd0kexETa1LVhR6EgBC25LyRBRae76qosCAwEAAaNQME4wHQYDVR0O
+  BBYEFMDmW9aFy1sKTfCpcRkYnP6zUd1cMB8GA1UdIwQYMBaAFMDmW9aFy1sKTfCp
+  cRkYnP6zUd1cMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAskbFizHr
+  b6d3iIyN+wffxz/V9epbKIZVEGJd/6LrTdLiUfJPec7FaxVCWNyKBlCpINBM7cEV
+  Gn9t8mdVQflNqOlAMkOlUv1ZugCt9rXYQOV7rrEYJBWirn43BOMn9Flp2nibblby
+  If1a2ZoqHRxoNo2yTmm7TSYRORWVS+vvfjY=
+  -----END CERTIFICATE-----