diff --git a/src/Umbraco.Core/Cache/CacheProviderBase.cs b/src/Umbraco.Core/Cache/CacheProviderBase.cs
deleted file mode 100644
index 012d8b23b2..0000000000
--- a/src/Umbraco.Core/Cache/CacheProviderBase.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using System;
-using System.Collections.Generic;
-
-namespace Umbraco.Core.Cache
-{
- ///
- /// An abstract class for implementing a basic cache provider
- ///
- ///
- /// THIS MUST REMAIN INTERNAL UNTIL WE STREAMLINE HOW ALL CACHE IS HANDLED, WE NEED TO SUPPORT HTTP RUNTIME CACHE, IN MEMORY CACHE, ETC...
- ///
- internal abstract class CacheProviderBase
- {
- public abstract void ClearAllCache();
- public abstract void ClearCacheItem(string key);
- public abstract void ClearCacheObjectTypes(string typeName);
- public abstract void ClearCacheObjectTypes();
- public abstract void ClearCacheObjectTypes(Func predicate);
- public abstract void ClearCacheByKeySearch(string keyStartsWith);
- public abstract void ClearCacheByKeyExpression(string regexString);
- public abstract IEnumerable GetCacheItemsByKeySearch(string keyStartsWith);
- public abstract T GetCacheItem(string cacheKey);
- public abstract T GetCacheItem(string cacheKey, Func getCacheItem);
- }
-}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Cache/DictionaryCacheProdiverBase.cs b/src/Umbraco.Core/Cache/DictionaryCacheProdiverBase.cs
new file mode 100644
index 0000000000..adc02f9104
--- /dev/null
+++ b/src/Umbraco.Core/Cache/DictionaryCacheProdiverBase.cs
@@ -0,0 +1,178 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text.RegularExpressions;
+
+namespace Umbraco.Core.Cache
+{
+ internal abstract class DictionaryCacheProdiverBase : ICacheProvider
+ {
+ private static readonly object Locker = new object();
+ protected abstract DictionaryCacheWrapper DictionaryCache { get; }
+
+ ///
+ /// Clears everything in umbraco's runtime cache
+ ///
+ ///
+ /// Does not clear other stuff the user has put in httpruntime.cache!
+ ///
+ public virtual void ClearAllCache()
+ {
+ lock (Locker)
+ {
+ var keysToRemove = DictionaryCache.Cast