diff --git a/_test/tests/inc/parserutils_get_renderer.test.php b/_test/tests/inc/parserutils_get_renderer.test.php
new file mode 100644
index 0000000000000000000000000000000000000000..69aeb3b194c5f11964d0735a738ebb6725f62b69
--- /dev/null
+++ b/_test/tests/inc/parserutils_get_renderer.test.php
@@ -0,0 +1,83 @@
+<?php
+
+class parserutils_get_renderer_test extends DokuWikiTest {
+
+    private $plugin_controller;
+
+    // test default behaviour / usual settings
+    function test_p_get_renderer_normal() {
+        global $conf;
+
+        $old_conf = $conf;
+        $conf['renderer_xhtml'] = 'xhtml';
+
+        $this->assertInstanceOf('Doku_Renderer_xhtml', p_get_renderer('xhtml'));
+
+        $conf = $old_conf;
+    }
+
+    // test get a renderer plugin
+    function test_p_get_renderer_plugin() {
+        global $conf;
+        global $plugin_controller;
+
+        $old_conf = $conf;
+        $conf['renderer_xhtml'] = 'get_renderer_test';
+        $this->plugin_controller = $plugin_controller;
+        $plugin_controller = $this;
+
+        $this->assertInstanceOf('renderer_plugin_test', p_get_renderer('xhtml'));
+
+        $conf = $old_conf;
+        $plugin_controller = $this->plugin_controller;
+    }
+
+    // test fallback succeeds
+    function test_p_get_renderer_fallback() {
+        global $conf;
+
+        $old_conf = $conf;
+        $conf['renderer_xhtml'] = 'badvalue';
+
+        $this->assertInstanceOf('Doku_Renderer_xhtml', p_get_renderer('xhtml'));
+
+        $conf = $old_conf;
+    }
+
+    // test fallback fails
+    /**
+     * @expectedException        PHPUnit_Framework_Error
+     * @expectedExceptionCode    E_USER_WARNING
+     */
+    function test_p_get_renderer_fallback_fail() {
+        global $conf;
+
+        $old_conf = $conf;
+        $conf['renderer_junk'] = 'badvalue';
+
+        $this->assertNull(p_get_renderer('junk'));
+
+        $conf = $old_conf;
+    }
+
+    // wrapper function for the fake plugin controller, return $this for the fake syntax of this test
+    function load($type,$name,$new=false,$disabled=false){
+        if ($name == 'get_renderer_test') {
+            return new renderer_plugin_test();
+        } else {
+            return $this->plugin_controller->load($type, $name, $new, $disabled);
+        }
+    }
+ }
+
+require_once DOKU_INC . 'inc/parser/xhtml.php';
+
+class renderer_plugin_test extends Doku_Renderer_xhtml {
+
+    function canRender($format) {
+      return ($format=='xhtml');
+    }
+
+}
+
+// vim:ts=4:sw=4:et:
diff --git a/inc/load.php b/inc/load.php
index 497dd6921db9c573dd6bbeb4a29abf0d62bf5e42..f1deffe19a56cf867f8fa39de04101d533a87fc3 100644
--- a/inc/load.php
+++ b/inc/load.php
@@ -96,6 +96,12 @@ function load_autoload($name){
         'DokuWiki_Remote_Plugin' => DOKU_PLUGIN.'remote.php',
         'DokuWiki_Auth_Plugin'   => DOKU_PLUGIN.'auth.php',
 
+        'Doku_Renderer'          => DOKU_INC.'inc/parser/renderer.php',
+        'Doku_Renderer_xhtml'    => DOKU_INC.'inc/parser/xhtml.php',
+        'Doku_Renderer_code'     => DOKU_INC.'inc/parser/code.php',
+        'Doku_Renderer_xhtmlsummary' => DOKU_INC.'inc/parser/xhtmlsummary.php',
+        'Doku_Renderer_metadata' => DOKU_INC.'inc/parser/metadata.php',
+
     );
 
     if(isset($classes[$name])){
diff --git a/inc/parser/code.php b/inc/parser/code.php
index 0b8e3ee026fb7f5cceb83a3f7723e3a02a6f2f04..d77ffd1aa8ec5c7b9543df11e19d99bd6e3b6b88 100644
--- a/inc/parser/code.php
+++ b/inc/parser/code.php
@@ -5,7 +5,6 @@
  * @author Andreas Gohr <andi@splitbrain.org>
  */
 if(!defined('DOKU_INC')) die('meh.');
-require_once DOKU_INC . 'inc/parser/renderer.php';
 
 class Doku_Renderer_code extends Doku_Renderer {
     var $_codeblock=0;
diff --git a/inc/parser/metadata.php b/inc/parser/metadata.php
index 8ba159d62d6c1b238ae8d14976f2819cf3e4187b..73bae190fc6a22da7b1e27fd9502dd872fa80b71 100644
--- a/inc/parser/metadata.php
+++ b/inc/parser/metadata.php
@@ -16,8 +16,6 @@ if ( !defined('DOKU_TAB') ) {
     define ('DOKU_TAB',"\t");
 }
 
-require_once DOKU_INC . 'inc/parser/renderer.php';
-
 /**
  * The Renderer
  */
diff --git a/inc/parser/renderer.php b/inc/parser/renderer.php
index e3401fd4816dd1e49f75ee7bf12d50864f73a90c..1f9ad00a29c18ef748478446b1127d7663b63d4d 100644
--- a/inc/parser/renderer.php
+++ b/inc/parser/renderer.php
@@ -6,8 +6,6 @@
  * @author Andreas Gohr <andi@splitbrain.org>
  */
 if(!defined('DOKU_INC')) die('meh.');
-require_once DOKU_INC . 'inc/plugin.php';
-require_once DOKU_INC . 'inc/pluginutils.php';
 
 /**
  * An empty renderer, produces no output
diff --git a/inc/parser/xhtml.php b/inc/parser/xhtml.php
index 315b4d640d4379650463ff28573d43c5126328cc..184e62fe3548895a8e700e2c3a71eae120b04e8b 100644
--- a/inc/parser/xhtml.php
+++ b/inc/parser/xhtml.php
@@ -17,9 +17,6 @@ if ( !defined('DOKU_TAB') ) {
     define ('DOKU_TAB',"\t");
 }
 
-require_once DOKU_INC . 'inc/parser/renderer.php';
-require_once DOKU_INC . 'inc/html.php';
-
 /**
  * The Renderer
  */
diff --git a/inc/parser/xhtmlsummary.php b/inc/parser/xhtmlsummary.php
index 95f86cbef6c1d30aab40ce0457aac160ad597562..867b71f6ab2a9be1e785dfc25d5227f375eb3ba6 100644
--- a/inc/parser/xhtmlsummary.php
+++ b/inc/parser/xhtmlsummary.php
@@ -1,6 +1,5 @@
 <?php
 if(!defined('DOKU_INC')) die('meh.');
-require_once DOKU_INC . 'inc/parser/xhtml.php';
 
 /**
  * The summary XHTML form selects either up to the first two paragraphs
diff --git a/inc/parserutils.php b/inc/parserutils.php
index 4df273f1144224aed1f6d0ad2c9e5fca338ae673..b41e2d47373d2c4365c3897e4dbe5808d5578277 100644
--- a/inc/parserutils.php
+++ b/inc/parserutils.php
@@ -430,8 +430,9 @@ function p_render_metadata($id, $orig){
     global $ID, $METADATA_RENDERERS;
 
     // avoid recursive rendering processes for the same id
-    if (isset($METADATA_RENDERERS[$id]))
+    if (isset($METADATA_RENDERERS[$id])) {
         return $orig;
+    }
 
     // store the original metadata in the global $METADATA_RENDERERS so p_set_metadata can use it
     $METADATA_RENDERERS[$id] =& $orig;
@@ -444,8 +445,6 @@ function p_render_metadata($id, $orig){
     $evt = new Doku_Event('PARSER_METADATA_RENDER', $orig);
     if ($evt->advise_before()) {
 
-        require_once DOKU_INC."inc/parser/metadata.php";
-
         // get instructions
         $instructions = p_cached_instructions(wikiFN($id),false,$id);
         if(is_null($instructions)){
@@ -588,7 +587,7 @@ function p_sort_modes($a, $b){
 function p_render($mode,$instructions,&$info){
     if(is_null($instructions)) return '';
 
-    $Renderer =& p_get_renderer($mode);
+    $Renderer = p_get_renderer($mode);
     if (is_null($Renderer)) return null;
 
     $Renderer->reset();
@@ -616,43 +615,54 @@ function p_render($mode,$instructions,&$info){
 }
 
 /**
+ * Figure out the correct renderer class to use for $mode,
+ * instantiate and return it
+ *
  * @param $mode string Mode of the renderer to get
  * @return null|Doku_Renderer The renderer
+ *
+ * @author Christopher Smith <chris@jalakai.co.uk>
  */
-function & p_get_renderer($mode) {
+function p_get_renderer($mode) {
     /** @var Doku_Plugin_Controller $plugin_controller */
     global $conf, $plugin_controller;
 
     $rname = !empty($conf['renderer_'.$mode]) ? $conf['renderer_'.$mode] : $mode;
     $rclass = "Doku_Renderer_$rname";
 
+    // if requested earlier or a bundled renderer
     if( class_exists($rclass) ) {
         $Renderer = new $rclass();
         return $Renderer;
     }
 
-    // try default renderer first:
-    $file = DOKU_INC."inc/parser/$rname.php";
-    if(@file_exists($file)){
-        require_once $file;
+    // not bundled, see if its an enabled plugin for rendering $mode
+    $Renderer = $plugin_controller->load('renderer',$rname);
+    if (is_a($Renderer, 'Doku_Renderer')  && ($mode == $Renderer->getFormat())) {
+        return $Renderer;
+    }
 
-        if ( !class_exists($rclass) ) {
-            trigger_error("Unable to resolve render class $rclass",E_USER_WARNING);
-            msg("Renderer '$rname' for $mode not valid",-1);
-            return null;
+    // there is a configuration error!
+    // not bundled, not a valid enabled plugin, use $mode to try to fallback to a bundled renderer
+    $rclass = "Doku_Renderer_$mode";
+    if ( class_exists($rclass) ) {
+        // viewers should see renderered output, so restrict the warning to admins only
+        $msg = "No renderer '$rname' found for mode '$mode', check your plugins";
+        if ($mode == 'xhtml') {
+            $msg .= " and the 'renderer_xhtml' config setting";
         }
-        $Renderer = new $rclass();
-    }else{
-        // Maybe a plugin/component is available?
-        $Renderer = $plugin_controller->load('renderer',$rname);
+        $msg .= ".<br/>Attempting to fallback to the bundled renderer.";
+        msg($msg,-1,'','',MSG_ADMINS_ONLY);
 
-        if(!isset($Renderer) || is_null($Renderer)){
-            msg("No renderer '$rname' found for mode '$mode'",-1);
-            return null;
-        }
+        $Renderer = new $rclass;
+        $Renderer->nocache();     // fallback only (and may include admin alerts), don't cache
+        return $Renderer;
     }
 
-    return $Renderer;
+    // fallback failed, alert the world
+    trigger_error("Unable to resolve render class $rclass",E_USER_WARNING);
+    msg("No renderer '$rname' found for mode '$mode'",-1);
+    return null;
 }
 
 /**