rename RenderingManager as DefaultRenderingManager and extract new interface RenderingManager from it
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/render/DefaultRenderingManager.java b/jspwiki-main/src/main/java/org/apache/wiki/render/DefaultRenderingManager.java
new file mode 100644
index 0000000..cb9969f
--- /dev/null
+++ b/jspwiki-main/src/main/java/org/apache/wiki/render/DefaultRenderingManager.java
@@ -0,0 +1,285 @@
+/*
+    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.
+ */
+package org.apache.wiki.render;
+
+import net.sf.ehcache.Cache;
+import net.sf.ehcache.CacheManager;
+import net.sf.ehcache.Element;
+import org.apache.log4j.Logger;
+import org.apache.wiki.WikiContext;
+import org.apache.wiki.WikiEngine;
+import org.apache.wiki.api.exceptions.WikiException;
+import org.apache.wiki.event.WikiEvent;
+import org.apache.wiki.event.WikiEventListener;
+import org.apache.wiki.event.WikiEventUtils;
+import org.apache.wiki.event.WikiPageEvent;
+import org.apache.wiki.pages.PageManager;
+import org.apache.wiki.parser.JSPWikiMarkupParser;
+import org.apache.wiki.parser.MarkupParser;
+import org.apache.wiki.parser.WikiDocument;
+import org.apache.wiki.providers.WikiPageProvider;
+import org.apache.wiki.util.ClassUtil;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.lang.reflect.Constructor;
+import java.util.Collection;
+import java.util.Properties;
+
+
+/**
+ *  This class provides a facade towards the differing rendering routines.  You should use the routines in this manager
+ *  instead of the ones in WikiEngine, if you don't want the different side effects to occur - such as WikiFilters.
+ *  <p>
+ *  This class also manages a rendering cache, i.e. documents are stored between calls. You may control the cache by
+ *  tweaking the ehcache.xml file.
+ *  <p>
+ *
+ *  @since  2.4
+ */
+public class DefaultRenderingManager implements RenderingManager {
+
+    private static final Logger log = Logger.getLogger( DefaultRenderingManager.class );
+
+    private final int m_cacheExpiryPeriod = 24*60*60; // This can be relatively long
+    private final CacheManager m_cacheManager = CacheManager.getInstance();
+
+    private WikiEngine m_engine;
+    private boolean m_useCache = true;
+
+    /** The capacity of the caches, if you want something else, tweak ehcache.xml. */
+    private static final int    DEFAULT_CACHESIZE     = 1_000;
+    private static final String VERSION_DELIMITER     = "::";
+    private static final String PROP_PARSER           = "jspwiki.renderingManager.markupParser";
+    private static final String PROP_RENDERER         = "jspwiki.renderingManager.renderer";
+    private static final String PROP_WYSIWYG_RENDERER = "jspwiki.renderingManager.renderer.wysiwyg";
+
+    /** Stores the WikiDocuments that have been cached. */
+    private Cache m_documentCache;
+
+    private Constructor< ? > m_rendererConstructor;
+    private Constructor< ? > m_rendererWysiwygConstructor;
+    private String m_markupParserClass = DEFAULT_PARSER;
+
+    /**
+     *  {@inheritDoc}
+     */
+    @Override
+    public void initialize( final WikiEngine engine, final Properties properties ) throws WikiException {
+        m_engine = engine;
+        m_markupParserClass = properties.getProperty( PROP_PARSER, DEFAULT_PARSER );
+        if( !ClassUtil.assignable( m_markupParserClass, MarkupParser.class.getName() ) ) {
+        	log.warn( m_markupParserClass + " does not subclass " + MarkupParser.class.getName() + " reverting to default markup parser." );
+        	m_markupParserClass = DEFAULT_PARSER;
+        }
+        log.info( "Using " + m_markupParserClass + " as markup parser." );
+
+        m_useCache = "true".equals( properties.getProperty( PageManager.PROP_USECACHE ) );
+
+        if( m_useCache ) {
+            final String documentCacheName = engine.getApplicationName() + "." + DOCUMENTCACHE_NAME;
+            if (m_cacheManager.cacheExists(documentCacheName)) {
+                m_documentCache = m_cacheManager.getCache(documentCacheName);
+            } else {
+                log.info( "cache with name " + documentCacheName + " not found in ehcache.xml, creating it with defaults." );
+                m_documentCache = new Cache( documentCacheName, DEFAULT_CACHESIZE, false, false, m_cacheExpiryPeriod, m_cacheExpiryPeriod );
+                m_cacheManager.addCache( m_documentCache );
+            }
+        }
+
+        final String renderImplName = properties.getProperty( PROP_RENDERER, DEFAULT_RENDERER );
+        final String renderWysiwygImplName = properties.getProperty( PROP_WYSIWYG_RENDERER, DEFAULT_WYSIWYG_RENDERER );
+
+        final Class< ? >[] rendererParams = { WikiContext.class, WikiDocument.class };
+        m_rendererConstructor = initRenderer( renderImplName, rendererParams );
+        m_rendererWysiwygConstructor = initRenderer( renderWysiwygImplName, rendererParams );
+
+        log.info( "Rendering content with " + renderImplName + "." );
+
+        WikiEventUtils.addWikiEventListener(m_engine, WikiPageEvent.POST_SAVE_BEGIN, this);
+    }
+
+    private Constructor< ? > initRenderer( final String renderImplName, final Class< ? >[] rendererParams ) throws WikiException {
+        Constructor< ? > c = null;
+        try {
+            final Class< ? > clazz = Class.forName( renderImplName );
+            c = clazz.getConstructor( rendererParams );
+        } catch( final ClassNotFoundException e ) {
+            log.error( "Unable to find WikiRenderer implementation " + renderImplName );
+        } catch( final SecurityException e ) {
+            log.error( "Unable to access the WikiRenderer(WikiContext,WikiDocument) constructor for "  + renderImplName );
+        } catch( final NoSuchMethodException e ) {
+            log.error( "Unable to locate the WikiRenderer(WikiContext,WikiDocument) constructor for "  + renderImplName );
+        }
+        if( c == null ) {
+            throw new WikiException( "Failed to get WikiRenderer '" + renderImplName + "'." );
+        }
+        return c;
+    }
+
+    /**
+     *  {@inheritDoc}
+     */
+    @Override
+    public MarkupParser getParser( final WikiContext context, final String pagedata ) {
+    	try {
+			return ClassUtil.getMappedObject( m_markupParserClass, context, new StringReader( pagedata ) );
+		} catch( final ReflectiveOperationException | IllegalArgumentException e ) {
+			log.error( "unable to get an instance of " + m_markupParserClass + " (" + e.getMessage() + "), returning default markup parser.", e );
+			return new JSPWikiMarkupParser( context, new StringReader( pagedata ) );
+		}
+    }
+
+    /**
+     *  {@inheritDoc}
+     */
+    @Override
+    // FIXME: The cache management policy is not very good: deleted/changed pages should be detected better.
+    public WikiDocument getRenderedDocument( final WikiContext context, final String pagedata ) {
+        final String pageid = context.getRealPage().getName() + VERSION_DELIMITER +
+                              context.getRealPage().getVersion() + VERSION_DELIMITER +
+                              context.getVariable( DefaultRenderingManager.VAR_EXECUTE_PLUGINS );
+
+        if( useCache( context ) ) {
+            final Element element = m_documentCache.get( pageid );
+            if ( element != null ) {
+                final WikiDocument doc = ( WikiDocument )element.getObjectValue();
+
+                //
+                //  This check is needed in case the different filters have actually changed the page data.
+                //  FIXME: Figure out a faster method
+                if( pagedata.equals( doc.getPageData() ) ) {
+                    if( log.isDebugEnabled() ) {
+                        log.debug( "Using cached HTML for page " + pageid );
+                    }
+                    return doc;
+                }
+            } else if( log.isDebugEnabled() ) {
+                log.debug( "Re-rendering and storing " + pageid );
+            }
+        }
+
+        //  Refresh the data content
+        try {
+            final MarkupParser parser = getParser( context, pagedata );
+            final WikiDocument doc = parser.parse();
+            doc.setPageData( pagedata );
+            if( useCache( context ) ) {
+                m_documentCache.put( new Element( pageid, doc ) );
+            }
+            return doc;
+        } catch( final IOException ex ) {
+            log.error( "Unable to parse", ex );
+        }
+
+        return null;
+    }
+
+    boolean useCache( final WikiContext context ) {
+        return m_useCache && WikiContext.VIEW.equals( context.getRequestContext() );
+    }
+
+    /**
+     *  {@inheritDoc}
+     */
+    @Override
+    public String getHTML( final WikiContext context, final WikiDocument doc ) throws IOException {
+        final Boolean wysiwygVariable = ( Boolean )context.getVariable( WYSIWYG_EDITOR_MODE );
+        final boolean wysiwygEditorMode;
+        if( wysiwygVariable != null ) {
+            wysiwygEditorMode = wysiwygVariable;
+        } else {
+            wysiwygEditorMode = false;
+        }
+        final WikiRenderer rend;
+        if( wysiwygEditorMode ) {
+            rend = getWysiwygRenderer( context, doc );
+        } else {
+            rend = getRenderer( context, doc );
+        }
+
+        return rend.getString();
+    }
+
+    /**
+     *  {@inheritDoc}
+     */
+    @Override
+    public WikiRenderer getRenderer( final WikiContext context, final WikiDocument doc ) {
+        final Object[] params = { context, doc };
+        return getRenderer( params, m_rendererConstructor );
+    }
+
+    /**
+     *  {@inheritDoc}
+     */
+    @Override
+    public WikiRenderer getWysiwygRenderer( final WikiContext context, final WikiDocument doc ) {
+        final Object[] params = { context, doc };
+        return getRenderer( params, m_rendererWysiwygConstructor );
+    }
+
+    @SuppressWarnings("unchecked")
+    private < T extends WikiRenderer > T getRenderer( final Object[] params, final Constructor<?> rendererConstructor ) {
+        try {
+            return ( T )rendererConstructor.newInstance( params );
+        } catch( final Exception e ) {
+            log.error( "Unable to create WikiRenderer", e );
+        }
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * <p>Flushes the document cache in response to a POST_SAVE_BEGIN event.
+     *
+     * @see WikiEventListener#actionPerformed(WikiEvent)
+     */
+    @Override
+    public void actionPerformed( final WikiEvent event ) {
+        log.debug( "event received: " + event.toString() );
+        if( m_useCache ) {
+            if( ( event instanceof WikiPageEvent ) && ( event.getType() == WikiPageEvent.POST_SAVE_BEGIN ) ) {
+                if( m_documentCache != null ) {
+                    final String pageName = ( ( WikiPageEvent ) event ).getPageName();
+                    m_documentCache.remove( pageName );
+                    final Collection< String > referringPages = m_engine.getReferenceManager().findReferrers( pageName );
+
+                    //
+                    //  Flush also those pages that refer to this page (if an nonexistent page
+                    //  appears, we need to flush the HTML that refers to the now-existent page)
+                    //
+                    if( referringPages != null ) {
+                        for( final String page : referringPages ) {
+                            if( log.isDebugEnabled() ) {
+                                log.debug( "Flushing latest version of " + page );
+                            }
+                            // as there is a new version of the page expire both plugin and pluginless versions of the old page
+                            m_documentCache.remove( page + VERSION_DELIMITER + WikiPageProvider.LATEST_VERSION  + VERSION_DELIMITER + Boolean.FALSE );
+                            m_documentCache.remove( page + VERSION_DELIMITER + WikiPageProvider.LATEST_VERSION  + VERSION_DELIMITER + Boolean.TRUE );
+                            m_documentCache.remove( page + VERSION_DELIMITER + WikiPageProvider.LATEST_VERSION  + VERSION_DELIMITER + null );
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+}
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/render/RenderingManager.java b/jspwiki-main/src/main/java/org/apache/wiki/render/RenderingManager.java
index 8a59271..e80dbfa 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/render/RenderingManager.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/render/RenderingManager.java
@@ -18,29 +18,17 @@
  */
 package org.apache.wiki.render;
 
-import net.sf.ehcache.Cache;
-import net.sf.ehcache.CacheManager;
-import net.sf.ehcache.Element;
 import org.apache.log4j.Logger;
 import org.apache.wiki.WikiContext;
 import org.apache.wiki.WikiEngine;
 import org.apache.wiki.api.exceptions.WikiException;
-import org.apache.wiki.event.WikiEvent;
 import org.apache.wiki.event.WikiEventListener;
-import org.apache.wiki.event.WikiEventUtils;
-import org.apache.wiki.event.WikiPageEvent;
 import org.apache.wiki.modules.InternalModule;
-import org.apache.wiki.pages.PageManager;
 import org.apache.wiki.parser.JSPWikiMarkupParser;
 import org.apache.wiki.parser.MarkupParser;
 import org.apache.wiki.parser.WikiDocument;
-import org.apache.wiki.providers.WikiPageProvider;
-import org.apache.wiki.util.ClassUtil;
 
 import java.io.IOException;
-import java.io.StringReader;
-import java.lang.reflect.Constructor;
-import java.util.Collection;
 import java.util.Properties;
 
 
@@ -54,53 +42,31 @@
  *
  *  @since  2.4
  */
-public class RenderingManager implements WikiEventListener, InternalModule {
-
-    private static final Logger log = Logger.getLogger( RenderingManager.class );
-
-    private final int m_cacheExpiryPeriod = 24*60*60; // This can be relatively long
-    private final CacheManager m_cacheManager = CacheManager.getInstance();
-
-    private WikiEngine m_engine;
-    private boolean m_useCache = true;
-
-    /** The capacity of the caches, if you want something else, tweak ehcache.xml. */
-    private static final int    DEFAULT_CACHESIZE     = 1000;
-    private static final String VERSION_DELIMITER     = "::";
-    private static final String PROP_PARSER           = "jspwiki.renderingManager.markupParser";
-    private static final String PROP_RENDERER         = "jspwiki.renderingManager.renderer";
-    private static final String PROP_WYSIWYG_RENDERER = "jspwiki.renderingManager.renderer.wysiwyg";
+public interface RenderingManager extends WikiEventListener, InternalModule {
 
     /** The name of the default renderer. */
-    public static final String DEFAULT_PARSER = JSPWikiMarkupParser.class.getName();
+    String DEFAULT_PARSER = JSPWikiMarkupParser.class.getName();
 
     /** The name of the default renderer. */
-    public  static final String DEFAULT_RENDERER = XHTMLRenderer.class.getName();
+    String DEFAULT_RENDERER = XHTMLRenderer.class.getName();
 
     /** The name of the default WYSIWYG renderer. */
-    public  static final String DEFAULT_WYSIWYG_RENDERER = WysiwygEditingRenderer.class.getName();
-
-    /** Stores the WikiDocuments that have been cached. */
-    private Cache m_documentCache;
+    String DEFAULT_WYSIWYG_RENDERER = WysiwygEditingRenderer.class.getName();
 
     /** Name of the regular page cache. */
-    public static final String DOCUMENTCACHE_NAME = "jspwiki.renderingCache";
-
-    private Constructor< ? > m_rendererConstructor;
-    private Constructor< ? > m_rendererWysiwygConstructor;
-    private String m_markupParserClass = DEFAULT_PARSER;
+    String DOCUMENTCACHE_NAME = "jspwiki.renderingCache";
 
     /**
-     *  Name of the WikiContext variable which is set to Boolean.TRUE or Boolean.FALSE
-     *  depending on whether WYSIWYG is currently in effect.
+     *  Name of the WikiContext variable which is set to Boolean.TRUE or Boolean.FALSE depending on whether WYSIWYG is currently
+     *  in effect.
      */
-    public static final String WYSIWYG_EDITOR_MODE = "WYSIWYG_EDITOR_MODE";
+    String WYSIWYG_EDITOR_MODE = "WYSIWYG_EDITOR_MODE";
 
     /**
-     *  Variable name which tells whether plugins should be executed or not.  Value can be either
-     *  {@code Boolean.TRUE} or {@code Boolean.FALSE}. While not set it's value is {@code null}
+     *  Variable name which tells whether plugins should be executed or not.  Value can be either {@code Boolean.TRUE} or
+     *  {@code Boolean.FALSE}. While not set it's value is {@code null}.
      */
-    public static final String VAR_EXECUTE_PLUGINS = "_PluginContent.execute";
+    String VAR_EXECUTE_PLUGINS = "_PluginContent.execute";
 
     /**
      *  Initializes the RenderingManager.
@@ -112,71 +78,14 @@
      *  @param properties A list of properties to get parameters from.
      *  @throws WikiException If the manager could not be initialized.
      */
-    public void initialize( final WikiEngine engine, final Properties properties ) throws WikiException {
-        m_engine = engine;
-        m_markupParserClass = properties.getProperty( PROP_PARSER, DEFAULT_PARSER );
-        if( !ClassUtil.assignable( m_markupParserClass, MarkupParser.class.getName() ) ) {
-        	log.warn( m_markupParserClass + " does not subclass " + MarkupParser.class.getName() + " reverting to default markup parser." );
-        	m_markupParserClass = DEFAULT_PARSER;
-        }
-        log.info( "Using " + m_markupParserClass + " as markup parser." );
-
-        m_useCache = "true".equals( properties.getProperty( PageManager.PROP_USECACHE ) );
-
-        if( m_useCache ) {
-            final String documentCacheName = engine.getApplicationName() + "." + DOCUMENTCACHE_NAME;
-            if (m_cacheManager.cacheExists(documentCacheName)) {
-                m_documentCache = m_cacheManager.getCache(documentCacheName);
-            } else {
-                log.info( "cache with name " + documentCacheName + " not found in ehcache.xml, creating it with defaults." );
-                m_documentCache = new Cache( documentCacheName, DEFAULT_CACHESIZE, false, false, m_cacheExpiryPeriod, m_cacheExpiryPeriod );
-                m_cacheManager.addCache( m_documentCache );
-            }
-        }
-
-        final String renderImplName = properties.getProperty( PROP_RENDERER, DEFAULT_RENDERER );
-        final String renderWysiwygImplName = properties.getProperty( PROP_WYSIWYG_RENDERER, DEFAULT_WYSIWYG_RENDERER );
-
-        final Class< ? >[] rendererParams = { WikiContext.class, WikiDocument.class };
-        m_rendererConstructor = initRenderer( renderImplName, rendererParams );
-        m_rendererWysiwygConstructor = initRenderer( renderWysiwygImplName, rendererParams );
-
-        log.info( "Rendering content with " + renderImplName + "." );
-
-        WikiEventUtils.addWikiEventListener(m_engine, WikiPageEvent.POST_SAVE_BEGIN, this);
-    }
-
-    private Constructor< ? > initRenderer( final String renderImplName, final Class< ? >[] rendererParams ) throws WikiException {
-        Constructor< ? > c = null;
-        try {
-            final Class< ? > clazz = Class.forName( renderImplName );
-            c = clazz.getConstructor( rendererParams );
-        } catch( final ClassNotFoundException e ) {
-            log.error( "Unable to find WikiRenderer implementation " + renderImplName );
-        } catch( final SecurityException e ) {
-            log.error( "Unable to access the WikiRenderer(WikiContext,WikiDocument) constructor for "  + renderImplName );
-        } catch( final NoSuchMethodException e ) {
-            log.error( "Unable to locate the WikiRenderer(WikiContext,WikiDocument) constructor for "  + renderImplName );
-        }
-        if( c == null ) {
-            throw new WikiException( "Failed to get WikiRenderer '" + renderImplName + "'." );
-        }
-        return c;
-    }
+    void initialize( WikiEngine engine, Properties properties ) throws WikiException;
 
     /**
      *  Returns the wiki Parser
      *  @param pagedata the page data
      *  @return A MarkupParser instance.
      */
-    public MarkupParser getParser( final WikiContext context, final String pagedata ) {
-    	try {
-			return ClassUtil.getMappedObject( m_markupParserClass, context, new StringReader( pagedata ) );
-		} catch( final ReflectiveOperationException | IllegalArgumentException e ) {
-			log.error( "unable to get an instance of " + m_markupParserClass + " (" + e.getMessage() + "), returning default markup parser.", e );
-			return new JSPWikiMarkupParser( context, new StringReader( pagedata ) );
-		}
-    }
+    MarkupParser getParser( WikiContext context, String pagedata );
 
     /**
      *  Returns a cached document, if one is found.
@@ -185,50 +94,7 @@
      * @param pagedata the page data
      * @return the rendered wiki document
      */
-    // FIXME: The cache management policy is not very good: deleted/changed pages should be detected better.
-    protected WikiDocument getRenderedDocument( final WikiContext context, final String pagedata ) {
-        final String pageid = context.getRealPage().getName() + VERSION_DELIMITER +
-                              context.getRealPage().getVersion() + VERSION_DELIMITER +
-                              context.getVariable( RenderingManager.VAR_EXECUTE_PLUGINS );
-
-        if( useCache( context ) ) {
-            final Element element = m_documentCache.get( pageid );
-            if ( element != null ) {
-                final WikiDocument doc = ( WikiDocument )element.getObjectValue();
-
-                //
-                //  This check is needed in case the different filters have actually changed the page data.
-                //  FIXME: Figure out a faster method
-                if( pagedata.equals( doc.getPageData() ) ) {
-                    if( log.isDebugEnabled() ) {
-                        log.debug( "Using cached HTML for page " + pageid );
-                    }
-                    return doc;
-                }
-            } else if( log.isDebugEnabled() ) {
-                log.debug( "Re-rendering and storing " + pageid );
-            }
-        }
-
-        //  Refresh the data content
-        try {
-            final MarkupParser parser = getParser( context, pagedata );
-            final WikiDocument doc = parser.parse();
-            doc.setPageData( pagedata );
-            if( useCache( context ) ) {
-                m_documentCache.put( new Element( pageid, doc ) );
-            }
-            return doc;
-        } catch( final IOException ex ) {
-            log.error( "Unable to parse", ex );
-        }
-
-        return null;
-    }
-
-    boolean useCache( final WikiContext context ) {
-        return m_useCache && WikiContext.VIEW.equals( context.getRequestContext() );
-    }
+    WikiDocument getRenderedDocument( WikiContext context, String pagedata );
 
     /**
      *  Simply renders a WikiDocument to a String.  This version does not get the document from the cache - in fact, it does
@@ -241,23 +107,7 @@
      *  @return Rendered HTML.
      *  @throws IOException If the WikiDocument is poorly formed.
      */
-    public String getHTML( final WikiContext context, final WikiDocument doc ) throws IOException {
-        final Boolean wysiwygVariable = ( Boolean )context.getVariable( WYSIWYG_EDITOR_MODE );
-        final boolean wysiwygEditorMode;
-        if( wysiwygVariable != null ) {
-            wysiwygEditorMode = wysiwygVariable;
-        } else {
-            wysiwygEditorMode = false;
-        }
-        final WikiRenderer rend;
-        if( wysiwygEditorMode ) {
-            rend = getWysiwygRenderer( context, doc );
-        } else {
-            rend = getRenderer( context, doc );
-        }
-
-        return rend.getString();
-    }
+    String getHTML( WikiContext context, WikiDocument doc ) throws IOException;
 
     /**
      * Returns a WikiRenderer instance, initialized with the given context and doc. The object is an XHTMLRenderer,
@@ -267,10 +117,7 @@
      * @param doc The document to render
      * @return A WikiRenderer for this document, or null, if no such renderer could be instantiated.
      */
-    public WikiRenderer getRenderer( final WikiContext context, final WikiDocument doc ) {
-        final Object[] params = { context, doc };
-        return getRenderer( params, m_rendererConstructor );
-    }
+    WikiRenderer getRenderer( WikiContext context, WikiDocument doc );
 
     /**
      * Returns a WikiRenderer instance meant for WYSIWYG editing, initialized with the given
@@ -281,20 +128,7 @@
      * @param doc The document to render
      * @return A WikiRenderer instance meant for WYSIWYG editing, for this document, or null, if no such renderer could be instantiated.
      */
-    public WikiRenderer getWysiwygRenderer( final WikiContext context, final WikiDocument doc ) {
-        final Object[] params = { context, doc };
-        return getRenderer( params, m_rendererWysiwygConstructor );
-    }
-
-    @SuppressWarnings("unchecked")
-    private < T extends WikiRenderer > T getRenderer( final Object[] params, final Constructor<?> rendererConstructor ) {
-        try {
-            return ( T )rendererConstructor.newInstance( params );
-        } catch( final Exception e ) {
-            log.error( "Unable to create WikiRenderer", e );
-        }
-        return null;
-    }
+    WikiRenderer getWysiwygRenderer( WikiContext context, WikiDocument doc );
 
     /**
      *   Convenience method for rendering, using the default parser and renderer.  Note that you can't use this method
@@ -306,52 +140,15 @@
      *   @param pagedata the page data
      *   @return XHTML data.
      */
-    public String getHTML( final WikiContext context, final String pagedata ) {
+    default String getHTML( final WikiContext context, final String pagedata ) {
         try {
             final WikiDocument doc = getRenderedDocument( context, pagedata );
             return getHTML( context, doc );
         } catch( final IOException e ) {
-            log.error("Unable to parse",e);
+            Logger.getLogger( RenderingManager.class ).error("Unable to parse", e );
         }
 
         return null;
     }
 
-    /**
-     * {@inheritDoc}
-     *
-     * <p>Flushes the document cache in response to a POST_SAVE_BEGIN event.
-     *
-     * @see org.apache.wiki.event.WikiEventListener#actionPerformed(org.apache.wiki.event.WikiEvent)
-     */
-    @Override
-    public void actionPerformed( final WikiEvent event ) {
-        log.debug( "event received: " + event.toString() );
-        if( m_useCache ) {
-            if( ( event instanceof WikiPageEvent ) && ( event.getType() == WikiPageEvent.POST_SAVE_BEGIN ) ) {
-                if( m_documentCache != null ) {
-                    final String pageName = ( ( WikiPageEvent ) event ).getPageName();
-                    m_documentCache.remove( pageName );
-                    final Collection< String > referringPages = m_engine.getReferenceManager().findReferrers( pageName );
-
-                    //
-                    //  Flush also those pages that refer to this page (if an nonexistent page
-                    //  appears, we need to flush the HTML that refers to the now-existent page)
-                    //
-                    if( referringPages != null ) {
-                        for( final String page : referringPages ) {
-                            if( log.isDebugEnabled() ) {
-                                log.debug( "Flushing latest version of " + page );
-                            }
-                            // as there is a new version of the page expire both plugin and pluginless versions of the old page
-                            m_documentCache.remove( page + VERSION_DELIMITER + WikiPageProvider.LATEST_VERSION  + VERSION_DELIMITER + Boolean.FALSE );
-                            m_documentCache.remove( page + VERSION_DELIMITER + WikiPageProvider.LATEST_VERSION  + VERSION_DELIMITER + Boolean.TRUE );
-                            m_documentCache.remove( page + VERSION_DELIMITER + WikiPageProvider.LATEST_VERSION  + VERSION_DELIMITER + null );
-                        }
-                    }
-                }
-            }
-        }
-    }
-
 }
diff --git a/jspwiki-main/src/main/resources/ini/classmappings.xml b/jspwiki-main/src/main/resources/ini/classmappings.xml
index e005819..bc6f1e0 100644
--- a/jspwiki-main/src/main/resources/ini/classmappings.xml
+++ b/jspwiki-main/src/main/resources/ini/classmappings.xml
@@ -105,7 +105,7 @@
   </mapping>
   <mapping>
     <requestedClass>org.apache.wiki.render.RenderingManager</requestedClass>
-    <mappedClass>org.apache.wiki.render.RenderingManager</mappedClass>
+    <mappedClass>org.apache.wiki.render.DefaultRenderingManager</mappedClass>
   </mapping>
   <mapping>
     <requestedClass>org.apache.wiki.search.SearchManager</requestedClass>