You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by se...@apache.org on 2019/04/08 20:25:41 UTC

[directory-server] 01/01: Replace ehcache with caffeine

This is an automated email from the ASF dual-hosted git repository.

seelmann pushed a commit to branch caffeine
in repository https://gitbox.apache.org/repos/asf/directory-server.git

commit f9c25f9c082007364d3a73475b192ee661425ea8
Author: Stefan Seelmann <ma...@stefan-seelmann.de>
AuthorDate: Mon Apr 8 19:05:02 2019 +0200

    Replace ehcache with caffeine
---
 .../server/core/factory/DSAnnotationProcessor.java |   3 -
 .../factory/DefaultDirectoryServiceFactory.java    |   6 -
 core-api/pom.xml                                   |  18 +-
 .../directory/server/core/api/CacheService.java    | 219 -----------------
 .../server/core/api/DirectoryService.java          |  14 --
 .../core/api/partition/AbstractPartition.java      |  14 --
 .../server/core/api/partition/Partition.java       |   8 -
 .../server/core/api/schema/SchemaPartition.java    |   9 -
 .../src/main/resources/directory-cacheservice.xml  | 268 ---------------------
 .../server/core/api/MockDirectoryService.java      |  15 --
 core-shared/pom.xml                                |   7 +-
 .../server/core/shared/DefaultDnFactory.java       |  14 +-
 .../shared/partition/DefaultPartitionNexus.java    |   1 -
 .../server/core/DefaultDirectoryService.java       |  38 +--
 interceptors/authz/pom.xml                         |   5 -
 .../directory/server/core/authz/GroupCache.java    |  55 ++---
 interceptors/subtree/pom.xml                       |   7 +-
 .../server/core/subtree/SubtreeEvaluatorTest.java  |  13 +-
 jdbm-partition/pom.xml                             |   2 +-
 .../partition/impl/btree/jdbm/JdbmPartition.java   |  26 +-
 .../partition/impl/btree/jdbm/JdbmStoreTest.java   |   9 +-
 .../core/partition/tree/PartitionTreeTest.java     |   6 +-
 kerberos-codec/pom.xml                             |   6 +-
 .../kerberos/shared/replay/ReplayCacheImpl.java    |  38 +--
 .../shared/replay/ReplayCacheImplTest.java         | 100 ++++----
 .../core/partition/ldif/LdifPartitionTest.java     |   8 +-
 ...SingleFileLdifPartitionSingeValueAttribute.java |   9 +-
 .../ldif/SingleFileLdifPartitionTest.java          |   9 +-
 mavibot-partition/pom.xml                          |   2 +-
 .../impl/btree/mavibot/MavibotPartition.java       |  19 +-
 .../impl/btree/mavibot/MavibotStoreTest.java       |   9 +-
 .../osgi/integ/ServerCoreAnnotationsOsgiTest.java  |   1 +
 .../server/osgi/integ/ServerCoreApiOsgiTest.java   |   2 -
 .../osgi/integ/ServerCoreSharedOsgiTest.java       |   9 +-
 .../osgi/integ/ServerJdbmPartitionOsgiTest.java    |   2 +-
 .../osgi/integ/ServerMavibotPartitionOsgiTest.java |   2 +-
 pom.xml                                            |  19 +-
 .../server/changepw/ChangePasswordServer.java      |   2 -
 protocol-kerberos/pom.xml                          |   6 +-
 .../kerberos/changepwd/ChangePasswordServer.java   |   5 +-
 .../directory/server/kerberos/kdc/KdcServer.java   |   5 +-
 .../server/config/ConfigPartitionInitializer.java  |   7 +-
 .../config/ChangePasswordConfigReaderTest.java     |   8 +-
 .../server/config/ConfigPartitionReaderTest.java   |   8 +-
 .../directory/server/config/ConfigWriterTest.java  |   8 +-
 .../server/config/HttpServerConfigReaderTest.java  |   8 +-
 .../config/KerberosServerConfigReaderTest.java     |   8 +-
 .../server/config/LdapServerConfigReaderTest.java  |   8 +-
 .../server/replication/ClientInitialRefreshIT.java |   2 +-
 .../apache/directory/server/ApacheDsService.java   |  36 +--
 xdbm-partition/pom.xml                             |   3 +-
 .../impl/btree/AbstractBTreePartition.java         |  49 ++--
 .../org/apache/directory/server/xdbm/Store.java    |   4 +-
 .../search/evaluator/SubtreeScopeEvaluator.java    |   2 +-
 .../xdbm/search/impl/DefaultSearchEngine.java      |   2 +-
 .../directory/server/xdbm/PartitionTest.java       |   6 -
 .../server/xdbm/impl/avl/AvlPartitionTest.java     |   8 +-
 .../server/xdbm/search/impl/AndCursorTest.java     |   6 -
 .../server/xdbm/search/impl/EqualityTest.java      |   8 +-
 .../xdbm/search/impl/GreaterEqNotIndexedTest.java  |   8 +-
 .../server/xdbm/search/impl/GreaterEqTest.java     |   9 +-
 .../server/xdbm/search/impl/LessEqTest.java        |   9 +-
 .../server/xdbm/search/impl/NestedFilterTest.java  |   5 -
 .../server/xdbm/search/impl/NotCursorTest.java     |   5 -
 .../server/xdbm/search/impl/OrCursorTest.java      |   5 -
 .../server/xdbm/search/impl/PresenceTest.java      |  12 +-
 .../server/xdbm/search/impl/SubstringTest.java     |   9 +-
 67 files changed, 219 insertions(+), 1034 deletions(-)

diff --git a/core-annotations/src/main/java/org/apache/directory/server/core/factory/DSAnnotationProcessor.java b/core-annotations/src/main/java/org/apache/directory/server/core/factory/DSAnnotationProcessor.java
index 275ac30..7d22462 100644
--- a/core-annotations/src/main/java/org/apache/directory/server/core/factory/DSAnnotationProcessor.java
+++ b/core-annotations/src/main/java/org/apache/directory/server/core/factory/DSAnnotationProcessor.java
@@ -235,8 +235,6 @@ public final class DSAnnotationProcessor
                     createPartition.cacheSize(),
                     new File( service.getInstanceLayout().getPartitionsDirectory(), createPartition.name() ) );
 
-                partition.setCacheService( service.getCacheService() );
-
                 CreateIndex[] indexes = createPartition.indexes();
 
                 for ( CreateIndex createIndex : indexes )
@@ -261,7 +259,6 @@ public final class DSAnnotationProcessor
                 if ( partition instanceof AbstractBTreePartition )
                 {
                     AbstractBTreePartition btreePartition = ( AbstractBTreePartition ) partition;
-                    btreePartition.setCacheService( service.getCacheService() );
                     btreePartition.setCacheSize( createPartition.cacheSize() );
                     btreePartition.setPartitionPath( new File( service
                         .getInstanceLayout().getPartitionsDirectory(),
diff --git a/core-annotations/src/main/java/org/apache/directory/server/core/factory/DefaultDirectoryServiceFactory.java b/core-annotations/src/main/java/org/apache/directory/server/core/factory/DefaultDirectoryServiceFactory.java
index 8898416..57347e9 100644
--- a/core-annotations/src/main/java/org/apache/directory/server/core/factory/DefaultDirectoryServiceFactory.java
+++ b/core-annotations/src/main/java/org/apache/directory/server/core/factory/DefaultDirectoryServiceFactory.java
@@ -37,7 +37,6 @@ import org.apache.directory.api.util.FileUtils;
 import org.apache.directory.api.util.exception.Exceptions;
 import org.apache.directory.server.constants.ServerDNConstants;
 import org.apache.directory.server.core.DefaultDirectoryService;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.DirectoryService;
 import org.apache.directory.server.core.api.InstanceLayout;
 import org.apache.directory.server.core.api.partition.Partition;
@@ -247,11 +246,6 @@ public class DefaultDirectoryServiceFactory implements DirectoryServiceFactory
         directoryService.setInstanceId( name );
         buildInstanceDirectory( name );
 
-        CacheService cacheService = new CacheService();
-        cacheService.initialize( directoryService.getInstanceLayout(), name );
-
-        directoryService.setCacheService( cacheService );
-
         // Init the service now
         initSchema();
         initSystemPartition();
diff --git a/core-api/pom.xml b/core-api/pom.xml
index 8fe0cdd..f42c4b0 100644
--- a/core-api/pom.xml
+++ b/core-api/pom.xml
@@ -101,15 +101,15 @@
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-lang3</artifactId>
     </dependency>
-  
+
     <dependency>
       <groupId>org.apache.mina</groupId>
       <artifactId>mina-core</artifactId>
     </dependency>
-    
+
     <dependency>
-      <groupId>org.ehcache</groupId>
-      <artifactId>ehcache</artifactId>
+      <groupId>com.github.ben-manes.caffeine</groupId>
+      <artifactId>caffeine</artifactId>
     </dependency>
   </dependencies>
 
@@ -156,12 +156,6 @@
           <instructions>
             <Bundle-SymbolicName>${project.groupId}.core.api</Bundle-SymbolicName>
             <Export-Package>
-                org.ehcache;version=${ehcache.version},
-                org.ehcache.config;version=${ehcache.version},
-                org.ehcache.config.builders;version=${ehcache.version},
-                org.ehcache.xml;version=${ehcache.version},
-                org.ehcache.xml.model;version=${ehcache.version},
-                org.ehcache.xml.exceptions;version=${ehcache.version},
                 org.apache.directory.server.core.api;version=${project.version},
                 org.apache.directory.server.core.api.administrative;version=${project.version},
                 org.apache.directory.server.core.api.authn.ppolicy;version=${project.version},
@@ -180,10 +174,8 @@
                 org.apache.directory.server.core.api.sp.java;version=${project.version},
                 org.apache.directory.server.core.api.subtree;version=${project.version}
             </Export-Package>
-            <Require-Bundle>
-                org.ehcache.ehcache;bundle-version=${ehcache.version}
-            </Require-Bundle>
             <Import-Package>
+                com.github.benmanes.caffeine.cache;bundle-version=${caffeine.version},
                 org.apache.commons.lang3;version=${commons.lang.version},
                 org.apache.directory.api.asn1.util;version=${org.apache.directory.api.version},
                 org.apache.directory.api.i18n;version=${org.apache.directory.api.version},
diff --git a/core-api/src/main/java/org/apache/directory/server/core/api/CacheService.java b/core-api/src/main/java/org/apache/directory/server/core/api/CacheService.java
deleted file mode 100644
index 46d653e..0000000
--- a/core-api/src/main/java/org/apache/directory/server/core/api/CacheService.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- *   Licensed to the Apache Software Foundation (ASF) under one
- *   or more contributor license agreements.  See the NOTICE file
- *   distributed with this work for additional information
- *   regarding copyright ownership.  The ASF licenses this file
- *   to you under the Apache License, Version 2.0 (the
- *   "License"); you may not use this file except in compliance
- *   with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *   Unless required by applicable law or agreed to in writing,
- *   software distributed under the License is distributed on an
- *   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *   KIND, either express or implied.  See the License for the
- *   specific language governing permissions and limitations
- *   under the License.
- *
- */
-
-package org.apache.directory.server.core.api;
-
-
-import java.io.File;
-import java.net.MalformedURLException;
-import java.util.Iterator;
-
-import org.ehcache.Cache;
-import org.ehcache.Cache.Entry;
-import org.ehcache.CacheManager;
-import org.ehcache.Status;
-import org.ehcache.config.builders.CacheManagerBuilder;
-import org.ehcache.xml.XmlConfiguration;
-import org.ehcache.xml.exceptions.XmlConfigurationException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-
-/**
- * A ehcache based cache service to be used for various caching requirement in the server. 
- * 
- * If a cache config file with the name {@link #DIRECTORY_CACHESERVICE_XML} is present in
- * the "workdirectory" of the DirectoryService then that file will be used for configuring 
- * the {@link CacheManager}, if not a default cache configuration file bundled along with 
- * this class is used
- *
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- */
-public class CacheService
-{
-    /** The cache configuration file */
-    private static final String DIRECTORY_CACHESERVICE_XML = "directory-cacheservice.xml";
-
-    /** The associated logger */
-    private static final Logger LOG = LoggerFactory.getLogger( CacheService.class );
-
-    /** the ehcache cache manager */
-    private CacheManager cacheManager = null;
-
-    /**
-     * Utility method to dump the cache contents to a StringBuffer.
-     * This is needed because ehcache 3.x Cache objects only implements Iterable
-     * 
-     * @return a StringBuffer
-     */
-    public static final StringBuffer dumpCacheContentsToString( Cache< ?, ? > cache ) 
-    {
-        Iterator<?> it = cache.iterator();
-        StringBuffer sb = new StringBuffer();
-        
-        while ( it.hasNext() )
-        {
-            Cache.Entry< ?, ? > nextObj = ( Entry<?, ?> ) it.next();
-            sb.append( '\t' )
-            .append( nextObj.getKey().toString() )
-            .append( " -> " )
-            .append( nextObj.getValue().toString() )
-            .append( '\n' );
-        }
-        
-        return sb;
-    }
-
-    /**
-     * Creates a new instance of CacheService.
-     */
-    public CacheService()
-    {
-    }
-
-
-    /**
-     * Creates a new instance of CacheService with the given cache manager.
-     *
-     * @param cachemanager The provided CaxcheManager instance
-     */
-    public CacheService( CacheManager cachemanager )
-    {
-        this.cacheManager = cachemanager;
-    }
-
-
-    /**
-     * Initialize the CacheService
-     *
-     * @param layout The place on disk where the cache configuration will be stored
-     */
-    public void initialize( InstanceLayout layout )
-    {
-        initialize( layout, null );
-    }
-
-
-    /**
-     * Initialize the CacheService
-     *
-     * @param layout The place on disk where the cache configuration will be stored
-     * @param instanceId The Instance identifier
-     */
-    public void initialize( InstanceLayout layout, String instanceId )
-    {
-        LOG.debug( "CacheService initialization, for instance {}", instanceId );
-
-        if ( ( cacheManager != null ) && ( cacheManager.getStatus() == Status.AVAILABLE ) )
-        {
-            LOG.warn( "cache service was already initialized and is available" );
-
-            return;
-        }
-
-        XmlConfiguration cc = null;
-
-        if ( layout != null )
-        {
-            File configFile = new File( layout.getConfDirectory(), DIRECTORY_CACHESERVICE_XML );
-
-            if ( !configFile.exists() )
-            {
-                LOG.info( "no custom cache configuration was set, loading the default cache configuration" );
-                cc = new XmlConfiguration( getClass().getClassLoader().getResource(
-                    DIRECTORY_CACHESERVICE_XML ), getClass().getClassLoader() );
-            }
-            else
-            {
-                LOG.info( "loading cache configuration from the file {}", configFile );
-                
-                try
-                {
-                    cc = new XmlConfiguration( configFile.toURI().toURL(), getClass().getClassLoader() );
-                }
-                catch ( XmlConfigurationException | MalformedURLException e ) 
-                {
-                    LOG.error( "exception loading cache configuration from the file {}: {}", configFile, e.toString() );
-                }
-            }
-        }
-        else
-        {
-            LOG.info( "no custom cache configuration was set, loading the default cache configuration" );
-            cc = new XmlConfiguration( getClass().getClassLoader().getResource(
-                DIRECTORY_CACHESERVICE_XML ), getClass().getClassLoader() );
-        }
-
-        cacheManager = CacheManagerBuilder.newCacheManager( cc );
-        cacheManager.init();
-    }
-
-
-    /**
-     * Clear the cache and shutdown it
-     */
-    public void destroy()
-    {
-        if ( cacheManager == null )
-        {
-            return;
-        }
-
-        LOG.info( "clearing all the caches" );
-
-        cacheManager.close();
-        cacheManager = null;
-    }
-
-
-    /**
-     * Get a specific cache from its name, or create a new one
-     *
-     * @param name The Cache name we want to retreive
-     * @return The found cache. If we don't find it, we create a new one.
-     */
-    public <K, V> Cache<K, V> getCache( String name, Class<K> keyClazz, Class<V> valueClazz )
-    {
-        if ( cacheManager == null )
-        {
-            LOG.error( "Cannot fetch the cache named {}, the CacheServcie is not initialized", name );
-            throw new IllegalStateException( "CacheService was not initialized" );
-        }
-
-        LOG.info( "fetching the cache named {}", name );
-
-        Cache<K, V> cache = cacheManager.getCache( name, keyClazz, valueClazz );
-        
-        return cache;
-    }
-
-
-    /**
-     * Remove a cache if it exists.
-     * 
-     * @param name The Cache's name we want to remove
-     */
-    public void remove( String name )
-    {
-        LOG.info( "Removing the cache named {}", name );
-        
-        cacheManager.removeCache( name );
-    }
-}
diff --git a/core-api/src/main/java/org/apache/directory/server/core/api/DirectoryService.java b/core-api/src/main/java/org/apache/directory/server/core/api/DirectoryService.java
index e7eafd9..a0b6d76 100644
--- a/core-api/src/main/java/org/apache/directory/server/core/api/DirectoryService.java
+++ b/core-api/src/main/java/org/apache/directory/server/core/api/DirectoryService.java
@@ -579,12 +579,6 @@ public interface DirectoryService extends ServerEntryFactory
 
 
     /**
-     * @return the cache service
-     */
-    CacheService getCacheService();
-
-
-    /**
      * @return The AccessControl AdministrativePoint cache
      */
     DnNode<AccessControlAdministrativePoint> getAccessControlAPCache();
@@ -631,14 +625,6 @@ public interface DirectoryService extends ServerEntryFactory
 
 
     /**
-     * Sets the CacheService
-     * 
-     * @param cacheService the cache service
-     */
-    void setCacheService( CacheService cacheService );
-
-
-    /**
      * Gets the {@link AttributeTypeProvider}.
      * 
      * @return the {@link AttributeTypeProvider}
diff --git a/core-api/src/main/java/org/apache/directory/server/core/api/partition/AbstractPartition.java b/core-api/src/main/java/org/apache/directory/server/core/api/partition/AbstractPartition.java
index b680510..d6f1aed 100644
--- a/core-api/src/main/java/org/apache/directory/server/core/api/partition/AbstractPartition.java
+++ b/core-api/src/main/java/org/apache/directory/server/core/api/partition/AbstractPartition.java
@@ -32,7 +32,6 @@ import org.apache.directory.api.ldap.model.exception.LdapOtherException;
 import org.apache.directory.api.ldap.model.name.Dn;
 import org.apache.directory.api.ldap.model.schema.SchemaManager;
 import org.apache.directory.api.util.Strings;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.DnFactory;
 import org.apache.directory.server.i18n.I18n;
 
@@ -64,9 +63,6 @@ public abstract class AbstractPartition implements Partition
     /** The root Dn for this partition */
     protected Dn suffixDn;
 
-    /** the cache service */
-    protected CacheService cacheService;
-
     /** the value of last successful add/update operation's CSN */
     private String contextCsn;
     
@@ -292,16 +288,6 @@ public abstract class AbstractPartition implements Partition
      * {@inheritDoc}
      */
     @Override
-    public void setCacheService( CacheService cacheService )
-    {
-        this.cacheService = cacheService;
-    }
-
-    
-    /**
-     * {@inheritDoc}
-     */
-    @Override
     public String getContextCsn( PartitionTxn partitionTxn )
     {
         return contextCsn;
diff --git a/core-api/src/main/java/org/apache/directory/server/core/api/partition/Partition.java b/core-api/src/main/java/org/apache/directory/server/core/api/partition/Partition.java
index bb3fccd..3f3164c 100644
--- a/core-api/src/main/java/org/apache/directory/server/core/api/partition/Partition.java
+++ b/core-api/src/main/java/org/apache/directory/server/core/api/partition/Partition.java
@@ -29,7 +29,6 @@ import org.apache.directory.api.ldap.model.exception.LdapException;
 import org.apache.directory.api.ldap.model.exception.LdapInvalidDnException;
 import org.apache.directory.api.ldap.model.name.Dn;
 import org.apache.directory.api.ldap.model.schema.SchemaManager;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.filtering.EntryFilteringCursor;
 import org.apache.directory.server.core.api.interceptor.context.AddOperationContext;
 import org.apache.directory.server.core.api.interceptor.context.DeleteOperationContext;
@@ -309,13 +308,6 @@ public interface Partition
     void dumpIndex( PartitionTxn partitionTxn, OutputStream stream, String name ) throws IOException;
 
 
-    /**
-     * Set the Cache service 
-     *
-     * @param cacheService The CacheService instance
-     */
-    void setCacheService( CacheService cacheService );
-
     
     /**
      * Get the contextCSN
diff --git a/core-api/src/main/java/org/apache/directory/server/core/api/schema/SchemaPartition.java b/core-api/src/main/java/org/apache/directory/server/core/api/schema/SchemaPartition.java
index a0cf514..4d127b4 100644
--- a/core-api/src/main/java/org/apache/directory/server/core/api/schema/SchemaPartition.java
+++ b/core-api/src/main/java/org/apache/directory/server/core/api/schema/SchemaPartition.java
@@ -44,7 +44,6 @@ import org.apache.directory.api.ldap.model.schema.SchemaManager;
 import org.apache.directory.api.ldap.model.schema.SchemaUtils;
 import org.apache.directory.api.util.DateUtils;
 import org.apache.directory.server.constants.ApacheSchemaConstants;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.CoreSession;
 import org.apache.directory.server.core.api.filtering.EntryFilteringCursor;
 import org.apache.directory.server.core.api.interceptor.context.AddOperationContext;
@@ -556,14 +555,6 @@ public final class SchemaPartition extends AbstractPartition
     }
 
 
-    @Override
-    public void setCacheService( CacheService cacheService )
-    {
-        super.setCacheService( cacheService );
-        wrapped.setCacheService( cacheService );
-    }
-
-
     /**
      * @see Object#toString()
      */
diff --git a/core-api/src/main/resources/directory-cacheservice.xml b/core-api/src/main/resources/directory-cacheservice.xml
deleted file mode 100644
index f173899..0000000
--- a/core-api/src/main/resources/directory-cacheservice.xml
+++ /dev/null
@@ -1,268 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-  http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<config xmlns="http://www.ehcache.org/v3"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.6.xsd">
-	
-	<!--
-		Cache configuration
-		===================
-		
-		The following attributes are required.
-		
-		name:
-			Sets the name of the cache. This is used to identify the cache. It must be unique.
-		
-		maxElementsInMemory:
-			Sets the maximum number of objects that will be created in memory
-		
-		maxElementsOnDisk:
-			Sets the maximum number of objects that will be maintained in the DiskStore
-			The default value is zero, meaning unlimited.
-		
-		eternal:
-			Sets whether elements are eternal. If eternal,  timeouts are ignored and the
-			element is never expired.
-		
-		overflowToDisk:
-			Sets whether elements can overflow to disk when the memory store
-			has reached the maxInMemory limit.
-		
-		The following attributes and elements are optional.
-		
-		timeToIdleSeconds:
-			Sets the time to idle for an element before it expires.
-			i.e. The maximum amount of time between accesses before an element expires
-			Is only used if the element is not eternal.
-			Optional attribute. A value of 0 means that an Element can idle for infinity.
-			The default value is 0.
-		
-		timeToLiveSeconds:
-			Sets the time to live for an element before it expires.
-			i.e. The maximum time between creation time and when an element expires.
-			Is only used if the element is not eternal.
-			Optional attribute. A value of 0 means that and Element can live for infinity.
-			The default value is 0.
-		
-		diskPersistent:
-			Whether the disk store persists between restarts of the Virtual Machine.
-			The default value is false.
-		
-		diskExpiryThreadIntervalSeconds:
-			The number of seconds between runs of the disk expiry thread. The default value
-			is 120 seconds.
-		
-		diskSpoolBufferSizeMB:
-			This is the size to allocate the DiskStore for a spool buffer. Writes are made
-			to this area and then asynchronously written to disk. The default size is 30MB.
-			Each spool buffer is used only by its cache. If you get OutOfMemory errors consider
-			lowering this value. To improve DiskStore performance consider increasing it. Trace level
-			logging in the DiskStore will show if put back ups are occurring.
-		
-		clearOnFlush:
-			whether the MemoryStore should be cleared when flush() is called on the cache.
-			By default, this is true i.e. the MemoryStore is cleared.
-		
-		memoryStoreEvictionPolicy:
-			Policy would be enforced upon reaching the maxElementsInMemory limit. Default
-			policy is Least Recently Used (specified as LRU). Other policies available -
-			First In First Out (specified as FIFO) and Less Frequently Used
-			(specified as LFU)
-	-->
-
-	<!-- Sample cache named sampleCache1 This cache contains a maximum in memory 
-		of 10000 elements, and will expire an element if it is idle for more than 
-		5 minutes and lives for more than 10 minutes. If there are more than 10000 
-		elements it will overflow to the disk cache, which in this configuration 
-		will go to wherever java.io.tmp is defined on your system. On a standard 
-		Linux system this will be /tmp" -->
-	<!-- 
-		Note: set the 'overflowToDisk' flag always to 'true'.
-		The groups information is only read once during startup hence 
-		we need to retain this info forever available in the cache
-		as long as the server is running, so hinting the cache to store
-		on disk is needed to swap the data if it is too much to hold in memory -->
-	<cache alias="groupCache">
-		<key-type>java.lang.String</key-type>
-		<value-type>java.util.Set</value-type>
-		<expiry>
-			<ttl unit="seconds">1200</ttl>
-		</expiry>
-		<heap>10000</heap>
-		<heap-store-settings>
-			<max-object-size>10000</max-object-size>
-		</heap-store-settings>
-
-		<!-- unmigrated 2.x settings		   
-			eternal="true" 
-			overflowToDisk="true"
-			diskSpoolBufferSizeMB="20"
-			memoryStoreEvictionPolicy="LFU"
-			diskPersistent="false" />
-		-->
-	</cache>
-
-	<cache alias="dnCache">
-		<key-type>java.lang.String</key-type>
-		<value-type>org.apache.directory.api.ldap.model.name.Dn</value-type>
-		<expiry>
-			<ttl unit="seconds">600</ttl>
-		</expiry>
-		<heap>10000</heap>
-		<heap-store-settings>
-			<max-object-size>10000</max-object-size>
-		</heap-store-settings>
-		<!-- unmigrated 2.x settings
-		   eternal="false" 
-		   overflowToDisk="false"
-		   diskSpoolBufferSizeMB="20"
-		   timeToIdleSeconds="300"
-		   timeToLiveSeconds="600"
-		   memoryStoreEvictionPolicy="LFU" 
-		   diskPersistent="false" /> 
-		-->
-	</cache>
-	
-
-	<!-- Kerberos replay cache
-		NOTE1: keep the maxElementsInMemory as low as possible to avoid wasting memory
-		Cause the elements present in the cache won't be removed dynamically even after their TTL
-		expires. For a good explanation see http://forums.terracotta.org/forums/posts/list/4126.page
-		
-		NOTE2: We don't use the standard eviction policies like LFU or LRU rather we use a custom eviction
-			policy based on the value of clockskew setting. The default value of clokcskew is 5 minutes,
-			which is also set for the TTL and TTI values of cache config
-			
-		So what we do here is enable the overflowToDisk flag and then let the disk store be cleaned
-		periodically based on diskExpiryThreadIntervalSeconds
-	-->
-	<cache alias="kdcReplayCache">
-		<key-type>java.lang.String</key-type>
-		<expiry>
-			<ttl unit="seconds">600</ttl>
-		</expiry>
-		<heap>100</heap>
-		<heap-store-settings>
-			<max-object-size>100</max-object-size>
-		</heap-store-settings>
-
-		<!-- unmigrated 2.x settings
-		   eternal="false" 
-		   overflowToDisk="true"
-		   diskSpoolBufferSizeMB="20"
-		   diskExpiryThreadIntervalSeconds="300"
-		   timeToLiveSeconds="300"
-		   timeToIdleSeconds="300"
-		   diskPersistent="false" />
-		-->
-	</cache>
-
-	<!-- ChangePassword replay cache, this has the same settings as the Kerberos replay cache -->
-	<cache alias="changePwdReplayCache">
-		<key-type>java.lang.String</key-type>
-		<expiry>
-			<ttl unit="seconds">600</ttl>
-		</expiry>
-		<heap>100</heap>
-		<heap-store-settings>
-			<max-object-size>100</max-object-size>
-		</heap-store-settings>
-
-		<!-- unmigrated 2.x settings
-		   eternal="false" 
-		   overflowToDisk="true"
-		   diskSpoolBufferSizeMB="20"
-		   diskExpiryThreadIntervalSeconds="300"
-		   timeToLiveSeconds="300"
-		   timeToIdleSeconds="300"
-		   diskPersistent="false" />
-		-->
-	</cache>
-
-	<!-- partition caches
-		the name format:
-		name="{partition-suffix}" for partition
-		name="{partition-suffix}:{index name/OID}" for each partition's index (currently only RDN index supports cache)
-	-->
-	<cache alias="ou=system">
-		<key-type>java.lang.String</key-type>
-		<expiry>
-			<ttl unit="seconds">600</ttl>
-		</expiry>
-		<heap>1000</heap>
-		<heap-store-settings>
-			<max-object-size>1000</max-object-size>
-		</heap-store-settings>
-		
-		<!-- unmigrated 2.x settings
-		   eternal="false" 
-		   overflowToDisk="true"
-		   diskSpoolBufferSizeMB="20"
-		   timeToIdleSeconds="300"
-		   timeToLiveSeconds="600"
-		   memoryStoreEvictionPolicy="LFU"
-		   diskPersistent="false"/>
-		-->
-	</cache>
-	
-	<cache alias="ou=system:apacheRdn">
-		<key-type>java.lang.String</key-type>
-		<expiry>
-			<ttl unit="seconds">600</ttl>
-		</expiry>
-		<heap>10000</heap>
-		<heap-store-settings>
-			<max-object-size>10000</max-object-size>
-		</heap-store-settings>
-		
-		<!-- unmigrated 2.x settings
-		   eternal="false" 
-		   overflowToDisk="false"
-		   timeToIdleSeconds="300"
-		   timeToLiveSeconds="600"
-		   memoryStoreEvictionPolicy="LFU"
-		   diskPersistent="false"/>
-		-->
-	</cache>
- 
-	<cache alias="alias">
-		<key-type>java.lang.String</key-type>
-		<value-type>org.apache.directory.api.ldap.model.name.Dn</value-type>
-		<expiry>
-			<ttl unit="seconds">1200</ttl>
-		</expiry>
-		<heap>1000</heap>
-		<heap-store-settings>
-			<max-object-size>1000</max-object-size>
-		</heap-store-settings>
-	</cache>
-
-	<cache alias="entryDn">
-		<key-type>java.lang.String</key-type>
-		<value-type>org.apache.directory.api.ldap.model.name.Dn</value-type>
-		<expiry>
-			<ttl unit="seconds">1200</ttl>
-		</expiry>
-		<heap>1000</heap>
-		<heap-store-settings>
-			<max-object-size>1000</max-object-size>
-		</heap-store-settings>
-	</cache>
-</config>
\ No newline at end of file
diff --git a/core-api/src/test/java/org/apache/directory/server/core/api/MockDirectoryService.java b/core-api/src/test/java/org/apache/directory/server/core/api/MockDirectoryService.java
index 12b41a3..65041ef 100644
--- a/core-api/src/test/java/org/apache/directory/server/core/api/MockDirectoryService.java
+++ b/core-api/src/test/java/org/apache/directory/server/core/api/MockDirectoryService.java
@@ -476,12 +476,6 @@ public class MockDirectoryService implements DirectoryService
     }
 
 
-    public CacheService getCacheService()
-    {
-        return null;
-    }
-
-
     /**
      * {@inheritDoc}
      */
@@ -614,15 +608,6 @@ public class MockDirectoryService implements DirectoryService
     }
 
 
-    /**
-     * {@inheritDoc}
-     */
-    public void setCacheService( CacheService cacheService )
-    {
-        // nothing
-    }
-
-
     @Override
     public AttributeTypeProvider getAtProvider()
     {
diff --git a/core-shared/pom.xml b/core-shared/pom.xml
index 7d1ca28..0c07a67 100644
--- a/core-shared/pom.xml
+++ b/core-shared/pom.xml
@@ -78,11 +78,6 @@
     </dependency>
     
     <dependency>
-      <groupId>org.ehcache</groupId>
-      <artifactId>ehcache</artifactId>
-    </dependency>
-
-    <dependency>
        <groupId>org.apache.directory.jdbm</groupId>
        <artifactId>apacheds-jdbm1</artifactId>
     </dependency>
@@ -147,7 +142,7 @@
                 jdbm.btree,
                 jdbm.helper,
                 jdbm.recman,
-                org.ehcache;version=${ehcache.version},
+                com.github.benmanes.caffeine.cache;bundle-version=${caffeine.version},
                 org.apache.directory.api.ldap.codec.api;version=${org.apache.directory.api.version},
                 org.apache.directory.api.ldap.extras.controls.syncrepl.syncDone;version=${org.apache.directory.api.version},
                 org.apache.directory.api.ldap.extras.controls.syncrepl.syncState;version=${org.apache.directory.api.version},
diff --git a/core-shared/src/main/java/org/apache/directory/server/core/shared/DefaultDnFactory.java b/core-shared/src/main/java/org/apache/directory/server/core/shared/DefaultDnFactory.java
index af896fd..4cffdf5 100644
--- a/core-shared/src/main/java/org/apache/directory/server/core/shared/DefaultDnFactory.java
+++ b/core-shared/src/main/java/org/apache/directory/server/core/shared/DefaultDnFactory.java
@@ -21,7 +21,7 @@
 package org.apache.directory.server.core.shared;
 
 
-import org.ehcache.Cache;
+import java.time.Duration;
 
 import org.apache.directory.api.ldap.model.exception.LdapInvalidDnException;
 import org.apache.directory.api.ldap.model.name.Dn;
@@ -30,6 +30,9 @@ import org.apache.directory.server.core.api.DnFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.github.benmanes.caffeine.cache.Cache;
+import com.github.benmanes.caffeine.cache.Caffeine;
+
 
 /**
  * The default Dn factory implementation.
@@ -58,12 +61,13 @@ public class DefaultDnFactory implements DnFactory
      * Instantiates a new default Dn factory.
      *
      * @param schemaManager The SchemaManager instance
-     * @param dnCache The cache used to store DNs
+     * @param cacheSize The cache size used to store DNs
      */
-    public DefaultDnFactory( SchemaManager schemaManager, Cache<String, Dn> dnCache )
+    public DefaultDnFactory( SchemaManager schemaManager, int cacheSize )
     {
         this.schemaManager = schemaManager;
-        this.dnCache = dnCache;
+        this.dnCache = Caffeine.newBuilder().maximumSize( cacheSize ).expireAfterAccess( Duration.ofMinutes( 10L ) )
+            .build();
     }
 
 
@@ -89,7 +93,7 @@ public class DefaultDnFactory implements DnFactory
         // for the reason for performing this check
         if ( dnCache != null )
         {
-            cachedDn = dnCache.get( dn );
+            cachedDn = dnCache.getIfPresent( dn );
         }
 
         if ( cachedDn == null )
diff --git a/core-shared/src/main/java/org/apache/directory/server/core/shared/partition/DefaultPartitionNexus.java b/core-shared/src/main/java/org/apache/directory/server/core/shared/partition/DefaultPartitionNexus.java
index 5466b0a..2503628 100644
--- a/core-shared/src/main/java/org/apache/directory/server/core/shared/partition/DefaultPartitionNexus.java
+++ b/core-shared/src/main/java/org/apache/directory/server/core/shared/partition/DefaultPartitionNexus.java
@@ -828,7 +828,6 @@ public class DefaultPartitionNexus extends AbstractPartition implements Partitio
 
         if ( !partition.isInitialized() )
         {
-            partition.setCacheService( directoryService.getCacheService() );
             partition.initialize();
         }
 
diff --git a/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java b/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java
index a8a965f..50a5edc 100644
--- a/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java
+++ b/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java
@@ -72,7 +72,6 @@ import org.apache.directory.server.constants.ApacheSchemaConstants;
 import org.apache.directory.server.constants.ServerDNConstants;
 import org.apache.directory.server.core.admin.AdministrativePointInterceptor;
 import org.apache.directory.server.core.api.AttributeTypeProvider;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.CoreSession;
 import org.apache.directory.server.core.api.DirectoryService;
 import org.apache.directory.server.core.api.DnFactory;
@@ -267,9 +266,6 @@ public class DefaultDirectoryService implements DirectoryService
 
     private static final String LOCK_FILE_NAME = ".dirservice.lock";
 
-    /** the ehcache based cache service */
-    private CacheService cacheService;
-
     /** The AccessControl AdministrativePoint cache */
     private DnNode<AccessControlAdministrativePoint> accessControlAPCache;
 
@@ -1306,9 +1302,6 @@ public class DefaultDirectoryService implements DirectoryService
         // --------------------------------------------------------------------
         // And shutdown the server
         // --------------------------------------------------------------------
-        LOG.debug( "--- Deleting the cache service" );
-        cacheService.destroy();
-
         LOG.debug( "---Deleting the DnCache" );
         dnFactory = null;
 
@@ -1947,14 +1940,6 @@ public class DefaultDirectoryService implements DirectoryService
             setDefaultInterceptorConfigurations();
         }
 
-        if ( cacheService == null )
-        {
-            // Initialize a default cache service
-            cacheService = new CacheService();
-        }
-
-        cacheService.initialize( instanceLayout, instanceId );
-
         // Initialize the AP caches
         accessControlAPCache = new DnNode<>();
         collectiveAttributeAPCache = new DnNode<>();
@@ -1963,15 +1948,12 @@ public class DefaultDirectoryService implements DirectoryService
 
         if ( dnFactory == null )
         {
-            dnFactory = new DefaultDnFactory( schemaManager, 
-                cacheService.getCache( "dnCache", String.class, Dn.class ) );
+            dnFactory = new DefaultDnFactory( schemaManager, 10000 );
         }
 
         // triggers partition to load schema fully from schema partition
-        schemaPartition.setCacheService( cacheService );
         schemaPartition.initialize();
         partitions.add( schemaPartition );
-        systemPartition.setCacheService( cacheService );
         
         if ( !systemPartition.getSuffixDn().isSchemaAware() )
         {
@@ -2368,15 +2350,6 @@ public class DefaultDirectoryService implements DirectoryService
     /**
      * {@inheritDoc}
      */
-    public CacheService getCacheService()
-    {
-        return cacheService;
-    }
-
-
-    /**
-     * {@inheritDoc}
-     */
     public DnNode<AccessControlAdministrativePoint> getAccessControlAPCache()
     {
         return accessControlAPCache;
@@ -2470,15 +2443,6 @@ public class DefaultDirectoryService implements DirectoryService
     /**
      * {@inheritDoc}
      */
-    public void setCacheService( CacheService cacheService )
-    {
-        this.cacheService = cacheService;
-    }
-
-
-    /**
-     * {@inheritDoc}
-     */
     @Override
     public AttributeTypeProvider getAtProvider()
     {
diff --git a/interceptors/authz/pom.xml b/interceptors/authz/pom.xml
index 48fd893..b0f0b8e 100644
--- a/interceptors/authz/pom.xml
+++ b/interceptors/authz/pom.xml
@@ -72,10 +72,6 @@
       <artifactId>api-ldap-schema-data</artifactId>
     </dependency>
     
-    <dependency>
-      <groupId>org.ehcache</groupId>
-      <artifactId>ehcache</artifactId>
-    </dependency>
   </dependencies>
 
   <build>
@@ -130,7 +126,6 @@
             </Export-Package>
             <Import-Package>
                 javax.naming.directory,
-                org.ehcache;version=${ehcache.version},
                 org.apache.directory.api.ldap.aci;version=${org.apache.directory.api.version},
                 org.apache.directory.api.ldap.aci.protectedItem;version=${org.apache.directory.api.version},
                 org.apache.directory.api.ldap.model.constants;version=${org.apache.directory.api.version},
diff --git a/interceptors/authz/src/main/java/org/apache/directory/server/core/authz/GroupCache.java b/interceptors/authz/src/main/java/org/apache/directory/server/core/authz/GroupCache.java
index 5dc6eef..cdf9a01 100644
--- a/interceptors/authz/src/main/java/org/apache/directory/server/core/authz/GroupCache.java
+++ b/interceptors/authz/src/main/java/org/apache/directory/server/core/authz/GroupCache.java
@@ -21,14 +21,13 @@ package org.apache.directory.server.core.authz;
 
 
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
 
 import javax.naming.directory.SearchControls;
 
-import org.ehcache.Cache;
-
 import org.apache.directory.api.ldap.model.constants.SchemaConstants;
 import org.apache.directory.api.ldap.model.entry.Attribute;
 import org.apache.directory.api.ldap.model.entry.Entry;
@@ -45,7 +44,6 @@ import org.apache.directory.api.ldap.model.name.Dn;
 import org.apache.directory.api.ldap.model.schema.AttributeType;
 import org.apache.directory.api.ldap.model.schema.SchemaManager;
 import org.apache.directory.server.constants.ServerDNConstants;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.CoreSession;
 import org.apache.directory.server.core.api.DirectoryService;
 import org.apache.directory.server.core.api.DnFactory;
@@ -94,8 +92,7 @@ public class GroupCache
     private static final Set<String> EMPTY_GROUPS = new HashSet<>();
 
     /** String key for the Dn of a group to a Set (HashSet) for the Strings of member DNs */
-    private Cache< String, Set > groupCache;
-
+    private final Map<String, Set<String>> groups = new ConcurrentHashMap<>();
 
 
     /**
@@ -114,8 +111,6 @@ public class GroupCache
         // stuff for dealing with the admin group
         administratorsGroupDn = parseNormalized( ServerDNConstants.ADMINISTRATORS_GROUP_DN );
 
-        groupCache = dirService.getCacheService().getCache( "groupCache", String.class, Set.class );
-
         initialize( dirService.getAdminSession() );
     }
 
@@ -179,7 +174,7 @@ public class GroupCache
                         Set<String> memberSet = new HashSet<>( members.size() );
                         addMembers( memberSet, members );
 
-                        groupCache.put( groupDn.getNormName(), memberSet );
+                        groups.put( groupDn.getNormName(), memberSet );
                     }
                     else
                     {
@@ -200,8 +195,7 @@ public class GroupCache
 
         if ( IS_DEBUG )
         {
-            LOG.debug( "group cache contents on startup:\n {}", 
-                CacheService.dumpCacheContentsToString( groupCache ) );
+            LOG.debug( "group cache contents on startup:\n {}", groups );
         }
     }
 
@@ -314,12 +308,11 @@ public class GroupCache
         Set<String> memberSet = new HashSet<>( members.size() );
         addMembers( memberSet, members );
 
-        groupCache.put( name, memberSet );
+        groups.put( name, memberSet );
 
         if ( IS_DEBUG )
         {
-            LOG.debug( "group cache contents after adding '{}' :\n {}", name,
-                CacheService.dumpCacheContentsToString( groupCache ) );
+            LOG.debug( "group cache contents after adding '{}' :\n {}", name, groups );
         }
     }
 
@@ -341,12 +334,11 @@ public class GroupCache
             return;
         }
 
-        groupCache.remove( name.getNormName() );
+        groups.remove( name.getNormName() );
 
         if ( IS_DEBUG )
         {
-            LOG.debug( "group cache contents after deleting '{}' :\n {}", name.getName(),
-                CacheService.dumpCacheContentsToString( groupCache ) );
+            LOG.debug( "group cache contents after deleting '{}' :\n {}", name.getName(), groups );
         }
     }
 
@@ -427,7 +419,7 @@ public class GroupCache
         {
             if ( memberAttr.getOid() == modification.getAttribute().getId() )
             {
-                Set<String> memberSet = groupCache.get( name.getNormName() );
+                Set<String> memberSet = groups.get( name.getNormName() );
                 
                 if ( memberSet != null )
                 {
@@ -440,8 +432,7 @@ public class GroupCache
 
         if ( IS_DEBUG )
         {
-            LOG.debug( "group cache contents after modifying '{}' :\n {}", name.getName(),
-                CacheService.dumpCacheContentsToString( groupCache ) );
+            LOG.debug( "group cache contents after modifying '{}' :\n {}", name.getName(), groups );
         }
     }
 
@@ -464,7 +455,7 @@ public class GroupCache
             return;
         }
 
-        Set<String> memberSet = groupCache.get( name.getNormName() );
+        Set<String> memberSet = groups.get( name.getNormName() );
 
         if ( memberSet != null )
         {
@@ -473,8 +464,7 @@ public class GroupCache
 
         if ( IS_DEBUG )
         {
-            LOG.debug( "group cache contents after modifying '{}' :\n {}", name.getName(),
-                CacheService.dumpCacheContentsToString( groupCache ) );
+            LOG.debug( "group cache contents after modifying '{}' :\n {}", name.getName(), groups );
         }
     }
 
@@ -493,7 +483,7 @@ public class GroupCache
             return true;
         }
 
-        Set<String> members = groupCache.get( administratorsGroupDn.getNormName() );
+        Set<String> members = groups.get( administratorsGroupDn.getNormName() );
         
         if ( members == null )
         {
@@ -519,12 +509,10 @@ public class GroupCache
     {
         Set<String> memberGroups = null;
 
-        Iterator<Cache.Entry<String, Set>> iterator = groupCache.iterator();
-        while ( iterator.hasNext() )
+        for ( Map.Entry<String, Set<String>> entry : groups.entrySet() )
         {
-            Cache.Entry<String, Set> next = iterator.next();
-            String group = next.getKey();
-            Set<String> members = next.getValue();
+            String group = entry.getKey();
+            Set<String> members = entry.getValue();
 
             if ( members == null )
             {
@@ -553,18 +541,17 @@ public class GroupCache
 
     public boolean groupRenamed( Dn oldName, Dn newName )
     {
-        Set<String> members = groupCache.get( oldName.getNormName() );
+        Set<String> members = groups.get( oldName.getNormName() );
 
         if ( members != null )
         {
-            groupCache.remove( oldName.getNormName() );
+            groups.remove( oldName.getNormName() );
 
-            groupCache.put( newName.getNormName(), members );
+            groups.put( newName.getNormName(), members );
 
             if ( IS_DEBUG )
             {
-                LOG.debug( "group cache contents after renaming '{}' :\n{}", oldName.getName(),
-                    CacheService.dumpCacheContentsToString( groupCache ) );
+                LOG.debug( "group cache contents after renaming '{}' :\n{}", oldName.getName(), groups );
             }
 
             return true;
diff --git a/interceptors/subtree/pom.xml b/interceptors/subtree/pom.xml
index e822e71..9e09221 100644
--- a/interceptors/subtree/pom.xml
+++ b/interceptors/subtree/pom.xml
@@ -77,10 +77,6 @@
       <artifactId>api-util</artifactId>
     </dependency>
     
-    <dependency>
-      <groupId>org.ehcache</groupId>
-      <artifactId>ehcache</artifactId>
-    </dependency>
   </dependencies>
 
   <build>
@@ -134,8 +130,7 @@
             </Export-Package>
             <Import-Package>
                 javax.naming.directory,
-                org.ehcache;version=${ehcache.version},
-                org.ehcache.config.builders;version=${ehcache.version},
+                com.github.benmanes.caffeine.cache;bundle-version=${caffeine.version},
                 org.apache.directory.api.ldap.codec.controls.search.subentries;version=${org.apache.directory.api.version},
                 org.apache.directory.api.ldap.model.constants;version=${org.apache.directory.api.version},
                 org.apache.directory.api.ldap.model.entry;version=${org.apache.directory.api.version},
diff --git a/interceptors/subtree/src/test/java/org/apache/directory/server/core/subtree/SubtreeEvaluatorTest.java b/interceptors/subtree/src/test/java/org/apache/directory/server/core/subtree/SubtreeEvaluatorTest.java
index ad384f5..698f8bf 100644
--- a/interceptors/subtree/src/test/java/org/apache/directory/server/core/subtree/SubtreeEvaluatorTest.java
+++ b/interceptors/subtree/src/test/java/org/apache/directory/server/core/subtree/SubtreeEvaluatorTest.java
@@ -46,16 +46,13 @@ import org.apache.directory.server.core.api.DnFactory;
 import org.apache.directory.server.core.api.normalization.FilterNormalizingVisitor;
 import org.apache.directory.server.core.api.subtree.SubtreeEvaluator;
 import org.apache.directory.server.core.shared.DefaultDnFactory;
-import org.ehcache.Cache;
-import org.ehcache.CacheManager;
-import org.ehcache.config.builders.CacheConfigurationBuilder;
-import org.ehcache.config.builders.CacheManagerBuilder;
-import org.ehcache.config.builders.ResourcePoolsBuilder;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import com.github.benmanes.caffeine.cache.Cache;
+import com.github.benmanes.caffeine.cache.Caffeine;
 import com.mycila.junit.concurrent.Concurrency;
 import com.mycila.junit.concurrent.ConcurrentJunitRunner;
 
@@ -74,7 +71,6 @@ public class SubtreeEvaluatorTest
     private static SubtreeEvaluator evaluator;
     private static FilterNormalizingVisitor visitor;
     private static ConcreteNameComponentNormalizer ncn;
-    private static Cache<String, Dn> dnCache;
 
 
     @BeforeClass
@@ -102,9 +98,7 @@ public class SubtreeEvaluatorTest
             fail( "Schema load failed : " + Exceptions.printErrors( schemaManager.getErrors() ) );
         }
 
-        CacheManager cm = CacheManagerBuilder.newCacheManagerBuilder().withCache( "dnCache", CacheConfigurationBuilder.newCacheConfigurationBuilder( String.class, Dn.class, ResourcePoolsBuilder.heap(1000)).build()).build();
-        cm.init();
-        dnCache = cm.getCache( "dnCache", String.class, Dn.class );        dnFactory = new DefaultDnFactory( schemaManager, dnCache );
+        dnFactory = new DefaultDnFactory( schemaManager, 100 );
 
         ncn = new ConcreteNameComponentNormalizer( schemaManager );
 
@@ -118,7 +112,6 @@ public class SubtreeEvaluatorTest
     {
         visitor = null;
         evaluator = null;
-        dnCache.clear();
     }
 
 
diff --git a/jdbm-partition/pom.xml b/jdbm-partition/pom.xml
index 21c35ce..47886df 100644
--- a/jdbm-partition/pom.xml
+++ b/jdbm-partition/pom.xml
@@ -150,7 +150,7 @@
                 jdbm.btree,
                 jdbm.helper,
                 jdbm.recman,
-                org.ehcache;version=${ehcache.version},
+                com.github.benmanes.caffeine.cache;bundle-version=${caffeine.version},
                 org.apache.directory.api.ldap.model.constants;version=${org.apache.directory.api.version},
                 org.apache.directory.api.ldap.model.csn;version=${org.apache.directory.api.version},
                 org.apache.directory.api.ldap.model.cursor;version=${org.apache.directory.api.version},
diff --git a/jdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmPartition.java b/jdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmPartition.java
index 263ec91..a15f8ca 100644
--- a/jdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmPartition.java
+++ b/jdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmPartition.java
@@ -70,10 +70,12 @@ import org.apache.directory.server.xdbm.search.impl.DefaultOptimizer;
 import org.apache.directory.server.xdbm.search.impl.DefaultSearchEngine;
 import org.apache.directory.server.xdbm.search.impl.EvaluatorBuilder;
 import org.apache.directory.server.xdbm.search.impl.NoOpOptimizer;
-import org.ehcache.Cache;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.github.benmanes.caffeine.cache.Cache;
+import com.github.benmanes.caffeine.cache.Caffeine;
+
 import jdbm.RecordManager;
 import jdbm.helper.MRU;
 import jdbm.recman.BaseRecordManager;
@@ -533,17 +535,7 @@ public class JdbmPartition extends AbstractBTreePartition
                 buildUserIndex( beginReadTransaction(), indexToBuild );
             }
 
-            if ( cacheService != null )
-            {
-                entryCache = cacheService.getCache( getId(), String.class, Entry.class );
-
-                //int cacheSizeConfig = ( int ) entryCache.getCacheConfiguration().getMaxEntriesLocalHeap();
-
-                //if ( cacheSizeConfig < cacheSize )
-                //{
-                //    entryCache.getCacheConfiguration().setMaxEntriesLocalHeap( cacheSize );
-                //}
-            }
+            entryCache = Caffeine.newBuilder().maximumSize( cacheSize ).build();
 
             // Initialization of the context entry
             if ( ( suffixDn != null ) && ( contextEntry != null ) )
@@ -884,7 +876,7 @@ public class JdbmPartition extends AbstractBTreePartition
         {
             if ( entryCache != null )
             {
-                entryCache.clear();
+                entryCache.invalidateAll();
             }
         }
 
@@ -951,20 +943,20 @@ public class JdbmPartition extends AbstractBTreePartition
                     entry = ( ( ClonedServerEntry ) entry ).getOriginalEntry();
                 }
 
-                entryCache.replace( id, entry );
+                entryCache.put( id, entry );
             }
             else if ( ( opCtx instanceof MoveOperationContext )
                 || ( opCtx instanceof MoveAndRenameOperationContext )
                 || ( opCtx instanceof RenameOperationContext ) )
             {
                 // clear the cache it is not worth updating all the children
-                entryCache.clear();
+                entryCache.invalidateAll();
             }
             else if ( opCtx instanceof DeleteOperationContext )
             {
                 // delete the entry
                 DeleteOperationContext delCtx = ( DeleteOperationContext ) opCtx;
-                entryCache.remove( delCtx.getEntry().get( SchemaConstants.ENTRY_UUID_AT ).getString() );
+                entryCache.invalidate( delCtx.getEntry().get( SchemaConstants.ENTRY_UUID_AT ).getString() );
             }
         }
         catch ( LdapException e )
@@ -977,7 +969,7 @@ public class JdbmPartition extends AbstractBTreePartition
     @Override
     public Entry lookupCache( String id )
     {
-        return ( entryCache != null ) ? entryCache.get( id ) : null;
+        return ( entryCache != null ) ? entryCache.getIfPresent( id ) : null;
     }
 
 
diff --git a/jdbm-partition/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmStoreTest.java b/jdbm-partition/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmStoreTest.java
index 99fa0d4..8256edb 100644
--- a/jdbm-partition/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmStoreTest.java
+++ b/jdbm-partition/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmStoreTest.java
@@ -60,7 +60,6 @@ import org.apache.directory.api.ldap.schema.manager.impl.DefaultSchemaManager;
 import org.apache.directory.api.util.Strings;
 import org.apache.directory.api.util.exception.Exceptions;
 import org.apache.directory.server.constants.ApacheSchemaConstants;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.CoreSession;
 import org.apache.directory.server.core.api.DirectoryService;
 import org.apache.directory.server.core.api.DnFactory;
@@ -117,7 +116,6 @@ public class JdbmStoreTest
     /** The SN AttributeType instance */
     private static AttributeType SN_AT;
 
-    private static CacheService cacheService;
     private PartitionTxn partitionTxn;
     
     /** The recordManager used */
@@ -152,10 +150,7 @@ public class JdbmStoreTest
         SN_AT = schemaManager.getAttributeType( SchemaConstants.SN_AT );
         APACHE_ALIAS_AT = schemaManager.getAttributeType( ApacheSchemaConstants.APACHE_ALIAS_AT );
 
-        cacheService = new CacheService();
-        cacheService.initialize( null );
-        dnFactory = new DefaultDnFactory( schemaManager, 
-            cacheService.getCache( "dnCache", String.class, Dn.class ) );
+        dnFactory = new DefaultDnFactory( schemaManager, 100 );
     }
 
 
@@ -183,7 +178,6 @@ public class JdbmStoreTest
         Dn suffixDn = new Dn( schemaManager, "o=Good Times Co." );
         partition.setSuffixDn( suffixDn );
 
-        partition.setCacheService( cacheService );
         partition.initialize();
 
         StoreUtils.loadExampleData( partition, schemaManager );
@@ -248,7 +242,6 @@ public class JdbmStoreTest
         store2.addIndex( new JdbmIndex( SchemaConstants.OU_AT_OID, false ) );
         store2.addIndex( new JdbmIndex( SchemaConstants.UID_AT_OID, false ) );
         store2.setSuffixDn( EXAMPLE_COM );
-        store2.setCacheService( cacheService );
         store2.initialize();
 
         // inject context entry
diff --git a/jdbm-partition/src/test/java/org/apache/directory/server/core/partition/tree/PartitionTreeTest.java b/jdbm-partition/src/test/java/org/apache/directory/server/core/partition/tree/PartitionTreeTest.java
index 88e4eed..9e959d6 100644
--- a/jdbm-partition/src/test/java/org/apache/directory/server/core/partition/tree/PartitionTreeTest.java
+++ b/jdbm-partition/src/test/java/org/apache/directory/server/core/partition/tree/PartitionTreeTest.java
@@ -38,7 +38,6 @@ import org.apache.directory.api.ldap.schema.loader.LdifSchemaLoader;
 import org.apache.directory.api.ldap.schema.manager.impl.DefaultSchemaManager;
 import org.apache.directory.api.ldap.util.tree.DnNode;
 import org.apache.directory.api.util.exception.Exceptions;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.DnFactory;
 import org.apache.directory.server.core.api.partition.Partition;
 import org.apache.directory.server.core.partition.impl.btree.jdbm.DupsContainerCursorTest;
@@ -84,10 +83,7 @@ public class PartitionTreeTest
             fail( "Schema load failed : " + Exceptions.printErrors( schemaManager.getErrors() ) );
         }
 
-        CacheService cacheService = new CacheService();
-        cacheService.initialize( null );
-        dnFactory = new DefaultDnFactory( schemaManager, 
-            cacheService.getCache( "dnCache", String.class, Dn.class ) );
+        dnFactory = new DefaultDnFactory( schemaManager, 100 );
     }
 
 
diff --git a/kerberos-codec/pom.xml b/kerberos-codec/pom.xml
index 918e1aa..011dd02 100644
--- a/kerberos-codec/pom.xml
+++ b/kerberos-codec/pom.xml
@@ -69,8 +69,8 @@
     </dependency>
     
     <dependency>
-      <groupId>org.ehcache</groupId>
-      <artifactId>ehcache</artifactId>
+      <groupId>com.github.ben-manes.caffeine</groupId>
+      <artifactId>caffeine</artifactId>
     </dependency>
   </dependencies>
 
@@ -134,7 +134,7 @@
                 javax.crypto,
                 javax.crypto.spec,
                 javax.security.auth.kerberos,
-                org.ehcache;version=${ehcache.version},
+                com.github.benmanes.caffeine.cache;bundle-version=${caffeine.version},
                 org.apache.directory.api.asn1;version=${org.apache.directory.api.version},
                 org.apache.directory.api.asn1.actions;version=${org.apache.directory.api.version},
                 org.apache.directory.api.asn1.ber;version=${org.apache.directory.api.version},
diff --git a/kerberos-codec/src/main/java/org/apache/directory/server/kerberos/shared/replay/ReplayCacheImpl.java b/kerberos-codec/src/main/java/org/apache/directory/server/kerberos/shared/replay/ReplayCacheImpl.java
index 58aa5a0..16d37c9 100644
--- a/kerberos-codec/src/main/java/org/apache/directory/server/kerberos/shared/replay/ReplayCacheImpl.java
+++ b/kerberos-codec/src/main/java/org/apache/directory/server/kerberos/shared/replay/ReplayCacheImpl.java
@@ -21,14 +21,17 @@ package org.apache.directory.server.kerberos.shared.replay;
 
 
 import java.io.Serializable;
+import java.time.Duration;
 
 import javax.security.auth.kerberos.KerberosPrincipal;
 
 import org.apache.directory.shared.kerberos.KerberosTime;
-import org.ehcache.Cache;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.github.benmanes.caffeine.cache.Cache;
+import com.github.benmanes.caffeine.cache.Caffeine;
+
 
 /**
  * "The replay cache will store at least the server name, along with the client name,
@@ -44,8 +47,8 @@ public class ReplayCacheImpl implements ReplayCache
 
     private static final Logger LOG = LoggerFactory.getLogger( ReplayCacheImpl.class );
 
-    /** ehcache based storage to store the entries */
-    private Cache< String, Object > cache;
+    /** Caffeine based storage to store the entries */
+    Cache<String, Object> cache;
 
     /** default clock skew */
     private static final long DEFAULT_CLOCK_SKEW = 5L * KerberosTime.MINUTE;
@@ -139,36 +142,15 @@ public class ReplayCacheImpl implements ReplayCache
 
     /**
      * Creates a new instance of InMemoryReplayCache. Sets the
-     * delay between each cleaning run to 5 seconds.
-     */
-    public ReplayCacheImpl( Cache < String, Object > cache )
-    {
-        this.cache = cache;
-    }
-
-
-    /**
-     * Creates a new instance of InMemoryReplayCache. Sets the
      * delay between each cleaning run to 5 seconds. Sets the
      * clockSkew to the given value
      * 
      * @param clockSkew the allowed skew (milliseconds)
      */
-    public ReplayCacheImpl( Cache< String, Object > cache, long clockSkew )
-    {
-        this.cache = cache;
-        this.clockSkew = clockSkew;
-    }
-
-
-    /**
-     * Sets the clock skew.
-     *
-     * @param clockSkew
-     */
-    public void setClockSkew( long clockSkew )
+    public ReplayCacheImpl( long clockSkew )
     {
         this.clockSkew = clockSkew;
+        this.cache = Caffeine.newBuilder().expireAfterWrite( Duration.ofMillis( clockSkew )).build();
     }
 
 
@@ -180,7 +162,7 @@ public class ReplayCacheImpl implements ReplayCache
     {
         ReplayCacheEntry entry = new ReplayCacheEntry( serverPrincipal, 
             clientPrincipal, clientTime, clientMicroSeconds );
-        ReplayCacheEntry found = ( ReplayCacheEntry ) cache.get( entry.createKey() );
+        ReplayCacheEntry found = ( ReplayCacheEntry ) cache.getIfPresent( entry.createKey() );
 
         if ( found == null )
         {
@@ -214,6 +196,6 @@ public class ReplayCacheImpl implements ReplayCache
     public void clear()
     {
         LOG.debug( "removing all the elements from cache" );
-        cache.clear();
+        cache.invalidateAll();
     }
 }
diff --git a/kerberos-codec/src/test/java/org/apache/directory/server/kerberos/shared/replay/ReplayCacheImplTest.java b/kerberos-codec/src/test/java/org/apache/directory/server/kerberos/shared/replay/ReplayCacheImplTest.java
index 1de75b1..4827553 100644
--- a/kerberos-codec/src/test/java/org/apache/directory/server/kerberos/shared/replay/ReplayCacheImplTest.java
+++ b/kerberos-codec/src/test/java/org/apache/directory/server/kerberos/shared/replay/ReplayCacheImplTest.java
@@ -20,29 +20,22 @@
 package org.apache.directory.server.kerberos.shared.replay;
 
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
-import java.time.Duration;
 import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
+import java.util.Set;
 
 import javax.security.auth.kerberos.KerberosPrincipal;
 
+import org.apache.commons.lang3.tuple.Triple;
 import org.apache.directory.junit.tools.MultiThreadedMultiInvoker;
 import org.apache.directory.shared.kerberos.KerberosTime;
 import org.apache.directory.shared.kerberos.codec.types.PrincipalNameType;
-import org.ehcache.Cache;
-import org.ehcache.Cache.Entry;
-import org.ehcache.CacheManager;
-import org.ehcache.Status;
-import org.ehcache.config.builders.CacheConfigurationBuilder;
-import org.ehcache.config.builders.CacheManagerBuilder;
-import org.ehcache.config.builders.ExpiryPolicyBuilder;
-import org.ehcache.config.builders.ResourcePoolsBuilder;
-
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -65,83 +58,76 @@ public class ReplayCacheImplTest
 
 
     /**
-     * Test that the cache is working well. We will create a new entry
-     * every 500 ms, with 4 different serverPrincipals.
-     *
-     * After this period of time, we should only have 2 entries in the cache
+     * Test that the cache is working well.
+     * We will create 4 new entries, with 4 different serverPrincipals.
+     * Those 4 entries should remain in cache and replay should be detected
+     * After expiration time the entries should have been expired.
      */
     @Test
     public void testCacheSetting() throws Exception
     {
-        CacheManager cacheManager = null;
-
         try
         {
             long clockSkew = 1000; // 1 sec
 
-            cacheManager = CacheManagerBuilder.newCacheManagerBuilder().build();
-            
-            cacheManager.init();
-
-            Cache< String, Object > ehCache = cacheManager.createCache( 
-                    "kdcReplayCache", 
-                    CacheConfigurationBuilder.newCacheConfigurationBuilder(
-                            String.class, 
-                            Object.class, 
-                            ResourcePoolsBuilder.heap(4)
-                    )
-                        .withExpiry(
-                            ExpiryPolicyBuilder
-                                .timeToIdleExpiration( Duration.ofMillis( 1000 ) )
-                                )
-                        .withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration( Duration.ofMillis( 1000 )))
-            );
-            
-            ReplayCacheImpl cache = new ReplayCacheImpl( ehCache, clockSkew );
-
-            int i = 0;
+            ReplayCacheImpl cache = new ReplayCacheImpl( clockSkew );
 
             // Inject 4 entries
-            while ( i < 4 )
+            List<Triple<KerberosPrincipal, KerberosPrincipal, KerberosTime>> triples = new ArrayList<>();
+            for ( int i = 0; i < 4; i++ )
             {
                 KerberosPrincipal serverPrincipal = new KerberosPrincipal( "server" + i + "@APACHE.ORG",
                     PrincipalNameType.KRB_NT_PRINCIPAL.getValue() );
                 KerberosPrincipal clientPrincipal = new KerberosPrincipal( "client" + i + "@APACHE.ORG",
                     PrincipalNameType.KRB_NT_PRINCIPAL.getValue() );
+                KerberosTime clientTime = new KerberosTime( System.currentTimeMillis() );
 
-                cache.save( serverPrincipal, clientPrincipal, new KerberosTime( System.currentTimeMillis() ), 0 );
+                cache.save( serverPrincipal, clientPrincipal, clientTime, 0 );
 
-                i++;
+                triples.add( Triple.of( serverPrincipal, clientPrincipal, clientTime ) );
             }
 
-            List<String> keys = new ArrayList<>();
-            Iterator<Entry<String, Object>> it = ehCache.iterator();
-            
-            while (it.hasNext())
+            // Get the 4 cache keys
+            Set<String> keys = cache.cache.asMap().keySet();
+            assertEquals( 4, keys.size() );
+            assertEquals( 4L, cache.cache.estimatedSize() );
+
+            // Wait a bit without exceeding timetolive time
+            Thread.sleep( 200L );
+
+            // Verify that cache entries are valid and replay is detected
+            for ( String key : keys )
             {
-                keys.add(it.next().getKey());
+                assertNotNull( cache.cache.getIfPresent( key ) );
+            }
+            for ( Triple<KerberosPrincipal, KerberosPrincipal, KerberosTime> triple : triples )
+            {
+                boolean isReplay = cache.isReplay( triple.getLeft(), triple.getMiddle(), triple.getRight(), 0 );
+                assertTrue( isReplay );
             }
-
-            // We should have 4 entries
-            assertTrue( keys.size() != 0 );
 
             // Wait till the timetolive time exceeds
-            Thread.sleep( 1200 );
+            Thread.sleep( 1000L );
+
+            // Verify that cache entries are expired and no replay is detected
+            for ( Triple<KerberosPrincipal, KerberosPrincipal, KerberosTime> triple : triples )
+            {
+                boolean isReplay = cache.isReplay( triple.getLeft(), triple.getMiddle(), triple.getRight(), 0 );
+                assertFalse( isReplay );
+            }
 
             // then access the cache so that the objects present in the cache will be expired
-            for ( String k : keys )
+            for ( String key : keys )
             {
-                assertNull( ehCache.get( k ) );
+                assertNull( cache.cache.getIfPresent( key ) );
             }
 
-            assertFalse( ehCache.iterator().hasNext() );
+            // After forced cache cleanup the size is recalculated
+            cache.cache.cleanUp();
+            assertEquals( 0L, cache.cache.estimatedSize() );
         }
         finally
         {
-            if ( cacheManager != null && cacheManager.getStatus() != Status.UNINITIALIZED)
-            {
-                cacheManager.close();
-            }
         }
     }
 }
diff --git a/ldif-partition/src/test/java/org/apache/directory/server/core/partition/ldif/LdifPartitionTest.java b/ldif-partition/src/test/java/org/apache/directory/server/core/partition/ldif/LdifPartitionTest.java
index 0952bc5..bf81940 100644
--- a/ldif-partition/src/test/java/org/apache/directory/server/core/partition/ldif/LdifPartitionTest.java
+++ b/ldif-partition/src/test/java/org/apache/directory/server/core/partition/ldif/LdifPartitionTest.java
@@ -56,7 +56,6 @@ import org.apache.directory.api.ldap.schema.extractor.impl.DefaultSchemaLdifExtr
 import org.apache.directory.api.ldap.schema.loader.LdifSchemaLoader;
 import org.apache.directory.api.ldap.schema.manager.impl.DefaultSchemaManager;
 import org.apache.directory.api.util.exception.Exceptions;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.CoreSession;
 import org.apache.directory.server.core.api.DirectoryService;
 import org.apache.directory.server.core.api.DnFactory;
@@ -99,7 +98,6 @@ public class LdifPartitionTest
     private static SchemaManager schemaManager = null;
     private static DnFactory dnFactory;
     private static CsnFactory defaultCSNFactory;
-    private static CacheService cacheService;
 
     @Rule
     public TemporaryFolder folder = new TemporaryFolder();
@@ -132,10 +130,7 @@ public class LdifPartitionTest
 
         defaultCSNFactory = new CsnFactory( 0 );
 
-        cacheService = new CacheService();
-        cacheService.initialize( null );
-        dnFactory = new DefaultDnFactory( schemaManager, 
-            cacheService.getCache( "dnCache", String.class, Dn.class ) );
+        dnFactory = new DefaultDnFactory( schemaManager, 100 );
     }
 
 
@@ -154,7 +149,6 @@ public class LdifPartitionTest
         partition.setSchemaManager( schemaManager );
         partition.setPartitionPath( wkdir.toURI() );
 
-        partition.setCacheService( cacheService );
         partition.initialize();
 
         Entry entry = createEntry( "ou=test, ou=system" );
diff --git a/ldif-partition/src/test/java/org/apache/directory/server/core/partition/ldif/SingleFileLdifPartitionSingeValueAttribute.java b/ldif-partition/src/test/java/org/apache/directory/server/core/partition/ldif/SingleFileLdifPartitionSingeValueAttribute.java
index aeabfb7..3503975 100644
--- a/ldif-partition/src/test/java/org/apache/directory/server/core/partition/ldif/SingleFileLdifPartitionSingeValueAttribute.java
+++ b/ldif-partition/src/test/java/org/apache/directory/server/core/partition/ldif/SingleFileLdifPartitionSingeValueAttribute.java
@@ -68,7 +68,6 @@ import org.apache.directory.api.ldap.schema.loader.LdifSchemaLoader;
 import org.apache.directory.api.ldap.schema.manager.impl.DefaultSchemaManager;
 import org.apache.directory.api.util.Strings;
 import org.apache.directory.api.util.exception.Exceptions;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.CoreSession;
 import org.apache.directory.server.core.api.DirectoryService;
 import org.apache.directory.server.core.api.DnFactory;
@@ -125,8 +124,6 @@ public class SingleFileLdifPartitionSingeValueAttribute
     @Rule
     public TemporaryFolder folder = new TemporaryFolder();
 
-    private static CacheService cacheService;
-
 
     @BeforeClass
     public static void init() throws Exception
@@ -176,10 +173,7 @@ public class SingleFileLdifPartitionSingeValueAttribute
 
         contextEntry = new ClonedServerEntry( new DefaultEntry( schemaManager, ldifEntry.getEntry() ) );
 
-        cacheService = new CacheService();
-        cacheService.initialize( null );
-        dnFactory = new DefaultDnFactory( schemaManager, 
-            cacheService.getCache( "dnCache", String.class, Dn.class ) );
+        dnFactory = new DefaultDnFactory( schemaManager, 100 );
     }
 
 
@@ -249,7 +243,6 @@ public class SingleFileLdifPartitionSingeValueAttribute
         partition.setPartitionPath( new File( fileName ).toURI() );
         partition.setSuffixDn( new Dn( schemaManager, "ou=test,ou=system" ) );
         partition.setSchemaManager( schemaManager );
-        partition.setCacheService( cacheService );
         partition.initialize();
 
         return partition;
diff --git a/ldif-partition/src/test/java/org/apache/directory/server/core/partition/ldif/SingleFileLdifPartitionTest.java b/ldif-partition/src/test/java/org/apache/directory/server/core/partition/ldif/SingleFileLdifPartitionTest.java
index 551a2e6..779252f 100644
--- a/ldif-partition/src/test/java/org/apache/directory/server/core/partition/ldif/SingleFileLdifPartitionTest.java
+++ b/ldif-partition/src/test/java/org/apache/directory/server/core/partition/ldif/SingleFileLdifPartitionTest.java
@@ -68,7 +68,6 @@ import org.apache.directory.api.ldap.schema.loader.LdifSchemaLoader;
 import org.apache.directory.api.ldap.schema.manager.impl.DefaultSchemaManager;
 import org.apache.directory.api.util.Strings;
 import org.apache.directory.api.util.exception.Exceptions;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.CoreSession;
 import org.apache.directory.server.core.api.DirectoryService;
 import org.apache.directory.server.core.api.DnFactory;
@@ -123,8 +122,6 @@ public class SingleFileLdifPartitionTest
     @Rule
     public TemporaryFolder folder = new TemporaryFolder();
 
-    private static CacheService cacheService;
-
 
     @BeforeClass
     public static void init() throws Exception
@@ -174,10 +171,7 @@ public class SingleFileLdifPartitionTest
 
         contextEntry = new ClonedServerEntry( new DefaultEntry( schemaManager, ldifEntry.getEntry() ) );
 
-        cacheService = new CacheService();
-        cacheService.initialize( null );
-        dnFactory = new DefaultDnFactory( schemaManager, 
-            cacheService.getCache( "dnCache", String.class, Dn.class ) );
+        dnFactory = new DefaultDnFactory( schemaManager, 100 );
     }
 
 
@@ -247,7 +241,6 @@ public class SingleFileLdifPartitionTest
         partition.setPartitionPath( new File( fileName ).toURI() );
         partition.setSuffixDn( new Dn( schemaManager, "ou=test,ou=system" ) );
         partition.setSchemaManager( schemaManager );
-        partition.setCacheService( cacheService );
         partition.initialize();
 
         return partition;
diff --git a/mavibot-partition/pom.xml b/mavibot-partition/pom.xml
index ea03943..0bf0246 100644
--- a/mavibot-partition/pom.xml
+++ b/mavibot-partition/pom.xml
@@ -133,7 +133,7 @@
                 org.apache.directory.server.core.partition.impl.btree.mavibot;version=${project.version}
             </Export-Package>
             <Import-Package>
-                org.ehcache;version=${ehcache.version},
+                com.github.benmanes.caffeine.cache;bundle-version=${caffeine.version},
                 org.apache.directory.api.ldap.model.constants;version=${org.apache.directory.api.version},
                 org.apache.directory.api.ldap.model.cursor;version=${org.apache.directory.api.version},
                 org.apache.directory.api.ldap.model.entry;version=${org.apache.directory.api.version},
diff --git a/mavibot-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/mavibot/MavibotPartition.java b/mavibot-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/mavibot/MavibotPartition.java
index 42ea6a9..34c54d0 100644
--- a/mavibot-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/mavibot/MavibotPartition.java
+++ b/mavibot-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/mavibot/MavibotPartition.java
@@ -30,7 +30,6 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
-import org.ehcache.Cache;
 import org.apache.directory.api.ldap.model.constants.SchemaConstants;
 import org.apache.directory.api.ldap.model.cursor.Cursor;
 import org.apache.directory.api.ldap.model.cursor.Tuple;
@@ -67,6 +66,9 @@ import org.apache.directory.server.xdbm.search.impl.NoOpOptimizer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.github.benmanes.caffeine.cache.Cache;
+import com.github.benmanes.caffeine.cache.Caffeine;
+
 
 /**
  * A Mavibot partition
@@ -227,10 +229,7 @@ public class MavibotPartition extends AbstractBTreePartition
                         deleteUnusedIndexFiles( allIndices, allIndexDbFiles );
             */
 
-            if ( cacheService != null )
-            {
-                entryCache = cacheService.getCache( getId(), String.class, Entry.class );
-            }
+            entryCache = Caffeine.newBuilder().maximumSize( cacheSize ).build();
 
             // We are done !
             initialized = true;
@@ -321,7 +320,7 @@ public class MavibotPartition extends AbstractBTreePartition
         {
             if ( entryCache != null )
             {
-                entryCache.clear();
+                entryCache.invalidateAll();
             }
         }
 
@@ -445,7 +444,7 @@ public class MavibotPartition extends AbstractBTreePartition
     @Override
     public Entry lookupCache( String id )
     {
-        return ( entryCache != null ) ? entryCache.get( id ) : null;
+        return ( entryCache != null ) ? entryCache.getIfPresent( id ) : null;
     }
 
 
@@ -488,19 +487,19 @@ public class MavibotPartition extends AbstractBTreePartition
                     entry = ( ( ClonedServerEntry ) entry ).getOriginalEntry();
                 }
 
-                entryCache.replace( id, entry );
+                entryCache.put( id, entry );
             }
             else if ( ( opCtx instanceof MoveOperationContext ) || ( opCtx instanceof MoveAndRenameOperationContext )
                 || ( opCtx instanceof RenameOperationContext ) )
             {
                 // clear the cache it is not worth updating all the children
-                entryCache.clear();
+                entryCache.invalidateAll();
             }
             else if ( opCtx instanceof DeleteOperationContext )
             {
                 // delete the entry
                 DeleteOperationContext delCtx = ( DeleteOperationContext ) opCtx;
-                entryCache.remove( delCtx.getEntry().get( SchemaConstants.ENTRY_UUID_AT ).getString() );
+                entryCache.invalidate( delCtx.getEntry().get( SchemaConstants.ENTRY_UUID_AT ).getString() );
             }
         }
         catch ( LdapException e )
diff --git a/mavibot-partition/src/test/java/org/apache/directory/server/core/partition/impl/btree/mavibot/MavibotStoreTest.java b/mavibot-partition/src/test/java/org/apache/directory/server/core/partition/impl/btree/mavibot/MavibotStoreTest.java
index 0fdd337..26984d4 100644
--- a/mavibot-partition/src/test/java/org/apache/directory/server/core/partition/impl/btree/mavibot/MavibotStoreTest.java
+++ b/mavibot-partition/src/test/java/org/apache/directory/server/core/partition/impl/btree/mavibot/MavibotStoreTest.java
@@ -58,7 +58,6 @@ import org.apache.directory.api.util.Strings;
 import org.apache.directory.api.util.exception.Exceptions;
 import org.apache.directory.mavibot.btree.RecordManager;
 import org.apache.directory.server.constants.ApacheSchemaConstants;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.CoreSession;
 import org.apache.directory.server.core.api.DirectoryService;
 import org.apache.directory.server.core.api.DnFactory;
@@ -121,7 +120,6 @@ public class MavibotStoreTest
 
     private RecordManager recordMan;
 
-    private static CacheService cacheService;
     private PartitionTxn partitionTxn;
 
     @Rule
@@ -160,10 +158,7 @@ public class MavibotStoreTest
         SN_AT = schemaManager.getAttributeType( SchemaConstants.SN_AT );
         APACHE_ALIAS_AT = schemaManager.getAttributeType( ApacheSchemaConstants.APACHE_ALIAS_AT );
 
-        cacheService = new CacheService();
-        cacheService.initialize( null );
-        dnFactory = new DefaultDnFactory( schemaManager, 
-            cacheService.getCache( "dnCache", String.class, Dn.class ) );
+        dnFactory = new DefaultDnFactory( schemaManager, 100 );
     }
 
 
@@ -193,7 +188,6 @@ public class MavibotStoreTest
         Dn suffixDn = new Dn( schemaManager, "o=Good Times Co." );
         store.setSuffixDn( suffixDn );
 
-        store.setCacheService( cacheService );
         store.initialize();
 
         recordMan = store.getRecordMan();
@@ -244,7 +238,6 @@ public class MavibotStoreTest
         store2.addIndex( new MavibotIndex( SchemaConstants.OU_AT_OID, false ) );
         store2.addIndex( new MavibotIndex( SchemaConstants.UID_AT_OID, false ) );
         store2.setSuffixDn( EXAMPLE_COM );
-        store2.setCacheService( cacheService );
         store2.initialize();
 
         // inject context entry
diff --git a/osgi-integ/src/test/java/org/apache/directory/server/osgi/integ/ServerCoreAnnotationsOsgiTest.java b/osgi-integ/src/test/java/org/apache/directory/server/osgi/integ/ServerCoreAnnotationsOsgiTest.java
index 818aad8..e6b98ed 100644
--- a/osgi-integ/src/test/java/org/apache/directory/server/osgi/integ/ServerCoreAnnotationsOsgiTest.java
+++ b/osgi-integ/src/test/java/org/apache/directory/server/osgi/integ/ServerCoreAnnotationsOsgiTest.java
@@ -43,6 +43,7 @@ public class ServerCoreAnnotationsOsgiTest extends ServerOsgiTestBase
         factory.init( "foo" );
         DirectoryService ds = factory.getDirectoryService();
         assertNotNull( ds );
+        assertNotNull( ds.getDnFactory() );
     }
 
 }
diff --git a/osgi-integ/src/test/java/org/apache/directory/server/osgi/integ/ServerCoreApiOsgiTest.java b/osgi-integ/src/test/java/org/apache/directory/server/osgi/integ/ServerCoreApiOsgiTest.java
index 87c6d13..22ba120 100644
--- a/osgi-integ/src/test/java/org/apache/directory/server/osgi/integ/ServerCoreApiOsgiTest.java
+++ b/osgi-integ/src/test/java/org/apache/directory/server/osgi/integ/ServerCoreApiOsgiTest.java
@@ -22,7 +22,6 @@ package org.apache.directory.server.osgi.integ;
 
 import org.apache.directory.api.ldap.model.name.Dn;
 import org.apache.directory.api.ldap.schema.manager.impl.DefaultSchemaManager;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.LdapPrincipal;
 import org.apache.directory.server.core.api.administrative.SubschemaAAP;
 import org.apache.directory.server.core.api.entry.ClonedServerEntry;
@@ -43,7 +42,6 @@ public class ServerCoreApiOsgiTest extends ServerOsgiTestBase
     @Override
     protected void useBundleClasses() throws Exception
     {
-        new CacheService();
         new LdapPrincipal();
         new SubschemaAAP( new Dn( "cn=foo" ), "uuid" );
         new ClonedServerEntry();
diff --git a/osgi-integ/src/test/java/org/apache/directory/server/osgi/integ/ServerCoreSharedOsgiTest.java b/osgi-integ/src/test/java/org/apache/directory/server/osgi/integ/ServerCoreSharedOsgiTest.java
index 0558229..477658b 100644
--- a/osgi-integ/src/test/java/org/apache/directory/server/osgi/integ/ServerCoreSharedOsgiTest.java
+++ b/osgi-integ/src/test/java/org/apache/directory/server/osgi/integ/ServerCoreSharedOsgiTest.java
@@ -20,7 +20,10 @@
 package org.apache.directory.server.osgi.integ;
 
 
+import static org.junit.Assert.assertSame;
+
 import org.apache.directory.api.ldap.model.entry.DefaultEntry;
+import org.apache.directory.api.ldap.model.name.Dn;
 import org.apache.directory.server.core.shared.DefaultDnFactory;
 import org.apache.directory.server.core.shared.NullStringSerializer;
 import org.apache.directory.server.core.shared.partition.DefaultPartitionNexus;
@@ -39,7 +42,11 @@ public class ServerCoreSharedOsgiTest extends ServerOsgiTestBase
     @Override
     protected void useBundleClasses() throws Exception
     {
-        new DefaultDnFactory( null, null );
+        DefaultDnFactory dnFactory = new DefaultDnFactory( null, 100 );
+        Dn dn1 = dnFactory.create( "cn=foo" );
+        Dn dn2 = dnFactory.create( "cn=foo" );
+        assertSame( dn1, dn2 );
+
         NullStringSerializer.INSTANCE.serialize( null );
         NullStringSerializer.INSTANCE.deserialize( null );
         new DefaultPartitionNexus( new DefaultEntry() );
diff --git a/osgi-integ/src/test/java/org/apache/directory/server/osgi/integ/ServerJdbmPartitionOsgiTest.java b/osgi-integ/src/test/java/org/apache/directory/server/osgi/integ/ServerJdbmPartitionOsgiTest.java
index 5fa9abd..6c7ec1f 100644
--- a/osgi-integ/src/test/java/org/apache/directory/server/osgi/integ/ServerJdbmPartitionOsgiTest.java
+++ b/osgi-integ/src/test/java/org/apache/directory/server/osgi/integ/ServerJdbmPartitionOsgiTest.java
@@ -45,7 +45,7 @@ public class ServerJdbmPartitionOsgiTest extends ServerOsgiTestBase
     {
         new JdbmIndex<String>( "foo", false );
         SchemaManager schemaManager = new DefaultSchemaManager();
-        new JdbmPartition( schemaManager, new DefaultDnFactory( schemaManager, null ) );
+        new JdbmPartition( schemaManager, new DefaultDnFactory( schemaManager, 100 ) );
         new ParentIdAndRdnSerializer( schemaManager );
         new DnSerializer( schemaManager ).serialize( new Dn( "cn=foo" ) );
     }
diff --git a/osgi-integ/src/test/java/org/apache/directory/server/osgi/integ/ServerMavibotPartitionOsgiTest.java b/osgi-integ/src/test/java/org/apache/directory/server/osgi/integ/ServerMavibotPartitionOsgiTest.java
index 0c70b27..5668932 100644
--- a/osgi-integ/src/test/java/org/apache/directory/server/osgi/integ/ServerMavibotPartitionOsgiTest.java
+++ b/osgi-integ/src/test/java/org/apache/directory/server/osgi/integ/ServerMavibotPartitionOsgiTest.java
@@ -46,7 +46,7 @@ public class ServerMavibotPartitionOsgiTest extends ServerOsgiTestBase
     {
         new MavibotIndex<String>( "foo", false );
         SchemaManager schemaManager = new DefaultSchemaManager();
-        new MavibotPartition( schemaManager, new DefaultDnFactory( schemaManager, null ) );
+        new MavibotPartition( schemaManager, new DefaultDnFactory( schemaManager, 100 ) );
         new DnSerializer().serialize( new Dn( "cn=foo" ) );
 
         BTree<Object, Object> mavibotBTree = BTreeFactory.createInMemoryBTree();
diff --git a/pom.xml b/pom.xml
index 4bc3dc0..8d26e5d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -64,8 +64,7 @@
     <commons.net.version>3.6</commons.net.version>
     <commons.pool.version>2.6.1</commons.pool.version>
     <dnsjava.version>2.1.8</dnsjava.version>
-    <!-- OSGi related issue in ehcache 3.6.x: https://github.com/ehcache/ehcache3/issues/2554 -->
-    <ehcache.version>3.5.3</ehcache.version>
+    <caffeine.version>2.7.0</caffeine.version>
     <findbugs.annotations.version>1.0.0</findbugs.annotations.version>
     <jetty.version>9.4.14.v20181114</jetty.version>
     <!-- The Jetty bundle exports are using version 9.4.5, not 9.4.5.v20170502... -->
@@ -1228,9 +1227,19 @@
       </dependency>
       
       <dependency>
-        <groupId>org.ehcache</groupId>
-        <artifactId>ehcache</artifactId>
-        <version>${ehcache.version}</version>
+        <groupId>com.github.ben-manes.caffeine</groupId>
+        <artifactId>caffeine</artifactId>
+        <version>${caffeine.version}</version>
+        <exclusions>
+          <exclusion>
+            <groupId>com.google.errorprone</groupId>
+            <artifactId>error_prone_annotations</artifactId>
+          </exclusion>
+          <exclusion>
+            <groupId>org.checkerframework</groupId>
+            <artifactId>checker-qual</artifactId>
+           </exclusion>
+         </exclusions>
       </dependency>
     </dependencies>
   </dependencyManagement>
diff --git a/protocol-changepw/src/main/java/org/apache/directory/server/changepw/ChangePasswordServer.java b/protocol-changepw/src/main/java/org/apache/directory/server/changepw/ChangePasswordServer.java
index 348d114..aabf43d 100644
--- a/protocol-changepw/src/main/java/org/apache/directory/server/changepw/ChangePasswordServer.java
+++ b/protocol-changepw/src/main/java/org/apache/directory/server/changepw/ChangePasswordServer.java
@@ -26,8 +26,6 @@ import java.util.List;
 
 import javax.security.auth.kerberos.KerberosPrincipal;
 
-import org.ehcache.Cache;
-
 import org.apache.directory.server.changepw.protocol.ChangePasswordProtocolHandler;
 import org.apache.directory.server.constants.ServerDNConstants;
 import org.apache.directory.server.kerberos.shared.replay.ReplayCacheImpl;
diff --git a/protocol-kerberos/pom.xml b/protocol-kerberos/pom.xml
index aed97c0..f13114f 100644
--- a/protocol-kerberos/pom.xml
+++ b/protocol-kerberos/pom.xml
@@ -72,10 +72,6 @@
       <artifactId>mina-core</artifactId>
     </dependency>
 
-    <dependency>
-      <groupId>org.ehcache</groupId>
-      <artifactId>ehcache</artifactId>
-    </dependency>
   </dependencies>
 
   <build>
@@ -139,7 +135,7 @@
                 javax.naming,
                 javax.naming.directory,
                 javax.security.auth.kerberos,
-                org.ehcache;version=${ehcache.version},
+                com.github.benmanes.caffeine.cache;bundle-version=${caffeine.version},
                 org.apache.directory.api.asn1;version=${org.apache.directory.api.version},
                 org.apache.directory.api.asn1.ber;version=${org.apache.directory.api.version},
                 org.apache.directory.api.asn1.ber.tlv;version=${org.apache.directory.api.version},
diff --git a/protocol-kerberos/src/main/java/org/apache/directory/server/kerberos/changepwd/ChangePasswordServer.java b/protocol-kerberos/src/main/java/org/apache/directory/server/kerberos/changepwd/ChangePasswordServer.java
index b9b9b90..c92d652 100644
--- a/protocol-kerberos/src/main/java/org/apache/directory/server/kerberos/changepwd/ChangePasswordServer.java
+++ b/protocol-kerberos/src/main/java/org/apache/directory/server/kerberos/changepwd/ChangePasswordServer.java
@@ -37,7 +37,6 @@ import org.apache.directory.server.protocol.shared.transport.UdpTransport;
 import org.apache.mina.core.service.IoAcceptor;
 import org.apache.mina.transport.socket.DatagramSessionConfig;
 import org.apache.mina.transport.socket.SocketAcceptor;
-import org.ehcache.Cache;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -94,9 +93,7 @@ public class ChangePasswordServer extends DirectoryBackedService
 
         LOG.debug( "initializing the changepassword replay cache" );
 
-        Cache< String, Object > cache = getDirectoryService().getCacheService().
-            getCache( "changePwdReplayCache", String.class, Object.class );
-        replayCache = new ReplayCacheImpl( cache );
+        replayCache = new ReplayCacheImpl( config.getAllowableClockSkew() );
 
         for ( Transport transport : transports )
         {
diff --git a/protocol-kerberos/src/main/java/org/apache/directory/server/kerberos/kdc/KdcServer.java b/protocol-kerberos/src/main/java/org/apache/directory/server/kerberos/kdc/KdcServer.java
index e23488f..32a4924 100644
--- a/protocol-kerberos/src/main/java/org/apache/directory/server/kerberos/kdc/KdcServer.java
+++ b/protocol-kerberos/src/main/java/org/apache/directory/server/kerberos/kdc/KdcServer.java
@@ -39,7 +39,6 @@ import org.apache.mina.core.filterchain.IoFilterChainBuilder;
 import org.apache.mina.core.service.IoAcceptor;
 import org.apache.mina.filter.codec.ProtocolCodecFilter;
 import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
-import org.ehcache.Cache;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -110,9 +109,7 @@ public class KdcServer extends DirectoryBackedService
 
         LOG.debug( "initializing the kerberos replay cache" );
 
-        Cache< String, Object > cache = getDirectoryService().getCacheService().
-            getCache( "kdcReplayCache", String.class, Object.class );
-        replayCache = new ReplayCacheImpl( cache, config.getAllowableClockSkew() );
+        replayCache = new ReplayCacheImpl( config.getAllowableClockSkew() );
 
         // Kerberos can use UDP or TCP
         for ( Transport transport : transports )
diff --git a/server-config/src/main/java/org/apache/directory/server/config/ConfigPartitionInitializer.java b/server-config/src/main/java/org/apache/directory/server/config/ConfigPartitionInitializer.java
index 9299f1a..5d11a07 100644
--- a/server-config/src/main/java/org/apache/directory/server/config/ConfigPartitionInitializer.java
+++ b/server-config/src/main/java/org/apache/directory/server/config/ConfigPartitionInitializer.java
@@ -32,7 +32,6 @@ import org.apache.directory.api.ldap.model.name.Dn;
 import org.apache.directory.api.ldap.model.schema.SchemaManager;
 import org.apache.directory.api.util.DateUtils;
 import org.apache.directory.server.constants.ServerDNConstants;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.DnFactory;
 import org.apache.directory.server.core.api.InstanceLayout;
 import org.apache.directory.server.core.api.interceptor.context.AddOperationContext;
@@ -58,8 +57,6 @@ public class ConfigPartitionInitializer
 
     private DnFactory dnFactory;
 
-    private CacheService cacheService;
-
 
     /**
      * Creates a new instance of ConfigPartitionHelper.
@@ -69,12 +66,11 @@ public class ConfigPartitionInitializer
      * @param cacheService the cache service
      * @param schemaManager the schema manager
      */
-    public ConfigPartitionInitializer( InstanceLayout instanceLayout, DnFactory dnFactory, CacheService cacheService,
+    public ConfigPartitionInitializer( InstanceLayout instanceLayout, DnFactory dnFactory,
         SchemaManager schemaManager )
     {
         this.instanceLayout = instanceLayout;
         this.dnFactory = dnFactory;
-        this.cacheService = cacheService;
         this.schemaManager = schemaManager;
     }
 
@@ -94,7 +90,6 @@ public class ConfigPartitionInitializer
         configPartition.setPartitionPath( instanceLayout.getConfDirectory().toURI() );
         configPartition.setSuffixDn( new Dn( schemaManager, "ou=config" ) );
         configPartition.setSchemaManager( schemaManager );
-        configPartition.setCacheService( cacheService );
 
         File newConfigDir = new File( instanceLayout.getConfDirectory(), configPartition.getSuffixDn().getName() );
 
diff --git a/server-config/src/test/java/org/apache/directory/server/config/ChangePasswordConfigReaderTest.java b/server-config/src/test/java/org/apache/directory/server/config/ChangePasswordConfigReaderTest.java
index 411ed12..9b6e85c 100644
--- a/server-config/src/test/java/org/apache/directory/server/config/ChangePasswordConfigReaderTest.java
+++ b/server-config/src/test/java/org/apache/directory/server/config/ChangePasswordConfigReaderTest.java
@@ -37,7 +37,6 @@ import org.apache.directory.api.ldap.schema.manager.impl.DefaultSchemaManager;
 import org.apache.directory.api.util.exception.Exceptions;
 import org.apache.directory.server.config.beans.ChangePasswordServerBean;
 import org.apache.directory.server.config.beans.ConfigBean;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.DnFactory;
 import org.apache.directory.server.core.partition.ldif.SingleFileLdifPartition;
 import org.apache.directory.server.core.shared.DefaultDnFactory;
@@ -63,7 +62,6 @@ public class ChangePasswordConfigReaderTest
 
     private static SchemaManager schemaManager;
     private static DnFactory dnFactory;
-    private static CacheService cacheService;
 
 
     @BeforeClass
@@ -101,10 +99,7 @@ public class ChangePasswordConfigReaderTest
             throw new Exception( "Schema load failed : " + Exceptions.printErrors( errors ) );
         }
 
-        cacheService = new CacheService();
-        cacheService.initialize( null );
-        dnFactory = new DefaultDnFactory( schemaManager, 
-            cacheService.getCache( "dnCache", String.class, Dn.class ) );
+        dnFactory = new DefaultDnFactory( schemaManager, 100 );
     }
 
 
@@ -127,7 +122,6 @@ public class ChangePasswordConfigReaderTest
         configPartition.setSuffixDn( new Dn( schemaManager, "ou=config" ) );
         configPartition.setSchemaManager( schemaManager );
 
-        configPartition.setCacheService( cacheService );
         configPartition.initialize();
         ConfigPartitionReader cpReader = new ConfigPartitionReader( configPartition );
 
diff --git a/server-config/src/test/java/org/apache/directory/server/config/ConfigPartitionReaderTest.java b/server-config/src/test/java/org/apache/directory/server/config/ConfigPartitionReaderTest.java
index d076429..42cf73f 100644
--- a/server-config/src/test/java/org/apache/directory/server/config/ConfigPartitionReaderTest.java
+++ b/server-config/src/test/java/org/apache/directory/server/config/ConfigPartitionReaderTest.java
@@ -37,7 +37,6 @@ import org.apache.directory.api.ldap.schema.manager.impl.DefaultSchemaManager;
 import org.apache.directory.api.util.exception.Exceptions;
 import org.apache.directory.server.config.beans.ConfigBean;
 import org.apache.directory.server.config.beans.DirectoryServiceBean;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.DnFactory;
 import org.apache.directory.server.core.partition.ldif.SingleFileLdifPartition;
 import org.apache.directory.server.core.shared.DefaultDnFactory;
@@ -60,7 +59,6 @@ public class ConfigPartitionReaderTest
 {
     private static SchemaManager schemaManager;
     private static DnFactory dnFactory;
-    private static CacheService cacheService;
 
     private static File workDir = new File( System.getProperty( "java.io.tmpdir" ) + "/server-work" );
 
@@ -99,10 +97,7 @@ public class ConfigPartitionReaderTest
             throw new Exception( "Schema load failed : " + Exceptions.printErrors( errors ) );
         }
 
-        cacheService = new CacheService();
-        cacheService.initialize( null );
-        dnFactory = new DefaultDnFactory( schemaManager, 
-            cacheService.getCache( "dnCache", String.class, Dn.class ) );
+        dnFactory = new DefaultDnFactory( schemaManager, 100 );
     }
 
 
@@ -119,7 +114,6 @@ public class ConfigPartitionReaderTest
         configPartition.setSuffixDn( new Dn( schemaManager, "ou=config" ) );
         configPartition.setSchemaManager( schemaManager );
 
-        configPartition.setCacheService( cacheService );
         configPartition.initialize();
 
         ConfigPartitionReader cpReader = new ConfigPartitionReader( configPartition );
diff --git a/server-config/src/test/java/org/apache/directory/server/config/ConfigWriterTest.java b/server-config/src/test/java/org/apache/directory/server/config/ConfigWriterTest.java
index 76ac4aa..824c7be 100644
--- a/server-config/src/test/java/org/apache/directory/server/config/ConfigWriterTest.java
+++ b/server-config/src/test/java/org/apache/directory/server/config/ConfigWriterTest.java
@@ -44,7 +44,6 @@ import org.apache.directory.api.ldap.schema.loader.LdifSchemaLoader;
 import org.apache.directory.api.ldap.schema.manager.impl.DefaultSchemaManager;
 import org.apache.directory.api.util.exception.Exceptions;
 import org.apache.directory.server.config.beans.ConfigBean;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.DnFactory;
 import org.apache.directory.server.core.partition.ldif.SingleFileLdifPartition;
 import org.apache.directory.server.core.shared.DefaultDnFactory;
@@ -67,7 +66,6 @@ public class ConfigWriterTest
 {
     private static SchemaManager schemaManager;
     private static DnFactory dnFactory;
-    private static CacheService cacheService;
 
     private static File workDir = new File( System.getProperty( "java.io.tmpdir" ) + "/server-work" );
 
@@ -105,10 +103,7 @@ public class ConfigWriterTest
             throw new Exception( "Schema load failed : " + Exceptions.printErrors( errors ) );
         }
 
-        cacheService = new CacheService();
-        cacheService.initialize( null );
-        dnFactory = new DefaultDnFactory( schemaManager, 
-            cacheService.getCache( "dnCache", String.class, Dn.class ) );
+        dnFactory = new DefaultDnFactory( schemaManager, 100 );
     }
 
 
@@ -125,7 +120,6 @@ public class ConfigWriterTest
         configPartition.setPartitionPath( new File( configFile ).toURI() );
         configPartition.setSuffixDn( new Dn( schemaManager, "ou=config" ) );
         configPartition.setSchemaManager( schemaManager );
-        configPartition.setCacheService( cacheService );
         configPartition.initialize();
 
         // Reading the config partition
diff --git a/server-config/src/test/java/org/apache/directory/server/config/HttpServerConfigReaderTest.java b/server-config/src/test/java/org/apache/directory/server/config/HttpServerConfigReaderTest.java
index d8e42cd..a200c6b 100644
--- a/server-config/src/test/java/org/apache/directory/server/config/HttpServerConfigReaderTest.java
+++ b/server-config/src/test/java/org/apache/directory/server/config/HttpServerConfigReaderTest.java
@@ -37,7 +37,6 @@ import org.apache.directory.api.ldap.schema.manager.impl.DefaultSchemaManager;
 import org.apache.directory.api.util.exception.Exceptions;
 import org.apache.directory.server.config.beans.ConfigBean;
 import org.apache.directory.server.config.beans.HttpServerBean;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.DnFactory;
 import org.apache.directory.server.core.partition.ldif.SingleFileLdifPartition;
 import org.apache.directory.server.core.shared.DefaultDnFactory;
@@ -60,7 +59,6 @@ public class HttpServerConfigReaderTest
 {
     private static SchemaManager schemaManager;
     private static DnFactory dnFactory;
-    private static CacheService cacheService;
 
     private static File workDir = new File( System.getProperty( "java.io.tmpdir" ) + "/server-work" );
 
@@ -98,10 +96,7 @@ public class HttpServerConfigReaderTest
             throw new Exception( "Schema load failed : " + Exceptions.printErrors( errors ) );
         }
 
-        cacheService = new CacheService();
-        cacheService.initialize( null );
-        dnFactory = new DefaultDnFactory( schemaManager, 
-            cacheService.getCache( "dnCache", String.class, Dn.class ) );
+        dnFactory = new DefaultDnFactory( schemaManager, 100 );
     }
 
 
@@ -117,7 +112,6 @@ public class HttpServerConfigReaderTest
         configPartition.setSuffixDn( new Dn( schemaManager, "ou=config" ) );
         configPartition.setSchemaManager( schemaManager );
 
-        configPartition.setCacheService( cacheService );
         configPartition.initialize();
 
         ConfigPartitionReader cpReader = new ConfigPartitionReader( configPartition );
diff --git a/server-config/src/test/java/org/apache/directory/server/config/KerberosServerConfigReaderTest.java b/server-config/src/test/java/org/apache/directory/server/config/KerberosServerConfigReaderTest.java
index 5126011..41d42a2 100644
--- a/server-config/src/test/java/org/apache/directory/server/config/KerberosServerConfigReaderTest.java
+++ b/server-config/src/test/java/org/apache/directory/server/config/KerberosServerConfigReaderTest.java
@@ -37,7 +37,6 @@ import org.apache.directory.api.ldap.schema.manager.impl.DefaultSchemaManager;
 import org.apache.directory.api.util.exception.Exceptions;
 import org.apache.directory.server.config.beans.ConfigBean;
 import org.apache.directory.server.config.beans.KdcServerBean;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.DnFactory;
 import org.apache.directory.server.core.partition.ldif.SingleFileLdifPartition;
 import org.apache.directory.server.core.shared.DefaultDnFactory;
@@ -62,7 +61,6 @@ public class KerberosServerConfigReaderTest
 
     private static SchemaManager schemaManager;
     private static DnFactory dnFactory;
-    private static CacheService cacheService;
 
 
     @BeforeClass
@@ -99,10 +97,7 @@ public class KerberosServerConfigReaderTest
             throw new Exception( "Schema load failed : " + Exceptions.printErrors( errors ) );
         }
 
-        cacheService = new CacheService();
-        cacheService.initialize( null );
-        dnFactory = new DefaultDnFactory( schemaManager, 
-            cacheService.getCache( "dnCache", String.class, Dn.class ) );
+        dnFactory = new DefaultDnFactory( schemaManager, 100 );
     }
 
 
@@ -118,7 +113,6 @@ public class KerberosServerConfigReaderTest
         configPartition.setSuffixDn( new Dn( schemaManager, "ou=config" ) );
         configPartition.setSchemaManager( schemaManager );
 
-        configPartition.setCacheService( cacheService );
         configPartition.initialize();
         ConfigPartitionReader cpReader = new ConfigPartitionReader( configPartition );
 
diff --git a/server-config/src/test/java/org/apache/directory/server/config/LdapServerConfigReaderTest.java b/server-config/src/test/java/org/apache/directory/server/config/LdapServerConfigReaderTest.java
index 1c34942..e045079 100644
--- a/server-config/src/test/java/org/apache/directory/server/config/LdapServerConfigReaderTest.java
+++ b/server-config/src/test/java/org/apache/directory/server/config/LdapServerConfigReaderTest.java
@@ -37,7 +37,6 @@ import org.apache.directory.api.ldap.schema.manager.impl.DefaultSchemaManager;
 import org.apache.directory.api.util.exception.Exceptions;
 import org.apache.directory.server.config.beans.ConfigBean;
 import org.apache.directory.server.config.beans.LdapServerBean;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.DnFactory;
 import org.apache.directory.server.core.partition.ldif.SingleFileLdifPartition;
 import org.apache.directory.server.core.shared.DefaultDnFactory;
@@ -62,7 +61,6 @@ public class LdapServerConfigReaderTest
 
     private static SchemaManager schemaManager;
     private static DnFactory dnFactory;
-    private static CacheService cacheService;
 
 
     @BeforeClass
@@ -99,10 +97,7 @@ public class LdapServerConfigReaderTest
             throw new Exception( "Schema load failed : " + Exceptions.printErrors( errors ) );
         }
 
-        cacheService = new CacheService();
-        cacheService.initialize( null );
-        dnFactory = new DefaultDnFactory( schemaManager, 
-            cacheService.getCache( "dnCache", String.class, Dn.class ) );
+        dnFactory = new DefaultDnFactory( schemaManager, 100 );
     }
 
 
@@ -118,7 +113,6 @@ public class LdapServerConfigReaderTest
         configPartition.setSuffixDn( new Dn( schemaManager, "ou=config" ) );
         configPartition.setSchemaManager( schemaManager );
 
-        configPartition.setCacheService( cacheService );
         configPartition.initialize();
         ConfigPartitionReader cpReader = new ConfigPartitionReader( configPartition );
 
diff --git a/server-integ/src/test/java/org/apache/directory/server/replication/ClientInitialRefreshIT.java b/server-integ/src/test/java/org/apache/directory/server/replication/ClientInitialRefreshIT.java
index bb811f9..ec76d4c 100644
--- a/server-integ/src/test/java/org/apache/directory/server/replication/ClientInitialRefreshIT.java
+++ b/server-integ/src/test/java/org/apache/directory/server/replication/ClientInitialRefreshIT.java
@@ -277,7 +277,7 @@ public class ClientInitialRefreshIT
                     directoryService.setSchemaManager( schemaManager );
                     ( ( MockSyncReplConsumer ) syncreplClient ).init( directoryService );
                     
-                    directoryService.setDnFactory( new DefaultDnFactory( schemaManager, null ) );
+                    directoryService.setDnFactory( new DefaultDnFactory( schemaManager, 100 ) );
                     syncreplClient.connect( true );
                     syncreplClient.startSync();
                 }
diff --git a/service/src/main/java/org/apache/directory/server/ApacheDsService.java b/service/src/main/java/org/apache/directory/server/ApacheDsService.java
index 2ae1b46..000fad3 100644
--- a/service/src/main/java/org/apache/directory/server/ApacheDsService.java
+++ b/service/src/main/java/org/apache/directory/server/ApacheDsService.java
@@ -60,11 +60,11 @@ import org.apache.directory.server.config.ConfigPartitionInitializer;
 import org.apache.directory.server.config.beans.ConfigBean;
 import org.apache.directory.server.config.beans.DirectoryServiceBean;
 import org.apache.directory.server.config.beans.HttpServerBean;
+import org.apache.directory.server.config.beans.JdbmPartitionBean;
 import org.apache.directory.server.config.beans.LdapServerBean;
 import org.apache.directory.server.config.beans.NtpServerBean;
 import org.apache.directory.server.config.builder.ServiceBuilder;
 import org.apache.directory.server.config.listener.ConfigChangeListener;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.CoreSession;
 import org.apache.directory.server.core.api.DirectoryService;
 import org.apache.directory.server.core.api.DnFactory;
@@ -74,6 +74,7 @@ import org.apache.directory.server.core.api.event.NotificationCriteria;
 import org.apache.directory.server.core.api.interceptor.context.ModifyOperationContext;
 import org.apache.directory.server.core.api.partition.Partition;
 import org.apache.directory.server.core.api.schema.SchemaPartition;
+import org.apache.directory.server.core.partition.impl.btree.AbstractBTreePartition;
 import org.apache.directory.server.core.partition.ldif.LdifPartition;
 import org.apache.directory.server.core.shared.DefaultDnFactory;
 import org.apache.directory.server.i18n.I18n;
@@ -174,14 +175,10 @@ public class ApacheDsService
 
         LOG.info( "using partition dir {}", partitionsDir.getAbsolutePath() );
 
-        CacheService cacheService = new CacheService();
-        cacheService.initialize( instanceLayout );
-
         initSchemaManager( instanceLayout );
-        DnFactory dnFactory = new DefaultDnFactory( schemaManager, 
-            cacheService.getCache( "dnCache", String.class, Dn.class ) );
-        initSchemaLdifPartition( instanceLayout, dnFactory );
-        initConfigPartition( instanceLayout, dnFactory, cacheService );
+        DnFactory bootstrapDnFactory = new DefaultDnFactory( schemaManager, 100 );
+        initSchemaLdifPartition( instanceLayout, bootstrapDnFactory );
+        initConfigPartition( instanceLayout, bootstrapDnFactory );
 
         // Read the configuration
         ConfigPartitionReader cpReader = new ConfigPartitionReader( configPartition );
@@ -190,9 +187,20 @@ public class ApacheDsService
 
         DirectoryServiceBean directoryServiceBean = configBean.getDirectoryServiceBean();
 
+        /*
+         * Calculate the DN cache size: from all defined partitions get the max cache size setting.
+         * Note: currently only JDBM partition beans have such a setting.
+         */
+        int dnCacheSize = directoryServiceBean.getPartitions().stream()
+            .filter( JdbmPartitionBean.class::isInstance )
+            .map( JdbmPartitionBean.class::cast )
+            .map( JdbmPartitionBean::getPartitionCacheSize )
+            .mapToInt( Integer::intValue )
+            .max().orElse( AbstractBTreePartition.DEFAULT_CACHE_SIZE );
+        DnFactory dnFactory = new DefaultDnFactory( schemaManager, dnCacheSize );
+
         // Initialize the DirectoryService now
-        DirectoryService directoryService = initDirectoryService( instanceLayout, directoryServiceBean, cacheService,
-            dnFactory );
+        DirectoryService directoryService = initDirectoryService( instanceLayout, directoryServiceBean, dnFactory );
 
         // start the LDAP server
         startLdap( directoryServiceBean.getLdapServerBean(), directoryService, startServers );
@@ -323,17 +331,17 @@ public class ApacheDsService
      * @param cacheService the Cache service
      * @throws Exception in case of any issues while extracting the schema
      */
-    private void initConfigPartition( InstanceLayout instanceLayout, DnFactory dnFactory, CacheService cacheService )
+    private void initConfigPartition( InstanceLayout instanceLayout, DnFactory dnFactory )
         throws Exception
     {
         ConfigPartitionInitializer initializer = new ConfigPartitionInitializer( instanceLayout, dnFactory,
-            cacheService, schemaManager );
+            schemaManager );
         configPartition = initializer.initConfigPartition();
     }
 
 
     private DirectoryService initDirectoryService( InstanceLayout instanceLayout,
-        DirectoryServiceBean directoryServiceBean, CacheService cacheService, DnFactory dnFactory ) throws Exception
+        DirectoryServiceBean directoryServiceBean, DnFactory dnFactory ) throws Exception
     {
         LOG.info( "Initializing the DirectoryService..." );
 
@@ -355,8 +363,6 @@ public class ApacheDsService
         // Store the default directories
         directoryService.setInstanceLayout( instanceLayout );
 
-        directoryService.setCacheService( cacheService );
-
         directoryService.startup();
 
         AttributeType ocAt = directoryService.getAtProvider().getObjectClass();
diff --git a/xdbm-partition/pom.xml b/xdbm-partition/pom.xml
index 84c156a..cd97ace 100644
--- a/xdbm-partition/pom.xml
+++ b/xdbm-partition/pom.xml
@@ -121,8 +121,7 @@
             </Export-Package>
             <Import-Package>
                 javax.naming,
-                org.ehcache;version=${ehcache.version},
-                org.ehcache.config;version=${ehcache.version},
+                com.github.benmanes.caffeine.cache;bundle-version=${caffeine.version},
                 org.apache.directory.api.i18n;version=${org.apache.directory.api.version},
                 org.apache.directory.api.ldap.model.constants;version=${org.apache.directory.api.version},
                 org.apache.directory.api.ldap.model.cursor;version=${org.apache.directory.api.version},
diff --git a/xdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/AbstractBTreePartition.java b/xdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/AbstractBTreePartition.java
index 51fd374..5dcf74c 100644
--- a/xdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/AbstractBTreePartition.java
+++ b/xdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/AbstractBTreePartition.java
@@ -23,6 +23,7 @@ package org.apache.directory.server.core.partition.impl.btree;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.net.URI;
+import java.time.Duration;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -35,9 +36,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
-import org.ehcache.Cache;
-import org.ehcache.config.CacheConfiguration;
-
 import org.apache.directory.api.ldap.model.constants.SchemaConstants;
 import org.apache.directory.api.ldap.model.cursor.Cursor;
 import org.apache.directory.api.ldap.model.cursor.CursorException;
@@ -102,6 +100,9 @@ import org.apache.directory.server.xdbm.search.SearchEngine;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.github.benmanes.caffeine.cache.Cache;
+import com.github.benmanes.caffeine.cache.Caffeine;
+
 
 /**
  * An abstract {@link Partition} that uses general BTree operations.
@@ -129,10 +130,10 @@ public abstract class AbstractBTreePartition extends AbstractPartition implement
     protected int cacheSize = DEFAULT_CACHE_SIZE;
 
     /** The alias cache */
-    protected Cache< String, Dn > aliasCache;
+    protected Cache<String, Dn> aliasCache;
 
     /** The ParentIdAndRdn cache */
-    protected Cache< String, ParentIdAndRdn > piarCache;
+    protected Cache<String, ParentIdAndRdn> piarCache;
 
     /** true if we sync disks on every write operation */
     protected AtomicBoolean isSyncOnWrite = new AtomicBoolean( true );
@@ -539,8 +540,10 @@ public abstract class AbstractBTreePartition extends AbstractPartition implement
         // don't reset initialized flag
         initialized = false;
 
-        entryDnCache.clear();
-        
+        aliasCache.invalidateAll();
+        piarCache.invalidateAll();
+        entryDnCache.invalidateAll();
+
         MultiException errors = new MultiException( I18n.err( I18n.ERR_577 ) );
 
         for ( Index<?, String> index : userIndices.values() )
@@ -623,16 +626,14 @@ public abstract class AbstractBTreePartition extends AbstractPartition implement
         setupSystemIndices();
         setupUserIndices();
 
-        if ( cacheService != null )
-        {
-            aliasCache = cacheService.getCache( "alias", String.class, Dn.class );
-    
-            CacheConfiguration< String, Dn > aliasCacheConfig = aliasCache.getRuntimeConfiguration();
-            
-            piarCache = cacheService.getCache( "piar", String.class, ParentIdAndRdn.class );
-            
-            entryDnCache = cacheService.getCache( "entryDn", String.class, Dn.class );
-        }
+        aliasCache = Caffeine.newBuilder().maximumSize( cacheSize ).expireAfterAccess( Duration.ofMinutes( 20 ) )
+            .build();
+
+        piarCache = Caffeine.newBuilder().maximumSize( cacheSize * 3L )
+            .expireAfterAccess( Duration.ofMinutes( 20 ) ).build();
+
+        entryDnCache = Caffeine.newBuilder().maximumSize( cacheSize ).expireAfterAccess( Duration.ofMinutes( 20 ) )
+            .build();
     }
 
 
@@ -1138,7 +1139,7 @@ public abstract class AbstractBTreePartition extends AbstractPartition implement
 
                 ////dumpRdnIdx();
 
-                entryDnCache.remove( id );
+                entryDnCache.invalidate( id );
                 
                 Attribute csn = entry.get( entryCsnAT );
                 // can be null while doing subentry deletion
@@ -2009,7 +2010,7 @@ public abstract class AbstractBTreePartition extends AbstractPartition implement
         // Remove the EntryDN
         modifiedEntry.removeAttributes( entryDnAT );
 
-        entryDnCache.clear();
+        entryDnCache.invalidateAll();
         
         setContextCsn( modifiedEntry.get( entryCsnAT ).getString() );
 
@@ -2187,7 +2188,7 @@ public abstract class AbstractBTreePartition extends AbstractPartition implement
         modifiedEntry.add( ApacheSchemaConstants.ENTRY_PARENT_ID_OID, newParentId );
         
         // Doom the DN cache now
-        entryDnCache.clear();
+        entryDnCache.invalidateAll();
 
         setContextCsn( modifiedEntry.get( entryCsnAT ).getString() );
 
@@ -2519,7 +2520,7 @@ public abstract class AbstractBTreePartition extends AbstractPartition implement
 
         rdnIdx.add( partitionTxn, parentIdAndRdn, oldId );
 
-        entryDnCache.clear();
+        entryDnCache.invalidateAll();
         
         if ( isSyncOnWrite.get() )
         {
@@ -2617,7 +2618,7 @@ public abstract class AbstractBTreePartition extends AbstractPartition implement
 
             if ( entryDnCache != null )
             {
-                Dn cachedDn = entryDnCache.get( id );
+                Dn cachedDn = entryDnCache.getIfPresent( id );
                 
                 if ( cachedDn != null )
                 {
@@ -2631,7 +2632,7 @@ public abstract class AbstractBTreePartition extends AbstractPartition implement
             
                 if ( piarCache != null )
                 {
-                    cur = piarCache.get( parentId );
+                    cur = piarCache.getIfPresent( parentId );
                     
                     if ( cur == null )
                     {
@@ -3284,7 +3285,7 @@ public abstract class AbstractBTreePartition extends AbstractPartition implement
 
         if ( aliasCache != null )
         {
-            aliasCache.remove( aliasId );
+            aliasCache.invalidate( aliasId );
         }
     }
 
diff --git a/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/Store.java b/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/Store.java
index 595f4ab..31184e9 100644
--- a/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/Store.java
+++ b/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/Store.java
@@ -30,8 +30,6 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.locks.ReadWriteLock;
 
-import org.ehcache.Cache;
-
 import org.apache.directory.api.ldap.model.constants.SchemaConstants;
 import org.apache.directory.api.ldap.model.entry.Entry;
 import org.apache.directory.api.ldap.model.entry.Modification;
@@ -43,6 +41,8 @@ import org.apache.directory.server.constants.ApacheSchemaConstants;
 import org.apache.directory.server.core.api.interceptor.context.ModDnAva;
 import org.apache.directory.server.core.api.partition.PartitionTxn;
 
+import com.github.benmanes.caffeine.cache.Cache;
+
 
 /**
  * Represents an entry store based on the Table, Index, and MasterTable
diff --git a/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/search/evaluator/SubtreeScopeEvaluator.java b/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/search/evaluator/SubtreeScopeEvaluator.java
index 67f3bdf..e88aab6 100644
--- a/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/search/evaluator/SubtreeScopeEvaluator.java
+++ b/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/search/evaluator/SubtreeScopeEvaluator.java
@@ -175,7 +175,7 @@ public class SubtreeScopeEvaluator implements Evaluator<ScopeNode>
          */
         if ( db.getAliasCache() != null )
         {
-            Dn dn = db.getAliasCache().get( id );
+            Dn dn = db.getAliasCache().getIfPresent( id );
             
             if ( dn != null )
             {
diff --git a/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/search/impl/DefaultSearchEngine.java b/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/search/impl/DefaultSearchEngine.java
index 0918241..94ab6a4 100644
--- a/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/search/impl/DefaultSearchEngine.java
+++ b/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/search/impl/DefaultSearchEngine.java
@@ -155,7 +155,7 @@ public class DefaultSearchEngine implements SearchEngine
 
         if ( db.getAliasCache() != null )
         {
-            aliasedBase = db.getAliasCache().get( baseId );
+            aliasedBase = db.getAliasCache().getIfPresent( baseId );
         }
         else
         {
diff --git a/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/PartitionTest.java b/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/PartitionTest.java
index 11d8617..ac23382 100644
--- a/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/PartitionTest.java
+++ b/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/PartitionTest.java
@@ -54,7 +54,6 @@ import org.apache.directory.api.ldap.schema.loader.LdifSchemaLoader;
 import org.apache.directory.api.ldap.schema.manager.impl.DefaultSchemaManager;
 import org.apache.directory.api.util.exception.Exceptions;
 import org.apache.directory.server.constants.ApacheSchemaConstants;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.DnFactory;
 import org.apache.directory.server.core.api.interceptor.context.ModDnAva;
 import org.apache.directory.server.core.api.partition.PartitionTxn;
@@ -91,8 +90,6 @@ public class PartitionTest
     /** The CN AttributType instance */
     private static AttributeType CN_AT;
 
-    private static CacheService cacheService;
-
     @BeforeClass
     public static void setup() throws Exception
     {
@@ -110,8 +107,6 @@ public class PartitionTest
         extractor.extractOrCopy( true );
         LdifSchemaLoader loader = new LdifSchemaLoader( schemaRepository );
 
-        cacheService = new CacheService();
-        cacheService.initialize( null );
         schemaManager = new DefaultSchemaManager( loader );
 
         boolean loaded = schemaManager.loadAllEnabled();
@@ -142,7 +137,6 @@ public class PartitionTest
         partition.addIndex( new AvlIndex<String>( SchemaConstants.CN_AT_OID ) );
         partition.setSuffixDn( new Dn( schemaManager, "o=Good Times Co." ) );
 
-        partition.setCacheService( cacheService );
         partition.initialize();
 
         StoreUtils.loadExampleData( partition, schemaManager );
diff --git a/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/impl/avl/AvlPartitionTest.java b/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/impl/avl/AvlPartitionTest.java
index 2f03537..6ca7718 100644
--- a/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/impl/avl/AvlPartitionTest.java
+++ b/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/impl/avl/AvlPartitionTest.java
@@ -57,7 +57,6 @@ import org.apache.directory.api.ldap.schema.manager.impl.DefaultSchemaManager;
 import org.apache.directory.api.util.Strings;
 import org.apache.directory.api.util.exception.Exceptions;
 import org.apache.directory.server.constants.ApacheSchemaConstants;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.DnFactory;
 import org.apache.directory.server.core.api.entry.ClonedServerEntry;
 import org.apache.directory.server.core.api.interceptor.context.AddOperationContext;
@@ -101,7 +100,6 @@ public class AvlPartitionTest
     /** The ApacheAlias AttributeType instance */
     private static AttributeType APACHE_ALIAS_AT;
 
-    private static CacheService cacheService;
     private PartitionTxn txn;
 
 
@@ -123,10 +121,7 @@ public class AvlPartitionTest
         LdifSchemaLoader loader = new LdifSchemaLoader( schemaRepository );
 
         schemaManager = new DefaultSchemaManager( loader );
-        cacheService = new CacheService();
-        cacheService.initialize( null );
-        dnFactory = new DefaultDnFactory( schemaManager, 
-            cacheService.getCache( "dnCache", String.class, Dn.class ) );
+        dnFactory = new DefaultDnFactory( schemaManager, 100 );
 
         boolean loaded = schemaManager.loadAllEnabled();
 
@@ -158,7 +153,6 @@ public class AvlPartitionTest
         partition.addIndex( new AvlIndex<String>( SchemaConstants.UID_AT_OID ) );
         partition.setSuffixDn( new Dn( schemaManager, "o=Good Times Co." ) );
 
-        partition.setCacheService( cacheService );
         partition.initialize();
 
         StoreUtils.loadExampleData( partition, schemaManager );
diff --git a/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/AndCursorTest.java b/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/AndCursorTest.java
index 8ebc3b4..1c501d7 100644
--- a/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/AndCursorTest.java
+++ b/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/AndCursorTest.java
@@ -42,7 +42,6 @@ import org.apache.directory.api.ldap.schema.loader.LdifSchemaLoader;
 import org.apache.directory.api.ldap.schema.manager.impl.DefaultSchemaManager;
 import org.apache.directory.api.util.Strings;
 import org.apache.directory.api.util.exception.Exceptions;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.LdapPrincipal;
 import org.apache.directory.server.core.api.MockCoreSession;
 import org.apache.directory.server.core.api.MockDirectoryService;
@@ -70,7 +69,6 @@ public class AndCursorTest extends AbstractCursorTest
     private static final Logger LOG = LoggerFactory.getLogger( AndCursorTest.class );
 
     File wkdir;
-    private static CacheService cacheService;
 
 
     @BeforeClass
@@ -105,9 +103,6 @@ public class AndCursorTest extends AbstractCursorTest
         {
             fail( "Schema load failed : " + Exceptions.printErrors( schemaManager.getErrors() ) );
         }
-
-        cacheService = new CacheService();
-        cacheService.initialize( null );
     }
 
 
@@ -134,7 +129,6 @@ public class AndCursorTest extends AbstractCursorTest
         store.addIndex( new AvlIndex<String>( SchemaConstants.OU_AT_OID ) );
         store.addIndex( new AvlIndex<String>( SchemaConstants.CN_AT_OID ) );
         ( ( Partition ) store ).setSuffixDn( new Dn( schemaManager, "o=Good Times Co." ) );
-        ( ( Partition ) store ).setCacheService( cacheService );
         ( ( Partition ) store ).initialize();
 
         StoreUtils.loadExampleData( store, schemaManager );
diff --git a/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/EqualityTest.java b/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/EqualityTest.java
index b737b5a..45c03a0 100644
--- a/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/EqualityTest.java
+++ b/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/EqualityTest.java
@@ -46,7 +46,6 @@ import org.apache.directory.api.ldap.schema.loader.LdifSchemaLoader;
 import org.apache.directory.api.ldap.schema.manager.impl.DefaultSchemaManager;
 import org.apache.directory.api.util.Strings;
 import org.apache.directory.api.util.exception.Exceptions;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.DnFactory;
 import org.apache.directory.server.core.api.partition.Partition;
 import org.apache.directory.server.core.api.partition.PartitionTxn;
@@ -81,7 +80,6 @@ public class EqualityTest
     Store store;
     static SchemaManager schemaManager = null;
     private static DnFactory dnFactory;
-    private static CacheService cacheService;
 
 
     @BeforeClass
@@ -116,10 +114,7 @@ public class EqualityTest
             fail( "Schema load failed : " + Exceptions.printErrors( schemaManager.getErrors() ) );
         }
 
-        cacheService = new CacheService();
-        cacheService.initialize( null );
-        dnFactory = new DefaultDnFactory( schemaManager, 
-            cacheService.getCache( "dnCache", String.class, Dn.class ) );
+        dnFactory = new DefaultDnFactory( schemaManager, 100 );
     }
 
 
@@ -144,7 +139,6 @@ public class EqualityTest
         store.addIndex( new AvlIndex<String>( SchemaConstants.OU_AT_OID ) );
         store.addIndex( new AvlIndex<String>( SchemaConstants.CN_AT_OID ) );
         ( ( Partition ) store ).setSuffixDn( new Dn( schemaManager, "o=Good Times Co." ) );
-        ( ( Partition ) store ).setCacheService( cacheService );
         ( ( Partition ) store ).initialize();
 
         StoreUtils.loadExampleData( store, schemaManager );
diff --git a/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/GreaterEqNotIndexedTest.java b/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/GreaterEqNotIndexedTest.java
index de81f9d..646f445 100644
--- a/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/GreaterEqNotIndexedTest.java
+++ b/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/GreaterEqNotIndexedTest.java
@@ -56,7 +56,6 @@ import org.apache.directory.api.ldap.schema.loader.LdifSchemaLoader;
 import org.apache.directory.api.ldap.schema.manager.impl.DefaultSchemaManager;
 import org.apache.directory.api.util.Strings;
 import org.apache.directory.api.util.exception.Exceptions;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.DnFactory;
 import org.apache.directory.server.core.api.interceptor.context.AddOperationContext;
 import org.apache.directory.server.core.api.partition.Partition;
@@ -90,7 +89,6 @@ public class GreaterEqNotIndexedTest
     Store store;
     static SchemaManager schemaManager = null;
     private static DnFactory dnFactory;
-    private static CacheService cacheService;
 
 
     @BeforeClass
@@ -126,10 +124,7 @@ public class GreaterEqNotIndexedTest
             fail( "Schema load failed : " + Exceptions.printErrors( schemaManager.getErrors() ) );
         }
 
-        cacheService = new CacheService();
-        cacheService.initialize( null );
-        dnFactory = new DefaultDnFactory( schemaManager, 
-            cacheService.getCache( "dnCache", String.class, Dn.class ) );
+        dnFactory = new DefaultDnFactory( schemaManager, 100 );
     }
 
 
@@ -154,7 +149,6 @@ public class GreaterEqNotIndexedTest
         store.addIndex( new AvlIndex<String>( SchemaConstants.OU_AT_OID ) );
         store.addIndex( new AvlIndex<String>( SchemaConstants.CN_AT_OID ) );
         ( ( Partition ) store ).setSuffixDn( new Dn( schemaManager, "o=Good Times Co." ) );
-        ( ( Partition ) store ).setCacheService( cacheService );
         ( ( Partition ) store ).initialize();
 
         StoreUtils.loadExampleData( store, schemaManager );
diff --git a/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/GreaterEqTest.java b/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/GreaterEqTest.java
index d2d7bd9..067cace 100644
--- a/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/GreaterEqTest.java
+++ b/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/GreaterEqTest.java
@@ -56,7 +56,6 @@ import org.apache.directory.api.ldap.schema.loader.LdifSchemaLoader;
 import org.apache.directory.api.ldap.schema.manager.impl.DefaultSchemaManager;
 import org.apache.directory.api.util.Strings;
 import org.apache.directory.api.util.exception.Exceptions;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.DnFactory;
 import org.apache.directory.server.core.api.interceptor.context.AddOperationContext;
 import org.apache.directory.server.core.api.partition.Partition;
@@ -90,7 +89,6 @@ public class GreaterEqTest
     Store store;
     static SchemaManager schemaManager = null;
     private static DnFactory dnFactory;
-    private static CacheService cacheService;
 
     @BeforeClass
     public static void setup() throws Exception
@@ -125,11 +123,7 @@ public class GreaterEqTest
             fail( "Schema load failed : " + Exceptions.printErrors( schemaManager.getErrors() ) );
         }
 
-        cacheService = new CacheService();
-        cacheService.initialize( null );
-        dnFactory = new DefaultDnFactory( schemaManager, 
-            cacheService.getCache( "dnCache", String.class, Dn.class ) );
-
+        dnFactory = new DefaultDnFactory( schemaManager, 100 );
     }
 
 
@@ -155,7 +149,6 @@ public class GreaterEqTest
         store.addIndex( new AvlIndex<String>( SchemaConstants.CN_AT_OID ) );
         store.addIndex( new AvlIndex<String>( StoreUtils.TEST_INT_OID ) );
         ( ( Partition ) store ).setSuffixDn( new Dn( schemaManager, "o=Good Times Co." ) );
-        ( ( Partition ) store ).setCacheService( cacheService );
         ( ( Partition ) store ).initialize();
 
         StoreUtils.loadExampleData( store, schemaManager );
diff --git a/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/LessEqTest.java b/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/LessEqTest.java
index 8e418ff..25d6bd5 100644
--- a/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/LessEqTest.java
+++ b/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/LessEqTest.java
@@ -56,7 +56,6 @@ import org.apache.directory.api.ldap.schema.loader.LdifSchemaLoader;
 import org.apache.directory.api.ldap.schema.manager.impl.DefaultSchemaManager;
 import org.apache.directory.api.util.Strings;
 import org.apache.directory.api.util.exception.Exceptions;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.DnFactory;
 import org.apache.directory.server.core.api.interceptor.context.AddOperationContext;
 import org.apache.directory.server.core.api.partition.Partition;
@@ -90,7 +89,6 @@ public class LessEqTest
     Store store;
     static SchemaManager schemaManager = null;
     private static DnFactory dnFactory;
-    private static CacheService cacheService;
 
 
     @BeforeClass
@@ -126,11 +124,7 @@ public class LessEqTest
             fail( "Schema load failed : " + Exceptions.printErrors( schemaManager.getErrors() ) );
         }
 
-        cacheService = new CacheService();
-        cacheService.initialize( null );
-        dnFactory = new DefaultDnFactory( schemaManager, 
-            cacheService.getCache( "dnCache", String.class, Dn.class ) );
-
+        dnFactory = new DefaultDnFactory( schemaManager, 100 );
     }
 
 
@@ -156,7 +150,6 @@ public class LessEqTest
         store.addIndex( new AvlIndex<String>( SchemaConstants.CN_AT_OID ) );
         store.addIndex( new AvlIndex<String>( StoreUtils.TEST_INT_OID ) );
         ( ( Partition ) store ).setSuffixDn( new Dn( schemaManager, "o=Good Times Co." ) );
-        ( ( Partition ) store ).setCacheService( cacheService );
         ( ( Partition ) store ).initialize();
 
         StoreUtils.loadExampleData( store, schemaManager );
diff --git a/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/NestedFilterTest.java b/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/NestedFilterTest.java
index c7fe920..8550662 100644
--- a/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/NestedFilterTest.java
+++ b/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/NestedFilterTest.java
@@ -46,7 +46,6 @@ import org.apache.directory.api.ldap.schema.loader.LdifSchemaLoader;
 import org.apache.directory.api.ldap.schema.manager.impl.DefaultSchemaManager;
 import org.apache.directory.api.util.Strings;
 import org.apache.directory.api.util.exception.Exceptions;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.LdapPrincipal;
 import org.apache.directory.server.core.api.MockCoreSession;
 import org.apache.directory.server.core.api.MockDirectoryService;
@@ -78,7 +77,6 @@ public class NestedFilterTest extends AbstractCursorTest
     static SchemaManager schemaManager = null;
     Optimizer optimizer;
     static FilterNormalizingVisitor visitor;
-    private static CacheService cacheService;
 
 
     @BeforeClass
@@ -117,8 +115,6 @@ public class NestedFilterTest extends AbstractCursorTest
         NameComponentNormalizer ncn = new ConcreteNameComponentNormalizer( schemaManager );
         visitor = new FilterNormalizingVisitor( ncn, schemaManager );
 
-        cacheService = new CacheService();
-        cacheService.initialize( null );
     }
 
 
@@ -145,7 +141,6 @@ public class NestedFilterTest extends AbstractCursorTest
         store.addIndex( new AvlIndex<String>( SchemaConstants.OU_AT_OID ) );
         store.addIndex( new AvlIndex<String>( SchemaConstants.CN_AT_OID ) );
         ( ( Partition ) store ).setSuffixDn( new Dn( schemaManager, "o=Good Times Co." ) );
-        ( ( Partition ) store ).setCacheService( cacheService );
         ( ( Partition ) store ).initialize();
 
         StoreUtils.loadExampleData( store, schemaManager );
diff --git a/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/NotCursorTest.java b/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/NotCursorTest.java
index 7de3926..5555d6d 100644
--- a/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/NotCursorTest.java
+++ b/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/NotCursorTest.java
@@ -47,7 +47,6 @@ import org.apache.directory.api.ldap.schema.loader.LdifSchemaLoader;
 import org.apache.directory.api.ldap.schema.manager.impl.DefaultSchemaManager;
 import org.apache.directory.api.util.Strings;
 import org.apache.directory.api.util.exception.Exceptions;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.LdapPrincipal;
 import org.apache.directory.server.core.api.MockCoreSession;
 import org.apache.directory.server.core.api.MockDirectoryService;
@@ -83,7 +82,6 @@ public class NotCursorTest extends AbstractCursorTest
 
     File wkdir;
     static SchemaManager schemaManager = null;
-    private static CacheService cacheService;
 
 
     @BeforeClass
@@ -119,8 +117,6 @@ public class NotCursorTest extends AbstractCursorTest
             fail( "Schema load failed : " + Exceptions.printErrors( schemaManager.getErrors() ) );
         }
 
-        cacheService = new CacheService();
-        cacheService.initialize( null );
     }
 
 
@@ -147,7 +143,6 @@ public class NotCursorTest extends AbstractCursorTest
         store.addIndex( new AvlIndex<String>( SchemaConstants.OU_AT_OID ) );
         store.addIndex( new AvlIndex<String>( SchemaConstants.CN_AT_OID ) );
         ( ( Partition ) store ).setSuffixDn( new Dn( schemaManager, "o=Good Times Co." ) );
-        ( ( Partition ) store ).setCacheService( cacheService );
         ( ( Partition ) store ).initialize();
 
         StoreUtils.loadExampleData( store, schemaManager );
diff --git a/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/OrCursorTest.java b/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/OrCursorTest.java
index 57e1954..4a73ace 100644
--- a/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/OrCursorTest.java
+++ b/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/OrCursorTest.java
@@ -47,7 +47,6 @@ import org.apache.directory.api.ldap.schema.loader.LdifSchemaLoader;
 import org.apache.directory.api.ldap.schema.manager.impl.DefaultSchemaManager;
 import org.apache.directory.api.util.Strings;
 import org.apache.directory.api.util.exception.Exceptions;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.LdapPrincipal;
 import org.apache.directory.server.core.api.MockCoreSession;
 import org.apache.directory.server.core.api.MockDirectoryService;
@@ -86,7 +85,6 @@ public class OrCursorTest extends AbstractCursorTest
 
     File wkdir;
     static SchemaManager schemaManager = null;
-    private static CacheService cacheService;
 
 
     @BeforeClass
@@ -121,8 +119,6 @@ public class OrCursorTest extends AbstractCursorTest
             fail( "Schema load failed : " + Exceptions.printErrors( schemaManager.getErrors() ) );
         }
 
-        cacheService = new CacheService();
-        cacheService.initialize( null );
     }
 
 
@@ -149,7 +145,6 @@ public class OrCursorTest extends AbstractCursorTest
         store.addIndex( new AvlIndex<String>( SchemaConstants.OU_AT_OID ) );
         store.addIndex( new AvlIndex<String>( SchemaConstants.CN_AT_OID ) );
         ( ( Partition ) store ).setSuffixDn( new Dn( schemaManager, "o=Good Times Co." ) );
-        ( ( Partition ) store ).setCacheService( cacheService );
         ( ( Partition ) store ).initialize();
 
         StoreUtils.loadExampleData( store, schemaManager );
diff --git a/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/PresenceTest.java b/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/PresenceTest.java
index 4cc8132..76bd447 100644
--- a/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/PresenceTest.java
+++ b/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/PresenceTest.java
@@ -44,7 +44,6 @@ import org.apache.directory.api.ldap.schema.manager.impl.DefaultSchemaManager;
 import org.apache.directory.api.util.Strings;
 import org.apache.directory.api.util.exception.Exceptions;
 import org.apache.directory.server.constants.ApacheSchemaConstants;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.DnFactory;
 import org.apache.directory.server.core.api.partition.Partition;
 import org.apache.directory.server.core.api.partition.PartitionTxn;
@@ -77,7 +76,6 @@ public class PresenceTest
     Store store;
     static SchemaManager schemaManager = null;
     private static DnFactory dnFactory;
-    private static CacheService cacheService;
     private static String NORMALIZED_CN_OID;
 
 
@@ -113,13 +111,10 @@ public class PresenceTest
             fail( "Schema load failed : " + Exceptions.printErrors( schemaManager.getErrors() ) );
         }
 
-        cacheService = new CacheService();
-        cacheService.initialize( null );
-        dnFactory = new DefaultDnFactory( schemaManager, 
-            cacheService.getCache( "dnCache", String.class, Dn.class ) );
+        dnFactory = new DefaultDnFactory( schemaManager, 100 );
 
-        
-        NORMALIZED_CN_OID = schemaManager.getAttributeType( ApacheSchemaConstants.APACHE_PRESENCE_AT ).getEquality().getNormalizer().normalize( SchemaConstants.CN_AT_OID );
+        NORMALIZED_CN_OID = schemaManager.getAttributeType( ApacheSchemaConstants.APACHE_PRESENCE_AT ).getEquality()
+            .getNormalizer().normalize( SchemaConstants.CN_AT_OID );
     }
 
 
@@ -144,7 +139,6 @@ public class PresenceTest
         store.addIndex( new AvlIndex<String>( SchemaConstants.OU_AT_OID, false ) );
         store.addIndex( new AvlIndex<String>( SchemaConstants.CN_AT_OID, false ) );
         ( ( Partition ) store ).setSuffixDn( new Dn( schemaManager, "o=Good Times Co." ) );
-        ( ( Partition ) store ).setCacheService( cacheService );
         ( ( Partition ) store ).initialize();
 
         ( ( Partition ) store ).initialize();
diff --git a/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/SubstringTest.java b/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/SubstringTest.java
index d9ad172..aed33e6 100644
--- a/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/SubstringTest.java
+++ b/xdbm-partition/src/test/java/org/apache/directory/server/xdbm/search/impl/SubstringTest.java
@@ -39,7 +39,6 @@ import org.apache.directory.api.ldap.schema.loader.LdifSchemaLoader;
 import org.apache.directory.api.ldap.schema.manager.impl.DefaultSchemaManager;
 import org.apache.directory.api.util.Strings;
 import org.apache.directory.api.util.exception.Exceptions;
-import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.DnFactory;
 import org.apache.directory.server.core.api.partition.Partition;
 import org.apache.directory.server.core.api.partition.PartitionTxn;
@@ -72,7 +71,6 @@ public class SubstringTest
     Store store;
     static SchemaManager schemaManager = null;
     private static DnFactory dnFactory;
-    private static CacheService cacheService;
 
 
     @BeforeClass
@@ -107,11 +105,7 @@ public class SubstringTest
             fail( "Schema load failed : " + Exceptions.printErrors( schemaManager.getErrors() ) );
         }
 
-        cacheService = new CacheService();
-        cacheService.initialize( null );
-        dnFactory = new DefaultDnFactory( schemaManager, 
-            cacheService.getCache( "dnCache", String.class, Dn.class ) );
-
+        dnFactory = new DefaultDnFactory( schemaManager, 100 );
     }
 
 
@@ -139,7 +133,6 @@ public class SubstringTest
         Dn suffixDn = new Dn( schemaManager, "o=Good Times Co." );
         ( ( Partition ) store ).setSuffixDn( suffixDn );
 
-        ( ( Partition ) store ).setCacheService( cacheService );
         ( ( Partition ) store ).initialize();
 
         StoreUtils.loadExampleData( store, schemaManager );