---
title: "Migration from subtypes to types"
manual: "TCA Reference"
version: "13.4"
permalink: "https://docs.typo3.org/permalink/t3tca:migration-subtype@13.4"
source: "Types/SubtypeMigration.rst"
modified: "2026-09-15T18:49:03+00:00"
---

# Migration from subtypes to types

**Table of contents**

-   [Migrate plugins with FlexForms added via subtypes_addlist](https://docs.typo3.org/permalink/t3tca:migrate-plugins-with-flexforms-added-via-subtypes-addlist@13.4)
-   [Migrate plugins with fields removed via subtypes_excludelist](https://docs.typo3.org/permalink/t3tca:migrate-plugins-with-fields-removed-via-subtypes-excludelist@13.4)
-   [Migrate custom tables using subtypes](https://docs.typo3.org/permalink/t3tca:migrate-custom-tables-using-subtypes@13.4)
-   [Migration: PreviewRenderer for subtypes](https://docs.typo3.org/permalink/t3tca:migration-previewrenderer-for-subtypes@13.4)

## Migrate plugins with FlexForms added via `subtypes_addlist`

If you used plugins with the now deprecated subtypes, you probably used
[subtypes_addlist](https://docs.typo3.org/permalink/t3tca:confval-types-subtypes-addlist@13.4) to display a
[FlexForm](https://docs.typo3.org/m/typo3/reference-coreapi/13.4/en-us/ApiOverview/FlexForms/Index.html#flexforms) for configuration purposes.

Migrate by adding the field `pi_flexform` with the utility method
`ExtensionManagementUtility`
`addToAllTCAtypes()` instead. You also have to change the parameters used for
method `addPiFlexFormValue()`:

**EXT:my_extension/Configuration/Overrides/tt_content.php**

```diff
 $pluginSignature = ExtensionUtility::registerPlugin(
     'blog_example',
     'Pi1',
     'A Blog Example',
 );
-$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist'][$pluginSignature]
-    = 'pi_flexform';

+ExtensionManagementUtility::addToAllTCAtypes(
+    'tt_content',
+    '--div--;Configuration,pi_flexform,pages,recursive,',
+    $pluginSignature,
+    'after:subheader',
+);
 ExtensionManagementUtility::addPiFlexFormValue(
-    $pluginSignature,
+    '*',
     'FILE:EXT:blog_example/Configuration/FlexForms/PluginSettings.xml',
+    $pluginSignature,
 );

```

The fields `pages` and `recursive` used to be added
automatically to plugins when using the now outdated subtype "list_type".
Therefore they have to be added manually when doing the migration.

## Migrate plugins with fields removed via `subtypes_excludelist`

Many extension author used the now deprecated option
[subtypes_excludelist](https://docs.typo3.org/permalink/t3tca:confval-types-subtypes-excludelist@13.4) to hide these automatically added fields.

The same effect can now be used by simply not adding the fields in the first
place:

**EXT:my_extension/Configuration/Overrides/tt_content.php**

```diff
 $pluginSignature = ExtensionUtility::registerPlugin(
     'blog_example',
     'Pi1',
     'A Blog Example',
 );
-$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_excludelist'][$pluginSignature]
-    = 'pages,recursive';

```

If any other fields have been removed with this method you can only remove
them by overriding
[$GLOBALS\['TCA'\]\['tt_content'\]\['types'\]\[$pluginSignature\]\['showitem'\]](https://docs.typo3.org/permalink/t3tca:confval-types-showitem@13.4)
or via page TSconfig.

## Migrate custom tables using subtypes

Replace any [subtype_value_field](https://docs.typo3.org/permalink/t3tca:confval-types-subtype-value-field@13.4) configuration with dedicated record
types. Please also consider migrating corresponding [subtypes_addlist](https://docs.typo3.org/permalink/t3tca:confval-types-subtypes-addlist@13.4)
and [subtypes_excludelist](https://docs.typo3.org/permalink/t3tca:confval-types-subtypes-excludelist@13.4) definitions accordingly.

**EXT:my_extension/Configuration/TCA/tx_myextension_mytable.php**

```diff
 $pluginSignature = ExtensionUtility::registerPlugin(
     'blog_example',
     'Pi1',
     'A Blog Example',
 );
-$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_excludelist'][$pluginSignature]
-    = 'pages,recursive';

```

## Migration: PreviewRenderer for subtypes

When migrating a plugin with a PreviewRenderer from `list_type` registration to
its own `CType` change the PreviewRenderer configuration to the record type as
well:

**EXT:my_extension/Configuration/Overrides/tt_content.php**

```diff
 $pluginSignature = ExtensionUtility::registerPlugin(
     'blog_example',
     'Pi1',
     'A Blog Example',
 );
-$GLOBALS['TCA']['tt_content']['types']['list_type']['previewRenderer'][$pluginSignature]
-        = \MyVendor\MyExtension\Preview\PreviewRenderer::class;
+$GLOBALS['TCA']['tt_content']['types'][$pluginSignature]['previewRenderer']
+        = \MyVendor\MyExtension\Preview\PreviewRenderer::class;

```
