fix buf 311
diff --git a/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java b/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java
index 6bd7baf..3614110 100644
--- a/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java
+++ b/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java
@@ -29,7 +29,7 @@
 import java.util.*;
 
 import org.slf4j.helpers.NOPLoggerFactory;
-import org.slf4j.helpers.SubstitutableLogger;
+import org.slf4j.helpers.SubstituteLogger;
 import org.slf4j.helpers.SubstituteLoggerFactory;
 import org.slf4j.helpers.Util;
 import org.slf4j.impl.StaticLoggerBinder;
@@ -163,18 +163,18 @@
   }
 
   private final static void fixSubstitutedLoggers() {
-    List<SubstitutableLogger> loggers = TEMP_FACTORY.getLoggers();
+    List<SubstituteLogger> loggers = TEMP_FACTORY.getLoggers();
 
     if(loggers.isEmpty()){
       return;
     }
 
     Util.report("The following set of substitute loggers may have been accessed");
-    Util.report("during the initialization phase and logging calls during this");
-    Util.report("phase were not honored but that calls in the future to these loggers");
-    Util.report("will be honored.");
+    Util.report("during the initialization phase. Logging calls during this");
+    Util.report("phase were not honored. However, subsequent logging calls to these");
+    Util.report("loggers will work as normally expected.");
     Util.report("See also " + SUBSTITUTE_LOGGER_URL);
-    for(SubstitutableLogger subLogger : loggers){
+    for(SubstituteLogger subLogger : loggers){
       subLogger.setDelegate(getLogger(subLogger.getName()));
       Util.report(subLogger.getName());
     }
diff --git a/slf4j-api/src/main/java/org/slf4j/helpers/SubstitutableLogger.java b/slf4j-api/src/main/java/org/slf4j/helpers/SubstitutableLogger.java
deleted file mode 100644
index 468d53b..0000000
--- a/slf4j-api/src/main/java/org/slf4j/helpers/SubstitutableLogger.java
+++ /dev/null
@@ -1,314 +0,0 @@
-/**
- * Copyright (c) 2004-2011 QOS.ch
- * All rights reserved.
- *
- * Permission is hereby granted, free  of charge, to any person obtaining
- * a  copy  of this  software  and  associated  documentation files  (the
- * "Software"), to  deal in  the Software without  restriction, including
- * without limitation  the rights to  use, copy, modify,  merge, publish,
- * distribute,  sublicense, and/or sell  copies of  the Software,  and to
- * permit persons to whom the Software  is furnished to do so, subject to
- * the following conditions:
- *
- * The  above  copyright  notice  and  this permission  notice  shall  be
- * included in all copies or substantial portions of the Software.
- *
- * THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
- * EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
- * MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- */
-package org.slf4j.helpers;
-
-import org.slf4j.Logger;
-import org.slf4j.Marker;
-
-/**
- * A helper class which delegates all calls to different Loggers. This enables
- * swapping of the Logger implementation later.
- *
- * @author Chetan Mehrotra
- */
-public class SubstitutableLogger implements Logger {
-
-  private final String name;
-
-  private volatile Logger _delegate;
-
-  public SubstitutableLogger(String name) {
-    this.name = name;
-  }
-
-  public String getName() {
-    return name;
-  }
-
-  public boolean isTraceEnabled() {
-    return delegate().isTraceEnabled();
-  }
-
-  public void trace(String msg) {
-    delegate().trace(msg);
-  }
-
-  public void trace(String format, Object arg) {
-    delegate().trace(format, arg);
-  }
-
-  public void trace(String format, Object arg1, Object arg2) {
-    delegate().trace(format, arg1, arg2);
-  }
-
-  public void trace(String format, Object... arguments) {
-    delegate().trace(format, arguments);
-  }
-
-  public void trace(String msg, Throwable t) {
-    delegate().trace(msg, t);
-  }
-
-  public boolean isTraceEnabled(Marker marker) {
-    return delegate().isTraceEnabled(marker);
-  }
-
-  public void trace(Marker marker, String msg) {
-    delegate().trace(marker, msg);
-  }
-
-  public void trace(Marker marker, String format, Object arg) {
-    delegate().trace(marker, format, arg);
-  }
-
-  public void trace(Marker marker, String format, Object arg1, Object arg2) {
-    delegate().trace(marker, format, arg1, arg2);
-  }
-
-  public void trace(Marker marker, String format, Object... arguments) {
-    delegate().trace(marker, format, arguments);
-  }
-
-  public void trace(Marker marker, String msg, Throwable t) {
-    delegate().trace(marker, msg, t);
-  }
-
-  public boolean isDebugEnabled() {
-    return delegate().isDebugEnabled();
-  }
-
-  public void debug(String msg) {
-    delegate().debug(msg);
-  }
-
-  public void debug(String format, Object arg) {
-    delegate().debug(format, arg);
-  }
-
-  public void debug(String format, Object arg1, Object arg2) {
-    delegate().debug(format, arg1, arg2);
-  }
-
-  public void debug(String format, Object... arguments) {
-    delegate().debug(format, arguments);
-  }
-
-  public void debug(String msg, Throwable t) {
-    delegate().debug(msg, t);
-  }
-
-  public boolean isDebugEnabled(Marker marker) {
-    return delegate().isDebugEnabled(marker);
-  }
-
-  public void debug(Marker marker, String msg) {
-    delegate().debug(marker, msg);
-  }
-
-  public void debug(Marker marker, String format, Object arg) {
-    delegate().debug(marker, format, arg);
-  }
-
-  public void debug(Marker marker, String format, Object arg1, Object arg2) {
-    delegate().debug(marker, format, arg1, arg2);
-  }
-
-  public void debug(Marker marker, String format, Object... arguments) {
-    delegate().debug(marker, format, arguments);
-  }
-
-  public void debug(Marker marker, String msg, Throwable t) {
-    delegate().debug(marker, msg, t);
-  }
-
-  public boolean isInfoEnabled() {
-    return delegate().isInfoEnabled();
-  }
-
-  public void info(String msg) {
-    delegate().info(msg);
-  }
-
-  public void info(String format, Object arg) {
-    delegate().info(format, arg);
-  }
-
-  public void info(String format, Object arg1, Object arg2) {
-    delegate().info(format, arg1, arg2);
-  }
-
-  public void info(String format, Object... arguments) {
-    delegate().info(format, arguments);
-  }
-
-  public void info(String msg, Throwable t) {
-    delegate().info(msg, t);
-  }
-
-  public boolean isInfoEnabled(Marker marker) {
-    return delegate().isInfoEnabled(marker);
-  }
-
-  public void info(Marker marker, String msg) {
-    delegate().info(marker, msg);
-  }
-
-  public void info(Marker marker, String format, Object arg) {
-    delegate().info(marker, format, arg);
-  }
-
-  public void info(Marker marker, String format, Object arg1, Object arg2) {
-    delegate().info(marker, format, arg1, arg2);
-  }
-
-  public void info(Marker marker, String format, Object... arguments) {
-    delegate().info(marker, format, arguments);
-  }
-
-  public void info(Marker marker, String msg, Throwable t) {
-    delegate().info(marker, msg, t);
-  }
-
-  public boolean isWarnEnabled() {
-    return delegate().isWarnEnabled();
-  }
-
-  public void warn(String msg) {
-    delegate().warn(msg);
-  }
-
-  public void warn(String format, Object arg) {
-    delegate().warn(format, arg);
-  }
-
-  public void warn(String format, Object arg1, Object arg2) {
-    delegate().warn(format, arg1, arg2);
-  }
-
-  public void warn(String format, Object... arguments) {
-    delegate().warn(format, arguments);
-  }
-
-  public void warn(String msg, Throwable t) {
-    delegate().warn(msg, t);
-  }
-
-  public boolean isWarnEnabled(Marker marker) {
-    return delegate().isWarnEnabled(marker);
-  }
-
-  public void warn(Marker marker, String msg) {
-    delegate().warn(marker, msg);
-  }
-
-  public void warn(Marker marker, String format, Object arg) {
-    delegate().warn(marker, format, arg);
-  }
-
-  public void warn(Marker marker, String format, Object arg1, Object arg2) {
-    delegate().warn(marker, format, arg1, arg2);
-  }
-
-  public void warn(Marker marker, String format, Object... arguments) {
-    delegate().warn(marker, format, arguments);
-  }
-
-  public void warn(Marker marker, String msg, Throwable t) {
-    delegate().warn(marker, msg, t);
-  }
-
-  public boolean isErrorEnabled() {
-    return delegate().isErrorEnabled();
-  }
-
-  public void error(String msg) {
-    delegate().error(msg);
-  }
-
-  public void error(String format, Object arg) {
-    delegate().error(format, arg);
-  }
-
-  public void error(String format, Object arg1, Object arg2) {
-    delegate().error(format, arg1, arg2);
-  }
-
-  public void error(String format, Object... arguments) {
-    delegate().error(format, arguments);
-  }
-
-  public void error(String msg, Throwable t) {
-    delegate().error(msg, t);
-  }
-
-  public boolean isErrorEnabled(Marker marker) {
-    return delegate().isErrorEnabled(marker);
-  }
-
-  public void error(Marker marker, String msg) {
-    delegate().error(marker, msg);
-  }
-
-  public void error(Marker marker, String format, Object arg) {
-    delegate().error(marker, format, arg);
-  }
-
-  public void error(Marker marker, String format, Object arg1, Object arg2) {
-    delegate().error(marker, format, arg1, arg2);
-  }
-
-  public void error(Marker marker, String format, Object... arguments) {
-    delegate().error(marker, format, arguments);
-  }
-
-  public void error(Marker marker, String msg, Throwable t) {
-    delegate().error(marker, msg, t);
-  }
-
-  public void setDelegate(Logger delegate) {
-    this._delegate = delegate;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) return true;
-    if (o == null || getClass() != o.getClass()) return false;
-
-    SubstitutableLogger that = (SubstitutableLogger) o;
-
-    if (!name.equals(that.name)) return false;
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    return name.hashCode();
-  }
-
-  Logger delegate() {
-    return _delegate != null ? _delegate : NOPLogger.NOP_LOGGER;
-  }
-}
diff --git a/slf4j-api/src/main/java/org/slf4j/helpers/SubstituteLogger.java b/slf4j-api/src/main/java/org/slf4j/helpers/SubstituteLogger.java
new file mode 100644
index 0000000..d7cfedf
--- /dev/null
+++ b/slf4j-api/src/main/java/org/slf4j/helpers/SubstituteLogger.java
@@ -0,0 +1,325 @@
+/**
+ * Copyright (c) 2004-2011 QOS.ch
+ * All rights reserved.
+ *
+ * Permission is hereby granted, free  of charge, to any person obtaining
+ * a  copy  of this  software  and  associated  documentation files  (the
+ * "Software"), to  deal in  the Software without  restriction, including
+ * without limitation  the rights to  use, copy, modify,  merge, publish,
+ * distribute,  sublicense, and/or sell  copies of  the Software,  and to
+ * permit persons to whom the Software  is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The  above  copyright  notice  and  this permission  notice  shall  be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
+ * EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
+ * MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+package org.slf4j.helpers;
+
+import org.slf4j.Logger;
+import org.slf4j.Marker;
+
+/**
+ * A logger implementation which logs via a delegate logger. By default, the delegate is a
+ * {@link NOPLogger}. However, a different delegate can be set at anytime.
+ * <p/>
+ * See also the <a href="http://www.slf4j.org/codes.html#substituteLogger">relevant
+ * error code</a> documentation.
+ *
+ * @author Chetan Mehrotra
+ */
+public class SubstituteLogger implements Logger {
+
+    private final String name;
+
+    private volatile Logger _delegate;
+
+    public SubstituteLogger(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public boolean isTraceEnabled() {
+        return delegate().isTraceEnabled();
+    }
+
+    public void trace(String msg) {
+        delegate().trace(msg);
+    }
+
+    public void trace(String format, Object arg) {
+        delegate().trace(format, arg);
+    }
+
+    public void trace(String format, Object arg1, Object arg2) {
+        delegate().trace(format, arg1, arg2);
+    }
+
+    public void trace(String format, Object... arguments) {
+        delegate().trace(format, arguments);
+    }
+
+    public void trace(String msg, Throwable t) {
+        delegate().trace(msg, t);
+    }
+
+    public boolean isTraceEnabled(Marker marker) {
+        return delegate().isTraceEnabled(marker);
+    }
+
+    public void trace(Marker marker, String msg) {
+        delegate().trace(marker, msg);
+    }
+
+    public void trace(Marker marker, String format, Object arg) {
+        delegate().trace(marker, format, arg);
+    }
+
+    public void trace(Marker marker, String format, Object arg1, Object arg2) {
+        delegate().trace(marker, format, arg1, arg2);
+    }
+
+    public void trace(Marker marker, String format, Object... arguments) {
+        delegate().trace(marker, format, arguments);
+    }
+
+    public void trace(Marker marker, String msg, Throwable t) {
+        delegate().trace(marker, msg, t);
+    }
+
+    public boolean isDebugEnabled() {
+        return delegate().isDebugEnabled();
+    }
+
+    public void debug(String msg) {
+        delegate().debug(msg);
+    }
+
+    public void debug(String format, Object arg) {
+        delegate().debug(format, arg);
+    }
+
+    public void debug(String format, Object arg1, Object arg2) {
+        delegate().debug(format, arg1, arg2);
+    }
+
+    public void debug(String format, Object... arguments) {
+        delegate().debug(format, arguments);
+    }
+
+    public void debug(String msg, Throwable t) {
+        delegate().debug(msg, t);
+    }
+
+    public boolean isDebugEnabled(Marker marker) {
+        return delegate().isDebugEnabled(marker);
+    }
+
+    public void debug(Marker marker, String msg) {
+        delegate().debug(marker, msg);
+    }
+
+    public void debug(Marker marker, String format, Object arg) {
+        delegate().debug(marker, format, arg);
+    }
+
+    public void debug(Marker marker, String format, Object arg1, Object arg2) {
+        delegate().debug(marker, format, arg1, arg2);
+    }
+
+    public void debug(Marker marker, String format, Object... arguments) {
+        delegate().debug(marker, format, arguments);
+    }
+
+    public void debug(Marker marker, String msg, Throwable t) {
+        delegate().debug(marker, msg, t);
+    }
+
+    public boolean isInfoEnabled() {
+        return delegate().isInfoEnabled();
+    }
+
+    public void info(String msg) {
+        delegate().info(msg);
+    }
+
+    public void info(String format, Object arg) {
+        delegate().info(format, arg);
+    }
+
+    public void info(String format, Object arg1, Object arg2) {
+        delegate().info(format, arg1, arg2);
+    }
+
+    public void info(String format, Object... arguments) {
+        delegate().info(format, arguments);
+    }
+
+    public void info(String msg, Throwable t) {
+        delegate().info(msg, t);
+    }
+
+    public boolean isInfoEnabled(Marker marker) {
+        return delegate().isInfoEnabled(marker);
+    }
+
+    public void info(Marker marker, String msg) {
+        delegate().info(marker, msg);
+    }
+
+    public void info(Marker marker, String format, Object arg) {
+        delegate().info(marker, format, arg);
+    }
+
+    public void info(Marker marker, String format, Object arg1, Object arg2) {
+        delegate().info(marker, format, arg1, arg2);
+    }
+
+    public void info(Marker marker, String format, Object... arguments) {
+        delegate().info(marker, format, arguments);
+    }
+
+    public void info(Marker marker, String msg, Throwable t) {
+        delegate().info(marker, msg, t);
+    }
+
+    public boolean isWarnEnabled() {
+        return delegate().isWarnEnabled();
+    }
+
+    public void warn(String msg) {
+        delegate().warn(msg);
+    }
+
+    public void warn(String format, Object arg) {
+        delegate().warn(format, arg);
+    }
+
+    public void warn(String format, Object arg1, Object arg2) {
+        delegate().warn(format, arg1, arg2);
+    }
+
+    public void warn(String format, Object... arguments) {
+        delegate().warn(format, arguments);
+    }
+
+    public void warn(String msg, Throwable t) {
+        delegate().warn(msg, t);
+    }
+
+    public boolean isWarnEnabled(Marker marker) {
+        return delegate().isWarnEnabled(marker);
+    }
+
+    public void warn(Marker marker, String msg) {
+        delegate().warn(marker, msg);
+    }
+
+    public void warn(Marker marker, String format, Object arg) {
+        delegate().warn(marker, format, arg);
+    }
+
+    public void warn(Marker marker, String format, Object arg1, Object arg2) {
+        delegate().warn(marker, format, arg1, arg2);
+    }
+
+    public void warn(Marker marker, String format, Object... arguments) {
+        delegate().warn(marker, format, arguments);
+    }
+
+    public void warn(Marker marker, String msg, Throwable t) {
+        delegate().warn(marker, msg, t);
+    }
+
+    public boolean isErrorEnabled() {
+        return delegate().isErrorEnabled();
+    }
+
+    public void error(String msg) {
+        delegate().error(msg);
+    }
+
+    public void error(String format, Object arg) {
+        delegate().error(format, arg);
+    }
+
+    public void error(String format, Object arg1, Object arg2) {
+        delegate().error(format, arg1, arg2);
+    }
+
+    public void error(String format, Object... arguments) {
+        delegate().error(format, arguments);
+    }
+
+    public void error(String msg, Throwable t) {
+        delegate().error(msg, t);
+    }
+
+    public boolean isErrorEnabled(Marker marker) {
+        return delegate().isErrorEnabled(marker);
+    }
+
+    public void error(Marker marker, String msg) {
+        delegate().error(marker, msg);
+    }
+
+    public void error(Marker marker, String format, Object arg) {
+        delegate().error(marker, format, arg);
+    }
+
+    public void error(Marker marker, String format, Object arg1, Object arg2) {
+        delegate().error(marker, format, arg1, arg2);
+    }
+
+    public void error(Marker marker, String format, Object... arguments) {
+        delegate().error(marker, format, arguments);
+    }
+
+    public void error(Marker marker, String msg, Throwable t) {
+        delegate().error(marker, msg, t);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        SubstituteLogger that = (SubstituteLogger) o;
+
+        if (!name.equals(that.name)) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        return name.hashCode();
+    }
+
+    /**
+     * Return the delegate logger instance if set. Otherwise, return a {@link NOPLogger}
+     * instance.
+     */
+    Logger delegate() {
+        return _delegate != null ? _delegate : NOPLogger.NOP_LOGGER;
+    }
+
+    /**
+     * Typically called after the {@link org.slf4j.LoggerFactory} initialization phase is completed.
+     * @param delegate
+     */
+    public void setDelegate(Logger delegate) {
+        this._delegate = delegate;
+    }
+}
diff --git a/slf4j-api/src/main/java/org/slf4j/helpers/SubstituteLoggerFactory.java b/slf4j-api/src/main/java/org/slf4j/helpers/SubstituteLoggerFactory.java
index f23569a..a54fcab 100644
--- a/slf4j-api/src/main/java/org/slf4j/helpers/SubstituteLoggerFactory.java
+++ b/slf4j-api/src/main/java/org/slf4j/helpers/SubstituteLoggerFactory.java
@@ -33,36 +33,21 @@
 import org.slf4j.Logger;
 
 /**
- * SubstituteLoggerFactory is an trivial implementation of
- * {@link ILoggerFactory} which always returns the unique instance of NOPLogger.
- * <p/>
- * <p>
- * It used as a temporary substitute for the real ILoggerFactory during its
- * auto-configuration which may re-enter LoggerFactory to obtain logger
- * instances. See also http://bugzilla.slf4j.org/show_bug.cgi?id=106
- * <p/>
- * <p>
- * Logger implementations can swap out the NOPLogger with actual Logger
- * implementation once they are properly configured by changing the delegate
- * in {@link org.slf4j.helpers.SubstitutableLogger}
- * </p>
- *
+ * SubstituteLoggerFactory manages instances of {@link SubstituteLogger}.
  * @author Ceki G&uuml;lc&uuml;
  */
 public class SubstituteLoggerFactory implements ILoggerFactory {
 
-  // keep a record of requested logger names
-  final ConcurrentMap<String, SubstitutableLogger> loggers = new ConcurrentHashMap<String, SubstitutableLogger>();
+  final ConcurrentMap<String, SubstituteLogger> loggers = new ConcurrentHashMap<String, SubstituteLogger>();
 
   public Logger getLogger(String name) {
-    SubstitutableLogger logger;
-    synchronized (loggers) {
-      logger = loggers.get(name);
-      if (logger == null) {
-        logger = new SubstitutableLogger(name);
-        loggers.put(name, logger);
+    SubstituteLogger logger = loggers.get(name);
+     if (logger == null) {
+        logger = new SubstituteLogger(name);
+        SubstituteLogger oldLogger = loggers.putIfAbsent(name, logger);
+        if (oldLogger != null)
+          logger = oldLogger;
       }
-    }
     return logger;
   }
 
@@ -70,8 +55,8 @@
     return new ArrayList<String>(loggers.keySet());
   }
 
-  public List<SubstitutableLogger> getLoggers() {
-    return new ArrayList<SubstitutableLogger>(loggers.values());
+  public List<SubstituteLogger> getLoggers() {
+    return new ArrayList<SubstituteLogger>(loggers.values());
   }
 
   public void clear() {
diff --git a/slf4j-api/src/test/java/org/slf4j/helpers/SubstitutableLoggerTest.java b/slf4j-api/src/test/java/org/slf4j/helpers/SubstitutableLoggerTest.java
index 67d3547..3055b7e 100644
--- a/slf4j-api/src/test/java/org/slf4j/helpers/SubstitutableLoggerTest.java
+++ b/slf4j-api/src/test/java/org/slf4j/helpers/SubstitutableLoggerTest.java
@@ -44,7 +44,7 @@
   private static final Set<String> EXCLUDED_METHODS = new HashSet<String>(Arrays.asList("getName"));
 
   public void testDelegate() throws Exception {
-    SubstitutableLogger log = new SubstitutableLogger("foo");
+    SubstituteLogger log = new SubstituteLogger("foo");
     assertTrue(log.delegate() instanceof NOPLogger);
 
     Set<String> expectedMethodSignatures = determineMethodSignatures(Logger.class);
diff --git a/slf4j-api/src/test/java/org/slf4j/helpers/SubstituteLoggerFactoryTest.java b/slf4j-api/src/test/java/org/slf4j/helpers/SubstituteLoggerFactoryTest.java
index c6c5a48..7acb43c 100644
--- a/slf4j-api/src/test/java/org/slf4j/helpers/SubstituteLoggerFactoryTest.java
+++ b/slf4j-api/src/test/java/org/slf4j/helpers/SubstituteLoggerFactoryTest.java
@@ -60,7 +60,7 @@
     Set<String> expectedNames = new HashSet<String>(Arrays.asList("foo1","foo2"));
 
     Set<String> actualNames = new HashSet<String>();
-    for(SubstitutableLogger slog : factory.getLoggers()){
+    for(SubstituteLogger slog : factory.getLoggers()){
       actualNames.add(slog.getName());
     }
 
diff --git a/slf4j-scala-api/src/main/scala/A.scala b/slf4j-scala-api/src/main/scala/A.scala
new file mode 100644
index 0000000..3a9d44c
--- /dev/null
+++ b/slf4j-scala-api/src/main/scala/A.scala
@@ -0,0 +1,8 @@
+/*

+ * Created by IntelliJ IDEA.

+ * User: ceki

+ * Date: 03.05.11

+ * Time: 09:03

+ */

+package ;

+public scala class A { }
\ No newline at end of file
diff --git a/slf4j-site/src/site/pages/codes.html b/slf4j-site/src/site/pages/codes.html
index cb32485..e28a3a3 100755
--- a/slf4j-site/src/site/pages/codes.html
+++ b/slf4j-site/src/site/pages/codes.html
@@ -401,29 +401,28 @@
     <p>Highly configurable logging systems such as logback and log4j
     may create components which invoke loggers during their own
     initialization.  See issue <a
-    href="http://jira.qos.ch/browse/LBCORE-47">lbcore-47</a> for a
+    href="http://jira.qos.ch/browse/LOGBACK-127">LOGBACK-127</a> for a
     typical occurrence. However, since the binding process with SLF4J
     has not yet completed (because the underlying logging system was
     not yet completely loaded into memory), it is not possible to
-    honor such logger creation requests, resulting in a
-    <code>NullPointerException</code>.</p>
+    honor such logger creation requests.</p>
 
-    <p>To avoid this chicken-and-egg problem, SLF4J substitutes a
-    substitutable logger which initially delegates to no-operation logger factory
-    during this initialization phase. Later after the LoggerFactory initialization
-    is completed then the delegates in the SubstituteLoggers are replaced with actual
-    logger implementations.
+    <p>To avoid this chicken-and-egg problem, SLF4J creates substitute
+    loggers during this phase (initialization). Calls made to the
+    substitute loggers during this phase are simply dropped. After the
+    initialization completes, the substitute logger will delegate
+    logging calls to the appropriate logger implementation and
+    otherwise will function as any other logger returned by
+    <code>LoggerFactory</code>.
     </p>
   
-    <p>If any substitute logger had to be created, SLF4J will emit a
-    a listing of such loggers. This list is intended to let
-    you know that some of the initial logging statements from these
-    loggers might have been missed
+    <p>If any substitute logger had to be created, SLF4J will emit a a
+    listing of such loggers. This list is intended to let you know
+    that any logging calls made to these loggers during initialization
+    have been dropped.
     </p>
 
 
-
-
     <script src="templates/footer.js" type="text/javascript"></script>
   </div>
   
diff --git a/slf4j-site/src/site/pages/news.html b/slf4j-site/src/site/pages/news.html
index 7b187b9..4afbff2 100755
--- a/slf4j-site/src/site/pages/news.html
+++ b/slf4j-site/src/site/pages/news.html
@@ -33,6 +33,16 @@
 
    <p>Added slf4j-android module to the slf4j distribution. This
    module is contributed by Andrey Korzhevskiy.</p>
+
+   <p>Loggers created during the initialization phase are no longer
+   <code>NOPLoggers</code> which drop all logging calls. Instead,
+   SLF4J now creates substitute loggers which delegate to the
+   appropriate logger implementation after the initilization phase
+   completes. Only calls made to these loggers during the
+   initialization phase are dropped. This enhacement was proposed in
+   <a href="http://bugzilla.slf4j.org/show_bug.cgi?id=311">bug 311</a>
+   by Chetan Mehrotra.
+   </p>
    
    <p>Concunrrency improvement in
    <code>BasicMarkerFactory</code>. This improvement was contributed