diff --git a/jspwiki-main/src/main/java/org/apache/wiki/providers/WikiPageProvider.java b/jspwiki-210-adapters/src/main/java/org/apache/wiki/providers/WikiPageProvider.java
similarity index 100%
rename from jspwiki-main/src/main/java/org/apache/wiki/providers/WikiPageProvider.java
rename to jspwiki-210-adapters/src/main/java/org/apache/wiki/providers/WikiPageProvider.java
diff --git a/jspwiki-api/src/main/java/org/apache/wiki/api/search/SearchResult.java b/jspwiki-api/src/main/java/org/apache/wiki/api/search/SearchResult.java
index bd623ae..1e7cc20 100644
--- a/jspwiki-api/src/main/java/org/apache/wiki/api/search/SearchResult.java
+++ b/jspwiki-api/src/main/java/org/apache/wiki/api/search/SearchResult.java
@@ -31,7 +31,7 @@
      *  
      *  @return the WikiPage object containing this result
      */
-    < P extends Page> P getPage();
+    Page getPage();
 
     /**
      *  Returns the score.
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/WikiPage.java b/jspwiki-main/src/main/java/org/apache/wiki/WikiPage.java
index 6c8c973..1413923 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/WikiPage.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/WikiPage.java
@@ -20,11 +20,11 @@
 
 import org.apache.wiki.api.core.Engine;
 import org.apache.wiki.api.core.Page;
+import org.apache.wiki.api.providers.PageProvider;
 import org.apache.wiki.auth.acl.Acl;
 import org.apache.wiki.auth.acl.AclEntry;
 import org.apache.wiki.auth.acl.AclImpl;
 import org.apache.wiki.pages.PageManager;
-import org.apache.wiki.providers.WikiPageProvider;
 
 import java.util.Date;
 import java.util.Enumeration;
@@ -39,36 +39,16 @@
 //        author, date, etc. should also be part of the metadata.  We also
 //        need to figure out the metadata lifecycle.
 
-public class WikiPage implements Page, Comparable< WikiPage > {
+public class WikiPage implements Page {
 
     private       String     m_name;
     private       Engine     m_engine;
     private       String     m_wiki;
     private Date             m_lastModified;
     private long             m_fileSize = -1;
-    private int              m_version = WikiPageProvider.LATEST_VERSION;
+    private int              m_version = PageProvider.LATEST_VERSION;
     private String           m_author = null;
     private final Map<String,Object> m_attributes = new HashMap<>();
-
-    /**
-     *  "Summary" is a short summary of the page.  It is a String.
-     */
-    public static final String DESCRIPTION = "summary";
-
-    /** A special variable name for storing a page alias. */
-    public static final String ALIAS = "alias";
-    
-    /** A special variable name for storing a redirect note */
-    public static final String REDIRECT = "redirect";
-
-    /** A special variable name for storing the author. */
-    public static final String AUTHOR = "author";
-    
-    /** A special variable name for storing a changenote. */
-    public static final String CHANGENOTE = "changenote";
-
-    /** A special variable name for storing a viewcount. */
-    public static final String VIEWCOUNT = "viewcount";
     
     private Acl m_accessList = null;
     
@@ -362,7 +342,7 @@
      *  @return -1, 0 or 1
      */
     @Override
-    public int compareTo( final WikiPage page ) {
+    public int compareTo( final Page page ) {
         if( this == page ) {
             return 0; // the same object
         }
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/auth/acl/DefaultAclManager.java b/jspwiki-main/src/main/java/org/apache/wiki/auth/acl/DefaultAclManager.java
index 81ac058..5f9a531 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/auth/acl/DefaultAclManager.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/auth/acl/DefaultAclManager.java
@@ -137,7 +137,7 @@
         if( acl == null ) {
             //  If null, try the parent.
             if( page instanceof Attachment ) {
-                final WikiPage parent = m_engine.getManager( PageManager.class ).getPage( ( ( Attachment ) page ).getParentName() );
+                final WikiPage parent = ( WikiPage )m_engine.getManager( PageManager.class ).getPage( ( ( Attachment ) page ).getParentName() );
                 acl = getPermissions(parent);
             } else {
                 //  Or, try parsing the page
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/auth/permissions/PagePermission.java b/jspwiki-main/src/main/java/org/apache/wiki/auth/permissions/PagePermission.java
index 6a18dd6..b65b88f 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/auth/permissions/PagePermission.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/auth/permissions/PagePermission.java
@@ -19,7 +19,7 @@
 package org.apache.wiki.auth.permissions;
 
 import org.apache.commons.lang3.StringUtils;
-import org.apache.wiki.WikiPage;
+import org.apache.wiki.api.core.Page;
 
 import java.io.Serializable;
 import java.security.Permission;
@@ -149,7 +149,7 @@
      * (*:*) and set of actions.
      * @param actions
      */
-    private PagePermission( String actions )
+    private PagePermission( final String actions )
     {
         this( WILDCARD + WIKI_SEPARATOR + WILDCARD, actions );
     }
@@ -163,7 +163,7 @@
      * @param page the wiki page
      * @param actions the allowed actions for this page
      */
-    public PagePermission( String page, String actions )
+    public PagePermission( final String page, final String actions )
     {
         super( page );
 
@@ -171,8 +171,8 @@
         // Strip out attachment separator; it is irrelevant.
         
         // FIXME3.0: Assumes attachment separator is "/".
-        String[] pathParams = StringUtils.split( page, WIKI_SEPARATOR );
-        String pageName;
+        final String[] pathParams = StringUtils.split( page, WIKI_SEPARATOR );
+        final String pageName;
         if ( pathParams.length >= 2 )
         {
             m_wiki = pathParams[0].length() > 0 ? pathParams[0] : null;
@@ -183,14 +183,14 @@
             m_wiki = null;
             pageName = pathParams[0];
         }
-        int pos = pageName.indexOf( ATTACHMENT_SEPARATOR );
+        final int pos = pageName.indexOf( ATTACHMENT_SEPARATOR );
         m_page = ( pos == -1 ) ? pageName : pageName.substring( 0, pos );
 
         // Parse actions
-        String[] pageActions = StringUtils.split( actions.toLowerCase(), ACTION_SEPARATOR );
+        final String[] pageActions = StringUtils.split( actions.toLowerCase(), ACTION_SEPARATOR );
         Arrays.sort( pageActions, String.CASE_INSENSITIVE_ORDER );
         m_mask = createMask( actions );
-        StringBuilder buffer = new StringBuilder();
+        final StringBuilder buffer = new StringBuilder();
         for( int i = 0; i < pageActions.length; i++ )
         {
             buffer.append( pageActions[i] );
@@ -204,11 +204,11 @@
 
     /**
      * Creates a new PagePermission for a specified page and set of actions.
+     *
      * @param page The wikipage.
      * @param actions A set of actions; a comma-separated list of actions.
      */
-    public PagePermission( WikiPage page, String actions )
-    {
+    public PagePermission( final Page page, final String actions ) {
         this( page.getWiki() + WIKI_SEPARATOR + page.getName(), actions );
     }
 
@@ -218,15 +218,13 @@
      * @param obj {@inheritDoc}
      * @return {@inheritDoc}
      */
-    public boolean equals( Object obj )
-    {
-        if ( !( obj instanceof PagePermission ) )
-        {
+    public boolean equals( final Object obj ) {
+        if ( !( obj instanceof PagePermission ) ) {
             return false;
         }
-        PagePermission p = (PagePermission) obj;
+        final PagePermission p = ( PagePermission )obj;
         return  p.m_mask == m_mask && p.m_page.equals( m_page )
-                && p.m_wiki != null && p.m_wiki.equals( m_wiki );
+             && p.m_wiki != null && p.m_wiki.equals( m_wiki );
     }
 
     /**
@@ -264,12 +262,11 @@
      * Returns the hash code for this PagePermission.
      * @return {@inheritDoc}
      */
-    public int hashCode()
-    {
+    public int hashCode() {
         //  If the wiki has not been set, uses a dummy value for the hashcode
         //  calculation.  This may occur if the page given does not refer
         //  to any particular wiki
-        String wiki = m_wiki != null ? m_wiki : "dummy_value";
+        final String wiki = m_wiki != null ? m_wiki : "dummy_value";
         return m_mask + ( ( 13 * m_actionString.hashCode() ) * 23 * wiki.hashCode() );
     }
 
@@ -296,7 +293,7 @@
      * @param permission {@inheritDoc}
      * @return {@inheritDoc}
      */
-    public boolean implies( Permission permission )
+    public boolean implies( final Permission permission )
     {
         // Permission must be a PagePermission
         if ( !( permission instanceof PagePermission ) )
@@ -305,8 +302,8 @@
         }
 
         // Build up an "implied mask"
-        PagePermission p = (PagePermission) permission;
-        int impliedMask = impliedMask( m_mask );
+        final PagePermission p = (PagePermission) permission;
+        final int impliedMask = impliedMask( m_mask );
 
         // If actions aren't a proper subset, return false
         if ( ( impliedMask & p.m_mask ) != p.m_mask )
@@ -315,11 +312,11 @@
         }
 
         // See if the tested permission's wiki is implied
-        boolean impliedWiki = isSubset( m_wiki, p.m_wiki );
+        final boolean impliedWiki = isSubset( m_wiki, p.m_wiki );
 
         // If this page is "*", the tested permission's
         // page is implied
-        boolean impliedPage = isSubset( m_page, p.m_page );
+        final boolean impliedPage = isSubset( m_page, p.m_page );
 
         return  impliedWiki && impliedPage;
     }
@@ -343,7 +340,7 @@
      */
     public String toString()
     {
-        String wiki = ( m_wiki == null ) ? "" : m_wiki;
+        final String wiki = ( m_wiki == null ) ? "" : m_wiki;
         return "(\"" + this.getClass().getName() + "\",\"" + wiki + WIKI_SEPARATOR + m_page + "\",\"" + getActions() + "\")";
     }
 
@@ -389,7 +386,7 @@
      * @return the results of the test, where <code>true</code> indicates that
      *         <code>subSet</code> is a subset of <code>superSet</code>
      */
-    protected static boolean isSubset( String superSet, String subSet )
+    protected static boolean isSubset( final String superSet, final String subSet )
     {
         // If either is null, return false
         if ( superSet == null || subSet == null )
@@ -412,14 +409,14 @@
         // If super starts with "*", sub must end with everything after the *
         if ( superSet.startsWith( WILDCARD ) )
         {
-            String suffix = superSet.substring( 1 );
+            final String suffix = superSet.substring( 1 );
             return subSet.endsWith( suffix );
         }
 
         // If super ends with "*", sub must start with everything before *
         if ( superSet.endsWith( WILDCARD ) )
         {
-            String prefix = superSet.substring( 0, superSet.length() - 1 );
+            final String prefix = superSet.substring( 0, superSet.length() - 1 );
             return subSet.startsWith( prefix );
         }
 
@@ -432,15 +429,15 @@
      * @param actions the actions for this permission, separated by commas
      * @return the binary actions mask
      */
-    protected static int createMask( String actions )
+    protected static int createMask( final String actions )
     {
         if ( actions == null || actions.length() == 0 )
         {
             throw new IllegalArgumentException( "Actions cannot be blank or null" );
         }
         int mask = 0;
-        String[] actionList = StringUtils.split( actions, ACTION_SEPARATOR );
-        for( String action : actionList )
+        final String[] actionList = StringUtils.split( actions, ACTION_SEPARATOR );
+        for( final String action : actionList )
         {
             if ( action.equalsIgnoreCase( VIEW_ACTION ) )
             {
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/diff/DefaultDifferenceManager.java b/jspwiki-main/src/main/java/org/apache/wiki/diff/DefaultDifferenceManager.java
index 28b1b08..27c0777 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/diff/DefaultDifferenceManager.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/diff/DefaultDifferenceManager.java
@@ -23,8 +23,8 @@
 import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.core.Engine;
 import org.apache.wiki.api.exceptions.NoRequiredPropertyException;
+import org.apache.wiki.api.providers.PageProvider;
 import org.apache.wiki.pages.PageManager;
-import org.apache.wiki.providers.WikiPageProvider;
 import org.apache.wiki.util.ClassUtil;
 
 import java.io.IOException;
@@ -120,7 +120,7 @@
         final String page2 = context.getEngine().getManager( PageManager.class ).getPureText( page, version2 );
 
         // Kludge to make diffs for new pages to work this way.
-        if( version1 == WikiPageProvider.LATEST_VERSION ) {
+        if( version1 == PageProvider.LATEST_VERSION ) {
             page1 = "";
         }
 
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 fcb7b87..eaa8934 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
@@ -22,14 +22,15 @@
 import org.apache.log4j.Logger;
 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;
 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.exceptions.WikiException;
+import org.apache.wiki.api.providers.PageProvider;
 import org.apache.wiki.api.providers.WikiProvider;
-import org.apache.wiki.attachment.Attachment;
 import org.apache.wiki.attachment.AttachmentManager;
 import org.apache.wiki.auth.WikiPrincipal;
 import org.apache.wiki.auth.WikiSecurityException;
@@ -44,7 +45,6 @@
 import org.apache.wiki.event.WikiPageEvent;
 import org.apache.wiki.event.WikiSecurityEvent;
 import org.apache.wiki.providers.RepositoryModifiedException;
-import org.apache.wiki.providers.WikiPageProvider;
 import org.apache.wiki.references.ReferenceManager;
 import org.apache.wiki.search.SearchManager;
 import org.apache.wiki.tasks.TasksManager;
@@ -89,7 +89,7 @@
 
     private static final Logger LOG = Logger.getLogger( DefaultPageManager.class );
 
-    private WikiPageProvider m_provider;
+    private PageProvider m_provider;
 
     private Engine m_engine;
 
@@ -127,7 +127,7 @@
         try {
             LOG.debug("Page provider class: '" + classname + "'");
             final Class<?> providerclass = ClassUtil.findClass("org.apache.wiki.providers", classname);
-            m_provider = (WikiPageProvider) providerclass.newInstance();
+            m_provider = ( PageProvider ) providerclass.newInstance();
 
             LOG.debug("Initializing page provider class " + m_provider);
             m_provider.initialize(m_engine, props);
@@ -155,7 +155,7 @@
      * @see org.apache.wiki.pages.PageManager#getProvider()
      */
     @Override
-    public WikiPageProvider getProvider() {
+    public PageProvider getProvider() {
         return m_provider;
     }
 
@@ -164,7 +164,7 @@
      * @see org.apache.wiki.pages.PageManager#getAllPages()
      */
     @Override
-    public Collection< WikiPage > getAllPages() throws ProviderException {
+    public Collection< Page > getAllPages() throws ProviderException {
         return m_provider.getAllPages();
     }
 
@@ -186,7 +186,7 @@
             LOG.info( "Repository has been modified externally while fetching page " + pageName );
 
             //  Empty the references and yay, it shall be recalculated
-            final WikiPage p = m_provider.getPageInfo( pageName, version );
+            final Page p = m_provider.getPageInfo( pageName, version );
 
             m_engine.getManager( ReferenceManager.class ).updateReferences( p );
             m_engine.getManager( SearchManager.class ).reindexPage( p );
@@ -285,10 +285,10 @@
 
     /**
      * {@inheritDoc}
-     * @see org.apache.wiki.pages.PageManager#putPageText(org.apache.wiki.WikiPage, java.lang.String)
+     * @see org.apache.wiki.pages.PageManager#putPageText(org.apache.wiki.api.core.Page, java.lang.String)
      */
     @Override
-    public void putPageText( final WikiPage page, final String content ) throws ProviderException {
+    public void putPageText( final Page page, final String content ) throws ProviderException {
         if (page == null || page.getName() == null || page.getName().length() == 0) {
             throw new ProviderException("Illegal page name");
         }
@@ -298,34 +298,30 @@
 
     /**
      * {@inheritDoc}
-     * @see org.apache.wiki.pages.PageManager#lockPage(org.apache.wiki.WikiPage, java.lang.String)
+     * @see org.apache.wiki.pages.PageManager#lockPage(org.apache.wiki.api.core.Page, java.lang.String)
      */
     @Override
-    public PageLock lockPage( final WikiPage page, final String user) {
-        if (m_reaper == null) {
-            //
-            //  Start the lock reaper lazily.  We don't want to start it in
-            //  the constructor, because starting threads in constructors
-            //  is a bad idea when it comes to inheritance.  Besides,
-            //  laziness is a virtue.
-            //
-            m_reaper = new LockReaper(m_engine);
+    public PageLock lockPage( final Page page, final String user ) {
+        if( m_reaper == null ) {
+            //  Start the lock reaper lazily.  We don't want to start it in the constructor, because starting threads in constructors
+            //  is a bad idea when it comes to inheritance.  Besides, laziness is a virtue.
+            m_reaper = new LockReaper( m_engine );
             m_reaper.start();
         }
 
-        fireEvent(WikiPageEvent.PAGE_LOCK, page.getName()); // prior to or after actual lock?
-        PageLock lock = m_pageLocks.get(page.getName());
+        fireEvent( WikiPageEvent.PAGE_LOCK, page.getName() ); // prior to or after actual lock?
+        PageLock lock = m_pageLocks.get( page.getName() );
 
-        if (lock == null) {
+        if( lock == null ) {
             //
             //  Lock is available, so make a lock.
             //
             final Date d = new Date();
-            lock = new PageLock(page, user, d, new Date(d.getTime() + m_expiryTime * 60 * 1000L));
-            m_pageLocks.put(page.getName(), lock);
-            LOG.debug("Locked page " + page.getName() + " for " + user);
+            lock = new PageLock( page, user, d, new Date( d.getTime() + m_expiryTime * 60 * 1000L ) );
+            m_pageLocks.put( page.getName(), lock );
+            LOG.debug( "Locked page " + page.getName() + " for " + user );
         } else {
-            LOG.debug("Page " + page.getName() + " already locked by " + lock.getLocker());
+            LOG.debug( "Page " + page.getName() + " already locked by " + lock.getLocker() );
             lock = null; // Nothing to return
         }
 
@@ -350,10 +346,10 @@
 
     /**
      * {@inheritDoc}
-     * @see org.apache.wiki.pages.PageManager#getCurrentLock(org.apache.wiki.WikiPage)
+     * @see org.apache.wiki.pages.PageManager#getCurrentLock(org.apache.wiki.api.core.Page)
      */
     @Override
-    public PageLock getCurrentLock( final WikiPage page ) {
+    public PageLock getCurrentLock( final Page page ) {
         return m_pageLocks.get( page.getName() );
     }
 
@@ -371,8 +367,8 @@
      * @see org.apache.wiki.pages.PageManager#getPage(java.lang.String)
      */
     @Override
-    public WikiPage getPage( final String pagereq ) {
-        return getPage( pagereq, WikiProvider.LATEST_VERSION );
+    public Page getPage( final String pagereq ) {
+        return getPage( pagereq, PageProvider.LATEST_VERSION );
     }
 
     /**
@@ -380,9 +376,9 @@
      * @see org.apache.wiki.pages.PageManager#getPage(java.lang.String, int)
      */
     @Override
-    public WikiPage getPage( final String pagereq, final int version ) {
+    public Page getPage( final String pagereq, final int version ) {
         try {
-            WikiPage p = getPageInfo( pagereq, version );
+            Page p = getPageInfo( pagereq, version );
             if( p == null ) {
                 p = m_engine.getManager( AttachmentManager.class ).getAttachmentInfo( null, pagereq );
             }
@@ -399,23 +395,23 @@
      * @see org.apache.wiki.pages.PageManager#getPageInfo(java.lang.String, int)
      */
     @Override
-    public WikiPage getPageInfo( final String pageName, final int version) throws ProviderException {
-        if (pageName == null || pageName.length() == 0) {
-            throw new ProviderException("Illegal page name '" + pageName + "'");
+    public Page getPageInfo( final String pageName, final int version) throws ProviderException {
+        if( pageName == null || pageName.length() == 0 ) {
+            throw new ProviderException( "Illegal page name '" + pageName + "'" );
         }
 
-        WikiPage page;
+        Page page;
 
         try {
-            page = m_provider.getPageInfo(pageName, version);
-        } catch ( final RepositoryModifiedException e) {
+            page = m_provider.getPageInfo( pageName, version );
+        } catch( final RepositoryModifiedException e ) {
             //  This only occurs with the latest version.
-            LOG.info("Repository has been modified externally while fetching info for " + pageName);
-            page = m_provider.getPageInfo(pageName, version);
-            if (page != null) {
-                m_engine.getManager( ReferenceManager.class ).updateReferences(page);
+            LOG.info( "Repository has been modified externally while fetching info for " + pageName );
+            page = m_provider.getPageInfo( pageName, version );
+            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( new WikiPage( m_engine, pageName ) );
             }
         }
 
@@ -427,7 +423,7 @@
      * @see org.apache.wiki.pages.PageManager#getVersionHistory(java.lang.String)
      */
     @Override @SuppressWarnings( "unchecked" )
-    public < T extends WikiPage > List< T > getVersionHistory( final String pageName ) {
+    public < T extends Page > List< T > getVersionHistory( final String pageName ) {
         List< T > c = null;
 
         try {
@@ -483,9 +479,9 @@
      * @see org.apache.wiki.pages.PageManager#getRecentChanges()
      */
     @Override
-    public Set< WikiPage > getRecentChanges() {
+    public Set< Page > getRecentChanges() {
         try {
-            final TreeSet< WikiPage > sortedPages = new TreeSet<>( new PageTimeComparator() );
+            final TreeSet< Page > sortedPages = new TreeSet<>( new PageTimeComparator() );
             sortedPages.addAll( getAllPages() );
             sortedPages.addAll( m_engine.getManager( AttachmentManager.class ).getAllAttachments() );
 
@@ -580,10 +576,10 @@
 
     /**
      * {@inheritDoc}
-     * @see org.apache.wiki.pages.PageManager#deleteVersion(org.apache.wiki.WikiPage)
+     * @see org.apache.wiki.pages.PageManager#deleteVersion(org.apache.wiki.api.core.Page)
      */
     @Override
-    public void deleteVersion( final WikiPage page ) throws ProviderException {
+    public void deleteVersion( final Page page ) throws ProviderException {
         if( page instanceof Attachment ) {
             m_engine.getManager( AttachmentManager.class ).deleteVersion( ( Attachment )page );
         } else {
@@ -598,7 +594,7 @@
      */
     @Override
     public void deletePage( final String pageName ) throws ProviderException {
-        final WikiPage p = getPage( pageName );
+        final Page p = getPage( pageName );
         if( p != null ) {
             if( p instanceof Attachment ) {
                 m_engine.getManager( AttachmentManager.class ).deleteAttachment( ( Attachment )p );
@@ -624,10 +620,10 @@
 
     /**
      * {@inheritDoc}
-     * @see org.apache.wiki.pages.PageManager#deletePage(org.apache.wiki.WikiPage)
+     * @see org.apache.wiki.pages.PageManager#deletePage(org.apache.wiki.api.core.Page)
      */
     @Override
-    public void deletePage( final WikiPage page ) throws ProviderException {
+    public void deletePage( final Page page ) throws ProviderException {
         fireEvent( WikiPageEvent.PAGE_DELETE_REQUEST, page.getName() );
         m_provider.deletePage( page.getName() );
         fireEvent( WikiPageEvent.PAGE_DELETED, page.getName() );
@@ -709,13 +705,13 @@
             // Examine each page ACL
             try {
                 int pagesChanged = 0;
-                final Collection< WikiPage > pages = getAllPages();
-                for( final WikiPage page : pages ) {
-                    final boolean aclChanged = changeAcl( page, oldPrincipals, newPrincipal );
+                final Collection< Page > pages = getAllPages();
+                for( final Page page : pages ) {
+                    final boolean aclChanged = changeAcl( ( WikiPage )page, oldPrincipals, newPrincipal );
                     if( aclChanged ) {
                         // If the Acl needed changing, change it now
                         try {
-                            m_engine.getManager( AclManager.class ).setPermissions( page, page.getAcl() );
+                            m_engine.getManager( AclManager.class ).setPermissions( ( WikiPage )page, ( ( WikiPage )page ).getAcl() );
                         } catch( final WikiSecurityException e ) {
                             LOG.error("Could not change page ACL for page " + page.getName() + ": " + e.getMessage(), e);
                         }
@@ -772,7 +768,8 @@
         return pageChanged;
     }
 
-    /* (non-Javadoc)
+    /**
+     * {@inheritDoc}
      * @see org.apache.wiki.pages.PageManager#getPageSorter()
      */
     @Override
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/pages/PageLock.java b/jspwiki-main/src/main/java/org/apache/wiki/pages/PageLock.java
index fcbc3a2..c14a53b 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/pages/PageLock.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/pages/PageLock.java
@@ -18,98 +18,90 @@
  */
 package org.apache.wiki.pages;
 
-import org.apache.wiki.WikiPage;
+import org.apache.wiki.api.core.Page;
 
 import java.io.Serializable;
 import java.util.Date;
 
+
 /**
- *  Describes a lock acquired by an user on a page.  For the most part,
- *  the regular developer does not have to instantiate this class.
- *  <p>
- *  The PageLock keeps no reference to a WikiPage because otherwise it could
- *  keep a reference to a page for a long time.
- *
+ * Describes a lock acquired by an user on a page.  For the most part, the regular developer does not have to instantiate this class.
+ * <p>
+ * The PageLock keeps no reference to a WikiPage because otherwise it could keep a reference to a page for a long time.
  */
-public class PageLock
-    implements Serializable
-{
+public class PageLock implements Serializable {
+
     private static final long serialVersionUID = 0L;
-    
-    private String   m_page;
-    private String   m_locker;
-    private Date     m_lockAcquired;
-    private Date     m_lockExpiry;
+
+    private String m_page;
+    private String m_locker;
+    private Date m_lockAcquired;
+    private Date m_lockExpiry;
 
     /**
-     *  Creates a new PageLock.  The lock is not attached to any objects at this point.
-     *  
-     *  @param page     WikiPage which is locked.
-     *  @param locker   The username who locked this page (for display purposes).
-     *  @param acquired The timestamp when the lock is acquired
-     *  @param expiry   The timestamp when the lock expires.
+     * Creates a new PageLock.  The lock is not attached to any objects at this point.
+     *
+     * @param page     WikiPage which is locked.
+     * @param locker   The username who locked this page (for display purposes).
+     * @param acquired The timestamp when the lock is acquired
+     * @param expiry   The timestamp when the lock expires.
      */
-    public PageLock( final WikiPage page, final String locker, final Date acquired, final Date expiry ) {
-        m_page         = page.getName();
-        m_locker       = locker;
-        m_lockAcquired = (Date)acquired.clone();
-        m_lockExpiry   = (Date)expiry.clone();
+    public PageLock( final Page page, final String locker, final Date acquired, final Date expiry ) {
+        m_page = page.getName();
+        m_locker = locker;
+        m_lockAcquired = ( Date )acquired.clone();
+        m_lockExpiry = ( Date )expiry.clone();
     }
 
     /**
-     *  Returns the name of the page which is locked.
-     *  
-     *  @return The name of the page.
+     * Returns the name of the page which is locked.
+     *
+     * @return The name of the page.
      */
-    public String getPage()
-    {
+    public String getPage() {
         return m_page;
     }
 
     /**
-     *  Returns the locker name.
-     *  
-     *  @return The name of the locker.
+     * Returns the locker name.
+     *
+     * @return The name of the locker.
      */
-    public String getLocker()
-    {
+    public String getLocker() {
         return m_locker;
     }
 
     /**
-     *  Returns the timestamp on which this lock was acquired.
-     *  
-     *  @return The acquisition time.
+     * Returns the timestamp on which this lock was acquired.
+     *
+     * @return The acquisition time.
      */
-    public Date getAcquisitionTime()
-    {
+    public Date getAcquisitionTime() {
         return m_lockAcquired;
     }
 
     /**
-     *  Returns the timestamp on which this lock will expire.
-     *  
-     *  @return The expiry date.
+     * Returns the timestamp on which this lock will expire.
+     *
+     * @return The expiry date.
      */
-    public Date getExpiryTime()
-    {
+    public Date getExpiryTime() {
         return m_lockExpiry;
     }
 
     /**
-     *  Returns the amount of time left in minutes, rounded up to the nearest
-     *  minute (so you get a zero only at the last minute).
-     *  
-     *  @return Time left in minutes.
+     * Returns the amount of time left in minutes, rounded up to the nearest minute (so you get a zero only at the last minute).
+     *
+     * @return Time left in minutes.
      */
     public long getTimeLeft() {
         final long time = m_lockExpiry.getTime() - new Date().getTime();
-
         return ( time / ( 1000L * 60 ) ) + 1;
     }
-    
+
     public boolean isExpired() {
         final Date now = new Date();
         return now.after( getExpiryTime() );
     }
+
 }
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/pages/PageManager.java b/jspwiki-main/src/main/java/org/apache/wiki/pages/PageManager.java
index 1fc7ec5..ec031e8 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/pages/PageManager.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/pages/PageManager.java
@@ -18,13 +18,12 @@
  */
 package org.apache.wiki.pages;
 
-import org.apache.wiki.WikiPage;
 import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.core.Page;
 import org.apache.wiki.api.exceptions.ProviderException;
 import org.apache.wiki.api.exceptions.WikiException;
+import org.apache.wiki.api.providers.PageProvider;
 import org.apache.wiki.event.WikiEventListener;
-import org.apache.wiki.providers.WikiPageProvider;
 
 import java.util.Collection;
 import java.util.List;
@@ -45,7 +44,7 @@
      *
      * @return A WikiPageProvider instance.
      */
-    WikiPageProvider getProvider();
+    PageProvider getProvider();
 
     /**
      * Returns all pages in some random order.  If you need just the page names,
@@ -55,7 +54,7 @@
      * @return A Collection of WikiPage objects.
      * @throws ProviderException If the backend has problems.
      */
-    Collection< WikiPage > getAllPages() throws ProviderException;
+    Collection< Page > getAllPages() throws ProviderException;
 
     /**
      * Fetches the page text from the repository.  This method also does some sanity checks, like checking for the pageName validity, etc.
@@ -118,7 +117,7 @@
      *  @return WikiText.
      */
     default String getText( final String page ) {
-        return getText( page, WikiPageProvider.LATEST_VERSION );
+        return getText( page, PageProvider.LATEST_VERSION );
     }
 
     /**
@@ -132,7 +131,7 @@
      *  @return The page content as HTMLized String.
      *  @see PageManager#getPureText(Page)
      */
-    default String getText( final WikiPage page ) {
+    default String getText( final Page page ) {
         return getText( page.getName(), page.getVersion() );
     }
 
@@ -162,7 +161,7 @@
      * @param content Wikimarkup to save
      * @throws ProviderException If something goes wrong in the saving phase
      */
-    void putPageText( WikiPage page, String content ) throws ProviderException;
+    void putPageText( Page page, String content ) throws ProviderException;
 
     /**
      * Locks page for editing.  Note, however, that the PageManager will in no way prevent you from actually editing this page;
@@ -172,7 +171,7 @@
      * @param user Username to use for locking
      * @return null, if page could not be locked.
      */
-    PageLock lockPage( WikiPage page, String user );
+    PageLock lockPage( Page page, String user );
 
     /**
      * Marks a page free to be written again.  If there has not been a lock, will fail quietly.
@@ -187,7 +186,7 @@
      * @param page The page to check the lock for
      * @return Current lock, or null, if there is no lock
      */
-    PageLock getCurrentLock( WikiPage page );
+    PageLock getCurrentLock( Page page );
 
     /**
      * Returns a list of currently applicable locks.  Note that by the time you get the list,
@@ -205,7 +204,7 @@
      *  @param pagereq The name of the page to look for.
      *  @return A WikiPage object, or null, if the page by the name could not be found.
      */
-    WikiPage getPage( String pagereq );
+    Page getPage( String pagereq );
 
     /**
      *  Finds the corresponding WikiPage object base on the page name and version.
@@ -219,7 +218,7 @@
      *  is no such version of the page.
      *  @since 1.6.7 (moved to PageManager on 2.11.0).
      */
-    WikiPage getPage( String pagereq, int version );
+    Page getPage( String pagereq, int version );
 
     /**
      * Finds a WikiPage object describing a particular page and version.
@@ -229,7 +228,7 @@
      * @return A WikiPage object, or null, if the page does not exist
      * @throws ProviderException If there is something wrong with the page name or the repository
      */
-    WikiPage getPageInfo( String pageName, int version ) throws ProviderException;
+    Page getPageInfo( String pageName, int version ) throws ProviderException;
 
     /**
      * Gets a version history of page.  Each element in the returned List is a WikiPage.
@@ -238,7 +237,7 @@
      * @return If the page does not exist or there's some problem retrieving the version history, returns null,
      *         otherwise a List of WikiPages / Attachments, each corresponding to a different revision of the page / attachment.
      */
-    < T extends WikiPage > List< T > getVersionHistory( String pageName );
+    < T extends Page > List< T > getVersionHistory( String pageName );
 
     /**
      *  Returns the provider name.
@@ -270,7 +269,7 @@
      *
      *  @return Set of WikiPage objects.
      */
-    Set< WikiPage > getRecentChanges();
+    Set< Page > getRecentChanges();
 
     /**
      * Returns true, if the page exists (any version) on the underlying WikiPageProvider.
@@ -300,7 +299,7 @@
      *  @throws ProviderException If something goes badly wrong.
      *  @since 2.0
      */
-    default boolean pageExists( final WikiPage page ) throws ProviderException {
+    default boolean pageExists( final Page page ) throws ProviderException {
         if( page != null ) {
             return pageExists( page.getName(), page.getVersion() );
         }
@@ -349,7 +348,7 @@
      * @param page The page to delete.
      * @throws ProviderException if the page fails
      */
-    void deleteVersion( WikiPage page ) throws ProviderException;
+    void deleteVersion( Page page ) throws ProviderException;
 
     /**
      *  Deletes a page or an attachment completely, including all versions.  If the page does not exist, does nothing.
@@ -365,7 +364,7 @@
      * @param page The WikiPage to delete
      * @throws ProviderException If the repository operation fails
      */
-    void deletePage( WikiPage page ) throws ProviderException;
+    void deletePage( Page page ) throws ProviderException;
 
     /**
      * Returns the configured {@link PageSorter}.
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 fe28c63..cbad778 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
@@ -22,12 +22,14 @@
 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;
 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.search.QueryItem;
+import org.apache.wiki.api.search.QueryItem;
+import org.apache.wiki.api.search.SearchResult;
 import org.apache.wiki.search.SearchMatcher;
-import org.apache.wiki.search.SearchResult;
 import org.apache.wiki.search.SearchResultComparator;
 import org.apache.wiki.util.FileUtil;
 import org.apache.wiki.util.TextUtil;
@@ -62,7 +64,7 @@
  *
  *  @since 2.1.21.
  */
-public abstract class AbstractFileProvider implements WikiPageProvider {
+public abstract class AbstractFileProvider implements PageProvider {
 
     private static final Logger log = Logger.getLogger(AbstractFileProvider.class);
     private String m_pageDirectory = "/tmp/";
@@ -78,9 +80,7 @@
     public static final int DEFAULT_MAX_PROPKEYLENGTH = 255;
     public static final int DEFAULT_MAX_PROPVALUELENGTH = 4096;
 
-    /**
-     * This parameter limits the number of custom page properties allowed on a page
-     */
+    /** This parameter limits the number of custom page properties allowed on a page */
     public static int MAX_PROPLIMIT = DEFAULT_MAX_PROPLIMIT;
 
     /**
@@ -93,15 +93,12 @@
      */
     public static int MAX_PROPVALUELENGTH = DEFAULT_MAX_PROPVALUELENGTH;
 
-    /**
-     *  Name of the property that defines where page directories are.
-     */
+    /** Name of the property that defines where page directories are. */
     public static final String PROP_PAGEDIR = "jspwiki.fileSystemProvider.pageDir";
 
     /**
-     *  All files should have this extension to be recognized as JSPWiki files.
-     *  We default to .txt, because that is probably easiest for Windows users,
-     *  and guarantees correct handling.
+     *  All files should have this extension to be recognized as JSPWiki files. We default to .txt, because that is probably easiest for
+     *  Windows users, and guarantees correct handling.
      */
     public static final String FILE_EXT = ".txt";
 
@@ -125,8 +122,7 @@
 
         if( !f.exists() ) {
             if( !f.mkdirs() ) {
-                throw new IOException(
-                        "Failed to create page directory " + f.getAbsolutePath() + " , please check property " + PROP_PAGEDIR );
+                throw new IOException( "Failed to create page directory " + f.getAbsolutePath() + " , please check property " + PROP_PAGEDIR );
             }
         } else {
             if( !f.isDirectory() ) {
@@ -211,9 +207,8 @@
      *  @param page The name of the page.
      *  @return A File to the page.  May be null.
      */
-    protected File findPage( final String page )
-    {
-        return new File( m_pageDirectory, mangleName(page)+FILE_EXT );
+    protected File findPage( final String page ) {
+        return new File( m_pageDirectory, mangleName( page ) + FILE_EXT );
     }
 
     /**
@@ -270,7 +265,7 @@
      *  {@inheritDoc}
      */
     @Override
-    public void putPageText( final WikiPage page, final String text ) throws ProviderException {
+    public void putPageText( final Page page, final String text ) throws ProviderException {
         final File file = findPage( page.getName() );
         try( final PrintWriter out = new PrintWriter( new OutputStreamWriter( new FileOutputStream( file ), m_encoding ) ) ) {
             out.print( text );
@@ -283,9 +278,9 @@
      *  {@inheritDoc}
      */
     @Override
-    public Collection< WikiPage > getAllPages()  throws ProviderException {
+    public Collection< Page > getAllPages()  throws ProviderException {
         log.debug("Getting all pages...");
-        final ArrayList< WikiPage > set = new ArrayList<>();
+        final ArrayList< Page > set = new ArrayList<>();
         final File wikipagedir = new File( m_pageDirectory );
         final File[] wikipages = wikipagedir.listFiles( new WikiFileFilter() );
 
@@ -297,8 +292,7 @@
         for( final File wikipage : wikipages ) {
             final String wikiname = wikipage.getName();
             final int cutpoint = wikiname.lastIndexOf( FILE_EXT );
-
-            final WikiPage page = getPageInfo( unmangleName( wikiname.substring( 0, cutpoint ) ), WikiPageProvider.LATEST_VERSION );
+            final Page page = getPageInfo( unmangleName( wikiname.substring( 0, cutpoint ) ), PageProvider.LATEST_VERSION );
             if( page == null ) {
                 // This should not really happen.
                 // FIXME: Should we throw an exception here?
@@ -319,7 +313,7 @@
      *  @return {@inheritDoc}
      */
     @Override
-    public Collection< WikiPage > getAllChangedSince( final Date date )
+    public Collection< Page > getAllChangedSince( final Date date )
     {
         return new ArrayList<>(); // FIXME
     }
@@ -391,9 +385,9 @@
      *  {@inheritDoc}
      */
     @Override
-    public List< WikiPage > getVersionHistory( final String page ) throws ProviderException {
-        final ArrayList< WikiPage > list = new ArrayList<>();
-        list.add( getPageInfo( page, WikiPageProvider.LATEST_VERSION ) );
+    public List< Page > getVersionHistory( final String page ) throws ProviderException {
+        final ArrayList< Page > list = new ArrayList<>();
+        list.add( getPageInfo( page, PageProvider.LATEST_VERSION ) );
 
         return list;
     }
@@ -432,23 +426,23 @@
      *
      * @since 2.10.2
      */
-    protected void setCustomProperties( final WikiPage page, final Properties properties ) {
+    protected void setCustomProperties( final Page page, final Properties properties ) {
         final Enumeration< ? > propertyNames = properties.propertyNames();
     	while( propertyNames.hasMoreElements() ) {
             final String key = ( String )propertyNames.nextElement();
-            if( !key.equals( WikiPage.AUTHOR ) && !key.equals( WikiPage.CHANGENOTE ) && !key.equals( WikiPage.VIEWCOUNT ) ) {
+            if( !key.equals( Page.AUTHOR ) && !key.equals( Page.CHANGENOTE ) && !key.equals( Page.VIEWCOUNT ) ) {
                 page.setAttribute( key, properties.get( key ) );
             }
     	}
     }
 
     /**
-     * Get custom properties using {@link #addCustomProperties(WikiPage, Properties)}, validate them using {@link #validateCustomPageProperties(Properties)}
+     * Get custom properties using {@link #addCustomProperties(Page, Properties)}, validate them using {@link #validateCustomPageProperties(Properties)}
      * and add them to default properties provided
      *
      * @since 2.10.2
      */
-    protected void getCustomProperties( final WikiPage page, final Properties defaultProperties ) throws IOException {
+    protected void getCustomProperties( final Page page, final Properties defaultProperties ) throws IOException {
         final Properties customPageProperties = addCustomProperties( page, defaultProperties );
         validateCustomPageProperties( customPageProperties );
         defaultProperties.putAll( customPageProperties );
@@ -464,7 +458,7 @@
      * @param props the default properties of this page
      * @return default implementation returns empty Properties.
      */
-    protected Properties addCustomProperties( final WikiPage page, final Properties props ) {
+    protected Properties addCustomProperties( final Page page, final Properties props ) {
         final Properties customProperties = new Properties();
         if( page != null ) {
             final Map< String, Object > atts = page.getAttributes();
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/providers/CachingProvider.java b/jspwiki-main/src/main/java/org/apache/wiki/providers/CachingProvider.java
index a2d18fb..47f253d 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/providers/CachingProvider.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/providers/CachingProvider.java
@@ -23,22 +23,22 @@
 import net.sf.ehcache.Element;
 import org.apache.log4j.Logger;
 import org.apache.wiki.WikiContext;
-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.search.QueryItem;
+import org.apache.wiki.api.search.SearchResult;
 import org.apache.wiki.pages.PageManager;
 import org.apache.wiki.parser.MarkupParser;
 import org.apache.wiki.render.RenderingManager;
-import org.apache.wiki.search.QueryItem;
-import org.apache.wiki.search.SearchResult;
 import org.apache.wiki.util.ClassUtil;
 import org.apache.wiki.util.TextUtil;
 
 import java.io.IOException;
 import java.util.Collection;
 import java.util.Date;
-import java.util.Iterator;
 import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.Properties;
@@ -46,13 +46,10 @@
 
 
 /**
- *  Provides a caching page provider.  This class rests on top of a
- *  real provider class and provides a cache to speed things up.  Only
- *  if the cache copy of the page text has expired, we fetch it from
- *  the provider.
+ *  Provides a caching page provider.  This class rests on top of a real provider class and provides a cache to speed things up.  Only
+ *  if the cache copy of the page text has expired, we fetch it from the provider.
  *  <p>
- *  This class does not detect if someone has modified the page
- *  externally, not through JSPWiki routines.
+ *  This class does not detect if someone has modified the page externally, not through JSPWiki routines.
  *  <p>
  *  Heavily based on ideas by Chris Brooking.
  *  <p>
@@ -61,16 +58,14 @@
  *  @since 1.6.4
  */
 // FIXME: Synchronization is a bit inconsistent in places.
-// FIXME: A part of the stuff is now redundant, since we could easily use the text cache
-//        for a lot of things.  RefactorMe.
-
-public class CachingProvider implements WikiPageProvider {
+// FIXME: A part of the stuff is now redundant, since we could easily use the text cache for a lot of things.  RefactorMe.
+public class CachingProvider implements PageProvider {
 
     private static final Logger log = Logger.getLogger( CachingProvider.class );
 
     private CacheManager m_cacheManager = CacheManager.getInstance();
 
-    private WikiPageProvider m_provider;
+    private PageProvider m_provider;
     // FIXME: Find another way to the search engine to use instead of from Engine?
     private Engine m_engine;
 
@@ -154,8 +149,7 @@
 
         try {
             final Class< ? > providerclass = ClassUtil.findClass( "org.apache.wiki.providers", classname );
-
-            m_provider = ( WikiPageProvider )providerclass.newInstance();
+            m_provider = ( PageProvider )providerclass.newInstance();
 
             log.debug( "Initializing real provider class " + m_provider );
             m_provider.initialize( engine, properties );
@@ -171,23 +165,24 @@
         }
     }
 
-
-    private WikiPage getPageInfoFromCache( final String name) throws ProviderException {
+    private Page getPageInfoFromCache( final String name) throws ProviderException {
         // Sanity check; seems to occur sometimes
-        if (name == null) return null;
+        if( name == null ) {
+            return null;
+        }
 
-        final Element cacheElement = m_cache.get(name);
-        if (cacheElement == null) {
-            final WikiPage refreshed = m_provider.getPageInfo(name, WikiPageProvider.LATEST_VERSION);
-            if (refreshed != null) {
-                m_cache.put(new Element(name, refreshed));
+        final Element cacheElement = m_cache.get( name );
+        if( cacheElement == null ) {
+            final Page refreshed = m_provider.getPageInfo( name, PageProvider.LATEST_VERSION );
+            if( refreshed != null ) {
+                m_cache.put( new Element( name, refreshed ) );
                 return refreshed;
-            }  else {
+            } else {
                 // page does not exist anywhere
                 return null;
             }
         }
-        return (WikiPage) cacheElement.getObjectValue();
+        return ( Page )cacheElement.getObjectValue();
     }
 
 
@@ -195,40 +190,32 @@
      *  {@inheritDoc}
      */
     @Override
-    public boolean pageExists( final String pageName, final int version )
-    {
-        if( pageName == null ) return false;
-
-        WikiPage p = null;
-
-        try
-        {
-            p = getPageInfoFromCache( pageName );
-        }
-        catch( final ProviderException e )
-        {
-            log.info("Provider failed while trying to check if page exists: "+pageName);
+    public boolean pageExists( final String pageName, final int version ) {
+        if( pageName == null ) {
             return false;
         }
 
-        if( p != null )
-        {
-            final int latestVersion = p.getVersion();
+        final Page p;
+        try {
+            p = getPageInfoFromCache( pageName );
+        } catch( final ProviderException e ) {
+            log.info( "Provider failed while trying to check if page exists: " + pageName );
+            return false;
+        }
 
-            if( version == latestVersion || version == LATEST_VERSION )
-            {
+        if( p != null ) {
+            final int latestVersion = p.getVersion();
+            if( version == latestVersion || version == LATEST_VERSION ) {
                 return true;
             }
 
             return m_provider.pageExists( pageName, version );
         }
 
-        try
-        {
+        try {
             return getPageInfo( pageName, version ) != null;
+        } catch( final ProviderException e ) {
         }
-        catch( final ProviderException e )
-        {}
 
         return false;
     }
@@ -237,50 +224,32 @@
      *  {@inheritDoc}
      */
     @Override
-    public boolean pageExists( final String pageName )
-    {
-        if( pageName == null ) return false;
-
-        WikiPage p = null;
-
-        try
-        {
-            p = getPageInfoFromCache( pageName );
-        }
-        catch( final ProviderException e )
-        {
-            log.info("Provider failed while trying to check if page exists: "+pageName);
+    public boolean pageExists( final String pageName ) {
+        if( pageName == null ) {
             return false;
         }
 
-        //
-        //  A null item means that the page either does not
-        //  exist, or has not yet been cached; a non-null
-        //  means that the page does exist.
-        //
-        if( p != null )
-        {
+        final Page p;
+        try {
+            p = getPageInfoFromCache( pageName );
+        } catch( final ProviderException e ) {
+            log.info( "Provider failed while trying to check if page exists: " + pageName );
+            return false;
+        }
+
+        //  A null item means that the page either does not exist, or has not yet been cached; a non-null means that the page does exist.
+        if( p != null ) {
             return true;
         }
 
-        //
-        //  If we have a list of all pages in memory, then any page
-        //  not in the cache must be non-existent.
-        //
-        if( m_gotall )
-        {
+        //  If we have a list of all pages in memory, then any page not in the cache must be non-existent.
+        if( m_gotall ) {
             return false;
         }
 
-        //
-        //  We could add the page to the cache here as well,
-        //  but in order to understand whether that is a
-        //  good thing or not we would need to analyze
-        //  the JSPWiki calling patterns extensively.  Presumably
-        //  it would be a good thing if pageExists() is called
-        //  many times before the first getPageText() is called,
-        //  and the whole page is cached.
-        //
+        //  We could add the page to the cache here as well, but in order to understand whether that is a good thing or not we would
+        //  need to analyze the JSPWiki calling patterns extensively.  Presumably it would be a good thing if pageExists() is called
+        //  many times before the first getPageText() is called, and the whole page is cached.
         return m_provider.pageExists( pageName );
     }
 
@@ -288,30 +257,21 @@
      *  {@inheritDoc}
      */
     @Override
-    public String getPageText( final String pageName, final int version )
-        throws ProviderException
-    {
-        String result = null;
-
-        if( pageName == null ) return null;
-
-        if( version == WikiPageProvider.LATEST_VERSION )
-        {
-            result = getTextFromCache( pageName );
+    public String getPageText( final String pageName, final int version ) throws ProviderException {
+        if( pageName == null ) {
+            return null;
         }
-        else
-        {
-            final WikiPage p = getPageInfoFromCache( pageName );
 
-            //
+        final String result;
+        if( version == PageProvider.LATEST_VERSION ) {
+            result = getTextFromCache( pageName );
+        } else {
+            final Page p = getPageInfoFromCache( pageName );
+
             //  Or is this the latest version fetched by version number?
-            //
-            if( p != null && p.getVersion() == version )
-            {
+            if( p != null && p.getVersion() == version ) {
                 result = getTextFromCache( pageName );
-            }
-            else
-            {
+            } else {
                 result = m_provider.getPageText( pageName, version );
             }
         }
@@ -320,20 +280,20 @@
     }
 
 
-    private String getTextFromCache( final String pageName) throws ProviderException {
-        String text = null;
-
-        if (pageName == null) return null;
-
-        final Element cacheElement = m_textCache.get(pageName);
-
-        if (cacheElement != null) {
-            m_cacheHits++;
-            return (String) cacheElement.getObjectValue();
+    private String getTextFromCache( final String pageName ) throws ProviderException {
+        if (pageName == null) {
+            return null;
         }
-        if (pageExists(pageName)) {
-            text = m_provider.getPageText(pageName, WikiPageProvider.LATEST_VERSION);
-            m_textCache.put(new Element(pageName, text));
+
+        final String text;
+        final Element cacheElement = m_textCache.get(pageName);
+        if( cacheElement != null ) {
+            m_cacheHits++;
+            return ( String )cacheElement.getObjectValue();
+        }
+        if( pageExists( pageName ) ) {
+            text = m_provider.getPageText( pageName, PageProvider.LATEST_VERSION );
+            m_textCache.put( new Element( pageName, text ) );
             m_cacheMisses++;
             return text;
         }
@@ -345,19 +305,17 @@
      *  {@inheritDoc}
      */
     @Override
-    public void putPageText( final WikiPage page, final String text) throws ProviderException {
-        synchronized (this) {
-            m_provider.putPageText(page, text);
-
-            page.setLastModified(new Date());
+    public void putPageText( final Page page, final String text ) throws ProviderException {
+        synchronized( this ) {
+            m_provider.putPageText( page, text );
+            page.setLastModified( new Date() );
 
             // Refresh caches properly
+            m_cache.remove( page.getName() );
+            m_textCache.remove( page.getName() );
+            m_historyCache.remove( page.getName() );
 
-            m_cache.remove(page.getName());
-            m_textCache.remove(page.getName());
-            m_historyCache.remove(page.getName());
-
-            getPageInfoFromCache(page.getName());
+            getPageInfoFromCache( page.getName() );
         }
     }
 
@@ -365,19 +323,16 @@
      *  {@inheritDoc}
      */
     @Override
-    public Collection< WikiPage > getAllPages() throws ProviderException {
-        final Collection< WikiPage > all;
+    public Collection< Page > getAllPages() throws ProviderException {
+        final Collection< Page > all;
 
-        if (m_gotall == false) {
+        if ( !m_gotall ) {
             all = m_provider.getAllPages();
 
             // Make sure that all pages are in the cache.
-
-            synchronized (this) {
-                for ( final Iterator< WikiPage > i = all.iterator(); i.hasNext(); ) {
-                    final WikiPage p = i.next();
-
-                    m_cache.put(new Element(p.getName(), p));
+            synchronized( this ) {
+                for( final Page p : all ) {
+                    m_cache.put( new Element( p.getName(), p ) );
                 }
 
                 m_gotall = true;
@@ -385,11 +340,11 @@
         } else {
             @SuppressWarnings("unchecked") final List< String > keys = m_cache.getKeysWithExpiryCheck();
             all = new TreeSet<>();
-            for ( final String key : keys) {
-                final Element element = m_cache.get(key);
-                final WikiPage cachedPage = ( WikiPage )element.getObjectValue();
-                if (cachedPage != null) {
-                    all.add(cachedPage);
+            for( final String key : keys ) {
+                final Element element = m_cache.get( key );
+                final Page cachedPage = ( Page )element.getObjectValue();
+                if( cachedPage != null ) {
+                    all.add( cachedPage );
                 }
             }
         }
@@ -408,8 +363,7 @@
      *  {@inheritDoc}
      */
     @Override
-    public Collection< WikiPage > getAllChangedSince( final Date date )
-    {
+    public Collection< Page > getAllChangedSince( final Date date ) {
         return m_provider.getAllChangedSince( date );
     }
 
@@ -417,9 +371,7 @@
      *  {@inheritDoc}
      */
     @Override
-    public int getPageCount()
-        throws ProviderException
-    {
+    public int getPageCount() throws ProviderException {
         return m_provider.getPageCount();
     }
 
@@ -427,29 +379,18 @@
      *  {@inheritDoc}
      */
     @Override
-    public Collection< SearchResult > findPages( final QueryItem[] query )
-    {
-        //
-        //  If the provider is a fast searcher, then
-        //  just pass this request through.
-        //
+    public Collection< SearchResult > findPages( final QueryItem[] query ) {
+        //  If the provider is a fast searcher, then just pass this request through.
         return m_provider.findPages( query );
-
         // FIXME: Does not implement fast searching
     }
 
-    //
-    //  FIXME: Kludge: make sure that the page is also parsed and it gets all the
-    //         necessary variables.
-    //
-
-    private void refreshMetadata( final WikiPage page ) {
+    //  FIXME: Kludge: make sure that the page is also parsed and it gets all the necessary variables.
+    private void refreshMetadata( final Page page ) {
         if( page != null && !page.hasMetadata() ) {
             final RenderingManager mgr = m_engine.getManager( RenderingManager.class );
-
             try {
                 final String data = m_provider.getPageText( page.getName(), page.getVersion() );
-
                 final WikiContext ctx = new WikiContext( m_engine, page );
                 final MarkupParser parser = mgr.getParser( ctx, data );
 
@@ -464,39 +405,25 @@
      *  {@inheritDoc}
      */
     @Override
-    public WikiPage getPageInfo( final String pageName, final int version ) throws ProviderException
-    {
-        WikiPage page = null;
-        final WikiPage cached = getPageInfoFromCache( pageName );
-
-        final int latestcached = (cached != null) ? cached.getVersion() : Integer.MIN_VALUE;
-
-        if( version == WikiPageProvider.LATEST_VERSION || version == latestcached )
-        {
-            if( cached == null )
-            {
-                final WikiPage data = m_provider.getPageInfo( pageName, version );
-
-                if( data != null )
-                {
-                    m_cache.put(new Element(pageName, data));
+    public Page getPageInfo( final String pageName, final int version ) throws ProviderException {
+        final Page page;
+        final Page cached = getPageInfoFromCache( pageName );
+        final int latestcached = ( cached != null ) ? cached.getVersion() : Integer.MIN_VALUE;
+        if( version == PageProvider.LATEST_VERSION || version == latestcached ) {
+            if( cached == null ) {
+                final Page data = m_provider.getPageInfo( pageName, version );
+                if( data != null ) {
+                    m_cache.put( new Element( pageName, data ) );
                 }
                 page = data;
-            }
-            else
-            {
+            } else {
                 page = cached;
             }
-        }
-        else
-        {
+        } else {
             // We do not cache old versions.
             page = m_provider.getPageInfo( pageName, version );
-            //refreshMetadata( page );
         }
-
         refreshMetadata( page );
-
         return page;
     }
 
@@ -505,18 +432,18 @@
      */
     @SuppressWarnings("unchecked")
     @Override
-    public List< WikiPage > getVersionHistory( final String pageName) throws ProviderException {
-        List< WikiPage > history = null;
-
-        if (pageName == null) return null;
-        final Element element = m_historyCache.get(pageName);
-
-        if (element != null) {
+    public List< Page > getVersionHistory( final String pageName) throws ProviderException {
+        final List< Page > history;
+        if( pageName == null ) {
+            return null;
+        }
+        final Element element = m_historyCache.get( pageName );
+        if( element != null ) {
             m_historyCacheHits++;
-            history = ( List< WikiPage > )element.getObjectValue();
+            history = ( List< Page > )element.getObjectValue();
         } else {
-            history = m_provider.getVersionHistory(pageName);
-            m_historyCache.put( new Element( pageName, history ));
+            history = m_provider.getVersionHistory( pageName );
+            m_historyCache.put( new Element( pageName, history ) );
             m_historyCacheMisses++;
         }
 
@@ -529,44 +456,32 @@
      * @return A plain string with all the above mentioned values.
      */
     @Override
-    public synchronized String getProviderInfo()
-    {
-        return "Real provider: "+m_provider.getClass().getName()+
-                ". Cache misses: "+m_cacheMisses+
-                ". Cache hits: "+m_cacheHits+
-                ". History cache hits: "+m_historyCacheHits+
-                ". History cache misses: "+m_historyCacheMisses;
+    public synchronized String getProviderInfo() {
+        return "Real provider: " + m_provider.getClass().getName()+
+                ". Cache misses: " + m_cacheMisses+
+                ". Cache hits: " + m_cacheHits+
+                ". History cache hits: " + m_historyCacheHits+
+                ". History cache misses: " + m_historyCacheMisses;
     }
 
     /**
      *  {@inheritDoc}
      */
     @Override
-    public void deleteVersion( final String pageName, final int version )
-        throws ProviderException
-    {
-        //
-        //  Luckily, this is such a rare operation it is okay
-        //  to synchronize against the whole thing.
-        //
-        synchronized( this )
-        {
-            final WikiPage cached = getPageInfoFromCache( pageName );
+    public void deleteVersion( final String pageName, final int version ) throws ProviderException {
+        //  Luckily, this is such a rare operation it is okay to synchronize against the whole thing.
+        synchronized( this ) {
+            final Page cached = getPageInfoFromCache( pageName );
+            final int latestcached = ( cached != null ) ? cached.getVersion() : Integer.MIN_VALUE;
 
-            final int latestcached = (cached != null) ? cached.getVersion() : Integer.MIN_VALUE;
-
-            //
             //  If we have this version cached, remove from cache.
-            //
-            if( version == WikiPageProvider.LATEST_VERSION ||
-                version == latestcached )
-            {
-                m_cache.remove(pageName);
-                m_textCache.remove(pageName);
+            if( version == PageProvider.LATEST_VERSION || version == latestcached ) {
+                m_cache.remove( pageName );
+                m_textCache.remove( pageName );
             }
 
             m_provider.deleteVersion( pageName, version );
-            m_historyCache.remove(pageName);
+            m_historyCache.remove( pageName );
         }
     }
 
@@ -574,18 +489,13 @@
      *  {@inheritDoc}
      */
     @Override
-    public void deletePage( final String pageName )
-        throws ProviderException
-    {
-        //
+    public void deletePage( final String pageName ) throws ProviderException {
         //  See note in deleteVersion().
-        //
-        synchronized(this)
-        {
-            m_cache.put(new Element(pageName, null));
-            m_textCache.put(new Element( pageName, null ));
-            m_historyCache.put(new Element(pageName, null));
-            m_provider.deletePage(pageName);
+        synchronized( this ) {
+            m_cache.put( new Element( pageName, null ) );
+            m_textCache.put( new Element( pageName, null ) );
+            m_historyCache.put( new Element( pageName, null ) );
+            m_provider.deletePage( pageName );
         }
     }
 
@@ -593,28 +503,28 @@
      *  {@inheritDoc}
      */
     @Override
-    public void movePage( final String from, final String to) throws ProviderException {
-        m_provider.movePage(from, to);
+    public void movePage( final String from, final String to ) throws ProviderException {
+        m_provider.movePage( from, to );
 
-        synchronized (this) {
+        synchronized( this ) {
             // Clear any cached version of the old page and new page
-            m_cache.remove(from);
-            m_textCache.remove(from);
-            m_historyCache.remove(from);
-            log.debug("Removing to page " + to + " from cache");
-            m_cache.remove(to);
-            m_textCache.remove(to);
-            m_historyCache.remove(to);
+            m_cache.remove( from );
+            m_textCache.remove( from );
+            m_historyCache.remove( from );
+            log.debug( "Removing to page " + to + " from cache" );
+            m_cache.remove( to );
+            m_textCache.remove( to );
+            m_historyCache.remove( to );
         }
     }
 
     /**
      *  Returns the actual used provider.
+     *
      *  @since 2.0
      *  @return The real provider.
      */
-    public WikiPageProvider getRealProvider()
-    {
+    public PageProvider getRealProvider() {
         return m_provider;
     }
 
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/providers/FileSystemProvider.java b/jspwiki-main/src/main/java/org/apache/wiki/providers/FileSystemProvider.java
index 802beab..8368f10 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/providers/FileSystemProvider.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/providers/FileSystemProvider.java
@@ -20,6 +20,7 @@
 
 import org.apache.log4j.Logger;
 import org.apache.wiki.WikiPage;
+import org.apache.wiki.api.core.Page;
 import org.apache.wiki.api.exceptions.ProviderException;
 
 import java.io.File;
@@ -49,7 +50,7 @@
      *  {@inheritDoc}
      */
     @Override
-    public void putPageText( final WikiPage page, final String text ) throws ProviderException {
+    public void putPageText( final Page page, final String text ) throws ProviderException {
         try {
             super.putPageText( page, text );
             putPageProperties( page );
@@ -61,26 +62,26 @@
     /**
      *  Stores basic metadata to a file.
      */
-    private void putPageProperties( final WikiPage page ) throws IOException {
+    private void putPageProperties( final Page page ) throws IOException {
         final Properties props = new Properties();
         final String author = page.getAuthor();
-        final String changenote = page.getAttribute( WikiPage.CHANGENOTE );
-        final String viewcount = page.getAttribute( WikiPage.VIEWCOUNT );
+        final String changenote = page.getAttribute( Page.CHANGENOTE );
+        final String viewcount = page.getAttribute( Page.VIEWCOUNT );
 
         if( author != null ) {
-            props.setProperty( WikiPage.AUTHOR, author );
+            props.setProperty( Page.AUTHOR, author );
         }
 
         if( changenote != null ) {
-            props.setProperty( WikiPage.CHANGENOTE, changenote );
+            props.setProperty( Page.CHANGENOTE, changenote );
         }
 
         if( viewcount != null ) {
-            props.setProperty( WikiPage.VIEWCOUNT, viewcount );
+            props.setProperty( Page.VIEWCOUNT, viewcount );
         }
 
         // Get additional custom properties from page and add to props
-        getCustomProperties(page, props);
+        getCustomProperties( page, props );
 
         final File file = new File( getPageDirectory(), mangleName( page.getName() ) + PROP_EXT );
         try( final OutputStream out = new FileOutputStream( file ) ) {
@@ -91,7 +92,7 @@
     /**
      *  Gets basic metadata from file.
      */
-    private void getPageProperties( final WikiPage page ) throws IOException {
+    private void getPageProperties( final Page page ) throws IOException {
         final File file = new File( getPageDirectory(), mangleName( page.getName() ) + PROP_EXT );
         if( file.exists() ) {
             try( final InputStream in = new FileInputStream( file ) ) {
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 5ca30c6..cfa6af2 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
@@ -22,8 +22,10 @@
 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.util.FileUtil;
 
@@ -247,24 +249,17 @@
      *  @throws NoSuchVersionException if there is no such version.
      */
     private int realVersion( final String page, final int requestedVersion ) throws NoSuchVersionException {
-        //
         //  Quickly check for the most common case.
-        //
-        if( requestedVersion == WikiProvider.LATEST_VERSION )
-        {
+        if( requestedVersion == WikiProvider.LATEST_VERSION ) {
             return -1;
         }
 
         final int latest = findLatestVersion(page);
 
-        if( requestedVersion == latest ||
-            (requestedVersion == 1 && latest == -1 ) )
-        {
+        if( requestedVersion == latest || (requestedVersion == 1 && latest == -1 ) ) {
             return -1;
-        }
-        else if( requestedVersion <= 0 || requestedVersion > latest )
-        {
-            throw new NoSuchVersionException("Requested version "+requestedVersion+", but latest is "+latest );
+        } else if( requestedVersion <= 0 || requestedVersion > latest ) {
+            throw new NoSuchVersionException( "Requested version " + requestedVersion + ", but latest is " + latest );
         }
 
         return requestedVersion;
@@ -274,23 +269,19 @@
      *  {@inheritDoc}
      */
     @Override
-    public synchronized String getPageText( final String page, int version )
-        throws ProviderException
-    {
+    public synchronized String getPageText( final String page, int version ) throws ProviderException {
         final File dir = findOldPageDir( page );
 
         version = realVersion( page, version );
-        if( version == -1 )
-        {
-            // We can let the FileSystemProvider take care
-            // of these requests.
-            return super.getPageText( page, WikiPageProvider.LATEST_VERSION );
+        if( version == -1 ) {
+            // We can let the FileSystemProvider take care of these requests.
+            return super.getPageText( page, PageProvider.LATEST_VERSION );
         }
 
         final File pageFile = new File( dir, ""+version+FILE_EXT );
-
-        if( !pageFile.exists() )
+        if( !pageFile.exists() ) {
             throw new NoSuchVersionException("Version "+version+"does not exist.");
+        }
 
         return readFile( pageFile );
     }
@@ -335,11 +326,8 @@
      *  {@inheritDoc}
      */
     @Override
-    public synchronized void putPageText( final WikiPage page, final String text ) throws ProviderException {
-        //
-        //  This is a bit complicated.  We'll first need to
-        //  copy the old file to be the newest file.
-        //
+    public synchronized void putPageText( final Page page, final String text ) throws ProviderException {
+        // This is a bit complicated.  We'll first need to copy the old file to be the newest file.
         final int  latest  = findLatestVersion( page.getName() );
         final File pageDir = findOldPageDir( page.getName() );
         if( !pageDir.exists() ) {
@@ -347,16 +335,12 @@
         }
 
         try {
-            //
             // Copy old data to safety, if one exists.
-            //
             final File oldFile = findPage( page.getName() );
 
-            // Figure out which version should the old page be?
-            // Numbers should always start at 1.
+            // Figure out which version should the old page be? Numbers should always start at 1.
             // "most recent" = -1 ==> 1
             // "first"       = 1  ==> 2
-
             int versionNumber = (latest > 0) ? latest : 1;
             final boolean firstUpdate = (versionNumber == 1);
 
@@ -366,26 +350,18 @@
                      final OutputStream out = new BufferedOutputStream( new FileOutputStream( pageFile ) ) ) {
                     FileUtil.copyContents( in, out );
 
-                    //
                     // We need also to set the date, since we rely on this.
-                    //
                     pageFile.setLastModified( oldFile.lastModified() );
 
-                    //
                     // Kludge to make the property code to work properly.
-                    //
                     versionNumber++;
                 }
             }
 
-            //
             //  Let superclass handler writing data to a new version.
-            //
             super.putPageText( page, text );
 
-            //
             //  Finally, write page version data.
-            //
             // FIXME: No rollback available.
             final Properties props = getPageProperties( page.getName() );
 
@@ -402,8 +378,7 @@
             }
 
             String newAuthor = page.getAuthor();
-            if ( newAuthor == null )
-            {
+            if ( newAuthor == null ) {
                 newAuthor = ( authorFirst != null ) ? authorFirst : "unknown";
             }
             page.setAuthor(newAuthor);
@@ -433,7 +408,7 @@
 
         WikiPage p = null;
 
-        if( version == WikiPageProvider.LATEST_VERSION || version == latest || (version == 1 && latest == -1) ) {
+        if( version == PageProvider.LATEST_VERSION || version == latest || (version == 1 && latest == -1) ) {
             //
             // Yes, we need to talk to the top level directory to get this version.
             //
@@ -442,26 +417,20 @@
             //
             realVersion = (latest >= 0) ? latest : 1;
 
-            p = super.getPageInfo( page, WikiPageProvider.LATEST_VERSION );
+            p = super.getPageInfo( page, PageProvider.LATEST_VERSION );
 
             if( p != null ) {
                 p.setVersion( realVersion );
             }
         } else {
-            //
-            //  The file is not the most recent, so we'll need to
-            //  find it from the deep trenches of the "OLD" directory
-            //  structure.
-            //
+            // The file is not the most recent, so we'll need to find it from the deep trenches of the "OLD" directory structure.
             realVersion = version;
             final File dir = findOldPageDir( page );
-
             if( !dir.exists() || !dir.isDirectory() ) {
                 return null;
             }
 
             final File file = new File( dir, version + FILE_EXT );
-
             if( file.exists() ) {
                 p = new WikiPage( m_engine, page );
 
@@ -470,26 +439,24 @@
             }
         }
 
-        //
         //  Get author and other metadata information (Modification date has already been set.)
-        //
         if( p != null ) {
             try {
                 final Properties props = getPageProperties( page );
                 String author = props.getProperty( realVersion + ".author" );
                 if( author == null ) {
-                    // we might not have a versioned author because the
-                    // old page was last maintained by FileSystemProvider
+                    // we might not have a versioned author because the old page was last maintained by FileSystemProvider
                     final Properties props2 = getHeritagePageProperties( page );
-                    author = props2.getProperty( WikiPage.AUTHOR );
+                    author = props2.getProperty( Page.AUTHOR );
                 }
                 if( author != null ) {
                     p.setAuthor( author );
                 }
 
                 final String changenote = props.getProperty( realVersion + ".changenote" );
-                if( changenote != null )
-                    p.setAttribute( WikiPage.CHANGENOTE, changenote );
+                if( changenote != null ) {
+                    p.setAttribute( Page.CHANGENOTE, changenote );
+                }
 
                 // Set the props values to the page attributes
                 setCustomProperties( p, props );
@@ -506,7 +473,7 @@
      */
     @Override
     public boolean pageExists( final String pageName, final int version ) {
-        if (version == WikiPageProvider.LATEST_VERSION || version == findLatestVersion( pageName ) ) {
+        if (version == PageProvider.LATEST_VERSION || version == findLatestVersion( pageName ) ) {
             return pageExists(pageName);
         }
 
@@ -523,15 +490,11 @@
      */
      // FIXME: Does not get user information.
     @Override
-    public List< WikiPage > getVersionHistory( final String page ) throws ProviderException {
-        final ArrayList< WikiPage > list = new ArrayList<>();
+    public List< Page > getVersionHistory( final String page ) throws ProviderException {
+        final ArrayList< Page > list = new ArrayList<>();
         final int latest = findLatestVersion( page );
-
-        // list.add( getPageInfo(page,WikiPageProvider.LATEST_VERSION) );
-
         for( int i = latest; i > 0; i-- ) {
             final WikiPage info = getPageInfo( page, i );
-
             if( info != null ) {
                 list.add( info );
             }
@@ -541,8 +504,7 @@
     }
 
     /*
-     * Support for migration of simple properties created by the
-     * FileSystemProvider when coming under Versioning management.
+     * Support for migration of simple properties created by the FileSystemProvider when coming under Versioning management.
      * Simulate an initial version.
      */
     private Properties getHeritagePageProperties( final String page ) throws IOException {
@@ -579,9 +541,8 @@
     }
 
     /**
-     *  Removes the relevant page directory under "OLD" -directory as well,
-     *  but does not remove any extra subdirectories from it.  It will only
-     *  touch those files that it thinks to be WikiPages.
+     *  Removes the relevant page directory under "OLD" -directory as well, but does not remove any extra subdirectories from it.
+     *  It will only touch those files that it thinks to be WikiPages.
      *
      *  @param page {@inheritDoc}
      *  @throws {@inheritDoc}
@@ -593,13 +554,11 @@
         final File dir = findOldPageDir( page );
         if( dir.exists() && dir.isDirectory() ) {
             final File[] files = dir.listFiles( new WikiFileFilter() );
-
             for( int i = 0; i < files.length; i++ ) {
                 files[ i ].delete();
             }
 
             final File propfile = new File( dir, PROPERTYFILE );
-
             if( propfile.exists() ) {
                 propfile.delete();
             }
@@ -611,19 +570,17 @@
     /**
      *  {@inheritDoc}
      *
-     *  Deleting versions has never really worked, JSPWiki assumes that version histories are "not gappy".
-     *  Using deleteVersion() is definitely not recommended.
+     *  Deleting versions has never really worked, JSPWiki assumes that version histories are "not gappy". Using deleteVersion() is
+     *  definitely not recommended.
      */
     @Override
     public void deleteVersion( final String page, final int version ) throws ProviderException {
         final File dir = findOldPageDir( page );
         int latest = findLatestVersion( page );
-        if( version == WikiPageProvider.LATEST_VERSION ||
+        if( version == PageProvider.LATEST_VERSION ||
             version == latest ||
             (version == 1 && latest == -1) ) {
-            //
             //  Delete the properties
-            //
             try {
                 final Properties props = getPageProperties( page );
                 props.remove( ((latest > 0) ? latest : 1)+".author" );
@@ -633,13 +590,10 @@
                 throw new ProviderException("Could not modify page properties: " + e.getMessage());
             }
 
-            // We can let the FileSystemProvider take care
-            // of the actual deletion
-            super.deleteVersion( page, WikiPageProvider.LATEST_VERSION );
+            // We can let the FileSystemProvider take care of the actual deletion
+            super.deleteVersion( page, PageProvider.LATEST_VERSION );
 
-            //
             //  Copy the old file to the new location
-            //
             latest = findLatestVersion( page );
 
             final File pageDir = findOldPageDir( page );
@@ -649,9 +603,7 @@
                  final OutputStream out = new BufferedOutputStream( new FileOutputStream( pageFile ) ) ) {
                 if( previousFile.exists() ) {
                     FileUtil.copyContents( in, out );
-                    //
                     // We need also to set the date, since we rely on this.
-                    //
                     pageFile.setLastModified( previousFile.lastModified() );
                 }
             } catch( final IOException e ) {
@@ -662,7 +614,6 @@
         }
 
         final File pageFile = new File( dir, ""+version+FILE_EXT );
-
         if( pageFile.exists() ) {
             if( !pageFile.delete() ) {
                 log.error("Unable to delete page." + pageFile.getPath() );
@@ -677,11 +628,11 @@
      */
     // FIXME: This is kinda slow, we should need to do this only once.
     @Override
-    public Collection< WikiPage > getAllPages() throws ProviderException {
-        final Collection< WikiPage > pages = super.getAllPages();
-        final Collection< WikiPage > returnedPages = new ArrayList<>();
-        for( final WikiPage page : pages ) {
-            final WikiPage info = getPageInfo( page.getName(), WikiProvider.LATEST_VERSION );
+    public Collection< Page > getAllPages() throws ProviderException {
+        final Collection< Page > pages = super.getAllPages();
+        final Collection< Page > returnedPages = new ArrayList<>();
+        for( final Page page : pages ) {
+            final Page info = getPageInfo( page.getName(), WikiProvider.LATEST_VERSION );
             returnedPages.add( info );
         }
 
@@ -745,4 +696,5 @@
             this.m_lastModified = lastModified;
         }
     }
+
 }
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/references/DefaultReferenceManager.java b/jspwiki-main/src/main/java/org/apache/wiki/references/DefaultReferenceManager.java
index 77df623..e88496d 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/references/DefaultReferenceManager.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/references/DefaultReferenceManager.java
@@ -24,19 +24,19 @@
 import org.apache.wiki.LinkCollector;
 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.exceptions.ProviderException;
 import org.apache.wiki.api.filters.BasePageFilter;
+import org.apache.wiki.api.providers.PageProvider;
 import org.apache.wiki.api.providers.WikiProvider;
-import org.apache.wiki.attachment.Attachment;
 import org.apache.wiki.attachment.AttachmentManager;
 import org.apache.wiki.event.WikiEvent;
 import org.apache.wiki.event.WikiEventManager;
 import org.apache.wiki.event.WikiPageEvent;
 import org.apache.wiki.pages.PageManager;
-import org.apache.wiki.providers.WikiPageProvider;
 import org.apache.wiki.render.RenderingManager;
 import org.apache.wiki.util.TextUtil;
 
@@ -167,8 +167,8 @@
     /**
      *  Does a full reference update.  Does not sync; assumes that you do it afterwards.
      */
-    private void updatePageReferences( final WikiPage page ) throws ProviderException {
-        final String content = m_engine.getManager( PageManager.class ).getPageText( page.getName(), WikiPageProvider.LATEST_VERSION );
+    private void updatePageReferences( final Page page ) throws ProviderException {
+        final String content = m_engine.getManager( PageManager.class ).getPageText( page.getName(), PageProvider.LATEST_VERSION );
         final Collection< String > links = scanWikiLinks( page, content );
         final TreeSet< String > res = new TreeSet<>( links );
         final List< Attachment > attachments = m_engine.getManager( AttachmentManager.class ).listAttachments( page );
@@ -186,7 +186,8 @@
      *  @since 2.2
      *  @throws ProviderException If reading of pages fails.
      */
-    @Override public void initialize( final Collection< WikiPage > pages ) throws ProviderException {
+    @Override
+    public void initialize( final Collection< WikiPage > pages ) throws ProviderException {
         log.debug( "Initializing new ReferenceManager with " + pages.size() + " initial pages." );
         final StopWatch sw = new StopWatch();
         sw.start();
@@ -201,16 +202,16 @@
             //  Yes, this is a kludge.  We know.  Will be fixed.
             final long saved = unserializeFromDisk();
 
-            for( final WikiPage page : pages ) {
+            for( final Page page : pages ) {
                 unserializeAttrsFromDisk( page );
             }
 
             //  Now we must check if any of the pages have been changed  while we were in the electronic la-la-land,
             //  and update the references for them.
-            for( final WikiPage page : pages ) {
+            for( final Page page : pages ) {
                 if( !( page instanceof Attachment ) ) {
                     // Refresh with the latest copy
-                    final WikiPage wp = m_engine.getManager( PageManager.class ).getPage( page.getName() );
+                    final Page wp = m_engine.getManager( PageManager.class ).getPage( page.getName() );
 
                     if( wp.getLastModified() == null ) {
                         log.fatal( "Provider returns null lastModified.  Please submit a bug report." );
@@ -314,7 +315,7 @@
     /**
      *  Reads the serialized data from the disk back to memory. Returns the date when the data was last written on disk
      */
-    private synchronized long unserializeAttrsFromDisk( final WikiPage p ) throws IOException, ClassNotFoundException {
+    private synchronized long unserializeAttrsFromDisk( final Page p ) throws IOException, ClassNotFoundException {
         long saved = 0L;
 
         //  Find attribute cache, and check if it exists
@@ -455,7 +456,7 @@
      *  @param page Name of the page to remove from the maps.
      */
     @Override
-    public synchronized void pageRemoved( final WikiPage page ) {
+    public synchronized void pageRemoved( final Page page ) {
         pageRemoved( page.getName() );
     }
 
@@ -506,7 +507,8 @@
      *
      *  @param page wiki page for which references should be updated
      */
-    @Override public void updateReferences( final WikiPage page ) {
+    @Override
+    public void updateReferences( final Page page ) {
         final String pageData = m_engine.getManager( PageManager.class ).getPureText( page.getName(), WikiProvider.LATEST_VERSION );
         updateReferences( page.getName(), scanWikiLinks( page, pageData ) );
     }
@@ -521,7 +523,8 @@
      *  @param page Name of the page to update.
      *  @param references A Collection of Strings, each one pointing to a page this page references.
      */
-    @Override public synchronized void updateReferences( final String page, final Collection< String > references ) {
+    @Override
+    public synchronized void updateReferences( final String page, final Collection< String > references ) {
         internalUpdateReferences( page, references );
         serializeToDisk();
     }
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/references/ReferenceManager.java b/jspwiki-main/src/main/java/org/apache/wiki/references/ReferenceManager.java
index 62de727..6a10adf 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/references/ReferenceManager.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/references/ReferenceManager.java
@@ -72,14 +72,14 @@
      *
      *  @param page Name of the page to remove from the maps.
      */
-    void pageRemoved( final WikiPage page );
+    void pageRemoved( final Page page );
 
     /**
      *  Updates all references for the given page.
      *
      *  @param page wiki page for which references should be updated
      */
-    void updateReferences( final WikiPage page );
+    void updateReferences( final Page page );
 
     /**
      *  Updates the referred pages of a new or edited WikiPage. If a refersTo entry for this page already exists, it is removed
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 0645a12..9578916 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
@@ -25,13 +25,14 @@
 import org.apache.log4j.Logger;
 import org.apache.wiki.StringTransmutator;
 import org.apache.wiki.WikiContext;
-import org.apache.wiki.WikiPage;
+import org.apache.wiki.api.core.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.exceptions.FilterException;
 import org.apache.wiki.api.exceptions.ProviderException;
 import org.apache.wiki.api.exceptions.WikiException;
-import org.apache.wiki.attachment.Attachment;
+import org.apache.wiki.api.providers.PageProvider;
 import org.apache.wiki.attachment.AttachmentManager;
 import org.apache.wiki.event.WikiEvent;
 import org.apache.wiki.event.WikiEventListener;
@@ -42,7 +43,6 @@
 import org.apache.wiki.parser.JSPWikiMarkupParser;
 import org.apache.wiki.parser.MarkupParser;
 import org.apache.wiki.parser.WikiDocument;
-import org.apache.wiki.providers.WikiPageProvider;
 import org.apache.wiki.references.ReferenceManager;
 import org.apache.wiki.util.ClassUtil;
 import org.apache.wiki.util.TextUtil;
@@ -275,7 +275,7 @@
      *  {@inheritDoc}
      */
     @Override
-    public String getHTML( final Context context, final WikiPage page ) {
+    public String getHTML( final Context context, final Page page ) {
         final String pagedata = m_engine.getManager( PageManager.class ).getPureText( page.getName(), page.getVersion() );
         return textToHTML( context, pagedata );
     }
@@ -290,7 +290,7 @@
      */
     @Override
     public String getHTML( final String pagename, final int version ) {
-        final WikiPage page = m_engine.getManager( PageManager.class ).getPage( pagename, version );
+        final Page page = m_engine.getManager( PageManager.class ).getPage( pagename, version );
         final Context context = new WikiContext( m_engine, page );
         context.setRequestContext( WikiContext.NONE );
         return getHTML( context, page );
@@ -447,9 +447,9 @@
                                 log.debug( "Flushing latest version of " + page );
                             }
                             // as there is a new version of the page expire both plugin and pluginless versions of the old page
-                            m_documentCache.remove( page + VERSION_DELIMITER + WikiPageProvider.LATEST_VERSION  + VERSION_DELIMITER + Boolean.FALSE );
-                            m_documentCache.remove( page + VERSION_DELIMITER + WikiPageProvider.LATEST_VERSION  + VERSION_DELIMITER + Boolean.TRUE );
-                            m_documentCache.remove( page + VERSION_DELIMITER + WikiPageProvider.LATEST_VERSION  + VERSION_DELIMITER + null );
+                            m_documentCache.remove( page + VERSION_DELIMITER + PageProvider.LATEST_VERSION  + VERSION_DELIMITER + Boolean.FALSE );
+                            m_documentCache.remove( page + VERSION_DELIMITER + PageProvider.LATEST_VERSION  + VERSION_DELIMITER + Boolean.TRUE );
+                            m_documentCache.remove( page + VERSION_DELIMITER + PageProvider.LATEST_VERSION  + VERSION_DELIMITER + null );
                         }
                     }
                 }
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/render/RenderingManager.java b/jspwiki-main/src/main/java/org/apache/wiki/render/RenderingManager.java
index e1affaf..d049ea7 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/render/RenderingManager.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/render/RenderingManager.java
@@ -20,15 +20,15 @@
 
 import org.apache.log4j.Logger;
 import org.apache.wiki.StringTransmutator;
-import org.apache.wiki.WikiPage;
 import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.core.Engine;
+import org.apache.wiki.api.core.Page;
 import org.apache.wiki.api.exceptions.WikiException;
+import org.apache.wiki.api.providers.PageProvider;
 import org.apache.wiki.event.WikiEventListener;
 import org.apache.wiki.modules.InternalModule;
 import org.apache.wiki.parser.MarkupParser;
 import org.apache.wiki.parser.WikiDocument;
-import org.apache.wiki.providers.WikiPageProvider;
 
 import java.io.IOException;
 import java.util.Properties;
@@ -149,7 +149,7 @@
      *  @param  page WikiPage reference.
      *  @return HTML-rendered version of the page.
      */
-    String getHTML( Context context, WikiPage page );
+    String getHTML( Context context, Page page );
 
     /**
      *  Returns the converted HTML of the page's specific version. The version must be a positive integer, otherwise the current
@@ -189,7 +189,7 @@
      *  @return HTML-rendered version of the page.
      */
     default String getHTML( final String page ) {
-        return getHTML( page, WikiPageProvider.LATEST_VERSION );
+        return getHTML( page, PageProvider.LATEST_VERSION );
     }
 
     /**
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/search/BasicSearchProvider.java b/jspwiki-main/src/main/java/org/apache/wiki/search/BasicSearchProvider.java
index 3d7011f..9bc8b81 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/search/BasicSearchProvider.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/search/BasicSearchProvider.java
@@ -19,18 +19,19 @@
 package org.apache.wiki.search;
 
 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;
 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.search.QueryItem;
+import org.apache.wiki.api.search.SearchResult;
 import org.apache.wiki.attachment.AttachmentManager;
 import org.apache.wiki.auth.AuthorizationManager;
 import org.apache.wiki.auth.permissions.PagePermission;
 import org.apache.wiki.pages.PageManager;
-import org.apache.wiki.providers.WikiPageProvider;
 
 import java.io.IOException;
 import java.util.Collection;
@@ -142,7 +143,7 @@
     private Collection< SearchResult > findPages( final QueryItem[] query, final Context wikiContext ) {
         final TreeSet< SearchResult > res = new TreeSet<>( new SearchResultComparator() );
         final SearchMatcher matcher = new SearchMatcher( m_engine, query );
-        final Collection< WikiPage > allPages;
+        final Collection< Page > allPages;
         try {
             allPages = m_engine.getManager( PageManager.class ).getAllPages();
         } catch( final ProviderException pe ) {
@@ -152,14 +153,14 @@
 
         final AuthorizationManager mgr = m_engine.getManager( AuthorizationManager.class );
 
-        for( final WikiPage page : allPages ) {
+        for( final Page page : allPages ) {
             try {
                 if( page != null ) {
                     final PagePermission pp = new PagePermission( page, PagePermission.VIEW_ACTION );
                     if( wikiContext == null || mgr.checkPermission( wikiContext.getWikiSession(), pp ) ) {
                         final String pageName = page.getName();
                         final String pageContent =
-                                m_engine.getManager( PageManager.class ).getPageText( pageName, WikiPageProvider.LATEST_VERSION ) + attachmentNames( page );
+                                m_engine.getManager( PageManager.class ).getPageText( pageName, PageProvider.LATEST_VERSION ) + attachmentNames( page );
                         final SearchResult comparison = matcher.matchPageContent( pageName, pageContent );
                         if( comparison != null ) {
                             res.add( comparison );
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 33c4368..d261e4d 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
@@ -56,12 +56,13 @@
 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.search.SearchResult;
 import org.apache.wiki.attachment.AttachmentManager;
 import org.apache.wiki.auth.AuthorizationManager;
 import org.apache.wiki.auth.permissions.PagePermission;
 import org.apache.wiki.pages.PageManager;
-import org.apache.wiki.providers.WikiPageProvider;
 import org.apache.wiki.util.ClassUtil;
 import org.apache.wiki.util.FileUtil;
 import org.apache.wiki.util.TextUtil;
@@ -206,8 +207,8 @@
 
                 final Directory luceneDir = new SimpleFSDirectory( dir.toPath() );
                 try( final IndexWriter writer = getIndexWriter( luceneDir ) ) {
-                    final Collection< WikiPage > allPages = m_engine.getManager( PageManager.class ).getAllPages();
-                    for( final WikiPage page : allPages ) {
+                    final Collection< Page > allPages = m_engine.getManager( PageManager.class ).getAllPages();
+                    for( final Page page : allPages ) {
                         try {
                             final String text = m_engine.getManager( PageManager.class ).getPageText( page.getName(), WikiProvider.LATEST_VERSION );
                             luceneIndexPage( page, text, writer );
@@ -499,7 +500,7 @@
                 final int docID = hit.doc;
                 final Document doc = searcher.doc( docID );
                 final String pageName = doc.get( LUCENE_ID );
-                final WikiPage page = m_engine.getManager( PageManager.class ).getPage( pageName, WikiPageProvider.LATEST_VERSION );
+                final Page page = m_engine.getManager( PageManager.class ).getPage( pageName, PageProvider.LATEST_VERSION );
 
                 if( page != null ) {
                     final PagePermission pp = new PagePermission( page, PagePermission.VIEW_ACTION );
@@ -602,18 +603,18 @@
     // FIXME: This class is dumb; needs to have a better implementation
     private static class SearchResultImpl implements SearchResult {
 
-        private WikiPage m_page;
+        private Page m_page;
         private int      m_score;
         private String[] m_contexts;
 
-        public SearchResultImpl( final WikiPage page, final int score, final String[] contexts ) {
+        public SearchResultImpl( final Page page, final int score, final String[] contexts ) {
             m_page = page;
             m_score = score;
             m_contexts = contexts != null ? contexts.clone() : null;
         }
 
         @Override
-        public WikiPage getPage()
+        public Page getPage()
         {
             return m_page;
         }
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 c9db833..e0e4237 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
@@ -20,6 +20,8 @@
 
 import org.apache.wiki.WikiPage;
 import org.apache.wiki.api.core.Engine;
+import org.apache.wiki.api.search.QueryItem;
+import org.apache.wiki.api.search.SearchResult;
 
 import java.io.BufferedReader;
 import java.io.IOException;
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/search/SearchProvider.java b/jspwiki-main/src/main/java/org/apache/wiki/search/SearchProvider.java
index b633e70..3623810 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/search/SearchProvider.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/search/SearchProvider.java
@@ -22,6 +22,7 @@
 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.search.SearchResult;
 
 import java.io.IOException;
 import java.util.Collection;
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/search/SearchResultComparator.java b/jspwiki-main/src/main/java/org/apache/wiki/search/SearchResultComparator.java
index e727c06..cbc4518 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/search/SearchResultComparator.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/search/SearchResultComparator.java
@@ -18,6 +18,8 @@
  */
 package org.apache.wiki.search;
 
+import org.apache.wiki.api.search.SearchResult;
+
 import java.io.Serializable;
 import java.util.Comparator;
 
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 980d01e..48e674e 100644
--- a/jspwiki-main/src/test/java/org/apache/wiki/TestEngine.java
+++ b/jspwiki-main/src/test/java/org/apache/wiki/TestEngine.java
@@ -27,6 +27,7 @@
 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.PageProvider;
 import org.apache.wiki.attachment.Attachment;
 import org.apache.wiki.auth.AuthenticationManager;
 import org.apache.wiki.auth.SessionMonitor;
@@ -36,7 +37,6 @@
 import org.apache.wiki.providers.AbstractFileProvider;
 import org.apache.wiki.providers.BasicAttachmentProvider;
 import org.apache.wiki.providers.FileSystemProvider;
-import org.apache.wiki.providers.WikiPageProvider;
 import org.apache.wiki.util.FileUtil;
 import org.apache.wiki.util.PropertyReader;
 import org.apache.wiki.util.TextUtil;
@@ -408,7 +408,7 @@
      * @return (english) contents corresponding to the given page name.
      */
     public String getI18nHTML( final String pagename ) {
-        final WikiPage page = getPageManager().getPage( pagename, WikiPageProvider.LATEST_VERSION );
+        final WikiPage page = getPageManager().getPage( pagename, PageProvider.LATEST_VERSION );
         final WikiContext context = new WikiContext( this, newHttpRequest(), page );
         context.setRequestContext( WikiContext.NONE );
         return getRenderingManager().getHTML( context, page );
diff --git a/jspwiki-main/src/test/java/org/apache/wiki/plugin/IfPluginTest.java b/jspwiki-main/src/test/java/org/apache/wiki/plugin/IfPluginTest.java
index 1afd5a9..22eaeea 100644
--- a/jspwiki-main/src/test/java/org/apache/wiki/plugin/IfPluginTest.java
+++ b/jspwiki-main/src/test/java/org/apache/wiki/plugin/IfPluginTest.java
@@ -23,11 +23,12 @@
 import org.apache.wiki.WikiContext;
 import org.apache.wiki.WikiPage;
 import org.apache.wiki.WikiSession;
+import org.apache.wiki.api.core.Page;
 import org.apache.wiki.api.core.Session;
 import org.apache.wiki.api.exceptions.WikiException;
+import org.apache.wiki.api.providers.PageProvider;
 import org.apache.wiki.auth.Users;
 import org.apache.wiki.pages.PageManager;
-import org.apache.wiki.providers.WikiPageProvider;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
@@ -48,7 +49,7 @@
      * @return {@link WikiContext} associated to given {@link WikiPage}.
      * @throws WikiException problems while logging in.
      */
-    WikiContext getJanneBasedWikiContextFor( final WikiPage page ) throws WikiException {
+    WikiContext getJanneBasedWikiContextFor( final Page page ) throws WikiException {
         final MockHttpServletRequest request = testEngine.newHttpRequest();
         final Session session =  WikiSession.getWikiSession( testEngine, request );
         testEngine.getAuthenticationManager().login( session, request, Users.JANNE, Users.JANNE_PASS );
@@ -67,7 +68,7 @@
         final String expected = "<p>Content visible for Janne Jalkanen</p>\n";
 
         testEngine.saveText( "Test", src );
-        final WikiPage page = testEngine.getManager( PageManager.class ).getPage( "Test", WikiPageProvider.LATEST_VERSION );
+        final Page page = testEngine.getManager( PageManager.class ).getPage( "Test", PageProvider.LATEST_VERSION );
         final WikiContext context = getJanneBasedWikiContextFor( page );
 
         final String res = testEngine.getRenderingManager().getHTML( context, page );
@@ -86,7 +87,7 @@
         final String expected = "\n";
 
         testEngine.saveText( "Test", src );
-        final WikiPage page = testEngine.getManager( PageManager.class ).getPage( "Test", WikiPageProvider.LATEST_VERSION );
+        final Page page = testEngine.getManager( PageManager.class ).getPage( "Test", PageProvider.LATEST_VERSION );
         final WikiContext context = getJanneBasedWikiContextFor( page );
 
         final String res = testEngine.getRenderingManager().getHTML( context, page );
@@ -104,7 +105,7 @@
         final String expected = "<p>Content visible for 127.0.0.1</p>\n";
 
         testEngine.saveText( "Test", src );
-        final WikiPage page = testEngine.getManager( PageManager.class ).getPage( "Test", WikiPageProvider.LATEST_VERSION );
+        final Page page = testEngine.getManager( PageManager.class ).getPage( "Test", PageProvider.LATEST_VERSION );
         final WikiContext context = getJanneBasedWikiContextFor( page );
 
         final String res = testEngine.getRenderingManager().getHTML( context, page );
@@ -122,7 +123,7 @@
         final String expected = "\n";
 
         testEngine.saveText( "Test", src );
-        final WikiPage page = testEngine.getManager( PageManager.class ).getPage( "Test", WikiPageProvider.LATEST_VERSION );
+        final Page page = testEngine.getManager( PageManager.class ).getPage( "Test", PageProvider.LATEST_VERSION );
         final WikiContext context = getJanneBasedWikiContextFor( page );
 
         final String res = testEngine.getRenderingManager().getHTML( context, page );
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 4a29105..624d7d1 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
@@ -20,12 +20,15 @@
 
 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.search.QueryItem;
-import org.apache.wiki.search.SearchResult;
+import org.apache.wiki.api.providers.PageProvider;
+import org.apache.wiki.api.search.QueryItem;
+import org.apache.wiki.api.search.SearchResult;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import java.util.Properties;
@@ -34,7 +37,7 @@
 /**
  *  A provider who counts the hits to different parts.
  */
-public class CounterProvider implements WikiPageProvider {
+public class CounterProvider implements PageProvider {
 
     public int m_getPageCalls     = 0;
     public int m_pageExistsCalls  = 0;
@@ -72,14 +75,11 @@
     }
 
     @Override
-    public void putPageText( final WikiPage page, final String text )
-        throws ProviderException
-    {
+    public void putPageText( final Page page, final String text ) throws ProviderException {
     }
 
     @Override
-    public boolean pageExists( final String page )
-    {
+    public boolean pageExists( final String page ) {
         m_pageExistsCalls++;
 
         return findPage( page ) != null;
@@ -97,44 +97,33 @@
         return null;
     }
 
-    private WikiPage findPage( final String page )
-    {
-        for( int i = 0; i < m_pages.length; i++ )
-        {
-            if( m_pages[i].getName().equals(page) )
-                return m_pages[i];
+    private Page findPage( final String page ) {
+        for( final WikiPage m_page : m_pages ) {
+            if( m_page.getName().equals( page ) ) {
+                return m_page;
+            }
         }
 
         return null;
     }
 
     @Override
-    public WikiPage getPageInfo( final String page, final int version )
-    {            
+    public Page getPageInfo( final String page, final int version ) {
         m_getPageCalls++;
-
-        final WikiPage p = findPage(page);
-
-        return p;
+        return findPage(page);
     }
 
     @Override
-    public Collection< WikiPage > getAllPages()
-    {
+    public Collection< Page > getAllPages() {
         m_getAllPagesCalls++;
-
-        final List<WikiPage> l = new ArrayList<>();
-
-        for( int i = 0; i < m_pages.length; i++ )
-        {
-            l.add( m_pages[i] );
-        }
+        final List<Page> l = new ArrayList<>();
+        Collections.addAll( l, m_pages );
 
         return l;
     }
 
     @Override
-    public Collection< WikiPage > getAllChangedSince( final Date date )
+    public Collection< Page > getAllChangedSince( final Date date )
     {
         return new ArrayList<>();
     }
@@ -146,35 +135,27 @@
     }
 
     @Override
-    public List< WikiPage > getVersionHistory( final String page )
+    public List< Page > getVersionHistory( final String page )
     {
         return new Vector<>();
     }
 
     @Override
-    public String getPageText( final String page, final int version )
-    {
+    public String getPageText( final String page, final int version ) {
         m_getPageTextCalls++;
         return m_defaultText;
     }
 
     @Override
-    public void deleteVersion( final String page, final int version )
-    {
+    public void deleteVersion( final String page, final int version ) {
     }
 
     @Override
-    public void deletePage( final String page )
-    {
+    public void deletePage( final String page ) {
     }
 
-    /* (non-Javadoc)
-     * @see org.apache.wiki.providers.WikiPageProvider#movePage(java.lang.String, java.lang.String)
-     */
     @Override
-    public void movePage( final String from, final String to ) throws ProviderException
-    {
+    public void movePage( final String from, final String to ) throws ProviderException {
     }
-    
-    
+
 }
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 f7fa810..e91cb08 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
@@ -20,9 +20,11 @@
 
 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.search.QueryItem;
-import org.apache.wiki.search.SearchResult;
+import org.apache.wiki.api.providers.PageProvider;
+import org.apache.wiki.api.search.QueryItem;
+import org.apache.wiki.api.search.SearchResult;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -32,59 +34,45 @@
 import java.util.Vector;
 
 /**
- *  This is a simple provider that is used by some of the tests.  It has some
- *  specific behaviours, like it always contains a single page.
+ *  This is a simple provider that is used by some of the tests.  It has some specific behaviours, like it always contains a single page.
  */
-public class VerySimpleProvider implements WikiPageProvider
-{
+public class VerySimpleProvider implements PageProvider {
+
     /** The last request is stored here. */
     public String m_latestReq = null;
     /** The version number of the last request is stored here. */
     public int    m_latestVers = -123989;
 
-    /**
-     *  This provider has only a single page, when you ask 
-     *  a list of all pages.
-     */
+    /** This provider has only a single page, when you ask a list of all pages. */
     public static final String PAGENAME = "foo";
 
-    /**
-     *  The name of the page list.
-     */
+    /** The name of the page list. */
     public static final String AUTHOR   = "default-author";
     
     private Engine m_engine;
 
     @Override
-    public void initialize( final Engine engine, final Properties props )
-    {
+    public void initialize( final Engine engine, final Properties props ) {
         m_engine = engine;
     }
 
     @Override
-    public String getProviderInfo()
-    {
+    public String getProviderInfo() {
         return "Very Simple Provider.";
     }
 
     @Override
-    public void putPageText( final WikiPage page, final String text )
-        throws ProviderException
-    {
+    public void putPageText( final Page page, final String text ) throws ProviderException {
     }
 
-    /**
-     *  Always returns true.
-     */
+    /** Always returns true. */
     @Override
     public boolean pageExists( final String page )
     {
         return true;
     }
 
-    /**
-     *  Always returns true.
-     */
+    /** Always returns true. */
     @Override
     public boolean pageExists( final String page, final int version )
     {
@@ -104,12 +92,11 @@
      *  Returns always a valid WikiPage.
      */
     @Override
-    public WikiPage getPageInfo( final String page, final int version )
-    {
+    public Page getPageInfo( final String page, final int version ) {
         m_latestReq  = page;
         m_latestVers = version;
 
-        final WikiPage p = new WikiPage( m_engine, page );
+        final Page p = new WikiPage( m_engine, page );
         p.setVersion( 5 );
         p.setAuthor( AUTHOR );
         p.setLastModified( new Date(0L) );
@@ -120,9 +107,8 @@
      *  Returns a single page.
      */
     @Override
-    public Collection< WikiPage > getAllPages()
-    {
-        final List< WikiPage > l = new ArrayList<>();
+    public Collection< Page > getAllPages() {
+        final List< Page > l = new ArrayList<>();
         l.add( getPageInfo( PAGENAME, 5 ) );
         return l;
     }
@@ -131,7 +117,7 @@
      *  Returns the same as getAllPages().
      */
     @Override
-    public Collection< WikiPage > getAllChangedSince( final Date date )
+    public Collection< Page > getAllChangedSince( final Date date )
     {
         return getAllPages();
     }
@@ -149,18 +135,16 @@
      *  Always returns an empty list.
      */
     @Override
-    public List< WikiPage > getVersionHistory( final String page )
+    public List< Page > getVersionHistory( final String page )
     {
         return new Vector<>();
     }
 
     /**
-     *  Stores the page and version into public fields of this class,
-     *  then returns an empty string.
+     *  Stores the page and version into public fields of this class, then returns an empty string.
      */
     @Override
-    public String getPageText( final String page, final int version )
-    {
+    public String getPageText( final String page, final int version ) {
         m_latestReq  = page;
         m_latestVers = version;
 
@@ -168,23 +152,15 @@
     }
 
     @Override
-    public void deleteVersion( final String page, final int version )
-    {
+    public void deleteVersion( final String page, final int version ) {
     }
 
     @Override
-    public void deletePage( final String page )
-    {
+    public void deletePage( final String page ) {
     }
 
-    /* (non-Javadoc)
-     * @see org.apache.wiki.providers.WikiPageProvider#movePage(java.lang.String, java.lang.String)
-     */
     @Override
-    public void movePage( final String from, final String to ) throws ProviderException
-    {
-        // TODO Auto-generated method stub
-        
+    public void movePage( final String from, final String to ) throws ProviderException {
     }
     
 }
