Initial commit
diff --git a/testng/maven/plugin-resources/junitRpt-failed.jsl b/testng/maven/plugin-resources/junitRpt-failed.jsl
new file mode 100644
index 0000000..641be50
--- /dev/null
+++ b/testng/maven/plugin-resources/junitRpt-failed.jsl
@@ -0,0 +1,307 @@
+<?xml version="1.0"?>
+<!-- 
+/*
+ * Copyright 2001-2004 The Apache Software Foundation.
+ * 
+ * Licensed 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.
+ */
+ -->
+
+
+<jsl:stylesheet
+  select="$doc"
+  xmlns:j="jelly:core"
+  xmlns:jsl="jelly:jsl"
+  xmlns:x="jelly:xml"
+  xmlns:define="jelly:define"
+  xmlns:util="jelly:util"
+  xmlns:junit="junit"
+  xmlns:doc="doc"
+  trim="false">
+
+  <!-- This needs to be instantiated here to be available in the template matches -->
+  <j:useBean var="mavenTool" class="org.apache.maven.MavenTool"/>
+  <j:useBean var="numbers" class="java.text.DecimalFormat"/>
+  <j:useBean var="htmlescape" class="org.apache.velocity.anakia.Escape"/>
+  <j:useBean var="formatter" class="org.apache.maven.DVSLFormatter"/>
+  <j:useBean var="fileutil" class="org.apache.velocity.texen.util.FileUtil"/>
+  <j:useBean var="pathtool" class="org.apache.maven.util.DVSLPathTool"/>
+
+  
+  <define:taglib uri="junit">
+    <define:tag name="nav">
+      <p>
+        [
+        <a href="#Summary">summary</a>]
+        [
+        <a href="#Package List">package list</a>]
+        [
+        <a href="#Test Cases">test cases</a>]
+      </p>
+    </define:tag>
+    
+    <define:tag name="testSuiteHeader">
+      <tr>
+        <th>Name</th>
+        <th>Tests</th>
+        <th>Errors</th>
+        <th>Failures</th>
+        <th>Time(s)</th>
+      </tr>
+    </define:tag>
+    
+    <define:tag name="testCaseHeader">
+      <tr>
+        <th>Name</th>
+        <th>Status</th>
+        <th>Type</th>
+        <th>Time(s)</th>
+      </tr>
+    </define:tag>
+    
+    <define:tag name="displayFailure">
+      <j:choose>
+        <j:when test="${current.attribute('message') != null}">
+          <code>
+            ${htmlescape.getText(current.attribute('message').value)}
+          </code>
+        </j:when>
+        <j:otherwise>
+          N/A
+        </j:otherwise>
+      </j:choose>
+    </define:tag>
+  </define:taglib>
+
+  <jsl:template match="testsuites">
+    <document>
+
+      <properties>
+        <title>JUnit Test Results</title>
+      </properties>
+
+      <body>
+        <section name="Summary">
+          <junit:nav/>
+          <j:set var="testCount"><x:expr select="sum(testsuite/@tests)"/></j:set>
+          <j:set var="errorCount"><x:expr select="sum(testsuite/@errors)"/></j:set>
+          <j:set var="failureCount"><x:expr select="sum(testsuite/@failures)"/></j:set>
+          <j:set var="timeCount"><x:expr select="sum(testsuite/@time)"/></j:set>
+          <j:set var="successRate"><x:expr select="($testCount - ($failureCount + $errorCount)) div $testCount"/></j:set>
+          <table>
+            <tr>
+              <th>Tests</th>
+              <th>Errors</th>
+              <th>Failures</th>
+              <th>Success rate</th>
+              <th>Time(s)</th>
+            </tr>
+            <tr>
+              <td>
+                <doc:formatAsNumber string="${testCount}" pattern="0"/>
+              </td>
+              <td>
+                <doc:formatAsNumber string="${errorCount}" pattern="0"/>
+              </td>
+              <td>
+                <doc:formatAsNumber string="${failureCount}" pattern="0"/>
+              </td>
+              <td>
+                <doc:formatAsNumber string="${successRate}" pattern="0.00%"/>
+              </td>
+              <td>
+                <doc:formatAsNumber string="${timeCount}" pattern="0.00"/>
+              </td>
+            </tr>
+          </table>
+          <p>
+            Note:
+            <i>failures</i> are anticipated and checked for with
+            assertions while
+            <i>errors</i> are unanticipated.
+          </p>
+        </section>
+
+        <section name="Package List">
+          <junit:nav/>
+          <table>
+            <!--
+            <junit:testSuiteHeader/>
+            -->
+            <x:set var="testsuites" select="./testsuite[not(./@package = preceding-sibling::testsuite/@package)]"/>
+            <j:forEach var="testsuite" items="${testsuites}">
+              <x:set var="errorCount" select="sum($testsuite/@errors)"/>
+              <x:set var="failureCount" select="sum($testsuite/@failures)"/>
+          
+              <j:if test="${errorCount.intValue() gt 0 or failureCount.intValue() gt 0}">
+              
+              <j:set var="package" value="${testsuite.attribute('package').value}"/>
+              <x:set var="quotedPackage" select='"${package}"'/>
+              <j:set var="testCount"><x:expr select="sum(./testsuite[./@package = $quotedPackage]/@tests)"/></j:set>
+              <j:set var="errorCount"><x:expr select="sum(./testsuite[./@package = $quotedPackage]/@errors)"/></j:set>
+              <j:set var="failureCount"><x:expr select="sum(./testsuite[./@package = $quotedPackage]/@failures)"/></j:set>
+              <j:set var="timeCount"><x:expr select="sum(./testsuite[./@package = $quotedPackage]/@time)"/></j:set>
+    
+              <tr>
+                <td>
+                  <a href="#${package}">${package}</a>
+                </td>
+                <td>
+                  <doc:formatAsNumber string="${testCount}" pattern="0"/>
+                </td>
+                <td>
+                  <doc:formatAsNumber string="${failureCount}" pattern="0"/>
+                </td>
+                <td>
+                  <doc:formatAsNumber string="${errorCount}" pattern="0"/>
+                </td>
+                <td>
+                  <doc:formatAsNumber string="${timeCount}" pattern="0.00"/>
+                </td>
+              </tr>
+              </j:if>
+            </j:forEach>
+            
+          </table>
+          <p>
+            Note: package statistics are not computed recursively, they only
+            sum up all of its testsuites numbers.
+          </p>
+
+          <j:forEach var="testsuite" items="${testsuites}">
+            <j:set var="package" value="${testsuite.attribute('package').value}"/>
+            <x:set var="quotedPackage" select='"${package}"'/>
+            <x:set var="errorCount" select="sum($testsuite/@errors)"/>
+            <x:set var="failureCount" select="sum($testsuite/@failures)"/>
+          
+            <j:if test="${errorCount.intValue() gt 0 or failureCount.intValue() gt 0}">
+            
+            <a name="${package}"></a>
+            <subsection name="${package}">
+              <table>
+                <x:forEach var="test" select="/testsuites/testsuite[./@package = $quotedPackage]">
+                  <x:set var="errorCount" select="count($test/testcase/error)"/>
+                  <x:set var="failureCount" select="count($test/testcase/failure)"/>
+          
+                  <j:if test="${errorCount.intValue() gt 0 or failureCount.intValue() gt 0}">
+            
+                  <tr>
+                    <td>
+                      <a href="#${test.attribute('name').value}">${testcase.attribute("classname").value}.${test.attribute('name').value}</a>
+                    </td>
+                    <td>
+                      <doc:formatAsNumber string="${test.attribute('tests').value}" pattern="0"/>
+                    </td>
+                    <td>
+                      <doc:formatAsNumber string="${test.attribute('errors').value}" pattern="0"/>
+                    </td>
+                    <td>
+                      <doc:formatAsNumber string="${test.attribute('failures').value}" pattern="0"/>
+                    </td>
+                    <td>
+                      <doc:formatAsNumber string="${test.attribute('time').value}" pattern="0.000"/>
+                    </td>
+                  </tr>
+                  </j:if>
+                </x:forEach>
+              </table>
+            </subsection>
+            </j:if>
+          </j:forEach>
+        </section>
+
+        <section name="Test Cases">
+          <junit:nav/>
+    
+          <x:set var="testsuites" select="./testsuite"/>
+          <j:forEach var="testsuite" items="${testsuites}">
+            <!--j:set var="errorCount"><x:expr select="count($testsuite/testcase/error)"/></j:set-->
+            <x:set var="errorCount" select="count($testsuite/testcase/error)"/>
+            <x:set var="failureCount" select="count($testsuite/testcase/failure)"/>
+          
+            <j:if test="${errorCount.intValue() gt 0 or failureCount.intValue() gt 0}">
+            <a name="${testsuite.attribute('name').value}"></a>
+            <subsection name="${testsuite.attribute('name').value}">
+              <table>
+               
+                ## test can even not be started at all (failure to load the class)
+                ## so report the error directly
+                ##
+
+                <x:set var="errors" select="$testsuite/error"/>
+                <j:forEach var="error" items="${errors}">
+                  <tr>
+                    <td colspan="4">
+                      <junit:displayFailure current="${error}"/>
+                    </td>
+                  </tr>
+                </j:forEach>
+    
+    
+    
+                <x:set var="testcases" select="$testsuite/testcase"/>
+                <j:forEach var="testcase" items="${testcases}">
+                  <j:set var="failure" value="${testcase.selectSingleNode('failure')}"/>
+                  <j:set var="error" value="${testcase.selectSingleNode('error')}"/>
+                  <j:if test="${!empty(failure) or !empty(error)}">
+                  <tr>
+                    <td>[${testcase.attribute("classname").value}]${testcase.attribute("name").value}</td>
+                    <j:choose>
+                      <j:when test="${failure != null}">
+                        <td style="width: 60px; color: red; font-weight: bold">Failure</td>
+                      </j:when>
+                      <j:when test="${error != null}">
+                        <td style="width: 60px; color: red; font-weight: bold">Error</td>
+                      </j:when>
+                      <j:otherwise>
+                        <td style="width: 60px;">Success</td>
+                      </j:otherwise>
+                    </j:choose>
+                    <j:choose>
+                      <j:when test="${testcase.attribute('time') != null}">
+                        <td width="60px">
+                          <doc:formatAsNumber string="${testcase.attribute('time').value}" pattern="0.00"/>
+                        </td>
+                      </j:when>
+                      <j:otherwise>
+                        <td width="60px"></td>
+                      </j:otherwise>
+                    </j:choose>
+                  </tr>
+                    <j:choose>
+                      <j:when test="${failure != null}">
+                        <tr>
+                          <td colspan="3" style="padding-left: 50px">
+                            <junit:displayFailure current="${failure}"/>
+                          </td>
+                       </tr>
+                      </j:when>
+                      <j:when test="${error != null}">
+                        <tr>
+                          <td colspan="3" style="padding-left: 50px">
+                            <junit:displayFailure current="${error}"/>
+                          </td>
+                        </tr>
+                      </j:when>
+                    </j:choose>
+                  </j:if>
+                </j:forEach>
+              </table>
+            </subsection>
+            </j:if>
+          </j:forEach>
+        </section>
+      </body>
+    </document>
+  </jsl:template>
+</jsl:stylesheet>
diff --git a/testng/maven/plugin-resources/junitRpt.jsl b/testng/maven/plugin-resources/junitRpt.jsl
new file mode 100644
index 0000000..8bf3270
--- /dev/null
+++ b/testng/maven/plugin-resources/junitRpt.jsl
@@ -0,0 +1,375 @@
+<?xml version="1.0"?>
+<!-- 
+/*
+ * Copyright 2001-2004 The Apache Software Foundation.
+ * 
+ * Licensed 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.
+ */
+ -->
+
+
+<jsl:stylesheet
+  select="$doc"
+  xmlns:j="jelly:core"
+  xmlns:jsl="jelly:jsl"
+  xmlns:x="jelly:xml"
+  xmlns:define="jelly:define"
+  xmlns:util="jelly:util"
+  xmlns:junit="junit"
+  xmlns:doc="doc"
+  trim="false">
+
+  <j:useBean var="stringTool" class="org.apache.maven.util.StringTool"/>
+  
+  <define:taglib uri="junit">
+    <define:tag name="nav">
+      <p>
+        [<a href="#Summary">summary</a>]
+        [<a href="#Package List">package list</a>]
+        [<a href="#Test Cases">test cases</a>]
+      </p>
+    </define:tag>
+    
+    <define:tag name="testSuiteHeader">
+      <tr>
+        <th>Name</th>
+        <th>Tests</th>
+        <th>Errors</th>
+        <th>Failures</th>
+        <th>Time(s)</th>
+      </tr>
+    </define:tag>
+    
+    <define:tag name="testCaseHeader">
+      <tr>
+        <th>Name</th>
+        <th>Status</th>
+        <th>Type</th>
+        <th>Time(s)</th>
+      </tr>
+    </define:tag>
+    
+    <define:tag name="displayFailure">
+      <j:choose>
+        <j:when test="${current.attribute('message') != null}">
+          <code>
+${current.attributeValue('message')}
+          </code>
+        </j:when>
+        <j:otherwise>
+          N/A
+        </j:otherwise>
+      </j:choose>
+    </define:tag>
+    
+    <!-- defined here to easily change images globally or set up relative paths -->
+    <define:tag name="displayImage">
+      <j:choose>
+        <j:when test="${kind == 'failure'}">
+          <img src="images/icon_warning_sml.gif" width="15" height="15" alt="Failure" />
+        </j:when>
+        <j:when test="${kind == 'error'}">
+          <img src="images/icon_error_sml.gif" width="15" height="15" alt="Error" />
+        </j:when>
+        <j:when test="${kind == 'success'}">
+          <img src="images/icon_success_sml.gif" width="15" height="15" alt="Success" />
+        </j:when>
+      </j:choose>
+    </define:tag>
+    
+  </define:taglib>
+
+  <jsl:template match="testsuites">
+    <document>
+
+      <properties>
+        <title>JUnit Test Results</title>
+      </properties>
+
+      <body>
+        <section name="Summary">
+          <junit:nav/>
+          <j:set var="testCount"><x:expr select="sum(testsuite/@tests)"/></j:set>
+          <j:set var="errorCount"><x:expr select="sum(testsuite/@errors)"/></j:set>
+          <j:set var="failureCount"><x:expr select="sum(testsuite/@failures)"/></j:set>
+          <j:set var="timeCount"><x:expr select="sum(testsuite/@time)"/></j:set>
+          <j:set var="successRate"><x:expr select="($testCount - ($failureCount + $errorCount)) div $testCount"/></j:set>
+          <table summary="JUnit result summary">
+          	<thead>
+           	 <tr>
+				  <th>Tests</th>
+				  <th>Errors</th>
+				  <th>Failures</th>
+				  <th>Success rate</th>
+				  <th>Time(s)</th>
+				</tr>
+            </thead>
+            <tr>
+              <td>
+                <doc:formatAsNumber string="${testCount}" pattern="0"/>
+              </td>
+              <td>
+                <doc:formatAsNumber string="${errorCount}" pattern="0"/>
+              </td>
+              <td>
+                <doc:formatAsNumber string="${failureCount}" pattern="0"/>
+              </td>
+              <td>
+                <doc:formatAsNumber string="${successRate}" pattern="0.00%"/>
+              </td>
+              <td>
+                <doc:formatAsNumber string="${timeCount}" pattern="0.00"/>
+              </td>
+            </tr>
+          </table>
+          <p>
+            Note:
+            <i>failures</i> are anticipated and checked for with
+            assertions while
+            <i>errors</i> are unanticipated.
+          </p>
+          <p>
+          	<h3><a href="../testng-output/index.html">TestNG Default Report</a></h3>Click [ <a href="../testng-output/index.html">here</a> ] to see the default report output.
+          </p>
+        </section>
+
+        <section name="Package List">
+          <junit:nav/>
+          <table summary="Package List">
+          	<thead>
+            	<tr>
+				  <th>Package</th><th>Tests</th><th>Errors</th><th>Failures</th><th>Success Rate</th><th>Time</th>
+				</tr>
+            </thead>
+            <x:set var="testsuites" select="./testsuite[not(./@package = preceding-sibling::testsuite/@package)]"/>
+            <j:forEach var="testsuite" items="${testsuites}">
+              <j:set var="package" value="${testsuite.attribute('package').value}"/>
+              <x:set var="quotedPackage" select='"${package}"'/>
+              <j:set var="testCount"><x:expr select="sum(./testsuite[./@package = $quotedPackage]/@tests)"/></j:set>
+              <j:set var="errorCount"><x:expr select="sum(./testsuite[./@package = $quotedPackage]/@errors)"/></j:set>
+              <j:set var="failureCount"><x:expr select="sum(./testsuite[./@package = $quotedPackage]/@failures)"/></j:set>
+              <j:set var="timeCount"><x:expr select="sum(./testsuite[./@package = $quotedPackage]/@time)"/></j:set>
+              <j:set var="successRate"><x:expr select="($testCount - ($failureCount + $errorCount)) div $testCount"/></j:set>    
+              <tr>
+                <td>
+                  <a href="#${package}">${package}</a>
+                </td>
+                <td>
+                  <doc:formatAsNumber string="${testCount}" pattern="0"/>
+                </td>
+                <td>
+                  <doc:formatAsNumber string="${errorCount}" pattern="0"/>
+                </td>
+                <td>
+                  <doc:formatAsNumber string="${failureCount}" pattern="0"/>
+                </td>
+                <td>
+                  <doc:formatAsNumber string="${successRate}" pattern="0.00%"/>
+                </td>
+                <td>
+                  <doc:formatAsNumber string="${timeCount}" pattern="0.00"/>
+                </td>
+              </tr>
+            </j:forEach>
+          </table>
+          <p>
+            Note: package statistics are not computed recursively, they only
+            sum up all of its testsuites numbers.
+          </p>
+
+          <j:forEach var="testsuite" items="${testsuites}">
+            <j:set var="package" value="${testsuite.attribute('package').value}"/>
+            <x:set var="quotedPackage" select='"${package}"'/>
+
+            <a name="${package}"></a>
+            <subsection name="${package}">
+              <table summary="Tests for ${package}">
+              	<thead>
+                	<tr>
+					  <th colspan="2">TestNG Test Name</th><th>Tests</th><th>Errors</th><th>Failures</th><th>Success Rate</th><th>Time</th>
+					</tr>
+                </thead>
+                <x:forEach var="test" select="/testsuites/testsuite[./@package = $quotedPackage]">
+                  <j:set var="testCount"><x:expr select="${test.attribute('tests').value}" /></j:set>
+                  <j:set var="errorCount"><x:expr select="${test.attribute('errors').value}" /></j:set>
+                  <j:set var="failureCount"><x:expr select="${test.attribute('failures').value}" /></j:set>
+                  <j:set var="successRate"><x:expr select="($testCount - ($failureCount + $errorCount)) div $testCount"/></j:set>
+                  <tr>
+            <td>
+              <j:choose>
+                <j:when test="${errorCount != 0}">
+                  <junit:displayImage kind="error" />
+                </j:when>
+                <j:when test="${failureCount != 0}">
+                  <junit:displayImage kind="failure" />
+                </j:when>
+                <j:otherwise>
+                  <junit:displayImage kind="success" />
+                </j:otherwise>
+              </j:choose>
+              
+						</td> 
+						
+                    <td>
+                      <a href="#${test.attribute('name').value}">${test.attribute('name').value}</a>
+                    </td>
+                    <td>
+                      <doc:formatAsNumber string="${testCount}" pattern="0"/>
+                    </td>
+                    <td>
+                      <doc:formatAsNumber string="${errorCount}" pattern="0"/>
+                    </td>
+                    <td>
+                      <doc:formatAsNumber string="${failureCount}" pattern="0"/>
+                    </td>
+                    <td>
+                      <doc:formatAsNumber string="${successRate}" pattern="0.00%"/>
+                    </td>
+                    <td>
+                      <doc:formatAsNumber string="${test.attribute('time').value}" pattern="0.000"/>
+                    </td>
+                  </tr>
+                </x:forEach>
+              </table>
+            </subsection>
+          </j:forEach>
+        </section>
+
+        <section name="Test Cases">
+          <junit:nav/>
+    
+          <x:set var="testsuites" select="./testsuite"/>
+          <j:forEach var="testsuite" items="${testsuites}">
+            <a name="${testsuite.attribute('name').value}"></a>
+            <subsection name="${testsuite.attribute('name').value}">
+              <table summary="Testsuite: ${testsuite.attribute('name').value}">
+
+                <x:set var="errors" select="$testsuite/error"/>
+                <j:forEach var="error" items="${errors}">
+                  <tr>
+                    <td colspan="4">
+                      <junit:displayFailure current="${error}"/>
+                    </td>
+                  </tr>
+                </j:forEach>
+    
+    
+    
+                <x:set var="testcases" select="$testsuite/testcase"/>
+                <j:forEach var="testcase" items="${testcases}">
+                  <j:set var="failure" value="${testcase.selectSingleNode('failure')}"/>
+                  <j:set var="error" value="${testcase.selectSingleNode('error')}"/>
+                  <j:set var="testname" value="${testcase.attribute('name').value}"/>
+                  <tr>
+
+                    <td style="width:20px">      	
+                    <j:choose>
+                      <j:when test="${failure != null}">
+                        <a href="#${testname}"><junit:displayImage kind="failure" /></a>
+                      </j:when>
+                      <j:when test="${error != null}">
+                        <a href="#${testname}"><junit:displayImage kind="error" /></a>
+                      </j:when>
+                      <j:otherwise>
+                        <junit:displayImage kind="success" />
+                      </j:otherwise>
+                    </j:choose>
+                    
+                    </td>             
+                              
+                    <td style="width:98%">[${testcase.attribute("classname").value}]${testcase.attribute("name").value}</td>
+                    
+                    <td style="width:60px">
+                      <j:if test="${testcase.attribute('time') != null}">
+                        <doc:formatAsNumber string="${testcase.attribute('time').value}" pattern="0.00"/>
+                      </j:if>
+                    </td>
+                  </tr>
+                    <j:choose>
+                      <j:when test="${failure != null}">
+                        <tr>
+                          <td colspan="3" style="padding-left: 20px">
+                            <junit:displayFailure current="${failure}"/>
+                          </td>
+                       </tr>
+                      </j:when>
+                      <j:when test="${error != null}">
+                        <tr>
+                          <td colspan="3" style="padding-left: 20px">
+                            <junit:displayFailure current="${error}"/>
+                          </td>
+                        </tr>
+                      </j:when>
+                    </j:choose>
+                </j:forEach>
+              </table>
+            </subsection>
+          </j:forEach>
+        </section>
+       
+       <x:set var="errorCheck" select="/testsuites/testsuite/testcase/*" />
+       <j:if test="${!empty(errorCheck)}">
+        
+          <section name="Failure details">
+          
+              <x:forEach var="testcase" select="/testsuites/testsuite/testcase" trim="false">
+                <j:set var="failure" value="${testcase.selectSingleNode('failure')}"/>
+                <j:set var="error" value="${testcase.selectSingleNode('error')}"/>
+                <j:if test="${empty(failure)}">
+                  <j:set var="failure" value="${error}"/>
+                </j:if>
+                
+                <j:if test="${!empty(failure)}">
+                  <j:set var="testname" value="${testcase.attribute('classname').value}.${testcase.attribute('name').value}()"/>      
+                  <table summary="Failure details for ${testname}">
+                    <thead>
+                      <tr>
+                        <td style="width:20px">
+                          <j:choose>
+                            <j:when test="${!empty(error)}">
+                              <junit:displayImage kind="error" />
+                            </j:when>
+                            <j:otherwise>
+                              <junit:displayImage kind="failure"/>
+                            </j:otherwise>
+                          </j:choose>
+                        </td>
+                        <td style="width:96%"><strong><a name="${testname}">${testname}</a></strong></td>
+                      </tr>
+                    </thead>
+                    <tbody>
+                      <tr>
+                        <td colspan="2"><junit:displayFailure current="${failure}"/></td>
+                      </tr>
+                      <tr>
+                        <td colspan="2">
+                          <!-- removing stacktrace generated by maven -->
+                          <!-- no way to preserve newlines, jelly strips out everything -->
+<code>
+${stringTool.splitStringAtLastDelim(stringTool.splitStringAtLastDelim(failure.text, 'at org.apache.commons.jelly.tags.ant.AntTag.doTag').get(0),
+'at sun.reflect.NativeMethodAccessorImpl.invoke0(').get(0)}
+</code>
+                        </td>
+                      </tr>
+                    </tbody>
+                  </table>
+                </j:if>
+                
+              </x:forEach>
+        </section>
+        </j:if>
+        
+      </body>
+    </document>
+  </jsl:template>
+</jsl:stylesheet>
diff --git a/testng/maven/plugin.jelly b/testng/maven/plugin.jelly
new file mode 100755
index 0000000..5e86a15
--- /dev/null
+++ b/testng/maven/plugin.jelly
@@ -0,0 +1,88 @@
+<project xmlns:j="jelly:core"
+    xmlns:ant="jelly:ant" 
+    xmlns:doc="doc"
+    xmlns:maven="jelly:maven"
+    xmlns:util="jelly:util" >
+
+
+  <!-- ================================================================== -->
+  <!-- Registration                                                       -->
+  <!-- ================================================================== -->
+  <goal name="maven-testng-plugin:register">
+      <doc:registerReport 
+        name="TestNG Tests"
+        pluginName="maven-testng-plugin"
+        description="Report on the results of the TestNG framework tests."
+        link="testng-report"/>
+   </goal>
+
+   <goal name="maven-testng-plugin:deregister">
+      <doc:deregisterReport name="TestNG Tests"/>
+   </goal>
+
+
+   <goal name="testng-init">
+	  <ant:taskdef classpath="${plugin.getDependencyClasspath()}" 
+	               name="testng" 
+	               classname="org.testng.TestNGAntTask" />
+  </goal>
+
+  <goal name="testng" prereqs="testng-init,test:compile">
+
+      <ant:mkdir dir="${maven.testng.output.dir}"/>
+
+      <testng fork="yes"
+	          outputDir="${maven.testng.output.dir}"
+	          sourceDir="${maven.testng.source.dir}"
+	          classpath="${maven.build.dir}/test-classes/;${maven.build.dir}/classes/">
+			
+		  <xmlfileset dir="${maven.testng.suitexml.dir}" 
+		              includes="${maven.testng.suitexml.name}"/>
+	
+		  <ant:classpath>
+		      <ant:path refid="maven.dependency.classpath"/>
+		  </ant:classpath>
+      </testng>
+  </goal>
+
+
+
+	<!-- ================= TestNG JUnitreport Goal ======================== -->
+	
+	<goal name="maven-testng-junit-report" prereqs="testng">   
+	    <ant:mkdir dir="${maven.testng.report.dir}"/>
+            
+	    <!-- There seems to be an issue with transformer properties- this forces the correct one -->
+	    <!-- for Java 1.5 and others below it. This error should be avoided:  -->
+	    <!-- Provider com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl not found  -->	    
+	    <j:choose>
+		    <j:when test="${systemScope['java.runtime.version'].startsWith('1.5')}">
+			${systemScope.setProperty('javax.xml.transform.TransformerFactory','com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl')}	
+		    </j:when>
+		    <j:otherwise>
+			${systemScope.setProperty('javax.xml.transform.TransformerFactory','org.apache.xalan.processor.TransformerFactoryImpl')}
+		   </j:otherwise>
+           </j:choose>
+
+	    <junitreport todir="${maven.testng.report.dir}" tofile="TestNG-Suites.xml">
+	        <fileset dir="${maven.testng.output.dir}">
+	            <include name="*.xml"/>
+	        </fileset>
+	        <report format="noframes" todir="${maven.testng.report.dir}"/>
+	        <ant:classpath>
+	          <ant:path refid="maven.dependency.classpath"/>  
+	          <ant:pathelement path="plugin.getDependencyClasspath()"/>
+	        </ant:classpath>
+	    </junitreport>
+	</goal>
+
+	<!-- ==== TestNG Stylize the JUnitReports to Maven Styles Goal ======= -->
+	
+	<goal name="testng:junit-report" prereqs="maven-testng-junit-report">
+	    <doc:jsl input="${maven.testng.report.dir}/TestNG-Suites.xml"
+	            output="testng-report.xml"
+	            stylesheet="${plugin.resources}/junitRpt.jsl"
+	            outputMode="xml"
+	            prettyPrint="true"/>
+	</goal>
+</project>
\ No newline at end of file
diff --git a/testng/maven/plugin.properties b/testng/maven/plugin.properties
new file mode 100755
index 0000000..edba5d5
--- /dev/null
+++ b/testng/maven/plugin.properties
@@ -0,0 +1,5 @@
+maven.testng.suitexml.name=testng.xml
+maven.testng.suitexml.dir=${basedir}/test/conf
+maven.testng.output.dir=${maven.build.dir}/testng-output
+maven.testng.source.dir=${basedir}/test/java/
+maven.testng.report.dir=${maven.build.dir}/testngJunitReport
diff --git a/testng/maven/project.properties b/testng/maven/project.properties
new file mode 100755
index 0000000..6a90a54
--- /dev/null
+++ b/testng/maven/project.properties
@@ -0,0 +1,3 @@
+maven.junit.fork=yes
+maven.repo.remote = http://www.vanwardtechnologies.com/repository/,http://www.ibiblio.org/maven/
+maven.test.search.classdir = true
diff --git a/testng/maven/project.xml b/testng/maven/project.xml
new file mode 100755
index 0000000..5283aec
--- /dev/null
+++ b/testng/maven/project.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0"?>
+<project>
+    <pomVersion>3</pomVersion>
+    <id>maven-testng-plugin</id>
+    <name>TestNG Maven Plugin</name>
+    <currentVersion>1.2</currentVersion>
+    <organization>
+        <name>testng.org</name>
+    </organization>
+    <inceptionYear>2005</inceptionYear>
+    <package>org.testng</package>
+
+    <logo/>
+    <description>TestNG Plugin</description>
+    <shortDescription>TestNG Plugin</shortDescription>
+    <url>http://www.testng.org</url>
+    <issueTrackingUrl/>
+    <siteAddress/>
+    <siteDirectory/>
+    <distributionDirectory/>
+    <repository>
+        <connection/>
+        <url/>
+    </repository>
+    <mailingLists/>
+    <developers>
+      <developer>
+        <name>Andrew Glover</name>
+        <id>aglover</id>
+        <email>aglover AT vanwardtechnologies DOT com</email>
+        <organization>Vanward Technologies</organization>
+      </developer>
+      <developer>
+        <name>Fred Olivieri</name>
+        <id>folivieri</id>
+        <email></email>
+        <organization>Quest Software</organization>
+      </developer>
+    </developers>
+
+    <dependencies>
+
+		<dependency>
+		  <groupId>testng</groupId>
+		  <artifactId>testng-1.4</artifactId>		 
+		  <jar>testng-4.4-jdk14.jar</jar>
+		</dependency>
+		
+		<dependency>
+		  <groupId>testng</groupId>
+		  <artifactId>testng-1.5</artifactId>		     
+		  <jar>testng-4.4-jdk15.jar</jar>
+		</dependency>
+
+	    <dependency>
+	      <groupId>commons-jelly</groupId>
+	      <artifactId>commons-jelly-tags-jsl</artifactId>
+	      <version>20030211.143151</version>
+	    </dependency>
+    
+	    <dependency>
+	      <groupId>commons-jelly</groupId>
+	      <artifactId>commons-jelly-tags-xml</artifactId>
+	      <version>20030211.142705</version>
+	      <url>http://jakarta.apache.org/commons/jelly/libs/xml/</url>
+	    </dependency>
+    
+	     <dependency>
+	        <groupId>xalan</groupId>
+	        <artifactId>xalan</artifactId>
+	        <version>2.6.0</version>
+	        <type>jar</type>
+	        <properties>
+	            <classloader>root</classloader>
+	        </properties>
+	     </dependency>
+
+	</dependencies>
+
+    <build>
+        <sourceDirectory>src/java</sourceDirectory>
+        <unitTestSourceDirectory>test/java</unitTestSourceDirectory>
+        <integrationUnitTestSourceDirectory/>
+        <aspectSourceDirectory></aspectSourceDirectory>
+        <unitTest/>
+             
+        <resources>
+            <resource>
+                <includes>
+                    <include>*.jelly</include>
+                    <include>*.xml</include>
+                    <include>*.properties</include>
+                </includes>
+            </resource>
+        </resources>
+    </build>
+</project>