diff --git a/src/main/java/org/apache/struts/annotations/StrutsTag.java b/src/main/java/org/apache/struts/annotations/StrutsTag.java
index 7ead570..232f42f 100644
--- a/src/main/java/org/apache/struts/annotations/StrutsTag.java
+++ b/src/main/java/org/apache/struts/annotations/StrutsTag.java
@@ -26,11 +26,17 @@
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+/**
+ * An annotation to document a Struts jsp/freemarker/velocity tag
+ */
 @Target(ElementType.TYPE)
 @Retention(RetentionPolicy.SOURCE)
 public @interface StrutsTag {
-  String name();
-  String tldBodyContent() default "JSP";
-  String tldTagClass();
-  String description();
+    String name();
+
+    String tldBodyContent() default "JSP";
+
+    String tldTagClass();
+
+    String description();
 }
diff --git a/src/main/java/org/apache/struts/annotations/StrutsTagAttribute.java b/src/main/java/org/apache/struts/annotations/StrutsTagAttribute.java
index 784fcdb..a1be85c 100644
--- a/src/main/java/org/apache/struts/annotations/StrutsTagAttribute.java
+++ b/src/main/java/org/apache/struts/annotations/StrutsTagAttribute.java
@@ -26,13 +26,21 @@
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+/**
+ * Documents an attribute to a Struts tag
+ */
 @Target(ElementType.METHOD)
 @Retention(RetentionPolicy.SOURCE)
 public @interface StrutsTagAttribute {
-  String name() default "";
-  boolean required() default false;
-  boolean rtexprvalue() default true;
-  String description();
-  String defaultValue() default "";
-  String type() default "String";
+    String name() default "";
+
+    boolean required() default false;
+
+    boolean rtexprvalue() default true;
+
+    String description();
+
+    String defaultValue() default "";
+
+    String type() default "String";
 }
diff --git a/src/main/java/org/apache/struts/annotations/taglib/apt/TLDAnnotationProcessorFactory.java b/src/main/java/org/apache/struts/annotations/taglib/apt/TLDAnnotationProcessorFactory.java
index bb7585e..8e1b9e4 100644
--- a/src/main/java/org/apache/struts/annotations/taglib/apt/TLDAnnotationProcessorFactory.java
+++ b/src/main/java/org/apache/struts/annotations/taglib/apt/TLDAnnotationProcessorFactory.java
@@ -31,47 +31,45 @@
 import com.sun.mirror.apt.AnnotationProcessors;
 import com.sun.mirror.declaration.AnnotationTypeDeclaration;
 
-public class TLDAnnotationProcessorFactory implements AnnotationProcessorFactory {
+public class TLDAnnotationProcessorFactory implements
+        AnnotationProcessorFactory {
 
-  /**
-   * Returns a TLD annotation processor.
-   *
-   * @return An annotation processor for note annotations if requested, otherwise, returns the NO_OP
-   *         annotation processor.
-   */
-  public AnnotationProcessor getProcessorFor(Set<AnnotationTypeDeclaration> declarations,
-      AnnotationProcessorEnvironment env) {
-    AnnotationProcessor result;
-    if (declarations.isEmpty()) {
-      result = AnnotationProcessors.NO_OP;
-    } else {
-      result = new TagAnnotationProcessor(env);
+    /**
+     * Returns a TLD annotation processor.
+     * 
+     * @return An annotation processor for note annotations if requested,
+     *         otherwise, returns the NO_OP annotation processor.
+     */
+    public AnnotationProcessor getProcessorFor(
+            Set<AnnotationTypeDeclaration> declarations,
+            AnnotationProcessorEnvironment env) {
+        AnnotationProcessor result;
+        if (declarations.isEmpty()) {
+            result = AnnotationProcessors.NO_OP;
+        } else {
+            result = new TagAnnotationProcessor(env);
+        }
+        return result;
     }
-    return result;
-  }
 
-  /**
-   * This factory builds a processor for Tag and TagAttribute
-   *
-   * @return a collection containing StutsTag and StrutsTagAttribute
-   */
-  public Collection<String> supportedAnnotationTypes() {
-    return Arrays.asList(TagAnnotationProcessor.TAG, TagAnnotationProcessor.TAG_ATTRIBUTE);
-  }
+    /**
+     * This factory builds a processor for Tag and TagAttribute
+     * 
+     * @return a collection containing StutsTag and StrutsTagAttribute
+     */
+    public Collection<String> supportedAnnotationTypes() {
+        return Arrays.asList(TagAnnotationProcessor.TAG,
+                TagAnnotationProcessor.TAG_ATTRIBUTE);
+    }
 
-  /**
-   * Options used to generate the TLD
-   *
-   * @return an empty list.
-   */
-  public Collection<String> supportedOptions() {
-    return Arrays.asList("-AoutFile",
-        "-AtlibVersion",
-        "-AjspVersion",
-        "-AshortName",
-        "-Auri",
-        "-Adescription",
-        "-AdisplayName",
-        "-outTemplatesDir");
-  }
+    /**
+     * Options used to generate the TLD
+     * 
+     * @return an empty list.
+     */
+    public Collection<String> supportedOptions() {
+        return Arrays.asList("-AoutFile", "-AtlibVersion", "-AjspVersion",
+                "-AshortName", "-Auri", "-Adescription", "-AdisplayName",
+                "-outTemplatesDir");
+    }
 }
diff --git a/src/main/java/org/apache/struts/annotations/taglib/apt/Tag.java b/src/main/java/org/apache/struts/annotations/taglib/apt/Tag.java
index eb29474..09b2189 100644
--- a/src/main/java/org/apache/struts/annotations/taglib/apt/Tag.java
+++ b/src/main/java/org/apache/struts/annotations/taglib/apt/Tag.java
@@ -25,69 +25,68 @@
 import java.util.Map;
 
 public class Tag {
-  private String name;
-  private String tldBodyContent;
-  private String tldTagClass;
-  private String description;
-  private boolean include = true;
-  private String declaredType;
+    private String name;
+    private String tldBodyContent;
+    private String tldTagClass;
+    private String description;
+    private boolean include = true;
+    private String declaredType;
+    private Map<String, TagAttribute> attributes = new HashMap<String, TagAttribute>();
 
-  private Map<String, TagAttribute> attributes = new HashMap<String, TagAttribute>();
+    public String getDescription() {
+        return description;
+    }
 
-  public String getDescription() {
-    return description;
-  }
+    public void setDescription(String description) {
+        this.description = description;
+    }
 
-  public void setDescription(String description) {
-    this.description = description;
-  }
+    public String getName() {
+        return name;
+    }
 
-  public String getName() {
-    return name;
-  }
+    public void setName(String name) {
+        this.name = name;
+    }
 
-  public void setName(String name) {
-    this.name = name;
-  }
+    public String getTldBodyContent() {
+        return tldBodyContent;
+    }
 
-  public String getTldBodyContent() {
-    return tldBodyContent;
-  }
+    public void setTldBodyContent(String tldBodyContent) {
+        this.tldBodyContent = tldBodyContent;
+    }
 
-  public void setTldBodyContent(String tldBodyContent) {
-    this.tldBodyContent = tldBodyContent;
-  }
+    public String getTldTagClass() {
+        return tldTagClass;
+    }
 
-  public String getTldTagClass() {
-    return tldTagClass;
-  }
+    public void setTldTagClass(String tldTagClass) {
+        this.tldTagClass = tldTagClass;
+    }
 
-  public void setTldTagClass(String tldTagClass) {
-    this.tldTagClass = tldTagClass;
-  }
+    public void addTagAttribute(TagAttribute attribute) {
+        if (!attributes.containsKey(attribute.getName()))
+            attributes.put(attribute.getName(), attribute);
+    }
 
-  public void addTagAttribute(TagAttribute attribute) {
-    if(!attributes.containsKey(attribute.getName()))
-      attributes.put(attribute.getName(), attribute);
-  }
+    public Collection<TagAttribute> getAttributes() {
+        return attributes.values();
+    }
 
-  public Collection<TagAttribute> getAttributes() {
-    return attributes.values();
-  }
+    public boolean isInclude() {
+        return include;
+    }
 
-  public boolean isInclude() {
-    return include;
-  }
+    public void setInclude(boolean include) {
+        this.include = include;
+    }
 
-  public void setInclude(boolean include) {
-    this.include = include;
-  }
+    public String getDeclaredType() {
+        return declaredType;
+    }
 
-  public String getDeclaredType() {
-    return declaredType;
-  }
-
-  public void setDeclaredType(String declaredType) {
-    this.declaredType = declaredType;
-  }
+    public void setDeclaredType(String declaredType) {
+        this.declaredType = declaredType;
+    }
 }
diff --git a/src/main/java/org/apache/struts/annotations/taglib/apt/TagAnnotationProcessor.java b/src/main/java/org/apache/struts/annotations/taglib/apt/TagAnnotationProcessor.java
index 47042da..47aea53 100644
--- a/src/main/java/org/apache/struts/annotations/taglib/apt/TagAnnotationProcessor.java
+++ b/src/main/java/org/apache/struts/annotations/taglib/apt/TagAnnotationProcessor.java
@@ -19,6 +19,7 @@
  * under the License.
  */
 package org.apache.struts.annotations.taglib.apt;
+
 import java.io.BufferedWriter;
 import java.io.File;
 import java.io.FileOutputStream;
@@ -58,295 +59,324 @@
 import freemarker.template.Template;
 
 public class TagAnnotationProcessor implements AnnotationProcessor {
-  public static final String TAG = "org.apache.struts.annotations.StrutsTag";
-  public static final String TAG_ATTRIBUTE = "org.apache.struts.annotations.StrutsTagAttribute";
+    public static final String TAG = "org.apache.struts.annotations.StrutsTag";
+    public static final String TAG_ATTRIBUTE = "org.apache.struts.annotations.StrutsTagAttribute";
 
-  private AnnotationProcessorEnvironment environment;
-  private AnnotationTypeDeclaration tagDeclaration;
-  private AnnotationTypeDeclaration tagAttributeDeclaration;
-  private Map<String, Tag> tags = new HashMap<String, Tag>();
+    private AnnotationProcessorEnvironment environment;
+    private AnnotationTypeDeclaration tagDeclaration;
+    private AnnotationTypeDeclaration tagAttributeDeclaration;
+    private Map<String, Tag> tags = new HashMap<String, Tag>();
 
-  public TagAnnotationProcessor(AnnotationProcessorEnvironment env) {
-    environment = env;
-    tagDeclaration = (AnnotationTypeDeclaration) environment.getTypeDeclaration(TAG);
-    tagAttributeDeclaration = (AnnotationTypeDeclaration) environment
-        .getTypeDeclaration(TAG_ATTRIBUTE);
-  }
-
-  public void process() {
-    //make sure all paramters were set
-    checkOptions();
-
-    // tags
-    Collection<Declaration> tagDeclarations = environment
-        .getDeclarationsAnnotatedWith(tagDeclaration);
-    Collection<Declaration> attributesDeclarations = environment
-        .getDeclarationsAnnotatedWith(tagAttributeDeclaration);
-
-    // find Tags
-    for (Declaration declaration : tagDeclarations) {
-      // type
-      TypeDeclaration typeDeclaration = (TypeDeclaration) declaration;
-      String typeName = typeDeclaration.getQualifiedName();
-      HashMap<String, Object> values = getValues(typeDeclaration, tagDeclaration);
-      // create Tag and apply values found
-      Tag tag = new Tag();
-      tag.setDescription((String) values.get("description"));
-      tag.setName((String) values.get("name"));
-      tag.setTldBodyContent((String) values.get("tldBodyContent"));
-      tag.setTldTagClass((String) values.get("tldTagClass"));
-      tag.setDeclaredType(typeName);
-      // add to map
-      tags.put(typeName, tag);
+    public TagAnnotationProcessor(AnnotationProcessorEnvironment env) {
+        environment = env;
+        tagDeclaration = (AnnotationTypeDeclaration) environment
+                .getTypeDeclaration(TAG);
+        tagAttributeDeclaration = (AnnotationTypeDeclaration) environment
+                .getTypeDeclaration(TAG_ATTRIBUTE);
     }
 
-    // find Tags Attributes
-    for (Declaration declaration : attributesDeclarations) {
-      // type
-      MethodDeclaration methodDeclaration = (MethodDeclaration) declaration;
-      String typeName = methodDeclaration.getDeclaringType().getQualifiedName();
-      HashMap<String, Object> values = getValues(methodDeclaration, tagAttributeDeclaration);
-      // create Attribute and apply values found
-      TagAttribute attribute = new TagAttribute();
-      attribute.setDescription((String) values.get("description"));
-      String name = (String) values.get("name");
-      if(name == null || name.length() == 0) {
-        //get name from method
-        String methodName = methodDeclaration.getSimpleName();
-        name = String.valueOf(Character.toLowerCase(methodName.charAt(3))) + methodName.substring(4);
-      }
-      attribute.setName(name);
-      attribute.setRequired((Boolean) values.get("required"));
-      attribute.setRtexprvalue((Boolean) values.get("rtexprvalue"));
-      attribute.setDefaultValue((String) values.get("defaultValue"));
-      // add to map
-      Tag parentTag = tags.get(typeName);
-      if(parentTag != null)
-        tags.get(typeName).addTagAttribute(attribute);
-      else {
-        //an abstract or base class
-        parentTag = new Tag();
-        parentTag.setDeclaredType(typeName);
-        parentTag.setInclude(false);
-        parentTag.addTagAttribute(attribute);
-        tags.put(typeName, parentTag);
-      }
-    }
+    public void process() {
+        // make sure all paramters were set
+        checkOptions();
 
-    //we can't process the hierarchy on the first pass because
-    //apt does not garantees that the base classes will be processed
-    //before their subclasses
-    for(Map.Entry<String, Tag> entry : tags.entrySet()) {
-      processHierarchy(entry.getValue());
-    }
+        // tags
+        Collection<Declaration> tagDeclarations = environment
+                .getDeclarationsAnnotatedWith(tagDeclaration);
+        Collection<Declaration> attributesDeclarations = environment
+                .getDeclarationsAnnotatedWith(tagAttributeDeclaration);
 
-    //save
-    saveAsXml();
-    saveTemplates();
-  }
-
-  private void processHierarchy(Tag tag) {
-    try {
-      Class clazz = Class.forName(tag.getDeclaredType());
-      while((clazz = clazz.getSuperclass()) != null) {
-        Tag parentTag = tags.get(clazz.getName());
-        //copy parent annotations to this tag
-        if(parentTag != null) {
-          for(TagAttribute attribute : parentTag.getAttributes()) {
-            tag.addTagAttribute(attribute);
-          }
+        // find Tags
+        for (Declaration declaration : tagDeclarations) {
+            // type
+            TypeDeclaration typeDeclaration = (TypeDeclaration) declaration;
+            String typeName = typeDeclaration.getQualifiedName();
+            HashMap<String, Object> values = getValues(typeDeclaration,
+                    tagDeclaration);
+            // create Tag and apply values found
+            Tag tag = new Tag();
+            tag.setDescription((String) values.get("description"));
+            tag.setName((String) values.get("name"));
+            tag.setTldBodyContent((String) values.get("tldBodyContent"));
+            tag.setTldTagClass((String) values.get("tldTagClass"));
+            tag.setDeclaredType(typeName);
+            // add to map
+            tags.put(typeName, tag);
         }
-      }
-    } catch (ClassNotFoundException e) {
-      throw new RuntimeException(e);
+
+        // find Tags Attributes
+        for (Declaration declaration : attributesDeclarations) {
+            // type
+            MethodDeclaration methodDeclaration = (MethodDeclaration) declaration;
+            String typeName = methodDeclaration.getDeclaringType()
+                    .getQualifiedName();
+            HashMap<String, Object> values = getValues(methodDeclaration,
+                    tagAttributeDeclaration);
+            // create Attribute and apply values found
+            TagAttribute attribute = new TagAttribute();
+            attribute.setDescription((String) values.get("description"));
+            String name = (String) values.get("name");
+            if (name == null || name.length() == 0) {
+                // get name from method
+                String methodName = methodDeclaration.getSimpleName();
+                name = String.valueOf(Character.toLowerCase(methodName
+                        .charAt(3)))
+                        + methodName.substring(4);
+            }
+            attribute.setName(name);
+            attribute.setRequired((Boolean) values.get("required"));
+            attribute.setRtexprvalue((Boolean) values.get("rtexprvalue"));
+            attribute.setDefaultValue((String) values.get("defaultValue"));
+            // add to map
+            Tag parentTag = tags.get(typeName);
+            if (parentTag != null)
+                tags.get(typeName).addTagAttribute(attribute);
+            else {
+                // an abstract or base class
+                parentTag = new Tag();
+                parentTag.setDeclaredType(typeName);
+                parentTag.setInclude(false);
+                parentTag.addTagAttribute(attribute);
+                tags.put(typeName, parentTag);
+            }
+        }
+
+        // we can't process the hierarchy on the first pass because
+        // apt does not garantees that the base classes will be processed
+        // before their subclasses
+        for (Map.Entry<String, Tag> entry : tags.entrySet()) {
+            processHierarchy(entry.getValue());
+        }
+
+        // save
+        saveAsXml();
+        saveTemplates();
     }
-  }
 
-  private void checkOptions() {
-    if(getOption("tlibVersion") == null)
-      throw new IllegalArgumentException("'tlibVersion' is missing");
-    if(getOption("jspVersion") == null)
-      throw new IllegalArgumentException("'jspVersion' is missing");
-    if(getOption("shortName") == null)
-      throw new IllegalArgumentException("'shortName' is missing");
-    if(getOption("description") == null)
-      throw new IllegalArgumentException("'description' is missing");
-    if(getOption("displayName") == null)
-      throw new IllegalArgumentException("'displayName' is missing");
-    if(getOption("uri") == null)
-      throw new IllegalArgumentException("'uri' is missing");
-    if(getOption("outTemplatesDir") == null)
-      throw new IllegalArgumentException("'outTemplatesDir' is missing");
-    if(getOption("outFile") == null)
-	      throw new IllegalArgumentException("'outFile' is missing");
-  }
+    private void processHierarchy(Tag tag) {
+        try {
+            Class clazz = Class.forName(tag.getDeclaredType());
+            while ((clazz = clazz.getSuperclass()) != null) {
+                Tag parentTag = tags.get(clazz.getName());
+                // copy parent annotations to this tag
+                if (parentTag != null) {
+                    for (TagAttribute attribute : parentTag.getAttributes()) {
+                        tag.addTagAttribute(attribute);
+                    }
+                }
+            }
+        } catch (ClassNotFoundException e) {
+            throw new RuntimeException(e);
+        }
+    }
 
-  private void saveTemplates() {
-      //freemarker configuration
-      Configuration config = new Configuration();
-      config.setClassForTemplateLoading(getClass(), "");
-      config.setObjectWrapper(new DefaultObjectWrapper());
+    private void checkOptions() {
+        if (getOption("tlibVersion") == null)
+            throw new IllegalArgumentException("'tlibVersion' is missing");
+        if (getOption("jspVersion") == null)
+            throw new IllegalArgumentException("'jspVersion' is missing");
+        if (getOption("shortName") == null)
+            throw new IllegalArgumentException("'shortName' is missing");
+        if (getOption("description") == null)
+            throw new IllegalArgumentException("'description' is missing");
+        if (getOption("displayName") == null)
+            throw new IllegalArgumentException("'displayName' is missing");
+        if (getOption("uri") == null)
+            throw new IllegalArgumentException("'uri' is missing");
+        if (getOption("outTemplatesDir") == null)
+            throw new IllegalArgumentException("'outTemplatesDir' is missing");
+        if (getOption("outFile") == null)
+            throw new IllegalArgumentException("'outFile' is missing");
+    }
 
-      try {
-        //load template
-        Template template = config.getTemplate("tag.ftl");
-        String rootDir = (new File(getOption("outTemplatesDir"))).getAbsolutePath();
-        for(Tag tag : tags.values()) {
-            if(tag.isInclude()) {
-                //model
-                HashMap root = new HashMap();
-                root.put("tag", tag);
+    private void saveTemplates() {
+        // freemarker configuration
+        Configuration config = new Configuration();
+        config.setClassForTemplateLoading(getClass(), "");
+        config.setObjectWrapper(new DefaultObjectWrapper());
 
-                //save file
-                BufferedWriter writer = new BufferedWriter(new FileWriter(new File(rootDir, tag.getName() + ".html")));
-                try {
-                    template.process(root, writer);
-                } finally {
-                    writer.close();
+        try {
+            // load template
+            Template template = config.getTemplate("tag.ftl");
+            String rootDir = (new File(getOption("outTemplatesDir")))
+                    .getAbsolutePath();
+            for (Tag tag : tags.values()) {
+                if (tag.isInclude()) {
+                    // model
+                    HashMap root = new HashMap();
+                    root.put("tag", tag);
+
+                    // save file
+                    BufferedWriter writer = new BufferedWriter(new FileWriter(
+                            new File(rootDir, tag.getName() + ".html")));
+                    try {
+                        template.process(root, writer);
+                    } finally {
+                        writer.close();
+                    }
+                }
+            }
+        } catch (Exception e) {
+            // oops we cannot throw checked exceptions
+            throw new RuntimeException(e);
+        }
+    }
+
+    private void saveAsXml() {
+        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+        DocumentBuilder builder;
+
+        try {
+            // create xml document
+            builder = factory.newDocumentBuilder();
+            Document document = builder.newDocument();
+            document.setXmlVersion("1.0");
+
+            // taglib
+            Element tagLib = document.createElement("taglib");
+            document.appendChild(tagLib);
+            // tag lib attributes
+            appendTextNode(document, tagLib, "tlib-version",
+                    getOption("tlibVersion"), false);
+            appendTextNode(document, tagLib, "jsp-version",
+                    getOption("jspVersion"), false);
+            appendTextNode(document, tagLib, "short-name",
+                    getOption("shortName"), false);
+            appendTextNode(document, tagLib, "uri", getOption("uri"), false);
+            appendTextNode(document, tagLib, "display-name",
+                    getOption("displayName"), false);
+            appendTextNode(document, tagLib, "description",
+                    getOption("description"), true);
+
+            // create tags
+            for (Map.Entry<String, Tag> entry : tags.entrySet()) {
+                Tag tag = entry.getValue();
+                if (tag.isInclude())
+                    createElement(document, tagLib, tag);
+            }
+
+            // save to file
+            TransformerFactory tf = TransformerFactory.newInstance();
+            tf.setAttribute("indent-number", new Integer(2));
+            Transformer transformer = tf.newTransformer();
+            // if tiger would just format it :(
+            // formatting bug in tiger
+            // (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6296446)
+
+            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+            transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC,
+                    "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN");
+            transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM,
+                    "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd");
+            transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
+
+            Source source = new DOMSource(document);
+            Result result = new StreamResult(new OutputStreamWriter(
+                    new FileOutputStream(getOption("outFile"))));
+            transformer.transform(source, result);
+        } catch (Exception e) {
+            // oops we cannot throw checked exceptions
+            throw new RuntimeException(e);
+        }
+    }
+
+    private String getOption(String name) {
+        // there is a bug in the 1.5 apt implementation:
+        // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6258929
+        // this is a hack-around
+        if (environment.getOptions().containsKey(name))
+            return environment.getOptions().get(name);
+
+        for (Map.Entry<String, String> entry : environment.getOptions()
+                .entrySet()) {
+            String key = entry.getKey();
+            String[] splitted = key.split("=");
+            if (splitted[0].equals("-A" + name))
+                return splitted[1];
+        }
+        return null;
+    }
+
+    private void createElement(Document doc, Element tagLibElement, Tag tag) {
+        Element tagElement = doc.createElement("tag");
+        tagLibElement.appendChild(tagElement);
+        appendTextNode(doc, tagElement, "name", tag.getName(), false);
+        appendTextNode(doc, tagElement, "tag-class", tag.getTldTagClass(),
+                false);
+        appendTextNode(doc, tagElement, "body-content",
+                tag.getTldBodyContent(), false);
+        appendTextNode(doc, tagElement, "description", tag.getDescription(),
+                true);
+
+        // save attributes
+        for (TagAttribute attribute : tag.getAttributes()) {
+            createElement(doc, tagElement, attribute);
+        }
+
+    }
+
+    private void createElement(Document doc, Element tagElement,
+            TagAttribute attribute) {
+        Element attributeElement = doc.createElement("attribute");
+        tagElement.appendChild(attributeElement);
+        appendTextNode(doc, attributeElement, "name", attribute.getName(),
+                false);
+        appendTextNode(doc, attributeElement, "required", String
+                .valueOf(attribute.isRequired()), false);
+        appendTextNode(doc, attributeElement, "rtexprvalue", String
+                .valueOf(attribute.isRtexprvalue()), false);
+        appendTextNode(doc, attributeElement, "description", attribute
+                .getDescription(), true);
+    }
+
+    private void appendTextNode(Document doc, Element element, String name,
+            String text, boolean cdata) {
+        Text textNode = cdata ? doc.createCDATASection(text) : doc
+                .createTextNode(text);
+        Element newElement = doc.createElement(name);
+        newElement.appendChild(textNode);
+        element.appendChild(newElement);
+    }
+
+    /**
+     * Get values of annotation
+     * 
+     * @param declaration
+     * @param type
+     *            The type of the annotation
+     * @return name->value map of annotation values
+     */
+    private HashMap<String, Object> getValues(Declaration declaration,
+            AnnotationTypeDeclaration type) {
+        HashMap<String, Object> values = new HashMap<String, Object>();
+        Collection<AnnotationMirror> annotations = declaration
+                .getAnnotationMirrors();
+        // iterate over the mirrors.
+
+        for (AnnotationMirror mirror : annotations) {
+            // if the mirror in this iteration is for our note declaration...
+            if (mirror.getAnnotationType().getDeclaration().equals(type)) {
+                for (AnnotationTypeElementDeclaration annotationType : mirror
+                        .getElementValues().keySet()) {
+                    Object value = mirror.getElementValues()
+                            .get(annotationType).getValue();
+                    Object defaultValue = annotationType.getDefaultValue();
+                    values.put(annotationType.getSimpleName(),
+                            value != null ? value : defaultValue);
                 }
             }
         }
-      } catch (Exception e) {
-        //oops we cannot throw checked exceptions
-        throw new RuntimeException(e);
-      }
-  }
 
-
-  private void saveAsXml() {
-    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-    DocumentBuilder builder;
-
-    try {
-      // create xml document
-      builder = factory.newDocumentBuilder();
-      Document document = builder.newDocument();
-      document.setXmlVersion("1.0");
-
-      // taglib
-      Element tagLib = document.createElement("taglib");
-      document.appendChild(tagLib);
-      // tag lib attributes
-      appendTextNode(document, tagLib, "tlib-version", getOption("tlibVersion"), false);
-      appendTextNode(document, tagLib, "jsp-version", getOption("jspVersion"), false);
-      appendTextNode(document, tagLib, "short-name", getOption("shortName"), false);
-      appendTextNode(document, tagLib, "uri", getOption("uri"), false);
-      appendTextNode(document, tagLib, "display-name", getOption("displayName"), false);
-      appendTextNode(document, tagLib, "description", getOption("description"), true);
-
-      // create tags
-      for (Map.Entry<String, Tag> entry : tags.entrySet()) {
-        Tag tag = entry.getValue();
-        if(tag.isInclude())
-          createElement(document, tagLib, tag);
-      }
-
-      // save to file
-      TransformerFactory tf = TransformerFactory.newInstance();
-      tf.setAttribute("indent-number", new Integer(2));
-      Transformer transformer = tf.newTransformer();
-      //if tiger would just format it :(
-      //formatting bug in tiger (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6296446)
-
-      transformer.setOutputProperty(OutputKeys.INDENT, "yes");
-      transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN");
-      transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd");
-      transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
-
-      Source source = new DOMSource(document);
-      Result result = new StreamResult(new OutputStreamWriter(new FileOutputStream(getOption("outFile"))));
-      transformer.transform(source, result);
-    } catch (Exception e) {
-      // oops we cannot throw checked exceptions
-      throw new RuntimeException(e);
-    }
-  }
-
-  private String getOption(String name) {
-    // there is a bug in the 1.5 apt implementation:
-    // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6258929
-    // this is a hack-around
-    if (environment.getOptions().containsKey(name))
-      return environment.getOptions().get(name);
-
-    for (Map.Entry<String, String> entry : environment.getOptions().entrySet()) {
-      String key = entry.getKey();
-      String[] splitted = key.split("=");
-      if (splitted[0].equals("-A" + name))
-        return splitted[1];
-    }
-    return null;
-  }
-
-  private void createElement(Document doc, Element tagLibElement, Tag tag) {
-    Element tagElement = doc.createElement("tag");
-    tagLibElement.appendChild(tagElement);
-    appendTextNode(doc, tagElement, "name", tag.getName(), false);
-    appendTextNode(doc, tagElement, "tag-class", tag.getTldTagClass(), false);
-    appendTextNode(doc, tagElement, "body-content", tag.getTldBodyContent(), false);
-    appendTextNode(doc, tagElement, "description", tag.getDescription(), true);
-
-    // save attributes
-    for (TagAttribute attribute : tag.getAttributes()) {
-      createElement(doc, tagElement, attribute);
-    }
-
-  }
-
-  private void createElement(Document doc, Element tagElement, TagAttribute attribute) {
-    Element attributeElement = doc.createElement("attribute");
-    tagElement.appendChild(attributeElement);
-    appendTextNode(doc, attributeElement, "name", attribute.getName(), false);
-    appendTextNode(doc, attributeElement, "required", String.valueOf(attribute.isRequired()), false);
-    appendTextNode(doc,
-        attributeElement,
-        "rtexprvalue",
-        String.valueOf(attribute.isRtexprvalue()),
-        false);
-    appendTextNode(doc, attributeElement, "description", attribute.getDescription(), true);
-  }
-
-  private void appendTextNode(Document doc, Element element, String name, String text, boolean cdata) {
-    Text textNode = cdata ? doc.createCDATASection(text) : doc.createTextNode(text);
-    Element newElement = doc.createElement(name);
-    newElement.appendChild(textNode);
-    element.appendChild(newElement);
-  }
-
-  /**
-   * Get values of annotation
-   *
-   * @param declaration
-   * @param type
-   *          The type of the annotation
-   * @return name->value map of annotation values
-   */
-  private HashMap<String, Object> getValues(Declaration declaration, AnnotationTypeDeclaration type) {
-    HashMap<String, Object> values = new HashMap<String, Object>();
-    Collection<AnnotationMirror> annotations = declaration.getAnnotationMirrors();
-    // iterate over the mirrors.
-
-    for (AnnotationMirror mirror : annotations) {
-      // if the mirror in this iteration is for our note declaration...
-      if (mirror.getAnnotationType().getDeclaration().equals(type)) {
-        for(AnnotationTypeElementDeclaration annotationType : mirror.getElementValues().keySet()) {
-          Object value = mirror.getElementValues().get(annotationType).getValue();
-          Object defaultValue = annotationType.getDefaultValue();
-          values.put(annotationType.getSimpleName(), value != null ? value : defaultValue);
+        // find default values...painful
+        for (AnnotationTypeElementDeclaration annotationType : type
+                .getMethods()) {
+            AnnotationValue value = annotationType.getDefaultValue();
+            if (value != null) {
+                String name = annotationType.getSimpleName();
+                if (!values.containsKey(name))
+                    values.put(name, value.getValue());
+            }
         }
-      }
-    }
 
-    //find default values...painful
-    for(AnnotationTypeElementDeclaration annotationType : type.getMethods()) {
-        AnnotationValue value = annotationType.getDefaultValue();
-        if(value != null) {
-            String name = annotationType.getSimpleName();
-            if(!values.containsKey(name))
-                values.put(name, value.getValue());
-        }
+        return values;
     }
-
-    return values;
-  }
 }
diff --git a/src/main/java/org/apache/struts/annotations/taglib/apt/TagAttribute.java b/src/main/java/org/apache/struts/annotations/taglib/apt/TagAttribute.java
index 2f05a50..b14d8e6 100644
--- a/src/main/java/org/apache/struts/annotations/taglib/apt/TagAttribute.java
+++ b/src/main/java/org/apache/struts/annotations/taglib/apt/TagAttribute.java
@@ -23,52 +23,52 @@
 
 /**
  * Used to hold tag attribute information for TLD generation
- *
+ * 
  */
 public class TagAttribute {
-  private String name;
-  private boolean required;
-  private boolean rtexprvalue;
-  private String description;
-  private String defaultValue;
+    private String name;
+    private boolean required;
+    private boolean rtexprvalue;
+    private String description;
+    private String defaultValue;
 
-  public String getDescription() {
-    return description;
-  }
+    public String getDescription() {
+        return description;
+    }
 
-  public void setDescription(String description) {
-    this.description = description;
-  }
+    public void setDescription(String description) {
+        this.description = description;
+    }
 
-  public String getName() {
-    return name;
-  }
+    public String getName() {
+        return name;
+    }
 
-  public void setName(String name) {
-    this.name = name;
-  }
+    public void setName(String name) {
+        this.name = name;
+    }
 
-  public boolean isRequired() {
-    return required;
-  }
+    public boolean isRequired() {
+        return required;
+    }
 
-  public void setRequired(boolean required) {
-    this.required = required;
-  }
+    public void setRequired(boolean required) {
+        this.required = required;
+    }
 
-  public boolean isRtexprvalue() {
-    return rtexprvalue;
-  }
+    public boolean isRtexprvalue() {
+        return rtexprvalue;
+    }
 
-  public void setRtexprvalue(boolean rtexprvalue) {
-    this.rtexprvalue = rtexprvalue;
-  }
+    public void setRtexprvalue(boolean rtexprvalue) {
+        this.rtexprvalue = rtexprvalue;
+    }
 
-  public String getDefaultValue() {
-    return defaultValue;
-  }
+    public String getDefaultValue() {
+        return defaultValue;
+    }
 
-  public void setDefaultValue(String defaultValue) {
-    this.defaultValue = defaultValue;
-  }
+    public void setDefaultValue(String defaultValue) {
+        this.defaultValue = defaultValue;
+    }
 }
