diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/AutotagRuntimeException.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/AutotagRuntimeException.java
index dbe5450..c4d05f9 100644
--- a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/AutotagRuntimeException.java
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/AutotagRuntimeException.java
@@ -1,18 +1,62 @@
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.tiles.autotag.core;
 
+/**
+ * Generic exception for Autotag.
+ *
+ * @version $Rev$ $Date$
+ */
 public class AutotagRuntimeException extends RuntimeException {
 
+    /**
+     * Constructor.
+     */
     public AutotagRuntimeException() {
     }
 
+    /**
+     * Constructor.
+     *
+     * @param message The message of the exception.
+     */
     public AutotagRuntimeException(String message) {
         super(message);
     }
 
+    /**
+     * Constructor.
+     *
+     * @param cause The cause.
+     */
     public AutotagRuntimeException(Throwable cause) {
         super(cause);
     }
 
+    /**
+     * Constructor.
+     *
+     * @param message The message of the exception.
+     * @param cause The cause.
+     */
     public AutotagRuntimeException(String message, Throwable cause) {
         super(message, cause);
     }
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/ClassParseException.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/ClassParseException.java
index 10a940b..c2ef82b 100644
--- a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/ClassParseException.java
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/ClassParseException.java
@@ -1,18 +1,62 @@
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.tiles.autotag.core;
 
+/**
+ * Thrown if there is a problem when parsing a class source.
+ *
+ * @version $Rev$ $Date$
+ */
 public class ClassParseException extends AutotagRuntimeException {
 
+    /**
+     * Constructor.
+     */
     public ClassParseException() {
     }
 
+    /**
+     * Constructor.
+     *
+     * @param message The message of the exception.
+     */
     public ClassParseException(String message) {
         super(message);
     }
 
+    /**
+     * Constructor.
+     *
+     * @param cause The cause.
+     */
     public ClassParseException(Throwable cause) {
         super(cause);
     }
 
+    /**
+     * Constructor.
+     *
+     * @param message The message of the exception.
+     * @param cause The cause.
+     */
     public ClassParseException(String message, Throwable cause) {
         super(message, cause);
     }
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/QDoxTemplateSuiteFactory.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/QDoxTemplateSuiteFactory.java
index 2fb4d52..cfc903b 100644
--- a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/QDoxTemplateSuiteFactory.java
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/QDoxTemplateSuiteFactory.java
@@ -1,3 +1,23 @@
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.tiles.autotag.core;
 
 import java.io.File;
@@ -23,16 +43,38 @@
 import com.thoughtworks.qdox.model.JavaParameter;
 import com.thoughtworks.qdox.model.Type;
 
+/**
+ * Creates a template suite using QDox.
+ *
+ * @version $Rev$ $Date$
+ */
 public class QDoxTemplateSuiteFactory implements TemplateSuiteFactory {
 
+    /**
+     * The suffix of parsed classes.
+     */
     private static final String TEMPLATE_SUFFIX = "Model";
 
+    /**
+     * The Javadoc builder.
+     */
     private JavaDocBuilder builder;
 
+    /**
+     * The name of the suite.
+     */
     private String suiteName;
 
+    /**
+     * The documentation of the suite.
+     */
     private String suiteDocumentation;
 
+    /**
+     * Constructor.
+     *
+     * @param sourceFiles All the source files to parse.
+     */
     public QDoxTemplateSuiteFactory(File... sourceFiles) {
         builder = new JavaDocBuilder();
         try {
@@ -45,6 +87,11 @@
         }
     }
 
+    /**
+     * Constructor.
+     *
+     * @param urls All the URLs of source files to parse.
+     */
     public QDoxTemplateSuiteFactory(URL... urls) {
         builder = new JavaDocBuilder();
         try {
@@ -57,10 +104,20 @@
         }
     }
 
+    /**
+     * Sets the suite name to assign to the created suite.
+     *
+     * @param suiteName The suite name.
+     */
     public void setSuiteName(String suiteName) {
         this.suiteName = suiteName;
     }
 
+    /**
+     * Sets the suite documentation to assign to the suite.
+     *
+     * @param suiteDocumentation The suite documentation.
+     */
     public void setSuiteDocumentation(String suiteDocumentation) {
         this.suiteDocumentation = suiteDocumentation;
     }
@@ -91,6 +148,12 @@
         return new TemplateSuite(suiteName, suiteDocumentation, classes);
     }
 
+    /**
+     * Computes the tag class prefix.
+     *
+     * @param clazz The parsed class.
+     * @return The tag class prefix.
+     */
     private String getTagClassPrefix(JavaClass clazz) {
         String tagName;
         String simpleClassName = clazz.getName();
@@ -105,6 +168,12 @@
         return tagName;
     }
 
+    /**
+     * Creates a template method descriptor from a parsed method.
+     *
+     * @param method The parsed method.
+     * @return The template method descriptor.
+     */
     private TemplateMethod createMethod(JavaMethod method) {
         List<TemplateParameter> params = new ArrayList<TemplateParameter>();
         for (JavaParameter parameter : method.getParameters()) {
@@ -154,6 +223,12 @@
         return templateMethod;
     }
 
+    /**
+     * Verifies if the method can be used as an "execute" method.
+     *
+     * @param method The parsed method.
+     * @return <code>true</code> if it is an execute method.
+     */
     private boolean isFeasible(JavaMethod method) {
         Type returns = method.getReturns();
         if ("execute".equals(method.getName()) && returns != null
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/package-info.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/package-info.java
new file mode 100644
index 0000000..d7ed8d7
--- /dev/null
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/package-info.java
@@ -0,0 +1,24 @@
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/**
+ * The Autotag core parsing code.
+ */
+package org.apache.tiles.autotag.core;
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/AbstractTemplateClassGenerator.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/AbstractTemplateClassGenerator.java
index 23ada65..76e875f 100644
--- a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/AbstractTemplateClassGenerator.java
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/AbstractTemplateClassGenerator.java
@@ -1,3 +1,23 @@
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.tiles.autotag.generate;
 
 import java.io.File;
@@ -16,11 +36,24 @@
 import org.apache.velocity.exception.ParseErrorException;
 import org.apache.velocity.exception.ResourceNotFoundException;
 
+/**
+ * A base template class generator.
+ *
+ * @version $Rev$ $Date$
+ */
 public abstract class AbstractTemplateClassGenerator implements
         TemplateClassGenerator {
 
+    /**
+     * The Velocity engine to use.
+     */
     private VelocityEngine velocityEngine;
 
+    /**
+     * Constructor.
+     *
+     * @param velocityEngine The Velocity engine.
+     */
     public AbstractTemplateClassGenerator(VelocityEngine velocityEngine) {
         this.velocityEngine = velocityEngine;
     }
@@ -66,12 +99,42 @@
         }
     }
 
+    /**
+     * Calculates and returns the template path.
+     *
+     * @param directory The directory where the file will be written.
+     * @param packageName The name of the package.
+     * @param suite The template suite.
+     * @param clazz The template class.
+     * @param parameters The map of parameters.
+     * @return The template path.
+     */
     protected abstract String getTemplatePath(File directory,
             String packageName, TemplateSuite suite, TemplateClass clazz, Map<String, String> parameters);
 
+    /**
+     * Calculates and returns the filename of the generated file.
+     *
+     * @param directory The directory where the file will be written.
+     * @param packageName The name of the package.
+     * @param suite The template suite.
+     * @param clazz The template class.
+     * @param parameters The map of parameters.
+     * @return The template path.
+     */
     protected abstract String getFilename(File directory, String packageName,
             TemplateSuite suite, TemplateClass clazz, Map<String, String> parameters);
 
+    /**
+     * Calculates and returns the directory where the file will be written..
+     *
+     * @param directory The directory where the file will be written.
+     * @param packageName The name of the package.
+     * @param suite The template suite.
+     * @param clazz The template class.
+     * @param parameters The map of parameters.
+     * @return The template path.
+     */
     protected abstract String getDirectoryName(File directory,
             String packageName, TemplateSuite suite, TemplateClass clazz, Map<String, String> parameters);
 }
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/AbstractTemplateSuiteGenerator.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/AbstractTemplateSuiteGenerator.java
index 7d48f75..51f94b5 100644
--- a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/AbstractTemplateSuiteGenerator.java
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/AbstractTemplateSuiteGenerator.java
@@ -1,3 +1,23 @@
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.tiles.autotag.generate;
 
 import java.io.File;
@@ -15,10 +35,23 @@
 import org.apache.velocity.exception.ParseErrorException;
 import org.apache.velocity.exception.ResourceNotFoundException;
 
+/**
+ * A base template suite generator.
+ *
+ * @version $Rev$ $Date$
+ */
 public abstract class AbstractTemplateSuiteGenerator implements TemplateSuiteGenerator {
 
+    /**
+     * The velocity engine.
+     */
     private VelocityEngine velocityEngine;
 
+    /**
+     * Constructor.
+     *
+     * @param velocityEngine The Velocity engine.
+     */
     public AbstractTemplateSuiteGenerator(VelocityEngine velocityEngine) {
         this.velocityEngine = velocityEngine;
     }
@@ -59,9 +92,41 @@
         }
     }
 
-    protected abstract String getTemplatePath(File directory, String packageName, TemplateSuite suite, Map<String, String> parameters);
+    /**
+     * Calculates and returns the template path.
+     *
+     * @param directory The directory where the file will be written.
+     * @param packageName The name of the package.
+     * @param suite The template suite.
+     * @param parameters The map of parameters.
+     * @return The template path.
+     */
+    protected abstract String getTemplatePath(File directory,
+            String packageName, TemplateSuite suite,
+            Map<String, String> parameters);
 
-    protected abstract String getFilename(File directory, String packageName, TemplateSuite suite, Map<String, String> parameters);
+    /**
+     * Calculates and returns the filename of the generated file.
+     *
+     * @param directory The directory where the file will be written.
+     * @param packageName The name of the package.
+     * @param suite The template suite.
+     * @param parameters The map of parameters.
+     * @return The template path.
+     */
+    protected abstract String getFilename(File directory, String packageName,
+            TemplateSuite suite, Map<String, String> parameters);
 
-    protected abstract String getDirectoryName(File directory, String packageName, TemplateSuite suite, Map<String, String> parameters);
+    /**
+     * Calculates and returns the directory where the file will be written..
+     *
+     * @param directory The directory where the file will be written.
+     * @param packageName The name of the package.
+     * @param suite The template suite.
+     * @param parameters The map of parameters.
+     * @return The template path.
+     */
+    protected abstract String getDirectoryName(File directory,
+            String packageName, TemplateSuite suite,
+            Map<String, String> parameters);
 }
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/BasicTemplateGenerator.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/BasicTemplateGenerator.java
index 8a7904b..3f2f728 100644
--- a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/BasicTemplateGenerator.java
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/BasicTemplateGenerator.java
@@ -1,3 +1,23 @@
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.tiles.autotag.generate;
 
 import java.io.File;
@@ -7,16 +27,42 @@
 import org.apache.tiles.autotag.model.TemplateClass;
 import org.apache.tiles.autotag.model.TemplateSuite;
 
+/**
+ * The basic template generator. Use {@link TemplateGeneratorBuilder} to
+ * create instances of this class.
+ *
+ * @version $Rev$ $Date$
+ */
 class BasicTemplateGenerator implements TemplateGenerator {
 
+    /**
+     * The template suite generators.
+     */
     private List<TSGeneratorDirectoryPair> templateSuiteGenerators;
 
+    /**
+     * The template class generators.
+     */
     private List<TCGeneratorDirectoryPair> templateClassGenerators;
 
+    /**
+     * Indicates that this generator generates resources.
+     */
     private boolean generatingResources = false;
 
+    /**
+     * Indicates that this generator generates classes.
+     */
     private boolean generatingClasses = false;
 
+    /**
+     * Constructor.
+     *
+     * @param templateSuiteGenerators The template suite generators.
+     * @param templateClassGenerators The template class generators.
+     * @param generatingClasses Indicates that this generator generates classes.
+     * @param generatingResources Indicates that this generator generates resources.
+     */
     BasicTemplateGenerator(
             List<TSGeneratorDirectoryPair> templateSuiteGenerators,
             List<TCGeneratorDirectoryPair> templateClassGenerators,
@@ -31,52 +77,106 @@
 
     @Override
     public void generate(String packageName, TemplateSuite suite, Map<String, String> parameters) {
-        for (TSGeneratorDirectoryPair pair: templateSuiteGenerators) {
+        for (TSGeneratorDirectoryPair pair : templateSuiteGenerators) {
             pair.getGenerator().generate(pair.getDirectory(), packageName, suite, parameters);
         }
-        for (TemplateClass templateClass: suite.getTemplateClasses()) {
-            for (TCGeneratorDirectoryPair pair: templateClassGenerators) {
+        for (TemplateClass templateClass : suite.getTemplateClasses()) {
+            for (TCGeneratorDirectoryPair pair : templateClassGenerators) {
                 pair.getGenerator().generate(pair.getDirectory(), packageName,
                         suite, templateClass, parameters);
             }
         }
     }
 
+    /**
+     * A pair of a template suite generator and a directory.
+     *
+     * @version $Rev$ $Date$
+     */
     static class TSGeneratorDirectoryPair {
+        /**
+         * The directory where files are generated.
+         */
         private File directory;
 
+        /**
+         * The generator.
+         */
         private TemplateSuiteGenerator generator;
 
+        /**
+         * Constructor.
+         *
+         * @param directory The directory where files are generated.
+         * @param generator The generator.
+         */
         public TSGeneratorDirectoryPair(File directory,
                 TemplateSuiteGenerator generator) {
             this.directory = directory;
             this.generator = generator;
         }
 
+        /**
+         * Returns the directory where files are generated.
+         *
+         * @return The directory where files are generated.
+         */
         public File getDirectory() {
             return directory;
         }
 
+        /**
+         * Returns the generator.
+         *
+         * @return The generator.
+         */
         public TemplateSuiteGenerator getGenerator() {
             return generator;
         }
     }
 
+    /**
+     * A pair of a template class generator and a directory.
+     *
+     * @version $Rev$ $Date$
+     */
     static class TCGeneratorDirectoryPair {
+        /**
+         * The directory where files are generated.
+         */
         private File directory;
 
+        /**
+         * The generator.
+         */
         private TemplateClassGenerator generator;
 
+        /**
+         * Constructor.
+         *
+         * @param directory The directory where files are generated.
+         * @param generator The generator.
+         */
         public TCGeneratorDirectoryPair(File directory,
                 TemplateClassGenerator generator) {
             this.directory = directory;
             this.generator = generator;
         }
 
+        /**
+         * Returns the directory where files are generated.
+         *
+         * @return The directory where files are generated.
+         */
         public File getDirectory() {
             return directory;
         }
 
+        /**
+         * Returns the generator.
+         *
+         * @return The generator.
+         */
         public TemplateClassGenerator getGenerator() {
             return generator;
         }
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateClassGenerator.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateClassGenerator.java
index 1c14ff2..a514831 100644
--- a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateClassGenerator.java
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateClassGenerator.java
@@ -1,3 +1,23 @@
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.tiles.autotag.generate;
 
 import java.io.File;
@@ -6,7 +26,22 @@
 import org.apache.tiles.autotag.model.TemplateClass;
 import org.apache.tiles.autotag.model.TemplateSuite;
 
+/**
+ * Generates code from a parsed class.
+ *
+ * @version $Rev$ $Date$
+ */
 public interface TemplateClassGenerator {
 
-    void generate(File directory, String packageName, TemplateSuite suite, TemplateClass clazz, Map<String, String> parameters);
+    /**
+     * Generates the code.
+     *
+     * @param directory The base directory where the code will be put.
+     * @param packageName The package name.
+     * @param suite The template suite.
+     * @param clazz The template class.
+     * @param parameters Configuration parameters.
+     */
+    void generate(File directory, String packageName, TemplateSuite suite,
+            TemplateClass clazz, Map<String, String> parameters);
 }
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateGenerator.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateGenerator.java
index 1e430d8..78b79f8 100644
--- a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateGenerator.java
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateGenerator.java
@@ -1,3 +1,23 @@
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.tiles.autotag.generate;
 
 
@@ -5,11 +25,33 @@
 
 import org.apache.tiles.autotag.model.TemplateSuite;
 
+/**
+ * Generates all the code for a template suite.
+ *
+ * @version $Rev$ $Date$
+ */
 public interface TemplateGenerator {
 
+    /**
+     * Generates the code.
+     *
+     * @param packageName The package name.
+     * @param suite The template suite.
+     * @param parameters Configuration parameters.
+     */
     void generate(String packageName, TemplateSuite suite, Map<String, String> parameters);
 
+    /**
+     * Indicates that this generator generates resources.
+     *
+     * @return <code>true</code> if the generator generates resources.
+     */
     boolean isGeneratingResources();
 
+    /**
+     * Indicates that this generator generates classes.
+     *
+     * @return <code>true</code> if the generator generates classes.
+     */
     boolean isGeneratingClasses();
 }
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateGeneratorBuilder.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateGeneratorBuilder.java
index 8b3e1cf..24d489a 100644
--- a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateGeneratorBuilder.java
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateGeneratorBuilder.java
@@ -1,3 +1,23 @@
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.tiles.autotag.generate;
 
 import java.io.File;
@@ -7,14 +27,31 @@
 import org.apache.tiles.autotag.generate.BasicTemplateGenerator.TCGeneratorDirectoryPair;
 import org.apache.tiles.autotag.generate.BasicTemplateGenerator.TSGeneratorDirectoryPair;
 
-public class TemplateGeneratorBuilder {
+/**
+ * Builds a {@link TemplateGenerator}.
+ *
+ * @version $Rev$ $Date$
+ */
+public final class TemplateGeneratorBuilder {
 
+    /**
+     * The template suite generators.
+     */
     private List<TSGeneratorDirectoryPair> templateSuiteGenerators;
 
+    /**
+     * The template class generators.
+     */
     private List<TCGeneratorDirectoryPair> templateClassGenerators;
 
+    /**
+     * Indicates that this generator generates resources.
+     */
     private boolean generatingResources = false;
 
+    /**
+     * Indicates that this generator generates classes.
+     */
     private boolean generatingClasses = false;
 
     /**
@@ -27,28 +64,55 @@
      */
     private File resourcesOutputDirectory;
 
+    /**
+     * Constructor.
+     */
     private TemplateGeneratorBuilder() {
         templateSuiteGenerators = new ArrayList<BasicTemplateGenerator.TSGeneratorDirectoryPair>();
         templateClassGenerators = new ArrayList<BasicTemplateGenerator.TCGeneratorDirectoryPair>();
     }
 
+    /**
+     * Creates a new instance of the builder.
+     *
+     * @return A new instance of the builder.
+     */
     public static TemplateGeneratorBuilder createNewInstance() {
         return new TemplateGeneratorBuilder();
     }
 
+    /**
+     * Sets the classes output directory.
+     *
+     * @param classesOutputDirectory The classes output directory.
+     * @return This instance.
+     */
     public TemplateGeneratorBuilder setClassesOutputDirectory(File classesOutputDirectory) {
         this.classesOutputDirectory = classesOutputDirectory;
         return this;
     }
 
+    /**
+     * Sets the resources output directory.
+     *
+     * @param resourcesOutputDirectory The resources output directory.
+     * @return This instance.
+     */
     public TemplateGeneratorBuilder setResourcesOutputDirectory(File resourcesOutputDirectory) {
         this.resourcesOutputDirectory = resourcesOutputDirectory;
         return this;
     }
 
+    /**
+     * Adds a new template suite generator to generate classes.
+     *
+     * @param generator The generator to add.
+     * @return This instance.
+     */
     public TemplateGeneratorBuilder addClassesTemplateSuiteGenerator(TemplateSuiteGenerator generator) {
         if (classesOutputDirectory == null) {
-            throw new NullPointerException("Classes output directory not specified, call 'setClassesOutputDirectory' first");
+            throw new NullPointerException(
+                    "Classes output directory not specified, call 'setClassesOutputDirectory' first");
         }
         templateSuiteGenerators.add(new TSGeneratorDirectoryPair(
                 classesOutputDirectory, generator));
@@ -56,9 +120,16 @@
         return this;
     }
 
+    /**
+     * Adds a new template class generator to generate classes.
+     *
+     * @param generator The generator to add.
+     * @return This instance.
+     */
     public TemplateGeneratorBuilder addClassesTemplateClassGenerator(TemplateClassGenerator generator) {
         if (classesOutputDirectory == null) {
-            throw new NullPointerException("Classes output directory not specified, call 'setClassesOutputDirectory' first");
+            throw new NullPointerException(
+                    "Classes output directory not specified, call 'setClassesOutputDirectory' first");
         }
         templateClassGenerators.add(new TCGeneratorDirectoryPair(
                 classesOutputDirectory, generator));
@@ -66,9 +137,16 @@
         return this;
     }
 
+    /**
+     * Adds a new template suite generator to generate resources.
+     *
+     * @param generator The generator to add.
+     * @return This instance.
+     */
     public TemplateGeneratorBuilder addResourcesTemplateSuiteGenerator(TemplateSuiteGenerator generator) {
         if (resourcesOutputDirectory == null) {
-            throw new NullPointerException("Resources output directory not specified, call 'setClassesOutputDirectory' first");
+            throw new NullPointerException(
+                    "Resources output directory not specified, call 'setClassesOutputDirectory' first");
         }
         templateSuiteGenerators.add(new TSGeneratorDirectoryPair(
                 resourcesOutputDirectory, generator));
@@ -76,9 +154,16 @@
         return this;
     }
 
+    /**
+     * Adds a new template class generator to generate resources.
+     *
+     * @param generator The generator to add.
+     * @return This instance.
+     */
     public TemplateGeneratorBuilder addResourcesTemplateClassGenerator(TemplateClassGenerator generator) {
         if (resourcesOutputDirectory == null) {
-            throw new NullPointerException("Resources output directory not specified, call 'setClassesOutputDirectory' first");
+            throw new NullPointerException(
+                    "Resources output directory not specified, call 'setClassesOutputDirectory' first");
         }
         templateClassGenerators.add(new TCGeneratorDirectoryPair(
                 resourcesOutputDirectory, generator));
@@ -86,6 +171,11 @@
         return this;
     }
 
+    /**
+     * Builds and returns a new template generator.
+     *
+     * @return The new template generator.
+     */
     public TemplateGenerator build() {
         return new BasicTemplateGenerator(templateSuiteGenerators,
                 templateClassGenerators, generatingClasses, generatingResources);
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateGeneratorFactory.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateGeneratorFactory.java
index 7f70492..76b40d7 100644
--- a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateGeneratorFactory.java
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateGeneratorFactory.java
@@ -1,6 +1,36 @@
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.tiles.autotag.generate;
 
+/**
+ * Creates a new template generator.
+ *
+ * @version $Rev$ $Date$
+ */
 public interface TemplateGeneratorFactory {
 
+    /**
+     * Creates a template generator.
+     *
+     * @return The newly created template generator.
+     */
     TemplateGenerator createTemplateGenerator();
 }
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateSuiteGenerator.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateSuiteGenerator.java
index 656bf3a..1d7df00 100644
--- a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateSuiteGenerator.java
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateSuiteGenerator.java
@@ -1,3 +1,23 @@
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.tiles.autotag.generate;
 
 import java.io.File;
@@ -5,7 +25,20 @@
 
 import org.apache.tiles.autotag.model.TemplateSuite;
 
+/**
+ * Generates code from a template suite.
+ *
+ * @version $Rev$ $Date$
+ */
 public interface TemplateSuiteGenerator {
 
+    /**
+     * Generates the code.
+     *
+     * @param directory The base directory where the code will be put.
+     * @param packageName The package name.
+     * @param suite The template suite.
+     * @param parameters Configuration parameters.
+     */
     void generate(File directory, String packageName, TemplateSuite suite, Map<String, String> parameters);
 }
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/package-info.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/package-info.java
new file mode 100644
index 0000000..6256497
--- /dev/null
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/package-info.java
@@ -0,0 +1,24 @@
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/**
+ * The Autotag generation classes.
+ */
+package org.apache.tiles.autotag.generate;
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateClass.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateClass.java
index 1e732fe..f869c95 100644
--- a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateClass.java
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateClass.java
@@ -1,25 +1,78 @@
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.tiles.autotag.model;
 
 import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
+/**
+ * It represents a parsed template class.
+ *
+ * @version $Rev$ $Date$
+ */
 public class TemplateClass {
 
+    /**
+     * The class name.
+     */
     private String name;
 
+    /**
+     * The name of the tag.
+     */
     private String tagName;
 
+    /**
+     * The prefix of the tag class.
+     */
     private String tagClassPrefix;
 
+    /**
+     * Documentation about this tag.
+     */
     private String documentation;
 
+    /**
+     * The method that executes the template class.
+     */
     private TemplateMethod executeMethod;
 
+    /**
+     * Constructor.
+     *
+     * @param name The name of the template class.
+     */
     public TemplateClass(String name) {
         this(name, null, null, null);
     }
 
+    /**
+     * Constructor.
+     *
+     * @param name The name of the template class.
+     * @param tagName The name of the tag.
+     * @param tagClassPrefix The tag class prefix.
+     * @param executeMethod The method that executes the template class.
+     */
     public TemplateClass(String name, String tagName, String tagClassPrefix,
             TemplateMethod executeMethod) {
         this.name = name;
@@ -28,10 +81,20 @@
         this.executeMethod = executeMethod;
     }
 
+    /**
+     * The name of the parsed class.
+     *
+     * @return The name of the class.
+     */
     public String getName() {
         return name;
     }
 
+    /**
+     * Returns the name of the class, without the package part.
+     *
+     * @return The simple class name.
+     */
     public String getSimpleName() {
         int pos = name.lastIndexOf('.');
         if (pos >= 0) {
@@ -40,32 +103,68 @@
         return name;
     }
 
+    /**
+     * Returns the tag name.
+     *
+     * @return The tag name.
+     */
     public String getTagName() {
         return tagName;
     }
 
+    /**
+     * Returns the tag class prefix.
+     *
+     * @return The tag class prefix.
+     */
     public String getTagClassPrefix() {
         return tagClassPrefix;
     }
 
+    /**
+     * Returns the documentation for this class.
+     *
+     * @return The documentation.
+     */
     public String getDocumentation() {
         return documentation;
     }
 
+    /**
+     * Sets the documentation for this class.
+     *
+     * @param documentation The documentation.
+     */
     public void setDocumentation(String documentation) {
         this.documentation = documentation;
     }
 
+    /**
+     * Returns the method that execute this class.
+     *
+     * @return The execute method.
+     */
     public TemplateMethod getExecuteMethod() {
         return executeMethod;
     }
 
+    /**
+     * Returns the collection of regular parameters (no request, no body)
+     * of the execute method.
+     *
+     * @return The regular parameters.
+     */
     public Collection<TemplateParameter> getParameters() {
         Map<String, TemplateParameter> params = new LinkedHashMap<String, TemplateParameter>();
         fillRegularParameters(params, executeMethod);
         return params.values();
     }
 
+    /**
+     * Indicates that this class needs a tag body.
+     *
+     * @return <code>true</code> if tag body is needed.
+     */
     public boolean hasBody() {
         return executeMethod.hasBody();
     }
@@ -77,10 +176,16 @@
                 + documentation + ", executeMethod=" + executeMethod + "]";
     }
 
+    /**
+     * Creates regular parameters map.
+     *
+     * @param params The map to fill.
+     * @param method The method to analyze.
+     */
     private void fillRegularParameters(Map<String, TemplateParameter> params,
             TemplateMethod method) {
         if (method != null) {
-            for (TemplateParameter param: method.getParameters()) {
+            for (TemplateParameter param : method.getParameters()) {
                 if (!param.isRequest() && !param.isBody()) {
                     params.put(param.getName(), param);
                 }
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateMethod.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateMethod.java
index 2fb37cc..d5703c5 100644
--- a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateMethod.java
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateMethod.java
@@ -1,17 +1,57 @@
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.tiles.autotag.model;
 
 import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
+/**
+ * It represents a parsed method in a parsed template class.
+ *
+ * @version $Rev$ $Date$
+ */
 public class TemplateMethod {
 
+    /**
+     * The name of the method.
+     */
     private String name;
 
+    /**
+     * Documentation about the method.
+     */
     private String documentation;
 
+    /**
+     * The map of parameters.
+     */
     private Map<String, TemplateParameter> parameters;
 
+    /**
+     * Constructor.
+     *
+     * @param name The name of the method.
+     * @param parameters The map of parameters.
+     */
     public TemplateMethod(String name,
             Iterable<? extends TemplateParameter> parameters) {
         this.name = name;
@@ -21,26 +61,57 @@
         }
     }
 
+    /**
+     * Returns the name of the method.
+     *
+     * @return The name of the method.
+     */
     public String getName() {
         return name;
     }
 
+    /**
+     * Returns the documentation for this method.
+     *
+     * @return The documentation.
+     */
     public String getDocumentation() {
         return documentation;
     }
 
+    /**
+     * Sets the documentation for this method.
+     *
+     * @param documentation The documentation.
+     */
     public void setDocumentation(String documentation) {
         this.documentation = documentation;
     }
 
+    /**
+     * Returns the parameters of this method.
+     *
+     * @return The parameters.
+     */
     public Collection<TemplateParameter> getParameters() {
         return parameters.values();
     }
 
+    /**
+     * Returns a parameter given its name.
+     *
+     * @param name The name of the parameter.
+     * @return The parameter.
+     */
     public TemplateParameter getParameterByName(String name) {
         return parameters.get(name);
     }
 
+    /**
+     * Indicates that this method needs a tag body.
+     *
+     * @return <code>true</code> if tag body is needed.
+     */
     public boolean hasBody() {
         if (parameters.size() >= 2) {
             for (TemplateParameter param : parameters.values()) {
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateParameter.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateParameter.java
index 32a5978..2755fcc 100644
--- a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateParameter.java
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateParameter.java
@@ -1,22 +1,76 @@
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.tiles.autotag.model;
 
 import org.apache.tiles.autotag.core.runtime.ModelBody;
 import org.apache.tiles.request.Request;
 
+/**
+ * It represents a parameter in a method in a parsed template class.
+ *
+ * @version $Rev$ $Date$
+ */
 public class TemplateParameter {
 
+    /**
+     * The name of the parameter.
+     */
     private String name;
 
+    /**
+     * The exported name, i.e. the name of the parameter in created code. Usually
+     * helpful if this exported name is a reserved word.
+     */
     private String exportedName;
 
+    /**
+     * The parameter documentation.
+     */
     private String documentation;
 
+    /**
+     * The type of the prameter.
+     */
     private String type;
 
+    /**
+     * The default value, as it will be written in Java code.
+     */
     private String defaultValue;
 
+    /**
+     * Indicates that this parameter is required.
+     */
     private boolean required;
 
+    /**
+     * Constructor.
+     *
+     * @param name The name of the parameter.
+     * @param exportedName The exported name, i.e. the name of the parameter in created code. Usually
+     * helpful if this exported name is a reserved word.
+     * @param type The type of the parameter.
+     * @param defaultValue The default value, as it will be written in Java code.
+     * @param required Indicates that this parameter is required.
+     */
     public TemplateParameter(String name, String exportedName, String type, String defaultValue, boolean required) {
         this.name = name;
         this.exportedName = exportedName;
@@ -25,42 +79,94 @@
         this.required = required;
     }
 
+    /**
+     * Returns the documentation for this parameter.
+     *
+     * @return The documentation.
+     */
     public String getDocumentation() {
         return documentation;
     }
 
+    /**
+     * Sets the documentation for this parameter.
+     *
+     * @param documentation The documentation.
+     */
     public void setDocumentation(String documentation) {
         this.documentation = documentation;
     }
 
+    /**
+     * Returns the name of the parameter.
+     *
+     * @return The name of the parameter.
+     */
     public String getName() {
         return name;
     }
 
+    /**
+     * Returns the exported name, i.e. the name of the parameter in created code. Usually
+     * helpful if this exported name is a reserved word.
+     *
+     * @return The exported name.
+     */
     public String getExportedName() {
         return exportedName;
     }
 
+    /**
+     * Returns the type of the parameter.
+     *
+     * @return The type.
+     */
     public String getType() {
         return type;
     }
 
+    /**
+     * Returns the default value, as it will be written in Java code.
+     *
+     * @return The default value.
+     */
     public String getDefaultValue() {
         return defaultValue;
     }
 
+    /**
+     * Indicates that this parameter is required.
+     *
+     * @return <code>true</code> if the parameter is required.
+     */
     public boolean isRequired() {
         return required;
     }
 
+    /**
+     * Indicates that this parameter implements {@link ModelBody}.
+     *
+     * @return <code>true</code> if the parameter is a body.
+     */
     public boolean isBody() {
         return ModelBody.class.getName().equals(type);
     }
 
+    /**
+     * Indicates that this parameter implements {@link Request}.
+     *
+     * @return <code>true</code> if the parameter is a request.
+     */
     public boolean isRequest() {
         return Request.class.getName().equals(type);
     }
 
+    /**
+     * Returns the suffix for getter and setter of the property generated by
+     * this parameter.
+     *
+     * @return The getter and setter suffix.
+     */
     public String getGetterSetterSuffix() {
         return exportedName.substring(0, 1).toUpperCase() + exportedName.substring(1);
     }
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateSuite.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateSuite.java
index 2ef7387..25361c8 100644
--- a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateSuite.java
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateSuite.java
@@ -1,21 +1,68 @@
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.tiles.autotag.model;
 
 import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
+/**
+ * It represents a suite of template classes.
+ *
+ * @version $Rev$ $Date$
+ */
 public class TemplateSuite {
 
+    /**
+     * The name of the suite.
+     */
     private String name;
 
+    /**
+     * The documentation of this suite.
+     */
     private String documentation;
 
-    Map<String, TemplateClass> templateClasses;
+    /**
+     * The map of template classes.
+     */
+    private Map<String, TemplateClass> templateClasses;
 
+    /**
+     * Constructor.
+     *
+     * @param name The name of the suite.
+     * @param documentation The documentation.
+     */
     public TemplateSuite(String name, String documentation) {
         this(name, documentation, null);
     }
 
+    /**
+     * Constructor.
+     *
+     * @param name The name of the suite.
+     * @param documentation The documentation.
+     * @param classes The template classes.
+     */
     public TemplateSuite(String name, String documentation,
             Iterable<? extends TemplateClass> classes) {
         this.name = name;
@@ -28,22 +75,48 @@
         }
     }
 
+    /**
+     * Returns the template suite name.
+     *
+     * @return The name.
+     */
     public String getName() {
         return name;
     }
 
+    /**
+     * Returns the documentation.
+     *
+     * @return The documentation.
+     */
     public String getDocumentation() {
         return documentation;
     }
 
+    /**
+     * Adds a new template class.
+     *
+     * @param clazz The template class.
+     */
     public void addTemplateClass(TemplateClass clazz) {
         templateClasses.put(clazz.getName(), clazz);
     }
 
+    /**
+     * Returns the template classes.
+     *
+     * @return The template classes.
+     */
     public Collection<TemplateClass> getTemplateClasses() {
         return templateClasses.values();
     }
 
+    /**
+     * Returns a template class given its name.
+     *
+     * @param name The name of the class.
+     * @return The template class instance.
+     */
     public TemplateClass getTemplateClassByName(String name) {
         return templateClasses.get(name);
     }
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateSuiteFactory.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateSuiteFactory.java
index 690c735..4c45ebc 100644
--- a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateSuiteFactory.java
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateSuiteFactory.java
@@ -1,7 +1,37 @@
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.tiles.autotag.model;
 
 
+/**
+ * Creates a new template suite.
+ *
+ * @version $Rev$ $Date$
+ */
 public interface TemplateSuiteFactory {
 
+    /**
+     * Creates a template suite.
+     *
+     * @return The created template suite.
+     */
     TemplateSuite createTemplateSuite();
 }
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/package-info.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/package-info.java
new file mode 100644
index 0000000..a1130d2
--- /dev/null
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/package-info.java
@@ -0,0 +1,24 @@
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/**
+ * Domain model classes representing a parsed template suite.
+ */
+package org.apache.tiles.autotag.model;
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/tool/StringTool.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/tool/StringTool.java
index c552c0b..7341feb 100644
--- a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/tool/StringTool.java
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/tool/StringTool.java
@@ -1,3 +1,23 @@
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.tiles.autotag.tool;
 
 import java.io.BufferedReader;
@@ -11,12 +31,26 @@
 
 import org.apache.tiles.autotag.core.AutotagRuntimeException;
 
+/**
+ * A Velocity tools to manipulate strings.
+ *
+ * @version $Rev$ $Date$
+ */
 public class StringTool {
 
+    /**
+     * Maps a primitive type to its default value as a string.
+     */
     private Map<String, String> type2default;
 
+    /**
+     * Maps a primitive type to its boxed version.
+     */
     private Map<String, String> primitive2wrapped;
 
+    /**
+     * Constructor.
+     */
     public StringTool() {
         type2default = new HashMap<String, String>();
         type2default.put("byte", "0");
@@ -39,6 +73,12 @@
         primitive2wrapped.put("boolean", Boolean.class.getName());
     }
 
+    /**
+     * Creates a list of strings, separating a string when a newline is encountered.
+     *
+     * @param toSplit The string to split.
+     * @return The list of splitted strings.
+     */
     public List<String> splitOnNewlines(String toSplit) {
         List<String> retValue = new ArrayList<String>();
         if (toSplit == null) {
@@ -48,7 +88,7 @@
         BufferedReader bufReader = new BufferedReader(reader);
         try {
             String line;
-            while((line = bufReader.readLine()) != null) {
+            while ((line = bufReader.readLine()) != null) {
                 retValue.add(line);
             }
         } catch (IOException e) {
@@ -58,10 +98,23 @@
         return retValue;
     }
 
+    /**
+     * Creates a string in which the first character is capitalized.
+     *
+     * @param string The string to use.
+     * @return The same string with the first character capitalized.
+     */
     public String capitalizeFirstLetter(String string) {
         return string.substring(0, 1).toUpperCase() + string.substring(1);
     }
 
+    /**
+     * Returns the default value for a type.
+     *
+     * @param type The type.
+     * @param overriddenDefaultValue The default value, as specified by developers.
+     * @return The default value to use.
+     */
     public String getDefaultValue(String type, String overriddenDefaultValue) {
         if (overriddenDefaultValue != null) {
             return overriddenDefaultValue;
@@ -74,6 +127,12 @@
         return retValue;
     }
 
+    /**
+     * Returns the class to be used to cast an Object.
+     *
+     * @param type The type to use, even a primitive type.
+     * @return The class to be used in casts.
+     */
     public String getClassToCast(String type) {
         String retValue = primitive2wrapped.get(type);
         if (retValue == null) {
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/tool/package-info.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/tool/package-info.java
new file mode 100644
index 0000000..558c330
--- /dev/null
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/tool/package-info.java
@@ -0,0 +1,24 @@
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/**
+ * Velocity tools to be used in Velocity templates.
+ */
+package org.apache.tiles.autotag.tool;
