diff --git a/jspwiki-main/src/main/java/org/apache/wiki/attachment/DefaultAttachmentManager.java b/jspwiki-main/src/main/java/org/apache/wiki/attachment/DefaultAttachmentManager.java
index 3070d2f..eb7ef22 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/attachment/DefaultAttachmentManager.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/attachment/DefaultAttachmentManager.java
@@ -24,7 +24,9 @@
 import org.apache.log4j.Logger;
 import org.apache.wiki.WikiContext;
 import org.apache.wiki.WikiPage;
+import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.core.Engine;
+import org.apache.wiki.api.core.Page;
 import org.apache.wiki.api.exceptions.NoRequiredPropertyException;
 import org.apache.wiki.api.exceptions.ProviderException;
 import org.apache.wiki.pages.PageManager;
@@ -136,7 +138,7 @@
 
     /** {@inheritDoc} */
     @Override
-    public String getAttachmentInfoName( final WikiContext context, final String attachmentname ) {
+    public String getAttachmentInfoName( final Context context, final String attachmentname ) {
         final Attachment att;
         try {
             att = getAttachmentInfo( context, attachmentname );
@@ -156,12 +158,12 @@
 
     /** {@inheritDoc} */
     @Override
-    public Attachment getAttachmentInfo( final WikiContext context, String attachmentname, final int version ) throws ProviderException {
+    public Attachment getAttachmentInfo( final Context context, String attachmentname, final int version ) throws ProviderException {
         if( m_provider == null ) {
             return null;
         }
 
-        WikiPage currentPage = null;
+        Page currentPage = null;
 
         if( context != null ) {
             currentPage = context.getPage();
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/diff/DefaultDifferenceManager.java b/jspwiki-main/src/main/java/org/apache/wiki/diff/DefaultDifferenceManager.java
index c4645ca..28b1b08 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/diff/DefaultDifferenceManager.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/diff/DefaultDifferenceManager.java
@@ -20,7 +20,7 @@
 package org.apache.wiki.diff;
 
 import org.apache.log4j.Logger;
-import org.apache.wiki.WikiContext;
+import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.core.Engine;
 import org.apache.wiki.api.exceptions.NoRequiredPropertyException;
 import org.apache.wiki.pages.PageManager;
@@ -87,7 +87,7 @@
      * @return XHTML, or empty string, if no difference detected.
      */
     @Override
-    public String makeDiff( final WikiContext context, final String firstWikiText, final String secondWikiText ) {
+    public String makeDiff( final Context context, final String firstWikiText, final String secondWikiText ) {
         String diff;
         try {
             diff = m_provider.makeDiffHtml( context, firstWikiText, secondWikiText );
@@ -114,7 +114,7 @@
      *  @return A HTML-ized difference between two pages.  If there is no difference, returns an empty string.
      */
     @Override
-    public String getDiff( final WikiContext context, final int version1, final int version2 ) {
+    public String getDiff( final Context context, final int version1, final int version2 ) {
         final String page = context.getPage().getName();
         String page1 = context.getEngine().getManager( PageManager.class ).getPureText( page, version1 );
         final String page2 = context.getEngine().getManager( PageManager.class ).getPureText( page, version2 );
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/diff/DifferenceManager.java b/jspwiki-main/src/main/java/org/apache/wiki/diff/DifferenceManager.java
index a068632..6b43736 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/diff/DifferenceManager.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/diff/DifferenceManager.java
@@ -19,7 +19,7 @@
 
 package org.apache.wiki.diff;
 
-import org.apache.wiki.WikiContext;
+import org.apache.wiki.api.core.Context;
 
 
 /**
@@ -38,7 +38,7 @@
      * @param secondWikiText the new text
      * @return XHTML, or empty string, if no difference detected.
      */
-    String makeDiff( WikiContext context, String firstWikiText, String secondWikiText );
+    String makeDiff( Context context, String firstWikiText, String secondWikiText );
 
     /**
      *  Returns a diff of two versions of a page.
@@ -51,7 +51,7 @@
      *
      *  @return A HTML-ized difference between two pages.  If there is no difference, returns an empty string.
      */
-    String getDiff( WikiContext context, int version1, int version2 );
+    String getDiff( Context context, int version1, int version2 );
 
 }
 
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/diff/ExternalDiffProvider.java b/jspwiki-main/src/main/java/org/apache/wiki/diff/ExternalDiffProvider.java
index 8b8cdc3..1535af3 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/diff/ExternalDiffProvider.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/diff/ExternalDiffProvider.java
@@ -20,7 +20,7 @@
 package org.apache.wiki.diff;
 
 import org.apache.log4j.Logger;
-import org.apache.wiki.WikiContext;
+import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.core.Engine;
 import org.apache.wiki.api.exceptions.NoRequiredPropertyException;
 import org.apache.wiki.util.FileUtil;
@@ -72,7 +72,7 @@
     }
 
     /**
-     * @see org.apache.wiki.WikiProvider#getProviderInfo()
+     * @see org.apache.wiki.api.providers.WikiProvider#getProviderInfo()
      * {@inheritDoc}
      */
     @Override public String getProviderInfo()
@@ -82,9 +82,10 @@
 
     /**
      * {@inheritDoc}
-     * @see org.apache.wiki.WikiProvider#initialize(org.apache.wiki.api.core.Engine, java.util.Properties)
+     * @see org.apache.wiki.api.providers.WikiProvider#initialize(org.apache.wiki.api.core.Engine, java.util.Properties)
      */
-    @Override public void initialize( final Engine engine, final Properties properties ) throws NoRequiredPropertyException, IOException {
+    @Override
+    public void initialize( final Engine engine, final Properties properties ) throws NoRequiredPropertyException, IOException {
         m_diffCommand = properties.getProperty( PROP_DIFFCOMMAND );
         if( m_diffCommand == null || m_diffCommand.trim().equals( "" ) ) {
             throw new NoRequiredPropertyException( "ExternalDiffProvider missing required property", PROP_DIFFCOMMAND );
@@ -98,7 +99,8 @@
      * Makes the diff by calling "diff" program.
      * {@inheritDoc}
      */
-    @Override public String makeDiffHtml( final WikiContext ctx, final String p1, final String p2 ) {
+    @Override
+    public String makeDiffHtml( final Context ctx, final String p1, final String p2 ) {
         File f1 = null;
         File f2 = null;
         String diff = null;
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/filters/DefaultFilterManager.java b/jspwiki-main/src/main/java/org/apache/wiki/filters/DefaultFilterManager.java
index 1d8a341..ad41ec1 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/filters/DefaultFilterManager.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/filters/DefaultFilterManager.java
@@ -19,7 +19,7 @@
 package org.apache.wiki.filters;
 
 import org.apache.log4j.Logger;
-import org.apache.wiki.WikiContext;
+import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.core.Engine;
 import org.apache.wiki.api.exceptions.FilterException;
 import org.apache.wiki.api.exceptions.WikiException;
@@ -238,10 +238,10 @@
      *  @throws FilterException If any of the filters throws a FilterException
      *  @return The modified WikiMarkup
      *
-     *  @see PageFilter#preTranslate(WikiContext, String)
+     *  @see PageFilter#preTranslate(Context, String)
      */
     @Override
-    public String doPreTranslateFiltering( final WikiContext context, String pageData ) throws FilterException {
+    public String doPreTranslateFiltering( final Context context, String pageData ) throws FilterException {
         fireEvent( WikiPageEvent.PRE_TRANSLATE_BEGIN, context );
         for( final PageFilter f : m_pageFilters ) {
             pageData = f.preTranslate( context, pageData );
@@ -259,10 +259,10 @@
      *  @param htmlData HTML data to be passed through the postTranslate
      *  @throws FilterException If any of the filters throws a FilterException
      *  @return The modified HTML
-     *  @see PageFilter#postTranslate(WikiContext, String)
+     *  @see PageFilter#postTranslate(Context, String)
      */
     @Override
-    public String doPostTranslateFiltering( final WikiContext context, String htmlData ) throws FilterException {
+    public String doPostTranslateFiltering( final Context context, String htmlData ) throws FilterException {
         fireEvent( WikiPageEvent.POST_TRANSLATE_BEGIN, context );
         for( final PageFilter f : m_pageFilters ) {
             htmlData = f.postTranslate( context, htmlData );
@@ -280,10 +280,10 @@
      *  @param pageData WikiMarkup data to be passed through the preSave chain.
      *  @throws FilterException If any of the filters throws a FilterException
      *  @return The modified WikiMarkup
-     *  @see PageFilter#preSave(WikiContext, String)
+     *  @see PageFilter#preSave(Context, String)
      */
     @Override
-    public String doPreSaveFiltering( final WikiContext context, String pageData ) throws FilterException {
+    public String doPreSaveFiltering( final Context context, String pageData ) throws FilterException {
         fireEvent( WikiPageEvent.PRE_SAVE_BEGIN, context );
         for( final PageFilter f : m_pageFilters ) {
             pageData = f.preSave( context, pageData );
@@ -301,10 +301,10 @@
      *  @param pageData WikiMarkup data to be passed through the postSave chain.
      *  @throws FilterException If any of the filters throws a FilterException
      *
-     *  @see PageFilter#postSave(WikiContext, String)
+     *  @see PageFilter#postSave(Context, String)
      */
     @Override
-    public void doPostSaveFiltering( final WikiContext context, final String pageData ) throws FilterException {
+    public void doPostSaveFiltering( final Context context, final String pageData ) throws FilterException {
         fireEvent( WikiPageEvent.POST_SAVE_BEGIN, context );
         for( final PageFilter f : m_pageFilters ) {
             // log.info("POSTSAVE: "+f.toString() );
@@ -347,7 +347,7 @@
      * @param type      the WikiPageEvent type to be fired.
      * @param context   the WikiContext of the event.
      */
-    public void fireEvent( final int type, final WikiContext context ) {
+    public void fireEvent( final int type, final Context context ) {
         if( WikiEventManager.isListening(this ) && WikiPageEvent.isValidType( type ) )  {
             WikiEventManager.fireEvent(this, new WikiPageEvent( m_engine, type, context.getPage().getName() ) );
         }
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/filters/FilterManager.java b/jspwiki-main/src/main/java/org/apache/wiki/filters/FilterManager.java
index f1d26ed..889c2e0 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/filters/FilterManager.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/filters/FilterManager.java
@@ -18,7 +18,7 @@
  */
 package org.apache.wiki.filters;
 
-import org.apache.wiki.WikiContext;
+import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.exceptions.FilterException;
 import org.apache.wiki.api.filters.PageFilter;
 import org.apache.wiki.modules.ModuleManager;
@@ -62,9 +62,9 @@
      *  @throws FilterException If any of the filters throws a FilterException
      *  @return The modified WikiMarkup
      *  
-     *  @see PageFilter#preTranslate(WikiContext, String)
+     *  @see PageFilter#preTranslate(Context, String)
      */
-    String doPreTranslateFiltering( WikiContext context, String pageData ) throws FilterException;
+    String doPreTranslateFiltering( Context context, String pageData ) throws FilterException;
     
     /**
      *  Does the filtering after HTML translation.
@@ -73,9 +73,9 @@
      *  @param htmlData HTML data to be passed through the postTranslate
      *  @throws FilterException If any of the filters throws a FilterException
      *  @return The modified HTML
-     *  @see PageFilter#postTranslate(WikiContext, String)
+     *  @see PageFilter#postTranslate(Context, String)
      */
-    String doPostTranslateFiltering( WikiContext context, String htmlData ) throws FilterException;
+    String doPostTranslateFiltering( Context context, String htmlData ) throws FilterException;
     
     /**
      *  Does the filtering before a save to the page repository.
@@ -84,9 +84,9 @@
      *  @param pageData WikiMarkup data to be passed through the preSave chain.
      *  @throws FilterException If any of the filters throws a FilterException
      *  @return The modified WikiMarkup
-     *  @see PageFilter#preSave(WikiContext, String)
+     *  @see PageFilter#preSave(Context, String)
      */
-    String doPreSaveFiltering( WikiContext context, String pageData ) throws FilterException;
+    String doPreSaveFiltering( Context context, String pageData ) throws FilterException;
     
     /**
      *  Does the page filtering after the page has been saved.
@@ -95,9 +95,9 @@
      *  @param pageData WikiMarkup data to be passed through the postSave chain.
      *  @throws FilterException If any of the filters throws a FilterException
      * 
-     *  @see PageFilter#postSave(WikiContext, String)
+     *  @see PageFilter#postSave(Context, String)
      */
-    void doPostSaveFiltering( WikiContext context, String pageData ) throws FilterException;
+    void doPostSaveFiltering( Context context, String pageData ) throws FilterException;
     
     /**
      *  Returns the list of filters currently installed.  Note that this is not
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/pages/PageManager.java b/jspwiki-main/src/main/java/org/apache/wiki/pages/PageManager.java
index a35fce9..1fc7ec5 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/pages/PageManager.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/pages/PageManager.java
@@ -18,8 +18,9 @@
  */
 package org.apache.wiki.pages;
 
-import org.apache.wiki.WikiContext;
 import org.apache.wiki.WikiPage;
+import org.apache.wiki.api.core.Context;
+import org.apache.wiki.api.core.Page;
 import org.apache.wiki.api.exceptions.ProviderException;
 import org.apache.wiki.api.exceptions.WikiException;
 import org.apache.wiki.event.WikiEventListener;
@@ -93,7 +94,7 @@
      *  @return String of WikiText.
      *  @since 2.1.13, moved to PageManager on 2.11.0.
      */
-    default String getPureText( final WikiPage page ) {
+    default String getPureText( final Page page ) {
         return getPureText( page.getName(), page.getVersion() );
     }
 
@@ -124,12 +125,12 @@
      *  Returns the un-HTMLized text of the given version of a page in the given context.  USE THIS METHOD if you don't know what doing.
      *  <p>
      *  This method also replaces the &lt; and &amp; -characters with their respective HTML entities, thus making it suitable
-     *  for inclusion on an HTML page.  If you want to have the page text without any conversions, use {@link #getPureText(WikiPage)}.
+     *  for inclusion on an HTML page.  If you want to have the page text without any conversions, use {@link #getPureText(Page)}.
      *
      *  @since 1.9.15.
      *  @param page A page reference (not an attachment)
      *  @return The page content as HTMLized String.
-     *  @see PageManager#getPureText(WikiPage)
+     *  @see PageManager#getPureText(Page)
      */
     default String getText( final WikiPage page ) {
         return getText( page.getName(), page.getVersion() );
@@ -151,7 +152,7 @@
      *  Individual PageFilters, such as the {@link org.apache.wiki.filters.SpamFilter} may also throw a
      *  {@link org.apache.wiki.api.exceptions.RedirectException}.
      */
-    void saveText( WikiContext context, String text ) throws WikiException;
+    void saveText( Context context, String text ) throws WikiException;
 
     /**
      * Puts the page text into the repository.  Note that this method does NOT update
@@ -335,7 +336,7 @@
      *  @throws ProviderException If something goes badly wrong.
      *  @since 2.0
      */
-    default boolean wikiPageExists( final WikiPage page ) throws ProviderException {
+    default boolean wikiPageExists( final Page page ) throws ProviderException {
         if( page != null ) {
             return wikiPageExists( page.getName(), page.getVersion() );
         }
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/parser/HeadingListener.java b/jspwiki-main/src/main/java/org/apache/wiki/parser/HeadingListener.java
index 84d13a5..80c7b23 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/parser/HeadingListener.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/parser/HeadingListener.java
@@ -18,19 +18,20 @@
  */
 package org.apache.wiki.parser;
 
-import org.apache.wiki.WikiContext;
+import org.apache.wiki.api.core.Context;
+
 
 /**
- *  Provides a listener interface for headings.  This is used in parsing,
- *  and e.g. the TableOfContents is built using this listener.
+ *  Provides a listener interface for headings.  This is used in parsing, and e.g. the TableOfContents is built using this listener.
  */
-public interface HeadingListener
-{
+public interface HeadingListener {
+
     /**
      *  Is called whenever a heading is encountered in the stream.
      *  
      *  @param context The WikiContext
      *  @param hd The heading which was just encountered.
      */
-    void headingAdded( WikiContext context, Heading hd );
+    void headingAdded( Context context, Heading hd );
+
 }
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/parser/JSPWikiMarkupParser.java b/jspwiki-main/src/main/java/org/apache/wiki/parser/JSPWikiMarkupParser.java
index e2a18cc..afb6cc6 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/parser/JSPWikiMarkupParser.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/parser/JSPWikiMarkupParser.java
@@ -32,6 +32,7 @@
 import org.apache.wiki.StringTransmutator;
 import org.apache.wiki.WikiContext;
 import org.apache.wiki.WikiPage;
+import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.exceptions.PluginException;
 import org.apache.wiki.api.plugin.WikiPlugin;
 import org.apache.wiki.attachment.AttachmentManager;
@@ -170,7 +171,7 @@
      *  @param context The WikiContext which controls the parsing
      *  @param in Where the data is read from.
      */
-    public JSPWikiMarkupParser( final WikiContext context, final Reader in )
+    public JSPWikiMarkupParser( final Context context, final Reader in )
     {
         super( context, in );
         initialize();
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/parser/LinkParsingOperations.java b/jspwiki-main/src/main/java/org/apache/wiki/parser/LinkParsingOperations.java
index 51263ef..efd0dbc 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/parser/LinkParsingOperations.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/parser/LinkParsingOperations.java
@@ -21,7 +21,7 @@
 import org.apache.log4j.Logger;
 import org.apache.oro.text.regex.Pattern;
 import org.apache.oro.text.regex.Perl5Matcher;
-import org.apache.wiki.WikiContext;
+import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.exceptions.ProviderException;
 
 import java.util.Arrays;
@@ -37,7 +37,7 @@
 public class LinkParsingOperations {
 
     private static final Logger log = Logger.getLogger( LinkParsingOperations.class );
-    private final WikiContext wikiContext;
+    private final Context wikiContext;
 
     /**
      *  This list contains all IANA registered URI protocol types as of September 2004 + a few well-known extra types.
@@ -63,7 +63,7 @@
         Arrays.sort( EXTERNAL_LINKS );
     }
 
-    public LinkParsingOperations( final WikiContext wikiContext ) {
+    public LinkParsingOperations( final Context wikiContext ) {
     	this.wikiContext = wikiContext;
     }
 
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/parser/MarkupParser.java b/jspwiki-main/src/main/java/org/apache/wiki/parser/MarkupParser.java
index aed6c63..b26a29b 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/parser/MarkupParser.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/parser/MarkupParser.java
@@ -24,7 +24,7 @@
 import org.apache.oro.text.regex.Pattern;
 import org.apache.oro.text.regex.PatternCompiler;
 import org.apache.wiki.StringTransmutator;
-import org.apache.wiki.WikiContext;
+import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.core.Engine;
 import org.apache.wiki.util.TextUtil;
 import org.jdom2.Element;
@@ -51,7 +51,7 @@
     private int m_pos = -1; // current position in reader stream
 
     protected Engine m_engine;
-    protected WikiContext m_context;
+    protected Context m_context;
 
     /** Optionally stores internal wikilinks */
     protected ArrayList< StringTransmutator > m_localLinkMutatorChain = new ArrayList<>();
@@ -131,7 +131,7 @@
      *  @param context The WikiContext.
      *  @param in The reader from which we are reading the bytes from.
      */
-    protected MarkupParser( final WikiContext context, final Reader in ) {
+    protected MarkupParser( final Context context, final Reader in ) {
         m_engine = context.getEngine();
         m_context = context;
         m_linkParsingOperations = new LinkParsingOperations( m_context );
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/preferences/Preferences.java b/jspwiki-main/src/main/java/org/apache/wiki/preferences/Preferences.java
index 7299981..868d8f5 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/preferences/Preferences.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/preferences/Preferences.java
@@ -24,6 +24,7 @@
 import org.apache.log4j.Logger;
 import org.apache.wiki.InternalWikiException;
 import org.apache.wiki.WikiContext;
+import org.apache.wiki.api.core.Context;
 import org.apache.wiki.i18n.InternationalizationManager;
 import org.apache.wiki.util.HttpUtil;
 import org.apache.wiki.util.PropertyReader;
@@ -162,7 +163,7 @@
      *  @param name
      *  @return the preference value
      */
-    public static String getPreference( final WikiContext wikiContext, final String name ) {
+    public static String getPreference( final Context wikiContext, final String name ) {
         final HttpServletRequest request = wikiContext.getHttpRequest();
         if ( request == null ) return null;
 
@@ -201,7 +202,7 @@
      * @return a Locale object.
      * @since 2.8
      */
-    public static Locale getLocale( final WikiContext context ) {
+    public static Locale getLocale( final Context context ) {
         Locale loc = null;
 
         final String langSetting = getPreference( context, "Language" );
@@ -254,7 +255,7 @@
      *  @return A localized string (or from the default language, if not found)
      *  @throws MissingResourceException If the bundle cannot be found
      */
-    public static ResourceBundle getBundle( final WikiContext context, final String bundle )
+    public static ResourceBundle getBundle( final Context context, final String bundle )
         throws MissingResourceException
     {
         final Locale loc = getLocale( context );
@@ -272,7 +273,7 @@
      *  @return A SimpleTimeFormat object which you can use to render
      *  @since 2.8
      */
-    public static SimpleDateFormat getDateFormat( final WikiContext context, final TimeFormat tf )
+    public static SimpleDateFormat getDateFormat( final Context context, final TimeFormat tf )
     {
         final InternationalizationManager imgr = context.getEngine().getManager( InternationalizationManager.class );
         final Locale clientLocale = getLocale( context );
@@ -338,10 +339,8 @@
      *  @return A ready-rendered date.
      *  @since 2.8
      */
-    public static String renderDate( final WikiContext context, final Date date, final TimeFormat tf )
-    {
+    public static String renderDate( final Context context, final Date date, final TimeFormat tf ) {
         final DateFormat df = getDateFormat( context, tf );
-
         return df.format( date );
     }
 
@@ -355,8 +354,7 @@
      *
      *  @since 2.8
      */
-    public enum TimeFormat
-    {
+    public enum TimeFormat {
         /** A time format, no date. */
         TIME,
 
@@ -366,4 +364,5 @@
         /** A date+time format. */
         DATETIME
     }
+
 }
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
index 26d2c67..c10140b 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/render/DefaultRenderingManager.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/render/DefaultRenderingManager.java
@@ -26,6 +26,7 @@
 import org.apache.wiki.StringTransmutator;
 import org.apache.wiki.WikiContext;
 import org.apache.wiki.WikiPage;
+import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.core.Engine;
 import org.apache.wiki.api.exceptions.FilterException;
 import org.apache.wiki.api.exceptions.ProviderException;
@@ -190,7 +191,7 @@
      *  {@inheritDoc}
      */
     @Override
-    public MarkupParser getParser( final WikiContext context, final String pagedata ) {
+    public MarkupParser getParser( final Context context, final String pagedata ) {
     	try {
 			return ClassUtil.getMappedObject( m_markupParserClass, context, new StringReader( pagedata ) );
 		} catch( final ReflectiveOperationException | IllegalArgumentException e ) {
@@ -204,7 +205,7 @@
      */
     @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 ) {
+    public WikiDocument getRenderedDocument( final Context context, final String pagedata ) {
         final String pageid = context.getRealPage().getName() + VERSION_DELIMITER +
                               context.getRealPage().getVersion() + VERSION_DELIMITER +
                               context.getVariable( WikiContext.VAR_EXECUTE_PLUGINS );
@@ -244,7 +245,7 @@
         return null;
     }
 
-    boolean useCache( final WikiContext context ) {
+    boolean useCache( final Context context ) {
         return m_useCache && WikiContext.VIEW.equals( context.getRequestContext() );
     }
 
@@ -252,7 +253,7 @@
      *  {@inheritDoc}
      */
     @Override
-    public String getHTML( final WikiContext context, final WikiDocument doc ) throws IOException {
+    public String getHTML( final Context context, final WikiDocument doc ) throws IOException {
         final Boolean wysiwygVariable = ( Boolean )context.getVariable( WikiContext.VAR_WYSIWYG_EDITOR_MODE );
         final boolean wysiwygEditorMode;
         if( wysiwygVariable != null ) {
@@ -274,7 +275,7 @@
      *  {@inheritDoc}
      */
     @Override
-    public String getHTML( final WikiContext context, final WikiPage page ) {
+    public String getHTML( final Context context, final WikiPage page ) {
         final String pagedata = m_engine.getManager( PageManager.class ).getPureText( page.getName(), page.getVersion() );
         return textToHTML( context, pagedata );
     }
@@ -287,9 +288,10 @@
      *  @param version Version number to fetch
      *  @return HTML-rendered page text.
      */
-    @Override public String getHTML( final String pagename, final int version ) {
+    @Override
+    public String getHTML( final String pagename, final int version ) {
         final WikiPage page = m_engine.getManager( PageManager.class ).getPage( pagename, version );
-        final WikiContext context = new WikiContext( m_engine, page );
+        final Context context = new WikiContext( m_engine, page );
         context.setRequestContext( WikiContext.NONE );
         return getHTML( context, page );
     }
@@ -298,7 +300,7 @@
      *  {@inheritDoc}
      */
     @Override
-    public String textToHTML( final WikiContext context, String pagedata ) {
+    public String textToHTML( final Context context, String pagedata ) {
         String result = "";
 
         final boolean runFilters = "true".equals( m_engine.getManager( VariableManager.class ).getValue( context,VariableManager.VAR_RUNFILTERS,"true" ) );
@@ -331,7 +333,7 @@
      *  {@inheritDoc}
      */
     @Override
-    public String textToHTML( final WikiContext context,
+    public String textToHTML( final Context context,
                               String pagedata,
                               final StringTransmutator localLinkHook,
                               final StringTransmutator extLinkHook,
@@ -394,7 +396,7 @@
      *  {@inheritDoc}
      */
     @Override
-    public WikiRenderer getRenderer( final WikiContext context, final WikiDocument doc ) {
+    public WikiRenderer getRenderer( final Context context, final WikiDocument doc ) {
         final Object[] params = { context, doc };
         return getRenderer( params, m_rendererConstructor );
     }
@@ -403,7 +405,7 @@
      *  {@inheritDoc}
      */
     @Override
-    public WikiRenderer getWysiwygRenderer( final WikiContext context, final WikiDocument doc ) {
+    public WikiRenderer getWysiwygRenderer( final Context context, final WikiDocument doc ) {
         final Object[] params = { context, doc };
         return getRenderer( params, m_rendererWysiwygConstructor );
     }
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 0c1fdc1..e1affaf 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
@@ -20,8 +20,8 @@
 
 import org.apache.log4j.Logger;
 import org.apache.wiki.StringTransmutator;
-import org.apache.wiki.WikiContext;
 import org.apache.wiki.WikiPage;
+import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.core.Engine;
 import org.apache.wiki.api.exceptions.WikiException;
 import org.apache.wiki.event.WikiEventListener;
@@ -97,7 +97,7 @@
      *  @param pagedata the page data
      *  @return A MarkupParser instance.
      */
-    MarkupParser getParser( WikiContext context, String pagedata );
+    MarkupParser getParser( Context context, String pagedata );
 
     /**
      *  Returns a cached document, if one is found.
@@ -106,7 +106,7 @@
      * @param pagedata the page data
      * @return the rendered wiki document
      */
-    WikiDocument getRenderedDocument( WikiContext context, String pagedata );
+    WikiDocument getRenderedDocument( Context context, String pagedata );
 
     /**
      * Returns a WikiRenderer instance, initialized with the given context and doc. The object is an XHTMLRenderer,
@@ -116,7 +116,7 @@
      * @param doc The document to render
      * @return A WikiRenderer for this document, or null, if no such renderer could be instantiated.
      */
-    WikiRenderer getRenderer( WikiContext context, WikiDocument doc );
+    WikiRenderer getRenderer( Context context, WikiDocument doc );
 
     /**
      * Returns a WikiRenderer instance meant for WYSIWYG editing, initialized with the given
@@ -127,7 +127,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.
      */
-    WikiRenderer getWysiwygRenderer( WikiContext context, WikiDocument doc );
+    WikiRenderer getWysiwygRenderer( Context context, WikiDocument doc );
 
     /**
      *  Simply renders a WikiDocument to a String.  This version does not get the document from the cache - in fact, it does
@@ -140,7 +140,7 @@
      *  @return Rendered HTML.
      *  @throws IOException If the WikiDocument is poorly formed.
      */
-    String getHTML( WikiContext context, WikiDocument doc ) throws IOException;
+    String getHTML( Context context, WikiDocument doc ) throws IOException;
 
     /**
      *  Returns the converted HTML of the page using a different context than the default context.
@@ -149,7 +149,7 @@
      *  @param  page WikiPage reference.
      *  @return HTML-rendered version of the page.
      */
-    String getHTML( WikiContext context, WikiPage page );
+    String getHTML( Context context, WikiPage page );
 
     /**
      *  Returns the converted HTML of the page's specific version. The version must be a positive integer, otherwise the current
@@ -171,7 +171,7 @@
      *   @param pagedata the page data
      *   @return XHTML data.
      */
-    default String getHTML( final WikiContext context, final String pagedata ) {
+    default String getHTML( final Context context, final String pagedata ) {
         try {
             final WikiDocument doc = getRenderedDocument( context, pagedata );
             return getHTML( context, doc );
@@ -199,7 +199,7 @@
      *  @param context  The WikiContext in which the page is to be rendered
      *  @return Rendered page text
      */
-    String textToHTML( WikiContext context, String pagedata );
+    String textToHTML( Context context, String pagedata );
 
     /**
      *  Helper method for doing the HTML translation.
@@ -212,7 +212,7 @@
      *  @param justParse Just parses the pagedata, does not actually render.  In this case, this methods an empty string.
      *  @return HTML-rendered page text.
      */
-    String textToHTML( WikiContext context,
+    String textToHTML( Context context,
                        String pagedata,
                        StringTransmutator localLinkHook,
                        StringTransmutator extLinkHook,
@@ -230,7 +230,7 @@
      *
      *  @return HTML-rendered page text.
      */
-    default String textToHTML( final WikiContext context,
+    default String textToHTML( final Context context,
                                final String pagedata,
                                final StringTransmutator localLinkHook,
                                final StringTransmutator extLinkHook ) {
@@ -247,7 +247,7 @@
      *  @param attLinkHook   Is called whenever an attachment link is found
      *  @return HTML-rendered page text.
      */
-    default String textToHTML( final WikiContext context,
+    default String textToHTML( final Context context,
                                final String pagedata,
                                final StringTransmutator localLinkHook,
                                final StringTransmutator extLinkHook,
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/search/BasicSearchProvider.java b/jspwiki-main/src/main/java/org/apache/wiki/search/BasicSearchProvider.java
index c7139b7..765850a 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/search/BasicSearchProvider.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/search/BasicSearchProvider.java
@@ -19,8 +19,8 @@
 package org.apache.wiki.search;
 
 import org.apache.log4j.Logger;
-import org.apache.wiki.WikiContext;
 import org.apache.wiki.WikiPage;
+import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.core.Engine;
 import org.apache.wiki.api.exceptions.NoRequiredPropertyException;
 import org.apache.wiki.api.exceptions.ProviderException;
@@ -138,7 +138,7 @@
         return "";
     }
 
-    private Collection< SearchResult > findPages( final QueryItem[] query, final WikiContext wikiContext ) {
+    private Collection< SearchResult > findPages( final QueryItem[] query, final Context wikiContext ) {
         final TreeSet< SearchResult > res = new TreeSet<>( new SearchResultComparator() );
         final SearchMatcher matcher = new SearchMatcher( m_engine, query );
         final Collection< WikiPage > allPages;
@@ -179,7 +179,7 @@
      *  {@inheritDoc}
      */
     @Override
-    public Collection< SearchResult > findPages( final String query, final WikiContext wikiContext ) {
+    public Collection< SearchResult > findPages( final String query, final Context wikiContext ) {
         return findPages( parseQuery( query ), wikiContext );
     }
 
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/search/SearchManager.java b/jspwiki-main/src/main/java/org/apache/wiki/search/SearchManager.java
index 131be40..c844c3f 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/search/SearchManager.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/search/SearchManager.java
@@ -18,8 +18,8 @@
  */
 package org.apache.wiki.search;
 
-import org.apache.wiki.WikiContext;
 import org.apache.wiki.WikiPage;
+import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.exceptions.ProviderException;
 import org.apache.wiki.api.filters.PageFilter;
 import org.apache.wiki.event.WikiEventListener;
@@ -60,7 +60,7 @@
      * @throws ProviderException If the provider fails and a search cannot be completed.
      * @throws IOException If something else goes wrong.
      */
-    default Collection< SearchResult > findPages( String query, final WikiContext wikiContext ) throws ProviderException, IOException {
+    default Collection< SearchResult > findPages( String query, final Context wikiContext ) throws ProviderException, IOException {
         if( query == null ) {
             query = "";
         }
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/tasks/DefaultTasksManager.java b/jspwiki-main/src/main/java/org/apache/wiki/tasks/DefaultTasksManager.java
index 0ee74e5..b4a91d6 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/tasks/DefaultTasksManager.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/tasks/DefaultTasksManager.java
@@ -18,7 +18,7 @@
  */
 package org.apache.wiki.tasks;
 
-import org.apache.wiki.WikiContext;
+import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.core.Engine;
 import org.apache.wiki.tasks.auth.SaveUserProfileTask;
 import org.apache.wiki.tasks.pages.PreSaveWikiPageTask;
@@ -37,7 +37,7 @@
      * {@inheritDoc}
      */
     @Override
-    public Step buildPreSaveWikiPageTask( final WikiContext context, final String proposedText ) {
+    public Step buildPreSaveWikiPageTask( final Context context, final String proposedText ) {
         return new PreSaveWikiPageTask( context, proposedText );
     }
     
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/tasks/TasksManager.java b/jspwiki-main/src/main/java/org/apache/wiki/tasks/TasksManager.java
index c78774c..1d1b1ae 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/tasks/TasksManager.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/tasks/TasksManager.java
@@ -18,7 +18,7 @@
  */
 package org.apache.wiki.tasks;
 
-import org.apache.wiki.WikiContext;
+import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.core.Engine;
 import org.apache.wiki.workflow.Step;
 
@@ -48,7 +48,7 @@
      * @param proposedText text proposed to be saved on the wiki page.
      * @return a pre-save WikiPage task.
      */
-    Step buildPreSaveWikiPageTask( WikiContext context, String proposedText );
+    Step buildPreSaveWikiPageTask( Context context, String proposedText );
     
     /**
      * Builds a save WikiPage task.
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/tasks/pages/PreSaveWikiPageTask.java b/jspwiki-main/src/main/java/org/apache/wiki/tasks/pages/PreSaveWikiPageTask.java
index 5a2c6a4..c2ed0ac 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/tasks/pages/PreSaveWikiPageTask.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/tasks/pages/PreSaveWikiPageTask.java
@@ -18,9 +18,9 @@
  */
 package org.apache.wiki.tasks.pages;
 
-import org.apache.wiki.WikiContext;
-import org.apache.wiki.WikiPage;
+import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.core.Engine;
+import org.apache.wiki.api.core.Page;
 import org.apache.wiki.api.exceptions.WikiException;
 import org.apache.wiki.filters.FilterManager;
 import org.apache.wiki.tasks.TasksManager;
@@ -40,7 +40,7 @@
 public class PreSaveWikiPageTask extends Task {
 
     private static final long serialVersionUID = 6304715570092804615L;
-    private final WikiContext m_context;
+    private final Context m_context;
     private final String m_proposedText;
 
     /**
@@ -49,7 +49,7 @@
      * @param context The WikiContext
      * @param proposedText The text that was just saved.
      */
-    public PreSaveWikiPageTask( final WikiContext context, final String proposedText ) {
+    public PreSaveWikiPageTask( final Context context, final String proposedText ) {
         super( TasksManager.WIKIPAGE_PRESAVE_TASK_MESSAGE_KEY );
         m_context = context;
         m_proposedText = proposedText;
@@ -65,7 +65,7 @@
         final Workflow workflow = getWorkflow();
 
         // Get the wiki page
-        final WikiPage page = m_context.getPage();
+        final Page page = m_context.getPage();
 
         // Figure out who the author was. Prefer the author set programmatically; otherwise get from the current logged in user
         if( page.getAuthor() == null ) {
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/ui/DefaultTemplateManager.java b/jspwiki-main/src/main/java/org/apache/wiki/ui/DefaultTemplateManager.java
index bdd4044..5e672d9 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/ui/DefaultTemplateManager.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/ui/DefaultTemplateManager.java
@@ -22,6 +22,7 @@
 import org.apache.log4j.Logger;
 import org.apache.wiki.InternalWikiException;
 import org.apache.wiki.WikiContext;
+import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.core.Engine;
 import org.apache.wiki.modules.BaseModuleManager;
 import org.apache.wiki.modules.WikiModuleInfo;
@@ -176,12 +177,12 @@
 
     /** {@inheritDoc} */
     @Override
-    public String findResource( final WikiContext ctx, final String template, final String name ) {
+    public String findResource( final Context ctx, final String template, final String name ) {
         if( m_engine.getServletContext() != null ) {
             return findResource( m_engine.getServletContext(), template, name );
         }
 
-        return getPath(template)+"/"+name;
+        return getPath( template ) + "/" + name;
     }
 
     /*
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/ui/TemplateManager.java b/jspwiki-main/src/main/java/org/apache/wiki/ui/TemplateManager.java
index c4cf4b8..34d240b 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/ui/TemplateManager.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/ui/TemplateManager.java
@@ -20,6 +20,7 @@
 
 import org.apache.log4j.Logger;
 import org.apache.wiki.WikiContext;
+import org.apache.wiki.api.core.Context;
 import org.apache.wiki.i18n.InternationalizationManager;
 import org.apache.wiki.modules.ModuleManager;
 import org.apache.wiki.preferences.Preferences;
@@ -135,7 +136,7 @@
      *  @param name the name of the resource to fine
      *  @return the path to the resource
      */
-    String findResource( WikiContext ctx, String template, String name );
+    String findResource( Context ctx, String template, String name );
 
     /**
      *   Lists the skins available under this template.  Returns an empty Set, if there are no extra skins available.  Note that
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/variables/VariableManager.java b/jspwiki-main/src/main/java/org/apache/wiki/variables/VariableManager.java
index 8387902..c3e441e 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/variables/VariableManager.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/variables/VariableManager.java
@@ -18,7 +18,7 @@
  */
 package org.apache.wiki.variables;
 
-import org.apache.wiki.WikiContext;
+import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.exceptions.NoSuchVariableException;
 
 /**
@@ -47,7 +47,7 @@
      *  @throws IllegalArgumentException If the format is not valid (does not start with "{$", is zero length, etc.)
      *  @throws NoSuchVariableException If a variable is not known.
      */
-    String parseAndGetValue( WikiContext context, String link ) throws IllegalArgumentException, NoSuchVariableException;
+    String parseAndGetValue( Context context, String link ) throws IllegalArgumentException, NoSuchVariableException;
 
     /**
      *  This method does in-place expansion of any variables.  However, the expansion is not done twice, that is,
@@ -59,10 +59,10 @@
      *  @param source  The source string.
      *  @return The source string with variables expanded.
      */
-    String expandVariables( WikiContext context, String source );
+    String expandVariables( Context context, String source );
 
     /**
-     *  Returns the value of a named variable.  See {@link #getValue(WikiContext, String)}. The only difference is that
+     *  Returns the value of a named variable.  See {@link #getValue(Context, String)}. The only difference is that
      *  this method does not throw an exception, but it returns the given default value instead.
      *
      *  @param context WikiContext
@@ -70,7 +70,7 @@
      *  @param defValue A default value.
      *  @return The variable value, or if not found, the default value.
      */
-    String getValue( WikiContext context, String varName, String defValue );
+    String getValue( Context context, String varName, String defValue );
 
     /**
      *  Shortcut to getValue(). However, this method does not throw a NoSuchVariableException, but returns null
@@ -81,7 +81,7 @@
      *  @return Variable value, or null, if there is no such variable.
      *  @since 2.2 on Engine, moved to VariableManager on 2.11.0
      */
-    String getVariable( WikiContext context, String name );
+    String getVariable( Context context, String name );
 
     /**
      *  Returns a value of the named variable.  The resolving order is
@@ -107,6 +107,6 @@
      *  @throws IllegalArgumentException If the name is somehow broken.
      *  @throws NoSuchVariableException If a variable is not known.
      */
-    String getValue( WikiContext context, String varName ) throws IllegalArgumentException, NoSuchVariableException;
+    String getValue( Context context, String varName ) throws IllegalArgumentException, NoSuchVariableException;
 
 }
