diff --git a/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/logging/AnsiMessageBuffer.java b/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/logging/AnsiMessageBuilder.java
similarity index 68%
rename from maven-shared-utils/src/main/java/org/apache/maven/shared/utils/logging/AnsiMessageBuffer.java
rename to maven-shared-utils/src/main/java/org/apache/maven/shared/utils/logging/AnsiMessageBuilder.java
index 10893c9..9f71656 100644
--- a/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/logging/AnsiMessageBuffer.java
+++ b/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/logging/AnsiMessageBuilder.java
@@ -22,125 +22,125 @@
 import org.fusesource.jansi.Ansi;
 
 /**
- * Message buffer implementation that supports ANSI colors through
+ * Message builder implementation that supports ANSI colors through
  * <a href="http://fusesource.github.io/jansi/">Jansi</a> with configurable styles through {@link Style}.
  */
-class AnsiMessageBuffer
-    implements MessageBuffer
+class AnsiMessageBuilder
+    implements MessageBuilder
 {
     private Ansi ansi;
 
-    AnsiMessageBuffer()
+    AnsiMessageBuilder()
     {
         this( Ansi.ansi() );
     }
 
-    AnsiMessageBuffer( StringBuilder builder )
+    AnsiMessageBuilder( StringBuilder builder )
     {
         this( Ansi.ansi( builder ) );
     }
 
-    AnsiMessageBuffer( int size )
+    AnsiMessageBuilder( int size )
     {
         this( Ansi.ansi( size ) );
     }
 
-    AnsiMessageBuffer( Ansi ansi )
+    AnsiMessageBuilder( Ansi ansi )
     {
         this.ansi = ansi;
     }
 
-    public AnsiMessageBuffer debug( Object message )
+    public AnsiMessageBuilder debug( Object message )
     {
         Style.DEBUG.apply( ansi ).a( message ).reset();
         return this;
     }
 
-    public AnsiMessageBuffer info( Object message )
+    public AnsiMessageBuilder info( Object message )
     {
         Style.INFO.apply( ansi ).a( message ).reset();
         return this;
     }
 
-    public AnsiMessageBuffer warning( Object message )
+    public AnsiMessageBuilder warning( Object message )
     {
         Style.WARNING.apply( ansi ).a( message ).reset();
         return this;
     }
 
-    public AnsiMessageBuffer error( Object message )
+    public AnsiMessageBuilder error( Object message )
     {
         Style.ERROR.apply( ansi ).a( message ).reset();
         return this;
     }
 
-    public AnsiMessageBuffer success( Object message )
+    public AnsiMessageBuilder success( Object message )
     {
         Style.SUCCESS.apply( ansi ).a( message ).reset();
         return this;
     }
 
-    public AnsiMessageBuffer failure( Object message )
+    public AnsiMessageBuilder failure( Object message )
     {
         Style.FAILURE.apply( ansi ).a( message ).reset();
         return this;
     }
 
-    public AnsiMessageBuffer strong( Object message )
+    public AnsiMessageBuilder strong( Object message )
     {
         Style.STRONG.apply( ansi ).a( message ).reset();
         return this;
     }
 
-    public AnsiMessageBuffer mojo( Object message )
+    public AnsiMessageBuilder mojo( Object message )
     {
         Style.MOJO.apply( ansi ).a( message ).reset();
         return this;
     }
 
-    public AnsiMessageBuffer project( Object message )
+    public AnsiMessageBuilder project( Object message )
     {
         Style.PROJECT.apply( ansi ).a( message ).reset();
         return this;
     }
 
-    public AnsiMessageBuffer a( char[] value, int offset, int len )
+    public AnsiMessageBuilder a( char[] value, int offset, int len )
     {
         ansi.a( value, offset, len );
         return this;
     }
 
-    public AnsiMessageBuffer a( char[] value )
+    public AnsiMessageBuilder a( char[] value )
     {
         ansi.a( value );
         return this;
     }
 
-    public AnsiMessageBuffer a( CharSequence value, int start, int end )
+    public AnsiMessageBuilder a( CharSequence value, int start, int end )
     {
         ansi.a( value, start, end );
         return this;
     }
 
-    public AnsiMessageBuffer a( CharSequence value )
+    public AnsiMessageBuilder a( CharSequence value )
     {
         ansi.a( value );
         return this;
     }
 
-    public AnsiMessageBuffer a( Object value )
+    public AnsiMessageBuilder a( Object value )
     {
         ansi.a( value );
         return this;
     }
 
-    public AnsiMessageBuffer newline()
+    public AnsiMessageBuilder newline()
     {
         ansi.newline();
         return this;
     }
 
-    public AnsiMessageBuffer format( String pattern, Object... args )
+    public AnsiMessageBuilder format( String pattern, Object... args )
     {
         ansi.format( pattern, args );
         return this;
diff --git a/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/logging/MessageBuffer.java b/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/logging/MessageBuilder.java
similarity index 73%
rename from maven-shared-utils/src/main/java/org/apache/maven/shared/utils/logging/MessageBuffer.java
rename to maven-shared-utils/src/main/java/org/apache/maven/shared/utils/logging/MessageBuilder.java
index 26f717b..37fbbc8 100644
--- a/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/logging/MessageBuffer.java
+++ b/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/logging/MessageBuilder.java
@@ -20,64 +20,64 @@
  */
 
 /**
- * Message buffer that supports configurable styling.
+ * Message builder that supports configurable styling.
  * @see MessageUtils
  */
-public interface MessageBuffer
+public interface MessageBuilder
 {
     /**
      * Append message content for DEBUG level.
      * By default, bold cyan
      */
-    MessageBuffer debug( Object message );
+    MessageBuilder debug( Object message );
     
     /**
      * Append message content for INFO level.
      * By default, bold blue
      */
-    MessageBuffer info( Object message );
+    MessageBuilder info( Object message );
     
     /**
      * Append message content in warning style or WARNING level.
      * By default, bold yellow
      */
-    MessageBuffer warning( Object message );
+    MessageBuilder warning( Object message );
     
     /**
      * Append message content for ERROR level.
      * By default, bold red
      */
-    MessageBuffer error( Object message );
+    MessageBuilder error( Object message );
     
     /**
      * Append message content in success style.
      * By default, bold green
      */
-    MessageBuffer success( Object message );
+    MessageBuilder success( Object message );
     
     /**
      * Append message content in failure style.
      * By default, bold red
      */
-    MessageBuffer failure( Object message );
+    MessageBuilder failure( Object message );
 
     /**
      * Append message content in strong style.
      * By default, bold
      */
-    MessageBuffer strong( Object message );
+    MessageBuilder strong( Object message );
     
     /**
      * Append message content in mojo style.
      * By default, green
      */
-    MessageBuffer mojo( Object message );
+    MessageBuilder mojo( Object message );
     
     /**
      * Append message content in project style.
      * By default, cyan
      */
-    MessageBuffer project( Object message );
+    MessageBuilder project( Object message );
     
     //
     // message building methods modelled after Ansi methods
@@ -85,36 +85,36 @@
     /**
      * Append content to the message buffer.
      */
-    MessageBuffer a( char[] value, int offset, int len );
+    MessageBuilder a( char[] value, int offset, int len );
 
     /**
      * Append content to the message buffer.
      */
-    MessageBuffer a( char[] value );
+    MessageBuilder a( char[] value );
 
     /**
      * Append content to the message buffer.
      */
-    MessageBuffer a( CharSequence value, int start, int end );
+    MessageBuilder a( CharSequence value, int start, int end );
 
     /**
      * Append content to the message buffer.
      */
-    MessageBuffer a( CharSequence value );
+    MessageBuilder a( CharSequence value );
 
     /**
      * Append content to the message buffer.
      */
-    MessageBuffer a( Object value );
+    MessageBuilder a( Object value );
 
     /**
      * Append newline to the message buffer.
      */
-    MessageBuffer newline();
+    MessageBuilder newline();
 
     /**
      * Append formatted content to the buffer.
      * @see String#format(String, Object...)
      */
-    MessageBuffer format( String pattern, Object... args );
+    MessageBuilder format( String pattern, Object... args );
 }
diff --git a/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/logging/MessageUtils.java b/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/logging/MessageUtils.java
index 409f855..0a67bb1 100644
--- a/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/logging/MessageUtils.java
+++ b/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/logging/MessageUtils.java
@@ -97,27 +97,27 @@
      * Create a default message buffer.
      * @return a new buffer
      */
-    public static MessageBuffer buffer()
+    public static MessageBuilder buffer()
     {
-        return JANSI ? new AnsiMessageBuffer() : new PlainMessageBuffer();
+        return JANSI ? new AnsiMessageBuilder() : new PlainMessageBuilder();
     }
 
     /**
      * Create a message buffer with defined String builder.
      * @return a new buffer
      */
-    public static MessageBuffer buffer( StringBuilder builder )
+    public static MessageBuilder buffer( StringBuilder builder )
     {
-        return JANSI ? new AnsiMessageBuffer( builder ) : new PlainMessageBuffer( builder );
+        return JANSI ? new AnsiMessageBuilder( builder ) : new PlainMessageBuilder( builder );
     }
 
     /**
      * Create a message buffer with an internal buffer of defined size.
      * @return a new buffer
      */
-    public static MessageBuffer buffer( int size )
+    public static MessageBuilder buffer( int size )
     {
-        return JANSI ? new AnsiMessageBuffer( size ) : new PlainMessageBuffer( size );
+        return JANSI ? new AnsiMessageBuilder( size ) : new PlainMessageBuilder( size );
     }
 
     /**
diff --git a/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/logging/PlainMessageBuffer.java b/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/logging/PlainMessageBuilder.java
similarity index 63%
rename from maven-shared-utils/src/main/java/org/apache/maven/shared/utils/logging/PlainMessageBuffer.java
rename to maven-shared-utils/src/main/java/org/apache/maven/shared/utils/logging/PlainMessageBuilder.java
index b84776a..e60a762 100644
--- a/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/logging/PlainMessageBuffer.java
+++ b/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/logging/PlainMessageBuilder.java
@@ -20,110 +20,110 @@
  */
 
 /**
- * Message buffer implementation that just ignores styling, for Maven version earlier than 3.4.0.
+ * Message builder implementation that just ignores styling, for Maven version earlier than 3.4.0.
  */
-class PlainMessageBuffer
-    implements MessageBuffer
+class PlainMessageBuilder
+    implements MessageBuilder
 {
     private StringBuilder buffer;
 
-    PlainMessageBuffer()
+    PlainMessageBuilder()
     {
         buffer = new StringBuilder();
     }
 
-    PlainMessageBuffer( StringBuilder builder )
+    PlainMessageBuilder( StringBuilder builder )
     {
         buffer = builder;
     }
 
-    PlainMessageBuffer( int size )
+    PlainMessageBuilder( int size )
     {
         buffer = new StringBuilder( size );
     }
 
-    public PlainMessageBuffer debug( Object message )
+    public PlainMessageBuilder debug( Object message )
     {
         return a( message );
     }
     
-    public PlainMessageBuffer info( Object message )
+    public PlainMessageBuilder info( Object message )
     {
         return a( message );
     }
     
-    public PlainMessageBuffer warning( Object message )
+    public PlainMessageBuilder warning( Object message )
     {
         return a( message );
     }
     
-    public PlainMessageBuffer error( Object message )
+    public PlainMessageBuilder error( Object message )
     {
         return a( message );
     }
 
-    public PlainMessageBuffer success( Object message )
+    public PlainMessageBuilder success( Object message )
     {
         return a( message );
     }
 
-    public PlainMessageBuffer failure( Object message )
+    public PlainMessageBuilder failure( Object message )
     {
         return a( message );
     }
 
-    public PlainMessageBuffer strong( Object message )
+    public PlainMessageBuilder strong( Object message )
     {
         return a( message );
     }
 
-    public PlainMessageBuffer mojo( Object message )
+    public PlainMessageBuilder mojo( Object message )
     {
         return a( message );
     }
 
-    public PlainMessageBuffer project( Object message )
+    public PlainMessageBuilder project( Object message )
     {
         return a( message );
     }
 
-    public PlainMessageBuffer a( char[] value, int offset, int len )
+    public PlainMessageBuilder a( char[] value, int offset, int len )
     {
         buffer.append( value, offset, len );
         return this;
     }
 
-    public PlainMessageBuffer a( char[] value )
+    public PlainMessageBuilder a( char[] value )
     {
         buffer.append( value );
         return this;
     }
 
-    public PlainMessageBuffer a( CharSequence value, int start, int end )
+    public PlainMessageBuilder a( CharSequence value, int start, int end )
     {
         buffer.append( value, start, end );
         return this;
     }
 
-    public PlainMessageBuffer a( CharSequence value )
+    public PlainMessageBuilder a( CharSequence value )
     {
         buffer.append( value );
         return this;
     }
 
-    public PlainMessageBuffer a( Object value )
+    public PlainMessageBuilder a( Object value )
     {
         buffer.append( value );
         return this;
     }
 
-    public PlainMessageBuffer newline()
+    public PlainMessageBuilder newline()
     {
         buffer.append( System.getProperty( "line.separator" ) );
         return this;
     }
 
-    public PlainMessageBuffer format( String pattern, Object... args )
+    public PlainMessageBuilder format( String pattern, Object... args )
     {
         buffer.append( String.format( pattern, args ) );
         return this;
diff --git a/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/logging/package-info.java b/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/logging/package-info.java
index 6f1288f..2ff1c66 100644
--- a/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/logging/package-info.java
+++ b/maven-shared-utils/src/main/java/org/apache/maven/shared/utils/logging/package-info.java
@@ -21,7 +21,7 @@
  * An API to write Maven messages to console with styled color content, consistently across whole
  * Maven ecosystem (Maven itself or any plugin or extension). 
  * <p>
- * Messages are built with instances of {@link org.apache.maven.shared.utils.logging.MessageBuffer MessageBuffer}
+ * Messages are built with instances of {@link org.apache.maven.shared.utils.logging.MessageBuilder MessageBuilder}
  * which provides a fluent API.
  * {@link org.apache.maven.shared.utils.logging.MessageUtils MessageUtils} gives access to these buffers.
  * <p>
diff --git a/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/logging/AnsiMessageBufferTest.java b/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/logging/AnsiMessageBufferTest.java
deleted file mode 100644
index 55a436a..0000000
--- a/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/logging/AnsiMessageBufferTest.java
+++ /dev/null
@@ -1,111 +0,0 @@
-package org.apache.maven.shared.utils.logging;
-
-/*
- * 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.junit.Before;
-import org.junit.Test;
-
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.junit.Assert.assertThat;
-
-public class AnsiMessageBufferTest
-{
-
-    private AnsiMessageBuffer ansiMessageBuffer;
-
-    @Before
-    public void initializeAnsiMessageBuffer()
-    {
-        this.ansiMessageBuffer = new AnsiMessageBuffer();
-    }
-
-    @Test
-    public void should_color_debug()
-    {
-        ansiMessageBuffer.debug( "a debug message" );
-
-        assertThat( ansiMessageBuffer.toString(), equalTo( "\u001B[1;36ma debug message\u001B[m" ) );
-    }
-
-    @Test
-    public void should_color_info()
-    {
-        ansiMessageBuffer.info( "an info message" );
-
-        assertThat( ansiMessageBuffer.toString(), equalTo( "\u001B[1;34man info message\u001B[m" ) );
-    }
-
-    @Test
-    public void should_color_warning_and_reset()
-    {
-        ansiMessageBuffer.warning( "a warning message" );
-
-        assertThat( ansiMessageBuffer.toString(), equalTo( "\u001B[1;33ma warning message\u001B[m" ) );
-    }
-
-    @Test
-    public void should_color_error()
-    {
-        ansiMessageBuffer.error( "an error message" );
-
-        assertThat( ansiMessageBuffer.toString(), equalTo( "\u001B[1;31man error message\u001B[m" ) );
-    }
-
-    @Test
-    public void should_color_success_with_message()
-    {
-        ansiMessageBuffer.success( "a success message" );
-
-        assertThat( ansiMessageBuffer.toString(), equalTo( "\u001B[1;32ma success message\u001B[m" ) );
-    }
-
-    @Test
-    public void should_color_failure_and_reset()
-    {
-        ansiMessageBuffer.failure( "a failure message" );
-
-        assertThat( ansiMessageBuffer.toString(), equalTo( "\u001B[1;31ma failure message\u001B[m" ) );
-    }
-
-    @Test
-    public void should_color_strong_and_reset()
-    {
-        ansiMessageBuffer.strong( "a strong message" );
-
-        assertThat( ansiMessageBuffer.toString(), equalTo( "\u001B[1ma strong message\u001B[m" ) );
-    }
-
-    @Test
-    public void should_color_mojo_and_reset()
-    {
-        ansiMessageBuffer.mojo( "a mojo" );
-
-        assertThat( ansiMessageBuffer.toString(), equalTo( "\u001B[32ma mojo\u001B[m" ) );
-    }
-
-    @Test
-    public void should_color_project_and_reset()
-    {
-        ansiMessageBuffer.project( "a project" );
-
-        assertThat( ansiMessageBuffer.toString(), equalTo( "\u001B[36ma project\u001B[m" ) );
-    }
-
-}
diff --git a/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/logging/AnsiMessageBuilderTest.java b/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/logging/AnsiMessageBuilderTest.java
new file mode 100644
index 0000000..d1ae7ea
--- /dev/null
+++ b/maven-shared-utils/src/test/java/org/apache/maven/shared/utils/logging/AnsiMessageBuilderTest.java
@@ -0,0 +1,111 @@
+package org.apache.maven.shared.utils.logging;
+
+/*
+ * 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.junit.Before;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertThat;
+
+public class AnsiMessageBuilderTest
+{
+
+    private AnsiMessageBuilder ansiMessageBuilder;
+
+    @Before
+    public void initializeAnsiMessageBuffer()
+    {
+        this.ansiMessageBuilder = new AnsiMessageBuilder();
+    }
+
+    @Test
+    public void should_color_debug()
+    {
+        ansiMessageBuilder.debug( "a debug message" );
+
+        assertThat( ansiMessageBuilder.toString(), equalTo( "\u001B[1;36ma debug message\u001B[m" ) );
+    }
+
+    @Test
+    public void should_color_info()
+    {
+        ansiMessageBuilder.info( "an info message" );
+
+        assertThat( ansiMessageBuilder.toString(), equalTo( "\u001B[1;34man info message\u001B[m" ) );
+    }
+
+    @Test
+    public void should_color_warning_and_reset()
+    {
+        ansiMessageBuilder.warning( "a warning message" );
+
+        assertThat( ansiMessageBuilder.toString(), equalTo( "\u001B[1;33ma warning message\u001B[m" ) );
+    }
+
+    @Test
+    public void should_color_error()
+    {
+        ansiMessageBuilder.error( "an error message" );
+
+        assertThat( ansiMessageBuilder.toString(), equalTo( "\u001B[1;31man error message\u001B[m" ) );
+    }
+
+    @Test
+    public void should_color_success_with_message()
+    {
+        ansiMessageBuilder.success( "a success message" );
+
+        assertThat( ansiMessageBuilder.toString(), equalTo( "\u001B[1;32ma success message\u001B[m" ) );
+    }
+
+    @Test
+    public void should_color_failure_and_reset()
+    {
+        ansiMessageBuilder.failure( "a failure message" );
+
+        assertThat( ansiMessageBuilder.toString(), equalTo( "\u001B[1;31ma failure message\u001B[m" ) );
+    }
+
+    @Test
+    public void should_color_strong_and_reset()
+    {
+        ansiMessageBuilder.strong( "a strong message" );
+
+        assertThat( ansiMessageBuilder.toString(), equalTo( "\u001B[1ma strong message\u001B[m" ) );
+    }
+
+    @Test
+    public void should_color_mojo_and_reset()
+    {
+        ansiMessageBuilder.mojo( "a mojo" );
+
+        assertThat( ansiMessageBuilder.toString(), equalTo( "\u001B[32ma mojo\u001B[m" ) );
+    }
+
+    @Test
+    public void should_color_project_and_reset()
+    {
+        ansiMessageBuilder.project( "a project" );
+
+        assertThat( ansiMessageBuilder.toString(), equalTo( "\u001B[36ma project\u001B[m" ) );
+    }
+
+}
