---
title: Deprecations and breaking changes to celebrate in TYPO3 v10
url: "https://b13.com/knowledge/deprecations-and-breaking-changes-to-celebrate-in-typo3-v10"
description: TYPO3 is ahead of the pack in adopting new standards while staying as stable as possible for devs. Some breaking changes and deprecations are inevitable. Read about our top 3 breaking changes and top 3 deprecations in TYPO3v10
image: "https://b13.com/fileadmin/_processed_/8/4/csm_Deprecations_191-1_4fda0ed8cc.png"
date: 2020-08-14
modified: 2026-08-19
lastUpdated: 2026-08-19
---

# Deprecations and breaking changes to celebrate in TYPO3 v10

[ TYPO3v10 ](https://b13.com/knowledge/typo3v10) [ TYPO3 ](https://b13.com/knowledge/typo3)

 Deprecations and breaking changes to celebrate in TYPO3 v10
=============================================================

![](https://b13.com/fileadmin/_processed_/c/c/csm_michi_3be01bc232.jpg)Michael Semle

  18 August 2020

 [ RSS Feed ](https://b13.com/rss.xml)

  ![A person wearing a beret and a fringed poncho waves goodbye to a steam train, surrounded by stylized smoke and a dark background.](https://b13.com/fileadmin/_processed_/3/c/csm_Deprecations_ff1788f9b8.webp)

TYPO3 v10 implements many sweet new features and the whole CMS is getting better and better. But as with any big step forward, some things change or get left behind. This is necessary to keep future-oriented and not let old habits hold us back. So TYPO3 strives to keep improving by implementing well known and common standards. Deprecations and breaking changes are inconvenient but here are a few reasons why it’s definitely worth keeping up!

   v10 stable from the beginning
-------------------------------

TYPO3 v10 marks the first release that did not have any breaking changes between v10.0.0 and v10.4.0 (the LTS version), leaning towards a more semantic approach to versioning than before. And even 10.4.0 only had three breaking changes, which were accounted for by v10’s new Dashboard and an old utility class.

In general, breaking changes were allowed up to TYPO3 v10.0.0. Major changes related to Site Handling, and the removal of the legacy layer for handling URLs before Site Handling, and the exchange of the SwiftMailer API under the hood for the Symfony Mailer API. Other changes between v10.0.0 and v10.4 LTS concerned the implementation of new features while keeping existing functionality the same as before.

A great example of this is the extension felogin. To keep the old code running and add a possibility to rebuild the extension with Extbase, the developers used the feature flag mechanism. Providing a new module to migrate to the new solution, while having the old pi-based plugin still working.

Since TYPO3 v10 did not have breaking changes between v10.0.0 and v10.4.0, developers could start using TYPO3 v10 in late July 2019 safe in the knowledge that the APIs won’t change anymore. So they were able to implement new features on top of the TYPO3 API knowing they were completely compatible with TYPO3 v10.

   3 breaking and 3 deprecation changes we love
----------------------------------------------

  ###  Breaking: Extbase validators won’t be registered automatically anymore

Until TYPO3 v9, many extbase validators, such as domain models or types, were registered automatically. Now this has been removed and does not build an overhead of unnecessary and unused validators. If you need validators, now you have to set them in the phpDoc comments.

Breaking: #87957—Validators are not registered automatically in Extbase anymore
 <https://docs.typo3.org/c/typo3/cms-core/master/en-us/Changelog/10.0/Breaking-87957-DoNotMagicallyRegisterValidators.html>

  ###  Breaking: Symfony Mime and Mailer instead of Swift Mailer

While implementing more and more well known and common standards into TYPO3, the Swift Mailer component was removed and replaced with the Symfony Mime and Mailer packages. Swift Mailer could be used in third party extensions or in your own code. To get your code running again, you have to switch to the new Symfony packages or use the core APIs for sending emails.

Breaking: #88643—Removed swiftmailer/swiftmailer dependency
 <https://docs.typo3.org/c/typo3/cms-core/master/en-us/Changelog/10.0/Breaking-88643-RemovedSwiftmailerswiftmailerDependency.html>

  ###  Breaking: Using string keys for log levels

This is a small change, but it shows how much dedication is put into our beloved CMS. For using the log API from TYPO3, the log levels are now represented by string keys and not as a number anymore. If you used the constants provided by the LogLevel class nothing has changed for you. If you used numbers, changing to the new strings solves the problem.

But why was this changed? With this breaking change, the code—or more specifically the config—for your log is more human-readable. This makes your work a little easier and TYPO3 is even more based on new standards.

  ####  Before

```
1<br></br>2<br></br>3<br></br>4<br></br>5<br></br>6<br></br>7<br></br>8<br></br>9<br></br>10<br></br>11<br></br>12<br></br>13<br></br>14<br></br>15<br></br>16<br></br>17<br></br>18<br></br>19<br></br>20<br></br>21<br></br>22<br></br>23<br></br>24<br></br>25<br></br>26<br></br>27<br></br>28<br></br>29<br></br>
```

```
<span class="hljs-comment">/**<br></br> * Log levels according to RFC 3164<br></br> */</span><br></br><span class="hljs-keyword">class</span> <span class="hljs-symbol">LogLevel</span><br></br>{<br></br>    <span class="hljs-comment">/** Emergency: system is unusable ...*/</span><br></br>    <span class="hljs-keyword">const</span> EMERGENCY = <span class="hljs-number">0</span>;<br></br><br></br>    <span class="hljs-comment">/** Alert: action must be taken immediately ...*/</span><br></br>    <span class="hljs-keyword">const</span> ALERT = <span class="hljs-number">1</span>;<br></br><br></br>    <span class="hljs-comment">/** Critical: critical conditions ...*/</span><br></br>    <span class="hljs-keyword">const</span> CRITICAL = <span class="hljs-number">2</span>;<br></br><br></br>    <span class="hljs-comment">/** Error: error conditions ...*/</span><br></br>    <span class="hljs-keyword">const</span> ERROR = <span class="hljs-number">3</span>;<br></br><br></br>    <span class="hljs-comment">/** Warning: warning conditions ...*/</span><br></br>    <span class="hljs-keyword">const</span> WARNING = <span class="hljs-number">4</span>;<br></br><br></br>    <span class="hljs-comment">/** Notice: normal but significant condition ...*/</span><br></br>    <span class="hljs-keyword">const</span> NOTICE = <span class="hljs-number">5</span>;<br></br><br></br>    <span class="hljs-comment">/** Informational: informational messages ...*/</span><br></br>    <span class="hljs-keyword">const</span> INFO = <span class="hljs-number">6</span>;<br></br><br></br>    <span class="hljs-comment">/** Debug: debug-level messages ...*/</span><br></br>    <span class="hljs-keyword">const</span> DEBUG = <span class="hljs-number">7</span>;<br></br>}<br></br>
```

  ####  After

```
1<br></br>2<br></br>3<br></br>4<br></br>5<br></br>6<br></br>7<br></br>8<br></br>9<br></br>10<br></br>11<br></br>12<br></br>13<br></br>14<br></br>15<br></br>16<br></br>17<br></br>
```

```
<span class="hljs-comment">/**<br></br> * Log levels according to RFC 3164<br></br> */</span><br></br><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">LogLevel</span> <span class="hljs-keyword">extends</span> \<span class="hljs-title">Psr</span>\<span class="hljs-title">Log</span>\<span class="hljs-title">Loglevel</span><br></br></span>{<br></br>    <span class="hljs-comment">/** Reverse look up of log level to level name. ...*/</span><br></br>    <span class="hljs-keyword">protected</span> <span class="hljs-keyword">static</span> $levels = [<br></br>        <span class="hljs-keyword">self</span>::EMERGENCY,<br></br>        <span class="hljs-keyword">self</span>::ALERT,<br></br>        <span class="hljs-keyword">self</span>::CRITICAL,<br></br>        <span class="hljs-keyword">self</span>::ERROR,<br></br>        <span class="hljs-keyword">self</span>::WARNING,<br></br>        <span class="hljs-keyword">self</span>::NOTICE,<br></br>        <span class="hljs-keyword">self</span>::INFO,<br></br>        <span class="hljs-keyword">self</span>::DEBUG,<br></br>    ];<br></br>}<br></br>
```

  ```
1<br></br>2<br></br>3<br></br>4<br></br>5<br></br>6<br></br>7<br></br>8<br></br>9<br></br>10<br></br>11<br></br>12<br></br>13<br></br>14<br></br>15<br></br>16<br></br>
```

```
<span class="hljs-keyword">namespace</span> <span class="hljs-title">Psr</span>\<span class="hljs-title">Log</span>;<br></br><br></br><span class="hljs-comment">/**<br></br> * Describes log levels.<br></br> */</span><br></br><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">LogLevel</span><br></br></span>{<br></br>    <span class="hljs-keyword">const</span> EMERGENCY = <span class="hljs-string">'emergency'</span>;<br></br>    <span class="hljs-keyword">const</span> ALERT = <span class="hljs-string">'alert'</span>;<br></br>    <span class="hljs-keyword">const</span> CRITICAL = <span class="hljs-string">'critical'</span>;<br></br>    <span class="hljs-keyword">const</span> ERROR = <span class="hljs-string">'error'</span>;<br></br>    <span class="hljs-keyword">const</span> WARNING = <span class="hljs-string">'warning'</span>;<br></br>    <span class="hljs-keyword">const</span> NOTICE = <span class="hljs-string">'notice'</span>;<br></br>    <span class="hljs-keyword">const</span> INFO = <span class="hljs-string">'info'</span>;<br></br>    <span class="hljs-keyword">const</span> DEBUG = <span class="hljs-string">'debug'</span>;<br></br>}<br></br>
```

  Breaking: #88799—Introduced PSR-3 compatible Logging API
 <https://docs.typo3.org/c/typo3/cms-core/master/en-us/Changelog/10.0/Breaking-88799-IntroducedPSR-3CompatibleLoggingAPI.html>

  ###  Deprecation: Long awaited multiple recipients for forms

Now you are able to send your form to a lot of people at the same time. Almost a million times we wished this feature would come. But with it, the old definition of recipients has been deprecated. To ensure your forms will work in the next major version, just change to the new definition with a “name-email address” pattern in the new recipient option.

Deprecation: #80420—EmailFinisher single address options
 <https://docs.typo3.org/c/typo3/cms-core/master/en-us/Changelog/10.0/Deprecation-80420-EmailFinisherSingleAddressOptions.html>

  ###  More about this change

Read more about this change in our dedicated [Blog Post “HTML Emails and Multiple Recipients in Core”](https://b13.com/knowledge/html-emails-in-typo3-v10).

  ###  Deprecation: Register plugins and modules with fully qualified controller class names

With this deprecation, registering a plugin or a module has become more understandable and intuitive. To register a module, you previously had to prepend your extension name with the vendor. Instead of slashes there were dots, and the controller names were used without the proper class name. This can be very confusing especially for beginners.

So now there will be only your extension name and the fully qualified class name. Your IDE will like the fully qualified class names.

  ####  Before

Until now Extbase extensions registered a plugin like this:

  ```
1<br></br>2<br></br>3<br></br>4<br></br>5<br></br>6<br></br>7<br></br>8<br></br>9<br></br>
```

```
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(<br></br>    <span class="hljs-string">'b13.Simplenews'</span>,<br></br>    <span class="hljs-string">'List'</span>,<br></br>    [<br></br>        <span class="hljs-string">'Main'</span> => <span class="hljs-string">'list,detail'</span>, <span class="hljs-comment">// A list of all controllers and actions</span><br></br>    ],<br></br>    <span class="hljs-comment">// No uncacheable plugin actions</span><br></br>    []<br></br>);<br></br>
```

  ####  After

Extbase relied on “magic” to detect what the “Main” controller is, and what it was named. With version 10, the new syntax looks like this:

  ```
1<br></br>2<br></br>3<br></br>4<br></br>5<br></br>6<br></br>7<br></br>8<br></br>9<br></br>
```

```
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(<br></br>    <span class="hljs-string">'Simplenews'</span>,<br></br>    <span class="hljs-string">'List'</span>,<br></br>    [<br></br>        \b13\Simplenews\Controller\MainController::class => <span class="hljs-string">'list,detail'</span>, <span class="hljs-comment">// A list of all controllers and actions</span><br></br>    ],<br></br>    <span class="hljs-comment">// No uncacheable plugin actions</span><br></br>    []<br></br>);<br></br>
```

  This makes it more PHP-like (using the `::class` syntax) and avoids errors in naming variables. Both variants are possible in TYPO3 v10.

Deprecation: #87550—Use controller classes when registering plugins/modules
 <https://docs.typo3.org/c/typo3/cms-core/master/en-us/Changelog/10.0/Deprecation-87550-UseControllerClassesWhenRegisteringPluginsmodules.html>

  ###  Getting in touch with the new Services.yaml

To register new commands for your TYPO3 instance, the new Services.yaml file is now the place where everything happens. You can configure dependency injection and register your command in a single location. Isn’t that awesome? With both variants in use for supporting two major versions, no deprecation will be thrown, and both version 9 and v10 could be implemented. Bear in mind that, from version 11, the old method will be removed entirely so it’s worth updating your code now to make a later upgrade smoother, and avoid duplication down the road.

  ```
1<br></br>2<br></br>3<br></br>4<br></br>5<br></br>6<br></br>7<br></br>8<br></br>9<br></br>10<br></br>11<br></br>
```

```
<span class="hljs-attr">services:</span><br></br>  <span class="hljs-attr">_defaults:</span><br></br>    <span class="hljs-attr">autowire:</span> <span class="hljs-literal">true</span><br></br>    <span class="hljs-attr">autoconfigure:</span> <span class="hljs-literal">true</span><br></br>    <span class="hljs-attr">public:</span> <span class="hljs-literal">false</span><br></br><br></br>  <span class="hljs-string">b13\ExampleExt\Commands\AwesomeCommand</span><br></br>    <span class="hljs-attr">tags:</span><br></br>    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">'console.command'</span><br></br>      <span class="hljs-attr">command:</span> <span class="hljs-string">'b13:awesome-things-to-do'</span><br></br>      <span class="hljs-attr">schedulable:</span> <span class="hljs-literal">false</span><br></br>
```

  Deprecation: #89139—Console Commands configuration format Commands.php
 <https://docs.typo3.org/c/typo3/cms-core/master/en-us/Changelog/10.3/Deprecation-89139-ConsoleCommandsConfigurationFormatCommandsPhp.html>

  ###  Find out everything that’s changed

As you might expect, there’s a whole host of changes in TYPO3 v10. You can see the full list on [the official website](https://docs.typo3.org/c/typo3/cms-core/master/en-us/Changelog-10.html). But don’t get overwhelmed! You can scan your existing code for breaks and deprecations with the [extension scanner](https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/ExtensionScanner/Index.html) in the TYPO3 backend Maintenance Area, or with the [t3scanner CLI tool](https://github.com/Tuurlijk/typo3scan).

  For a comprehensive overview of what work is required to update your website, get in touch for an upgrade quote or a 2nd Opinion. We’d love to get you onto the most modern TYPO3 version and help you leverage all the benefits of a state-of-the-art CMS.

 [ Get in touch for a quote ](https://b13.com/lets-connect)

  ###  Written by:

 ![Bild von Michael Semle](https://b13.com/fileadmin/_processed_/c/c/csm_michi_e67f356106.webp)

Michael is our friendly neighborhood secret weapon, who knows all our client projects. His tech skill set is impressive, like a Swiss army knife, yet somehow his greatest skill is learning new skills. His essential tool: Spotify

 Michael Semle  Development

 [ more from Michael Semle ](https://b13.com/team/michael-semle)

  Related Articles
------------------

- ![Cartoon trophy character surrounded by hands giving thumbs up and a heart gesture, set against a gear-patterned background.](https://b13.com/fileadmin/_processed_/f/7/csm_T3ppy_Design_Kit_Headerbild_b51eb9dc31.webp)

    ###  T3ppy Gives TYPO3 a Friendly Face

     06 August 2026 | Florian “Flix” Keitgen

     TYPO3 is powerful—but it doesn’t have to feel impersonal. Meet T3ppy, our friendly companion for the backend.

     [ Read more: T3ppy Gives TYPO3 a Friendly Face ](https://b13.com/knowledge/t3ppy-design-kit)
- ![Gavel labeled "AI" on a circuit-patterned background with yellow stars, symbolizing regulation or legislation related to artificial intelligence in the EU.](https://b13.com/fileadmin/_processed_/1/0/csm_EUAIAct_Headerbild_510724b3de.webp)

    ###  AI Content in TYPO3: Labelling Needs Accountability

     02 August 2026 | Benni Mack

     The EU AI Act brings the origins of AI-generated content into focus. AI Label marks AI-generated and AI-edited content in TYPO3 and records who signed off the published version—for…

     [ Read more: AI Content in TYPO3: Labelling Needs Accountability ](https://b13.com/knowledge/ai-content-in-typo3-labelling-needs-accountability)
- ![A series of stylized figures in various poses, each with a distinctive orange hat, depict a progression from walking to standing still while looking at a phone, set against a purple grid background.](https://b13.com/fileadmin/_processed_/d/7/csm_QueuesDDEV_Headerbild_f640931350.webp)

    ###  Better scalability with decoupled queues: How to set up RabbitMQ with TYPO3

     10 April 2024 | Jochen Roth

     When built-in message transports hit their limits, RabbitMQ can provide TYPO3 with a scalable, robust message queue.

     [ Read more: Better scalability with decoupled queues: How to set up RabbitMQ with TYPO3 ](https://b13.com/knowledge/better-scalability-with-decoupled-queues-how-to-set-up-rabbitmq-with-typo3)
- ![A cartoon character resembling a shield gives a thumbs up in front of a computer interface with various menu options.](https://b13.com/fileadmin/_processed_/e/6/csm_Header_cda1f80173.webp)

    ###  Meet T3ppy: A New Era for Editorial Work in TYPO3

     01 April 2026 | Florian “Flix” Keitgen

     T3ppy and the AiM extension bring AI directly into the TYPO3 backend—enhancing SEO, content quality, and workflows with centralized control.

     [ Read more: Meet T3ppy: A New Era for Editorial Work in TYPO3 ](https://b13.com/knowledge/meet-t3ppy-a-new-era-for-editorial-work-in-typo3)
- ![Retro microphone illustration with a shopping cart icon in the background, symbolizing e-commerce or online shopping.](https://b13.com/fileadmin/_processed_/f/8/csm_Marketplace_Headerbild_ee1575614c.webp)

    ###  Why TYPO3 Needs a Marketplace for Products

     25 March 2026 | Florian “Flix” Keitgen

     A marketplace would make TYPO3 products more discoverable, easier to compare, and benefit both agencies and clients alike.

     [ Read more: Why TYPO3 Needs a Marketplace for Products ](https://b13.com/knowledge/why-typo3-needs-a-marketplace-for-products)
- ![A hand holding a magnifying glass over a laptop screen displaying a webpage with an image and text elements.](https://b13.com/fileadmin/_processed_/e/5/csm_BackendUserSection_Headerbild_6093c842fd.webp)

    ###  Unlocking TYPO3’s Hidden Gem: The Backend User Section (Doktype 6)

     05 March 2026 | David Steeb

     Discover TYPO3’s underrated doktype 6 (Backend User Section) for secure internal previews, editor training, and prototyping. Learn real use cases, common pitfalls like 403 errors…

     [ Read more: Unlocking TYPO3’s Hidden Gem: The Backend User Section (Doktype 6) ](https://b13.com/knowledge/backend-user-section-in-typo3-uses-pitfalls-helper)
- ![Two stylized web page designs featuring a user profile, image placeholders, and text sections, set against a light blue background.](https://b13.com/fileadmin/_processed_/2/0/csm_BackendPreview_Headerbild_b4c5799cfa.webp)

    ###  Backend Previews With a System—Why We Built EXT:backendpreviews

     09 February 2026 | David Steeb

     EXT:backendpreviews brings structure and consistency to content previews in the TYPO3 backend using Fluid templates, layouts, and partials.

     [ Read more: Backend Previews With a System—Why We Built EXT:backendpreviews ](https://b13.com/knowledge/backend-previews-with-a-system-why-we-built-extbackendpreviews)
- ![A human hand shakes a robotic hand against a purple background with heart patterns, symbolizing collaboration between humans and technology.](https://b13.com/fileadmin/_processed_/6/2/csm_AIbotsLoveMarkdown_Headerbild_72fe5820d6.webp)

    ###  The Internet Is No Longer Just for Humans—AI Bots Love Markdown

     28 January 2026 | Benni Mack

     Discover why most web traffic is now automated and how TYPO3’s structured content model prepares websites for humans, editors, and AI systems.

     [ Read more: The Internet Is No Longer Just for Humans—AI Bots Love Markdown ](https://b13.com/knowledge/the-internet-is-no-longer-just-for-humans-ai-bots-love-markdown)
- ![Several colorful web page mockups stacked together, showcasing different layouts and design elements against a purple background.](https://b13.com/fileadmin/_processed_/e/3/csm_CaminoTheme_Headerbild_d082598009.webp)

    ###  Camino—The Need for a Default Theme in TYPO3 Is Real

     27 January 2026 | Benni Mack

     With TYPO3 v14, Camino introduces a default theme that removes friction from first installs. Why this matters—and how TYPO3 laid the groundwork.

     [ Read more: Camino—The Need for a Default Theme in TYPO3 Is Real ](https://b13.com/core-insights/blog/camino-the-need-for-a-default-theme-in-typo3-is-real)
- ![Graphic featuring stylized representations of a tower with the text "T3CON25 Düsseldorf" prominently displayed in the center.](https://b13.com/fileadmin/_processed_/7/b/csm_T3CON2025_Headerbild_fc9c5cc53e.webp)

    ###  T3CON25—One Step Closer to the Future of Content Management

     10 December 2025 | Franzi Töpler

     T3CON25 showcased the future of TYPO3 with insights on TYPO3 v14, AI, digital sovereignty, and open-source solutions driving secure, modern web experiences.

     [ Read more: T3CON25—One Step Closer to the Future of Content Management ](https://b13.com/knowledge/shaping-the-future-of-content-management-t3con25)