[maven-release-plugin]  copy for tag log4j-2.0-beta4

git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/log4j2/tags/log4j-2.0-beta4@1439285 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index f6099d0..a784a68 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -22,6 +22,7 @@
 o Added Flume Appender samples. 
 
 Fixed Bugs:
+o LOG4J2-156:  LocalizedMessageTest fails on linux system. Thanks to Andreas Born. 
 o LOG4J2-152:  RollingFileAppender's FileRenameAction was throwing a NullPointerException if no directory was specified
         on the target file name. Thanks to Remko Popma. 
 o LOG4J2-150:  Convert all System.getProperty calls to use PropertiesUtil to suppress SecurityExceptions. 
diff --git a/api/src/main/java/org/apache/logging/log4j/message/StructuredDataId.java b/api/src/main/java/org/apache/logging/log4j/message/StructuredDataId.java
index c7a6977..9c3f1b8 100644
--- a/api/src/main/java/org/apache/logging/log4j/message/StructuredDataId.java
+++ b/api/src/main/java/org/apache/logging/log4j/message/StructuredDataId.java
@@ -57,7 +57,8 @@
         int index = -1;
         if (name != null) {
             if (name.length() > MAX_LENGTH) {
-                throw new IllegalArgumentException("Length of id exceeds maximum of 32 characters: " + name);
+                throw new IllegalArgumentException(String.format("Length of id %s exceeds maximum of %d characters",
+                        MAX_LENGTH, name));
             }
             index = name.indexOf("@");
         }
diff --git a/api/src/test/java/org/apache/logging/log4j/message/LocalizedMessageTest.java b/api/src/test/java/org/apache/logging/log4j/message/LocalizedMessageTest.java
index d1b030e..8d1c67e 100644
--- a/api/src/test/java/org/apache/logging/log4j/message/LocalizedMessageTest.java
+++ b/api/src/test/java/org/apache/logging/log4j/message/LocalizedMessageTest.java
@@ -33,7 +33,7 @@
 
     @Test
     public void testMessageFormat() {
-        final LocalizedMessage msg = new LocalizedMessage("MF", new Locale("en_US"), "msg1", new Object[] {"1", "Test"});
+        final LocalizedMessage msg = new LocalizedMessage("MF", new Locale("en", "US"), "msg1", new Object[] {"1", "Test"});
         final String result = msg.getFormattedMessage();
         final String expected = "This is test number 1 with string argument Test.";
         assertTrue(expected.equals(result));
@@ -42,7 +42,7 @@
 
     @Test
     public void testStringFormat() {
-        final LocalizedMessage msg = new LocalizedMessage("SF", new Locale("en_US"), "msg1", new Object[] {"1", "Test"});
+        final LocalizedMessage msg = new LocalizedMessage("SF", new Locale("en", "US"), "msg1", new Object[] {"1", "Test"});
         final String result = msg.getFormattedMessage();
         final String expected = "This is test number 1 with string argument Test.";
         assertTrue(expected.equals(result));
diff --git a/core/src/main/java/org/apache/logging/log4j/core/Logger.java b/core/src/main/java/org/apache/logging/log4j/core/Logger.java
index 2185629..429f4c2 100644
--- a/core/src/main/java/org/apache/logging/log4j/core/Logger.java
+++ b/core/src/main/java/org/apache/logging/log4j/core/Logger.java
@@ -16,6 +16,11 @@
  */
 package org.apache.logging.log4j.core;
 
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
 import org.apache.logging.log4j.core.config.Configuration;
@@ -26,11 +31,6 @@
 import org.apache.logging.log4j.message.SimpleMessage;
 import org.apache.logging.log4j.spi.AbstractLogger;
 
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
 /**
  * @doubt All the isEnabled methods could be pushed into a filter interface.  Not sure of the utility of having
  * isEnabled be able to examine the message pattern and parameters. (RG) Moving the isEnabled methods out of
@@ -137,7 +137,7 @@
      * This method is not exposed through the public API and is used primarily for unit testing.
      * @param appender The Appender to add to the Logger.
      */
-    public void addAppender(final Appender appender) {
+    public void addAppender(final Appender<?> appender) {
         config.config.addLoggerAppender(this, appender);
     }
 
@@ -145,7 +145,7 @@
      * This method is not exposed through the public API and is used primarily for unit testing.
      * @param appender The Appender to remove from the Logger.
      */
-    public void removeAppender(final Appender appender) {
+    public void removeAppender(final Appender<?> appender) {
         config.loggerConfig.removeAppender(appender.getName());
     }
 
@@ -153,7 +153,7 @@
      * This method is not exposed through the public API and is used primarily for unit testing.
      * @return A Map containing the Appender's name as the key and the Appender as the value.
      */
-    public Map<String, Appender> getAppenders() {
+    public Map<String, Appender<?>> getAppenders() {
          return config.loggerConfig.getAppenders();
     }
 
diff --git a/core/src/main/java/org/apache/logging/log4j/core/appender/AsynchAppender.java b/core/src/main/java/org/apache/logging/log4j/core/appender/AsynchAppender.java
index 9d43818..73f8ab2 100644
--- a/core/src/main/java/org/apache/logging/log4j/core/appender/AsynchAppender.java
+++ b/core/src/main/java/org/apache/logging/log4j/core/appender/AsynchAppender.java
@@ -72,7 +72,7 @@
 
     @Override
     public void start() {
-        final Map<String, Appender> map = config.getAppenders();
+        final Map<String, Appender<?>> map = config.getAppenders();
         final List<AppenderControl> appenders = new ArrayList<AppenderControl>();
         for (final AppenderRef appenderRef : appenderRefs) {
             if (map.containsKey(appenderRef.getRef())) {
diff --git a/core/src/main/java/org/apache/logging/log4j/core/appender/FailoverAppender.java b/core/src/main/java/org/apache/logging/log4j/core/appender/FailoverAppender.java
index a12b0a9..200942b 100644
--- a/core/src/main/java/org/apache/logging/log4j/core/appender/FailoverAppender.java
+++ b/core/src/main/java/org/apache/logging/log4j/core/appender/FailoverAppender.java
@@ -71,7 +71,7 @@
 
     @Override
     public void start() {
-        final Map<String, Appender> map = config.getAppenders();
+        final Map<String, Appender<?>> map = config.getAppenders();
         int errors = 0;
         if (map.containsKey(primaryRef)) {
             primary = new AppenderControl(map.get(primaryRef), null, null);
diff --git a/core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/RewriteAppender.java b/core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/RewriteAppender.java
index 554b050..ebe9734 100644
--- a/core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/RewriteAppender.java
+++ b/core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/RewriteAppender.java
@@ -54,7 +54,7 @@
 
     @Override
     public void start() {
-        final Map<String, Appender> map = config.getAppenders();
+        final Map<String, Appender<?>> map = config.getAppenders();
         for (final AppenderRef ref : appenderRefs) {
             final String name = ref.getRef();
             final Appender appender = map.get(name);
diff --git a/core/src/main/java/org/apache/logging/log4j/core/appender/routing/RoutingAppender.java b/core/src/main/java/org/apache/logging/log4j/core/appender/routing/RoutingAppender.java
index a670dde..1a7b6af 100644
--- a/core/src/main/java/org/apache/logging/log4j/core/appender/routing/RoutingAppender.java
+++ b/core/src/main/java/org/apache/logging/log4j/core/appender/routing/RoutingAppender.java
@@ -72,7 +72,7 @@
 
     @Override
     public void start() {
-        final Map<String, Appender> map = config.getAppenders();
+        final Map<String, Appender<?>> map = config.getAppenders();
         // Register all the static routes.
         for (final Route route : routes.getRoutes()) {
             if (route.getAppenderRef() != null) {
@@ -91,7 +91,7 @@
     @Override
     public void stop() {
         super.stop();
-        final Map<String, Appender> map = config.getAppenders();
+        final Map<String, Appender<?>> map = config.getAppenders();
         for (final Map.Entry<String, AppenderControl> entry : appenders.entrySet()) {
             final String name = entry.getValue().getAppender().getName();
             if (!map.containsKey(name)) {
diff --git a/core/src/main/java/org/apache/logging/log4j/core/config/BaseConfiguration.java b/core/src/main/java/org/apache/logging/log4j/core/config/BaseConfiguration.java
index aa6dc3d..f6cf6f0 100644
--- a/core/src/main/java/org/apache/logging/log4j/core/config/BaseConfiguration.java
+++ b/core/src/main/java/org/apache/logging/log4j/core/config/BaseConfiguration.java
@@ -85,7 +85,7 @@
 
     private String name;
 
-    private ConcurrentMap<String, Appender> appenders = new ConcurrentHashMap<String, Appender>();
+    private ConcurrentMap<String, Appender<?>> appenders = new ConcurrentHashMap<String, Appender<?>>();
 
     private ConcurrentMap<String, LoggerConfig> loggers = new ConcurrentHashMap<String, LoggerConfig>();
 
@@ -176,7 +176,7 @@
                 subst.setVariableResolver(new Interpolator(lookup));
             }
             if (child.getName().equalsIgnoreCase("appenders")) {
-                appenders = (ConcurrentMap<String, Appender>) child.getObject();
+                appenders = (ConcurrentMap<String, Appender<?>>) child.getObject();
             } else if (child.getObject() instanceof Filter) {
                 addFilter((Filter) child.getObject());
             } else if (child.getName().equalsIgnoreCase("loggers")) {
@@ -283,9 +283,9 @@
 
     /**
      * Returns a Map containing all the Appenders and their name.
-     * @return A Map containing each Appender's naem and the Appender object.
+     * @return A Map containing each Appender's name and the Appender object.
      */
-    public Map<String, Appender> getAppenders() {
+    public Map<String, Appender<?>> getAppenders() {
         return appenders;
     }
 
diff --git a/core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java b/core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java
index 0cdde27..057747a 100644
--- a/core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java
+++ b/core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java
@@ -49,13 +49,13 @@
 
     /**
      * Returns a Map containing all the Appenders and their name.
-     * @return A Map containing each Appender's naem and the Appender object.
+     * @return A Map containing each Appender's name and the Appender object.
      */
-    Map<String, Appender> getAppenders();
+    Map<String, Appender<?>> getAppenders();
 
     Map<String, LoggerConfig> getLoggers();
 
-    void addLoggerAppender(Logger logger, Appender appender);
+    void addLoggerAppender(Logger logger, Appender<?> appender);
 
     void addLoggerFilter(Logger logger, Filter filter);
 
diff --git a/core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java b/core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java
index dd4aea9..2a666fe 100644
--- a/core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java
+++ b/core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java
@@ -56,7 +56,7 @@
     private static final long WAIT_TIME = 1000;
 
     private List<AppenderRef> appenderRefs = new ArrayList<AppenderRef>();
-    private final Map<String, AppenderControl> appenders = new ConcurrentHashMap<String, AppenderControl>();
+    private final Map<String, AppenderControl<?>> appenders = new ConcurrentHashMap<String, AppenderControl<?>>();
     private final String name;
     private LogEventFactory logEventFactory;
     private Level level;
@@ -168,9 +168,9 @@
      * Returns all Appenders as a Map.
      * @return a Map with the Appender name as the key and the Appender as the value.
      */
-    public Map<String, Appender> getAppenders() {
-        final Map<String, Appender> map = new HashMap<String, Appender>();
-        for (final Map.Entry<String, AppenderControl> entry : appenders.entrySet()) {
+    public Map<String, Appender<?>> getAppenders() {
+        final Map<String, Appender<?>> map = new HashMap<String, Appender<?>>();
+        for (final Map.Entry<String, AppenderControl<?>> entry : appenders.entrySet()) {
             map.put(entry.getKey(), entry.getValue().getAppender());
         }
         return map;
@@ -181,10 +181,10 @@
      */
     protected void clearAppenders() {
         waitForCompletion();
-        final Collection<AppenderControl> controls = appenders.values();
-        final Iterator<AppenderControl> iterator = controls.iterator();
+        final Collection<AppenderControl<?>> controls = appenders.values();
+        final Iterator<AppenderControl<?>> iterator = controls.iterator();
         while (iterator.hasNext()) {
-            final AppenderControl ctl = iterator.next();
+            final AppenderControl<?> ctl = iterator.next();
             iterator.remove();
             cleanupFilter(ctl);
         }
diff --git a/core/src/test/java/org/apache/logging/log4j/core/AppenderRefLevelTest.java b/core/src/test/java/org/apache/logging/log4j/core/AppenderRefLevelTest.java
index dbe33dc..a1897f8 100644
--- a/core/src/test/java/org/apache/logging/log4j/core/AppenderRefLevelTest.java
+++ b/core/src/test/java/org/apache/logging/log4j/core/AppenderRefLevelTest.java
@@ -49,7 +49,7 @@
         System.setProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY, CONFIG);
         ctx = (LoggerContext) LogManager.getContext(false);
         config = ctx.getConfiguration();
-        for (final Map.Entry<String, Appender> entry : config.getAppenders().entrySet()) {
+        for (final Map.Entry<String, Appender<?>> entry : config.getAppenders().entrySet()) {
             if (entry.getKey().equals("LIST1")) {
                 app1 = (ListAppender) entry.getValue();
             } else if (entry.getKey().equals("LIST2")) {
diff --git a/core/src/test/java/org/apache/logging/log4j/core/FileConfigTest.java b/core/src/test/java/org/apache/logging/log4j/core/FileConfigTest.java
index a01ec42..7dd21b8 100644
--- a/core/src/test/java/org/apache/logging/log4j/core/FileConfigTest.java
+++ b/core/src/test/java/org/apache/logging/log4j/core/FileConfigTest.java
@@ -60,7 +60,7 @@
     @Before
     public void before() {
         config = ctx.getConfiguration();
-        for (final Map.Entry<String, Appender> entry : config.getAppenders().entrySet()) {
+        for (final Map.Entry<String, Appender<?>> entry : config.getAppenders().entrySet()) {
             if (entry.getKey().equals("List")) {
                 app = (ListAppender) entry.getValue();
                 break;
diff --git a/core/src/test/java/org/apache/logging/log4j/core/LoggerTest.java b/core/src/test/java/org/apache/logging/log4j/core/LoggerTest.java
index e091a1c..11764d4 100644
--- a/core/src/test/java/org/apache/logging/log4j/core/LoggerTest.java
+++ b/core/src/test/java/org/apache/logging/log4j/core/LoggerTest.java
@@ -72,7 +72,7 @@
     @Before
     public void before() {
         config = ctx.getConfiguration();
-        for (final Map.Entry<String, Appender> entry : config.getAppenders().entrySet()) {
+        for (final Map.Entry<String, Appender<?>> entry : config.getAppenders().entrySet()) {
             if (entry.getKey().equals("List")) {
                 app = (ListAppender) entry.getValue();
             } else if (entry.getKey().equals("HostTest")) {
diff --git a/core/src/test/java/org/apache/logging/log4j/core/StrictXMLConfigTest.java b/core/src/test/java/org/apache/logging/log4j/core/StrictXMLConfigTest.java
index 9828041..6c58a28 100644
--- a/core/src/test/java/org/apache/logging/log4j/core/StrictXMLConfigTest.java
+++ b/core/src/test/java/org/apache/logging/log4j/core/StrictXMLConfigTest.java
@@ -50,7 +50,7 @@
         System.setProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY, CONFIG);
         ctx = (LoggerContext) LogManager.getContext(false);
         config = ctx.getConfiguration();
-        for (final Map.Entry<String, Appender> entry : config.getAppenders().entrySet()) {
+        for (final Map.Entry<String, Appender<?>> entry : config.getAppenders().entrySet()) {
             if (entry.getKey().equals("List")) {
                 app = (ListAppender) entry.getValue();
                 break;
diff --git a/core/src/test/java/org/apache/logging/log4j/core/appender/AsynchAppenderTest.java b/core/src/test/java/org/apache/logging/log4j/core/appender/AsynchAppenderTest.java
index 1042fa3..4c57fa0 100644
--- a/core/src/test/java/org/apache/logging/log4j/core/appender/AsynchAppenderTest.java
+++ b/core/src/test/java/org/apache/logging/log4j/core/appender/AsynchAppenderTest.java
@@ -49,7 +49,7 @@
         System.setProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY, CONFIG);
         ctx = (LoggerContext) LogManager.getContext(false);
         config = ctx.getConfiguration();
-        for (final Map.Entry<String, Appender> entry : config.getAppenders().entrySet()) {
+        for (final Map.Entry<String, Appender<?>> entry : config.getAppenders().entrySet()) {
             if (entry.getKey().equals("List")) {
                 app = (ListAppender) entry.getValue();
                 break;
diff --git a/core/src/test/java/org/apache/logging/log4j/core/appender/FailoverAppenderTest.java b/core/src/test/java/org/apache/logging/log4j/core/appender/FailoverAppenderTest.java
index e7cf77a..efac36e 100644
--- a/core/src/test/java/org/apache/logging/log4j/core/appender/FailoverAppenderTest.java
+++ b/core/src/test/java/org/apache/logging/log4j/core/appender/FailoverAppenderTest.java
@@ -50,7 +50,7 @@
         System.setProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY, CONFIG);
         ctx = (LoggerContext) LogManager.getContext(false);
         config = ctx.getConfiguration();
-        for (final Map.Entry<String, Appender> entry : config.getAppenders().entrySet()) {
+        for (final Map.Entry<String, Appender<?>> entry : config.getAppenders().entrySet()) {
             if (entry.getKey().equals("List")) {
                 app = (ListAppender) entry.getValue();
             } else if (entry.getKey().equals("Once")) {
diff --git a/core/src/test/java/org/apache/logging/log4j/core/appender/SocketAppenderTest.java b/core/src/test/java/org/apache/logging/log4j/core/appender/SocketAppenderTest.java
index 7658eb1..6872e8a 100644
--- a/core/src/test/java/org/apache/logging/log4j/core/appender/SocketAppenderTest.java
+++ b/core/src/test/java/org/apache/logging/log4j/core/appender/SocketAppenderTest.java
@@ -82,9 +82,9 @@
 
     @After
     public void teardown() {
-        final Map<String,Appender> map = root.getAppenders();
-        for (final Map.Entry<String, Appender> entry : map.entrySet()) {
-            final Appender app = entry.getValue();
+        final Map<String,Appender<?>> map = root.getAppenders();
+        for (final Map.Entry<String, Appender<?>> entry : map.entrySet()) {
+            final Appender<?> app = entry.getValue();
             root.removeAppender(app);
             app.stop();
         }
diff --git a/core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java b/core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java
index e375a6f..109b18f 100644
--- a/core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java
+++ b/core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java
@@ -85,9 +85,9 @@
 
     @After
     public void teardown() {
-        final Map<String,Appender> map = root.getAppenders();
-        for (final Map.Entry<String, Appender> entry : map.entrySet()) {
-            final Appender app = entry.getValue();
+        final Map<String,Appender<?>> map = root.getAppenders();
+        for (final Map.Entry<String, Appender<?>> entry : map.entrySet()) {
+            final Appender<?> app = entry.getValue();
             root.removeAppender(app);
             app.stop();
         }
diff --git a/core/src/test/java/org/apache/logging/log4j/core/appender/rewrite/RewriteAppenderTest.java b/core/src/test/java/org/apache/logging/log4j/core/appender/rewrite/RewriteAppenderTest.java
index 023163f..5fabe6e 100644
--- a/core/src/test/java/org/apache/logging/log4j/core/appender/rewrite/RewriteAppenderTest.java
+++ b/core/src/test/java/org/apache/logging/log4j/core/appender/rewrite/RewriteAppenderTest.java
@@ -56,7 +56,7 @@
         System.setProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY, CONFIG);
         ctx = (LoggerContext) LogManager.getContext(false);
         config = ctx.getConfiguration();
-        for (final Map.Entry<String, Appender> entry : config.getAppenders().entrySet()) {
+        for (final Map.Entry<String, Appender<?>> entry : config.getAppenders().entrySet()) {
             if (entry.getKey().equals("List")) {
                 app = (ListAppender) entry.getValue();
             } else if (entry.getKey().equals("List2")) {
diff --git a/core/src/test/java/org/apache/logging/log4j/core/appender/routing/JSONRoutingAppender2Test.java b/core/src/test/java/org/apache/logging/log4j/core/appender/routing/JSONRoutingAppender2Test.java
index d6cbdc8..bef69af 100644
--- a/core/src/test/java/org/apache/logging/log4j/core/appender/routing/JSONRoutingAppender2Test.java
+++ b/core/src/test/java/org/apache/logging/log4j/core/appender/routing/JSONRoutingAppender2Test.java
@@ -51,7 +51,7 @@
         System.setProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY, CONFIG);
         ctx = (LoggerContext) LogManager.getContext(false);
         config = ctx.getConfiguration();
-        for (final Map.Entry<String, Appender> entry : config.getAppenders().entrySet()) {
+        for (final Map.Entry<String, Appender<?>> entry : config.getAppenders().entrySet()) {
             if (entry.getKey().equals("List")) {
                 app = (ListAppender) entry.getValue();
                 break;
diff --git a/core/src/test/java/org/apache/logging/log4j/core/appender/routing/JSONRoutingAppenderTest.java b/core/src/test/java/org/apache/logging/log4j/core/appender/routing/JSONRoutingAppenderTest.java
index 622c5b5..6110595 100644
--- a/core/src/test/java/org/apache/logging/log4j/core/appender/routing/JSONRoutingAppenderTest.java
+++ b/core/src/test/java/org/apache/logging/log4j/core/appender/routing/JSONRoutingAppenderTest.java
@@ -51,7 +51,7 @@
         System.setProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY, CONFIG);
         ctx = (LoggerContext) LogManager.getContext(false);
         config = ctx.getConfiguration();
-        for (final Map.Entry<String, Appender> entry : config.getAppenders().entrySet()) {
+        for (final Map.Entry<String, Appender<?>> entry : config.getAppenders().entrySet()) {
             if (entry.getKey().equals("List")) {
                 app = (ListAppender) entry.getValue();
                 break;
diff --git a/core/src/test/java/org/apache/logging/log4j/core/appender/routing/RoutingAppenderTest.java b/core/src/test/java/org/apache/logging/log4j/core/appender/routing/RoutingAppenderTest.java
index 8fbbde1..3ecb3e4 100644
--- a/core/src/test/java/org/apache/logging/log4j/core/appender/routing/RoutingAppenderTest.java
+++ b/core/src/test/java/org/apache/logging/log4j/core/appender/routing/RoutingAppenderTest.java
@@ -51,7 +51,7 @@
         System.setProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY, CONFIG);
         ctx = (LoggerContext) LogManager.getContext(false);
         config = ctx.getConfiguration();
-        for (final Map.Entry<String, Appender> entry : config.getAppenders().entrySet()) {
+        for (final Map.Entry<String, Appender<?>> entry : config.getAppenders().entrySet()) {
             if (entry.getKey().equals("List")) {
                 app = (ListAppender) entry.getValue();
                 break;
diff --git a/core/src/test/java/org/apache/logging/log4j/core/config/TestConfigurator.java b/core/src/test/java/org/apache/logging/log4j/core/config/TestConfigurator.java
index 317f6d4..448a2b3 100644
--- a/core/src/test/java/org/apache/logging/log4j/core/config/TestConfigurator.java
+++ b/core/src/test/java/org/apache/logging/log4j/core/config/TestConfigurator.java
@@ -71,7 +71,7 @@
         assertNotNull("No configuration", config);
         assertTrue("Incorrect Configuration. Expected " + CONFIG_NAME + " but found " + config.getName(),
             CONFIG_NAME.equals(config.getName()));
-        final Map<String, Appender> map = config.getAppenders();
+        final Map<String, Appender<?>> map = config.getAppenders();
         assertNotNull("No Appenders", map != null && map.size() > 0);
         assertTrue("Wrong configuration", map.containsKey("List"));
         Configurator.shutdown(ctx);
@@ -91,7 +91,7 @@
         assertNotNull("No configuration", config);
         assertTrue("Incorrect Configuration. Expected " + CONFIG_NAME + " but found " + config.getName(),
             CONFIG_NAME.equals(config.getName()));
-        final Map<String, Appender> map = config.getAppenders();
+        final Map<String, Appender<?>> map = config.getAppenders();
         assertNotNull("No Appenders", map != null && map.size() > 0);
         assertTrue("Wrong configuration", map.containsKey("List"));
         Configurator.shutdown(ctx);
@@ -111,7 +111,7 @@
         assertNotNull("No configuration", config);
         assertTrue("Incorrect Configuration. Expected " + CONFIG_NAME + " but found " + config.getName(),
             CONFIG_NAME.equals(config.getName()));
-        final Map<String, Appender> map = config.getAppenders();
+        final Map<String, Appender<?>> map = config.getAppenders();
         assertNotNull("No Appenders", map != null && map.size() > 0);
         assertTrue("Wrong configuration", map.containsKey("List"));
         Configurator.shutdown(ctx);
@@ -128,7 +128,7 @@
         assertNotNull("No configuration", config);
         assertTrue("Incorrect Configuration. Expected " + CONFIG_NAME + " but found " + config.getName(),
             CONFIG_NAME.equals(config.getName()));
-        final Map<String, Appender> map = config.getAppenders();
+        final Map<String, Appender<?>> map = config.getAppenders();
         assertNotNull("No Appenders", map != null && map.size() > 0);
         assertTrue("Wrong configuration", map.containsKey("List"));
         Configurator.shutdown(ctx);
@@ -145,7 +145,7 @@
         assertNotNull("No configuration", config);
         assertTrue("Incorrect Configuration. Expected " + CONFIG_NAME + " but found " + config.getName(),
             CONFIG_NAME.equals(config.getName()));
-        final Map<String, Appender> map = config.getAppenders();
+        final Map<String, Appender<?>> map = config.getAppenders();
         assertNotNull("No Appenders", map != null && map.size() > 0);
         assertTrue("Wrong configuration", map.containsKey("List"));
         Configurator.shutdown(ctx);
@@ -164,7 +164,7 @@
         assertNotNull("No configuration", config);
         assertTrue("Incorrect Configuration. Expected " + CONFIG_NAME + " but found " + config.getName(),
             CONFIG_NAME.equals(config.getName()));
-        final Map<String, Appender> map = config.getAppenders();
+        final Map<String, Appender<?>> map = config.getAppenders();
         assertNotNull("No Appenders", map != null && map.size() > 0);
         assertTrue("Wrong configuration", map.containsKey("List"));
 
diff --git a/core/src/test/java/org/apache/logging/log4j/core/config/XMLConfigurationTest.java b/core/src/test/java/org/apache/logging/log4j/core/config/XMLConfigurationTest.java
index 9110648..0dea8c8 100644
--- a/core/src/test/java/org/apache/logging/log4j/core/config/XMLConfigurationTest.java
+++ b/core/src/test/java/org/apache/logging/log4j/core/config/XMLConfigurationTest.java
@@ -81,7 +81,7 @@
         final Iterator<Filter> iter = l.getFilters();
         final Filter filter = iter.next();
         assertTrue(filter instanceof ThreadContextMapFilter);
-        final Map<String, Appender> appenders = l.getAppenders();
+        final Map<String, Appender<?>> appenders = l.getAppenders();
         assertNotNull(appenders);
         assertTrue("number of appenders = " + appenders.size(), appenders.size() == 1);
         final Appender a = appenders.get("STDOUT");
@@ -92,7 +92,7 @@
     public void testConfiguredAppenders() {
         final LoggerContext ctx = (LoggerContext) LogManager.getContext();
         final Configuration c = ctx.getConfiguration();
-        final Map<String, Appender> apps = c.getAppenders();
+        final Map<String, Appender<?>> apps = c.getAppenders();
         assertNotNull(apps);
         assertEquals(apps.size(), 3);
     }
diff --git a/core/src/test/java/org/apache/logging/log4j/core/config/XMLLoggerPropsTest.java b/core/src/test/java/org/apache/logging/log4j/core/config/XMLLoggerPropsTest.java
index 720e0e1..6fdc7c4 100644
--- a/core/src/test/java/org/apache/logging/log4j/core/config/XMLLoggerPropsTest.java
+++ b/core/src/test/java/org/apache/logging/log4j/core/config/XMLLoggerPropsTest.java
@@ -48,7 +48,7 @@
         System.setProperty("test", "test");
         ctx = (LoggerContext) LogManager.getContext(false);
         config = ctx.getConfiguration();
-        for (final Map.Entry<String, Appender> entry : config.getAppenders().entrySet()) {
+        for (final Map.Entry<String, Appender<?>> entry : config.getAppenders().entrySet()) {
             if (entry.getKey().equals("List")) {
                 app = (ListAppender) entry.getValue();
                 break;
diff --git a/core/src/test/java/org/apache/logging/log4j/core/filter/BurstFilterTest.java b/core/src/test/java/org/apache/logging/log4j/core/filter/BurstFilterTest.java
index 2384d11..974e815 100644
--- a/core/src/test/java/org/apache/logging/log4j/core/filter/BurstFilterTest.java
+++ b/core/src/test/java/org/apache/logging/log4j/core/filter/BurstFilterTest.java
@@ -49,7 +49,7 @@
         System.setProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY, CONFIG);

         ctx = (LoggerContext) LogManager.getContext(false);

         config = ctx.getConfiguration();

-        for (final Map.Entry<String, Appender> entry : config.getAppenders().entrySet()) {

+        for (final Map.Entry<String, Appender<?>> entry : config.getAppenders().entrySet()) {

             if (entry.getKey().equals("ListAppender")) {

                 app = (ListAppender) entry.getValue();

                 filter = (BurstFilter) app.getFilter();

diff --git a/core/src/test/java/org/apache/logging/log4j/core/filter/MapFilterTest.java b/core/src/test/java/org/apache/logging/log4j/core/filter/MapFilterTest.java
index 0a0f590..5cd4a7a 100644
--- a/core/src/test/java/org/apache/logging/log4j/core/filter/MapFilterTest.java
+++ b/core/src/test/java/org/apache/logging/log4j/core/filter/MapFilterTest.java
@@ -96,7 +96,7 @@
         final Map<String, String> eventMap = new HashMap<String, String>();
         eventMap.put("eventId", "Login");
         logger.debug(new MapMessage(eventMap));
-        final Map<String,Appender> appenders = config.getAppenders();
+        final Map<String,Appender<?>> appenders = config.getAppenders();
         final Appender app = appenders.get("LIST");
         assertNotNull("No List appender", app);
         final List<String> msgs = ((ListAppender) app).getMessages();
diff --git a/core/src/test/java/org/apache/logging/log4j/core/net/JMSQueueAppenderTest.java b/core/src/test/java/org/apache/logging/log4j/core/net/JMSQueueAppenderTest.java
index f458549..8de4916 100644
--- a/core/src/test/java/org/apache/logging/log4j/core/net/JMSQueueAppenderTest.java
+++ b/core/src/test/java/org/apache/logging/log4j/core/net/JMSQueueAppenderTest.java
@@ -78,7 +78,7 @@
     public void testConfiguration() throws Exception {
         final LoggerContext ctx = (LoggerContext) LogManager.getContext();
         final Configuration config = ctx.getConfiguration();
-        final Map<String, Appender> appenders = config.getAppenders();
+        final Map<String, Appender<?>> appenders = config.getAppenders();
         assertTrue(appenders.containsKey("JMSQueue"));
     }
 }
diff --git a/core/src/test/java/org/apache/logging/log4j/core/net/JMSQueueFailoverTest.java b/core/src/test/java/org/apache/logging/log4j/core/net/JMSQueueFailoverTest.java
index 1bd3419..6695efb 100644
--- a/core/src/test/java/org/apache/logging/log4j/core/net/JMSQueueFailoverTest.java
+++ b/core/src/test/java/org/apache/logging/log4j/core/net/JMSQueueFailoverTest.java
@@ -78,7 +78,7 @@
     @Before
     public void before() {
         config = ctx.getConfiguration();
-        for (final Map.Entry<String, Appender> entry : config.getAppenders().entrySet()) {
+        for (final Map.Entry<String, Appender<?>> entry : config.getAppenders().entrySet()) {
             if (entry.getKey().equals("List")) {
                 app = (ListAppender) entry.getValue();
                 break;
diff --git a/core/src/test/java/org/apache/logging/log4j/core/net/JMSQueueTest.java b/core/src/test/java/org/apache/logging/log4j/core/net/JMSQueueTest.java
index b83d9f0..1fab864 100644
--- a/core/src/test/java/org/apache/logging/log4j/core/net/JMSQueueTest.java
+++ b/core/src/test/java/org/apache/logging/log4j/core/net/JMSQueueTest.java
@@ -83,9 +83,9 @@
 
     @After
     public void teardown() {
-        final Map<String,Appender> map = root.getAppenders();
-        for (final Map.Entry<String, Appender> entry : map.entrySet()) {
-            final Appender app = entry.getValue();
+        final Map<String,Appender<?>> map = root.getAppenders();
+        for (final Map.Entry<String, Appender<?>> entry : map.entrySet()) {
+            final Appender<?> app = entry.getValue();
             root.removeAppender(app);
             app.stop();
         }
diff --git a/core/src/test/java/org/apache/logging/log4j/core/net/JMSTopicFailoverTest.java b/core/src/test/java/org/apache/logging/log4j/core/net/JMSTopicFailoverTest.java
index 63c81a3..0a9e9f4 100644
--- a/core/src/test/java/org/apache/logging/log4j/core/net/JMSTopicFailoverTest.java
+++ b/core/src/test/java/org/apache/logging/log4j/core/net/JMSTopicFailoverTest.java
@@ -77,7 +77,7 @@
     @Before
     public void before() {
         config = ctx.getConfiguration();
-        for (final Map.Entry<String, Appender> entry : config.getAppenders().entrySet()) {
+        for (final Map.Entry<String, Appender<?>> entry : config.getAppenders().entrySet()) {
             if (entry.getKey().equals("List")) {
                 app = (ListAppender) entry.getValue();
                 break;
diff --git a/core/src/test/java/org/apache/logging/log4j/core/net/JMSTopicTest.java b/core/src/test/java/org/apache/logging/log4j/core/net/JMSTopicTest.java
index a03af18..a41187e 100644
--- a/core/src/test/java/org/apache/logging/log4j/core/net/JMSTopicTest.java
+++ b/core/src/test/java/org/apache/logging/log4j/core/net/JMSTopicTest.java
@@ -83,9 +83,9 @@
 
     @After
     public void teardown() {
-        final Map<String,Appender> map = root.getAppenders();
-        for (final Map.Entry<String, Appender> entry : map.entrySet()) {
-            final Appender app = entry.getValue();
+        final Map<String,Appender<?>> map = root.getAppenders();
+        for (final Map.Entry<String, Appender<?>> entry : map.entrySet()) {
+            final Appender<?> app = entry.getValue();
             root.removeAppender(app);
             app.stop();
         }
diff --git a/core/src/test/java/org/apache/logging/log4j/core/net/SocketServerTest.java b/core/src/test/java/org/apache/logging/log4j/core/net/SocketServerTest.java
index 459085b..91c2e0a 100644
--- a/core/src/test/java/org/apache/logging/log4j/core/net/SocketServerTest.java
+++ b/core/src/test/java/org/apache/logging/log4j/core/net/SocketServerTest.java
@@ -79,9 +79,9 @@
 
     @After
     public void teardown() {
-        final Map<String,Appender> map = root.getAppenders();
-        for (final Map.Entry<String, Appender> entry : map.entrySet()) {
-            final Appender app = entry.getValue();
+        final Map<String,Appender<?>> map = root.getAppenders();
+        for (final Map.Entry<String, Appender<?>> entry : map.entrySet()) {
+            final Appender<?> app = entry.getValue();
             root.removeAppender(app);
             app.stop();
         }
diff --git a/core/src/test/java/org/apache/logging/log4j/core/pattern/ExtendedThrowableTest.java b/core/src/test/java/org/apache/logging/log4j/core/pattern/ExtendedThrowableTest.java
index 5730b6a..a7b8906 100644
--- a/core/src/test/java/org/apache/logging/log4j/core/pattern/ExtendedThrowableTest.java
+++ b/core/src/test/java/org/apache/logging/log4j/core/pattern/ExtendedThrowableTest.java
@@ -46,7 +46,7 @@
         System.setProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY, CONFIG);
         ctx = (LoggerContext) LogManager.getContext(false);
         config = ctx.getConfiguration();
-        for (final Map.Entry<String, Appender> entry : config.getAppenders().entrySet()) {
+        for (final Map.Entry<String, Appender<?>> entry : config.getAppenders().entrySet()) {
             if (entry.getKey().equals("List")) {
                 app = (ListAppender) entry.getValue();
             }
diff --git a/core/src/test/java/org/apache/logging/log4j/core/pattern/RegexReplacementTest.java b/core/src/test/java/org/apache/logging/log4j/core/pattern/RegexReplacementTest.java
index 8fe2fe1..697471f 100644
--- a/core/src/test/java/org/apache/logging/log4j/core/pattern/RegexReplacementTest.java
+++ b/core/src/test/java/org/apache/logging/log4j/core/pattern/RegexReplacementTest.java
@@ -53,7 +53,7 @@
         System.setProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY, CONFIG);
         ctx = (LoggerContext) LogManager.getContext(false);
         config = ctx.getConfiguration();
-        for (final Map.Entry<String, Appender> entry : config.getAppenders().entrySet()) {
+        for (final Map.Entry<String, Appender<?>> entry : config.getAppenders().entrySet()) {
             if (entry.getKey().equals("List")) {
                 app = (ListAppender) entry.getValue();
             }
diff --git a/core/src/test/java/org/apache/logging/log4j/core/pattern/RootThrowableTest.java b/core/src/test/java/org/apache/logging/log4j/core/pattern/RootThrowableTest.java
index eecce6f..c19aa5f 100644
--- a/core/src/test/java/org/apache/logging/log4j/core/pattern/RootThrowableTest.java
+++ b/core/src/test/java/org/apache/logging/log4j/core/pattern/RootThrowableTest.java
@@ -47,7 +47,7 @@
         System.setProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY, CONFIG);
         ctx = (LoggerContext) LogManager.getContext(false);
         config = ctx.getConfiguration();
-        for (final Map.Entry<String, Appender> entry : config.getAppenders().entrySet()) {
+        for (final Map.Entry<String, Appender<?>> entry : config.getAppenders().entrySet()) {
             if (entry.getKey().equals("List")) {
                 app = (ListAppender) entry.getValue();
             }
diff --git a/core/src/test/java/org/apache/logging/log4j/core/pattern/StyleConverterTest.java b/core/src/test/java/org/apache/logging/log4j/core/pattern/StyleConverterTest.java
index 74a29b2..55cc4b5 100644
--- a/core/src/test/java/org/apache/logging/log4j/core/pattern/StyleConverterTest.java
+++ b/core/src/test/java/org/apache/logging/log4j/core/pattern/StyleConverterTest.java
@@ -53,7 +53,7 @@
         System.setProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY, CONFIG);
         ctx = (LoggerContext) LogManager.getContext(false);
         config = ctx.getConfiguration();
-        for (final Map.Entry<String, Appender> entry : config.getAppenders().entrySet()) {
+        for (final Map.Entry<String, Appender<?>> entry : config.getAppenders().entrySet()) {
             if (entry.getKey().equals("List")) {
                 app = (ListAppender) entry.getValue();
             }
diff --git a/flume-ng/pom.xml b/flume-ng/pom.xml
index e4644c1..f4010c0 100644
--- a/flume-ng/pom.xml
+++ b/flume-ng/pom.xml
@@ -32,7 +32,7 @@
     <log4jParentDir>${basedir}/..</log4jParentDir>
     <docLabel>Flume Documentation</docLabel>
     <projectDir>/flume-ng</projectDir>
-    <flumeVersion>1.3.1</flumeVersion>
+    <flumeVersion>1.2.0</flumeVersion>
   </properties>
   <dependencies>
     <dependency>
diff --git a/flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAvroManager.java b/flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAvroManager.java
index 9b5f7e5..c792898 100644
--- a/flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAvroManager.java
+++ b/flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAvroManager.java
@@ -132,11 +132,11 @@
         String msg = "No Flume agents are available";
         if (client != null) {
             final AvroFlumeEvent avroEvent = new AvroFlumeEvent();
-            avroEvent.body = ByteBuffer.wrap(event.getBody());
-            avroEvent.headers = new HashMap<CharSequence, CharSequence>();
+            avroEvent.setBody(ByteBuffer.wrap(event.getBody()));
+            avroEvent.setHeaders(new HashMap<CharSequence, CharSequence>());
 
             for (final Map.Entry<String, String> entry : event.getHeaders().entrySet()) {
-                avroEvent.headers.put(entry.getKey(), entry.getValue());
+                avroEvent.getHeaders().put(entry.getKey(), entry.getValue());
             }
 
             final List<AvroFlumeEvent> batch = batchSize > 1 ? events.addAndGet(avroEvent, batchSize) : null;
diff --git a/flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeConfigurationBuilder.java b/flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeConfigurationBuilder.java
index 874d241..abd572b 100644
--- a/flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeConfigurationBuilder.java
+++ b/flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeConfigurationBuilder.java
@@ -111,7 +111,7 @@
             loadSources(agentConf, conf);
             loadSinks(agentConf, conf);
 
-            configurationAware.startAllComponents(conf);
+            //configurationAware.startAllComponents(conf);
         } else {
             LOGGER.warn("No configuration found for: {}", name);
         }
diff --git a/flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeEmbeddedManager.java b/flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeEmbeddedManager.java
index 5b02c01..512c51a 100644
--- a/flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeEmbeddedManager.java
+++ b/flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeEmbeddedManager.java
@@ -17,15 +17,13 @@
 package org.apache.logging.log4j.flume.appender;
 
 import org.apache.flume.SourceRunner;
-import org.apache.flume.lifecycle.LifecycleController;
-import org.apache.flume.lifecycle.LifecycleState;
 import org.apache.flume.node.NodeConfiguration;
 import org.apache.flume.node.nodemanager.DefaultLogicalNodeManager;
 import org.apache.logging.log4j.core.appender.ManagerFactory;
 import org.apache.logging.log4j.core.config.ConfigurationException;
 import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.helpers.Constants;
 import org.apache.logging.log4j.core.helpers.NameUtil;
+import org.apache.logging.log4j.util.PropertiesUtil;
 
 import java.util.Locale;
 import java.util.Properties;
@@ -40,6 +38,10 @@
 
     private static ManagerFactory factory = new FlumeManagerFactory();
 
+    private static final String FiLE_SEP = PropertiesUtil.getProperties().getStringProperty("file.separator");
+
+    private static final String IN_MEMORY = "InMemory";
+
     private final FlumeNode node;
 
     private NodeConfiguration conf;
@@ -173,10 +175,9 @@
                 final FlumeConfigurationBuilder builder = new FlumeConfigurationBuilder();
                 final NodeConfiguration conf = builder.load(data.name, props, nodeManager);
 
-                final FlumeNode node = new FlumeNode(nodeManager, conf);
+                final FlumeNode node = new FlumeNode(nodeManager, nodeManager, conf);
 
                 node.start();
-                LifecycleController.waitForOneOf(node, LifecycleState.START_OR_ERROR);
 
                 return new FlumeEmbeddedManager(name, data.name, node);
             } catch (final Exception ex) {
@@ -202,15 +203,26 @@
             if (agents != null && agents.length > 0) {
                 props.put(name + ".sources", FlumeEmbeddedManager.SOURCE_NAME);
                 props.put(name + ".sources." + FlumeEmbeddedManager.SOURCE_NAME + ".type", SOURCE_TYPE);
-                props.put(name + ".channels", "file");
-                props.put(name + ".channels.file.type", "file");
+
                 if (dataDir != null && dataDir.length() > 0) {
-                    if (!dataDir.endsWith(Constants.LINE_SEP)) {
-                        dataDir = dataDir + Constants.LINE_SEP;
+                    if (dataDir.equals(IN_MEMORY)) {
+                        props.put(name + ".channels", "primary");
+                        props.put(name + ".channels.primary.type", "memory");
+                    } else {
+                        props.put(name + ".channels", "primary");
+                        props.put(name + ".channels.primary.type", "file");
+
+                        if (!dataDir.endsWith(FiLE_SEP)) {
+                            dataDir = dataDir + FiLE_SEP;
+                        }
+
+                        props.put(name + ".channels.primary.checkpointDir", dataDir + "checkpoint");
+                        props.put(name + ".channels.primary.dataDirs", dataDir + "data");
                     }
 
-                    props.put(name + ".channels.file.checkpointDir", dataDir + "checkpoint");
-                    props.put(name + ".channels.file.dataDirs", dataDir + "data");
+                } else {
+                    props.put(name + ".channels", "primary");
+                    props.put(name + ".channels.primary.type", "file");
                 }
 
                 final StringBuilder sb = new StringBuilder();
@@ -220,7 +232,7 @@
                     sb.append(leading).append("agent").append(i);
                     leading = " ";
                     final String prefix = name + ".sinks.agent" + i;
-                    props.put(prefix + ".channel", "file");
+                    props.put(prefix + ".channel", "primary");
                     props.put(prefix + ".type", "avro");
                     props.put(prefix + ".hostname", agents[i].getHost());
                     props.put(prefix + ".port", Integer.toString(agents[i].getPort()));
@@ -232,7 +244,7 @@
                 props.put(name + ".sinkgroups", "group1");
                 props.put(name + ".sinkgroups.group1.sinks", sb.toString());
                 props.put(name + ".sinkgroups.group1.processor.type", "failover");
-                final String sourceChannels = "file";
+                final String sourceChannels = "primary";
                 props.put(name + ".channels", sourceChannels);
                 props.put(name + ".sources." + FlumeEmbeddedManager.SOURCE_NAME + ".channels", sourceChannels);
             } else {
@@ -285,7 +297,7 @@
                 String sourceChannels = channels;
 
                 if (channels == null) {
-                    sourceChannels = "file";
+                    sourceChannels = "primary";
                     props.put(name + ".channels", sourceChannels);
                 }
 
diff --git a/flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeNode.java b/flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeNode.java
index 0d7481c..2628270 100644
--- a/flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeNode.java
+++ b/flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeNode.java
@@ -19,9 +19,9 @@
 import com.google.common.base.Preconditions;
 import org.apache.flume.lifecycle.LifecycleAware;
 import org.apache.flume.lifecycle.LifecycleState;
-import org.apache.flume.lifecycle.LifecycleSupervisor;
 import org.apache.flume.node.NodeConfiguration;
 import org.apache.flume.node.NodeManager;
+import org.apache.flume.node.nodemanager.NodeConfigurationAware;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -34,25 +34,23 @@
 
     private LifecycleState lifecycleState;
     private final NodeManager nodeManager;
-    private final LifecycleSupervisor supervisor;
+    private final NodeConfigurationAware configurationAware;
     private final NodeConfiguration conf;
 
-    public FlumeNode(final NodeManager manager, final NodeConfiguration conf) {
+    public FlumeNode(final NodeConfigurationAware configurationAware, final NodeManager manager,
+                     final NodeConfiguration conf) {
         this.nodeManager = manager;
         this.conf = conf;
-        supervisor = new LifecycleSupervisor();
+        this.configurationAware = configurationAware;
     }
 
     public void start() {
 
         Preconditions.checkState(nodeManager != null, "Node manager can not be null");
 
-        supervisor.start();
-
         LOGGER.info("Flume node starting");
 
-        supervisor.supervise(nodeManager,
-            new LifecycleSupervisor.SupervisorPolicy.AlwaysRestartPolicy(), LifecycleState.START);
+        configurationAware.startAllComponents(conf);
 
         lifecycleState = LifecycleState.START;
     }
@@ -61,7 +59,7 @@
 
         LOGGER.info("Flume node stopping");
 
-        supervisor.stop();
+        configurationAware.stopAllComponents();
 
         lifecycleState = LifecycleState.STOP;
     }
@@ -77,5 +75,4 @@
     public LifecycleState getLifecycleState() {
         return lifecycleState;
     }
-
 }
diff --git a/flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeAppenderTest.java b/flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeAppenderTest.java
index 3150d2b..cc2b02c 100644
--- a/flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeAppenderTest.java
+++ b/flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeAppenderTest.java
@@ -372,17 +372,16 @@
 
 
     private void removeAppenders(final Logger logger) {
-        final Map<String,Appender> map = logger.getAppenders();
-        for (final Map.Entry<String, Appender> entry : map.entrySet()) {
-            final Appender app = entry.getValue();
+        final Map<String,Appender<?>> map = logger.getAppenders();
+        for (final Map.Entry<String, Appender<?>> entry : map.entrySet()) {
+            final Appender<?> app = entry.getValue();
             avroLogger.removeAppender(app);
             app.stop();
         }
     }
 
-    private Appender getAppender(final Logger logger, final String name) {
-        final Map<String,Appender> map = logger.getAppenders();
-        return map.get(name);
+    private Appender<?> getAppender(final Logger logger, final String name) {
+        return logger.getAppenders().get(name);
     }
 
     private String getBody(final Event event) throws IOException {
diff --git a/flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeEmbeddedAgentTest.java b/flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeEmbeddedAgentTest.java
index 1ce837a..f2a9322 100644
--- a/flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeEmbeddedAgentTest.java
+++ b/flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeEmbeddedAgentTest.java
@@ -16,18 +16,16 @@
  */
 package org.apache.logging.log4j.flume.appender;
 
-import org.apache.flume.Channel;
-import org.apache.flume.ChannelSelector;
-import org.apache.flume.Context;
+import com.google.common.base.Preconditions;
+import org.apache.avro.AvroRemoteException;
+import org.apache.avro.ipc.NettyServer;
+import org.apache.avro.ipc.Responder;
+import org.apache.avro.ipc.specific.SpecificResponder;
 import org.apache.flume.Event;
-import org.apache.flume.Transaction;
-import org.apache.flume.channel.ChannelProcessor;
-import org.apache.flume.channel.MemoryChannel;
-import org.apache.flume.channel.ReplicatingChannelSelector;
-import org.apache.flume.conf.Configurables;
-import org.apache.flume.lifecycle.LifecycleController;
-import org.apache.flume.lifecycle.LifecycleState;
-import org.apache.flume.source.AvroSource;
+import org.apache.flume.event.EventBuilder;
+import org.apache.flume.source.avro.AvroFlumeEvent;
+import org.apache.flume.source.avro.AvroSourceProtocol;
+import org.apache.flume.source.avro.Status;
 import org.apache.logging.log4j.EventLogger;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
@@ -50,9 +48,15 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.lang.management.ManagementFactory;
-import java.util.ArrayList;
+import java.net.InetSocketAddress;
+import java.net.ServerSocket;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.Queue;
 import java.util.Set;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
 import java.util.zip.GZIPInputStream;
 
 /**
@@ -60,17 +64,11 @@
  */
 public class FlumeEmbeddedAgentTest {
     private static final String CONFIG = "default_embedded.xml";
+    private static final String HOSTNAME = "localhost";
     private static LoggerContext ctx;
 
-    private static final int testServerPort = 12345;
-
-    private AvroSource primarySource;
-    private AvroSource altSource;
-    private Channel primaryChannel;
-    private Channel alternateChannel;
-
-    private String testPort;
-    private String altPort;
+    private EventCollector primary;
+    private EventCollector alternate;
 
     @BeforeClass
     public static void setupClass() {
@@ -88,57 +86,19 @@
 
     @Before
     public void setUp() throws Exception {
+
         final File file = new File("target/file-channel");
         final boolean result = deleteFiles(file);
-        primarySource = new AvroSource();
-        primarySource.setName("Primary");
-        altSource = new AvroSource();
-        altSource.setName("Alternate");
-        primaryChannel = new MemoryChannel();
-        primaryChannel.setName("Primary Memory");
-        alternateChannel = new MemoryChannel();
-        alternateChannel.setName("Alternate Memory");
-
-        Configurables.configure(primaryChannel, new Context());
-        Configurables.configure(alternateChannel, new Context());
 
         /*
         * Clear out all other appenders associated with this logger to ensure we're
         * only hitting the Avro appender.
         */
-        Context context = new Context();
-        testPort = String.valueOf(testServerPort);
-        context.put("port", testPort);
-        context.put("bind", "localhost");
-        Configurables.configure(primarySource, context);
-
-        context = new Context();
-        altPort = String.valueOf(testServerPort + 1);
-        context.put("port", altPort);
-        context.put("bind", "localhost");
-        Configurables.configure(altSource, context);
-
-        final List<Channel> channels = new ArrayList<Channel>();
-        channels.add(primaryChannel);
-
-        final ChannelSelector primaryCS = new ReplicatingChannelSelector();
-        primaryCS.setChannels(channels);
-
-        final List<Channel> altChannels = new ArrayList<Channel>();
-        altChannels.add(alternateChannel);
-
-        final ChannelSelector alternateCS = new ReplicatingChannelSelector();
-        alternateCS.setChannels(altChannels);
-
-        primarySource.setChannelProcessor(new ChannelProcessor(primaryCS));
-        altSource.setChannelProcessor(new ChannelProcessor(alternateCS));
-
-        primarySource.start();
-        altSource.start();
-
-        Assert.assertTrue("Reached start or error", LifecycleController.waitForOneOf(
-            primarySource, LifecycleState.START_OR_ERROR));
-        Assert.assertEquals("Server is started", LifecycleState.START, primarySource.getLifecycleState());
+        int[] ports = findFreePorts(2);
+        System.setProperty("primaryPort", Integer.toString(ports[0]));
+        System.setProperty("alternatePort", Integer.toString(ports[1]));
+        primary = new EventCollector(ports[0]);
+        alternate = new EventCollector(ports[1]);
         System.setProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY, CONFIG);
         ctx = (LoggerContext) LogManager.getContext(false);
         ctx.reconfigure();
@@ -148,12 +108,8 @@
     public void teardown() throws Exception {
         System.clearProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY);
         ctx.reconfigure();
-        primarySource.stop();
-        altSource.stop();
-        Assert.assertTrue("Reached stop or error",
-            LifecycleController.waitForOneOf(primarySource, LifecycleState.STOP_OR_ERROR));
-        Assert.assertEquals("Server is stopped", LifecycleState.STOP,
-            primarySource.getLifecycleState());
+        primary.stop();
+        alternate.stop();
         final File file = new File("target/file-channel");
         final boolean result = deleteFiles(file);
         final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
@@ -173,18 +129,11 @@
         final StructuredDataMessage msg = new StructuredDataMessage("Test", "Test Log4j", "Test");
         EventLogger.logEvent(msg);
 
-        final Transaction transaction = primaryChannel.getTransaction();
-        transaction.begin();
-
-        final Event event = primaryChannel.take();
+        final Event event = primary.poll();
         Assert.assertNotNull(event);
         final String body = getBody(event);
         Assert.assertTrue("Channel contained event, but not expected message. Received: " + body,
             body.endsWith("Test Log4j"));
-        transaction.commit();
-        transaction.close();
-
-        primarySource.stop();
     }
 
     @Test
@@ -195,20 +144,13 @@
             EventLogger.logEvent(msg);
         }
         for (int i = 0; i < 10; ++i) {
-            final Transaction transaction = primaryChannel.getTransaction();
-            transaction.begin();
-
-            final Event event = primaryChannel.take();
-            Assert.assertNotNull("Missing event number " + i + 1, event);
+            final Event event = primary.poll();
+            Assert.assertNotNull(event);
             final String body = getBody(event);
             final String expected = "Test Multiple " + i;
             Assert.assertTrue("Channel contained event, but not expected message. Received: " + body,
                 body.endsWith(expected));
-            transaction.commit();
-            transaction.close();
         }
-
-        primarySource.stop();
     }
 
 
@@ -221,22 +163,18 @@
             EventLogger.logEvent(msg);
         }
         for (int i = 0; i < 10; ++i) {
-            final Transaction transaction = primaryChannel.getTransaction();
-            transaction.begin();
-
-            final Event event = primaryChannel.take();
+            final Event event = primary.poll();
             Assert.assertNotNull(event);
             final String body = getBody(event);
             final String expected = "Test Primary " + i;
             Assert.assertTrue("Channel contained event, but not expected message. Received: " + body,
                 body.endsWith(expected));
-            transaction.commit();
-            transaction.close();
         }
 
         // Give the AvroSink time to receive notification and notify the channel.
         Thread.sleep(500);
-        primarySource.stop();
+
+        primary.stop();
 
 
         for (int i = 0; i < 10; ++i) {
@@ -244,10 +182,7 @@
             EventLogger.logEvent(msg);
         }
         for (int i = 0; i < 10; ++i) {
-            final Transaction transaction = alternateChannel.getTransaction();
-            transaction.begin();
-
-            final Event event = alternateChannel.take();
+            final Event event = alternate.poll();
             Assert.assertNotNull(event);
             final String body = getBody(event);
             final String expected = "Test Alternate " + i;
@@ -255,8 +190,6 @@
                the failover, which fails this test */
             Assert.assertTrue("Channel contained event, but not expected message. Expected: " + expected +
                 " Received: " + body, body.endsWith(expected));
-            transaction.commit();
-            transaction.close();
         }
     }
 
@@ -287,4 +220,79 @@
 
         return result &= file.delete();
     }
-}
+
+    private static class EventCollector implements AvroSourceProtocol {
+        private final LinkedBlockingQueue<AvroFlumeEvent> eventQueue = new LinkedBlockingQueue<AvroFlumeEvent>();
+
+        private final NettyServer nettyServer;
+
+
+        public EventCollector(int port) {
+            Responder responder = new SpecificResponder(AvroSourceProtocol.class, this);
+            nettyServer = new NettyServer(responder, new InetSocketAddress(HOSTNAME, port));
+            nettyServer.start();
+        }
+
+        public void stop() {
+            nettyServer.close();
+        }
+
+        public Event poll() {
+
+            AvroFlumeEvent avroEvent = null;
+            try {
+                avroEvent = eventQueue.poll(30000, TimeUnit.MILLISECONDS);
+            } catch (InterruptedException ie) {
+                // Ignore the exception.
+            }
+            if (avroEvent != null) {
+                return EventBuilder.withBody(avroEvent.getBody().array(),
+                    toStringMap(avroEvent.getHeaders()));
+            } else {
+                System.out.println("No Event returned");
+            }
+            return null;
+        }
+
+        public Status append(AvroFlumeEvent event) throws AvroRemoteException {
+            eventQueue.add(event);
+            return Status.OK;
+        }
+
+        public Status appendBatch(List<AvroFlumeEvent> events)
+            throws AvroRemoteException {
+            Preconditions.checkState(eventQueue.addAll(events));
+            return Status.OK;
+        }
+    }
+
+    private static Map<String, String> toStringMap(Map<CharSequence, CharSequence> charSeqMap) {
+        Map<String, String> stringMap = new HashMap<String, String>();
+        for (Map.Entry<CharSequence, CharSequence> entry : charSeqMap.entrySet()) {
+            stringMap.put(entry.getKey().toString(), entry.getValue().toString());
+        }
+        return stringMap;
+    }
+
+    private static int[] findFreePorts(int count) throws IOException {
+        int[] ports = new int[count];
+        ServerSocket[] sockets = new ServerSocket[count];
+        try {
+            for (int i = 0; i < count; ++i) {
+                sockets[i] = new ServerSocket(0);
+                ports[i] = sockets[i].getLocalPort();
+            }
+        } finally {
+            for (int i = 0; i < count; ++i) {
+                if (sockets[i] != null) {
+                    try {
+                        sockets[i].close();
+                    } catch (Exception ex) {
+                        // Ignore the error.
+                    }
+                }
+            }
+        }
+        return ports;
+    }
+}
\ No newline at end of file
diff --git a/flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeEmbeddedAppenderTest.java b/flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeEmbeddedAppenderTest.java
index eda590c..011c3bd 100644
--- a/flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeEmbeddedAppenderTest.java
+++ b/flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeEmbeddedAppenderTest.java
@@ -16,18 +16,16 @@
  */
 package org.apache.logging.log4j.flume.appender;
 
-import org.apache.flume.Channel;
-import org.apache.flume.ChannelSelector;
-import org.apache.flume.Context;
+import com.google.common.base.Preconditions;
+import org.apache.avro.AvroRemoteException;
+import org.apache.avro.ipc.NettyServer;
+import org.apache.avro.ipc.Responder;
+import org.apache.avro.ipc.specific.SpecificResponder;
 import org.apache.flume.Event;
-import org.apache.flume.Transaction;
-import org.apache.flume.channel.ChannelProcessor;
-import org.apache.flume.channel.MemoryChannel;
-import org.apache.flume.channel.ReplicatingChannelSelector;
-import org.apache.flume.conf.Configurables;
-import org.apache.flume.lifecycle.LifecycleController;
-import org.apache.flume.lifecycle.LifecycleState;
-import org.apache.flume.source.AvroSource;
+import org.apache.flume.event.EventBuilder;
+import org.apache.flume.source.avro.AvroFlumeEvent;
+import org.apache.flume.source.avro.AvroSourceProtocol;
+import org.apache.flume.source.avro.Status;
 import org.apache.logging.log4j.EventLogger;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
@@ -50,9 +48,15 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.lang.management.ManagementFactory;
-import java.util.ArrayList;
+import java.net.InetSocketAddress;
+import java.net.ServerSocket;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.Queue;
 import java.util.Set;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
 import java.util.zip.GZIPInputStream;
 
 /**
@@ -60,17 +64,11 @@
  */
 public class FlumeEmbeddedAppenderTest {
     private static final String CONFIG = "embedded.xml";
+    private static final String HOSTNAME = "localhost";
     private static LoggerContext ctx;
 
-    private static final int testServerPort = 12345;
-
-    private AvroSource primarySource;
-    private AvroSource altSource;
-    private Channel primaryChannel;
-    private Channel alternateChannel;
-
-    private String testPort;
-    private String altPort;
+    private EventCollector primary;
+    private EventCollector alternate;
 
     @BeforeClass
     public static void setupClass() {
@@ -88,57 +86,19 @@
 
     @Before
     public void setUp() throws Exception {
+
         final File file = new File("target/file-channel");
         final boolean result = deleteFiles(file);
-        primarySource = new AvroSource();
-        primarySource.setName("Primary");
-        altSource = new AvroSource();
-        altSource.setName("Alternate");
-        primaryChannel = new MemoryChannel();
-        primaryChannel.setName("Primary Memory");
-        alternateChannel = new MemoryChannel();
-        alternateChannel.setName("Alternate Memory");
-
-        Configurables.configure(primaryChannel, new Context());
-        Configurables.configure(alternateChannel, new Context());
 
         /*
         * Clear out all other appenders associated with this logger to ensure we're
         * only hitting the Avro appender.
         */
-        Context context = new Context();
-        testPort = String.valueOf(testServerPort);
-        context.put("port", testPort);
-        context.put("bind", "localhost");
-        Configurables.configure(primarySource, context);
-
-        context = new Context();
-        altPort = String.valueOf(testServerPort + 1);
-        context.put("port", altPort);
-        context.put("bind", "localhost");
-        Configurables.configure(altSource, context);
-
-        final List<Channel> channels = new ArrayList<Channel>();
-        channels.add(primaryChannel);
-
-        final ChannelSelector primaryCS = new ReplicatingChannelSelector();
-        primaryCS.setChannels(channels);
-
-        final List<Channel> altChannels = new ArrayList<Channel>();
-        altChannels.add(alternateChannel);
-
-        final ChannelSelector alternateCS = new ReplicatingChannelSelector();
-        alternateCS.setChannels(altChannels);
-
-        primarySource.setChannelProcessor(new ChannelProcessor(primaryCS));
-        altSource.setChannelProcessor(new ChannelProcessor(alternateCS));
-
-        primarySource.start();
-        altSource.start();
-
-    	  Assert.assertTrue("Reached start or error", LifecycleController.waitForOneOf(
-            primarySource, LifecycleState.START_OR_ERROR));
-        Assert.assertEquals("Server is started", LifecycleState.START, primarySource.getLifecycleState());
+        int[] ports = findFreePorts(2);
+        System.setProperty("primaryPort", Integer.toString(ports[0]));
+        System.setProperty("alternatePort", Integer.toString(ports[1]));
+        primary = new EventCollector(ports[0]);
+        alternate = new EventCollector(ports[1]);
         System.setProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY, CONFIG);
         ctx = (LoggerContext) LogManager.getContext(false);
         ctx.reconfigure();
@@ -148,12 +108,8 @@
     public void teardown() throws Exception {
         System.clearProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY);
         ctx.reconfigure();
-        primarySource.stop();
-        altSource.stop();
-	      Assert.assertTrue("Reached stop or error",
-	           LifecycleController.waitForOneOf(primarySource, LifecycleState.STOP_OR_ERROR));
-	      Assert.assertEquals("Server is stopped", LifecycleState.STOP,
-            primarySource.getLifecycleState());
+        primary.stop();
+        alternate.stop();
         final File file = new File("target/file-channel");
         final boolean result = deleteFiles(file);
         final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
@@ -173,18 +129,11 @@
         final StructuredDataMessage msg = new StructuredDataMessage("Test", "Test Log4j", "Test");
         EventLogger.logEvent(msg);
 
-        final Transaction transaction = primaryChannel.getTransaction();
-        transaction.begin();
-
-        final Event event = primaryChannel.take();
+        final Event event = primary.poll();
    	    Assert.assertNotNull(event);
         final String body = getBody(event);
   	    Assert.assertTrue("Channel contained event, but not expected message. Received: " + body,
             body.endsWith("Test Log4j"));
-	      transaction.commit();
-	      transaction.close();
-
-	      primarySource.stop();
     }
 
     @Test
@@ -195,20 +144,13 @@
             EventLogger.logEvent(msg);
         }
         for (int i = 0; i < 10; ++i) {
-            final Transaction transaction = primaryChannel.getTransaction();
-            transaction.begin();
-
-            final Event event = primaryChannel.take();
+            final Event event = primary.poll();
             Assert.assertNotNull(event);
             final String body = getBody(event);
             final String expected = "Test Multiple " + i;
             Assert.assertTrue("Channel contained event, but not expected message. Received: " + body,
                 body.endsWith(expected));
-            transaction.commit();
-            transaction.close();
         }
-
-        primarySource.stop();
     }
 
 
@@ -221,23 +163,18 @@
             EventLogger.logEvent(msg);
         }
         for (int i = 0; i < 10; ++i) {
-            final Transaction transaction = primaryChannel.getTransaction();
-            transaction.begin();
-
-            final Event event = primaryChannel.take();
+            final Event event = primary.poll();
             Assert.assertNotNull(event);
             final String body = getBody(event);
             final String expected = "Test Primary " + i;
             Assert.assertTrue("Channel contained event, but not expected message. Received: " + body,
                 body.endsWith(expected));
-            transaction.commit();
-            transaction.close();
         }
 
         // Give the AvroSink time to receive notification and notify the channel.
         Thread.sleep(500);
 
-        primarySource.stop();
+        primary.stop();
 
 
         for (int i = 0; i < 10; ++i) {
@@ -245,10 +182,7 @@
             EventLogger.logEvent(msg);
         }
         for (int i = 0; i < 10; ++i) {
-            final Transaction transaction = alternateChannel.getTransaction();
-            transaction.begin();
-
-            final Event event = alternateChannel.take();
+            final Event event = alternate.poll();
             Assert.assertNotNull(event);
             final String body = getBody(event);
             final String expected = "Test Alternate " + i;
@@ -256,8 +190,6 @@
                the failover, which fails this test */
             Assert.assertTrue("Channel contained event, but not expected message. Expected: " + expected +
                 " Received: " + body, body.endsWith(expected));
-            transaction.commit();
-            transaction.close();
         }
     }
 
@@ -288,4 +220,79 @@
 
         return result &= file.delete();
     }
+
+    private static class EventCollector implements AvroSourceProtocol {
+        private final LinkedBlockingQueue<AvroFlumeEvent> eventQueue = new LinkedBlockingQueue<AvroFlumeEvent>();
+
+        private final NettyServer nettyServer;
+
+
+        public EventCollector(int port) {
+            Responder responder = new SpecificResponder(AvroSourceProtocol.class, this);
+            nettyServer = new NettyServer(responder, new InetSocketAddress(HOSTNAME, port));
+            nettyServer.start();
+        }
+
+        public void stop() {
+            nettyServer.close();
+        }
+
+        public Event poll() {
+
+            AvroFlumeEvent avroEvent = null;
+            try {
+                avroEvent = eventQueue.poll(30000, TimeUnit.MILLISECONDS);
+            } catch (InterruptedException ie) {
+                // Ignore the exception.
+            }
+            if (avroEvent != null) {
+                return EventBuilder.withBody(avroEvent.getBody().array(),
+                    toStringMap(avroEvent.getHeaders()));
+            } else {
+                System.out.println("No Event returned");
+            }
+            return null;
+        }
+
+        public Status append(AvroFlumeEvent event) throws AvroRemoteException {
+            eventQueue.add(event);
+            return Status.OK;
+        }
+
+        public Status appendBatch(List<AvroFlumeEvent> events)
+            throws AvroRemoteException {
+            Preconditions.checkState(eventQueue.addAll(events));
+            return Status.OK;
+        }
+    }
+
+    private static Map<String, String> toStringMap(Map<CharSequence, CharSequence> charSeqMap) {
+        Map<String, String> stringMap = new HashMap<String, String>();
+        for (Map.Entry<CharSequence, CharSequence> entry : charSeqMap.entrySet()) {
+            stringMap.put(entry.getKey().toString(), entry.getValue().toString());
+        }
+        return stringMap;
+    }
+
+    private static int[] findFreePorts(int count) throws IOException {
+        int[] ports = new int[count];
+        ServerSocket[] sockets = new ServerSocket[count];
+        try {
+            for (int i = 0; i < count; ++i) {
+                sockets[i] = new ServerSocket(0);
+                ports[i] = sockets[i].getLocalPort();
+            }
+        } finally {
+            for (int i = 0; i < count; ++i) {
+                if (sockets[i] != null) {
+                    try {
+                        sockets[i].close();
+                    } catch (Exception ex) {
+                        // Ignore the error.
+                    }
+                }
+            }
+        }
+        return ports;
+    }
 }
diff --git a/flume-ng/src/test/resources/default_embedded.xml b/flume-ng/src/test/resources/default_embedded.xml
index b415ce6..838356b 100644
--- a/flume-ng/src/test/resources/default_embedded.xml
+++ b/flume-ng/src/test/resources/default_embedded.xml
@@ -1,20 +1,20 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration status="warn" name="MyApp" packages="">
   <appenders>
-    <Flume name="eventLogger" suppressExceptions="false" compress="true" embedded="true" dataDir="target/file-channel">
-      <Agent host="localhost" port="12345"/>
-      <Agent host="localhost" port="12346"/>
+    <Flume name="eventLogger" suppressExceptions="false" compress="true" embedded="true" dataDir="InMemory">
+      <Agent host="localhost" port="${sys:primaryPort}"/>
+      <Agent host="localhost" port="${sys:alternatePort}"/>
       <RFC5424Layout enterpriseNumber="18060" includeMDC="true" appName="MyApp"/>
     </Flume>
     <Console name="STDOUT">
-      <PatternLayout pattern="%d [%p] %c %m%n"/>
+      <PatternLayout pattern="%d %t - [%p] %c %m%n"/>
     </Console>
   </appenders>
   <loggers>
     <logger name="EventLogger" level="info">
       <appender-ref ref="eventLogger"/>
     </logger>
-    <root level="warn">
+    <root level="error">
       <appender-ref ref="STDOUT"/>
     </root>
   </loggers>
diff --git a/flume-ng/src/test/resources/embedded.xml b/flume-ng/src/test/resources/embedded.xml
index c3bbf6c..9b13a95 100644
--- a/flume-ng/src/test/resources/embedded.xml
+++ b/flume-ng/src/test/resources/embedded.xml
@@ -1,21 +1,19 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<configuration status="error" name="MyApp" packages="">
+<configuration status="warn" name="MyApp" packages="">
   <appenders>
     <Flume name="eventLogger" suppressExceptions="false" compress="true" embedded="true">
-      <Property name="channels">file</Property>
-      <Property name="channels.file.type">file</Property>
-      <Property name="channels.file.checkpointDir">target/file-channel/checkpoint</Property>
-      <Property name="channels.file.dataDirs">target/file-channel/data</Property>
+      <Property name="channels">primary</Property>
+      <Property name="channels.primary.type">memory</Property>
       <Property name="sinks">agent1 agent2</Property>
-      <Property name="sinks.agent1.channel">file</Property>
+      <Property name="sinks.agent1.channel">primary</Property>
       <Property name="sinks.agent1.type">avro</Property>
       <Property name="sinks.agent1.hostname">localhost</Property>
-      <Property name="sinks.agent1.port">12345</Property>
+      <Property name="sinks.agent1.port">${sys:primaryPort}</Property>
       <Property name="sinks.agent1.batch-size">1</Property>
-      <Property name="sinks.agent2.channel">file</Property>
+      <Property name="sinks.agent2.channel">primary</Property>
       <Property name="sinks.agent2.type">avro</Property>
       <Property name="sinks.agent2.hostname">localhost</Property>
-      <Property name="sinks.agent2.port">12346</Property>
+      <Property name="sinks.agent2.port">${sys:alternatePort}</Property>
       <Property name="sinks.agent2.batch-size">1</Property>
       <Property name="sinkgroups">group1</Property>
       <Property name="sinkgroups.group1.sinks">agent1 agent2</Property>
diff --git a/jcl-bridge/src/test/java/org/apache/logging/log4j/jcl/LoggerTest.java b/jcl-bridge/src/test/java/org/apache/logging/log4j/jcl/LoggerTest.java
index b65265a..70307ac 100644
--- a/jcl-bridge/src/test/java/org/apache/logging/log4j/jcl/LoggerTest.java
+++ b/jcl-bridge/src/test/java/org/apache/logging/log4j/jcl/LoggerTest.java
@@ -75,8 +75,8 @@
 
     private void verify(final String name, final String expected) {
         final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
-        final Map<String, Appender> list = ctx.getConfiguration().getAppenders();
-        final Appender listApp = list.get(name);
+        final Map<String, Appender<?>> list = ctx.getConfiguration().getAppenders();
+        final Appender<?> listApp = list.get(name);
         assertNotNull("Missing Appender", listApp);
         assertTrue("Not a ListAppender", listApp instanceof ListAppender);
         final List<String> events = ((ListAppender) listApp).getMessages();
diff --git a/slf4j-impl/src/test/java/org/apache/logging/slf4j/LoggerTest.java b/slf4j-impl/src/test/java/org/apache/logging/slf4j/LoggerTest.java
index cde2600..fdd1c24 100644
--- a/slf4j-impl/src/test/java/org/apache/logging/slf4j/LoggerTest.java
+++ b/slf4j-impl/src/test/java/org/apache/logging/slf4j/LoggerTest.java
@@ -172,8 +172,8 @@
 
     private void verify(final String name, final String expected) {
         //LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
-        final Map<String, Appender> list = ctx.getConfiguration().getAppenders();
-        final Appender listApp = list.get(name);
+        final Map<String, Appender<?>> list = ctx.getConfiguration().getAppenders();
+        final Appender<?> listApp = list.get(name);
         assertNotNull("Missing Appender", listApp);
         assertTrue("Not a ListAppender", listApp instanceof ListAppender);
         final List<String> events = ((ListAppender) listApp).getMessages();
@@ -186,10 +186,10 @@
     @Before
     public void cleanup()
     {
-        final Map<String, Appender> list = ctx.getConfiguration().getAppenders();
-        final Appender listApp = list.get("List");
+        final Map<String, Appender<?>> list = ctx.getConfiguration().getAppenders();
+        final Appender<?> listApp = list.get("List");
         ((ListAppender) listApp).clear();
-        final Appender eventApp = list.get("EventLogger");
+        final Appender<?> eventApp = list.get("EventLogger");
         ((ListAppender) eventApp).clear();
     }
 }
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index e9f9636..40cb7fb 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -22,7 +22,10 @@
   </properties>
 
   <body>
-    <release version="2.0-beta4" date="2012-01-20" description="Bug fixes and enhancements">
+    <release version="2.0-beta4" date="2012-01-28" description="Bug fixes and enhancements">
+      <action issue="LOG4J2-156" dev="ggregory" type="fix" due-to="Andreas Born">
+        LocalizedMessageTest fails on linux system.
+      </action>
       <action issue="LOG4J2-152" dev="rgoers" type="fix" due-to="Remko Popma">
         RollingFileAppender's FileRenameAction was throwing a NullPointerException if no directory was specified
         on the target file name.
diff --git a/web/src/test/java/org/apache/logging/log4j/core/web/Log4jContextListenerTest.java b/web/src/test/java/org/apache/logging/log4j/core/web/Log4jContextListenerTest.java
index 082b6e3..7cc7fbc 100644
--- a/web/src/test/java/org/apache/logging/log4j/core/web/Log4jContextListenerTest.java
+++ b/web/src/test/java/org/apache/logging/log4j/core/web/Log4jContextListenerTest.java
@@ -61,7 +61,7 @@
         assertNotNull("No configuration", config);
         assertTrue("Incorrect Configuration. Expected " + CONFIG_NAME + " but found " + config.getName(),
             CONFIG_NAME.equals(config.getName()));
-        final Map<String, Appender> map = config.getAppenders();
+        final Map<String, Appender<?>> map = config.getAppenders();
         assertNotNull("No Appenders", map != null && map.size() > 0);
         assertTrue("Wrong configuration", map.containsKey("List"));
         listener.contextDestroyed(event);
@@ -84,7 +84,7 @@
         assertNotNull("No configuration", config);
         assertTrue("Incorrect Configuration. Expected " + CONFIG_NAME + " but found " + config.getName(),
             CONFIG_NAME.equals(config.getName()));
-        final Map<String, Appender> map = config.getAppenders();
+        final Map<String, Appender<?>> map = config.getAppenders();
         assertNotNull("No Appenders", map != null && map.size() > 0);
         assertTrue("Wrong configuration", map.containsKey("List"));
         listener.contextDestroyed(event);
@@ -106,7 +106,7 @@
         assertNotNull("No configuration", config);
         assertTrue("Incorrect Configuration. Expected " + CONFIG_NAME + " but found " + config.getName(),
             CONFIG_NAME.equals(config.getName()));
-        final Map<String, Appender> map = config.getAppenders();
+        final Map<String, Appender<?>> map = config.getAppenders();
         assertNotNull("No Appenders", map != null && map.size() > 0);
         assertTrue("Wrong configuration", map.containsKey("List"));
         listener.contextDestroyed(event);