diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/AbstractDiskCache.java b/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/AbstractDiskCache.java
index 9533171..f9a8fc2 100644
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/AbstractDiskCache.java
+++ b/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/AbstractDiskCache.java
@@ -25,6 +25,9 @@
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 import org.apache.commons.jcs.auxiliary.AbstractAuxiliaryCacheEventLogging;
@@ -41,7 +44,7 @@
 import org.apache.commons.jcs.engine.stats.Stats;
 import org.apache.commons.jcs.engine.stats.behavior.IStatElement;
 import org.apache.commons.jcs.engine.stats.behavior.IStats;
-import org.apache.commons.jcs.utils.struct.LRUMap;
+import org.apache.commons.jcs.utils.clhm.ConcurrentLinkedHashMap;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -74,7 +77,7 @@
      * If the elements are pulled into the memory cache while the are still in purgatory, writing to
      * disk can be canceled.
      */
-    private Map<K, PurgatoryElement<K, V>> purgatory;
+    private ConcurrentMap<K, PurgatoryElement<K, V>> purgatory;
 
     /**
      * The CacheEventQueue where changes will be queued for asynchronous updating of the persistent
@@ -86,13 +89,13 @@
      * Indicates whether the cache is 'alive': initialized, but not yet disposed. Child classes must
      * set this to true.
      */
-    private boolean alive = false;
+    private final AtomicBoolean alive = new AtomicBoolean(false);
 
     /** Every cache will have a name, subclasses must set this when they are initialized. */
     private String cacheName;
 
     /** DEBUG: Keeps a count of the number of purgatory hits for debug messages */
-    private int purgHits = 0;
+    private final AtomicLong purgHits = new AtomicLong(0);
 
     /**
      * We lock here, so that we cannot get an update after a remove all. an individual removal locks
@@ -115,7 +118,8 @@
 
         // create queue
         CacheEventQueueFactory<K, V> fact = new CacheEventQueueFactory<K, V>();
-        this.cacheEventQueue = fact.createCacheEventQueue( new MyCacheListener(), CacheInfo.listenerId, cacheName,
+        this.cacheEventQueue = fact.createCacheEventQueue( new MyCacheListener(), CacheInfo.listenerId,
+                                                           cacheName,
                                                            diskCacheAttributes.getEventQueuePoolName(),
                                                            diskCacheAttributes.getEventQueueType() );
 
@@ -128,7 +132,7 @@
      */
     public boolean isAlive()
     {
-        return alive;
+        return alive.get();
     }
 
     /**
@@ -136,7 +140,7 @@
      */
     public void setAlive(boolean alive)
     {
-        this.alive = alive;
+        this.alive.set(alive);
     }
 
     /**
@@ -155,17 +159,16 @@
 
         try
         {
-            synchronized (this)
+            long maxPurgatorySize = Long.MAX_VALUE;
+
+            if ( diskCacheAttributes.getMaxPurgatorySize() >= 0 )
             {
-                if ( diskCacheAttributes.getMaxPurgatorySize() >= 0 )
-                {
-                    purgatory = new LRUMap<K, PurgatoryElement<K, V>>( diskCacheAttributes.getMaxPurgatorySize() );
-                }
-                else
-                {
-                    purgatory = new HashMap<K, PurgatoryElement<K, V>>();
-                }
+                maxPurgatorySize = diskCacheAttributes.getMaxPurgatorySize();
             }
+
+            purgatory = new ConcurrentLinkedHashMap.Builder<K, PurgatoryElement<K, V>>()
+                    .maximumWeightedCapacity(maxPurgatorySize) // key count
+                    .build();
         }
         finally
         {
@@ -206,10 +209,7 @@
             pe.setSpoolable( true );
 
             // Add the element to purgatory
-            synchronized ( purgatory )
-            {
-                purgatory.put( pe.getKey(), pe );
-            }
+            purgatory.put( pe.getKey(), pe );
 
             // Queue element for serialization
             cacheEventQueue.addPutEvent( pe );
@@ -234,8 +234,7 @@
     public final ICacheElement<K, V> get( K key )
     {
         // If not alive, always return null.
-
-        if ( !alive )
+        if ( !isAlive() )
         {
             if ( log.isDebugEnabled() )
             {
@@ -244,20 +243,16 @@
             return null;
         }
 
-        PurgatoryElement<K, V> pe = null;
-        synchronized ( purgatory )
-        {
-            pe = purgatory.get( key );
-        }
+        PurgatoryElement<K, V> pe = purgatory.get( key );
 
         // If the element was found in purgatory
         if ( pe != null )
         {
-            purgHits++;
+            purgHits.incrementAndGet();
 
             if ( log.isDebugEnabled() )
             {
-                if ( purgHits % 100 == 0 )
+                if ( purgHits.get() % 100 == 0 )
                 {
                     log.debug( "Purgatory hits = " + purgHits );
                 }
@@ -290,7 +285,7 @@
         {
             return doGet( key );
         }
-        catch ( Exception e )
+        catch ( IOException e )
         {
             log.error( e );
 
@@ -319,14 +314,7 @@
         throws IOException
     {
         // Get the keys from purgatory
-        Set<K> keyArray = null;
-
-        // this avoids locking purgatory, but it uses more memory
-        synchronized ( purgatory )
-        {
-            keyArray = new HashSet<K>(purgatory.keySet());
-        }
-
+        Set<K> keyArray = new HashSet<K>(purgatory.keySet());
         Set<K> matchingKeys = getKeyMatcher().getMatchingKeysFromArray( pattern, keyArray );
 
         // call getMultiple with the set
@@ -388,23 +376,15 @@
     public final boolean remove( K key )
         throws IOException
     {
-        PurgatoryElement<K, V> pe = null;
-
-        synchronized ( purgatory )
-        {
-            // I'm getting the object, so I can lock on the element
-            // Remove element from purgatory if it is there
-            pe = purgatory.get( key );
-        }
+        // I'm getting the object, so I can lock on the element
+        // Remove element from purgatory if it is there
+        PurgatoryElement<K, V> pe = purgatory.get( key );
 
         if ( pe != null )
         {
             synchronized ( pe.getCacheElement() )
             {
-                synchronized ( purgatory )
-                {
-                    purgatory.remove( key );
-                }
+                purgatory.remove( key );
 
                 // no way to remove from queue, just make sure it doesn't get on
                 // disk and then removed right afterwards
@@ -433,8 +413,7 @@
     {
         if ( this.diskCacheAttributes.isAllowRemoveAll() )
         {
-            // Replace purgatory with a new empty hashtable
-            initPurgatory();
+            purgatory.clear();
 
             // Remove all from persistent store immediately
             doRemoveAll();
@@ -510,7 +489,7 @@
         // need to handle the disposal first.
         doDispose();
 
-        alive = false;
+        alive.set(false);
     }
 
     /**
@@ -547,7 +526,7 @@
 
         ArrayList<IStatElement<?>> elems = new ArrayList<IStatElement<?>>();
 
-        elems.add(new StatElement<Integer>( "Purgatory Hits", Integer.valueOf(purgHits) ) );
+        elems.add(new StatElement<AtomicLong>( "Purgatory Hits", purgHits ) );
         elems.add(new StatElement<Integer>( "Purgatory Size", Integer.valueOf(purgatory.size()) ) );
 
         // get the stats from the event queue too
@@ -566,7 +545,7 @@
     @Override
     public CacheStatus getStatus()
     {
-        return ( alive ? CacheStatus.ALIVE : CacheStatus.DISPOSED );
+        return ( isAlive() ? CacheStatus.ALIVE : CacheStatus.DISPOSED );
     }
 
     /**
@@ -635,7 +614,7 @@
         public void handlePut( ICacheElement<K, V> element )
             throws IOException
         {
-            if ( alive )
+            if ( isAlive() )
             {
                 // If the element is a PurgatoryElement<K, V> we must check to see
                 // if it is still spoolable, and remove it from purgatory.
@@ -654,19 +633,15 @@
                         try
                         {
                             // TODO consider changing purgatory sync
-                            // String keyAsString = element.getKey().toString();
-                            synchronized ( purgatory )
+                            // If the element has already been removed from
+                            // purgatory do nothing
+                            if ( !purgatory.containsKey( pe.getKey() ) )
                             {
-                                // If the element has already been removed from
-                                // purgatory do nothing
-                                if ( !purgatory.containsKey( pe.getKey() ) )
-                                {
-                                    return;
-                                }
-
-                                element = pe.getCacheElement();
+                                return;
                             }
 
+                            element = pe.getCacheElement();
+
                             // I took this out of the purgatory sync block.
                             // If the element is still eligible, spool it.
                             if ( pe.isSpoolable() )
@@ -679,12 +654,9 @@
                             removeAllLock.readLock().unlock();
                         }
 
-                        synchronized ( purgatory )
-                        {
-                            // After the update has completed, it is safe to
-                            // remove the element from purgatory.
-                            purgatory.remove( element.getKey() );
-                        }
+                        // After the update has completed, it is safe to
+                        // remove the element from purgatory.
+                        purgatory.remove( element.getKey() );
                     }
                 }
                 else
@@ -701,10 +673,7 @@
                  * done before it went in the queue. This block handles the case where the disk
                  * cache fails during normal operations.
                  */
-                synchronized ( purgatory )
-                {
-                    purgatory.remove( element.getKey() );
-                }
+                purgatory.remove( element.getKey() );
             }
         }
 
@@ -718,7 +687,7 @@
         public void handleRemove( String cacheName, K key )
             throws IOException
         {
-            if ( alive )
+            if ( isAlive() )
             {
                 if ( doRemove( key ) )
                 {
@@ -736,7 +705,7 @@
         public void handleRemoveAll( String cacheName )
             throws IOException
         {
-            if ( alive )
+            if ( isAlive() )
             {
                 doRemoveAll();
             }
@@ -751,7 +720,7 @@
         public void handleDispose( String cacheName )
             throws IOException
         {
-            if ( alive )
+            if ( isAlive() )
             {
                 doDispose();
             }
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/PurgatoryElement.java b/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/PurgatoryElement.java
index db257bd..de562b9 100644
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/PurgatoryElement.java
+++ b/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/PurgatoryElement.java
@@ -21,11 +21,10 @@
 
 import org.apache.commons.jcs.engine.CacheElement;
 import org.apache.commons.jcs.engine.behavior.ICacheElement;
-import org.apache.commons.jcs.engine.behavior.IElementAttributes;
 
 /**
  * Implementation of cache elements in purgatory.
- * 
+ *
  * Elements are stored in purgatory when they are spooled to the auxiliary cache, but have not yet
  * been written to disk.
  */
@@ -38,12 +37,9 @@
     /** Is the element ready to be spooled? */
     private boolean spoolable = false;
 
-    /** Wrapped cache Element */
-    private ICacheElement<K, V> cacheElement;
-
     /**
      * Constructor for the PurgatoryElement&lt;K, V&gt; object
-     * 
+     *
      * @param cacheElement CacheElement
      */
     public PurgatoryElement( ICacheElement<K, V> cacheElement )
@@ -51,12 +47,11 @@
         super(cacheElement.getCacheName(),
                 cacheElement.getKey(), cacheElement.getVal(),
                 cacheElement.getElementAttributes());
-        this.cacheElement = cacheElement;
     }
 
     /**
      * Gets the spoolable property.
-     * 
+     *
      * @return The spoolable value
      */
     public boolean isSpoolable()
@@ -66,7 +61,7 @@
 
     /**
      * Sets the spoolable property.
-     * 
+     *
      * @param spoolable The new spoolable value
      */
     public void setSpoolable( boolean spoolable )
@@ -76,67 +71,17 @@
 
     /**
      * Get the wrapped cache element.
-     * 
+     *
      * @return ICacheElement
      */
     public ICacheElement<K, V> getCacheElement()
     {
-        return cacheElement;
+        return this;
     }
 
     // ------------------------------------------------ interface ICacheElement
 
     /**
-     * @return cacheElement.getCacheName();
-     * @see ICacheElement#getCacheName
-     */
-    @Override
-    public String getCacheName()
-    {
-        return cacheElement.getCacheName();
-    }
-
-    /**
-     * @return cacheElement.getKey();
-     * @see ICacheElement#getKey
-     */
-    @Override
-    public K getKey()
-    {
-        return cacheElement.getKey();
-    }
-
-    /**
-     * @return cacheElement.getVal();
-     * @see ICacheElement#getVal
-     */
-    @Override
-    public V getVal()
-    {
-        return cacheElement.getVal();
-    }
-
-    /**
-     * @return cacheElement.getElementAttributes();
-     * @see ICacheElement#getElementAttributes
-     */
-    @Override
-    public IElementAttributes getElementAttributes()
-    {
-        return cacheElement.getElementAttributes();
-    }
-
-    /**
-     * @param attr
-     * @see ICacheElement#setElementAttributes
-     */
-    @Override
-    public void setElementAttributes( IElementAttributes attr )
-    {
-        cacheElement.setElementAttributes( attr );
-    }
-
-    /**
      * @return debug string
      */
     @Override
@@ -145,7 +90,7 @@
         StringBuilder buf = new StringBuilder();
         buf.append( "[PurgatoryElement: " );
         buf.append( " isSpoolable = " + isSpoolable() );
-        buf.append( " CacheElement = " + getCacheElement() );
+        buf.append( " CacheElement = " + super.toString() );
         buf.append( " CacheName = " + getCacheName() );
         buf.append( " Key = " + getKey() );
         buf.append( " Value = " + getVal() );
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDisk.java b/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDisk.java
index 261026a..96acb60 100644
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDisk.java
+++ b/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDisk.java
@@ -50,9 +50,6 @@
     public static final byte HEADER_SIZE_BYTES = 4;
     // N.B. 4 bytes is the size used for ByteBuffer.putInt(int value) and ByteBuffer.getInt()
 
-    /** defaults to 4kb */
-    private static final int DEFAULT_BLOCK_SIZE_BYTES = 4 * 1024;
-
     /** Size of the blocks */
     private final int blockSizeBytes;
 
@@ -90,7 +87,7 @@
     public BlockDisk( File file, IElementSerializer elementSerializer )
         throws IOException
     {
-        this( file, DEFAULT_BLOCK_SIZE_BYTES, elementSerializer );
+        this( file, BlockDiskCacheAttributes.DEFAULT_BLOCK_SIZE_BYTES, elementSerializer );
     }
 
     /**
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDiskCache.java b/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDiskCache.java
index 707571b..8594469 100644
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDiskCache.java
+++ b/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDiskCache.java
@@ -21,11 +21,9 @@
 
 import java.io.File;
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -44,7 +42,6 @@
 import org.apache.commons.jcs.engine.control.group.GroupAttrName;
 import org.apache.commons.jcs.engine.control.group.GroupId;
 import org.apache.commons.jcs.engine.stats.StatElement;
-import org.apache.commons.jcs.engine.stats.Stats;
 import org.apache.commons.jcs.engine.stats.behavior.IStatElement;
 import org.apache.commons.jcs.engine.stats.behavior.IStats;
 import org.apache.commons.logging.Log;
@@ -128,17 +125,9 @@
 
         try
         {
-            if ( this.blockDiskCacheAttributes.getBlockSizeBytes() > 0 )
-            {
-                this.dataFile = new BlockDisk( new File( rootDirectory, fileName + ".data" ),
-                                               this.blockDiskCacheAttributes.getBlockSizeBytes(),
-                                               getElementSerializer() );
-            }
-            else
-            {
-                this.dataFile = new BlockDisk( new File( rootDirectory, fileName + ".data" ),
-                                               getElementSerializer() );
-            }
+            this.dataFile = new BlockDisk( new File( rootDirectory, fileName + ".data" ),
+                                           this.blockDiskCacheAttributes.getBlockSizeBytes(),
+                                           getElementSerializer() );
 
             keyStore = new BlockDiskKeyStore<K>( this.blockDiskCacheAttributes, this );
 
@@ -206,11 +195,14 @@
         {
             int maxToTest = 100;
             int count = 0;
-            Iterator<Map.Entry<K, int[]>> it = this.keyStore.entrySet().iterator();
-            while ( it.hasNext() && count < maxToTest )
+            for (Map.Entry<K, int[]> entry : this.keyStore.entrySet())
             {
+                if (count >= maxToTest)
+                {
+                    break;
+                }
+
                 count++;
-                Map.Entry<K, int[]> entry = it.next();
                 Object data = this.dataFile.read( entry.getValue() );
                 if ( data == null )
                 {
@@ -296,7 +288,6 @@
     /**
      * Returns the number of keys.
      * <p>
-     * (non-Javadoc)
      * @see org.apache.commons.jcs.auxiliary.disk.AbstractDiskCache#getSize()
      */
     @Override
@@ -308,9 +299,11 @@
     /**
      * Gets the ICacheElement&lt;K, V&gt; for the key if it is in the cache. The program flow is as follows:
      * <ol>
-     * <li>Make sure the disk cache is alive.</li> <li>Get a read lock.</li> <li>See if the key is
-     * in the key store.</li> <li>If we found a key, ask the BlockDisk for the object at the
-     * blocks..</li> <li>Release the lock.</li>
+     * <li>Make sure the disk cache is alive.</li>
+     * <li>Get a read lock.</li>
+     * <li>See if the key is in the key store.</li>
+     * <li>If we found a key, ask the BlockDisk for the object at the blocks..</li>
+     * <li>Release the lock.</li>
      * </ol>
      * @param key
      * @return ICacheElement
@@ -335,17 +328,19 @@
 
         ICacheElement<K, V> object = null;
 
-
         try
         {
             storageLock.readLock().lock();
-            try {
+            try
+            {
                 int[] ded = this.keyStore.get( key );
                 if ( ded != null )
                 {
                     object = this.dataFile.read( ded );
                 }
-            } finally {
+            }
+            finally
+            {
                 storageLock.readLock().unlock();
             }
 
@@ -365,12 +360,14 @@
     /**
      * Writes an element to disk. The program flow is as follows:
      * <ol>
-     * <li>Acquire write lock.</li> <li>See id an item exists for this key.</li> <li>If an item
-     * already exists, add its blocks to the remove list.</li> <li>Have the Block disk write the
-     * item.</li> <li>Create a descriptor and add it to the key map.</li> <li>Release the write
-     * lock.</li>
+     * <li>Acquire write lock.</li>
+     * <li>See id an item exists for this key.</li>
+     * <li>If an item already exists, add its blocks to the remove list.</li>
+     * <li>Have the Block disk write the item.</li>
+     * <li>Create a descriptor and add it to the key map.</li>
+     * <li>Release the write lock.</li>
      * </ol>
-     * @param element
+     * @param element the cache element to write
      * @see org.apache.commons.jcs.auxiliary.disk.AbstractDiskCache#update(ICacheElement)
      */
     @Override
@@ -443,7 +440,6 @@
             return false;
         }
 
-        boolean reset = false;
         boolean removed = false;
 
         storageLock.writeLock().lock();
@@ -463,21 +459,11 @@
                 removed = performSingleKeyRemoval(key);
             }
         }
-        catch ( Exception e )
-        {
-            log.error( logCacheName + "Problem removing element.", e );
-            reset = true;
-        }
         finally
         {
             storageLock.writeLock().unlock();
         }
 
-        if ( reset )
-        {
-            reset();
-        }
-
         return removed;
     }
 
@@ -559,7 +545,8 @@
     }
 
 
-	private boolean performSingleKeyRemoval(K key) {
+	private boolean performSingleKeyRemoval(K key)
+	{
 		boolean removed;
 		// remove single item.
 		int[] ded = this.keyStore.remove( key );
@@ -740,10 +727,11 @@
     @Override
     public IStats getStatistics()
     {
-        IStats stats = new Stats();
+        // get the stats from the super too
+        IStats stats = super.getStatistics();
         stats.setTypeName( "Block Disk Cache" );
 
-        ArrayList<IStatElement<?>> elems = new ArrayList<IStatElement<?>>();
+        List<IStatElement<?>> elems = stats.getStatElements();
 
         elems.add(new StatElement<Boolean>( "Is Alive", Boolean.valueOf(isAlive()) ) );
         elems.add(new StatElement<Integer>( "Key Map Size", Integer.valueOf(this.keyStore.size()) ) );
@@ -769,10 +757,6 @@
                     Integer.valueOf(this.dataFile.getEmptyBlocks()) ) );
         }
 
-        // get the stats from the super too
-        IStats sStats = super.getStatistics();
-        elems.addAll(sStats.getStatElements());
-
         stats.setStatElements( elems );
 
         return stats;
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDiskCacheAttributes.java b/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDiskCacheAttributes.java
index e520dda..9728d25 100644
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDiskCacheAttributes.java
+++ b/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDiskCacheAttributes.java
@@ -32,17 +32,20 @@
     /** Don't change */
     private static final long serialVersionUID = 6568840097657265989L;
 
+    /** Defaults to 4kb */
+    public static final int DEFAULT_BLOCK_SIZE_BYTES = 4 * 1024;
+
     /** The size per block in bytes. */
-    private int blockSizeBytes;
+    private int blockSizeBytes = DEFAULT_BLOCK_SIZE_BYTES;
 
     /** Maximum number of keys to be kept in memory */
-    private static final int DEFAULT_MAX_KEY_SIZE = 5000;
+    public static final int DEFAULT_MAX_KEY_SIZE = 5000;
 
     /** -1 means no limit. */
     private int maxKeySize = DEFAULT_MAX_KEY_SIZE;
 
     /** How often should we persist the keys. */
-    private static final long DEFAULT_KEY_PERSISTENCE_INTERVAL_SECONDS = 5 * 60;
+    public static final long DEFAULT_KEY_PERSISTENCE_INTERVAL_SECONDS = 5 * 60;
 
     /** The keys will be persisted at this interval.  -1 mean never. */
     private long keyPersistenceIntervalSeconds = DEFAULT_KEY_PERSISTENCE_INTERVAL_SECONDS;
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDiskKeyStore.java b/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDiskKeyStore.java
index d41f92d..ebeddff 100644
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDiskKeyStore.java
+++ b/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDiskKeyStore.java
@@ -34,12 +34,12 @@
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.TreeMap;
-import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.commons.jcs.auxiliary.disk.behavior.IDiskCacheAttributes.DiskLimitType;
 import org.apache.commons.jcs.io.ObjectInputStreamClassLoaderAware;
-import org.apache.commons.jcs.utils.struct.AbstractLRUMap;
-import org.apache.commons.jcs.utils.struct.LRUMap;
+import org.apache.commons.jcs.utils.clhm.ConcurrentLinkedHashMap;
+import org.apache.commons.jcs.utils.clhm.EntryWeigher;
+import org.apache.commons.jcs.utils.clhm.EvictionListener;
 import org.apache.commons.jcs.utils.timing.ElapsedTimer;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -216,13 +216,50 @@
         keyHash = null;
         if (maxKeySize >= 0)
         {
+            EvictionListener<K, int[]> listener = new EvictionListener<K, int[]>()
+            {
+                @Override public void onEviction(K key, int[] value)
+                {
+                    blockDiskCache.freeBlocks(value);
+                    if (log.isDebugEnabled())
+                    {
+                        log.debug(logCacheName + "Removing key: [" + key + "] from key store.");
+                        log.debug(logCacheName + "Key store size: [" + keyHash.size() + "].");
+                    }
+                }
+            };
+
             if (this.diskLimitType == DiskLimitType.SIZE)
             {
-                keyHash = new LRUMapSizeLimited(maxKeySize);
+                EntryWeigher<K, int[]> sizeWeigher = new EntryWeigher<K, int[]>()
+                {
+                    @Override
+                    public int weightOf(K key, int[] value)
+                    {
+                        int size = value != null ? value.length * blockSize : 1;
+
+                        if (size == 0)
+                        {
+                            return 1;
+                        }
+                        else
+                        {
+                            return size;
+                        }
+                    }
+                };
+                keyHash = new ConcurrentLinkedHashMap.Builder<K, int[]>()
+                        .maximumWeightedCapacity(maxKeySize * 1024L) // kB
+                        .weigher(sizeWeigher)
+                        .listener(listener)
+                        .build();
             }
             else
             {
-                keyHash = new LRUMapCountLimited(maxKeySize);
+                keyHash = new ConcurrentLinkedHashMap.Builder<K, int[]>()
+                        .maximumWeightedCapacity(maxKeySize) // count
+                        .listener(listener)
+                        .build();
             }
             if (log.isInfoEnabled())
             {
@@ -233,8 +270,9 @@
         {
             // If no max size, use a plain map for memory and processing
             // efficiency.
-            keyHash = new HashMap<K, int[]>();
-            // keyHash = Collections.synchronizedMap( new HashMap() );
+            keyHash = new ConcurrentLinkedHashMap.Builder<K, int[]>()
+                    .maximumWeightedCapacity(Long.MAX_VALUE) // count
+                    .build();
             if (log.isInfoEnabled())
             {
                 log.info(logCacheName + "Set maxKeySize to unlimited'");
@@ -423,162 +461,4 @@
             return ok;
         }
     }
-
-    /**
-     * Class for recycling and lru. This implements the LRU size overflow
-     * callback, so we can mark the blocks as free.
-     */
-    public class LRUMapSizeLimited extends AbstractLRUMap<K, int[]>
-    {
-        /**
-         * <code>tag</code> tells us which map we are working on.
-         */
-        public final static String TAG = "orig-lru-size";
-
-        // size of the content in kB
-        private AtomicInteger contentSize;
-        private int maxSize;
-
-        /**
-         * Default
-         */
-        public LRUMapSizeLimited()
-        {
-            this(-1);
-        }
-
-        /**
-         * @param maxSize
-         *            maximum cache size in kB
-         */
-        public LRUMapSizeLimited(int maxSize)
-        {
-            super();
-            this.maxSize = maxSize;
-            this.contentSize = new AtomicInteger(0);
-        }
-
-        // keep the content size in kB, so 2^31 kB is reasonable value
-        private void subLengthFromCacheSize(int[] value)
-        {
-            contentSize.addAndGet(value.length * blockSize / -1024 - 1);
-        }
-
-        // keep the content size in kB, so 2^31 kB is reasonable value
-        private void addLengthToCacheSize(int[] value)
-        {
-            contentSize.addAndGet(value.length * blockSize / 1024 + 1);
-        }
-
-        @Override
-        public int[] put(K key, int[] value)
-        {
-            int[] oldValue = null;
-
-            try
-            {
-                oldValue = super.put(key, value);
-            }
-            finally
-            {
-                if (value != null)
-                {
-                    addLengthToCacheSize(value);
-                }
-                if (oldValue != null)
-                {
-                    subLengthFromCacheSize(oldValue);
-                }
-            }
-
-            return oldValue;
-        }
-
-        @Override
-        public int[] remove(Object key)
-        {
-            int[] value = null;
-
-            try
-            {
-                value = super.remove(key);
-                return value;
-            }
-            finally
-            {
-                if (value != null)
-                {
-                    subLengthFromCacheSize(value);
-                }
-            }
-        }
-
-        /**
-         * This is called when the may key size is reached. The least recently
-         * used item will be passed here. We will store the position and size of
-         * the spot on disk in the recycle bin.
-         * <p>
-         *
-         * @param key
-         * @param value
-         */
-        @Override
-        protected void processRemovedLRU(K key, int[] value)
-        {
-            blockDiskCache.freeBlocks(value);
-            if (log.isDebugEnabled())
-            {
-                log.debug(logCacheName + "Removing key: [" + key + "] from key store.");
-                log.debug(logCacheName + "Key store size: [" + super.size() + "].");
-            }
-
-            if (value != null)
-            {
-                subLengthFromCacheSize(value);
-            }
-        }
-
-        @Override
-        protected boolean shouldRemove()
-        {
-            return maxSize > 0 && contentSize.get() > maxSize && this.size() > 1;
-        }
-    }
-
-    /**
-     * Class for recycling and lru. This implements the LRU overflow callback,
-     * so we can mark the blocks as free.
-     */
-    public class LRUMapCountLimited extends LRUMap<K, int[]>
-    {
-        /**
-         * <code>tag</code> tells us which map we are working on.
-         */
-        public final static String TAG = "orig-lru-count";
-
-        public LRUMapCountLimited(int maxKeySize)
-        {
-            super(maxKeySize);
-        }
-
-        /**
-         * This is called when the may key size is reached. The least recently
-         * used item will be passed here. We will store the position and size of
-         * the spot on disk in the recycle bin.
-         * <p>
-         *
-         * @param key
-         * @param value
-         */
-        @Override
-        protected void processRemovedLRU(K key, int[] value)
-        {
-            blockDiskCache.freeBlocks(value);
-            if (log.isDebugEnabled())
-            {
-                log.debug(logCacheName + "Removing key: [" + key + "] from key store.");
-                log.debug(logCacheName + "Key store size: [" + super.size() + "].");
-            }
-        }
-    }
 }
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/indexed/IndexedDiskCache.java b/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/indexed/IndexedDiskCache.java
index 30a82d3..b3d6782 100644
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/indexed/IndexedDiskCache.java
+++ b/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/disk/indexed/IndexedDiskCache.java
@@ -48,11 +48,11 @@
 import org.apache.commons.jcs.engine.logging.behavior.ICacheEvent;
 import org.apache.commons.jcs.engine.logging.behavior.ICacheEventLogger;
 import org.apache.commons.jcs.engine.stats.StatElement;
-import org.apache.commons.jcs.engine.stats.Stats;
 import org.apache.commons.jcs.engine.stats.behavior.IStatElement;
 import org.apache.commons.jcs.engine.stats.behavior.IStats;
-import org.apache.commons.jcs.utils.struct.AbstractLRUMap;
-import org.apache.commons.jcs.utils.struct.LRUMap;
+import org.apache.commons.jcs.utils.clhm.ConcurrentLinkedHashMap;
+import org.apache.commons.jcs.utils.clhm.EntryWeigher;
+import org.apache.commons.jcs.utils.clhm.EvictionListener;
 import org.apache.commons.jcs.utils.timing.ElapsedTimer;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -994,13 +994,51 @@
         keyHash = null;
         if (maxKeySize >= 0)
         {
-            if (this.diskLimitType == DiskLimitType.COUNT)
+            EvictionListener<K, IndexedDiskElementDescriptor> listener = new EvictionListener<K, IndexedDiskElementDescriptor>()
             {
-                keyHash = new LRUMapCountLimited(maxKeySize);
+                @Override
+                public void onEviction(K key, IndexedDiskElementDescriptor value)
+                {
+                    addToRecycleBin(value);
+                    if (log.isDebugEnabled())
+                    {
+                        log.debug(logCacheName + "Removing key: [" + key + "] from key store.");
+                        log.debug(logCacheName + "Key store size: [" + keyHash.size() + "].");
+                    }
+
+                    doOptimizeRealTime();
+                }
+            };
+
+            if (this.diskLimitType == DiskLimitType.SIZE)
+            {
+                EntryWeigher<K, IndexedDiskElementDescriptor> sizeWeigher = new EntryWeigher<K, IndexedDiskElementDescriptor>()
+                {
+                    @Override
+                    public int weightOf(K key, IndexedDiskElementDescriptor value)
+                    {
+                        if (value != null)
+                        {
+                            return value.len + IndexedDisk.HEADER_SIZE_BYTES;
+                        }
+                        else
+                        {
+                            return 1;
+                        }
+                    }
+                };
+                keyHash = new ConcurrentLinkedHashMap.Builder<K, IndexedDiskElementDescriptor>()
+                        .maximumWeightedCapacity(maxKeySize * 1024L) // kB
+                        .weigher(sizeWeigher)
+                        .listener(listener)
+                        .build();
             }
             else
             {
-                keyHash = new LRUMapSizeLimited(maxKeySize);
+                keyHash = new ConcurrentLinkedHashMap.Builder<K, IndexedDiskElementDescriptor>()
+                        .maximumWeightedCapacity(maxKeySize) // key count
+                        .listener(listener)
+                        .build();
             }
 
             if (log.isInfoEnabled())
@@ -1011,8 +1049,9 @@
         else
         {
             // If no max size, use a plain map for memory and processing efficiency.
-            keyHash = new HashMap<K, IndexedDiskElementDescriptor>();
-            // keyHash = Collections.synchronizedMap( new HashMap() );
+            keyHash = new ConcurrentLinkedHashMap.Builder<K, IndexedDiskElementDescriptor>()
+                    .maximumWeightedCapacity(Long.MAX_VALUE) // unlimited key count
+                    .build();
             if (log.isInfoEnabled())
             {
                 log.info(logCacheName + "Set maxKeySize to unlimited'");
@@ -1540,7 +1579,8 @@
     @Override
     public synchronized IStats getStatistics()
     {
-        IStats stats = new Stats();
+        // get the stats from the super too
+        IStats stats = super.getStatistics();
         stats.setTypeName("Indexed Disk Cache");
 
         ArrayList<IStatElement<?>> elems = new ArrayList<IStatElement<?>>();
@@ -1549,8 +1589,8 @@
         elems.add(new StatElement<Integer>("Key Map Size", Integer.valueOf(this.keyHash != null ? this.keyHash.size() : -1)));
         try
         {
-            elems
-                .add(new StatElement<Long>("Data File Length", Long.valueOf(this.dataFile != null ? this.dataFile.length() : -1L)));
+            elems.add(new StatElement<Long>("Data File Length",
+                Long.valueOf(this.dataFile != null ? this.dataFile.length() : -1L)));
         }
         catch (IOException e)
         {
@@ -1565,10 +1605,6 @@
         elems.add(new StatElement<Integer>("Recycle Bin Size", Integer.valueOf(this.recycle.size())));
         elems.add(new StatElement<Integer>("Startup Size", Integer.valueOf(this.startupSize)));
 
-        // get the stats from the super too
-        IStats sStats = super.getStatistics();
-        elems.addAll(sStats.getStatElements());
-
         stats.setStatElements(elems);
 
         return stats;
@@ -1629,162 +1665,4 @@
             }
         }
     }
-
-    /**
-     * Class for recycling and lru. This implements the LRU overflow callback, so we can add items
-     * to the recycle bin. This class counts the size element to decide, when to throw away an element
-     */
-    public class LRUMapSizeLimited extends AbstractLRUMap<K, IndexedDiskElementDescriptor>
-    {
-        /**
-         * <code>tag</code> tells us which map we are working on.
-         */
-        public static final String TAG = "orig";
-
-        // size of the content in kB
-        private AtomicInteger contentSize;
-        private int maxSize;
-
-        /**
-         * Default
-         */
-        public LRUMapSizeLimited()
-        {
-            this(-1);
-        }
-
-        /**
-         * @param maxKeySize
-         */
-        public LRUMapSizeLimited(int maxKeySize)
-        {
-            super();
-            this.maxSize = maxKeySize;
-            this.contentSize = new AtomicInteger(0);
-        }
-
-        // keep the content size in kB, so 2^31 kB is reasonable value
-        private void subLengthFromCacheSize(IndexedDiskElementDescriptor value)
-        {
-            contentSize.addAndGet((value.len + IndexedDisk.HEADER_SIZE_BYTES) / -1024 - 1);
-        }
-
-        // keep the content size in kB, so 2^31 kB is reasonable value
-        private void addLengthToCacheSize(IndexedDiskElementDescriptor value)
-        {
-            contentSize.addAndGet((value.len + IndexedDisk.HEADER_SIZE_BYTES) / 1024 + 1);
-        }
-
-        @Override
-        public IndexedDiskElementDescriptor put(K key, IndexedDiskElementDescriptor value)
-        {
-            IndexedDiskElementDescriptor oldValue = null;
-
-            try
-            {
-                oldValue = super.put(key, value);
-            }
-            finally
-            {
-                // keep the content size in kB, so 2^31 kB is reasonable value
-                if (value != null)
-                {
-                    addLengthToCacheSize(value);
-                }
-                if (oldValue != null)
-                {
-                    subLengthFromCacheSize(oldValue);
-                }
-            }
-
-            return oldValue;
-        }
-
-        @Override
-        public IndexedDiskElementDescriptor remove(Object key)
-        {
-            IndexedDiskElementDescriptor value = null;
-
-            try
-            {
-                value = super.remove(key);
-                return value;
-            }
-            finally
-            {
-                if (value != null)
-                {
-                    subLengthFromCacheSize(value);
-                }
-            }
-        }
-
-        /**
-         * This is called when the may key size is reached. The least recently used item will be
-         * passed here. We will store the position and size of the spot on disk in the recycle bin.
-         * <p>
-         *
-         * @param key
-         * @param value
-         */
-        @Override
-        protected void processRemovedLRU(K key, IndexedDiskElementDescriptor value)
-        {
-            if (value != null)
-            {
-                subLengthFromCacheSize(value);
-            }
-
-            addToRecycleBin(value);
-
-            if (log.isDebugEnabled())
-            {
-                log.debug(logCacheName + "Removing key: [" + key + "] from key store.");
-                log.debug(logCacheName + "Key store size: [" + this.size() + "].");
-            }
-
-            doOptimizeRealTime();
-        }
-
-        @Override
-        protected boolean shouldRemove()
-        {
-            return maxSize > 0 && contentSize.get() > maxSize && this.size() > 0;
-        }
-    }
-
-    /**
-     * Class for recycling and lru. This implements the LRU overflow callback, so we can add items
-     * to the recycle bin. This class counts the elements to decide, when to throw away an element
-     */
-
-    public class LRUMapCountLimited extends LRUMap<K, IndexedDiskElementDescriptor>
-    // implements Serializable
-    {
-        public LRUMapCountLimited(int maxKeySize)
-        {
-            super(maxKeySize);
-        }
-
-        /**
-         * This is called when the may key size is reached. The least recently used item will be
-         * passed here. We will store the position and size of the spot on disk in the recycle bin.
-         * <p>
-         *
-         * @param key
-         * @param value
-         */
-        @Override
-        protected void processRemovedLRU(K key, IndexedDiskElementDescriptor value)
-        {
-            addToRecycleBin(value);
-            if (log.isDebugEnabled())
-            {
-                log.debug(logCacheName + "Removing key: [" + key + "] from key store.");
-                log.debug(logCacheName + "Key store size: [" + this.size() + "].");
-            }
-
-            doOptimizeRealTime();
-        }
-    }
 }
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/control/CompositeCache.java b/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/control/CompositeCache.java
index f1a8c8a..0875d38 100644
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/control/CompositeCache.java
+++ b/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/control/CompositeCache.java
@@ -24,13 +24,16 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.commons.jcs.access.exception.CacheException;
 import org.apache.commons.jcs.access.exception.ObjectNotFoundException;
@@ -81,8 +84,8 @@
     private IElementEventQueue elementEventQ;
 
     /** Auxiliary caches. */
-    @SuppressWarnings("unchecked") // OK because this is an empty array
-    private AuxiliaryCache<K, V>[] auxCaches = new AuxiliaryCache[0];
+    private CopyOnWriteArrayList<AuxiliaryCache<K, V>> auxCaches =
+            new CopyOnWriteArrayList<AuxiliaryCache<K, V>>();
 
     /** is this alive? */
     private AtomicBoolean alive;
@@ -94,22 +97,22 @@
     private ICompositeCacheAttributes cacheAttr;
 
     /** How many times update was called. */
-    private AtomicInteger updateCount;
+    private AtomicLong updateCount;
 
     /** How many times remove was called. */
-    private AtomicInteger removeCount;
+    private AtomicLong removeCount;
 
     /** Memory cache hit count */
-    private AtomicInteger hitCountRam;
+    private AtomicLong hitCountRam;
 
     /** Auxiliary cache hit count (number of times found in ANY auxiliary) */
-    private AtomicInteger hitCountAux;
+    private AtomicLong hitCountAux;
 
     /** Count of misses where element was not found. */
-    private AtomicInteger missCountNotFound;
+    private AtomicLong missCountNotFound;
 
     /** Count of misses where element was expired. */
-    private AtomicInteger missCountExpired;
+    private AtomicLong missCountExpired;
 
     /**
      * The cache hub can only have one memory cache. This could be made more flexible in the future,
@@ -133,12 +136,12 @@
         this.attr = attr;
         this.cacheAttr = cattr;
         this.alive = new AtomicBoolean(true);
-        this.updateCount = new AtomicInteger(0);
-        this.removeCount = new AtomicInteger(0);
-        this.hitCountRam = new AtomicInteger(0);
-        this.hitCountAux = new AtomicInteger(0);
-        this.missCountNotFound = new AtomicInteger(0);
-        this.missCountExpired = new AtomicInteger(0);
+        this.updateCount = new AtomicLong(0);
+        this.removeCount = new AtomicLong(0);
+        this.hitCountRam = new AtomicLong(0);
+        this.hitCountAux = new AtomicLong(0);
+        this.missCountNotFound = new AtomicLong(0);
+        this.missCountExpired = new AtomicLong(0);
 
         createMemoryCache( cattr );
 
@@ -177,9 +180,20 @@
      * <p>
      * @param auxCaches
      */
+    @Deprecated
     public void setAuxCaches( AuxiliaryCache<K, V>[] auxCaches )
     {
-        this.auxCaches = auxCaches;
+        this.auxCaches = new CopyOnWriteArrayList<AuxiliaryCache<K,V>>(auxCaches);
+    }
+
+    /**
+     * This sets the list of auxiliary caches for this region.
+     * <p>
+     * @param auxCaches
+     */
+    public void setAuxCaches( List<? extends AuxiliaryCache<K, V>> auxCaches )
+    {
+        this.auxCaches = new CopyOnWriteArrayList<AuxiliaryCache<K,V>>(auxCaches);
     }
 
     /**
@@ -187,8 +201,20 @@
      * <p>
      * @return an array of auxiliary caches, may be empty, never null
      */
+    @SuppressWarnings("unchecked") // no generic arrays in Java
+    @Deprecated
     public AuxiliaryCache<K, V>[] getAuxCaches()
     {
+        return auxCaches.toArray( new AuxiliaryCache[0] );
+    }
+
+    /**
+     * Get the list of auxiliary caches for this region.
+     * <p>
+     * @return a list of auxiliary caches, may be empty, never null
+     */
+    public List<AuxiliaryCache<K, V>> getAuxCachesAsList()
+    {
         return this.auxCaches;
     }
 
@@ -247,11 +273,8 @@
 
         updateCount.incrementAndGet();
 
-        synchronized ( this )
-        {
-            memCache.update( cacheElement );
-            updateAuxiliaries( cacheElement, localOnly );
-        }
+        memCache.update( cacheElement );
+        updateAuxiliaries( cacheElement, localOnly );
 
         cacheElement.getElementAttributes().setLastAccessTimeNow();
     }
@@ -283,13 +306,13 @@
         // The types would describe the purpose.
         if ( log.isDebugEnabled() )
         {
-            if ( auxCaches.length > 0 )
+            if ( auxCaches.isEmpty() )
             {
-                log.debug( "Updating auxiliary caches" );
+                log.debug( "No auxiliary cache to update" );
             }
             else
             {
-                log.debug( "No auxiliary cache to update" );
+                log.debug( "Updating auxiliary caches" );
             }
         }
 
@@ -496,116 +519,113 @@
             log.debug( "get: key = " + key + ", localOnly = " + localOnly );
         }
 
-        synchronized (this)
+        try
         {
-            try
+            // First look in memory cache
+            element = memCache.get( key );
+
+            if ( element != null )
             {
-                // First look in memory cache
-                element = memCache.get( key );
-
-                if ( element != null )
+                // Found in memory cache
+                if ( isExpired( element ) )
                 {
-                    // Found in memory cache
-                    if ( isExpired( element ) )
+                    if ( log.isDebugEnabled() )
                     {
-                        if ( log.isDebugEnabled() )
-                        {
-                            log.debug( cacheAttr.getCacheName() + " - Memory cache hit, but element expired" );
-                        }
-
-                        missCountExpired.incrementAndGet();
-                        remove( key );
-                        element = null;
-                    }
-                    else
-                    {
-                        if ( log.isDebugEnabled() )
-                        {
-                            log.debug( cacheAttr.getCacheName() + " - Memory cache hit" );
-                        }
-
-                        // Update counters
-                        hitCountRam.incrementAndGet();
+                        log.debug( cacheAttr.getCacheName() + " - Memory cache hit, but element expired" );
                     }
 
-                    found = true;
+                    missCountExpired.incrementAndGet();
+                    remove( key );
+                    element = null;
                 }
                 else
                 {
-                    // Item not found in memory. If local invocation look in aux
-                    // caches, even if not local look in disk auxiliaries
-                    for (AuxiliaryCache<K, V> aux : auxCaches)
+                    if ( log.isDebugEnabled() )
                     {
-                        if ( aux != null )
-                        {
-                            CacheType cacheType = aux.getCacheType();
+                        log.debug( cacheAttr.getCacheName() + " - Memory cache hit" );
+                    }
 
-                            if ( !localOnly || cacheType == CacheType.DISK_CACHE )
+                    // Update counters
+                    hitCountRam.incrementAndGet();
+                }
+
+                found = true;
+            }
+            else
+            {
+                // Item not found in memory. If local invocation look in aux
+                // caches, even if not local look in disk auxiliaries
+                for (AuxiliaryCache<K, V> aux : auxCaches)
+                {
+                    if ( aux != null )
+                    {
+                        CacheType cacheType = aux.getCacheType();
+
+                        if ( !localOnly || cacheType == CacheType.DISK_CACHE )
+                        {
+                            if ( log.isDebugEnabled() )
+                            {
+                                log.debug( "Attempting to get from aux [" + aux.getCacheName() + "] which is of type: "
+                                    + cacheType );
+                            }
+
+                            try
+                            {
+                                element = aux.get( key );
+                            }
+                            catch ( IOException e )
+                            {
+                                log.error( "Error getting from aux", e );
+                            }
+                        }
+
+                        if ( log.isDebugEnabled() )
+                        {
+                            log.debug( "Got CacheElement: " + element );
+                        }
+
+                        // Item found in one of the auxiliary caches.
+                        if ( element != null )
+                        {
+                            if ( isExpired( element ) )
                             {
                                 if ( log.isDebugEnabled() )
                                 {
-                                    log.debug( "Attempting to get from aux [" + aux.getCacheName() + "] which is of type: "
-                                        + cacheType );
+                                    log.debug( cacheAttr.getCacheName() + " - Aux cache[" + aux.getCacheName() + "] hit, but element expired." );
                                 }
 
-                                try
-                                {
-                                    element = aux.get( key );
-                                }
-                                catch ( IOException e )
-                                {
-                                    log.error( "Error getting from aux", e );
-                                }
+                                missCountExpired.incrementAndGet();
+
+                                // This will tell the remotes to remove the item
+                                // based on the element's expiration policy. The elements attributes
+                                // associated with the item when it created govern its behavior
+                                // everywhere.
+                                remove( key );
+                                element = null;
                             }
-
-                            if ( log.isDebugEnabled() )
+                            else
                             {
-                                log.debug( "Got CacheElement: " + element );
-                            }
-
-                            // Item found in one of the auxiliary caches.
-                            if ( element != null )
-                            {
-                                if ( isExpired( element ) )
+                                if ( log.isDebugEnabled() )
                                 {
-                                    if ( log.isDebugEnabled() )
-                                    {
-                                        log.debug( cacheAttr.getCacheName() + " - Aux cache[" + aux.getCacheName() + "] hit, but element expired." );
-                                    }
-
-                                    missCountExpired.incrementAndGet();
-
-                                    // This will tell the remotes to remove the item
-                                    // based on the element's expiration policy. The elements attributes
-                                    // associated with the item when it created govern its behavior
-                                    // everywhere.
-                                    remove( key );
-                                    element = null;
-                                }
-                                else
-                                {
-                                    if ( log.isDebugEnabled() )
-                                    {
-                                        log.debug( cacheAttr.getCacheName() + " - Aux cache[" + aux.getCacheName() + "] hit" );
-                                    }
-
-                                    // Update counters
-                                    hitCountAux.incrementAndGet();
-                                    copyAuxiliaryRetrievedItemToMemory( element );
+                                    log.debug( cacheAttr.getCacheName() + " - Aux cache[" + aux.getCacheName() + "] hit" );
                                 }
 
-                                found = true;
-
-                                break;
+                                // Update counters
+                                hitCountAux.incrementAndGet();
+                                copyAuxiliaryRetrievedItemToMemory( element );
                             }
+
+                            found = true;
+
+                            break;
                         }
                     }
                 }
             }
-            catch ( IOException e )
-            {
-                log.error( "Problem encountered getting element.", e );
-            }
+        }
+        catch ( IOException e )
+        {
+            log.error( "Problem encountered getting element.", e );
         }
 
         if ( !found )
@@ -892,9 +912,7 @@
         throws IOException
     {
         // find matches in key array
-        // this avoids locking the memory cache, but it uses more memory
         Set<K> keyArray = memCache.getKeySet();
-
         Set<K> matchingKeys = getKeyMatcher().getMatchingKeysFromArray( pattern, keyArray );
 
         // call get multiple
@@ -918,9 +936,9 @@
     {
         Map<K, ICacheElement<K, V>> elements = new HashMap<K, ICacheElement<K, V>>();
 
-        for ( int i = auxCaches.length - 1; i >= 0; i-- )
+        for (ListIterator<AuxiliaryCache<K, V>> i = auxCaches.listIterator(auxCaches.size()); i.hasPrevious();)
         {
-            AuxiliaryCache<K, V> aux = auxCaches[i];
+            AuxiliaryCache<K, V> aux = i.previous();
 
             if ( aux != null )
             {
@@ -1078,18 +1096,15 @@
         allKeys.addAll( memCache.getKeySet() );
         for ( AuxiliaryCache<K, V> aux : auxCaches )
         {
-            if ( aux != null )
+            if ( aux != null && (!localOnly || aux.getCacheType() == CacheType.DISK_CACHE))
             {
-                if(!localOnly || aux.getCacheType() == CacheType.DISK_CACHE)
+                try
                 {
-                    try
-                    {
-                        allKeys.addAll( aux.getKeySet() );
-                    }
-                    catch ( IOException e )
-                    {
-                        // ignore
-                    }
+                    allKeys.addAll( aux.getKeySet() );
+                }
+                catch ( IOException e )
+                {
+                    // ignore
                 }
             }
         }
@@ -1143,52 +1158,49 @@
 
         boolean removed = false;
 
-        synchronized (this)
+        try
         {
+            removed = memCache.remove( key );
+        }
+        catch ( IOException e )
+        {
+            log.error( e );
+        }
+
+        // Removes from all auxiliary caches.
+        for ( ICache<K, V> aux : auxCaches )
+        {
+            if ( aux == null )
+            {
+                continue;
+            }
+
+            CacheType cacheType = aux.getCacheType();
+
+            // for now let laterals call remote remove but not vice versa
+
+            if ( localOnly && ( cacheType == CacheType.REMOTE_CACHE || cacheType == CacheType.LATERAL_CACHE ) )
+            {
+                continue;
+            }
             try
             {
-                removed = memCache.remove( key );
+                if ( log.isDebugEnabled() )
+                {
+                    log.debug( "Removing " + key + " from cacheType" + cacheType );
+                }
+
+                boolean b = aux.remove( key );
+
+                // Don't take the remote removal into account.
+                if ( !removed && cacheType != CacheType.REMOTE_CACHE )
+                {
+                    removed = b;
+                }
             }
-            catch ( IOException e )
+            catch ( IOException ex )
             {
-                log.error( e );
-            }
-
-            // Removes from all auxiliary caches.
-            for ( ICache<K, V> aux : auxCaches )
-            {
-                if ( aux == null )
-                {
-                    continue;
-                }
-
-                CacheType cacheType = aux.getCacheType();
-
-                // for now let laterals call remote remove but not vice versa
-
-                if ( localOnly && ( cacheType == CacheType.REMOTE_CACHE || cacheType == CacheType.LATERAL_CACHE ) )
-                {
-                    continue;
-                }
-                try
-                {
-                    if ( log.isDebugEnabled() )
-                    {
-                        log.debug( "Removing " + key + " from cacheType" + cacheType );
-                    }
-
-                    boolean b = aux.remove( key );
-
-                    // Don't take the remote removal into account.
-                    if ( !removed && cacheType != CacheType.REMOTE_CACHE )
-                    {
-                        removed = b;
-                    }
-                }
-                catch ( IOException ex )
-                {
-                    log.error( "Failure removing from aux", ex );
-                }
+                log.error( "Failure removing from aux", ex );
             }
         }
 
@@ -1391,31 +1403,30 @@
             return;
         }
 
-        synchronized ( this )
+        Set<K> keySet = new HashSet<K>(memCache.getKeySet());
+        for ( ICache<K, V> aux : auxCaches )
         {
-            for ( ICache<K, V> aux : auxCaches )
+            try
             {
-                try
+                if ( aux.getStatus() == CacheStatus.ALIVE )
                 {
-                    if ( aux.getStatus() == CacheStatus.ALIVE )
+                    for (K key : keySet)
                     {
-                        for (K key : memCache.getKeySet())
-                        {
-                            ICacheElement<K, V> ce = memCache.get(key);
+                        ICacheElement<K, V> ce = memCache.get(key);
 
-                            if (ce != null)
-                            {
-                                aux.update( ce );
-                            }
+                        if (ce != null)
+                        {
+                            aux.update( ce );
                         }
                     }
                 }
-                catch ( IOException ex )
-                {
-                    log.error( "Failure saving aux caches.", ex );
-                }
+            }
+            catch ( IOException ex )
+            {
+                log.error( "Failure saving aux caches.", ex );
             }
         }
+
         if ( log.isDebugEnabled() )
         {
             log.debug( "Called save for [" + cacheAttr.getCacheName() + "]" );
@@ -1480,14 +1491,13 @@
         // store the composite cache stats first
         ArrayList<IStatElement<?>> elems = new ArrayList<IStatElement<?>>();
 
-        elems.add(new StatElement<Integer>( "HitCountRam", Integer.valueOf(getHitCountRam()) ) );
-        elems.add(new StatElement<Integer>( "HitCountAux", Integer.valueOf(getHitCountAux()) ) );
+        elems.add(new StatElement<AtomicLong>( "HitCountRam", hitCountRam ) );
+        elems.add(new StatElement<AtomicLong>( "HitCountAux", hitCountAux ) );
 
         stats.setStatElements( elems );
 
         // memory + aux, memory is not considered an auxiliary internally
-        int total = auxCaches.length + 1;
-        ArrayList<IStats> auxStats = new ArrayList<IStats>(total);
+        ArrayList<IStats> auxStats = new ArrayList<IStats>(auxCaches.size() + 1);
 
         auxStats.add(getMemoryCache().getStatistics());
 
@@ -1749,7 +1759,7 @@
      */
     public int getHitCountRam()
     {
-        return hitCountRam.get();
+        return hitCountRam.intValue();
     }
 
     /**
@@ -1758,7 +1768,7 @@
      */
     public int getHitCountAux()
     {
-        return hitCountAux.get();
+        return hitCountAux.intValue();
     }
 
     /**
@@ -1767,7 +1777,7 @@
      */
     public int getMissCountNotFound()
     {
-        return missCountNotFound.get();
+        return missCountNotFound.intValue();
     }
 
     /**
@@ -1776,7 +1786,7 @@
      */
     public int getMissCountExpired()
     {
-        return missCountExpired.get();
+        return missCountExpired.intValue();
     }
 
     /**
@@ -1784,6 +1794,51 @@
      */
     public int getUpdateCount()
     {
+        return updateCount.intValue();
+    }
+
+    /**
+     * Number of times a requested item was found in the memory cache.
+     * <p>
+     * @return number of hits in memory
+     */
+    public long getHitCountRamLong()
+    {
+        return hitCountRam.get();
+    }
+
+    /**
+     * Number of times a requested item was found in and auxiliary cache.
+     * @return number of auxiliary hits.
+     */
+    public long getHitCountAuxLong()
+    {
+        return hitCountAux.get();
+    }
+
+    /**
+     * Number of times a requested element was not found.
+     * @return number of misses.
+     */
+    public long getMissCountNotFoundLong()
+    {
+        return missCountNotFound.get();
+    }
+
+    /**
+     * Number of times a requested element was found but was expired.
+     * @return number of found but expired gets.
+     */
+    public long getMissCountExpiredLong()
+    {
+        return missCountExpired.get();
+    }
+
+    /**
+     * @return Returns the updateCount.
+     */
+    public long getUpdateCountLong()
+    {
         return updateCount.get();
     }
 
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/control/CompositeCacheConfigurator.java b/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/control/CompositeCacheConfigurator.java
index 15937c3..0b3790b 100644
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/control/CompositeCacheConfigurator.java
+++ b/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/control/CompositeCacheConfigurator.java
@@ -270,9 +270,7 @@
             }
 
             // Associate the auxiliaries with the cache
-            @SuppressWarnings("unchecked") // No generic arrays in java
-            AuxiliaryCache<K, V>[] auxArray = auxList.toArray( new AuxiliaryCache[0] );
-            cache.setAuxCaches( auxArray );
+            cache.setAuxCaches( auxList );
         }
 
         // Return the new cache
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/AbstractDoubleLinkedListMemoryCache.java b/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/AbstractDoubleLinkedListMemoryCache.java
index b1faf25..dc37fa4 100644
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/AbstractDoubleLinkedListMemoryCache.java
+++ b/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/AbstractDoubleLinkedListMemoryCache.java
@@ -32,7 +32,6 @@
 import org.apache.commons.jcs.engine.behavior.ICacheElement;
 import org.apache.commons.jcs.engine.control.CompositeCache;
 import org.apache.commons.jcs.engine.control.group.GroupAttrName;
-import org.apache.commons.jcs.engine.memory.util.DefaultMemoryElementDescriptor;
 import org.apache.commons.jcs.engine.memory.util.MemoryElementDescriptor;
 import org.apache.commons.jcs.engine.stats.StatElement;
 import org.apache.commons.jcs.engine.stats.behavior.IStatElement;
@@ -101,24 +100,16 @@
     {
         putCnt.incrementAndGet();
 
-        lock.lock();
-        try
-        {
-            MemoryElementDescriptor<K, V> newNode = adjustListForUpdate(ce);
+        MemoryElementDescriptor<K, V> newNode = adjustListForUpdate(ce);
 
-            // this should be synchronized if we were not using a ConcurrentHashMap
-            final K key = newNode.getCacheElement().getKey();
-            MemoryElementDescriptor<K, V> oldNode = map.put(key, newNode);
+        // this should be synchronized if we were not using a ConcurrentHashMap
+        final K key = newNode.getCacheElement().getKey();
+        MemoryElementDescriptor<K, V> oldNode = map.put(key, newNode);
 
-            // If the node was the same as an existing node, remove it.
-            if (oldNode != null && key.equals(oldNode.getCacheElement().getKey()))
-            {
-                list.remove(oldNode);
-            }
-        }
-        finally
+        // If the node was the same as an existing node, remove it.
+        if (oldNode != null && key.equals(oldNode.getCacheElement().getKey()))
         {
-            lock.unlock();
+            list.remove(oldNode);
         }
 
         // If we are over the max spool some
@@ -168,34 +159,20 @@
         // The spool will put them in a disk event queue, so there is no
         // need to pre-queue the queuing. This would be a bit wasteful
         // and wouldn't save much time in this synchronous call.
-        lock.lock();
-
-        try
+        for (int i = 0; i < chunkSizeCorrected; i++)
         {
-            for (int i = 0; i < chunkSizeCorrected; i++)
+            ICacheElement<K, V> lastElement = spoolLastElement();
+            if (lastElement == null)
             {
-                ICacheElement<K, V> lastElement = spoolLastElement();
-                if (lastElement == null)
-                {
-                    break;
-                }
-            }
-
-            // If this is out of the sync block it can detect a mismatch
-            // where there is none.
-            if (log.isDebugEnabled() && map.size() != list.size())
-            {
-                log.debug("update: After spool, size mismatch: map.size() = " + map.size() + ", linked list size = " + list.size());
+                break;
             }
         }
-        finally
-        {
-            lock.unlock();
-        }
 
-        if (log.isDebugEnabled())
+        // If this is out of the sync block it can detect a mismatch
+        // where there is none.
+        if (log.isDebugEnabled() && map.size() != list.size())
         {
-            log.debug("update: After spool map size: " + map.size() + " linked list size = " + list.size());
+            log.debug("update: After spool, size mismatch: map.size() = " + map.size() + ", linked list size = " + list.size());
         }
     }
 
@@ -211,7 +188,7 @@
     @Override
     public final ICacheElement<K, V> get(K key) throws IOException
     {
-        ICacheElement<K, V> ce = null;
+        ICacheElement<K, V> ce;
 
         if (log.isDebugEnabled())
         {
@@ -224,17 +201,9 @@
         {
             hitCnt.incrementAndGet();
 
-            lock.lock();
-            try
-            {
-                ce = me.getCacheElement();
-                // ABSTRACT
-                adjustListForGet(me);
-            }
-            finally
-            {
-                lock.unlock();
-            }
+            ce = me.getCacheElement();
+            // ABSTRACT
+            adjustListForGet(me);
 
             if (log.isDebugEnabled())
             {
@@ -245,6 +214,8 @@
         {
             missCnt.incrementAndGet();
 
+            ce = null;
+
             if (log.isDebugEnabled())
             {
                 log.debug(getCacheName() + ": LRUMemoryCache miss for " + key);
@@ -281,25 +252,16 @@
     @Override
     public int freeElements(int numberToFree) throws IOException
     {
-        int freed = 0;
+        int freed;
 
-        lock.lock();
-
-        try
+        for (freed = 0; freed < numberToFree; freed++)
         {
-            for (; freed < numberToFree; freed++)
+            ICacheElement<K, V> element = spoolLastElement();
+            if (element == null)
             {
-                ICacheElement<K, V> element = spoolLastElement();
-                if (element == null)
-                {
-                    break;
-                }
+                break;
             }
         }
-        finally
-        {
-            lock.unlock();
-        }
 
         return freed;
     }
@@ -315,13 +277,13 @@
     {
         ICacheElement<K, V> toSpool = null;
 
-        final MemoryElementDescriptor<K, V> last = list.getLast();
+        final MemoryElementDescriptor<K, V> last = list.removeLast();
         if (last != null)
         {
             toSpool = last.getCacheElement();
             if (toSpool != null)
             {
-                getCompositeCache().spoolToDisk(toSpool);
+                waterfal(toSpool);
                 if (map.remove(toSpool.getKey()) == null)
                 {
                     log.warn("update: remove failed for key: " + toSpool.getKey());
@@ -336,8 +298,6 @@
             {
                 throw new Error("update: last.ce is null!");
             }
-
-            list.remove(last);
         }
 
         return toSpool;
@@ -374,17 +334,9 @@
 
                 if (k instanceof String && ((String) k).startsWith(key.toString()))
                 {
-                    lock.lock();
-                    try
-                    {
-                        list.remove(entry.getValue());
-                        itr.remove();
-                        removed = true;
-                    }
-                    finally
-                    {
-                        lock.unlock();
-                    }
+                    itr.remove();
+                    list.remove(entry.getValue());
+                    removed = true;
                 }
             }
         }
@@ -398,36 +350,20 @@
 
                 if (k instanceof GroupAttrName && ((GroupAttrName<?>) k).groupId.equals(((GroupAttrName<?>) key).groupId))
                 {
-                    lock.lock();
-                    try
-                    {
-                        list.remove(entry.getValue());
-                        itr.remove();
-                        removed = true;
-                    }
-                    finally
-                    {
-                        lock.unlock();
-                    }
+                    itr.remove();
+                    list.remove(entry.getValue());
+                    removed = true;
                 }
             }
         }
         else
         {
             // remove single item.
-            lock.lock();
-            try
+            MemoryElementDescriptor<K, V> me = map.remove(key);
+            if (me != null)
             {
-                MemoryElementDescriptor<K, V> me = map.remove(key);
-                if (me != null)
-                {
-                    list.remove(me);
-                    removed = true;
-                }
-            }
-            finally
-            {
-                lock.unlock();
+                list.remove(me);
+                removed = true;
             }
         }
 
@@ -444,16 +380,8 @@
     @Override
     public void removeAll() throws IOException
     {
-        lock.lock();
-        try
-        {
-            list.removeAll();
-            map.clear();
-        }
-        finally
-        {
-            lock.unlock();
-        }
+        super.removeAll();
+        list.removeAll();
     }
 
     // --------------------------- internal methods (linked list implementation)
@@ -467,21 +395,13 @@
      */
     protected MemoryElementDescriptor<K, V> addFirst(ICacheElement<K, V> ce)
     {
-        lock.lock();
-        try
+        MemoryElementDescriptor<K, V> me = new MemoryElementDescriptor<K, V>(ce);
+        list.addFirst(me);
+        if ( log.isDebugEnabled() )
         {
-            MemoryElementDescriptor<K, V> me = new DefaultMemoryElementDescriptor<K, V>(ce);
-            list.addFirst(me);
-            if ( log.isDebugEnabled() )
-            {
-                verifyCache(ce.getKey());
-            }
-            return me;
+            verifyCache(ce.getKey());
         }
-        finally
-        {
-            lock.unlock();
-        }
+        return me;
     }
 
     /**
@@ -494,21 +414,13 @@
      */
     protected MemoryElementDescriptor<K, V> addLast(ICacheElement<K, V> ce)
     {
-        lock.lock();
-        try
+        MemoryElementDescriptor<K, V> me = new MemoryElementDescriptor<K, V>(ce);
+        list.addLast(me);
+        if ( log.isDebugEnabled() )
         {
-            MemoryElementDescriptor<K, V> me = new DefaultMemoryElementDescriptor<K, V>(ce);
-            list.addLast(me);
-            if ( log.isDebugEnabled() )
-            {
-                verifyCache(ce.getKey());
-            }
-            return me;
+            verifyCache(ce.getKey());
         }
-        finally
-        {
-            lock.unlock();
-        }
+        return me;
     }
 
     // ---------------------------------------------------------- debug methods
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/AbstractMemoryCache.java b/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/AbstractMemoryCache.java
index 87929fa..9f1b791 100644
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/AbstractMemoryCache.java
+++ b/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/AbstractMemoryCache.java
@@ -24,9 +24,8 @@
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.atomic.AtomicLong;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
 
 import org.apache.commons.jcs.engine.CacheStatus;
 import org.apache.commons.jcs.engine.behavior.ICacheElement;
@@ -65,10 +64,8 @@
     /** How many to spool at a time. */
     protected int chunkSize;
 
-    protected final Lock lock = new ReentrantLock();
-
     /** Map where items are stored by key.  This is created by the concrete child class. */
-    protected Map<K, MemoryElementDescriptor<K, V>> map;// TODO privatise
+    protected ConcurrentMap<K, MemoryElementDescriptor<K, V>> map;// TODO privatise
 
     /** number of hits */
     protected AtomicLong hitCnt;
@@ -106,7 +103,7 @@
      * <p>
      * @return a threadsafe Map
      */
-    public abstract Map<K, MemoryElementDescriptor<K, V>> createMap();
+    public abstract ConcurrentMap<K, MemoryElementDescriptor<K, V>> createMap();
 
     /**
      * Removes an item from the cache
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/lru/LHMLRUMemoryCache.java b/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/lru/LHMLRUMemoryCache.java
index acb3cee..be7ba26 100644
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/lru/LHMLRUMemoryCache.java
+++ b/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/lru/LHMLRUMemoryCache.java
@@ -20,25 +20,26 @@
  */
 
 import java.io.IOException;
-import java.util.Collections;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.ConcurrentMap;
 
 import org.apache.commons.jcs.engine.CacheConstants;
 import org.apache.commons.jcs.engine.behavior.ICacheElement;
 import org.apache.commons.jcs.engine.control.CompositeCache;
 import org.apache.commons.jcs.engine.control.group.GroupAttrName;
 import org.apache.commons.jcs.engine.memory.AbstractMemoryCache;
-import org.apache.commons.jcs.engine.memory.util.DefaultMemoryElementDescriptor;
 import org.apache.commons.jcs.engine.memory.util.MemoryElementDescriptor;
 import org.apache.commons.jcs.engine.stats.behavior.IStats;
+import org.apache.commons.jcs.utils.clhm.ConcurrentLinkedHashMap;
+import org.apache.commons.jcs.utils.clhm.EvictionListener;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
 /**
- * This is a test memory manager using the jdk1.4 LinkedHashMap.
+ * This is a memory manager using Ben Manes ConcurrentLinkedHashMap.
  */
 public class LHMLRUMemoryCache<K, V>
     extends AbstractMemoryCache<K, V>
@@ -59,14 +60,41 @@
     }
 
     /**
-     * Returns a synchronized LHMSpooler
+     * Returns a ConcurrentLinkedHashMap
      * <p>
-     * @return Collections.synchronizedMap( new LHMSpooler() )
+     * @return a ConcurrentLinkedHashMap
      */
     @Override
-    public Map<K, MemoryElementDescriptor<K, V>> createMap()
+    public ConcurrentMap<K, MemoryElementDescriptor<K, V>> createMap()
     {
-        return Collections.synchronizedMap( new LHMSpooler() );
+        EvictionListener<K, MemoryElementDescriptor<K, V>> listener = new EvictionListener<K, MemoryElementDescriptor<K, V>>()
+        {
+            @Override public void onEviction(K key, MemoryElementDescriptor<K, V> value)
+            {
+                ICacheElement<K, V> element = value.getCacheElement();
+
+                if ( log.isDebugEnabled() )
+                {
+                    log.debug( "LHMLRU max size: " + getCacheAttributes().getMaxObjects()
+                        + ".  Spooling element, key: " + key );
+                }
+
+                waterfal( element );
+
+                if ( log.isDebugEnabled() )
+                {
+                    log.debug( "LHMLRU size: " + map.size() );
+                }
+            }
+        };
+
+        ConcurrentMap<K, MemoryElementDescriptor<K, V>> map =
+                new ConcurrentLinkedHashMap.Builder<K, MemoryElementDescriptor<K,V>>()
+                .maximumWeightedCapacity(getCacheAttributes().getMaxObjects())
+                .listener(listener)
+                .build();
+
+        return map;
     }
 
     /**
@@ -80,7 +108,7 @@
         throws IOException
     {
         putCnt.incrementAndGet();
-        map.put( ce.getKey(), new DefaultMemoryElementDescriptor<K, V>(ce) );
+        map.put( ce.getKey(), new MemoryElementDescriptor<K, V>(ce) );
     }
 
     /**
@@ -146,37 +174,31 @@
         if ( key instanceof String && ( (String) key ).endsWith( CacheConstants.NAME_COMPONENT_DELIMITER ) )
         {
             // remove all keys of the same name hierarchy.
-            synchronized ( map )
+            for (Iterator<Map.Entry<K, MemoryElementDescriptor<K, V>>> itr = map.entrySet().iterator(); itr.hasNext(); )
             {
-                for (Iterator<Map.Entry<K, MemoryElementDescriptor<K, V>>> itr = map.entrySet().iterator(); itr.hasNext(); )
-                {
-                    Map.Entry<K, MemoryElementDescriptor<K, V>> entry = itr.next();
-                    K k = entry.getKey();
+                Map.Entry<K, MemoryElementDescriptor<K, V>> entry = itr.next();
+                K k = entry.getKey();
 
-                    if ( k instanceof String && ( (String) k ).startsWith( key.toString() ) )
-                    {
-                        itr.remove();
-                        removed = true;
-                    }
+                if ( k instanceof String && ( (String) k ).startsWith( key.toString() ) )
+                {
+                    itr.remove();
+                    removed = true;
                 }
             }
         }
         else if ( key instanceof GroupAttrName && ((GroupAttrName<?>)key).attrName == null )
         {
             // remove all keys of the same name hierarchy.
-            synchronized ( map )
+            for (Iterator<Map.Entry<K, MemoryElementDescriptor<K, V>>> itr = map.entrySet().iterator(); itr.hasNext(); )
             {
-                for (Iterator<Map.Entry<K, MemoryElementDescriptor<K, V>>> itr = map.entrySet().iterator(); itr.hasNext(); )
-                {
-                    Map.Entry<K, MemoryElementDescriptor<K, V>> entry = itr.next();
-                    K k = entry.getKey();
+                Map.Entry<K, MemoryElementDescriptor<K, V>> entry = itr.next();
+                K k = entry.getKey();
 
-                    if ( k instanceof GroupAttrName &&
-                        ((GroupAttrName<?>)k).groupId.equals(((GroupAttrName<?>)key).groupId) )
-                    {
-                        itr.remove();
-                        removed = true;
-                    }
+                if ( k instanceof GroupAttrName &&
+                    ((GroupAttrName<?>)k).groupId.equals(((GroupAttrName<?>)key).groupId) )
+                {
+                    itr.remove();
+                    removed = true;
                 }
             }
         }
@@ -243,60 +265,4 @@
         // can't be implemented using the LHM
         return 0;
     }
-
-    // ---------------------------------------------------------- extended map
-
-    /**
-     * Implementation of removeEldestEntry in LinkedHashMap
-     */
-    protected class LHMSpooler
-        extends java.util.LinkedHashMap<K, MemoryElementDescriptor<K, V>>
-    {
-        /** Don't change. */
-        private static final long serialVersionUID = -1255907868906762484L;
-
-        /**
-         * Initialize to a small size--for now, 1/2 of max 3rd variable "true" indicates that it
-         * should be access and not time governed. This could be configurable.
-         */
-        public LHMSpooler()
-        {
-            super( (int) ( getCacheAttributes().getMaxObjects() * .5 ), .75F, true );
-        }
-
-        /**
-         * Remove eldest. Automatically called by LinkedHashMap.
-         * <p>
-         * @param eldest
-         * @return true if removed
-         */
-        @SuppressWarnings("synthetic-access")
-        @Override
-        protected boolean removeEldestEntry( Map.Entry<K, MemoryElementDescriptor<K, V>> eldest )
-        {
-            ICacheElement<K, V> element = eldest.getValue().getCacheElement();
-
-            if ( size() <= getCacheAttributes().getMaxObjects() )
-            {
-                return false;
-            }
-            else
-            {
-
-                if ( log.isDebugEnabled() )
-                {
-                    log.debug( "LHMLRU max size: " + getCacheAttributes().getMaxObjects()
-                        + ".  Spooling element, key: " + element.getKey() );
-                }
-
-                waterfal( element );
-
-                if ( log.isDebugEnabled() )
-                {
-                    log.debug( "LHMLRU size: " + map.size() );
-                }
-            }
-            return true;
-        }
-    }
 }
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/soft/SoftReferenceMemoryCache.java b/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/soft/SoftReferenceMemoryCache.java
index 5108c66..7f8d2e6 100644
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/soft/SoftReferenceMemoryCache.java
+++ b/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/soft/SoftReferenceMemoryCache.java
@@ -178,17 +178,9 @@
 
                 if (k instanceof String && ((String) k).startsWith(key.toString()))
                 {
-                    lock.lock();
-                    try
-                    {
-                        strongReferences.remove(entry.getValue().getCacheElement());
-                        itr.remove();
-                        removed = true;
-                    }
-                    finally
-                    {
-                        lock.unlock();
-                    }
+                    itr.remove();
+                    strongReferences.remove(entry.getValue().getCacheElement());
+                    removed = true;
                 }
             }
         }
@@ -203,36 +195,20 @@
 
                 if (k instanceof GroupAttrName && ((GroupAttrName<?>) k).groupId.equals(((GroupAttrName<?>) key).groupId))
                 {
-                    lock.lock();
-                    try
-                    {
-                        strongReferences.remove(entry.getValue().getCacheElement());
-                        itr.remove();
-                        removed = true;
-                    }
-                    finally
-                    {
-                        lock.unlock();
-                    }
+                    itr.remove();
+                    strongReferences.remove(entry.getValue().getCacheElement());
+                    removed = true;
                 }
             }
         }
         else
         {
             // remove single item.
-            lock.lock();
-            try
+            MemoryElementDescriptor<K, V> me = map.remove(key);
+            if (me != null)
             {
-                MemoryElementDescriptor<K, V> me = map.remove(key);
-                if (me != null)
-                {
-                    strongReferences.remove(me.getCacheElement());
-                    removed = true;
-                }
-            }
-            finally
-            {
-                lock.unlock();
+                strongReferences.remove(me.getCacheElement());
+                removed = true;
             }
         }
 
@@ -263,18 +239,9 @@
         putCnt.incrementAndGet();
         ce.getElementAttributes().setLastAccessTimeNow();
 
-        lock.lock();
-
-        try
-        {
-            map.put(ce.getKey(), new SoftReferenceElementDescriptor<K, V>(ce));
-            strongReferences.add(ce);
-            trimStrongReferences();
-        }
-        finally
-        {
-            lock.unlock();
-        }
+        map.put(ce.getKey(), new SoftReferenceElementDescriptor<K, V>(ce));
+        strongReferences.add(ce);
+        trimStrongReferences();
     }
 
     /**
@@ -303,24 +270,14 @@
     @Override
     public ICacheElement<K, V> get(K key) throws IOException
     {
-        ICacheElement<K, V> val = null;
-        lock.lock();
-
-        try
+        ICacheElement<K, V> val = getQuiet(key);
+        if (val != null)
         {
-            val = getQuiet(key);
-            if (val != null)
-            {
-                val.getElementAttributes().setLastAccessTimeNow();
+            val.getElementAttributes().setLastAccessTimeNow();
 
-                // update the ordering of the strong references
-                strongReferences.add(val);
-                trimStrongReferences();
-            }
-        }
-        finally
-        {
-            lock.unlock();
+            // update the ordering of the strong references
+            strongReferences.add(val);
+            trimStrongReferences();
         }
 
         if (val == null)
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/util/DefaultMemoryElementDescriptor.java b/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/util/DefaultMemoryElementDescriptor.java
deleted file mode 100644
index d95ada1..0000000
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/util/DefaultMemoryElementDescriptor.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package org.apache.commons.jcs.engine.memory.util;
-
-/*
- * 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.
- */
-
-import org.apache.commons.jcs.engine.behavior.ICacheElement;
-
-/**
- * This wrapper is needed for double linked lists.
- */
-public class DefaultMemoryElementDescriptor<K, V>
-    extends MemoryElementDescriptor<K, V>
-{
-    /** Don't change */
-    private static final long serialVersionUID = -1905161209035522460L;
-
-    /** The CacheElement wrapped by this descriptor */
-    private final ICacheElement<K, V> ce;
-
-    /**
-     * Constructs a usable MemoryElementDescriptor.
-     * <p>
-     * @param ce
-     */
-    public DefaultMemoryElementDescriptor( ICacheElement<K, V> ce )
-    {
-        super( ce );
-        this.ce = ce;
-    }
-
-    /**
-     * @return the ce
-     */
-    @Override
-    public ICacheElement<K, V> getCacheElement()
-    {
-        return ce;
-    }
-}
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/util/MemoryElementDescriptor.java b/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/util/MemoryElementDescriptor.java
index 22d398b..4096685 100644
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/util/MemoryElementDescriptor.java
+++ b/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/util/MemoryElementDescriptor.java
@@ -25,7 +25,7 @@
 /**
  * This wrapper is needed for double linked lists.
  */
-public abstract class MemoryElementDescriptor<K, V>
+public class MemoryElementDescriptor<K, V>
     extends DoubleLinkedListNode<ICacheElement<K, V>>
 {
     /** Don't change */
@@ -45,5 +45,8 @@
      * Return the cache element wrapped by this descriptor
      * @return the cache element
      */
-    public abstract ICacheElement<K, V> getCacheElement();
+    public ICacheElement<K, V> getCacheElement()
+    {
+        return getPayload();
+    }
 }
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/util/SoftReferenceElementDescriptor.java b/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/util/SoftReferenceElementDescriptor.java
index 91f42ab..d97093d 100644
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/util/SoftReferenceElementDescriptor.java
+++ b/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/util/SoftReferenceElementDescriptor.java
@@ -42,15 +42,15 @@
      */
     public SoftReferenceElementDescriptor( ICacheElement<K, V> ce )
     {
-        super( ce );
+        super( null );
         this.srce = new SoftReference<ICacheElement<K, V>>(ce);
     }
 
     /**
-     * @return the ce
+     * @see org.apache.commons.jcs.utils.struct.DoubleLinkedListNode#getPayload()
      */
     @Override
-    public ICacheElement<K, V> getCacheElement()
+    public ICacheElement<K, V> getPayload()
     {
         if (srce != null)
         {
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/struct/AbstractLRUMap.java b/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/struct/AbstractLRUMap.java
deleted file mode 100644
index c747f4c..0000000
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/struct/AbstractLRUMap.java
+++ /dev/null
@@ -1,668 +0,0 @@
-package org.apache.commons.jcs.utils.struct;
-
-/*
- * 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.
- */
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-
-import org.apache.commons.jcs.engine.control.group.GroupAttrName;
-import org.apache.commons.jcs.engine.stats.StatElement;
-import org.apache.commons.jcs.engine.stats.Stats;
-import org.apache.commons.jcs.engine.stats.behavior.IStatElement;
-import org.apache.commons.jcs.engine.stats.behavior.IStats;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * This is a simple LRUMap. It implements most of the map methods. It is not recommended that you
- * use any but put, get, remove, and clear.
- * <p>
- * Children can implement the processRemovedLRU method if they want to handle the removal of the
- * lest recently used item.
- * <p>
- * This class was abstracted out of the LRU Memory cache. Put, remove, and get should be thread
- * safe. It uses a hashtable and our own double linked list.
- * <p>
- * Locking is done on the instance.
- * <p>
- * @author aaron smuts
- */
-public abstract class AbstractLRUMap<K, V>
-    implements Map<K, V>
-{
-    /** The logger */
-    private static final Log log = LogFactory.getLog( AbstractLRUMap.class );
-
-    /** double linked list for lru */
-    private final DoubleLinkedList<LRUElementDescriptor<K, V>> list;
-
-    /** Map where items are stored by key. */
-    private Map<K, LRUElementDescriptor<K, V>> map;
-
-    /** stats */
-    int hitCnt = 0;
-
-    /** stats */
-    int missCnt = 0;
-
-    /** stats */
-    int putCnt = 0;
-
-    /** make configurable */
-    private int chunkSize = 1;
-
-    private final Lock lock = new ReentrantLock();
-
-    /**
-     * This creates an unbounded version. Setting the max objects will result in spooling on
-     * subsequent puts.
-     */
-    public AbstractLRUMap()
-    {
-        list = new DoubleLinkedList<LRUElementDescriptor<K, V>>();
-
-        // normal hashtable is faster for
-        // sequential keys.
-        map = new ConcurrentHashMap<K, LRUElementDescriptor<K, V>>();
-    }
-
-
-    /**
-     * This simply returns the number of elements in the map.
-     * <p>
-     * @see java.util.Map#size()
-     */
-    @Override
-    public int size()
-    {
-        return map.size();
-    }
-
-    /**
-     * This removes all the items. It clears the map and the double linked list.
-     * <p>
-     * @see java.util.Map#clear()
-     */
-    @Override
-    public void clear()
-    {
-        lock.lock();
-        try
-        {
-            map.clear();
-            list.removeAll();
-        }
-        finally
-        {
-            lock.unlock();
-        }
-    }
-
-    /**
-     * Returns true if the map is empty.
-     * <p>
-     * @see java.util.Map#isEmpty()
-     */
-    @Override
-    public boolean isEmpty()
-    {
-        return map.isEmpty();
-    }
-
-    /**
-     * Returns true if the map contains an element for the supplied key.
-     * <p>
-     * @see java.util.Map#containsKey(java.lang.Object)
-     */
-    @Override
-    public boolean containsKey( Object key )
-    {
-        return map.containsKey( key );
-    }
-
-    /**
-     * This is an expensive operation that determines if the object supplied is mapped to any key.
-     * <p>
-     * @see java.util.Map#containsValue(java.lang.Object)
-     */
-    @Override
-    public boolean containsValue( Object value )
-    {
-        return map.containsValue( value );
-    }
-
-    /**
-     * @return map.values();
-     */
-    @Override
-    public Collection<V> values()
-    {
-        List<V> valueList = new ArrayList<V>(map.size());
-
-        for (LRUElementDescriptor<K, V> value : map.values())
-        {
-            valueList.add(value.getPayload());
-        }
-
-        return valueList;
-    }
-
-    /**
-     * @param source
-     */
-    @Override
-    public void putAll( Map<? extends K, ? extends V> source )
-    {
-        if ( source != null )
-        {
-            for (Map.Entry<? extends K, ? extends V> entry : source.entrySet())
-            {
-                this.put( entry.getKey(), entry.getValue() );
-            }
-        }
-    }
-
-    /**
-     * @param key
-     * @return Object
-     */
-    @Override
-    public V get( Object key )
-    {
-        V retVal = null;
-
-        if ( log.isDebugEnabled() )
-        {
-            log.debug( "getting item  for key " + key );
-        }
-
-        LRUElementDescriptor<K, V> me = map.get( key );
-
-        if ( me != null )
-        {
-            hitCnt++;
-            if ( log.isDebugEnabled() )
-            {
-                log.debug( "LRUMap hit for " + key );
-            }
-
-            retVal = me.getPayload();
-
-            list.makeFirst( me );
-        }
-        else
-        {
-            missCnt++;
-            log.debug( "LRUMap miss for " + key );
-        }
-
-        // verifyCache();
-        return retVal;
-    }
-
-    /**
-     * This gets an element out of the map without adjusting it's position in the LRU. In other
-     * words, this does not count as being used. If the element is the last item in the list, it
-     * will still be the last time in the list.
-     * <p>
-     * @param key
-     * @return Object
-     */
-    public V getQuiet( Object key )
-    {
-        V ce = null;
-
-        LRUElementDescriptor<K, V> me = map.get( key );
-        if ( me != null )
-        {
-            if ( log.isDebugEnabled() )
-            {
-                log.debug( "LRUMap quiet hit for " + key );
-            }
-
-            ce = me.getPayload();
-        }
-        else if ( log.isDebugEnabled() )
-        {
-            log.debug( "LRUMap quiet miss for " + key );
-        }
-
-        return ce;
-    }
-
-    /**
-     * @param key
-     * @return Object removed
-     */
-    @Override
-    public V remove( Object key )
-    {
-        if ( log.isDebugEnabled() )
-        {
-            log.debug( "removing item for key: " + key );
-        }
-
-        // remove single item.
-        lock.lock();
-        try
-        {
-            LRUElementDescriptor<K, V> me = map.remove(key);
-
-            if (me != null)
-            {
-                list.remove(me);
-                return me.getPayload();
-            }
-        }
-        finally
-        {
-            lock.unlock();
-        }
-
-        return null;
-    }
-
-    /**
-     * @param key
-     * @param value
-     * @return Object
-     */
-    @Override
-    public V put(K key, V value)
-    {
-        putCnt++;
-
-        LRUElementDescriptor<K, V> old = null;
-        lock.lock();
-        try
-        {
-            // TODO address double synchronization of addFirst, use write lock
-            addFirst( key, value );
-            // this must be synchronized
-            LRUElementDescriptor<K, V> first = list.getFirst();
-            old = map.put(first.getKey(), first);
-
-            // If the node was the same as an existing node, remove it.
-            if ( old != null && first.getKey().equals(old.getKey()))
-            {
-                list.remove( old );
-            }
-        }
-        finally
-        {
-            lock.unlock();
-        }
-
-        // If the element limit is reached, we need to spool
-
-        if (shouldRemove())
-        {
-            if (log.isDebugEnabled())
-            {
-                log.debug( "In memory limit reached, removing least recently used." );
-            }
-
-            // The spool will put them in a disk event queue, so there is no
-            // need to pre-queue the queuing. This would be a bit wasteful
-            // and wouldn't save much time in this synchronous call.
-
-            while ( shouldRemove() )
-            {
-                lock.lock();
-                try
-                {
-                    LRUElementDescriptor<K, V> last = list.getLast();
-                    if (last != null)
-                    {
-                        processRemovedLRU(last.getKey(), last.getPayload());
-                        if (map.remove(last.getKey()) == null)
-                        {
-                            log.warn("update: remove failed for key: "
-                                    + last.getKey());
-                            verifyCache();
-                        }
-                        list.removeLast();
-                    }
-                    else
-                    {
-                        verifyCache();
-                        throw new Error("update: last is null!");
-                    }
-                }
-                finally
-                {
-                    lock.unlock();
-                }
-            }
-
-            if ( log.isDebugEnabled() )
-            {
-                log.debug( "update: After spool map size: " + map.size() );
-            }
-            if ( map.size() != dumpCacheSize() )
-            {
-                log.error("update: After spool, size mismatch: map.size() = " + map.size() + ", linked list size = "
-                        + dumpCacheSize());
-            }
-        }
-
-        if ( old != null )
-        {
-            return old.getPayload();
-        }
-        return null;
-    }
-
-    protected abstract boolean shouldRemove();
-
-
-    /**
-     * Adds a new node to the start of the link list.
-     * <p>
-     * @param key
-     * @param val The feature to be added to the First
-     */
-    private void addFirst(K key, V val)
-    {
-        lock.lock();
-        try
-        {
-            LRUElementDescriptor<K, V> me = new LRUElementDescriptor<K, V>(key, val);
-            list.addFirst( me );
-        }
-        finally
-        {
-            lock.unlock();
-        }
-    }
-
-    /**
-     * Returns the size of the list.
-     * <p>
-     * @return int
-     */
-    private int dumpCacheSize()
-    {
-        return list.size();
-    }
-
-    /**
-     * Dump the cache entries from first to list for debugging.
-     */
-    @SuppressWarnings("unchecked") // No generics for public fields
-    public void dumpCacheEntries()
-    {
-        log.debug( "dumpingCacheEntries" );
-        for ( LRUElementDescriptor<K, V> me = list.getFirst(); me != null; me = (LRUElementDescriptor<K, V>) me.next )
-        {
-            if ( log.isDebugEnabled() )
-            {
-                log.debug( "dumpCacheEntries> key=" + me.getKey() + ", val=" + me.getPayload() );
-            }
-        }
-    }
-
-    /**
-     * Dump the cache map for debugging.
-     */
-    public void dumpMap()
-    {
-        log.debug( "dumpingMap" );
-        for (Map.Entry<K, LRUElementDescriptor<K, V>> e : map.entrySet())
-        {
-            LRUElementDescriptor<K, V> me = e.getValue();
-            if ( log.isDebugEnabled() )
-            {
-                log.debug( "dumpMap> key=" + e.getKey() + ", val=" + me.getPayload() );
-            }
-        }
-    }
-
-    /**
-     * Checks to see if all the items that should be in the cache are. Checks consistency between
-     * List and map.
-     */
-    @SuppressWarnings("unchecked") // No generics for public fields
-    protected void verifyCache()
-    {
-        if ( !log.isDebugEnabled() )
-        {
-            return;
-        }
-
-        boolean found = false;
-        log.debug( "verifycache: mapContains " + map.size() + " elements, linked list contains " + dumpCacheSize()
-            + " elements" );
-        log.debug( "verifycache: checking linked list by key " );
-        for (LRUElementDescriptor<K, V> li = list.getFirst(); li != null; li = (LRUElementDescriptor<K, V>) li.next )
-        {
-            K key = li.getKey();
-            if ( !map.containsKey( key ) )
-            {
-                log.error( "verifycache: map does not contain key : " + li.getKey() );
-                log.error( "li.hashcode=" + li.getKey().hashCode() );
-                log.error( "key class=" + key.getClass() );
-                log.error( "key hashcode=" + key.hashCode() );
-                log.error( "key toString=" + key.toString() );
-                if ( key instanceof GroupAttrName )
-                {
-                    GroupAttrName<?> name = (GroupAttrName<?>) key;
-                    log.error( "GroupID hashcode=" + name.groupId.hashCode() );
-                    log.error( "GroupID.class=" + name.groupId.getClass() );
-                    log.error( "AttrName hashcode=" + name.attrName.hashCode() );
-                    log.error( "AttrName.class=" + name.attrName.getClass() );
-                }
-                dumpMap();
-            }
-            else if ( map.get( li.getKey() ) == null )
-            {
-                log.error( "verifycache: linked list retrieval returned null for key: " + li.getKey() );
-            }
-        }
-
-        log.debug( "verifycache: checking linked list by value " );
-        for (LRUElementDescriptor<K, V> li3 = list.getFirst(); li3 != null; li3 = (LRUElementDescriptor<K, V>) li3.next )
-        {
-            if ( map.containsValue( li3 ) == false )
-            {
-                log.error( "verifycache: map does not contain value : " + li3 );
-                dumpMap();
-            }
-        }
-
-        log.debug( "verifycache: checking via keysets!" );
-        for (Iterator<K> itr2 = map.keySet().iterator(); itr2.hasNext(); )
-        {
-            found = false;
-            Serializable val = null;
-            try
-            {
-                val = (Serializable) itr2.next();
-            }
-            catch ( NoSuchElementException nse )
-            {
-                log.error( "verifycache: no such element exception" );
-                continue;
-            }
-
-            for (LRUElementDescriptor<K, V> li2 = list.getFirst(); li2 != null; li2 = (LRUElementDescriptor<K, V>) li2.next )
-            {
-                if ( val.equals( li2.getKey() ) )
-                {
-                    found = true;
-                    break;
-                }
-            }
-            if ( !found )
-            {
-                log.error( "verifycache: key not found in list : " + val );
-                dumpCacheEntries();
-                if ( map.containsKey( val ) )
-                {
-                    log.error( "verifycache: map contains key" );
-                }
-                else
-                {
-                    log.error( "verifycache: map does NOT contain key, what the HECK!" );
-                }
-            }
-        }
-    }
-
-    /**
-     * Logs an error is an element that should be in the cache is not.
-     * <p>
-     * @param key
-     */
-    @SuppressWarnings("unchecked") // No generics for public fields
-    protected void verifyCache( Object key )
-    {
-        if ( !log.isDebugEnabled() )
-        {
-            return;
-        }
-
-        boolean found = false;
-
-        // go through the linked list looking for the key
-        for (LRUElementDescriptor<K, V> li = list.getFirst(); li != null; li = (LRUElementDescriptor<K, V>) li.next )
-        {
-            if ( li.getKey() == key )
-            {
-                found = true;
-                log.debug( "verifycache(key) key match: " + key );
-                break;
-            }
-        }
-        if ( !found )
-        {
-            log.error( "verifycache(key), couldn't find key! : " + key );
-        }
-    }
-
-    /**
-     * This is called when an item is removed from the LRU. We just log some information.
-     * <p>
-     * Children can implement this method for special behavior.
-     * @param key
-     * @param value
-     */
-    protected void processRemovedLRU(K key, V value )
-    {
-        if ( log.isDebugEnabled() )
-        {
-            log.debug( "Removing key: [" + key + "] from LRUMap store, value = [" + value + "]" );
-            log.debug( "LRUMap store size: '" + this.size() + "'." );
-        }
-    }
-
-    /**
-     * The chunk size is the number of items to remove when the max is reached. By default it is 1.
-     * <p>
-     * @param chunkSize The chunkSize to set.
-     */
-    public void setChunkSize( int chunkSize )
-    {
-        this.chunkSize = chunkSize;
-    }
-
-    /**
-     * @return Returns the chunkSize.
-     */
-    public int getChunkSize()
-    {
-        return chunkSize;
-    }
-
-    /**
-     * @return IStats
-     */
-    public IStats getStatistics()
-    {
-        IStats stats = new Stats();
-        stats.setTypeName( "LRUMap" );
-
-        ArrayList<IStatElement<?>> elems = new ArrayList<IStatElement<?>>();
-
-        elems.add(new StatElement<Integer>( "List Size", Integer.valueOf(list.size()) ) );
-        elems.add(new StatElement<Integer>( "Map Size", Integer.valueOf(map.size()) ) );
-        elems.add(new StatElement<Integer>( "Put Count", Integer.valueOf(putCnt) ) );
-        elems.add(new StatElement<Integer>( "Hit Count", Integer.valueOf(hitCnt) ) );
-        elems.add(new StatElement<Integer>( "Miss Count", Integer.valueOf(missCnt) ) );
-
-        stats.setStatElements( elems );
-
-        return stats;
-    }
-
-    /**
-     * This returns a set of entries. Our LRUMapEntry is used since the value stored in the
-     * underlying map is a node in the double linked list. We wouldn't want to return this to the
-     * client, so we construct a new entry with the payload of the node.
-     * <p>
-     * TODO we should return out own set wrapper, so we can avoid the extra object creation if it
-     * isn't necessary.
-     * <p>
-     * @see java.util.Map#entrySet()
-     */
-    @Override
-    public Set<Map.Entry<K, V>> entrySet()
-    {
-        lock.lock();
-        try
-        {
-            // TODO we should return a defensive copy
-            Set<Map.Entry<K, LRUElementDescriptor<K, V>>> entries = map.entrySet();
-            Set<Map.Entry<K, V>> unWrapped = new HashSet<Map.Entry<K, V>>();
-
-            for (Map.Entry<K, LRUElementDescriptor<K, V>> pre : entries) {
-                Map.Entry<K, V> post = new LRUMapEntry<K, V>(pre.getKey(), pre.getValue().getPayload());
-                unWrapped.add(post);
-            }
-
-            return unWrapped;
-        }
-        finally
-        {
-            lock.unlock();
-        }
-    }
-
-    /**
-     * @return map.keySet();
-     */
-    @Override
-    public Set<K> keySet()
-    {
-        // TODO fix this, it needs to return the keys inside the wrappers.
-        return map.keySet();
-    }
-
-}
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/struct/DoubleLinkedList.java b/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/struct/DoubleLinkedList.java
index e83a82c..ca4fb3e 100644
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/struct/DoubleLinkedList.java
+++ b/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/struct/DoubleLinkedList.java
@@ -96,7 +96,7 @@
      * <p>
      * @return The last node.
      */
-    public synchronized T getLast()
+    public T getLast()
     {
         if ( log.isDebugEnabled() )
         {
@@ -110,7 +110,7 @@
      * <p>
      * @return DoubleLinkedListNode, the first node.
      */
-    public synchronized T getFirst()
+    public T getFirst()
     {
         if ( log.isDebugEnabled() )
         {
@@ -208,50 +208,53 @@
      * @param me Description of the Parameter
      * @return true if an element was removed.
      */
-    public synchronized boolean remove(T me)
+    public boolean remove(T me)
     {
         if ( log.isDebugEnabled() )
         {
             log.debug( "removing node" );
         }
 
-        if ( me.next == null )
+        synchronized (this)
         {
-            if ( me.prev == null )
+            if ( me.next == null )
             {
-                // Make sure it really is the only node before setting head and
-                // tail to null. It is possible that we will be passed a node
-                // which has already been removed from the list, in which case
-                // we should ignore it
-
-                if ( me == first && me == last )
+                if ( me.prev == null )
                 {
-                    first = last = null;
+                    // Make sure it really is the only node before setting head and
+                    // tail to null. It is possible that we will be passed a node
+                    // which has already been removed from the list, in which case
+                    // we should ignore it
+
+                    if ( me == first && me == last )
+                    {
+                        first = last = null;
+                    }
                 }
+                else
+                {
+                    // last but not the first.
+                    last = (T) me.prev;
+                    last.next = null;
+                    me.prev = null;
+                }
+            }
+            else if ( me.prev == null )
+            {
+                // first but not the last.
+                first = (T) me.next;
+                first.prev = null;
+                me.next = null;
             }
             else
             {
-                // last but not the first.
-                last = (T) me.prev;
-                last.next = null;
-                me.prev = null;
+                // neither the first nor the last.
+                me.prev.next = me.next;
+                me.next.prev = me.prev;
+                me.prev = me.next = null;
             }
+            size--;
         }
-        else if ( me.prev == null )
-        {
-            // first but not the last.
-            first = (T) me.next;
-            first.prev = null;
-            me.next = null;
-        }
-        else
-        {
-            // neither the first nor the last.
-            me.prev.next = me.next;
-            me.next.prev = me.prev;
-            me.prev = me.next = null;
-        }
-        size--;
 
         return true;
     }
@@ -261,17 +264,22 @@
      * <p>
      * @return The last node if there was one to remove.
      */
-    public synchronized T removeLast()
+    public T removeLast()
     {
         if ( log.isDebugEnabled() )
         {
             log.debug( "removing last node" );
         }
         T temp = last;
-        if ( last != null )
+
+        synchronized (this)
         {
-            remove( last );
+            if ( last != null )
+            {
+                remove( last );
+            }
         }
+
         return temp;
     }
 
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/struct/LRUElementDescriptor.java b/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/struct/LRUElementDescriptor.java
deleted file mode 100644
index f728466..0000000
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/struct/LRUElementDescriptor.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.apache.commons.jcs.utils.struct;
-
-/*
- * 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.
- */
-
-/**
- * This is a node in the double linked list. It is stored as the value in the underlying map used by
- * the LRUMap class.
- */
-public class LRUElementDescriptor<K, V>
-    extends DoubleLinkedListNode<V>
-{
-    /** Don't change. */
-    private static final long serialVersionUID = 8249555756363020156L;
-
-    /** The key value */
-    private K key;
-
-    /**
-     * @param key
-     * @param payloadP
-     */
-    public LRUElementDescriptor(K key, V payloadP)
-    {
-        super(payloadP);
-        this.setKey(key);
-    }
-
-    /**
-     * @param key The key to set.
-     */
-    public void setKey(K key)
-    {
-        this.key = key;
-    }
-
-    /**
-     * @return Returns the key.
-     */
-    public K getKey()
-    {
-        return key;
-    }
-}
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/struct/LRUMap.java b/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/struct/LRUMap.java
deleted file mode 100644
index fa100b2..0000000
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/struct/LRUMap.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package org.apache.commons.jcs.utils.struct;
-
-/*
- * 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.
- */
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-/**
- *
- * @author Wiktor Niesiobędzki
- *
- *         Simple LRUMap implementation that keeps the number of the objects below or equal maxObjects
- *
- * @param <K>
- * @param <V>
- */
-public class LRUMap<K, V> extends AbstractLRUMap<K, V>
-{
-
-    /** if the max is less than 0, there is no limit! */
-    int maxObjects = -1;
-    AtomicInteger counter = new AtomicInteger(0);
-
-    public LRUMap()
-    {
-        super();
-    }
-
-    /**
-     *
-     * @param maxObjects
-     *            maximum number to keep in the map
-     */
-    public LRUMap(int maxObjects)
-    {
-        super();
-        this.maxObjects = maxObjects;
-    }
-
-    @Override
-    public boolean shouldRemove()
-    {
-        return maxObjects > 0 && this.size() > maxObjects;
-    }
-
-    public Object getMaxCounter()
-    {
-        return maxObjects;
-    }
-}
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/struct/LRUMapEntry.java b/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/struct/LRUMapEntry.java
deleted file mode 100644
index 5747244..0000000
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/struct/LRUMapEntry.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package org.apache.commons.jcs.utils.struct;
-
-/*
- * 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.
- */
-
-import java.io.Serializable;
-import java.util.Map.Entry;
-
-/**
- * Entry for the LRUMap.
- * <p>
- * @author Aaron Smuts
- */
-public class LRUMapEntry<K, V>
-    implements Entry<K, V>, Serializable
-{
-    /** Don't change */
-    private static final long serialVersionUID = -8176116317739129331L;
-
-    /** key */
-    private final K key;
-
-    /** value */
-    private V value;
-
-    /**
-     * S
-     * @param key
-     * @param value
-     */
-    public LRUMapEntry(K key, V value)
-    {
-        this.key = key;
-        this.value = value;
-    }
-
-    /**
-     * @return key
-     */
-    @Override
-    public K getKey()
-    {
-        return this.key;
-    }
-
-    /**
-     * @return value
-     */
-    @Override
-    public V getValue()
-    {
-        return this.value;
-    }
-
-    /**
-     * @param valueArg
-     * @return the old value
-     */
-    @Override
-    public V setValue(V valueArg)
-    {
-        V old = this.value;
-        this.value = valueArg;
-        return old;
-    }
-}
diff --git a/commons-jcs-core/src/test/java/org/apache/commons/jcs/JCSConcurrentCacheAccessUnitTest.java b/commons-jcs-core/src/test/java/org/apache/commons/jcs/JCSConcurrentCacheAccessUnitTest.java
index 7a1d7c2..47e2e7c 100644
--- a/commons-jcs-core/src/test/java/org/apache/commons/jcs/JCSConcurrentCacheAccessUnitTest.java
+++ b/commons-jcs-core/src/test/java/org/apache/commons/jcs/JCSConcurrentCacheAccessUnitTest.java
@@ -24,11 +24,11 @@
 import java.util.List;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import junit.framework.TestCase;
-
 import org.apache.commons.jcs.access.GroupCacheAccess;
 import org.apache.commons.jcs.access.exception.CacheException;
 
+import junit.framework.TestCase;
+
 /**
  * Test Case for JCS-73, modeled after the Groovy code by Alexander Kleymenov
  *
@@ -37,7 +37,7 @@
  */
 public class JCSConcurrentCacheAccessUnitTest extends TestCase
 {
-    private final static int THREADS = 10;
+    private final static int THREADS = 30;
     private final static int LOOPS = 10000;
 
     /**
diff --git a/commons-jcs-core/src/test/java/org/apache/commons/jcs/auxiliary/MockAuxiliaryCache.java b/commons-jcs-core/src/test/java/org/apache/commons/jcs/auxiliary/MockAuxiliaryCache.java
index eee805e..3b59fc2 100644
--- a/commons-jcs-core/src/test/java/org/apache/commons/jcs/auxiliary/MockAuxiliaryCache.java
+++ b/commons-jcs-core/src/test/java/org/apache/commons/jcs/auxiliary/MockAuxiliaryCache.java
@@ -42,9 +42,15 @@
     /** Can setup status */
     public CacheStatus status = CacheStatus.ALIVE;
 
-    /** Times getMatching was Called */
+    /** Times getMatching was called */
     public int getMatchingCallCount = 0;
 
+    /** Times update was called */
+    public int updateCallCount = 0;
+
+    /** Last updated item */
+    public ICacheElement<K, V> lastUpdatedItem = null;
+
     /**
      * @param ce
      * @throws IOException
@@ -53,8 +59,8 @@
     public void update( ICacheElement<K, V> ce )
         throws IOException
     {
-        // TODO Auto-generated method stub
-
+        updateCallCount++;
+        lastUpdatedItem = ce;
     }
 
     /**
diff --git a/commons-jcs-core/src/test/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDiskCacheKeyStoreUnitTest.java b/commons-jcs-core/src/test/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDiskCacheKeyStoreUnitTest.java
index a6d5f70..e8d1ed7 100644
--- a/commons-jcs-core/src/test/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDiskCacheKeyStoreUnitTest.java
+++ b/commons-jcs-core/src/test/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDiskCacheKeyStoreUnitTest.java
@@ -1,5 +1,7 @@
 package org.apache.commons.jcs.auxiliary.disk.block;
 
+import org.apache.commons.jcs.auxiliary.disk.behavior.IDiskCacheAttributes.DiskLimitType;
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -21,8 +23,6 @@
 
 import junit.framework.TestCase;
 
-import org.apache.commons.jcs.auxiliary.disk.behavior.IDiskCacheAttributes.DiskLimitType;
-
 /**
  * Tests for the keyStore.
  * <p>
@@ -170,7 +170,7 @@
         }
     }
 
-    public void testObjectLargerThanMaxSize()
+    public void OFFtestObjectLargerThanMaxSize()
     {
         BlockDiskCacheAttributes attributes = new BlockDiskCacheAttributes();
         attributes.setCacheName("testObjectLargerThanMaxSize");
diff --git a/commons-jcs-core/src/test/java/org/apache/commons/jcs/auxiliary/disk/indexed/IndexDiskCacheSizeUnitTest.java b/commons-jcs-core/src/test/java/org/apache/commons/jcs/auxiliary/disk/indexed/IndexDiskCacheSizeUnitTest.java
index 66975c6..f3d7f9d 100644
--- a/commons-jcs-core/src/test/java/org/apache/commons/jcs/auxiliary/disk/indexed/IndexDiskCacheSizeUnitTest.java
+++ b/commons-jcs-core/src/test/java/org/apache/commons/jcs/auxiliary/disk/indexed/IndexDiskCacheSizeUnitTest.java
@@ -26,85 +26,85 @@
 import org.apache.commons.jcs.engine.CacheElement;
 import org.apache.commons.jcs.engine.behavior.ICacheElement;
 
-public class IndexDiskCacheSizeUnitTest extends IndexDiskCacheUnitTestAbstract {
+public class IndexDiskCacheSizeUnitTest extends IndexDiskCacheUnitTestAbstract
+{
+    @Override
+    public IndexedDiskCacheAttributes getCacheAttributes()
+    {
+        IndexedDiskCacheAttributes ret = new IndexedDiskCacheAttributes();
+        ret.setDiskLimitType(DiskLimitType.SIZE);
+        return ret;
+    }
 
-	@Override
-	public IndexedDiskCacheAttributes getCacheAttributes() {
-		IndexedDiskCacheAttributes ret = new IndexedDiskCacheAttributes();
-		ret.setDiskLimitType(DiskLimitType.SIZE);
-		return ret;
-	}
-	  public void testRecycleBin()
-		        throws IOException
-		    {
-		        IndexedDiskCacheAttributes cattr = getCacheAttributes();
-		        cattr.setCacheName( "testRemoveItems" );
-		        cattr.setOptimizeAtRemoveCount( 7 );
-		        cattr.setMaxKeySize( 8); // 1kb DiskTestObject takes 1420 bytes, so 5*1420 = 7100, so to keep 5 ojbects, we need max key size of 8
-		        cattr.setMaxPurgatorySize( 0 );
-		        cattr.setDiskPath( "target/test-sandbox/BreakIndexTest" );
-		        IndexedDiskCache<String, DiskTestObject> disk = new IndexedDiskCache<String, DiskTestObject>( cattr );
+    public void testRecycleBin()
+            throws IOException
+    {
+        IndexedDiskCacheAttributes cattr = getCacheAttributes();
+        cattr.setCacheName("testRemoveItems");
+        cattr.setOptimizeAtRemoveCount(7);
+        cattr.setMaxKeySize(8); // 1kb DiskTestObject takes 1420 bytes, so
+                                // 5*1420 = 7100, so to keep 5 objects, we need
+                                // max key size of 8
+        cattr.setMaxPurgatorySize(0);
+        cattr.setDiskPath("target/test-sandbox/BreakIndexTest");
+        IndexedDiskCache<String, DiskTestObject> disk = new IndexedDiskCache<String, DiskTestObject>(cattr);
 
-		        String[] test = { "a", "bb", "ccc", "dddd", "eeeee", "ffffff", "ggggggg", "hhhhhhhhh", "iiiiiiiiii" };
-		        String[] expect = { null, "bb", "ccc", null, null, "ffffff", null, "hhhhhhhhh", "iiiiiiiiii" };
-		        DiskTestObject value = DiskTestObjectUtil.createCacheElementsWithTestObjects( 1, 1, cattr .getCacheName())[0].getVal();
-		        //System.out.println( "------------------------- testRecycleBin " );
+        String[] test = { "a", "bb", "ccc", "dddd", "eeeee", "ffffff", "ggggggg", "hhhhhhhhh", "iiiiiiiiii" };
+        String[] expect = { null, "bb", "ccc", null, null, "ffffff", null, "hhhhhhhhh", "iiiiiiiiii" };
+        DiskTestObject value = DiskTestObjectUtil.createCacheElementsWithTestObjects(1, 1, cattr.getCacheName())[0].getVal();
+        // System.out.println( "------------------------- testRecycleBin " );
 
-		        for ( int i = 0; i < 6; i++ )
-		        {
-		            ICacheElement<String, DiskTestObject> element = new CacheElement<String, DiskTestObject>( "testRecycleBin", "key:" + test[i], value);
-		            //System.out.println( "About to add " + "key:" + test[i] + " i = " + i );
-		            disk.processUpdate( element );
-		        }
+        for (int i = 0; i < 6; i++)
+        {
+            ICacheElement<String, DiskTestObject> element = new CacheElement<String, DiskTestObject>("testRecycleBin", "key:" + test[i], value);
+            // System.out.println( "About to add " + "key:" + test[i] + " i = "
+            // + i );
+            disk.processUpdate(element);
+        }
 
-		        for ( int i = 3; i < 5; i++ )
-		        {
-		            //System.out.println( "About to remove " + "key:" + test[i] + " i = " + i );
-		            disk.remove( "key:" + test[i] );
-		        }
+        for (int i = 3; i < 5; i++)
+        {
+            // System.out.println( "About to remove " + "key:" + test[i] + " i =
+            // " + i );
+            disk.remove("key:" + test[i]);
+        }
 
-		        // there was a bug where 7 would try to be put in the empty slot left by 4's removal, but it
-		        // will not fit.
-		        for ( int i = 7; i < 9; i++ )
-		        {
-		            ICacheElement<String, DiskTestObject> element = new CacheElement<String, DiskTestObject>( "testRecycleBin", "key:" + test[i], value);
-		            //System.out.println( "About to add " + "key:" + test[i] + " i = " + i );
-		            disk.processUpdate( element );
-		        }
+        // there was a bug where 7 would try to be put in the empty slot left by
+        // 4's removal, but it
+        // will not fit.
+        for (int i = 7; i < 9; i++)
+        {
+            ICacheElement<String, DiskTestObject> element = new CacheElement<String, DiskTestObject>("testRecycleBin", "key:" + test[i], value);
+            // System.out.println( "About to add " + "key:" + test[i] + " i = "
+            // + i );
+            disk.processUpdate(element);
+        }
 
-		        try
-		        {
-		            for ( int i = 0; i < 9; i++ )
-		            {
-		                ICacheElement<String, DiskTestObject> element = disk.get( "key:" + test[i] );
-		                if ( element != null )
-		                {
-		                    //System.out.println( "element = " + element.getVal() );
-		                }
-		                else
-		                {
-		                    //System.out.println( "null --" + "key:" + test[i] );
-		                }
+        for (int i = 0; i < 9; i++)
+        {
+            ICacheElement<String, DiskTestObject> element = disk.get("key:" + test[i]);
+            if (element != null)
+            {
+                // System.out.println( "element = " + element.getVal() );
+            }
+            else
+            {
+                // System.out.println( "null --" + "key:" + test[i] );
+            }
 
-		                String expectedValue = expect[i];
-		                if ( expectedValue == null )
-		                {
-		                    assertNull( "Expected a null element", element );
-		                }
-		                else
-		                {
-		                    assertNotNull( "The element for key [" + "key:" + test[i] + "] should not be null. i = " + i,
-		                                   element );
-		                    assertEquals( "Elements contents do not match expected", element.getVal(), value );
-		                }
-		            }
-		        }
-		        catch ( Exception e )
-		        {
-		            e.printStackTrace();
-		            fail( "Should not get an exception: " + e.toString() );
-		        }
+            String expectedValue = expect[i];
+            if (expectedValue == null)
+            {
+                assertNull("Expected a null element", element);
+            }
+            else
+            {
+                assertNotNull("The element for key [" + "key:" + test[i] + "] should not be null. i = " + i,
+                        element);
+                assertEquals("Elements contents do not match expected", element.getVal(), value);
+            }
+        }
 
-		        disk.removeAll();
-		    }
+        disk.removeAll();
+    }
 }
diff --git a/commons-jcs-core/src/test/java/org/apache/commons/jcs/auxiliary/disk/indexed/LRUMapSizeVsCount.java b/commons-jcs-core/src/test/java/org/apache/commons/jcs/auxiliary/disk/indexed/LRUMapSizeVsCount.java
deleted file mode 100644
index 7599f01..0000000
--- a/commons-jcs-core/src/test/java/org/apache/commons/jcs/auxiliary/disk/indexed/LRUMapSizeVsCount.java
+++ /dev/null
@@ -1,236 +0,0 @@
-package org.apache.commons.jcs.auxiliary.disk.indexed;
-
-/*
- * 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.
- */
-
-import java.util.Map;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-/**
- * This ensures that the jcs version of the LRU map is as fast as the commons
- * version. It has been testing at .6 to .7 times the commons LRU.
- * <p>
- * @author aaronsm
- *
- */
-public class LRUMapSizeVsCount
-    extends TestCase
-{
-    /** The put put ration after the test */
-    double ratioPut = 0;
-
-    /** The ratio after the test */
-    double ratioGet = 0;
-
-    /** put size / count  ratio */
-    float targetPut = 1.2f;
-
-    /** get size / count ratio */
-    float targetGet = 1.2f;
-
-    /** Time to loop */
-    int loops = 20;
-
-    /** items to put and get per loop */
-    int tries = 100000;
-
-    /**
-     * @param testName
-     */
-    public LRUMapSizeVsCount( String testName )
-    {
-        super( testName );
-    }
-
-    /**
-     * A unit test suite for JUnit
-     * <p>
-     * @return The test suite
-     */
-    public static Test suite()
-    {
-        return new TestSuite( LRUMapSizeVsCount.class );
-    }
-
-    /**
-     * A unit test for JUnit
-     *
-     * @throws Exception
-     *                Description of the Exception
-     */
-    public void testSimpleLoad()
-        throws Exception
-    {
-        doWork();
-        assertTrue( this.ratioPut < targetPut );
-        assertTrue( this.ratioGet < targetGet );
-    }
-
-    /**
-     *
-     */
-    public void doWork()
-    {
-        long start = 0;
-        long end = 0;
-        long time = 0;
-        float tPer = 0;
-
-        long putTotalCount = 0;
-        long getTotalCount = 0;
-        long putTotalSize = 0;
-        long getTotalSize = 0;
-
-        long minTimeSizePut = Long.MAX_VALUE;
-        long minTimeSizeGet = Long.MAX_VALUE;
-        long minTimeCountPut = Long.MAX_VALUE;
-        long minTimeCountGet = Long.MAX_VALUE;
-
-        String cacheName = "LRUMap";
-        String cache2Name = "";
-
-        try
-        {
-        	IndexedDiskCacheAttributes cattr = new IndexedDiskCacheAttributes();
-        	cattr.setName("junit");
-        	cattr.setCacheName("junit");
-        	cattr.setDiskPath(".");
-        	IndexedDiskCache<String, String> idc = new IndexedDiskCache<String, String>(cattr);
-
-			Map<String, IndexedDiskElementDescriptor> cacheCount = idc.new LRUMapCountLimited( tries );
-			Map<String, IndexedDiskElementDescriptor> cacheSize = idc.new LRUMapSizeLimited( tries/1024/2 );
-
-            for ( int j = 0; j < loops; j++ )
-            {
-                cacheName = "LRU Count           ";
-                start = System.currentTimeMillis();
-                for ( int i = 0; i < tries; i++ )
-                {
-                    cacheCount.put( "key:" + i,  new IndexedDiskElementDescriptor(i, i) );
-                }
-                end = System.currentTimeMillis();
-                time = end - start;
-                putTotalCount += time;
-                minTimeCountPut = Math.min(time, minTimeCountPut);
-                tPer = Float.intBitsToFloat( (int) time ) / Float.intBitsToFloat( tries );
-                System.out.println( cacheName + " put time for " + tries + " = " + time + "; millis per = " + tPer );
-
-                start = System.currentTimeMillis();
-                for ( int i = 0; i < tries; i++ )
-                {
-                    cacheCount.get( "key:" + i );
-                }
-                end = System.currentTimeMillis();
-                time = end - start;
-                getTotalCount += time;
-                minTimeCountGet = Math.min(minTimeCountGet, time);
-                tPer = Float.intBitsToFloat( (int) time ) / Float.intBitsToFloat( tries );
-                System.out.println( cacheName + " get time for " + tries + " = " + time + "; millis per = " + tPer );
-
-                ///////////////////////////////////////////////////////////////
-                cache2Name = "LRU Size            ";
-                //or LRUMapJCS
-                //cache2Name = "Hashtable";
-                //Hashtable cache2 = new Hashtable();
-                start = System.currentTimeMillis();
-                for ( int i = 0; i < tries; i++ )
-                {
-                    cacheSize.put( "key:" + i, new IndexedDiskElementDescriptor(i, i) );
-                }
-                end = System.currentTimeMillis();
-                time = end - start;
-                putTotalSize += time;
-                minTimeSizePut = Math.min(minTimeSizePut, time);
-
-                tPer = Float.intBitsToFloat( (int) time ) / Float.intBitsToFloat( tries );
-                System.out.println( cache2Name + " put time for " + tries + " = " + time + "; millis per = " + tPer );
-
-                start = System.currentTimeMillis();
-                for ( int i = 0; i < tries; i++ )
-                {
-                    cacheSize.get( "key:" + i );
-                }
-                end = System.currentTimeMillis();
-                time = end - start;
-                getTotalSize += time;
-                minTimeSizeGet = Math.min(minTimeSizeGet, time);
-
-                tPer = Float.intBitsToFloat( (int) time ) / Float.intBitsToFloat( tries );
-                System.out.println( cache2Name + " get time for " + tries + " = " + time + "; millis per = " + tPer );
-
-                System.out.println( "\n" );
-            }
-        }
-        catch ( Exception e )
-        {
-            e.printStackTrace( System.out );
-            System.out.println( e );
-        }
-
-        long putAvCount = putTotalCount / loops;
-        long getAvCount = getTotalCount / loops;
-        long putAvSize = putTotalSize / loops;
-        long getAvSize = getTotalSize / loops;
-
-        System.out.println( "Finished " + loops + " loops of " + tries + " gets and puts" );
-
-        System.out.println( "\n" );
-        System.out.println( "Put average for " + cacheName +  " = " + putAvCount );
-        System.out.println( "Put average for " + cache2Name + " = " + putAvSize );
-        ratioPut = (putAvSize *1.0) / putAvCount;
-        System.out.println( cache2Name.trim() + " puts took " + ratioPut + " times the " + cacheName.trim() + ", the goal is <" + targetPut
-            + "x" );
-
-        System.out.println( "\n" );
-        System.out.println( "Put minimum for " + cacheName +  " = " + minTimeCountPut );
-        System.out.println( "Put minimum for " + cache2Name + " = " + minTimeSizePut );
-        ratioPut = (minTimeSizePut * 1.0) / minTimeCountPut;
-        System.out.println( cache2Name.trim() + " puts took " + ratioPut + " times the " + cacheName.trim() + ", the goal is <" + targetPut
-            + "x" );
-
-        System.out.println( "\n" );
-        System.out.println( "Get average for " + cacheName + " = " + getAvCount );
-        System.out.println( "Get average for " + cache2Name + " = " + getAvSize );
-        ratioGet = Float.intBitsToFloat( (int) getAvCount ) / Float.intBitsToFloat( (int) getAvSize );
-        ratioGet = (getAvSize * 1.0) / getAvCount;
-        System.out.println( cache2Name.trim() + " gets took " + ratioGet + " times the " + cacheName.trim() + ", the goal is <" + targetGet
-            + "x" );
-
-        System.out.println( "\n" );
-        System.out.println( "Get minimum for " + cacheName +  " = " + minTimeCountGet );
-        System.out.println( "Get minimum for " + cache2Name + " = " + minTimeSizeGet );
-        ratioPut = (minTimeSizeGet * 1.0) / minTimeCountGet;
-        System.out.println( cache2Name.trim() + " puts took " + ratioPut + " times the " + cacheName.trim() + ", the goal is <" + targetGet
-            + "x" );
-
-    }
-
-    /**
-     * @param args
-     */
-    public static void main( String args[] )
-    {
-    	LRUMapSizeVsCount test = new LRUMapSizeVsCount( "command" );
-        test.doWork();
-    }
-
-}
diff --git a/commons-jcs-core/src/test/java/org/apache/commons/jcs/auxiliary/lateral/socket/tcp/TestTCPLateralUnitTest.java b/commons-jcs-core/src/test/java/org/apache/commons/jcs/auxiliary/lateral/socket/tcp/TestTCPLateralUnitTest.java
index eeaa8ee..4184ccc 100644
--- a/commons-jcs-core/src/test/java/org/apache/commons/jcs/auxiliary/lateral/socket/tcp/TestTCPLateralUnitTest.java
+++ b/commons-jcs-core/src/test/java/org/apache/commons/jcs/auxiliary/lateral/socket/tcp/TestTCPLateralUnitTest.java
@@ -1,5 +1,22 @@
 package org.apache.commons.jcs.auxiliary.lateral.socket.tcp;
 
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.jcs.JCS;
+import org.apache.commons.jcs.auxiliary.lateral.LateralCacheAttributes;
+import org.apache.commons.jcs.auxiliary.lateral.LateralCommand;
+import org.apache.commons.jcs.auxiliary.lateral.LateralElementDescriptor;
+import org.apache.commons.jcs.engine.CacheElement;
+import org.apache.commons.jcs.engine.behavior.ICacheElement;
+import org.apache.commons.jcs.engine.behavior.ICompositeCacheManager;
+import org.apache.commons.jcs.engine.control.CompositeCache;
+import org.apache.commons.jcs.engine.control.CompositeCacheManager;
+import org.apache.commons.jcs.engine.control.MockCompositeCacheManager;
+import org.apache.commons.jcs.engine.control.group.GroupAttrName;
+import org.apache.commons.jcs.engine.control.group.GroupId;
+import org.apache.commons.jcs.utils.timing.SleepUtil;
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -20,22 +37,6 @@
  */
 
 import junit.framework.TestCase;
-import org.apache.commons.jcs.JCS;
-import org.apache.commons.jcs.auxiliary.lateral.LateralCacheAttributes;
-import org.apache.commons.jcs.auxiliary.lateral.LateralCommand;
-import org.apache.commons.jcs.auxiliary.lateral.LateralElementDescriptor;
-import org.apache.commons.jcs.engine.CacheElement;
-import org.apache.commons.jcs.engine.behavior.ICacheElement;
-import org.apache.commons.jcs.engine.behavior.ICompositeCacheManager;
-import org.apache.commons.jcs.engine.control.CompositeCache;
-import org.apache.commons.jcs.engine.control.CompositeCacheManager;
-import org.apache.commons.jcs.engine.control.MockCompositeCacheManager;
-import org.apache.commons.jcs.engine.control.group.GroupAttrName;
-import org.apache.commons.jcs.engine.control.group.GroupId;
-import org.apache.commons.jcs.utils.timing.SleepUtil;
-
-import java.util.Map;
-import java.util.Set;
 
 /**
  * Basic unit tests for the sending and receiving portions of the lateral cache.
@@ -123,7 +124,7 @@
         service.setListenerId( 123456 );
 
         // DO WORK
-        int cnt = 100;
+        long cnt = 100;
         for ( int i = 0; i < cnt; i++ )
         {
             ICacheElement<String, String> element = new CacheElement<String, String>( "test", "key" + i, "value1" );
@@ -133,7 +134,7 @@
         SleepUtil.sleepAtLeast( 1000 );
 
         // VERIFY
-        assertEquals( "Didn't get the correct number", cnt, cacheMgr.getCache().getUpdateCount() );
+        assertEquals( "Didn't get the correct number", cnt, cacheMgr.getCache().getUpdateCountLong() );
     }
 
     /**
diff --git a/commons-jcs-core/src/test/java/org/apache/commons/jcs/engine/control/CompositeCacheDiskUsageUnitTest.java b/commons-jcs-core/src/test/java/org/apache/commons/jcs/engine/control/CompositeCacheDiskUsageUnitTest.java
index 3f7a520..7f870be 100644
--- a/commons-jcs-core/src/test/java/org/apache/commons/jcs/engine/control/CompositeCacheDiskUsageUnitTest.java
+++ b/commons-jcs-core/src/test/java/org/apache/commons/jcs/engine/control/CompositeCacheDiskUsageUnitTest.java
@@ -20,30 +20,22 @@
  */
 
 import java.io.IOException;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-import junit.framework.TestCase;
+import java.util.Arrays;
+import java.util.List;
 
 import org.apache.commons.jcs.JCS;
 import org.apache.commons.jcs.access.CacheAccess;
 import org.apache.commons.jcs.access.exception.CacheException;
-import org.apache.commons.jcs.auxiliary.AbstractAuxiliaryCache;
-import org.apache.commons.jcs.auxiliary.AuxiliaryCache;
-import org.apache.commons.jcs.auxiliary.AuxiliaryCacheAttributes;
+import org.apache.commons.jcs.auxiliary.MockAuxiliaryCache;
 import org.apache.commons.jcs.engine.CacheElement;
-import org.apache.commons.jcs.engine.CacheStatus;
 import org.apache.commons.jcs.engine.CompositeCacheAttributes;
 import org.apache.commons.jcs.engine.ElementAttributes;
 import org.apache.commons.jcs.engine.behavior.ICacheElement;
 import org.apache.commons.jcs.engine.behavior.ICacheType.CacheType;
 import org.apache.commons.jcs.engine.behavior.ICompositeCacheAttributes;
 import org.apache.commons.jcs.engine.behavior.IElementAttributes;
-import org.apache.commons.jcs.engine.behavior.IElementSerializer;
-import org.apache.commons.jcs.engine.logging.behavior.ICacheEventLogger;
-import org.apache.commons.jcs.engine.stats.behavior.IStats;
+
+import junit.framework.TestCase;
 
 /**
  * Tests of the disk usage settings for the CompositeCache.
@@ -105,12 +97,12 @@
 
         CompositeCache<String, String> cache = new CompositeCache<String, String>( cattr, attr );
 
-        MockAuxCache<String, String> mock = new MockAuxCache<String, String>();
+        MockAuxiliaryCache<String, String> mock = new MockAuxiliaryCache<String, String>();
         mock.cacheType = CacheType.DISK_CACHE;
 
         @SuppressWarnings("unchecked")
-        AuxiliaryCache<String, String>[] auxArray = new AuxiliaryCache[] { mock };
-        cache.setAuxCaches( auxArray );
+        List<MockAuxiliaryCache<String, String>> aux = Arrays.asList( mock );
+        cache.setAuxCaches( aux );
 
         ICacheElement<String, String> inputElement = new CacheElement<String, String>( CACHE_NAME, "key", "value" );
 
@@ -118,7 +110,7 @@
         cache.spoolToDisk( inputElement );
 
         // VERIFY
-        assertEquals( "Wrong number of calls to the disk cache update.", 1, mock.updateCount );
+        assertEquals( "Wrong number of calls to the disk cache update.", 1, mock.updateCallCount );
         assertEquals( "Wrong element updated.", inputElement, mock.lastUpdatedItem );
     }
 
@@ -137,12 +129,12 @@
 
         CompositeCache<String, String> cache = new CompositeCache<String, String>( cattr, attr );
 
-        MockAuxCache<String, String> mock = new MockAuxCache<String, String>();
+        MockAuxiliaryCache<String, String> mock = new MockAuxiliaryCache<String, String>();
         mock.cacheType = CacheType.DISK_CACHE;
 
         @SuppressWarnings("unchecked")
-        AuxiliaryCache<String, String>[] auxArray = new AuxiliaryCache[] { mock };
-        cache.setAuxCaches( auxArray );
+        List<MockAuxiliaryCache<String, String>> aux = Arrays.asList( mock );
+        cache.setAuxCaches( aux );
 
         ICacheElement<String, String> inputElement = new CacheElement<String, String>( CACHE_NAME, "key", "value" );
 
@@ -150,7 +142,7 @@
         cache.spoolToDisk( inputElement );
 
         // VERIFY
-        assertEquals( "Wrong number of calls to the disk cache update.", 0, mock.updateCount );
+        assertEquals( "Wrong number of calls to the disk cache update.", 0, mock.updateCallCount );
     }
 
     /**
@@ -173,12 +165,12 @@
 
         CompositeCache<String, String> cache = new CompositeCache<String, String>( cattr, attr );
 
-        MockAuxCache<String, String> mock = new MockAuxCache<String, String>();
+        MockAuxiliaryCache<String, String> mock = new MockAuxiliaryCache<String, String>();
         mock.cacheType = CacheType.DISK_CACHE;
 
         @SuppressWarnings("unchecked")
-        AuxiliaryCache<String, String>[] auxArray = new AuxiliaryCache[] { mock };
-        cache.setAuxCaches( auxArray );
+        List<MockAuxiliaryCache<String, String>> aux = Arrays.asList( mock );
+        cache.setAuxCaches( aux );
 
         ICacheElement<String, String> inputElement = new CacheElement<String, String>( CACHE_NAME, "key", "value" );
 
@@ -186,7 +178,7 @@
         cache.updateAuxiliaries( inputElement, true );
 
         // VERIFY
-        assertEquals( "Wrong number of calls to the disk cache update.", 1, mock.updateCount );
+        assertEquals( "Wrong number of calls to the disk cache update.", 1, mock.updateCallCount );
         assertEquals( "Wrong element updated.", inputElement, mock.lastUpdatedItem );
     }
 
@@ -211,12 +203,12 @@
 
         CompositeCache<String, String> cache = new CompositeCache<String, String>( cattr, attr );
 
-        MockAuxCache<String, String> mock = new MockAuxCache<String, String>();
+        MockAuxiliaryCache<String, String> mock = new MockAuxiliaryCache<String, String>();
         mock.cacheType = CacheType.DISK_CACHE;
 
         @SuppressWarnings("unchecked")
-        AuxiliaryCache<String, String>[] auxArray = new AuxiliaryCache[] { mock };
-        cache.setAuxCaches( auxArray );
+        List<MockAuxiliaryCache<String, String>> aux = Arrays.asList( mock );
+        cache.setAuxCaches( aux );
 
         ICacheElement<String, String> inputElement = new CacheElement<String, String>( CACHE_NAME, "key", "value" );
 
@@ -224,7 +216,7 @@
         cache.updateAuxiliaries( inputElement, false );
 
         // VERIFY
-        assertEquals( "Wrong number of calls to the disk cache update.", 1, mock.updateCount );
+        assertEquals( "Wrong number of calls to the disk cache update.", 1, mock.updateCallCount );
         assertEquals( "Wrong element updated.", inputElement, mock.lastUpdatedItem );
     }
 
@@ -249,12 +241,12 @@
 
         CompositeCache<String, String> cache = new CompositeCache<String, String>( cattr, attr );
 
-        MockAuxCache<String, String> mock = new MockAuxCache<String, String>();
+        MockAuxiliaryCache<String, String> mock = new MockAuxiliaryCache<String, String>();
         mock.cacheType = CacheType.DISK_CACHE;
 
         @SuppressWarnings("unchecked")
-        AuxiliaryCache<String, String>[] auxArray = new AuxiliaryCache[] { mock };
-        cache.setAuxCaches( auxArray );
+        List<MockAuxiliaryCache<String, String>> aux = Arrays.asList( mock );
+        cache.setAuxCaches( aux );
 
         ICacheElement<String, String> inputElement = new CacheElement<String, String>( CACHE_NAME, "key", "value" );
 
@@ -262,7 +254,7 @@
         cache.updateAuxiliaries( inputElement, true );
 
         // VERIFY
-        assertEquals( "Wrong number of calls to the disk cache update.", 0, mock.updateCount );
+        assertEquals( "Wrong number of calls to the disk cache update.", 0, mock.updateCallCount );
     }
 
     /**
@@ -285,15 +277,15 @@
 
         CompositeCache<String, String> cache = new CompositeCache<String, String>( cattr, attr );
 
-        MockAuxCache<String, String> mock = new MockAuxCache<String, String>();
+        MockAuxiliaryCache<String, String> mock = new MockAuxiliaryCache<String, String>();
         mock.cacheType = CacheType.DISK_CACHE;
 
-        MockAuxCache<String, String> mockLateral = new MockAuxCache<String, String>();
+        MockAuxiliaryCache<String, String> mockLateral = new MockAuxiliaryCache<String, String>();
         mockLateral.cacheType = CacheType.LATERAL_CACHE;
 
         @SuppressWarnings("unchecked")
-        AuxiliaryCache<String, String>[] auxArray = new AuxiliaryCache[] { mock, mockLateral };
-        cache.setAuxCaches( auxArray );
+        List<MockAuxiliaryCache<String, String>> aux = Arrays.asList( mock, mockLateral );
+        cache.setAuxCaches( aux );
 
         ICacheElement<String, String> inputElement = new CacheElement<String, String>( CACHE_NAME, "key", "value" );
 
@@ -301,210 +293,10 @@
         cache.updateAuxiliaries( inputElement, false );
 
         // VERIFY
-        assertEquals( "Wrong number of calls to the disk cache update.", 1, mock.updateCount );
+        assertEquals( "Wrong number of calls to the disk cache update.", 1, mock.updateCallCount );
         assertEquals( "Wrong element updated.", inputElement, mock.lastUpdatedItem );
 
-        assertEquals( "Wrong number of calls to the lateral cache update.", 1, mockLateral.updateCount );
+        assertEquals( "Wrong number of calls to the lateral cache update.", 1, mockLateral.updateCallCount );
         assertEquals( "Wrong element updated with lateral.", inputElement, mockLateral.lastUpdatedItem );
     }
-
-    /**
-     * Used to test the disk cache functionality.
-     * <p>
-     * @author Aaron Smuts
-     */
-    public static class MockAuxCache<K, V>
-        extends AbstractAuxiliaryCache<K, V>
-    {
-        /** The last item passed to update. */
-        public ICacheElement<K, V> lastUpdatedItem;
-
-        /** The number of times update was called. */
-        public int updateCount = 0;
-
-        /** The type that should be returned from getCacheType. */
-        public CacheType cacheType = CacheType.DISK_CACHE;
-
-        /** Resets counters and catchers. */
-        public void reset()
-        {
-            updateCount = 0;
-            lastUpdatedItem = null;
-        }
-
-        /**
-         * @param ce
-         * @throws IOException
-         */
-        @Override
-        public void update( ICacheElement<K, V> ce )
-            throws IOException
-        {
-            lastUpdatedItem = ce;
-            updateCount++;
-        }
-
-        /**
-         * @param key
-         * @return ICacheElement
-         * @throws IOException
-         */
-        @Override
-        public ICacheElement<K, V> get( K key )
-            throws IOException
-        {
-            return null;
-        }
-
-        /**
-         * Gets multiple items from the cache based on the given set of keys.
-         * <p>
-         * @param keys
-         * @return a map of K key to ICacheElement&lt;K, V&gt; element, or an empty map if there is
-         *         no data in cache for any of these keys
-         */
-        @Override
-        public Map<K, ICacheElement<K, V>> getMultiple(Set<K> keys)
-        {
-            return new HashMap<K, ICacheElement<K, V>>();
-        }
-
-        /**
-         * @param key
-         * @return false
-         * @throws IOException
-         */
-        @Override
-        public boolean remove( K key )
-            throws IOException
-        {
-            return false;
-        }
-
-        /** @throws IOException */
-        @Override
-        public void removeAll()
-            throws IOException
-        {
-            // noop
-        }
-
-        /** @throws IOException */
-        @Override
-        public void dispose()
-            throws IOException
-        {
-            // noop
-        }
-
-        /** @return 0 */
-        @Override
-        public int getSize()
-        {
-            return 0;
-        }
-
-        /** @return 0 */
-        @Override
-        public CacheStatus getStatus()
-        {
-            return CacheStatus.ALIVE;
-        }
-
-        /** @return null */
-        @Override
-        public String getCacheName()
-        {
-            return null;
-        }
-
-        /**
-         * @return null
-         * @throws IOException
-         */
-        @Override
-        public Set<K> getKeySet( )
-            throws IOException
-        {
-            return null;
-        }
-
-        /** @return null */
-        @Override
-        public IStats getStatistics()
-        {
-            return null;
-        }
-
-        /** @return null */
-        @Override
-        public String getStats()
-        {
-            return null;
-        }
-
-        /**
-         * Returns the setup cache type. This allows you to use this mock as multiple cache types.
-         * <p>
-         * @see org.apache.commons.jcs.engine.behavior.ICacheType#getCacheType()
-         * @return cacheType
-         */
-        @Override
-        public CacheType getCacheType()
-        {
-            return cacheType;
-        }
-
-        /**
-         * @return Returns the AuxiliaryCacheAttributes.
-         */
-        @Override
-        public AuxiliaryCacheAttributes getAuxiliaryCacheAttributes()
-        {
-            return null;
-        }
-
-        /**
-         * @param cacheEventLogger
-         */
-        @Override
-        public void setCacheEventLogger( ICacheEventLogger cacheEventLogger )
-        {
-            // TODO Auto-generated method stub
-
-        }
-
-        /**
-         * @param elementSerializer
-         */
-        @Override
-        public void setElementSerializer( IElementSerializer elementSerializer )
-        {
-            // TODO Auto-generated method stub
-
-        }
-
-        /** @return null */
-        @Override
-        public String getEventLoggingExtraInfo()
-        {
-            // TODO Auto-generated method stub
-            return null;
-        }
-
-        /**
-         * @param pattern
-         * @return Collections.EMPTY_MAP;
-         * @throws IOException
-         */
-        @Override
-        public Map<K, ICacheElement<K, V>> getMatching(String pattern)
-            throws IOException
-        {
-            return Collections.emptyMap();
-        }
-
-
-    }
-
 }
diff --git a/commons-jcs-core/src/test/java/org/apache/commons/jcs/engine/control/CompositeCacheUnitTest.java b/commons-jcs-core/src/test/java/org/apache/commons/jcs/engine/control/CompositeCacheUnitTest.java
index 7f012c6..febe989 100644
--- a/commons-jcs-core/src/test/java/org/apache/commons/jcs/engine/control/CompositeCacheUnitTest.java
+++ b/commons-jcs-core/src/test/java/org/apache/commons/jcs/engine/control/CompositeCacheUnitTest.java
@@ -1,5 +1,20 @@
 package org.apache.commons.jcs.engine.control;
 
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.jcs.auxiliary.MockAuxiliaryCache;
+import org.apache.commons.jcs.engine.CacheElement;
+import org.apache.commons.jcs.engine.CompositeCacheAttributes;
+import org.apache.commons.jcs.engine.ElementAttributes;
+import org.apache.commons.jcs.engine.behavior.ICacheElement;
+import org.apache.commons.jcs.engine.behavior.ICacheType.CacheType;
+import org.apache.commons.jcs.engine.behavior.ICompositeCacheAttributes;
+import org.apache.commons.jcs.engine.behavior.IElementAttributes;
+import org.apache.commons.jcs.engine.memory.MockMemoryCache;
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -20,19 +35,6 @@
  */
 
 import junit.framework.TestCase;
-import org.apache.commons.jcs.auxiliary.AuxiliaryCache;
-import org.apache.commons.jcs.auxiliary.MockAuxiliaryCache;
-import org.apache.commons.jcs.engine.CacheElement;
-import org.apache.commons.jcs.engine.CompositeCacheAttributes;
-import org.apache.commons.jcs.engine.ElementAttributes;
-import org.apache.commons.jcs.engine.behavior.ICacheElement;
-import org.apache.commons.jcs.engine.behavior.ICacheType.CacheType;
-import org.apache.commons.jcs.engine.behavior.ICompositeCacheAttributes;
-import org.apache.commons.jcs.engine.behavior.IElementAttributes;
-import org.apache.commons.jcs.engine.memory.MockMemoryCache;
-
-import java.io.IOException;
-import java.util.Map;
 
 /**
  * Tests that directly engage the composite cache.
@@ -64,7 +66,7 @@
         MockAuxiliaryCache<String, Integer> diskMock = new MockAuxiliaryCache<String, Integer>();
         diskMock.cacheType = CacheType.DISK_CACHE;
         @SuppressWarnings("unchecked")
-        AuxiliaryCache<String, Integer>[] aux = new AuxiliaryCache[] { diskMock };
+        List<MockAuxiliaryCache<String, Integer>> aux = Arrays.asList( diskMock );
         cache.setAuxCaches( aux );
 
         // DO WORK
@@ -104,7 +106,7 @@
         MockAuxiliaryCache<String, Integer> diskMock = new MockAuxiliaryCache<String, Integer>();
         diskMock.cacheType = CacheType.REMOTE_CACHE;
         @SuppressWarnings("unchecked")
-        AuxiliaryCache<String, Integer>[] aux = new AuxiliaryCache[] { diskMock };
+        List<MockAuxiliaryCache<String, Integer>> aux = Arrays.asList( diskMock );
         cache.setAuxCaches( aux );
 
         // DO WORK
@@ -147,7 +149,7 @@
         MockAuxiliaryCache<String, Integer> diskMock = new MockAuxiliaryCache<String, Integer>();
         diskMock.cacheType = CacheType.DISK_CACHE;
         @SuppressWarnings("unchecked")
-        AuxiliaryCache<String, Integer>[] aux = new AuxiliaryCache[] { diskMock };
+        List<MockAuxiliaryCache<String, Integer>> aux = Arrays.asList( diskMock );
         cache.setAuxCaches( aux );
 
         // DO WORK
@@ -199,7 +201,7 @@
         MockAuxiliaryCache<String, Integer> diskMock = new MockAuxiliaryCache<String, Integer>();
         diskMock.cacheType = CacheType.DISK_CACHE;
         @SuppressWarnings("unchecked")
-        AuxiliaryCache<String, Integer>[] aux = new AuxiliaryCache[] { diskMock };
+        List<MockAuxiliaryCache<String, Integer>> aux = Arrays.asList( diskMock );
         cache.setAuxCaches( aux );
 
         // DO WORK
@@ -233,7 +235,7 @@
         MockAuxiliaryCache<String, Integer> diskMock = new MockAuxiliaryCache<String, Integer>();
         diskMock.cacheType = CacheType.REMOTE_CACHE;
         @SuppressWarnings("unchecked")
-        AuxiliaryCache<String, Integer>[] aux = new AuxiliaryCache[] { diskMock };
+        List<MockAuxiliaryCache<String, Integer>> aux = Arrays.asList( diskMock );
         cache.setAuxCaches( aux );
 
         // DO WORK
diff --git a/commons-jcs-core/src/test/java/org/apache/commons/jcs/utils/struct/JCSvsCommonsLRUMapPerformanceTest.java b/commons-jcs-core/src/test/java/org/apache/commons/jcs/utils/struct/JCSvsCommonsLRUMapPerformanceTest.java
deleted file mode 100644
index a09e025..0000000
--- a/commons-jcs-core/src/test/java/org/apache/commons/jcs/utils/struct/JCSvsCommonsLRUMapPerformanceTest.java
+++ /dev/null
@@ -1,214 +0,0 @@
-package org.apache.commons.jcs.utils.struct;
-
-/*
- * 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.
- */
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.apache.commons.jcs.JCSvsHashtablePerformanceTest;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import java.util.Map;
-
-/**
- * This ensures that the jcs version of the LRU map is as fast as the commons
- * version. It has been testing at .6 to .7 times the commons LRU.
- *
- */
-public class JCSvsCommonsLRUMapPerformanceTest
-    extends TestCase
-{
-    /** jcs / commons */
-    float ratioPut = 0;
-
-    /** jcs / commons */
-    float ratioGet = 0;
-
-    /** goal */
-    float target = 1.0f;
-
-    /** loops */
-    int loops = 20;
-
-    /** number to test with */
-    int tries = 100000;
-
-    /**
-     * @param testName
-     */
-    public JCSvsCommonsLRUMapPerformanceTest( String testName )
-    {
-        super( testName );
-    }
-
-    /**
-     * A unit test suite for JUnit
-     *
-     * @return The test suite
-     */
-    public static Test suite()
-    {
-        return new TestSuite( JCSvsCommonsLRUMapPerformanceTest.class );
-    }
-
-    /**
-     * A unit test for JUnit
-     *
-     * @throws Exception
-     *                Description of the Exception
-     */
-    public void testSimpleLoad()
-        throws Exception
-    {
-        Log log = LogFactory.getLog( LRUMap.class );
-        if ( log.isDebugEnabled() )
-        {
-            System.out.println( "The log level must be at info or above for the a performance test." );
-            return;
-        }
-
-        doWork();
-        assertTrue( this.ratioPut < target );
-        assertTrue( this.ratioGet < target );
-    }
-
-    /**
-     *
-     */
-    public void doWork()
-    {
-
-        long start = 0;
-        long end = 0;
-        long time = 0;
-        float tPer = 0;
-
-        long putTotalJCS = 0;
-        long getTotalJCS = 0;
-        long putTotalHashtable = 0;
-        long getTotalHashtable = 0;
-
-        String name = "LRUMap";
-        String cache2Name = "";
-
-        try
-        {
-
-            Map<String, String> cache = new LRUMap<String, String>( tries );
-
-            for ( int j = 0; j < loops; j++ )
-            {
-
-                name = "JCS      ";
-                start = System.currentTimeMillis();
-                for ( int i = 0; i < tries; i++ )
-                {
-                    cache.put( "key:" + i, "data" + i );
-                }
-                end = System.currentTimeMillis();
-                time = end - start;
-                putTotalJCS += time;
-                tPer = Float.intBitsToFloat( (int) time ) / Float.intBitsToFloat( tries );
-                System.out.println( name + " put time for " + tries + " = " + time + "; millis per = " + tPer );
-
-                start = System.currentTimeMillis();
-                for ( int i = 0; i < tries; i++ )
-                {
-                    cache.get( "key:" + i );
-                }
-                end = System.currentTimeMillis();
-                time = end - start;
-                getTotalJCS += time;
-                tPer = Float.intBitsToFloat( (int) time ) / Float.intBitsToFloat( tries );
-                System.out.println( name + " get time for " + tries + " = " + time + "; millis per = " + tPer );
-
-                // /////////////////////////////////////////////////////////////
-                cache2Name = "Commons  ";
-                // or LRUMapJCS
-                Map<String, String> cache2 = new org.apache.commons.collections4.map.LRUMap<String, String>( tries );
-                // cache2Name = "Hashtable";
-                // Hashtable cache2 = new Hashtable();
-                start = System.currentTimeMillis();
-                for ( int i = 0; i < tries; i++ )
-                {
-                    cache2.put( "key:" + i, "data" + i );
-                }
-                end = System.currentTimeMillis();
-                time = end - start;
-                putTotalHashtable += time;
-                tPer = Float.intBitsToFloat( (int) time ) / Float.intBitsToFloat( tries );
-                System.out.println( cache2Name + " put time for " + tries + " = " + time + "; millis per = " + tPer );
-
-                start = System.currentTimeMillis();
-                for ( int i = 0; i < tries; i++ )
-                {
-                    cache2.get( "key:" + i );
-                }
-                end = System.currentTimeMillis();
-                time = end - start;
-                getTotalHashtable += time;
-                tPer = Float.intBitsToFloat( (int) time ) / Float.intBitsToFloat( tries );
-                System.out.println( cache2Name + " get time for " + tries + " = " + time + "; millis per = " + tPer );
-
-                System.out.println( "\n" );
-            }
-
-        }
-        catch ( Exception e )
-        {
-            e.printStackTrace( System.out );
-            System.out.println( e );
-        }
-
-        long putAvJCS = putTotalJCS / loops;
-        long getAvJCS = getTotalJCS / loops;
-        long putAvHashtable = putTotalHashtable / loops;
-        long getAvHashtable = getTotalHashtable / loops;
-
-        System.out.println( "Finished " + loops + " loops of " + tries + " gets and puts" );
-
-        System.out.println( "\n" );
-        System.out.println( "Put average for LRUMap       = " + putAvJCS );
-        System.out.println( "Put average for " + cache2Name + " = " + putAvHashtable );
-        ratioPut = Float.intBitsToFloat( (int) putAvJCS ) / Float.intBitsToFloat( (int) putAvHashtable );
-        System.out.println( name + " puts took " + ratioPut + " times the " + cache2Name + ", the goal is <" + target
-            + "x" );
-
-        System.out.println( "\n" );
-        System.out.println( "Get average for LRUMap       = " + getAvJCS );
-        System.out.println( "Get average for " + cache2Name + " = " + getAvHashtable );
-        ratioGet = Float.intBitsToFloat( (int) getAvJCS ) / Float.intBitsToFloat( (int) getAvHashtable );
-        System.out.println( name + " gets took " + ratioGet + " times the " + cache2Name + ", the goal is <" + target
-            + "x" );
-
-    }
-
-    /**
-     * @param args
-     */
-    public static void main( String args[] )
-    {
-        JCSvsHashtablePerformanceTest test = new JCSvsHashtablePerformanceTest( "command" );
-        test.doWork();
-    }
-
-}
diff --git a/commons-jcs-core/src/test/java/org/apache/commons/jcs/utils/struct/LRUMapConcurrentTest.java b/commons-jcs-core/src/test/java/org/apache/commons/jcs/utils/struct/LRUMapConcurrentTest.java
deleted file mode 100644
index a0c9947..0000000
--- a/commons-jcs-core/src/test/java/org/apache/commons/jcs/utils/struct/LRUMapConcurrentTest.java
+++ /dev/null
@@ -1,257 +0,0 @@
-package org.apache.commons.jcs.utils.struct;
-
-/*
- * 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.
- */
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import java.util.Iterator;
-
-/**
- * Tests the LRUMap
- */
-public class LRUMapConcurrentTest
-    extends TestCase
-{
-    /** the number of items to use in a test */
-    private static int items = 20000;
-
-    /**
-     * Constructor for the TestSimpleLoad object
-     * @param testName Description of the Parameter
-     */
-    public LRUMapConcurrentTest( String testName )
-    {
-        super( testName );
-    }
-
-    /**
-     * A unit test suite for JUnit
-     * @return The test suite
-     */
-    public static Test suite()
-    {
-        // run the basic tests
-        TestSuite suite = new TestSuite( LRUMapConcurrentTest.class );
-
-        // run concurrent tests
-        final LRUMap<String, String> map = new LRUMap<String, String>( 2000 );
-        suite.addTest( new LRUMapConcurrentTest( "conc1" )
-        {
-            @Override
-            public void runTest()
-                throws Exception
-            {
-                this.runConcurrentPutGetTests( map, 2000 );
-            }
-        } );
-        suite.addTest( new LRUMapConcurrentTest( "conc2" )
-        {
-            @Override
-            public void runTest()
-                throws Exception
-            {
-                this.runConcurrentPutGetTests( map, 2000 );
-            }
-        } );
-        suite.addTest( new LRUMapConcurrentTest( "conc3" )
-        {
-            @Override
-            public void runTest()
-                throws Exception
-            {
-                this.runConcurrentPutGetTests( map, 2000 );
-            }
-        } );
-
-        // run more concurrent tests
-        final int max2 = 20000;
-        final LRUMap<String, String> map2 = new LRUMap<String, String>( max2 );
-        suite.addTest( new LRUMapConcurrentTest( "concB1" )
-        {
-            @Override
-            public void runTest()
-                throws Exception
-            {
-                this.runConcurrentRangeTests( map2, 10000, max2 );
-            }
-        } );
-        suite.addTest( new LRUMapConcurrentTest( "concB1" )
-        {
-            @Override
-            public void runTest()
-                throws Exception
-            {
-                this.runConcurrentRangeTests( map2, 0, 9999 );
-            }
-        } );
-
-        return suite;
-    }
-
-    /**
-     * Just test that we can put, get and remove as expected.
-     * @throws Exception Description of the Exception
-     */
-    public void testSimpleLoad()
-        throws Exception
-    {
-        LRUMap<String, String> map = new LRUMap<String, String>( items );
-
-        for ( int i = 0; i < items; i++ )
-        {
-            map.put( i + ":key", "data" + i );
-        }
-
-        for ( int i = items - 1; i >= 0; i-- )
-        {
-            String res = map.get( i + ":key" );
-            assertNotNull( "[" + i + ":key] should not be null", res );
-        }
-
-        // test removal
-        map.remove( "300:key" );
-        assertNull( map.get( "300:key" ) );
-
-    }
-
-    /**
-     * Just make sure that the LRU functions int he most simple case.
-     * @throws Exception Description of the Exception
-     */
-    public void testLRURemoval()
-        throws Exception
-    {
-        int total = 10;
-        LRUMap<String, String> map = new LRUMap<String, String>( total );
-        map.setChunkSize( 1 );
-
-        // put the max in
-        for ( int i = 0; i < total; i++ )
-        {
-            map.put( i + ":key", "data" + i );
-        }
-
-        Iterator<?> it = map.entrySet().iterator();
-        while ( it.hasNext() )
-        {
-            assertNotNull( it.next() );
-        }
-//        System.out.println( map.getStatistics() );
-
-        // get the max out backwards
-        for ( int i = total - 1; i >= 0; i-- )
-        {
-            String res = map.get( i + ":key" );
-            assertNotNull( "[" + i + ":key] should not be null", res );
-        }
-
-//        System.out.println( map.getStatistics() );
-
-        //since we got them backwards the total should be at the end.
-        // add one confirm that total is gone.
-        map.put( ( total ) + ":key", "data" + ( total ) );
-        assertNull( map.get( ( total - 1 ) + ":key" ) );
-
-    }
-
-    /**
-     * @throws Exception
-     */
-    public void testLRURemovalAgain()
-        throws Exception
-    {
-        int total = 10000;
-        LRUMap<String, String> map = new LRUMap<String, String>( total );
-        map.setChunkSize( 1 );
-
-        // put the max in
-        for ( int i = 0; i < total * 2; i++ )
-        {
-            map.put( i + ":key", "data" + i );
-        }
-
-        // get the total number, these should be null
-        for ( int i = total - 1; i >= 0; i-- )
-        {
-            assertNull( map.get( i + ":key" ) );
-
-        }
-
-        // get the total to total *2 items out, these should be foufn.
-        for ( int i = ( total * 2 ) - 1; i >= total; i-- )
-        {
-            String res = map.get( i + ":key" );
-            assertNotNull( "[" + i + ":key] should not be null", res );
-        }
-
-//        System.out.println( map.getStatistics() );
-
-    }
-
-    /**
-     * Just make sure that we can put and get concurrently
-     * @param map
-     * @param items
-     * @throws Exception
-     */
-    public void runConcurrentPutGetTests( LRUMap<String, String> map, int items )
-        throws Exception
-    {
-        for ( int i = 0; i < items; i++ )
-        {
-            map.put( i + ":key", "data" + i );
-        }
-
-        for ( int i = items - 1; i >= 0; i-- )
-        {
-            String res = map.get( i + ":key" );
-            assertNotNull( "[" + i + ":key] should not be null", res );
-        }
-    }
-
-    /**
-     * Put, get, and remove from a range. This should occur at a range that is not touched by other
-     * tests.
-     * @param map
-     * @param start
-     * @param end
-     * @throws Exception
-     */
-    public void runConcurrentRangeTests( LRUMap<String, String> map, int start, int end )
-        throws Exception
-    {
-        for ( int i = start; i < end; i++ )
-        {
-            map.put( i + ":key", "data" + i );
-        }
-
-        for ( int i = end - 1; i >= start; i-- )
-        {
-            String res = map.get( i + ":key" );
-            assertNotNull( "[" + i + ":key] should not be null", res );
-        }
-
-        // test removal
-        map.remove( start + ":key" );
-        assertNull( map.get( start + ":key" ) );
-    }
-}
diff --git a/commons-jcs-core/src/test/java/org/apache/commons/jcs/utils/struct/LRUMapConcurrentUnitTest.java b/commons-jcs-core/src/test/java/org/apache/commons/jcs/utils/struct/LRUMapConcurrentUnitTest.java
deleted file mode 100644
index 09b6005..0000000
--- a/commons-jcs-core/src/test/java/org/apache/commons/jcs/utils/struct/LRUMapConcurrentUnitTest.java
+++ /dev/null
@@ -1,267 +0,0 @@
-package org.apache.commons.jcs.utils.struct;
-
-/*
- * 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.
- */
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import java.util.Iterator;
-
-/**
- * Tests the LRUMap
- *
- */
-public class LRUMapConcurrentUnitTest
-    extends TestCase
-{
-    /** number to test with */
-    private static int items = 20000;
-
-    /**
-     * Constructor for the TestSimpleLoad object
-     * <p>
-     * @param testName
-     *            Description of the Parameter
-     */
-    public LRUMapConcurrentUnitTest( String testName )
-    {
-        super( testName );
-    }
-
-    /**
-     * A unit test suite for JUnit
-     * <p>
-     * @return The test suite
-     */
-    public static Test suite()
-    {
-        // run the basic tests
-        TestSuite suite = new TestSuite( LRUMapConcurrentUnitTest.class );
-
-        // run concurrent tests
-        final LRUMap<String, String> map = new LRUMap<String, String>( 2000 );
-        suite.addTest( new LRUMapConcurrentUnitTest( "conc1" )
-        {
-            @Override
-            public void runTest()
-                throws Exception
-            {
-                this.runConcurrentPutGetTests( map, 2000 );
-            }
-        } );
-        suite.addTest( new LRUMapConcurrentUnitTest( "conc2" )
-        {
-            @Override
-            public void runTest()
-                throws Exception
-            {
-                this.runConcurrentPutGetTests( map, 2000 );
-            }
-        } );
-        suite.addTest( new LRUMapConcurrentUnitTest( "conc3" )
-        {
-            @Override
-            public void runTest()
-                throws Exception
-            {
-                this.runConcurrentPutGetTests( map, 2000 );
-            }
-        } );
-
-        // run more concurrent tests
-        final int max2 = 20000;
-        final LRUMap<String, String> map2 = new LRUMap<String, String>( max2 );
-        suite.addTest( new LRUMapConcurrentUnitTest( "concB1" )
-        {
-            @Override
-            public void runTest()
-                throws Exception
-            {
-                this.runConcurrentRangeTests( map2, 10000, max2 );
-            }
-        } );
-        suite.addTest( new LRUMapConcurrentUnitTest( "concB1" )
-        {
-            @Override
-            public void runTest()
-                throws Exception
-            {
-                this.runConcurrentRangeTests( map2, 0, 9999 );
-            }
-        } );
-
-        return suite;
-    }
-
-    /**
-     * Just test that we can put, get and remove as expected.
-     * <p>
-     * @throws Exception
-     *                Description of the Exception
-     */
-    public void testSimpleLoad()
-        throws Exception
-    {
-        LRUMap<String, String> map = new LRUMap<String, String>( items );
-
-        for ( int i = 0; i < items; i++ )
-        {
-            map.put( i + ":key", "data" + i );
-        }
-
-        for ( int i = items - 1; i >= 0; i-- )
-        {
-            String res = map.get( i + ":key" );
-            assertNotNull( "[" + i + ":key] should not be null", res );
-        }
-
-        // test removal
-        map.remove( "300:key" );
-        assertNull( map.get( "300:key" ) );
-
-    }
-
-    /**
-     * Just make sure that the LRU functions in he most simple case.
-     *
-     * @throws Exception
-     *                Description of the Exception
-     */
-    public void testLRURemoval()
-        throws Exception
-    {
-        int total = 10;
-        LRUMap<String, String> map = new LRUMap<String, String>( total );
-        map.setChunkSize( 1 );
-
-        // put the max in
-        for ( int i = 0; i < total; i++ )
-        {
-            map.put( i + ":key", "data" + i );
-        }
-
-        Iterator<?> it = map.entrySet().iterator();
-        while ( it.hasNext() )
-        {
-            assertNotNull( it.next() );
-        }
-//        System.out.println( map.getStatistics() );
-
-        // get the max out backwards
-        for ( int i = total - 1; i >= 0; i-- )
-        {
-            String res = map.get( i + ":key" );
-            assertNotNull( "[" + i + ":key] should not be null", res );
-        }
-
-//        System.out.println( map.getStatistics() );
-
-        //since we got them backwards the total should be at the end.
-        // add one confirm that total is gone.
-        map.put( ( total ) + ":key", "data" + ( total ) );
-        assertNull( map.get( ( total - 1 ) + ":key" ) );
-
-    }
-
-    /**
-     * @throws Exception
-     */
-    public void testLRURemovalAgain()
-        throws Exception
-    {
-        int total = 10000;
-        LRUMap<String, String> map = new LRUMap<String, String>( total );
-        map.setChunkSize( 1 );
-
-        // put the max in
-        for ( int i = 0; i < total * 2; i++ )
-        {
-            map.put( i + ":key", "data" + i );
-        }
-
-        // get the total number, these should be null
-        for ( int i = total - 1; i >= 0; i-- )
-        {
-            assertNull( map.get( i + ":key" ) );
-
-        }
-
-        // get the total to total *2 items out, these should be found.
-        for ( int i = ( total * 2 ) - 1; i >= total; i-- )
-        {
-            String res = map.get( i + ":key" );
-            assertNotNull( "[" + i + ":key] should not be null", res );
-        }
-
-//        System.out.println( map.getStatistics() );
-
-    }
-
-    /**
-     * Just make sure that we can put and get concurrently
-     *
-     * @param map
-     * @param items
-     * @throws Exception
-     */
-    public void runConcurrentPutGetTests( LRUMap<String, String> map, int items )
-        throws Exception
-    {
-        for ( int i = 0; i < items; i++ )
-        {
-            map.put( i + ":key", "data" + i );
-        }
-
-        for ( int i = items - 1; i >= 0; i-- )
-        {
-            String res = map.get( i + ":key" );
-            assertNotNull( "[" + i + ":key] should not be null", res );
-        }
-    }
-
-    /**
-     * Put, get, and remove from a range. This should occur at a range that is
-     * not touched by other tests.
-     * <p>
-     * @param map
-     * @param start
-     * @param end
-     * @throws Exception
-     */
-    public void runConcurrentRangeTests( LRUMap<String, String> map, int start, int end )
-        throws Exception
-    {
-        for ( int i = start; i < end; i++ )
-        {
-            map.put( i + ":key", "data" + i );
-        }
-
-        for ( int i = end - 1; i >= start; i-- )
-        {
-            String res = map.get( i + ":key" );
-            assertNotNull( "[" + i + ":key] should not be null", res );
-        }
-
-        // test removal
-        map.remove( start + ":key" );
-        assertNull( map.get( start + ":key" ) );
-    }
-}
diff --git a/commons-jcs-core/src/test/java/org/apache/commons/jcs/utils/struct/LRUMapPerformanceTest.java b/commons-jcs-core/src/test/java/org/apache/commons/jcs/utils/struct/LRUMapPerformanceTest.java
deleted file mode 100644
index bbf851f..0000000
--- a/commons-jcs-core/src/test/java/org/apache/commons/jcs/utils/struct/LRUMapPerformanceTest.java
+++ /dev/null
@@ -1,204 +0,0 @@
-package org.apache.commons.jcs.utils.struct;
-
-/*
- * 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.
- */
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-import org.apache.commons.jcs.JCSvsHashtablePerformanceTest;
-
-import java.util.Map;
-
-/**
- * This ensures that the jcs version of the LRU map is as fast as the commons
- * version. It has been testing at .6 to .7 times the commons LRU.
- * <p>
- * @author aaronsm
- *
- */
-public class LRUMapPerformanceTest
-    extends TestCase
-{
-    /** The put put ration after the test */
-    float ratioPut = 0;
-
-    /** The ratio after the test */
-    float ratioGet = 0;
-
-    /** put jcs / commons ratio */
-    float targetPut = 1.2f;
-
-    /** get jcs / commons ratio */
-    float targetGet = .5f;
-
-    /** Time to loop */
-    int loops = 20;
-
-    /** items to put and get per loop */
-    int tries = 100000;
-
-    /**
-     * @param testName
-     */
-    public LRUMapPerformanceTest( String testName )
-    {
-        super( testName );
-    }
-
-    /**
-     * A unit test suite for JUnit
-     * <p>
-     * @return The test suite
-     */
-    public static Test suite()
-    {
-        return new TestSuite( LRUMapPerformanceTest.class );
-    }
-
-    /**
-     * A unit test for JUnit
-     *
-     * @throws Exception
-     *                Description of the Exception
-     */
-    public void testSimpleLoad()
-        throws Exception
-    {
-        doWork();
-        assertTrue( this.ratioPut < targetPut );
-        assertTrue( this.ratioGet < targetGet );
-    }
-
-    /**
-     *
-     */
-    public void doWork()
-    {
-        long start = 0;
-        long end = 0;
-        long time = 0;
-        float tPer = 0;
-
-        long putTotalJCS = 0;
-        long getTotalJCS = 0;
-        long putTotalHashtable = 0;
-        long getTotalHashtable = 0;
-
-        String name = "LRUMap";
-        String cache2Name = "";
-
-        try
-        {
-            Map<String, String> cache = new LRUMap<String, String>( tries );
-
-            for ( int j = 0; j < loops; j++ )
-            {
-                name = "JCS      ";
-                start = System.currentTimeMillis();
-                for ( int i = 0; i < tries; i++ )
-                {
-                    cache.put( "key:" + i, "data" + i );
-                }
-                end = System.currentTimeMillis();
-                time = end - start;
-                putTotalJCS += time;
-                tPer = Float.intBitsToFloat( (int) time ) / Float.intBitsToFloat( tries );
-                System.out.println( name + " put time for " + tries + " = " + time + "; millis per = " + tPer );
-
-                start = System.currentTimeMillis();
-                for ( int i = 0; i < tries; i++ )
-                {
-                    cache.get( "key:" + i );
-                }
-                end = System.currentTimeMillis();
-                time = end - start;
-                getTotalJCS += time;
-                tPer = Float.intBitsToFloat( (int) time ) / Float.intBitsToFloat( tries );
-                System.out.println( name + " get time for " + tries + " = " + time + "; millis per = " + tPer );
-
-                ///////////////////////////////////////////////////////////////
-                cache2Name = "LRUMapJCS (commons)";
-                //or LRUMapJCS
-                Map<String, String> cache2 = new org.apache.commons.collections4.map.LRUMap<String, String>( tries );
-                //cache2Name = "Hashtable";
-                //Hashtable cache2 = new Hashtable();
-                start = System.currentTimeMillis();
-                for ( int i = 0; i < tries; i++ )
-                {
-                    cache2.put( "key:" + i, "data" + i );
-                }
-                end = System.currentTimeMillis();
-                time = end - start;
-                putTotalHashtable += time;
-                tPer = Float.intBitsToFloat( (int) time ) / Float.intBitsToFloat( tries );
-                System.out.println( cache2Name + " put time for " + tries + " = " + time + "; millis per = " + tPer );
-
-                start = System.currentTimeMillis();
-                for ( int i = 0; i < tries; i++ )
-                {
-                    cache2.get( "key:" + i );
-                }
-                end = System.currentTimeMillis();
-                time = end - start;
-                getTotalHashtable += time;
-                tPer = Float.intBitsToFloat( (int) time ) / Float.intBitsToFloat( tries );
-                System.out.println( cache2Name + " get time for " + tries + " = " + time + "; millis per = " + tPer );
-
-                System.out.println( "\n" );
-            }
-        }
-        catch ( Exception e )
-        {
-            e.printStackTrace( System.out );
-            System.out.println( e );
-        }
-
-        long putAvJCS = putTotalJCS / loops;
-        long getAvJCS = getTotalJCS / loops;
-        long putAvHashtable = putTotalHashtable / loops;
-        long getAvHashtable = getTotalHashtable / loops;
-
-        System.out.println( "Finished " + loops + " loops of " + tries + " gets and puts" );
-
-        System.out.println( "\n" );
-        System.out.println( "Put average for LRUMap       = " + putAvJCS );
-        System.out.println( "Put average for " + cache2Name + " = " + putAvHashtable );
-        ratioPut = Float.intBitsToFloat( (int) putAvJCS ) / Float.intBitsToFloat( (int) putAvHashtable );
-        System.out.println( name + " puts took " + ratioPut + " times the " + cache2Name + ", the goal is <" + targetPut
-            + "x" );
-
-        System.out.println( "\n" );
-        System.out.println( "Get average for LRUMap       = " + getAvJCS );
-        System.out.println( "Get average for " + cache2Name + " = " + getAvHashtable );
-        ratioGet = Float.intBitsToFloat( (int) getAvJCS ) / Float.intBitsToFloat( (int) getAvHashtable );
-        System.out.println( name + " gets took " + ratioGet + " times the " + cache2Name + ", the goal is <" + targetGet
-            + "x" );
-    }
-
-    /**
-     * @param args
-     */
-    public static void main( String args[] )
-    {
-        JCSvsHashtablePerformanceTest test = new JCSvsHashtablePerformanceTest( "command" );
-        test.doWork();
-    }
-
-}
diff --git a/commons-jcs-core/src/test/java/org/apache/commons/jcs/utils/struct/LRUMapUnitTest.java b/commons-jcs-core/src/test/java/org/apache/commons/jcs/utils/struct/LRUMapUnitTest.java
deleted file mode 100644
index e05c95d..0000000
--- a/commons-jcs-core/src/test/java/org/apache/commons/jcs/utils/struct/LRUMapUnitTest.java
+++ /dev/null
@@ -1,133 +0,0 @@
-package org.apache.commons.jcs.utils.struct;
-
-/*
- * 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.
- */
-
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-import junit.framework.TestCase;
-
-/**
- * Basic unit tests for the LRUMap
- *
- * @author Aaron Smuts
- *
- */
-public class LRUMapUnitTest
-    extends TestCase
-{
-
-    /**
-     * Put up to the size limit and then make sure they are all there.
-     *
-     */
-    public void testPutWithSizeLimit()
-    {
-        int size = 10;
-        Map<String, String> cache = new LRUMap<String, String>( size );
-
-        for ( int i = 0; i < size; i++ )
-        {
-            cache.put( "key:" + i, "data:" + i );
-        }
-
-        for ( int i = 0; i < size; i++ )
-        {
-            String data = cache.get( "key:" + i );
-            assertEquals( "Data is wrong.", "data:" + i, data );
-        }
-    }
-
-    /**
-     * Put into the lru with no limit and then make sure they are all there.
-     *
-     */
-    public void testPutWithNoSizeLimit()
-    {
-        int size = 10;
-        Map<String, String> cache = new LRUMap<String, String>( );
-
-        for ( int i = 0; i < size; i++ )
-        {
-            cache.put( "key:" + i, "data:" + i );
-        }
-
-        for ( int i = 0; i < size; i++ )
-        {
-            String data = cache.get( "key:" + i );
-            assertEquals( "Data is wrong.", "data:" + i, data );
-        }
-    }
-
-    /**
-     * Put and then remove.  Make sure the element is returned.
-     *
-     */
-    public void testPutAndRemove()
-    {
-        int size = 10;
-        Map<String, String> cache = new LRUMap<String, String>( size );
-
-        cache.put( "key:" + 1, "data:" + 1 );
-        String data = cache.remove( "key:" + 1 );
-        assertEquals( "Data is wrong.", "data:" + 1, data );
-    }
-
-    /**
-     * Call remove on an empty map
-     *
-     */
-    public void testRemoveEmpty()
-    {
-        int size = 10;
-        Map<String, String> cache = new LRUMap<String, String>( size );
-
-        Object returned = cache.remove( "key:" + 1 );
-        assertNull( "Shouldn't hvae anything.", returned );
-    }
-
-
-    /**
-     * Add items to the map and then test to see that they come back in the entry set.
-     *
-     */
-    public void testGetEntrySet()
-    {
-        int size = 10;
-        Map<String, String> cache = new LRUMap<String, String>( size );
-
-        for ( int i = 0; i < size; i++ )
-        {
-            cache.put( "key:" + i, "data:" + i );
-        }
-
-        Set<Entry<String, String>> entries = cache.entrySet();
-        assertEquals( "Set contains the wrong number of items.", size, entries.size() );
-
-        // check minimal correctness
-        for (Entry<String, String> data : entries)
-        {
-            assertTrue( "Data is wrong.", data.getValue().indexOf( "data:") != -1  );
-        }
-    }
-
-
-}
