..  include:: /Includes.rst.txt

..  _feature-107628-1729026000:

===============================================================
Feature: #107628 - Improved backend module naming and structure
===============================================================

See :issue:`107628`

Description
===========

TYPO3 Core's backend module structure has been modernized with clearer,
more intuitive naming conventions that better align with industry
standards used by enterprise content management systems.

Module names should immediately convey their purpose to editors and
administrators. This series of renamings improves clarity,
discoverability, and reduces the cognitive load for both new and
experienced users.

Clear and consistent naming is fundamental to good user experience.
When comparing TYPO3 Core with other enterprise CMS platforms, it became
evident that some of TYPO3 Core's module names were either too technical,
ambiguous, or did not clearly communicate their purpose.

To summarize, the goals of this restructuring are:

*   **Improved clarity**: Module names immediately convey their purpose.
*   **Industry alignment**: Adopt naming conventions familiar to users of
    other enterprise CMS platforms.
*   **Better discoverability**: Help new users find functionality without
    extensive training.
*   **Reduced cognitive load**: Minimize confusion when navigating the
    backend.

Module renamings
================

The following modules have been renamed.

Top-level modules
-----------------

Web => Content
~~~~~~~~~~~~~~

The top-level :guilabel:`Web` module has been renamed to
:guilabel:`Content`.

**Rationale:** TYPO3 is a **content** management system. The primary
workspace where editors create and manage content should be clearly
labeled as such. The term "Web" was ambiguous and did not communicate the
module's purpose. Users outside the TYPO3 ecosystem often did not
understand what "Web" meant in this context.

**Migration:** Update module parent references from :php:`'web'` to
:php:`'content'`:

..  code-block:: php

    return [
        'my_module' => [
            'parent' => 'content',  // Previously: 'web'
        ],
    ];

File => Media
~~~~~~~~~~~~~

The top-level :guilabel:`File` module has been renamed to
:guilabel:`Media`.

**Rationale:** The term "Media" clearly indicates the module's purpose of
managing digital media files (images, videos, documents, audio files,
etc.) within the CMS. The term "File" was too generic and technical,
while "Media" is widely understood and commonly used in content
management systems to refer to digital content assets.

**Migration:** Update module parent references from :php:`'file'` to
:php:`'media'`:

..  code-block:: php

    return [
        'my_module' => [
            'parent' => 'media',  // Previously: 'file'
        ],
    ];


Site Management => Sites
~~~~~~~~~~~~~~~~~~~~~~~~

The top-level :guilabel:`Site Management` module has been renamed to :guilabel:`Sites`.

**Rationale:** The former label "Site Management" was long and formal, and did
not align with TYPO3’s evolving, concise module naming strategy. The
simplified name "Sites" improves scanability in the module menu and matches
the naming of other top-level modules. It also better reflects the purpose
of the module: providing an overview entry point for all configured (web)sites.

**Migration:** The top-level module identifier :php:`site` is kept. No migration
is necessary.

Admin (tools) <=> System
~~~~~~~~~~~~~~~~~~~~~~~~

The top-level module formerly known as :guilabel:`Admin tools` is now
called :guilabel:`Administration`.

The purpose of this top-level module has changed. It now contains those
modules useful to backend administrators, such as user and permission
management, the Scheduler, and Integrations.

Most modules formerly found in :guilabel:`Admin tools` are now located in
:guilabel:`System`.

**Rationale:** The top-level module :guilabel:`Administration` now
contains modules that are used by backend administrators in their daily
work. Modules that require system maintainer permissions are found in the
module named :guilabel:`System`.

**Migration:** Modules generally accessible to backend administrators
should be moved to the top-level module with the identifier `admin`.
Modules that require system maintainer permissions or are mainly useful
to system maintainers and DevOps should be moved to `system`.

..  code-block:: php

    return [
        'my_administration_module' => [
            'parent' => 'admin',  // Previously: 'system'
            'access' => 'admin',
        ],
        'my_maintainer_module' => [
            'parent' => 'system',  // Previously: 'tools'
            'access' => 'systemMaintainer',
        ],
    ];

Second-level modules
--------------------

For modules, where the module identifier changed, the upgrade wizard
"Migrate module permissions" migrates module level group and user permissions.

Page => Layout
~~~~~~~~~~~~~~

The second-level :guilabel:`Page` module has been renamed to :guilabel:`Layout`
to better match its scope.

**Rationale:** The previous module name "Page" did not clearly convey the
module’s purpose or workflow. TYPO3 provides multiple ways to interact with
a page (e.g. structure, properties, preview), and the term "Page" alone did
not describe which aspect was being managed. The renamed module "Layout"
more accurately reflects what editors do inside the module: maintain the
page layout, manage content elements, and organize them into the correct
columns and grids. This provides clearer expectations, improves usability
for new editors, and aligns the module name with modern TYPO3 workflows
and terminology.

**Migration:** Since the module is just renamed, there are no migrations
necessary.

List => Records
~~~~~~~~~~~~~~~

The second-level :guilabel:`List` module has been renamed to
:guilabel:`Records` to better convey its purpose and improve clarity.

**Rationale:** The term "List" is too generic and does not adequately
communicate the module's purpose. While "List" could refer to any kind of
enumeration or overview, the module actually provides structured access to
**database records** appearing on a page. The new name "Records" is more
specific and immediately communicates that this module is about working with
data records—viewing, editing, and managing them at the database level.

The term "Records" also aligns with how the module is already described in
its own interface ("List of database records") and better reflects the
technical nature of the module's functionality. For users coming from other
enterprise CMS platforms or database-driven systems, "Records" is a widely
understood term that clearly indicates low-level data management
capabilities.

This renaming reduces ambiguity and helps users—especially those new to
TYPO3—understand that this module provides direct access to the underlying
record structure, distinguishing it from the more content-focused
:guilabel:`Layout` module.

**Migration:** The module identifier has been renamed from `web_list` to
`records`. An alias is in place. However, use the new identifier when referencing.

..  code-block:: diff

   - $this->uriBuilder->buildUriFromRoute('web_list');
   + $this->uriBuilder->buildUriFromRoute('records');

View => Preview
~~~~~~~~~~~~~~~

The second-level :guilabel:`View` module has been renamed to
:guilabel:`Preview` to better match its scope. It has also been moved one
position down after :guilabel:`Records`, as that module is considered more
important for daily work.

**Rationale:** The term "Preview" is more precise, as it triggers a
frontend preview and cannot be misunderstood as "viewing" a page in the
backend context.

**Migration:** Since the module is already internally referred to as
`page_preview`, no changes in referencing modules are required.

Workspaces => Publish
~~~~~~~~~~~~~~~~~~~~~

The second-level :guilabel:`Workspaces` module has been renamed to
:guilabel:`Publish` to better match its current scope.

**Rationale:** The initially introduced "Workspaces administration" tool
has been reworked to move content through a publishing process in past
versions. For this reason, it is now renamed to "Publish" and
is only visible when inside a workspace.

**Migration:** The module has internally been renamed to `workspaces_publish`.
A module alias is in place, so references to the old `workspaces_admin`
identifier keep working as before, but it is recommended to adapt usages.

The upgrade wizard "Migrate module permissions" migrates backend user and
group-level permissions for this module.

Info, Indexing, Check Links => Status
--------------------------------------

The second-level :guilabel:`Info` module has been renamed to :guilabel:`Status`
to better match its scope. It has also been moved into EXT:backend so it is
always available and displayed if it contains at least one module.

**Rationale:** The module was moved to EXT:backend to make it always available
and to provide a common place for page and site status information.

The renaming to :guilabel:`Status` better reflects its purpose and removes
unnecessary dependencies between informational extensions.

**Migration:** The module identifier has been renamed from `web_info` to
`content_status` an alias is in place. Use the new identifier to place custom
modules.

..  code-block:: diff

     return [
         'my_page_information' => [
    -        'parent' => 'web_info',
    +        'parent' => 'content_status',
         ],
     ];

Extensions placing third level modules into the module now called
:guilabel:`Status` do not need to require :composer:`typo3/cms-info` anymore.

Filelist => Media
~~~~~~~~~~~~~~~~~

The second-level :guilabel:`Filelist` module has been renamed to :guilabel:`Media`
to more accurately reflect its current functionality and scope.

**Rationale:** The former "Filelist" no longer reflected what the module
actually does. Over the years, its scope has evolved from simply listing files
to offering a full set of media-management capabilities. Today, the module is
used to upload and create files and folders, manage metadata, organize assets,
handle online media, and prepare files for use across the CMS.

To make its purpose clearer and more intuitive for editors and integrators,
the module has been renamed to "Media". The new name better represents its
broader functionality, aligns with modern CMS terminology, and makes the
module easier to understand for new users.

**Migration:** Since the module is already internally referred to as `media_management`,
no changes in referencing modules are required.

Sites => Setup
~~~~~~~~~~~~~~~

The second-level :guilabel:`Sites` module has been renamed to :guilabel:`Setup`.

**Rationale:** The old submodule name "Sites" would duplicate the new top-level
name and cause confusion. The new name "Setup" therefore makes the purpose
clearer: It is the place where integrators set up their sites. "Setup"
emphasizes the technical nature of the module and better communicates that
this section defines behavior (languages, domains, routes), not content.

**Migration:** Since the module identifier `site_configuration` is kept, no
changes in referencing modules are required.

Settings => Setup
-----------------

The second level :guilabel:`Settings` module has been integrated into :guilabel:`Setup`.

**Rationale:** Combining the "Setup" and "Settings" gives a more concise view,
since managing sites and site settings are often done as one task.

**Migration:** The module identifier `site_settings` has been removed, the existing
actions :php:`edit`, :php:`save` and :php:`dump` have been renamed to
:php:`editSettings`, :php:`saveSettings` and :php:`dumpSettings` as part of the
`site_configuration` module identifier.

Link Management
~~~~~~~~~~~~~~~

A new second-level :guilabel:`Link Management` module has been introduced
under the :guilabel:`Sites` top-level menu to provide a unified location
for managing URL-related features.

This new module serves as a parent for two third-level modules:

- :guilabel:`Redirects` - The existing redirects module for managing URL redirects
- :guilabel:`QR Codes` - A new module for creating and managing scannable QR codes (see :ref:`feature-107756-1763294102`)

**Rationale:** Grouping these URL management features under a common parent module
creates better organization and discoverability. Both redirects and QR codes deal
with URL handling and link management, making them natural companions in the
module structure. The new parent module provides a logical home for current and
future URL-related functionality.

**Migration:** The existing :guilabel:`Redirects` module, previously a second-level
module under :guilabel:`Site`, has been moved to become a third-level module
under :guilabel:`Sites > Link Management`. The module identifier `site_redirects`
has changed to `redirects`. An alias ensures backward compatibility. Use the new
identifier when registering custom modules.

System > Backend Users => Administration > Users
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The second-level :guilabel:`System > Backend Users` module has been renamed
to :guilabel:`Administration > Users` to better match its scope.

It has also been moved to the top of the to :guilabel:`Administration` top level
menu as it is frequently used by administrators.

**Rationale:** The new name "Users" is shorter and easier to recognize in the
module menu. While "Backend Users" was technically precise, the simpler term
improves readability and usability, making the module easier to find for
administrators performing common user management tasks.

**Migration:** The identifier `backend_user_management` is kept unchanged, no
migration needed.

System > DB Check => System > Database
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The second-level :guilabel:`DB Check` module has been renamed to
:guilabel:`Database` to better reflect its purpose.

**Rationale:** The name "Database" is clearer and avoids the ambiguity of the
abbreviation "DB". The module now focuses solely on search and query
functionality and no longer performs database integrity checks.

**Migration:** The module identifier has changed from `system_dbint` to
`system_database`. An alias ensures backward compatibility. Use the new
identifier when registering custom modules.

..  code-block:: diff

     return [
         'my_database_tool' => [
    -        'parent' => 'system_dbint',
    +        'parent' => 'system_database',
         ],
     ];

.. note::

    The module now exposes its actions "Search query" and "Raw query" through
    the new submodule overview. This gives users clearer, detailed information
    about the purpose of each action.

Impact
======

All renamed module identifiers maintain their previous names as aliases,
ensuring full backward compatibility. Existing code, configurations, and
third-party extensions continue to work without modification.

Developers are encouraged to update their code to use the new identifiers
for consistency and clarity.

The modernized naming improves the overall user experience by making the
backend more intuitive and easier to navigate, particularly for users
familiar with other enterprise CMS platforms.

..  index:: Backend, PHP-API, ext:backend, ext:core
