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);
