Upgrading to Plone 6.0#

Plone 6.0 has seen the following major changes. Some may require changes in your setup.

Removed portal_quickinstaller#

Plone no longer ships with the portal_quickinstaller tool (CMFQuickInstallerTool). In existing sites, the standard upgrade will remove the tool. This is the final step in a deprecation path that started in Plone 5.1. Documentation on how to switch to GenericSetup and the new installer, can be seen in the old Plone 5.1 upgrade guide.

See PLIP 1775.

Dexterity site root#

For content types, in Plone 4 and 5 you had the option to use the old Archetypes or the new Dexterity framework. The Plone Site root object was neither: it was in its own class. In Plone 6, the site root itself is a Dexterity object.

When you upgrade a site from Plone 5.2 to 6.0, at first you will see an empty site root. Do not panic. Your contents are only temporarily invisible. Perform the standard migration via the @@plone-upgrade view and your content will be visible again.

See PLIP 2454.


Plone 6 ships with a new NodeJS frontend: Volto. When you use the Plone package in your project, you will get the plone.volto integration package. This package prepares your Plone Site as a REST API.


The classic integrated frontend which is called "Classic UI" is still available if you are not ready for the new separate frontend. If you choose to use Classic UI, then do not use the plone.volto package.

See PLIP 2703.


The deprecated Archetypes contenttypes framework is no longer supported. Add-ons that define a contenttype must use Dexterity instead.

See PLIP 2775.

Some deprecated views have been removed#

In Plone 6 some legacy view aliases have been removed. You can replace them with the new ones based on the following table:

Legacy name

New name





















See plone/plone.app.contenttypes#621.

No more temp_folder / tempstorage#

The temp_folder object in the Zope root is no longer created by default. If the object is there, but it is broken, the standard Plone upgrade procedure will remove it.

For now you must explicitly disable the temp_folder if you use buildout:

recipe = plone.recipe.zope2instance
zodb-temporary-storage = off

See issue 2957.

Changed Templates to Bootstrap 5 Markup#

All templates in core Plone have been updated to use Bootstrap 5 markup. Add-on authors are encouraged to do the same. If you have customized a core template, you should check if your change is still needed, and update it to fit the new markup. Any CSS and JavaScript that relies on a specific structure, or certain IDs or classes, should be checked as well.

See PLIP 2967.

Zope 5#

Plone 6.0 means we move from Zope 4 to 5. This drops support for Python 2.7, drops ZServer, and removes deprecated code. See Zope 5.0a1.

Some imports may need to change. Add-on authors should check on Plone 5.2 if their code runs without any deprecation warnings from Zope 4. If no warnings are shown, the add-on should run fine on Zope 5.

See PLIP 3058.

Modernize Plone default theme (Barceloneta LTS)#

The standard theme in Classic UI was updated to Bootstrap 5, CSS variables, and an icon library. If you have a theme that builds on Barceloneta, you most likely need various changes.

It may be best to start with a fresh theme, and try to keep the changes minimal. The training documentation lists three possible theming strategies:

  • Create a theme based on Barceloneta

  • Create a theme from scratch

  • Create a theme based on Diazo

See PLIP 3061.


You may need to use a newer Python version. Supported Python versions are 3.7, 3.8, and 3.9. We recommend the most recent version. See https://www.python.org/downloads/ for which Python version is still supported by the Python community.

See PLIP 3229.


The plone.api package now has a relation module. Add-on authors may want to use this to get, create, or delete relations.

See PLIP 3137.

Mockup and resource registry redone#

Mockup contains the source of most Classic Plone JavaScript. The compiled version is in plone.staticresources.

Mockup is now based on Patternslib 4. It uses ES6 module imports instead of RequireJS. Add-ons for Classic Plone that use JavaScript should be updated to use ES6 modules as well.

The resource registries and their control panel have been simplified. Add-ons for Classic Plone only need to register bundles, not individual resources.

See PLIP 3211.

Relations control panel#

Plone 6 has a new control panel for relations, @@inspect-relations. As Manager you may want to use this control panel to look for and fix possible problems.

See PLIP 3232.

Deprecated Unicode property types#

Zope 5 has deprecated the Unicode property types ustring, ulines, utext, and utokens. If you use these in your add-on, you should switch to their standard variants string, lines, text, and tokens. These behave exactly the same on Python 3. Plone has an upgrade step that goes through all objects in the site, replacing the deprecated properties with the default ones. You should avoid adding them to your code.

See issue 3305.


We have replaced z3c.autoinclude with plone.autoinclude. Both are used by add-ons (Python packages) to signal with an entry point that Plone must load the ZCML of the add-on. In most cases, the existing entry point can stay the same. For example in setup.py:

target = plone

When your package name differs from your module name, you need to specify a differently named entry point. When your module is named example.alternative, create this entry point:

target = plone
module = example.alternative

The includeDependencies directive is no longer supported. It was already recommended not to use this directive, as it is too implicit. In the ZCML files of your add-on, search for includeDependencies. Replace all of its instances by explicitly loading any ZCML from other packages used by the add-on. Here is a sample change from dexterity.membrane:

-  <includeDependencies package="." />
+  <include package="Products.membrane" />

The same change is needed for the no longer supported includeDependenciesOverrides directive, which may be used in overrides.zcml.

See PLIP 3339. Also see the plone.autoinclude documentation.