diff --git a/Directory.Packages.props b/Directory.Packages.props
index 7ac65610e9..de21c2431b 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -19,6 +19,7 @@
+
diff --git a/src/Umbraco.Core/Cache/DataTypeConfigurationCache.cs b/src/Umbraco.Core/Cache/DataTypeConfigurationCache.cs
new file mode 100644
index 0000000000..78ee17d2f8
--- /dev/null
+++ b/src/Umbraco.Core/Cache/DataTypeConfigurationCache.cs
@@ -0,0 +1,51 @@
+using Microsoft.Extensions.Caching.Memory;
+using Umbraco.Cms.Core.Models;
+using Umbraco.Cms.Core.Services;
+using Umbraco.Extensions;
+
+namespace Umbraco.Cms.Core.Cache;
+
+///
+/// This cache is a temporary measure to reduce the amount of computational power required to deserialize and initialize when fetched from the main cache/database,
+/// because datatypes are fetched multiple times troughout a (backoffice content) request with a lot of content (or nested content) and each of these fetches initializes certain fields on the datatypes.
+///
+internal sealed class DataTypeConfigurationCache : IDataTypeConfigurationCache
+{
+ private readonly IDataTypeService _dataTypeService;
+ private readonly IMemoryCache _memoryCache;
+
+ public DataTypeConfigurationCache(IDataTypeService dataTypeService, IMemoryCache memoryCache, IIdKeyMap idKeyMap)
+ {
+ _dataTypeService = dataTypeService;
+ _memoryCache = memoryCache;
+ }
+
+ public T? GetConfigurationAs(Guid key)
+ where T : class
+ {
+ var cacheKey = GetCacheKey(key);
+ if (_memoryCache.TryGetValue(cacheKey, out T? configuration) is false)
+ {
+ IDataType? dataType = _dataTypeService.GetDataType(key);
+ configuration = dataType?.ConfigurationAs();
+
+ // Only cache if data type was found (but still cache null configurations)
+ if (dataType is not null)
+ {
+ _memoryCache.Set(cacheKey, configuration);
+ }
+ }
+
+ return configuration;
+ }
+
+ public void ClearCache(IEnumerable keys)
+ {
+ foreach (Guid key in keys)
+ {
+ _memoryCache.Remove(GetCacheKey(key));
+ }
+ }
+
+ private static string GetCacheKey(Guid key) => $"DataTypeConfigurationCache_{key}";
+}
diff --git a/src/Umbraco.Core/Cache/DataTypeConfigurationCacheRefresher.cs b/src/Umbraco.Core/Cache/DataTypeConfigurationCacheRefresher.cs
new file mode 100644
index 0000000000..071acc795f
--- /dev/null
+++ b/src/Umbraco.Core/Cache/DataTypeConfigurationCacheRefresher.cs
@@ -0,0 +1,15 @@
+using Umbraco.Cms.Core.Events;
+using Umbraco.Cms.Core.Notifications;
+
+namespace Umbraco.Cms.Core.Cache;
+
+internal sealed class DataTypeConfigurationCacheRefresher : INotificationHandler
+{
+ private readonly IDataTypeConfigurationCache _dataTypeConfigurationCache;
+
+ public DataTypeConfigurationCacheRefresher(IDataTypeConfigurationCache dataTypeConfigurationCache)
+ => _dataTypeConfigurationCache = dataTypeConfigurationCache;
+
+ public void Handle(DataTypeCacheRefresherNotification notification)
+ => _dataTypeConfigurationCache.ClearCache(((DataTypeCacheRefresher.JsonPayload[])notification.MessageObject).Select(x => x.Key));
+}
diff --git a/src/Umbraco.Core/Cache/IDataTypeConfigurationCache.cs b/src/Umbraco.Core/Cache/IDataTypeConfigurationCache.cs
new file mode 100644
index 0000000000..7bb7821fc4
--- /dev/null
+++ b/src/Umbraco.Core/Cache/IDataTypeConfigurationCache.cs
@@ -0,0 +1,33 @@
+namespace Umbraco.Cms.Core.Cache;
+
+///
+/// Represents a cache for configuration.
+///
+public interface IDataTypeConfigurationCache
+{
+ ///
+ /// Gets the data type configuration.
+ ///
+ /// The data type key.
+ ///
+ /// The data type configuration.
+ ///
+ object? GetConfiguration(Guid key) => GetConfigurationAs