diff --git a/component/pylint/buildout.cfg b/component/pylint/buildout.cfg
index 0676aba035680774016ec65bb8e3311e5c31401e..1329ff907db0275c5229352e8f145529fa791ae1 100644
--- a/component/pylint/buildout.cfg
+++ b/component/pylint/buildout.cfg
@@ -12,6 +12,8 @@ patches =
   ${:_profile_base_location_}/astroid-six_moves_import_error.patch#377beb0c50f52b9608bb6be7bf93096e
 patch-options = -p1
 patch-binary = ${patch:location}/bin/patch
+
+[astroid:python3]
 setup-eggs = ${lazy-object-proxy:egg}
 
 [lazy-object-proxy]
@@ -40,3 +42,15 @@ patches =
   ${:_profile_base_location_}/pylint-redefining-builtins-modules.patch#043defc6e9002ac48b40e078797d4d17
 patch-options = -p1
 patch-binary = ${patch:location}/bin/patch
+
+[pylint:python3]
+recipe = zc.recipe.egg
+patches =
+
+[mccabe:python3]
+recipe = zc.recipe.egg
+patches =
+setup-eggs =
+
+[astroid:python3]
+recipe = zc.recipe.egg
diff --git a/software/neoppod/buildout.hash.cfg b/software/neoppod/buildout.hash.cfg
index ff7c5cc0907ebaa96f45231cd47db060b848770a..0b787bd74c1b33fdbb5717d83e9101a1138999f2 100644
--- a/software/neoppod/buildout.hash.cfg
+++ b/software/neoppod/buildout.hash.cfg
@@ -22,7 +22,7 @@ md5sum = c91b5540f94ce76af31f84584df7a3ef
 
 [instance-neo-admin]
 filename = instance-neo-admin.cfg.in
-md5sum = b6e1ccb1d90160110202e5111eec2afa
+md5sum = a0ec1dce4c7a237fbeef3f8aee62e55a
 
 [instance-neo-master]
 filename = instance-neo-master.cfg.in
@@ -34,7 +34,7 @@ md5sum = fda911d5ef9efee365f1b0ff9843a50b
 
 [template-neo-my-cnf]
 filename = my.cnf.in
-md5sum = 56ea8f452d9e1526157ab9d03e631e1a
+md5sum = 3ae93702f3890a504cc8a93eb5ad52bc
 
 [template-neo]
 filename = instance.cfg.in
diff --git a/software/neoppod/instance-neo-admin.cfg.in b/software/neoppod/instance-neo-admin.cfg.in
index 8453455d00c48f29fb8d891fc3f08cba0081d802..5f14da4e3fbdd24992b6d4f925af4f7514a0277b 100644
--- a/software/neoppod/instance-neo-admin.cfg.in
+++ b/software/neoppod/instance-neo-admin.cfg.in
@@ -45,7 +45,7 @@ ssl = {{ dumps(bool(slapparameter_dict['ssl'])) }}
 cluster = {{ dumps(slapparameter_dict['cluster']) }}
 masters = {{ dumps(slapparameter_dict['masters']) }}
 extra-options =
-{%- for k, v in monitor_dict.iteritems() %}
+{%- for k, v in six.iteritems(monitor_dict) %}
 {%-   if k == 'backup' %}
 {%-     set k = 'monitor-backup' %}
 {%-   endif %}
diff --git a/software/neoppod/my.cnf.in b/software/neoppod/my.cnf.in
index 161eb6dbb72fb8999dc20bc6a6ad7270bf9e1ba8..91669c83000f3baa16d372edf3f00fba0b1db274 100644
--- a/software/neoppod/my.cnf.in
+++ b/software/neoppod/my.cnf.in
@@ -45,7 +45,7 @@ innodb_locks_unsafe_for_binlog = 1
 {{x}}sync_frm = 0
 
 # Extra parameters.
-{%- for k, v in extra_dict.iteritems() %}
+{%- for k, v in six.iteritems(extra_dict) %}
 {%- do assert('-' not in k) %}
 {{ k }} = {{ v }}
 {%- endfor %}
diff --git a/software/neoppod/software-common.cfg b/software/neoppod/software-common.cfg
index 91117768fc70bac55f6769cfbe3e59e54f35c9ba..9f653a263aa2f7f2f753cfc5824bd68dc539f3e7 100644
--- a/software/neoppod/software-common.cfg
+++ b/software/neoppod/software-common.cfg
@@ -129,8 +129,11 @@ inline =
 [versions]
 coverage = 5.5
 ecdsa = 0.13
-mysqlclient = 1.3.12
+mysqlclient = 2.0.1
 PyMySQL = 0.10.1
 pycrypto = 2.6.1
 cython-zstd = 0.2
 funcsigs = 1.0.2
+
+[versions:python2]
+mysqlclient = 1.3.12
diff --git a/software/slapos-sr-testing/software.cfg b/software/slapos-sr-testing/software.cfg
index 57163f3b85a9b2a88463d05a4103080d930dbe42..f2b77d8fddb01d879ba170eb8eb0c2ada69e0395 100644
--- a/software/slapos-sr-testing/software.cfg
+++ b/software/slapos-sr-testing/software.cfg
@@ -476,7 +476,6 @@ pysftp = 0.2.9
 requests-toolbelt = 0.8.0
 testfixtures = 6.11.0
 mysqlclient = 2.1.1
-pexpect = 4.8.0
 ptyprocess = 0.6.0
 psycopg2 = 2.8.6
 paho-mqtt = 1.5.0
diff --git a/stack/erp5/buildout-py3.cfg b/stack/erp5/buildout-py3.cfg
index 15698add9a8914fbfa4f6a0bc73821c489365055..055c9f2ab3776f2b42521bff28e7005ca696bce4 100644
--- a/stack/erp5/buildout-py3.cfg
+++ b/stack/erp5/buildout-py3.cfg
@@ -4,12 +4,6 @@ extends =
   ../../component/cython/buildout.cfg
   buildout.cfg
 
-parts +=
-# Development eggs
-  slapos-cookbook-develop
-  slapos-cookbook
-  PyStemmer
-  cython
 
 parts -=
 # XXX: The following parts have no support for Python 3. Ignore for now.
@@ -24,7 +18,6 @@ parts -=
   jupyter
   matplotlibrc
   h5py
-  custom-js
 
 find-links +=
   http://www.nexedi.org/static/packages/source/
@@ -59,6 +52,7 @@ recipe =
 recipe =
 [ocropy]
 recipe =
+
 [hookbox]
 recipe =
 [scipy]
@@ -83,30 +77,10 @@ include-dirs +=
   ${cyrus-sasl:location}/include
 
 [eggs]
-eggs +=
-## Python 3 variant
-  SOAPpy-py3
-  suds-py3
+
 eggs -=
-## Python 2 only
-  ZServer
-  Products.DCWorkflowGraph
-  uuid
-# Probably not worth the effort (used for backuping multi-ZODB instances and has
-# been discouraged for many years over NEO)
-  Products.TIDStorage
-## Python < 3.5
-  typing
-## tracemalloc is now part of Python 3.4!
-  pytracemalloc
-## XXX: The following eggs have no support for Python 3. Ignore for now.
-  ocropy
   ${ocropy:egg}
-  PyXML
-  threadframe
-  suds
-  SOAPpy
-  fpconst
+#  fpconst
   ${scipy:egg}
   ${scikit-learn:egg}
   ${scikit-image:egg}
@@ -116,7 +90,6 @@ eggs -=
   ${statsmodels:egg}
   astor
   jupyter
-# explicit eggs to generate scripts from them
   jupyter_client
   jupyter_console
   jupyter_core
@@ -125,86 +98,58 @@ eggs -=
   notebook
 # additional eggs
   astor
-  ${matplotlib:egg}
-  ${scipy:egg}
-  ${scikit-learn:egg}
   ${seaborn:egg}
   ${statsmodels:egg}
-  patsy
-  ${h5py:egg}
-  openpyxl
-  sympy
-  xlrd
 # additional eggs for jupyterlab
   jupyterlab
   jupyterlab-launcher
   pytesseract
 
-[astroid]
-patches =
-
-[pylint]
-patches=
-setup-eggs = ${mccabe:egg}
 
 
 [versions]
-# zc.recipe.egg 2.0.7 (in versions.cfg) requires zc.buildout>=2.12.0, so let's
-# revert to the version contained in stack/slapos.cfg
-zc.recipe.egg = 2.0.3+slapos003
-
 pyasn1-modules = 0.2.8
 pyasn1 = 0.4.8
 
-## Version up to support Python 3.8
-numpy = 1.16.6
-pandas = 0.24.2
-google-api-python-client = 2.41.0
-zope.app.appsetup = 4.2.0
-zope.app.publication = 4.5
-# google-api-python-client version bump
-uritemplate = 3.0.1
+google-api-python-client = 2.81.0
 google-api-core = 2.7.1
 google-auth-httplib2 = 0.1.0
 google-auth = 2.6.0
 httplib2 = 0.15.0
 protobuf = 3.19.4
 googleapis-common-protos = 1.55.0
-cachetools = 5.0.0
-## XXX: No version of scipy is both compatible with Python 2.7 and 3.7
-scipy = 1.5.2
+scipy = 1.8.1
 #scikit-learn = 0.20.4
 statsmodels = 0.10.2
 pyzmq = 19.0.2
-PyStemmer = 2.0.1
 python-ldap = 3.1.0
-ipython = 7.31.1
-mccabe = 0.6
-setuptools-scm = 7.0.5
-packaging = 20.4
-typing-extensions = 4.3.0:whl
-tomli = 2.0.1:whl
-lazy-object-proxy = 1.4.3
-isort = 4.2.5
-astroid = 2.4.0
-wrapt = 1.11
-typed-ast = 1.4.0
-jedi = 0.16.0
-parso = 0.5.2
-mysqlclient = 2.0.1
-polib = 1.1.0
-# testrunner
-pexpect = 4.8.0
+#mysqlclient = 2.0.1
+#polib = 1.2.0
+
 matplotlib-inline = 0.1.3
-backcall = 0.2.0
-prompt-toolkit = 3.0.27
-# 2to3 fixers to port code to python3
-zope.fixers = 1.1.2
+#prompt-toolkit = 3.0.27
+
 SOAPpy-py3 = 0.52.26
 defusedxml = 0.7.1
 suds-py3 = 1.4.5.0
 wstools-py3 = 0.54.4
-toml = 0.10.2
 soupsieve = 2.3.2.post1:whl
 
-pylint = 2.6.0
+# WIP pylint
+[versions]
+pylint = 2.17.0:whl
+mccabe = 0.7.0:whl
+tomli = 2.0.1:whl
+lazy-object-proxy = 1.4.3
+isort = 4.2.5
+astroid = 2.15.0:whl
+wrapt = 1.11
+typed-ast = 1.4.0
+tomlkit = 0.11.6
+platformdirs = 3.1.1:whl
+dill = 0.3.6:whl
+
+[erp5]
+repository = https://lab.nexedi.com/nexedi/erp5.git
+branch = zope4py3
+develop = true
diff --git a/stack/erp5/buildout.cfg b/stack/erp5/buildout.cfg
index b13570bc660532c070974bd648e4c2bc387bdd4c..c11008c004dd2554791cc6c6b684b8e2e19d6da4 100644
--- a/stack/erp5/buildout.cfg
+++ b/stack/erp5/buildout.cfg
@@ -349,8 +349,10 @@ wcfs-enable-default = false
 recipe = slapos.recipe.build:gitclone
 repository = https://lab.nexedi.com/nexedi/erp5.git
 branch = master
+develop = true
 git-executable = ${git:location}/bin/git
 
+
 [testrunner]
 # XXX: Workaround for fact ERP5Type is not an distribution and does not
 #      expose entry point for test runner
@@ -508,7 +510,6 @@ eggs +=
   ipython_genutils
   ipykernel
   ipywidgets
-  requests
 
 
 [egg-with-zope-proxy]
@@ -525,13 +526,15 @@ setup-eggs +=
 
 [eggs]
 <= neoppod
-eggs = ${neoppod:eggs}
+eggs =
+  ${erp5-eggs-python2:eggs}
+  ${erp5-eggs-python3:eggs}
+  ${neoppod:eggs}
   ${caucase-eggs:eggs}
   ${wendelin.core:egg}
   ${numpy:egg}
   ${matplotlib:egg}
   ${lxml-python:egg}
-  ${ocropy:egg}
   ${pandas:egg}
   ${pillow-python:egg}
   ${python-ldap-python:egg}
@@ -553,14 +556,12 @@ eggs = ${neoppod:eggs}
   astor
   APacheDEX
   Pympler
-  SOAPpy
   chardet
   collective.recipe.template
   erp5diff
   interval
   ipdb
   Jinja2
-  jsonschema
   mechanize
   mock
   oauthlib
@@ -577,7 +578,6 @@ eggs = ${neoppod:eggs}
   requests
   responses
   urlnorm
-  uuid
   xml_marshaller
   xupdate_processor
   feedparser
@@ -588,11 +588,9 @@ eggs = ${neoppod:eggs}
   qrcode
   spyne
   httplib2
-  suds
   pprofile
   pycountry
   xfw
-  jsonschema
   ${selenium:egg}
   pytesseract
   decorator
@@ -602,9 +600,6 @@ eggs = ${neoppod:eggs}
   ${pylint:egg}
   jedi
   yapf
-  typing
-  pytracemalloc
-  xlrd
   pydot
 
 # Zope
@@ -617,16 +612,10 @@ eggs = ${neoppod:eggs}
 # for runzeo
   ${ZEO:egg}
 
-# Other Zope 2 packages
-  Products.PluggableAuthService
   Products.DCWorkflow
-
-# Other products
+  Products.PluggableAuthService
   Products.MimetypesRegistry
-  Products.TIDStorage
 
-# Currently forked in our repository
-#    Products.PortalTransforms
 # Dependency for our fork of PortalTransforms
   StructuredText
 
@@ -661,11 +650,9 @@ eggs = ${neoppod:eggs}
   docutils
   zLOG
   Products.ZSQLMethods
-  ZServer
   Products.ExternalMethod
   Products.SiteErrorLog
   tempstorage
-  Products.DCWorkflow
   Products.Sessions
   Products.ZODBMountPoint
   Record
@@ -703,6 +690,11 @@ python-magic-patches = ${:_profile_base_location_}/../../component/egg-patch/pyt
 python-magic-patch-options = -p1
 urlnorm-patches = ${:_profile_base_location_}/../../component/egg-patch/urlnorm/urlnorm-1.1.4-py3.patch#5ef268fb44cbc005b62140099c33b641
 urlnorm-patch-options = -p1
+Zope-patches =
+  ${:_profile_base_location_}/../../component/egg-patch/Zope/0001-WSGIPublisher-set-REMOTE_USER-even-in-case-of-error-.patch#a437f4da28975f94dd07db0b02954111
+Zope-patch-options = -p1
+
+[eggs:python2]
 # backported security patches for waitress-1.4.4 from Debian 1.4.4-1.1+deb11u1 package.
 waitress-patches =
   ${:_profile_base_location_}/../../component/egg-patch/waitress/CVE-2022-24761-1.patch#a0508880f24662e48a20ce3bcbf440c2
@@ -712,9 +704,30 @@ waitress-patches =
   ${:_profile_base_location_}/../../component/egg-patch/waitress/CVE-2022-24761-5.patch#ad2765822397cd1e28e02a68a52d7768
   ${:_profile_base_location_}/../../component/egg-patch/waitress/CVE-2022-24761-6.patch#85fc9c4105eabee3ff71c800b2ddf63b
 waitress-patch-options = -p1
-Zope-patches =
-  ${:_profile_base_location_}/../../component/egg-patch/Zope/0001-WSGIPublisher-set-REMOTE_USER-even-in-case-of-error-.patch#a437f4da28975f94dd07db0b02954111
-Zope-patch-options = -p1
+
+# python version dependent eggs
+[erp5-eggs-python2]
+eggs =
+
+[erp5-eggs-python2:python2]
+eggs =
+  ${ocropy:egg}
+  ZServer
+  Products.TIDStorage
+  pytracemalloc
+  SOAPpy
+  suds
+  typing
+  uuid
+  xlrd
+
+[erp5-eggs-python3]
+eggs =
+  SOAPpy-py3
+  suds-py3
+
+[erp5-eggs-python3:python2]
+eggs =
 
 # neoppod installs bin/coverage so we inject erp5 plugin here so that coverage script can use it in report
 [neoppod]
@@ -753,20 +766,17 @@ PyPDF2 = 1.26.0+SlapOSPatched001
 pysvn = 1.9.15+SlapOSPatched001
 python-ldap = 2.4.32+SlapOSPatched001
 python-magic = 0.4.12+SlapOSPatched001
-waitress = 1.4.4+SlapOSPatched006
 Zope = 4.8.9+SlapOSPatched001
 ## https://lab.nexedi.com/nexedi/slapos/merge_requests/648
 pylint = 1.4.4+SlapOSPatched002
 # astroid 1.4.1 breaks testDynamicClassGeneration
 astroid = 1.3.8+SlapOSPatched001
 
-# modified version that works fine for buildout installation
-SOAPpy = 0.12.0nxd001
-
 
 # Pinned versions
 alabaster = 0.7.12
 APacheDEX = 1.8
+arrow = 1.2.3
 Beaker = 1.11.0
 beautifulsoup4 = 4.8.2
 cloudpickle = 0.5.3
@@ -779,7 +789,7 @@ erp5diff = 0.8.1.8
 facebook-sdk = 2.0.0
 five.formlib = 1.0.4
 fpconst = 0.7.2
-future = 0.18.2
+fqdn = 1.5.1
 google-api-python-client = 1.6.1
 graphviz = 0.5.2
 haufe.requestmonitoring = 0.6.0
@@ -788,8 +798,8 @@ httplib2 = 0.10.3
 huBarcode = 1.0.0
 interval = 1.0.0
 ipdb = 0.10.2
+isoduration = 20.11.0
 jdcal = 1.3
-jedi = 0.15.1
 jsonpickle = 0.9.6
 jsonpointer = 2.2
 logilab-common = 1.3.0
@@ -799,16 +809,13 @@ mpmath = 0.19
 munnel = 0.3
 networkx = 2.1
 nt-svcutils = 2.13.0
-numpy = 1.13.1
 oauth2client = 4.0.0
 oauthlib = 3.1.0
 objgraph = 3.1.0
 oic = 0.15.1
 olefile = 0.44
-openpyxl = 2.4.8
-parso = 0.5.1
 Pillow = 6.2.2
-polib = 1.0.8
+polib = 1.2.0
 pprofile = 2.0.4
 Products.BTreeFolder2 = 4.4+SlapOSPatched001
 Products.CMFCore = 2.7.0+SlapOSPatched001
@@ -843,10 +850,12 @@ pytracemalloc = 1.2
 PyWavelets = 0.5.2
 qrcode = 5.3
 responses = 0.10.6
+rfc3339-validator = 0.1.4
 rfc3987 = 1.3.8
 rsa = 3.4.2
 scikit-image = 0.14.0
 scipy = 0.19.0
+SOAPpy-py3 = 0.52.26
 soupsieve = 1.9.5
 spyne = 2.12.14
 strict-rfc3339 = 0.7
@@ -855,10 +864,11 @@ suds = 0.4
 toolz = 0.9.0
 typing = 3.10.0.0
 unidiff = 0.5.5
+uri-template = 1.2.0
 urlnorm = 1.1.4+SlapOSPatched001
 uuid = 1.30
 validictory = 1.1.0
-webcolors = 1.10
+webcolors = 1.12
 webencodings = 0.5.1
 WebOb = 1.8.5
 WebTest = 2.0.33
@@ -884,4 +894,14 @@ zope.session = 4.5
 zope.testbrowser = 5.5.1
 
 [versions:python2]
+ipython = 5.3.0
+jedi = 0.15.1
+numpy = 1.13.1
+ocropy = 1.0+SlapOSPatched001
+openpyxl = 2.4.8
+parso = 0.5.1
+prompt-toolkit = 1.0.13
 PyStemmer = 1.3.0
+SOAPpy = 0.12.0nxd001
+waitress = 1.4.4+SlapOSPatched006
+webcolors = 1.10
diff --git a/stack/erp5/buildout.hash.cfg b/stack/erp5/buildout.hash.cfg
index eb3129b5e8edff1ab324dc16709292f6cff7f54a..f0b6e1ce9eeeca61a24deec8dde3e56a9d328fad 100644
--- a/stack/erp5/buildout.hash.cfg
+++ b/stack/erp5/buildout.hash.cfg
@@ -74,7 +74,7 @@ md5sum = 3f7b28085ceff321a3cb785db60f7c3e
 
 [template-erp5]
 filename = instance-erp5.cfg.in
-md5sum = 4a2587c0b3ad6a34af1f11fb75511e55
+md5sum = ab7b0e52ab64f23d3cf0301edd0dad1f
 
 [template-zeo]
 filename = instance-zeo.cfg.in
diff --git a/stack/erp5/instance-erp5.cfg.in b/stack/erp5/instance-erp5.cfg.in
index a1ec6cc9368f3709a6617052d7c0ff6f6f65dbc7..99e5f650b882a760e295fa40f07495baccdf893f 100644
--- a/stack/erp5/instance-erp5.cfg.in
+++ b/stack/erp5/instance-erp5.cfg.in
@@ -201,7 +201,7 @@ config-zodb-dict = {{ dumps(zodb_dict) }}
 {% for server_type, server_dict in six.iteritems(storage_dict) -%}
 {%   if server_type == 'neo' -%}
 config-neo-cluster = ${publish-early:neo-cluster}
-config-neo-name = {{ server_dict.keys()[0] }}
+config-neo-name = {{ list(server_dict.keys())[0] }}
 config-neo-masters = ${publish-early:neo-masters}
 {%   else -%}
 config-zodb-zeo = ${request-zodb:connection-storage-dict}
diff --git a/stack/slapos.cfg b/stack/slapos.cfg
index 091d0d3cb1048b0a0132fc9c617984d072dcb1c5..c178da4e8e54abf0d451ab7998b7950d381a7407 100644
--- a/stack/slapos.cfg
+++ b/stack/slapos.cfg
@@ -323,7 +323,7 @@ typeguard = 2.13.3:whl
 typing-extensions = 4.3.0:whl
 tzlocal = 1.5.1
 unicodecsv = 0.14.1
-uritemplate = 3.0.0
+uritemplate = 3.0.1
 urllib3 = 1.26.12
 wcwidth = 0.2.5
 webencodings = 0.5.1