Index: src/main/java/org/xwiki/cache/event/CacheEntryListener.java
===================================================================
--- src/main/java/org/xwiki/cache/event/CacheEntryListener.java	(revision 18044)
+++ src/main/java/org/xwiki/cache/event/CacheEntryListener.java	(working copy)
@@ -51,4 +51,13 @@
      * @param event the event object containing all entry informations.
      */
     void cacheEntryModified(CacheEntryEvent<T> event);
+    
+    /**
+     * Called when an existing value is invalidated in the cache.
+     * <p>
+     * The event object contains the new value.
+     * 
+     * @param event the event object containing all entry informations.
+     */
+    void cacheEntryInvalidated(CacheEntryEvent<T> event);
 }
Index: src/main/java/org/xwiki/cache/Cache.java
===================================================================
--- src/main/java/org/xwiki/cache/Cache.java	(revision 18044)
+++ src/main/java/org/xwiki/cache/Cache.java	(working copy)
@@ -33,7 +33,7 @@
 public interface Cache<T>
 {
     /**
-     * Add a new value or overwrite the existing one associated with the provided key. *
+     * Overwrite the existing one associated with the provided key. *
      * <p>
      * You can catch this events using {@link CacheEntryListener#cacheEntryAdded(CacheEntryEvent)} or
      * {@link CacheEntryListener#cacheEntryModified(CacheEntryEvent)}.
@@ -44,7 +44,23 @@
      */
     void set(String key, T value);
 
+
+
     /**
+     * Put a new value with the provided key. *
+     * This should be called in Cluster mode so that an invalidation is 
+     * NOT set the first time we read a data and set it in the cache
+     * <p>
+     * You can catch this events using {@link CacheEntryListener#cacheEntryAdded(CacheEntryEvent)} or
+     * {@link CacheEntryListener#cacheEntryModified(CacheEntryEvent)}.
+     * </p>
+     * 
+     * @param key the associated key used to access the value in the cache.
+     * @param value the value to store in the cache.
+     */
+    void put(String key, T value);
+
+    /**
      * @param key the key used to access the value in the cache.
      * @return the value associated with the provided key, or null if there is no value.
      */
Index: src/main/java/org/xwiki/cache/internal/DefaultCache.java
===================================================================
--- src/main/java/org/xwiki/cache/internal/DefaultCache.java	(revision 18044)
+++ src/main/java/org/xwiki/cache/internal/DefaultCache.java	(working copy)
@@ -51,9 +51,20 @@
 
     }
 
+
     /**
      * {@inheritDoc}
      * 
+     * @see org.xwiki.cache.Cache#put(java.lang.String, java.lang.Object)
+     */
+    public void put(String key, T obj)
+    {
+        set(key, obj);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
      * @see org.xwiki.cache.Cache#get(java.lang.String)
      */
     public T get(String key)
Index: src/main/java/org/xwiki/cache/util/AbstractCache.java
===================================================================
--- src/main/java/org/xwiki/cache/util/AbstractCache.java	(revision 18044)
+++ src/main/java/org/xwiki/cache/util/AbstractCache.java	(working copy)
@@ -54,6 +54,16 @@
 
     /**
      * {@inheritDoc}
+     *
+     * @see org.xwiki.cache.Cache#put(java.lang.String, java.lang.Object)
+     */
+    public void put(String key, T obj)
+    {
+        set(key, obj);
+    }
+
+    /**
+     * {@inheritDoc}
      * 
      * @see org.xwiki.cache.Cache#dispose()
      */
@@ -115,7 +125,7 @@
                 ((DisposableCacheValue) cacheValue).dispose();
             } catch (Throwable e) {
                 if (LOG.isWarnEnabled()) {
-                    LOG.warn("Error when trying to dispose a cache object of cache ["
+                    LOG.warn("Error when trying to dispose a cache object of cache in sendEntryRemovedEvent ["
                         + configuration.getConfigurationId() + "]", e);
                 }
             }
@@ -123,6 +133,31 @@
     }
 
     /**
+     * Helper method to send event when an existing cache entry is invalidated.
+     *
+     * @param event the event to send.
+     */
+    protected void sendEntryInvalidatedEvent(CacheEntryEvent<T> event)
+    {
+        for (org.xwiki.cache.event.CacheEntryListener<T> listener : cacheEntryListeners
+            .getListeners(org.xwiki.cache.event.CacheEntryListener.class)) {
+            listener.cacheEntryInvalidated(event);
+        }
+
+        T cacheValue = event.getEntry().getValue();
+        if (cacheValue instanceof DisposableCacheValue) {
+            try {
+                ((DisposableCacheValue) cacheValue).dispose();
+            } catch (Throwable e) {
+                if (LOG.isWarnEnabled()) {
+                    LOG.warn("Error when trying to dispose a cache object of cache in sendEntryInvalidatedEvent ["
+                        + configuration.getConfigurationId() + "]", e);
+                }
+            }
+        }
+    }
+
+    /**
      * Helper method to send event when a cache entry is modified.
      * 
      * @param event the event to send.
