diff --git a/src/main/java/org/codehaus/surefire/report/BriefConsoleReporter.java b/src/main/java/org/codehaus/surefire/report/BriefConsoleReporter.java
index 100d45e..c4439f9 100644
--- a/src/main/java/org/codehaus/surefire/report/BriefConsoleReporter.java
+++ b/src/main/java/org/codehaus/surefire/report/BriefConsoleReporter.java
@@ -17,11 +17,16 @@
  */
 
 import java.io.BufferedOutputStream;
-import java.io.File;
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 
+/**
+ *  Brief format console reporter.
+ *  @author <a href="mailto:jruiz@exist.com">Johnny R. Ruiz III</a>
+ *  @version $Id: BriefConsoleReporter.java 62 2005-10-07 06:50:37Z jruiz $
+ */
+
 public class BriefConsoleReporter
     extends AbstractReporter
 {
@@ -137,7 +142,11 @@
         reportContent.append( "  Time elapsed: " + elapsedTimeAsString( sec ) + " sec" );
     }
     
-   
+    /**
+     * Returns stacktrace as String.
+     * @param report ReportEntry object. 
+     * @return stacktrace as string. 
+     */
     private String getStackTrace(ReportEntry report)
     {   
         StringWriter writer = new StringWriter();
diff --git a/src/main/java/org/codehaus/surefire/report/BriefFileReporter.java b/src/main/java/org/codehaus/surefire/report/BriefFileReporter.java
index 16c1648..87fcada 100644
--- a/src/main/java/org/codehaus/surefire/report/BriefFileReporter.java
+++ b/src/main/java/org/codehaus/surefire/report/BriefFileReporter.java
@@ -21,6 +21,11 @@
 import java.io.PrintWriter;
 import java.io.StringWriter;
 
+/**
+ * Brief format file reporter.
+ * @author <a href="mailto:jruiz@exist.com">Johnny R. Ruiz III</a>
+ * @version $Id: BriefeFileReporter.java 62 2005-10-07 04:07:33Z jruiz $
+ */
 public class BriefFileReporter
     extends AbstractReporter
 {
@@ -156,6 +161,11 @@
         reportContent.append("\n");
     }
     
+    /**
+     * Returns stacktrace as String.
+     * @param report ReportEntry object. 
+     * @return stacktrace as string. 
+     */
     private String getStackTrace(ReportEntry report)
     {   
         StringWriter writer = new StringWriter();
diff --git a/src/main/java/org/codehaus/surefire/report/DetailedConsoleReporter.java b/src/main/java/org/codehaus/surefire/report/DetailedConsoleReporter.java
index a1c40b8..a2a306c 100644
--- a/src/main/java/org/codehaus/surefire/report/DetailedConsoleReporter.java
+++ b/src/main/java/org/codehaus/surefire/report/DetailedConsoleReporter.java
@@ -17,11 +17,15 @@
  */
 
 import java.io.BufferedOutputStream;
-import java.io.File;
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 
+/**
+ * Detailed console reporter.
+ * @author <a href="mailto:jruiz@exist.com">Johnny R. Ruiz III</a>
+ * @version $Id: DetailedConsoleReporter.java 61 2005-10-07 04:07:33Z jruiz $
+ */
 public class DetailedConsoleReporter
     extends AbstractReporter
 {
@@ -145,7 +149,11 @@
         reportContent.append( "  Time elapsed: " + elapsedTimeAsString( sec ) + " sec" );
     }
     
-   
+   /**
+    * Returns stacktrace as string.
+    * @param report ReportEntry object.
+    * @return stacktrace as string. 
+    */
     private String getStackTrace(ReportEntry report)
     {   
         StringWriter writer = new StringWriter();
diff --git a/src/main/java/org/codehaus/surefire/report/FileReporter.java b/src/main/java/org/codehaus/surefire/report/FileReporter.java
index 93cf9d5..80d1a1b 100644
--- a/src/main/java/org/codehaus/surefire/report/FileReporter.java
+++ b/src/main/java/org/codehaus/surefire/report/FileReporter.java
@@ -18,10 +18,14 @@
 
 import java.io.File;
 import java.io.FileWriter;
-import java.io.OutputStream;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 
+/**
+ * Text file reporter.
+ * @author <a href="mailto:jruiz@exist.com">Johnny R. Ruiz III</a>
+ * @version $Id$
+ */
 public class FileReporter
     extends AbstractReporter
 {
@@ -170,6 +174,11 @@
         reportContent.append(newLine);
     }
     
+    /**
+     * 
+     * @param report ReportEntry Object.
+     * @return stacktrace as string.
+     */
     private String getStackTrace(ReportEntry report)
     {   
         StringWriter writer = new StringWriter();
diff --git a/src/main/java/org/codehaus/surefire/report/SummaryConsoleReporter.java b/src/main/java/org/codehaus/surefire/report/SummaryConsoleReporter.java
index 0074a3c..4c04660 100644
--- a/src/main/java/org/codehaus/surefire/report/SummaryConsoleReporter.java
+++ b/src/main/java/org/codehaus/surefire/report/SummaryConsoleReporter.java
@@ -20,6 +20,11 @@
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 
+/**
+ * Summary format console reporter.
+ * @author <a href="mailto:jruiz@exist.com">Johnny R. Ruiz III</a>
+ * @version $Id: SummaryConsoleReporter.java 61 2005-10-07 04:07:33Z jruiz $
+ */
 public class SummaryConsoleReporter
     extends AbstractReporter
 {
diff --git a/src/main/java/org/codehaus/surefire/report/XMLReporter.java b/src/main/java/org/codehaus/surefire/report/XMLReporter.java
index 3dd98c7..63f6415 100644
--- a/src/main/java/org/codehaus/surefire/report/XMLReporter.java
+++ b/src/main/java/org/codehaus/surefire/report/XMLReporter.java
@@ -30,8 +30,9 @@
 
 
 /**
+ * XML format reporter.
  * @author <a href="mailto:jruiz@exist.com">Johnny R. Ruiz III</a>
- * @version $Id: XMLReporter.java 61 2005-07-31 04:07:33Z jruiz $
+ * @version $Id: XMLReporter.java 61 2005-10-07 04:07:33Z jruiz $
  */
 public class XMLReporter 
     extends AbstractReporter
@@ -46,7 +47,7 @@
     
     public void runStarting( int testCount )
     {
-        Properties sysProps = System.getProperties();
+
     }
 
     public void batteryStarting( ReportEntry report )
@@ -184,7 +185,11 @@
         
         return component;
     }
-    
+    /**
+     * Returns stacktrace as String.
+     * @param report ReportEntry object. 
+     * @return stacktrace as string. 
+     */
     private String getStackTrace(ReportEntry report)
     {   
         StringWriter writer = new StringWriter();
@@ -196,6 +201,10 @@
         return writer.toString();
     }
     
+    /**
+     * Adds system properties to the XML report.
+     *
+     */
     private void showProperties()
     {
         Xpp3Dom properties = createElement(testSuite,"properties");
