diff --git a/jspwiki-main/src/main/java/org/apache/wiki/api/filters/BasicPageFilter.java b/jspwiki-main/src/main/java/org/apache/wiki/api/filters/BasicPageFilter.java
index 1234000..1462067 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/api/filters/BasicPageFilter.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/api/filters/BasicPageFilter.java
@@ -18,73 +18,28 @@
  */
 package org.apache.wiki.api.filters;
 
-import java.util.Properties;
-
-import org.apache.wiki.WikiContext;
-import org.apache.wiki.WikiEngine;
+import org.apache.wiki.api.core.Engine;
 import org.apache.wiki.api.exceptions.FilterException;
 
+import java.util.Properties;
+
+
 /**
- *  Provides a base implementation of a PageFilter.  None of the callbacks
- *  do anything, so it is a good idea for you to extend from this class
- *  and implement only methods that you need.
- *
+ * Provides a base implementation of a PageFilter.  None of the callbacks do anything, so it is a good idea for you to extend from this
+ * class and implement only methods that you need.
  */
-public class BasicPageFilter
-    implements PageFilter
-{
-    protected WikiEngine m_engine;
-  
+public class BasicPageFilter implements PageFilter {
+
+    protected Engine m_engine;
+
     /**
-     *  If you override this, you should call super.initialize() first.
-     *  
-     *  {@inheritDoc}
+     * If you override this, you should call super.initialize() first.
+     *
+     * {@inheritDoc}
      */
-    public void initialize( WikiEngine engine, Properties properties )
-        throws FilterException
-    {
+    @Override
+    public void initialize( final Engine engine, final Properties properties ) throws FilterException {
         m_engine = engine;
     }
 
-    /**
-     *  {@inheritDoc}
-     */
-    public String preTranslate( WikiContext wikiContext, String content )
-        throws FilterException
-    {
-        return content;
-    }
-
-    /**
-     *  {@inheritDoc}
-     */
-    public String postTranslate( WikiContext wikiContext, String htmlContent )
-        throws FilterException
-    {
-        return htmlContent;
-    }
-
-    /**
-     *  {@inheritDoc}
-     */
-    public String preSave( WikiContext wikiContext, String content )
-        throws FilterException
-    {
-        return content;
-    }
-
-    /**
-     *  {@inheritDoc}
-     */
-    public void postSave( WikiContext wikiContext, String content )
-        throws FilterException
-    {
-    }
-    
-    /**
-     *  {@inheritDoc}
-     */
-    public void destroy( WikiEngine engine ) 
-    {
-    }
 }
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/api/filters/PageFilter.java b/jspwiki-main/src/main/java/org/apache/wiki/api/filters/PageFilter.java
index 3354240..26d9008 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/api/filters/PageFilter.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/api/filters/PageFilter.java
@@ -18,72 +18,62 @@
  */
 package org.apache.wiki.api.filters;
 
-import java.util.Properties;
-
 import org.apache.wiki.WikiContext;
-import org.apache.wiki.WikiEngine;
+import org.apache.wiki.api.core.Engine;
 import org.apache.wiki.api.exceptions.FilterException;
 
+import java.util.Properties;
+
+
 /**
- *  Provides a definition for a page filter.  A page filter is a class
- *  that can be used to transform the WikiPage content being saved or
+ *  Provides a definition for a page filter.  A page filter is a class that can be used to transform the WikiPage content being saved or
  *  being loaded at any given time.
  *  <p>
- *  Note that the WikiContext.getPage() method always returns the context
- *  in which text is rendered, i.e. the original request.  Thus the content
- *  may actually be different content than what what the wikiContext.getPage()
- *  implies!  This happens often if you are for example including multiple
- *  pages on the same page.
+ *  Note that the WikiContext.getPage() method always returns the context in which text is rendered, i.e. the original request.  Thus the
+ *  content may actually be different content than what what the wikiContext.getPage() implies!  This happens often if you are for example
+ *  including multiple pages on the same page.
  *  <p>
- *  PageFilters must be thread-safe!  There is only one instance of each PageFilter 
- *  per each WikiEngine invocation.  If you need to store data persistently, use
- *  VariableManager, or WikiContext.
+ *  PageFilters must be thread-safe!  There is only one instance of each PageFilter per each Engine invocation.  If you need to store data
+ *  persistently, use VariableManager, or WikiContext.
  *  <p>
- *  As of 2.5.30, initialize() gains access to the WikiEngine.
- *
+ *  As of 2.5.30, initialize() gains access to the Engine.
  */
-public interface PageFilter
-{
+public interface PageFilter {
+
     /**
-     *  Is called whenever the a new PageFilter is instantiated and
-     *  reset.
+     *  Is called whenever the a new PageFilter is instantiated and reset.
      *  
      *  @param engine The WikiEngine whic owns this PageFilter
      *  @param properties The properties ripped from filters.xml.
-     *  @throws FilterException If the filter could not be initialized. If this is thrown,
-     *                          the filter is not added to the internal queues.
+     *  @throws FilterException If the filter could not be initialized. If this is thrown, the filter is not added to the internal queues.
      */
-    void initialize( WikiEngine engine, Properties properties )
-        throws FilterException;
+    void initialize( Engine engine, Properties properties ) throws FilterException;
 
     /**
-     *  This method is called whenever a page has been loaded from the provider,
-     *  but not yet been sent through the markup-translation process.  Note that you cannot
-     *  do HTML translation here, because it will be escaped.
+     *  This method is called whenever a page has been loaded from the provider, but not yet been sent through the markup-translation
+     *  process.  Note that you cannot do HTML translation here, because it will be escaped.
      *
      *  @param wikiContext The current wikicontext.
-     *  @param content     WikiMarkup.
+     *  @param content WikiMarkup.
      *  @return The modified wikimarkup content.
-     *  @throws FilterException If something goes wrong.  Throwing this causes the entire page
-     *                          processing to be abandoned.
+     *  @throws FilterException If something goes wrong.  Throwing this causes the entire page processing to be abandoned.
      */
-    String preTranslate( WikiContext wikiContext, String content )
-        throws FilterException;
+    default String preTranslate( final WikiContext wikiContext, final String content ) throws FilterException {
+        return content;
+    }
 
     /**
-     *  This method is called after a page has been fed through the translation process,
-     *  so anything you are seeing here is translated content.  If you want to
-     *  do any of your own WikiMarkup2HTML translation, do it here.
+     *  This method is called after a page has been fed through the translation process, so anything you are seeing here is translated
+     *  content.  If you want to do any of your own WikiMarkup2HTML translation, do it here.
      *  
      *  @param wikiContext The WikiContext.
      *  @param htmlContent The translated HTML
      *  @return The modified HTML
-     *  
-     *  @throws FilterException If something goes wrong.  Throwing this causes the entire page
-     *                          processing to be abandoned.
+     *  @throws FilterException If something goes wrong.  Throwing this causes the entire page processing to be abandoned.
      */
-    String postTranslate( WikiContext wikiContext, String htmlContent )
-        throws FilterException;
+    default String postTranslate( final WikiContext wikiContext, final String htmlContent ) throws FilterException {
+        return htmlContent;
+    }
 
     /**
      *  This method is called before the page has been saved to the PageProvider.
@@ -91,35 +81,31 @@
      *  @param wikiContext The WikiContext
      *  @param content The wikimarkup that the user just wanted to save.
      *  @return The modified wikimarkup
-     *  @throws FilterException If something goes wrong.  Throwing this causes the entire page
-     *                          processing to be abandoned.
+     *  @throws FilterException If something goes wrong.  Throwing this causes the entire page processing to be abandoned.
      */
-    String preSave( WikiContext wikiContext, String content )
-        throws FilterException;
+    default String preSave( final WikiContext wikiContext, final String content ) throws FilterException {
+        return content;
+    }
 
     /**
-     *  This method is called after the page has been successfully saved.
-     *  If the saving fails for any reason, then this method will not
+     *  This method is called after the page has been successfully saved. If the saving fails for any reason, then this method will not
      *  be called.
      *  <p>
-     *  Since the result is discarded from this method, this is only useful
-     *  for things like counters, etc.
+     *  Since the result is discarded from this method, this is only useful for things like counters, etc.
      *  
      *  @param wikiContext The WikiContext
      *  @param content The content which was just stored.
-     *  @throws FilterException If something goes wrong.  As the page is already saved,
-     *                          This is just logged.
+     *  @throws FilterException If something goes wrong.  As the page is already saved, This is just logged.
      */
-    void postSave( WikiContext wikiContext, String content )
-        throws FilterException;
+    default void postSave( final WikiContext wikiContext, final String content ) throws FilterException {}
 
     /**
      *  Called for every filter, e.g. on wiki engine shutdown. Use this if you have to 
      *  clean up or close global resources you allocated in the initialize() method.
      * 
-     *  @param engine The WikiEngine which owns this filter.
+     *  @param engine The Engine which owns this filter.
      *  @since 2.5.36
      */
-    void destroy( WikiEngine engine );
+    default void destroy( final Engine engine ) {}
 
 }
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/filters/CreoleFilter.java b/jspwiki-main/src/main/java/org/apache/wiki/filters/CreoleFilter.java
index 9e8fab4..43b678f 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/filters/CreoleFilter.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/filters/CreoleFilter.java
@@ -20,7 +20,7 @@
 
 import org.apache.log4j.Logger;
 import org.apache.wiki.WikiContext;
-import org.apache.wiki.WikiEngine;
+import org.apache.wiki.api.core.Engine;
 import org.apache.wiki.api.exceptions.FilterException;
 import org.apache.wiki.api.filters.BasicPageFilter;
 import org.apache.wiki.parser.CreoleToJSPWikiTranslator;
@@ -28,26 +28,19 @@
 import java.util.Properties;
 
 /**
- * <p>Provides the Implementation for mixed mode creole: If you activate
- * this filter, it will translate all markup that was saved as creole
- * markup to JSPWiki markup. Therefore the files will be saved 
- * with mixed markup.
+ * <p>Provides the Implementation for mixed mode creole: If you activate this filter, it will translate all markup that was saved as creole
+ * markup to JSPWiki markup. Therefore the files will be saved with mixed markup.
  * <p>
- * <b>WARNING</b>: There's no turning back after installing this
- * filter. Since your wiki pages are saved in Creole markup you can
+ * <b>WARNING</b>: There's no turning back after installing this filter. Since your wiki pages are saved in Creole markup you can
  * not deactivate it afterwards.
  * <p>
- * <b>WARNING</b>: This feature is completely experimental, and is known to be
- * broken.  Use at your own risk.
+ * <b>WARNING</b>: This feature is completely experimental, and is known to be broken.  Use at your own risk.
  * <p>
- * <b>WARNING</b>: The CreoleFilter feature is deprecated.  JSPWiki is likely
- * to implement a non-mixed mode Creole at some point, since turning on
- * Creole will make new pages obsolete.
- * 
- * 
+ * <b>WARNING</b>: The CreoleFilter feature is deprecated.  JSPWiki is likely to implement a non-mixed mode Creole at some point, since
+ * turning on Creole will make new pages obsolete.
+ *
  * @see <a href="http://www.wikicreole.org/wiki/MixedMode">[[WikiCreole:MixedMode]]</a> 
  */
-
 public class CreoleFilter extends BasicPageFilter {
     
     private static final Logger log = Logger.getLogger(CreoleFilter.class);
@@ -55,18 +48,19 @@
     /**
      *  {@inheritDoc}
      */
-    public void initialize(WikiEngine engine, Properties props) throws FilterException {
+    @Override public void initialize( final Engine engine, final Properties props ) throws FilterException {
     }
 
     /**
      *  {@inheritDoc}
      */
-    public String preSave( WikiContext wikiContext, String content ) {
+    @Override
+    public String preSave( final WikiContext wikiContext, final String content ) {
         try {
-            String username=wikiContext.getCurrentUser().getName();
-            Properties prop = wikiContext.getEngine().getWikiProperties();
+            final String username = wikiContext.getCurrentUser().getName();
+            final Properties prop = wikiContext.getEngine().getWikiProperties();
             return new CreoleToJSPWikiTranslator().translateSignature(prop, content,username);
-        } catch(Exception e ) {
+        } catch( final Exception e ) {
             log.error( e.getMessage(), e );
             return e.getMessage();
         }
@@ -75,11 +69,12 @@
     /**
      *  {@inheritDoc}
      */
-    public String preTranslate(WikiContext wikiContext, String content) {
+    @Override
+    public String preTranslate( final WikiContext wikiContext, final String content ) {
         try {
-            Properties prop = wikiContext.getEngine().getWikiProperties();
+            final Properties prop = wikiContext.getEngine().getWikiProperties();
             return new CreoleToJSPWikiTranslator().translate(prop ,content);
-        } catch (Exception e) {
+        } catch( final Exception e ) {
             log.error( e.getMessage(), e );
             return content
                    + "\n \n %%error \n"
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/filters/PingWeblogsComFilter.java b/jspwiki-main/src/main/java/org/apache/wiki/filters/PingWeblogsComFilter.java
index 6e1bfe6..fbfdeb9 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/filters/PingWeblogsComFilter.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/filters/PingWeblogsComFilter.java
@@ -20,7 +20,6 @@
 
 import org.apache.log4j.Logger;
 import org.apache.wiki.WikiContext;
-import org.apache.wiki.WikiEngine;
 import org.apache.wiki.api.core.Engine;
 import org.apache.wiki.api.filters.BasicPageFilter;
 import org.apache.xmlrpc.AsyncCallback;
@@ -53,14 +52,16 @@
     /**
      *  {@inheritDoc}
      */
-    @Override public void initialize( final WikiEngine engine, final Properties props ) {
+    @Override
+    public void initialize( final Engine engine, final Properties props ) {
         m_pingURL = props.getProperty( PROP_PINGURL, "http://rpc.weblogs.com/RPC2" );
     }
 
     /**
      *  {@inheritDoc}
      */
-    @Override public void postSave( final WikiContext context, final String pagecontent ) {
+    @Override
+    public void postSave( final WikiContext context, final String pagecontent ) {
         String blogName = context.getPage().getName();
         final Engine engine   = context.getEngine();
 
@@ -87,22 +88,24 @@
 
             xmlrpc.executeAsync("weblogUpdates.ping", params, 
                                 new AsyncCallback() {
-                                    @Override public void handleError( final Exception ex, final URL url, final String method ) {
+                                    @Override
+                                    public void handleError( final Exception ex, final URL url, final String method ) {
                                         log.error( "Unable to execute weblogs.com ping to URL: " + url.toString(), ex );
                                     }
 
-                                    @Override public void handleResult( final Object result, final URL url, final String method ) {
+                                    @Override
+                                    public void handleResult( final Object result, final URL url, final String method ) {
                                         @SuppressWarnings("unchecked")
                                         final Hashtable< String, Object > res = (Hashtable < String, Object > ) result;
 
-                                        final Boolean flerror = (Boolean)res.get("flerror");
-                                        final String  msg     = (String)res.get("message");
+                                        final Boolean flerror = ( Boolean )res.get( "flerror" );
+                                        final String  msg     = ( String )res.get( "message" );
 
                                         if( flerror ) {
-                                            log.error("Failed to ping: "+msg);
+                                            log.error( "Failed to ping: " + msg );
                                         }
 
-                                        log.info("Weblogs.com has been pinged.");
+                                        log.info( "Weblogs.com has been pinged." );
                                     }
                                 }
                                 );
@@ -110,4 +113,5 @@
             log.error("Malformed URL",e);
         }
     }
+
 }
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/filters/SpamFilter.java b/jspwiki-main/src/main/java/org/apache/wiki/filters/SpamFilter.java
index 0175d6c..109eb6f 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/filters/SpamFilter.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/filters/SpamFilter.java
@@ -30,7 +30,6 @@
 import org.apache.oro.text.regex.Perl5Matcher;
 import org.apache.wiki.InternalWikiException;
 import org.apache.wiki.WikiContext;
-import org.apache.wiki.WikiEngine;
 import org.apache.wiki.WikiPage;
 import org.apache.wiki.WikiProvider;
 import org.apache.wiki.api.core.Engine;
@@ -250,26 +249,20 @@
      *  {@inheritDoc}
      */
     @Override
-    public void initialize( final WikiEngine engine, final Properties properties ) {
+    public void initialize( final Engine engine, final Properties properties ) {
         m_forbiddenWordsPage = properties.getProperty( PROP_WORDLIST, m_forbiddenWordsPage );
         m_forbiddenIPsPage = properties.getProperty( PROP_IPLIST, m_forbiddenIPsPage);
         m_pageNameMaxLength = properties.getProperty( PROP_MAX_PAGENAME_LENGTH, m_pageNameMaxLength);
         m_errorPage = properties.getProperty( PROP_ERRORPAGE, m_errorPage );
-        m_limitSinglePageChanges = TextUtil.getIntegerProperty( properties,
-                                                                PROP_PAGECHANGES,
-                                                                m_limitSinglePageChanges );
+        m_limitSinglePageChanges = TextUtil.getIntegerProperty( properties, PROP_PAGECHANGES, m_limitSinglePageChanges );
         
-        m_limitSimilarChanges = TextUtil.getIntegerProperty( properties,
-                                                             PROP_SIMILARCHANGES,
-                                                             m_limitSimilarChanges );
+        m_limitSimilarChanges = TextUtil.getIntegerProperty( properties, PROP_SIMILARCHANGES, m_limitSimilarChanges );
 
         m_maxUrls = TextUtil.getIntegerProperty( properties, PROP_MAXURLS, m_maxUrls );
         m_banTime = TextUtil.getIntegerProperty( properties, PROP_BANTIME, m_banTime );
         m_blacklist = properties.getProperty( PROP_BLACKLIST, m_blacklist );
 
-        m_ignoreAuthenticated = TextUtil.getBooleanProperty( properties,
-                                                             PROP_IGNORE_AUTHENTICATED,
-                                                             m_ignoreAuthenticated );
+        m_ignoreAuthenticated = TextUtil.getBooleanProperty( properties, PROP_IGNORE_AUTHENTICATED, m_ignoreAuthenticated );
 
         m_useCaptcha = properties.getProperty( PROP_CAPTCHA, "" ).equals("asirra");
 
@@ -280,18 +273,11 @@
             throw new InternalWikiException( "Faulty pattern." , e);
         }
 
-        m_akismetAPIKey = TextUtil.getStringProperty( properties,
-                                                      PROP_AKISMET_API_KEY,
-                                                      m_akismetAPIKey );
-
-        m_stopAtFirstMatch = TextUtil.getStringProperty( properties,
-                                                         PROP_FILTERSTRATEGY,
-                                                         STRATEGY_EAGER ).equals( STRATEGY_EAGER );
+        m_akismetAPIKey = TextUtil.getStringProperty( properties, PROP_AKISMET_API_KEY, m_akismetAPIKey );
+        m_stopAtFirstMatch = TextUtil.getStringProperty( properties, PROP_FILTERSTRATEGY, STRATEGY_EAGER ).equals( STRATEGY_EAGER );
 
         log.info( "# Spam filter initialized.  Temporary ban time " + m_banTime +
                   " mins, max page changes/minute: " + m_limitSinglePageChanges );
-
-
     }
 
     private static final int REJECT = 0;
@@ -327,7 +313,8 @@
     }
 
     /** {@inheritDoc} */
-    @Override public String preSave( final WikiContext context, final String content ) throws RedirectException {
+    @Override
+    public String preSave( final WikiContext context, final String content ) throws RedirectException {
         cleanBanList();
         refreshBlacklists( context );
         final Change change = getChange( context, content );
@@ -473,35 +460,25 @@
             for( final Iterator< Host > i = m_lastModifications.iterator(); i.hasNext(); ) {
                 final Host host = i.next();
 
-                //
                 //  Check if this item is invalid
-                //
                 if( host.getAddedTime() < time ) {
                     log.debug( "Removed host " + host.getAddress() + " from modification queue (expired)" );
                     i.remove();
                     continue;
                 }
 
-                //
                 // Check if this IP address has been seen before
-                //
-
                 if( host.getAddress().equals( addr ) ) {
                     hostCounter++;
                 }
 
-                //
                 //  Check, if this change has been seen before
-                //
-
                 if( host.getChange() != null && host.getChange().equals( change ) ) {
                     changeCounter++;
                 }
             }
 
-            //
             //  Now, let's check against the limits.
-            //
             if( hostCounter >= m_limitSinglePageChanges ) {
                 final Host host = new Host( addr, null );
                 m_temporaryBanList.add( host );
@@ -520,11 +497,9 @@
                 checkStrategy( context, REASON_SIMILAR_MODIFICATIONS, "Herb says you look like a spammer, and I trust Herb! (Incident code "+uid+")");
             }
 
-            //
             //  Calculate the number of links in the addition.
-            //
             String tstChange  = change.toString();
-            int    urlCounter = 0;
+            int urlCounter = 0;
             while( m_matcher.contains( tstChange,m_urlPattern ) ) {
                 final MatchResult m = m_matcher.getMatch();
                 tstChange = tstChange.substring( m.endOffset(0) );
@@ -540,20 +515,13 @@
                 checkStrategy( context, REASON_TOO_MANY_URLS, "Herb says you look like a spammer, and I trust Herb! (Incident code " + uid + ")" );
             }
 
-            //
             //  Check bot trap
-            //
             checkBotTrap( context, change );
 
-            //
             //  Check UTF-8 mangling
-            //
             checkUTF8( context, change );
 
-            //
-            //  Do Akismet check.  This is good to be the last, because this is the most
-            //  expensive operation.
-            //
+            //  Do Akismet check.  This is good to be the last, because this is the most expensive operation.
             checkAkismet( context, change );
 
             m_lastModifications.add( new Host( addr, change ) );
@@ -583,10 +551,7 @@
 
             final HttpServletRequest req = context.getHttpRequest();
 
-            //
-            //  Akismet will mark all empty statements as spam, so we'll just
-            //  ignore them.
-            //
+            //  Akismet will mark all empty statements as spam, so we'll just ignore them.
             if( change.m_adds == 0 && change.m_removals > 0 ) {
                 return;
             }
@@ -607,15 +572,15 @@
                 final String commentAuthorURL   = null;
 
                 final boolean isSpam = m_akismet.commentCheck( ipAddress,
-                                                         userAgent,
-                                                         referrer,
-                                                         permalink,
-                                                         commentType,
-                                                         commentAuthor,
-                                                         commentAuthorEmail,
-                                                         commentAuthorURL,
-                                                         change.toString(),
-                                                         null );
+                                                               userAgent,
+                                                               referrer,
+                                                               permalink,
+                                                               commentType,
+                                                               commentAuthor,
+                                                               commentAuthorEmail,
+                                                               commentAuthorURL,
+                                                               change.toString(),
+                                                               null );
 
                 sw.stop();
                 log.debug( "Akismet request done in: " + sw );
@@ -650,7 +615,6 @@
      */
     private void checkBotTrap( final WikiContext context, final Change change ) throws RedirectException {
         final HttpServletRequest request = context.getHttpRequest();
-
         if( request != null ) {
             final String unspam = request.getParameter( getBotFieldName() );
             if( unspam != null && unspam.length() > 0 ) {
@@ -664,10 +628,8 @@
 
     private void checkUTF8( final WikiContext context, final Change change ) throws RedirectException {
         final HttpServletRequest request = context.getHttpRequest();
-
         if( request != null ) {
             final String utf8field = request.getParameter( "encodingcheck" );
-
             if( utf8field != null && !utf8field.equals( "\u3041" ) ) {
                 final String uid = log( context, REJECT, REASON_UTF8_TRAP, change.toString() );
 
@@ -680,7 +642,6 @@
     /** Goes through the ban list and cleans away any host which has expired from it. */
     private synchronized void cleanBanList() {
         final long now = System.currentTimeMillis();
-
         for( final Iterator< Host > i = m_temporaryBanList.iterator(); i.hasNext(); ) {
             final Host host = i.next();
 
@@ -723,12 +684,9 @@
      */
     private void refreshBlacklists( final WikiContext context ) {
         try {
-
             boolean rebuild = false;
 
-            //
             //  Rebuild, if the spam words page, the attachment or the IP ban page has changed since.
-            //
             final WikiPage sourceSpam = context.getEngine().getManager( PageManager.class ).getPage( m_forbiddenWordsPage );
             if( sourceSpam != null ) {
                 if( m_spamPatterns == null || m_spamPatterns.isEmpty() || sourceSpam.getLastModified().after( m_lastRebuild ) ) {
@@ -750,10 +708,7 @@
                 }
             }
 
-            //
-            //  Do the actual rebuilding.  For simplicity's sake, we always rebuild the complete
-            //  filter list regardless of what changed.
-            //
+            //  Do the actual rebuilding.  For simplicity's sake, we always rebuild the complete filter list regardless of what changed.
             if( rebuild ) {
                 m_lastRebuild = new Date();
                 m_spamPatterns = parseWordList( sourceSpam, ( sourceSpam != null ) ? sourceSpam.getAttribute( LISTVAR ) : null );
@@ -788,10 +743,7 @@
      *  @throws RedirectException
      */
     private void checkPatternList( final WikiContext context, final String content, final Change change ) throws RedirectException {
-        //
-        //  If we have no spam patterns defined, or we're trying to save
-        //  the page containing the patterns, just return.
-        //
+        // If we have no spam patterns defined, or we're trying to save the page containing the patterns, just return.
         if( m_spamPatterns == null || context.getPage().getName().equals( m_forbiddenWordsPage ) ) {
             return;
         }
@@ -805,9 +757,7 @@
             // log.debug("Attempting to match page contents with "+p.getPattern());
 
             if( m_matcher.contains( ch, p ) ) {
-                //
                 //  Spam filter has a match.
-                //
                 final String uid = log( context, REJECT, REASON_REGEXP + "(" + p.getPattern() + ")", ch );
 
                 log.info( "SPAM:Regexp (" + uid + "). Content matches the spam filter '" + p.getPattern() + "'" );
@@ -824,10 +774,7 @@
      *  @throws RedirectException
      */
     private void checkIPList( final WikiContext context ) throws RedirectException {
-        //
-        //  If we have no IP patterns defined, or we're trying to save
-        //  the page containing the IP patterns, just return.
-        //
+        //  If we have no IP patterns defined, or we're trying to save the page containing the IP patterns, just return.
         if( m_IPPatterns == null || context.getPage().getName().equals( m_forbiddenIPsPage ) ) {
             return;
         }
@@ -900,19 +847,14 @@
             log.error( "Diff failed", e );
         }
 
-        //
         //  Don't forget to include the change note, too
-        //
         final String changeNote = page.getAttribute( WikiPage.CHANGENOTE );
-
         if( changeNote != null ) {
             change.append( "\r\n" );
             change.append( changeNote );
         }
 
-        //
         //  And author as well
-        //
         if( page.getAuthor() != null ) {
             change.append( "\r\n" + page.getAuthor() );
         }
@@ -951,7 +893,6 @@
     private static String getUniqueID() {
         final StringBuilder sb = new StringBuilder();
         final Random rand = new Random();
-
         for( int i = 0; i < 6; i++ ) {
             final char x = ( char )( 'A' + rand.nextInt( 26 ) );
             sb.append( x );
@@ -968,7 +909,7 @@
      */
     private String getRedirectPage( final WikiContext ctx ) {
         if( m_useCaptcha ) {
-            return ctx.getURL( WikiContext.NONE, "Captcha.jsp", "page="+ctx.getEngine().encodeName( ctx.getPage().getName() ) );
+            return ctx.getURL( WikiContext.NONE, "Captcha.jsp", "page= " +ctx.getEngine().encodeName( ctx.getPage().getName() ) );
         }
 
         return ctx.getURL( WikiContext.VIEW, m_errorPage );
@@ -1060,7 +1001,6 @@
      */
     public static final boolean checkHash( final WikiContext context, final PageContext pageContext ) throws IOException {
         final String hashName = getHashFieldName( (HttpServletRequest)pageContext.getRequest() );
-
         if( pageContext.getRequest().getParameter(hashName) == null ) {
             if( pageContext.getAttribute( hashName ) == null ) {
                 final Change change = getChange( context, EditorManager.getEditedText( pageContext ) );
@@ -1099,9 +1039,9 @@
      *  @since
      */
     private class Host {
-    	
-        private long   m_addedTime = System.currentTimeMillis();
-        private long   m_releaseTime;
+
+        private long m_addedTime = System.currentTimeMillis();
+        private long m_releaseTime;
         private String m_address;
         private Change m_change;
 
@@ -1123,7 +1063,7 @@
 
         public Host( final String ipaddress, final Change change ) {
             m_address = ipaddress;
-            m_change  = change;
+            m_change = change;
             m_releaseTime = System.currentTimeMillis() + m_banTime * 60 * 1000L;
         }
         
@@ -1134,18 +1074,18 @@
         public String m_change;
         public int    m_adds;
         public int    m_removals;
-        
+
         @Override public String toString() {
             return m_change;
         }
-        
+
         @Override public boolean equals( final Object o ) {
             if( o instanceof Change ) {
                 return m_change.equals( ( ( Change )o ).m_change );
             }
             return false;
         }
-        
+
         @Override public int hashCode() {
             return m_change.hashCode() + 17;
         }
