diff --git a/src/main/java/org/testng/internal/IConfigurationListener.java b/src/main/java/org/testng/IConfigurationListener.java
similarity index 78%
rename from src/main/java/org/testng/internal/IConfigurationListener.java
rename to src/main/java/org/testng/IConfigurationListener.java
index a38fe6c..19e0b9b 100755
--- a/src/main/java/org/testng/internal/IConfigurationListener.java
+++ b/src/main/java/org/testng/IConfigurationListener.java
@@ -1,12 +1,15 @@
-package org.testng.internal;
-
-import org.testng.ITestNGListener;
-import org.testng.ITestResult;
+package org.testng;
 
 /**
  * Listener interface for events related to configuration methods.
  */
 public interface IConfigurationListener extends ITestNGListener {
+
+  /**
+   * Invoked before a configuration method is invoked.
+   */
+  void beforeConfiguration(ITestResult tr);
+
   /**
    * Invoked whenever a configuration method succeeded.
    */
diff --git a/src/main/java/org/testng/SuiteRunner.java b/src/main/java/org/testng/SuiteRunner.java
index f7de79d..176fe93 100644
--- a/src/main/java/org/testng/SuiteRunner.java
+++ b/src/main/java/org/testng/SuiteRunner.java
@@ -7,7 +7,6 @@
 import org.testng.internal.AnnotationTypeEnum;
 import org.testng.internal.Attributes;
 import org.testng.internal.IConfiguration;
-import org.testng.internal.IConfigurationListener;
 import org.testng.internal.IInvoker;
 import org.testng.internal.Utils;
 import org.testng.internal.annotations.IAnnotationFinder;
diff --git a/src/main/java/org/testng/TestListenerAdapter.java b/src/main/java/org/testng/TestListenerAdapter.java
index dce2587..973bfa8 100755
--- a/src/main/java/org/testng/TestListenerAdapter.java
+++ b/src/main/java/org/testng/TestListenerAdapter.java
@@ -145,7 +145,7 @@
   }
 
   /**
-   * @see org.testng.internal.IConfigurationListener#onConfigurationFailure(org.testng.ITestResult)
+   * @see org.testng.IConfigurationListener#onConfigurationFailure(org.testng.ITestResult)
    */
   @Override
   public void onConfigurationFailure(ITestResult itr) {
@@ -156,8 +156,12 @@
     return m_skippedConfs;
   }
 
+  @Override
+  public void beforeConfiguration(ITestResult tr) {
+  }
+
   /**
-   * @see org.testng.internal.IConfigurationListener#onConfigurationSkip(org.testng.ITestResult)
+   * @see org.testng.IConfigurationListener#onConfigurationSkip(org.testng.ITestResult)
    */
   @Override
   public void onConfigurationSkip(ITestResult itr) {
@@ -165,7 +169,7 @@
   }
 
   /**
-   * @see org.testng.internal.IConfigurationListener#onConfigurationSuccess(org.testng.ITestResult)
+   * @see org.testng.IConfigurationListener#onConfigurationSuccess(org.testng.ITestResult)
    */
   @Override
   public void onConfigurationSuccess(ITestResult itr) {
diff --git a/src/main/java/org/testng/TestNG.java b/src/main/java/org/testng/TestNG.java
index daf7924..fb82d89 100644
--- a/src/main/java/org/testng/TestNG.java
+++ b/src/main/java/org/testng/TestNG.java
@@ -15,7 +15,6 @@
 import org.testng.internal.Configuration;
 import org.testng.internal.DynamicGraph;
 import org.testng.internal.IConfiguration;
-import org.testng.internal.IConfigurationListener;
 import org.testng.internal.IResultListener;
 import org.testng.internal.OverrideProcessor;
 import org.testng.internal.Utils;
@@ -1799,6 +1798,10 @@
     }
 
     @Override
+    public void beforeConfiguration(ITestResult tr) {
+    }
+
+    @Override
     public void onTestFailure(ITestResult result) {
       setHasRunTests();
       m_mainRunner.setStatus(HAS_FAILURE);
@@ -1840,7 +1843,7 @@
     }
 
     /**
-     * @see org.testng.internal.IConfigurationListener#onConfigurationFailure(org.testng.ITestResult)
+     * @see org.testng.IConfigurationListener#onConfigurationFailure(org.testng.ITestResult)
      */
     @Override
     public void onConfigurationFailure(ITestResult itr) {
@@ -1848,7 +1851,7 @@
     }
 
     /**
-     * @see org.testng.internal.IConfigurationListener#onConfigurationSkip(org.testng.ITestResult)
+     * @see org.testng.IConfigurationListener#onConfigurationSkip(org.testng.ITestResult)
      */
     @Override
     public void onConfigurationSkip(ITestResult itr) {
@@ -1856,7 +1859,7 @@
     }
 
     /**
-     * @see org.testng.internal.IConfigurationListener#onConfigurationSuccess(org.testng.ITestResult)
+     * @see org.testng.IConfigurationListener#onConfigurationSuccess(org.testng.ITestResult)
      */
     @Override
     public void onConfigurationSuccess(ITestResult itr) {
diff --git a/src/main/java/org/testng/TestRunner.java b/src/main/java/org/testng/TestRunner.java
index b2431f5..d7081b3 100644
--- a/src/main/java/org/testng/TestRunner.java
+++ b/src/main/java/org/testng/TestRunner.java
@@ -13,7 +13,6 @@
 import org.testng.internal.Constants;
 import org.testng.internal.DynamicGraph;
 import org.testng.internal.IConfiguration;
-import org.testng.internal.IConfigurationListener;
 import org.testng.internal.IInvoker;
 import org.testng.internal.ITestResultNotifier;
 import org.testng.internal.InvokedMethod;
@@ -1751,6 +1750,10 @@
 
   private class ConfigurationListener implements IConfigurationListener {
     @Override
+    public void beforeConfiguration(ITestResult tr) {
+    }
+
+    @Override
     public void onConfigurationFailure(ITestResult itr) {
       m_failedConfigurations.addResult(itr, itr.getMethod());
     }
diff --git a/src/main/java/org/testng/internal/Configuration.java b/src/main/java/org/testng/internal/Configuration.java
index 6f882e2..47aaeb9 100644
--- a/src/main/java/org/testng/internal/Configuration.java
+++ b/src/main/java/org/testng/internal/Configuration.java
@@ -1,6 +1,7 @@
 package org.testng.internal;
 
 import org.testng.IConfigurable;
+import org.testng.IConfigurationListener;
 import org.testng.IExecutionListener;
 import org.testng.IHookable;
 import org.testng.ITestObjectFactory;
diff --git a/src/main/java/org/testng/internal/IConfiguration.java b/src/main/java/org/testng/internal/IConfiguration.java
index 8fac109..2791b06 100644
--- a/src/main/java/org/testng/internal/IConfiguration.java
+++ b/src/main/java/org/testng/internal/IConfiguration.java
@@ -1,6 +1,7 @@
 package org.testng.internal;
 
 import org.testng.IConfigurable;
+import org.testng.IConfigurationListener;
 import org.testng.IExecutionListener;
 import org.testng.IHookable;
 import org.testng.ITestObjectFactory;
diff --git a/src/main/java/org/testng/internal/IResultListener.java b/src/main/java/org/testng/internal/IResultListener.java
index ccfd3d1..29ef001 100755
--- a/src/main/java/org/testng/internal/IResultListener.java
+++ b/src/main/java/org/testng/internal/IResultListener.java
@@ -1,5 +1,6 @@
 package org.testng.internal;
 
+import org.testng.IConfigurationListener;
 import org.testng.ITestListener;
 
 
diff --git a/src/main/java/org/testng/internal/ITestResultNotifier.java b/src/main/java/org/testng/internal/ITestResultNotifier.java
index dc72e40..c801a27 100755
--- a/src/main/java/org/testng/internal/ITestResultNotifier.java
+++ b/src/main/java/org/testng/internal/ITestResultNotifier.java
@@ -1,5 +1,6 @@
 package org.testng.internal;
 
+import org.testng.IConfigurationListener;
 import org.testng.ITestListener;
 import org.testng.ITestNGMethod;
 import org.testng.ITestResult;
diff --git a/src/main/java/org/testng/internal/Invoker.java b/src/main/java/org/testng/internal/Invoker.java
index de34fc2..c91b106 100644
--- a/src/main/java/org/testng/internal/Invoker.java
+++ b/src/main/java/org/testng/internal/Invoker.java
@@ -2,6 +2,7 @@
 
 import org.testng.IClass;
 import org.testng.IConfigurable;
+import org.testng.IConfigurationListener;
 import org.testng.IHookable;
 import org.testng.IInvokedMethod;
 import org.testng.IInvokedMethodListener;
@@ -199,12 +200,14 @@
 
             Object[] newInstances= (null != instance) ? new Object[] { instance } : instances;
 
+            runConfigurationListeners(testResult, true /* before */);
+
             invokeConfigurationMethod(newInstances, tm,
               parameters, isClassConfiguration, isSuiteConfiguration, testResult);
 
             // TODO: probably we should trigger the event for each instance???
             testResult.setEndMillis(System.currentTimeMillis());
-            runConfigurationListeners(testResult);
+            runConfigurationListeners(testResult, false /* after */);
           }
           else {
             log(3,
@@ -247,7 +250,7 @@
                                        XmlSuite suite) {
     recordConfigurationInvocationFailed(tm, testResult.getTestClass(), annotation, currentTestMethod, instance, suite);
     testResult.setStatus(ITestResult.SKIP);
-    runConfigurationListeners(testResult);
+    runConfigurationListeners(testResult, false /* after */);
   }
 
   /**
@@ -320,7 +323,7 @@
     Utils.log("", 3, "Failed to invoke configuration method "
         + tm.getRealClass().getName() + "." + tm.getMethodName() + ":" + cause.getMessage());
     handleException(cause, tm, testResult, 1);
-    runConfigurationListeners(testResult);
+    runConfigurationListeners(testResult, false /* after */);
 
     //
     // If in TestNG mode, need to take a look at the annotation to figure out
@@ -1787,18 +1790,24 @@
     return result;
   }
 
-  private void runConfigurationListeners(ITestResult tr) {
-    for(IConfigurationListener icl: m_notifier.getConfigurationListeners()) {
-      switch(tr.getStatus()) {
-        case ITestResult.SKIP:
-          icl.onConfigurationSkip(tr);
-          break;
-        case ITestResult.FAILURE:
-          icl.onConfigurationFailure(tr);
-          break;
-        case ITestResult.SUCCESS:
-          icl.onConfigurationSuccess(tr);
-          break;
+  private void runConfigurationListeners(ITestResult tr, boolean before) {
+    if (before) {
+      for(IConfigurationListener icl: m_notifier.getConfigurationListeners()) {
+        icl.beforeConfiguration(tr);
+      }
+    } else {
+      for(IConfigurationListener icl: m_notifier.getConfigurationListeners()) {
+        switch(tr.getStatus()) {
+          case ITestResult.SKIP:
+            icl.onConfigurationSkip(tr);
+            break;
+          case ITestResult.FAILURE:
+            icl.onConfigurationFailure(tr);
+            break;
+          case ITestResult.SUCCESS:
+            icl.onConfigurationSuccess(tr);
+            break;
+        }
       }
     }
   }
diff --git a/src/main/java/org/testng/remote/strprotocol/RemoteTestListener.java b/src/main/java/org/testng/remote/strprotocol/RemoteTestListener.java
index c16fe85..b33c356 100755
--- a/src/main/java/org/testng/remote/strprotocol/RemoteTestListener.java
+++ b/src/main/java/org/testng/remote/strprotocol/RemoteTestListener.java
@@ -50,6 +50,10 @@
   }
 
   @Override
+  public void beforeConfiguration(ITestResult tr) {
+  }
+
+  @Override
   public void onTestFailedButWithinSuccessPercentage(ITestResult testResult) {
     if (null == m_currentTestContext) {
       m_sender.sendMessage(new TestResultMessage(m_suite.getName(), m_xmlTest.getName(), testResult));
@@ -90,7 +94,7 @@
   }
 
   /**
-   * @see org.testng.internal.IConfigurationListener#onConfigurationFailure(org.testng.ITestResult)
+   * @see org.testng.IConfigurationListener#onConfigurationFailure(org.testng.ITestResult)
    */
   @Override
   public void onConfigurationFailure(ITestResult itr) {
@@ -98,7 +102,7 @@
   }
 
   /**
-   * @see org.testng.internal.IConfigurationListener#onConfigurationSkip(org.testng.ITestResult)
+   * @see org.testng.IConfigurationListener#onConfigurationSkip(org.testng.ITestResult)
    */
   @Override
   public void onConfigurationSkip(ITestResult itr) {
@@ -106,7 +110,7 @@
   }
 
   /**
-   * @see org.testng.internal.IConfigurationListener#onConfigurationSuccess(org.testng.ITestResult)
+   * @see org.testng.IConfigurationListener#onConfigurationSuccess(org.testng.ITestResult)
    */
   @Override
   public void onConfigurationSuccess(ITestResult itr) {
diff --git a/src/main/java/org/testng/reporters/JUnitXMLReporter.java b/src/main/java/org/testng/reporters/JUnitXMLReporter.java
index 81dbccc..3ee7539 100755
--- a/src/main/java/org/testng/reporters/JUnitXMLReporter.java
+++ b/src/main/java/org/testng/reporters/JUnitXMLReporter.java
@@ -61,6 +61,10 @@
   public void onTestStart(ITestResult result) {
   }
 
+  @Override
+  public void beforeConfiguration(ITestResult tr) {
+  }
+
   /**
    * Invoked each time a test succeeds.
    */
@@ -116,7 +120,7 @@
   }
 
   /**
-   * @see org.testng.internal.IConfigurationListener#onConfigurationFailure(org.testng.ITestResult)
+   * @see org.testng.IConfigurationListener#onConfigurationFailure(org.testng.ITestResult)
    */
   @Override
   public void onConfigurationFailure(ITestResult itr) {
@@ -124,7 +128,7 @@
   }
 
   /**
-   * @see org.testng.internal.IConfigurationListener#onConfigurationSkip(org.testng.ITestResult)
+   * @see org.testng.IConfigurationListener#onConfigurationSkip(org.testng.ITestResult)
    */
   @Override
   public void onConfigurationSkip(ITestResult itr) {
@@ -132,7 +136,7 @@
   }
 
   /**
-   * @see org.testng.internal.IConfigurationListener#onConfigurationSuccess(org.testng.ITestResult)
+   * @see org.testng.IConfigurationListener#onConfigurationSuccess(org.testng.ITestResult)
    */
   @Override
   public void onConfigurationSuccess(ITestResult itr) {
diff --git a/src/main/java/org/testng/reporters/JUnitXMLReporter2.java b/src/main/java/org/testng/reporters/JUnitXMLReporter2.java
deleted file mode 100755
index 88c6d6b..0000000
--- a/src/main/java/org/testng/reporters/JUnitXMLReporter2.java
+++ /dev/null
@@ -1,233 +0,0 @@
-package org.testng.reporters;
-
-
-import org.testng.ITestContext;
-import org.testng.ITestResult;
-import org.testng.collections.Lists;
-import org.testng.internal.IResultListener;
-import org.testng.internal.Utils;
-import org.w3c.dom.CDATASection;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.List;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-
-/**
- * this XML Reporter will produce XML format compatible with the XMLJUnitResultFormatter from ant
- * this enables TestNG output to be processed by tools that already handle this format
- *
- * borrows heavily from ideas in org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter
- *
- * this is the original version which was replaced by JUnitXMLReporter
- * @TODO: clean up
- */
-public class JUnitXMLReporter2 implements IResultListener {
-
-  private String m_outputFileName= null;
-  private File m_outputFile= null;
-  private ITestContext m_testContext= null;
-
-  /**
-   * keep lists of all the results
-   */
-  private int m_numPassed= 0;
-  private int m_numFailed= 0;
-  private int m_numSkipped= 0;
-  private int m_numFailedButIgnored= 0;
-  private List<ITestResult> m_allTests
-      = Collections.synchronizedList(Lists.<ITestResult>newArrayList());
-  private List<ITestResult> m_configIssues
-      = Collections.synchronizedList(Lists.<ITestResult>newArrayList());
-
-  @Override
-  public void onTestStart(ITestResult result) {
-  }
-
-  /**
-   * Invoked each time a test succeeds.
-   */
-  @Override
-  public void onTestSuccess(ITestResult tr) {
-    m_allTests.add(tr);
-    m_numPassed++;
-  }
-
-  @Override
-  public void onTestFailedButWithinSuccessPercentage(ITestResult tr) {
-    m_allTests.add(tr);
-    m_numFailedButIgnored++;
-  }
-
-  /**
-   * Invoked each time a test fails.
-   */
-  @Override
-  public void onTestFailure(ITestResult tr) {
-    m_allTests.add(tr);
-    m_numFailed++;
-  }
-
-  /**
-   * Invoked each time a test is skipped.
-   */
-  @Override
-  public void onTestSkipped(ITestResult tr) {
-    m_allTests.add(tr);
-    m_numSkipped++;
-  }
-
-  /**
-   * Invoked after the test class is instantiated and before
-   * any configuration method is called.
-   *
-   */
-  @Override
-  public void onStart(ITestContext context) {
-    m_outputFileName= context.getOutputDirectory() + File.separator + context.getName() + ".xml";
-    m_outputFile= new File(m_outputFileName);
-    m_testContext= context;
-  }
-
-  /**
-   * Invoked after all the tests have run and all their
-   * Configuration methods have been called.
-   *
-   */
-  @Override
-  public void onFinish(ITestContext context) {
-    generateReport();
-  }
-
-  /**
-   * generate the XML report given what we know from all the test results
-   */
-  protected void generateReport() {
-    try {
-      DocumentBuilderFactory docBuilderFactory= DocumentBuilderFactory.newInstance();
-      docBuilderFactory.setNamespaceAware(true); // so we can transform it later
-      DocumentBuilder docBuilder= docBuilderFactory.newDocumentBuilder();
-      Document d= docBuilder.newDocument();
-      Element rootElement= d.createElement(XMLConstants.TESTSUITE);
-      rootElement.setAttribute(XMLConstants.ATTR_NAME, m_testContext.getName());
-
-      Element propsElement= d.createElement(XMLConstants.PROPERTIES);
-      rootElement.appendChild(propsElement);
-
-      // properties. just TestNG properties or also System properties?
-
-      rootElement.setAttribute(XMLConstants.ATTR_TESTS, "" + m_allTests.size());
-      rootElement.setAttribute(XMLConstants.ATTR_FAILURES, "" + m_numFailed);
-      rootElement.setAttribute(XMLConstants.ATTR_ERRORS, "0"); // FIXME
-
-      long elapsedTimeMillis= m_testContext.getEndDate().getTime()
-        - m_testContext.getStartDate().getTime();
-      rootElement.setAttribute(XMLConstants.ATTR_TIME, "" + (elapsedTimeMillis / 1000.0));
-
-      for(ITestResult tr: m_configIssues) {
-        Element element= createElement(d, tr);
-        rootElement.appendChild(element);
-      }
-      for(ITestResult tr : m_allTests) {
-        Element testCaseElement= createElement(d, tr);
-        rootElement.appendChild(testCaseElement);
-      }
-
-      BufferedWriter fw= new BufferedWriter(new FileWriter(m_outputFile));
-
-      Transformer transformer= TransformerFactory.newInstance().newTransformer();
-      transformer.transform(new DOMSource(rootElement), new StreamResult(fw));
-      fw.flush();
-      fw.close();
-    }
-    catch(IOException ioe) {
-      ioe.printStackTrace();
-      System.err.println("failed to create JUnitXML because of " + ioe);
-    }
-    catch(ParserConfigurationException pce) {
-      pce.printStackTrace();
-      System.err.println("failed to create JUnitXML because of " + pce);
-    }
-    catch(TransformerException te) {
-      te.printStackTrace();
-      System.err.println("Error while writing out JUnitXML because of " + te);
-    }
-  }
-
-  private Element createElement(Document doc, ITestResult tr) {
-    Element resultElement= doc.createElement(XMLConstants.TESTCASE);
-    long elapsedTimeMillis= tr.getEndMillis() - tr.getStartMillis();
-    String name= tr.getMethod().isTest() ? tr.getName() : Utils.detailedMethodName(tr.getMethod(), false);
-    resultElement.setAttribute(XMLConstants.ATTR_NAME, name);
-    resultElement.setAttribute(XMLConstants.ATTR_CLASSNAME,
-                               tr.getTestClass().getRealClass().getName());
-    resultElement.setAttribute(XMLConstants.ATTR_TIME,
-                               "" + ((double) elapsedTimeMillis)/1000);
-    if (ITestResult.FAILURE == tr.getStatus()) {
-      Element nested = createFailureElement(doc, tr);
-      resultElement.appendChild(nested);
-    }
-    else if (ITestResult.SKIP == tr.getStatus()) {
-      Element nested = createSkipElement(doc, tr);
-      resultElement.appendChild(nested);
-    }
-
-    return resultElement;
-  }
-
-  private Element createFailureElement(Document doc, ITestResult tr) {
-    Element nested= doc.createElement(XMLConstants.FAILURE);
-    Throwable t = tr.getThrowable();
-    if (t != null) {
-      nested.setAttribute(XMLConstants.ATTR_TYPE, t.getClass().getName());
-      String message = t.getMessage();
-      if ((message != null) && (message.length() > 0)) {
-        nested.setAttribute(XMLConstants.ATTR_MESSAGE, message);
-      }
-      CDATASection trace= doc.createCDATASection(Utils.stackTrace(t, false)[0]);
-      nested.appendChild(trace);
-    }
-
-    return nested;
-  }
-
-  private Element createSkipElement(Document doc, ITestResult tr) {
-    return doc.createElement("skipped");
-  }
-
-  /**
-   * @see org.testng.internal.IConfigurationListener#onConfigurationFailure(org.testng.ITestResult)
-   */
-  @Override
-  public void onConfigurationFailure(ITestResult itr) {
-    m_configIssues.add(itr);
-  }
-
-  /**
-   * @see org.testng.internal.IConfigurationListener#onConfigurationSkip(org.testng.ITestResult)
-   */
-  @Override
-  public void onConfigurationSkip(ITestResult itr) {
-    m_configIssues.add(itr);
-  }
-
-  /**
-   * @see org.testng.internal.IConfigurationListener#onConfigurationSuccess(org.testng.ITestResult)
-   */
-  @Override
-  public void onConfigurationSuccess(ITestResult itr) {
-  }
-}
diff --git a/src/test/java/test/listeners/ConfigurationListenerTest.java b/src/test/java/test/listeners/ConfigurationListenerTest.java
index 19acca1..6670779 100644
--- a/src/test/java/test/listeners/ConfigurationListenerTest.java
+++ b/src/test/java/test/listeners/ConfigurationListenerTest.java
@@ -1,10 +1,10 @@
 package test.listeners;
 
 import org.testng.Assert;
+import org.testng.IConfigurationListener;
 import org.testng.ITestResult;
 import org.testng.TestNG;
 import org.testng.annotations.Test;
-import org.testng.internal.IConfigurationListener;
 
 import test.SimpleBaseTest;
 
@@ -15,20 +15,25 @@
     private static int m_status = 0;
 
     @Override
-    public void onConfigurationSuccess(ITestResult itr) {
+    public void beforeConfiguration(ITestResult tr) {
       m_status += 1;
     }
 
     @Override
-    public void onConfigurationFailure(ITestResult itr) {
+    public void onConfigurationSuccess(ITestResult itr) {
       m_status += 3;
     }
 
     @Override
-    public void onConfigurationSkip(ITestResult itr) {
+    public void onConfigurationFailure(ITestResult itr) {
       m_status += 5;
     }
-    
+
+    @Override
+    public void onConfigurationSkip(ITestResult itr) {
+      m_status += 7;
+    }
+
   }
 
   private void runTest(Class<?> cls, int expected) {
@@ -43,16 +48,16 @@
 
   @Test
   public void shouldSucceed() {
-    runTest(ConfigurationListenerSucceedSampleTest.class, 1);
+    runTest(ConfigurationListenerSucceedSampleTest.class, 1 + 3);
   }
 
   @Test
   public void shouldFail() {
-    runTest(ConfigurationListenerFailSampleTest.class, 3);
+    runTest(ConfigurationListenerFailSampleTest.class, 1 + 5);
   }
 
   @Test
   public void shouldSkip() {
-    runTest(ConfigurationListenerSkipSampleTest.class, 8); // fail + skip
+    runTest(ConfigurationListenerSkipSampleTest.class, 1 + 5 + 7); // fail + skip
   }
 }
diff --git a/src/test/java/test/listeners/ResultListener.java b/src/test/java/test/listeners/ResultListener.java
index 8f3cfc9..5dc40f8 100644
--- a/src/test/java/test/listeners/ResultListener.java
+++ b/src/test/java/test/listeners/ResultListener.java
@@ -15,6 +15,10 @@
   }
 
   @Override
+  public void beforeConfiguration(ITestResult tr) {
+  }
+
+  @Override
   public void onTestSuccess(ITestResult result) {
     m_end = result.getEndMillis();
   }
