diff --git a/jspwiki-main/src/main/java/org/apache/wiki/search/QueryItem.java b/jspwiki-210-adapters/src/main/java/org/apache/wiki/search/QueryItem.java
similarity index 64%
rename from jspwiki-main/src/main/java/org/apache/wiki/search/QueryItem.java
rename to jspwiki-210-adapters/src/main/java/org/apache/wiki/search/QueryItem.java
index acbb74a..54b6dd7 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/search/QueryItem.java
+++ b/jspwiki-210-adapters/src/main/java/org/apache/wiki/search/QueryItem.java
@@ -21,23 +21,10 @@
 
 /**
  * This simple class just fulfils the role of a container for searches.  It tells the word and whether it is requested or not.
+ *
+ * @deprecated - use {@link org.apache.wiki.api.search.QueryItem} instead
+ * @see org.apache.wiki.api.search.QueryItem
  */
-public class QueryItem {
-	
-    /** The word is required to be in the pages */
-    public static final int REQUIRED  = 1;
-
-    /** The word may NOT be in the pages */
-    public static final int FORBIDDEN = -1;
-
-    /** The word should be in the pages, but the search engine may
-        use its own discretion. */
-    public static final int REQUESTED = 0;
-
-    /** The word that is being searched */
-    public String word;
-
-    /** The type of the word.  See above for types.  The default is REQUESTED. */
-    public int    type = REQUESTED;
-
+@Deprecated
+public class QueryItem extends org.apache.wiki.api.search.QueryItem {
 }
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/search/SearchResult.java b/jspwiki-210-adapters/src/main/java/org/apache/wiki/search/SearchResult.java
similarity index 70%
rename from jspwiki-main/src/main/java/org/apache/wiki/search/SearchResult.java
rename to jspwiki-210-adapters/src/main/java/org/apache/wiki/search/SearchResult.java
index 34b0d88..dbb93ce 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/search/SearchResult.java
+++ b/jspwiki-210-adapters/src/main/java/org/apache/wiki/search/SearchResult.java
@@ -22,9 +22,13 @@
 
 
 /**
- *  Defines a search result.
+ * Defines a search result.
+ *
+ * @deprecated - use {@link org.apache.wiki.api.search.SearchResult} instead
+ * @see org.apache.wiki.api.search.SearchResult
  */
-public interface SearchResult {
+@Deprecated
+public interface SearchResult extends org.apache.wiki.api.search.SearchResult {
     
 	/**
      *  Return the page.
@@ -33,19 +37,4 @@
      */
     WikiPage getPage();
 
-    /**
-     *  Returns the score.
-     *  
-     *  @return A positive score value.  Note that there is no upper limit for the score.
-     */
-    int getScore();
-
-    /**
-     * Collection of XHTML fragments representing some contexts in which the match was made (a.k.a., "snippets").
-     *
-     * @return the search results
-     * @since 2.4
-     */
-    String[] getContexts();
-
 }
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/content/DefaultPageRenamer.java b/jspwiki-main/src/main/java/org/apache/wiki/content/DefaultPageRenamer.java
index c472e45..f412f18 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/content/DefaultPageRenamer.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/content/DefaultPageRenamer.java
@@ -31,7 +31,6 @@
 import org.apache.wiki.event.WikiEventManager;
 import org.apache.wiki.event.WikiPageRenameEvent;
 import org.apache.wiki.pages.PageManager;
-import org.apache.wiki.parser.JSPWikiMarkupParser;
 import org.apache.wiki.parser.MarkupParser;
 import org.apache.wiki.references.ReferenceManager;
 import org.apache.wiki.search.SearchManager;
@@ -181,7 +180,7 @@
             final String sourceText = engine.getManager( PageManager.class ).getPureText( p );
             String newText = replaceReferrerString( context, sourceText, fromPage.getName(), toPage.getName() );
 
-            m_camelCase = TextUtil.getBooleanProperty( engine.getWikiProperties(), JSPWikiMarkupParser.PROP_CAMELCASELINKS, m_camelCase );
+            m_camelCase = TextUtil.getBooleanProperty( engine.getWikiProperties(), MarkupParser.PROP_CAMELCASELINKS, m_camelCase );
             if( m_camelCase ) {
                 newText = replaceCCReferrerString( context, newText, fromPage.getName(), toPage.getName() );
             }
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/parser/JSPWikiMarkupParser.java b/jspwiki-main/src/main/java/org/apache/wiki/parser/JSPWikiMarkupParser.java
index 62e8c71..9aee850 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/parser/JSPWikiMarkupParser.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/parser/JSPWikiMarkupParser.java
@@ -122,16 +122,6 @@
     /** Keep track of duplicate header names.  */
     private Map<String, Integer>   m_titleSectionCounter = new HashMap<>();
 
-    /** If true, consider CamelCase hyperlinks as well. */
-    public static final String     PROP_CAMELCASELINKS   = "jspwiki.translatorReader.camelCaseLinks";
-
-    /** If true, all hyperlinks are translated as well, regardless whether they
-        are surrounded by brackets. */
-    public static final String     PROP_PLAINURIS        = "jspwiki.translatorReader.plainUris";
-
-    /** If true, all outward attachment info links have a small link image appended. */
-    public static final String     PROP_USEATTACHMENTIMAGE = "jspwiki.translatorReader.useAttachmentImage";
-
     /** If true, then considers CamelCase links as well. */
     private boolean                m_camelCaseLinks      = false;
 
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/parser/MarkupParser.java b/jspwiki-main/src/main/java/org/apache/wiki/parser/MarkupParser.java
index b26a29b..26cc20e 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/parser/MarkupParser.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/parser/MarkupParser.java
@@ -81,6 +81,16 @@
     /** If set to "true", all external links are tagged with 'rel="nofollow"' */
     public static final String PROP_USERELNOFOLLOW = "jspwiki.translatorReader.useRelNofollow";
 
+    /** If true, consider CamelCase hyperlinks as well. */
+    public static final String PROP_CAMELCASELINKS = "jspwiki.translatorReader.camelCaseLinks";
+
+    /** If true, all hyperlinks are translated as well, regardless whether they
+     are surrounded by brackets. */
+    public static final String PROP_PLAINURIS = "jspwiki.translatorReader.plainUris";
+
+    /** If true, all outward attachment info links have a small link image appended. */
+    public static final String PROP_USEATTACHMENTIMAGE = "jspwiki.translatorReader.useAttachmentImage";
+
     public static final String HASHLINK = "hashlink";
 
     /** Name of the outlink image; relative path to the JSPWiki directory. */
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/tags/IteratorTag.java b/jspwiki-main/src/main/java/org/apache/wiki/tags/IteratorTag.java
index 9a8dab7..f94929c 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/tags/IteratorTag.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/tags/IteratorTag.java
@@ -57,38 +57,34 @@
      *  
      *  @param arg A Collection which will be iterated.
      */
-    public void setList( final Collection< ? > arg )
-    {
-        if( arg != null )
+    public void setList( final Collection< ? > arg ) {
+        if( arg != null ) {
             m_iterator = arg.iterator();
+        }
     }
 
     /**
      *  Sets the collection list, but using an array.
+     *
      *  @param arg An array of objects which will be iterated.
      */
-    public void setList( final Object[] arg )
-    {
-        if( arg != null )
-        {
+    public void setList( final Object[] arg ) {
+        if( arg != null ) {
             m_iterator = Arrays.asList(arg).iterator();
         }
     }
 
     /**
-     *  Clears the iterator away.  After calling this method doStartTag()
-     *  will always return SKIP_BODY
+     *  Clears the iterator away.  After calling this method doStartTag() will always return SKIP_BODY
      */
-    public void clearList()
-    {
+    public void clearList() {
         m_iterator = null;
     }
     
     /**
      *  Override this method to reset your own iterator.
      */
-    public void resetIterator()
-    {
+    public void resetIterator() {
         // No operation here
     }
     
@@ -96,16 +92,13 @@
      *  {@inheritDoc}
      */
     @Override
-    public int doStartTag()
-    {
+    public int doStartTag() {
         m_wikiContext = WikiContext.findContext(pageContext);
-        
         resetIterator();
-        
-        if( m_iterator == null ) return SKIP_BODY;
-
-        if( m_iterator.hasNext() )
-        {
+        if( m_iterator == null ) {
+            return SKIP_BODY;
+        }
+        if( m_iterator.hasNext() ) {
             buildContext();
         }
 
@@ -115,15 +108,13 @@
     /**
      *  Arg, I hate globals.
      */
-    private void buildContext()
-    {
+    private void buildContext() {
         //
         //  Build a clone of the current context
         //
         final WikiContext context = m_wikiContext.clone();
         
         final Object o = m_iterator.next();
-        
         if( o instanceof WikiPage ) {
             context.setPage( (WikiPage)o );
         }
@@ -139,8 +130,7 @@
      *  {@inheritDoc}
      */
     @Override
-    public int doEndTag()
-    {
+    public int doEndTag() {
         // Return back to the original.
         pageContext.setAttribute( Context.ATTR_CONTEXT, m_wikiContext, PageContext.REQUEST_SCOPE );
 
@@ -151,25 +141,19 @@
      *  {@inheritDoc}
      */
     @Override
-    public int doAfterBody()
-    {
-        if( bodyContent != null )
-        {
-            try
-            {
+    public int doAfterBody() {
+        if( bodyContent != null ) {
+            try {
                 final JspWriter out = getPreviousOut();
-                out.print(bodyContent.getString());
+                out.print( bodyContent.getString() );
                 bodyContent.clearBody();
-            }
-            catch( final IOException e )
-            {
-                log.error("Unable to get inner tag text", e);
+            } catch( final IOException e ) {
+                log.error( "Unable to get inner tag text", e );
                 // FIXME: throw something?
             }
         }
 
-        if( m_iterator != null && m_iterator.hasNext() )
-        {
+        if( m_iterator != null && m_iterator.hasNext() ) {
             buildContext();
             return EVAL_BODY_BUFFERED;
         }
@@ -178,29 +162,23 @@
     }
     
     /**
-     *  In case your tag throws an exception at any point, you can
-     *  override this method and implement a custom exception handler.
+     *  In case your tag throws an exception at any point, you can override this method and implement a custom exception handler.
      *  <p>
      *  By default, this handler does nothing.
      *  
      *  @param arg0 The Throwable that the tag threw
-     *  
      *  @throws Throwable I have no idea why this would throw anything
      */
     @Override
-    public void doCatch( final Throwable arg0) throws Throwable
-    {
+    public void doCatch( final Throwable arg0) throws Throwable {
     }
 
     /**
-     *  Executed after the tag has been finished.  This is a great place
-     *  to put any cleanup code.  However you <b>must</b> call super.doFinally()
-     *  if you override this method, or else some of the things may not
-     *  work as expected.
+     *  Executed after the tag has been finished.  This is a great place to put any cleanup code.  However you <b>must</b> call
+     *  super.doFinally() if you override this method, or else some of the things may not work as expected.
      */
     @Override
-    public void doFinally()
-    {
+    public void doFinally() {
         resetIterator();
         m_iterator = null;
         m_pageName = null;
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/tags/SearchResultIteratorInfo.java b/jspwiki-main/src/main/java/org/apache/wiki/tags/SearchResultIteratorInfo.java
index 50e4eb5..143f5e5 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/tags/SearchResultIteratorInfo.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/tags/SearchResultIteratorInfo.java
@@ -18,26 +18,26 @@
  */
 package org.apache.wiki.tags;
 
-import javax.servlet.jsp.tagext.TagExtraInfo;
 import javax.servlet.jsp.tagext.TagData;
+import javax.servlet.jsp.tagext.TagExtraInfo;
 import javax.servlet.jsp.tagext.VariableInfo;
 
+
 /**
  *  Just provides the TEI data for IteratorTag.
  *
  *  @since 2.0
  */
-public class SearchResultIteratorInfo extends TagExtraInfo
-{
-    public VariableInfo[] getVariableInfo(TagData data)
-    {
-        VariableInfo[] var = { new VariableInfo( data.getAttributeString( "id" ),
-                                                 "org.apache.wiki.search.SearchResult",
-                                                 true,
-                                                 VariableInfo.NESTED )
+public class SearchResultIteratorInfo extends TagExtraInfo {
+
+    public VariableInfo[] getVariableInfo( final TagData data ) {
+        final VariableInfo[] var = { new VariableInfo( data.getAttributeString( "id" ),
+                                                      "org.apache.wiki.api.search.SearchResult",
+                                                      true,
+                                                       VariableInfo.NESTED )
         };
 
         return var;
-
     }
+
 }
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/tags/SearchResultIteratorTag.java b/jspwiki-main/src/main/java/org/apache/wiki/tags/SearchResultIteratorTag.java
index ee247fd..144b2ee 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/tags/SearchResultIteratorTag.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/tags/SearchResultIteratorTag.java
@@ -23,7 +23,7 @@
 import org.apache.wiki.api.core.Command;
 import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.core.Engine;
-import org.apache.wiki.search.SearchResult;
+import org.apache.wiki.api.search.SearchResult;
 import org.apache.wiki.ui.PageCommand;
 
 import javax.servlet.http.HttpServletRequest;
@@ -53,8 +53,8 @@
     
     private static final Logger log = Logger.getLogger(SearchResultIteratorTag.class);
     
-    @Override public void release()
-    {
+    @Override
+    public void release() {
         super.release();
         m_maxItems = m_count = 0;
     }
@@ -69,7 +69,8 @@
         m_start = arg;
     }
     
-    @Override public final int doStartTag() {
+    @Override
+    public final int doStartTag() {
         //  Do lazy eval if the search results have not been set.
         if( m_iterator == null ) {
             final Collection< ? > searchresults = (Collection< ? >)pageContext.getAttribute( "searchresults", PageContext.REQUEST_SCOPE );
@@ -79,11 +80,13 @@
             
             //  Skip the first few ones...
             m_iterator = searchresults.iterator();
-            while( m_iterator.hasNext() && (skip++ < m_start) ) m_iterator.next();
+            while( m_iterator.hasNext() && (skip++ < m_start) ) {
+                m_iterator.next();
+            }
         }
 
         m_count = 0;
-        m_wikiContext = (WikiContext) pageContext.getAttribute( WikiContext.ATTR_CONTEXT, PageContext.REQUEST_SCOPE );
+        m_wikiContext = ( WikiContext )pageContext.getAttribute( WikiContext.ATTR_CONTEXT, PageContext.REQUEST_SCOPE );
 
         return nextResult();
     }
@@ -108,7 +111,8 @@
         return SKIP_BODY;
     }
 
-    @Override public int doAfterBody() {
+    @Override
+    public int doAfterBody() {
         if( bodyContent != null ) {
             try {
                 final JspWriter out = getPreviousOut();
@@ -123,7 +127,8 @@
         return nextResult();
     }
 
-    @Override public int doEndTag() {
+    @Override
+    public int doEndTag() {
         m_iterator = null;
         return super.doEndTag();
     }
