diff --git a/CHANGES b/CHANGES
index 1272e0abd324a30e337251e5cc3b08eae2976e26..2e2d8932f3dd69d8f5bd91a615458d36f6e2b4b6 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,12 +1,10 @@
 0.2.3
 - added support for Jython 2.5.
 
-- cache module now uses Beaker's clsmap to get at 
-container classes, so cache types such as 
-"ext:google", "ext:sqla", etc. are available.  
-memcached is available as both "ext:memcached" and
-"memcached", the latter for backwards compatibility.
-This requires Beaker>=1.0.1.
+- cache module now uses Beaker's CacheManager
+  object directly, so that all cache types are included.
+  memcached is available as both "ext:memcached" and
+  "memcached", the latter for backwards compatibility.
 
 - added "cache" accessor to Template, Namespace.
   e.g.  ${local.cache.get('somekey')} or
@@ -19,16 +17,23 @@ This requires Beaker>=1.0.1.
   (i.e. storage type) are derived from whatever has
   been already persisted for that template.
   [ticket:92]
+
+- For cache changes to work fully, Beaker 1.0.4 is required.
+  1.0.1 and up will work as well with the exception of 
+  cache expiry.  Note that Beaker 1.0.4 is **required**
+  for applications which use dynamically generated keys,
+  since previous versions will permanently store state in memory 
+  for each individual key and thus use up all available memory.
   
 - fixed the html_error_template not handling tracebacks from
-normal .py files with a magic encoding comment [ticket:88]
+  normal .py files with a magic encoding comment [ticket:88]
 
 - added ModuleTemplate class, which allows the construction
-of a Template given a Python module generated by a previous
-Template.   This allows Python modules alone to be used
-as templates with no compilation step.   Source code
-and template source are optional but allow error reporting
-to work correctly.
+  of a Template given a Python module generated by a previous
+  Template.   This allows Python modules alone to be used
+  as templates with no compilation step.   Source code
+  and template source are optional but allow error reporting
+  to work correctly.
 
 - fixed Python 2.3 compat. in mako.pyparser [ticket:90]
 
diff --git a/lib/mako/cache.py b/lib/mako/cache.py
index 20ceba7444821e74bfa194818369adc45df0d8be..43f7317861e449461dd33cadd5e49b8dd4c4719b 100644
--- a/lib/mako/cache.py
+++ b/lib/mako/cache.py
@@ -1,60 +1,55 @@
 from mako import exceptions
 
 try:
-    from beaker import container, exceptions, cache
-    clsmap = cache.clsmap
-
-    if 'ext:memcached' in clsmap:
-        clsmap['memcached'] = clsmap['ext:memcached']
+    from beaker import cache
+    cache = cache.CacheManager()
 except ImportError:
-    container = None
-    clsmap = {}
+    cache = None
 
 class Cache(object):
     def __init__(self, id, starttime):
         self.id = id
         self.starttime = starttime
-        if container is not None:
-            self.context = container.ContainerContext()
         self.def_regions = {}
         
     def put(self, key, value, **kwargs):
-        c = self._get_container(key, **kwargs)
-        if not c:
-            raise exceptions.RuntimeException("No cache container exists for key %r" % key)
-        c.set_value(value)
+        defname = kwargs.pop('defname', None)
+        expiretime = kwargs.pop('expiretime', None)
+        createfunc = kwargs.pop('createfunc', None)
+        
+        self._get_cache(defname, **kwargs).put_value(key, starttime=self.starttime, expiretime=expiretime)
         
     def get(self, key, **kwargs):
-        c = self._get_container(key, **kwargs)
-        if c:
-            return c.get_value()
-        else:
-            return None
+        defname = kwargs.pop('defname', None)
+        expiretime = kwargs.pop('expiretime', None)
+        createfunc = kwargs.pop('createfunc', None)
         
-    def invalidate(self, key, defname, **kwargs):
-        c = self._get_container(key, defname, **kwargs)
-        if c:
-            c.clear_value()
+        return self._get_cache(defname, **kwargs).get_value(key, starttime=self.starttime, expiretime=expiretime, createfunc=createfunc)
+        
+    def invalidate(self, key, **kwargs):
+        defname = kwargs.pop('defname', None)
+        expiretime = kwargs.pop('expiretime', None)
+        createfunc = kwargs.pop('createfunc', None)
+        
+        self._get_cache(defname, **kwargs).remove_value(key, starttime=self.starttime, expiretime=expiretime)
     
     def invalidate_body(self):
-        self.invalidate('render_body', 'render_body')
+        self.invalidate('render_body', defname='render_body')
     
     def invalidate_def(self, name):
-        self.invalidate('render_%s' % name, 'render_%s' % name)
+        self.invalidate('render_%s' % name, defname='render_%s' % name)
         
     def invalidate_closure(self, name):
-        self.invalidate(name, name)
-        
-    def _get_container(self, key, defname, **kwargs):
-        if not container:
+        self.invalidate(name, defname=name)
+    
+    def _get_cache(self, defname, type=None, **kw):
+        if not cache:
             raise exceptions.RuntimeException("the Beaker package is required to use cache functionality.")
-        
-        type = kwargs.pop('type', None)
+        if type == 'memcached':
+            type = 'ext:memcached'
         if not type:
-            type = self.def_regions.get(defname, 'memory')
+            (type, kw) = self.def_regions.get(defname, ('memory', {}))
         else:
-            self.def_regions[defname] = type
-
-        return container.Value(key, self.context, self.id, clsmap[type], starttime=self.starttime, **kwargs)
-
-
+            self.def_regions[defname] = (type, kw)
+        return cache.get_cache(self.id, type=type, **kw)
+        
\ No newline at end of file
diff --git a/setup.py b/setup.py
index bbf81dbc0b0f9d55fabe0adb3cccd6beed1f0e37..df71741a10ea1ae7f70b3c8d065bac4f3615ad12 100644
--- a/setup.py
+++ b/setup.py
@@ -37,7 +37,7 @@ SVN version:
       scripts=['scripts/mako-render'],
       zip_safe=False,
       install_requires=[
-          'Beaker>=1.0.1',
+          'Beaker>=1.0.4',
       ],
       entry_points="""
       [python.templating.engines]