JSPWIKI-303: SPI to create Pages and Attachments + use all available SPIs throughout the code
diff --git a/jspwiki-api/src/main/java/org/apache/wiki/api/spi/ContentsDSL.java b/jspwiki-api/src/main/java/org/apache/wiki/api/spi/ContentsDSL.java
new file mode 100644
index 0000000..e2c0cb7
--- /dev/null
+++ b/jspwiki-api/src/main/java/org/apache/wiki/api/spi/ContentsDSL.java
@@ -0,0 +1,57 @@
+/*
+    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.api.spi;
+
+import org.apache.wiki.api.core.Attachment;
+import org.apache.wiki.api.core.Engine;
+import org.apache.wiki.api.core.Page;
+
+
+public class ContentsDSL {
+
+    final ContentsSPI contentsSPI;
+
+    ContentsDSL( final ContentsSPI contentsSPI ) {
+        this.contentsSPI = contentsSPI;
+    }
+
+    /**
+     * Creates a new {@link Attachment}. The final name of the attachment will be a synthesis of the parent page name and the file name.
+     *
+     * @param engine     The Engine which is hosting this attachment.
+     * @param parentPage The page which will contain this attachment.
+     * @param fileName   The file name for the attachment.
+     * @return new {@link Attachment} instance.
+     */
+    public Attachment attachment( final Engine engine, final String parentPage, final String fileName ) {
+        return contentsSPI.attachment( engine, parentPage, fileName );
+    }
+
+    /**
+     * Creates a {@link Page} instance.
+     *
+     * @param engine The Engine that owns this page.
+     * @param name   The name of the page.
+     * @return new {@link Page} instance.
+     */
+    public Page page( final Engine engine, final String name ) {
+        return contentsSPI.page( engine, name );
+    }
+
+}
diff --git a/jspwiki-api/src/main/java/org/apache/wiki/api/spi/ContentsSPI.java b/jspwiki-api/src/main/java/org/apache/wiki/api/spi/ContentsSPI.java
new file mode 100644
index 0000000..c6ad880
--- /dev/null
+++ b/jspwiki-api/src/main/java/org/apache/wiki/api/spi/ContentsSPI.java
@@ -0,0 +1,50 @@
+/*
+    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.api.spi;
+
+import org.apache.wiki.api.core.Attachment;
+import org.apache.wiki.api.core.Engine;
+import org.apache.wiki.api.core.Page;
+
+
+/**
+ * SPI used to locate and provide {@link Page} and {@link Attachment} instances.
+ */
+public interface ContentsSPI {
+
+    /**
+     * Creates a new {@link Attachment}. The final name of the attachment will be a synthesis of the parent page name and the file name.
+     *
+     * @param engine     The Engine which is hosting this attachment.
+     * @param parentPage The page which will contain this attachment.
+     * @param fileName   The file name for the attachment.
+     * @return new {@link Attachment} instance.
+     */
+    Attachment attachment( Engine engine, String parentPage, String fileName );
+
+    /**
+     * Creates a {@link Page} instance.
+     *
+     * @param engine The Engine that owns this page.
+     * @param name   The name of the page.
+     * @return new {@link Page} instance.
+     */
+    Page page( Engine engine, String name );
+
+}
diff --git a/jspwiki-api/src/main/java/org/apache/wiki/api/spi/Wiki.java b/jspwiki-api/src/main/java/org/apache/wiki/api/spi/Wiki.java
index a0e3e6b..6a5881c 100644
--- a/jspwiki-api/src/main/java/org/apache/wiki/api/spi/Wiki.java
+++ b/jspwiki-api/src/main/java/org/apache/wiki/api/spi/Wiki.java
@@ -29,26 +29,34 @@
 
 public class Wiki {
 
+    private static final String PROP_PROVIDER_IMPL_CONTENTS = "jspwiki.provider.impl.contents";
     private static final String PROP_PROVIDER_IMPL_CONTEXT = "jspwiki.provider.impl.context";
     private static final String PROP_PROVIDER_IMPL_ENGINE = "jspwiki.provider.impl.engine";
     private static final String PROP_PROVIDER_IMPL_SESSION = "jspwiki.provider.impl.session";
+    private static final String DEFAULT_PROVIDER_IMPL_CONTENTS = "org.apache.wiki.spi.ContentsSPIDefaultImpl";
     private static final String DEFAULT_PROVIDER_IMPL_CONTEXT = "org.apache.wiki.spi.ContextSPIDefaultImpl";
     private static final String DEFAULT_PROVIDER_IMPL_ENGINE = "org.apache.wiki.spi.EngineSPIDefaultImpl";
     private static final String DEFAULT_PROVIDER_IMPL_SESSION = "org.apache.wiki.spi.SessionSPIDefaultImpl";
 
     // default values
     private static Properties properties = PropertyReader.getDefaultProperties();
+    private static ContentsSPI contentsSPI = getSPI( ContentsSPI.class, properties, PROP_PROVIDER_IMPL_CONTENTS, DEFAULT_PROVIDER_IMPL_CONTENTS );
     private static ContextSPI contextSPI = getSPI( ContextSPI.class, properties, PROP_PROVIDER_IMPL_CONTEXT, DEFAULT_PROVIDER_IMPL_CONTEXT );
     private static EngineSPI engineSPI = getSPI( EngineSPI.class, properties, PROP_PROVIDER_IMPL_ENGINE, DEFAULT_PROVIDER_IMPL_ENGINE );
     private static SessionSPI sessionSPI = getSPI( SessionSPI.class, properties, PROP_PROVIDER_IMPL_SESSION, DEFAULT_PROVIDER_IMPL_SESSION );
 
     static void init( final ServletContext context ) {
         properties = PropertyReader.loadWebAppProps( context );
+        contentsSPI = getSPI( ContentsSPI.class, properties, PROP_PROVIDER_IMPL_CONTENTS, DEFAULT_PROVIDER_IMPL_CONTENTS );
         contextSPI = getSPI( ContextSPI.class, properties, PROP_PROVIDER_IMPL_CONTEXT, DEFAULT_PROVIDER_IMPL_CONTEXT );
         engineSPI = getSPI( EngineSPI.class, properties, PROP_PROVIDER_IMPL_ENGINE, DEFAULT_PROVIDER_IMPL_ENGINE );
         sessionSPI = getSPI( SessionSPI.class, properties, PROP_PROVIDER_IMPL_SESSION, DEFAULT_PROVIDER_IMPL_SESSION );
     }
 
+    public static ContentsDSL contents() {
+        return new ContentsDSL( contentsSPI );
+    }
+
     public static ContextDSL context() {
         return new ContextDSL( contextSPI );
     }
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/WikiContext.java b/jspwiki-main/src/main/java/org/apache/wiki/WikiContext.java
index 13550ae..fe537ff 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/WikiContext.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/WikiContext.java
@@ -24,6 +24,7 @@
 import org.apache.wiki.api.core.Engine;
 import org.apache.wiki.api.core.Page;
 import org.apache.wiki.api.core.Session;
+import org.apache.wiki.api.spi.Wiki;
 import org.apache.wiki.auth.AuthorizationManager;
 import org.apache.wiki.auth.NoSuchPrincipalException;
 import org.apache.wiki.auth.UserManager;
@@ -189,7 +190,7 @@
 
         m_engine = engine;
         m_request = request;
-        m_session = WikiSession.getWikiSession( engine, request );
+        m_session = Wiki.session().find( engine, request );
         m_command = command;
 
         // If PageCommand, get the WikiPage
@@ -203,7 +204,7 @@
 
             // Front page does not exist?
             if( m_page == null ) {
-                m_page = new WikiPage( m_engine, m_engine.getFrontPage() );
+                m_page = ( WikiPage )Wiki.contents().page( m_engine, m_engine.getFrontPage() );
             }
         }
 
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/ajax/WikiAjaxDispatcherServlet.java b/jspwiki-main/src/main/java/org/apache/wiki/ajax/WikiAjaxDispatcherServlet.java
index 78793cb..93db834 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/ajax/WikiAjaxDispatcherServlet.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/ajax/WikiAjaxDispatcherServlet.java
@@ -21,7 +21,6 @@
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.log4j.Logger;
-import org.apache.wiki.WikiSession;
 import org.apache.wiki.api.core.Engine;
 import org.apache.wiki.api.spi.Wiki;
 import org.apache.wiki.auth.AuthorizationManager;
@@ -164,7 +163,7 @@
         final Engine e = Wiki.engine().find( req.getSession().getServletContext(), null );
         boolean valid = false;
         if( container != null ) {
-            valid = e.getManager( AuthorizationManager.class ).checkPermission( WikiSession.getWikiSession( e, req ), container.permission );
+            valid = e.getManager( AuthorizationManager.class ).checkPermission( Wiki.session().find( e, req ), container.permission );
         }
         return valid;
     }
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/attachment/AttachmentServlet.java b/jspwiki-main/src/main/java/org/apache/wiki/attachment/AttachmentServlet.java
index 522ba79..f1e6692 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/attachment/AttachmentServlet.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/attachment/AttachmentServlet.java
@@ -26,9 +26,8 @@
 import org.apache.commons.fileupload.servlet.ServletFileUpload;
 import org.apache.log4j.Logger;
 import org.apache.wiki.WikiContext;
-import org.apache.wiki.WikiEngine;
-import org.apache.wiki.WikiSession;
 import org.apache.wiki.api.core.Attachment;
+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.core.Session;
@@ -36,6 +35,7 @@
 import org.apache.wiki.api.exceptions.RedirectException;
 import org.apache.wiki.api.exceptions.WikiException;
 import org.apache.wiki.api.providers.WikiProvider;
+import org.apache.wiki.api.spi.Wiki;
 import org.apache.wiki.auth.AuthorizationManager;
 import org.apache.wiki.auth.permissions.PermissionFactory;
 import org.apache.wiki.i18n.InternationalizationManager;
@@ -114,7 +114,7 @@
      */
     @Override
     public void init( final ServletConfig config ) throws ServletException {
-        m_engine = WikiEngine.getInstance( config );
+        m_engine = Wiki.engine().find( config );
         final Properties props = m_engine.getWikiProperties();
         final String tmpDir = m_engine.getWorkDir() + File.separator + "attach-tmp";
         final String allowed = TextUtil.getStringProperty( props, AttachmentManager.PROP_ALLOWEDEXTENSIONS, null );
@@ -185,7 +185,7 @@
     // FIXME: Messages would need to be localized somehow.
     @Override
     public void doGet( final HttpServletRequest  req, final HttpServletResponse res ) throws IOException {
-        final WikiContext context = new WikiContext( m_engine, req, WikiContext.ATTACH );
+        final Context context = Wiki.context().create( m_engine, req, WikiContext.ATTACH );
         final AttachmentManager mgr = m_engine.getManager( AttachmentManager.class );
         final AuthorizationManager authmgr = m_engine.getManager( AuthorizationManager.class );
         final String version = req.getParameter( HDR_VERSION );
@@ -316,7 +316,7 @@
      * @param fileName The name to check for.
      * @return A valid mime type, or application/binary, if not recognized
      */
-    private static String getMimeType( final WikiContext ctx, final String fileName ) {
+    private static String getMimeType( final Context ctx, final String fileName ) {
         String mimetype = null;
 
         final HttpServletRequest req = ctx.getHttpRequest();
@@ -353,7 +353,7 @@
             req.getSession().removeAttribute("msg");
             res.sendRedirect( nextPage );
         } catch( final RedirectException e ) {
-            final Session session = WikiSession.getWikiSession( m_engine, req );
+            final Session session = Wiki.session().find( m_engine, req );
             session.addMessage( e.getMessage() );
 
             req.getSession().setAttribute("msg", e.getMessage());
@@ -401,7 +401,7 @@
             final FileItemFactory factory = new DiskFileItemFactory();
 
             // Create the context _before_ Multipart operations, otherwise strict servlet containers may fail when setting encoding.
-            final WikiContext context = new WikiContext( m_engine, req, WikiContext.ATTACH );
+            final Context context = Wiki.context().create( m_engine, req, WikiContext.ATTACH );
             final UploadListener pl = new UploadListener();
 
             m_engine.getManager( ProgressManager.class ).startProgress( pl, progressId );
@@ -498,7 +498,7 @@
      * @throws IOException       If there is a problem in the upload.
      * @throws ProviderException If there is a problem in the backend.
      */
-    protected boolean executeUpload( final WikiContext context, final InputStream data,
+    protected boolean executeUpload( final Context context, final InputStream data,
                                      String filename, final String errorPage,
                                      final String parentPage, final String changenote,
                                      final long contentLength )
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 654adc8..454ebdf 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
@@ -22,7 +22,6 @@
 import net.sf.ehcache.CacheManager;
 import net.sf.ehcache.Element;
 import org.apache.log4j.Logger;
-import org.apache.wiki.WikiPage;
 import org.apache.wiki.api.core.Attachment;
 import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.core.Engine;
@@ -30,6 +29,7 @@
 import org.apache.wiki.api.exceptions.NoRequiredPropertyException;
 import org.apache.wiki.api.exceptions.ProviderException;
 import org.apache.wiki.api.providers.AttachmentProvider;
+import org.apache.wiki.api.spi.Wiki;
 import org.apache.wiki.pages.PageManager;
 import org.apache.wiki.parser.MarkupParser;
 import org.apache.wiki.references.ReferenceManager;
@@ -288,7 +288,7 @@
         m_provider.putAttachmentData( att, in );
         m_engine.getManager( ReferenceManager.class ).updateReferences( att.getName(), new ArrayList<>() );
 
-        final WikiPage parent = new WikiPage( m_engine, att.getParentName() );
+        final Page parent = Wiki.contents().page( m_engine, att.getParentName() );
         m_engine.getManager( ReferenceManager.class ).updateReferences( parent );
         m_engine.getManager( SearchManager.class ).reindexPage( att );
     }
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/filters/SpamFilter.java b/jspwiki-main/src/main/java/org/apache/wiki/filters/SpamFilter.java
index 666f168..19b982c 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/filters/SpamFilter.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/filters/SpamFilter.java
@@ -1010,7 +1010,7 @@
      * @return A HTML string which contains input fields for the SpamFilter.
      */
     public static final String insertInputFields( final PageContext pageContext ) {
-        final WikiContext ctx = WikiContext.findContext( pageContext );
+        final Context ctx = Context.findContext( pageContext );
         final Engine engine = ctx.getEngine();
         final StringBuilder sb = new StringBuilder();
         if( engine.getContentEncoding().equals( StandardCharsets.UTF_8 ) ) {
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/pages/DefaultPageManager.java b/jspwiki-main/src/main/java/org/apache/wiki/pages/DefaultPageManager.java
index 0b17008..5a213fb 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/pages/DefaultPageManager.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/pages/DefaultPageManager.java
@@ -21,7 +21,6 @@
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.log4j.Logger;
 import org.apache.wiki.WikiBackgroundThread;
-import org.apache.wiki.WikiPage;
 import org.apache.wiki.api.core.Acl;
 import org.apache.wiki.api.core.AclEntry;
 import org.apache.wiki.api.core.Attachment;
@@ -33,6 +32,7 @@
 import org.apache.wiki.api.exceptions.WikiException;
 import org.apache.wiki.api.providers.PageProvider;
 import org.apache.wiki.api.providers.WikiProvider;
+import org.apache.wiki.api.spi.Wiki;
 import org.apache.wiki.attachment.AttachmentManager;
 import org.apache.wiki.auth.WikiPrincipal;
 import org.apache.wiki.auth.WikiSecurityException;
@@ -411,7 +411,7 @@
             if( page != null ) {
                 m_engine.getManager( ReferenceManager.class ).updateReferences( page );
             } else {
-                m_engine.getManager( ReferenceManager.class ).pageRemoved( new WikiPage( m_engine, pageName ) );
+                m_engine.getManager( ReferenceManager.class ).pageRemoved( Wiki.contents().page( m_engine, pageName ) );
             }
         }
 
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 17669f9..00d199b 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
@@ -31,11 +31,12 @@
 import org.apache.wiki.InternalWikiException;
 import org.apache.wiki.StringTransmutator;
 import org.apache.wiki.WikiContext;
-import org.apache.wiki.WikiPage;
 import org.apache.wiki.api.core.Acl;
 import org.apache.wiki.api.core.Context;
+import org.apache.wiki.api.core.Page;
 import org.apache.wiki.api.exceptions.PluginException;
 import org.apache.wiki.api.plugin.Plugin;
+import org.apache.wiki.api.spi.Wiki;
 import org.apache.wiki.attachment.AttachmentManager;
 import org.apache.wiki.auth.AuthorizationManager;
 import org.apache.wiki.auth.UserManager;
@@ -799,7 +800,7 @@
      */
     private JSPWikiMarkupParser getCleanTranslator() {
         if( m_cleanTranslator == null ) {
-            final Context dummyContext = new WikiContext( m_engine, m_context.getHttpRequest(), m_context.getPage() );
+            final Context dummyContext = Wiki.context().create( m_engine, m_context.getHttpRequest(), m_context.getPage() );
             m_cleanTranslator = new JSPWikiMarkupParser( dummyContext, null );
             m_cleanTranslator.m_allowHTML = true;
         }
@@ -1013,7 +1014,7 @@
         if( !m_parseAccessRules ) {
             return m_currentElement;
         }
-        final WikiPage page = ( WikiPage )m_context.getRealPage();
+        final Page page = m_context.getRealPage();
         // UserDatabase db = m_context.getEngine().getUserDatabase();
 
         if( ruleLine.startsWith( "{" ) ) {
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/plugin/BugReportHandler.java b/jspwiki-main/src/main/java/org/apache/wiki/plugin/BugReportHandler.java
index 107264e..121a1de 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/plugin/BugReportHandler.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/plugin/BugReportHandler.java
@@ -19,13 +19,14 @@
 package org.apache.wiki.plugin;
 
 import org.apache.log4j.Logger;
-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.PluginException;
 import org.apache.wiki.api.exceptions.RedirectException;
 import org.apache.wiki.api.exceptions.WikiException;
 import org.apache.wiki.api.plugin.Plugin;
+import org.apache.wiki.api.spi.Wiki;
 import org.apache.wiki.pages.PageManager;
 import org.apache.wiki.parser.MarkupParser;
 import org.apache.wiki.preferences.Preferences;
@@ -140,7 +141,7 @@
 
             //  Now create a new page for this bug report
             final String pageName = findNextPage( context, title, params.get( PARAM_PAGE ) );
-            final WikiPage newPage = new WikiPage( context.getEngine(), pageName );
+            final Page newPage = Wiki.contents().page( context.getEngine(), pageName );
             final Context newContext = context.clone();
             newContext.setPage( newPage );
             context.getEngine().getManager( PageManager.class ).saveText( newContext, str.toString() );
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/plugin/WeblogEntryPlugin.java b/jspwiki-main/src/main/java/org/apache/wiki/plugin/WeblogEntryPlugin.java
index 1424c9a..42b00b8 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/plugin/WeblogEntryPlugin.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/plugin/WeblogEntryPlugin.java
@@ -20,13 +20,13 @@
 
 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.PluginException;
 import org.apache.wiki.api.exceptions.ProviderException;
 import org.apache.wiki.api.plugin.Plugin;
+import org.apache.wiki.api.spi.Wiki;
 import org.apache.wiki.pages.PageLock;
 import org.apache.wiki.pages.PageManager;
 import org.apache.wiki.preferences.Preferences;
@@ -130,7 +130,7 @@
         //  Find the first page that has no page lock.
         int idx = max + 1;
         while( idx < MAX_BLOG_ENTRIES ) {
-            final WikiPage page = new WikiPage( engine, WeblogPlugin.makeEntryPage( baseName, date, Integer.toString( idx ) ) );
+            final Page page = Wiki.contents().page( engine, WeblogPlugin.makeEntryPage( baseName, date, Integer.toString( idx ) ) );
             final PageLock lock = engine.getManager( PageManager.class ).getCurrentLock(page);
             if (lock == null) {
                 break;
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/providers/AbstractFileProvider.java b/jspwiki-main/src/main/java/org/apache/wiki/providers/AbstractFileProvider.java
index 4304ef8..3b8ac2f 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/providers/AbstractFileProvider.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/providers/AbstractFileProvider.java
@@ -20,7 +20,6 @@
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.log4j.Logger;
-import org.apache.wiki.WikiPage;
 import org.apache.wiki.api.core.Engine;
 import org.apache.wiki.api.core.Page;
 import org.apache.wiki.api.exceptions.NoRequiredPropertyException;
@@ -29,6 +28,7 @@
 import org.apache.wiki.api.providers.WikiProvider;
 import org.apache.wiki.api.search.QueryItem;
 import org.apache.wiki.api.search.SearchResult;
+import org.apache.wiki.api.spi.Wiki;
 import org.apache.wiki.search.SearchMatcher;
 import org.apache.wiki.search.SearchResultComparator;
 import org.apache.wiki.util.FileUtil;
@@ -373,7 +373,7 @@
             return null;
         }
 
-        final Page p = new WikiPage( m_engine, page );
+        final Page p = Wiki.contents().page( m_engine, page );
         p.setLastModified( new Date( file.lastModified() ) );
 
         return p;
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/providers/BasicAttachmentProvider.java b/jspwiki-main/src/main/java/org/apache/wiki/providers/BasicAttachmentProvider.java
index 2a52a85..109867f 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/providers/BasicAttachmentProvider.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/providers/BasicAttachmentProvider.java
@@ -19,7 +19,6 @@
 package org.apache.wiki.providers;
 
 import org.apache.log4j.Logger;
-import org.apache.wiki.WikiPage;
 import org.apache.wiki.api.core.Attachment;
 import org.apache.wiki.api.core.Engine;
 import org.apache.wiki.api.core.Page;
@@ -28,6 +27,7 @@
 import org.apache.wiki.api.providers.AttachmentProvider;
 import org.apache.wiki.api.providers.WikiProvider;
 import org.apache.wiki.api.search.QueryItem;
+import org.apache.wiki.api.spi.Wiki;
 import org.apache.wiki.pages.PageTimeComparator;
 import org.apache.wiki.util.FileUtil;
 import org.apache.wiki.util.TextUtil;
@@ -417,7 +417,7 @@
                 String pageId = unmangleName( pagesWithAttachment );
                 pageId = pageId.substring( 0, pageId.length() - DIR_EXTENSION.length() );
 
-                final Collection< Attachment > c = listAttachments( new WikiPage( m_engine, pageId ) );
+                final Collection< Attachment > c = listAttachments( Wiki.contents().page( m_engine, pageId ) );
                 for( final Attachment att : c ) {
                     if( att.getLastModified().after( timestamp ) ) {
                         list.add( att );
@@ -490,15 +490,14 @@
         try {
             final int latest = findLatestVersion( att );
             for( int i = latest; i >= 1; i-- ) {
-                final Attachment a = getAttachmentInfo( new WikiPage( m_engine, att.getParentName() ), att.getFileName(), i );
-
+                final Attachment a = getAttachmentInfo( Wiki.contents().page( m_engine, att.getParentName() ), att.getFileName(), i );
                 if( a != null ) {
                     list.add( a );
                 }
             }
         } catch( final ProviderException e ) {
             log.error( "Getting version history failed for page: " + att, e );
-            // FIXME: SHould this fail?
+            // FIXME: Should this fail?
         }
 
         return list;
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/providers/VersioningFileProvider.java b/jspwiki-main/src/main/java/org/apache/wiki/providers/VersioningFileProvider.java
index bf8364c..4cbd644 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/providers/VersioningFileProvider.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/providers/VersioningFileProvider.java
@@ -20,13 +20,13 @@
 
 import org.apache.log4j.Logger;
 import org.apache.wiki.InternalWikiException;
-import org.apache.wiki.WikiPage;
 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.api.providers.PageProvider;
 import org.apache.wiki.api.providers.WikiProvider;
+import org.apache.wiki.api.spi.Wiki;
 import org.apache.wiki.util.FileUtil;
 
 import java.io.BufferedInputStream;
@@ -432,7 +432,7 @@
 
             final File file = new File( dir, version + FILE_EXT );
             if( file.exists() ) {
-                p = new WikiPage( m_engine, page );
+                p = Wiki.contents().page( m_engine, page );
 
                 p.setLastModified( new Date( file.lastModified() ) );
                 p.setVersion( version );
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 a140f3a..17a7810 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
@@ -33,6 +33,7 @@
 import org.apache.wiki.api.exceptions.ProviderException;
 import org.apache.wiki.api.exceptions.WikiException;
 import org.apache.wiki.api.providers.PageProvider;
+import org.apache.wiki.api.spi.Wiki;
 import org.apache.wiki.attachment.AttachmentManager;
 import org.apache.wiki.event.WikiEvent;
 import org.apache.wiki.event.WikiEventListener;
@@ -294,7 +295,7 @@
     @Override
     public String getHTML( final String pagename, final int version ) {
         final Page page = m_engine.getManager( PageManager.class ).getPage( pagename, version );
-        final Context context = new WikiContext( m_engine, page );
+        final Context context = Wiki.context().create( m_engine, page );
         context.setRequestContext( WikiContext.NONE );
         return getHTML( context, page );
     }
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/rpc/atom/AtomAPIServlet.java b/jspwiki-main/src/main/java/org/apache/wiki/rpc/atom/AtomAPIServlet.java
index faa031b..dcb9f03 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/rpc/atom/AtomAPIServlet.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/rpc/atom/AtomAPIServlet.java
@@ -19,7 +19,6 @@
 package org.apache.wiki.rpc.atom;
 
 import org.apache.log4j.Logger;
-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;
@@ -123,7 +122,7 @@
             final WeblogEntryPlugin plugin = new WeblogEntryPlugin();
             final String pageName = plugin.getNewEntryPage( m_engine, blogid );
             final String username = author.getName();
-            final Page entryPage = new WikiPage( m_engine, pageName );
+            final Page entryPage = Wiki.contents().page( m_engine, pageName );
             entryPage.setAuthor( username );
 
             final Context context = Wiki.context().create( m_engine, request, entryPage );
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/rss/DefaultRSSGenerator.java b/jspwiki-main/src/main/java/org/apache/wiki/rss/DefaultRSSGenerator.java
index c0fa0cd..8498e1c 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/rss/DefaultRSSGenerator.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/rss/DefaultRSSGenerator.java
@@ -20,14 +20,13 @@
 
 import org.apache.log4j.Logger;
 import org.apache.wiki.WikiContext;
-import org.apache.wiki.WikiPage;
-import org.apache.wiki.WikiSession;
 import org.apache.wiki.api.core.Attachment;
 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.core.Session;
 import org.apache.wiki.api.providers.WikiProvider;
+import org.apache.wiki.api.spi.Wiki;
 import org.apache.wiki.auth.AuthorizationManager;
 import org.apache.wiki.auth.permissions.PagePermission;
 import org.apache.wiki.diff.DifferenceManager;
@@ -127,7 +126,7 @@
     private String getPageDescription( final Page page ) {
         final StringBuilder buf = new StringBuilder();
         final String author = getAuthor( page );
-        final WikiContext ctx = new WikiContext( m_engine, page );
+        final Context ctx = Wiki.context().create( m_engine, page );
         if( page.getVersion() > 1 ) {
             final String diff = m_engine.getManager( DifferenceManager.class ).getDiff( ctx,
                                                                 page.getVersion() - 1, // FIXME: Will fail when non-contiguous versions
@@ -162,7 +161,7 @@
     /** {@inheritDoc} */
     @Override
     public String generate() {
-        final WikiContext context = new WikiContext( m_engine, new WikiPage( m_engine, "__DUMMY" ) );
+        final Context context = Wiki.context().create( m_engine, Wiki.contents().page( m_engine, "__DUMMY" ) );
         context.setRequestContext( WikiContext.RSS );
         final Feed feed = new RSS10Feed( context );
         return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + generateFullWikiRSS( context, feed );
@@ -225,7 +224,7 @@
 
         final Set< Page > changed = m_engine.getManager( PageManager.class ).getRecentChanges();
 
-        final Session session = WikiSession.guestSession( m_engine );
+        final Session session = Wiki.session().guest( m_engine );
         int items = 0;
         for( final Iterator< Page > i = changed.iterator(); i.hasNext() && items < 15; items++ ) {
             final Page page = i.next();
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/search/LuceneSearchProvider.java b/jspwiki-main/src/main/java/org/apache/wiki/search/LuceneSearchProvider.java
index 47e3a9b..8d8bd0e 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/search/LuceneSearchProvider.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/search/LuceneSearchProvider.java
@@ -49,7 +49,6 @@
 import org.apache.wiki.InternalWikiException;
 import org.apache.wiki.WatchDog;
 import org.apache.wiki.WikiBackgroundThread;
-import org.apache.wiki.WikiPage;
 import org.apache.wiki.api.core.Attachment;
 import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.core.Engine;
@@ -59,6 +58,7 @@
 import org.apache.wiki.api.providers.PageProvider;
 import org.apache.wiki.api.providers.WikiProvider;
 import org.apache.wiki.api.search.SearchResult;
+import org.apache.wiki.api.spi.Wiki;
 import org.apache.wiki.attachment.AttachmentManager;
 import org.apache.wiki.auth.AuthorizationManager;
 import org.apache.wiki.auth.permissions.PagePermission;
@@ -522,7 +522,7 @@
                     }
                 } else {
                     log.error( "Lucene found a result page '" + pageName + "' that could not be loaded, removing from Lucene cache" );
-                    pageRemoved( new WikiPage( m_engine, pageName ) );
+                    pageRemoved( Wiki.contents().page( m_engine, pageName ) );
                 }
             }
         } catch( final IOException e ) {
@@ -589,7 +589,7 @@
             synchronized ( m_provider.m_updates ) {
                 while( m_provider.m_updates.size() > 0 ) {
                     final Object[] pair = m_provider.m_updates.remove(0);
-                    final WikiPage page = ( WikiPage ) pair[0];
+                    final Page page = ( Page ) pair[0];
                     final String text = ( String ) pair[1];
                     m_provider.updateLuceneIndex(page, text);
                 }
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/search/SearchMatcher.java b/jspwiki-main/src/main/java/org/apache/wiki/search/SearchMatcher.java
index f6f745d..10c5d61 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/search/SearchMatcher.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/search/SearchMatcher.java
@@ -21,7 +21,9 @@
 import org.apache.wiki.WikiEngine;
 import org.apache.wiki.WikiPage;
 import org.apache.wiki.api.core.Engine;
+import org.apache.wiki.api.core.Page;
 import org.apache.wiki.api.search.QueryItem;
+import org.apache.wiki.api.spi.Wiki;
 
 import java.io.BufferedReader;
 import java.io.IOException;
@@ -131,8 +133,8 @@
      */
     public class SearchResultImpl implements org.apache.wiki.search.SearchResult {
     	
-        int      m_score;
-        WikiPage m_page;
+        int  m_score;
+        Page m_page;
 
         /**
          *  Create a new SearchResult with a given name and a score.
@@ -141,7 +143,7 @@
          *  @param score A score from 0+
          */
         public SearchResultImpl( final String name, final int score ) {
-            m_page  = new WikiPage( m_engine, name );
+            m_page  = Wiki.contents().page( m_engine, name );
             m_score = score;
         }
 
@@ -151,7 +153,7 @@
          */
         @Override
         public WikiPage getPage() {
-            return m_page;
+            return ( WikiPage )m_page;
         }
 
         /**
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/spi/ContentsSPIDefaultImpl.java b/jspwiki-main/src/main/java/org/apache/wiki/spi/ContentsSPIDefaultImpl.java
new file mode 100644
index 0000000..f0b8bc7
--- /dev/null
+++ b/jspwiki-main/src/main/java/org/apache/wiki/spi/ContentsSPIDefaultImpl.java
@@ -0,0 +1,50 @@
+/*
+    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.spi;
+
+import org.apache.wiki.WikiPage;
+import org.apache.wiki.api.core.Attachment;
+import org.apache.wiki.api.core.Engine;
+import org.apache.wiki.api.core.Page;
+import org.apache.wiki.api.spi.ContentsSPI;
+
+
+/**
+ * Default implementation for {@link ContentsSPI}
+ *
+ * @see ContentsSPI
+ */
+public class ContentsSPIDefaultImpl implements ContentsSPI {
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Attachment attachment( final Engine engine, final String parentPage, final String fileName ) {
+        return new org.apache.wiki.attachment.Attachment( engine, parentPage, fileName );
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Page page( final Engine engine, final String name ) {
+        return new WikiPage( engine, name );
+    }
+}
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/ui/DefaultCommandResolver.java b/jspwiki-main/src/main/java/org/apache/wiki/ui/DefaultCommandResolver.java
index e1d110e..6d67aaa 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/ui/DefaultCommandResolver.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/ui/DefaultCommandResolver.java
@@ -20,12 +20,12 @@
 
 import org.apache.log4j.Logger;
 import org.apache.wiki.InternalWikiException;
-import org.apache.wiki.WikiPage;
 import org.apache.wiki.api.core.Command;
 import org.apache.wiki.api.core.Engine;
 import org.apache.wiki.api.core.Page;
 import org.apache.wiki.api.exceptions.ProviderException;
 import org.apache.wiki.api.providers.WikiProvider;
+import org.apache.wiki.api.spi.Wiki;
 import org.apache.wiki.auth.GroupPrincipal;
 import org.apache.wiki.pages.PageManager;
 import org.apache.wiki.parser.MarkupParser;
@@ -311,7 +311,7 @@
         Page wikipage = m_engine.getManager( PageManager.class ).getPage( page, version );
         if ( wikipage == null ) {
             page = MarkupParser.cleanLink( page );
-            wikipage = new WikiPage( m_engine, page );
+            wikipage = Wiki.contents().page( m_engine, page );
         }
         return wikipage;
     }
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/ui/Installer.java b/jspwiki-main/src/main/java/org/apache/wiki/ui/Installer.java
index 0c8b40a..a6431a3 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/ui/Installer.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/ui/Installer.java
@@ -18,11 +18,10 @@
  */
 package org.apache.wiki.ui;
 
-import org.apache.wiki.WikiEngine;
-import org.apache.wiki.WikiSession;
 import org.apache.wiki.api.core.Engine;
 import org.apache.wiki.api.core.Session;
 import org.apache.wiki.api.providers.AttachmentProvider;
+import org.apache.wiki.api.spi.Wiki;
 import org.apache.wiki.auth.NoSuchPrincipalException;
 import org.apache.wiki.auth.UserManager;
 import org.apache.wiki.auth.WikiPrincipal;
@@ -76,8 +75,8 @@
     
     public Installer( final HttpServletRequest request, final ServletConfig config ) {
         // Get wiki session for this user
-        m_engine = WikiEngine.getInstance( config );
-        m_session = WikiSession.getWikiSession( m_engine, request );
+        m_engine = Wiki.engine().find( config );
+        m_session = Wiki.session().find( m_engine, request );
         
         // Get the file for properties
         m_propertyFile = new File(TMP_DIR, PROPFILENAME);
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/xmlrpc/MetaWeblogHandler.java b/jspwiki-main/src/main/java/org/apache/wiki/xmlrpc/MetaWeblogHandler.java
index ac4cde9..e9b5883 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/xmlrpc/MetaWeblogHandler.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/xmlrpc/MetaWeblogHandler.java
@@ -20,12 +20,11 @@
 
 import org.apache.log4j.Logger;
 import org.apache.wiki.WikiContext;
-import org.apache.wiki.WikiPage;
+import org.apache.wiki.api.core.Attachment;
 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.spi.Wiki;
-import org.apache.wiki.attachment.Attachment;
 import org.apache.wiki.attachment.AttachmentManager;
 import org.apache.wiki.auth.AuthenticationManager;
 import org.apache.wiki.auth.AuthorizationManager;
@@ -210,7 +209,7 @@
         try {
             final WeblogEntryPlugin plugin = new WeblogEntryPlugin();
             final String pageName = plugin.getNewEntryPage( engine, blogid );
-            final Page entryPage = new WikiPage( engine, pageName );
+            final Page entryPage = Wiki.contents().page( engine, pageName );
             entryPage.setAuthor( username );
 
             final Context context = Wiki.context().create( engine, entryPage );
@@ -260,7 +259,7 @@
         final AttachmentManager attmgr = engine.getManager( AttachmentManager.class );
 
         try {
-            final Attachment att = new Attachment( engine, blogid, name );
+            final Attachment att = Wiki.contents().attachment( engine, blogid, name );
             att.setAuthor( username );
             attmgr.storeAttachment( att, new ByteArrayInputStream( data ) );
 
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/xmlrpc/RPCHandler.java b/jspwiki-main/src/main/java/org/apache/wiki/xmlrpc/RPCHandler.java
index e565c39..44812d0 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/xmlrpc/RPCHandler.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/xmlrpc/RPCHandler.java
@@ -23,6 +23,7 @@
 import org.apache.wiki.api.core.Attachment;
 import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.core.Page;
+import org.apache.wiki.api.spi.Wiki;
 import org.apache.wiki.auth.permissions.PagePermission;
 import org.apache.wiki.auth.permissions.PermissionFactory;
 import org.apache.wiki.pages.PageManager;
@@ -217,7 +218,7 @@
         final LinkCollector extCollector   = new LinkCollector();
         final LinkCollector attCollector   = new LinkCollector();
 
-        final Context context = new WikiContext( m_engine, page );
+        final Context context = Wiki.context().create( m_engine, page );
         m_engine.getManager( RenderingManager.class ).textToHTML( context, pagedata, localCollector, extCollector, attCollector );
 
         final Vector< Hashtable< String, String > > result = new Vector<>();
diff --git a/jspwiki-main/src/main/resources/META-INF/services/org.apache.wiki.api.spi.ContentsSPI b/jspwiki-main/src/main/resources/META-INF/services/org.apache.wiki.api.spi.ContentsSPI
new file mode 100644
index 0000000..af2111c
--- /dev/null
+++ b/jspwiki-main/src/main/resources/META-INF/services/org.apache.wiki.api.spi.ContentsSPI
@@ -0,0 +1 @@
+org.apache.wiki.spi.ContentsSPIDefaultImpl
\ No newline at end of file
diff --git a/jspwiki-main/src/test/java/org/apache/wiki/TestEngine.java b/jspwiki-main/src/test/java/org/apache/wiki/TestEngine.java
index d096e06..abf90c6 100644
--- a/jspwiki-main/src/test/java/org/apache/wiki/TestEngine.java
+++ b/jspwiki-main/src/test/java/org/apache/wiki/TestEngine.java
@@ -24,21 +24,26 @@
 import net.sourceforge.stripes.mock.MockServletContext;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.log4j.Logger;
+import org.apache.wiki.api.core.Attachment;
+import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.core.Page;
 import org.apache.wiki.api.core.Session;
 import org.apache.wiki.api.exceptions.ProviderException;
 import org.apache.wiki.api.exceptions.WikiException;
 import org.apache.wiki.api.providers.AttachmentProvider;
 import org.apache.wiki.api.providers.PageProvider;
-import org.apache.wiki.attachment.Attachment;
+import org.apache.wiki.api.spi.Wiki;
+import org.apache.wiki.attachment.AttachmentManager;
 import org.apache.wiki.auth.AuthenticationManager;
 import org.apache.wiki.auth.SessionMonitor;
 import org.apache.wiki.auth.Users;
 import org.apache.wiki.auth.WikiSecurityException;
 import org.apache.wiki.event.WikiPageEvent;
+import org.apache.wiki.pages.PageManager;
 import org.apache.wiki.providers.AbstractFileProvider;
 import org.apache.wiki.providers.BasicAttachmentProvider;
 import org.apache.wiki.providers.FileSystemProvider;
+import org.apache.wiki.render.RenderingManager;
 import org.apache.wiki.util.FileUtil;
 import org.apache.wiki.util.PropertyReader;
 import org.apache.wiki.util.TextUtil;
@@ -79,7 +84,7 @@
             // Set up long-running admin session
             final HttpServletRequest request = newHttpRequest();
             m_adminWikiSession = WikiSession.getWikiSession( this, request );
-            this.getAuthenticationManager().login( m_adminWikiSession, request, Users.ADMIN, Users.ADMIN_PASS );
+            this.getManager( AuthenticationManager.class ).login( m_adminWikiSession, request, Users.ADMIN, Users.ADMIN_PASS );
         }
         return m_adminWikiSession;
     }
@@ -109,7 +114,7 @@
             // Set up a test Janne session
             final HttpServletRequest request = newHttpRequest();
             m_janneWikiSession = WikiSession.getWikiSession( this, request );
-            this.getAuthenticationManager().login( m_janneWikiSession, request, Users.JANNE, Users.JANNE_PASS );
+            this.getManager( AuthenticationManager.class ).login( m_janneWikiSession, request, Users.JANNE, Users.JANNE_PASS );
         }
         return m_janneWikiSession;
     }
@@ -393,8 +398,8 @@
      * @param data
      */
     public void addAttachment( final String pageName, final String attachmentName, final byte[] data ) throws ProviderException, IOException {
-        final Attachment att = new Attachment( this,pageName,attachmentName );
-        getAttachmentManager().storeAttachment( att, new ByteArrayInputStream( data ) );
+        final Attachment att = Wiki.contents().attachment( this,pageName,attachmentName );
+        getManager( AttachmentManager.class ).storeAttachment( att, new ByteArrayInputStream( data ) );
     }
 
     /**
@@ -410,25 +415,25 @@
         // Build new request and associate our admin session
         final MockHttpServletRequest request = newHttpRequest();
         final Session wikiSession = SessionMonitor.getInstance( this ).find( request.getSession() );
-        this.getAuthenticationManager().login( wikiSession, request, Users.ADMIN, Users.ADMIN_PASS );
+        this.getManager( AuthenticationManager.class ).login( wikiSession, request, Users.ADMIN, Users.ADMIN_PASS );
 
         // Create page and wiki context
-        final WikiPage page = new WikiPage( this, pageName );
-        final WikiContext context = new WikiContext( this, request, page );
-        getPageManager().saveText( context, content );
+        final Page page = Wiki.contents().page( this, pageName );
+        final Context context = Wiki.context().create( this, request, page );
+        getManager( PageManager.class ).saveText( context, content );
     }
 
     public void saveTextAsJanne( final String pageName, final String content ) throws WikiException {
         // Build new request and associate our Janne session
         final MockHttpServletRequest request = newHttpRequest();
         final Session wikiSession = SessionMonitor.getInstance( this ).find( request.getSession() );
-        this.getAuthenticationManager().login( wikiSession, request, Users.JANNE, Users.JANNE_PASS );
+        this.getManager( AuthenticationManager.class ).login( wikiSession, request, Users.JANNE, Users.JANNE_PASS );
 
         // Create page and wiki context
-        final WikiPage page = new WikiPage( this, pageName );
+        final Page page = Wiki.contents().page( this, pageName );
         page.setAuthor(Users.JANNE);
-        final WikiContext context = new WikiContext( this, request, page );
-        getPageManager().saveText( context, content );
+        final Context context = Wiki.context().create( this, request, page );
+        getManager( PageManager.class ).saveText( context, content );
     }
 
     /**
@@ -439,10 +444,10 @@
      * @return (english) contents corresponding to the given page name.
      */
     public String getI18nHTML( final String pagename ) {
-        final Page page = getPageManager().getPage( pagename, PageProvider.LATEST_VERSION );
-        final WikiContext context = new WikiContext( this, newHttpRequest(), page );
+        final Page page = getManager( PageManager.class ).getPage( pagename, PageProvider.LATEST_VERSION );
+        final Context context = Wiki.context().create( this, newHttpRequest(), page );
         context.setRequestContext( WikiContext.NONE );
-        return getRenderingManager().getHTML( context, page );
+        return getManager( RenderingManager.class ).getHTML( context, page );
     }
 
     public static void trace() {
diff --git a/jspwiki-main/src/test/java/org/apache/wiki/WikiEngineTest.java b/jspwiki-main/src/test/java/org/apache/wiki/WikiEngineTest.java
index eb92bba..dcfcec5 100644
--- a/jspwiki-main/src/test/java/org/apache/wiki/WikiEngineTest.java
+++ b/jspwiki-main/src/test/java/org/apache/wiki/WikiEngineTest.java
@@ -20,8 +20,10 @@
 package org.apache.wiki;
 
 import net.sf.ehcache.CacheManager;
+import org.apache.wiki.api.core.Attachment;
+import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.core.Page;
-import org.apache.wiki.attachment.Attachment;
+import org.apache.wiki.api.spi.Wiki;
 import org.apache.wiki.attachment.AttachmentManager;
 import org.apache.wiki.content.PageRenamer;
 import org.apache.wiki.modules.ModuleManager;
@@ -128,7 +130,7 @@
         final AttachmentManager attMgr = m_engine.getManager( AttachmentManager.class );
         m_engine.saveText( NAME1, "fooBar");
 
-        final Attachment att = new Attachment( m_engine, NAME1, "TestAtt.txt" );
+        final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "TestAtt.txt" );
         att.setAuthor( "FirstPost" );
         attMgr.storeAttachment( att, m_engine.makeAttachmentFile() );
 
@@ -185,7 +187,7 @@
 
         // now we create the attachment
 
-        final Attachment att = new Attachment( m_engine, NAME1, "TestAtt.txt" );
+        final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "TestAtt.txt" );
         att.setAuthor( "FirstPost" );
         attMgr.storeAttachment( att, m_engine.makeAttachmentFile() );
 
@@ -213,7 +215,7 @@
 
         m_engine.saveText( NAME1, "fooBar");
 
-        final Attachment att = new Attachment( m_engine, NAME1, "TestAtt.txt" );
+        final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "TestAtt.txt" );
         att.setAuthor( "FirstPost" );
         attMgr.storeAttachment( att, m_engine.makeAttachmentFile() );
 
@@ -238,7 +240,7 @@
 
         m_engine.saveText( NAME1, "[TestPage2]");
 
-        final Attachment att = new Attachment( m_engine, NAME1, "TestAtt.txt" );
+        final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "TestAtt.txt" );
         att.setAuthor( "FirstPost" );
         attMgr.storeAttachment( att, m_engine.makeAttachmentFile() );
         m_engine.saveText( "TestPage2", "["+NAME1+"/TestAtt.txt]");
@@ -310,20 +312,20 @@
 
     @Test
     public void testChangeNoteOldVersion2() throws Exception {
-        final WikiPage p = new WikiPage( m_engine, NAME1 );
-        final WikiContext context = new WikiContext(m_engine,p);
-        context.getPage().setAttribute( WikiPage.CHANGENOTE, "Test change" );
+        final Page p = Wiki.contents().page( m_engine, NAME1 );
+        final Context context = Wiki.context().create( m_engine,p );
+        context.getPage().setAttribute( Page.CHANGENOTE, "Test change" );
         m_engine.getManager( PageManager.class ).saveText( context, "test" );
 
         for( int i = 0; i < 5; i++ ) {
-            final WikiPage p2 = ( WikiPage )m_engine.getManager( PageManager.class ).getPage( NAME1 ).clone();
-            p2.removeAttribute( WikiPage.CHANGENOTE );
+            final Page p2 = m_engine.getManager( PageManager.class ).getPage( NAME1 ).clone();
+            p2.removeAttribute( Page.CHANGENOTE );
             context.setPage( p2 );
             m_engine.getManager( PageManager.class ).saveText( context, "test" + i );
         }
 
         final Page p3 = m_engine.getManager( PageManager.class ).getPage( NAME1, -1 );
-        Assertions.assertNull( p3.getAttribute( WikiPage.CHANGENOTE ) );
+        Assertions.assertNull( p3.getAttribute( Page.CHANGENOTE ) );
     }
 
     @Test
diff --git a/jspwiki-main/src/test/java/org/apache/wiki/attachment/AttachmentManagerTest.java b/jspwiki-main/src/test/java/org/apache/wiki/attachment/AttachmentManagerTest.java
index 2fb931f..3a46512 100644
--- a/jspwiki-main/src/test/java/org/apache/wiki/attachment/AttachmentManagerTest.java
+++ b/jspwiki-main/src/test/java/org/apache/wiki/attachment/AttachmentManagerTest.java
@@ -16,10 +16,10 @@
 import net.sf.ehcache.CacheManager;
 import org.apache.wiki.TestEngine;
 import org.apache.wiki.WikiContext;
-import org.apache.wiki.WikiPage;
 import org.apache.wiki.api.core.Attachment;
 import org.apache.wiki.api.exceptions.ProviderException;
 import org.apache.wiki.api.exceptions.WikiException;
+import org.apache.wiki.api.spi.Wiki;
 import org.apache.wiki.pages.PageManager;
 import org.apache.wiki.util.FileUtil;
 import org.junit.jupiter.api.AfterEach;
@@ -89,13 +89,13 @@
     public void testSimpleStore()
         throws Exception
     {
-        final Attachment att = new org.apache.wiki.attachment.Attachment( m_engine, NAME1, "test1.txt" );
+        final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "test1.txt" );
 
         att.setAuthor( "FirstPost" );
 
         m_manager.storeAttachment( att, makeAttachmentFile() );
 
-        final Attachment att2 = m_manager.getAttachmentInfo( new WikiContext(m_engine, new WikiPage(m_engine, NAME1)), "test1.txt" );
+        final Attachment att2 = m_manager.getAttachmentInfo( new WikiContext(m_engine, Wiki.contents().page(m_engine, NAME1)), "test1.txt" );
 
         Assertions.assertNotNull( att2, "attachment disappeared" );
         Assertions.assertEquals( att.getName(), att2.getName(), "name" );
@@ -119,15 +119,13 @@
     public void testSimpleStoreSpace()
         throws Exception
     {
-        final Attachment att = new org.apache.wiki.attachment.Attachment( m_engine, NAME1, "test file.txt" );
+        final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "test file.txt" );
 
         att.setAuthor( "FirstPost" );
 
         m_manager.storeAttachment( att, makeAttachmentFile() );
 
-        final Attachment att2 = m_manager.getAttachmentInfo( new WikiContext(m_engine,
-                                                                       new WikiPage(m_engine, NAME1)),
-                                                       "test file.txt" );
+        final Attachment att2 = m_manager.getAttachmentInfo( new WikiContext(m_engine, Wiki.contents().page(m_engine, NAME1)),"test file.txt" );
 
         Assertions.assertNotNull( att2, "attachment disappeared" );
         Assertions.assertEquals( att.getName(), att2.getName(), "name" );
@@ -151,13 +149,13 @@
     public void testSimpleStoreByVersion()
         throws Exception
     {
-        final Attachment att = new org.apache.wiki.attachment.Attachment( m_engine, NAME1, "test1.txt" );
+        final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "test1.txt" );
 
         att.setAuthor( "FirstPost" );
 
         m_manager.storeAttachment( att, makeAttachmentFile() );
 
-        final Attachment att2 = m_manager.getAttachmentInfo( new WikiContext(m_engine, new WikiPage(m_engine, NAME1)), "test1.txt", 1 );
+        final Attachment att2 = m_manager.getAttachmentInfo( new WikiContext(m_engine, Wiki.contents().page(m_engine, NAME1)), "test1.txt", 1 );
 
         Assertions.assertNotNull( att2, "attachment disappeared" );
         Assertions.assertEquals( 1, att2.getVersion(), "version" );
@@ -182,7 +180,7 @@
     public void testMultipleStore()
         throws Exception
     {
-        final Attachment att = new org.apache.wiki.attachment.Attachment( m_engine, NAME1, "test1.txt" );
+        final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "test1.txt" );
 
         att.setAuthor( "FirstPost" );
 
@@ -191,7 +189,7 @@
         att.setAuthor( "FooBar" );
         m_manager.storeAttachment( att, makeAttachmentFile() );
 
-        final Attachment att2 = m_manager.getAttachmentInfo( new WikiContext(m_engine, new WikiPage(m_engine, NAME1)), "test1.txt" );
+        final Attachment att2 = m_manager.getAttachmentInfo( new WikiContext(m_engine, Wiki.contents().page(m_engine, NAME1)), "test1.txt" );
 
         Assertions.assertNotNull( att2, "attachment disappeared" );
         Assertions.assertEquals( att.getName(), att2.getName(), "name" );
@@ -215,7 +213,7 @@
         // Check that first author did not disappear
         //
 
-        final Attachment att3 = m_manager.getAttachmentInfo( new WikiContext(m_engine, new WikiPage(m_engine, NAME1)), "test1.txt", 1 );
+        final Attachment att3 = m_manager.getAttachmentInfo( new WikiContext(m_engine, Wiki.contents().page(m_engine, NAME1)), "test1.txt", 1 );
         Assertions.assertEquals( 1, att3.getVersion(), "version of v1" );
         Assertions.assertEquals( "FirstPost", att3.getAuthor(), "name of v1" );
     }
@@ -224,13 +222,13 @@
     public void testListAttachments()
         throws Exception
     {
-        final Attachment att = new org.apache.wiki.attachment.Attachment( m_engine, NAME1, "test1.txt" );
+        final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "test1.txt" );
 
         att.setAuthor( "FirstPost" );
 
         m_manager.storeAttachment( att, makeAttachmentFile() );
 
-        final List< Attachment > c = m_manager.listAttachments( new WikiPage(m_engine, NAME1) );
+        final List< Attachment > c = m_manager.listAttachments( Wiki.contents().page(m_engine, NAME1) );
 
         Assertions.assertEquals( 1, c.size(), "Length" );
 
@@ -243,14 +241,14 @@
     @Test
     public void testSimpleStoreWithoutExt() throws Exception
     {
-        final Attachment att = new org.apache.wiki.attachment.Attachment( m_engine, NAME1, "test1" );
+        final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "test1" );
 
         att.setAuthor( "FirstPost" );
 
         m_manager.storeAttachment( att, makeAttachmentFile() );
 
         final Attachment att2 = m_manager.getAttachmentInfo( new WikiContext(m_engine,
-                                                                       new WikiPage(m_engine, NAME1)),
+                                                                       Wiki.contents().page(m_engine, NAME1)),
                                                        "test1" );
 
         Assertions.assertNotNull( att2, "attachment disappeared" );
@@ -276,7 +274,7 @@
     @Test
     public void testExists() throws Exception
     {
-        final Attachment att = new org.apache.wiki.attachment.Attachment( m_engine, NAME1, "test1" );
+        final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "test1" );
 
         att.setAuthor( "FirstPost" );
 
@@ -288,7 +286,7 @@
     @Test
     public void testExists2() throws Exception
     {
-        final Attachment att = new org.apache.wiki.attachment.Attachment( m_engine, NAME1, "test1.bin" );
+        final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "test1.bin" );
 
         att.setAuthor( "FirstPost" );
 
@@ -300,7 +298,7 @@
     @Test
     public void testExistsSpace() throws Exception
     {
-        final Attachment att = new org.apache.wiki.attachment.Attachment( m_engine, NAME1, "test file.bin" );
+        final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "test file.bin" );
 
         att.setAuthor( "FirstPost" );
 
@@ -312,7 +310,7 @@
     @Test
     public void testExistsUTF1() throws Exception
     {
-        final Attachment att = new org.apache.wiki.attachment.Attachment( m_engine, NAME1, "test\u00e4.bin" );
+        final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "test\u00e4.bin" );
 
         att.setAuthor( "FirstPost" );
 
@@ -324,7 +322,7 @@
     @Test
     public void testExistsUTF2() throws Exception
     {
-        final Attachment att = new org.apache.wiki.attachment.Attachment( m_engine, NAMEU, "test\u00e4.bin" );
+        final Attachment att = Wiki.contents().attachment( m_engine, NAMEU, "test\u00e4.bin" );
 
         att.setAuthor( "FirstPost" );
 
@@ -340,7 +338,7 @@
         {
             m_engine.saveText( "TestPage", "xx" );
 
-            final Attachment att = new org.apache.wiki.attachment.Attachment( m_engine, "TestPages", "foo.bin" );
+            final Attachment att = Wiki.contents().attachment( m_engine, "TestPages", "foo.bin" );
 
             att.setAuthor("MonicaBellucci");
             m_manager.storeAttachment( att, makeAttachmentFile() );
diff --git a/jspwiki-main/src/test/java/org/apache/wiki/diff/ContextualDiffProviderTest.java b/jspwiki-main/src/test/java/org/apache/wiki/diff/ContextualDiffProviderTest.java
index 3f24843..999b781 100644
--- a/jspwiki-main/src/test/java/org/apache/wiki/diff/ContextualDiffProviderTest.java
+++ b/jspwiki-main/src/test/java/org/apache/wiki/diff/ContextualDiffProviderTest.java
@@ -18,9 +18,7 @@
  */
 package org.apache.wiki.diff;
 
-import org.apache.log4j.PropertyConfigurator;
 import org.apache.wiki.TestEngine;
-import org.apache.wiki.WikiPage;
 import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.exceptions.WikiException;
 import org.apache.wiki.api.spi.Wiki;
@@ -30,8 +28,9 @@
 import java.io.IOException;
 import java.util.Properties;
 
-public class ContextualDiffProviderTest
-{
+
+public class ContextualDiffProviderTest {
+
     /**
      * Sets up some shorthand notation for writing test cases.
      * <p>
@@ -39,8 +38,7 @@
      * <p>
      * Get it?
      */
-    private void specializedNotation( final ContextualDiffProvider diff)
-    {
+    private void specializedNotation( final ContextualDiffProvider diff ) {
         diff.CHANGE_END_HTML = "|";
         diff.CHANGE_START_HTML = "|";
 
@@ -62,111 +60,93 @@
         diff.ALTERNATING_SPACE_HTML = "_";
     }
 
-
-
     @Test
-    public void testNoChanges() throws IOException, WikiException
-    {
-        diffTest(null, "", "", "");
-        diffTest(null, "A", "A", "A");
-        diffTest(null, "A B", "A B", "A B");
+    public void testNoChanges() throws IOException, WikiException {
+        diffTest( null, "", "", "" );
+        diffTest( null, "A", "A", "A" );
+        diffTest( null, "A B", "A B", "A B" );
 
-        diffTest(null, "      ", "      ", " _ _ _");
-        diffTest(null, "A B  C", "A B  C", "A B _C");
-        diffTest(null, "A B   C", "A B   C", "A B _ C");
+        diffTest( null, "      ", "      ", " _ _ _" );
+        diffTest( null, "A B  C", "A B  C", "A B _C" );
+        diffTest( null, "A B   C", "A B   C", "A B _ C" );
     }
 
-
-
     @Test
-    public void testSimpleInsertions() throws IOException, WikiException
-    {
+    public void testSimpleInsertions() throws IOException, WikiException {
         // Ah, the white space trailing an insertion is tacked onto the insertion, this is fair, the
         // alternative would be to greedily take the leading whitespace before the insertion as part
         // of it instead, and that doesn't make any more or less sense. just remember this behaviour
         // when writing tests.
 
         // Simple inserts...
-        diffTest(null, "A C", "A B C", "A |^B ^|C");
-        diffTest(null, "A D", "A B C D", "A |^B C ^|D");
+        diffTest( null, "A C", "A B C", "A |^B ^|C" );
+        diffTest( null, "A D", "A B C D", "A |^B C ^|D" );
 
         // Simple inserts with spaces...
-        diffTest(null, "A C", "A B  C", "A |^B _^|C");
-        diffTest(null, "A C", "A B   C", "A |^B _ ^|C");
-        diffTest(null, "A C", "A B    C", "A |^B _ _^|C");
+        diffTest( null, "A C", "A B  C", "A |^B _^|C" );
+        diffTest( null, "A C", "A B   C", "A |^B _ ^|C" );
+        diffTest( null, "A C", "A B    C", "A |^B _ _^|C" );
 
         // Just inserted spaces...
-        diffTest(null, "A B", "A  B", "A |^_^|B");
-        diffTest(null, "A B", "A   B", "A |^_ ^|B");
-        diffTest(null, "A B", "A    B", "A |^_ _^|B");
-        diffTest(null, "A B", "A     B", "A |^_ _ ^|B");
+        diffTest( null, "A B", "A  B", "A |^_^|B" );
+        diffTest( null, "A B", "A   B", "A |^_ ^|B" );
+        diffTest( null, "A B", "A    B", "A |^_ _^|B" );
+        diffTest( null, "A B", "A     B", "A |^_ _ ^|B" );
     }
 
-
-
     @Test
-    public void testSimpleDeletions() throws IOException, WikiException
-    {
+    public void testSimpleDeletions() throws IOException, WikiException {
         // Simple deletes...
-        diffTest(null, "A B C", "A C", "A |-B -|C");
-        diffTest(null, "A B C D", "A D", "A |-B C -|D");
+        diffTest( null, "A B C", "A C", "A |-B -|C" );
+        diffTest( null, "A B C D", "A D", "A |-B C -|D" );
 
         // Simple deletes with spaces...
-        diffTest(null, "A B  C", "A C", "A |-B _-|C");
-        diffTest(null, "A B   C", "A C", "A |-B _ -|C");
+        diffTest( null, "A B  C", "A C", "A |-B _-|C" );
+        diffTest( null, "A B   C", "A C", "A |-B _ -|C" );
 
         // Just deleted spaces...
-        diffTest(null, "A  B", "A B", "A |-_-|B");
-        diffTest(null, "A   B", "A B", "A |-_ -|B");
-        diffTest(null, "A    B", "A B", "A |-_ _-|B");
+        diffTest( null, "A  B", "A B", "A |-_-|B" );
+        diffTest( null, "A   B", "A B", "A |-_ -|B" );
+        diffTest( null, "A    B", "A B", "A |-_ _-|B" );
     }
 
-
-
     @Test
-    public void testContextLimits() throws IOException, WikiException
-    {
+    public void testContextLimits() throws IOException, WikiException {
         // No change
-        diffTest("1", "A B C D E F G H I", "A B C D E F G H I", "A...");
+        diffTest( "1", "A B C D E F G H I", "A B C D E F G H I", "A..." );
         //TODO Hmm, should the diff provider instead return the string, "No Changes"?
 
         // Bad property value, should default to huge context limit and return entire string.
-        diffTest("foobar", "A B C D E F G H I", "A B C D F G H I", "A B C D |-E -|F G H I");
+        diffTest( "foobar", "A B C D E F G H I", "A B C D F G H I", "A B C D |-E -|F G H I" );
 
         // One simple deletion, limit context to 2...
-        diffTest("2", "A B C D E F G H I", "A B C D F G H I", "...D |-E -|F ...");
+        diffTest( "2", "A B C D E F G H I", "A B C D F G H I", "...D |-E -|F ..." );
 
         // Deletion of first element, limit context to 2...
-        diffTest("2", "A B C D E", "B C D E", "|-A -|B ...");
+        diffTest( "2", "A B C D E", "B C D E", "|-A -|B ..." );
 
         // Deletion of last element, limit context to 2...
-        diffTest("2", "A B C D E", "A B C D ", "...D |-E-|");
+        diffTest( "2", "A B C D E", "A B C D ", "...D |-E-|" );
 
         // Two simple deletions, limit context to 2...
-        diffTest("2", "A B C D E F G H I J K L M N O P", "A B C E F G H I J K M N O P",
-            "...C |-D -|E ......K |-L -|M ...");
-
+        diffTest( "2", "A B C D E F G H I J K L M N O P", "A B C E F G H I J K M N O P", "...C |-D -|E ......K |-L -|M ..." );
     }
 
     @Test
-    public void testMultiples() throws IOException, WikiException
-    {
-        diffTest(null, "A F", "A B C D E F", "A |^B C D E ^|F");
-        diffTest(null, "A B C D E F", "A F", "A |-B C D E -|F");
-
+    public void testMultiples() throws IOException, WikiException {
+        diffTest( null, "A F", "A B C D E F", "A |^B C D E ^|F" );
+        diffTest( null, "A B C D E F", "A F", "A |-B C D E -|F" );
     }
 
     @Test
-    public void testSimpleChanges() throws IOException, WikiException
-    {
+    public void testSimpleChanges() throws IOException, WikiException {
         // *changes* are actually an insert and a delete in the output...
 
         //single change
-        diffTest(null, "A B C", "A b C", "A |^b^-B-| C");
+        diffTest( null, "A B C", "A b C", "A |^b^-B-| C" );
 
         //non-consequtive changes...
-        diffTest(null, "A B C D E", "A b C d E", "A |^b^-B-| C |^d^-D-| E");
-
+        diffTest( null, "A B C D E", "A b C d E", "A |^b^-B-| C |^d^-D-| E" );
     }
 
     // FIXME: This test Assertions.fails; must be enabled again asap.
@@ -191,26 +171,24 @@
     }
      */
 
-    private void diffTest( final String contextLimit, final String oldText, final String newText, final String expectedDiff)
-        throws IOException, WikiException
-    {
+    private void diffTest( final String contextLimit, final String oldText, final String newText, final String expectedDiff )
+            throws IOException, WikiException {
         final ContextualDiffProvider diff = new ContextualDiffProvider();
 
-        specializedNotation(diff);
+        specializedNotation( diff );
 
         final Properties props = TestEngine.getTestProperties();
-        if (null != contextLimit)
-            props.put(ContextualDiffProvider.PROP_UNCHANGED_CONTEXT_LIMIT, contextLimit);
+        if( null != contextLimit ) {
+            props.put( ContextualDiffProvider.PROP_UNCHANGED_CONTEXT_LIMIT, contextLimit );
+        }
 
-        diff.initialize(null, props);
+        diff.initialize( null, props );
 
-        PropertyConfigurator.configure(props);
-        final TestEngine engine = new TestEngine(props);
+        final TestEngine engine = new TestEngine( props );
+        final Context ctx = Wiki.context().create( engine, Wiki.contents().page( engine, "Dummy" ) );
+        final String actualDiff = diff.makeDiffHtml( ctx, oldText, newText );
 
-        final Context ctx = Wiki.context().create( engine, new WikiPage(engine,"Dummy") );
-        final String actualDiff = diff.makeDiffHtml( ctx, oldText, newText);
-
-        Assertions.assertEquals(expectedDiff, actualDiff);
+        Assertions.assertEquals( expectedDiff, actualDiff );
     }
 
 }
diff --git a/jspwiki-main/src/test/java/org/apache/wiki/pages/DefaultPageManagerTest.java b/jspwiki-main/src/test/java/org/apache/wiki/pages/DefaultPageManagerTest.java
index 593d75b..12dcc55 100644
--- a/jspwiki-main/src/test/java/org/apache/wiki/pages/DefaultPageManagerTest.java
+++ b/jspwiki-main/src/test/java/org/apache/wiki/pages/DefaultPageManagerTest.java
@@ -22,11 +22,11 @@
 import net.sf.ehcache.CacheManager;
 import org.apache.wiki.TestEngine;
 import org.apache.wiki.WikiEngine;
-import org.apache.wiki.WikiPage;
 import org.apache.wiki.api.core.Attachment;
 import org.apache.wiki.api.core.Page;
 import org.apache.wiki.api.providers.AttachmentProvider;
 import org.apache.wiki.api.providers.WikiProvider;
+import org.apache.wiki.api.spi.Wiki;
 import org.apache.wiki.attachment.AttachmentManager;
 import org.apache.wiki.providers.CachingProvider;
 import org.apache.wiki.providers.FileSystemProvider;
@@ -74,7 +74,7 @@
      */
     @Test
     public void testNonExistentPage2() throws Exception {
-        final WikiPage page = new WikiPage( engine, NAME1 );
+        final Page page = Wiki.contents().page( engine, NAME1 );
         Assertions.assertFalse( engine.getManager( PageManager.class ).wikiPageExists( page ), "Page already exists" );
     }
 
@@ -109,7 +109,7 @@
     @Test
     public void testDeletePageAndAttachments() throws Exception {
         engine.saveText( NAME1, "Test" );
-        final Attachment att = new org.apache.wiki.attachment.Attachment( engine, NAME1, "TestAtt.txt" );
+        final Attachment att = Wiki.contents().attachment( engine, NAME1, "TestAtt.txt" );
         att.setAuthor( "FirstPost" );
         engine.getManager( AttachmentManager.class ).storeAttachment( att, engine.makeAttachmentFile() );
 
@@ -133,7 +133,7 @@
     @Test
     public void testDeletePageAndAttachments2() throws Exception {
         engine.saveText( NAME1, "Test" );
-        Attachment att = new org.apache.wiki.attachment.Attachment( engine, NAME1, "TestAtt.txt" );
+        Attachment att = Wiki.contents().attachment( engine, NAME1, "TestAtt.txt" );
         att.setAuthor( "FirstPost" );
         engine.getManager( AttachmentManager.class ).storeAttachment( att, engine.makeAttachmentFile() );
 
diff --git a/jspwiki-main/src/test/java/org/apache/wiki/pages/PageLockTest.java b/jspwiki-main/src/test/java/org/apache/wiki/pages/PageLockTest.java
index c4e9d5b..9d5138a 100644
--- a/jspwiki-main/src/test/java/org/apache/wiki/pages/PageLockTest.java
+++ b/jspwiki-main/src/test/java/org/apache/wiki/pages/PageLockTest.java
@@ -1,21 +1,22 @@
 package org.apache.wiki.pages;
 
-import java.util.Date;
-
 import org.apache.wiki.TestEngine;
-import org.apache.wiki.WikiPage;
+import org.apache.wiki.api.core.Page;
+import org.apache.wiki.api.spi.Wiki;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
+import java.util.Date;
+
 
 public class PageLockTest {
     
     @Test
     public void testPageLockIsExpired() throws Exception {
-        TestEngine engine = new TestEngine( TestEngine.getTestProperties() );
-        WikiPage page = new WikiPage( engine, "test" );
-        PageLock lock1 = new PageLock( page, "user", new Date( System.currentTimeMillis() - 10000 ), new Date( System.currentTimeMillis() - 5000 ) );
-        PageLock lock2 = new PageLock( page, "user", new Date( System.currentTimeMillis() - 10000 ), new Date( System.currentTimeMillis() + 5000 ) );
+        final TestEngine engine = new TestEngine( TestEngine.getTestProperties() );
+        final Page page = Wiki.contents().page( engine, "test" );
+        final PageLock lock1 = new PageLock( page, "user", new Date( System.currentTimeMillis() - 10000 ), new Date( System.currentTimeMillis() - 5000 ) );
+        final PageLock lock2 = new PageLock( page, "user", new Date( System.currentTimeMillis() - 10000 ), new Date( System.currentTimeMillis() + 5000 ) );
         Assertions.assertTrue( lock1.isExpired() );
         Assertions.assertFalse( lock2.isExpired() );
     }
diff --git a/jspwiki-main/src/test/java/org/apache/wiki/pages/PageTimeComparatorTest.java b/jspwiki-main/src/test/java/org/apache/wiki/pages/PageTimeComparatorTest.java
index 101b7a4..cc7156f 100644
--- a/jspwiki-main/src/test/java/org/apache/wiki/pages/PageTimeComparatorTest.java
+++ b/jspwiki-main/src/test/java/org/apache/wiki/pages/PageTimeComparatorTest.java
@@ -19,7 +19,8 @@
 package org.apache.wiki.pages;
 
 import org.apache.wiki.TestEngine;
-import org.apache.wiki.WikiPage;
+import org.apache.wiki.api.core.Page;
+import org.apache.wiki.api.spi.Wiki;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
@@ -33,9 +34,9 @@
 
     TestEngine engine = TestEngine.build();
     PageTimeComparator comparator = new PageTimeComparator();
-    WikiPage p1 = new WikiPage( engine, "A" );
-    WikiPage p2 = new WikiPage( engine, "B" );
-    WikiPage p3 = new WikiPage( engine, "A" );
+    Page p1 = Wiki.contents().page( engine, "A" );
+    Page p2 = Wiki.contents().page( engine, "B" );
+    Page p3 = Wiki.contents().page( engine, "A" );
 
     @Test
     void shouldCheckCompareByTimeGetsMoreRecentOnTop() {
diff --git a/jspwiki-main/src/test/java/org/apache/wiki/parser/JSPWikiMarkupParserTest.java b/jspwiki-main/src/test/java/org/apache/wiki/parser/JSPWikiMarkupParserTest.java
index 7c85001..fd0ddb6 100644
--- a/jspwiki-main/src/test/java/org/apache/wiki/parser/JSPWikiMarkupParserTest.java
+++ b/jspwiki-main/src/test/java/org/apache/wiki/parser/JSPWikiMarkupParserTest.java
@@ -23,11 +23,13 @@
 import org.apache.wiki.TestEngine;
 import org.apache.wiki.WikiContext;
 import org.apache.wiki.WikiEngine;
-import org.apache.wiki.WikiPage;
+import org.apache.wiki.api.core.Attachment;
+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.WikiException;
 import org.apache.wiki.api.providers.AttachmentProvider;
-import org.apache.wiki.attachment.Attachment;
+import org.apache.wiki.api.spi.Wiki;
 import org.apache.wiki.attachment.AttachmentManager;
 import org.apache.wiki.providers.BasicAttachmentProvider;
 import org.apache.wiki.render.RenderingManager;
@@ -100,7 +102,7 @@
             NoRequiredPropertyException,
             ServletException
     {
-        return translate( new WikiPage(testEngine, PAGE_NAME), src );
+        return translate( Wiki.contents().page(testEngine, PAGE_NAME), src );
     }
 
     private String translate( final WikiEngine e, final String src )
@@ -108,11 +110,11 @@
                NoRequiredPropertyException,
                ServletException
     {
-        return translate( e, new WikiPage(testEngine, PAGE_NAME), src );
+        return translate( e, Wiki.contents().page(testEngine, PAGE_NAME), src );
     }
 
 
-    private String translate( final WikiPage p, final String src )
+    private String translate( final Page p, final String src )
         throws IOException,
                NoRequiredPropertyException,
                ServletException
@@ -120,7 +122,7 @@
         return translate( testEngine, p, src );
     }
 
-    private String translate( final WikiEngine e, final WikiPage p, final String src )
+    private String translate( final Engine e, final Page p, final String src )
         throws IOException,
                NoRequiredPropertyException,
                ServletException
@@ -146,7 +148,7 @@
         final TestEngine testEngine2 = new TestEngine( props );
 
         final WikiContext context = new WikiContext( testEngine2,
-                                               new WikiPage(testEngine2, PAGE_NAME) );
+                                               Wiki.contents().page(testEngine2, PAGE_NAME) );
         final JSPWikiMarkupParser r = new JSPWikiMarkupParser( context,
                                                          new BufferedReader( new StringReader(src)) );
 
@@ -734,7 +736,7 @@
     {
         newPage("Test");
 
-        final Attachment att = new Attachment( testEngine, "Test", "TestAtt.txt" );
+        final Attachment att = Wiki.contents().attachment( testEngine, "Test", "TestAtt.txt" );
         att.setAuthor( "FirstPost" );
         testEngine.getManager( AttachmentManager.class ).storeAttachment( att, testEngine.makeAttachmentFile() );
 
@@ -757,10 +759,10 @@
         testEngine2.saveText( "Test", "foo ");
         created.addElement( "Test" );
 
-        final Attachment att = new Attachment( testEngine2, "Test", "TestAtt.txt" );
+        final Attachment att = Wiki.contents().attachment( testEngine2, "Test", "TestAtt.txt" );
         att.setAuthor( "FirstPost" );
 
-        testEngine2.getAttachmentManager().storeAttachment( att, testEngine.makeAttachmentFile() );
+        testEngine2.getManager( AttachmentManager.class ).storeAttachment( att, testEngine.makeAttachmentFile() );
 
         final String src = "This should be an [attachment link|Test/TestAtt.txt]";
 
@@ -781,10 +783,10 @@
         testEngine2.saveText( "TestPage", "foo ");
         created.addElement( "TestPage" );
 
-        final Attachment att = new Attachment( testEngine2, "TestPage", "TestAtt.txt" );
+        final Attachment att = Wiki.contents().attachment( testEngine2, "TestPage", "TestAtt.txt" );
         att.setAuthor( "FirstPost" );
 
-        testEngine2.getAttachmentManager().storeAttachment( att, testEngine.makeAttachmentFile() );
+        testEngine2.getManager( AttachmentManager.class ).storeAttachment( att, testEngine.makeAttachmentFile() );
 
         final String src = "[Test page/TestAtt.txt]";
 
@@ -802,10 +804,10 @@
         testEngine2.saveText( "TestPage", "foo ");
         created.addElement( "TestPage" );
 
-        final Attachment att = new Attachment( testEngine2, "TestPage", "TestAtt.txt" );
+        final Attachment att = Wiki.contents().attachment( testEngine2, "TestPage", "TestAtt.txt" );
         att.setAuthor( "FirstPost" );
 
-        testEngine2.getAttachmentManager().storeAttachment( att, testEngine.makeAttachmentFile() );
+        testEngine2.getManager( AttachmentManager.class ).storeAttachment( att, testEngine.makeAttachmentFile() );
 
         final String src = "["+testEngine2.getManager( RenderingManager.class ).beautifyTitle("TestPage/TestAtt.txt")+"]";
 
@@ -1311,7 +1313,7 @@
         props.setProperty( "jspwiki.translatorReader.allowHTML", "true" );
         testEngine = new TestEngine( props );
 
-        final WikiPage page = new WikiPage(testEngine,PAGE_NAME);
+        final Page page = Wiki.contents().page(testEngine,PAGE_NAME);
 
         final String out = translate( testEngine, page, src );
 
@@ -1327,7 +1329,7 @@
         props.setProperty( "jspwiki.translatorReader.allowHTML", "true" );
         testEngine = new TestEngine( props );
 
-        final WikiPage page = new WikiPage(testEngine,PAGE_NAME);
+        final Page page = Wiki.contents().page(testEngine,PAGE_NAME);
 
         final String out = translate( testEngine, page, src );
 
@@ -2376,7 +2378,7 @@
      {
      String src = "Foobar.[{ALLOW view JanneJalkanen}]";
 
-     WikiPage p = new WikiPage( PAGE_NAME );
+     WikiPage p = Wiki.contents().page( PAGE_NAME );
 
      String res = translate( p, src );
 
@@ -2397,7 +2399,7 @@
      String src = "Foobar.[{ALLOW view JanneJalkanen}]\n"+
      "[{ALLOW edit JanneJalkanen, SuloVilen}]";
 
-     WikiPage p = new WikiPage( PAGE_NAME );
+     WikiPage p = Wiki.contents().page( PAGE_NAME );
 
      String res = translate( p, src );
 
@@ -2444,7 +2446,7 @@
     {
         final String src = "Foobar.[{SET name=foo}]";
 
-        final WikiPage p = new WikiPage( testEngine, PAGE_NAME );
+        final Page p = Wiki.contents().page( testEngine, PAGE_NAME );
 
         final String res = translate( p, src );
 
@@ -2459,7 +2461,7 @@
     {
         final String src = "Foobar.[{SET name = foo}]";
 
-        final WikiPage p = new WikiPage( testEngine, PAGE_NAME );
+        final Page p = Wiki.contents().page( testEngine, PAGE_NAME );
 
         final String res = translate( p, src );
 
@@ -2474,7 +2476,7 @@
     {
         final String src = "Foobar.[{SET name= Janne Jalkanen}]";
 
-        final WikiPage p = new WikiPage( testEngine, PAGE_NAME );
+        final Page p = Wiki.contents().page( testEngine, PAGE_NAME );
 
         final String res = translate( p, src );
 
@@ -2489,7 +2491,7 @@
     {
         final String src = "Foobar.[{SET name='Janne Jalkanen'}][{SET too='{$name}'}]";
 
-        final WikiPage p = new WikiPage( testEngine, PAGE_NAME );
+        final Page p = Wiki.contents().page( testEngine, PAGE_NAME );
 
         final String res = translate( p, src );
 
@@ -2505,7 +2507,7 @@
     {
         final String src = "Foobar.[{SET name='<b>danger</b>'}] [{$name}]";
 
-        final WikiPage p = new WikiPage( testEngine, PAGE_NAME );
+        final Page p = Wiki.contents().page( testEngine, PAGE_NAME );
 
         final String res = translate( p, src );
 
@@ -2526,7 +2528,7 @@
         final LinkCollector coll = new LinkCollector();
         final String src = "[Test]";
         final WikiContext context = new WikiContext( testEngine,
-                                               new WikiPage(testEngine,PAGE_NAME) );
+                                               Wiki.contents().page(testEngine,PAGE_NAME) );
 
         final MarkupParser p = new JSPWikiMarkupParser( context,
                                                   new BufferedReader( new StringReader(src)) );
@@ -2550,7 +2552,7 @@
         final String src = "["+PAGE_NAME+"/Test.txt]";
 
         final WikiContext context = new WikiContext( testEngine,
-                                               new WikiPage(testEngine,PAGE_NAME) );
+                                               Wiki.contents().page(testEngine,PAGE_NAME) );
 
         final MarkupParser p = new JSPWikiMarkupParser( context,
                                                   new BufferedReader( new StringReader(src)) );
@@ -2575,7 +2577,7 @@
         try
         {
             testEngine.saveText( PAGE_NAME, "content" );
-            final Attachment att = new Attachment( testEngine, PAGE_NAME, "TestAtt.txt" );
+            final Attachment att = Wiki.contents().attachment( testEngine, PAGE_NAME, "TestAtt.txt" );
             att.setAuthor( "FirstPost" );
             testEngine.getManager( AttachmentManager.class ).storeAttachment( att, testEngine.makeAttachmentFile() );
 
@@ -2584,7 +2586,7 @@
 
             final String src = "[TestAtt.txt]";
             final WikiContext context = new WikiContext( testEngine,
-                                                   new WikiPage(testEngine,PAGE_NAME) );
+                                                   Wiki.contents().page(testEngine,PAGE_NAME) );
 
             final MarkupParser p = new JSPWikiMarkupParser( context,
                                                       new BufferedReader( new StringReader(src)) );
diff --git a/jspwiki-main/src/test/java/org/apache/wiki/plugin/CounterPluginTest.java b/jspwiki-main/src/test/java/org/apache/wiki/plugin/CounterPluginTest.java
index 5e6a249..94d5a75 100644
--- a/jspwiki-main/src/test/java/org/apache/wiki/plugin/CounterPluginTest.java
+++ b/jspwiki-main/src/test/java/org/apache/wiki/plugin/CounterPluginTest.java
@@ -16,18 +16,12 @@
     specific language governing permissions and limitations
     under the License.
  */
-
 package org.apache.wiki.plugin;
-import java.io.IOException;
-import java.io.StringReader;
-import java.util.Properties;
-
-import javax.servlet.ServletException;
 
 import org.apache.wiki.TestEngine;
-import org.apache.wiki.WikiContext;
-import org.apache.wiki.WikiPage;
+import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.exceptions.NoRequiredPropertyException;
+import org.apache.wiki.api.spi.Wiki;
 import org.apache.wiki.parser.JSPWikiMarkupParser;
 import org.apache.wiki.parser.MarkupParser;
 import org.apache.wiki.parser.WikiDocument;
@@ -37,6 +31,11 @@
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
+import javax.servlet.ServletException;
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.Properties;
+
 public class CounterPluginTest
 {
     Properties props = TestEngine.getTestProperties();
@@ -49,19 +48,18 @@
         testEngine = new TestEngine(props);
     }
 
-    private String translate( String src )
+    private String translate( final String src )
         throws IOException,
                NoRequiredPropertyException,
                ServletException
     {
-        WikiContext context = new WikiContext( testEngine,
-                                               new WikiPage(testEngine, "TestPage") );
+        final Context context = Wiki.context().create( testEngine, Wiki.contents().page(testEngine, "TestPage") );
 
-        MarkupParser p = new JSPWikiMarkupParser( context, new StringReader(src) );
+        final MarkupParser p = new JSPWikiMarkupParser( context, new StringReader(src) );
 
-        WikiDocument dom = p.parse();
+        final WikiDocument dom = p.parse();
 
-        WikiRenderer r = new XHTMLRenderer( context, dom );
+        final WikiRenderer r = new XHTMLRenderer( context, dom );
 
         return r.getString();
     }
@@ -70,7 +68,7 @@
     public void testSimpleCount()
         throws Exception
     {
-        String src = "[{Counter}], [{Counter}]";
+        final String src = "[{Counter}], [{Counter}]";
 
         Assertions.assertEquals( "1, 2", translate(src) );
     }
@@ -79,7 +77,7 @@
     public void testSimpleVar()
         throws Exception
     {
-        String src = "[{Counter}], [{Counter}], [{$counter}]";
+        final String src = "[{Counter}], [{Counter}], [{$counter}]";
 
         Assertions.assertEquals( "1, 2, 2",
                       translate(src) );
@@ -89,7 +87,7 @@
     public void testTwinVar()
         throws Exception
     {
-        String src = "[{Counter}], [{Counter name=aa}], [{$counter-aa}]";
+        final String src = "[{Counter}], [{Counter name=aa}], [{$counter-aa}]";
 
         Assertions.assertEquals( "1, 1, 1",
                       translate(src) );
diff --git a/jspwiki-main/src/test/java/org/apache/wiki/plugin/DefaultPluginManagerTest.java b/jspwiki-main/src/test/java/org/apache/wiki/plugin/DefaultPluginManagerTest.java
index cbd97a0..015f686 100644
--- a/jspwiki-main/src/test/java/org/apache/wiki/plugin/DefaultPluginManagerTest.java
+++ b/jspwiki-main/src/test/java/org/apache/wiki/plugin/DefaultPluginManagerTest.java
@@ -22,8 +22,8 @@
 import org.apache.wiki.TestEngine;
 import org.apache.wiki.WikiContext;
 import org.apache.wiki.WikiEngine;
-import org.apache.wiki.WikiPage;
 import org.apache.wiki.api.exceptions.ProviderException;
+import org.apache.wiki.api.spi.Wiki;
 import org.apache.wiki.pages.PageManager;
 import org.apache.wiki.render.RenderingManager;
 import org.junit.jupiter.api.AfterEach;
@@ -43,7 +43,7 @@
 
     @BeforeEach
     public void setUp() throws Exception {
-        context = new WikiContext( engine, new WikiPage(engine, "Testpage") );
+        context = new WikiContext( engine, Wiki.contents().page(engine, "Testpage") );
     }
 
     @AfterEach
diff --git a/jspwiki-main/src/test/java/org/apache/wiki/plugin/RecentChangesPluginTest.java b/jspwiki-main/src/test/java/org/apache/wiki/plugin/RecentChangesPluginTest.java
index 43455b8..6a8506b 100644
--- a/jspwiki-main/src/test/java/org/apache/wiki/plugin/RecentChangesPluginTest.java
+++ b/jspwiki-main/src/test/java/org/apache/wiki/plugin/RecentChangesPluginTest.java
@@ -21,7 +21,6 @@
 
 import net.sf.ehcache.CacheManager;
 import org.apache.wiki.TestEngine;
-import org.apache.wiki.WikiPage;
 import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.spi.Wiki;
 import org.junit.jupiter.api.AfterEach;
@@ -64,7 +63,7 @@
      */
     @Test
     public void testSimple() throws Exception {
-        context = Wiki.context().create(testEngine, new WikiPage(testEngine, "TestPage01"));
+        context = Wiki.context().create(testEngine, Wiki.contents().page(testEngine, "TestPage01"));
 
         final String res = manager.execute(context, "{INSERT org.apache.wiki.plugin.RecentChangesPlugin}");
 
@@ -83,7 +82,7 @@
      */
     @Test
     public void testParmInClude() throws Exception {
-        context = Wiki.context().create(testEngine, new WikiPage(testEngine, "TestPage02"));
+        context = Wiki.context().create(testEngine, Wiki.contents().page(testEngine, "TestPage02"));
 
         final String res = manager.execute( context, "{INSERT org.apache.wiki.plugin.RecentChangesPlugin include='TestPage02*'}" );
 
@@ -100,7 +99,7 @@
      */
     @Test
     public void testParmExClude() throws Exception {
-        context = Wiki.context().create(testEngine, new WikiPage(testEngine, "TestPage03"));
+        context = Wiki.context().create(testEngine, Wiki.contents().page(testEngine, "TestPage03"));
 
         final String res = manager.execute( context,
                                       "{INSERT org.apache.wiki.plugin.RecentChangesPlugin exclude='TestPage03*'}" );
@@ -118,7 +117,7 @@
      */
     @Test
     public void testNoRecentChanges() throws Exception {
-        context = Wiki.context().create(testEngine, new WikiPage(testEngine, "TestPage04"));
+        context = Wiki.context().create(testEngine, Wiki.contents().page(testEngine, "TestPage04"));
 
         final String res = manager.execute( context, "{INSERT org.apache.wiki.plugin.RecentChangesPlugin since='-1'}" );
 
diff --git a/jspwiki-main/src/test/java/org/apache/wiki/plugin/ReferringPagesPluginTest.java b/jspwiki-main/src/test/java/org/apache/wiki/plugin/ReferringPagesPluginTest.java
index 34aa905..1512cbf 100644
--- a/jspwiki-main/src/test/java/org/apache/wiki/plugin/ReferringPagesPluginTest.java
+++ b/jspwiki-main/src/test/java/org/apache/wiki/plugin/ReferringPagesPluginTest.java
@@ -21,7 +21,6 @@
 
 import org.apache.wiki.TestEngine;
 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.spi.Wiki;
@@ -56,7 +55,7 @@
         engine.saveText( "Foobar6", "Reference to [TestPage]." );
         engine.saveText( "Foobar7", "Reference to [TestPage]." );
 
-        context = new WikiContext( engine, engine.newHttpRequest(), new WikiPage(engine,"TestPage") );
+        context = new WikiContext( engine, engine.newHttpRequest(), Wiki.contents().page( engine, "TestPage" ) );
         manager = new DefaultPluginManager( engine, props );
     }
 
@@ -84,7 +83,7 @@
 
     @Test
     public void testSingleReferral() throws Exception {
-        final Context context2 = Wiki.context().create( engine, new WikiPage(engine, "Foobar") );
+        final Context context2 = Wiki.context().create( engine, Wiki.contents().page(engine, "Foobar") );
 
         final String res = manager.execute( context2, "{INSERT org.apache.wiki.plugin.ReferringPagesPlugin WHERE max=5}");
 
@@ -121,7 +120,7 @@
 
     @Test
     public void testReferenceWidth() throws Exception {
-        final Context context2 = Wiki.context().create( engine, new WikiPage(engine, "Foobar") );
+        final Context context2 = Wiki.context().create( engine, Wiki.contents().page(engine, "Foobar") );
         final String res = manager.execute( context2, "{INSERT org.apache.wiki.plugin.ReferringPagesPlugin WHERE maxwidth=5}");
         Assertions.assertEquals( mkFullLink( "TestP...", "TestPage" )+"<br />", res );
     }
diff --git a/jspwiki-main/src/test/java/org/apache/wiki/plugin/ReferringUndefinedPagesPluginTest.java b/jspwiki-main/src/test/java/org/apache/wiki/plugin/ReferringUndefinedPagesPluginTest.java
index 988c80f..846fa0e 100644
--- a/jspwiki-main/src/test/java/org/apache/wiki/plugin/ReferringUndefinedPagesPluginTest.java
+++ b/jspwiki-main/src/test/java/org/apache/wiki/plugin/ReferringUndefinedPagesPluginTest.java
@@ -20,7 +20,6 @@
 
 import net.sf.ehcache.CacheManager;
 import org.apache.wiki.TestEngine;
-import org.apache.wiki.WikiPage;
 import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.spi.Wiki;
 import org.junit.jupiter.api.AfterEach;
@@ -50,7 +49,7 @@
         testEngine.saveText("TestPage02", "Some Text for testing 02 which refers [NonExistingPageB] ");
 		testEngine.saveText("TestPage03", "Some Text for testing 03 which refers [NonExistingPageC] ");
 
-        context = Wiki.context().create( testEngine, testEngine.newHttpRequest(), new WikiPage(testEngine,"TestPage") );
+        context = Wiki.context().create( testEngine, testEngine.newHttpRequest(), Wiki.contents().page(testEngine,"TestPage") );
         manager = new DefaultPluginManager( testEngine, props );
     }
 
diff --git a/jspwiki-main/src/test/java/org/apache/wiki/plugin/UndefinedPagesPluginTest.java b/jspwiki-main/src/test/java/org/apache/wiki/plugin/UndefinedPagesPluginTest.java
index dac7843..54a949e 100644
--- a/jspwiki-main/src/test/java/org/apache/wiki/plugin/UndefinedPagesPluginTest.java
+++ b/jspwiki-main/src/test/java/org/apache/wiki/plugin/UndefinedPagesPluginTest.java
@@ -21,7 +21,6 @@
 
 import net.sf.ehcache.CacheManager;
 import org.apache.wiki.TestEngine;
-import org.apache.wiki.WikiPage;
 import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.exceptions.PluginException;
 import org.apache.wiki.api.spi.Wiki;
@@ -49,7 +48,7 @@
         testEngine.saveText( "TestPage", "Reference to [Foobar]." );
         testEngine.saveText( "Foobar", "Reference to [Foobar 2], [Foobars]" );
 
-        context = Wiki.context().create( testEngine, new WikiPage(testEngine, "TestPage") );
+        context = Wiki.context().create( testEngine, Wiki.contents().page(testEngine, "TestPage") );
         manager = new DefaultPluginManager( testEngine, props );
     }
 
@@ -71,7 +70,7 @@
      */
     @Test
     public void testSimpleUndefined() throws Exception {
-        final Context context2 = Wiki.context().create( testEngine, new WikiPage( testEngine, "Foobar" ) );
+        final Context context2 = Wiki.context().create( testEngine, Wiki.contents().page( testEngine, "Foobar" ) );
         final String res = manager.execute( context2,"{INSERT org.apache.wiki.plugin.UndefinedPagesPlugin" );
         final String exp = "[Foobar 2]\\\\";
 
diff --git a/jspwiki-main/src/test/java/org/apache/wiki/providers/BasicAttachmentProviderTest.java b/jspwiki-main/src/test/java/org/apache/wiki/providers/BasicAttachmentProviderTest.java
index 185fc08..82b89bf 100644
--- a/jspwiki-main/src/test/java/org/apache/wiki/providers/BasicAttachmentProviderTest.java
+++ b/jspwiki-main/src/test/java/org/apache/wiki/providers/BasicAttachmentProviderTest.java
@@ -16,12 +16,12 @@
     specific language governing permissions and limitations
     under the License.
  */
-
 package org.apache.wiki.providers;
 
 import org.apache.wiki.TestEngine;
 import org.apache.wiki.api.core.Attachment;
 import org.apache.wiki.api.exceptions.ProviderException;
+import org.apache.wiki.api.spi.Wiki;
 import org.apache.wiki.util.FileUtil;
 import org.awaitility.Awaitility;
 import org.awaitility.core.ConditionFactory;
@@ -121,7 +121,7 @@
     @Test
     public void testPutAttachmentUTF8() throws Exception {
         final File in = makeAttachmentFile();
-        final Attachment att = new org.apache.wiki.attachment.Attachment( m_engine, NAME1, "\u3072\u3048\u308b\u00e5\u00e4\u00f6test.f\u00fc\u00fc" );
+        final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "\u3072\u3048\u308b\u00e5\u00e4\u00f6test.f\u00fc\u00fc" );
 
         m_provider.putAttachmentData( att, new FileInputStream(in) );
         final List< Attachment > res = m_provider.listAllChanged( new Date(0L) );
@@ -132,7 +132,7 @@
 
     @Test
     public void testGetAttachmentDataRaisesProviderExceptionIfInexistentFileOnDisk() {
-        final Attachment att = new org.apache.wiki.attachment.Attachment( m_engine, NAME1, "test1.txt" );
+        final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "test1.txt" );
         Assertions.assertThrows( ProviderException.class, () -> m_provider.getAttachmentData( att ) );
     }
 
@@ -162,12 +162,12 @@
     @Test
     public void testListAll() throws Exception {
         final File in = makeAttachmentFile();
-        final Attachment att = new org.apache.wiki.attachment.Attachment( m_engine, NAME1, "test1.txt" );
+        final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "test1.txt" );
         m_provider.putAttachmentData( att, new FileInputStream(in) );
 
         awaitility().await( "testListAll" ).until( attachmentIsSaved( att ) );
 
-        final Attachment att2 = new org.apache.wiki.attachment.Attachment( m_engine, NAME2, "test2.txt" );
+        final Attachment att2 = Wiki.contents().attachment( m_engine, NAME2, "test2.txt" );
         m_provider.putAttachmentData( att2, new FileInputStream(in) );
 
         final List< Attachment > res = m_provider.listAllChanged( new Date(0L) );
@@ -191,12 +191,12 @@
         final File sDir = new File(m_engine.getWikiProperties().getProperty( BasicAttachmentProvider.PROP_STORAGEDIR ) );
         makeExtraFile( sDir, "foobar.blob" );
 
-        final Attachment att = new org.apache.wiki.attachment.Attachment( m_engine, NAME1, "test1.txt" );
+        final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "test1.txt" );
         m_provider.putAttachmentData( att, new FileInputStream(in) );
 
         awaitility().await( "testListAllExtrafile" ).until( attachmentIsSaved( att ) );
 
-        final Attachment att2 = new org.apache.wiki.attachment.Attachment( m_engine, NAME2, "test2.txt" );
+        final Attachment att2 = Wiki.contents().attachment( m_engine, NAME2, "test2.txt" );
         m_provider.putAttachmentData( att2, new FileInputStream(in) );
 
         final List< Attachment > res = m_provider.listAllChanged( new Date(0L) );
@@ -219,13 +219,13 @@
         final File sDir = new File( m_engine.getWikiProperties().getProperty( BasicAttachmentProvider.PROP_STORAGEDIR ) );
         final File attDir = new File( sDir, NAME1+"-att" );
 
-        final Attachment att = new org.apache.wiki.attachment.Attachment( m_engine, NAME1, "test1.txt" );
+        final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "test1.txt" );
         m_provider.putAttachmentData( att, new FileInputStream(in) );
         makeExtraFile( attDir, "ping.pong" );
 
         awaitility().await( "testListAllExtrafileInAttachmentDir" ).until( attachmentIsSaved( att ) );
 
-        final Attachment att2 = new org.apache.wiki.attachment.Attachment( m_engine, NAME2, "test2.txt" );
+        final Attachment att2 = Wiki.contents().attachment( m_engine, NAME2, "test2.txt" );
 
         m_provider.putAttachmentData( att2, new FileInputStream(in) );
 
@@ -248,7 +248,7 @@
         final File in = makeAttachmentFile();
         final File sDir = new File(m_engine.getWikiProperties().getProperty( BasicAttachmentProvider.PROP_STORAGEDIR ));
         final File attDir = new File( sDir, NAME1+"-att" );
-        final Attachment att = new org.apache.wiki.attachment.Attachment( m_engine, NAME1, "test1.txt" );
+        final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "test1.txt" );
         m_provider.putAttachmentData( att, new FileInputStream(in) );
 
         // This is our extraneous directory.
@@ -257,7 +257,7 @@
 
         awaitility().await( "testListAllExtradirInAttachmentDir" ).until( attachmentIsSaved( att ) );
 
-        final Attachment att2 = new org.apache.wiki.attachment.Attachment( m_engine, NAME2, "test2.txt" );
+        final Attachment att2 = Wiki.contents().attachment( m_engine, NAME2, "test2.txt" );
 
         m_provider.putAttachmentData( att2, new FileInputStream(in) );
 
@@ -275,12 +275,12 @@
     @Test
     public void testListAllNoExtension() throws Exception {
         final File in = makeAttachmentFile();
-        final Attachment att = new org.apache.wiki.attachment.Attachment( m_engine, NAME1, "test1." );
+        final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "test1." );
         m_provider.putAttachmentData( att, new FileInputStream(in) );
 
         awaitility().await( "testListAllNoExtension" ).until( attachmentIsSaved( att ) );
 
-        final Attachment att2 = new org.apache.wiki.attachment.Attachment( m_engine, NAME2, "test2." );
+        final Attachment att2 = Wiki.contents().attachment( m_engine, NAME2, "test2." );
         m_provider.putAttachmentData( att2, new FileInputStream(in) );
 
         final List< Attachment > res = m_provider.listAllChanged( new Date( 0L ) );
diff --git a/jspwiki-main/src/test/java/org/apache/wiki/providers/CounterProvider.java b/jspwiki-main/src/test/java/org/apache/wiki/providers/CounterProvider.java
index 624d7d1..0562cf6 100644
--- a/jspwiki-main/src/test/java/org/apache/wiki/providers/CounterProvider.java
+++ b/jspwiki-main/src/test/java/org/apache/wiki/providers/CounterProvider.java
@@ -18,13 +18,13 @@
  */
 package org.apache.wiki.providers;
 
-import org.apache.wiki.WikiPage;
 import org.apache.wiki.api.core.Engine;
 import org.apache.wiki.api.core.Page;
 import org.apache.wiki.api.exceptions.ProviderException;
 import org.apache.wiki.api.providers.PageProvider;
 import org.apache.wiki.api.search.QueryItem;
 import org.apache.wiki.api.search.SearchResult;
+import org.apache.wiki.api.spi.Wiki;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -45,26 +45,25 @@
     public int m_getAllPagesCalls = 0;
     public int m_initCalls        = 0;
 
-    WikiPage[]    m_pages         = new WikiPage[0];
+    Page[]    m_pages         = new Page[0];
     
     String m_defaultText = "[Foo], [Bar], [Blat], [Blah]";
 
 
     @Override
     public void initialize( final Engine engine, final Properties props ) {
-        m_pages = new WikiPage[]
-                  { new WikiPage(engine, "Foo"),
-                    new WikiPage(engine, "Bar"),
-                    new WikiPage(engine, "Blat"),
-                    new WikiPage(engine, "Blaa") };
+        m_pages = new Page[]
+                  { Wiki.contents().page( engine, "Foo" ),
+                    Wiki.contents().page( engine, "Bar" ),
+                    Wiki.contents().page( engine, "Blat" ),
+                    Wiki.contents().page( engine, "Blaa" ) };
         
         m_initCalls++;
-        
-        for( int i = 0; i < m_pages.length; i++ ) 
-        {
-            m_pages[i].setAuthor("Unknown");
-            m_pages[i].setLastModified( new Date(0L) );
-            m_pages[i].setVersion(1);
+
+        for( final Page m_page : m_pages ) {
+            m_page.setAuthor( "Unknown" );
+            m_page.setLastModified( new Date( 0L ) );
+            m_page.setVersion( 1 );
         }
     }
 
@@ -98,7 +97,7 @@
     }
 
     private Page findPage( final String page ) {
-        for( final WikiPage m_page : m_pages ) {
+        for( final Page m_page : m_pages ) {
             if( m_page.getName().equals( page ) ) {
                 return m_page;
             }
diff --git a/jspwiki-main/src/test/java/org/apache/wiki/providers/VersioningFileProviderTest.java b/jspwiki-main/src/test/java/org/apache/wiki/providers/VersioningFileProviderTest.java
index ca4d632..19fe39e 100644
--- a/jspwiki-main/src/test/java/org/apache/wiki/providers/VersioningFileProviderTest.java
+++ b/jspwiki-main/src/test/java/org/apache/wiki/providers/VersioningFileProviderTest.java
@@ -529,7 +529,7 @@
     public void testChangeNote()
         throws Exception
     {
-        final WikiPage p = new WikiPage( engine, NAME1 );
+        final Page p = Wiki.contents().page( engine, NAME1 );
         p.setAttribute(Page.CHANGENOTE, "Test change" );
         final Context context = Wiki.context().create(engine,p);
 
@@ -544,7 +544,7 @@
     public void testChangeNoteOldVersion()
         throws Exception
     {
-        final Page p = new WikiPage( engine, NAME1 );
+        final Page p = Wiki.contents().page( engine, NAME1 );
 
 
         final Context context = Wiki.context().create(engine,p);
@@ -567,7 +567,7 @@
     @Test
     public void testChangeNoteOldVersion2() throws Exception
     {
-        final Page p = new WikiPage( engine, NAME1 );
+        final Page p = Wiki.contents().page( engine, NAME1 );
 
         final Context context = Wiki.context().create(engine,p);
 
diff --git a/jspwiki-main/src/test/java/org/apache/wiki/providers/VerySimpleProvider.java b/jspwiki-main/src/test/java/org/apache/wiki/providers/VerySimpleProvider.java
index e91cb08..438048c 100644
--- a/jspwiki-main/src/test/java/org/apache/wiki/providers/VerySimpleProvider.java
+++ b/jspwiki-main/src/test/java/org/apache/wiki/providers/VerySimpleProvider.java
@@ -18,13 +18,13 @@
  */
 package org.apache.wiki.providers;
 
-import org.apache.wiki.WikiPage;
 import org.apache.wiki.api.core.Engine;
 import org.apache.wiki.api.core.Page;
 import org.apache.wiki.api.exceptions.ProviderException;
 import org.apache.wiki.api.providers.PageProvider;
 import org.apache.wiki.api.search.QueryItem;
 import org.apache.wiki.api.search.SearchResult;
+import org.apache.wiki.api.spi.Wiki;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -96,7 +96,7 @@
         m_latestReq  = page;
         m_latestVers = version;
 
-        final Page p = new WikiPage( m_engine, page );
+        final Page p = Wiki.contents().page( m_engine, page );
         p.setVersion( 5 );
         p.setAuthor( AUTHOR );
         p.setLastModified( new Date(0L) );
diff --git a/jspwiki-main/src/test/java/org/apache/wiki/references/ReferenceManagerTest.java b/jspwiki-main/src/test/java/org/apache/wiki/references/ReferenceManagerTest.java
index a438df5..ab798f6 100644
--- a/jspwiki-main/src/test/java/org/apache/wiki/references/ReferenceManagerTest.java
+++ b/jspwiki-main/src/test/java/org/apache/wiki/references/ReferenceManagerTest.java
@@ -15,8 +15,8 @@
 
 import net.sf.ehcache.CacheManager;
 import org.apache.wiki.TestEngine;
-import org.apache.wiki.WikiPage;
 import org.apache.wiki.api.exceptions.WikiException;
+import org.apache.wiki.api.spi.Wiki;
 import org.apache.wiki.pages.PageManager;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
@@ -317,7 +317,7 @@
     @Test
     public void testReadLinks() {
         final String src="Foobar. [Foobar].  Frobozz.  [This is a link].";
-        final Object[] result = mgr.scanWikiLinks( new WikiPage( engine, "Test"), src ).toArray();
+        final Object[] result = mgr.scanWikiLinks( Wiki.contents().page( engine, "Test"), src ).toArray();
 
         Assertions.assertEquals( "Foobar", result[0], "item 0" );
         Assertions.assertEquals( "This is a link", result[1], "item 1" );
diff --git a/jspwiki-main/src/test/java/org/apache/wiki/render/CreoleRendererTest.java b/jspwiki-main/src/test/java/org/apache/wiki/render/CreoleRendererTest.java
index 0ab26c0..da1a4c1 100644
--- a/jspwiki-main/src/test/java/org/apache/wiki/render/CreoleRendererTest.java
+++ b/jspwiki-main/src/test/java/org/apache/wiki/render/CreoleRendererTest.java
@@ -18,19 +18,20 @@
  */
 package org.apache.wiki.render;
 
-import java.io.IOException;
-import java.io.StringReader;
-import java.util.Properties;
-
 import org.apache.wiki.TestEngine;
-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.spi.Wiki;
 import org.apache.wiki.parser.JSPWikiMarkupParser;
 import org.apache.wiki.parser.WikiDocument;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.Properties;
+
 public class CreoleRendererTest
 {
     protected TestEngine m_testEngine;
@@ -38,21 +39,21 @@
     @BeforeEach
     public void setUp() throws Exception
     {
-        Properties props = TestEngine.getTestProperties();
+        final Properties props = TestEngine.getTestProperties();
         m_testEngine = new TestEngine(props);
     }
 
-    private String render(String s) throws IOException
+    private String render( final String s) throws IOException
     {
-        WikiPage dummyPage = new WikiPage(m_testEngine,"TestPage");
-        WikiContext ctx = new WikiContext(m_testEngine,dummyPage);
+        final Page dummyPage = Wiki.contents().page(m_testEngine,"TestPage");
+        final Context ctx = Wiki.context().create(m_testEngine,dummyPage);
 
-        StringReader in = new StringReader(s);
+        final StringReader in = new StringReader(s);
 
-        JSPWikiMarkupParser p = new JSPWikiMarkupParser( ctx, in );
-        WikiDocument d = p.parse();
+        final JSPWikiMarkupParser p = new JSPWikiMarkupParser( ctx, in );
+        final WikiDocument d = p.parse();
 
-        CreoleRenderer cr = new CreoleRenderer( ctx, d );
+        final CreoleRenderer cr = new CreoleRenderer( ctx, d );
 
         return cr.getString();
     }
@@ -60,7 +61,7 @@
     @Test
     public void testItalic() throws Exception
     {
-        String src = "123 ''test'' 456";
+        final String src = "123 ''test'' 456";
 
         Assertions.assertEquals( "123 //test// 456", render(src) );
     }
@@ -68,7 +69,7 @@
     @Test
     public void testBold() throws Exception
     {
-        String src = "123 __test__ 456";
+        final String src = "123 __test__ 456";
 
         Assertions.assertEquals( "123 **test** 456", render(src) );
     }
@@ -76,7 +77,7 @@
     @Test
     public void testBoldItalic() throws Exception
     {
-        String src = "123 __''test''__ 456";
+        final String src = "123 __''test''__ 456";
 
         Assertions.assertEquals( "123 **//test//** 456", render(src) );
     }
@@ -84,7 +85,7 @@
     @Test
     public void testList() throws Exception
     {
-        String src = "*one\r\n**two\r\n**three\r\n*four";
+        final String src = "*one\r\n**two\r\n**three\r\n*four";
 
         Assertions.assertEquals( "* one\n** two\n** three\n* four", render(src) );
     }
@@ -92,7 +93,7 @@
     @Test
     public void testList2() throws Exception
     {
-        String src = "* one\r\n**        two\r\n** three\r\n* four";
+        final String src = "* one\r\n**        two\r\n** three\r\n* four";
 
         Assertions.assertEquals( "* one\n** two\n** three\n* four", render(src) );
     }
@@ -100,7 +101,7 @@
     @Test
     public void testList3() throws Exception
     {
-        String src = "*one\r\n**two\r\n**three\r\n*four";
+        final String src = "*one\r\n**two\r\n**three\r\n*four";
 
         Assertions.assertEquals( "* one\n** two\n** three\n* four", render(src) );
     }
@@ -108,7 +109,7 @@
     @Test
     public void testList4() throws Exception
     {
-        String src = "# one\r\n##        two\r\n## three\r\n#four";
+        final String src = "# one\r\n##        two\r\n## three\r\n#four";
 
         Assertions.assertEquals( "# one\n## two\n## three\n# four", render(src) );
     }
@@ -126,7 +127,7 @@
     @Test
     public void testInlineImages() throws Exception
     {
-        String src = "Testing [{Image src='http://test/image.png'}] plugin.";
+        final String src = "Testing [{Image src='http://test/image.png'}] plugin.";
 
         Assertions.assertEquals( "Testing {{http://test/image.png}} plugin.", render(src) );
     }
@@ -134,7 +135,7 @@
     @Test
     public void testPlugins() throws Exception
     {
-        String src = "[{Counter}] [{Counter}]";
+        final String src = "[{Counter}] [{Counter}]";
 
         Assertions.assertEquals( "<<Counter 1>> <<Counter 2>>", render(src) );
     }
@@ -167,7 +168,7 @@
     @Test
     public void testExternalAnchor() throws Exception
     {
-        String src = "[http://jspwiki.apache.org]";
+        final String src = "[http://jspwiki.apache.org]";
 
         Assertions.assertEquals( "[[http://jspwiki.apache.org]]", render(src) );
     }
@@ -175,7 +176,7 @@
     @Test
     public void testExternalAnchor2() throws Exception
     {
-        String src = "[JSPWiki|http://jspwiki.apache.org]";
+        final String src = "[JSPWiki|http://jspwiki.apache.org]";
 
         Assertions.assertEquals( "[[http://jspwiki.apache.org|JSPWiki]]", render(src) );
     }
@@ -183,7 +184,7 @@
     @Test
     public void testLineBreak() throws Exception
     {
-        String src = "a\nb\nc";
+        final String src = "a\nb\nc";
 
         Assertions.assertEquals("a\nb\nc", render(src));
     }
@@ -191,7 +192,7 @@
     @Test
     public void testPre() throws Exception
     {
-        String src = "{{{\n test __foo__ \n}}}";
+        final String src = "{{{\n test __foo__ \n}}}";
 
         Assertions.assertEquals("{{{\n test __foo__ \n}}}", render(src));
     }
@@ -199,7 +200,7 @@
     @Test
     public void testRule() throws Exception
     {
-        String src = "a\n----\nb";
+        final String src = "a\n----\nb";
 
         Assertions.assertEquals("a\n----\nb", render(src));
     }
diff --git a/jspwiki-main/src/test/java/org/apache/wiki/render/WysiwygEditingRendererTest.java b/jspwiki-main/src/test/java/org/apache/wiki/render/WysiwygEditingRendererTest.java
index 47ef3e0..dadf54f 100644
--- a/jspwiki-main/src/test/java/org/apache/wiki/render/WysiwygEditingRendererTest.java
+++ b/jspwiki-main/src/test/java/org/apache/wiki/render/WysiwygEditingRendererTest.java
@@ -19,7 +19,6 @@
 package org.apache.wiki.render;
 
 import org.apache.wiki.TestEngine;
-import org.apache.wiki.WikiPage;
 import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.core.Page;
 import org.apache.wiki.api.spi.Wiki;
@@ -50,7 +49,7 @@
     }
 
     private String render( final String s ) throws IOException {
-        final Page dummyPage = new WikiPage(testEngine,"TestPage");
+        final Page dummyPage = Wiki.contents().page(testEngine,"TestPage");
         final Context ctx = Wiki.context().create(testEngine,dummyPage);
 
         final StringReader in = new StringReader(s);
diff --git a/jspwiki-main/src/test/java/org/apache/wiki/ui/InputValidatorTest.java b/jspwiki-main/src/test/java/org/apache/wiki/ui/InputValidatorTest.java
index d685af7..d7b6fb3 100644
--- a/jspwiki-main/src/test/java/org/apache/wiki/ui/InputValidatorTest.java
+++ b/jspwiki-main/src/test/java/org/apache/wiki/ui/InputValidatorTest.java
@@ -21,16 +21,16 @@
  *
  */
 package org.apache.wiki.ui;
-import java.util.Properties;
-import java.util.regex.Pattern;
-
 import org.apache.wiki.TestEngine;
 import org.apache.wiki.WikiContext;
-import org.apache.wiki.WikiPage;
+import org.apache.wiki.api.spi.Wiki;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
+import java.util.Properties;
+import java.util.regex.Pattern;
+
 public class InputValidatorTest
 {
     TestEngine     testEngine;
@@ -42,16 +42,16 @@
     @BeforeEach
     public void setUp() throws Exception
     {
-        Properties props = TestEngine.getTestProperties();
+        final Properties props = TestEngine.getTestProperties();
         testEngine = new TestEngine( props );
-        WikiContext context = new WikiContext( testEngine, new WikiPage(testEngine,"dummyPage"));
+        final WikiContext context = new WikiContext( testEngine, Wiki.contents().page(testEngine,"dummyPage"));
         val = new InputValidator( TEST, context );
     }
 
     @Test
     public void testUnsafePattern()
     {
-        Pattern unsafe = InputValidator.UNSAFE_PATTERN;
+        final Pattern unsafe = InputValidator.UNSAFE_PATTERN;
         Assertions.assertFalse( unsafe.matcher( "a b c d e f g" ).find() );
         Assertions.assertTrue( unsafe.matcher( "<a> b c d e f g" ).find() );
         Assertions.assertTrue( unsafe.matcher( "foo$" ).find() );
diff --git a/jspwiki-main/src/test/java/org/apache/wiki/ui/admin/beans/FilterBeanTest.java b/jspwiki-main/src/test/java/org/apache/wiki/ui/admin/beans/FilterBeanTest.java
index 47bf236..5d5a359 100644
--- a/jspwiki-main/src/test/java/org/apache/wiki/ui/admin/beans/FilterBeanTest.java
+++ b/jspwiki-main/src/test/java/org/apache/wiki/ui/admin/beans/FilterBeanTest.java
@@ -18,38 +18,31 @@
  */
 package org.apache.wiki.ui.admin.beans;
 
+import org.apache.wiki.TestEngine;
+import org.apache.wiki.api.core.Context;
+import org.apache.wiki.api.exceptions.WikiException;
+import org.apache.wiki.api.spi.Wiki;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
-import java.util.Properties;
-
 import javax.management.NotCompliantMBeanException;
 
-import org.apache.wiki.TestEngine;
-import org.apache.wiki.WikiContext;
-import org.apache.wiki.WikiPage;
-import org.apache.wiki.api.exceptions.WikiException;
-
-import org.junit.jupiter.api.Assertions;
-
 
 public class FilterBeanTest {
 
-    Properties props = TestEngine.getTestProperties();
-
-    TestEngine testEngine;
+    TestEngine testEngine = TestEngine.build();
 
     @Test
     public void testDoGet() throws WikiException, NotCompliantMBeanException {
-        testEngine = new TestEngine( props );
-        WikiContext context = new WikiContext( testEngine, new WikiPage( testEngine, "TestPage01" ) );
-        FilterBean pb = new FilterBean( testEngine );
-        String expectedHtml = "<div>" +
-                                "<h4>Filters</h4>" +
-                                "<table border=\"1\">" +
-                                  "<tr><th>Name</th><th>Author</th><th>Notes</th></tr>" +
-                                  "<tr><td>org.apache.wiki.filters.SpamFilter</td><td>Janne Jalkanen</td><td></td></tr>" +
-                                "</table>" +
-                              "</div>";
+        final Context context = Wiki.context().create( testEngine, Wiki.contents().page( testEngine, "TestPage01" ) );
+        final FilterBean pb = new FilterBean( testEngine );
+        final String expectedHtml = "<div>" +
+                                      "<h4>Filters</h4>" +
+                                      "<table border=\"1\">" +
+                                        "<tr><th>Name</th><th>Author</th><th>Notes</th></tr>" +
+                                        "<tr><td>org.apache.wiki.filters.SpamFilter</td><td>Janne Jalkanen</td><td></td></tr>" +
+                                      "</table>" +
+                                    "</div>";
         Assertions.assertEquals( expectedHtml, pb.doGet( context ) );
     }
 
diff --git a/jspwiki-main/src/test/java/org/apache/wiki/ui/admin/beans/PluginBeanTest.java b/jspwiki-main/src/test/java/org/apache/wiki/ui/admin/beans/PluginBeanTest.java
index 8d14153..bfa7f67 100644
--- a/jspwiki-main/src/test/java/org/apache/wiki/ui/admin/beans/PluginBeanTest.java
+++ b/jspwiki-main/src/test/java/org/apache/wiki/ui/admin/beans/PluginBeanTest.java
@@ -18,18 +18,15 @@
  */
 package org.apache.wiki.ui.admin.beans;
 
+import org.apache.wiki.TestEngine;
+import org.apache.wiki.api.core.Context;
+import org.apache.wiki.api.exceptions.WikiException;
+import org.apache.wiki.api.spi.Wiki;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
-import java.util.Properties;
-
 import javax.management.NotCompliantMBeanException;
-
-import org.junit.jupiter.api.Assertions;
-
-import org.apache.wiki.TestEngine;
-import org.apache.wiki.WikiContext;
-import org.apache.wiki.WikiPage;
-import org.apache.wiki.api.exceptions.WikiException;
+import java.util.Properties;
 
 
 public class PluginBeanTest {
@@ -41,18 +38,18 @@
     @Test
     public void testDoGet() throws WikiException, NotCompliantMBeanException {
         testEngine = new TestEngine( props );
-        WikiContext context = new WikiContext( testEngine, new WikiPage( testEngine, "TestPage01" ) );
-        PluginBean pb = new PluginBean( testEngine );
-        String expectedHtml = "<div>" +
-                                "<h4>Plugins</h4>" +
-                                "<table border=\"1\">" +
-                                  "<tr><th>Name</th><th>Alias</th><th>Author</th><th>Notes</th></tr>" +
-                                  "<tr><td>IfPlugin</td><td>If</td><td>Janne Jalkanen</td><td></td></tr>" +
-                                  "<tr><td>Note</td><td></td><td>Janne Jalkanen</td><td></td></tr>" +
-                                  "<tr><td>SamplePlugin</td><td>samplealias</td><td>Janne Jalkanen</td><td></td></tr>" +
-                                  "<tr><td>SamplePlugin2</td><td>samplealias2</td><td>Janne Jalkanen</td><td></td></tr>" +
-                                "</table>" +
-                              "</div>";
+        final Context context = Wiki.context().create( testEngine, Wiki.contents().page( testEngine, "TestPage01" ) );
+        final PluginBean pb = new PluginBean( testEngine );
+        final String expectedHtml = "<div>" +
+                                      "<h4>Plugins</h4>" +
+                                      "<table border=\"1\">" +
+                                        "<tr><th>Name</th><th>Alias</th><th>Author</th><th>Notes</th></tr>" +
+                                        "<tr><td>IfPlugin</td><td>If</td><td>Janne Jalkanen</td><td></td></tr>" +
+                                        "<tr><td>Note</td><td></td><td>Janne Jalkanen</td><td></td></tr>" +
+                                        "<tr><td>SamplePlugin</td><td>samplealias</td><td>Janne Jalkanen</td><td></td></tr>" +
+                                        "<tr><td>SamplePlugin2</td><td>samplealias2</td><td>Janne Jalkanen</td><td></td></tr>" +
+                                      "</table>" +
+                                    "</div>";
         Assertions.assertEquals( expectedHtml, pb.doGet( context ) );
     }
 
diff --git a/jspwiki-main/src/test/java/org/apache/wiki/variables/DefaultVariableManagerTest.java b/jspwiki-main/src/test/java/org/apache/wiki/variables/DefaultVariableManagerTest.java
index ad79d3c..ae68d60 100644
--- a/jspwiki-main/src/test/java/org/apache/wiki/variables/DefaultVariableManagerTest.java
+++ b/jspwiki-main/src/test/java/org/apache/wiki/variables/DefaultVariableManagerTest.java
@@ -20,7 +20,6 @@
 package org.apache.wiki.variables;
 
 import org.apache.wiki.TestEngine;
-import org.apache.wiki.WikiPage;
 import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.exceptions.NoSuchVariableException;
 import org.apache.wiki.api.spi.Wiki;
@@ -40,7 +39,7 @@
     public static void setUp() {
         final TestEngine testEngine = TestEngine.build();
         m_variableManager = new DefaultVariableManager( TestEngine.getTestProperties() );
-        m_context = Wiki.context().create( testEngine, new WikiPage( testEngine, PAGE_NAME ) );
+        m_context = Wiki.context().create( testEngine, Wiki.contents().page( testEngine, PAGE_NAME ) );
     }
 
     @Test
diff --git a/jspwiki-main/src/test/java/org/apache/wiki/xmlrpc/RPCHandlerTest.java b/jspwiki-main/src/test/java/org/apache/wiki/xmlrpc/RPCHandlerTest.java
index 94a0250..c39802e 100644
--- a/jspwiki-main/src/test/java/org/apache/wiki/xmlrpc/RPCHandlerTest.java
+++ b/jspwiki-main/src/test/java/org/apache/wiki/xmlrpc/RPCHandlerTest.java
@@ -21,10 +21,10 @@
 
 import net.sf.ehcache.CacheManager;
 import org.apache.wiki.TestEngine;
-import org.apache.wiki.WikiContext;
-import org.apache.wiki.WikiPage;
+import org.apache.wiki.api.core.Attachment;
+import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.core.Page;
-import org.apache.wiki.attachment.Attachment;
+import org.apache.wiki.api.spi.Wiki;
 import org.apache.wiki.attachment.AttachmentManager;
 import org.apache.wiki.pages.PageManager;
 import org.apache.xmlrpc.XmlRpcException;
@@ -55,7 +55,7 @@
         m_engine = new TestEngine( m_props );
 
         m_handler = new RPCHandler();
-        final WikiContext ctx = new WikiContext( m_engine, new WikiPage(m_engine, "Dummy") );
+        final Context ctx = Wiki.context().create( m_engine, Wiki.contents().page(m_engine, "Dummy") );
         m_handler.initialize( ctx );
     }
 
@@ -104,7 +104,7 @@
         final Vector previousChanges = m_handler.getRecentChanges( time );
 
         m_engine.saveText( NAME1, "Foo" );
-        final Attachment att = new Attachment( m_engine, NAME1, "TestAtt.txt" );
+        final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "TestAtt.txt" );
         att.setAuthor( "FirstPost" );
         m_engine.getManager( AttachmentManager.class ).storeAttachment( att, m_engine.makeAttachmentFile() );
         final Page directInfo = m_engine.getManager( PageManager.class ).getPage( NAME1 );
@@ -175,7 +175,7 @@
 
         m_engine.saveText( pageName, text );
 
-        final Attachment att = new Attachment( m_engine, NAME1, "TestAtt.txt" );
+        final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "TestAtt.txt" );
         att.setAuthor( "FirstPost" );
         m_engine.getManager( AttachmentManager.class ).storeAttachment( att, m_engine.makeAttachmentFile() );