diff --git a/jspwiki-main/src/main/java/org/apache/wiki/plugin/DefaultPluginManager.java b/jspwiki-main/src/main/java/org/apache/wiki/plugin/DefaultPluginManager.java
index a0db25b..02a5fbb 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/plugin/DefaultPluginManager.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/plugin/DefaultPluginManager.java
@@ -30,7 +30,6 @@
 import org.apache.oro.text.regex.Perl5Compiler;
 import org.apache.oro.text.regex.Perl5Matcher;
 import org.apache.wiki.InternalWikiException;
-import org.apache.wiki.WikiContext;
 import org.apache.wiki.ajax.WikiAjaxDispatcherServlet;
 import org.apache.wiki.ajax.WikiAjaxServlet;
 import org.apache.wiki.api.core.Context;
@@ -160,23 +159,16 @@
 public class DefaultPluginManager extends BaseModuleManager implements PluginManager {
 
     private static final String PLUGIN_INSERT_PATTERN = "\\{?(INSERT)?\\s*([\\w\\._]+)[ \\t]*(WHERE)?[ \\t]*";
-
     private static final Logger log = Logger.getLogger( DefaultPluginManager.class );
-
     private static final String DEFAULT_FORMS_PACKAGE = "org.apache.wiki.forms";
 
-    private ArrayList<String> m_searchPath = new ArrayList<>();
-
-    private ArrayList<String> m_externalJars = new ArrayList<>();
-
+    private ArrayList< String > m_searchPath = new ArrayList<>();
+    private ArrayList< String > m_externalJars = new ArrayList<>();
     private Pattern m_pluginPattern;
-
     private boolean m_pluginsEnabled = true;
 
-    /**
-     *  Keeps a list of all known plugin classes.
-     */
-    private Map<String, WikiPluginInfo> m_pluginClassMap = new HashMap<>();
+    /** Keeps a list of all known plugin classes. */
+    private Map< String, WikiPluginInfo > m_pluginClassMap = new HashMap<>();
 
     /**
      *  Create a new PluginManager.
@@ -187,20 +179,16 @@
     public DefaultPluginManager( final Engine engine, final Properties props ) {
         super( engine );
         final String packageNames = props.getProperty( PROP_SEARCHPATH );
-
         if ( packageNames != null ) {
             final StringTokenizer tok = new StringTokenizer( packageNames, "," );
-
             while( tok.hasMoreTokens() ) {
                 m_searchPath.add( tok.nextToken().trim() );
             }
         }
 
         final String externalJars = props.getProperty( PROP_EXTERNALJARS );
-
         if( externalJars != null ) {
             final StringTokenizer tok = new StringTokenizer( externalJars, "," );
-
             while( tok.hasMoreTokens() ) {
                 m_externalJars.add( tok.nextToken().trim() );
             }
@@ -208,50 +196,38 @@
 
         registerPlugins();
 
-        //
         //  The default packages are always added.
-        //
         m_searchPath.add( DEFAULT_PACKAGE );
         m_searchPath.add( DEFAULT_FORMS_PACKAGE );
 
         final PatternCompiler compiler = new Perl5Compiler();
-
         try {
             m_pluginPattern = compiler.compile( PLUGIN_INSERT_PATTERN );
         } catch( final MalformedPatternException e ) {
             log.fatal( "Internal error: someone messed with pluginmanager patterns.", e );
-            throw new InternalWikiException( "PluginManager patterns are broken" , e);
+            throw new InternalWikiException( "PluginManager patterns are broken" , e );
         }
-
     }
 
-    /**
-     * {@inheritDoc}
-     */
+    /** {@inheritDoc} */
     @Override
     public void enablePlugins( final boolean enabled ) {
         m_pluginsEnabled = enabled;
     }
 
-    /**
-     * {@inheritDoc}
-     */
+    /** {@inheritDoc} */
     @Override
     public boolean pluginsEnabled() {
         return m_pluginsEnabled;
     }
 
-    /**
-     * {@inheritDoc}
-     */
+    /** {@inheritDoc} */
     @Override
     public Pattern getPluginPattern() {
 		return m_pluginPattern;
 	}
 
-    /**
-     * {@inheritDoc}
-     */
+    /** {@inheritDoc} */
     @Override
     public String getPluginSearchPath() {
     	return TextUtil.getStringProperty( m_engine.getWikiProperties(), PROP_SEARCHPATH, null );
@@ -260,61 +236,34 @@
 	/**
      *  Attempts to locate a plugin class from the class path set in the property file.
      *
-     *  @param classname Either a fully fledged class name, or just the name of the file (that is,
-     *  "org.apache.wiki.plugin.Counter" or just plain "Counter").
-     *
+     *  @param classname Either a fully fledged class name, or just the name of the file (that is, "org.apache.wiki.plugin.Counter" or just plain "Counter").
      *  @return A found class.
-     *
      *  @throws ClassNotFoundException if no such class exists.
      */
     private Class< ? > findPluginClass( final String classname ) throws ClassNotFoundException {
         return ClassUtil.findClass( m_searchPath, m_externalJars, classname );
     }
 
-    /**
-     *  Outputs a HTML-formatted version of a stack trace.
-     */
-    private String stackTrace( final Map<String,String> params, final Throwable t )
-    {
-        final Element div = XhtmlUtil.element(XHTML.div,"Plugin execution failed, stack trace follows:");
-        div.setAttribute(XHTML.ATTR_class,"debug");
-
+    /** Outputs a HTML-formatted version of a stack trace. */
+    private String stackTrace( final Map<String,String> params, final Throwable t ) {
+        final Element div = XhtmlUtil.element( XHTML.div, "Plugin execution failed, stack trace follows:" );
+        div.setAttribute( XHTML.ATTR_class, "debug" );
 
         final StringWriter out = new StringWriter();
-        t.printStackTrace(new PrintWriter(out));
-        div.addContent(XhtmlUtil.element(XHTML.pre,out.toString()));
-        div.addContent(XhtmlUtil.element(XHTML.b,"Parameters to the plugin"));
+        t.printStackTrace( new PrintWriter( out ) );
+        div.addContent( XhtmlUtil.element( XHTML.pre, out.toString() ) );
+        div.addContent( XhtmlUtil.element( XHTML.b, "Parameters to the plugin" ) );
 
-        final Element list = XhtmlUtil.element(XHTML.ul);
-
+        final Element list = XhtmlUtil.element( XHTML.ul );
         for( final Map.Entry< String, String > e : params.entrySet() ) {
             final String key = e.getKey();
             list.addContent( XhtmlUtil.element( XHTML.li, key + "'='" + e.getValue() ) );
         }
-
-        div.addContent(list);
-
-        return XhtmlUtil.serialize(div);
+        div.addContent( list );
+        return XhtmlUtil.serialize( div );
     }
 
-    /**
-     *  Executes a plugin class in the given context.
-     *  <P>Used to be private, but is public since 1.9.21.
-     *
-     *  @param context The current WikiContext.
-     *  @param classname The name of the class.  Can also be a
-     *  shortened version without the package name, since the class name is searched from the
-     *  package search path.
-     *
-     *  @param params A parsed map of key-value pairs.
-     *
-     *  @return Whatever the plugin returns.
-     *
-     *  @throws PluginException If the plugin execution failed for
-     *  some reason.
-     *
-     *  @since 2.0
-     */
+    /** {@inheritDoc} */
     @Override
     public String execute( final Context context, final String classname, final Map< String, String > params ) throws PluginException {
         if( !m_pluginsEnabled ) {
@@ -355,110 +304,75 @@
         }
     }
 
-    /**
-     *  Parses plugin arguments.  Handles quotes and all other kewl stuff.
-     *
-     *  <h3>Special parameters</h3>
-     *  The plugin body is put into a special parameter defined by {@link #PARAM_BODY};
-     *  the plugin's command line into a parameter defined by {@link #PARAM_CMDLINE};
-     *  and the bounds of the plugin within the wiki page text by a parameter defined
-     *  by {@link #PARAM_BOUNDS}, whose value is stored as a two-element int[] array,
-     *  i.e., <tt>[start,end]</tt>.
-     *
-     * @param argstring The argument string to the plugin.  This is
-     *  typically a list of key-value pairs, using "'" to escape
-     *  spaces in strings, followed by an empty line and then the
-     *  plugin body.  In case the parameter is null, will return an
-     *  empty parameter list.
-     *
-     * @return A parsed list of parameters.
-     *
-     * @throws IOException If the parsing fails.
-     */
+    /** {@inheritDoc} */
     @Override
     public Map< String, String > parseArgs( final String argstring ) throws IOException {
         final Map< String, String > arglist = new HashMap<>();
-
         //  Protection against funny users.
         if( argstring == null ) {
             return arglist;
         }
 
         arglist.put( PARAM_CMDLINE, argstring );
-
-        final StringReader    in      = new StringReader(argstring);
-        final StreamTokenizer tok     = new StreamTokenizer(in);
-        int             type;
+        final StringReader in = new StringReader( argstring );
+        final StreamTokenizer tok = new StreamTokenizer( in );
+        tok.eolIsSignificant( true );
 
         String param = null;
         String value;
-
-        tok.eolIsSignificant( true );
-
         boolean potentialEmptyLine = false;
-        boolean quit               = false;
-
+        boolean quit = false;
         while( !quit ) {
             final String s;
-            type = tok.nextToken();
+            final int type = tok.nextToken();
 
             switch( type ) {
-              case StreamTokenizer.TT_EOF:
+            case StreamTokenizer.TT_EOF:
                 quit = true;
                 s = null;
                 break;
 
-              case StreamTokenizer.TT_WORD:
+            case StreamTokenizer.TT_WORD:
                 s = tok.sval;
                 potentialEmptyLine = false;
                 break;
 
-              case StreamTokenizer.TT_EOL:
+            case StreamTokenizer.TT_EOL:
                 quit = potentialEmptyLine;
                 potentialEmptyLine = true;
                 s = null;
                 break;
 
-              case StreamTokenizer.TT_NUMBER:
-                s = Integer.toString( (int) tok.nval );
+            case StreamTokenizer.TT_NUMBER:
+                s = Integer.toString( ( int )tok.nval );
                 potentialEmptyLine = false;
                 break;
 
-              case '\'':
+            case '\'':
                 s = tok.sval;
                 break;
 
-              default:
+            default:
                 s = null;
             }
 
-            //
-            //  Assume that alternate words on the line are
-            //  parameter and value, respectively.
-            //
+            //  Assume that alternate words on the line are parameter and value, respectively.
             if( s != null ) {
                 if( param == null ) {
                     param = s;
                 } else {
                     value = s;
-
                     arglist.put( param, value );
-
-                    // log.debug("ARG: "+param+"="+value);
                     param = null;
                 }
             }
         }
 
-        //
         //  Now, we'll check the body.
-        //
         if( potentialEmptyLine ) {
             final StringWriter out = new StringWriter();
             FileUtil.copyContents( in, out );
-
             final String bodyContent = out.toString();
-
             if( bodyContent != null ) {
                 arglist.put( PARAM_BODY, bodyContent );
             }
@@ -467,22 +381,9 @@
         return arglist;
     }
 
-    /**
-     *  Parses a plugin.  Plugin commands are of the form:
-     *  [{INSERT myplugin WHERE param1=value1, param2=value2}]
-     *  myplugin may either be a class name or a plugin alias.
-     *  <P>
-     *  This is the main entry point that is used.
-     *
-     *  @param context The current WikiContext.
-     *  @param commandline The full command line, including plugin name, parameters and body.
-     *
-     *  @return HTML as returned by the plugin, or possibly an error message.
-     *
-     *  @throws PluginException From the plugin itself, it propagates, waah!
-     */
+    /** {@inheritDoc} */
     @Override
-    public String execute( final WikiContext context, final String commandline ) throws PluginException {
+    public String execute( final Context context, final String commandline ) throws PluginException {
         if( !m_pluginsEnabled ) {
             return "";
         }
@@ -493,74 +394,64 @@
         try {
             if( matcher.contains( commandline, m_pluginPattern ) ) {
                 final MatchResult res = matcher.getMatch();
-
-                final String plugin   = res.group(2);
-                final String args     = commandline.substring(res.endOffset(0),
-                                                        commandline.length() -
-                                                        (commandline.charAt(commandline.length()-1) == '}' ? 1 : 0 ) );
-                final Map<String, String> arglist  = parseArgs( args );
-
+                final String plugin = res.group( 2 );
+                final int endIndex = commandline.length() - ( commandline.charAt( commandline.length() - 1 ) == '}' ? 1 : 0 );
+                final String args = commandline.substring( res.endOffset( 0 ), endIndex );
+                final Map< String, String > arglist = parseArgs( args );
                 return execute( context, plugin, arglist );
             }
         } catch( final NoSuchElementException e ) {
-            final String msg =  "Missing parameter in plugin definition: "+commandline;
+            final String msg =  "Missing parameter in plugin definition: " + commandline;
             log.warn( msg, e );
             throw new PluginException( MessageFormat.format( rb.getString( "plugin.error.missingparameter" ), commandline ) );
         } catch( final IOException e ) {
-            final String msg = "Zyrf.  Problems with parsing arguments: "+commandline;
+            final String msg = "Zyrf.  Problems with parsing arguments: " + commandline;
             log.warn( msg, e );
             throw new PluginException( MessageFormat.format( rb.getString( "plugin.error.parsingarguments" ), commandline ) );
         }
 
-        // FIXME: We could either return an empty string "", or
-        // the original line.  If we want unsuccessful requests
+        // FIXME: We could either return an empty string "", or the original line.  If we want unsuccessful requests
         // to be invisible, then we should return an empty string.
         return commandline;
     }
 
-    /**
-     *  Register a plugin.
-     */
+    /** Register a plugin. */
     private void registerPlugin( final WikiPluginInfo pluginClass ) {
         String name;
 
-        // Registrar the plugin with the className without the package-part
+        // Register the plugin with the className without the package-part
         name = pluginClass.getName();
         if( name != null ) {
             log.debug( "Registering plugin [name]: " + name );
             m_pluginClassMap.put( name, pluginClass );
         }
 
-        // Registrar the plugin with a short convenient name.
+        // Register the plugin with a short convenient name.
         name = pluginClass.getAlias();
         if( name != null ) {
             log.debug( "Registering plugin [shortName]: " + name );
             m_pluginClassMap.put( name, pluginClass );
         }
 
-        // Registrar the plugin with the className with the package-part
+        // Register the plugin with the className with the package-part
         name = pluginClass.getClassName();
         if( name != null ) {
             log.debug( "Registering plugin [className]: " + name );
             m_pluginClassMap.put( name, pluginClass );
         }
 
-        pluginClass.initializePlugin( pluginClass, m_engine , m_searchPath, m_externalJars);
+        pluginClass.initializePlugin( pluginClass, m_engine, m_searchPath, m_externalJars );
     }
 
     private void registerPlugins() {
+        // Register all plugins which have created a resource containing its properties.
         log.info( "Registering plugins" );
         final List< Element > plugins = XmlUtil.parse( PLUGIN_RESOURCE_LOCATION, "/modules/plugin" );
 
-        //
-        // Register all plugins which have created a resource containing its properties.
-        //
         // Get all resources of all plugins.
-        //
         for( final Element pluginEl : plugins ) {
             final String className = pluginEl.getAttributeValue( "class" );
-            final WikiPluginInfo pluginInfo = WikiPluginInfo.newInstance( className, pluginEl ,m_searchPath, m_externalJars);
-
+            final WikiPluginInfo pluginInfo = WikiPluginInfo.newInstance( className, pluginEl ,m_searchPath, m_externalJars );
             if( pluginInfo != null ) {
                 registerPlugin( pluginInfo );
             }
@@ -569,12 +460,9 @@
 
     /**
      *  Contains information about a bunch of plugins.
-     *
-     *
      */
-    // FIXME: This class needs a better interface to return all sorts of possible
-    //        information from the plugin XML.  In fact, it probably should have
-    //        some sort of a superclass system.
+    // FIXME: This class needs a better interface to return all sorts of possible information from the plugin XML.  In fact, it probably
+    //  should have some sort of a superclass system.
     public static final class WikiPluginInfo extends WikiModuleInfo {
 
         private String    m_className;
@@ -587,15 +475,16 @@
         /**
          *  Creates a new plugin info object which can be used to access a plugin.
          *
-         *  @param className Either a fully qualified class name, or a "short" name which is then
-         *                   checked against the internal list of plugin packages.
+         *  @param className Either a fully qualified class name, or a "short" name which is then checked against the internal list of plugin packages.
          *  @param el A JDOM Element containing the information about this class.
          *  @param searchPath A List of Strings, containing different package names.
          *  @param externalJars the list of external jars to search
          *  @return A WikiPluginInfo object.
          */
         protected static WikiPluginInfo newInstance( final String className, final Element el, final List<String> searchPath, final List<String> externalJars ) {
-            if( className == null || className.length() == 0 ) return null;
+            if( className == null || className.length() == 0 ) {
+                return null;
+            }
 
             final WikiPluginInfo info = new WikiPluginInfo( className );
             info.initializeFromXML( el );
@@ -603,8 +492,7 @@
         }
 
         /**
-         *  Initializes a plugin, if it has not yet been initialized.
-         *  If the plugin extends {@link HttpServlet} it will automatically
+         *  Initializes a plugin, if it has not yet been initialized. If the plugin extends {@link HttpServlet} it will automatically
          *  register it as AJAX using {@link WikiAjaxDispatcherServlet#registerServlet(String, WikiAjaxServlet)}.
          *
          *  @param engine The Engine
@@ -693,19 +581,18 @@
          *
          *  @param searchPath A List of Strings, containing different package names.
          *  @param externalJars the list of external jars to search
-
          *  @return A new plugin.
          *  @throws ClassNotFoundException If the class declared was not found.
          *  @throws InstantiationException If the class cannot be instantiated-
          *  @throws IllegalAccessException If the class cannot be accessed.
          */
 
-        public Plugin newPluginInstance( final List<String> searchPath, final List<String> externalJars) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
+        public Plugin newPluginInstance( final List< String > searchPath, final List< String > externalJars) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
             if( m_clazz == null ) {
-                m_clazz = ClassUtil.findClass(searchPath, externalJars ,m_className);
+                m_clazz = ClassUtil.findClass( searchPath, externalJars ,m_className );
             }
 
-            return (Plugin) m_clazz.newInstance();
+            return ( Plugin )m_clazz.newInstance();
         }
 
         /**
@@ -778,6 +665,7 @@
         public String toString() {
             return "Plugin :[name=" + m_name + "][className=" + m_className + "]";
         }
+
     } // WikiPluginClass
 
     /**
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/plugin/PluginManager.java b/jspwiki-main/src/main/java/org/apache/wiki/plugin/PluginManager.java
index 7ed86fb..a7fee6d 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/plugin/PluginManager.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/plugin/PluginManager.java
@@ -19,7 +19,6 @@
 package org.apache.wiki.plugin;
 
 import org.apache.oro.text.regex.Pattern;
-import org.apache.wiki.WikiContext;
 import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.exceptions.PluginException;
 import org.apache.wiki.api.plugin.Plugin;
@@ -117,19 +116,18 @@
     Map< String, String > parseArgs( String argstring ) throws IOException;
 
     /**
-     * Parses a plugin.  Plugin commands are of the form:
-     * {@code [{INSERT myplugin WHERE param1=value1, param2=value2}] }
-     * myplugin may either be a class name or a plugin alias.
-     * <P>
-     * This is the main entry point that is used.
+     *  Parses a plugin.  Plugin commands are of the form:<br/>
+     *  {@code [{INSERT myplugin WHERE param1=value1, param2=value2}]}<br/>
+     *  myplugin may either be a class name or a plugin alias.
+     *  <P>
+     *  This is the main entry point that is used.
      *
-     * @param context The current WikiContext.
-     * @param commandline The full command line, including plugin name, parameters and body.
-     * @return HTML as returned by the plugin, or possibly an error message.
-     *
-     * @throws PluginException From the plugin itself, it propagates, waah!
+     *  @param context The current WikiContext.
+     *  @param commandline The full command line, including plugin name, parameters and body.
+     *  @return HTML as returned by the plugin, or possibly an error message.
+     *  @throws PluginException From the plugin itself, it propagates, waah!
      */
-    String execute( WikiContext context, String commandline ) throws PluginException;
+    String execute( Context context, String commandline ) throws PluginException;
     
     /**
      * Creates a {@link Plugin}.
