You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ti...@apache.org on 2020/02/11 01:47:32 UTC

[maven-surefire] branch maven2surefire-jvm-communication updated: Finished JavaDoc, TCP client, renamed magic number.

This is an automated email from the ASF dual-hosted git repository.

tibordigana pushed a commit to branch maven2surefire-jvm-communication
in repository https://gitbox.apache.org/repos/asf/maven-surefire.git


The following commit(s) were added to refs/heads/maven2surefire-jvm-communication by this push:
     new 9f4fb37  Finished JavaDoc, TCP client, renamed magic number.
9f4fb37 is described below

commit 9f4fb3753f4363c6adc30590853e248ee1928ee4
Author: tibordigana <ti...@apache.org>
AuthorDate: Tue Feb 11 02:47:20 2020 +0100

    Finished JavaDoc, TCP client, renamed magic number.
---
 .../plugin/surefire/AbstractSurefireMojo.java      |  16 +-
 .../surefire/booterclient/output/ForkClient.java   |   3 +-
 .../booterclient/output/ForkedChannelDecoder.java  |   6 +-
 .../AbstractSurefireMojoJava7PlusTest.java         |   1 -
 .../plugin/surefire/AbstractSurefireMojoTest.java  |   1 -
 ...ooterDeserializerProviderConfigurationTest.java |   9 +-
 ...BooterDeserializerStartupConfigurationTest.java |  24 ++-
 .../booterclient/DefaultForkConfigurationTest.java |   4 +-
 .../booterclient/ForkConfigurationTest.java        |  11 +-
 .../booterclient/ForkingRunListenerTest.java       |  12 +-
 .../plugin/surefire/booterclient/MainClass.java    |   4 +-
 .../ModularClasspathForkConfigurationTest.java     |  10 +-
 .../TestLessInputStreamBuilderTest.java            |   4 +-
 .../TestProvidingInputStreamTest.java              |   6 +-
 .../booterclient/output/ForkClientTest.java        |  54 +++---
 .../output/ForkedChannelDecoderTest.java           |  90 +++++-----
 .../maven/surefire/extensions/ForkChannelTest.java |  36 ++--
 .../maven/surefire/booter/BaseProviderFactory.java |  16 +-
 .../maven/surefire/booter/ForkedProcessEvent.java  |   4 +-
 .../surefire/booter/ForkingReporterFactory.java    |   5 +-
 .../maven/surefire/booter/ForkingRunListener.java  |   5 +-
 .../booter/MasterProcessChannelEncoder.java        |  49 ------
 .../surefire/booter/MasterProcessCommand.java      |   8 +-
 .../providerapi/MasterProcessChannelEncoder.java   |  84 +++++++++
 .../surefire/providerapi/ProviderParameters.java   |   3 +-
 .../java/org/apache/maven/JUnit4SuiteTest.java     |   4 +-
 .../surefire/booter/ForkingRunListenerTest.java    |  25 ++-
 .../maven/surefire/booter/BooterDeserializer.java  |  11 +-
 .../maven/surefire/booter/CommandReader.java       |  14 +-
 .../apache/maven/surefire/booter/ForkedBooter.java |  72 ++++++--
 .../maven/surefire/booter/LazyTestsToRun.java      |   5 +-
 .../surefire/booter/StartupConfiguration.java      |  27 +--
 .../DefaultMasterProcessChannelDecoderFactory.java |  46 -----
 ...java => LegacyMasterProcessChannelDecoder.java} |  19 +-
 .../spi/LegacyMasterProcessChannelEncoder.java     |  50 ++++--
 ...LegacyMasterProcessChannelProcessorFactory.java |  70 ++++++++
 ...refireMasterProcessChannelProcessorFactory.java |  91 ++++++++++
 ...efire.spi.MasterProcessChannelProcessorFactory} |   3 +-
 .../surefire/booter/BooterDeserializerTest.java    |   2 +-
 .../maven/surefire/booter/CommandReaderTest.java   |  21 ++-
 .../surefire/booter/ForkedBooterMockTest.java      |   5 +-
 .../maven/surefire/booter/JUnit4SuiteTest.java     |   5 +-
 .../LegacyMasterProcessChannelDecoderTest.java}    |  38 ++--
 .../spi/LegacyMasterProcessChannelEncoderTest.java | 195 +++++++++++----------
 .../maven/surefire/extensions/ForkNodeFactory.java |   2 +-
 ...a => MasterProcessChannelProcessorFactory.java} |  34 +++-
 46 files changed, 733 insertions(+), 471 deletions(-)

diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java
index 2239921..7cf4b38 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java
@@ -1748,7 +1748,7 @@ public abstract class AbstractSurefireMojo
         return new File( getBasedir(), ".surefire-" + configurationHash );
     }
 
-    private StartupConfiguration createStartupConfiguration( @Nonnull ProviderInfo provider, boolean isInprocess,
+    private StartupConfiguration createStartupConfiguration( @Nonnull ProviderInfo provider, boolean isForking,
                                                              @Nonnull ClassLoaderConfiguration classLoaderConfiguration,
                                                              @Nonnull DefaultScanResult scanResult,
                                                              @Nonnull Platform platform,
@@ -1759,7 +1759,7 @@ public abstract class AbstractSurefireMojo
         {
             Set<Artifact> providerArtifacts = provider.getProviderClasspath();
             String providerName = provider.getProviderName();
-            if ( canExecuteProviderWithModularPath( platform ) && !isInprocess )
+            if ( isForking && canExecuteProviderWithModularPath( platform ) )
             {
                 String jvmExecutable = platform.getJdkExecAttributesForTests().getJvmExecutable();
                 String javaHome = Paths.get( jvmExecutable )
@@ -1811,8 +1811,8 @@ public abstract class AbstractSurefireMojo
         ClasspathConfiguration classpathConfiguration = new ClasspathConfiguration( testClasspath, providerClasspath,
                 inProcClasspath, effectiveIsEnableAssertions(), isChildDelegation() );
 
-        return new StartupConfiguration( providerName, classpathConfiguration, classLoaderConfiguration, isForking(),
-                false, ProcessCheckerType.toEnum( getEnableProcessChecker() ) );
+        return new StartupConfiguration( providerName, classpathConfiguration, classLoaderConfiguration,
+            ProcessCheckerType.toEnum( getEnableProcessChecker() ) );
     }
 
     private static Set<Artifact> retainInProcArtifactsUnique( Set<Artifact> providerArtifacts,
@@ -1921,8 +1921,8 @@ public abstract class AbstractSurefireMojo
         getConsoleLogger().debug( inProcClasspath.getLogMessage( "in-process classpath:" ) );
         getConsoleLogger().debug( inProcClasspath.getCompactLogMessage( "in-process(compact) classpath:" ) );
 
-        return new StartupConfiguration( providerName, classpathConfiguration, classLoaderConfiguration, isForking(),
-                false, ProcessCheckerType.toEnum( getEnableProcessChecker() ) );
+        return new StartupConfiguration( providerName, classpathConfiguration, classLoaderConfiguration,
+            ProcessCheckerType.toEnum( getEnableProcessChecker() ) );
     }
 
     private Artifact getCommonArtifact()
@@ -2239,7 +2239,7 @@ public abstract class AbstractSurefireMojo
                                            @Nonnull TestClassPath testClasspathWrapper )
         throws MojoExecutionException, MojoFailureException
     {
-        StartupConfiguration startupConfiguration = createStartupConfiguration( provider, false,
+        StartupConfiguration startupConfiguration = createStartupConfiguration( provider, true,
                 classLoaderConfiguration, scanResult, platform, testClasspathWrapper );
         String configChecksum = getConfigChecksum();
         StartupReportConfiguration startupReportConfiguration = getStartupReportConfiguration( configChecksum, true );
@@ -2256,7 +2256,7 @@ public abstract class AbstractSurefireMojo
                                                               @Nonnull TestClassPath testClasspathWrapper )
         throws MojoExecutionException, MojoFailureException
     {
-        StartupConfiguration startupConfiguration = createStartupConfiguration( provider, true, classLoaderConfig,
+        StartupConfiguration startupConfiguration = createStartupConfiguration( provider, false, classLoaderConfig,
                 scanResult, platform, testClasspathWrapper );
         String configChecksum = getConfigChecksum();
         StartupReportConfiguration startupReportConfiguration = getStartupReportConfiguration( configChecksum, false );
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkClient.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkClient.java
index 18cfe28..a02db78 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkClient.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkClient.java
@@ -22,6 +22,7 @@ package org.apache.maven.plugin.surefire.booterclient.output;
 import org.apache.maven.plugin.surefire.booterclient.lazytestprovider.NotifiableTestStream;
 import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
 import org.apache.maven.plugin.surefire.report.DefaultReporterFactory;
+import org.apache.maven.surefire.providerapi.MasterProcessChannelEncoder;
 import org.apache.maven.surefire.shared.utils.cli.StreamConsumer;
 import org.apache.maven.surefire.report.ConsoleOutputReceiver;
 import org.apache.maven.surefire.report.ReportEntry;
@@ -74,7 +75,7 @@ public class ForkClient
 
     /**
      * <em>testSetStartedAt</em> is set to non-zero after received
-     * {@link org.apache.maven.surefire.booter.ForkedChannelEncoder#testSetStarting(ReportEntry, boolean)}.
+     * {@link MasterProcessChannelEncoder#testSetStarting(ReportEntry, boolean)}.
      */
     private final AtomicLong testSetStartedAt = new AtomicLong( START_TIME_ZERO );
 
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkedChannelDecoder.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkedChannelDecoder.java
index f0c96e3..5d49b0e 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkedChannelDecoder.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkedChannelDecoder.java
@@ -32,7 +32,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
 import static java.nio.charset.StandardCharsets.US_ASCII;
-import static org.apache.maven.surefire.booter.ForkedProcessEvent.MAGIC_NUMBER;
+import static org.apache.maven.surefire.booter.ForkedProcessEvent.MAGIC_NUMBER_DELIMITED;
 import static org.apache.maven.surefire.booter.ForkedProcessEvent.BOOTERCODE_STDERR;
 import static org.apache.maven.surefire.booter.ForkedProcessEvent.BOOTERCODE_STDERR_NEW_LINE;
 import static org.apache.maven.surefire.booter.ForkedProcessEvent.BOOTERCODE_STDOUT;
@@ -183,13 +183,13 @@ public final class ForkedChannelDecoder
 
     public void handleEvent( String line, ForkedChannelDecoderErrorHandler errorHandler )
     {
-        if ( line == null || !line.startsWith( MAGIC_NUMBER ) )
+        if ( line == null || !line.startsWith( MAGIC_NUMBER_DELIMITED ) )
         {
             errorHandler.handledError( line, null );
             return;
         }
 
-        StringTokenizer tokenizer = new StringTokenizer( line.substring( MAGIC_NUMBER.length() ), ":" );
+        StringTokenizer tokenizer = new StringTokenizer( line.substring( MAGIC_NUMBER_DELIMITED.length() ), ":" );
         String opcode = tokenizer.hasMoreTokens() ? tokenizer.nextToken() : null;
         ForkedProcessEvent event = opcode == null ? null : EVENTS.get( opcode );
         if ( event == null )
diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoJava7PlusTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoJava7PlusTest.java
index cc6f9a3..abd896e 100644
--- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoJava7PlusTest.java
+++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoJava7PlusTest.java
@@ -209,7 +209,6 @@ public class AbstractSurefireMojoJava7PlusTest
 
         verify( mojo, times( 1 ) ).effectiveIsEnableAssertions();
         verify( mojo, times( 1 ) ).isChildDelegation();
-        verify( mojo, times( 1 ) ).getEffectiveForkCount();
         verify( mojo, times( 1 ) ).getTestClassesDirectory();
         verify( scanResult, times( 1 ) ).getClasses();
         verifyStatic( ResolvePathsRequest.class, times( 1 ) );
diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoTest.java
index d1e4b9d..0553de7 100644
--- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoTest.java
+++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoTest.java
@@ -374,7 +374,6 @@ public class AbstractSurefireMojoTest
 
         verify( mojo, times( 1 ) ).effectiveIsEnableAssertions();
         verify( mojo, times( 1 ) ).isChildDelegation();
-        verify( mojo, times( 1 ) ).getEffectiveForkCount();
         ArgumentCaptor<String> argument = ArgumentCaptor.forClass( String.class );
         verify( logger, times( 6 ) ).debug( argument.capture() );
         assertThat( argument.getAllValues() )
diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/BooterDeserializerProviderConfigurationTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/BooterDeserializerProviderConfigurationTest.java
index caf1376..10563a8 100644
--- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/BooterDeserializerProviderConfigurationTest.java
+++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/BooterDeserializerProviderConfigurationTest.java
@@ -25,7 +25,6 @@ import org.apache.maven.surefire.shared.io.FileUtils;
 import org.apache.maven.surefire.booter.BooterDeserializer;
 import org.apache.maven.surefire.booter.ClassLoaderConfiguration;
 import org.apache.maven.surefire.booter.ClasspathConfiguration;
-import org.apache.maven.surefire.booter.ProcessCheckerType;
 import org.apache.maven.surefire.booter.PropertiesWrapper;
 import org.apache.maven.surefire.booter.ProviderConfiguration;
 import org.apache.maven.surefire.booter.Shutdown;
@@ -52,6 +51,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 
+import static org.apache.maven.surefire.booter.ProcessCheckerType.ALL;
 import static org.apache.maven.surefire.cli.CommandLineOption.LOGGING_LEVEL_DEBUG;
 import static org.apache.maven.surefire.cli.CommandLineOption.REACTOR_FAIL_FAST;
 import static org.apache.maven.surefire.cli.CommandLineOption.SHOW_ERRORS;
@@ -260,10 +260,10 @@ public class BooterDeserializerProviderConfigurationTest
             test = "aTest";
         }
         final File propsTest = booterSerializer.serialize( props, booterConfiguration, testProviderConfiguration, test,
-                                                           readTestsFromInStream, 51L, 1, "pipe://" );
+                                                           readTestsFromInStream, 51L, 1, "pipe://1" );
         BooterDeserializer booterDeserializer = new BooterDeserializer( new FileInputStream( propsTest ) );
         assertEquals( "51", (Object) booterDeserializer.getPluginPid() );
-        assertEquals( "pipe://", booterDeserializer.getForkNodeConnectionString() );
+        assertEquals( "pipe://1", booterDeserializer.getConnectionString() );
         return booterDeserializer.deserialize();
     }
 
@@ -286,8 +286,7 @@ public class BooterDeserializerProviderConfigurationTest
     {
         ClasspathConfiguration classpathConfiguration = new ClasspathConfiguration( true, true );
 
-        return new StartupConfiguration( "com.provider", classpathConfiguration, classLoaderConfiguration, false,
-                                         false, ProcessCheckerType.ALL );
+        return new StartupConfiguration( "com.provider", classpathConfiguration, classLoaderConfiguration, ALL );
     }
 
     private File getTestSourceDirectory()
diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/BooterDeserializerStartupConfigurationTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/BooterDeserializerStartupConfigurationTest.java
index 5054e6c..63f6162 100644
--- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/BooterDeserializerStartupConfigurationTest.java
+++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/BooterDeserializerStartupConfigurationTest.java
@@ -20,24 +20,23 @@ package org.apache.maven.plugin.surefire.booterclient;
  */
 
 import junit.framework.TestCase;
-import org.apache.maven.surefire.shared.io.FileUtils;
 import org.apache.maven.surefire.booter.AbstractPathConfiguration;
 import org.apache.maven.surefire.booter.BooterDeserializer;
+import org.apache.maven.surefire.booter.ClassLoaderConfiguration;
 import org.apache.maven.surefire.booter.Classpath;
 import org.apache.maven.surefire.booter.ClasspathConfiguration;
-import org.apache.maven.surefire.booter.ClassLoaderConfiguration;
-import org.apache.maven.surefire.booter.ProcessCheckerType;
 import org.apache.maven.surefire.booter.PropertiesWrapper;
 import org.apache.maven.surefire.booter.ProviderConfiguration;
-import org.apache.maven.surefire.booter.StartupConfiguration;
 import org.apache.maven.surefire.booter.Shutdown;
+import org.apache.maven.surefire.booter.StartupConfiguration;
 import org.apache.maven.surefire.cli.CommandLineOption;
 import org.apache.maven.surefire.report.ReporterConfiguration;
+import org.apache.maven.surefire.shared.io.FileUtils;
 import org.apache.maven.surefire.testset.DirectoryScannerParameters;
 import org.apache.maven.surefire.testset.RunOrderParameters;
 import org.apache.maven.surefire.testset.TestArtifactInfo;
-import org.apache.maven.surefire.testset.TestRequest;
 import org.apache.maven.surefire.testset.TestListResolver;
+import org.apache.maven.surefire.testset.TestRequest;
 import org.apache.maven.surefire.util.RunOrder;
 import org.junit.After;
 import org.junit.Before;
@@ -50,6 +49,7 @@ import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 
+import static org.apache.maven.surefire.booter.ProcessCheckerType.ALL;
 import static org.apache.maven.surefire.cli.CommandLineOption.LOGGING_LEVEL_DEBUG;
 import static org.apache.maven.surefire.cli.CommandLineOption.REACTOR_FAIL_FAST;
 import static org.apache.maven.surefire.cli.CommandLineOption.SHOW_ERRORS;
@@ -105,7 +105,7 @@ public class BooterDeserializerStartupConfigurationTest
 
     public void testProcessChecker() throws IOException
     {
-        assertEquals( ProcessCheckerType.ALL, getReloadedStartupConfiguration().getProcessChecker() );
+        assertEquals( ALL, getReloadedStartupConfiguration().getProcessChecker() );
     }
 
     private void assertCpConfigEquals( ClasspathConfiguration expectedConfiguration,
@@ -136,13 +136,13 @@ public class BooterDeserializerStartupConfigurationTest
 
     public void testProcessCheckerAll() throws IOException
     {
-        assertEquals( ProcessCheckerType.ALL, getReloadedStartupConfiguration().getProcessChecker() );
+        assertEquals( ALL, getReloadedStartupConfiguration().getProcessChecker() );
     }
 
     public void testProcessCheckerNull() throws IOException
     {
         StartupConfiguration startupConfiguration = new StartupConfiguration( "com.provider", classpathConfiguration,
-                getManifestOnlyJarForkConfiguration(), false, false, null );
+                getManifestOnlyJarForkConfiguration(), null );
         assertNull( saveAndReload( startupConfiguration ).getProcessChecker() );
     }
 
@@ -178,16 +178,15 @@ public class BooterDeserializerStartupConfigurationTest
         BooterSerializer booterSerializer = new BooterSerializer( forkConfiguration );
         String aTest = "aTest";
         File propsTest = booterSerializer.serialize( props, getProviderConfiguration(), startupConfiguration, aTest,
-                false, null, 1, null );
+                false, null, 1, "tcp://127.0.0.1:63003" );
         BooterDeserializer booterDeserializer = new BooterDeserializer( new FileInputStream( propsTest ) );
         assertNull( booterDeserializer.getPluginPid() );
-        assertNull( booterDeserializer.getForkNodeConnectionString() );
+        assertEquals( "tcp://127.0.0.1:63003", booterDeserializer.getConnectionString() );
         return booterDeserializer.getStartupConfiguration();
     }
 
     private ProviderConfiguration getProviderConfiguration()
     {
-
         File cwd = new File( "." );
         DirectoryScannerParameters directoryScannerParameters =
             new DirectoryScannerParameters( cwd, new ArrayList<String>(), new ArrayList<String>(),
@@ -205,8 +204,7 @@ public class BooterDeserializerStartupConfigurationTest
 
     private StartupConfiguration getTestStartupConfiguration( ClassLoaderConfiguration classLoaderConfiguration )
     {
-        return new StartupConfiguration( "com.provider", classpathConfiguration, classLoaderConfiguration, false,
-                                         false, ProcessCheckerType.ALL );
+        return new StartupConfiguration( "com.provider", classpathConfiguration, classLoaderConfiguration, ALL );
     }
 
     private File getTestSourceDirectory()
diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/DefaultForkConfigurationTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/DefaultForkConfigurationTest.java
index f0d3482..45a6b4a 100644
--- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/DefaultForkConfigurationTest.java
+++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/DefaultForkConfigurationTest.java
@@ -307,7 +307,7 @@ public class DefaultForkConfigurationTest
         ClassLoaderConfiguration clc = new ClassLoaderConfiguration( true, true );
         ClasspathConfiguration cc = new ClasspathConfiguration( true, true );
         StartupConfiguration conf = new StartupConfiguration( "org.apache.maven.shadefire.surefire.MyProvider",
-                cc, clc, false, false, null );
+                cc, clc, null );
         StartupConfiguration confMock = spy( conf );
         mockStatic( Relocator.class );
         when( Relocator.relocate( anyString() ) ).thenCallRealMethod();
@@ -328,7 +328,7 @@ public class DefaultForkConfigurationTest
         ClassLoaderConfiguration clc = new ClassLoaderConfiguration( true, true );
         ClasspathConfiguration cc = new ClasspathConfiguration( true, true );
         StartupConfiguration conf =
-                new StartupConfiguration( "org.apache.maven.surefire.MyProvider", cc, clc, false, false, null );
+                new StartupConfiguration( "org.apache.maven.surefire.MyProvider", cc, clc, null );
         StartupConfiguration confMock = spy( conf );
         mockStatic( Relocator.class );
         when( Relocator.relocate( anyString() ) ).thenCallRealMethod();
diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/ForkConfigurationTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/ForkConfigurationTest.java
index 8d806ca..bc01ee8 100644
--- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/ForkConfigurationTest.java
+++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/ForkConfigurationTest.java
@@ -57,10 +57,7 @@ public class ForkConfigurationTest
 {
     private static final StartupConfiguration STARTUP_CONFIG = new StartupConfiguration( "",
             new ClasspathConfiguration( true, true ),
-            new ClassLoaderConfiguration( true, true ),
-            false,
-            false,
-            ALL );
+            new ClassLoaderConfiguration( true, true ), ALL );
 
     private static int idx = 0;
 
@@ -93,7 +90,7 @@ public class ForkConfigurationTest
         ClasspathConfiguration cpConfig = new ClasspathConfiguration( new Classpath( cp ), emptyClasspath(),
                 emptyClasspath(), true, true );
         ClassLoaderConfiguration clc = new ClassLoaderConfiguration( true, true );
-        StartupConfiguration startup = new StartupConfiguration( "", cpConfig, clc, false, false, ALL );
+        StartupConfiguration startup = new StartupConfiguration( "", cpConfig, clc, ALL );
 
         Commandline cli = config.createCommandLine( startup, 1, temporaryFolder() );
 
@@ -113,7 +110,7 @@ public class ForkConfigurationTest
         ClasspathConfiguration cpConfig = new ClasspathConfiguration( new Classpath( cp ), emptyClasspath(),
                 emptyClasspath(), true, true );
         ClassLoaderConfiguration clc = new ClassLoaderConfiguration( true, true );
-        StartupConfiguration startup = new StartupConfiguration( "", cpConfig, clc, false, false, ALL );
+        StartupConfiguration startup = new StartupConfiguration( "", cpConfig, clc, ALL );
 
         Commandline commandLine = config.createCommandLine( startup, 1, temporaryFolder() );
         assertTrue( commandLine.toString().contains( "abc def" ) );
@@ -128,7 +125,7 @@ public class ForkConfigurationTest
         ClasspathConfiguration cpConfig = new ClasspathConfiguration( emptyClasspath(), emptyClasspath(),
                 emptyClasspath(), true, true );
         ClassLoaderConfiguration clc = new ClassLoaderConfiguration( true, true );
-        StartupConfiguration startup = new StartupConfiguration( "", cpConfig, clc, false, false, ALL );
+        StartupConfiguration startup = new StartupConfiguration( "", cpConfig, clc, ALL );
         ForkConfiguration config = getForkConfiguration( cwd.getCanonicalFile() );
         Commandline commandLine = config.createCommandLine( startup, 1, temporaryFolder() );
 
diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/ForkingRunListenerTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/ForkingRunListenerTest.java
index 79c6f0e..2e44e75 100644
--- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/ForkingRunListenerTest.java
+++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/ForkingRunListenerTest.java
@@ -25,7 +25,7 @@ import org.apache.maven.plugin.surefire.booterclient.lazytestprovider.Notifiable
 import org.apache.maven.plugin.surefire.booterclient.output.ForkClient;
 import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
 import org.apache.maven.plugin.surefire.log.api.NullConsoleLogger;
-import org.apache.maven.surefire.booter.ForkedChannelEncoder;
+import org.apache.maven.surefire.booter.spi.LegacyMasterProcessChannelEncoder;
 import org.apache.maven.surefire.booter.ForkingRunListener;
 import org.apache.maven.surefire.report.CategorizedReportEntry;
 import org.apache.maven.surefire.report.ConsoleOutputReceiver;
@@ -196,8 +196,8 @@ public class ForkingRunListenerTest
         ForkClient forkStreamClient =
                 new ForkClient( providerReporterFactory, new MockNotifiableTestStream(), log, new AtomicBoolean(), 1 );
 
-        forkStreamClient.consumeMultiLineContent( ":maven:surefire:std:out:sys-prop:normal-run:UTF-8:azE=:djE="
-                + "\n:maven:surefire:std:out:sys-prop:normal-run:UTF-8:azI=:djI=" );
+        forkStreamClient.consumeMultiLineContent( ":maven-surefire-event:sys-prop:normal-run:UTF-8:azE=:djE="
+                + "\n:maven-surefire-event:sys-prop:normal-run:UTF-8:azI=:djI=" );
 
         MatcherAssert.assertThat( forkStreamClient.getTestVmSystemProperties().size(), is( 2 ) );
     }
@@ -239,10 +239,10 @@ public class ForkingRunListenerTest
         ReportEntry expected = createDefaultReportEntry();
         final SimpleReportEntry secondExpected = createAnotherDefaultReportEntry();
 
-        new ForkingRunListener( new ForkedChannelEncoder( printStream ), false )
+        new ForkingRunListener( new LegacyMasterProcessChannelEncoder( printStream ), false )
                 .testStarting( expected );
 
-        new ForkingRunListener( new ForkedChannelEncoder( anotherPrintStream ), false )
+        new ForkingRunListener( new LegacyMasterProcessChannelEncoder( anotherPrintStream ), false )
                 .testSkipped( secondExpected );
 
         TestSetMockReporterFactory providerReporterFactory = new TestSetMockReporterFactory();
@@ -312,7 +312,7 @@ public class ForkingRunListenerTest
 
     private RunListener createForkingRunListener()
     {
-        return new ForkingRunListener( new ForkedChannelEncoder( printStream ), false );
+        return new ForkingRunListener( new LegacyMasterProcessChannelEncoder( printStream ), false );
     }
 
     private class StandardTestRun
diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/MainClass.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/MainClass.java
index f546d66..63fdd4e 100644
--- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/MainClass.java
+++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/MainClass.java
@@ -34,8 +34,8 @@ public class MainClass
         }
         else
         {
-            System.out.println( ":maven:surefire:std:out:bye\n" );
-            String byeAck = ":maven-surefire-std-out:bye-ack:";
+            System.out.println( ":maven-surefire-event:bye\n" );
+            String byeAck = ":maven-surefire-command:bye-ack:";
             byte[] cmd = new byte[byeAck.length()];
             int len = System.in.read( cmd );
             if ( len != -1 && new String( cmd, 0, len ).equals( byeAck ) )
diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/ModularClasspathForkConfigurationTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/ModularClasspathForkConfigurationTest.java
index 77cc49d..cfa7dce 100644
--- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/ModularClasspathForkConfigurationTest.java
+++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/ModularClasspathForkConfigurationTest.java
@@ -27,6 +27,7 @@ import org.apache.maven.surefire.booter.ForkedBooter;
 import org.apache.maven.surefire.booter.ModularClasspath;
 import org.apache.maven.surefire.booter.ModularClasspathConfiguration;
 import org.apache.maven.surefire.booter.StartupConfiguration;
+import org.apache.maven.surefire.extensions.ForkNodeFactory;
 import org.junit.Test;
 
 import java.io.File;
@@ -43,9 +44,10 @@ import static java.nio.charset.StandardCharsets.UTF_8;
 import static java.nio.file.Files.readAllLines;
 import static java.util.Arrays.asList;
 import static java.util.Collections.singleton;
-import static org.apache.maven.surefire.shared.utils.StringUtils.replace;
 import static org.apache.maven.surefire.booter.Classpath.emptyClasspath;
+import static org.apache.maven.surefire.shared.utils.StringUtils.replace;
 import static org.fest.assertions.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
 
 /**
  * @author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
@@ -66,7 +68,7 @@ public class ModularClasspathForkConfigurationTest
         ModularClasspathForkConfiguration config = new ModularClasspathForkConfiguration( booter, tmp, "", pwd,
                 new Properties(), "",
                 Collections.<String, String>emptyMap(), new String[0], true, 1, true,
-                new Platform(), new NullConsoleLogger(), null );
+                new Platform(), new NullConsoleLogger(), mock( ForkNodeFactory.class ) );
 
         File patchFile = new File( "target" + separatorChar + "test-classes" );
         File descriptor = new File( tmp, "module-info.class" );
@@ -141,8 +143,8 @@ public class ModularClasspathForkConfigurationTest
                 new ModularClasspathConfiguration( modularClasspath, testClasspathUrls, surefireClasspathUrls,
                         emptyClasspath(), true, true );
         ClassLoaderConfiguration clc = new ClassLoaderConfiguration( true, true );
-        StartupConfiguration startupConfiguration =
-                new StartupConfiguration( "JUnitCoreProvider", modularClasspathConfiguration, clc, true, true, null );
+        StartupConfiguration startupConfiguration = new StartupConfiguration( "JUnitCoreProvider",
+            modularClasspathConfiguration, clc, null );
         OutputStreamFlushableCommandline cli = new OutputStreamFlushableCommandline();
         config.resolveClasspath( cli, ForkedBooter.class.getName(), startupConfiguration,
                 createTempFile( "surefire", "surefire-reports" ) );
diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/lazytestprovider/TestLessInputStreamBuilderTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/lazytestprovider/TestLessInputStreamBuilderTest.java
index d14014a..6496bb8 100644
--- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/lazytestprovider/TestLessInputStreamBuilderTest.java
+++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/lazytestprovider/TestLessInputStreamBuilderTest.java
@@ -21,7 +21,7 @@ package org.apache.maven.plugin.surefire.booterclient.lazytestprovider;
 
 import org.apache.maven.surefire.booter.Command;
 import org.apache.maven.surefire.booter.MasterProcessCommand;
-import org.apache.maven.surefire.booter.spi.DefaultMasterProcessChannelDecoder;
+import org.apache.maven.surefire.booter.spi.LegacyMasterProcessChannelDecoder;
 import org.apache.maven.surefire.providerapi.MasterProcessChannelDecoder;
 import org.junit.Rule;
 import org.junit.Test;
@@ -175,7 +175,7 @@ public class TestLessInputStreamBuilderTest
                 throw new IOException();
             }
         };
-        MasterProcessChannelDecoder decoder = new DefaultMasterProcessChannelDecoder( is, null );
+        MasterProcessChannelDecoder decoder = new LegacyMasterProcessChannelDecoder( is );
         builder.getImmediateCommands().shutdown( KILL );
         builder.getImmediateCommands().noop();
         Command bye = decoder.decode();
diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/lazytestprovider/TestProvidingInputStreamTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/lazytestprovider/TestProvidingInputStreamTest.java
index 66b4218..731a1ff 100644
--- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/lazytestprovider/TestProvidingInputStreamTest.java
+++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/lazytestprovider/TestProvidingInputStreamTest.java
@@ -20,7 +20,7 @@ package org.apache.maven.plugin.surefire.booterclient.lazytestprovider;
  */
 
 import org.apache.maven.surefire.booter.Command;
-import org.apache.maven.surefire.booter.spi.DefaultMasterProcessChannelDecoder;
+import org.apache.maven.surefire.booter.spi.LegacyMasterProcessChannelDecoder;
 import org.apache.maven.surefire.providerapi.MasterProcessChannelDecoder;
 import org.junit.Test;
 
@@ -112,7 +112,7 @@ public class TestProvidingInputStreamTest
         stream += new String( cmd.getCommandType().encode(), US_ASCII );
 
         assertThat( stream,
-            is( ":maven-surefire-std-out:testset-finished::maven-surefire-std-out:testset-finished:" ) );
+            is( ":maven-surefire-command:testset-finished::maven-surefire-command:testset-finished:" ) );
 
         boolean emptyStream = isInputStreamEmpty( is );
 
@@ -176,7 +176,7 @@ public class TestProvidingInputStreamTest
                 throw new IOException();
             }
         };
-        MasterProcessChannelDecoder decoder = new DefaultMasterProcessChannelDecoder( is, null );
+        MasterProcessChannelDecoder decoder = new LegacyMasterProcessChannelDecoder( is );
         pluginIs.acknowledgeByeEventReceived();
         pluginIs.noop();
         Command bye = decoder.decode();
diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/output/ForkClientTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/output/ForkClientTest.java
index 09230bb..8a5db41 100644
--- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/output/ForkClientTest.java
+++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/output/ForkClientTest.java
@@ -299,7 +299,7 @@ public class ForkClientTest
         AtomicBoolean printedErrorStream = new AtomicBoolean();
         ConsoleLogger logger = mock( ConsoleLogger.class );
         ForkClient client = new ForkClient( factory, notifiableTestStream, logger, printedErrorStream, 0 );
-        client.consumeMultiLineContent( ":maven:surefire:std:out:next-test\n" );
+        client.consumeMultiLineContent( ":maven-surefire-event:next-test\n" );
         verify( notifiableTestStream, times( 1 ) )
                 .provideNewTest();
         verifyNoMoreInteractions( notifiableTestStream );
@@ -334,7 +334,7 @@ public class ForkClientTest
         ConsoleLogger logger = mock( ConsoleLogger.class );
 
         ForkClient client = new ForkClient( factory, notifiableTestStream, logger, printedErrorStream, 0 );
-        client.consumeMultiLineContent( ":maven:surefire:std:out:bye\n" );
+        client.consumeMultiLineContent( ":maven-surefire-event:bye\n" );
         client.kill();
 
         verify( notifiableTestStream, times( 1 ) )
@@ -381,7 +381,7 @@ public class ForkClientTest
                 verified[0] = true;
             }
         };
-        client.consumeMultiLineContent( ":maven:surefire:std:out:stop-on-next-test\n" );
+        client.consumeMultiLineContent( ":maven-surefire-event:stop-on-next-test\n" );
         verifyZeroInteractions( notifiableTestStream );
         verifyZeroInteractions( factory );
         assertThat( verified[0] )
@@ -418,7 +418,7 @@ public class ForkClientTest
         AtomicBoolean printedErrorStream = new AtomicBoolean();
         ConsoleLogger logger = mock( ConsoleLogger.class );
         ForkClient client = new ForkClient( factory, notifiableTestStream, logger, printedErrorStream, 0 );
-        client.consumeMultiLineContent( ":maven:surefire:std:out:std-out-stream:normal-run:UTF-8:bXNn\n" );
+        client.consumeMultiLineContent( ":maven-surefire-event:std-out-stream:normal-run:UTF-8:bXNn\n" );
         verifyZeroInteractions( notifiableTestStream );
         verify( factory, times( 1 ) )
                 .createReporter();
@@ -463,7 +463,7 @@ public class ForkClientTest
         AtomicBoolean printedErrorStream = new AtomicBoolean();
         ConsoleLogger logger = mock( ConsoleLogger.class );
         ForkClient client = new ForkClient( factory, notifiableTestStream, logger, printedErrorStream, 0 );
-        client.consumeMultiLineContent( ":maven:surefire:std:out:std-out-stream-new-line:normal-run:UTF-8:bXNn\n" );
+        client.consumeMultiLineContent( ":maven-surefire-event:std-out-stream-new-line:normal-run:UTF-8:bXNn\n" );
         verifyZeroInteractions( notifiableTestStream );
         verify( factory, times( 1 ) )
                 .createReporter();
@@ -508,7 +508,7 @@ public class ForkClientTest
         AtomicBoolean printedErrorStream = new AtomicBoolean();
         ConsoleLogger logger = mock( ConsoleLogger.class );
         ForkClient client = new ForkClient( factory, notifiableTestStream, logger, printedErrorStream, 0 );
-        client.consumeMultiLineContent( ":maven:surefire:std:out:std-err-stream:normal-run:UTF-8:bXNn\n" );
+        client.consumeMultiLineContent( ":maven-surefire-event:std-err-stream:normal-run:UTF-8:bXNn\n" );
         verifyZeroInteractions( notifiableTestStream );
         verify( factory, times( 1 ) )
                 .createReporter();
@@ -553,7 +553,7 @@ public class ForkClientTest
         AtomicBoolean printedErrorStream = new AtomicBoolean();
         ConsoleLogger logger = mock( ConsoleLogger.class );
         ForkClient client = new ForkClient( factory, notifiableTestStream, logger, printedErrorStream, 0 );
-        client.consumeMultiLineContent( ":maven:surefire:std:out:std-err-stream-new-line:normal-run:UTF-8:bXNn\n" );
+        client.consumeMultiLineContent( ":maven-surefire-event:std-err-stream-new-line:normal-run:UTF-8:bXNn\n" );
         verifyZeroInteractions( notifiableTestStream );
         verify( factory, times( 1 ) )
                 .createReporter();
@@ -598,7 +598,7 @@ public class ForkClientTest
         AtomicBoolean printedErrorStream = new AtomicBoolean();
         ConsoleLogger logger = mock( ConsoleLogger.class );
         ForkClient client = new ForkClient( factory, notifiableTestStream, logger, printedErrorStream, 0 );
-        client.consumeMultiLineContent( ":maven:surefire:std:out:console-error-log:UTF-8:"
+        client.consumeMultiLineContent( ":maven-surefire-event:console-error-log:UTF-8:"
                 + encodeBase64String( "Listening for transport dt_socket at address:".getBytes( UTF_8 ) )
                 + ":-:-:-" );
         verifyZeroInteractions( notifiableTestStream );
@@ -649,7 +649,7 @@ public class ForkClientTest
         AtomicBoolean printedErrorStream = new AtomicBoolean();
         ConsoleLogger logger = mock( ConsoleLogger.class );
         ForkClient client = new ForkClient( factory, notifiableTestStream, logger, printedErrorStream, 0 );
-        client.consumeMultiLineContent( ":maven:surefire:std:out:console-error-log:UTF-8"
+        client.consumeMultiLineContent( ":maven-surefire-event:console-error-log:UTF-8"
                 + ":" + encodeBase64String( "Listening for transport dt_socket at address:".getBytes( UTF_8 ) )
                 + ":" + encodeBase64String( "s1".getBytes( UTF_8 ) )
                 + ":" + encodeBase64String( "s2".getBytes( UTF_8 ) ) );
@@ -709,7 +709,7 @@ public class ForkClientTest
         when( logger.isWarnEnabled() )
                 .thenReturn( true );
         ForkClient client = new ForkClient( factory, notifiableTestStream, logger, printedErrorStream, 0 );
-        client.consumeMultiLineContent( ":maven:surefire:std:out:console-warning-log:UTF-8:"
+        client.consumeMultiLineContent( ":maven-surefire-event:console-warning-log:UTF-8:"
                 + encodeBase64String( "s1".getBytes( UTF_8 ) ) );
         verifyZeroInteractions( notifiableTestStream );
         verify( factory, times( 1 ) )
@@ -757,7 +757,7 @@ public class ForkClientTest
         when( logger.isDebugEnabled() )
                 .thenReturn( true );
         ForkClient client = new ForkClient( factory, notifiableTestStream, logger, printedErrorStream, 0 );
-        client.consumeMultiLineContent( ":maven:surefire:std:out:console-debug-log:UTF-8:"
+        client.consumeMultiLineContent( ":maven-surefire-event:console-debug-log:UTF-8:"
                 + encodeBase64String( "s1".getBytes( UTF_8 ) ) );
         verifyZeroInteractions( notifiableTestStream );
         verify( factory, times( 1 ) )
@@ -803,7 +803,7 @@ public class ForkClientTest
         AtomicBoolean printedErrorStream = new AtomicBoolean();
         ConsoleLogger logger = mock( ConsoleLogger.class );
         ForkClient client = new ForkClient( factory, notifiableTestStream, logger, printedErrorStream, 0 );
-        client.consumeMultiLineContent( ":maven:surefire:std:out:console-info-log:UTF-8:"
+        client.consumeMultiLineContent( ":maven-surefire-event:console-info-log:UTF-8:"
                 + encodeBase64String( "s1".getBytes( UTF_8 ) ) );
         verifyZeroInteractions( notifiableTestStream );
         verify( factory, times( 1 ) )
@@ -849,7 +849,7 @@ public class ForkClientTest
         AtomicBoolean printedErrorStream = new AtomicBoolean();
         ConsoleLogger logger = mock( ConsoleLogger.class );
         ForkClient client = new ForkClient( factory, notifiableTestStream, logger, printedErrorStream, 0 );
-        client.consumeMultiLineContent( ":maven:surefire:std:out:sys-prop:normal-run:UTF-8:azE=:djE="
+        client.consumeMultiLineContent( ":maven-surefire-event:sys-prop:normal-run:UTF-8:azE=:djE="
                 + encodeBase64String( "s1".getBytes( UTF_8 ) ) );
         verifyZeroInteractions( notifiableTestStream );
         verifyZeroInteractions( factory );
@@ -928,7 +928,7 @@ public class ForkClientTest
         String encodedMessage = encodeBase64String( toArray( UTF_8.encode( reportEntry.getMessage() ) ) );
 
         ForkClient client = new ForkClient( factory, notifiableTestStream, logger, printedErrorStream, 0 );
-        client.consumeMultiLineContent( ":maven:surefire:std:out:testset-starting:normal-run:UTF-8:"
+        client.consumeMultiLineContent( ":maven-surefire-event:testset-starting:normal-run:UTF-8:"
                 + encodedSourceName
                 + ":"
                 + "-"
@@ -1063,7 +1063,7 @@ public class ForkClientTest
         String encodedMessage = encodeBase64String( toArray( UTF_8.encode( reportEntry.getMessage() ) ) );
 
         ForkClient client = new ForkClient( factory, notifiableTestStream, logger, printedErrorStream, 0 );
-        client.consumeMultiLineContent( ":maven:surefire:std:out:testset-starting:normal-run:UTF-8:"
+        client.consumeMultiLineContent( ":maven-surefire-event:testset-starting:normal-run:UTF-8:"
                 + encodedSourceName
                 + ":"
                 + encodedSourceText
@@ -1194,7 +1194,7 @@ public class ForkClientTest
         String encodedMessage = encodeBase64String( toArray( UTF_8.encode( reportEntry.getMessage() ) ) );
 
         ForkClient client = new ForkClient( factory, notifiableTestStream, logger, printedErrorStream, 0 );
-        client.consumeMultiLineContent( ":maven:surefire:std:out:testset-completed:normal-run:UTF-8:"
+        client.consumeMultiLineContent( ":maven-surefire-event:testset-completed:normal-run:UTF-8:"
                 + encodedSourceName
                 + ":"
                 + "-"
@@ -1323,7 +1323,7 @@ public class ForkClientTest
         String encodedMessage = encodeBase64String( toArray( UTF_8.encode( reportEntry.getMessage() ) ) );
 
         ForkClient client = new ForkClient( factory, notifiableTestStream, logger, printedErrorStream, 0 );
-        client.consumeMultiLineContent( ":maven:surefire:std:out:test-starting:normal-run:UTF-8:"
+        client.consumeMultiLineContent( ":maven-surefire-event:test-starting:normal-run:UTF-8:"
                 + encodedSourceName
                 + ":"
                 + "-"
@@ -1454,7 +1454,7 @@ public class ForkClientTest
 
         ForkClient client = new ForkClient( factory, notifiableTestStream, logger, printedErrorStream, 0 );
 
-        client.consumeMultiLineContent( ":maven:surefire:std:out:test-starting:normal-run:UTF-8:"
+        client.consumeMultiLineContent( ":maven-surefire-event:test-starting:normal-run:UTF-8:"
                 + encodedSourceName
                 + ":-:-:-:-:-:-:-:-:-" );
 
@@ -1462,7 +1462,7 @@ public class ForkClientTest
                 .hasSize( 1 )
                 .contains( "pkg.MyTest" );
 
-        client.consumeMultiLineContent( ":maven:surefire:std:out:test-succeeded:normal-run:UTF-8:"
+        client.consumeMultiLineContent( ":maven-surefire-event:test-succeeded:normal-run:UTF-8:"
                 + encodedSourceName
                 + ":"
                 + "-"
@@ -1596,7 +1596,7 @@ public class ForkClientTest
 
         ForkClient client = new ForkClient( factory, notifiableTestStream, logger, printedErrorStream, 0 );
 
-        client.consumeMultiLineContent( ":maven:surefire:std:out:test-starting:normal-run:UTF-8:"
+        client.consumeMultiLineContent( ":maven-surefire-event:test-starting:normal-run:UTF-8:"
                 + encodedSourceName
                 + ":-:-:-:-:-:-:-:-:-" );
 
@@ -1604,7 +1604,7 @@ public class ForkClientTest
                 .hasSize( 1 )
                 .contains( "pkg.MyTest" );
 
-        client.consumeMultiLineContent( ":maven:surefire:std:out:test-failed:normal-run:UTF-8:"
+        client.consumeMultiLineContent( ":maven-surefire-event:test-failed:normal-run:UTF-8:"
                 + encodedSourceName
                 + ":"
                 + "-"
@@ -1742,7 +1742,7 @@ public class ForkClientTest
 
         ForkClient client = new ForkClient( factory, notifiableTestStream, logger, printedErrorStream, 0 );
 
-        client.consumeMultiLineContent( ":maven:surefire:std:out:test-starting:normal-run:UTF-8:"
+        client.consumeMultiLineContent( ":maven-surefire-event:test-starting:normal-run:UTF-8:"
                 + encodedSourceName
                 + ":-:-:-:-:-:-:-:-:-" );
 
@@ -1750,7 +1750,7 @@ public class ForkClientTest
                 .hasSize( 1 )
                 .contains( "pkg.MyTest" );
 
-        client.consumeMultiLineContent( ":maven:surefire:std:out:test-skipped:normal-run:UTF-8:"
+        client.consumeMultiLineContent( ":maven-surefire-event:test-skipped:normal-run:UTF-8:"
                 + encodedSourceName
                 + ":"
                 + "-"
@@ -1890,7 +1890,7 @@ public class ForkClientTest
 
         ForkClient client = new ForkClient( factory, notifiableTestStream, logger, printedErrorStream, 0 );
 
-        client.consumeMultiLineContent( ":maven:surefire:std:out:test-starting:normal-run:UTF-8:"
+        client.consumeMultiLineContent( ":maven-surefire-event:test-starting:normal-run:UTF-8:"
                 + encodedSourceName
                 + ":"
                 + encodedSourceText
@@ -1900,7 +1900,7 @@ public class ForkClientTest
                 .hasSize( 1 )
                 .contains( "pkg.MyTest" );
 
-        client.consumeMultiLineContent( ":maven:surefire:std:out:test-error:normal-run:UTF-8:"
+        client.consumeMultiLineContent( ":maven-surefire-event:test-error:normal-run:UTF-8:"
                 + encodedSourceName
                 + ":"
                 + encodedSourceText
@@ -2036,7 +2036,7 @@ public class ForkClientTest
 
         ForkClient client = new ForkClient( factory, notifiableTestStream, logger, printedErrorStream, 0 );
 
-        client.consumeMultiLineContent( ":maven:surefire:std:out:test-starting:normal-run:UTF-8:"
+        client.consumeMultiLineContent( ":maven-surefire-event:test-starting:normal-run:UTF-8:"
                 + encodedSourceName
                 + ":-:-:-:-:-:-:-:-:-" );
 
@@ -2044,7 +2044,7 @@ public class ForkClientTest
                 .hasSize( 1 )
                 .contains( "pkg.MyTest" );
 
-        client.consumeMultiLineContent( ":maven:surefire:std:out:test-assumption-failure:normal-run:UTF-8:"
+        client.consumeMultiLineContent( ":maven-surefire-event:test-assumption-failure:normal-run:UTF-8:"
                 + encodedSourceName
                 + ":"
                 + "-"
diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/output/ForkedChannelDecoderTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/output/ForkedChannelDecoderTest.java
index 42dd636..5265f09 100644
--- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/output/ForkedChannelDecoderTest.java
+++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/output/ForkedChannelDecoderTest.java
@@ -20,7 +20,7 @@ package org.apache.maven.plugin.surefire.booterclient.output;
  */
 
 import org.apache.maven.plugin.surefire.log.api.ConsoleLoggerUtils;
-import org.apache.maven.surefire.booter.ForkedChannelEncoder;
+import org.apache.maven.surefire.booter.spi.LegacyMasterProcessChannelEncoder;
 import org.apache.maven.surefire.report.ReportEntry;
 import org.apache.maven.surefire.report.RunMode;
 import org.apache.maven.surefire.report.SafeThrowable;
@@ -93,8 +93,8 @@ public class ForkedChannelDecoderTest
         public void shouldHaveSystemProperty() throws IOException
         {
             Stream out = Stream.newStream();
-            ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
-            forkedChannelEncoder.sendSystemProperties( ObjectUtils.systemProps() );
+            LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
+            encoder.sendSystemProperties( ObjectUtils.systemProps() );
 
             ForkedChannelDecoder decoder = new ForkedChannelDecoder();
             decoder.setSystemPropertiesListener( new PropertyEventAssertionListener() );
@@ -259,11 +259,11 @@ public class ForkedChannelDecoderTest
         public void shouldSendByeEvent() throws IOException
         {
             Stream out = Stream.newStream();
-            ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
-            forkedChannelEncoder.bye();
+            LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
+            encoder.bye();
             String read = new String( out.toByteArray(), UTF_8 );
             assertThat( read )
-                    .isEqualTo( ":maven:surefire:std:out:bye\n" );
+                    .isEqualTo( ":maven-surefire-event:bye\n" );
             LineNumberReader lines = out.newReader( UTF_8 );
             ForkedChannelDecoder decoder = new ForkedChannelDecoder();
             decoder.setByeListener( new EventAssertionListener() );
@@ -279,11 +279,11 @@ public class ForkedChannelDecoderTest
         {
 
             Stream out = Stream.newStream();
-            ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
-            forkedChannelEncoder.stopOnNextTest();
+            LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
+            encoder.stopOnNextTest();
             String read = new String( out.toByteArray(), UTF_8 );
             assertThat( read )
-                    .isEqualTo( ":maven:surefire:std:out:stop-on-next-test\n" );
+                    .isEqualTo( ":maven-surefire-event:stop-on-next-test\n" );
             LineNumberReader lines = out.newReader( UTF_8 );
             ForkedChannelDecoder decoder = new ForkedChannelDecoder();
             decoder.setStopOnNextTestListener( new EventAssertionListener() );
@@ -299,11 +299,11 @@ public class ForkedChannelDecoderTest
         {
 
             Stream out = Stream.newStream();
-            ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
-            forkedChannelEncoder.acquireNextTest();
+            LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
+            encoder.acquireNextTest();
             String read = new String( out.toByteArray(), UTF_8 );
             assertThat( read )
-                    .isEqualTo( ":maven:surefire:std:out:next-test\n" );
+                    .isEqualTo( ":maven-surefire-event:next-test\n" );
             LineNumberReader lines = out.newReader( UTF_8 );
             ForkedChannelDecoder decoder = new ForkedChannelDecoder();
             decoder.setAcquireNextTestListener( new EventAssertionListener() );
@@ -319,8 +319,8 @@ public class ForkedChannelDecoderTest
         {
             Stream out = Stream.newStream();
 
-            ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
-            forkedChannelEncoder.consoleInfoLog( "msg" );
+            LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
+            encoder.consoleInfoLog( "msg" );
 
             LineNumberReader lines = out.newReader( UTF_8 );
             ForkedChannelDecoder decoder = new ForkedChannelDecoder();
@@ -337,8 +337,8 @@ public class ForkedChannelDecoderTest
         {
             Stream out = Stream.newStream();
 
-            ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
-            forkedChannelEncoder.consoleErrorLog( "msg" );
+            LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
+            encoder.consoleErrorLog( "msg" );
 
             LineNumberReader lines = out.newReader( UTF_8 );
             ForkedChannelDecoder decoder = new ForkedChannelDecoder();
@@ -357,8 +357,8 @@ public class ForkedChannelDecoderTest
 
             Stream out = Stream.newStream();
 
-            ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
-            forkedChannelEncoder.consoleErrorLog( t );
+            LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
+            encoder.consoleErrorLog( t );
 
             LineNumberReader lines = out.newReader( UTF_8 );
             ForkedChannelDecoder decoder = new ForkedChannelDecoder();
@@ -376,9 +376,9 @@ public class ForkedChannelDecoderTest
         {
             Stream out = Stream.newStream();
 
-            ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
+            LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
             StackTraceWriter stackTraceWriter = new DeserializedStacktraceWriter( "1", "2", "3" );
-            forkedChannelEncoder.consoleErrorLog( stackTraceWriter, false );
+            encoder.consoleErrorLog( stackTraceWriter, false );
 
             LineNumberReader lines = out.newReader( UTF_8 );
             ForkedChannelDecoder decoder = new ForkedChannelDecoder();
@@ -395,8 +395,8 @@ public class ForkedChannelDecoderTest
         {
             Stream out = Stream.newStream();
 
-            ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
-            forkedChannelEncoder.consoleDebugLog( "msg" );
+            LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
+            encoder.consoleDebugLog( "msg" );
 
             LineNumberReader lines = out.newReader( UTF_8 );
             ForkedChannelDecoder decoder = new ForkedChannelDecoder();
@@ -413,8 +413,8 @@ public class ForkedChannelDecoderTest
         {
             Stream out = Stream.newStream();
 
-            ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
-            forkedChannelEncoder.consoleWarningLog( "msg" );
+            LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
+            encoder.consoleWarningLog( "msg" );
 
             LineNumberReader lines = out.newReader( UTF_8 );
             ForkedChannelDecoder decoder = new ForkedChannelDecoder();
@@ -430,8 +430,8 @@ public class ForkedChannelDecoderTest
         public void testStdOutStream() throws IOException
         {
             Stream out = Stream.newStream();
-            ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
-            forkedChannelEncoder.stdOut( "msg", false );
+            LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
+            encoder.stdOut( "msg", false );
 
             LineNumberReader lines = out.newReader( UTF_8 );
             ForkedChannelDecoder decoder = new ForkedChannelDecoder();
@@ -447,8 +447,8 @@ public class ForkedChannelDecoderTest
         public void testStdOutStreamPrint() throws IOException
         {
             Stream out = Stream.newStream();
-            ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
-            forkedChannelEncoder.stdOut( "", false );
+            LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
+            encoder.stdOut( "", false );
 
             LineNumberReader lines = out.newReader( UTF_8 );
             ForkedChannelDecoder decoder = new ForkedChannelDecoder();
@@ -464,8 +464,8 @@ public class ForkedChannelDecoderTest
         public void testStdOutStreamPrintWithNull() throws IOException
         {
             Stream out = Stream.newStream();
-            ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
-            forkedChannelEncoder.stdOut( null, false );
+            LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
+            encoder.stdOut( null, false );
 
             LineNumberReader lines = out.newReader( UTF_8 );
             ForkedChannelDecoder decoder = new ForkedChannelDecoder();
@@ -481,8 +481,8 @@ public class ForkedChannelDecoderTest
         public void testStdOutStreamPrintln() throws IOException
         {
             Stream out = Stream.newStream();
-            ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
-            forkedChannelEncoder.stdOut( "", true );
+            LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
+            encoder.stdOut( "", true );
 
             LineNumberReader lines = out.newReader( UTF_8 );
             ForkedChannelDecoder decoder = new ForkedChannelDecoder();
@@ -498,8 +498,8 @@ public class ForkedChannelDecoderTest
         public void testStdOutStreamPrintlnWithNull() throws IOException
         {
             Stream out = Stream.newStream();
-            ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
-            forkedChannelEncoder.stdOut( null, true );
+            LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
+            encoder.stdOut( null, true );
 
             LineNumberReader lines = out.newReader( UTF_8 );
             ForkedChannelDecoder decoder = new ForkedChannelDecoder();
@@ -515,8 +515,8 @@ public class ForkedChannelDecoderTest
         public void testStdErrStream() throws IOException
         {
             Stream out = Stream.newStream();
-            ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
-            forkedChannelEncoder.stdErr( "msg", false );
+            LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
+            encoder.stdErr( "msg", false );
 
             LineNumberReader lines = out.newReader( UTF_8 );
             ForkedChannelDecoder decoder = new ForkedChannelDecoder();
@@ -532,8 +532,8 @@ public class ForkedChannelDecoderTest
         public void shouldCountSameNumberOfSystemProperties() throws IOException
         {
             Stream out = Stream.newStream();
-            ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
-            forkedChannelEncoder.sendSystemProperties( ObjectUtils.systemProps() );
+            LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
+            encoder.sendSystemProperties( ObjectUtils.systemProps() );
 
             LineNumberReader lines = out.newReader( UTF_8 );
             ForkedChannelDecoder decoder = new ForkedChannelDecoder();
@@ -560,22 +560,22 @@ public class ForkedChannelDecoderTest
             ForkedChannelDecoder decoder = new ForkedChannelDecoder();
             decoder.setSystemPropertiesListener( new PropertyEventAssertionListener() );
             AssertionErrorHandler errorHandler = mock( AssertionErrorHandler.class );
-            decoder.handleEvent( ":maven:surefire:std:out:abnormal-run:-", errorHandler );
+            decoder.handleEvent( ":maven-surefire-event:abnormal-run:-", errorHandler );
             verify( errorHandler, times( 1 ) )
-                    .handledError( eq( ":maven:surefire:std:out:abnormal-run:-" ), nullable( Throwable.class ) );
+                    .handledError( eq( ":maven-surefire-event:abnormal-run:-" ), nullable( Throwable.class ) );
         }
 
         @Test
         public void shouldHandleExit() throws IOException
         {
             Stream out = Stream.newStream();
-            ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
+            LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
             StackTraceWriter stackTraceWriter = mock( StackTraceWriter.class );
             when( stackTraceWriter.getThrowable() ).thenReturn( new SafeThrowable( "1" ) );
             when( stackTraceWriter.smartTrimmedStackTrace() ).thenReturn( "2" );
             when( stackTraceWriter.writeTraceToString() ).thenReturn( "3" );
             when( stackTraceWriter.writeTrimmedTraceToString() ).thenReturn( "4" );
-            forkedChannelEncoder.sendExitEvent( stackTraceWriter, false );
+            encoder.sendExitEvent( stackTraceWriter, false );
 
             LineNumberReader lines = out.newReader( UTF_8 );
             ForkedChannelDecoder decoder = new ForkedChannelDecoder();
@@ -677,10 +677,10 @@ public class ForkedChannelDecoderTest
 
             Stream out = Stream.newStream();
 
-            ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
+            LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
 
-            ForkedChannelEncoder.class.getMethod( operation[0], ReportEntry.class, boolean.class )
-                    .invoke( forkedChannelEncoder, reportEntry, trim );
+            LegacyMasterProcessChannelEncoder.class.getMethod( operation[0], ReportEntry.class, boolean.class )
+                    .invoke( encoder, reportEntry, trim );
 
             ForkedChannelDecoder decoder = new ForkedChannelDecoder();
 
diff --git a/maven-surefire-common/src/test/java/org/apache/maven/surefire/extensions/ForkChannelTest.java b/maven-surefire-common/src/test/java/org/apache/maven/surefire/extensions/ForkChannelTest.java
index 431cb91..63db316 100644
--- a/maven-surefire-common/src/test/java/org/apache/maven/surefire/extensions/ForkChannelTest.java
+++ b/maven-surefire-common/src/test/java/org/apache/maven/surefire/extensions/ForkChannelTest.java
@@ -34,10 +34,10 @@ import java.io.IOException;
 import java.lang.Thread.UncaughtExceptionHandler;
 import java.net.Socket;
 import java.net.URI;
-import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import static java.nio.charset.StandardCharsets.US_ASCII;
+import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.fest.assertions.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.doNothing;
@@ -57,20 +57,28 @@ public class ForkChannelTest
     private StreamConsumer consumer;
 
     @Test( timeout = TESTCASE_TIMEOUT )
-    public void test() throws Exception
+    public void shouldRequestReplyMessagesViaTCP() throws Exception
     {
         ForkNodeFactory factory = new SurefireForkNodeFactory();
         ForkChannel channel = factory.createForkChannel( 1 );
 
-        assertThat( channel.getForkChannelId() ).isEqualTo( 1 );
-        assertThat( channel.useStdIn() ).isFalse();
-        assertThat( channel.useStdOut() ).isFalse();
+        assertThat( channel.getForkChannelId() )
+            .isEqualTo( 1 );
+
+        assertThat( channel.useStdIn() )
+            .isFalse();
+
+        assertThat( channel.useStdOut() )
+            .isFalse();
+
         assertThat( channel.getForkNodeConnectionString() )
             .startsWith( "tcp://127.0.0.1:" )
             .isNotEqualTo( "tcp://127.0.0.1:" );
 
         URI uri = new URI( channel.getForkNodeConnectionString() );
-        assertThat( uri.getPort() ).isPositive();
+
+        assertThat( uri.getPort() )
+            .isPositive();
 
         ArgumentCaptor<String> line = ArgumentCaptor.forClass( String.class );
         doNothing().when( consumer ).consumeLine( anyString() );
@@ -89,7 +97,7 @@ public class ForkChannelTest
         client.start();
 
         channel.openChannel();
-        TimeUnit.SECONDS.sleep( 3L );
+        SECONDS.sleep( 3L );
 
         TestLessInputStreamBuilder builder = new TestLessInputStreamBuilder();
         TestLessInputStream commandReader = builder.build();
@@ -97,12 +105,16 @@ public class ForkChannelTest
         channel.bindCommandReader( commandReader ).start();
         channel.bindEventHandler( consumer ).start();
 
-        client.join();
+        client.join( TESTCASE_TIMEOUT );
+
+        assertThat( hasError.get() )
+            .isFalse();
 
-        assertThat( hasError.get() ).isFalse();
+        verify( consumer, times( 1 ) )
+            .consumeLine( line.capture() );
 
-        verify( consumer, times( 1 ) ).consumeLine( line.capture() );
-        assertThat( line.getValue() ).isEqualTo( "Hi There!" );
+        assertThat( line.getValue() )
+            .isEqualTo( "Hi There!" );
     }
 
     private static class Client extends Thread
@@ -122,7 +134,7 @@ public class ForkChannelTest
                 byte[] data = new byte[128];
                 int readLength = socket.getInputStream().read( data );
                 String token = new String( data, 0, readLength, US_ASCII );
-                assertThat( token ).isEqualTo( ":maven-surefire-std-out:noop:" );
+                assertThat( token ).isEqualTo( ":maven-surefire-command:noop:" );
                 socket.getOutputStream().write( "Hi There!".getBytes( US_ASCII ) );
             }
             catch ( IOException e )
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 9d2dc73..6ac0ce2 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,6 +21,7 @@ package org.apache.maven.surefire.booter;
 
 import org.apache.maven.surefire.cli.CommandLineOption;
 import org.apache.maven.surefire.providerapi.CommandChainReader;
+import org.apache.maven.surefire.providerapi.MasterProcessChannelEncoder;
 import org.apache.maven.surefire.providerapi.ProviderParameters;
 import org.apache.maven.surefire.report.ConsoleStream;
 import org.apache.maven.surefire.report.DefaultDirectConsoleReporter;
@@ -53,7 +54,7 @@ public class BaseProviderFactory
 
     private ReporterFactory reporterFactory;
 
-    private ForkedChannelEncoder forkedChannelEncoder;
+    private MasterProcessChannelEncoder masterProcessChannelEncoder;
 
     private List<CommandLineOption> mainCliOptions = emptyList();
 
@@ -152,8 +153,9 @@ public class BaseProviderFactory
     @Override
     public ConsoleStream getConsoleLogger()
     {
-        return insideFork ? new ForkingRunListener( forkedChannelEncoder, reporterConfiguration.isTrimStackTrace() )
-                       : new DefaultDirectConsoleReporter( reporterConfiguration.getOriginalSystemOut() );
+        return insideFork
+            ? new ForkingRunListener( masterProcessChannelEncoder, reporterConfiguration.isTrimStackTrace() )
+            : new DefaultDirectConsoleReporter( reporterConfiguration.getOriginalSystemOut() );
     }
 
     public void setTestRequest( TestRequest testRequest )
@@ -262,13 +264,13 @@ public class BaseProviderFactory
     }
 
     @Override
-    public ForkedChannelEncoder getForkedChannelEncoder()
+    public MasterProcessChannelEncoder getForkedChannelEncoder()
     {
-        return forkedChannelEncoder;
+        return masterProcessChannelEncoder;
     }
 
-    public void setForkedChannelEncoder( ForkedChannelEncoder forkedChannelEncoder )
+    public void setForkedChannelEncoder( MasterProcessChannelEncoder masterProcessChannelEncoder )
     {
-        this.forkedChannelEncoder = forkedChannelEncoder;
+        this.masterProcessChannelEncoder = masterProcessChannelEncoder;
     }
 }
diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/booter/ForkedProcessEvent.java b/surefire-api/src/main/java/org/apache/maven/surefire/booter/ForkedProcessEvent.java
index 74b9eb9..617eadc 100644
--- a/surefire-api/src/main/java/org/apache/maven/surefire/booter/ForkedProcessEvent.java
+++ b/surefire-api/src/main/java/org/apache/maven/surefire/booter/ForkedProcessEvent.java
@@ -59,7 +59,9 @@ public enum ForkedProcessEvent
 
     BOOTERCODE_JVM_EXIT_ERROR( "jvm-exit-error" );
 
-    public static final String MAGIC_NUMBER = ":maven:surefire:std:out:";
+    public static final String MAGIC_NUMBER = "maven-surefire-event";
+
+    public static final String MAGIC_NUMBER_DELIMITED = ':' + MAGIC_NUMBER + ':';
 
     public static final Map<String, ForkedProcessEvent> EVENTS = events();
 
diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/booter/ForkingReporterFactory.java b/surefire-api/src/main/java/org/apache/maven/surefire/booter/ForkingReporterFactory.java
index 5bb16ee..1c6db50 100644
--- a/surefire-api/src/main/java/org/apache/maven/surefire/booter/ForkingReporterFactory.java
+++ b/surefire-api/src/main/java/org/apache/maven/surefire/booter/ForkingReporterFactory.java
@@ -19,6 +19,7 @@ package org.apache.maven.surefire.booter;
  * under the License.
  */
 
+import org.apache.maven.surefire.providerapi.MasterProcessChannelEncoder;
 import org.apache.maven.surefire.report.ReporterFactory;
 import org.apache.maven.surefire.report.RunListener;
 import org.apache.maven.surefire.suite.RunResult;
@@ -34,9 +35,9 @@ public class ForkingReporterFactory
 {
     private final boolean trimstackTrace;
 
-    private final ForkedChannelEncoder eventChannel;
+    private final MasterProcessChannelEncoder eventChannel;
 
-    public ForkingReporterFactory( boolean trimstackTrace, ForkedChannelEncoder eventChannel )
+    public ForkingReporterFactory( boolean trimstackTrace, MasterProcessChannelEncoder eventChannel )
     {
         this.trimstackTrace = trimstackTrace;
         this.eventChannel = eventChannel;
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 528b607..6148149 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,6 +20,7 @@ package org.apache.maven.surefire.booter;
  */
 
 import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
+import org.apache.maven.surefire.providerapi.MasterProcessChannelEncoder;
 import org.apache.maven.surefire.report.ConsoleOutputReceiver;
 import org.apache.maven.surefire.report.ConsoleStream;
 import org.apache.maven.surefire.report.ReportEntry;
@@ -50,13 +51,13 @@ import static java.util.Objects.requireNonNull;
 public class ForkingRunListener
     implements RunListener, ConsoleLogger, ConsoleOutputReceiver, ConsoleStream
 {
-    private final ForkedChannelEncoder target;
+    private final MasterProcessChannelEncoder target;
 
     private final boolean trim;
 
     private volatile RunMode runMode = NORMAL_RUN;
 
-    public ForkingRunListener( ForkedChannelEncoder target, boolean trim )
+    public ForkingRunListener( MasterProcessChannelEncoder target, boolean trim )
     {
         this.target = target;
         this.trim = trim;
diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/booter/MasterProcessChannelEncoder.java b/surefire-api/src/main/java/org/apache/maven/surefire/booter/MasterProcessChannelEncoder.java
deleted file mode 100644
index 527782d..0000000
--- a/surefire-api/src/main/java/org/apache/maven/surefire/booter/MasterProcessChannelEncoder.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.apache.maven.surefire.booter;
-
-/*
- * 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.
- */
-
-/**
- * magic number : opcode [: opcode specific data]*
- * <br>
- *
- * @author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
- * @since 3.0.0-M4
- */
-public final class MasterProcessChannelEncoder
-{
-
-    private static final String MAGIC_NUMBER = ":maven:surefire:std:out:";
-
-    /**
-     * Encodes opcode and data.
-     *
-     * @param operation opcode
-     * @param data   data
-     * @return encoded command
-     */
-    private static StringBuilder encode( String operation, String data )
-    {
-        StringBuilder s = new StringBuilder( 128 )
-                .append( MAGIC_NUMBER )
-                .append( operation );
-
-        return data == null ? s : s.append( ':' ).append( data );
-    }
-}
diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/booter/MasterProcessCommand.java b/surefire-api/src/main/java/org/apache/maven/surefire/booter/MasterProcessCommand.java
index 182eddc..6fa85a1 100644
--- a/surefire-api/src/main/java/org/apache/maven/surefire/booter/MasterProcessCommand.java
+++ b/surefire-api/src/main/java/org/apache/maven/surefire/booter/MasterProcessCommand.java
@@ -47,7 +47,7 @@ public enum MasterProcessCommand
     NOOP( "noop", Void.class ),
     BYE_ACK( "bye-ack", Void.class );
 
-    private static final String MAGIC_NUMBER = ":maven-surefire-std-out:";
+    public static final String MAGIC_NUMBER = "maven-surefire-command";
 
     private final String opcodeName;
 
@@ -125,8 +125,10 @@ public enum MasterProcessCommand
     private static StringBuilder encode( String operation, String data )
     {
         StringBuilder s = new StringBuilder( 128 )
-                .append( MAGIC_NUMBER )
-                .append( operation );
+            .append( ':' )
+            .append( MAGIC_NUMBER )
+            .append( ':' )
+            .append( operation );
 
         if ( data != null )
         {
diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/providerapi/MasterProcessChannelEncoder.java b/surefire-api/src/main/java/org/apache/maven/surefire/providerapi/MasterProcessChannelEncoder.java
new file mode 100644
index 0000000..b734b61
--- /dev/null
+++ b/surefire-api/src/main/java/org/apache/maven/surefire/providerapi/MasterProcessChannelEncoder.java
@@ -0,0 +1,84 @@
+package org.apache.maven.surefire.providerapi;
+
+/*
+ * 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.surefire.report.ReportEntry;
+import org.apache.maven.surefire.report.StackTraceWriter;
+
+import java.util.Map;
+
+/**
+ * An abstraction for physical encoder of events.
+ *
+ * @author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
+ * @since 3.0.0-M5
+ */
+public interface MasterProcessChannelEncoder
+{
+    MasterProcessChannelEncoder asRerunMode();
+
+    MasterProcessChannelEncoder asNormalMode();
+
+    boolean checkError();
+
+    void sendSystemProperties( Map<String, String> sysProps );
+
+    void testSetStarting( ReportEntry reportEntry, boolean trimStackTraces );
+
+    void testSetCompleted( ReportEntry reportEntry, boolean trimStackTraces );
+
+    void testStarting( ReportEntry reportEntry, boolean trimStackTraces );
+
+    void testSucceeded( ReportEntry reportEntry, boolean trimStackTraces );
+
+    void testFailed( ReportEntry reportEntry, boolean trimStackTraces );
+
+    void testSkipped( ReportEntry reportEntry, boolean trimStackTraces );
+
+    void testError( ReportEntry reportEntry, boolean trimStackTraces );
+
+    void testAssumptionFailure( ReportEntry reportEntry, boolean trimStackTraces );
+
+    void stdOut( String msg, boolean newLine );
+
+    void stdErr( String msg, boolean newLine );
+
+    void consoleInfoLog( String msg );
+
+    void consoleErrorLog( String msg );
+
+    void consoleErrorLog( Throwable t );
+
+    void consoleErrorLog( String msg, Throwable t );
+
+    void consoleErrorLog( StackTraceWriter stackTraceWriter, boolean trimStackTraces );
+
+    void consoleDebugLog( String msg );
+
+    void consoleWarningLog( String msg );
+
+    void bye();
+
+    void stopOnNextTest();
+
+    void acquireNextTest();
+
+    void sendExitEvent( StackTraceWriter stackTraceWriter, boolean trimStackTraces );
+}
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 e4caae7..47a6a7e 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
@@ -19,7 +19,6 @@ package org.apache.maven.surefire.providerapi;
  * under the License.
  */
 
-import org.apache.maven.surefire.booter.ForkedChannelEncoder;
 import org.apache.maven.surefire.cli.CommandLineOption;
 import org.apache.maven.surefire.report.ConsoleStream;
 import org.apache.maven.surefire.report.ReporterConfiguration;
@@ -148,7 +147,7 @@ public interface ProviderParameters
 
     Integer getSystemExitTimeout();
 
-    ForkedChannelEncoder getForkedChannelEncoder();
+    MasterProcessChannelEncoder getForkedChannelEncoder();
 
     CommandChainReader getCommandReader();
 }
diff --git a/surefire-api/src/test/java/org/apache/maven/JUnit4SuiteTest.java b/surefire-api/src/test/java/org/apache/maven/JUnit4SuiteTest.java
index ea27d8a..66a95a6 100644
--- a/surefire-api/src/test/java/org/apache/maven/JUnit4SuiteTest.java
+++ b/surefire-api/src/test/java/org/apache/maven/JUnit4SuiteTest.java
@@ -23,7 +23,6 @@ import junit.framework.JUnit4TestAdapter;
 import junit.framework.Test;
 import org.apache.maven.plugin.surefire.runorder.ThreadedExecutionSchedulerTest;
 import org.apache.maven.surefire.SpecificTestClassFilterTest;
-import org.apache.maven.surefire.booter.ForkedChannelEncoderTest;
 import org.apache.maven.surefire.booter.ForkingRunListenerTest;
 import org.apache.maven.surefire.report.LegacyPojoStackTraceWriterTest;
 import org.apache.maven.surefire.suite.RunResultTest;
@@ -63,8 +62,7 @@ import org.junit.runners.Suite;
     SpecificTestClassFilterTest.class,
     FundamentalFilterTest.class,
     ImmutableMapTest.class,
-    ReflectionUtilsTest.class,
-    ForkedChannelEncoderTest.class
+    ReflectionUtilsTest.class
 } )
 @RunWith( Suite.class )
 public class JUnit4SuiteTest
diff --git a/surefire-api/src/test/java/org/apache/maven/surefire/booter/ForkingRunListenerTest.java b/surefire-api/src/test/java/org/apache/maven/surefire/booter/ForkingRunListenerTest.java
index 549f3aa..b125b0c 100644
--- a/surefire-api/src/test/java/org/apache/maven/surefire/booter/ForkingRunListenerTest.java
+++ b/surefire-api/src/test/java/org/apache/maven/surefire/booter/ForkingRunListenerTest.java
@@ -19,10 +19,17 @@ package org.apache.maven.surefire.booter;
  * under the License.
  */
 
-import java.io.ByteArrayOutputStream;
-import java.io.PrintStream;
-
 import junit.framework.TestCase;
+import org.apache.maven.surefire.providerapi.MasterProcessChannelEncoder;
+import org.mockito.ArgumentCaptor;
+
+import static org.fest.assertions.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
 
 /**
  * @author <a href="mailto:kristian.rosenvold@gmail.com">Kristian Rosenvold</a>
@@ -32,10 +39,16 @@ public class ForkingRunListenerTest
 {
     public void testInfo()
     {
-        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
-        PrintStream target = new PrintStream( byteArrayOutputStream );
-        ForkingRunListener forkingRunListener = new ForkingRunListener( new ForkedChannelEncoder( target ), true );
+        MasterProcessChannelEncoder encoder = mock( MasterProcessChannelEncoder.class );
+        ArgumentCaptor<String> argument1 = ArgumentCaptor.forClass( String.class );
+        doNothing().when( encoder ).consoleInfoLog( anyString() );
+        ForkingRunListener forkingRunListener = new ForkingRunListener( encoder, true );
         forkingRunListener.info( new String( new byte[]{ (byte) 'A' } ) );
         forkingRunListener.info( new String( new byte[]{ } ) );
+        verify( encoder, times( 2 ) ).consoleInfoLog( argument1.capture() );
+        assertThat( argument1.getAllValues() )
+            .hasSize( 2 )
+            .containsSequence( "A", "" );
+        verifyNoMoreInteractions( encoder );
     }
 }
diff --git a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/BooterDeserializer.java b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/BooterDeserializer.java
index 4b31db8..9c8a9ed 100644
--- a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/BooterDeserializer.java
+++ b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/BooterDeserializer.java
@@ -32,6 +32,8 @@ import org.apache.maven.surefire.testset.TestListResolver;
 import org.apache.maven.surefire.testset.TestRequest;
 
 // CHECKSTYLE_OFF: imports
+import javax.annotation.Nonnull;
+
 import static org.apache.maven.surefire.booter.BooterConstants.*;
 import static org.apache.maven.surefire.cli.CommandLineOption.*;
 
@@ -58,7 +60,14 @@ public class BooterDeserializer
         properties = SystemPropertyManager.loadProperties( inputStream );
     }
 
-    public String getForkNodeConnectionString()
+    /**
+     * Describes the current connection channel used by the client in the forked JVM
+     * in order to connect to the plugin process.
+     *
+     * @return connection string (must not be null)
+     */
+    @Nonnull
+    public String getConnectionString()
     {
         return properties.getProperty( FORK_NODE_CONNECTION_STRING );
     }
diff --git a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/CommandReader.java b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/CommandReader.java
index a197157..4b43fb2 100644
--- a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/CommandReader.java
+++ b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/CommandReader.java
@@ -25,6 +25,7 @@ import org.apache.maven.surefire.booter.spi.MasterProcessUnknownCommandException
 import org.apache.maven.surefire.providerapi.CommandChainReader;
 import org.apache.maven.surefire.providerapi.CommandListener;
 import org.apache.maven.surefire.providerapi.MasterProcessChannelDecoder;
+import org.apache.maven.surefire.providerapi.MasterProcessChannelEncoder;
 import org.apache.maven.surefire.testset.TestSetFailedException;
 
 import java.io.EOFException;
@@ -175,7 +176,8 @@ public final class CommandReader implements CommandChainReader
     }
 
     /**
-     * @return test classes which have been retrieved by {@link CommandReader#getIterableClasses(ForkedChannelEncoder)}.
+     * @return test classes which have been retrieved by
+     * {@link CommandReader#getIterableClasses(MasterProcessChannelEncoder)}.
      */
     Iterator<String> iterated()
     {
@@ -189,7 +191,7 @@ public final class CommandReader implements CommandChainReader
      * @param eventChannel original stream in current JVM process
      * @return Iterator with test classes lazily loaded as commands from the main process
      */
-    Iterable<String> getIterableClasses( ForkedChannelEncoder eventChannel )
+    Iterable<String> getIterableClasses( MasterProcessChannelEncoder eventChannel )
     {
         return new ClassesIterable( eventChannel );
     }
@@ -240,9 +242,9 @@ public final class CommandReader implements CommandChainReader
     private final class ClassesIterable
         implements Iterable<String>
     {
-        private final ForkedChannelEncoder eventChannel;
+        private final MasterProcessChannelEncoder eventChannel;
 
-        ClassesIterable( ForkedChannelEncoder eventChannel )
+        ClassesIterable( MasterProcessChannelEncoder eventChannel )
         {
             this.eventChannel = eventChannel;
         }
@@ -257,13 +259,13 @@ public final class CommandReader implements CommandChainReader
     private final class ClassesIterator
         implements Iterator<String>
     {
-        private final ForkedChannelEncoder eventChannel;
+        private final MasterProcessChannelEncoder eventChannel;
 
         private String clazz;
 
         private int nextQueueIndex;
 
-        private ClassesIterator( ForkedChannelEncoder eventChannel )
+        private ClassesIterator( MasterProcessChannelEncoder eventChannel )
         {
             this.eventChannel = eventChannel;
         }
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 4e0bf99..34b752e 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
@@ -20,14 +20,16 @@ package org.apache.maven.surefire.booter;
  */
 
 import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
-import org.apache.maven.surefire.booter.spi.DefaultMasterProcessChannelDecoderFactory;
+import org.apache.maven.surefire.booter.spi.LegacyMasterProcessChannelProcessorFactory;
+import org.apache.maven.surefire.booter.spi.SurefireMasterProcessChannelProcessorFactory;
 import org.apache.maven.surefire.providerapi.CommandListener;
 import org.apache.maven.surefire.providerapi.MasterProcessChannelDecoder;
+import org.apache.maven.surefire.providerapi.MasterProcessChannelEncoder;
 import org.apache.maven.surefire.providerapi.ProviderParameters;
 import org.apache.maven.surefire.providerapi.SurefireProvider;
 import org.apache.maven.surefire.report.LegacyPojoStackTraceWriter;
 import org.apache.maven.surefire.report.StackTraceWriter;
-import org.apache.maven.surefire.spi.MasterProcessChannelDecoderFactory;
+import org.apache.maven.surefire.spi.MasterProcessChannelProcessorFactory;
 import org.apache.maven.surefire.testset.TestSetFailedException;
 
 import java.io.File;
@@ -42,7 +44,6 @@ import java.lang.reflect.InvocationTargetException;
 import java.security.AccessControlException;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
-import java.util.ServiceLoader;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.Semaphore;
@@ -51,6 +52,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 
 import static java.lang.Math.max;
 import static java.lang.Thread.currentThread;
+import static java.util.ServiceLoader.load;
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.apache.maven.surefire.booter.ProcessCheckerType.ALL;
@@ -79,16 +81,17 @@ public final class ForkedBooter
     private static final String LAST_DITCH_SHUTDOWN_THREAD = "surefire-forkedjvm-last-ditch-daemon-shutdown-thread-";
     private static final String PING_THREAD = "surefire-forkedjvm-ping-";
 
-    private final ForkedChannelEncoder eventChannel = new ForkedChannelEncoder( System.out );
     private final Semaphore exitBarrier = new Semaphore( 0 );
 
+    private volatile MasterProcessChannelEncoder eventChannel;
+    private volatile MasterProcessChannelProcessorFactory channelProcessorFactory;
+    private volatile CommandReader commandReader;
     private volatile long systemExitTimeoutInSeconds = DEFAULT_SYSTEM_EXIT_TIMEOUT_IN_SECONDS;
     private volatile PingScheduler pingScheduler;
 
     private ScheduledThreadPoolExecutor jvmTerminator;
     private ProviderConfiguration providerConfiguration;
     private ForkingReporterFactory forkingReporterFactory;
-    private volatile CommandReader commandReader;
     private StartupConfiguration startupConfiguration;
     private Object testSet;
 
@@ -112,11 +115,14 @@ public final class ForkedBooter
 
         startupConfiguration = booterDeserializer.getStartupConfiguration();
 
-        forkingReporterFactory = createForkingReporterFactory();
+        String channelConfig = booterDeserializer.getConnectionString();
+        channelProcessorFactory = lookupDecoderFactory( channelConfig );
+        channelProcessorFactory.connect( channelConfig );
+        eventChannel = channelProcessorFactory.createEncoder();
+        MasterProcessChannelDecoder decoder = channelProcessorFactory.createDecoder();
 
+        forkingReporterFactory = createForkingReporterFactory();
         ConsoleLogger logger = (ConsoleLogger) forkingReporterFactory.createReporter();
-        String communicationConfig = startupConfiguration.getInterProcessChannelConfiguration();
-        MasterProcessChannelDecoder decoder = lookupDecoderFactory().createDecoder( communicationConfig, logger );
         commandReader = new CommandReader( decoder, providerConfiguration.getShutdown(), logger );
 
         pingScheduler = isDebugging() ? null : listenToShutdownCommands( booterDeserializer.getPluginPid(), logger );
@@ -201,6 +207,21 @@ public final class ForkedBooter
         }
     }
 
+    private void closeForkChannel()
+    {
+        if ( channelProcessorFactory != null )
+        {
+            try
+            {
+                channelProcessorFactory.close();
+            }
+            catch ( IOException e )
+            {
+                e.printStackTrace();
+            }
+        }
+    }
+
     private PingScheduler listenToShutdownCommands( String ppid, ConsoleLogger logger )
     {
         PpidChecker ppidChecker = ppid == null ? null : new PpidChecker( ppid );
@@ -349,6 +370,7 @@ public final class ForkedBooter
     private void kill( int returnCode )
     {
         commandReader.stop();
+        closeForkChannel();
         Runtime.getRuntime().halt( returnCode );
     }
 
@@ -375,6 +397,7 @@ public final class ForkedBooter
         acquireOnePermit( exitBarrier, timeoutMillis );
         cancelPingScheduler();
         commandReader.stop();
+        closeForkChannel();
         System.exit( 0 );
     }
 
@@ -447,23 +470,31 @@ public final class ForkedBooter
         return (SurefireProvider) instantiateOneArg( classLoader, providerClass, ProviderParameters.class, bpf );
     }
 
-    private static MasterProcessChannelDecoderFactory lookupDecoderFactory()
+    private static MasterProcessChannelProcessorFactory lookupDecoderFactory( String channelConfig )
     {
-        MasterProcessChannelDecoderFactory defaultDecoderFactory = null;
-        MasterProcessChannelDecoderFactory customDecoderFactory = null;
-        for ( MasterProcessChannelDecoderFactory decoderFactory : ServiceLoader.load(
-                MasterProcessChannelDecoderFactory.class ) )
+        MasterProcessChannelProcessorFactory defaultFactory = null;
+        MasterProcessChannelProcessorFactory customFactory = null;
+        for ( MasterProcessChannelProcessorFactory factory : load( MasterProcessChannelProcessorFactory.class ) )
         {
-            if ( decoderFactory.getClass() == DefaultMasterProcessChannelDecoderFactory.class )
+            Class<?> cls = factory.getClass();
+
+            boolean isSurefireFactory =
+                cls == LegacyMasterProcessChannelProcessorFactory.class
+                    || cls == SurefireMasterProcessChannelProcessorFactory.class;
+
+            if ( isSurefireFactory )
             {
-                defaultDecoderFactory = decoderFactory;
+                if ( factory.canUse( channelConfig ) )
+                {
+                    defaultFactory = factory;
+                }
             }
             else
             {
-                customDecoderFactory = decoderFactory;
+                customFactory = factory;
             }
         }
-        return defaultDecoderFactory == null ? customDecoderFactory : defaultDecoderFactory;
+        return customFactory != null ? customFactory : defaultFactory;
     }
 
     /**
@@ -495,8 +526,11 @@ public final class ForkedBooter
         {
             DumpErrorSingleton.getSingleton().dumpException( t );
             t.printStackTrace();
-            StackTraceWriter stack = new LegacyPojoStackTraceWriter( "test subsystem", "no method", t );
-            booter.eventChannel.consoleErrorLog( stack, false );
+            if ( booter.eventChannel != null )
+            {
+                StackTraceWriter stack = new LegacyPojoStackTraceWriter( "test subsystem", "no method", t );
+                booter.eventChannel.consoleErrorLog( stack, false );
+            }
             booter.cancelPingScheduler();
             booter.exit1();
         }
diff --git a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/LazyTestsToRun.java b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/LazyTestsToRun.java
index ada3384..568a2c5 100644
--- a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/LazyTestsToRun.java
+++ b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/LazyTestsToRun.java
@@ -22,6 +22,7 @@ package org.apache.maven.surefire.booter;
 import java.util.Collections;
 import java.util.Iterator;
 
+import org.apache.maven.surefire.providerapi.MasterProcessChannelEncoder;
 import org.apache.maven.surefire.util.CloseableIterator;
 import org.apache.maven.surefire.util.TestsToRun;
 
@@ -42,7 +43,7 @@ import static org.apache.maven.surefire.util.ReflectionUtils.loadClass;
 final class LazyTestsToRun
     extends TestsToRun
 {
-    private final ForkedChannelEncoder eventChannel;
+    private final MasterProcessChannelEncoder eventChannel;
     private final CommandReader commandReader;
 
     /**
@@ -50,7 +51,7 @@ final class LazyTestsToRun
      *
      * @param eventChannel the output stream to use when requesting new new tests
      */
-    LazyTestsToRun( ForkedChannelEncoder eventChannel, CommandReader commandReader )
+    LazyTestsToRun( MasterProcessChannelEncoder eventChannel, CommandReader commandReader )
     {
         super( Collections.<Class<?>>emptySet() );
         this.eventChannel = eventChannel;
diff --git a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/StartupConfiguration.java b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/StartupConfiguration.java
index 44eb5b7..d6a3dd0 100644
--- a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/StartupConfiguration.java
+++ b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/StartupConfiguration.java
@@ -33,40 +33,30 @@ public class StartupConfiguration
     private final String providerClassName;
     private final AbstractPathConfiguration classpathConfiguration;
     private final ClassLoaderConfiguration classLoaderConfiguration;
-    private final boolean isForkRequested;
-    private final boolean isInForkedVm;
     private final ProcessCheckerType processChecker;
 
     public StartupConfiguration( @Nonnull String providerClassName,
                                  @Nonnull AbstractPathConfiguration classpathConfiguration,
-                                 @Nonnull ClassLoaderConfiguration classLoaderConfiguration, boolean isForkRequested,
-                                 boolean inForkedVm, ProcessCheckerType processChecker )
+                                 @Nonnull ClassLoaderConfiguration classLoaderConfiguration,
+                                 ProcessCheckerType processChecker )
     {
         this.classpathConfiguration = classpathConfiguration;
         this.classLoaderConfiguration = classLoaderConfiguration;
-        this.isForkRequested = isForkRequested;
         this.providerClassName = providerClassName;
-        isInForkedVm = inForkedVm;
         this.processChecker = processChecker;
     }
 
-    public String getInterProcessChannelConfiguration()
-    {
-        return "pipe:std:in";
-    }
-
     public boolean isProviderMainClass()
     {
         return providerClassName.endsWith( "#main" );
     }
 
     public static StartupConfiguration inForkedVm( String providerClassName,
-                                                   ClasspathConfiguration classpathConfiguration,
-                                                   ClassLoaderConfiguration classLoaderConfiguration,
+                                                   ClasspathConfiguration classpathConfig,
+                                                   ClassLoaderConfiguration classLoaderConfig,
                                                    ProcessCheckerType processChecker )
     {
-        return new StartupConfiguration( providerClassName, classpathConfiguration, classLoaderConfiguration, true,
-                                         true, processChecker );
+        return new StartupConfiguration( providerClassName, classpathConfig, classLoaderConfig, processChecker );
     }
 
     public AbstractPathConfiguration getClasspathConfiguration()
@@ -74,13 +64,6 @@ public class StartupConfiguration
         return classpathConfiguration;
     }
 
-    @Deprecated
-    public boolean useSystemClassLoader()
-    {
-        // todo; I am not totally convinced this logic is as simple as it could be
-        return classLoaderConfiguration.isUseSystemClassLoader() && ( isInForkedVm || isForkRequested );
-    }
-
     public boolean isManifestOnlyJarRequestedAndUsable()
     {
         return classLoaderConfiguration.isManifestOnlyJarRequestedAndUsable();
diff --git a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/spi/DefaultMasterProcessChannelDecoderFactory.java b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/spi/DefaultMasterProcessChannelDecoderFactory.java
deleted file mode 100644
index f7e7911..0000000
--- a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/spi/DefaultMasterProcessChannelDecoderFactory.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.apache.maven.surefire.booter.spi;
-
-/*
- * 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.surefire.log.api.ConsoleLogger;
-import org.apache.maven.surefire.providerapi.MasterProcessChannelDecoder;
-import org.apache.maven.surefire.spi.MasterProcessChannelDecoderFactory;
-
-import java.io.IOException;
-
-/**
- *
- */
-public class DefaultMasterProcessChannelDecoderFactory
-        implements MasterProcessChannelDecoderFactory
-{
-    @Override
-    public MasterProcessChannelDecoder createDecoder( String channelConfig, ConsoleLogger logger ) throws IOException
-    {
-        if ( "pipe:std:in".equals( channelConfig ) )
-        {
-            return new DefaultMasterProcessChannelDecoder( System.in, logger );
-        }
-        else
-        {
-            throw new IOException( "Unknown chanel configuration string " + channelConfig );
-        }
-    }
-}
diff --git a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/spi/DefaultMasterProcessChannelDecoder.java b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/spi/LegacyMasterProcessChannelDecoder.java
similarity index 88%
rename from surefire-booter/src/main/java/org/apache/maven/surefire/booter/spi/DefaultMasterProcessChannelDecoder.java
rename to surefire-booter/src/main/java/org/apache/maven/surefire/booter/spi/LegacyMasterProcessChannelDecoder.java
index 40cf880..c22ee11 100644
--- a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/spi/DefaultMasterProcessChannelDecoder.java
+++ b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/spi/LegacyMasterProcessChannelDecoder.java
@@ -19,7 +19,6 @@ package org.apache.maven.surefire.booter.spi;
  * under the License.
  */
 
-import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
 import org.apache.maven.surefire.booter.Command;
 import org.apache.maven.surefire.booter.MasterProcessCommand;
 import org.apache.maven.surefire.providerapi.MasterProcessChannelDecoder;
@@ -37,17 +36,15 @@ import java.util.List;
  * <br>
  *
  * @author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
- * @since 3.0.0-M4
+ * @since 3.0.0-M5
  */
-public class DefaultMasterProcessChannelDecoder implements MasterProcessChannelDecoder
+public class LegacyMasterProcessChannelDecoder implements MasterProcessChannelDecoder
 {
     private final InputStream is;
-    private final ConsoleLogger logger;
 
-    public DefaultMasterProcessChannelDecoder( InputStream is, ConsoleLogger logger )
+    public LegacyMasterProcessChannelDecoder( InputStream is )
     {
         this.is = is;
-        this.logger = logger;
     }
 
     protected boolean hasData( String opcode )
@@ -105,7 +102,7 @@ public class DefaultMasterProcessChannelDecoder implements MasterProcessChannelD
                 }
             }
 
-            boolean removed = removeUnsynchronizedTokens( tokens, logger );
+            boolean removed = removeUnsynchronizedTokens( tokens );
             if ( removed && tokens.isEmpty() )
             {
                 frameStarted = false;
@@ -118,7 +115,7 @@ public class DefaultMasterProcessChannelDecoder implements MasterProcessChannelD
             throw new EOFException();
         }
 
-        if ( tokens.size() <= 1 )
+        if ( tokens.size() <= 1 ) // todo
         {
             throw new MasterProcessCommandNoMagicNumberException( frame.toString() );
         }
@@ -145,19 +142,19 @@ public class DefaultMasterProcessChannelDecoder implements MasterProcessChannelD
         return false;
     }
 
-    private boolean removeUnsynchronizedTokens( Collection<String> tokens, ConsoleLogger logger )
+    private boolean removeUnsynchronizedTokens( Collection<String> tokens )
     {
         boolean removed = false;
         for ( Iterator<String> it = tokens.iterator(); it.hasNext(); )
         {
             String token = it.next();
-            if ( token.equals( "maven-surefire-std-out" ) )
+            if ( token.equals( MasterProcessCommand.MAGIC_NUMBER ) )
             {
                 break;
             }
             removed = true;
             it.remove();
-            logger.error( "Forked JVM could not synchronize the '" + token + "' token with preamble sequence." );
+            System.err.println( "Forked JVM could not synchronize the '" + token + "' token with preamble sequence." );
         }
         return removed;
     }
diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/booter/ForkedChannelEncoder.java b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/spi/LegacyMasterProcessChannelEncoder.java
similarity index 92%
rename from surefire-api/src/main/java/org/apache/maven/surefire/booter/ForkedChannelEncoder.java
rename to surefire-booter/src/main/java/org/apache/maven/surefire/booter/spi/LegacyMasterProcessChannelEncoder.java
index 94f620a..d4b32bd 100644
--- a/surefire-api/src/main/java/org/apache/maven/surefire/booter/ForkedChannelEncoder.java
+++ b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/spi/LegacyMasterProcessChannelEncoder.java
@@ -1,4 +1,4 @@
-package org.apache.maven.surefire.booter;
+package org.apache.maven.surefire.booter.spi;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -19,6 +19,9 @@ package org.apache.maven.surefire.booter;
  * under the License.
  */
 
+import org.apache.maven.surefire.booter.DumpErrorSingleton;
+import org.apache.maven.surefire.booter.ForkedProcessEvent;
+import org.apache.maven.surefire.providerapi.MasterProcessChannelEncoder;
 import org.apache.maven.surefire.shared.codec.binary.Base64;
 import org.apache.maven.plugin.surefire.log.api.ConsoleLoggerUtils;
 import org.apache.maven.surefire.report.ReportEntry;
@@ -34,7 +37,7 @@ import java.util.Map.Entry;
 
 import static java.nio.charset.StandardCharsets.US_ASCII;
 import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.apache.maven.surefire.booter.ForkedProcessEvent.MAGIC_NUMBER;
+import static org.apache.maven.surefire.booter.ForkedProcessEvent.MAGIC_NUMBER_DELIMITED;
 import static org.apache.maven.surefire.booter.ForkedProcessEvent.BOOTERCODE_SYSPROPS;
 import static org.apache.maven.surefire.booter.ForkedProcessEvent.BOOTERCODE_STDERR;
 import static org.apache.maven.surefire.booter.ForkedProcessEvent.BOOTERCODE_STDERR_NEW_LINE;
@@ -67,42 +70,46 @@ import static java.util.Objects.requireNonNull;
  * @author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
  * @since 3.0.0-M4
  */
-public final class ForkedChannelEncoder
+public class LegacyMasterProcessChannelEncoder implements MasterProcessChannelEncoder
 {
     private static final Base64 BASE64 = new Base64();
     private static final Charset STREAM_ENCODING = US_ASCII;
     private static final Charset STRING_ENCODING = UTF_8;
 
-    private final OutputStream out;
+    protected final OutputStream out;
     private final RunMode runMode;
     private volatile boolean trouble;
 
-    public ForkedChannelEncoder( OutputStream out )
+    public LegacyMasterProcessChannelEncoder( OutputStream out )
     {
         this( out, NORMAL_RUN );
     }
 
-    private ForkedChannelEncoder( OutputStream out, RunMode runMode )
+    protected LegacyMasterProcessChannelEncoder( OutputStream out, RunMode runMode )
     {
         this.out = requireNonNull( out );
         this.runMode = requireNonNull( runMode );
     }
 
-    public ForkedChannelEncoder asRerunMode() // todo apply this and rework providers
+    @Override
+    public MasterProcessChannelEncoder asRerunMode() // todo apply this and rework providers
     {
-        return new ForkedChannelEncoder( out, RERUN_TEST_AFTER_FAILURE );
+        return new LegacyMasterProcessChannelEncoder( out, RERUN_TEST_AFTER_FAILURE );
     }
 
-    public ForkedChannelEncoder asNormalMode()
+    @Override
+    public MasterProcessChannelEncoder asNormalMode()
     {
-        return new ForkedChannelEncoder( out, NORMAL_RUN );
+        return new LegacyMasterProcessChannelEncoder( out, NORMAL_RUN );
     }
 
+    @Override
     public boolean checkError()
     {
         return trouble;
     }
 
+    @Override
     public void sendSystemProperties( Map<String, String> sysProps )
     {
         for ( Entry<String, String> entry : sysProps.entrySet() )
@@ -114,52 +121,62 @@ public final class ForkedChannelEncoder
         }
     }
 
+    @Override
     public void testSetStarting( ReportEntry reportEntry, boolean trimStackTraces )
     {
         encode( BOOTERCODE_TESTSET_STARTING, runMode, reportEntry, trimStackTraces );
     }
 
+    @Override
     public void testSetCompleted( ReportEntry reportEntry, boolean trimStackTraces )
     {
         encode( BOOTERCODE_TESTSET_COMPLETED, runMode, reportEntry, trimStackTraces );
     }
 
+    @Override
     public void testStarting( ReportEntry reportEntry, boolean trimStackTraces )
     {
         encode( BOOTERCODE_TEST_STARTING, runMode, reportEntry, trimStackTraces );
     }
 
+    @Override
     public void testSucceeded( ReportEntry reportEntry, boolean trimStackTraces )
     {
         encode( BOOTERCODE_TEST_SUCCEEDED, runMode, reportEntry, trimStackTraces );
     }
 
+    @Override
     public void testFailed( ReportEntry reportEntry, boolean trimStackTraces )
     {
         encode( BOOTERCODE_TEST_FAILED, runMode, reportEntry, trimStackTraces );
     }
 
+    @Override
     public void testSkipped( ReportEntry reportEntry, boolean trimStackTraces )
     {
         encode( BOOTERCODE_TEST_SKIPPED, runMode, reportEntry, trimStackTraces );
     }
 
+    @Override
     public void testError( ReportEntry reportEntry, boolean trimStackTraces )
     {
         encode( BOOTERCODE_TEST_ERROR, runMode, reportEntry, trimStackTraces );
     }
 
+    @Override
     public void testAssumptionFailure( ReportEntry reportEntry, boolean trimStackTraces )
     {
         encode( BOOTERCODE_TEST_ASSUMPTIONFAILURE, runMode, reportEntry, trimStackTraces );
     }
 
+    @Override
     public void stdOut( String msg, boolean newLine )
     {
         ForkedProcessEvent event = newLine ? BOOTERCODE_STDOUT_NEW_LINE : BOOTERCODE_STDOUT;
         setOutErr( event.getOpcode(), msg );
     }
 
+    @Override
     public void stdErr( String msg, boolean newLine )
     {
         ForkedProcessEvent event = newLine ? BOOTERCODE_STDERR_NEW_LINE : BOOTERCODE_STDERR;
@@ -173,23 +190,27 @@ public final class ForkedChannelEncoder
         encodeAndPrintEvent( event );
     }
 
+    @Override
     public void consoleInfoLog( String msg )
     {
         StringBuilder event = print( BOOTERCODE_CONSOLE_INFO.getOpcode(), msg );
         encodeAndPrintEvent( event );
     }
 
+    @Override
     public void consoleErrorLog( String msg )
     {
         StringBuilder event = print( BOOTERCODE_CONSOLE_ERROR.getOpcode(), msg );
         encodeAndPrintEvent( event );
     }
 
+    @Override
     public void consoleErrorLog( Throwable t )
     {
         consoleErrorLog( t.getLocalizedMessage(), t );
     }
 
+    @Override
     public void consoleErrorLog( String msg, Throwable t )
     {
         StringBuilder encoded = encodeHeader( BOOTERCODE_CONSOLE_ERROR.getOpcode(), null );
@@ -197,38 +218,45 @@ public final class ForkedChannelEncoder
         encodeAndPrintEvent( encoded );
     }
 
+    @Override
     public void consoleErrorLog( StackTraceWriter stackTraceWriter, boolean trimStackTraces )
     {
         error( stackTraceWriter, trimStackTraces, BOOTERCODE_CONSOLE_ERROR );
     }
 
+    @Override
     public void consoleDebugLog( String msg )
     {
         StringBuilder event = print( BOOTERCODE_CONSOLE_DEBUG.getOpcode(), msg );
         encodeAndPrintEvent( event );
     }
 
+    @Override
     public void consoleWarningLog( String msg )
     {
         StringBuilder event = print( BOOTERCODE_CONSOLE_WARNING.getOpcode(), msg );
         encodeAndPrintEvent( event );
     }
 
+    @Override
     public void bye()
     {
         encodeOpcode( BOOTERCODE_BYE );
     }
 
+    @Override
     public void stopOnNextTest()
     {
         encodeOpcode( BOOTERCODE_STOP_ON_NEXT_TEST );
     }
 
+    @Override
     public void acquireNextTest()
     {
         encodeOpcode( BOOTERCODE_NEXT_TEST );
     }
 
+    @Override
     public void sendExitEvent( StackTraceWriter stackTraceWriter, boolean trimStackTraces )
     {
         error( stackTraceWriter, trimStackTraces, BOOTERCODE_JVM_EXIT_ERROR );
@@ -390,7 +418,7 @@ public final class ForkedChannelEncoder
     static StringBuilder encodeOpcode( String operation, String runMode )
     {
         StringBuilder s = new StringBuilder( 128 )
-                .append( MAGIC_NUMBER )
+                .append( MAGIC_NUMBER_DELIMITED )
                 .append( operation );
 
         return runMode == null ? s : s.append( ':' ).append( runMode );
diff --git a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/spi/LegacyMasterProcessChannelProcessorFactory.java b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/spi/LegacyMasterProcessChannelProcessorFactory.java
new file mode 100644
index 0000000..b5d4dd5
--- /dev/null
+++ b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/spi/LegacyMasterProcessChannelProcessorFactory.java
@@ -0,0 +1,70 @@
+package org.apache.maven.surefire.booter.spi;
+
+/*
+ * 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.surefire.providerapi.MasterProcessChannelDecoder;
+import org.apache.maven.surefire.providerapi.MasterProcessChannelEncoder;
+import org.apache.maven.surefire.spi.MasterProcessChannelProcessorFactory;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+
+/**
+ * Producer of encoder and decoder for process pipes.
+ * <br>
+ *
+ * @author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
+ * @since 3.0.0-M5
+ */
+public class LegacyMasterProcessChannelProcessorFactory
+    implements MasterProcessChannelProcessorFactory
+{
+    @Override
+    public boolean canUse( String channelConfig )
+    {
+        return channelConfig.startsWith( "pipe://" );
+    }
+
+    @Override
+    public void connect( String channelConfig ) throws IOException
+    {
+        if ( !canUse( channelConfig ) )
+        {
+            throw new MalformedURLException( "Unknown chanel string " + channelConfig );
+        }
+    }
+
+    @Override
+    public MasterProcessChannelDecoder createDecoder()
+    {
+        return new LegacyMasterProcessChannelDecoder( System.in );
+    }
+
+    @Override
+    public MasterProcessChannelEncoder createEncoder()
+    {
+        return new LegacyMasterProcessChannelEncoder( System.out );
+    }
+
+    @Override
+    public void close()
+    {
+    }
+}
diff --git a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/spi/SurefireMasterProcessChannelProcessorFactory.java b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/spi/SurefireMasterProcessChannelProcessorFactory.java
new file mode 100644
index 0000000..497e748
--- /dev/null
+++ b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/spi/SurefireMasterProcessChannelProcessorFactory.java
@@ -0,0 +1,91 @@
+package org.apache.maven.surefire.booter.spi;
+
+/*
+ * 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.surefire.providerapi.MasterProcessChannelDecoder;
+import org.apache.maven.surefire.providerapi.MasterProcessChannelEncoder;
+import org.apache.maven.surefire.spi.MasterProcessChannelProcessorFactory;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.channels.Channels;
+import java.nio.channels.SocketChannel;
+
+/**
+ * Producer of TCP/IP encoder and decoder.
+ * <br>
+ *
+ * @author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
+ * @since 3.0.0-M5
+ */
+public class SurefireMasterProcessChannelProcessorFactory
+    implements MasterProcessChannelProcessorFactory
+{
+    private volatile SocketChannel channel;
+
+    @Override
+    public boolean canUse( String channelConfig )
+    {
+        return channelConfig.startsWith( "tcp://" );
+    }
+
+    @Override
+    public void connect( String channelConfig ) throws IOException
+    {
+        if ( !canUse( channelConfig ) )
+        {
+            throw new MalformedURLException( "Unknown chanel string " + channelConfig );
+        }
+
+        try
+        {
+            URI uri = new URI( channelConfig );
+            channel = SocketChannel.open( new InetSocketAddress( uri.getHost(), uri.getPort() ) );
+        }
+        catch ( URISyntaxException e )
+        {
+            throw new IOException( e.getLocalizedMessage(), e );
+        }
+    }
+
+    @Override
+    public MasterProcessChannelDecoder createDecoder()
+    {
+        return new LegacyMasterProcessChannelDecoder( Channels.newInputStream( channel ) );
+    }
+
+    @Override
+    public MasterProcessChannelEncoder createEncoder()
+    {
+        return new LegacyMasterProcessChannelEncoder( Channels.newOutputStream( channel ) );
+    }
+
+    @Override
+    public void close() throws IOException
+    {
+        if ( channel != null )
+        {
+            channel.close();
+        }
+    }
+}
diff --git a/surefire-booter/src/main/resources/META-INF/services/org.apache.maven.surefire.spi.MasterProcessChannelDecoderFactory b/surefire-booter/src/main/resources/META-INF/services/org.apache.maven.surefire.spi.MasterProcessChannelProcessorFactory
similarity index 83%
rename from surefire-booter/src/main/resources/META-INF/services/org.apache.maven.surefire.spi.MasterProcessChannelDecoderFactory
rename to surefire-booter/src/main/resources/META-INF/services/org.apache.maven.surefire.spi.MasterProcessChannelProcessorFactory
index 2b44ee1..22a3f43 100644
--- a/surefire-booter/src/main/resources/META-INF/services/org.apache.maven.surefire.spi.MasterProcessChannelDecoderFactory
+++ b/surefire-booter/src/main/resources/META-INF/services/org.apache.maven.surefire.spi.MasterProcessChannelProcessorFactory
@@ -16,4 +16,5 @@
 # specific language governing permissions and limitations
 # under the License.
 #
-org.apache.maven.surefire.booter.spi.DefaultMasterProcessChannelDecoderFactory
+org.apache.maven.surefire.booter.spi.LegacyMasterProcessChannelProcessorFactory
+org.apache.maven.surefire.booter.spi.SurefireMasterProcessChannelProcessorFactory
diff --git a/surefire-booter/src/test/java/org/apache/maven/surefire/booter/BooterDeserializerTest.java b/surefire-booter/src/test/java/org/apache/maven/surefire/booter/BooterDeserializerTest.java
index 302f7ad..b1c0284 100644
--- a/surefire-booter/src/test/java/org/apache/maven/surefire/booter/BooterDeserializerTest.java
+++ b/surefire-booter/src/test/java/org/apache/maven/surefire/booter/BooterDeserializerTest.java
@@ -48,7 +48,7 @@ public class BooterDeserializerTest
         assertThat( deserializer.getStartupConfiguration().getProcessChecker() )
                 .isEqualTo( ALL );
 
-        assertThat( deserializer.getStartupConfiguration().useSystemClassLoader() )
+        assertThat( deserializer.getStartupConfiguration().getClassLoaderConfiguration().isUseSystemClassLoader() )
                 .isTrue();
 
         assertThat( deserializer.getStartupConfiguration().getProviderClassName() )
diff --git a/surefire-booter/src/test/java/org/apache/maven/surefire/booter/CommandReaderTest.java b/surefire-booter/src/test/java/org/apache/maven/surefire/booter/CommandReaderTest.java
index 096cfb4..74d7b16 100644
--- a/surefire-booter/src/test/java/org/apache/maven/surefire/booter/CommandReaderTest.java
+++ b/surefire-booter/src/test/java/org/apache/maven/surefire/booter/CommandReaderTest.java
@@ -21,7 +21,8 @@ package org.apache.maven.surefire.booter;
 
 import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
 import org.apache.maven.plugin.surefire.log.api.NullConsoleLogger;
-import org.apache.maven.surefire.booter.spi.DefaultMasterProcessChannelDecoder;
+import org.apache.maven.surefire.booter.spi.LegacyMasterProcessChannelDecoder;
+import org.apache.maven.surefire.booter.spi.LegacyMasterProcessChannelEncoder;
 import org.apache.maven.surefire.providerapi.MasterProcessChannelDecoder;
 import org.apache.maven.surefire.testset.TestSetFailedException;
 import org.junit.After;
@@ -89,7 +90,7 @@ public class CommandReaderTest
         InputStream realInputStream = new SystemInputStream();
         addTestToPipeline( getClass().getName() );
         ConsoleLogger logger = new NullConsoleLogger();
-        MasterProcessChannelDecoder decoder = new DefaultMasterProcessChannelDecoder( realInputStream, logger );
+        MasterProcessChannelDecoder decoder = new LegacyMasterProcessChannelDecoder( realInputStream );
         reader = new CommandReader( decoder, Shutdown.DEFAULT, logger );
     }
 
@@ -102,7 +103,7 @@ public class CommandReaderTest
     @Test
     public void readJustOneClass()
     {
-        Iterator<String> it = reader.getIterableClasses( new ForkedChannelEncoder( nul() ) ).iterator();
+        Iterator<String> it = reader.getIterableClasses( new LegacyMasterProcessChannelEncoder( nul() ) ).iterator();
         assertTrue( it.hasNext() );
         assertThat( it.next(), is( getClass().getName() ) );
         reader.stop();
@@ -121,7 +122,7 @@ public class CommandReaderTest
     @Test
     public void manyClasses()
     {
-        Iterator<String> it1 = reader.getIterableClasses( new ForkedChannelEncoder( nul() ) ).iterator();
+        Iterator<String> it1 = reader.getIterableClasses( new LegacyMasterProcessChannelEncoder( nul() ) ).iterator();
         assertThat( it1.next(), is( getClass().getName() ) );
         addTestToPipeline( A.class.getName() );
         assertThat( it1.next(), is( A.class.getName() ) );
@@ -137,7 +138,7 @@ public class CommandReaderTest
     @Test
     public void twoIterators() throws Exception
     {
-        Iterator<String> it1 = reader.getIterableClasses( new ForkedChannelEncoder( nul() ) ).iterator();
+        Iterator<String> it1 = reader.getIterableClasses( new LegacyMasterProcessChannelEncoder( nul() ) ).iterator();
 
         assertThat( it1.next(), is( getClass().getName() ) );
         addTestToPipeline( A.class.getName() );
@@ -170,7 +171,8 @@ public class CommandReaderTest
             @Override
             public void run()
             {
-                Iterator<String> it = reader.getIterableClasses( new ForkedChannelEncoder( nul() ) ).iterator();
+                Iterator<String> it =
+                    reader.getIterableClasses( new LegacyMasterProcessChannelEncoder( nul() ) ).iterator();
                 assertThat( it.next(), is( CommandReaderTest.class.getName() ) );
             }
         };
@@ -197,7 +199,8 @@ public class CommandReaderTest
             @Override
             public void run()
             {
-                Iterator<String> it = reader.getIterableClasses( new ForkedChannelEncoder( nul() ) ).iterator();
+                Iterator<String> it =
+                    reader.getIterableClasses( new LegacyMasterProcessChannelEncoder( nul() ) ).iterator();
                 assertThat( it.next(), is( CommandReaderTest.class.getName() ) );
                 counter.countDown();
                 assertThat( it.next(), is( Foo.class.getName() ) );
@@ -244,7 +247,7 @@ public class CommandReaderTest
 
     private void addTestToPipeline( String cls )
     {
-        String cmd = ":maven-surefire-std-out:"
+        String cmd = ":maven-surefire-command:"
             + MasterProcessCommand.RUN_CLASS.getOpcode() + ':' + cls + '\n';
         for ( byte cmdByte : cmd.getBytes( US_ASCII ) )
         {
@@ -254,7 +257,7 @@ public class CommandReaderTest
 
     private void addEndOfPipeline()
     {
-        String cmd = ":maven-surefire-std-out:" + MasterProcessCommand.TEST_SET_FINISHED.getOpcode() + '\n';
+        String cmd = ":maven-surefire-command:" + MasterProcessCommand.TEST_SET_FINISHED.getOpcode() + '\n';
         for ( byte cmdByte : cmd.getBytes( US_ASCII ) )
         {
             blockingStream.add( cmdByte );
diff --git a/surefire-booter/src/test/java/org/apache/maven/surefire/booter/ForkedBooterMockTest.java b/surefire-booter/src/test/java/org/apache/maven/surefire/booter/ForkedBooterMockTest.java
index 24a250b..2cbb3f2 100644
--- a/surefire-booter/src/test/java/org/apache/maven/surefire/booter/ForkedBooterMockTest.java
+++ b/surefire-booter/src/test/java/org/apache/maven/surefire/booter/ForkedBooterMockTest.java
@@ -19,6 +19,7 @@ package org.apache.maven.surefire.booter;
  * under the License.
  */
 
+import org.apache.maven.surefire.booter.spi.LegacyMasterProcessChannelEncoder;
 import org.apache.maven.surefire.report.StackTraceWriter;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -50,7 +51,7 @@ import static org.powermock.utils.JavaVersion.JAVA_12;
  * PowerMock tests for {@link ForkedBooter}.
  */
 @RunWith( PowerMockRunner.class )
-@PrepareForTest( { PpidChecker.class, ForkedBooter.class, ForkedChannelEncoder.class } )
+@PrepareForTest( { PpidChecker.class, ForkedBooter.class, LegacyMasterProcessChannelEncoder.class } )
 @PowerMockIgnore( { "org.jacoco.agent.rt.*", "com.vladium.emma.rt.*" } )
 public class ForkedBooterMockTest
 {
@@ -61,7 +62,7 @@ public class ForkedBooterMockTest
     private ForkedBooter booter;
 
     @Mock
-    private ForkedChannelEncoder eventChannel;
+    private LegacyMasterProcessChannelEncoder eventChannel;
 
     @Captor
     private ArgumentCaptor<StackTraceWriter> capturedStackTraceWriter;
diff --git a/surefire-booter/src/test/java/org/apache/maven/surefire/booter/JUnit4SuiteTest.java b/surefire-booter/src/test/java/org/apache/maven/surefire/booter/JUnit4SuiteTest.java
index 9ef4fce..a7c6298 100644
--- a/surefire-booter/src/test/java/org/apache/maven/surefire/booter/JUnit4SuiteTest.java
+++ b/surefire-booter/src/test/java/org/apache/maven/surefire/booter/JUnit4SuiteTest.java
@@ -23,6 +23,8 @@ import junit.framework.JUnit4TestAdapter;
 import junit.framework.Test;
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
+import org.apache.maven.surefire.booter.spi.LegacyMasterProcessChannelDecoderTest;
+import org.apache.maven.surefire.booter.spi.LegacyMasterProcessChannelEncoderTest;
 
 /**
  * Adapt the JUnit4 tests which use only annotations to the JUnit3 test suite.
@@ -44,7 +46,8 @@ public class JUnit4SuiteTest extends TestCase
         suite.addTest( new JUnit4TestAdapter( BooterDeserializerTest.class ) );
         suite.addTestSuite( ClasspathTest.class );
         suite.addTestSuite( PropertiesWrapperTest.class );
-        suite.addTestSuite( DefaultMasterProcessChannelDecoderTest.class );
+        suite.addTestSuite( LegacyMasterProcessChannelDecoderTest.class );
+        suite.addTest( new JUnit4TestAdapter( LegacyMasterProcessChannelEncoderTest.class ) );
         suite.addTestSuite( SurefireReflectorTest.class );
         return suite;
     }
diff --git a/surefire-booter/src/test/java/org/apache/maven/surefire/booter/DefaultMasterProcessChannelDecoderTest.java b/surefire-booter/src/test/java/org/apache/maven/surefire/booter/spi/LegacyMasterProcessChannelDecoderTest.java
similarity index 81%
rename from surefire-booter/src/test/java/org/apache/maven/surefire/booter/DefaultMasterProcessChannelDecoderTest.java
rename to surefire-booter/src/test/java/org/apache/maven/surefire/booter/spi/LegacyMasterProcessChannelDecoderTest.java
index debab05..13efee2 100644
--- a/surefire-booter/src/test/java/org/apache/maven/surefire/booter/DefaultMasterProcessChannelDecoderTest.java
+++ b/surefire-booter/src/test/java/org/apache/maven/surefire/booter/spi/LegacyMasterProcessChannelDecoderTest.java
@@ -1,4 +1,4 @@
-package org.apache.maven.surefire.booter;
+package org.apache.maven.surefire.booter.spi;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -20,7 +20,9 @@ package org.apache.maven.surefire.booter;
  */
 
 import junit.framework.TestCase;
-import org.apache.maven.surefire.booter.spi.DefaultMasterProcessChannelDecoder;
+import org.apache.maven.surefire.booter.Command;
+import org.apache.maven.surefire.booter.MasterProcessCommand;
+import org.apache.maven.surefire.booter.Shutdown;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
@@ -32,9 +34,9 @@ import static org.hamcrest.Matchers.is;
 import static org.fest.assertions.Assertions.assertThat;
 
 /**
- * Tests for {@link DefaultMasterProcessChannelDecoder}.
+ * Tests for {@link LegacyMasterProcessChannelDecoder}.
  */
-public class DefaultMasterProcessChannelDecoderTest
+public class LegacyMasterProcessChannelDecoderTest
     extends TestCase
 {
     public void testDataToByteArrayAndBack() throws IOException
@@ -47,10 +49,10 @@ public class DefaultMasterProcessChannelDecoderTest
                     assertEquals( String.class, commandType.getDataType() );
                     byte[] encoded = commandType.encode( "pkg.Test" );
                     assertThat( new String( encoded ) )
-                            .isEqualTo( ":maven-surefire-std-out:run-testclass:pkg.Test:" );
+                            .isEqualTo( ":maven-surefire-command:run-testclass:pkg.Test:" );
                     byte[] line = addNL( encoded, '\n' );
                     InputStream is = new ByteArrayInputStream( line );
-                    DefaultMasterProcessChannelDecoder decoder = new DefaultMasterProcessChannelDecoder( is, null );
+                    LegacyMasterProcessChannelDecoder decoder = new LegacyMasterProcessChannelDecoder( is );
                     Command command = decoder.decode();
                     assertThat( command.getCommandType(), is( commandType ) );
                     assertThat( command.getData(), is( "pkg.Test" ) );
@@ -60,9 +62,9 @@ public class DefaultMasterProcessChannelDecoderTest
                     assertEquals( Void.class, commandType.getDataType() );
                     encoded = commandType.encode();
                     assertThat( new String( encoded ) )
-                            .isEqualTo( ":maven-surefire-std-out:testset-finished:" );
+                            .isEqualTo( ":maven-surefire-command:testset-finished:" );
                     is = new ByteArrayInputStream( encoded );
-                    decoder = new DefaultMasterProcessChannelDecoder( is, null );
+                    decoder = new LegacyMasterProcessChannelDecoder( is );
                     command = decoder.decode();
                     assertThat( command.getCommandType(), is( commandType ) );
                     assertNull( command.getData() );
@@ -72,9 +74,9 @@ public class DefaultMasterProcessChannelDecoderTest
                     assertEquals( Void.class, commandType.getDataType() );
                     encoded = commandType.encode();
                     assertThat( new String( encoded ) )
-                            .isEqualTo( ":maven-surefire-std-out:skip-since-next-test:" );
+                            .isEqualTo( ":maven-surefire-command:skip-since-next-test:" );
                     is = new ByteArrayInputStream( encoded );
-                    decoder = new DefaultMasterProcessChannelDecoder( is, null );
+                    decoder = new LegacyMasterProcessChannelDecoder( is );
                     command = decoder.decode();
                     assertThat( command.getCommandType(), is( commandType ) );
                     assertNull( command.getData() );
@@ -83,9 +85,9 @@ public class DefaultMasterProcessChannelDecoderTest
                     assertEquals( String.class, commandType.getDataType() );
                     encoded = commandType.encode( Shutdown.EXIT.name() );
                     assertThat( new String( encoded ) )
-                            .isEqualTo( ":maven-surefire-std-out:shutdown:EXIT:" );
+                            .isEqualTo( ":maven-surefire-command:shutdown:EXIT:" );
                     is = new ByteArrayInputStream( encoded );
-                    decoder = new DefaultMasterProcessChannelDecoder( is, null );
+                    decoder = new LegacyMasterProcessChannelDecoder( is );
                     command = decoder.decode();
                     assertThat( command.getCommandType(), is( commandType ) );
                     assertThat( command.getData(), is( "EXIT" ) );
@@ -95,9 +97,9 @@ public class DefaultMasterProcessChannelDecoderTest
                     assertEquals( Void.class, commandType.getDataType() );
                     encoded = commandType.encode();
                     assertThat( new String( encoded ) )
-                            .isEqualTo( ":maven-surefire-std-out:noop:" );
+                            .isEqualTo( ":maven-surefire-command:noop:" );
                     is = new ByteArrayInputStream( encoded );
-                    decoder = new DefaultMasterProcessChannelDecoder( is, null );
+                    decoder = new LegacyMasterProcessChannelDecoder( is );
                     command = decoder.decode();
                     assertThat( command.getCommandType(), is( commandType ) );
                     assertNull( command.getData() );
@@ -107,9 +109,9 @@ public class DefaultMasterProcessChannelDecoderTest
                     assertEquals( Void.class, commandType.getDataType() );
                     encoded = commandType.encode();
                     assertThat( new String( encoded ) )
-                            .isEqualTo( ":maven-surefire-std-out:bye-ack:" );
+                            .isEqualTo( ":maven-surefire-command:bye-ack:" );
                     is = new ByteArrayInputStream( encoded );
-                    decoder = new DefaultMasterProcessChannelDecoder( is, null );
+                    decoder = new LegacyMasterProcessChannelDecoder( is );
                     command = decoder.decode();
                     assertThat( command.getCommandType(), is( commandType ) );
                     assertNull( command.getData() );
@@ -122,9 +124,9 @@ public class DefaultMasterProcessChannelDecoderTest
 
     public void testShouldDecodeTwoCommands() throws IOException
     {
-        String cmd = ":maven-surefire-std-out:bye-ack\n:maven-surefire-std-out:bye-ack:";
+        String cmd = ":maven-surefire-command:bye-ack\n:maven-surefire-command:bye-ack:";
         InputStream is = new ByteArrayInputStream( cmd.getBytes() );
-        DefaultMasterProcessChannelDecoder decoder = new DefaultMasterProcessChannelDecoder( is, null );
+        LegacyMasterProcessChannelDecoder decoder = new LegacyMasterProcessChannelDecoder( is );
 
         Command command = decoder.decode();
         assertThat( command.getCommandType() ).isEqualTo( BYE_ACK );
diff --git a/surefire-api/src/test/java/org/apache/maven/surefire/booter/ForkedChannelEncoderTest.java b/surefire-booter/src/test/java/org/apache/maven/surefire/booter/spi/LegacyMasterProcessChannelEncoderTest.java
similarity index 84%
rename from surefire-api/src/test/java/org/apache/maven/surefire/booter/ForkedChannelEncoderTest.java
rename to surefire-booter/src/test/java/org/apache/maven/surefire/booter/spi/LegacyMasterProcessChannelEncoderTest.java
index 1dcf4d9..eaafd6e 100644
--- a/surefire-api/src/test/java/org/apache/maven/surefire/booter/ForkedChannelEncoderTest.java
+++ b/surefire-booter/src/test/java/org/apache/maven/surefire/booter/spi/LegacyMasterProcessChannelEncoderTest.java
@@ -1,4 +1,4 @@
-package org.apache.maven.surefire.booter;
+package org.apache.maven.surefire.booter.spi;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -36,40 +36,41 @@ import java.util.Map;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static java.util.Arrays.copyOfRange;
+import static org.apache.maven.surefire.booter.spi.LegacyMasterProcessChannelEncoder.encode;
 import static org.apache.maven.surefire.shared.codec.binary.Base64.encodeBase64String;
-import static org.apache.maven.surefire.booter.ForkedChannelEncoder.encode;
-import static org.apache.maven.surefire.booter.ForkedChannelEncoder.encodeHeader;
-import static org.apache.maven.surefire.booter.ForkedChannelEncoder.encodeMessage;
-import static org.apache.maven.surefire.booter.ForkedChannelEncoder.encodeOpcode;
+import static org.apache.maven.surefire.booter.spi.LegacyMasterProcessChannelEncoder.encodeHeader;
+import static org.apache.maven.surefire.booter.spi.LegacyMasterProcessChannelEncoder.encodeMessage;
+import static org.apache.maven.surefire.booter.spi.LegacyMasterProcessChannelEncoder.encodeOpcode;
 import static org.apache.maven.surefire.booter.ForkedProcessEvent.BOOTERCODE_SYSPROPS;
-import static org.apache.maven.surefire.booter.ForkedProcessEvent.MAGIC_NUMBER;
+import static org.apache.maven.surefire.booter.ForkedProcessEvent.MAGIC_NUMBER_DELIMITED;
 import static org.apache.maven.surefire.report.RunMode.NORMAL_RUN;
 import static org.fest.assertions.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 /**
- * Test for {@link ForkedChannelEncoder}.
+ * Test for {@link LegacyMasterProcessChannelEncoder}.
  *
  * @author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
  * @since 3.0.0-M4
  */
-public class ForkedChannelEncoderTest
+public class LegacyMasterProcessChannelEncoderTest
 {
     private static final int ELAPSED_TIME = 102;
 
     @Test
     public void shouldBeFailSafe()
     {
-        assertThat( ForkedChannelEncoder.toBase64( null ) ).isEqualTo( "-" );
-        assertThat( ForkedChannelEncoder.toBase64( "" ) ).isEqualTo( "" );
+        assertThat( LegacyMasterProcessChannelEncoder.toBase64( null ) ).isEqualTo( "-" );
+        assertThat( LegacyMasterProcessChannelEncoder.toBase64( "" ) ).isEqualTo( "" );
     }
 
     @Test
     public void shouldHaveSystemProperty()
     {
         StringBuilder actualEncoded = encode( BOOTERCODE_SYSPROPS, NORMAL_RUN, "arg1", "arg2" );
-        String expected = MAGIC_NUMBER + BOOTERCODE_SYSPROPS.getOpcode() + ":normal-run" + ":UTF-8:YXJnMQ==:YXJnMg==";
+        String expected = MAGIC_NUMBER_DELIMITED + BOOTERCODE_SYSPROPS.getOpcode()
+            + ":normal-run:UTF-8:YXJnMQ==:YXJnMg==";
 
         assertThat( actualEncoded.toString() )
                 .isEqualTo( expected );
@@ -179,7 +180,7 @@ public class ForkedChannelEncoderTest
 
         StringBuilder encode = encode( "X", "normal-run", reportEntry, false );
         assertThat( encode.toString() )
-                .isEqualTo( ":maven:surefire:std:out:X:normal-run:UTF-8:"
+                .isEqualTo( ":maven-surefire-event:X:normal-run:UTF-8:"
                                 + encodedSourceName
                                 + ":"
                                 + "-"
@@ -204,7 +205,7 @@ public class ForkedChannelEncoderTest
 
         encode = encode( "X", "normal-run", reportEntry, true );
         assertThat( encode.toString() )
-                .isEqualTo( ":maven:surefire:std:out:X:normal-run:UTF-8:"
+                .isEqualTo( ":maven-surefire-event:X:normal-run:UTF-8:"
                                 + encodedSourceName
                                 + ":"
                                 + "-"
@@ -228,12 +229,12 @@ public class ForkedChannelEncoderTest
                 );
 
         Stream out = Stream.newStream();
-        ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
+        LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
 
-        forkedChannelEncoder.testSetStarting( reportEntry, true );
+        encoder.testSetStarting( reportEntry, true );
         LineNumberReader printedLines = out.newReader( UTF_8 );
         assertThat( printedLines.readLine() )
-                .isEqualTo( ":maven:surefire:std:out:testset-starting:normal-run:UTF-8:"
+                .isEqualTo( ":maven-surefire-event:testset-starting:normal-run:UTF-8:"
                                     + encodedSourceName
                                     + ":"
                                     + "-"
@@ -258,12 +259,12 @@ public class ForkedChannelEncoderTest
         assertThat( printedLines.readLine() ).isNull();
 
         out = Stream.newStream();
-        forkedChannelEncoder = new ForkedChannelEncoder( out );
+        encoder = new LegacyMasterProcessChannelEncoder( out );
 
-        forkedChannelEncoder.testSetStarting( reportEntry, false );
+        encoder.testSetStarting( reportEntry, false );
         printedLines = out.newReader( UTF_8 );
         assertThat( printedLines.readLine() )
-                .isEqualTo( ":maven:surefire:std:out:testset-starting:normal-run:UTF-8:"
+                .isEqualTo( ":maven-surefire-event:testset-starting:normal-run:UTF-8:"
                                     + encodedSourceName
                                     + ":"
                                     + "-"
@@ -325,12 +326,12 @@ public class ForkedChannelEncoderTest
         String encodedMessage = encodeBase64String( toArray( UTF_8.encode( reportEntry.getMessage() ) ) );
 
         Stream out = Stream.newStream();
-        ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
+        LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
 
-        forkedChannelEncoder.testSetCompleted( reportEntry, false );
+        encoder.testSetCompleted( reportEntry, false );
         LineNumberReader printedLines = out.newReader( UTF_8 );
         assertThat( printedLines.readLine() )
-                .isEqualTo( ":maven:surefire:std:out:testset-completed:normal-run:UTF-8:"
+                .isEqualTo( ":maven-surefire-event:testset-completed:normal-run:UTF-8:"
                         + encodedSourceName
                         + ":"
                         + "-"
@@ -392,12 +393,12 @@ public class ForkedChannelEncoderTest
         String encodedMessage = encodeBase64String( toArray( UTF_8.encode( reportEntry.getMessage() ) ) );
 
         Stream out = Stream.newStream();
-        ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
+        LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
 
-        forkedChannelEncoder.testStarting( reportEntry, true );
+        encoder.testStarting( reportEntry, true );
         LineNumberReader printedLines = out.newReader( UTF_8 );
         assertThat( printedLines.readLine() )
-                .isEqualTo( ":maven:surefire:std:out:test-starting:normal-run:UTF-8:"
+                .isEqualTo( ":maven-surefire-event:test-starting:normal-run:UTF-8:"
                         + encodedSourceName
                         + ":"
                         + "-"
@@ -459,12 +460,12 @@ public class ForkedChannelEncoderTest
         String encodedMessage = encodeBase64String( toArray( UTF_8.encode( reportEntry.getMessage() ) ) );
 
         Stream out = Stream.newStream();
-        ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
+        LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
 
-        forkedChannelEncoder.testSucceeded( reportEntry, true );
+        encoder.testSucceeded( reportEntry, true );
         LineNumberReader printedLines = out.newReader( UTF_8 );
         assertThat( printedLines.readLine() )
-                .isEqualTo( ":maven:surefire:std:out:test-succeeded:normal-run:UTF-8:"
+                .isEqualTo( ":maven-surefire-event:test-succeeded:normal-run:UTF-8:"
                         + encodedSourceName
                         + ":"
                         + "-"
@@ -526,12 +527,12 @@ public class ForkedChannelEncoderTest
         String encodedMessage = encodeBase64String( toArray( UTF_8.encode( reportEntry.getMessage() ) ) );
 
         Stream out = Stream.newStream();
-        ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
+        LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
 
-        forkedChannelEncoder.testFailed( reportEntry, false );
+        encoder.testFailed( reportEntry, false );
         LineNumberReader printedLines = out.newReader( UTF_8 );
         assertThat( printedLines.readLine() )
-                .isEqualTo( ":maven:surefire:std:out:test-failed:normal-run:UTF-8:"
+                .isEqualTo( ":maven-surefire-event:test-failed:normal-run:UTF-8:"
                         + encodedSourceName
                         + ":"
                         + "-"
@@ -592,12 +593,12 @@ public class ForkedChannelEncoderTest
         String encodedMessage = encodeBase64String( toArray( UTF_8.encode( reportEntry.getMessage() ) ) );
 
         Stream out = Stream.newStream();
-        ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
+        LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
 
-        forkedChannelEncoder.testSkipped( reportEntry, false );
+        encoder.testSkipped( reportEntry, false );
         LineNumberReader printedLines = out.newReader( UTF_8 );
         assertThat( printedLines.readLine() )
-                .isEqualTo( ":maven:surefire:std:out:test-skipped:normal-run:UTF-8:"
+                .isEqualTo( ":maven-surefire-event:test-skipped:normal-run:UTF-8:"
                         + encodedSourceName
                         + ":"
                         + "-"
@@ -657,12 +658,12 @@ public class ForkedChannelEncoderTest
         String encodedMessage = encodeBase64String( toArray( UTF_8.encode( reportEntry.getMessage() ) ) );
 
         Stream out = Stream.newStream();
-        ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
+        LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
 
-        forkedChannelEncoder.testError( reportEntry, false );
+        encoder.testError( reportEntry, false );
         LineNumberReader printedLines = out.newReader( UTF_8 );
         assertThat( printedLines.readLine() )
-                .isEqualTo( ":maven:surefire:std:out:test-error:normal-run:UTF-8:"
+                .isEqualTo( ":maven-surefire-event:test-error:normal-run:UTF-8:"
                         + encodedSourceName
                         + ":"
                         + "-"
@@ -720,12 +721,12 @@ public class ForkedChannelEncoderTest
         String encodedMessage = encodeBase64String( toArray( UTF_8.encode( reportEntry.getMessage() ) ) );
 
         Stream out = Stream.newStream();
-        ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
+        LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
 
-        forkedChannelEncoder.testAssumptionFailure( reportEntry, false );
+        encoder.testAssumptionFailure( reportEntry, false );
         LineNumberReader printedLines = out.newReader( UTF_8 );
         assertThat( printedLines.readLine() )
-                .isEqualTo( ":maven:surefire:std:out:test-assumption-failure:normal-run:UTF-8:"
+                .isEqualTo( ":maven-surefire-event:test-assumption-failure:normal-run:UTF-8:"
                         + encodedSourceName
                         + ":"
                         + "-"
@@ -754,12 +755,12 @@ public class ForkedChannelEncoderTest
     public void testBye() throws IOException
     {
         Stream out = Stream.newStream();
-        ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
+        LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
 
-        forkedChannelEncoder.bye();
+        encoder.bye();
         LineNumberReader printedLines = out.newReader( UTF_8 );
         assertThat( printedLines.readLine() )
-                .isEqualTo( ":maven:surefire:std:out:bye" );
+                .isEqualTo( ":maven-surefire-event:bye" );
         assertThat( printedLines.readLine() ).isNull();
     }
 
@@ -767,12 +768,12 @@ public class ForkedChannelEncoderTest
     public void testStopOnNextTest() throws IOException
     {
         Stream out = Stream.newStream();
-        ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
+        LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
 
-        forkedChannelEncoder.stopOnNextTest();
+        encoder.stopOnNextTest();
         LineNumberReader printedLines = out.newReader( UTF_8 );
         assertThat( printedLines.readLine() )
-                .isEqualTo( ":maven:surefire:std:out:stop-on-next-test" );
+                .isEqualTo( ":maven-surefire-event:stop-on-next-test" );
         assertThat( printedLines.readLine() ).isNull();
     }
 
@@ -780,12 +781,12 @@ public class ForkedChannelEncoderTest
     public void testAcquireNextTest() throws IOException
     {
         Stream out = Stream.newStream();
-        ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
+        LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
 
-        forkedChannelEncoder.acquireNextTest();
+        encoder.acquireNextTest();
         LineNumberReader printedLines = out.newReader( UTF_8 );
         assertThat( printedLines.readLine() )
-                .isEqualTo( ":maven:surefire:std:out:next-test" );
+                .isEqualTo( ":maven-surefire-event:next-test" );
         assertThat( printedLines.readLine() ).isNull();
     }
 
@@ -794,38 +795,38 @@ public class ForkedChannelEncoderTest
     {
         StringBuilder encoded = encodeOpcode( "some-opcode", "normal-run" );
         assertThat( encoded.toString() )
-                .isEqualTo( ":maven:surefire:std:out:some-opcode:normal-run" );
+                .isEqualTo( ":maven-surefire-event:some-opcode:normal-run" );
 
         encoded = encodeHeader( "some-opcode", "normal-run" );
         assertThat( encoded.toString() )
-                .isEqualTo( ":maven:surefire:std:out:some-opcode:normal-run:UTF-8" );
+                .isEqualTo( ":maven-surefire-event:some-opcode:normal-run:UTF-8" );
 
         encoded = encodeMessage( "some-opcode", "normal-run", "msg" );
         assertThat( encoded.toString() )
-                .isEqualTo( ":maven:surefire:std:out:some-opcode:normal-run:UTF-8:msg" );
+                .isEqualTo( ":maven-surefire-event:some-opcode:normal-run:UTF-8:msg" );
 
         Stream out = Stream.newStream();
-        ForkedChannelEncoder encoder = new ForkedChannelEncoder( out );
+        LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
         encoded = encoder.print( "some-opcode", "msg" );
         assertThat( encoded.toString() )
-                .isEqualTo( ":maven:surefire:std:out:some-opcode:UTF-8:bXNn" );
+                .isEqualTo( ":maven-surefire-event:some-opcode:UTF-8:bXNn" );
 
         encoded = encoder.print( "some-opcode", new String[] { null } );
         assertThat( encoded.toString() )
-                .isEqualTo( ":maven:surefire:std:out:some-opcode:UTF-8:-" );
+                .isEqualTo( ":maven-surefire-event:some-opcode:UTF-8:-" );
     }
 
     @Test
     public void testConsoleInfo()
     {
         Stream out = Stream.newStream();
-        ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
+        LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
 
-        forkedChannelEncoder.consoleInfoLog( "msg" );
+        encoder.consoleInfoLog( "msg" );
 
         String encoded = new String( out.toByteArray(), UTF_8 );
 
-        String expected = ":maven:surefire:std:out:console-info-log:UTF-8:"
+        String expected = ":maven-surefire-event:console-info-log:UTF-8:"
                                   + encodeBase64String( toArray( UTF_8.encode( "msg" ) ) )
                                   + "\n";
 
@@ -837,13 +838,13 @@ public class ForkedChannelEncoderTest
     public void testConsoleError()
     {
         Stream out = Stream.newStream();
-        ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
+        LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
 
-        forkedChannelEncoder.consoleErrorLog( "msg" );
+        encoder.consoleErrorLog( "msg" );
 
         String encoded = new String( out.toByteArray(), UTF_8 );
 
-        String expected = ":maven:surefire:std:out:console-error-log:UTF-8:"
+        String expected = ":maven-surefire-event:console-error-log:UTF-8:"
                 + encodeBase64String( toArray( UTF_8.encode( "msg" ) ) )
                 + "\n";
 
@@ -855,12 +856,12 @@ public class ForkedChannelEncoderTest
     public void testConsoleErrorLog1() throws IOException
     {
         Stream out = Stream.newStream();
-        ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
+        LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
 
-        forkedChannelEncoder.consoleErrorLog( new Exception( "msg" ) );
+        encoder.consoleErrorLog( new Exception( "msg" ) );
         LineNumberReader printedLines = out.newReader( UTF_8 );
         assertThat( printedLines.readLine() )
-                .startsWith( ":maven:surefire:std:out:console-error-log:UTF-8:bXNn:-:" );
+                .startsWith( ":maven-surefire-event:console-error-log:UTF-8:bXNn:-:" );
         assertThat( printedLines.readLine() ).isNull();
     }
 
@@ -868,12 +869,12 @@ public class ForkedChannelEncoderTest
     public void testConsoleErrorLog2() throws IOException
     {
         Stream out = Stream.newStream();
-        ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
+        LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
 
-        forkedChannelEncoder.consoleErrorLog( "msg2", new Exception( "msg" ) );
+        encoder.consoleErrorLog( "msg2", new Exception( "msg" ) );
         LineNumberReader printedLines = out.newReader( UTF_8 );
         assertThat( printedLines.readLine() )
-                .startsWith( ":maven:surefire:std:out:console-error-log:UTF-8:bXNnMg==:-:" );
+                .startsWith( ":maven-surefire-event:console-error-log:UTF-8:bXNnMg==:-:" );
         assertThat( printedLines.readLine() ).isNull();
     }
 
@@ -881,7 +882,7 @@ public class ForkedChannelEncoderTest
     public void testConsoleErrorLog3() throws IOException
     {
         Stream out = Stream.newStream();
-        ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
+        LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
 
         StackTraceWriter stackTraceWriter = mock( StackTraceWriter.class );
         when( stackTraceWriter.getThrowable() ).thenReturn( new SafeThrowable( "1" ) );
@@ -889,10 +890,10 @@ public class ForkedChannelEncoderTest
         when( stackTraceWriter.writeTraceToString() ).thenReturn( "3" );
         when( stackTraceWriter.writeTrimmedTraceToString() ).thenReturn( "4" );
 
-        forkedChannelEncoder.consoleErrorLog( stackTraceWriter, true );
+        encoder.consoleErrorLog( stackTraceWriter, true );
         LineNumberReader printedLines = out.newReader( UTF_8 );
         assertThat( printedLines.readLine() )
-                .startsWith( ":maven:surefire:std:out:console-error-log:UTF-8:MQ==:Mg==:NA==" );
+                .startsWith( ":maven-surefire-event:console-error-log:UTF-8:MQ==:Mg==:NA==" );
         assertThat( printedLines.readLine() ).isNull();
     }
 
@@ -900,13 +901,13 @@ public class ForkedChannelEncoderTest
     public void testConsoleDebug()
     {
         Stream out = Stream.newStream();
-        ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
+        LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
 
-        forkedChannelEncoder.consoleDebugLog( "msg" );
+        encoder.consoleDebugLog( "msg" );
 
         String encoded = new String( out.toByteArray(), UTF_8 );
 
-        String expected = ":maven:surefire:std:out:console-debug-log:UTF-8:"
+        String expected = ":maven-surefire-event:console-debug-log:UTF-8:"
                                   + encodeBase64String( toArray( UTF_8.encode( "msg" ) ) )
                                   + "\n";
 
@@ -918,13 +919,13 @@ public class ForkedChannelEncoderTest
     public void testConsoleWarning()
     {
         Stream out = Stream.newStream();
-        ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
+        LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
 
-        forkedChannelEncoder.consoleWarningLog( "msg" );
+        encoder.consoleWarningLog( "msg" );
 
         String encoded = new String( out.toByteArray(), UTF_8 );
 
-        String expected = ":maven:surefire:std:out:console-warning-log:UTF-8:"
+        String expected = ":maven-surefire-event:console-warning-log:UTF-8:"
                                   + encodeBase64String( toArray( UTF_8.encode( "msg" ) ) )
                                   + "\n";
 
@@ -936,11 +937,11 @@ public class ForkedChannelEncoderTest
     public void testStdOutStream() throws IOException
     {
         Stream out = Stream.newStream();
-        ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
+        LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
 
-        forkedChannelEncoder.stdOut( "msg", false );
+        encoder.stdOut( "msg", false );
 
-        String expected = ":maven:surefire:std:out:std-out-stream:normal-run:UTF-8:bXNn";
+        String expected = ":maven-surefire-event:std-out-stream:normal-run:UTF-8:bXNn";
 
         LineNumberReader printedLines = out.newReader( UTF_8 );
         assertThat( printedLines.readLine() )
@@ -953,11 +954,11 @@ public class ForkedChannelEncoderTest
     public void testStdOutStreamLn() throws IOException
     {
         Stream out = Stream.newStream();
-        ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
+        LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
 
-        forkedChannelEncoder.stdOut( "msg", true );
+        encoder.stdOut( "msg", true );
 
-        String expected = ":maven:surefire:std:out:std-out-stream-new-line:normal-run:UTF-8:bXNn";
+        String expected = ":maven-surefire-event:std-out-stream-new-line:normal-run:UTF-8:bXNn";
 
         LineNumberReader printedLines = out.newReader( UTF_8 );
         assertThat( printedLines.readLine() )
@@ -970,11 +971,11 @@ public class ForkedChannelEncoderTest
     public void testStdErrStream() throws IOException
     {
         Stream out = Stream.newStream();
-        ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
+        LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
 
-        forkedChannelEncoder.stdErr( "msg", false );
+        encoder.stdErr( "msg", false );
 
-        String expected = ":maven:surefire:std:out:std-err-stream:normal-run:UTF-8:bXNn";
+        String expected = ":maven-surefire-event:std-err-stream:normal-run:UTF-8:bXNn";
 
         LineNumberReader printedLines = out.newReader( UTF_8 );
         assertThat( printedLines.readLine() )
@@ -987,11 +988,11 @@ public class ForkedChannelEncoderTest
     public void testStdErrStreamLn() throws IOException
     {
         Stream out = Stream.newStream();
-        ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
+        LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
 
-        forkedChannelEncoder.stdErr( "msg", true );
+        encoder.stdErr( "msg", true );
 
-        String expected = ":maven:surefire:std:out:std-err-stream-new-line:normal-run:UTF-8:bXNn";
+        String expected = ":maven-surefire-event:std-err-stream-new-line:normal-run:UTF-8:bXNn";
 
         LineNumberReader printedLines = out.newReader( UTF_8 );
         assertThat( printedLines.readLine() )
@@ -1005,11 +1006,11 @@ public class ForkedChannelEncoderTest
     public void shouldCountSameNumberOfSystemProperties() throws IOException
     {
         Stream out = Stream.newStream();
-        ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
+        LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
 
         Map<String, String> sysProps = ObjectUtils.systemProps();
         int expectedSize = sysProps.size();
-        forkedChannelEncoder.sendSystemProperties( sysProps );
+        encoder.sendSystemProperties( sysProps );
 
         LineNumberReader printedLines = out.newReader( UTF_8 );
 
@@ -1017,7 +1018,7 @@ public class ForkedChannelEncoderTest
         for ( String line; ( line = printedLines.readLine() ) != null; size++ )
         {
             assertThat( line )
-                    .startsWith( ":maven:surefire:std:out:sys-prop:normal-run:UTF-8:" );
+                    .startsWith( ":maven-surefire-event:sys-prop:normal-run:UTF-8:" );
         }
 
         assertThat( size )
@@ -1029,17 +1030,17 @@ public class ForkedChannelEncoderTest
     {
         Stream out = Stream.newStream();
 
-        ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
+        LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
         StackTraceWriter stackTraceWriter = mock( StackTraceWriter.class );
         when( stackTraceWriter.getThrowable() ).thenReturn( new SafeThrowable( "1" ) );
         when( stackTraceWriter.smartTrimmedStackTrace() ).thenReturn( "2" );
         when( stackTraceWriter.writeTraceToString() ).thenReturn( "3" );
         when( stackTraceWriter.writeTrimmedTraceToString() ).thenReturn( "4" );
-        forkedChannelEncoder.sendExitEvent( stackTraceWriter, false );
+        encoder.sendExitEvent( stackTraceWriter, false );
 
         LineNumberReader printedLines = out.newReader( UTF_8 );
         assertThat( printedLines.readLine() )
-                .startsWith( ":maven:surefire:std:out:jvm-exit-error:UTF-8:MQ==:Mg==:Mw==" );
+                .startsWith( ":maven-surefire-event:jvm-exit-error:UTF-8:MQ==:Mg==:Mw==" );
     }
 
     @Test
@@ -1047,17 +1048,17 @@ public class ForkedChannelEncoderTest
     {
         Stream out = Stream.newStream();
 
-        ForkedChannelEncoder forkedChannelEncoder = new ForkedChannelEncoder( out );
+        LegacyMasterProcessChannelEncoder encoder = new LegacyMasterProcessChannelEncoder( out );
         StackTraceWriter stackTraceWriter = mock( StackTraceWriter.class );
         when( stackTraceWriter.getThrowable() ).thenReturn( new SafeThrowable( "1" ) );
         when( stackTraceWriter.smartTrimmedStackTrace() ).thenReturn( "2" );
         when( stackTraceWriter.writeTraceToString() ).thenReturn( "3" );
         when( stackTraceWriter.writeTrimmedTraceToString() ).thenReturn( "4" );
-        forkedChannelEncoder.sendExitEvent( stackTraceWriter, true );
+        encoder.sendExitEvent( stackTraceWriter, true );
 
         LineNumberReader printedLines = out.newReader( UTF_8 );
         assertThat( printedLines.readLine() )
-                .startsWith( ":maven:surefire:std:out:jvm-exit-error:UTF-8:MQ==:Mg==:NA==" );
+                .startsWith( ":maven-surefire-event:jvm-exit-error:UTF-8:MQ==:Mg==:NA==" );
     }
 
     private static class Stream extends PrintStream
diff --git a/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/ForkNodeFactory.java b/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/ForkNodeFactory.java
index 3e0d6a6..db0e7b8 100644
--- a/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/ForkNodeFactory.java
+++ b/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/ForkNodeFactory.java
@@ -25,7 +25,7 @@ import java.io.IOException;
 
 /**
  * @author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
- * @since 3.0.0-M4
+ * @since 3.0.0-M5
  */
 public interface ForkNodeFactory
 {
diff --git a/surefire-extensions-spi/src/main/java/org/apache/maven/surefire/spi/MasterProcessChannelDecoderFactory.java b/surefire-extensions-spi/src/main/java/org/apache/maven/surefire/spi/MasterProcessChannelProcessorFactory.java
similarity index 51%
rename from surefire-extensions-spi/src/main/java/org/apache/maven/surefire/spi/MasterProcessChannelDecoderFactory.java
rename to surefire-extensions-spi/src/main/java/org/apache/maven/surefire/spi/MasterProcessChannelProcessorFactory.java
index 5b08d4d..989a52d 100644
--- a/surefire-extensions-spi/src/main/java/org/apache/maven/surefire/spi/MasterProcessChannelDecoderFactory.java
+++ b/surefire-extensions-spi/src/main/java/org/apache/maven/surefire/spi/MasterProcessChannelProcessorFactory.java
@@ -19,22 +19,44 @@ package org.apache.maven.surefire.spi;
  * under the License.
  */
 
-import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
 import org.apache.maven.surefire.providerapi.MasterProcessChannelDecoder;
+import org.apache.maven.surefire.providerapi.MasterProcessChannelEncoder;
 
+import java.io.Closeable;
 import java.io.IOException;
 
 /**
- * The SPI interface, a factory of decoders.
+ * The SPI interface, a factory of an encoder and a decoder.
  */
-public interface MasterProcessChannelDecoderFactory
+public interface MasterProcessChannelProcessorFactory extends Closeable
 {
     /**
+     * Evaluates the {@code channelConfig}.
+     *
+     * @param channelConfig a connection string used by the fork JVM
+     * @return {@code true} if {@code channelConfig} is applicable and thus this SPI is eligible in the fork
+     */
+    boolean canUse( String channelConfig );
+
+    /**
+     * Open a new connection.
+     *
+     * @param channelConfig e.g. "pipe://3" or "tcp://127.0.0.1:65035"
+     * @throws IOException if cannot connect
+     */
+    void connect( String channelConfig ) throws IOException;
+
+    /**
      * Decoder factory method.
      *
-     * @param channelConfig "pipe:std:in" or "tcp://localhost:65035"
-     * @param logger        error logger
      * @return a new instance of decoder
      */
-    MasterProcessChannelDecoder createDecoder( String channelConfig, ConsoleLogger logger ) throws IOException;
+    MasterProcessChannelDecoder createDecoder() throws IOException;
+
+    /**
+     * Encoder factory method.
+     *
+     * @return a new instance of encoder
+     */
+    MasterProcessChannelEncoder createEncoder() throws IOException;
 }