diff --git a/_test/tests/inc/cache_use.test.php b/_test/tests/inc/cache_use.test.php
index f5349df1396bbe418065c0babe860901c91902d4..c54a472a32098121fe5dcea27a92c70242c30c34 100644
--- a/_test/tests/inc/cache_use.test.php
+++ b/_test/tests/inc/cache_use.test.php
@@ -10,18 +10,18 @@ class cache_use_test extends DokuWikiTest {
     private $cache;
 
     function setUp() {
-        global $ID;
+        global $ID, $conf;
         parent::setUp();
 
         $ID = 'cached';
         $file = wikiFN($ID);
+        $conf['cachetime'] = 0;  // ensure the value is not -1, which disables caching
 
         saveWikiText($ID, 'Content', 'Created');
         // set the modification time a second in the past in order to ensure that the cache is newer than the page
         touch($file, time()-1);
 
-        # Create cache. Note that the metadata cache is used as the xhtml cache triggers metadata rendering
-        $this->cache = new cache_renderer($ID, $file, 'metadata');
+        $this->cache = new cache_renderer($ID, $file, 'xhtml');
         $this->cache->storeCache('Test');
     }
 
@@ -29,8 +29,52 @@ class cache_use_test extends DokuWikiTest {
         $this->assertTrue($this->cache->useCache());
     }
 
-
+    /**
+     * In all the following tests the cache should not be usable
+     * as such, they are meaningless if test_use didn't pass.
+     *
+     * @depends test_use
+     */
     function test_purge() {
-        $this->assertFalse($this->cache->useCache(array('purge' => true)));
+        /* @var Input $INPUT */
+        global $INPUT;
+        $INPUT->set('purge',1);
+
+        $this->assertFalse($this->cache->useCache());
+        $this->assertNotEmpty($this->cache->depends['purge']);
+    }
+
+    /**
+     * @depends test_use
+     */
+    function test_filedependency() {
+        // give the dependent src file the same mtime as the cache
+        touch($this->cache->file, filemtime($this->cache->cache));
+        $this->assertFalse($this->cache->useCache());
+    }
+
+    /**
+     * @depends test_use
+     */
+    function test_age() {
+        // need to age both our source file & the cache
+        $age = 10;
+        $time = time() - $age - 1;  // older than age
+
+        touch($this->cache->file, $time - 1);
+        touch($this->cache->cache, $time);
+
+        $this->assertFalse($this->cache->useCache(array('age' => $age)));
+    }
+
+    /**
+     * @depends test_use
+     */
+    function test_confnocaching() {
+        global $conf;
+        $conf['cachetime'] = -1;   // disables renderer caching
+
+        $this->assertFalse($this->cache->useCache());
+        $this->assertNotEmpty($this->cache->_nocache);
     }
 }
\ No newline at end of file
diff --git a/inc/cache.php b/inc/cache.php
index 56c5b65f26760b884eb05f4560a0755923f807f3..7a66049f43927093a0ca0a0a73f861d680a13268 100644
--- a/inc/cache.php
+++ b/inc/cache.php
@@ -16,10 +16,11 @@ class cache {
     public $ext = '';          // file ext for cache data, secondary identifier for this item
     public $cache = '';        // cache file name
     public $depends = array(); // array containing cache dependency information,
-    //   used by _useCache to determine cache validity
+                               //   used by _useCache to determine cache validity
 
     var $_event = '';       // event to be triggered during useCache
     var $_time;
+    var $_nocache = false;  // if set to true, cache will not be used or stored
 
     /**
      * @param string $key primary identifier
@@ -34,7 +35,7 @@ class cache {
     /**
      * public method to determine whether the cache can be used
      *
-     * to assist in cetralisation of event triggering and calculation of cache statistics,
+     * to assist in centralisation of event triggering and calculation of cache statistics,
      * don't override this function override _useCache()
      *
      * @param  array   $depends   array of cache dependencies, support dependecies:
@@ -71,6 +72,7 @@ class cache {
      */
     public function _useCache() {
 
+        if ($this->_nocache) return false;                              // caching turned off
         if (!empty($this->depends['purge'])) return false;              // purge requested?
         if (!($this->_time = @filemtime($this->cache))) return false;   // cache exists?
 
@@ -115,6 +117,8 @@ class cache {
      * @return  bool           true on success, false otherwise
      */
     public function storeCache($data) {
+        if ($this->_nocache) return false;
+
         return io_savefile($this->cache, $data);
     }
 
@@ -203,10 +207,6 @@ class cache_parser extends cache {
     }
 
     protected function _addDependencies() {
-        global $conf;
-
-        $this->depends['age'] = isset($this->depends['age']) ?
-            min($this->depends['age'],$conf['cachetime']) : $conf['cachetime'];
 
         // parser cache file dependencies ...
         $files = array($this->file,                              // ... source
@@ -265,6 +265,18 @@ class cache_renderer extends cache_parser {
     }
 
     protected function _addDependencies() {
+        global $conf;
+
+        // default renderer cache file 'age' is dependent on 'cachetime' setting, two special values:
+        //    -1 : do not cache (should not be overridden)
+        //    0  : cache never expires (can be overridden) - no need to set depends['age']
+        if ($conf['cachetime'] == -1) {
+            $this->_nocache = true;
+            return;
+        } elseif ($conf['cachetime'] > 0) {
+            $this->depends['age'] = isset($this->depends['age']) ?
+                min($this->depends['age'],$conf['cachetime']) : $conf['cachetime'];
+        }
 
         // renderer cache file dependencies ...
         $files = array(
@@ -317,6 +329,8 @@ class cache_instructions extends cache_parser {
      * @return  bool                  true on success, false otherwise
      */
     public function storeCache($instructions) {
+        if ($this->_nocache) return false;
+
         return io_savefile($this->cache,serialize($instructions));
     }
 }
diff --git a/inc/parserutils.php b/inc/parserutils.php
index 8244837e1e972d44be81b592e99707494432555b..9c2a0b570fe4886c47dea60c6bc55c8f472b3eec 100644
--- a/inc/parserutils.php
+++ b/inc/parserutils.php
@@ -112,8 +112,7 @@ function p_cached_output($file, $format='xhtml', $id='') {
     } else {
         $parsed = p_render($format, p_cached_instructions($file,false,$id), $info);
 
-        if ($info['cache']) {
-            $cache->storeCache($parsed);               //save cachefile
+        if ($info['cache'] && $cache->storeCache($parsed)) {              // storeCache() attempts to save cachefile
             if($conf['allowdebug'] && $format=='xhtml') $parsed .= "\n<!-- no cachefile used, but created {$cache->cache} -->\n";
         }else{
             $cache->removeCache();                     //try to delete cachefile