http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/maven-surefire-common/src/test/resources/META-INF/services/org.apache.maven.surefire.spi.IDefault
----------------------------------------------------------------------
diff --git 
a/maven-surefire-common/src/test/resources/META-INF/services/org.apache.maven.surefire.spi.IDefault
 
b/maven-surefire-common/src/test/resources/META-INF/services/org.apache.maven.surefire.spi.IDefault
new file mode 100644
index 0000000..09fbc28
--- /dev/null
+++ 
b/maven-surefire-common/src/test/resources/META-INF/services/org.apache.maven.surefire.spi.IDefault
@@ -0,0 +1,22 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+
+org.apache.maven.surefire.spi.DefaultImpl
+org.apache.maven.surefire.spi.CustomizedImpl

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/maven-surefire-plugin/pom.xml
----------------------------------------------------------------------
diff --git a/maven-surefire-plugin/pom.xml b/maven-surefire-plugin/pom.xml
index 978ad1a..848922f 100644
--- a/maven-surefire-plugin/pom.xml
+++ b/maven-surefire-plugin/pom.xml
@@ -120,6 +120,32 @@
           </execution>
         </executions>
       </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-shade-plugin</artifactId>
+        <executions>
+          <execution>
+            <phase>package</phase>
+            <goals>
+              <goal>shade</goal>
+            </goals>
+            <configuration>
+              <minimizeJar>true</minimizeJar>
+              <artifactSet>
+                <includes>
+                  <include>org.apache.maven.shared:maven-shared-utils</include>
+                </includes>
+              </artifactSet>
+              <relocations>
+                <relocation>
+                  <pattern>org.apache.maven.shared</pattern>
+                  
<shadedPattern>org.apache.maven.surefire.shade.org.apache.maven.shared</shadedPattern>
+                </relocation>
+              </relocations>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
     </plugins>
   </build>
 

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/maven-surefire-plugin/src/main/java/org/apache/maven/plugin/surefire/SurefirePlugin.java
----------------------------------------------------------------------
diff --git 
a/maven-surefire-plugin/src/main/java/org/apache/maven/plugin/surefire/SurefirePlugin.java
 
b/maven-surefire-plugin/src/main/java/org/apache/maven/plugin/surefire/SurefirePlugin.java
index 291bf25..bfb68e0 100644
--- 
a/maven-surefire-plugin/src/main/java/org/apache/maven/plugin/surefire/SurefirePlugin.java
+++ 
b/maven-surefire-plugin/src/main/java/org/apache/maven/plugin/surefire/SurefirePlugin.java
@@ -31,6 +31,8 @@ import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.plugins.annotations.ResolutionScope;
 import org.apache.maven.surefire.suite.RunResult;
 
+import static org.apache.maven.plugin.surefire.SurefireHelper.reportExecution;
+
 /**
  * Run tests using Surefire.
  *
@@ -318,7 +320,7 @@ public class SurefirePlugin
     {
         assertNoException( firstForkException );
 
-        SurefireHelper.reportExecution( this, summary, getLog() );
+        reportExecution( this, summary, getConsoleLogger() );
     }
 
     private void assertNoException( Exception firstForkException )

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/maven-surefire-plugin/src/site/apt/index.apt.vm
----------------------------------------------------------------------
diff --git a/maven-surefire-plugin/src/site/apt/index.apt.vm 
b/maven-surefire-plugin/src/site/apt/index.apt.vm
index 6774491..85c4d66 100644
--- a/maven-surefire-plugin/src/site/apt/index.apt.vm
+++ b/maven-surefire-plugin/src/site/apt/index.apt.vm
@@ -30,6 +30,10 @@
 
 Maven ${thisPlugin} Plugin
 
+
+  Requirements: Maven 2.2.1 or 3.x, and JDK 1.5 or higher. Due to wrong 
formatting of console text messages
+  in Maven Version prior to 3.1.0 it is highly recommended to use Maven 3.1.0 
or higher.
+
 #{if}(${project.artifactId}=="maven-surefire-plugin")
   The Surefire Plugin is used during the <<<test>>> phase of the build
   lifecycle to execute the unit tests of an application. It generates reports

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/maven-surefire-report-plugin/pom.xml
----------------------------------------------------------------------
diff --git a/maven-surefire-report-plugin/pom.xml 
b/maven-surefire-report-plugin/pom.xml
index 9fc60d7..e911c6e 100644
--- a/maven-surefire-report-plugin/pom.xml
+++ b/maven-surefire-report-plugin/pom.xml
@@ -48,6 +48,10 @@
 
   <dependencies>
     <dependency>
+      <groupId>org.apache.maven.surefire</groupId>
+      <artifactId>surefire-logger-api</artifactId>
+    </dependency>
+    <dependency>
       <groupId>org.apache.maven</groupId>
       <artifactId>maven-project</artifactId>
     </dependency>
@@ -92,6 +96,12 @@
       <version>3.0.15</version>
     </dependency>
     <dependency>
+      <groupId>org.fusesource.jansi</groupId>
+      <artifactId>jansi</artifactId>
+      <version>1.13</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
       <groupId>org.apache.maven.plugin-testing</groupId>
       <artifactId>maven-plugin-testing-harness</artifactId>
       <version>1.2</version>
@@ -123,6 +133,51 @@
           </execution>
         </executions>
       </plugin>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>build-helper-maven-plugin</artifactId>
+        <version>1.12</version>
+        <executions>
+          <execution>
+            <id>add-source</id>
+            <phase>generate-sources</phase>
+            <goals>
+              <goal>add-source</goal>
+            </goals>
+            <configuration>
+              <sources>
+                <source>${project.build.directory}/generated-sources</source>
+              </sources>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>shared-logging-generated-sources</id>
+            <phase>generate-sources</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              
<outputDirectory>${project.build.directory}/generated-sources</outputDirectory>
+              <overWriteIfNewer>false</overWriteIfNewer>
+              
<artifact>org.apache.maven.shared:maven-shared-utils:3.1.0:jar:sources</artifact>
+              <includes>org/apache/maven/shared/utils/logging/*.java</includes>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <classpathDependencyExcludes>
+            
<classpathDependencyExclude>org.fusesource.jansi:jansi</classpathDependencyExclude>
+          </classpathDependencyExcludes>
+        </configuration>
+      </plugin>
     </plugins>
   </build>
 

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/AbstractSurefireReportMojo.java
----------------------------------------------------------------------
diff --git 
a/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/AbstractSurefireReportMojo.java
 
b/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/AbstractSurefireReportMojo.java
index ea3b08c..9621fa1 100644
--- 
a/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/AbstractSurefireReportMojo.java
+++ 
b/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/AbstractSurefireReportMojo.java
@@ -26,15 +26,16 @@ import java.util.List;
 import java.util.Locale;
 import java.util.ResourceBundle;
 import org.apache.maven.model.ReportPlugin;
+import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.reporting.AbstractMavenReport;
 import org.apache.maven.reporting.MavenReportException;
 import org.apache.maven.shared.utils.PathTool;
-import org.apache.maven.shared.utils.StringUtils;
 
 import static java.util.Collections.addAll;
 import static 
org.apache.maven.plugins.surefire.report.SurefireReportParser.hasReportFiles;
+import static org.apache.maven.shared.utils.StringUtils.isEmpty;
 
 /**
  * Abstract base class for reporting test results using Surefire.
@@ -44,6 +45,7 @@ import static 
org.apache.maven.plugins.surefire.report.SurefireReportParser.hasR
 public abstract class AbstractSurefireReportMojo
     extends AbstractMavenReport
 {
+
     /**
      * If set to false, only failures are shown.
      *
@@ -102,6 +104,8 @@ public abstract class AbstractSurefireReportMojo
     @Parameter( defaultValue = "false", property = "aggregate" )
     private boolean aggregate;
 
+    private List<File> resolvedReportsDirectories;
+
     /**
      * Whether the report should be generated or not.
      *
@@ -130,47 +134,32 @@ public abstract class AbstractSurefireReportMojo
     public void executeReport( Locale locale )
         throws MavenReportException
     {
-        if ( isSkipped() )
-        {
-            return;
-        }
-
-        final List<File> reportsDirectoryList = getReportsDirectories();
-
-        if ( reportsDirectoryList == null )
+        if ( !hasReportDirectories() )
         {
             return;
         }
 
-        if ( !isGeneratedWhenNoResults() )
-        {
-            boolean atLeastOneDirectoryExists = false;
-            for ( Iterator<File> i = reportsDirectoryList.iterator(); 
i.hasNext() && !atLeastOneDirectoryExists; )
-            {
-                atLeastOneDirectoryExists = hasReportFiles( i.next() );
-            }
-            if ( !atLeastOneDirectoryExists )
-            {
-                return;
-            }
-        }
-
-        SurefireReportGenerator report =
-            new SurefireReportGenerator( reportsDirectoryList, locale, 
showSuccess, determineXrefLocation() );
-
-        report.doGenerateReport( getBundle( locale ), getSink() );
+        new SurefireReportGenerator( getReportsDirectories(), locale, 
showSuccess, determineXrefLocation(),
+                                           getConsoleLogger() )
+                .doGenerateReport( getBundle( locale ), getSink() );
     }
 
+    @Override
     public boolean canGenerateReport()
     {
+        return hasReportDirectories() && super.canGenerateReport();
+    }
+
+    private boolean hasReportDirectories()
+    {
         if ( isSkipped() )
         {
             return false;
         }
 
-        final List<File> reportsDirectoryList = getReportsDirectories();
+        final List<File> reportsDirectories = getReportsDirectories();
 
-        if ( reportsDirectoryList == null )
+        if ( reportsDirectories == null )
         {
             return false;
         }
@@ -178,7 +167,7 @@ public abstract class AbstractSurefireReportMojo
         if ( !isGeneratedWhenNoResults() )
         {
             boolean atLeastOneDirectoryExists = false;
-            for ( Iterator<File> i = reportsDirectoryList.iterator(); 
i.hasNext() && !atLeastOneDirectoryExists; )
+            for ( Iterator<File> i = reportsDirectories.iterator(); 
i.hasNext() && !atLeastOneDirectoryExists; )
             {
                 atLeastOneDirectoryExists = hasReportFiles( i.next() );
             }
@@ -187,23 +176,27 @@ public abstract class AbstractSurefireReportMojo
                 return false;
             }
         }
-
-        return super.canGenerateReport();
+        return true;
     }
 
     private List<File> getReportsDirectories()
     {
-        final List<File> reportsDirectories = new ArrayList<File>();
+        if ( resolvedReportsDirectories != null )
+        {
+            return resolvedReportsDirectories;
+        }
+
+        resolvedReportsDirectories = new ArrayList<File>();
 
         if ( this.reportsDirectories != null )
         {
-            addAll( reportsDirectories, this.reportsDirectories );
+            addAll( resolvedReportsDirectories, this.reportsDirectories );
         }
         //noinspection deprecation
         if ( reportsDirectory != null )
         {
             //noinspection deprecation
-            reportsDirectories.add( reportsDirectory );
+            resolvedReportsDirectories.add( reportsDirectory );
         }
         if ( aggregate )
         {
@@ -215,7 +208,7 @@ public abstract class AbstractSurefireReportMojo
             {
                 for ( MavenProject mavenProject : getProjectsWithoutRoot() )
                 {
-                    reportsDirectories.add( getSurefireReportsDirectory( 
mavenProject ) );
+                    resolvedReportsDirectories.add( 
getSurefireReportsDirectory( mavenProject ) );
                 }
             }
             else
@@ -236,8 +229,8 @@ public abstract class AbstractSurefireReportMojo
                         File reportsDirectory = new File( moduleBaseDir, 
reportDir );
                         if ( reportsDirectory.exists() && 
reportsDirectory.isDirectory() )
                         {
-                            getLog().debug( "Adding report dir : " + 
moduleBaseDir + reportDir );
-                            reportsDirectories.add( reportsDirectory );
+                            getConsoleLogger().debug( "Adding report dir : " + 
moduleBaseDir + reportDir );
+                            resolvedReportsDirectories.add( reportsDirectory );
                         }
                     }
                 }
@@ -245,13 +238,13 @@ public abstract class AbstractSurefireReportMojo
         }
         else
         {
-            if ( reportsDirectories.isEmpty() )
+            if ( resolvedReportsDirectories.isEmpty() )
             {
 
-                reportsDirectories.add( getSurefireReportsDirectory( project ) 
);
+                resolvedReportsDirectories.add( getSurefireReportsDirectory( 
project ) );
             }
         }
-        return reportsDirectories;
+        return resolvedReportsDirectories;
     }
 
     /**
@@ -283,7 +276,7 @@ public abstract class AbstractSurefireReportMojo
         if ( linkXRef )
         {
             String relativePath = PathTool.getRelativePath( 
getOutputDirectory(), xrefLocation.getAbsolutePath() );
-            if ( StringUtils.isEmpty( relativePath ) )
+            if ( isEmpty( relativePath ) )
             {
                 relativePath = ".";
             }
@@ -310,7 +303,7 @@ public abstract class AbstractSurefireReportMojo
 
             if ( location == null )
             {
-                getLog().warn( "Unable to locate Test Source XRef to link to - 
DISABLED" );
+                getConsoleLogger().warning( "Unable to locate Test Source XRef 
to link to - DISABLED" );
             }
         }
         return location;
@@ -339,6 +332,11 @@ public abstract class AbstractSurefireReportMojo
 
     private ResourceBundle getBundle( Locale locale )
     {
-        return ResourceBundle.getBundle( "surefire-report", locale, 
this.getClass().getClassLoader() );
+        return ResourceBundle.getBundle( "surefire-report", locale, 
getClass().getClassLoader() );
+    }
+
+    protected final ConsoleLogger getConsoleLogger()
+    {
+        return new PluginConsoleLogger( getLog() );
     }
 }

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/FailsafeReportMojo.java
----------------------------------------------------------------------
diff --git 
a/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/FailsafeReportMojo.java
 
b/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/FailsafeReportMojo.java
index 071ac44..4cf51fc 100644
--- 
a/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/FailsafeReportMojo.java
+++ 
b/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/FailsafeReportMojo.java
@@ -111,6 +111,6 @@ public class FailsafeReportMojo
     */
     private ResourceBundle getBundle( Locale locale )
     {
-        return ResourceBundle.getBundle( "surefire-report", locale, 
this.getClass().getClassLoader() );
+        return ResourceBundle.getBundle( "surefire-report", locale, 
getClass().getClassLoader() );
     }
 }

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/PluginConsoleLogger.java
----------------------------------------------------------------------
diff --git 
a/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/PluginConsoleLogger.java
 
b/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/PluginConsoleLogger.java
new file mode 100644
index 0000000..ba83734
--- /dev/null
+++ 
b/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/PluginConsoleLogger.java
@@ -0,0 +1,140 @@
+package org.apache.maven.plugins.surefire.report;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.plugin.logging.Log;
+import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
+import org.apache.maven.shared.utils.logging.MessageBuilder;
+
+import static java.lang.Integer.numberOfLeadingZeros;
+import static org.apache.maven.shared.utils.logging.MessageUtils.buffer;
+
+/**
+ * Wrapper logger of miscellaneous (Maven 2.2.1 or 3.1) implementations of 
{@link Log}.
+ * Calling {@link Log#isInfoEnabled()} before {@link Log#info(CharSequence)} 
due to Maven 2.2.1.
+ *
+ * @author <a href="mailto:tibordig...@apache.org";>Tibor Digana (tibor17)</a>
+ * @since 2.19.2
+ * @see ConsoleLogger
+ */
+final class PluginConsoleLogger
+    implements ConsoleLogger
+{
+    private final Log mojoLogger;
+
+    public PluginConsoleLogger( Log mojoLogger )
+    {
+        this.mojoLogger = mojoLogger;
+    }
+
+    public boolean isDebugEnabled()
+    {
+        return mojoLogger.isDebugEnabled();
+    }
+
+    public void debug( String message )
+    {
+        if ( mojoLogger.isDebugEnabled() )
+        {
+            mojoLogger.debug( createAnsiBuilder( message ).debug( message 
).toString() );
+        }
+    }
+
+    public void debug( CharSequence content, Throwable error )
+    {
+        if ( mojoLogger.isDebugEnabled() )
+        {
+            mojoLogger.debug( content, error );
+        }
+    }
+
+    public boolean isInfoEnabled()
+    {
+        return mojoLogger.isInfoEnabled();
+    }
+
+    public void info( String message )
+    {
+        if ( mojoLogger.isInfoEnabled() )
+        {
+            mojoLogger.info( createAnsiBuilder( message ).info( message 
).toString() );
+        }
+    }
+
+    public boolean isWarnEnabled()
+    {
+        return mojoLogger.isWarnEnabled();
+    }
+
+    public void warning( String message )
+    {
+        if ( mojoLogger.isWarnEnabled() )
+        {
+            mojoLogger.warn( createAnsiBuilder( message ).warning( message 
).toString() );
+        }
+    }
+
+    public void warn( CharSequence content, Throwable error )
+    {
+        if ( mojoLogger.isWarnEnabled() )
+        {
+            mojoLogger.warn( content, error );
+        }
+    }
+
+    public boolean isErrorEnabled()
+    {
+        return mojoLogger.isErrorEnabled();
+    }
+
+    public void error( String message )
+    {
+        if ( mojoLogger.isErrorEnabled() )
+        {
+            mojoLogger.error( createAnsiBuilder( message ).error( message 
).toString() );
+        }
+    }
+
+    public void error( String message, Throwable t )
+    {
+        if ( mojoLogger.isErrorEnabled() )
+        {
+            mojoLogger.error( message, t );
+        }
+    }
+
+    public void error( Throwable t )
+    {
+        if ( mojoLogger.isErrorEnabled() )
+        {
+            mojoLogger.error( t );
+        }
+    }
+
+    private static MessageBuilder createAnsiBuilder( CharSequence message )
+    {
+        return buffer( bufferSize( message ) );
+    }
+
+    private static int bufferSize( CharSequence message )
+    {
+        return 32 - numberOfLeadingZeros( message.length() );
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/SurefireReportGenerator.java
----------------------------------------------------------------------
diff --git 
a/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/SurefireReportGenerator.java
 
b/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/SurefireReportGenerator.java
index a6e49cd..7cebfe7 100644
--- 
a/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/SurefireReportGenerator.java
+++ 
b/maven-surefire-report-plugin/src/main/java/org/apache/maven/plugins/surefire/report/SurefireReportGenerator.java
@@ -30,35 +30,36 @@ import org.apache.maven.doxia.sink.Sink;
 import org.apache.maven.doxia.sink.SinkEventAttributeSet;
 import org.apache.maven.doxia.sink.SinkEventAttributes;
 import org.apache.maven.doxia.util.DoxiaUtils;
+import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
 import org.apache.maven.reporting.MavenReportException;
 
+import static org.apache.maven.doxia.sink.Sink.JUSTIFY_LEFT;
+
 /**
  *
  */
 public final class SurefireReportGenerator
 {
-    private static final Object[] TAG_TYPE_START = new Object[]{ 
HtmlMarkup.TAG_TYPE_START };
+    private static final int LEFT = JUSTIFY_LEFT;
 
-    private static final Object[] TAG_TYPE_END = new Object[]{ 
HtmlMarkup.TAG_TYPE_END };
+    private static final Object[] TAG_TYPE_START = { HtmlMarkup.TAG_TYPE_START 
};
 
-    private final SurefireReportParser report;
+    private static final Object[] TAG_TYPE_END = { HtmlMarkup.TAG_TYPE_END };
 
-    private List<ReportTestSuite> testSuites;
+    private final SurefireReportParser report;
 
     private final boolean showSuccess;
 
     private final String xrefLocation;
-    
-    private static final int LEFT = Sink.JUSTIFY_LEFT;
+
+    private List<ReportTestSuite> testSuites;
 
     public SurefireReportGenerator( List<File> reportsDirectories, Locale 
locale, boolean showSuccess,
-                                    String xrefLocation )
+                                    String xrefLocation, ConsoleLogger 
consoleLogger )
     {
-        report = new SurefireReportParser( reportsDirectories, locale );
-
-        this.xrefLocation = xrefLocation;
-
+        report = new SurefireReportParser( reportsDirectories, locale, 
consoleLogger );
         this.showSuccess = showSuccess;
+        this.xrefLocation = xrefLocation;
     }
 
     public void doGenerateReport( ResourceBundle bundle, Sink sink )

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/maven-surefire-report-plugin/src/test/java/org/apache/maven/plugins/surefire/report/Surefire597Test.java
----------------------------------------------------------------------
diff --git 
a/maven-surefire-report-plugin/src/test/java/org/apache/maven/plugins/surefire/report/Surefire597Test.java
 
b/maven-surefire-report-plugin/src/test/java/org/apache/maven/plugins/surefire/report/Surefire597Test.java
index 35182d0..b78edcb 100644
--- 
a/maven-surefire-report-plugin/src/test/java/org/apache/maven/plugins/surefire/report/Surefire597Test.java
+++ 
b/maven-surefire-report-plugin/src/test/java/org/apache/maven/plugins/surefire/report/Surefire597Test.java
@@ -20,6 +20,8 @@ package org.apache.maven.plugins.surefire.report;
  */
 
 import org.apache.maven.doxia.module.xhtml.XhtmlSink;
+import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
+import org.apache.maven.plugin.surefire.log.api.NullConsoleLogger;
 import org.junit.Test;
 
 import java.io.File;
@@ -43,7 +45,8 @@ public class Surefire597Test
     {
         File basedir = new File( "." ).getCanonicalFile();
         File report = new File( basedir, "target/test-classes/surefire-597" );
-        SurefireReportGenerator gen = new SurefireReportGenerator( 
singletonList( report ), ENGLISH, true, null );
+        ConsoleLogger log = new NullConsoleLogger();
+        SurefireReportGenerator gen = new SurefireReportGenerator( 
singletonList( report ), ENGLISH, true, null, log );
         ResourceBundle resourceBundle = ResourceBundle.getBundle( 
"surefire-report", ENGLISH );
         StringWriter writer = new StringWriter();
         gen.doGenerateReport( resourceBundle, new XhtmlSink( writer ) {} );

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 95198cf..609ec15 100644
--- a/pom.xml
+++ b/pom.xml
@@ -49,6 +49,7 @@
   </contributors>
 
   <modules>
+    <module>surefire-logger-api</module>
     <module>surefire-shadefire</module>
     <module>surefire-api</module>
     <module>surefire-booter</module>
@@ -116,6 +117,11 @@
       </dependency>
       <dependency>
         <groupId>org.apache.maven.surefire</groupId>
+        <artifactId>surefire-logger-api</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.maven.surefire</groupId>
         <artifactId>surefire-grouper</artifactId>
         <version>${project.version}</version>
       </dependency>

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/surefire-api/pom.xml
----------------------------------------------------------------------
diff --git a/surefire-api/pom.xml b/surefire-api/pom.xml
index 18e2c25..f8c8be9 100644
--- a/surefire-api/pom.xml
+++ b/surefire-api/pom.xml
@@ -33,6 +33,10 @@
 
   <dependencies>
     <dependency>
+      <groupId>org.apache.maven.surefire</groupId>
+      <artifactId>surefire-logger-api</artifactId>
+    </dependency>
+    <dependency>
       <groupId>org.apache.maven.shared</groupId>
       <artifactId>maven-shared-utils</artifactId>
     </dependency>

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/surefire-api/src/main/java/org/apache/maven/surefire/booter/BaseProviderFactory.java
----------------------------------------------------------------------
diff --git 
a/surefire-api/src/main/java/org/apache/maven/surefire/booter/BaseProviderFactory.java
 
b/surefire-api/src/main/java/org/apache/maven/surefire/booter/BaseProviderFactory.java
index c72e2f7..66f28ad 100644
--- 
a/surefire-api/src/main/java/org/apache/maven/surefire/booter/BaseProviderFactory.java
+++ 
b/surefire-api/src/main/java/org/apache/maven/surefire/booter/BaseProviderFactory.java
@@ -21,7 +21,7 @@ package org.apache.maven.surefire.booter;
 
 import org.apache.maven.surefire.cli.CommandLineOption;
 import org.apache.maven.surefire.providerapi.ProviderParameters;
-import org.apache.maven.surefire.report.ConsoleLogger;
+import org.apache.maven.surefire.report.ConsoleStream;
 import org.apache.maven.surefire.report.DefaultDirectConsoleReporter;
 import org.apache.maven.surefire.report.ReporterConfiguration;
 import org.apache.maven.surefire.report.ReporterFactory;
@@ -41,6 +41,8 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
+import static java.util.Collections.emptyList;
+
 /**
  * @author Kristian Rosenvold
  */
@@ -55,7 +57,7 @@ public class BaseProviderFactory
 
     private final boolean insideFork;
 
-    private List<CommandLineOption> mainCliOptions = Collections.emptyList();
+    private List<CommandLineOption> mainCliOptions = emptyList();
 
     private Map<String, String> providerProperties;
 
@@ -128,7 +130,7 @@ public class BaseProviderFactory
         this.testClassLoader = testClassLoader;
     }
 
-    public ConsoleLogger getConsoleLogger()
+    public ConsoleStream getConsoleLogger()
     {
         boolean trim = reporterConfiguration.isTrimStackTrace();
         PrintStream out = reporterConfiguration.getOriginalSystemOut();

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/surefire-api/src/main/java/org/apache/maven/surefire/booter/CommandReader.java
----------------------------------------------------------------------
diff --git 
a/surefire-api/src/main/java/org/apache/maven/surefire/booter/CommandReader.java
 
b/surefire-api/src/main/java/org/apache/maven/surefire/booter/CommandReader.java
index 2bb4504..4287080 100644
--- 
a/surefire-api/src/main/java/org/apache/maven/surefire/booter/CommandReader.java
+++ 
b/surefire-api/src/main/java/org/apache/maven/surefire/booter/CommandReader.java
@@ -19,6 +19,8 @@ package org.apache.maven.surefire.booter;
  * under the License.
  */
 
+import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
+import org.apache.maven.plugin.surefire.log.api.NullConsoleLogger;
 import org.apache.maven.surefire.testset.TestSetFailedException;
 
 import java.io.DataInputStream;
@@ -46,10 +48,11 @@ import static 
org.apache.maven.surefire.booter.MasterProcessCommand.SHUTDOWN;
 import static 
org.apache.maven.surefire.booter.MasterProcessCommand.SKIP_SINCE_NEXT_TEST;
 import static 
org.apache.maven.surefire.booter.MasterProcessCommand.TEST_SET_FINISHED;
 import static org.apache.maven.surefire.booter.MasterProcessCommand.decode;
+import static 
org.apache.maven.surefire.util.internal.DaemonThreadFactory.newDaemonThread;
 import static 
org.apache.maven.surefire.util.internal.StringUtils.encodeStringForForkCommunication;
-import static org.apache.maven.surefire.util.internal.StringUtils.isNotBlank;
 import static org.apache.maven.surefire.util.internal.StringUtils.isBlank;
-import static 
org.apache.maven.surefire.util.internal.DaemonThreadFactory.newDaemonThread;
+import static org.apache.maven.surefire.util.internal.StringUtils.isNotBlank;
+import static 
org.apache.maven.surefire.util.internal.StringUtils.requireNonNull;
 
 /**
  * Reader of commands coming from plugin(master) process.
@@ -80,6 +83,12 @@ public final class CommandReader
 
     private int iteratedCount;
 
+    private volatile ConsoleLogger logger = new NullConsoleLogger();
+
+    private CommandReader()
+    {
+    }
+
     public static CommandReader getReader()
     {
         final CommandReader reader = READER;
@@ -96,6 +105,12 @@ public final class CommandReader
         return this;
     }
 
+    public CommandReader setLogger( ConsoleLogger logger )
+    {
+        this.logger = requireNonNull( logger, "null logger" );
+        return this;
+    }
+
     public boolean awaitStarted()
         throws TestSetFailedException
     {
@@ -360,7 +375,7 @@ public final class CommandReader
                     Command command = decode( stdIn );
                     if ( command == null )
                     {
-                        System.err.println( "[SUREFIRE] std/in stream 
corrupted: first sequence not recognized" );
+                        logger.error( "[SUREFIRE] std/in stream corrupted: 
first sequence not recognized" );
                         break;
                     }
                     else
@@ -409,8 +424,7 @@ public final class CommandReader
                 // If #stop() method is called, reader thread is interrupted 
and cause is InterruptedException.
                 if ( !( e.getCause() instanceof InterruptedException ) )
                 {
-                    System.err.println( "[SUREFIRE] std/in stream corrupted" );
-                    e.printStackTrace();
+                    logger.error( "[SUREFIRE] std/in stream corrupted", e );
                 }
             }
             finally

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/surefire-api/src/main/java/org/apache/maven/surefire/booter/ForkingRunListener.java
----------------------------------------------------------------------
diff --git 
a/surefire-api/src/main/java/org/apache/maven/surefire/booter/ForkingRunListener.java
 
b/surefire-api/src/main/java/org/apache/maven/surefire/booter/ForkingRunListener.java
index e56b94b..d0d8cca 100644
--- 
a/surefire-api/src/main/java/org/apache/maven/surefire/booter/ForkingRunListener.java
+++ 
b/surefire-api/src/main/java/org/apache/maven/surefire/booter/ForkingRunListener.java
@@ -20,20 +20,24 @@ package org.apache.maven.surefire.booter;
  */
 
 import java.io.PrintStream;
-import java.nio.charset.Charset;
 import java.util.Enumeration;
 import java.util.Properties;
 
-import org.apache.maven.surefire.report.ConsoleLogger;
+import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
+import org.apache.maven.plugin.surefire.log.api.ConsoleLoggerUtils;
 import org.apache.maven.surefire.report.ConsoleOutputReceiver;
+import org.apache.maven.surefire.report.ConsoleStream;
 import org.apache.maven.surefire.report.ReportEntry;
 import org.apache.maven.surefire.report.RunListener;
 import org.apache.maven.surefire.report.SafeThrowable;
 import org.apache.maven.surefire.report.SimpleReportEntry;
 import org.apache.maven.surefire.report.StackTraceWriter;
-import org.apache.maven.surefire.util.internal.StringUtils;
 
+import static java.lang.Integer.toHexString;
+import static java.nio.charset.Charset.defaultCharset;
 import static 
org.apache.maven.surefire.util.internal.StringUtils.encodeStringForForkCommunication;
+import static 
org.apache.maven.surefire.util.internal.StringUtils.escapeBytesToPrintable;
+import static 
org.apache.maven.surefire.util.internal.StringUtils.escapeToPrintable;
 
 /**
  * Encodes the full output of the test run to the stdout stream.
@@ -53,7 +57,7 @@ import static 
org.apache.maven.surefire.util.internal.StringUtils.encodeStringFo
  * @author Kristian Rosenvold
  */
 public class ForkingRunListener
-    implements RunListener, ConsoleLogger, ConsoleOutputReceiver
+    implements RunListener, ConsoleLogger, ConsoleOutputReceiver, ConsoleStream
 {
     public static final byte BOOTERCODE_TESTSET_STARTING = (byte) '1';
 
@@ -75,6 +79,10 @@ public class ForkingRunListener
 
     public static final byte BOOTERCODE_TEST_ASSUMPTIONFAILURE = (byte) 'G';
 
+    /**
+     * INFO logger
+     * @see ConsoleLogger#info(String)
+     */
     public static final byte BOOTERCODE_CONSOLE = (byte) 'H';
 
     public static final byte BOOTERCODE_SYSPROPS = (byte) 'I';
@@ -83,10 +91,27 @@ public class ForkingRunListener
 
     public static final byte BOOTERCODE_STOP_ON_NEXT_TEST = (byte) 'S';
 
+    /**
+     * ERROR logger
+     * @see ConsoleLogger#error(String)
+     */
     public static final byte BOOTERCODE_ERROR = (byte) 'X';
 
     public static final byte BOOTERCODE_BYE = (byte) 'Z';
 
+    /**
+     * DEBUG logger
+     * @see ConsoleLogger#debug(String)
+     */
+    public static final byte BOOTERCODE_DEBUG = (byte) 'D';
+
+    /**
+     * WARNING logger
+     * @see ConsoleLogger#warning(String)
+     */
+    public static final byte BOOTERCODE_WARNING = (byte) 'W';
+
+
     private final PrintStream target;
 
     private final int testSetChannelId;
@@ -172,7 +197,7 @@ public class ForkingRunListener
         byte[] header = stdout ? stdOutHeader : stdErrHeader;
         byte[] content =
             new byte[buf.length * 3 + 1]; // Hex-escaping can be up to 3 times 
length of a regular byte.
-        int i = StringUtils.escapeBytesToPrintable( content, 0, buf, off, len 
);
+        int i = escapeBytesToPrintable( content, 0, buf, off, len );
         content[i++] = (byte) '\n';
 
         synchronized ( target ) // See notes about synchronization/thread 
safety in class javadoc
@@ -187,24 +212,54 @@ public class ForkingRunListener
         return encodeStringForForkCommunication( String.valueOf( (char) 
booterCode )
                 + ','
                 + Integer.toString( testSetChannel, 16 )
-                + ',' + Charset.defaultCharset().name()
+                + ',' + defaultCharset().name()
                 + ',' );
     }
 
-    public void info( String message )
+    private void log( byte bootCode, String message )
     {
         if ( message != null )
         {
             StringBuilder sb = new StringBuilder( 7 + message.length() * 5 );
-            append( sb, BOOTERCODE_CONSOLE ); comma( sb );
-            append( sb, Integer.toHexString( testSetChannelId ) ); comma( sb );
-            StringUtils.escapeToPrintable( sb, message );
+            append( sb, bootCode ); comma( sb );
+            append( sb, toHexString( testSetChannelId ) ); comma( sb );
+            escapeToPrintable( sb, message );
 
             sb.append( '\n' );
             encodeAndWriteToTarget( sb.toString() );
         }
     }
 
+    public void debug( String message )
+    {
+        log( BOOTERCODE_DEBUG, message );
+    }
+
+    public void info( String message )
+    {
+        log( BOOTERCODE_CONSOLE, message );
+    }
+
+    public void warning( String message )
+    {
+        log( BOOTERCODE_WARNING, message );
+    }
+
+    public void error( String message )
+    {
+        log( BOOTERCODE_ERROR, message );
+    }
+
+    public void error( String message, Throwable t )
+    {
+        error( ConsoleLoggerUtils.toString( message, t ) );
+    }
+
+    public void error( Throwable t )
+    {
+        error( null, t );
+    }
+
     private void encodeAndWriteToTarget( String string )
     {
         byte[] encodeBytes = encodeStringForForkCommunication( string );
@@ -219,11 +274,11 @@ public class ForkingRunListener
         StringBuilder stringBuilder = new StringBuilder();
 
         append( stringBuilder, BOOTERCODE_SYSPROPS ); comma( stringBuilder );
-        append( stringBuilder, Integer.toHexString( testSetChannelId ) ); 
comma( stringBuilder );
+        append( stringBuilder, toHexString( testSetChannelId ) ); comma( 
stringBuilder );
 
-        StringUtils.escapeToPrintable( stringBuilder, key );
+        escapeToPrintable( stringBuilder, key );
         comma( stringBuilder );
-        StringUtils.escapeToPrintable( stringBuilder, value );
+        escapeToPrintable( stringBuilder, value );
         stringBuilder.append( "\n" );
         return stringBuilder.toString();
     }
@@ -232,7 +287,7 @@ public class ForkingRunListener
     {
         StringBuilder stringBuilder = new StringBuilder();
         append( stringBuilder, operationCode ); comma( stringBuilder );
-        append( stringBuilder, Integer.toHexString( testSetChannelId ) ); 
comma( stringBuilder );
+        append( stringBuilder, toHexString( testSetChannelId ) ); comma( 
stringBuilder );
 
         nullableEncoding( stringBuilder, reportEntry.getSourceName() );
         comma( stringBuilder );
@@ -291,7 +346,7 @@ public class ForkingRunListener
         }
         else
         {
-            StringUtils.escapeToPrintable( stringBuilder, source );
+            escapeToPrintable( stringBuilder, source );
         }
     }
 
@@ -320,4 +375,15 @@ public class ForkingRunListener
                 : stackTraceWriter.writeTraceToString() );
         }
     }
+
+    public void println( String message )
+    {
+        byte[] buf = message.getBytes();
+        println( buf, 0, buf.length );
+    }
+
+    public void println( byte[] buf, int off, int len )
+    {
+        writeTestOutput( buf, off, len, true );
+    }
 }

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/surefire-api/src/main/java/org/apache/maven/surefire/booter/SurefireReflector.java
----------------------------------------------------------------------
diff --git 
a/surefire-api/src/main/java/org/apache/maven/surefire/booter/SurefireReflector.java
 
b/surefire-api/src/main/java/org/apache/maven/surefire/booter/SurefireReflector.java
index bd73908..b25c04b 100644
--- 
a/surefire-api/src/main/java/org/apache/maven/surefire/booter/SurefireReflector.java
+++ 
b/surefire-api/src/main/java/org/apache/maven/surefire/booter/SurefireReflector.java
@@ -29,6 +29,8 @@ import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
+import org.apache.maven.plugin.surefire.log.api.ConsoleLoggerDecorator;
 import org.apache.maven.surefire.cli.CommandLineOption;
 import org.apache.maven.surefire.providerapi.ProviderParameters;
 import org.apache.maven.surefire.report.ReporterConfiguration;
@@ -42,6 +44,8 @@ import org.apache.maven.surefire.testset.TestRequest;
 import org.apache.maven.surefire.util.RunOrder;
 import org.apache.maven.surefire.util.SurefireReflectionException;
 
+import javax.annotation.Nonnull;
+
 import static java.util.Collections.checkedList;
 
 import static org.apache.maven.surefire.util.ReflectionUtils.getConstructor;
@@ -102,7 +106,6 @@ public class SurefireReflector
 
     private final Class<Enum> shutdownClass;
 
-
     @SuppressWarnings( "unchecked" )
     public SurefireReflector( ClassLoader surefireClassLoader )
     {
@@ -408,6 +411,11 @@ public class SurefireReflector
         return runResult.isAssignableFrom( o.getClass() );
     }
 
+    public Object createConsoleLogger( @Nonnull ConsoleLogger consoleLogger )
+    {
+        return createConsoleLogger( consoleLogger, surefireClassLoader );
+    }
+
     private static Collection<Integer> toOrdinals( Collection<? extends Enum> 
enums )
     {
         Collection<Integer> ordinals = new ArrayList<Integer>( enums.size() );
@@ -418,4 +426,17 @@ public class SurefireReflector
         return ordinals;
     }
 
+    public static Object createConsoleLogger( ConsoleLogger consoleLogger, 
ClassLoader cl )
+    {
+        try
+        {
+            Class<?> decoratorClass = cl.loadClass( 
ConsoleLoggerDecorator.class.getName() );
+            return getConstructor( decoratorClass, Object.class ).newInstance( 
consoleLogger );
+        }
+        catch ( Exception e )
+        {
+            throw new SurefireReflectionException( e );
+        }
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/surefire-api/src/main/java/org/apache/maven/surefire/providerapi/ProviderParameters.java
----------------------------------------------------------------------
diff --git 
a/surefire-api/src/main/java/org/apache/maven/surefire/providerapi/ProviderParameters.java
 
b/surefire-api/src/main/java/org/apache/maven/surefire/providerapi/ProviderParameters.java
index a511345..e8c5a84 100644
--- 
a/surefire-api/src/main/java/org/apache/maven/surefire/providerapi/ProviderParameters.java
+++ 
b/surefire-api/src/main/java/org/apache/maven/surefire/providerapi/ProviderParameters.java
@@ -21,7 +21,7 @@ package org.apache.maven.surefire.providerapi;
 
 import org.apache.maven.surefire.booter.Shutdown;
 import org.apache.maven.surefire.cli.CommandLineOption;
-import org.apache.maven.surefire.report.ConsoleLogger;
+import org.apache.maven.surefire.report.ConsoleStream;
 import org.apache.maven.surefire.report.ReporterConfiguration;
 import org.apache.maven.surefire.report.ReporterFactory;
 import org.apache.maven.surefire.testset.DirectoryScannerParameters;
@@ -84,9 +84,9 @@ public interface ProviderParameters
      * This output is intended for provider-oriented messages that are not 
attached to a single test-set
      * and will normally be written to something console-like immediately.
      *
-     * @return A console logger
+     * @return A console stream logger
      */
-    ConsoleLogger getConsoleLogger();
+    ConsoleStream getConsoleLogger();
 
     /**
      * The raw parameters used in creating the directory scanner

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/surefire-api/src/main/java/org/apache/maven/surefire/report/ConsoleLogger.java
----------------------------------------------------------------------
diff --git 
a/surefire-api/src/main/java/org/apache/maven/surefire/report/ConsoleLogger.java
 
b/surefire-api/src/main/java/org/apache/maven/surefire/report/ConsoleLogger.java
deleted file mode 100644
index 4382428..0000000
--- 
a/surefire-api/src/main/java/org/apache/maven/surefire/report/ConsoleLogger.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.apache.maven.surefire.report;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/**
- * Allows providers to write console messages on the running maven process.
- * <p/>
- * This output is associated with the entire test run and not a specific
- * test, which means it just goes "straight" to the console "immediately".
- * <p/>
- * s* <p/>
- */
-public interface ConsoleLogger
-{
-    void info( String message );
-}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/surefire-api/src/main/java/org/apache/maven/surefire/report/ConsoleOutputCapture.java
----------------------------------------------------------------------
diff --git 
a/surefire-api/src/main/java/org/apache/maven/surefire/report/ConsoleOutputCapture.java
 
b/surefire-api/src/main/java/org/apache/maven/surefire/report/ConsoleOutputCapture.java
index 27b0ee2..bb33b3a 100644
--- 
a/surefire-api/src/main/java/org/apache/maven/surefire/report/ConsoleOutputCapture.java
+++ 
b/surefire-api/src/main/java/org/apache/maven/surefire/report/ConsoleOutputCapture.java
@@ -23,6 +23,9 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.PrintStream;
 
+import static java.lang.System.setErr;
+import static java.lang.System.setOut;
+
 /**
  * Deals with system.out/err.
  * <p/>
@@ -31,16 +34,16 @@ public class ConsoleOutputCapture
 {
     public static void startCapture( ConsoleOutputReceiver target )
     {
-        System.setOut( new ForwardingPrintStream( true, target ) );
-
-        System.setErr( new ForwardingPrintStream( false, target ) );
+        setOut( new ForwardingPrintStream( true, target ) );
+        setErr( new ForwardingPrintStream( false, target ) );
     }
 
     private static class ForwardingPrintStream
         extends PrintStream
     {
-        private final boolean isStdout;
+        private static final String NL = System.getProperty( "line.separator" 
);
 
+        private final boolean isStdout;
         private final ConsoleOutputReceiver target;
 
         ForwardingPrintStream( boolean stdout, ConsoleOutputReceiver target )
@@ -83,7 +86,7 @@ public class ConsoleOutputCapture
             {
                 s = "null"; // Shamelessly taken from super.print
             }
-            final byte[] bytes = ( s + "\n" ).getBytes();
+            final byte[] bytes = ( s + NL ).getBytes();
             target.writeTestOutput( bytes, 0, bytes.length, isStdout );
         }
 

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/surefire-api/src/main/java/org/apache/maven/surefire/report/ConsoleStream.java
----------------------------------------------------------------------
diff --git 
a/surefire-api/src/main/java/org/apache/maven/surefire/report/ConsoleStream.java
 
b/surefire-api/src/main/java/org/apache/maven/surefire/report/ConsoleStream.java
new file mode 100644
index 0000000..8a22ef0
--- /dev/null
+++ 
b/surefire-api/src/main/java/org/apache/maven/surefire/report/ConsoleStream.java
@@ -0,0 +1 @@
+package org.apache.maven.surefire.report;

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

/**
 * Delegates to {@link System#out}.
 */
public interface ConsoleStream
{
    void println( String message );
    void println( byte[] buf, 
 int off, int len );
}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/surefire-api/src/main/java/org/apache/maven/surefire/report/DefaultConsoleReporter.java
----------------------------------------------------------------------
diff --git 
a/surefire-api/src/main/java/org/apache/maven/surefire/report/DefaultConsoleReporter.java
 
b/surefire-api/src/main/java/org/apache/maven/surefire/report/DefaultConsoleReporter.java
deleted file mode 100644
index 6c5c850..0000000
--- 
a/surefire-api/src/main/java/org/apache/maven/surefire/report/DefaultConsoleReporter.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.apache.maven.surefire.report;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import java.io.PrintStream;
-
-/**
- * @author <a href="mailto:krist...@zenior.no";>Kristian Rosenvold</a>
- */
-public class DefaultConsoleReporter
-    implements ConsoleLogger
-{
-    private final PrintStream systemOut;
-
-    public DefaultConsoleReporter( PrintStream systemOut )
-    {
-        this.systemOut = systemOut;
-    }
-
-    public void info( String message )
-    {
-        systemOut.println( message );
-    }
-}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/surefire-api/src/main/java/org/apache/maven/surefire/report/DefaultDirectConsoleReporter.java
----------------------------------------------------------------------
diff --git 
a/surefire-api/src/main/java/org/apache/maven/surefire/report/DefaultDirectConsoleReporter.java
 
b/surefire-api/src/main/java/org/apache/maven/surefire/report/DefaultDirectConsoleReporter.java
index f9273ba..f1e0f48 100644
--- 
a/surefire-api/src/main/java/org/apache/maven/surefire/report/DefaultDirectConsoleReporter.java
+++ 
b/surefire-api/src/main/java/org/apache/maven/surefire/report/DefaultDirectConsoleReporter.java
@@ -24,8 +24,8 @@ import java.io.PrintStream;
 /**
  * @author <a href="mailto:krist...@zenior.no";>Kristian Rosenvold</a>
  */
-public class DefaultDirectConsoleReporter
-    implements ConsoleLogger
+public final class DefaultDirectConsoleReporter
+    implements ConsoleStream
 {
     private final PrintStream systemOut;
 
@@ -34,8 +34,13 @@ public class DefaultDirectConsoleReporter
         this.systemOut = systemOut;
     }
 
-    public void info( String message )
+    public void println( String message )
     {
         systemOut.println( message );
     }
+
+    public void println( byte[] buf, int off, int len )
+    {
+        println( new String( buf, off, len ) );
+    }
 }

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/surefire-api/src/test/java/org/apache/maven/surefire/report/MockReporter.java
----------------------------------------------------------------------
diff --git 
a/surefire-api/src/test/java/org/apache/maven/surefire/report/MockReporter.java 
b/surefire-api/src/test/java/org/apache/maven/surefire/report/MockReporter.java
deleted file mode 100644
index 91ff446..0000000
--- 
a/surefire-api/src/test/java/org/apache/maven/surefire/report/MockReporter.java
+++ /dev/null
@@ -1,183 +0,0 @@
-package org.apache.maven.surefire.report;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
-
-/**
- * Internal use only
- */
-public class MockReporter
-    implements RunListener, ConsoleLogger
-{
-    private final List<String> events = new ArrayList<String>();
-
-    private final List<Object> data = new ArrayList<Object>();
-
-    public static final String SET_STARTING = "SET_STARTED";
-
-    public static final String SET_COMPLETED = "SET_COMPLETED";
-
-    public static final String TEST_STARTING = "TEST_STARTED";
-
-    public static final String TEST_SUCCEEDED = "TEST_COMPLETED";
-
-    public static final String TEST_FAILED = "TEST_FAILED";
-
-    public static final String TEST_ERROR = "TEST_ERROR";
-
-    public static final String TEST_SKIPPED = "TEST_SKIPPED";
-
-    public static final String TEST_ASSUMPTION_FAIL = 
"TEST_ASSUMPTION_SKIPPED";
-
-    public static final String CONSOLE_OUTPUT = "CONSOLE_OUTPUT";
-
-    public static final String STDOUT = "STDOUT";
-
-    public static final String STDERR = "STDERR";
-
-    private final AtomicInteger testSucceeded = new AtomicInteger();
-
-    private final AtomicInteger testIgnored = new AtomicInteger();
-
-    private final AtomicInteger testFailed = new AtomicInteger();
-
-    private final AtomicInteger testError = new AtomicInteger();
-
-    public MockReporter()
-    {
-    }
-
-    public void testSetStarting( ReportEntry report )
-    {
-        events.add( SET_STARTING );
-        data.add( report );
-    }
-
-    public void testSetCompleted( ReportEntry report )
-    {
-        events.add( SET_COMPLETED );
-        data.add( report );
-    }
-
-    public void testStarting( ReportEntry report )
-    {
-        events.add( TEST_STARTING );
-        data.add( report );
-    }
-
-    public void testSucceeded( ReportEntry report )
-    {
-        events.add( TEST_SUCCEEDED );
-        testSucceeded.incrementAndGet();
-        data.add( report );
-    }
-
-    public void testError( ReportEntry report )
-    {
-        events.add( TEST_ERROR );
-        data.add( report );
-        testFailed.incrementAndGet();
-    }
-
-    public void testFailed( ReportEntry report )
-    {
-        events.add( TEST_FAILED );
-        data.add( report );
-        testFailed.incrementAndGet();
-    }
-
-
-    public void testSkipped( ReportEntry report )
-    {
-        events.add( TEST_SKIPPED );
-        data.add( report );
-        testIgnored.incrementAndGet();
-    }
-
-    public void testExecutionSkippedByUser()
-    {
-    }
-
-    public void testSkippedByUser( ReportEntry report )
-    {
-        testSkipped( report );
-    }
-
-
-    public String getFirstEvent()
-    {
-        return events.get( 0 );
-    }
-
-    public ReportEntry getFirstData()
-    {
-        return (ReportEntry) data.get( 0 );
-    }
-
-    public String getFirstStringData()
-    {
-        return (String) data.get( 0 );
-    }
-
-    public int getTestSucceeded()
-    {
-        return testSucceeded.get();
-    }
-
-    public int getTestIgnored()
-    {
-        return testIgnored.get();
-    }
-
-    public int getTestFailed()
-    {
-        return testFailed.get();
-    }
-
-
-    public void testAssumptionFailure( ReportEntry report )
-    {
-        events.add( TEST_ASSUMPTION_FAIL );
-        data.add( report );
-        testIgnored.incrementAndGet();
-
-    }
-
-    public void writeTestOutput()
-    {
-        //To change body of implemented methods use File | Settings | File 
Templates.
-    }
-
-    public void info( String message )
-    {
-        events.add( CONSOLE_OUTPUT );
-        data.add( message );
-        //To change body of implemented methods use File | Settings | File 
Templates.
-    }
-
-    public void writeTestOutput( byte[] buf, int off, int len, boolean stdout )
-    {
-        events.add( stdout ? STDOUT : STDERR );
-        data.add( new String( buf, off, len ) );
-    }
-}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java
----------------------------------------------------------------------
diff --git 
a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java
 
b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java
index b5ff6dd..f95291b 100644
--- 
a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java
+++ 
b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java
@@ -38,11 +38,19 @@ import org.apache.maven.surefire.report.StackTraceWriter;
 import org.apache.maven.surefire.suite.RunResult;
 import org.apache.maven.surefire.testset.TestSetFailedException;
 
+import static java.lang.System.err;
+import static java.lang.System.out;
+import static java.lang.System.setErr;
+import static java.lang.System.setOut;
+import static java.lang.Thread.currentThread;
+import static org.apache.maven.surefire.booter.CommandReader.getReader;
 import static org.apache.maven.surefire.booter.Shutdown.EXIT;
 import static org.apache.maven.surefire.booter.Shutdown.KILL;
 import static 
org.apache.maven.surefire.booter.ForkingRunListener.BOOTERCODE_BYE;
 import static 
org.apache.maven.surefire.booter.ForkingRunListener.BOOTERCODE_ERROR;
 import static org.apache.maven.surefire.booter.ForkingRunListener.encode;
+import static 
org.apache.maven.surefire.booter.SurefireReflector.createForkingReporterFactoryInCurrentClassLoader;
+import static 
org.apache.maven.surefire.booter.SystemPropertyManager.setSystemProperties;
 import static org.apache.maven.surefire.util.ReflectionUtils.instantiateOneArg;
 import static 
org.apache.maven.surefire.util.internal.DaemonThreadFactory.newDaemonThreadFactory;
 import static 
org.apache.maven.surefire.util.internal.StringUtils.encodeStringForForkCommunication;
@@ -75,12 +83,12 @@ public final class ForkedBooter
     {
         final CommandReader reader = startupMasterProcessReader();
         final ScheduledFuture<?> pingScheduler = listenToShutdownCommands( 
reader );
-        final PrintStream originalOut = System.out;
+        final PrintStream originalOut = out;
         try
         {
             if ( args.length > 1 )
             {
-                SystemPropertyManager.setSystemProperties( new File( args[1] ) 
);
+                setSystemProperties( new File( args[1] ) );
             }
 
             File surefirePropertiesFile = new File( args[0] );
@@ -98,7 +106,7 @@ public final class ForkedBooter
                 
classpathConfiguration.trickClassPathWhenManifestOnlyClasspath();
             }
 
-            ClassLoader classLoader = 
Thread.currentThread().getContextClassLoader();
+            ClassLoader classLoader = currentThread().getContextClassLoader();
             classLoader.setDefaultAssertionStatus( 
classpathConfiguration.isEnableAssertions() );
             startupConfiguration.writeSurefireTestClasspathProperty();
 
@@ -145,7 +153,7 @@ public final class ForkedBooter
         {
             // Just throwing does getMessage() and a local trace - we want to 
call printStackTrace for a full trace
             // noinspection UseOfSystemOutOrSystemErr
-            t.printStackTrace( System.err );
+            t.printStackTrace( err );
             // noinspection ProhibitedExceptionThrown,CallToSystemExit
             exit( 1, EXIT, reader, false );
         }
@@ -157,7 +165,7 @@ public final class ForkedBooter
 
     private static CommandReader startupMasterProcessReader()
     {
-        return CommandReader.getReader();
+        return getReader();
     }
 
     private static ScheduledFuture<?> listenToShutdownCommands( CommandReader 
reader )
@@ -240,14 +248,14 @@ public final class ForkedBooter
         final ReporterFactory factory = createForkingReporterFactory( 
providerConfiguration, originalSystemOut );
 
         return invokeProviderInSameClassLoader( testSet, factory, 
providerConfiguration, true, startupConfiguration,
-                                                false );
+                                                      false );
     }
 
     private static ReporterFactory createForkingReporterFactory( 
ProviderConfiguration providerConfiguration,
                                                                  PrintStream 
originalSystemOut )
     {
         final boolean trimStackTrace = 
providerConfiguration.getReporterConfiguration().isTrimStackTrace();
-        return 
SurefireReflector.createForkingReporterFactoryInCurrentClassLoader( 
trimStackTrace, originalSystemOut );
+        return createForkingReporterFactoryInCurrentClassLoader( 
trimStackTrace, originalSystemOut );
     }
 
     private static ScheduledExecutorService createJvmTerminator()
@@ -274,41 +282,41 @@ public final class ForkedBooter
     }
 
     private static RunResult invokeProviderInSameClassLoader( Object testSet, 
Object factory,
-                                                             
ProviderConfiguration providerConfiguration,
-                                                             boolean 
insideFork,
-                                                             
StartupConfiguration startupConfig,
-                                                             boolean 
restoreStreams )
+                                                              
ProviderConfiguration providerConfig,
+                                                              boolean 
insideFork,
+                                                              
StartupConfiguration startupConfig,
+                                                              boolean 
restoreStreams )
         throws TestSetFailedException, InvocationTargetException
     {
-        final PrintStream orgSystemOut = System.out;
-        final PrintStream orgSystemErr = System.err;
+        final PrintStream orgSystemOut = out;
+        final PrintStream orgSystemErr = err;
         // Note that System.out/System.err are also read in the 
"ReporterConfiguration" instatiation
         // in createProvider below. These are the same values as here.
 
         try
         {
-            return createProviderInCurrentClassloader( startupConfig, 
insideFork, providerConfiguration, factory )
-                .invoke( testSet );
+            return createProviderInCurrentClassloader( startupConfig, 
insideFork, providerConfig, factory )
+                           .invoke( testSet );
         }
         finally
         {
             if ( restoreStreams && System.getSecurityManager() == null )
             {
-                System.setOut( orgSystemOut );
-                System.setErr( orgSystemErr );
+                setOut( orgSystemOut );
+                setErr( orgSystemErr );
             }
         }
     }
 
-    private static SurefireProvider createProviderInCurrentClassloader( 
StartupConfiguration startupConfiguration1,
-                                                                       boolean 
isInsideFork,
+    private static SurefireProvider createProviderInCurrentClassloader( 
StartupConfiguration startupConfiguration,
+                                                                        
boolean isInsideFork,
                                                                        
ProviderConfiguration providerConfiguration,
-                                                                       Object 
reporterManagerFactory1 )
+                                                                       Object 
reporterManagerFactory )
     {
-        BaseProviderFactory bpf = new BaseProviderFactory( (ReporterFactory) 
reporterManagerFactory1, isInsideFork );
+        BaseProviderFactory bpf = new BaseProviderFactory( (ReporterFactory) 
reporterManagerFactory, isInsideFork );
         bpf.setTestRequest( providerConfiguration.getTestSuiteDefinition() );
         bpf.setReporterConfiguration( 
providerConfiguration.getReporterConfiguration() );
-        ClassLoader classLoader = 
Thread.currentThread().getContextClassLoader();
+        ClassLoader classLoader = currentThread().getContextClassLoader();
         bpf.setClassLoaders( classLoader );
         bpf.setTestArtifactInfo( providerConfiguration.getTestArtifact() );
         bpf.setProviderProperties( 
providerConfiguration.getProviderProperties() );
@@ -317,7 +325,7 @@ public final class ForkedBooter
         bpf.setMainCliOptions( providerConfiguration.getMainCliOptions() );
         bpf.setSkipAfterFailureCount( 
providerConfiguration.getSkipAfterFailureCount() );
         bpf.setShutdown( providerConfiguration.getShutdown() );
-        String providerClass = startupConfiguration1.getActualClassName();
+        String providerClass = startupConfiguration.getActualClassName();
         return (SurefireProvider) instantiateOneArg( classLoader, 
providerClass, ProviderParameters.class, bpf );
     }
 }

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/surefire-integration-tests/pom.xml
----------------------------------------------------------------------
diff --git a/surefire-integration-tests/pom.xml 
b/surefire-integration-tests/pom.xml
index 61e7434..b6fbd41 100644
--- a/surefire-integration-tests/pom.xml
+++ b/surefire-integration-tests/pom.xml
@@ -37,7 +37,6 @@
     <it.settings.showPasswords>false</it.settings.showPasswords>
     <testng.version>5.7</testng.version>
     <surefire.threadcount>5</surefire.threadcount>
-    <mavenHomeUsed>${maven.home}</mavenHomeUsed>
     <useInterpolatedSettings>false</useInterpolatedSettings>
   </properties>
 
@@ -103,7 +102,7 @@
           <systemPropertyVariables>
             <surefire.version>${project.version}</surefire.version>
             <testng.version>${testng.version}</testng.version>
-            <maven.home>${mavenHomeUsed}</maven.home>
+            <maven.home>${maven.home}</maven.home>
             
<maven.settings.file>${project.basedir}/../surefire-setup-integration-tests/target/private/it-settings.xml
             </maven.settings.file>
             
<maven.repo.local>${project.basedir}/../surefire-setup-integration-tests/target/it-repo</maven.repo.local>
@@ -203,50 +202,6 @@
       </properties>
     </profile>
     <profile>
-      <id>maven-2.2.1</id>
-      <properties>
-        
<mavenHomeUsed>${project.build.directory}/maven-extract/apache-maven-2.2.1</mavenHomeUsed>
-      </properties>
-      <build>
-        <plugins>
-          <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-dependency-plugin</artifactId>
-            <version>2.4</version>
-            <executions>
-              <execution>
-                <id>unpack</id>
-                <phase>package</phase>
-                <goals>
-                  <goal>unpack</goal>
-                </goals>
-                <configuration>
-                  <artifactItems>
-                    <artifactItem>
-                      <groupId>org.apache.maven</groupId>
-                      <artifactId>apache-maven</artifactId>
-                      <version>2.2.1</version>
-                      <type>tar.gz</type>
-                      <classifier>bin</classifier>
-                      <overWrite>false</overWrite>
-                      
<outputDirectory>${project.build.directory}/maven-extract</outputDirectory>
-                    </artifactItem>
-                  </artifactItems>
-                </configuration>
-              </execution>
-            </executions>
-          </plugin>
-          <plugin>
-            <artifactId>maven-failsafe-plugin</artifactId>
-            <version>2.12.4</version> <!-- ${shadedVersion}, but resolved due 
to http://jira.codehaus.org/browse/MRELEASE-799 -->
-            <configuration>
-              
<excludedGroups>org.apache.maven.surefire.its.Not2xCompatible</excludedGroups>
-            </configuration>
-          </plugin>
-        </plugins>
-      </build>
-    </profile>
-    <profile>
       <id>jenkins</id>
       <build>
         <plugins>

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/Junit47concurrencyIT.java
----------------------------------------------------------------------
diff --git 
a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/Junit47concurrencyIT.java
 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/Junit47concurrencyIT.java
index c129c4c..12c4419 100644
--- 
a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/Junit47concurrencyIT.java
+++ 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/Junit47concurrencyIT.java
@@ -40,14 +40,12 @@ public class Junit47concurrencyIT
         throws Exception
     {
         OutputValidator validator = unpack( "concurrentjunit47" )
-            .sysProp( "junitVersion", "4.7" )
-            .setJUnitVersion( "4.7" )
             .executeTest()
             .verifyErrorFree( 4 );
         String result = null;
         for ( String line : validator.loadLogLines() )
         {
-            if ( line.startsWith( "Tests run: 4, Failures: 0, Errors: 0, 
Skipped: 0, Time elapsed:" ) )
+            if ( line.startsWith( "[INFO] Tests run: 4, Failures: 0, Errors: 
0, Skipped: 0, Time elapsed:" ) )
             {
                 result = line;
                 break;

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/Not2xCompatible.java
----------------------------------------------------------------------
diff --git 
a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/Not2xCompatible.java
 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/Not2xCompatible.java
deleted file mode 100644
index 4f1b5f2..0000000
--- 
a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/Not2xCompatible.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.apache.maven.surefire.its;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/**
- * Marks an integration test as not compatible with 2.2.1
- */
-public interface Not2xCompatible
-{
-}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/fixture/HelperAssertions.java
----------------------------------------------------------------------
diff --git 
a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/fixture/HelperAssertions.java
 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/fixture/HelperAssertions.java
index e202114..2e835da 100644
--- 
a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/fixture/HelperAssertions.java
+++ 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/fixture/HelperAssertions.java
@@ -23,6 +23,8 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
 
+import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
+import org.apache.maven.plugin.surefire.log.api.PrintStreamLogger;
 import org.apache.maven.plugins.surefire.report.ReportTestSuite;
 import org.apache.maven.plugins.surefire.report.SurefireReportParser;
 
@@ -129,7 +131,8 @@ public class HelperAssertions
             assertTrue( "Reports directory is missing: " + 
reportsDir.getAbsolutePath(), reportsDir.exists() );
             reportsDirs.add( reportsDir );
         }
-        SurefireReportParser parser = new SurefireReportParser( reportsDirs, 
Locale.getDefault() );
+        ConsoleLogger logger = new PrintStreamLogger( System.out );
+        SurefireReportParser parser = new SurefireReportParser( reportsDirs, 
Locale.getDefault(), logger );
         try
         {
             return parser.parseXMLReportFiles();
@@ -149,7 +152,8 @@ public class HelperAssertions
             assertTrue( "Reports directory is missing: " + 
reportsDir.getAbsolutePath(), reportsDir.exists() );
             reportsDirs.add( reportsDir );
         }
-        SurefireReportParser parser = new SurefireReportParser( reportsDirs, 
Locale.getDefault() );
+        ConsoleLogger logger = new PrintStreamLogger( System.out );
+        SurefireReportParser parser = new SurefireReportParser( reportsDirs, 
Locale.getDefault(), logger );
         try
         {
             return parser.parseXMLReportFiles();

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire1122ParallelAndFlakyTestsIT.java
----------------------------------------------------------------------
diff --git 
a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire1122ParallelAndFlakyTestsIT.java
 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire1122ParallelAndFlakyTestsIT.java
index e8fab4e..03e7639 100644
--- 
a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire1122ParallelAndFlakyTestsIT.java
+++ 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire1122ParallelAndFlakyTestsIT.java
@@ -19,9 +19,7 @@ package org.apache.maven.surefire.its.jiras;
  * under the License.
  */
 
-import org.apache.maven.it.VerificationException;
 import org.apache.maven.surefire.its.fixture.SurefireJUnit4IntegrationTestCase;
-import org.apache.maven.surefire.its.fixture.SurefireLauncher;
 import org.junit.Test;
 
 /**

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire1136CwdPropagationInForkedModeIT.java
----------------------------------------------------------------------
diff --git 
a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire1136CwdPropagationInForkedModeIT.java
 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire1136CwdPropagationInForkedModeIT.java
index cd6de87..8aaecea 100644
--- 
a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire1136CwdPropagationInForkedModeIT.java
+++ 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire1136CwdPropagationInForkedModeIT.java
@@ -19,11 +19,9 @@ package org.apache.maven.surefire.its.jiras;
  * under the License.
  */
 
-import org.apache.maven.surefire.its.Not2xCompatible;
 import org.apache.maven.surefire.its.fixture.OutputValidator;
 import org.apache.maven.surefire.its.fixture.SurefireJUnit4IntegrationTestCase;
 import org.junit.Test;
-import org.junit.experimental.categories.Category;
 
 /**
  * SUREFIRE-1136 Correct current working directory propagation in forked mode
@@ -33,7 +31,6 @@ import org.junit.experimental.categories.Category;
  *
  * @author Norbert Wnuk
  */
-@Category( Not2xCompatible.class )
 public class Surefire1136CwdPropagationInForkedModeIT
     extends SurefireJUnit4IntegrationTestCase
 {

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire1158RemoveInfoLinesIT.java
----------------------------------------------------------------------
diff --git 
a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire1158RemoveInfoLinesIT.java
 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire1158RemoveInfoLinesIT.java
index 6f8bed9..17064c0 100644
--- 
a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire1158RemoveInfoLinesIT.java
+++ 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire1158RemoveInfoLinesIT.java
@@ -18,11 +18,9 @@ package org.apache.maven.surefire.its.jiras;
  * under the License.
  */
 
-import org.apache.maven.surefire.its.Not2xCompatible;
 import org.apache.maven.surefire.its.fixture.OutputValidator;
 import org.apache.maven.surefire.its.fixture.SurefireVerifierException;
 import org.junit.Test;
-import org.junit.experimental.categories.Category;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
@@ -39,7 +37,6 @@ import static org.junit.Assert.*;
  * @since 2.19
  */
 @RunWith( Parameterized.class )
-@Category( Not2xCompatible.class )
 public class Surefire1158RemoveInfoLinesIT
 {
 

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire735ForkFailWithRedirectConsoleOutputIT.java
----------------------------------------------------------------------
diff --git 
a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire735ForkFailWithRedirectConsoleOutputIT.java
 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire735ForkFailWithRedirectConsoleOutputIT.java
index 1d1d2aa..cabb90e 100644
--- 
a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire735ForkFailWithRedirectConsoleOutputIT.java
+++ 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire735ForkFailWithRedirectConsoleOutputIT.java
@@ -19,17 +19,14 @@ package org.apache.maven.surefire.its.jiras;
  * under the License.
  */
 
-import org.apache.maven.surefire.its.Not2xCompatible;
 import org.apache.maven.surefire.its.fixture.SurefireJUnit4IntegrationTestCase;
 import org.apache.maven.surefire.its.fixture.SurefireLauncher;
 
 import org.junit.Test;
-import org.junit.experimental.categories.Category;
 
 /**
  * @author Kristian Rosenvold
  */
-@Category( Not2xCompatible.class )
 public class Surefire735ForkFailWithRedirectConsoleOutputIT
     extends SurefireJUnit4IntegrationTestCase
 {

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire806SpecifiedTestControlsIT.java
----------------------------------------------------------------------
diff --git 
a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire806SpecifiedTestControlsIT.java
 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire806SpecifiedTestControlsIT.java
index 70e4d63..aedb82b 100644
--- 
a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire806SpecifiedTestControlsIT.java
+++ 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire806SpecifiedTestControlsIT.java
@@ -18,14 +18,11 @@ package org.apache.maven.surefire.its.jiras;
  * under the License.
  */
 
-import org.apache.maven.surefire.its.Not2xCompatible;
 import org.apache.maven.surefire.its.fixture.SurefireJUnit4IntegrationTestCase;
 
 import org.junit.Ignore;
 import org.junit.Test;
-import org.junit.experimental.categories.Category;
 
-@Category( Not2xCompatible.class )
 public class Surefire806SpecifiedTestControlsIT
     extends SurefireJUnit4IntegrationTestCase
 {

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/surefire-integration-tests/src/test/resources/concurrentjunit47/pom.xml
----------------------------------------------------------------------
diff --git 
a/surefire-integration-tests/src/test/resources/concurrentjunit47/pom.xml 
b/surefire-integration-tests/src/test/resources/concurrentjunit47/pom.xml
index ecb8860..d064175 100644
--- a/surefire-integration-tests/src/test/resources/concurrentjunit47/pom.xml
+++ b/surefire-integration-tests/src/test/resources/concurrentjunit47/pom.xml
@@ -36,16 +36,11 @@
   <version>1.0-SNAPSHOT</version>
   <name>Test for JUnit 4.7</name>
 
-
-  <properties>
-    <junitVersion>4.7</junitVersion>
-  </properties>
-
   <dependencies>
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
-      <version>${junitVersion}</version>
+      <version>4.7</version>
       <scope>test</scope>
     </dependency>
   </dependencies>

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/surefire-integration-tests/src/test/resources/surefire-1080-parallel-fork-double-test/pom.xml
----------------------------------------------------------------------
diff --git 
a/surefire-integration-tests/src/test/resources/surefire-1080-parallel-fork-double-test/pom.xml
 
b/surefire-integration-tests/src/test/resources/surefire-1080-parallel-fork-double-test/pom.xml
index fb553a8..5d3eb93 100644
--- 
a/surefire-integration-tests/src/test/resources/surefire-1080-parallel-fork-double-test/pom.xml
+++ 
b/surefire-integration-tests/src/test/resources/surefire-1080-parallel-fork-double-test/pom.xml
@@ -20,16 +20,13 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/maven-v4_0_0.xsd";>
   <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.apache.maven.surefire</groupId>
-    <artifactId>it-parent</artifactId>
-    <version>1.0</version>
-    <relativePath>../pom.xml</relativePath>
-  </parent>
+
   <groupId>org.apache.maven.plugins.surefire</groupId>
   <artifactId>jiras-surefire-1080</artifactId>
   <version>1.0</version>
+
   <url>http://maven.apache.org</url>
+
   <developers>
     <developer>
       <id>tibordigana</id>
@@ -46,6 +43,7 @@
       <name>Qingzhou Luo</name>
     </contributor>
   </contributors>
+
   <dependencies>
     <dependency>
       <groupId>junit</groupId>
@@ -54,10 +52,12 @@
       <scope>test</scope>
     </dependency>
   </dependencies>
+
   <build>
     <plugins>
       <plugin>
         <artifactId>maven-compiler-plugin</artifactId>
+        <version>2.3.2</version>
         <configuration>
           <source>1.5</source>
           <target>1.5</target>
@@ -65,6 +65,7 @@
       </plugin>
       <plugin>
         <artifactId>maven-surefire-plugin</artifactId>
+        <version>${surefire.version}</version>
         <configuration>
           <parallel>classes</parallel>
           <forkCount>2</forkCount>

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/6a79127a/surefire-integration-tests/src/test/resources/surefire-1082-parallel-junit-parameterized/pom.xml
----------------------------------------------------------------------
diff --git 
a/surefire-integration-tests/src/test/resources/surefire-1082-parallel-junit-parameterized/pom.xml
 
b/surefire-integration-tests/src/test/resources/surefire-1082-parallel-junit-parameterized/pom.xml
index caba806..ef3b87d 100644
--- 
a/surefire-integration-tests/src/test/resources/surefire-1082-parallel-junit-parameterized/pom.xml
+++ 
b/surefire-integration-tests/src/test/resources/surefire-1082-parallel-junit-parameterized/pom.xml
@@ -20,16 +20,13 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/maven-v4_0_0.xsd";>
   <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.apache.maven.surefire</groupId>
-    <artifactId>it-parent</artifactId>
-    <version>1.0</version>
-    <relativePath>../pom.xml</relativePath>
-  </parent>
+
   <groupId>org.apache.maven.plugins.surefire</groupId>
   <artifactId>jiras-surefire-1082</artifactId>
   <version>1.0</version>
+
   <url>http://maven.apache.org</url>
+
   <developers>
     <developer>
       <id>tibordigana</id>
@@ -41,6 +38,7 @@
       <timezone>Europe/Bratislava</timezone>
     </developer>
   </developers>
+
   <dependencies>
     <dependency>
       <groupId>junit</groupId>
@@ -49,10 +47,12 @@
       <scope>test</scope>
     </dependency>
   </dependencies>
+
   <build>
     <plugins>
       <plugin>
         <artifactId>maven-compiler-plugin</artifactId>
+        <version>2.3.2</version>
         <configuration>
           <source>1.5</source>
           <target>1.5</target>
@@ -60,6 +60,7 @@
       </plugin>
       <plugin>
         <artifactId>maven-surefire-plugin</artifactId>
+        <version>${surefire.version}</version>
       </plugin>
     </plugins>
   </build>

Reply via email to